From 3ef3bd467ab538e431853132dd85949ebbbff85a Mon Sep 17 00:00:00 2001 From: Travis Sikes <124101151+travis-recurve@users.noreply.github.com> Date: Tue, 14 Jul 2026 18:22:12 -0500 Subject: [PATCH 1/8] Modernize packaging and CI - pyproject.toml (hatchling, PEP 621) replaces setup.py, Pipfile, MANIFEST.in - pytest and coverage config move from pytest.ini/.coveragerc into pyproject.toml - tox rewritten: envs for python 3.10-3.14 plus serial coverage env - add test.yml workflow: python x OS matrix, monthly cron, fan-in job - delete .travis.yml and bump_version.sh - README.rst converted to README.md; Dockerfile drops pipenv for pip install -e Signed-off-by: Travis Sikes <124101151+travis-recurve@users.noreply.github.com> --- .coveragerc | 5 - .github/workflows/test.yml | 49 + .travis.yml | 39 - Dockerfile | 13 +- MANIFEST.in | 4 - Pipfile | 37 - Pipfile.lock | 3513 ------------------------------------ README.md | 135 ++ README.rst | 141 -- bump_version.sh | 46 - pyproject.toml | 82 + pytest.ini | 13 - setup.py | 104 -- tox.ini | 19 +- 14 files changed, 282 insertions(+), 3918 deletions(-) delete mode 100644 .coveragerc create mode 100644 .github/workflows/test.yml delete mode 100644 .travis.yml delete mode 100644 MANIFEST.in delete mode 100644 Pipfile delete mode 100644 Pipfile.lock create mode 100644 README.md delete mode 100644 README.rst delete mode 100755 bump_version.sh create mode 100644 pyproject.toml delete mode 100644 pytest.ini delete mode 100644 setup.py diff --git a/.coveragerc b/.coveragerc deleted file mode 100644 index 407cb5a..0000000 --- a/.coveragerc +++ /dev/null @@ -1,5 +0,0 @@ -[run] -omit = - .tox/* - setup.py - eeweather/database.py diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..c656ae6 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,49 @@ +name: Test + +on: + push: + branches: + - master + pull_request: + types: + - opened + - synchronize + - reopened + schedule: + # run monthly to monitor dependency updates + - cron: "0 0 1 * *" + +jobs: + build: + strategy: + fail-fast: false + matrix: + python: ["3.10", "3.11", "3.12", "3.13", "3.14"] + os: [ubuntu-latest, windows-latest, macos-latest] + runs-on: ${{ matrix.os }} + + steps: + - uses: actions/checkout@v4 + - name: Set up Python ${{ matrix.python }} on ${{ matrix.os }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python }} + - name: Install tox + run: pip install tox + - name: Run tox + run: tox -e ${{ matrix.python }} + + # Fan-in over the build matrix so branch protection can require a single + # context instead of every (python, os) combination. needs.build.result is + # 'success' only if every matrix combination passed. + build-all: + name: build (all) + if: always() + needs: build + runs-on: ubuntu-latest + steps: + - name: Verify all matrix jobs passed + if: needs.build.result != 'success' + run: | + echo "build matrix result: ${{ needs.build.result }}" + exit 1 diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index c66911e..0000000 --- a/.travis.yml +++ /dev/null @@ -1,39 +0,0 @@ -dist: xenial -sudo: false - -cache: - directories: - - $HOME/.pip-cache/ - - .tox - -addons: - apt: - packages: - - libenchant-dev - - binutils - - libproj-dev - - gdal-bin - - libgeos-dev - -language: python - -python: - - 2.7 - - 3.5 - - 3.6 - - 3.7 - -notifications: - email: false - -install: - - pip install tox-travis - - pip install coveralls - - pip install codecov - -script: - - tox - -after_script: - - coveralls - - codecov diff --git a/Dockerfile b/Dockerfile index f3a1bca..f548d42 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,4 @@ FROM python:3.12-bookworm -# bullseye required for GEOS>3.7.1 which is needed for newest cartopy RUN apt-get update \ && apt-get install -yqq \ @@ -12,18 +11,12 @@ RUN apt-get update \ # node for mapshaper nodejs npm \ # for access to metadata.db - sqlite3 libsqlite3-dev + sqlite3 libsqlite3-dev RUN npm install -g mapshaper -COPY Pipfile Pipfile -COPY Pipfile.lock Pipfile.lock -RUN pip install pipenv -RUN set -ex && pipenv install --system --deploy --dev -ENV PYTHONPATH=/app - -COPY setup.py README.rst /app/ +COPY pyproject.toml README.md LICENSE /app/ COPY eeweather/ /app/eeweather -RUN set -ex && cd /usr/local/lib/ && python /app/setup.py develop +RUN set -ex && pip install -e /app[dev] WORKDIR /app diff --git a/MANIFEST.in b/MANIFEST.in deleted file mode 100644 index 17f9c2f..0000000 --- a/MANIFEST.in +++ /dev/null @@ -1,4 +0,0 @@ -include README.rst LICENSE pytest.ini -recursive-include tests *.py -recursive-include eeweather *.db -recursive-include eeweather *.gz diff --git a/Pipfile b/Pipfile deleted file mode 100644 index 44ff698..0000000 --- a/Pipfile +++ /dev/null @@ -1,37 +0,0 @@ -[[source]] - -url = "https://pypi.python.org/simple" -verify_ssl = true -name = "pypi" - - -[packages] - -"beautifulsoup4" = "*" -Cython = "*" -matplotlib = "*" -Pillow = "*" -pandas = ">=1.0.0" -pyproj = "*" -requests ="*" -Shapely = {extras = ["vectorized"]} -SQLAlchemy = "*" -scipy = "*" -simplejson = "*" - - -[dev-packages] - -black = "*" -coverage = "*" -cartopy = "*" -jupyterlab = "*" -pytest = "*" -pytest-cov = "*" -pytest-xdist = "*" -tox = "*" -twine = "*" -Sphinx = "*" -syrupy = "*" -sphinx-autobuild = "*" -sphinxcontrib-spelling = "*" diff --git a/Pipfile.lock b/Pipfile.lock deleted file mode 100644 index ab94a93..0000000 --- a/Pipfile.lock +++ /dev/null @@ -1,3513 +0,0 @@ -{ - "_meta": { - "hash": { - "sha256": "061d60e2ad8bd04ee3d429ff4edb90b37dcfffb1a52f9bbcde2d465ad7ec1030" - }, - "pipfile-spec": 6, - "requires": {}, - "sources": [ - { - "name": "pypi", - "url": "https://pypi.python.org/simple", - "verify_ssl": true - } - ] - }, - "default": { - "beautifulsoup4": { - "hashes": [ - "sha256:1bd32405dacc920b42b83ba01644747ed77456a65760e285fbc47633ceddaf8b", - "sha256:99045d7d3f08f91f0d656bc9b7efbae189426cd913d830294a15eefa0ea4df16" - ], - "index": "pypi", - "markers": "python_full_version >= '3.7.0'", - "version": "==4.13.3" - }, - "certifi": { - "hashes": [ - "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", - "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe" - ], - "markers": "python_version >= '3.6'", - "version": "==2025.1.31" - }, - "charset-normalizer": { - "hashes": [ - "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537", - "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa", - "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a", - "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294", - "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b", - "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", - "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", - "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", - "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4", - "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", - "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2", - "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", - "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", - "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", - "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", - "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", - "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", - "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496", - "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d", - "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", - "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e", - "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a", - "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4", - "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca", - "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78", - "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408", - "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5", - "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", - "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", - "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a", - "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765", - "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6", - "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", - "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", - "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", - "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd", - "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c", - "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", - "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", - "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176", - "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770", - "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824", - "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f", - "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf", - "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487", - "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d", - "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd", - "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", - "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534", - "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f", - "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", - "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", - "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd", - "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", - "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9", - "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de", - "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", - "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d", - "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", - "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f", - "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", - "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7", - "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a", - "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", - "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8", - "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41", - "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", - "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f", - "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", - "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", - "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", - "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", - "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", - "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247", - "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", - "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb", - "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", - "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e", - "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6", - "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037", - "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", - "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e", - "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807", - "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", - "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c", - "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", - "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", - "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089", - "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", - "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e", - "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", - "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616" - ], - "markers": "python_version >= '3.7'", - "version": "==3.4.1" - }, - "contourpy": { - "hashes": [ - "sha256:041b640d4ec01922083645a94bb3b2e777e6b626788f4095cf21abbe266413c1", - "sha256:05e806338bfeaa006acbdeba0ad681a10be63b26e1b17317bfac3c5d98f36cda", - "sha256:08d9d449a61cf53033612cb368f3a1b26cd7835d9b8cd326647efe43bca7568d", - "sha256:0ffa84be8e0bd33410b17189f7164c3589c229ce5db85798076a3fa136d0e509", - "sha256:113231fe3825ebf6f15eaa8bc1f5b0ddc19d42b733345eae0934cb291beb88b6", - "sha256:14c102b0eab282427b662cb590f2e9340a9d91a1c297f48729431f2dcd16e14f", - "sha256:174e758c66bbc1c8576992cec9599ce8b6672b741b5d336b5c74e35ac382b18e", - "sha256:19c1555a6801c2f084c7ddc1c6e11f02eb6a6016ca1318dd5452ba3f613a1751", - "sha256:19d40d37c1c3a4961b4619dd9d77b12124a453cc3d02bb31a07d58ef684d3d86", - "sha256:1bf98051f1045b15c87868dbaea84f92408337d4f81d0e449ee41920ea121d3b", - "sha256:20914c8c973f41456337652a6eeca26d2148aa96dd7ac323b74516988bea89fc", - "sha256:287ccc248c9e0d0566934e7d606201abd74761b5703d804ff3df8935f523d546", - "sha256:2ba94a401342fc0f8b948e57d977557fbf4d515f03c67682dd5c6191cb2d16ec", - "sha256:31c1b55c1f34f80557d3830d3dd93ba722ce7e33a0b472cba0ec3b6535684d8f", - "sha256:36987a15e8ace5f58d4d5da9dca82d498c2bbb28dff6e5d04fbfcc35a9cb3a82", - "sha256:3a04ecd68acbd77fa2d39723ceca4c3197cb2969633836ced1bea14e219d077c", - "sha256:3e8b974d8db2c5610fb4e76307e265de0edb655ae8169e8b21f41807ccbeec4b", - "sha256:3ea9924d28fc5586bf0b42d15f590b10c224117e74409dd7a0be3b62b74a501c", - "sha256:4318af1c925fb9a4fb190559ef3eec206845f63e80fb603d47f2d6d67683901c", - "sha256:44a29502ca9c7b5ba389e620d44f2fbe792b1fb5734e8b931ad307071ec58c53", - "sha256:47734d7073fb4590b4a40122b35917cd77be5722d80683b249dac1de266aac80", - "sha256:4d76d5993a34ef3df5181ba3c92fabb93f1eaa5729504fb03423fcd9f3177242", - "sha256:4dbbc03a40f916a8420e420d63e96a1258d3d1b58cbdfd8d1f07b49fcbd38e85", - "sha256:500360b77259914f7805af7462e41f9cb7ca92ad38e9f94d6c8641b089338124", - "sha256:523a8ee12edfa36f6d2a49407f705a6ef4c5098de4f498619787e272de93f2d5", - "sha256:573abb30e0e05bf31ed067d2f82500ecfdaec15627a59d63ea2d95714790f5c2", - "sha256:5b75aa69cb4d6f137b36f7eb2ace9280cfb60c55dc5f61c731fdf6f037f958a3", - "sha256:61332c87493b00091423e747ea78200659dc09bdf7fd69edd5e98cef5d3e9a8d", - "sha256:805617228ba7e2cbbfb6c503858e626ab528ac2a32a04a2fe88ffaf6b02c32bc", - "sha256:841ad858cff65c2c04bf93875e384ccb82b654574a6d7f30453a04f04af71342", - "sha256:89785bb2a1980c1bd87f0cb1517a71cde374776a5f150936b82580ae6ead44a1", - "sha256:8eb96e79b9f3dcadbad2a3891672f81cdcab7f95b27f28f1c67d75f045b6b4f1", - "sha256:974d8145f8ca354498005b5b981165b74a195abfae9a8129df3e56771961d595", - "sha256:9ddeb796389dadcd884c7eb07bd14ef12408aaae358f0e2ae24114d797eede30", - "sha256:a045f341a77b77e1c5de31e74e966537bba9f3c4099b35bf4c2e3939dd54cdab", - "sha256:a0cffcbede75c059f535725c1680dfb17b6ba8753f0c74b14e6a9c68c29d7ea3", - "sha256:a761d9ccfc5e2ecd1bf05534eda382aa14c3e4f9205ba5b1684ecfe400716ef2", - "sha256:a7895f46d47671fa7ceec40f31fae721da51ad34bdca0bee83e38870b1f47ffd", - "sha256:a9fa36448e6a3a1a9a2ba23c02012c43ed88905ec80163f2ffe2421c7192a5d7", - "sha256:ab29962927945d89d9b293eabd0d59aea28d887d4f3be6c22deaefbb938a7277", - "sha256:abbb49fb7dac584e5abc6636b7b2a7227111c4f771005853e7d25176daaf8453", - "sha256:ac4578ac281983f63b400f7fe6c101bedc10651650eef012be1ccffcbacf3697", - "sha256:adce39d67c0edf383647a3a007de0a45fd1b08dedaa5318404f1a73059c2512b", - "sha256:ade08d343436a94e633db932e7e8407fe7de8083967962b46bdfc1b0ced39454", - "sha256:b2bdca22a27e35f16794cf585832e542123296b4687f9fd96822db6bae17bfc9", - "sha256:b2f926efda994cdf3c8d3fdb40b9962f86edbc4457e739277b961eced3d0b4c1", - "sha256:b457d6430833cee8e4b8e9b6f07aa1c161e5e0d52e118dc102c8f9bd7dd060d6", - "sha256:c414fc1ed8ee1dbd5da626cf3710c6013d3d27456651d156711fa24f24bd1291", - "sha256:cb76c1a154b83991a3cbbf0dfeb26ec2833ad56f95540b442c73950af2013750", - "sha256:dfd97abd83335045a913e3bcc4a09c0ceadbe66580cf573fe961f4a825efa699", - "sha256:e914a8cb05ce5c809dd0fe350cfbb4e881bde5e2a38dc04e3afe1b3e58bd158e", - "sha256:ece6df05e2c41bd46776fbc712e0996f7c94e0d0543af1656956d150c4ca7c81", - "sha256:efa874e87e4a647fd2e4f514d5e91c7d493697127beb95e77d2f7561f6905bd9", - "sha256:f611e628ef06670df83fce17805c344710ca5cde01edfdc72751311da8585375" - ], - "markers": "python_version >= '3.10'", - "version": "==1.3.1" - }, - "cycler": { - "hashes": [ - "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", - "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c" - ], - "markers": "python_version >= '3.8'", - "version": "==0.12.1" - }, - "cython": { - "hashes": [ - "sha256:0038c9bae46c459669390e53a1ec115f8096b2e4647ae007ff1bf4e6dee92806", - "sha256:0faa5e39e5c8cdf6f9c3b1c3f24972826e45911e7f5b99cf99453fca5432f45e", - "sha256:120681093772bf3600caddb296a65b352a0d3556e962b9b147efcfb8e8c9801b", - "sha256:1e5eadef80143026944ea8f9904715a008f5108d1d644a89f63094cc37351e73", - "sha256:25529ee948f44d9a165ff960c49d4903267c20b5edf2df79b45924802e4cca6e", - "sha256:2d53de996ed340e9ab0fc85a88aaa8932f2591a2746e1ab1c06e262bd4ec4be7", - "sha256:3083465749911ac3b2ce001b6bf17f404ac9dd35d8b08469d19dc7e717f5877a", - "sha256:309c081057930bb79dc9ea3061a1af5086c679c968206e9c9c2ec90ab7cb471a", - "sha256:3109e1d44425a2639e9a677b66cd7711721a5b606b65867cb2d8ef7a97e2237b", - "sha256:34ce459808f7d8d5d4007bc5486fe50532529096b43957af6cbffcb4d9cc5c8d", - "sha256:36fcd584dae547de6f095500a380f4a0cce72b7a7e409e9ff03cb9beed6ac7a1", - "sha256:398d4576c1e1f6316282aa0b4a55139254fbed965cba7813e6d9900d3092b128", - "sha256:3ccd1228cc203b1f1b8a3d403f5a20ad1c40e5879b3fbf5851ce09d948982f2c", - "sha256:3e4fa855d98bc7bd6a2049e0c7dc0dcf595e2e7f571a26e808f3efd84d2db374", - "sha256:43c48b5789398b228ea97499f5b864843ba9b1ab837562a9227c6f58d16ede8b", - "sha256:4aa255781b093a8401109d8f2104bbb2e52de7639d5896aefafddc85c30e0894", - "sha256:4ee6f1ea1bead8e6cbc4e64571505b5d8dbdb3b58e679d31f3a84160cebf1a1a", - "sha256:54115fcc126840926ff3b53cfd2152eae17b3522ae7f74888f8a41413bd32f25", - "sha256:563de1728c8e48869d2380a1b76bbc1b1b1d01aba948480d68c1d05e52d20c92", - "sha256:57aefa6d3341109e46ec1a13e3a763aaa2cbeb14e82af2485b318194be1d9170", - "sha256:5a93cbda00a5451175b97dea5a9440a3fcee9e54b4cba7a7dbcba9a764b22aec", - "sha256:5e5f17c48a4f41557fbcc7ee660ccfebe4536a34c557f553b6893c1b3c83df2d", - "sha256:629db614b9c364596d7c975fa3fb3978e8c5349524353dbe11429896a783fc1e", - "sha256:62b79dcc0de49efe9e84b9d0e2ae0a6fc9b14691a65565da727aa2e2e63c6a28", - "sha256:63d840f2975e44d74512f8f34f1f7cb8121c9428e26a3f6116ff273deb5e60a2", - "sha256:680f1d6ed4436ae94805db264d6155ed076d2835d84f20dcb31a7a3ad7f8668c", - "sha256:712c3f31adec140dc60d064a7f84741f50e2c25a8edd7ae746d5eb4d3ef7072a", - "sha256:731d719423e041242c9303c80cae4327467299b90ffe62d4cc407e11e9ea3160", - "sha256:75c5acd40b97cff16fadcf6901a91586cbca5dcdba81f738efaf1f4c6bc8dccb", - "sha256:77d48f2d4bab9fe1236eb753d18f03e8b2619af5b6f05d51df0532a92dfb38ab", - "sha256:7cffc3464f641c8d0dda942c7c53015291beea11ec4d32421bed2f13b386b819", - "sha256:86c304b20bd57c727c7357e90d5ba1a2b6f1c45492de2373814d7745ef2e63b4", - "sha256:879ae9023958d63c0675015369384642d0afb9c9d1f3473df9186c42f7a9d265", - "sha256:8ab9f5198af74eb16502cc143cdde9ca1cbbf66ea2912e67440dd18a36e3b5fa", - "sha256:8c9efe9a0895abee3cadfdad4130b30f7b5e57f6e6a51ef2a44f9fc66a913880", - "sha256:8d32856716c369d01f2385ad9177cdd1a11079ac89ea0932dc4882de1aa19174", - "sha256:8ee841c0e114efa1e849c281ac9b8df8aa189af10b4a103b1c5fd71cbb799679", - "sha256:90cf599372c5a22120609f7d3a963f17814799335d56dd0dcf8fe615980a8ae1", - "sha256:9f8c48748a9c94ea5d59c26ab49ad0fad514d36f894985879cf3c3ca0e600bf4", - "sha256:a4032e48d4734d2df68235d21920c715c451ac9de15fa14c71b378e8986b83be", - "sha256:a7fec4f052b8fe173fe70eae75091389955b9a23d5cec3d576d21c5913b49d47", - "sha256:af081838b0f9e12a83ec4c3809a00a64c817f489f7c512b0e3ecaf5f90a2a816", - "sha256:b588c0a089a9f4dd316d2f9275230bad4a7271e5af04e1dc41d2707c816be44b", - "sha256:b988bb297ce76c671e28c97d017b95411010f7c77fa6623dd0bb47eed1aee1bc", - "sha256:ba67eee9413b66dd9fbacd33f0bc2e028a2a120991d77b5fd4b19d0b1e4039b9", - "sha256:bee2717e5b5f7d966d0c6e27d2efe3698c357aa4d61bb3201997c7a4f9fe485a", - "sha256:bfb75123dd4ff767baa37d7036da0de2dfb6781ff256eef69b11b88b9a0691d1", - "sha256:c0b91c7ebace030dd558ea28730de8c580680b50768e5af66db2904a3716c3e3", - "sha256:c151082884be468f2f405645858a857298ac7f7592729e5b54788b5c572717ba", - "sha256:c1879c073e2b34924ce9b7ca64c212705dcc416af4337c45f371242b2e5f6d32", - "sha256:c3238a29f37999e27494d120983eca90d14896b2887a0bd858a381204549137a", - "sha256:d3a8f81980ffbd74e52f9186d8f1654e347d0c44bfea6b5997028977f481a179", - "sha256:d4b70fc339adba1e2111b074ee6119fe9fd6072c957d8597bce9a0dd1c3c6784", - "sha256:d6945694c5b9170cfbd5f2c0d00ef7487a2de7aba83713a64ee4ebce7fad9e05", - "sha256:d6c6cd6a75c8393e6805d17f7126b96a894f310a1a9ea91c47d141fb9341bfa8", - "sha256:dcdc3e5d4ce0e7a4af6903ed580833015641e968d18d528d8371e2435a34132c", - "sha256:dfdbea486e702c328338314adb8e80f5f9741f06a0ae83aaec7463bc166d12e8", - "sha256:e62564457851db1c40399bd95a5346b9bb99e17a819bf583b362f418d8f3457a", - "sha256:ea3a0e19ab77266c738aa110684a753a04da4e709472cadeff487133354d6ab8", - "sha256:ebc24609613fa06d0d896309f7164ba168f7e8d71c1e490ed2a08d23351c3f41", - "sha256:f39640f8df0400cde6882e23c734f15bb8196de0a008ae5dc6c8d1ec5957d7c8", - "sha256:fe030d4a00afb2844f5f70896b7f2a1a0d7da09bf3aa3d884cbe5f73fff5d310", - "sha256:feb86122a823937cc06e4c029d80ff69f082ebb0b959ab52a5af6cdd271c5dc3", - "sha256:ff5c0b6a65b08117d0534941d404833d516dac422eee88c6b4fd55feb409a5ed" - ], - "index": "pypi", - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==3.0.12" - }, - "fonttools": { - "hashes": [ - "sha256:003548eadd674175510773f73fb2060bb46adb77c94854af3e0cc5bc70260049", - "sha256:0073b62c3438cf0058488c002ea90489e8801d3a7af5ce5f7c05c105bee815c3", - "sha256:1088182f68c303b50ca4dc0c82d42083d176cba37af1937e1a976a31149d4d14", - "sha256:133bedb9a5c6376ad43e6518b7e2cd2f866a05b1998f14842631d5feb36b5786", - "sha256:14a3e3e6b211660db54ca1ef7006401e4a694e53ffd4553ab9bc87ead01d0f05", - "sha256:17f39313b649037f6c800209984a11fc256a6137cbe5487091c6c7187cae4685", - "sha256:193b86e9f769320bc98ffdb42accafb5d0c8c49bd62884f1c0702bc598b3f0a2", - "sha256:2d351275f73ebdd81dd5b09a8b8dac7a30f29a279d41e1c1192aedf1b6dced40", - "sha256:300c310bb725b2bdb4f5fc7e148e190bd69f01925c7ab437b9c0ca3e1c7cd9ba", - "sha256:331954d002dbf5e704c7f3756028e21db07097c19722569983ba4d74df014000", - "sha256:38b947de71748bab150259ee05a775e8a0635891568e9fdb3cdd7d0e0004e62f", - "sha256:3cf4f8d2a30b454ac682e12c61831dcb174950c406011418e739de592bbf8f76", - "sha256:3fd3fccb7b9adaaecfa79ad51b759f2123e1aba97f857936ce044d4f029abd71", - "sha256:442ad4122468d0e47d83bc59d0e91b474593a8c813839e1872e47c7a0cb53b10", - "sha256:47b5e4680002ae1756d3ae3b6114e20aaee6cc5c69d1e5911f5ffffd3ee46c6b", - "sha256:53f5e9767978a4daf46f28e09dbeb7d010319924ae622f7b56174b777258e5ba", - "sha256:62b4c6802fa28e14dba010e75190e0e6228513573f1eeae57b11aa1a39b7e5b1", - "sha256:62cc1253827d1e500fde9dbe981219fea4eb000fd63402283472d38e7d8aa1c6", - "sha256:654ac4583e2d7c62aebc6fc6a4c6736f078f50300e18aa105d87ce8925cfac31", - "sha256:661a8995d11e6e4914a44ca7d52d1286e2d9b154f685a4d1f69add8418961563", - "sha256:6c1d38642ca2dddc7ae992ef5d026e5061a84f10ff2b906be5680ab089f55bb8", - "sha256:6e81c1cc80c1d8bf071356cc3e0e25071fbba1c75afc48d41b26048980b3c771", - "sha256:705837eae384fe21cee5e5746fd4f4b2f06f87544fa60f60740007e0aa600311", - "sha256:7ef04bc7827adb7532be3d14462390dd71287644516af3f1e67f1e6ff9c6d6df", - "sha256:86b2a1013ef7a64d2e94606632683f07712045ed86d937c11ef4dde97319c086", - "sha256:8d1613abd5af2f93c05867b3a3759a56e8bf97eb79b1da76b2bc10892f96ff16", - "sha256:965d0209e6dbdb9416100123b6709cb13f5232e2d52d17ed37f9df0cc31e2b35", - "sha256:96a4271f63a615bcb902b9f56de00ea225d6896052c49f20d0c91e9f43529a29", - "sha256:9d94449ad0a5f2a8bf5d2f8d71d65088aee48adbe45f3c5f8e00e3ad861ed81a", - "sha256:9da650cb29bc098b8cfd15ef09009c914b35c7986c8fa9f08b51108b7bc393b4", - "sha256:a05d1f07eb0a7d755fbe01fee1fd255c3a4d3730130cf1bfefb682d18fd2fcea", - "sha256:a114d1567e1a1586b7e9e7fc2ff686ca542a82769a296cef131e4c4af51e58f4", - "sha256:a1af375734018951c31c0737d04a9d5fd0a353a0253db5fbed2ccd44eac62d8c", - "sha256:b23d30a2c0b992fb1c4f8ac9bfde44b5586d23457759b6cf9a787f1a35179ee0", - "sha256:bc871904a53a9d4d908673c6faa15689874af1c7c5ac403a8e12d967ebd0c0dc", - "sha256:bce60f9a977c9d3d51de475af3f3581d9b36952e1f8fc19a1f2254f1dda7ce9c", - "sha256:bd9825822e7bb243f285013e653f6741954d8147427aaa0324a862cdbf4cbf62", - "sha256:ca7962e8e5fc047cc4e59389959843aafbf7445b6c08c20d883e60ced46370a5", - "sha256:d0cb73ccf7f6d7ca8d0bc7ea8ac0a5b84969a41c56ac3ac3422a24df2680546f", - "sha256:d54a45d30251f1d729e69e5b675f9a08b7da413391a1227781e2a297fa37f6d2", - "sha256:d6ca96d1b61a707ba01a43318c9c40aaf11a5a568d1e61146fafa6ab20890793", - "sha256:d6f195c14c01bd057bc9b4f70756b510e009c83c5ea67b25ced3e2c38e6ee6e9", - "sha256:e2cad98c94833465bcf28f51c248aaf07ca022efc6a3eba750ad9c1e0256d278", - "sha256:e2e993e8db36306cc3f1734edc8ea67906c55f98683d6fd34c3fc5593fdbba4c", - "sha256:e9270505a19361e81eecdbc2c251ad1e1a9a9c2ad75fa022ccdee533f55535dc", - "sha256:f20e2c0dfab82983a90f3d00703ac0960412036153e5023eed2b4641d7d5e692", - "sha256:f36a0868f47b7566237640c026c65a86d09a3d9ca5df1cd039e30a1da73098a0", - "sha256:f59746f7953f69cc3290ce2f971ab01056e55ddd0fb8b792c31a8acd7fee2d28", - "sha256:fa760e5fe8b50cbc2d71884a1eff2ed2b95a005f02dda2fa431560db0ddd927f", - "sha256:ffda9b8cd9cb8b301cae2602ec62375b59e2e2108a117746f12215145e3f786c" - ], - "markers": "python_version >= '3.8'", - "version": "==4.56.0" - }, - "idna": { - "hashes": [ - "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", - "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3" - ], - "markers": "python_version >= '3.6'", - "version": "==3.10" - }, - "kiwisolver": { - "hashes": [ - "sha256:01c3d31902c7db5fb6182832713d3b4122ad9317c2c5877d0539227d96bb2e50", - "sha256:034d2c891f76bd3edbdb3ea11140d8510dca675443da7304205a2eaa45d8334c", - "sha256:085940635c62697391baafaaeabdf3dd7a6c3643577dde337f4d66eba021b2b8", - "sha256:08e77738ed7538f036cd1170cbed942ef749137b1311fa2bbe2a7fda2f6bf3cc", - "sha256:111793b232842991be367ed828076b03d96202c19221b5ebab421ce8bcad016f", - "sha256:11e1022b524bd48ae56c9b4f9296bce77e15a2e42a502cceba602f804b32bb79", - "sha256:151dffc4865e5fe6dafce5480fab84f950d14566c480c08a53c663a0020504b6", - "sha256:16523b40aab60426ffdebe33ac374457cf62863e330a90a0383639ce14bf44b2", - "sha256:1732e065704b47c9afca7ffa272f845300a4eb959276bf6970dc07265e73b605", - "sha256:1c8ceb754339793c24aee1c9fb2485b5b1f5bb1c2c214ff13368431e51fc9a09", - "sha256:23454ff084b07ac54ca8be535f4174170c1094a4cff78fbae4f73a4bcc0d4dab", - "sha256:23d5f023bdc8c7e54eb65f03ca5d5bb25b601eac4d7f1a042888a1f45237987e", - "sha256:257af1622860e51b1a9d0ce387bf5c2c4f36a90594cb9514f55b074bcc787cfc", - "sha256:286b18e86682fd2217a48fc6be6b0f20c1d0ed10958d8dc53453ad58d7be0bf8", - "sha256:291331973c64bb9cce50bbe871fb2e675c4331dab4f31abe89f175ad7679a4d7", - "sha256:2f0121b07b356a22fb0414cec4666bbe36fd6d0d759db3d37228f496ed67c880", - "sha256:3452046c37c7692bd52b0e752b87954ef86ee2224e624ef7ce6cb21e8c41cc1b", - "sha256:34d142fba9c464bc3bbfeff15c96eab0e7310343d6aefb62a79d51421fcc5f1b", - "sha256:369b75d40abedc1da2c1f4de13f3482cb99e3237b38726710f4a793432b1c5ff", - "sha256:36dbbfd34838500a31f52c9786990d00150860e46cd5041386f217101350f0d3", - "sha256:370fd2df41660ed4e26b8c9d6bbcad668fbe2560462cba151a721d49e5b6628c", - "sha256:3a96c0e790ee875d65e340ab383700e2b4891677b7fcd30a699146f9384a2bb0", - "sha256:3b9b4d2892fefc886f30301cdd80debd8bb01ecdf165a449eb6e78f79f0fabd6", - "sha256:3cd3bc628b25f74aedc6d374d5babf0166a92ff1317f46267f12d2ed54bc1d30", - "sha256:3ddc373e0eef45b59197de815b1b28ef89ae3955e7722cc9710fb91cd77b7f47", - "sha256:4191ee8dfd0be1c3666ccbac178c5a05d5f8d689bbe3fc92f3c4abec817f8fe0", - "sha256:54a62808ac74b5e55a04a408cda6156f986cefbcf0ada13572696b507cc92fa1", - "sha256:577facaa411c10421314598b50413aa1ebcf5126f704f1e5d72d7e4e9f020d90", - "sha256:641f2ddf9358c80faa22e22eb4c9f54bd3f0e442e038728f500e3b978d00aa7d", - "sha256:65ea09a5a3faadd59c2ce96dc7bf0f364986a315949dc6374f04396b0d60e09b", - "sha256:68269e60ee4929893aad82666821aaacbd455284124817af45c11e50a4b42e3c", - "sha256:69b5637c3f316cab1ec1c9a12b8c5f4750a4c4b71af9157645bf32830e39c03a", - "sha256:7506488470f41169b86d8c9aeff587293f530a23a23a49d6bc64dab66bedc71e", - "sha256:768cade2c2df13db52475bd28d3a3fac8c9eff04b0e9e2fda0f3760f20b3f7fc", - "sha256:77e6f57a20b9bd4e1e2cedda4d0b986ebd0216236f0106e55c28aea3d3d69b16", - "sha256:782bb86f245ec18009890e7cb8d13a5ef54dcf2ebe18ed65f795e635a96a1c6a", - "sha256:7a3ad337add5148cf51ce0b55642dc551c0b9d6248458a757f98796ca7348712", - "sha256:7cd2785b9391f2873ad46088ed7599a6a71e762e1ea33e87514b1a441ed1da1c", - "sha256:7e9a60b50fe8b2ec6f448fe8d81b07e40141bfced7f896309df271a0b92f80f3", - "sha256:84a2f830d42707de1d191b9490ac186bf7997a9495d4e9072210a1296345f7dc", - "sha256:856b269c4d28a5c0d5e6c1955ec36ebfd1651ac00e1ce0afa3e28da95293b561", - "sha256:858416b7fb777a53f0c59ca08190ce24e9abbd3cffa18886a5781b8e3e26f65d", - "sha256:87b287251ad6488e95b4f0b4a79a6d04d3ea35fde6340eb38fbd1ca9cd35bbbc", - "sha256:88c6f252f6816a73b1f8c904f7bbe02fd67c09a69f7cb8a0eecdbf5ce78e63db", - "sha256:893f5525bb92d3d735878ec00f781b2de998333659507d29ea4466208df37bed", - "sha256:89c107041f7b27844179ea9c85d6da275aa55ecf28413e87624d033cf1f6b751", - "sha256:918139571133f366e8362fa4a297aeba86c7816b7ecf0bc79168080e2bd79957", - "sha256:99cea8b9dd34ff80c521aef46a1dddb0dcc0283cf18bde6d756f1e6f31772165", - "sha256:a17b7c4f5b2c51bb68ed379defd608a03954a1845dfed7cc0117f1cc8a9b7fd2", - "sha256:a3c44cb68861de93f0c4a8175fbaa691f0aa22550c331fefef02b618a9dcb476", - "sha256:a4d3601908c560bdf880f07d94f31d734afd1bb71e96585cace0e38ef44c6d84", - "sha256:a5ce1e481a74b44dd5e92ff03ea0cb371ae7a0268318e202be06c8f04f4f1246", - "sha256:a66f60f8d0c87ab7f59b6fb80e642ebb29fec354a4dfad687ca4092ae69d04f4", - "sha256:b21dbe165081142b1232a240fc6383fd32cdd877ca6cc89eab93e5f5883e1c25", - "sha256:b47a465040146981dc9db8647981b8cb96366fbc8d452b031e4f8fdffec3f26d", - "sha256:b5773efa2be9eb9fcf5415ea3ab70fc785d598729fd6057bea38d539ead28271", - "sha256:b83dc6769ddbc57613280118fb4ce3cd08899cc3369f7d0e0fab518a7cf37fdb", - "sha256:bade438f86e21d91e0cf5dd7c0ed00cda0f77c8c1616bd83f9fc157fa6760d31", - "sha256:bcb1ebc3547619c3b58a39e2448af089ea2ef44b37988caf432447374941574e", - "sha256:be4816dc51c8a471749d664161b434912eee82f2ea66bd7628bd14583a833e85", - "sha256:c07b29089b7ba090b6f1a669f1411f27221c3662b3a1b7010e67b59bb5a6f10b", - "sha256:c2b9a96e0f326205af81a15718a9073328df1173a2619a68553decb7097fd5d7", - "sha256:c5020c83e8553f770cb3b5fc13faac40f17e0b205bd237aebd21d53d733adb03", - "sha256:c72941acb7b67138f35b879bbe85be0f6c6a70cab78fe3ef6db9c024d9223e5b", - "sha256:c8bf637892dc6e6aad2bc6d4d69d08764166e5e3f69d469e55427b6ac001b19d", - "sha256:cc978a80a0db3a66d25767b03688f1147a69e6237175c0f4ffffaaedf744055a", - "sha256:ce2cf1e5688edcb727fdf7cd1bbd0b6416758996826a8be1d958f91880d0809d", - "sha256:d47b28d1dfe0793d5e96bce90835e17edf9a499b53969b03c6c47ea5985844c3", - "sha256:d47cfb2650f0e103d4bf68b0b5804c68da97272c84bb12850d877a95c056bd67", - "sha256:d5536185fce131780ebd809f8e623bf4030ce1b161353166c49a3c74c287897f", - "sha256:d561d2d8883e0819445cfe58d7ddd673e4015c3c57261d7bdcd3710d0d14005c", - "sha256:d6af5e8815fd02997cb6ad9bbed0ee1e60014438ee1a5c2444c96f87b8843502", - "sha256:d6d6bd87df62c27d4185de7c511c6248040afae67028a8a22012b010bc7ad062", - "sha256:dace81d28c787956bfbfbbfd72fdcef014f37d9b48830829e488fdb32b49d954", - "sha256:e063ef9f89885a1d68dd8b2e18f5ead48653176d10a0e324e3b0030e3a69adeb", - "sha256:e7a019419b7b510f0f7c9dceff8c5eae2392037eae483a7f9162625233802b0a", - "sha256:eaa973f1e05131de5ff3569bbba7f5fd07ea0595d3870ed4a526d486fe57fa1b", - "sha256:eb158fe28ca0c29f2260cca8c43005329ad58452c36f0edf298204de32a9a3ed", - "sha256:ed33ca2002a779a2e20eeb06aea7721b6e47f2d4b8a8ece979d8ba9e2a167e34", - "sha256:fc2ace710ba7c1dfd1a3b42530b62b9ceed115f19a1656adefce7b1782a37794" - ], - "markers": "python_version >= '3.10'", - "version": "==1.4.8" - }, - "matplotlib": { - "hashes": [ - "sha256:01e63101ebb3014e6e9f80d9cf9ee361a8599ddca2c3e166c563628b39305dbb", - "sha256:02582304e352f40520727984a5a18f37e8187861f954fea9be7ef06569cf85b4", - "sha256:057206ff2d6ab82ff3e94ebd94463d084760ca682ed5f150817b859372ec4401", - "sha256:0721a3fd3d5756ed593220a8b86808a36c5031fce489adb5b31ee6dbb47dd5b2", - "sha256:0f69dc9713e4ad2fb21a1c30e37bd445d496524257dfda40ff4a8efb3604ab5c", - "sha256:11b65088c6f3dae784bc72e8d039a2580186285f87448babb9ddb2ad0082993a", - "sha256:1985ad3d97f51307a2cbfc801a930f120def19ba22864182dacef55277102ba6", - "sha256:19b06241ad89c3ae9469e07d77efa87041eac65d78df4fcf9cac318028009b01", - "sha256:2589659ea30726284c6c91037216f64a506a9822f8e50592d48ac16a2f29e044", - "sha256:35e87384ee9e488d8dd5a2dd7baf471178d38b90618d8ea147aced4ab59c9bea", - "sha256:3f06bad951eea6422ac4e8bdebcf3a70c59ea0a03338c5d2b109f57b64eb3972", - "sha256:4c59af3e8aca75d7744b68e8e78a669e91ccbcf1ac35d0102a7b1b46883f1dd7", - "sha256:4f0647b17b667ae745c13721602b540f7aadb2a32c5b96e924cd4fea5dcb90f1", - "sha256:56c5d9fcd9879aa8040f196a235e2dcbdf7dd03ab5b07c0696f80bc6cf04bedd", - "sha256:5d45d3f5245be5b469843450617dcad9af75ca50568acf59997bed9311131a0b", - "sha256:648406f1899f9a818cef8c0231b44dcfc4ff36f167101c3fd1c9151f24220fdc", - "sha256:66e907a06e68cb6cfd652c193311d61a12b54f56809cafbed9736ce5ad92f107", - "sha256:7e496c01441be4c7d5f96d4e40f7fca06e20dcb40e44c8daa2e740e1757ad9e6", - "sha256:8e875b95ac59a7908978fe307ecdbdd9a26af7fa0f33f474a27fcf8c99f64a19", - "sha256:8e8e25b1209161d20dfe93037c8a7f7ca796ec9aa326e6e4588d8c4a5dd1e473", - "sha256:a144867dd6bf8ba8cb5fc81a158b645037e11b3e5cf8a50bd5f9917cb863adfe", - "sha256:a3dfb036f34873b46978f55e240cff7a239f6c4409eac62d8145bad3fc6ba5a3", - "sha256:a97ff127f295817bc34517255c9db6e71de8eddaab7f837b7d341dee9f2f587f", - "sha256:aa3854b5f9473564ef40a41bc922be978fab217776e9ae1545c9b3a5cf2092a3", - "sha256:bc411ebd5889a78dabbc457b3fa153203e22248bfa6eedc6797be5df0164dbf9", - "sha256:c42eee41e1b60fd83ee3292ed83a97a5f2a8239b10c26715d8a6172226988d7b", - "sha256:c96f2c2f825d1257e437a1482c5a2cf4fee15db4261bd6fc0750f81ba2b4ba3d", - "sha256:cfd414bce89cc78a7e1d25202e979b3f1af799e416010a20ab2b5ebb3a02425c", - "sha256:d0673b4b8f131890eb3a1ad058d6e065fb3c6e71f160089b65f8515373394698", - "sha256:d3809916157ba871bcdd33d3493acd7fe3037db5daa917ca6e77975a94cef779", - "sha256:dc6ab14a7ab3b4d813b88ba957fc05c79493a037f54e246162033591e770de6f", - "sha256:e8d2d0e3881b129268585bf4765ad3ee73a4591d77b9a18c214ac7e3a79fb2ba", - "sha256:e9b4bb156abb8fa5e5b2b460196f7db7264fc6d62678c03457979e7d5254b7be", - "sha256:ff2ae14910be903f4a24afdbb6d7d3a6c44da210fc7d42790b87aeac92238a16" - ], - "index": "pypi", - "markers": "python_version >= '3.10'", - "version": "==3.10.1" - }, - "numpy": { - "hashes": [ - "sha256:05c076d531e9998e7e694c36e8b349969c56eadd2cdcd07242958489d79a7286", - "sha256:0d54974f9cf14acf49c60f0f7f4084b6579d24d439453d5fc5805d46a165b542", - "sha256:11c43995255eb4127115956495f43e9343736edb7fcdb0d973defd9de14cd84f", - "sha256:188dcbca89834cc2e14eb2f106c96d6d46f200fe0200310fc29089657379c58d", - "sha256:1974afec0b479e50438fc3648974268f972e2d908ddb6d7fb634598cdb8260a0", - "sha256:1cf4e5c6a278d620dee9ddeb487dc6a860f9b199eadeecc567f777daace1e9e7", - "sha256:207a2b8441cc8b6a2a78c9ddc64d00d20c303d79fba08c577752f080c4007ee3", - "sha256:218f061d2faa73621fa23d6359442b0fc658d5b9a70801373625d958259eaca3", - "sha256:2aad3c17ed2ff455b8eaafe06bcdae0062a1db77cb99f4b9cbb5f4ecb13c5146", - "sha256:2fa8fa7697ad1646b5c93de1719965844e004fcad23c91228aca1cf0800044a1", - "sha256:31504f970f563d99f71a3512d0c01a645b692b12a63630d6aafa0939e52361e6", - "sha256:3387dd7232804b341165cedcb90694565a6015433ee076c6754775e85d86f1fc", - "sha256:4ba5054787e89c59c593a4169830ab362ac2bee8a969249dc56e5d7d20ff8df9", - "sha256:4f92084defa704deadd4e0a5ab1dc52d8ac9e8a8ef617f3fbb853e79b0ea3592", - "sha256:65ef3468b53269eb5fdb3a5c09508c032b793da03251d5f8722b1194f1790c00", - "sha256:6f527d8fdb0286fd2fd97a2a96c6be17ba4232da346931d967a0630050dfd298", - "sha256:7051ee569db5fbac144335e0f3b9c2337e0c8d5c9fee015f259a5bd70772b7e8", - "sha256:7716e4a9b7af82c06a2543c53ca476fa0b57e4d760481273e09da04b74ee6ee2", - "sha256:79bd5f0a02aa16808fcbc79a9a376a147cc1045f7dfe44c6e7d53fa8b8a79392", - "sha256:7a4e84a6283b36632e2a5b56e121961f6542ab886bc9e12f8f9818b3c266bfbb", - "sha256:8120575cb4882318c791f839a4fd66161a6fa46f3f0a5e613071aae35b5dd8f8", - "sha256:81413336ef121a6ba746892fad881a83351ee3e1e4011f52e97fba79233611fd", - "sha256:8146f3550d627252269ac42ae660281d673eb6f8b32f113538e0cc2a9aed42b9", - "sha256:879cf3a9a2b53a4672a168c21375166171bc3932b7e21f622201811c43cdd3b0", - "sha256:892c10d6a73e0f14935c31229e03325a7b3093fafd6ce0af704be7f894d95687", - "sha256:92bda934a791c01d6d9d8e038363c50918ef7c40601552a58ac84c9613a665bc", - "sha256:9ba03692a45d3eef66559efe1d1096c4b9b75c0986b5dff5530c378fb8331d4f", - "sha256:9eeea959168ea555e556b8188da5fa7831e21d91ce031e95ce23747b7609f8a4", - "sha256:a0258ad1f44f138b791327961caedffbf9612bfa504ab9597157806faa95194a", - "sha256:a761ba0fa886a7bb33c6c8f6f20213735cb19642c580a931c625ee377ee8bd39", - "sha256:a7b9084668aa0f64e64bd00d27ba5146ef1c3a8835f3bd912e7a9e01326804c4", - "sha256:a84eda42bd12edc36eb5b53bbcc9b406820d3353f1994b6cfe453a33ff101775", - "sha256:ab2939cd5bec30a7430cbdb2287b63151b77cf9624de0532d629c9a1c59b1d5c", - "sha256:ac0280f1ba4a4bfff363a99a6aceed4f8e123f8a9b234c89140f5e894e452ecd", - "sha256:adf8c1d66f432ce577d0197dceaac2ac00c0759f573f28516246351c58a85020", - "sha256:b4adfbbc64014976d2f91084915ca4e626fbf2057fb81af209c1a6d776d23e3d", - "sha256:bb649f8b207ab07caebba230d851b579a3c8711a851d29efe15008e31bb4de24", - "sha256:bce43e386c16898b91e162e5baaad90c4b06f9dcbe36282490032cec98dc8ae7", - "sha256:bd3ad3b0a40e713fc68f99ecfd07124195333f1e689387c180813f0e94309d6f", - "sha256:c3f7ac96b16955634e223b579a3e5798df59007ca43e8d451a0e6a50f6bfdfba", - "sha256:cf28633d64294969c019c6df4ff37f5698e8326db68cc2b66576a51fad634880", - "sha256:d0f35b19894a9e08639fd60a1ec1978cb7f5f7f1eace62f38dd36be8aecdef4d", - "sha256:db1f1c22173ac1c58db249ae48aa7ead29f534b9a948bc56828337aa84a32ed6", - "sha256:dbe512c511956b893d2dacd007d955a3f03d555ae05cfa3ff1c1ff6df8851854", - "sha256:df2f57871a96bbc1b69733cd4c51dc33bea66146b8c63cacbfed73eec0883017", - "sha256:e2f085ce2e813a50dfd0e01fbfc0c12bbe5d2063d99f8b29da30e544fb6483b8", - "sha256:e642d86b8f956098b564a45e6f6ce68a22c2c97a04f5acd3f221f57b8cb850ae", - "sha256:e9e0a277bb2eb5d8a7407e14688b85fd8ad628ee4e0c7930415687b6564207a4", - "sha256:ea2bb7e2ae9e37d96835b3576a4fa4b3a97592fbea8ef7c3587078b0068b8f09", - "sha256:ee4d528022f4c5ff67332469e10efe06a267e32f4067dc76bb7e2cddf3cd25ff", - "sha256:f05d4198c1bacc9124018109c5fba2f3201dbe7ab6e92ff100494f236209c960", - "sha256:f34dc300df798742b3d06515aa2a0aee20941c13579d7a2f2e10af01ae4901ee", - "sha256:f4162988a360a29af158aeb4a2f4f09ffed6a969c9776f8f3bdee9b06a8ab7e5", - "sha256:f486038e44caa08dbd97275a9a35a283a8f1d2f0ee60ac260a1790e76660833c", - "sha256:f7de08cbe5551911886d1ab60de58448c6df0f67d9feb7d1fb21e9875ef95e91" - ], - "markers": "python_version >= '3.10'", - "version": "==2.2.4" - }, - "packaging": { - "hashes": [ - "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", - "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f" - ], - "markers": "python_version >= '3.8'", - "version": "==24.2" - }, - "pandas": { - "hashes": [ - "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a", - "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d", - "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5", - "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4", - "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0", - "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32", - "sha256:31d0ced62d4ea3e231a9f228366919a5ea0b07440d9d4dac345376fd8e1477ea", - "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28", - "sha256:37e0aced3e8f539eccf2e099f65cdb9c8aa85109b0be6e93e2baff94264bdc6f", - "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348", - "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18", - "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468", - "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5", - "sha256:4850ba03528b6dd51d6c5d273c46f183f39a9baf3f0143e566b89450965b105e", - "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667", - "sha256:56534ce0746a58afaf7942ba4863e0ef81c9c50d3f0ae93e9497d6a41a057645", - "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13", - "sha256:5dbca4c1acd72e8eeef4753eeca07de9b1db4f398669d5994086f788a5d7cc30", - "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3", - "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d", - "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb", - "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3", - "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039", - "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8", - "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd", - "sha256:7eee9e7cea6adf3e3d24e304ac6b8300646e2a5d1cd3a3c2abed9101b0846761", - "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659", - "sha256:86976a1c5b25ae3f8ccae3a5306e443569ee3c3faf444dfd0f41cda24667ad57", - "sha256:8cd6d7cc958a3910f934ea8dbdf17b2364827bb4dafc38ce6eef6bb3d65ff09c", - "sha256:99df71520d25fade9db7c1076ac94eb994f4d2673ef2aa2e86ee039b6746d20c", - "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4", - "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a", - "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9", - "sha256:b8661b0238a69d7aafe156b7fa86c44b881387509653fdf857bebc5e4008ad42", - "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2", - "sha256:bc6b93f9b966093cb0fd62ff1a7e4c09e6d546ad7c1de191767baffc57628f39", - "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc", - "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698", - "sha256:d9c45366def9a3dd85a6454c0e7908f2b3b8e9c138f5dc38fed7ce720d8453ed", - "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015", - "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24", - "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319" - ], - "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==2.2.3" - }, - "pillow": { - "hashes": [ - "sha256:015c6e863faa4779251436db398ae75051469f7c903b043a48f078e437656f83", - "sha256:0a2f91f8a8b367e7a57c6e91cd25af510168091fb89ec5146003e424e1558a96", - "sha256:11633d58b6ee5733bde153a8dafd25e505ea3d32e261accd388827ee987baf65", - "sha256:2062ffb1d36544d42fcaa277b069c88b01bb7298f4efa06731a7fd6cc290b81a", - "sha256:31eba6bbdd27dde97b0174ddf0297d7a9c3a507a8a1480e1e60ef914fe23d352", - "sha256:3362c6ca227e65c54bf71a5f88b3d4565ff1bcbc63ae72c34b07bbb1cc59a43f", - "sha256:368da70808b36d73b4b390a8ffac11069f8a5c85f29eff1f1b01bcf3ef5b2a20", - "sha256:36ba10b9cb413e7c7dfa3e189aba252deee0602c86c309799da5a74009ac7a1c", - "sha256:3764d53e09cdedd91bee65c2527815d315c6b90d7b8b79759cc48d7bf5d4f114", - "sha256:3a5fe20a7b66e8135d7fd617b13272626a28278d0e578c98720d9ba4b2439d49", - "sha256:3cdcdb0b896e981678eee140d882b70092dac83ac1cdf6b3a60e2216a73f2b91", - "sha256:4637b88343166249fe8aa94e7c4a62a180c4b3898283bb5d3d2fd5fe10d8e4e0", - "sha256:4db853948ce4e718f2fc775b75c37ba2efb6aaea41a1a5fc57f0af59eee774b2", - "sha256:4dd43a78897793f60766563969442020e90eb7847463eca901e41ba186a7d4a5", - "sha256:54251ef02a2309b5eec99d151ebf5c9904b77976c8abdcbce7891ed22df53884", - "sha256:54ce1c9a16a9561b6d6d8cb30089ab1e5eb66918cb47d457bd996ef34182922e", - "sha256:593c5fd6be85da83656b93ffcccc2312d2d149d251e98588b14fbc288fd8909c", - "sha256:5bb94705aea800051a743aa4874bb1397d4695fb0583ba5e425ee0328757f196", - "sha256:67cd427c68926108778a9005f2a04adbd5e67c442ed21d95389fe1d595458756", - "sha256:70ca5ef3b3b1c4a0812b5c63c57c23b63e53bc38e758b37a951e5bc466449861", - "sha256:73ddde795ee9b06257dac5ad42fcb07f3b9b813f8c1f7f870f402f4dc54b5269", - "sha256:758e9d4ef15d3560214cddbc97b8ef3ef86ce04d62ddac17ad39ba87e89bd3b1", - "sha256:7d33d2fae0e8b170b6a6c57400e077412240f6f5bb2a342cf1ee512a787942bb", - "sha256:7fdadc077553621911f27ce206ffcbec7d3f8d7b50e0da39f10997e8e2bb7f6a", - "sha256:8000376f139d4d38d6851eb149b321a52bb8893a88dae8ee7d95840431977081", - "sha256:837060a8599b8f5d402e97197d4924f05a2e0d68756998345c829c33186217b1", - "sha256:89dbdb3e6e9594d512780a5a1c42801879628b38e3efc7038094430844e271d8", - "sha256:8c730dc3a83e5ac137fbc92dfcfe1511ce3b2b5d7578315b63dbbb76f7f51d90", - "sha256:8e275ee4cb11c262bd108ab2081f750db2a1c0b8c12c1897f27b160c8bd57bbc", - "sha256:9044b5e4f7083f209c4e35aa5dd54b1dd5b112b108648f5c902ad586d4f945c5", - "sha256:93a18841d09bcdd774dcdc308e4537e1f867b3dec059c131fde0327899734aa1", - "sha256:9409c080586d1f683df3f184f20e36fb647f2e0bc3988094d4fd8c9f4eb1b3b3", - "sha256:96f82000e12f23e4f29346e42702b6ed9a2f2fea34a740dd5ffffcc8c539eb35", - "sha256:9aa9aeddeed452b2f616ff5507459e7bab436916ccb10961c4a382cd3e03f47f", - "sha256:9ee85f0696a17dd28fbcfceb59f9510aa71934b483d1f5601d1030c3c8304f3c", - "sha256:a07dba04c5e22824816b2615ad7a7484432d7f540e6fa86af60d2de57b0fcee2", - "sha256:a3cd561ded2cf2bbae44d4605837221b987c216cff94f49dfeed63488bb228d2", - "sha256:a697cd8ba0383bba3d2d3ada02b34ed268cb548b369943cd349007730c92bddf", - "sha256:a76da0a31da6fcae4210aa94fd779c65c75786bc9af06289cd1c184451ef7a65", - "sha256:a85b653980faad27e88b141348707ceeef8a1186f75ecc600c395dcac19f385b", - "sha256:a8d65b38173085f24bc07f8b6c505cbb7418009fa1a1fcb111b1f4961814a442", - "sha256:aa8dd43daa836b9a8128dbe7d923423e5ad86f50a7a14dc688194b7be5c0dea2", - "sha256:ab8a209b8485d3db694fa97a896d96dd6533d63c22829043fd9de627060beade", - "sha256:abc56501c3fd148d60659aae0af6ddc149660469082859fa7b066a298bde9482", - "sha256:ad5db5781c774ab9a9b2c4302bbf0c1014960a0a7be63278d13ae6fdf88126fe", - "sha256:ae98e14432d458fc3de11a77ccb3ae65ddce70f730e7c76140653048c71bfcbc", - "sha256:b20be51b37a75cc54c2c55def3fa2c65bb94ba859dde241cd0a4fd302de5ae0a", - "sha256:b523466b1a31d0dcef7c5be1f20b942919b62fd6e9a9be199d035509cbefc0ec", - "sha256:b5d658fbd9f0d6eea113aea286b21d3cd4d3fd978157cbf2447a6035916506d3", - "sha256:b6123aa4a59d75f06e9dd3dac5bf8bc9aa383121bb3dd9a7a612e05eabc9961a", - "sha256:bd165131fd51697e22421d0e467997ad31621b74bfc0b75956608cb2906dda07", - "sha256:bf902d7413c82a1bfa08b06a070876132a5ae6b2388e2712aab3a7cbc02205c6", - "sha256:c12fc111ef090845de2bb15009372175d76ac99969bdf31e2ce9b42e4b8cd88f", - "sha256:c1eec9d950b6fe688edee07138993e54ee4ae634c51443cfb7c1e7613322718e", - "sha256:c640e5a06869c75994624551f45e5506e4256562ead981cce820d5ab39ae2192", - "sha256:cc1331b6d5a6e144aeb5e626f4375f5b7ae9934ba620c0ac6b3e43d5e683a0f0", - "sha256:cfd5cd998c2e36a862d0e27b2df63237e67273f2fc78f47445b14e73a810e7e6", - "sha256:d3d8da4a631471dfaf94c10c85f5277b1f8e42ac42bade1ac67da4b4a7359b73", - "sha256:d44ff19eea13ae4acdaaab0179fa68c0c6f2f45d66a4d8ec1eda7d6cecbcc15f", - "sha256:dd0052e9db3474df30433f83a71b9b23bd9e4ef1de13d92df21a52c0303b8ab6", - "sha256:dd0e081319328928531df7a0e63621caf67652c8464303fd102141b785ef9547", - "sha256:dda60aa465b861324e65a78c9f5cf0f4bc713e4309f83bc387be158b077963d9", - "sha256:e06695e0326d05b06833b40b7ef477e475d0b1ba3a6d27da1bb48c23209bf457", - "sha256:e1abe69aca89514737465752b4bcaf8016de61b3be1397a8fc260ba33321b3a8", - "sha256:e267b0ed063341f3e60acd25c05200df4193e15a4a5807075cd71225a2386e26", - "sha256:e5449ca63da169a2e6068dd0e2fcc8d91f9558aba89ff6d02121ca8ab11e79e5", - "sha256:e63e4e5081de46517099dc30abe418122f54531a6ae2ebc8680bcd7096860eab", - "sha256:f189805c8be5ca5add39e6f899e6ce2ed824e65fb45f3c28cb2841911da19070", - "sha256:f7955ecf5609dee9442cbface754f2c6e541d9e6eda87fad7f7a989b0bdb9d71", - "sha256:f86d3a7a9af5d826744fabf4afd15b9dfef44fe69a98541f666f66fbb8d3fef9", - "sha256:fbd43429d0d7ed6533b25fc993861b8fd512c42d04514a0dd6337fb3ccf22761" - ], - "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==11.1.0" - }, - "pyparsing": { - "hashes": [ - "sha256:2a857aee851f113c2de9d4bfd9061baea478cb0f1c7ca6cbf594942d6d111575", - "sha256:6ab05e1cb111cc72acc8ed811a3ca4c2be2af8d7b6df324347f04fd057d8d793" - ], - "markers": "python_version >= '3.9'", - "version": "==3.2.2" - }, - "pyproj": { - "hashes": [ - "sha256:04abc517a8555d1b05fcee768db3280143fe42ec39fdd926a2feef31631a1f2f", - "sha256:0829865c1d3a3543f918b3919dc601eea572d6091c0dd175e1a054db9c109274", - "sha256:084c0a475688f934d386c2ab3b6ce03398a473cd48adfda70d9ab8f87f2394a0", - "sha256:0b853ae99bda66cbe24b4ccfe26d70601d84375940a47f553413d9df570065e0", - "sha256:1e47c4e93b88d99dd118875ee3ca0171932444cdc0b52d493371b5d98d0f30ee", - "sha256:263b54ba5004b6b957d55757d846fc5081bc02980caa0279c4fc95fa0fff6067", - "sha256:2781029d90df7f8d431e29562a3f2d8eafdf233c4010d6fc0381858dc7373217", - "sha256:3537668992a709a2e7f068069192138618c00d0ba113572fdd5ee5ffde8222f3", - "sha256:3c2e7449840a44ce860d8bea2c6c1c4bc63fa07cba801dcce581d14dcb031a02", - "sha256:3e8d276caeae34fcbe4813855d0d97b9b825bab8d7a8b86d859c24a6213a5a0d", - "sha256:5ad0ff443a785d84e2b380869fdd82e6bfc11eba6057d25b4409a9bbfa867970", - "sha256:5f0da2711364d7cb9f115b52289d4a9b61e8bca0da57f44a3a9d6fc9bdeb7274", - "sha256:5f8d02ef4431dee414d1753d13fa82a21a2f61494737b5f642ea668d76164d6d", - "sha256:60d72facd7b6b79853f19744779abcd3f804c4e0d4fa8815469db20c9f640a47", - "sha256:6181960b4b812e82e588407fe5c9c68ada267c3b084db078f248db5d7f45d18a", - "sha256:6575b2e53cc9e3e461ad6f0692a5564b96e7782c28631c7771c668770915e169", - "sha256:83db380c52087f9e9bdd8a527943b2e7324f275881125e39475c4f9277bdeec4", - "sha256:87229e42b75e89f4dad6459200f92988c5998dfb093c7c631fb48524c86cd5dc", - "sha256:8c5dcf24ede53d8abab7d8a77f69ff1936c6a8843ef4fcc574646e4be66e5739", - "sha256:8cb516ee35ed57789b46b96080edf4e503fdb62dbb2e3c6581e0d6c83fca014b", - "sha256:a20727a23b1e49c7dc7fe3c3df8e56a8a7acdade80ac2f5cca29d7ca5564c145", - "sha256:a8b15b0463d1303bab113d1a6af2860a0d79013c3a66fcc5475ce26ef717fd4f", - "sha256:a94e26c1a4950cea40116775588a2ca7cf56f1f434ff54ee35a84718f3841a3d", - "sha256:aee664a9d806612af30a19dba49e55a7a78ebfec3e9d198f6a6176e1d140ec98", - "sha256:b35ed213892e211a3ce2bea002aa1183e1a2a9b79e51bb3c6b15549a831ae528", - "sha256:bf09dbeb333c34e9c546364e7df1ff40474f9fddf9e70657ecb0e4f670ff0b0e", - "sha256:bf84d766646f1ebd706d883755df4370aaf02b48187cedaa7e4239f16bc8213d", - "sha256:d3caac7473be22b6d6e102dde6c46de73b96bc98334e577dfaee9886f102ea2e", - "sha256:d61bf8ab04c73c1da08eedaf21a103b72fa5b0a9b854762905f65ff8b375d394", - "sha256:d666c3a3faaf3b1d7fc4a544059c4eab9d06f84a604b070b7aa2f318e227798e", - "sha256:f173f851ee75e54acdaa053382b6825b400cb2085663a9bb073728a59c60aebb", - "sha256:f550281ed6e5ea88fcf04a7c6154e246d5714be495c50c9e8e6b12d3fb63e158", - "sha256:f6d6a2ccd5607cd15ef990c51e6f2dd27ec0a741e72069c387088bba3aab60fa" - ], - "index": "pypi", - "markers": "python_version >= '3.10'", - "version": "==3.7.1" - }, - "python-dateutil": { - "hashes": [ - "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", - "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", - "version": "==2.9.0.post0" - }, - "pytz": { - "hashes": [ - "sha256:89dd22dca55b46eac6eda23b2d72721bf1bdfef212645d81513ef5d03038de57", - "sha256:c2db42be2a2518b28e65f9207c4d05e6ff547d1efa4086469ef855e4ab70178e" - ], - "version": "==2025.1" - }, - "requests": { - "hashes": [ - "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", - "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6" - ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==2.32.3" - }, - "scipy": { - "hashes": [ - "sha256:01edfac9f0798ad6b46d9c4c9ca0e0ad23dbf0b1eb70e96adb9fa7f525eff0bf", - "sha256:03205d57a28e18dfd39f0377d5002725bf1f19a46f444108c29bdb246b6c8a11", - "sha256:08b57a9336b8e79b305a143c3655cc5bdbe6d5ece3378578888d2afbb51c4e37", - "sha256:11e7ad32cf184b74380f43d3c0a706f49358b904fa7d5345f16ddf993609184d", - "sha256:28a0d2c2075946346e4408b211240764759e0fabaeb08d871639b5f3b1aca8a0", - "sha256:2b871df1fe1a3ba85d90e22742b93584f8d2b8e6124f8372ab15c71b73e428b8", - "sha256:302093e7dfb120e55515936cb55618ee0b895f8bcaf18ff81eca086c17bd80af", - "sha256:42dabaaa798e987c425ed76062794e93a243be8f0f20fff6e7a89f4d61cb3d40", - "sha256:447ce30cee6a9d5d1379087c9e474628dab3db4a67484be1b7dc3196bfb2fac9", - "sha256:4c6676490ad76d1c2894d77f976144b41bd1a4052107902238047fb6a473e971", - "sha256:54c462098484e7466362a9f1672d20888f724911a74c22ae35b61f9c5919183d", - "sha256:597a0c7008b21c035831c39927406c6181bcf8f60a73f36219b69d010aa04737", - "sha256:5a6fd6eac1ce74a9f77a7fc724080d507c5812d61e72bd5e4c489b042455865e", - "sha256:5ea7ed46d437fc52350b028b1d44e002646e28f3e8ddc714011aaf87330f2f32", - "sha256:601881dfb761311045b03114c5fe718a12634e5608c3b403737ae463c9885d53", - "sha256:62ca1ff3eb513e09ed17a5736929429189adf16d2d740f44e53270cc800ecff1", - "sha256:69ea6e56d00977f355c0f84eba69877b6df084516c602d93a33812aa04d90a3d", - "sha256:6a8e34cf4c188b6dd004654f88586d78f95639e48a25dfae9c5e34a6dc34547e", - "sha256:6d0194c37037707b2afa7a2f2a924cf7bac3dc292d51b6a925e5fcb89bc5c776", - "sha256:6f223753c6ea76983af380787611ae1291e3ceb23917393079dcc746ba60cfb5", - "sha256:6f5e296ec63c5da6ba6fa0343ea73fd51b8b3e1a300b0a8cae3ed4b1122c7462", - "sha256:7cd5b77413e1855351cdde594eca99c1f4a588c2d63711388b6a1f1c01f62274", - "sha256:869269b767d5ee7ea6991ed7e22b3ca1f22de73ab9a49c44bad338b725603301", - "sha256:87994da02e73549dfecaed9e09a4f9d58a045a053865679aeb8d6d43747d4df3", - "sha256:888307125ea0c4466287191e5606a2c910963405ce9671448ff9c81c53f85f58", - "sha256:92233b2df6938147be6fa8824b8136f29a18f016ecde986666be5f4d686a91a4", - "sha256:9412f5e408b397ff5641080ed1e798623dbe1ec0d78e72c9eca8992976fa65aa", - "sha256:9b18aa747da280664642997e65aab1dd19d0c3d17068a04b3fe34e2559196cb9", - "sha256:9de9d1416b3d9e7df9923ab23cd2fe714244af10b763975bea9e4f2e81cebd27", - "sha256:a2ec871edaa863e8213ea5df811cd600734f6400b4af272e1c011e69401218e9", - "sha256:a5080a79dfb9b78b768cebf3c9dcbc7b665c5875793569f48bf0e2b1d7f68f6f", - "sha256:a8bf5cb4a25046ac61d38f8d3c3426ec11ebc350246a4642f2f315fe95bda655", - "sha256:b09ae80010f52efddb15551025f9016c910296cf70adbf03ce2a8704f3a5ad20", - "sha256:b5e025e903b4f166ea03b109bb241355b9c42c279ea694d8864d033727205e65", - "sha256:bad78d580270a4d32470563ea86c6590b465cb98f83d760ff5b0990cb5518a93", - "sha256:bae43364d600fdc3ac327db99659dcb79e6e7ecd279a75fe1266669d9a652828", - "sha256:c4697a10da8f8765bb7c83e24a470da5797e37041edfd77fd95ba3811a47c4fd", - "sha256:c90ebe8aaa4397eaefa8455a8182b164a6cc1d59ad53f79943f266d99f68687f", - "sha256:cd58a314d92838f7e6f755c8a2167ead4f27e1fd5c1251fd54289569ef3495ec", - "sha256:cf72ff559a53a6a6d77bd8eefd12a17995ffa44ad86c77a5df96f533d4e6c6bb", - "sha256:def751dd08243934c884a3221156d63e15234a3155cf25978b0a668409d45eb6", - "sha256:e7c68b6a43259ba0aab737237876e5c2c549a031ddb7abc28c7b47f22e202ded", - "sha256:ecf797d2d798cf7c838c6d98321061eb3e72a74710e6c40540f0e8087e3b499e", - "sha256:f031846580d9acccd0044efd1a90e6f4df3a6e12b4b6bd694a7bc03a89892b28", - "sha256:fb530e4794fc8ea76a4a21ccb67dea33e5e0e60f07fc38a49e821e1eae3b71a0", - "sha256:fe8a9eb875d430d81755472c5ba75e84acc980e4a8f6204d402849234d3017db" - ], - "index": "pypi", - "markers": "python_version >= '3.10'", - "version": "==1.15.2" - }, - "shapely": { - "extras": [ - "vectorized" - ], - "hashes": [ - "sha256:0145387565fcf8f7c028b073c802956431308da933ef41d08b1693de49990d27", - "sha256:04a65d882456e13c8b417562c36324c0cd1e5915f3c18ad516bb32ee3f5fc895", - "sha256:06ff6020949b44baa8fc2e5e57e0f3d09486cd5c33b47d669f847c54136e7027", - "sha256:19cbc8808efe87a71150e785b71d8a0e614751464e21fb679d97e274eca7bd43", - "sha256:1a2e03277128e62f9a49a58eb7eb813fa9b343925fca5e7d631d50f4c0e8e0b8", - "sha256:1e9fed9a7d6451979d914cb6ebbb218b4b4e77c0d50da23e23d8327948662611", - "sha256:25085a30a2462cee4e850a6e3fb37431cbbe4ad51cbcc163af0cea1eaa9eb96d", - "sha256:28fe2997aab9a9dc026dc6a355d04e85841546b2a5d232ed953e3321ab958ee5", - "sha256:2934834c7f417aeb7cba3b0d9b4441a76ebcecf9ea6e80b455c33c7c62d96a24", - "sha256:2e4a1749ad64bc6e7668c8f2f9479029f079991f4ae3cb9e6b25440e35a4b532", - "sha256:2f6e4759cf680a0f00a54234902415f2fa5fe02f6b05546c662654001f0793a2", - "sha256:33fb10e50b16113714ae40adccf7670379e9ccf5b7a41d0002046ba2b8f0f691", - "sha256:35524cc8d40ee4752520819f9894b9f28ba339a42d4922e92c99b148bed3be39", - "sha256:3697bd078b4459f5a1781015854ef5ea5d824dbf95282d0b60bfad6ff83ec8dc", - "sha256:4abeb44b3b946236e4e1a1b3d2a0987fb4d8a63bfb3fdefb8a19d142b72001e5", - "sha256:4c2b9859424facbafa54f4a19b625a752ff958ab49e01bc695f254f7db1835fa", - "sha256:5aed1c6764f51011d69a679fdf6b57e691371ae49ebe28c3edb5486537ffbd51", - "sha256:5cf23400cb25deccf48c56a7cdda8197ae66c0e9097fcdd122ac2007e320bc34", - "sha256:5d6dbf096f961ca6bec5640e22e65ccdec11e676344e8157fe7d636e7904fd36", - "sha256:6bca5095e86be9d4ef3cb52d56bdd66df63ff111d580855cb8546f06c3c907cd", - "sha256:73c9ae8cf443187d784d57202199bf9fd2d4bb7d5521fe8926ba40db1bc33e8e", - "sha256:7977d8a39c4cf0e06247cd2dca695ad4e020b81981d4c82152c996346cf1094b", - "sha256:7e97104d28e60b69f9b6a957c4d3a2a893b27525bc1fc96b47b3ccef46726bf2", - "sha256:8ae5cb6b645ac3fba34ad84b32fbdccb2ab321facb461954925bde807a0d3b74", - "sha256:8f623b64bb219d62014781120f47499a7adc30cf7787e24b659e56651ceebcb0", - "sha256:98697c842d5c221408ba8aa573d4f49caef4831e9bc6b6e785ce38aca42d1999", - "sha256:a0c09e3e02f948631c7763b4fd3dd175bc45303a0ae04b000856dedebefe13cb", - "sha256:a3fb7fbae257e1b042f440289ee7235d03f433ea880e73e687f108d044b24db5", - "sha256:a7f04691ce1c7ed974c2f8b34a1fe4c3c5dfe33128eae886aa32d730f1ec1913", - "sha256:a9469f49ff873ef566864cb3516091881f217b5d231c8164f7883990eec88b73", - "sha256:aaaf5f7e6cc234c1793f2a2760da464b604584fb58c6b6d7d94144fd2692d67e", - "sha256:adeddfb1e22c20548e840403e5e0b3d9dc3daf66f05fa59f1fcf5b5f664f0e98", - "sha256:b52f3ab845d32dfd20afba86675c91919a622f4627182daec64974db9b0b4608", - "sha256:cd0e75d9124b73e06a42bf1615ad3d7d805f66871aa94538c3a9b7871d620013", - "sha256:cf6c50cd879831955ac47af9c907ce0310245f9d162e298703f82e1785e38c98", - "sha256:d8f1da01c04527f7da59ee3755d8ee112cd8967c15fab9e43bba936b81e2a013", - "sha256:dd37d65519b3f8ed8976fa4302a2827cbb96e0a461a2e504db583b08a22f0b98", - "sha256:e1c4f1071fe9c09af077a69b6c75f17feb473caeea0c3579b3e94834efcbdc36", - "sha256:e6d95703efaa64aaabf278ced641b888fc23d9c6dd71f8215091afd8a26a66e3", - "sha256:f44eda8bd7a4bccb0f281264b34bf3518d8c4c9a8ffe69a1a05dabf6e8461147", - "sha256:f86e2c0259fe598c4532acfcf638c1f520fa77c1275912bbc958faecbf00b108", - "sha256:fc19b78cc966db195024d8011649b4e22812f805dd49264323980715ab80accc" - ], - "markers": "python_version >= '3.7'", - "version": "==2.0.7" - }, - "simplejson": { - "hashes": [ - "sha256:000602141d0bddfcff60ea6a6e97d5e10c9db6b17fd2d6c66199fa481b6214bb", - "sha256:03d7a426e416fe0d3337115f04164cd9427eb4256e843a6b8751cacf70abc832", - "sha256:03db8cb64154189a92a7786209f24e391644f3a3fa335658be2df2af1960b8d8", - "sha256:03ec618ed65caab48e81e3ed29586236a8e57daef792f1f3bb59504a7e98cd10", - "sha256:0821871404a537fd0e22eba240c74c0467c28af6cc435903eca394cfc74a0497", - "sha256:1190f9a3ce644fd50ec277ac4a98c0517f532cfebdcc4bd975c0979a9f05e1fb", - "sha256:15c7de4c88ab2fbcb8781a3b982ef883696736134e20b1210bca43fb42ff1acf", - "sha256:1b9fd15853b90aec3b1739f4471efbf1ac05066a2c7041bf8db821bb73cd2ddc", - "sha256:1bd6bfe5678d73fbd5328eea6a35216503796428fc47f1237432522febaf3a0c", - "sha256:272cc767826e924a6bd369ea3dbf18e166ded29059c7a4d64d21a9a22424b5b5", - "sha256:299b1007b8101d50d95bc0db1bf5c38dc372e85b504cf77f596462083ee77e3f", - "sha256:2b6436c48e64378fa844d8c9e58a5ed0352bbcfd4028369a9b46679b7ab79d2d", - "sha256:2e671dd62051129185d3a9a92c60101f56cbc174854a1a3dfb69114ebd9e1699", - "sha256:325b8c107253d3217e89d7b50c71015b5b31e2433e6c5bf38967b2f80630a8ca", - "sha256:339f407373325a36b7fd744b688ba5bae0666b5d340ec6d98aebc3014bf3d8ea", - "sha256:3466d2839fdc83e1af42e07b90bc8ff361c4e8796cd66722a40ba14e458faddd", - "sha256:391345b4157cc4e120027e013bd35c45e2c191e2bf48b8913af488cdc3b9243c", - "sha256:3c4f0a61cdc05550782ca4a2cdb311ea196c2e6be6b24a09bf71360ca8c3ca9b", - "sha256:3d7310172d5340febd258cb147f46aae30ad57c445f4d7e1ae8461c10aaf43b0", - "sha256:3e7963197d958fcf9e98b212b80977d56c022384621ff463d98afc3b6b1ce7e8", - "sha256:455a882ff3f97d810709f7b620007d4e0aca8da71d06fc5c18ba11daf1c4df49", - "sha256:463f1fca8fbf23d088e5850fdd0dd4d5faea8900a9f9680270bd98fd649814ca", - "sha256:4762e05577955312a4c6802f58dd02e040cc79ae59cda510aa1564d84449c102", - "sha256:489c3a43116082bad56795215786313832ba3991cca1f55838e52a553f451ab6", - "sha256:49d059b8363327eee3c94799dd96782314b2dbd7bcc293b4ad48db69d6f4d362", - "sha256:4a586ce4f78cec11f22fe55c5bee0f067e803aab9bad3441afe2181693b5ebb5", - "sha256:4a8e197e4cf6d42c2c57e7c52cd7c1e7b3e37c5911df1314fb393320131e2101", - "sha256:4a92e948bad8df7fa900ba2ba0667a98303f3db206cbaac574935c332838208e", - "sha256:51b41f284d603c4380732d7d619f8b34bd04bc4aa0ed0ed5f4ffd0539b14da44", - "sha256:5c0de368f3052a59a1acf21f8b2dd28686a9e4eba2da7efae7ed9554cb31e7bc", - "sha256:627d4486a1ea7edf1f66bb044ace1ce6b4c1698acd1b05353c97ba4864ea2e17", - "sha256:652d8eecbb9a3b6461b21ec7cf11fd0acbab144e45e600c817ecf18e4580b99e", - "sha256:69dd28d4ce38390ea4aaf212902712c0fd1093dc4c1ff67e09687c3c3e15a749", - "sha256:6a6dd11ee282937ad749da6f3b8d87952ad585b26e5edfa10da3ae2536c73078", - "sha256:6bd09c8c75666e7f62a33d2f1fb57f81da1fcbb19a9fe7d7910b5756e1dd6048", - "sha256:6c21f5c026ca633cfffcb6bc1fac2e99f65cb2b24657d3bef21aed9916cc3bbf", - "sha256:6d4f320c33277a5b715db5bf5b10dae10c19076bd6d66c2843e04bd12d1f1ea5", - "sha256:6dd3a1d5aca87bf947f3339b0f8e8e329f1badf548bdbff37fac63c17936da8e", - "sha256:6e18345c8dda5d699be8166b61f9d80aaee4545b709f1363f60813dc032dac53", - "sha256:6e6697a3067d281f01de0fe96fc7cba4ea870d96d7deb7bfcf85186d74456503", - "sha256:71b75d448fd0ceb2e7c90e72bb82c41f8462550d48529980bc0bab1d2495bfbb", - "sha256:71e849e7ceb2178344998cbe5ade101f1b329460243c79c27fbfc51c0447a7c3", - "sha256:74a1608f9e6e8c27a4008d70a54270868306d80ed48c9df7872f9f4b8ac87808", - "sha256:7551682b60bba3a9e2780742e101cf0a64250e76de7d09b1c4b0c8a7c7cc6834", - "sha256:76461ec929282dde4a08061071a47281ad939d0202dc4e63cdd135844e162fbc", - "sha256:78520f04b7548a5e476b5396c0847e066f1e0a4c0c5e920da1ad65e95f410b11", - "sha256:7ceed598e4bacbf5133fe7a418f7991bb2df0683f3ac11fbf9e36a2bc7aa4b85", - "sha256:7e9d73f46119240e4f4f07868241749d67d09873f40cb968d639aa9ccc488b86", - "sha256:7eaae2b88eb5da53caaffdfa50e2e12022553949b88c0df4f9a9663609373f72", - "sha256:87fc623d457173a0213bc9ca4e346b83c9d443f63ed5cca847fb0cacea3cfc95", - "sha256:884e6183d16b725e113b83a6fc0230152ab6627d4d36cb05c89c2c5bccfa7bc6", - "sha256:88a7baa8211089b9e58d78fbc1b0b322103f3f3d459ff16f03a36cece0d0fcf0", - "sha256:896a6c04d7861d507d800da7642479c3547060bf97419d9ef73d98ced8258766", - "sha256:8a6c1bbac39fa4a79f83cbf1df6ccd8ff7069582a9fd8db1e52cea073bc2c697", - "sha256:8bb98fdf318c05aefd08a92583bd6ee148e93c6756fb1befb7b2d5f27824be78", - "sha256:8c09948f1a486a89251ee3a67c9f8c969b379f6ffff1a6064b41fea3bce0a112", - "sha256:8d23b7f8d6b72319d6d55a0261089ff621ce87e54731c2d3de6a9bf7be5c028c", - "sha256:90b573693d1526bed576f6817e2a492eaaef68f088b57d7a9e83d122bbb49e51", - "sha256:9a74e70818818981294b8e6956ce3496c5e1bd4726ac864fae473197671f7b85", - "sha256:9c079606f461a6e950099167e21e13985147c8a24be8eea66c9ad68f73fad744", - "sha256:9daf8cdc7ee8a9e9f7a3b313ba0a003391857e90d0e82fbcd4d614aa05cb7c3b", - "sha256:9e8eacf6a3491bf76ea91a8d46726368a6be0eb94993f60b8583550baae9439e", - "sha256:9faceb68fba27ef17eda306e4cd97a7b4b14fdadca5fbb15790ba8b26ebeec0c", - "sha256:a2cc4f6486f9f515b62f5831ff1888886619b84fc837de68f26d919ba7bbdcbc", - "sha256:a3c2df555ee4016148fa192e2b9cd9e60bc1d40769366134882685e90aee2a1e", - "sha256:a7e15b716d09f318c8cda3e20f82fae81684ce3d3acd1d7770fa3007df1769de", - "sha256:a8011f1dd1d676befcd4d675ebdbfdbbefd3bf350052b956ba8c699fca7d8cef", - "sha256:ab19c2da8c043607bde4d4ef3a6b633e668a7d2e3d56f40a476a74c5ea71949f", - "sha256:ab980fcc446ab87ea0879edad41a5c28f2d86020014eb035cf5161e8de4474c6", - "sha256:ae6e637dc24f8fee332ed23dd070e81394138e42cd4fd9d0923e5045ba122e27", - "sha256:ae81e482476eaa088ef9d0120ae5345de924f23962c0c1e20abbdff597631f87", - "sha256:af8377a8af78226e82e3a4349efdde59ffa421ae88be67e18cef915e4023a595", - "sha256:b122a19b552b212fc3b5b96fc5ce92333d4a9ac0a800803e1f17ebb16dac4be5", - "sha256:b2578bedaedf6294415197b267d4ef678fea336dd78ee2a6d2f4b028e9d07be3", - "sha256:b63fdbab29dc3868d6f009a59797cefaba315fd43cd32ddd998ee1da28e50e29", - "sha256:bd9577ec1c8c3a43040e3787711e4c257c70035b7551a21854b5dec88dad09e1", - "sha256:c02f4868a3a46ffe284a51a88d134dc96feff6079a7115164885331a1ba8ed9f", - "sha256:c1336ba7bcb722ad487cd265701ff0583c0bb6de638364ca947bb84ecc0015d1", - "sha256:c6fdcc9debb711ddd2ad6d69f9386a3d9e8e253234bbb30513e0a7caa9510c51", - "sha256:c7edf279c1376f28bf41e916c015a2a08896597869d57d621f55b6a30c7e1e6d", - "sha256:c939a1e576bded47d7d03aa2afc2ae90b928b2cf1d9dc2070ceec51fd463f430", - "sha256:cbbd7b215ad4fc6f058b5dd4c26ee5c59f72e031dfda3ac183d7968a99e4ca3a", - "sha256:cd2cdead1d3197f0ff43373cf4730213420523ba48697743e135e26f3d179f38", - "sha256:cda5c32a98f392909088111ecec23f2b0d39346ceae1a0fea23ab2d1f84ec21d", - "sha256:ceab2ce2acdc7fbaa433a93006758db6ba9a659e80c4faa13b80b9d2318e9b17", - "sha256:d34d04bf90b4cea7c22d8b19091633908f14a096caa301b24c2f3d85b5068fb8", - "sha256:d492ed8e92f3a9f9be829205f44b1d0a89af6582f0cf43e0d129fa477b93fe0c", - "sha256:d8853c269a4c5146ddca4aa7c70e631795e9d11239d5fedb1c6bbc91ffdebcac", - "sha256:d9202b9de38f12e99a40addd1a8d508a13c77f46d87ab1f9095f154667f4fe81", - "sha256:dfe7a9da5fd2a3499436cd350f31539e0a6ded5da6b5b3d422df016444d65e43", - "sha256:e041add470e8f8535cc05509485eb7205729a84441f03b25cde80ad48823792e", - "sha256:e25b2a0c396f3b84fb89573d07b0e1846ed563eb364f2ea8230ca92b8a8cb786", - "sha256:e39eaa57c7757daa25bcd21f976c46be443b73dd6c3da47fe5ce7b7048ccefe2", - "sha256:e580aa65d5f6c3bf41b9b4afe74be5d5ddba9576701c107c772d936ea2b5043a", - "sha256:e64139b4ec4f1f24c142ff7dcafe55a22b811a74d86d66560c8815687143037d", - "sha256:e66712b17d8425bb7ff8968d4c7c7fd5a2dd7bd63728b28356223c000dd2f91f", - "sha256:e836fb88902799eac8debc2b642300748f4860a197fa3d9ea502112b6bb8e142", - "sha256:e91703a4c5fec53e36875ae426ad785f4120bd1d93b65bed4752eeccd1789e0c", - "sha256:e975aac6a5acd8b510eba58d5591e10a03e3d16c1cf8a8624ca177491f7230f0", - "sha256:ec6a1e0a7aff76f0e008bebfa950188b9c50b58c1885d898145f48fc8e189a56", - "sha256:ed6a17fd397f0e2b3ad668fc9e19253ed2e3875ad9086bd7f795c29a3223f4a1", - "sha256:ede69c765e9901861ad7c6139023b7b7d5807c48a2539d817b4ab40018002d5f", - "sha256:eea7e2b7d858f6fdfbf0fe3cb846d6bd8a45446865bc09960e51f3d473c2271b", - "sha256:efd3bc6c6b17e3d4620eb6be5196f0d1c08b6ce7c3101fa8e292b79e0908944b", - "sha256:f31c4a3a7ab18467ee73a27f3e59158255d1520f3aad74315edde7a940f1be23", - "sha256:f4bd49ecde87b0fe9f55cc971449a32832bca9910821f7072bbfae1155eaa007", - "sha256:f5272b5866b259fe6c33c4a8c5073bf8b359c3c97b70c298a2f09a69b52c7c41", - "sha256:f5aee2a4cb6b146bd17333ac623610f069f34e8f31d2f4f0c1a2186e50c594f0", - "sha256:f924b485537b640dc69434565463fd6fc0c68c65a8c6e01a823dd26c9983cf79", - "sha256:fc0f523ce923e7f38eb67804bc80e0a028c76d7868500aa3f59225574b5d0453" - ], - "index": "pypi", - "markers": "python_version >= '2.5' and python_version not in '3.0, 3.1, 3.2'", - "version": "==3.20.1" - }, - "six": { - "hashes": [ - "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", - "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", - "version": "==1.17.0" - }, - "soupsieve": { - "hashes": [ - "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb", - "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9" - ], - "markers": "python_version >= '3.8'", - "version": "==2.6" - }, - "sqlalchemy": { - "hashes": [ - "sha256:018ee97c558b499b58935c5a152aeabf6d36b3d55d91656abeb6d93d663c0c4c", - "sha256:01da15490c9df352fbc29859d3c7ba9cd1377791faeeb47c100832004c99472c", - "sha256:04545042969833cb92e13b0a3019549d284fd2423f318b6ba10e7aa687690a3c", - "sha256:06205eb98cb3dd52133ca6818bf5542397f1dd1b69f7ea28aa84413897380b06", - "sha256:08cf721bbd4391a0e765fe0fe8816e81d9f43cece54fdb5ac465c56efafecb3d", - "sha256:0d7e3866eb52d914aea50c9be74184a0feb86f9af8aaaa4daefe52b69378db0b", - "sha256:125a7763b263218a80759ad9ae2f3610aaf2c2fbbd78fff088d584edf81f3782", - "sha256:23c5aa33c01bd898f879db158537d7e7568b503b15aad60ea0c8da8109adf3e7", - "sha256:2600a50d590c22d99c424c394236899ba72f849a02b10e65b4c70149606408b5", - "sha256:2d7332868ce891eda48896131991f7f2be572d65b41a4050957242f8e935d5d7", - "sha256:2ed107331d188a286611cea9022de0afc437dd2d3c168e368169f27aa0f61338", - "sha256:3395e7ed89c6d264d38bea3bfb22ffe868f906a7985d03546ec7dc30221ea980", - "sha256:344cd1ec2b3c6bdd5dfde7ba7e3b879e0f8dd44181f16b895940be9b842fd2b6", - "sha256:34d5c49f18778a3665d707e6286545a30339ad545950773d43977e504815fa70", - "sha256:35e72518615aa5384ef4fae828e3af1b43102458b74a8c481f69af8abf7e802a", - "sha256:3eb14ba1a9d07c88669b7faf8f589be67871d6409305e73e036321d89f1d904e", - "sha256:412c6c126369ddae171c13987b38df5122cb92015cba6f9ee1193b867f3f1530", - "sha256:4600c7a659d381146e1160235918826c50c80994e07c5b26946a3e7ec6c99249", - "sha256:463ecfb907b256e94bfe7bcb31a6d8c7bc96eca7cbe39803e448a58bb9fcad02", - "sha256:4a06e6c8e31c98ddc770734c63903e39f1947c9e3e5e4bef515c5491b7737dde", - "sha256:4b2de1523d46e7016afc7e42db239bd41f2163316935de7c84d0e19af7e69538", - "sha256:4dabd775fd66cf17f31f8625fc0e4cfc5765f7982f94dc09b9e5868182cb71c0", - "sha256:4eff9c270afd23e2746e921e80182872058a7a592017b2713f33f96cc5f82e32", - "sha256:52607d0ebea43cf214e2ee84a6a76bc774176f97c5a774ce33277514875a718e", - "sha256:533e0f66c32093a987a30df3ad6ed21170db9d581d0b38e71396c49718fbb1ca", - "sha256:5493a8120d6fc185f60e7254fc056a6742f1db68c0f849cfc9ab46163c21df47", - "sha256:5d2d1fe548def3267b4c70a8568f108d1fed7cbbeccb9cc166e05af2abc25c22", - "sha256:5dfbc543578058c340360f851ddcecd7a1e26b0d9b5b69259b526da9edfa8875", - "sha256:66a40003bc244e4ad86b72abb9965d304726d05a939e8c09ce844d27af9e6d37", - "sha256:67de057fbcb04a066171bd9ee6bcb58738d89378ee3cabff0bffbf343ae1c787", - "sha256:6827f8c1b2f13f1420545bd6d5b3f9e0b85fe750388425be53d23c760dcf176b", - "sha256:6b35e07f1d57b79b86a7de8ecdcefb78485dab9851b9638c2c793c50203b2ae8", - "sha256:7399d45b62d755e9ebba94eb89437f80512c08edde8c63716552a3aade61eb42", - "sha256:788b6ff6728072b313802be13e88113c33696a9a1f2f6d634a97c20f7ef5ccce", - "sha256:78f1b79132a69fe8bd6b5d91ef433c8eb40688ba782b26f8c9f3d2d9ca23626f", - "sha256:79f4f502125a41b1b3b34449e747a6abfd52a709d539ea7769101696bdca6716", - "sha256:7a8517b6d4005facdbd7eb4e8cf54797dbca100a7df459fdaff4c5123265c1cd", - "sha256:7bd5c5ee1448b6408734eaa29c0d820d061ae18cb17232ce37848376dcfa3e92", - "sha256:7f5243357e6da9a90c56282f64b50d29cba2ee1f745381174caacc50d501b109", - "sha256:805cb481474e111ee3687c9047c5f3286e62496f09c0e82e8853338aaaa348f8", - "sha256:871f55e478b5a648c08dd24af44345406d0e636ffe021d64c9b57a4a11518304", - "sha256:87a1ce1f5e5dc4b6f4e0aac34e7bb535cb23bd4f5d9c799ed1633b65c2bcad8c", - "sha256:8a10ca7f8a1ea0fd5630f02feb055b0f5cdfcd07bb3715fc1b6f8cb72bf114e4", - "sha256:995c2bacdddcb640c2ca558e6760383dcdd68830160af92b5c6e6928ffd259b4", - "sha256:9f03143f8f851dd8de6b0c10784363712058f38209e926723c80654c1b40327a", - "sha256:a1c6b0a5e3e326a466d809b651c63f278b1256146a377a528b6938a279da334f", - "sha256:a28f9c238f1e143ff42ab3ba27990dfb964e5d413c0eb001b88794c5c4a528a9", - "sha256:b2cf5b5ddb69142511d5559c427ff00ec8c0919a1e6c09486e9c32636ea2b9dd", - "sha256:b761a6847f96fdc2d002e29e9e9ac2439c13b919adfd64e8ef49e75f6355c548", - "sha256:bf555f3e25ac3a70c67807b2949bfe15f377a40df84b71ab2c58d8593a1e036e", - "sha256:c08a972cbac2a14810463aec3a47ff218bb00c1a607e6689b531a7c589c50723", - "sha256:c457a38351fb6234781d054260c60e531047e4d07beca1889b558ff73dc2014b", - "sha256:c4c433f78c2908ae352848f56589c02b982d0e741b7905228fad628999799de4", - "sha256:d9f119e7736967c0ea03aff91ac7d04555ee038caf89bb855d93bbd04ae85b41", - "sha256:e6b0a1c7ed54a5361aaebb910c1fa864bae34273662bb4ff788a527eafd6e14d", - "sha256:f2bcb085faffcacf9319b1b1445a7e1cfdc6fb46c03f2dce7bc2d9a4b3c1cdc5", - "sha256:fe193d3ae297c423e0e567e240b4324d6b6c280a048e64c77a3ea6886cc2aa87" - ], - "index": "pypi", - "markers": "python_version >= '3.7'", - "version": "==2.0.39" - }, - "typing-extensions": { - "hashes": [ - "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", - "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" - ], - "markers": "python_version >= '3.8'", - "version": "==4.12.2" - }, - "tzdata": { - "hashes": [ - "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", - "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9" - ], - "markers": "python_version >= '2'", - "version": "==2025.2" - }, - "urllib3": { - "hashes": [ - "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", - "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d" - ], - "markers": "python_version >= '3.9'", - "version": "==2.3.0" - } - }, - "develop": { - "alabaster": { - "hashes": [ - "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e", - "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b" - ], - "markers": "python_version >= '3.10'", - "version": "==1.0.0" - }, - "anyio": { - "hashes": [ - "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", - "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c" - ], - "markers": "python_version >= '3.9'", - "version": "==4.9.0" - }, - "appnope": { - "hashes": [ - "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", - "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c" - ], - "markers": "python_version >= '3.6'", - "version": "==0.1.4" - }, - "argon2-cffi": { - "hashes": [ - "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08", - "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea" - ], - "markers": "python_version >= '3.7'", - "version": "==23.1.0" - }, - "argon2-cffi-bindings": { - "hashes": [ - "sha256:20ef543a89dee4db46a1a6e206cd015360e5a75822f76df533845c3cbaf72670", - "sha256:2c3e3cc67fdb7d82c4718f19b4e7a87123caf8a93fde7e23cf66ac0337d3cb3f", - "sha256:3b9ef65804859d335dc6b31582cad2c5166f0c3e7975f324d9ffaa34ee7e6583", - "sha256:3e385d1c39c520c08b53d63300c3ecc28622f076f4c2b0e6d7e796e9f6502194", - "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c", - "sha256:5e00316dabdaea0b2dd82d141cc66889ced0cdcbfa599e8b471cf22c620c329a", - "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082", - "sha256:6a22ad9800121b71099d0fb0a65323810a15f2e292f2ba450810a7316e128ee5", - "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f", - "sha256:93f9bf70084f97245ba10ee36575f0c3f1e7d7724d67d8e5b08e61787c320ed7", - "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d", - "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f", - "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae", - "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3", - "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86", - "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367", - "sha256:d4966ef5848d820776f5f562a7d45fdd70c2f330c961d0d745b784034bd9f48d", - "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93", - "sha256:ed2937d286e2ad0cc79a7087d3c272832865f779430e0cc2b4f3718d3159b0cb", - "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e", - "sha256:f9f8b450ed0547e3d473fdc8612083fd08dd2120d6ac8f73828df9b7d45bb351" - ], - "markers": "python_version >= '3.6'", - "version": "==21.2.0" - }, - "arrow": { - "hashes": [ - "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80", - "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85" - ], - "markers": "python_version >= '3.8'", - "version": "==1.3.0" - }, - "asttokens": { - "hashes": [ - "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", - "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2" - ], - "markers": "python_version >= '3.8'", - "version": "==3.0.0" - }, - "async-lru": { - "hashes": [ - "sha256:481d52ccdd27275f42c43a928b4a50c3bfb2d67af4e78b170e3e0bb39c66e5bb", - "sha256:ab95404d8d2605310d345932697371a5f40def0487c03d6d0ad9138de52c9943" - ], - "markers": "python_version >= '3.9'", - "version": "==2.0.5" - }, - "attrs": { - "hashes": [ - "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", - "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b" - ], - "markers": "python_version >= '3.8'", - "version": "==25.3.0" - }, - "babel": { - "hashes": [ - "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", - "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2" - ], - "markers": "python_version >= '3.8'", - "version": "==2.17.0" - }, - "beautifulsoup4": { - "hashes": [ - "sha256:1bd32405dacc920b42b83ba01644747ed77456a65760e285fbc47633ceddaf8b", - "sha256:99045d7d3f08f91f0d656bc9b7efbae189426cd913d830294a15eefa0ea4df16" - ], - "index": "pypi", - "markers": "python_full_version >= '3.7.0'", - "version": "==4.13.3" - }, - "black": { - "hashes": [ - "sha256:030b9759066a4ee5e5aca28c3c77f9c64789cdd4de8ac1df642c40b708be6171", - "sha256:055e59b198df7ac0b7efca5ad7ff2516bca343276c466be72eb04a3bcc1f82d7", - "sha256:0e519ecf93120f34243e6b0054db49c00a35f84f195d5bce7e9f5cfc578fc2da", - "sha256:172b1dbff09f86ce6f4eb8edf9dede08b1fce58ba194c87d7a4f1a5aa2f5b3c2", - "sha256:1e2978f6df243b155ef5fa7e558a43037c3079093ed5d10fd84c43900f2d8ecc", - "sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666", - "sha256:3b48735872ec535027d979e8dcb20bf4f70b5ac75a8ea99f127c106a7d7aba9f", - "sha256:4b60580e829091e6f9238c848ea6750efed72140b91b048770b64e74fe04908b", - "sha256:759e7ec1e050a15f89b770cefbf91ebee8917aac5c20483bc2d80a6c3a04df32", - "sha256:8f0b18a02996a836cc9c9c78e5babec10930862827b1b724ddfe98ccf2f2fe4f", - "sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717", - "sha256:96c1c7cd856bba8e20094e36e0f948718dc688dba4a9d78c3adde52b9e6c2299", - "sha256:a1ee0a0c330f7b5130ce0caed9936a904793576ef4d2b98c40835d6a65afa6a0", - "sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18", - "sha256:a39337598244de4bae26475f77dda852ea00a93bd4c728e09eacd827ec929df0", - "sha256:afebb7098bfbc70037a053b91ae8437c3857482d3a690fefc03e9ff7aa9a5fd3", - "sha256:bacabb307dca5ebaf9c118d2d2f6903da0d62c9faa82bd21a33eecc319559355", - "sha256:bce2e264d59c91e52d8000d507eb20a9aca4a778731a08cfff7e5ac4a4bb7096", - "sha256:d9e6827d563a2c820772b32ce8a42828dc6790f095f441beef18f96aa6f8294e", - "sha256:db8ea9917d6f8fc62abd90d944920d95e73c83a5ee3383493e35d271aca872e9", - "sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba", - "sha256:f3df5f1bf91d36002b0a75389ca8663510cf0531cca8aa5c1ef695b46d98655f" - ], - "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==25.1.0" - }, - "bleach": { - "extras": [ - "css" - ], - "hashes": [ - "sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e", - "sha256:123e894118b8a599fd80d3ec1a6d4cc7ce4e5882b1317a7e1ba69b56e95f991f" - ], - "markers": "python_version >= '3.9'", - "version": "==6.2.0" - }, - "cachetools": { - "hashes": [ - "sha256:1a661caa9175d26759571b2e19580f9d6393969e5dfca11fdb1f947a23e640d4", - "sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a" - ], - "markers": "python_version >= '3.7'", - "version": "==5.5.2" - }, - "cartopy": { - "hashes": [ - "sha256:01c910d5634c69a7efdec46e0a17d473d2328767f001d4dc0b5c4b48e585c8bd", - "sha256:2f354a1d902a8d6ee33b099acc86ac2e1af528bbc0ea718b834111c97e604981", - "sha256:4a14638b63d7df2858f73e9f8f4f4826d7c9cf13781aa6824fa0134fbaebbd98", - "sha256:511f992340baea2c171cb17b3ef595537e5355640f3baa7ac895de25df016a70", - "sha256:54f4d23961e0f9436baaf4747928361ccdcc893fa9b7bad9f615551bc8aa3fe8", - "sha256:71d8a6d061d0764aba3baf357a68f3d73796a8a46d34b8c9fb241171b273c69e", - "sha256:a984e33977daed8f760c09c331c8368a6af060db1190af89d74a027c272e39c3", - "sha256:b17cf23dd74d0a922c2a5682dacef3c0bf89fa8c0bd0eae96b87fb684f966b15", - "sha256:b1bb2d02b31884ee1d4f14e5b436bbf95745eac39c6fc0d6c67c83bb907b55b3", - "sha256:ce0c83314570c61a695a1f7c3a4a22dc75f79d28f4c68b88a8aeaf13d6a2343c", - "sha256:d279968b845f72e3423e454b2b0b985fb2389e6ccd18fb73324abeca4e43f516", - "sha256:d74b4a3eae9e570f474276fb61847112cdccdead396ec2ddad226dad9eaf4564", - "sha256:dfa38fb216cfd16cc266fd6f86b60ebdf0056839b490f38d2d89229b03abc877", - "sha256:dfdde0a6e0e56c5fc46f4e7d332237eb31bbd9908417f0f190fda5d322754184", - "sha256:e0b55526b605a9dee4fa3d7e5659b6d7d9d30e609bc5e62487bc4f7d8e90873b", - "sha256:f0963b80a048252815c56fbd21bc4e5d163618a9eaa36c8898ce2c60b6c03979", - "sha256:f440ddb61171319adf34ecec4d91202864cd514a7bc8a252e0ff7788a6604031" - ], - "index": "pypi", - "markers": "python_version >= '3.10'", - "version": "==0.24.1" - }, - "certifi": { - "hashes": [ - "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", - "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe" - ], - "markers": "python_version >= '3.6'", - "version": "==2025.1.31" - }, - "cffi": { - "hashes": [ - "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", - "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", - "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1", - "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", - "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", - "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", - "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8", - "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36", - "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17", - "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", - "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc", - "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", - "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", - "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", - "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", - "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", - "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", - "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6", - "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", - "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b", - "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", - "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", - "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c", - "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", - "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", - "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", - "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8", - "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1", - "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", - "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", - "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", - "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595", - "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0", - "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", - "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", - "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", - "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", - "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", - "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", - "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16", - "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", - "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e", - "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", - "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964", - "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", - "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576", - "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", - "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3", - "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662", - "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", - "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", - "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", - "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", - "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", - "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", - "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", - "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", - "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9", - "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7", - "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", - "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a", - "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", - "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", - "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", - "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", - "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87", - "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b" - ], - "markers": "python_version >= '3.8'", - "version": "==1.17.1" - }, - "chardet": { - "hashes": [ - "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7", - "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970" - ], - "markers": "python_version >= '3.7'", - "version": "==5.2.0" - }, - "charset-normalizer": { - "hashes": [ - "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537", - "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa", - "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a", - "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294", - "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b", - "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", - "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", - "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", - "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4", - "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", - "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2", - "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", - "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", - "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", - "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", - "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", - "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", - "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496", - "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d", - "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", - "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e", - "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a", - "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4", - "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca", - "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78", - "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408", - "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5", - "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", - "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", - "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a", - "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765", - "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6", - "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", - "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", - "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", - "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd", - "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c", - "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", - "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", - "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176", - "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770", - "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824", - "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f", - "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf", - "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487", - "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d", - "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd", - "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", - "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534", - "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f", - "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", - "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", - "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd", - "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", - "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9", - "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de", - "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", - "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d", - "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", - "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f", - "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", - "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7", - "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a", - "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", - "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8", - "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41", - "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", - "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f", - "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", - "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", - "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", - "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", - "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", - "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247", - "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", - "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb", - "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", - "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e", - "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6", - "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037", - "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", - "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e", - "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807", - "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", - "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c", - "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", - "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", - "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089", - "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", - "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e", - "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", - "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616" - ], - "markers": "python_version >= '3.7'", - "version": "==3.4.1" - }, - "click": { - "hashes": [ - "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", - "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a" - ], - "markers": "python_version >= '3.7'", - "version": "==8.1.8" - }, - "colorama": { - "hashes": [ - "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", - "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", - "version": "==0.4.6" - }, - "comm": { - "hashes": [ - "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e", - "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3" - ], - "markers": "python_version >= '3.8'", - "version": "==0.2.2" - }, - "contourpy": { - "hashes": [ - "sha256:041b640d4ec01922083645a94bb3b2e777e6b626788f4095cf21abbe266413c1", - "sha256:05e806338bfeaa006acbdeba0ad681a10be63b26e1b17317bfac3c5d98f36cda", - "sha256:08d9d449a61cf53033612cb368f3a1b26cd7835d9b8cd326647efe43bca7568d", - "sha256:0ffa84be8e0bd33410b17189f7164c3589c229ce5db85798076a3fa136d0e509", - "sha256:113231fe3825ebf6f15eaa8bc1f5b0ddc19d42b733345eae0934cb291beb88b6", - "sha256:14c102b0eab282427b662cb590f2e9340a9d91a1c297f48729431f2dcd16e14f", - "sha256:174e758c66bbc1c8576992cec9599ce8b6672b741b5d336b5c74e35ac382b18e", - "sha256:19c1555a6801c2f084c7ddc1c6e11f02eb6a6016ca1318dd5452ba3f613a1751", - "sha256:19d40d37c1c3a4961b4619dd9d77b12124a453cc3d02bb31a07d58ef684d3d86", - "sha256:1bf98051f1045b15c87868dbaea84f92408337d4f81d0e449ee41920ea121d3b", - "sha256:20914c8c973f41456337652a6eeca26d2148aa96dd7ac323b74516988bea89fc", - "sha256:287ccc248c9e0d0566934e7d606201abd74761b5703d804ff3df8935f523d546", - "sha256:2ba94a401342fc0f8b948e57d977557fbf4d515f03c67682dd5c6191cb2d16ec", - "sha256:31c1b55c1f34f80557d3830d3dd93ba722ce7e33a0b472cba0ec3b6535684d8f", - "sha256:36987a15e8ace5f58d4d5da9dca82d498c2bbb28dff6e5d04fbfcc35a9cb3a82", - "sha256:3a04ecd68acbd77fa2d39723ceca4c3197cb2969633836ced1bea14e219d077c", - "sha256:3e8b974d8db2c5610fb4e76307e265de0edb655ae8169e8b21f41807ccbeec4b", - "sha256:3ea9924d28fc5586bf0b42d15f590b10c224117e74409dd7a0be3b62b74a501c", - "sha256:4318af1c925fb9a4fb190559ef3eec206845f63e80fb603d47f2d6d67683901c", - "sha256:44a29502ca9c7b5ba389e620d44f2fbe792b1fb5734e8b931ad307071ec58c53", - "sha256:47734d7073fb4590b4a40122b35917cd77be5722d80683b249dac1de266aac80", - "sha256:4d76d5993a34ef3df5181ba3c92fabb93f1eaa5729504fb03423fcd9f3177242", - "sha256:4dbbc03a40f916a8420e420d63e96a1258d3d1b58cbdfd8d1f07b49fcbd38e85", - "sha256:500360b77259914f7805af7462e41f9cb7ca92ad38e9f94d6c8641b089338124", - "sha256:523a8ee12edfa36f6d2a49407f705a6ef4c5098de4f498619787e272de93f2d5", - "sha256:573abb30e0e05bf31ed067d2f82500ecfdaec15627a59d63ea2d95714790f5c2", - "sha256:5b75aa69cb4d6f137b36f7eb2ace9280cfb60c55dc5f61c731fdf6f037f958a3", - "sha256:61332c87493b00091423e747ea78200659dc09bdf7fd69edd5e98cef5d3e9a8d", - "sha256:805617228ba7e2cbbfb6c503858e626ab528ac2a32a04a2fe88ffaf6b02c32bc", - "sha256:841ad858cff65c2c04bf93875e384ccb82b654574a6d7f30453a04f04af71342", - "sha256:89785bb2a1980c1bd87f0cb1517a71cde374776a5f150936b82580ae6ead44a1", - "sha256:8eb96e79b9f3dcadbad2a3891672f81cdcab7f95b27f28f1c67d75f045b6b4f1", - "sha256:974d8145f8ca354498005b5b981165b74a195abfae9a8129df3e56771961d595", - "sha256:9ddeb796389dadcd884c7eb07bd14ef12408aaae358f0e2ae24114d797eede30", - "sha256:a045f341a77b77e1c5de31e74e966537bba9f3c4099b35bf4c2e3939dd54cdab", - "sha256:a0cffcbede75c059f535725c1680dfb17b6ba8753f0c74b14e6a9c68c29d7ea3", - "sha256:a761d9ccfc5e2ecd1bf05534eda382aa14c3e4f9205ba5b1684ecfe400716ef2", - "sha256:a7895f46d47671fa7ceec40f31fae721da51ad34bdca0bee83e38870b1f47ffd", - "sha256:a9fa36448e6a3a1a9a2ba23c02012c43ed88905ec80163f2ffe2421c7192a5d7", - "sha256:ab29962927945d89d9b293eabd0d59aea28d887d4f3be6c22deaefbb938a7277", - "sha256:abbb49fb7dac584e5abc6636b7b2a7227111c4f771005853e7d25176daaf8453", - "sha256:ac4578ac281983f63b400f7fe6c101bedc10651650eef012be1ccffcbacf3697", - "sha256:adce39d67c0edf383647a3a007de0a45fd1b08dedaa5318404f1a73059c2512b", - "sha256:ade08d343436a94e633db932e7e8407fe7de8083967962b46bdfc1b0ced39454", - "sha256:b2bdca22a27e35f16794cf585832e542123296b4687f9fd96822db6bae17bfc9", - "sha256:b2f926efda994cdf3c8d3fdb40b9962f86edbc4457e739277b961eced3d0b4c1", - "sha256:b457d6430833cee8e4b8e9b6f07aa1c161e5e0d52e118dc102c8f9bd7dd060d6", - "sha256:c414fc1ed8ee1dbd5da626cf3710c6013d3d27456651d156711fa24f24bd1291", - "sha256:cb76c1a154b83991a3cbbf0dfeb26ec2833ad56f95540b442c73950af2013750", - "sha256:dfd97abd83335045a913e3bcc4a09c0ceadbe66580cf573fe961f4a825efa699", - "sha256:e914a8cb05ce5c809dd0fe350cfbb4e881bde5e2a38dc04e3afe1b3e58bd158e", - "sha256:ece6df05e2c41bd46776fbc712e0996f7c94e0d0543af1656956d150c4ca7c81", - "sha256:efa874e87e4a647fd2e4f514d5e91c7d493697127beb95e77d2f7561f6905bd9", - "sha256:f611e628ef06670df83fce17805c344710ca5cde01edfdc72751311da8585375" - ], - "markers": "python_version >= '3.10'", - "version": "==1.3.1" - }, - "coverage": { - "extras": [ - "toml" - ], - "hashes": [ - "sha256:02fad4f8faa4153db76f9246bc95c1d99f054f4e0a884175bff9155cf4f856cb", - "sha256:092b134129a8bb940c08b2d9ceb4459af5fb3faea77888af63182e17d89e1cf1", - "sha256:0ce92c5a9d7007d838456f4b77ea159cb628187a137e1895331e530973dcf862", - "sha256:0dab4ef76d7b14f432057fdb7a0477e8bffca0ad39ace308be6e74864e632271", - "sha256:1165490be0069e34e4f99d08e9c5209c463de11b471709dfae31e2a98cbd49fd", - "sha256:11dd6f52c2a7ce8bf0a5f3b6e4a8eb60e157ffedc3c4b4314a41c1dfbd26ce58", - "sha256:15d54ecef1582b1d3ec6049b20d3c1a07d5e7f85335d8a3b617c9960b4f807e0", - "sha256:171e9977c6a5d2b2be9efc7df1126fd525ce7cad0eb9904fe692da007ba90d81", - "sha256:177d837339883c541f8524683e227adcaea581eca6bb33823a2a1fdae4c988e1", - "sha256:18f544356bceef17cc55fcf859e5664f06946c1b68efcea6acdc50f8f6a6e776", - "sha256:199a1272e642266b90c9f40dec7fd3d307b51bf639fa0d15980dc0b3246c1393", - "sha256:1e6f867379fd033a0eeabb1be0cffa2bd660582b8b0c9478895c509d875a9d9e", - "sha256:2444fbe1ba1889e0b29eb4d11931afa88f92dc507b7248f45be372775b3cef4f", - "sha256:25fe40967717bad0ce628a0223f08a10d54c9d739e88c9cbb0f77b5959367542", - "sha256:264ff2bcce27a7f455b64ac0dfe097680b65d9a1a293ef902675fa8158d20b24", - "sha256:2a79c4a09765d18311c35975ad2eb1ac613c0401afdd9cb1ca4110aeb5dd3c4c", - "sha256:2c492401bdb3a85824669d6a03f57b3dfadef0941b8541f035f83bbfc39d4282", - "sha256:315ff74b585110ac3b7ab631e89e769d294f303c6d21302a816b3554ed4c81af", - "sha256:34a3bf6b92e6621fc4dcdaab353e173ccb0ca9e4bfbcf7e49a0134c86c9cd303", - "sha256:37351dc8123c154fa05b7579fdb126b9f8b1cf42fd6f79ddf19121b7bdd4aa04", - "sha256:385618003e3d608001676bb35dc67ae3ad44c75c0395d8de5780af7bb35be6b2", - "sha256:392cc8fd2b1b010ca36840735e2a526fcbd76795a5d44006065e79868cc76ccf", - "sha256:3d03287eb03186256999539d98818c425c33546ab4901028c8fa933b62c35c3a", - "sha256:44683f2556a56c9a6e673b583763096b8efbd2df022b02995609cf8e64fc8ae0", - "sha256:44af11c00fd3b19b8809487630f8a0039130d32363239dfd15238e6d37e41a48", - "sha256:452735fafe8ff5918236d5fe1feac322b359e57692269c75151f9b4ee4b7e1bc", - "sha256:4c181ceba2e6808ede1e964f7bdc77bd8c7eb62f202c63a48cc541e5ffffccb6", - "sha256:4dd532dac197d68c478480edde74fd4476c6823355987fd31d01ad9aa1e5fb59", - "sha256:520af84febb6bb54453e7fbb730afa58c7178fd018c398a8fcd8e269a79bf96d", - "sha256:553ba93f8e3c70e1b0031e4dfea36aba4e2b51fe5770db35e99af8dc5c5a9dfe", - "sha256:5b7b02e50d54be6114cc4f6a3222fec83164f7c42772ba03b520138859b5fde1", - "sha256:63306486fcb5a827449464f6211d2991f01dfa2965976018c9bab9d5e45a35c8", - "sha256:75c82b27c56478d5e1391f2e7b2e7f588d093157fa40d53fd9453a471b1191f2", - "sha256:7ba5ff236c87a7b7aa1441a216caf44baee14cbfbd2256d306f926d16b026578", - "sha256:7e688010581dbac9cab72800e9076e16f7cccd0d89af5785b70daa11174e94de", - "sha256:80b5b207a8b08c6a934b214e364cab2fa82663d4af18981a6c0a9e95f8df7602", - "sha256:822fa99dd1ac686061e1219b67868e25d9757989cf2259f735a4802497d6da31", - "sha256:881cae0f9cbd928c9c001487bb3dcbfd0b0af3ef53ae92180878591053be0cb3", - "sha256:88d96127ae01ff571d465d4b0be25c123789cef88ba0879194d673fdea52f54e", - "sha256:8b1c65a739447c5ddce5b96c0a388fd82e4bbdff7251396a70182b1d83631019", - "sha256:8fed429c26b99641dc1f3a79179860122b22745dd9af36f29b141e178925070a", - "sha256:9bb47cc9f07a59a451361a850cb06d20633e77a9118d05fd0f77b1864439461b", - "sha256:a6b6b3bd121ee2ec4bd35039319f3423d0be282b9752a5ae9f18724bc93ebe7c", - "sha256:ae13ed5bf5542d7d4a0a42ff5160e07e84adc44eda65ddaa635c484ff8e55917", - "sha256:af94fb80e4f159f4d93fb411800448ad87b6039b0500849a403b73a0d36bb5ae", - "sha256:b4c144c129343416a49378e05c9451c34aae5ccf00221e4fa4f487db0816ee2f", - "sha256:b52edb940d087e2a96e73c1523284a2e94a4e66fa2ea1e2e64dddc67173bad94", - "sha256:b559adc22486937786731dac69e57296cb9aede7e2687dfc0d2696dbd3b1eb6b", - "sha256:b838a91e84e1773c3436f6cc6996e000ed3ca5721799e7789be18830fad009a2", - "sha256:ba8480ebe401c2f094d10a8c4209b800a9b77215b6c796d16b6ecdf665048950", - "sha256:bc96441c9d9ca12a790b5ae17d2fa6654da4b3962ea15e0eabb1b1caed094777", - "sha256:c90e9141e9221dd6fbc16a2727a5703c19443a8d9bf7d634c792fa0287cee1ab", - "sha256:d2e73e2ac468536197e6b3ab79bc4a5c9da0f078cd78cfcc7fe27cf5d1195ef0", - "sha256:d3154b369141c3169b8133973ac00f63fcf8d6dbcc297d788d36afbb7811e511", - "sha256:d66ff48ab3bb6f762a153e29c0fc1eb5a62a260217bc64470d7ba602f5886d20", - "sha256:d6874929d624d3a670f676efafbbc747f519a6121b581dd41d012109e70a5ebd", - "sha256:e33426a5e1dc7743dd54dfd11d3a6c02c5d127abfaa2edd80a6e352b58347d1a", - "sha256:e52eb31ae3afacdacfe50705a15b75ded67935770c460d88c215a9c0c40d0e9c", - "sha256:eae79f8e3501133aa0e220bbc29573910d096795882a70e6f6e6637b09522133", - "sha256:eebd927b86761a7068a06d3699fd6c20129becf15bb44282db085921ea0f1585", - "sha256:eff187177d8016ff6addf789dcc421c3db0d014e4946c1cc3fbf697f7852459d", - "sha256:f5f99a93cecf799738e211f9746dc83749b5693538fbfac279a61682ba309387", - "sha256:fbba59022e7c20124d2f520842b75904c7b9f16c854233fa46575c69949fb5b9" - ], - "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==7.7.1" - }, - "cycler": { - "hashes": [ - "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", - "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c" - ], - "markers": "python_version >= '3.8'", - "version": "==0.12.1" - }, - "debugpy": { - "hashes": [ - "sha256:06859f68e817966723ffe046b896b1bd75c665996a77313370336ee9e1de3e90", - "sha256:2b8de94c5c78aa0d0ed79023eb27c7c56a64c68217d881bee2ffbcb13951d0c1", - "sha256:31abc9618be4edad0b3e3a85277bc9ab51a2d9f708ead0d99ffb5bb750e18503", - "sha256:32b6857f8263a969ce2ca098f228e5cc0604d277447ec05911a8c46cf3e7e307", - "sha256:3872ce5453b17837ef47fb9f3edc25085ff998ce63543f45ba7af41e7f7d370f", - "sha256:3dae443739c6b604802da9f3e09b0f45ddf1cf23c99161f3a1a8039f61a8bb89", - "sha256:46abe0b821cad751fc1fb9f860fb2e68d75e2c5d360986d0136cd1db8cad4428", - "sha256:4caca674206e97c85c034c1efab4483f33971d4e02e73081265ecb612af65377", - "sha256:5268ae7fdca75f526d04465931cb0bd24577477ff50e8bb03dab90983f4ebd02", - "sha256:62f9b4a861c256f37e163ada8cf5a81f4c8d5148fc17ee31fb46813bd658cdcc", - "sha256:63ca7670563c320503fea26ac688988d9d6b9c6a12abc8a8cf2e7dd8e5f6b6ea", - "sha256:6fab771639332bd8ceb769aacf454a30d14d7a964f2012bf9c4e04c60f16e85b", - "sha256:79ce4ed40966c4c1631d0131606b055a5a2f8e430e3f7bf8fd3744b09943e8e8", - "sha256:7d9a05efc6973b5aaf076d779cf3a6bbb1199e059a17738a2aa9d27a53bcc888", - "sha256:837e7bef95bdefba426ae38b9a94821ebdc5bea55627879cd48165c90b9e50ce", - "sha256:887d54276cefbe7290a754424b077e41efa405a3e07122d8897de54709dbe522", - "sha256:924464d87e7d905eb0d79fb70846558910e906d9ee309b60c4fe597a2e802590", - "sha256:a0bd87557f97bced5513a74088af0b84982b6ccb2e254b9312e29e8a5c4270eb", - "sha256:acf39a6e98630959763f9669feddee540745dfc45ad28dbc9bd1f9cd60639391", - "sha256:cb56c2db69fb8df3168bc857d7b7d2494fed295dfdbde9a45f27b4b152f37520", - "sha256:d4ba115cdd0e3a70942bd562adba9ec8c651fe69ddde2298a1be296fc331906f", - "sha256:dc7b77f5d32674686a5f06955e4b18c0e41fb5a605f5b33cf225790f114cfeec", - "sha256:ea869fe405880327497e6945c09365922c79d2a1eed4c3ae04d77ac7ae34b2b5", - "sha256:ed93c3155fc1f888ab2b43626182174e457fc31b7781cd1845629303790b8ad1", - "sha256:eee02b2ed52a563126c97bf04194af48f2fe1f68bb522a312b05935798e922ff", - "sha256:f14d2c4efa1809da125ca62df41050d9c7cd9cb9e380a2685d1e453c4d450ccb" - ], - "markers": "python_version >= '3.8'", - "version": "==1.8.13" - }, - "decorator": { - "hashes": [ - "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", - "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a" - ], - "markers": "python_version >= '3.8'", - "version": "==5.2.1" - }, - "defusedxml": { - "hashes": [ - "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", - "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==0.7.1" - }, - "distlib": { - "hashes": [ - "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87", - "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403" - ], - "version": "==0.3.9" - }, - "docutils": { - "hashes": [ - "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f", - "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2" - ], - "markers": "python_version >= '3.9'", - "version": "==0.21.2" - }, - "execnet": { - "hashes": [ - "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc", - "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3" - ], - "markers": "python_version >= '3.8'", - "version": "==2.1.1" - }, - "executing": { - "hashes": [ - "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa", - "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755" - ], - "markers": "python_version >= '3.8'", - "version": "==2.2.0" - }, - "fastjsonschema": { - "hashes": [ - "sha256:794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4", - "sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667" - ], - "version": "==2.21.1" - }, - "filelock": { - "hashes": [ - "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2", - "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de" - ], - "markers": "python_version >= '3.9'", - "version": "==3.18.0" - }, - "fonttools": { - "hashes": [ - "sha256:003548eadd674175510773f73fb2060bb46adb77c94854af3e0cc5bc70260049", - "sha256:0073b62c3438cf0058488c002ea90489e8801d3a7af5ce5f7c05c105bee815c3", - "sha256:1088182f68c303b50ca4dc0c82d42083d176cba37af1937e1a976a31149d4d14", - "sha256:133bedb9a5c6376ad43e6518b7e2cd2f866a05b1998f14842631d5feb36b5786", - "sha256:14a3e3e6b211660db54ca1ef7006401e4a694e53ffd4553ab9bc87ead01d0f05", - "sha256:17f39313b649037f6c800209984a11fc256a6137cbe5487091c6c7187cae4685", - "sha256:193b86e9f769320bc98ffdb42accafb5d0c8c49bd62884f1c0702bc598b3f0a2", - "sha256:2d351275f73ebdd81dd5b09a8b8dac7a30f29a279d41e1c1192aedf1b6dced40", - "sha256:300c310bb725b2bdb4f5fc7e148e190bd69f01925c7ab437b9c0ca3e1c7cd9ba", - "sha256:331954d002dbf5e704c7f3756028e21db07097c19722569983ba4d74df014000", - "sha256:38b947de71748bab150259ee05a775e8a0635891568e9fdb3cdd7d0e0004e62f", - "sha256:3cf4f8d2a30b454ac682e12c61831dcb174950c406011418e739de592bbf8f76", - "sha256:3fd3fccb7b9adaaecfa79ad51b759f2123e1aba97f857936ce044d4f029abd71", - "sha256:442ad4122468d0e47d83bc59d0e91b474593a8c813839e1872e47c7a0cb53b10", - "sha256:47b5e4680002ae1756d3ae3b6114e20aaee6cc5c69d1e5911f5ffffd3ee46c6b", - "sha256:53f5e9767978a4daf46f28e09dbeb7d010319924ae622f7b56174b777258e5ba", - "sha256:62b4c6802fa28e14dba010e75190e0e6228513573f1eeae57b11aa1a39b7e5b1", - "sha256:62cc1253827d1e500fde9dbe981219fea4eb000fd63402283472d38e7d8aa1c6", - "sha256:654ac4583e2d7c62aebc6fc6a4c6736f078f50300e18aa105d87ce8925cfac31", - "sha256:661a8995d11e6e4914a44ca7d52d1286e2d9b154f685a4d1f69add8418961563", - "sha256:6c1d38642ca2dddc7ae992ef5d026e5061a84f10ff2b906be5680ab089f55bb8", - "sha256:6e81c1cc80c1d8bf071356cc3e0e25071fbba1c75afc48d41b26048980b3c771", - "sha256:705837eae384fe21cee5e5746fd4f4b2f06f87544fa60f60740007e0aa600311", - "sha256:7ef04bc7827adb7532be3d14462390dd71287644516af3f1e67f1e6ff9c6d6df", - "sha256:86b2a1013ef7a64d2e94606632683f07712045ed86d937c11ef4dde97319c086", - "sha256:8d1613abd5af2f93c05867b3a3759a56e8bf97eb79b1da76b2bc10892f96ff16", - "sha256:965d0209e6dbdb9416100123b6709cb13f5232e2d52d17ed37f9df0cc31e2b35", - "sha256:96a4271f63a615bcb902b9f56de00ea225d6896052c49f20d0c91e9f43529a29", - "sha256:9d94449ad0a5f2a8bf5d2f8d71d65088aee48adbe45f3c5f8e00e3ad861ed81a", - "sha256:9da650cb29bc098b8cfd15ef09009c914b35c7986c8fa9f08b51108b7bc393b4", - "sha256:a05d1f07eb0a7d755fbe01fee1fd255c3a4d3730130cf1bfefb682d18fd2fcea", - "sha256:a114d1567e1a1586b7e9e7fc2ff686ca542a82769a296cef131e4c4af51e58f4", - "sha256:a1af375734018951c31c0737d04a9d5fd0a353a0253db5fbed2ccd44eac62d8c", - "sha256:b23d30a2c0b992fb1c4f8ac9bfde44b5586d23457759b6cf9a787f1a35179ee0", - "sha256:bc871904a53a9d4d908673c6faa15689874af1c7c5ac403a8e12d967ebd0c0dc", - "sha256:bce60f9a977c9d3d51de475af3f3581d9b36952e1f8fc19a1f2254f1dda7ce9c", - "sha256:bd9825822e7bb243f285013e653f6741954d8147427aaa0324a862cdbf4cbf62", - "sha256:ca7962e8e5fc047cc4e59389959843aafbf7445b6c08c20d883e60ced46370a5", - "sha256:d0cb73ccf7f6d7ca8d0bc7ea8ac0a5b84969a41c56ac3ac3422a24df2680546f", - "sha256:d54a45d30251f1d729e69e5b675f9a08b7da413391a1227781e2a297fa37f6d2", - "sha256:d6ca96d1b61a707ba01a43318c9c40aaf11a5a568d1e61146fafa6ab20890793", - "sha256:d6f195c14c01bd057bc9b4f70756b510e009c83c5ea67b25ced3e2c38e6ee6e9", - "sha256:e2cad98c94833465bcf28f51c248aaf07ca022efc6a3eba750ad9c1e0256d278", - "sha256:e2e993e8db36306cc3f1734edc8ea67906c55f98683d6fd34c3fc5593fdbba4c", - "sha256:e9270505a19361e81eecdbc2c251ad1e1a9a9c2ad75fa022ccdee533f55535dc", - "sha256:f20e2c0dfab82983a90f3d00703ac0960412036153e5023eed2b4641d7d5e692", - "sha256:f36a0868f47b7566237640c026c65a86d09a3d9ca5df1cd039e30a1da73098a0", - "sha256:f59746f7953f69cc3290ce2f971ab01056e55ddd0fb8b792c31a8acd7fee2d28", - "sha256:fa760e5fe8b50cbc2d71884a1eff2ed2b95a005f02dda2fa431560db0ddd927f", - "sha256:ffda9b8cd9cb8b301cae2602ec62375b59e2e2108a117746f12215145e3f786c" - ], - "markers": "python_version >= '3.8'", - "version": "==4.56.0" - }, - "fqdn": { - "hashes": [ - "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f", - "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", - "version": "==1.5.1" - }, - "h11": { - "hashes": [ - "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", - "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761" - ], - "markers": "python_version >= '3.7'", - "version": "==0.14.0" - }, - "httpcore": { - "hashes": [ - "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c", - "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd" - ], - "markers": "python_version >= '3.8'", - "version": "==1.0.7" - }, - "httpx": { - "hashes": [ - "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", - "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad" - ], - "markers": "python_version >= '3.8'", - "version": "==0.28.1" - }, - "id": { - "hashes": [ - "sha256:292cb8a49eacbbdbce97244f47a97b4c62540169c976552e497fd57df0734c1d", - "sha256:f1434e1cef91f2cbb8a4ec64663d5a23b9ed43ef44c4c957d02583d61714c658" - ], - "markers": "python_version >= '3.8'", - "version": "==1.5.0" - }, - "idna": { - "hashes": [ - "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", - "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3" - ], - "markers": "python_version >= '3.6'", - "version": "==3.10" - }, - "imagesize": { - "hashes": [ - "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", - "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.4.1" - }, - "iniconfig": { - "hashes": [ - "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", - "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760" - ], - "markers": "python_version >= '3.8'", - "version": "==2.1.0" - }, - "ipykernel": { - "hashes": [ - "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5", - "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215" - ], - "markers": "python_version >= '3.8'", - "version": "==6.29.5" - }, - "ipython": { - "hashes": [ - "sha256:143ef3ea6fb1e1bffb4c74b114051de653ffb7737a3f7ab1670e657ca6ae8c44", - "sha256:ec7b479e3e5656bf4f58c652c120494df1820f4f28f522fb7ca09e213c2aab52" - ], - "markers": "python_version >= '3.11'", - "version": "==9.0.2" - }, - "ipython-pygments-lexers": { - "hashes": [ - "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", - "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c" - ], - "markers": "python_version >= '3.8'", - "version": "==1.1.1" - }, - "isoduration": { - "hashes": [ - "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9", - "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042" - ], - "markers": "python_version >= '3.7'", - "version": "==20.11.0" - }, - "jaraco.classes": { - "hashes": [ - "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd", - "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790" - ], - "markers": "python_version >= '3.8'", - "version": "==3.4.0" - }, - "jaraco.context": { - "hashes": [ - "sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3", - "sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4" - ], - "markers": "python_version >= '3.8'", - "version": "==6.0.1" - }, - "jaraco.functools": { - "hashes": [ - "sha256:70f7e0e2ae076498e212562325e805204fc092d7b4c17e0e86c959e249701a9d", - "sha256:ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649" - ], - "markers": "python_version >= '3.8'", - "version": "==4.1.0" - }, - "jedi": { - "hashes": [ - "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", - "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9" - ], - "markers": "python_version >= '3.6'", - "version": "==0.19.2" - }, - "jinja2": { - "hashes": [ - "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", - "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67" - ], - "markers": "python_version >= '3.7'", - "version": "==3.1.6" - }, - "json5": { - "hashes": [ - "sha256:19b23410220a7271e8377f81ba8aacba2fdd56947fbb137ee5977cbe1f5e8dfa", - "sha256:e66941c8f0a02026943c52c2eb34ebeb2a6f819a0be05920a6f5243cd30fd559" - ], - "markers": "python_full_version >= '3.8.0'", - "version": "==0.10.0" - }, - "jsonpointer": { - "hashes": [ - "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942", - "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef" - ], - "markers": "python_version >= '3.7'", - "version": "==3.0.0" - }, - "jsonschema": { - "extras": [ - "format-nongpl" - ], - "hashes": [ - "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4", - "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566" - ], - "markers": "python_version >= '3.8'", - "version": "==4.23.0" - }, - "jsonschema-specifications": { - "hashes": [ - "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272", - "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf" - ], - "markers": "python_version >= '3.9'", - "version": "==2024.10.1" - }, - "jupyter-client": { - "hashes": [ - "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419", - "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f" - ], - "markers": "python_version >= '3.8'", - "version": "==8.6.3" - }, - "jupyter-core": { - "hashes": [ - "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409", - "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9" - ], - "markers": "python_version >= '3.8'", - "version": "==5.7.2" - }, - "jupyter-events": { - "hashes": [ - "sha256:6464b2fa5ad10451c3d35fabc75eab39556ae1e2853ad0c0cc31b656731a97fb", - "sha256:fc3fce98865f6784c9cd0a56a20644fc6098f21c8c33834a8d9fe383c17e554b" - ], - "markers": "python_version >= '3.9'", - "version": "==0.12.0" - }, - "jupyter-lsp": { - "hashes": [ - "sha256:45fbddbd505f3fbfb0b6cb2f1bc5e15e83ab7c79cd6e89416b248cb3c00c11da", - "sha256:793147a05ad446f809fd53ef1cd19a9f5256fd0a2d6b7ce943a982cb4f545001" - ], - "markers": "python_version >= '3.8'", - "version": "==2.2.5" - }, - "jupyter-server": { - "hashes": [ - "sha256:872d989becf83517012ee669f09604aa4a28097c0bd90b2f424310156c2cdae3", - "sha256:9d446b8697b4f7337a1b7cdcac40778babdd93ba614b6d68ab1c0c918f1c4084" - ], - "markers": "python_version >= '3.9'", - "version": "==2.15.0" - }, - "jupyter-server-terminals": { - "hashes": [ - "sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa", - "sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269" - ], - "markers": "python_version >= '3.8'", - "version": "==0.5.3" - }, - "jupyterlab": { - "hashes": [ - "sha256:2900ffdbfca9ed37c4ad7fdda3eb76582fd945d46962af3ac64741ae2d6b2ff4", - "sha256:fc9eb0455562a56a9bd6d2977cf090842f321fa1a298fcee9bf8c19de353d5fd" - ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==4.3.6" - }, - "jupyterlab-pygments": { - "hashes": [ - "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d", - "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780" - ], - "markers": "python_version >= '3.8'", - "version": "==0.3.0" - }, - "jupyterlab-server": { - "hashes": [ - "sha256:e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4", - "sha256:eb36caca59e74471988f0ae25c77945610b887f777255aa21f8065def9e51ed4" - ], - "markers": "python_version >= '3.8'", - "version": "==2.27.3" - }, - "keyring": { - "hashes": [ - "sha256:0b39998aa941431eb3d9b0d4b2460bc773b9df6fed7621c2dfb291a7e0187a66", - "sha256:552a3f7af126ece7ed5c89753650eec89c7eaae8617d0aa4d9ad2b75111266bd" - ], - "markers": "python_version >= '3.9'", - "version": "==25.6.0" - }, - "kiwisolver": { - "hashes": [ - "sha256:01c3d31902c7db5fb6182832713d3b4122ad9317c2c5877d0539227d96bb2e50", - "sha256:034d2c891f76bd3edbdb3ea11140d8510dca675443da7304205a2eaa45d8334c", - "sha256:085940635c62697391baafaaeabdf3dd7a6c3643577dde337f4d66eba021b2b8", - "sha256:08e77738ed7538f036cd1170cbed942ef749137b1311fa2bbe2a7fda2f6bf3cc", - "sha256:111793b232842991be367ed828076b03d96202c19221b5ebab421ce8bcad016f", - "sha256:11e1022b524bd48ae56c9b4f9296bce77e15a2e42a502cceba602f804b32bb79", - "sha256:151dffc4865e5fe6dafce5480fab84f950d14566c480c08a53c663a0020504b6", - "sha256:16523b40aab60426ffdebe33ac374457cf62863e330a90a0383639ce14bf44b2", - "sha256:1732e065704b47c9afca7ffa272f845300a4eb959276bf6970dc07265e73b605", - "sha256:1c8ceb754339793c24aee1c9fb2485b5b1f5bb1c2c214ff13368431e51fc9a09", - "sha256:23454ff084b07ac54ca8be535f4174170c1094a4cff78fbae4f73a4bcc0d4dab", - "sha256:23d5f023bdc8c7e54eb65f03ca5d5bb25b601eac4d7f1a042888a1f45237987e", - "sha256:257af1622860e51b1a9d0ce387bf5c2c4f36a90594cb9514f55b074bcc787cfc", - "sha256:286b18e86682fd2217a48fc6be6b0f20c1d0ed10958d8dc53453ad58d7be0bf8", - "sha256:291331973c64bb9cce50bbe871fb2e675c4331dab4f31abe89f175ad7679a4d7", - "sha256:2f0121b07b356a22fb0414cec4666bbe36fd6d0d759db3d37228f496ed67c880", - "sha256:3452046c37c7692bd52b0e752b87954ef86ee2224e624ef7ce6cb21e8c41cc1b", - "sha256:34d142fba9c464bc3bbfeff15c96eab0e7310343d6aefb62a79d51421fcc5f1b", - "sha256:369b75d40abedc1da2c1f4de13f3482cb99e3237b38726710f4a793432b1c5ff", - "sha256:36dbbfd34838500a31f52c9786990d00150860e46cd5041386f217101350f0d3", - "sha256:370fd2df41660ed4e26b8c9d6bbcad668fbe2560462cba151a721d49e5b6628c", - "sha256:3a96c0e790ee875d65e340ab383700e2b4891677b7fcd30a699146f9384a2bb0", - "sha256:3b9b4d2892fefc886f30301cdd80debd8bb01ecdf165a449eb6e78f79f0fabd6", - "sha256:3cd3bc628b25f74aedc6d374d5babf0166a92ff1317f46267f12d2ed54bc1d30", - "sha256:3ddc373e0eef45b59197de815b1b28ef89ae3955e7722cc9710fb91cd77b7f47", - "sha256:4191ee8dfd0be1c3666ccbac178c5a05d5f8d689bbe3fc92f3c4abec817f8fe0", - "sha256:54a62808ac74b5e55a04a408cda6156f986cefbcf0ada13572696b507cc92fa1", - "sha256:577facaa411c10421314598b50413aa1ebcf5126f704f1e5d72d7e4e9f020d90", - "sha256:641f2ddf9358c80faa22e22eb4c9f54bd3f0e442e038728f500e3b978d00aa7d", - "sha256:65ea09a5a3faadd59c2ce96dc7bf0f364986a315949dc6374f04396b0d60e09b", - "sha256:68269e60ee4929893aad82666821aaacbd455284124817af45c11e50a4b42e3c", - "sha256:69b5637c3f316cab1ec1c9a12b8c5f4750a4c4b71af9157645bf32830e39c03a", - "sha256:7506488470f41169b86d8c9aeff587293f530a23a23a49d6bc64dab66bedc71e", - "sha256:768cade2c2df13db52475bd28d3a3fac8c9eff04b0e9e2fda0f3760f20b3f7fc", - "sha256:77e6f57a20b9bd4e1e2cedda4d0b986ebd0216236f0106e55c28aea3d3d69b16", - "sha256:782bb86f245ec18009890e7cb8d13a5ef54dcf2ebe18ed65f795e635a96a1c6a", - "sha256:7a3ad337add5148cf51ce0b55642dc551c0b9d6248458a757f98796ca7348712", - "sha256:7cd2785b9391f2873ad46088ed7599a6a71e762e1ea33e87514b1a441ed1da1c", - "sha256:7e9a60b50fe8b2ec6f448fe8d81b07e40141bfced7f896309df271a0b92f80f3", - "sha256:84a2f830d42707de1d191b9490ac186bf7997a9495d4e9072210a1296345f7dc", - "sha256:856b269c4d28a5c0d5e6c1955ec36ebfd1651ac00e1ce0afa3e28da95293b561", - "sha256:858416b7fb777a53f0c59ca08190ce24e9abbd3cffa18886a5781b8e3e26f65d", - "sha256:87b287251ad6488e95b4f0b4a79a6d04d3ea35fde6340eb38fbd1ca9cd35bbbc", - "sha256:88c6f252f6816a73b1f8c904f7bbe02fd67c09a69f7cb8a0eecdbf5ce78e63db", - "sha256:893f5525bb92d3d735878ec00f781b2de998333659507d29ea4466208df37bed", - "sha256:89c107041f7b27844179ea9c85d6da275aa55ecf28413e87624d033cf1f6b751", - "sha256:918139571133f366e8362fa4a297aeba86c7816b7ecf0bc79168080e2bd79957", - "sha256:99cea8b9dd34ff80c521aef46a1dddb0dcc0283cf18bde6d756f1e6f31772165", - "sha256:a17b7c4f5b2c51bb68ed379defd608a03954a1845dfed7cc0117f1cc8a9b7fd2", - "sha256:a3c44cb68861de93f0c4a8175fbaa691f0aa22550c331fefef02b618a9dcb476", - "sha256:a4d3601908c560bdf880f07d94f31d734afd1bb71e96585cace0e38ef44c6d84", - "sha256:a5ce1e481a74b44dd5e92ff03ea0cb371ae7a0268318e202be06c8f04f4f1246", - "sha256:a66f60f8d0c87ab7f59b6fb80e642ebb29fec354a4dfad687ca4092ae69d04f4", - "sha256:b21dbe165081142b1232a240fc6383fd32cdd877ca6cc89eab93e5f5883e1c25", - "sha256:b47a465040146981dc9db8647981b8cb96366fbc8d452b031e4f8fdffec3f26d", - "sha256:b5773efa2be9eb9fcf5415ea3ab70fc785d598729fd6057bea38d539ead28271", - "sha256:b83dc6769ddbc57613280118fb4ce3cd08899cc3369f7d0e0fab518a7cf37fdb", - "sha256:bade438f86e21d91e0cf5dd7c0ed00cda0f77c8c1616bd83f9fc157fa6760d31", - "sha256:bcb1ebc3547619c3b58a39e2448af089ea2ef44b37988caf432447374941574e", - "sha256:be4816dc51c8a471749d664161b434912eee82f2ea66bd7628bd14583a833e85", - "sha256:c07b29089b7ba090b6f1a669f1411f27221c3662b3a1b7010e67b59bb5a6f10b", - "sha256:c2b9a96e0f326205af81a15718a9073328df1173a2619a68553decb7097fd5d7", - "sha256:c5020c83e8553f770cb3b5fc13faac40f17e0b205bd237aebd21d53d733adb03", - "sha256:c72941acb7b67138f35b879bbe85be0f6c6a70cab78fe3ef6db9c024d9223e5b", - "sha256:c8bf637892dc6e6aad2bc6d4d69d08764166e5e3f69d469e55427b6ac001b19d", - "sha256:cc978a80a0db3a66d25767b03688f1147a69e6237175c0f4ffffaaedf744055a", - "sha256:ce2cf1e5688edcb727fdf7cd1bbd0b6416758996826a8be1d958f91880d0809d", - "sha256:d47b28d1dfe0793d5e96bce90835e17edf9a499b53969b03c6c47ea5985844c3", - "sha256:d47cfb2650f0e103d4bf68b0b5804c68da97272c84bb12850d877a95c056bd67", - "sha256:d5536185fce131780ebd809f8e623bf4030ce1b161353166c49a3c74c287897f", - "sha256:d561d2d8883e0819445cfe58d7ddd673e4015c3c57261d7bdcd3710d0d14005c", - "sha256:d6af5e8815fd02997cb6ad9bbed0ee1e60014438ee1a5c2444c96f87b8843502", - "sha256:d6d6bd87df62c27d4185de7c511c6248040afae67028a8a22012b010bc7ad062", - "sha256:dace81d28c787956bfbfbbfd72fdcef014f37d9b48830829e488fdb32b49d954", - "sha256:e063ef9f89885a1d68dd8b2e18f5ead48653176d10a0e324e3b0030e3a69adeb", - "sha256:e7a019419b7b510f0f7c9dceff8c5eae2392037eae483a7f9162625233802b0a", - "sha256:eaa973f1e05131de5ff3569bbba7f5fd07ea0595d3870ed4a526d486fe57fa1b", - "sha256:eb158fe28ca0c29f2260cca8c43005329ad58452c36f0edf298204de32a9a3ed", - "sha256:ed33ca2002a779a2e20eeb06aea7721b6e47f2d4b8a8ece979d8ba9e2a167e34", - "sha256:fc2ace710ba7c1dfd1a3b42530b62b9ceed115f19a1656adefce7b1782a37794" - ], - "markers": "python_version >= '3.10'", - "version": "==1.4.8" - }, - "markdown-it-py": { - "hashes": [ - "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", - "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb" - ], - "markers": "python_version >= '3.8'", - "version": "==3.0.0" - }, - "markupsafe": { - "hashes": [ - "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", - "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", - "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0", - "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", - "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", - "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13", - "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", - "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", - "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", - "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", - "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0", - "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b", - "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579", - "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", - "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", - "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff", - "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", - "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", - "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", - "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb", - "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", - "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", - "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a", - "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", - "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a", - "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", - "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8", - "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", - "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", - "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144", - "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f", - "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", - "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", - "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", - "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", - "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158", - "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", - "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", - "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", - "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171", - "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", - "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", - "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", - "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d", - "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", - "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", - "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", - "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", - "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29", - "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", - "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", - "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c", - "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", - "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", - "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", - "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a", - "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178", - "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", - "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", - "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", - "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50" - ], - "markers": "python_version >= '3.9'", - "version": "==3.0.2" - }, - "matplotlib": { - "hashes": [ - "sha256:01e63101ebb3014e6e9f80d9cf9ee361a8599ddca2c3e166c563628b39305dbb", - "sha256:02582304e352f40520727984a5a18f37e8187861f954fea9be7ef06569cf85b4", - "sha256:057206ff2d6ab82ff3e94ebd94463d084760ca682ed5f150817b859372ec4401", - "sha256:0721a3fd3d5756ed593220a8b86808a36c5031fce489adb5b31ee6dbb47dd5b2", - "sha256:0f69dc9713e4ad2fb21a1c30e37bd445d496524257dfda40ff4a8efb3604ab5c", - "sha256:11b65088c6f3dae784bc72e8d039a2580186285f87448babb9ddb2ad0082993a", - "sha256:1985ad3d97f51307a2cbfc801a930f120def19ba22864182dacef55277102ba6", - "sha256:19b06241ad89c3ae9469e07d77efa87041eac65d78df4fcf9cac318028009b01", - "sha256:2589659ea30726284c6c91037216f64a506a9822f8e50592d48ac16a2f29e044", - "sha256:35e87384ee9e488d8dd5a2dd7baf471178d38b90618d8ea147aced4ab59c9bea", - "sha256:3f06bad951eea6422ac4e8bdebcf3a70c59ea0a03338c5d2b109f57b64eb3972", - "sha256:4c59af3e8aca75d7744b68e8e78a669e91ccbcf1ac35d0102a7b1b46883f1dd7", - "sha256:4f0647b17b667ae745c13721602b540f7aadb2a32c5b96e924cd4fea5dcb90f1", - "sha256:56c5d9fcd9879aa8040f196a235e2dcbdf7dd03ab5b07c0696f80bc6cf04bedd", - "sha256:5d45d3f5245be5b469843450617dcad9af75ca50568acf59997bed9311131a0b", - "sha256:648406f1899f9a818cef8c0231b44dcfc4ff36f167101c3fd1c9151f24220fdc", - "sha256:66e907a06e68cb6cfd652c193311d61a12b54f56809cafbed9736ce5ad92f107", - "sha256:7e496c01441be4c7d5f96d4e40f7fca06e20dcb40e44c8daa2e740e1757ad9e6", - "sha256:8e875b95ac59a7908978fe307ecdbdd9a26af7fa0f33f474a27fcf8c99f64a19", - "sha256:8e8e25b1209161d20dfe93037c8a7f7ca796ec9aa326e6e4588d8c4a5dd1e473", - "sha256:a144867dd6bf8ba8cb5fc81a158b645037e11b3e5cf8a50bd5f9917cb863adfe", - "sha256:a3dfb036f34873b46978f55e240cff7a239f6c4409eac62d8145bad3fc6ba5a3", - "sha256:a97ff127f295817bc34517255c9db6e71de8eddaab7f837b7d341dee9f2f587f", - "sha256:aa3854b5f9473564ef40a41bc922be978fab217776e9ae1545c9b3a5cf2092a3", - "sha256:bc411ebd5889a78dabbc457b3fa153203e22248bfa6eedc6797be5df0164dbf9", - "sha256:c42eee41e1b60fd83ee3292ed83a97a5f2a8239b10c26715d8a6172226988d7b", - "sha256:c96f2c2f825d1257e437a1482c5a2cf4fee15db4261bd6fc0750f81ba2b4ba3d", - "sha256:cfd414bce89cc78a7e1d25202e979b3f1af799e416010a20ab2b5ebb3a02425c", - "sha256:d0673b4b8f131890eb3a1ad058d6e065fb3c6e71f160089b65f8515373394698", - "sha256:d3809916157ba871bcdd33d3493acd7fe3037db5daa917ca6e77975a94cef779", - "sha256:dc6ab14a7ab3b4d813b88ba957fc05c79493a037f54e246162033591e770de6f", - "sha256:e8d2d0e3881b129268585bf4765ad3ee73a4591d77b9a18c214ac7e3a79fb2ba", - "sha256:e9b4bb156abb8fa5e5b2b460196f7db7264fc6d62678c03457979e7d5254b7be", - "sha256:ff2ae14910be903f4a24afdbb6d7d3a6c44da210fc7d42790b87aeac92238a16" - ], - "index": "pypi", - "markers": "python_version >= '3.10'", - "version": "==3.10.1" - }, - "matplotlib-inline": { - "hashes": [ - "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", - "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca" - ], - "markers": "python_version >= '3.8'", - "version": "==0.1.7" - }, - "mdurl": { - "hashes": [ - "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", - "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba" - ], - "markers": "python_version >= '3.7'", - "version": "==0.1.2" - }, - "mistune": { - "hashes": [ - "sha256:1a32314113cff28aa6432e99e522677c8587fd83e3d51c29b82a52409c842bd9", - "sha256:a7035c21782b2becb6be62f8f25d3df81ccb4d6fa477a6525b15af06539f02a0" - ], - "markers": "python_version >= '3.8'", - "version": "==3.1.3" - }, - "more-itertools": { - "hashes": [ - "sha256:2cd7fad1009c31cc9fb6a035108509e6547547a7a738374f10bd49a09eb3ee3b", - "sha256:6eb054cb4b6db1473f6e15fcc676a08e4732548acd47c708f0e179c2c7c01e89" - ], - "markers": "python_version >= '3.9'", - "version": "==10.6.0" - }, - "mypy-extensions": { - "hashes": [ - "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", - "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782" - ], - "markers": "python_version >= '3.5'", - "version": "==1.0.0" - }, - "nbclient": { - "hashes": [ - "sha256:4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d", - "sha256:90b7fc6b810630db87a6d0c2250b1f0ab4cf4d3c27a299b0cde78a4ed3fd9193" - ], - "markers": "python_full_version >= '3.9.0'", - "version": "==0.10.2" - }, - "nbconvert": { - "hashes": [ - "sha256:1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b", - "sha256:576a7e37c6480da7b8465eefa66c17844243816ce1ccc372633c6b71c3c0f582" - ], - "markers": "python_version >= '3.8'", - "version": "==7.16.6" - }, - "nbformat": { - "hashes": [ - "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a", - "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b" - ], - "markers": "python_version >= '3.8'", - "version": "==5.10.4" - }, - "nest-asyncio": { - "hashes": [ - "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", - "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c" - ], - "markers": "python_version >= '3.5'", - "version": "==1.6.0" - }, - "nh3": { - "hashes": [ - "sha256:087ffadfdcd497658c3adc797258ce0f06be8a537786a7217649fc1c0c60c293", - "sha256:20979783526641c81d2f5bfa6ca5ccca3d1e4472474b162c6256745fbfe31cd1", - "sha256:2a5174551f95f2836f2ad6a8074560f261cf9740a48437d6151fd2d4d7d617ab", - "sha256:31eedcd7d08b0eae28ba47f43fd33a653b4cdb271d64f1aeda47001618348fde", - "sha256:4990e7ee6a55490dbf00d61a6f476c9a3258e31e711e13713b2ea7d6616f670e", - "sha256:55823c5ea1f6b267a4fad5de39bc0524d49a47783e1fe094bcf9c537a37df251", - "sha256:6141caabe00bbddc869665b35fc56a478eb774a8c1dfd6fba9fe1dfdf29e6efa", - "sha256:637d4a10c834e1b7d9548592c7aad760611415fcd5bd346f77fd8a064309ae6d", - "sha256:63ca02ac6f27fc80f9894409eb61de2cb20ef0a23740c7e29f9ec827139fa578", - "sha256:6ae319f17cd8960d0612f0f0ddff5a90700fa71926ca800e9028e7851ce44a6f", - "sha256:6c9c30b8b0d291a7c5ab0967ab200598ba33208f754f2f4920e9343bdd88f79a", - "sha256:713d16686596e556b65e7f8c58328c2df63f1a7abe1277d87625dcbbc012ef82", - "sha256:818f2b6df3763e058efa9e69677b5a92f9bc0acff3295af5ed013da544250d5b", - "sha256:9d67709bc0d7d1f5797b21db26e7a8b3d15d21c9c5f58ccfe48b5328483b685b", - "sha256:a5f77e62aed5c4acad635239ac1290404c7e940c81abe561fd2af011ff59f585", - "sha256:a772dec5b7b7325780922dd904709f0f5f3a79fbf756de5291c01370f6df0967", - "sha256:a7ea28cd49293749d67e4fcf326c554c83ec912cd09cd94aa7ec3ab1921c8283", - "sha256:ac7006c3abd097790e611fe4646ecb19a8d7f2184b882f6093293b8d9b887431", - "sha256:b3b5c58161e08549904ac4abd450dacd94ff648916f7c376ae4b2c0652b98ff9", - "sha256:b8d55ea1fc7ae3633d758a92aafa3505cd3cc5a6e40470c9164d54dff6f96d42", - "sha256:bb0014948f04d7976aabae43fcd4cb7f551f9f8ce785a4c9ef66e6c2590f8629", - "sha256:d002b648592bf3033adfd875a48f09b8ecc000abd7f6a8769ed86b6ccc70c759", - "sha256:d426d7be1a2f3d896950fe263332ed1662f6c78525b4520c8e9861f8d7f0d243", - "sha256:fcff321bd60c6c5c9cb4ddf2554e22772bb41ebd93ad88171bbbb6f271255286" - ], - "markers": "python_version >= '3.8'", - "version": "==0.2.21" - }, - "notebook-shim": { - "hashes": [ - "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef", - "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb" - ], - "markers": "python_version >= '3.7'", - "version": "==0.2.4" - }, - "numpy": { - "hashes": [ - "sha256:05c076d531e9998e7e694c36e8b349969c56eadd2cdcd07242958489d79a7286", - "sha256:0d54974f9cf14acf49c60f0f7f4084b6579d24d439453d5fc5805d46a165b542", - "sha256:11c43995255eb4127115956495f43e9343736edb7fcdb0d973defd9de14cd84f", - "sha256:188dcbca89834cc2e14eb2f106c96d6d46f200fe0200310fc29089657379c58d", - "sha256:1974afec0b479e50438fc3648974268f972e2d908ddb6d7fb634598cdb8260a0", - "sha256:1cf4e5c6a278d620dee9ddeb487dc6a860f9b199eadeecc567f777daace1e9e7", - "sha256:207a2b8441cc8b6a2a78c9ddc64d00d20c303d79fba08c577752f080c4007ee3", - "sha256:218f061d2faa73621fa23d6359442b0fc658d5b9a70801373625d958259eaca3", - "sha256:2aad3c17ed2ff455b8eaafe06bcdae0062a1db77cb99f4b9cbb5f4ecb13c5146", - "sha256:2fa8fa7697ad1646b5c93de1719965844e004fcad23c91228aca1cf0800044a1", - "sha256:31504f970f563d99f71a3512d0c01a645b692b12a63630d6aafa0939e52361e6", - "sha256:3387dd7232804b341165cedcb90694565a6015433ee076c6754775e85d86f1fc", - "sha256:4ba5054787e89c59c593a4169830ab362ac2bee8a969249dc56e5d7d20ff8df9", - "sha256:4f92084defa704deadd4e0a5ab1dc52d8ac9e8a8ef617f3fbb853e79b0ea3592", - "sha256:65ef3468b53269eb5fdb3a5c09508c032b793da03251d5f8722b1194f1790c00", - "sha256:6f527d8fdb0286fd2fd97a2a96c6be17ba4232da346931d967a0630050dfd298", - "sha256:7051ee569db5fbac144335e0f3b9c2337e0c8d5c9fee015f259a5bd70772b7e8", - "sha256:7716e4a9b7af82c06a2543c53ca476fa0b57e4d760481273e09da04b74ee6ee2", - "sha256:79bd5f0a02aa16808fcbc79a9a376a147cc1045f7dfe44c6e7d53fa8b8a79392", - "sha256:7a4e84a6283b36632e2a5b56e121961f6542ab886bc9e12f8f9818b3c266bfbb", - "sha256:8120575cb4882318c791f839a4fd66161a6fa46f3f0a5e613071aae35b5dd8f8", - "sha256:81413336ef121a6ba746892fad881a83351ee3e1e4011f52e97fba79233611fd", - "sha256:8146f3550d627252269ac42ae660281d673eb6f8b32f113538e0cc2a9aed42b9", - "sha256:879cf3a9a2b53a4672a168c21375166171bc3932b7e21f622201811c43cdd3b0", - "sha256:892c10d6a73e0f14935c31229e03325a7b3093fafd6ce0af704be7f894d95687", - "sha256:92bda934a791c01d6d9d8e038363c50918ef7c40601552a58ac84c9613a665bc", - "sha256:9ba03692a45d3eef66559efe1d1096c4b9b75c0986b5dff5530c378fb8331d4f", - "sha256:9eeea959168ea555e556b8188da5fa7831e21d91ce031e95ce23747b7609f8a4", - "sha256:a0258ad1f44f138b791327961caedffbf9612bfa504ab9597157806faa95194a", - "sha256:a761ba0fa886a7bb33c6c8f6f20213735cb19642c580a931c625ee377ee8bd39", - "sha256:a7b9084668aa0f64e64bd00d27ba5146ef1c3a8835f3bd912e7a9e01326804c4", - "sha256:a84eda42bd12edc36eb5b53bbcc9b406820d3353f1994b6cfe453a33ff101775", - "sha256:ab2939cd5bec30a7430cbdb2287b63151b77cf9624de0532d629c9a1c59b1d5c", - "sha256:ac0280f1ba4a4bfff363a99a6aceed4f8e123f8a9b234c89140f5e894e452ecd", - "sha256:adf8c1d66f432ce577d0197dceaac2ac00c0759f573f28516246351c58a85020", - "sha256:b4adfbbc64014976d2f91084915ca4e626fbf2057fb81af209c1a6d776d23e3d", - "sha256:bb649f8b207ab07caebba230d851b579a3c8711a851d29efe15008e31bb4de24", - "sha256:bce43e386c16898b91e162e5baaad90c4b06f9dcbe36282490032cec98dc8ae7", - "sha256:bd3ad3b0a40e713fc68f99ecfd07124195333f1e689387c180813f0e94309d6f", - "sha256:c3f7ac96b16955634e223b579a3e5798df59007ca43e8d451a0e6a50f6bfdfba", - "sha256:cf28633d64294969c019c6df4ff37f5698e8326db68cc2b66576a51fad634880", - "sha256:d0f35b19894a9e08639fd60a1ec1978cb7f5f7f1eace62f38dd36be8aecdef4d", - "sha256:db1f1c22173ac1c58db249ae48aa7ead29f534b9a948bc56828337aa84a32ed6", - "sha256:dbe512c511956b893d2dacd007d955a3f03d555ae05cfa3ff1c1ff6df8851854", - "sha256:df2f57871a96bbc1b69733cd4c51dc33bea66146b8c63cacbfed73eec0883017", - "sha256:e2f085ce2e813a50dfd0e01fbfc0c12bbe5d2063d99f8b29da30e544fb6483b8", - "sha256:e642d86b8f956098b564a45e6f6ce68a22c2c97a04f5acd3f221f57b8cb850ae", - "sha256:e9e0a277bb2eb5d8a7407e14688b85fd8ad628ee4e0c7930415687b6564207a4", - "sha256:ea2bb7e2ae9e37d96835b3576a4fa4b3a97592fbea8ef7c3587078b0068b8f09", - "sha256:ee4d528022f4c5ff67332469e10efe06a267e32f4067dc76bb7e2cddf3cd25ff", - "sha256:f05d4198c1bacc9124018109c5fba2f3201dbe7ab6e92ff100494f236209c960", - "sha256:f34dc300df798742b3d06515aa2a0aee20941c13579d7a2f2e10af01ae4901ee", - "sha256:f4162988a360a29af158aeb4a2f4f09ffed6a969c9776f8f3bdee9b06a8ab7e5", - "sha256:f486038e44caa08dbd97275a9a35a283a8f1d2f0ee60ac260a1790e76660833c", - "sha256:f7de08cbe5551911886d1ab60de58448c6df0f67d9feb7d1fb21e9875ef95e91" - ], - "markers": "python_version >= '3.10'", - "version": "==2.2.4" - }, - "overrides": { - "hashes": [ - "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a", - "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49" - ], - "markers": "python_version >= '3.6'", - "version": "==7.7.0" - }, - "packaging": { - "hashes": [ - "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", - "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f" - ], - "markers": "python_version >= '3.8'", - "version": "==24.2" - }, - "pandocfilters": { - "hashes": [ - "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e", - "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.5.1" - }, - "parso": { - "hashes": [ - "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", - "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d" - ], - "markers": "python_version >= '3.6'", - "version": "==0.8.4" - }, - "pathspec": { - "hashes": [ - "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", - "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712" - ], - "markers": "python_version >= '3.8'", - "version": "==0.12.1" - }, - "pexpect": { - "hashes": [ - "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", - "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f" - ], - "markers": "sys_platform != 'win32' and sys_platform != 'emscripten'", - "version": "==4.9.0" - }, - "pillow": { - "hashes": [ - "sha256:015c6e863faa4779251436db398ae75051469f7c903b043a48f078e437656f83", - "sha256:0a2f91f8a8b367e7a57c6e91cd25af510168091fb89ec5146003e424e1558a96", - "sha256:11633d58b6ee5733bde153a8dafd25e505ea3d32e261accd388827ee987baf65", - "sha256:2062ffb1d36544d42fcaa277b069c88b01bb7298f4efa06731a7fd6cc290b81a", - "sha256:31eba6bbdd27dde97b0174ddf0297d7a9c3a507a8a1480e1e60ef914fe23d352", - "sha256:3362c6ca227e65c54bf71a5f88b3d4565ff1bcbc63ae72c34b07bbb1cc59a43f", - "sha256:368da70808b36d73b4b390a8ffac11069f8a5c85f29eff1f1b01bcf3ef5b2a20", - "sha256:36ba10b9cb413e7c7dfa3e189aba252deee0602c86c309799da5a74009ac7a1c", - "sha256:3764d53e09cdedd91bee65c2527815d315c6b90d7b8b79759cc48d7bf5d4f114", - "sha256:3a5fe20a7b66e8135d7fd617b13272626a28278d0e578c98720d9ba4b2439d49", - "sha256:3cdcdb0b896e981678eee140d882b70092dac83ac1cdf6b3a60e2216a73f2b91", - "sha256:4637b88343166249fe8aa94e7c4a62a180c4b3898283bb5d3d2fd5fe10d8e4e0", - "sha256:4db853948ce4e718f2fc775b75c37ba2efb6aaea41a1a5fc57f0af59eee774b2", - "sha256:4dd43a78897793f60766563969442020e90eb7847463eca901e41ba186a7d4a5", - "sha256:54251ef02a2309b5eec99d151ebf5c9904b77976c8abdcbce7891ed22df53884", - "sha256:54ce1c9a16a9561b6d6d8cb30089ab1e5eb66918cb47d457bd996ef34182922e", - "sha256:593c5fd6be85da83656b93ffcccc2312d2d149d251e98588b14fbc288fd8909c", - "sha256:5bb94705aea800051a743aa4874bb1397d4695fb0583ba5e425ee0328757f196", - "sha256:67cd427c68926108778a9005f2a04adbd5e67c442ed21d95389fe1d595458756", - "sha256:70ca5ef3b3b1c4a0812b5c63c57c23b63e53bc38e758b37a951e5bc466449861", - "sha256:73ddde795ee9b06257dac5ad42fcb07f3b9b813f8c1f7f870f402f4dc54b5269", - "sha256:758e9d4ef15d3560214cddbc97b8ef3ef86ce04d62ddac17ad39ba87e89bd3b1", - "sha256:7d33d2fae0e8b170b6a6c57400e077412240f6f5bb2a342cf1ee512a787942bb", - "sha256:7fdadc077553621911f27ce206ffcbec7d3f8d7b50e0da39f10997e8e2bb7f6a", - "sha256:8000376f139d4d38d6851eb149b321a52bb8893a88dae8ee7d95840431977081", - "sha256:837060a8599b8f5d402e97197d4924f05a2e0d68756998345c829c33186217b1", - "sha256:89dbdb3e6e9594d512780a5a1c42801879628b38e3efc7038094430844e271d8", - "sha256:8c730dc3a83e5ac137fbc92dfcfe1511ce3b2b5d7578315b63dbbb76f7f51d90", - "sha256:8e275ee4cb11c262bd108ab2081f750db2a1c0b8c12c1897f27b160c8bd57bbc", - "sha256:9044b5e4f7083f209c4e35aa5dd54b1dd5b112b108648f5c902ad586d4f945c5", - "sha256:93a18841d09bcdd774dcdc308e4537e1f867b3dec059c131fde0327899734aa1", - "sha256:9409c080586d1f683df3f184f20e36fb647f2e0bc3988094d4fd8c9f4eb1b3b3", - "sha256:96f82000e12f23e4f29346e42702b6ed9a2f2fea34a740dd5ffffcc8c539eb35", - "sha256:9aa9aeddeed452b2f616ff5507459e7bab436916ccb10961c4a382cd3e03f47f", - "sha256:9ee85f0696a17dd28fbcfceb59f9510aa71934b483d1f5601d1030c3c8304f3c", - "sha256:a07dba04c5e22824816b2615ad7a7484432d7f540e6fa86af60d2de57b0fcee2", - "sha256:a3cd561ded2cf2bbae44d4605837221b987c216cff94f49dfeed63488bb228d2", - "sha256:a697cd8ba0383bba3d2d3ada02b34ed268cb548b369943cd349007730c92bddf", - "sha256:a76da0a31da6fcae4210aa94fd779c65c75786bc9af06289cd1c184451ef7a65", - "sha256:a85b653980faad27e88b141348707ceeef8a1186f75ecc600c395dcac19f385b", - "sha256:a8d65b38173085f24bc07f8b6c505cbb7418009fa1a1fcb111b1f4961814a442", - "sha256:aa8dd43daa836b9a8128dbe7d923423e5ad86f50a7a14dc688194b7be5c0dea2", - "sha256:ab8a209b8485d3db694fa97a896d96dd6533d63c22829043fd9de627060beade", - "sha256:abc56501c3fd148d60659aae0af6ddc149660469082859fa7b066a298bde9482", - "sha256:ad5db5781c774ab9a9b2c4302bbf0c1014960a0a7be63278d13ae6fdf88126fe", - "sha256:ae98e14432d458fc3de11a77ccb3ae65ddce70f730e7c76140653048c71bfcbc", - "sha256:b20be51b37a75cc54c2c55def3fa2c65bb94ba859dde241cd0a4fd302de5ae0a", - "sha256:b523466b1a31d0dcef7c5be1f20b942919b62fd6e9a9be199d035509cbefc0ec", - "sha256:b5d658fbd9f0d6eea113aea286b21d3cd4d3fd978157cbf2447a6035916506d3", - "sha256:b6123aa4a59d75f06e9dd3dac5bf8bc9aa383121bb3dd9a7a612e05eabc9961a", - "sha256:bd165131fd51697e22421d0e467997ad31621b74bfc0b75956608cb2906dda07", - "sha256:bf902d7413c82a1bfa08b06a070876132a5ae6b2388e2712aab3a7cbc02205c6", - "sha256:c12fc111ef090845de2bb15009372175d76ac99969bdf31e2ce9b42e4b8cd88f", - "sha256:c1eec9d950b6fe688edee07138993e54ee4ae634c51443cfb7c1e7613322718e", - "sha256:c640e5a06869c75994624551f45e5506e4256562ead981cce820d5ab39ae2192", - "sha256:cc1331b6d5a6e144aeb5e626f4375f5b7ae9934ba620c0ac6b3e43d5e683a0f0", - "sha256:cfd5cd998c2e36a862d0e27b2df63237e67273f2fc78f47445b14e73a810e7e6", - "sha256:d3d8da4a631471dfaf94c10c85f5277b1f8e42ac42bade1ac67da4b4a7359b73", - "sha256:d44ff19eea13ae4acdaaab0179fa68c0c6f2f45d66a4d8ec1eda7d6cecbcc15f", - "sha256:dd0052e9db3474df30433f83a71b9b23bd9e4ef1de13d92df21a52c0303b8ab6", - "sha256:dd0e081319328928531df7a0e63621caf67652c8464303fd102141b785ef9547", - "sha256:dda60aa465b861324e65a78c9f5cf0f4bc713e4309f83bc387be158b077963d9", - "sha256:e06695e0326d05b06833b40b7ef477e475d0b1ba3a6d27da1bb48c23209bf457", - "sha256:e1abe69aca89514737465752b4bcaf8016de61b3be1397a8fc260ba33321b3a8", - "sha256:e267b0ed063341f3e60acd25c05200df4193e15a4a5807075cd71225a2386e26", - "sha256:e5449ca63da169a2e6068dd0e2fcc8d91f9558aba89ff6d02121ca8ab11e79e5", - "sha256:e63e4e5081de46517099dc30abe418122f54531a6ae2ebc8680bcd7096860eab", - "sha256:f189805c8be5ca5add39e6f899e6ce2ed824e65fb45f3c28cb2841911da19070", - "sha256:f7955ecf5609dee9442cbface754f2c6e541d9e6eda87fad7f7a989b0bdb9d71", - "sha256:f86d3a7a9af5d826744fabf4afd15b9dfef44fe69a98541f666f66fbb8d3fef9", - "sha256:fbd43429d0d7ed6533b25fc993861b8fd512c42d04514a0dd6337fb3ccf22761" - ], - "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==11.1.0" - }, - "platformdirs": { - "hashes": [ - "sha256:a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94", - "sha256:eb437d586b6a0986388f0d6f74aa0cde27b48d0e3d66843640bfb6bdcdb6e351" - ], - "markers": "python_version >= '3.9'", - "version": "==4.3.7" - }, - "pluggy": { - "hashes": [ - "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", - "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669" - ], - "markers": "python_version >= '3.8'", - "version": "==1.5.0" - }, - "prometheus-client": { - "hashes": [ - "sha256:252505a722ac04b0456be05c05f75f45d760c2911ffc45f2a06bcaed9f3ae3fb", - "sha256:594b45c410d6f4f8888940fe80b5cc2521b305a1fafe1c58609ef715a001f301" - ], - "markers": "python_version >= '3.8'", - "version": "==0.21.1" - }, - "prompt-toolkit": { - "hashes": [ - "sha256:544748f3860a2623ca5cd6d2795e7a14f3d0e1c3c9728359013f79877fc89bab", - "sha256:9b6427eb19e479d98acff65196a307c555eb567989e6d88ebbb1b509d9779198" - ], - "markers": "python_full_version >= '3.8.0'", - "version": "==3.0.50" - }, - "psutil": { - "hashes": [ - "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25", - "sha256:1e744154a6580bc968a0195fd25e80432d3afec619daf145b9e5ba16cc1d688e", - "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91", - "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da", - "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34", - "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553", - "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456", - "sha256:84df4eb63e16849689f76b1ffcb36db7b8de703d1bc1fe41773db487621b6c17", - "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993", - "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99" - ], - "markers": "python_version >= '3.6'", - "version": "==7.0.0" - }, - "ptyprocess": { - "hashes": [ - "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", - "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220" - ], - "markers": "os_name != 'nt'", - "version": "==0.7.0" - }, - "pure-eval": { - "hashes": [ - "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", - "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42" - ], - "version": "==0.2.3" - }, - "pycparser": { - "hashes": [ - "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", - "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc" - ], - "markers": "python_version >= '3.8'", - "version": "==2.22" - }, - "pyenchant": { - "hashes": [ - "sha256:1cf830c6614362a78aab78d50eaf7c6c93831369c52e1bb64ffae1df0341e637", - "sha256:5a636832987eaf26efe971968f4d1b78e81f62bca2bde0a9da210c7de43c3bce", - "sha256:5facc821ece957208a81423af7d6ec7810dad29697cb0d77aae81e4e11c8e5a6", - "sha256:6153f521852e23a5add923dbacfbf4bebbb8d70c4e4bad609a8e0f9faeb915d1" - ], - "markers": "python_version >= '3.5'", - "version": "==3.2.2" - }, - "pygments": { - "hashes": [ - "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", - "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c" - ], - "markers": "python_version >= '3.8'", - "version": "==2.19.1" - }, - "pyparsing": { - "hashes": [ - "sha256:2a857aee851f113c2de9d4bfd9061baea478cb0f1c7ca6cbf594942d6d111575", - "sha256:6ab05e1cb111cc72acc8ed811a3ca4c2be2af8d7b6df324347f04fd057d8d793" - ], - "markers": "python_version >= '3.9'", - "version": "==3.2.2" - }, - "pyproj": { - "hashes": [ - "sha256:04abc517a8555d1b05fcee768db3280143fe42ec39fdd926a2feef31631a1f2f", - "sha256:0829865c1d3a3543f918b3919dc601eea572d6091c0dd175e1a054db9c109274", - "sha256:084c0a475688f934d386c2ab3b6ce03398a473cd48adfda70d9ab8f87f2394a0", - "sha256:0b853ae99bda66cbe24b4ccfe26d70601d84375940a47f553413d9df570065e0", - "sha256:1e47c4e93b88d99dd118875ee3ca0171932444cdc0b52d493371b5d98d0f30ee", - "sha256:263b54ba5004b6b957d55757d846fc5081bc02980caa0279c4fc95fa0fff6067", - "sha256:2781029d90df7f8d431e29562a3f2d8eafdf233c4010d6fc0381858dc7373217", - "sha256:3537668992a709a2e7f068069192138618c00d0ba113572fdd5ee5ffde8222f3", - "sha256:3c2e7449840a44ce860d8bea2c6c1c4bc63fa07cba801dcce581d14dcb031a02", - "sha256:3e8d276caeae34fcbe4813855d0d97b9b825bab8d7a8b86d859c24a6213a5a0d", - "sha256:5ad0ff443a785d84e2b380869fdd82e6bfc11eba6057d25b4409a9bbfa867970", - "sha256:5f0da2711364d7cb9f115b52289d4a9b61e8bca0da57f44a3a9d6fc9bdeb7274", - "sha256:5f8d02ef4431dee414d1753d13fa82a21a2f61494737b5f642ea668d76164d6d", - "sha256:60d72facd7b6b79853f19744779abcd3f804c4e0d4fa8815469db20c9f640a47", - "sha256:6181960b4b812e82e588407fe5c9c68ada267c3b084db078f248db5d7f45d18a", - "sha256:6575b2e53cc9e3e461ad6f0692a5564b96e7782c28631c7771c668770915e169", - "sha256:83db380c52087f9e9bdd8a527943b2e7324f275881125e39475c4f9277bdeec4", - "sha256:87229e42b75e89f4dad6459200f92988c5998dfb093c7c631fb48524c86cd5dc", - "sha256:8c5dcf24ede53d8abab7d8a77f69ff1936c6a8843ef4fcc574646e4be66e5739", - "sha256:8cb516ee35ed57789b46b96080edf4e503fdb62dbb2e3c6581e0d6c83fca014b", - "sha256:a20727a23b1e49c7dc7fe3c3df8e56a8a7acdade80ac2f5cca29d7ca5564c145", - "sha256:a8b15b0463d1303bab113d1a6af2860a0d79013c3a66fcc5475ce26ef717fd4f", - "sha256:a94e26c1a4950cea40116775588a2ca7cf56f1f434ff54ee35a84718f3841a3d", - "sha256:aee664a9d806612af30a19dba49e55a7a78ebfec3e9d198f6a6176e1d140ec98", - "sha256:b35ed213892e211a3ce2bea002aa1183e1a2a9b79e51bb3c6b15549a831ae528", - "sha256:bf09dbeb333c34e9c546364e7df1ff40474f9fddf9e70657ecb0e4f670ff0b0e", - "sha256:bf84d766646f1ebd706d883755df4370aaf02b48187cedaa7e4239f16bc8213d", - "sha256:d3caac7473be22b6d6e102dde6c46de73b96bc98334e577dfaee9886f102ea2e", - "sha256:d61bf8ab04c73c1da08eedaf21a103b72fa5b0a9b854762905f65ff8b375d394", - "sha256:d666c3a3faaf3b1d7fc4a544059c4eab9d06f84a604b070b7aa2f318e227798e", - "sha256:f173f851ee75e54acdaa053382b6825b400cb2085663a9bb073728a59c60aebb", - "sha256:f550281ed6e5ea88fcf04a7c6154e246d5714be495c50c9e8e6b12d3fb63e158", - "sha256:f6d6a2ccd5607cd15ef990c51e6f2dd27ec0a741e72069c387088bba3aab60fa" - ], - "index": "pypi", - "markers": "python_version >= '3.10'", - "version": "==3.7.1" - }, - "pyproject-api": { - "hashes": [ - "sha256:326df9d68dea22d9d98b5243c46e3ca3161b07a1b9b18e213d1e24fd0e605766", - "sha256:7e8a9854b2dfb49454fae421cb86af43efbb2b2454e5646ffb7623540321ae6e" - ], - "markers": "python_version >= '3.9'", - "version": "==1.9.0" - }, - "pyshp": { - "hashes": [ - "sha256:4caec82fd8dd096feba8217858068bacb2a3b5950f43c048c6dc32a3489d5af1", - "sha256:67024c0ccdc352ba5db777c4e968483782dfa78f8e200672a90d2d30fd8b7b49" - ], - "markers": "python_version >= '2.7'", - "version": "==2.3.1" - }, - "pytest": { - "hashes": [ - "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", - "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845" - ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==8.3.5" - }, - "pytest-cov": { - "hashes": [ - "sha256:eee6f1b9e61008bd34975a4d5bab25801eb31898b032dd55addc93e96fcaaa35", - "sha256:fde0b595ca248bb8e2d76f020b465f3b107c9632e6a1d1705f17834c89dcadc0" - ], - "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==6.0.0" - }, - "pytest-xdist": { - "hashes": [ - "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7", - "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d" - ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==3.6.1" - }, - "python-dateutil": { - "hashes": [ - "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", - "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", - "version": "==2.9.0.post0" - }, - "python-json-logger": { - "hashes": [ - "sha256:12b7e74b17775e7d565129296105bbe3910842d9d0eb083fc83a6a617aa8df84", - "sha256:dd980fae8cffb24c13caf6e158d3d61c0d6d22342f932cb6e9deedab3d35eec7" - ], - "markers": "python_version >= '3.8'", - "version": "==3.3.0" - }, - "pyyaml": { - "hashes": [ - "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff", - "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", - "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", - "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e", - "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", - "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", - "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", - "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", - "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", - "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", - "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a", - "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", - "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", - "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8", - "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", - "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19", - "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", - "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a", - "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", - "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", - "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", - "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631", - "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d", - "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", - "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", - "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", - "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", - "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", - "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", - "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706", - "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", - "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", - "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", - "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083", - "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", - "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", - "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", - "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f", - "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725", - "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", - "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", - "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", - "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", - "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", - "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5", - "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d", - "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290", - "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", - "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", - "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", - "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", - "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12", - "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4" - ], - "markers": "python_version >= '3.8'", - "version": "==6.0.2" - }, - "pyzmq": { - "hashes": [ - "sha256:009a38241c76184cb004c869e82a99f0aee32eda412c1eb44df5820324a01d25", - "sha256:016d89bee8c7d566fad75516b4e53ec7c81018c062d4c51cd061badf9539be52", - "sha256:0240289e33e3fbae44a5db73e54e955399179332a6b1d47c764a4983ec1524c3", - "sha256:03caa2ffd64252122139d50ec92987f89616b9b92c9ba72920b40e92709d5e26", - "sha256:04bfe59852d76d56736bfd10ac1d49d421ab8ed11030b4a0332900691507f557", - "sha256:0b42403ad7d1194dca9574cd3c56691c345f4601fa2d0a33434f35142baec7ac", - "sha256:0f3dfb68cf7bf4cfdf34283a75848e077c5defa4907506327282afe92780084d", - "sha256:14e0b81753424bd374075df6cc30b87f2c99e5f022501d97eff66544ca578941", - "sha256:1586944f4736515af5c6d3a5b150c7e8ca2a2d6e46b23057320584d6f2438f4a", - "sha256:1595533de3a80bf8363372c20bafa963ec4bf9f2b8f539b1d9a5017f430b84c9", - "sha256:1614fcd116275d24f2346ffca4047a741c546ad9d561cbf7813f11226ca4ed2c", - "sha256:18183cc3851b995fdc7e5f03d03b8a4e1b12b0f79dff1ec1da75069af6357a05", - "sha256:1fc81d5d60c9d40e692de14b8d884d43cf67562402b931681f0ccb3ce6b19875", - "sha256:1fe05bd0d633a0f672bb28cb8b4743358d196792e1caf04973b7898a0d70b046", - "sha256:209d09f0ab6ddbcebe64630d1e6ca940687e736f443c265ae15bc4bfad833597", - "sha256:21399b31753bf321043ea60c360ed5052cc7be20739785b1dff1820f819e35b3", - "sha256:214038aaa88e801e54c2ef0cfdb2e6df27eb05f67b477380a452b595c5ecfa37", - "sha256:21c6ddb98557a77cfe3366af0c5600fb222a1b2de5f90d9cd052b324e0c295e8", - "sha256:240b1634b9e530ef6a277d95cbca1a6922f44dfddc5f0a3cd6c722a8de867f14", - "sha256:2833602d9d42c94b9d0d2a44d2b382d3d3a4485be018ba19dddc401a464c617a", - "sha256:2aa1a9f236d5b835fb8642f27de95f9edcfd276c4bc1b6ffc84f27c6fb2e2981", - "sha256:2cf9ab0dff4dbaa2e893eb608373c97eb908e53b7d9793ad00ccbd082c0ee12f", - "sha256:2d3459b6311463c96abcb97808ee0a1abb0d932833edb6aa81c30d622fd4a12d", - "sha256:2dc46ec09f5d36f606ac8393303149e69d17121beee13c8dac25e2a2078e31c4", - "sha256:2eaed0d911fb3280981d5495978152fab6afd9fe217fd16f411523665089cef1", - "sha256:356ec0e39c5a9cda872b65aca1fd8a5d296ffdadf8e2442b70ff32e73ef597b1", - "sha256:3ec332675f6a138db57aad93ae6387953763f85419bdbd18e914cb279ee1c451", - "sha256:3fc9e71490d989144981ea21ef4fdfaa7b6aa84aff9632d91c736441ce2f6b00", - "sha256:49334faa749d55b77f084389a80654bf2e68ab5191c0235066f0140c1b670d64", - "sha256:4b127cfe10b4c56e4285b69fd4b38ea1d368099ea4273d8fb349163fce3cd598", - "sha256:4c22a12713707467abedc6d75529dd365180c4c2a1511268972c6e1d472bd63e", - "sha256:4e2cafe7e9c7fed690e8ecf65af119f9c482923b5075a78f6f7629c63e1b4b1d", - "sha256:52b064fafef772d0f5dbf52d4c39f092be7bc62d9a602fe6e82082e001326de3", - "sha256:5e17cc198dc50a25a0f245e6b1e56f692df2acec3ccae82d1f60c34bfb72bbec", - "sha256:6d64e74143587efe7c9522bb74d1448128fdf9897cc9b6d8b9927490922fd558", - "sha256:6e317ee1d4528a03506cb1c282cd9db73660a35b3564096de37de7350e7d87a7", - "sha256:6fb539a6382a048308b409d8c66d79bf636eda1b24f70c78f2a1fd16e92b037b", - "sha256:70b3acb9ad729a53d4e751dace35404a024f188aad406013454216aba5485b4e", - "sha256:73ca9ae9a9011b714cf7650450cd9c8b61a135180b708904f1f0a05004543dce", - "sha256:749d671b0eec8e738bbf0b361168369d8c682b94fcd458c20741dc4d69ef5278", - "sha256:7897b8c8bbbb2bd8cad887bffcb07aede71ef1e45383bd4d6ac049bf0af312a4", - "sha256:7998b60ef1c105846fb3bfca494769fde3bba6160902e7cd27a8df8257890ee9", - "sha256:7a4ac2ffa34f1212dd586af90f4ba894e424f0cabb3a49cdcff944925640f6ac", - "sha256:8ab78dc21c7b1e13053086bcf0b4246440b43b5409904b73bfd1156654ece8a1", - "sha256:8c088e009a6d6b9f563336adb906e3a8d3fd64db129acc8d8fd0e9fe22b2dac8", - "sha256:9176856f36c34a8aa5c0b35ddf52a5d5cd8abeece57c2cd904cfddae3fd9acd3", - "sha256:91dead2daca698ae52ce70ee2adbb94ddd9b5f96877565fd40aa4efd18ecc6a3", - "sha256:92a30840f4f2a31f7049d0a7de5fc69dd03b19bd5d8e7fed8d0bde49ce49b589", - "sha256:943a22ebb3daacb45f76a9bcca9a7b74e7d94608c0c0505da30af900b998ca8d", - "sha256:952085a09ff32115794629ba47f8940896d7842afdef1283332109d38222479d", - "sha256:96c0006a8d1d00e46cb44c8e8d7316d4a232f3d8f2ed43179d4578dbcb0829b6", - "sha256:979486d444ca3c469cd1c7f6a619ce48ff08b3b595d451937db543754bfacb65", - "sha256:9b0137a1c40da3b7989839f9b78a44de642cdd1ce20dcef341de174c8d04aa53", - "sha256:a995404bd3982c089e57b428c74edd5bfc3b0616b3dbcd6a8e270f1ee2110f36", - "sha256:aa7efc695d1fc9f72d91bf9b6c6fe2d7e1b4193836ec530a98faf7d7a7577a58", - "sha256:ad03f4252d9041b0635c37528dfa3f44b39f46024ae28c8567f7423676ee409b", - "sha256:b2db7c82f08b8ce44c0b9d1153ce63907491972a7581e8b6adea71817f119df8", - "sha256:b2eddfbbfb473a62c3a251bb737a6d58d91907f6e1d95791431ebe556f47d916", - "sha256:b380e9087078ba91e45fb18cdd0c25275ffaa045cf63c947be0ddae6186bc9d9", - "sha256:b4fc9903a73c25be9d5fe45c87faababcf3879445efa16140146b08fccfac017", - "sha256:b72206eb041f780451c61e1e89dbc3705f3d66aaaa14ee320d4f55864b13358a", - "sha256:b7b578d604e79e99aa39495becea013fd043fa9f36e4b490efa951f3d847a24d", - "sha256:ba698c7c252af83b6bba9775035263f0df5f807f0404019916d4b71af8161f66", - "sha256:bad7fe0372e505442482ca3ccbc0d6f38dae81b1650f57a0aa6bbee18e7df495", - "sha256:bbef99eb8d18ba9a40f00e8836b8040cdcf0f2fa649684cf7a66339599919d21", - "sha256:bd84441e4021cec6e4dd040550386cd9c9ea1d9418ea1a8002dbb7b576026b2b", - "sha256:be77efd735bb1064605be8dec6e721141c1421ef0b115ef54e493a64e50e9a52", - "sha256:c0b519fa2159c42272f8a244354a0e110d65175647e5185b04008ec00df9f079", - "sha256:c15b69af22030960ac63567e98ad8221cddf5d720d9cf03d85021dfd452324ef", - "sha256:c1bd75d692cd7c6d862a98013bfdf06702783b75cffbf5dae06d718fecefe8f2", - "sha256:c208a977843d18d3bd185f323e4eaa912eb4869cb230947dc6edd8a27a4e558a", - "sha256:c4430c7cba23bb0e2ee203eee7851c1654167d956fc6d4b3a87909ccaf3c5825", - "sha256:c80653332c6136da7f4d4e143975e74ac0fa14f851f716d90583bc19e8945cea", - "sha256:cf6db401f4957afbf372a4730c6d5b2a234393af723983cbf4bcd13d54c71e1a", - "sha256:cf736cc1298ef15280d9fcf7a25c09b05af016656856dc6fe5626fd8912658dd", - "sha256:d015efcd96aca8882057e7e6f06224f79eecd22cad193d3e6a0a91ec67590d1f", - "sha256:d35cc1086f1d4f907df85c6cceb2245cb39a04f69c3f375993363216134d76d4", - "sha256:d7165bcda0dbf203e5ad04d79955d223d84b2263df4db92f525ba370b03a12ab", - "sha256:d8270d104ec7caa0bdac246d31d48d94472033ceab5ba142881704350b28159c", - "sha256:da87e977f92d930a3683e10ba2b38bcc59adfc25896827e0b9d78b208b7757a6", - "sha256:e281a8071a06888575a4eb523c4deeefdcd2f5fe4a2d47e02ac8bf3a5b49f695", - "sha256:e34a63f71d2ecffb3c643909ad2d488251afeb5ef3635602b3448e609611a7ed", - "sha256:eb96568a22fe070590942cd4780950e2172e00fb033a8b76e47692583b1bd97c", - "sha256:eddc2be28a379c218e0d92e4a432805dcb0ca5870156a90b54c03cd9799f9f8a", - "sha256:efba4f53ac7752eea6d8ca38a4ddac579e6e742fba78d1e99c12c95cd2acfc64", - "sha256:f1cd68b8236faab78138a8fc703f7ca0ad431b17a3fcac696358600d4e6243b3", - "sha256:f52eba83272a26b444f4b8fc79f2e2c83f91d706d693836c9f7ccb16e6713c31", - "sha256:f950f17ae608e0786298340163cac25a4c5543ef25362dd5ddb6dcb10b547be9", - "sha256:fa85953df84beb7b8b73cb3ec3f5d92b62687a09a8e71525c6734e020edf56fd", - "sha256:fbf206e5329e20937fa19bd41cf3af06d5967f8f7e86b59d783b26b40ced755c", - "sha256:fd30fc80fe96efb06bea21667c5793bbd65c0dc793187feb39b8f96990680b00", - "sha256:fe67291775ea4c2883764ba467eb389c29c308c56b86c1e19e49c9e1ed0cbeca", - "sha256:fea7efbd7e49af9d7e5ed6c506dfc7de3d1a628790bd3a35fd0e3c904dc7d464" - ], - "markers": "python_version >= '3.8'", - "version": "==26.3.0" - }, - "readme-renderer": { - "hashes": [ - "sha256:2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151", - "sha256:8712034eabbfa6805cacf1402b4eeb2a73028f72d1166d6f5cb7f9c047c5d1e1" - ], - "markers": "python_version >= '3.9'", - "version": "==44.0" - }, - "referencing": { - "hashes": [ - "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", - "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0" - ], - "markers": "python_version >= '3.9'", - "version": "==0.36.2" - }, - "requests": { - "hashes": [ - "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", - "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6" - ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==2.32.3" - }, - "requests-toolbelt": { - "hashes": [ - "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", - "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.0.0" - }, - "rfc3339-validator": { - "hashes": [ - "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b", - "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==0.1.4" - }, - "rfc3986": { - "hashes": [ - "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd", - "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c" - ], - "markers": "python_version >= '3.7'", - "version": "==2.0.0" - }, - "rfc3986-validator": { - "hashes": [ - "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9", - "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==0.1.1" - }, - "rich": { - "hashes": [ - "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098", - "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90" - ], - "markers": "python_full_version >= '3.8.0'", - "version": "==13.9.4" - }, - "roman-numerals-py": { - "hashes": [ - "sha256:9da2ad2fb670bcf24e81070ceb3be72f6c11c440d73bd579fbeca1e9f330954c", - "sha256:be4bf804f083a4ce001b5eb7e3c0862479d10f94c936f6c4e5f250aa5ff5bd2d" - ], - "markers": "python_version >= '3.9'", - "version": "==3.1.0" - }, - "rpds-py": { - "hashes": [ - "sha256:09cd7dbcb673eb60518231e02874df66ec1296c01a4fcd733875755c02014b19", - "sha256:0f3288930b947cbebe767f84cf618d2cbe0b13be476e749da0e6a009f986248c", - "sha256:0fced9fd4a07a1ded1bac7e961ddd9753dd5d8b755ba8e05acba54a21f5f1522", - "sha256:112b8774b0b4ee22368fec42749b94366bd9b536f8f74c3d4175d4395f5cbd31", - "sha256:11dd60b2ffddba85715d8a66bb39b95ddbe389ad2cfcf42c833f1bcde0878eaf", - "sha256:178f8a60fc24511c0eb756af741c476b87b610dba83270fce1e5a430204566a4", - "sha256:1b08027489ba8fedde72ddd233a5ea411b85a6ed78175f40285bd401bde7466d", - "sha256:1bf5be5ba34e19be579ae873da515a2836a2166d8d7ee43be6ff909eda42b72b", - "sha256:1ed7de3c86721b4e83ac440751329ec6a1102229aa18163f84c75b06b525ad7e", - "sha256:1eedaaccc9bb66581d4ae7c50e15856e335e57ef2734dbc5fd8ba3e2a4ab3cb6", - "sha256:243241c95174b5fb7204c04595852fe3943cc41f47aa14c3828bc18cd9d3b2d6", - "sha256:26bb3e8de93443d55e2e748e9fd87deb5f8075ca7bc0502cfc8be8687d69a2ec", - "sha256:271fa2184cf28bdded86bb6217c8e08d3a169fe0bbe9be5e8d96e8476b707122", - "sha256:28358c54fffadf0ae893f6c1050e8f8853e45df22483b7fff2f6ab6152f5d8bf", - "sha256:285019078537949cecd0190f3690a0b0125ff743d6a53dfeb7a4e6787af154f5", - "sha256:2893d778d4671ee627bac4037a075168b2673c57186fb1a57e993465dbd79a93", - "sha256:2a54027554ce9b129fc3d633c92fa33b30de9f08bc61b32c053dc9b537266fed", - "sha256:2c6ae11e6e93728d86aafc51ced98b1658a0080a7dd9417d24bfb955bb09c3c2", - "sha256:2cfa07c346a7ad07019c33fb9a63cf3acb1f5363c33bc73014e20d9fe8b01cdd", - "sha256:35d5631ce0af26318dba0ae0ac941c534453e42f569011585cb323b7774502a5", - "sha256:3614d280bf7aab0d3721b5ce0e73434acb90a2c993121b6e81a1c15c665298ac", - "sha256:3902df19540e9af4cc0c3ae75974c65d2c156b9257e91f5101a51f99136d834c", - "sha256:3aaf141d39f45322e44fc2c742e4b8b4098ead5317e5f884770c8df0c332da70", - "sha256:3d8abf7896a91fb97e7977d1aadfcc2c80415d6dc2f1d0fca5b8d0df247248f3", - "sha256:3e77febf227a1dc3220159355dba68faa13f8dca9335d97504abf428469fb18b", - "sha256:3e9212f52074fc9d72cf242a84063787ab8e21e0950d4d6709886fb62bcb91d5", - "sha256:3ee9d6f0b38efb22ad94c3b68ffebe4c47865cdf4b17f6806d6c674e1feb4246", - "sha256:4233df01a250b3984465faed12ad472f035b7cd5240ea3f7c76b7a7016084495", - "sha256:4263320ed887ed843f85beba67f8b2d1483b5947f2dc73a8b068924558bfeace", - "sha256:4ab923167cfd945abb9b51a407407cf19f5bee35001221f2911dc85ffd35ff4f", - "sha256:4caafd1a22e5eaa3732acb7672a497123354bef79a9d7ceed43387d25025e935", - "sha256:50fb62f8d8364978478b12d5f03bf028c6bc2af04082479299139dc26edf4c64", - "sha256:55ff4151cfd4bc635e51cfb1c59ac9f7196b256b12e3a57deb9e5742e65941ad", - "sha256:5b98b6c953e5c2bda51ab4d5b4f172617d462eebc7f4bfdc7c7e6b423f6da957", - "sha256:5c9ff044eb07c8468594d12602291c635da292308c8c619244e30698e7fc455a", - "sha256:5e9c206a1abc27e0588cf8b7c8246e51f1a16a103734f7750830a1ccb63f557a", - "sha256:5fb89edee2fa237584e532fbf78f0ddd1e49a47c7c8cfa153ab4849dc72a35e6", - "sha256:633462ef7e61d839171bf206551d5ab42b30b71cac8f10a64a662536e057fdef", - "sha256:66f8d2a17e5838dd6fb9be6baaba8e75ae2f5fa6b6b755d597184bfcd3cb0eba", - "sha256:6959bb9928c5c999aba4a3f5a6799d571ddc2c59ff49917ecf55be2bbb4e3722", - "sha256:698a79d295626ee292d1730bc2ef6e70a3ab135b1d79ada8fde3ed0047b65a10", - "sha256:721f9c4011b443b6e84505fc00cc7aadc9d1743f1c988e4c89353e19c4a968ee", - "sha256:72e680c1518733b73c994361e4b06441b92e973ef7d9449feec72e8ee4f713da", - "sha256:75307599f0d25bf6937248e5ac4e3bde5ea72ae6618623b86146ccc7845ed00b", - "sha256:754fba3084b70162a6b91efceee8a3f06b19e43dac3f71841662053c0584209a", - "sha256:759462b2d0aa5a04be5b3e37fb8183615f47014ae6b116e17036b131985cb731", - "sha256:7938c7b0599a05246d704b3f5e01be91a93b411d0d6cc62275f025293b8a11ce", - "sha256:7b77e07233925bd33fc0022b8537774423e4c6680b6436316c5075e79b6384f4", - "sha256:7e5413d2e2d86025e73f05510ad23dad5950ab8417b7fc6beaad99be8077138b", - "sha256:7f3240dcfa14d198dba24b8b9cb3b108c06b68d45b7babd9eefc1038fdf7e707", - "sha256:7f9682a8f71acdf59fd554b82b1c12f517118ee72c0f3944eda461606dfe7eb9", - "sha256:8d67beb6002441faef8251c45e24994de32c4c8686f7356a1f601ad7c466f7c3", - "sha256:9441af1d25aed96901f97ad83d5c3e35e6cd21a25ca5e4916c82d7dd0490a4fa", - "sha256:98b257ae1e83f81fb947a363a274c4eb66640212516becaff7bef09a5dceacaa", - "sha256:9e9f3a3ac919406bc0414bbbd76c6af99253c507150191ea79fab42fdb35982a", - "sha256:a1c66e71ecfd2a4acf0e4bd75e7a3605afa8f9b28a3b497e4ba962719df2be57", - "sha256:a1e17d8dc8e57d8e0fd21f8f0f0a5211b3fa258b2e444c2053471ef93fe25a00", - "sha256:a20cb698c4a59c534c6701b1c24a968ff2768b18ea2991f886bd8985ce17a89f", - "sha256:a970bfaf130c29a679b1d0a6e0f867483cea455ab1535fb427566a475078f27f", - "sha256:a98f510d86f689fcb486dc59e6e363af04151e5260ad1bdddb5625c10f1e95f8", - "sha256:a9d3b728f5a5873d84cba997b9d617c6090ca5721caaa691f3b1a78c60adc057", - "sha256:ad76f44f70aac3a54ceb1813ca630c53415da3a24fd93c570b2dfb4856591017", - "sha256:ae28144c1daa61366205d32abd8c90372790ff79fc60c1a8ad7fd3c8553a600e", - "sha256:b03a8d50b137ee758e4c73638b10747b7c39988eb8e6cd11abb7084266455165", - "sha256:b5a96fcac2f18e5a0a23a75cd27ce2656c66c11c127b0318e508aab436b77428", - "sha256:b5ef909a37e9738d146519657a1aab4584018746a18f71c692f2f22168ece40c", - "sha256:b79f5ced71efd70414a9a80bbbfaa7160da307723166f09b69773153bf17c590", - "sha256:b91cceb5add79ee563bd1f70b30896bd63bc5f78a11c1f00a1e931729ca4f1f4", - "sha256:b92f5654157de1379c509b15acec9d12ecf6e3bc1996571b6cb82a4302060447", - "sha256:c04ca91dda8a61584165825907f5c967ca09e9c65fe8966ee753a3f2b019fe1e", - "sha256:c1f8afa346ccd59e4e5630d5abb67aba6a9812fddf764fd7eb11f382a345f8cc", - "sha256:c5334a71f7dc1160382d45997e29f2637c02f8a26af41073189d79b95d3321f1", - "sha256:c617d7453a80e29d9973b926983b1e700a9377dbe021faa36041c78537d7b08c", - "sha256:c632419c3870507ca20a37c8f8f5352317aca097639e524ad129f58c125c61c6", - "sha256:c6760211eee3a76316cf328f5a8bd695b47b1626d21c8a27fb3b2473a884d597", - "sha256:c698d123ce5d8f2d0cd17f73336615f6a2e3bdcedac07a1291bb4d8e7d82a05a", - "sha256:c76b32eb2ab650a29e423525e84eb197c45504b1c1e6e17b6cc91fcfeb1a4b1d", - "sha256:c8f7e90b948dc9dcfff8003f1ea3af08b29c062f681c05fd798e36daa3f7e3e8", - "sha256:c9e799dac1ffbe7b10c1fd42fe4cd51371a549c6e108249bde9cd1200e8f59b4", - "sha256:cafa48f2133d4daa028473ede7d81cd1b9f9e6925e9e4003ebdf77010ee02f35", - "sha256:ce473a2351c018b06dd8d30d5da8ab5a0831056cc53b2006e2a8028172c37ce5", - "sha256:d31ed4987d72aabdf521eddfb6a72988703c091cfc0064330b9e5f8d6a042ff5", - "sha256:d550d7e9e7d8676b183b37d65b5cd8de13676a738973d330b59dc8312df9c5dc", - "sha256:d6adb81564af0cd428910f83fa7da46ce9ad47c56c0b22b50872bc4515d91966", - "sha256:d6f6512a90bd5cd9030a6237f5346f046c6f0e40af98657568fa45695d4de59d", - "sha256:d7031d493c4465dbc8d40bd6cafefef4bd472b17db0ab94c53e7909ee781b9ef", - "sha256:d9f75a06ecc68f159d5d7603b734e1ff6daa9497a929150f794013aa9f6e3f12", - "sha256:db7707dde9143a67b8812c7e66aeb2d843fe33cc8e374170f4d2c50bd8f2472d", - "sha256:e0397dd0b3955c61ef9b22838144aa4bef6f0796ba5cc8edfc64d468b93798b4", - "sha256:e0df046f2266e8586cf09d00588302a32923eb6386ced0ca5c9deade6af9a149", - "sha256:e14f86b871ea74c3fddc9a40e947d6a5d09def5adc2076ee61fb910a9014fb35", - "sha256:e5963ea87f88bddf7edd59644a35a0feecf75f8985430124c253612d4f7d27ae", - "sha256:e768267cbe051dd8d1c5305ba690bb153204a09bf2e3de3ae530de955f5b5580", - "sha256:e9cb79ecedfc156c0692257ac7ed415243b6c35dd969baa461a6888fc79f2f07", - "sha256:ed6f011bedca8585787e5082cce081bac3d30f54520097b2411351b3574e1219", - "sha256:f3429fb8e15b20961efca8c8b21432623d85db2228cc73fe22756c6637aa39e7", - "sha256:f35eff113ad430b5272bbfc18ba111c66ff525828f24898b4e146eb479a2cdda", - "sha256:f3a6cb95074777f1ecda2ca4fa7717caa9ee6e534f42b7575a8f0d4cb0c24013", - "sha256:f7356a6da0562190558c4fcc14f0281db191cdf4cb96e7604c06acfcee96df15", - "sha256:f88626e3f5e57432e6191cd0c5d6d6b319b635e70b40be2ffba713053e5147dd", - "sha256:fad784a31869747df4ac968a351e070c06ca377549e4ace94775aaa3ab33ee06", - "sha256:fc869af5cba24d45fb0399b0cfdbcefcf6910bf4dee5d74036a57cf5264b3ff4", - "sha256:fee513135b5a58f3bb6d89e48326cd5aa308e4bcdf2f7d59f67c861ada482bf8" - ], - "markers": "python_version >= '3.9'", - "version": "==0.23.1" - }, - "send2trash": { - "hashes": [ - "sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9", - "sha256:b18e7a3966d99871aefeb00cfbcfdced55ce4871194810fc71f4aa484b953abf" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==1.8.3" - }, - "setuptools": { - "hashes": [ - "sha256:1cc9b32ee94f93224d6c80193cbb768004667aa2f2732a473d6949b0236c1d4e", - "sha256:4321d2dc2157b976dee03e1037c9f2bc5fea503c0c47d3c9458e0e8e49e659ce" - ], - "markers": "python_version >= '3.9'", - "version": "==78.0.1" - }, - "shapely": { - "extras": [ - "vectorized" - ], - "hashes": [ - "sha256:0145387565fcf8f7c028b073c802956431308da933ef41d08b1693de49990d27", - "sha256:04a65d882456e13c8b417562c36324c0cd1e5915f3c18ad516bb32ee3f5fc895", - "sha256:06ff6020949b44baa8fc2e5e57e0f3d09486cd5c33b47d669f847c54136e7027", - "sha256:19cbc8808efe87a71150e785b71d8a0e614751464e21fb679d97e274eca7bd43", - "sha256:1a2e03277128e62f9a49a58eb7eb813fa9b343925fca5e7d631d50f4c0e8e0b8", - "sha256:1e9fed9a7d6451979d914cb6ebbb218b4b4e77c0d50da23e23d8327948662611", - "sha256:25085a30a2462cee4e850a6e3fb37431cbbe4ad51cbcc163af0cea1eaa9eb96d", - "sha256:28fe2997aab9a9dc026dc6a355d04e85841546b2a5d232ed953e3321ab958ee5", - "sha256:2934834c7f417aeb7cba3b0d9b4441a76ebcecf9ea6e80b455c33c7c62d96a24", - "sha256:2e4a1749ad64bc6e7668c8f2f9479029f079991f4ae3cb9e6b25440e35a4b532", - "sha256:2f6e4759cf680a0f00a54234902415f2fa5fe02f6b05546c662654001f0793a2", - "sha256:33fb10e50b16113714ae40adccf7670379e9ccf5b7a41d0002046ba2b8f0f691", - "sha256:35524cc8d40ee4752520819f9894b9f28ba339a42d4922e92c99b148bed3be39", - "sha256:3697bd078b4459f5a1781015854ef5ea5d824dbf95282d0b60bfad6ff83ec8dc", - "sha256:4abeb44b3b946236e4e1a1b3d2a0987fb4d8a63bfb3fdefb8a19d142b72001e5", - "sha256:4c2b9859424facbafa54f4a19b625a752ff958ab49e01bc695f254f7db1835fa", - "sha256:5aed1c6764f51011d69a679fdf6b57e691371ae49ebe28c3edb5486537ffbd51", - "sha256:5cf23400cb25deccf48c56a7cdda8197ae66c0e9097fcdd122ac2007e320bc34", - "sha256:5d6dbf096f961ca6bec5640e22e65ccdec11e676344e8157fe7d636e7904fd36", - "sha256:6bca5095e86be9d4ef3cb52d56bdd66df63ff111d580855cb8546f06c3c907cd", - "sha256:73c9ae8cf443187d784d57202199bf9fd2d4bb7d5521fe8926ba40db1bc33e8e", - "sha256:7977d8a39c4cf0e06247cd2dca695ad4e020b81981d4c82152c996346cf1094b", - "sha256:7e97104d28e60b69f9b6a957c4d3a2a893b27525bc1fc96b47b3ccef46726bf2", - "sha256:8ae5cb6b645ac3fba34ad84b32fbdccb2ab321facb461954925bde807a0d3b74", - "sha256:8f623b64bb219d62014781120f47499a7adc30cf7787e24b659e56651ceebcb0", - "sha256:98697c842d5c221408ba8aa573d4f49caef4831e9bc6b6e785ce38aca42d1999", - "sha256:a0c09e3e02f948631c7763b4fd3dd175bc45303a0ae04b000856dedebefe13cb", - "sha256:a3fb7fbae257e1b042f440289ee7235d03f433ea880e73e687f108d044b24db5", - "sha256:a7f04691ce1c7ed974c2f8b34a1fe4c3c5dfe33128eae886aa32d730f1ec1913", - "sha256:a9469f49ff873ef566864cb3516091881f217b5d231c8164f7883990eec88b73", - "sha256:aaaf5f7e6cc234c1793f2a2760da464b604584fb58c6b6d7d94144fd2692d67e", - "sha256:adeddfb1e22c20548e840403e5e0b3d9dc3daf66f05fa59f1fcf5b5f664f0e98", - "sha256:b52f3ab845d32dfd20afba86675c91919a622f4627182daec64974db9b0b4608", - "sha256:cd0e75d9124b73e06a42bf1615ad3d7d805f66871aa94538c3a9b7871d620013", - "sha256:cf6c50cd879831955ac47af9c907ce0310245f9d162e298703f82e1785e38c98", - "sha256:d8f1da01c04527f7da59ee3755d8ee112cd8967c15fab9e43bba936b81e2a013", - "sha256:dd37d65519b3f8ed8976fa4302a2827cbb96e0a461a2e504db583b08a22f0b98", - "sha256:e1c4f1071fe9c09af077a69b6c75f17feb473caeea0c3579b3e94834efcbdc36", - "sha256:e6d95703efaa64aaabf278ced641b888fc23d9c6dd71f8215091afd8a26a66e3", - "sha256:f44eda8bd7a4bccb0f281264b34bf3518d8c4c9a8ffe69a1a05dabf6e8461147", - "sha256:f86e2c0259fe598c4532acfcf638c1f520fa77c1275912bbc958faecbf00b108", - "sha256:fc19b78cc966db195024d8011649b4e22812f805dd49264323980715ab80accc" - ], - "markers": "python_version >= '3.7'", - "version": "==2.0.7" - }, - "six": { - "hashes": [ - "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", - "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", - "version": "==1.17.0" - }, - "sniffio": { - "hashes": [ - "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", - "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc" - ], - "markers": "python_version >= '3.7'", - "version": "==1.3.1" - }, - "snowballstemmer": { - "hashes": [ - "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1", - "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a" - ], - "version": "==2.2.0" - }, - "soupsieve": { - "hashes": [ - "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb", - "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9" - ], - "markers": "python_version >= '3.8'", - "version": "==2.6" - }, - "sphinx": { - "hashes": [ - "sha256:398ad29dee7f63a75888314e9424d40f52ce5a6a87ae88e7071e80af296ec348", - "sha256:4405915165f13521d875a8c29c8970800a0141c14cc5416a38feca4ea5d9b9c3" - ], - "index": "pypi", - "markers": "python_version >= '3.11'", - "version": "==8.2.3" - }, - "sphinx-autobuild": { - "hashes": [ - "sha256:158e16c36f9d633e613c9aaf81c19b0fc458ca78b112533b20dafcda430d60fa", - "sha256:248150f8f333e825107b6d4b86113ab28fa51750e5f9ae63b59dc339be951fb1" - ], - "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==2024.10.3" - }, - "sphinxcontrib-applehelp": { - "hashes": [ - "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1", - "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5" - ], - "markers": "python_version >= '3.9'", - "version": "==2.0.0" - }, - "sphinxcontrib-devhelp": { - "hashes": [ - "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad", - "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2" - ], - "markers": "python_version >= '3.9'", - "version": "==2.0.0" - }, - "sphinxcontrib-htmlhelp": { - "hashes": [ - "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8", - "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9" - ], - "markers": "python_version >= '3.9'", - "version": "==2.1.0" - }, - "sphinxcontrib-jsmath": { - "hashes": [ - "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", - "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8" - ], - "markers": "python_version >= '3.5'", - "version": "==1.0.1" - }, - "sphinxcontrib-qthelp": { - "hashes": [ - "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab", - "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb" - ], - "markers": "python_version >= '3.9'", - "version": "==2.0.0" - }, - "sphinxcontrib-serializinghtml": { - "hashes": [ - "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", - "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d" - ], - "markers": "python_version >= '3.9'", - "version": "==2.0.0" - }, - "sphinxcontrib-spelling": { - "hashes": [ - "sha256:21704857c1b5e26e06bb07d15927df41c9d7ecfc1843169ecd22cb59f24069ac", - "sha256:f0447b6413c78b613b916c7891e36be85a105d1919c99784c53dfea2d8f8040f" - ], - "index": "pypi", - "markers": "python_version >= '3.10'", - "version": "==8.0.1" - }, - "stack-data": { - "hashes": [ - "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", - "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695" - ], - "version": "==0.6.3" - }, - "starlette": { - "hashes": [ - "sha256:3c88d58ee4bd1bb807c0d1acb381838afc7752f9ddaec81bbe4383611d833230", - "sha256:77c74ed9d2720138b25875133f3a2dae6d854af2ec37dceb56aef370c1d8a227" - ], - "markers": "python_version >= '3.9'", - "version": "==0.46.1" - }, - "syrupy": { - "hashes": [ - "sha256:b7d0fcadad80a7d2f6c4c71917918e8ebe2483e8c703dfc8d49cdbb01081f9a4", - "sha256:b94cc12ed0e5e75b448255430af642516842a2374a46936dd2650cfb6dd20eda" - ], - "index": "pypi", - "markers": "python_full_version >= '3.8.1'", - "version": "==4.9.1" - }, - "terminado": { - "hashes": [ - "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0", - "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e" - ], - "markers": "python_version >= '3.8'", - "version": "==0.18.1" - }, - "tinycss2": { - "hashes": [ - "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7", - "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289" - ], - "markers": "python_version >= '3.8'", - "version": "==1.4.0" - }, - "tornado": { - "hashes": [ - "sha256:072ce12ada169c5b00b7d92a99ba089447ccc993ea2143c9ede887e0937aa803", - "sha256:1a017d239bd1bb0919f72af256a970624241f070496635784d9bf0db640d3fec", - "sha256:2876cef82e6c5978fde1e0d5b1f919d756968d5b4282418f3146b79b58556482", - "sha256:304463bd0772442ff4d0f5149c6f1c2135a1fae045adf070821c6cdc76980634", - "sha256:908b71bf3ff37d81073356a5fadcc660eb10c1476ee6e2725588626ce7e5ca38", - "sha256:92bad5b4746e9879fd7bf1eb21dce4e3fc5128d71601f80005afa39237ad620b", - "sha256:932d195ca9015956fa502c6b56af9eb06106140d844a335590c1ec7f5277d10c", - "sha256:bca9eb02196e789c9cb5c3c7c0f04fb447dc2adffd95265b2c7223a8a615ccbf", - "sha256:c36e62ce8f63409301537222faffcef7dfc5284f27eec227389f2ad11b09d946", - "sha256:c82c46813ba483a385ab2a99caeaedf92585a1f90defb5693351fa7e4ea0bf73", - "sha256:e828cce1123e9e44ae2a50a9de3055497ab1d0aeb440c5ac23064d9e44880da1" - ], - "markers": "python_version >= '3.8'", - "version": "==6.4.2" - }, - "tox": { - "hashes": [ - "sha256:92e8290e76ad4e15748860a205865696409a2d014eedeb796a34a0f3b5e7336e", - "sha256:d5948b350f76fae436d6545a5e87c2b676ab7a0d7d88c1308651245eadbe8aea" - ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==4.24.2" - }, - "traitlets": { - "hashes": [ - "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", - "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f" - ], - "markers": "python_version >= '3.8'", - "version": "==5.14.3" - }, - "twine": { - "hashes": [ - "sha256:a47f973caf122930bf0fbbf17f80b83bc1602c9ce393c7845f289a3001dc5384", - "sha256:be324f6272eff91d07ee93f251edf232fc647935dd585ac003539b42404a8dbd" - ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==6.1.0" - }, - "types-python-dateutil": { - "hashes": [ - "sha256:18f493414c26ffba692a72369fea7a154c502646301ebfe3d56a04b3767284cb", - "sha256:e248a4bc70a486d3e3ec84d0dc30eec3a5f979d6e7ee4123ae043eedbb987f53" - ], - "markers": "python_version >= '3.8'", - "version": "==2.9.0.20241206" - }, - "typing-extensions": { - "hashes": [ - "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", - "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" - ], - "markers": "python_version >= '3.8'", - "version": "==4.12.2" - }, - "uri-template": { - "hashes": [ - "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7", - "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363" - ], - "markers": "python_version >= '3.7'", - "version": "==1.3.0" - }, - "urllib3": { - "hashes": [ - "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", - "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d" - ], - "markers": "python_version >= '3.9'", - "version": "==2.3.0" - }, - "uvicorn": { - "hashes": [ - "sha256:023dc038422502fa28a09c7a30bf2b6991512da7dcdb8fd35fe57cfc154126f4", - "sha256:404051050cd7e905de2c9a7e61790943440b3416f49cb409f965d9dcd0fa73e9" - ], - "markers": "python_version >= '3.9'", - "version": "==0.34.0" - }, - "virtualenv": { - "hashes": [ - "sha256:3e3d00f5807e83b234dfb6122bf37cfadf4be216c53a49ac059d02414f819170", - "sha256:95e39403fcf3940ac45bc717597dba16110b74506131845d9b687d5e73d947ac" - ], - "markers": "python_version >= '3.8'", - "version": "==20.29.3" - }, - "watchfiles": { - "hashes": [ - "sha256:02a526ee5b5a09e8168314c905fc545c9bc46509896ed282aeb5a8ba9bd6ca27", - "sha256:05d341c71f3d7098920f8551d4df47f7b57ac5b8dad56558064c3431bdfc0b74", - "sha256:076f293100db3b0b634514aa0d294b941daa85fc777f9c698adb1009e5aca0b1", - "sha256:0799ae68dfa95136dde7c472525700bd48777875a4abb2ee454e3ab18e9fc712", - "sha256:0986902677a1a5e6212d0c49b319aad9cc48da4bd967f86a11bde96ad9676ca1", - "sha256:0bc80d91ddaf95f70258cf78c471246846c1986bcc5fd33ccc4a1a67fcb40f9a", - "sha256:13c2ce7b72026cfbca120d652f02c7750f33b4c9395d79c9790b27f014c8a5a2", - "sha256:1941b4e39de9b38b868a69b911df5e89dc43767feeda667b40ae032522b9b5f1", - "sha256:1eacd91daeb5158c598fe22d7ce66d60878b6294a86477a4715154990394c9b3", - "sha256:229e6ec880eca20e0ba2f7e2249c85bae1999d330161f45c78d160832e026ee2", - "sha256:22bb55a7c9e564e763ea06c7acea24fc5d2ee5dfc5dafc5cfbedfe58505e9f90", - "sha256:278aaa395f405972e9f523bd786ed59dfb61e4b827856be46a42130605fd0899", - "sha256:2a9f93f8439639dc244c4d2902abe35b0279102bca7bbcf119af964f51d53c19", - "sha256:308ac265c56f936636e3b0e3f59e059a40003c655228c131e1ad439957592303", - "sha256:31f1a379c9dcbb3f09cf6be1b7e83b67c0e9faabed0471556d9438a4a4e14202", - "sha256:32b026a6ab64245b584acf4931fe21842374da82372d5c039cba6bf99ef722f3", - "sha256:342622287b5604ddf0ed2d085f3a589099c9ae8b7331df3ae9845571586c4f3d", - "sha256:39f4914548b818540ef21fd22447a63e7be6e24b43a70f7642d21f1e73371590", - "sha256:3f68d8e9d5a321163ddacebe97091000955a1b74cd43724e346056030b0bacee", - "sha256:43b168bba889886b62edb0397cab5b6490ffb656ee2fcb22dec8bfeb371a9e12", - "sha256:47eb32ef8c729dbc4f4273baece89398a4d4b5d21a1493efea77a17059f4df8a", - "sha256:4810ea2ae622add560f4aa50c92fef975e475f7ac4900ce5ff5547b2434642d8", - "sha256:4e997802d78cdb02623b5941830ab06f8860038faf344f0d288d325cc9c5d2ff", - "sha256:4ebbeca9360c830766b9f0df3640b791be569d988f4be6c06d6fae41f187f105", - "sha256:4f8c4998506241dedf59613082d1c18b836e26ef2a4caecad0ec41e2a15e4226", - "sha256:55ccfd27c497b228581e2838d4386301227fc0cb47f5a12923ec2fe4f97b95af", - "sha256:5717021b199e8353782dce03bd8a8f64438832b84e2885c4a645f9723bf656d9", - "sha256:5c11ea22304d17d4385067588123658e9f23159225a27b983f343fcffc3e796a", - "sha256:5e0227b8ed9074c6172cf55d85b5670199c99ab11fd27d2c473aa30aec67ee42", - "sha256:62c9953cf85529c05b24705639ffa390f78c26449e15ec34d5339e8108c7c407", - "sha256:6ba473efd11062d73e4f00c2b730255f9c1bdd73cd5f9fe5b5da8dbd4a717205", - "sha256:740d103cd01458f22462dedeb5a3382b7f2c57d07ff033fbc9465919e5e1d0f3", - "sha256:74cb3ca19a740be4caa18f238298b9d472c850f7b2ed89f396c00a4c97e2d9ff", - "sha256:7b75fee5a16826cf5c46fe1c63116e4a156924d668c38b013e6276f2582230f0", - "sha256:7cf684aa9bba4cd95ecb62c822a56de54e3ae0598c1a7f2065d51e24637a3c5d", - "sha256:8012bd820c380c3d3db8435e8cf7592260257b378b649154a7948a663b5f84e9", - "sha256:857f5fc3aa027ff5e57047da93f96e908a35fe602d24f5e5d8ce64bf1f2fc733", - "sha256:8b1f135238e75d075359cf506b27bf3f4ca12029c47d3e769d8593a2024ce161", - "sha256:8d0d0630930f5cd5af929040e0778cf676a46775753e442a3f60511f2409f48f", - "sha256:90192cdc15ab7254caa7765a98132a5a41471cf739513cc9bcf7d2ffcc0ec7b2", - "sha256:95b42cac65beae3a362629950c444077d1b44f1790ea2772beaea95451c086bb", - "sha256:9745a4210b59e218ce64c91deb599ae8775c8a9da4e95fb2ee6fe745fc87d01a", - "sha256:9d1ef56b56ed7e8f312c934436dea93bfa3e7368adfcf3df4c0da6d4de959a1e", - "sha256:9eea33ad8c418847dd296e61eb683cae1c63329b6d854aefcd412e12d94ee235", - "sha256:9f25d0ba0fe2b6d2c921cf587b2bf4c451860086534f40c384329fb96e2044d1", - "sha256:9fe37a2de80aa785d340f2980276b17ef697ab8db6019b07ee4fd28a8359d2f3", - "sha256:a38320582736922be8c865d46520c043bff350956dfc9fbaee3b2df4e1740a4b", - "sha256:a462490e75e466edbb9fc4cd679b62187153b3ba804868452ef0577ec958f5ff", - "sha256:a5ae5706058b27c74bac987d615105da17724172d5aaacc6c362a40599b6de43", - "sha256:aa216f87594f951c17511efe5912808dfcc4befa464ab17c98d387830ce07b60", - "sha256:ab0311bb2ffcd9f74b6c9de2dda1612c13c84b996d032cd74799adb656af4e8b", - "sha256:ab594e75644421ae0a2484554832ca5895f8cab5ab62de30a1a57db460ce06c6", - "sha256:aee397456a29b492c20fda2d8961e1ffb266223625346ace14e4b6d861ba9c80", - "sha256:b045c800d55bc7e2cadd47f45a97c7b29f70f08a7c2fa13241905010a5493f94", - "sha256:b77d5622ac5cc91d21ae9c2b284b5d5c51085a0bdb7b518dba263d0af006132c", - "sha256:ba5bb3073d9db37c64520681dd2650f8bd40902d991e7b4cfaeece3e32561d08", - "sha256:bdef5a1be32d0b07dcea3318a0be95d42c98ece24177820226b56276e06b63b0", - "sha256:c2acfa49dd0ad0bf2a9c0bb9a985af02e89345a7189be1efc6baa085e0f72d7c", - "sha256:c7cce76c138a91e720d1df54014a047e680b652336e1b73b8e3ff3158e05061e", - "sha256:cc27a65069bcabac4552f34fd2dce923ce3fcde0721a16e4fb1b466d63ec831f", - "sha256:cdbd912a61543a36aef85e34f212e5d2486e7c53ebfdb70d1e0b060cc50dd0bf", - "sha256:cdcc92daeae268de1acf5b7befcd6cfffd9a047098199056c72e4623f531de18", - "sha256:d3452c1ec703aa1c61e15dfe9d482543e4145e7c45a6b8566978fbb044265a21", - "sha256:d6097538b0ae5c1b88c3b55afa245a66793a8fec7ada6755322e465fb1a0e8cc", - "sha256:d8d3d9203705b5797f0af7e7e5baa17c8588030aaadb7f6a86107b7247303817", - "sha256:e0611d244ce94d83f5b9aff441ad196c6e21b55f77f3c47608dcf651efe54c4a", - "sha256:f12969a3765909cf5dc1e50b2436eb2c0e676a3c75773ab8cc3aa6175c16e902", - "sha256:f44a39aee3cbb9b825285ff979ab887a25c5d336e5ec3574f1506a4671556a8d", - "sha256:f9ce064e81fe79faa925ff03b9f4c1a98b0bbb4a1b8c1b015afa93030cb21a49", - "sha256:fb2c46e275fbb9f0c92e7654b231543c7bbfa1df07cdc4b99fa73bedfde5c844", - "sha256:fc2eb5d14a8e0d5df7b36288979176fbb39672d45184fc4b1c004d7c3ce29317" - ], - "markers": "python_version >= '3.9'", - "version": "==1.0.4" - }, - "wcwidth": { - "hashes": [ - "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", - "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5" - ], - "version": "==0.2.13" - }, - "webcolors": { - "hashes": [ - "sha256:515291393b4cdf0eb19c155749a096f779f7d909f7cceea072791cb9095b92e9", - "sha256:ecb3d768f32202af770477b8b65f318fa4f566c22948673a977b00d589dd80f6" - ], - "markers": "python_version >= '3.9'", - "version": "==24.11.1" - }, - "webencodings": { - "hashes": [ - "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", - "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923" - ], - "version": "==0.5.1" - }, - "websocket-client": { - "hashes": [ - "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526", - "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da" - ], - "markers": "python_version >= '3.8'", - "version": "==1.8.0" - }, - "websockets": { - "hashes": [ - "sha256:0701bc3cfcb9164d04a14b149fd74be7347a530ad3bbf15ab2c678a2cd3dd9a2", - "sha256:0a34631031a8f05657e8e90903e656959234f3a04552259458aac0b0f9ae6fd9", - "sha256:0af68c55afbd5f07986df82831c7bff04846928ea8d1fd7f30052638788bc9b5", - "sha256:0c9e74d766f2818bb95f84c25be4dea09841ac0f734d1966f415e4edfc4ef1c3", - "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", - "sha256:0fdfe3e2a29e4db3659dbd5bbf04560cea53dd9610273917799f1cde46aa725e", - "sha256:1009ee0c7739c08a0cd59de430d6de452a55e42d6b522de7aa15e6f67db0b8e1", - "sha256:1234d4ef35db82f5446dca8e35a7da7964d02c127b095e172e54397fb6a6c256", - "sha256:16b6c1b3e57799b9d38427dda63edcbe4926352c47cf88588c0be4ace18dac85", - "sha256:2034693ad3097d5355bfdacfffcbd3ef5694f9718ab7f29c29689a9eae841880", - "sha256:21c1fa28a6a7e3cbdc171c694398b6df4744613ce9b36b1a498e816787e28123", - "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", - "sha256:27ccee0071a0e75d22cb35849b1db43f2ecd3e161041ac1ee9d2352ddf72f065", - "sha256:363c6f671b761efcb30608d24925a382497c12c506b51661883c3e22337265ed", - "sha256:39c1fec2c11dc8d89bba6b2bf1556af381611a173ac2b511cf7231622058af41", - "sha256:3b1ac0d3e594bf121308112697cf4b32be538fb1444468fb0a6ae4feebc83411", - "sha256:3be571a8b5afed347da347bfcf27ba12b069d9d7f42cb8c7028b5e98bbb12597", - "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", - "sha256:3d00075aa65772e7ce9e990cab3ff1de702aa09be3940d1dc88d5abf1ab8a09c", - "sha256:3e90baa811a5d73f3ca0bcbf32064d663ed81318ab225ee4f427ad4e26e5aff3", - "sha256:47819cea040f31d670cc8d324bb6435c6f133b8c7a19ec3d61634e62f8d8f9eb", - "sha256:47b099e1f4fbc95b701b6e85768e1fcdaf1630f3cbe4765fa216596f12310e2e", - "sha256:4a9fac8e469d04ce6c25bb2610dc535235bd4aa14996b4e6dbebf5e007eba5ee", - "sha256:4b826973a4a2ae47ba357e4e82fa44a463b8f168e1ca775ac64521442b19e87f", - "sha256:4c2529b320eb9e35af0fa3016c187dffb84a3ecc572bcee7c3ce302bfeba52bf", - "sha256:54479983bd5fb469c38f2f5c7e3a24f9a4e70594cd68cd1fa6b9340dadaff7cf", - "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", - "sha256:5756779642579d902eed757b21b0164cd6fe338506a8083eb58af5c372e39d9a", - "sha256:592f1a9fe869c778694f0aa806ba0374e97648ab57936f092fd9d87f8bc03665", - "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", - "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", - "sha256:5d54b09eba2bada6011aea5375542a157637b91029687eb4fdb2dab11059c1b4", - "sha256:5df592cd503496351d6dc14f7cdad49f268d8e618f80dce0cd5a36b93c3fc08d", - "sha256:5f4c04ead5aed67c8a1a20491d54cdfba5884507a48dd798ecaf13c74c4489f5", - "sha256:64dee438fed052b52e4f98f76c5790513235efaa1ef7f3f2192c392cd7c91b65", - "sha256:66dd88c918e3287efc22409d426c8f729688d89a0c587c88971a0faa2c2f3792", - "sha256:678999709e68425ae2593acf2e3ebcbcf2e69885a5ee78f9eb80e6e371f1bf57", - "sha256:67f2b6de947f8c757db2db9c71527933ad0019737ec374a8a6be9a956786aaf9", - "sha256:693f0192126df6c2327cce3baa7c06f2a117575e32ab2308f7f8216c29d9e2e3", - "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", - "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", - "sha256:76d1f20b1c7a2fa82367e04982e708723ba0e7b8d43aa643d3dcd404d74f1475", - "sha256:7f493881579c90fc262d9cdbaa05a6b54b3811c2f300766748db79f098db9940", - "sha256:823c248b690b2fd9303ba00c4f66cd5e2d8c3ba4aa968b2779be9532a4dad431", - "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", - "sha256:8dd8327c795b3e3f219760fa603dcae1dcc148172290a8ab15158cf85a953413", - "sha256:8fdc51055e6ff4adeb88d58a11042ec9a5eae317a0a53d12c062c8a8865909e8", - "sha256:a625e06551975f4b7ea7102bc43895b90742746797e2e14b70ed61c43a90f09b", - "sha256:abdc0c6c8c648b4805c5eacd131910d2a7f6455dfd3becab248ef108e89ab16a", - "sha256:ac017dd64572e5c3bd01939121e4d16cf30e5d7e110a119399cf3133b63ad054", - "sha256:ac1e5c9054fe23226fb11e05a6e630837f074174c4c2f0fe442996112a6de4fb", - "sha256:ac60e3b188ec7574cb761b08d50fcedf9d77f1530352db4eef1707fe9dee7205", - "sha256:b359ed09954d7c18bbc1680f380c7301f92c60bf924171629c5db97febb12f04", - "sha256:b7643a03db5c95c799b89b31c036d5f27eeb4d259c798e878d6937d71832b1e4", - "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", - "sha256:c338ffa0520bdb12fbc527265235639fb76e7bc7faafbb93f6ba80d9c06578a9", - "sha256:cad21560da69f4ce7658ca2cb83138fb4cf695a2ba3e475e0559e05991aa8122", - "sha256:d08eb4c2b7d6c41da6ca0600c077e93f5adcfd979cd777d747e9ee624556da4b", - "sha256:d50fd1ee42388dcfb2b3676132c78116490976f1300da28eb629272d5d93e905", - "sha256:d591f8de75824cbb7acad4e05d2d710484f15f29d4a915092675ad3456f11770", - "sha256:d5f6b181bb38171a8ad1d6aa58a67a6aa9d4b38d0f8c5f496b9e42561dfc62fe", - "sha256:d63efaa0cd96cf0c5fe4d581521d9fa87744540d4bc999ae6e08595a1014b45b", - "sha256:d99e5546bf73dbad5bf3547174cd6cb8ba7273062a23808ffea025ecb1cf8562", - "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", - "sha256:e8b56bdcdb4505c8078cb6c7157d9811a85790f2f2b3632c7d1462ab5783d215", - "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", - "sha256:f29d80eb9a9263b8d109135351caf568cc3f80b9928bccde535c235de55c22d9", - "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", - "sha256:fcd5cf9e305d7b8338754470cf69cf81f420459dbae8a3b40cee57417f4614a7" - ], - "markers": "python_version >= '3.9'", - "version": "==15.0.1" - } - } -} diff --git a/README.md b/README.md new file mode 100644 index 0000000..40a447f --- /dev/null +++ b/README.md @@ -0,0 +1,135 @@ +# EEweather: Weather station wrangling for EEmeter + +[![License](https://img.shields.io/github/license/opendsm/eeweather.svg)](https://github.com/opendsm/eeweather) +[![Documentation Status](https://readthedocs.org/projects/eeweather/badge/?version=latest)](http://eeweather.readthedocs.io/en/latest/?badge=latest) +[![PyPI Version](https://img.shields.io/pypi/v/eeweather.svg)](https://pypi.python.org/pypi/eeweather) + +--- + +**EEweather** — tools for matching to and fetching data from NCEI ISD, TMY3, or CZ2010 weather stations. + +EEweather comes with a database of weather station metadata, ZCTA metadata, and GIS data that makes it easier to find the right weather station to use for a particular ZIP code or lat/long coordinate. + +[Read the docs.](https://eeweather.readthedocs.org/) + +## Installation + +EEweather is a python package and can be installed with pip. + +``` +$ pip install eeweather +``` + +## Supported Sources of Weather Data + +- NCEI Integrated Surface Database (ISD) +- Global Summary of the Day (GSOD) +- NREL Typical Meteorological Year 3 (TMY3) +- California Energy Commission 1998-2009 Weather Normals (CZ2010) + +## Features + +- Match by ZIP code (ZCTA) or by lat/long coordinates +- Use user-supplied weather station mappings +- Match within climate zones + - IECC Climate Zones + - IECC Moisture Regimes + - Building America Climate Zones + - California Building Climate Zone Areas +- User-friendly SQLite database of metadata compiled from primary sources + - US Census Bureau (ZCTAs, county shapefiles) + - Building America climate zone county lists + - NOAA NCEI Integrated Surface Database Station History + - NREL TMY3 site +- Plot maps of outputs + +## Contributing + +Dev installation: + +``` +$ python -m venv .venv +$ source .venv/bin/activate +$ pip install -e .[dev] +``` + +Build docs: + +``` +$ make -C docs html +``` + +Autobuild docs: + +``` +$ make -C docs livehtml +``` + +Check spelling in docs: + +``` +$ make -C docs spelling +``` + +Run tests: + +``` +$ pytest +``` + +Run tests on multiple python versions: + +``` +$ tox +``` + +## Use with Docker + +To use with docker-compose, use the following: + +Run a tutorial notebook (copy link w/ token, open tutorial.ipynb): + +``` +$ docker-compose up jupyter +``` + +Live-edit docs: + +``` +$ docker-compose up docs +``` + +Open a shell: + +``` +$ docker-compose run --rm shell +``` + +Run tests: + +``` +$ docker-compose run --rm test +``` + +Run the CLI: + +``` +$ docker-compose run --rm eeweather --help +``` + +## Notice Regarding CZ2010 Data + +There may be conditions placed on their international commercial use. +They can be used within the U.S. or for non-commercial international activities without restriction. +The non-U.S. data cannot be redistributed for commercial purposes. +Re-distribution of these data by others must provide this same notification. + +See [further explanation](http://weather.whiteboxtechnologies.com/faq#Q12/) here. + +## Metadata Yearly Updates + +Every year, the metadata database needs to be updated. This can be done by running: + +``` +docker-compose run --rm eeweather rebuild-db +``` diff --git a/README.rst b/README.rst deleted file mode 100644 index 708485b..0000000 --- a/README.rst +++ /dev/null @@ -1,141 +0,0 @@ -EEweather: Weather station wrangling for EEmeter -================================================ - -.. image:: https://travis-ci.org/openeemeter/eeweather.svg?branch=master - :target: https://travis-ci.org/openeemeter/eeweather - -.. image:: https://img.shields.io/github/license/openeemeter/eeweather.svg - :target: https://github.com/openeemeter/eeweather - -.. image:: https://readthedocs.org/projects/eeweather/badge/?version=latest - :target: http://eeweather.readthedocs.io/en/latest/?badge=latest - -.. image:: https://img.shields.io/pypi/v/eeweather.svg - :target: https://pypi.python.org/pypi/eeweather - -.. image:: https://codecov.io/gh/openeemeter/eeweather/branch/master/graph/badge.svg - :target: https://codecov.io/gh/openeemeter/eeweather - ---------------- - -**EEweather** — tools for matching to and fetching data from NCEI ISD, TMY3, or CZ2010 weather stations. - -EEweather comes with a database of weather station metadata, ZCTA metadata, and GIS data that makes it easier to find the right weather station to use for a particular ZIP code or lat/long coordinate. - -`Read the docs. `_ - -Installation ------------- - -EEweather is a python package and can be installed with pip. - -:: - - $ pip install eeweather - -Supported Sources of Weather Data ---------------------------------- - -- NCEI Integrated Surface Database (ISD) -- Global Summary of the Day (GSOD) -- NREL Typical Meteorological Year 3 (TMY3) -- California Energy Commission 1998-2009 Weather Normals (CZ2010) - -Features --------- - -- Match by ZIP code (ZCTA) or by lat/long coordinates -- Use user-supplied weather station mappings -- Match within climate zones - - - IECC Climate Zones - - IECC Moisture Regimes - - Building America Climate Zones - - California Building Climate Zone Areas - -- User-friendly SQLite database of metadata compiled from primary sources - - - US Census Bureau (ZCTAs, county shapefiles) - - Building America climate zone county lists - - NOAA NCEI Integrated Surface Database Station History - - NREL TMY3 site - -- Plot maps of outputs - -Contributing ------------- - -Dev installation:: - - $ pipenv --python 3.6.4 # create virtualenv with python 3.6.4 - $ pipenv install --dev # install dev requirements with pipenv - $ pipenv install -e . # install package in editable mode - $ pipenv shell # activate pipenv virtual environment - -Build docs:: - - $ make -C docs html - -Autobuild docs:: - - $ make -C docs livehtml - -Check spelling in docs:: - - $ make -C docs spelling - -Run tests:: - - $ pytest - -Run tests on multiple python versions:: - - $ tox - -Upload to pypi (using twine):: - - $ python setup.py upload - -Use with Docker ---------------- - -To use with docker-compose, use the following: - -Run a tutorial notebook (copy link w/ token, open tutorial.ipynb):: - - $ docker-compose up jupyter - -Live-edit docs:: - - $ docker-compose up docs - -Open a shell:: - - $ docker-compose run --rm shell - -Run tests:: - - $ docker-compose run --rm test - -Run the CLI:: - - $ docker-compose run --rm eeweather --help - - -Notice Regarding CZ2010 Data ----------------------------- - -There may be conditions placed on their international commercial use. -They can be used within the U.S. or for non-commercial international activities without restriction. -The non-U.S. data cannot be redistributed for commercial purposes. -Re-distribution of these data by others must provide this same notification. - -See `further explanation `_ here. - -Metadata Yearly Updates ------------------------ -Every year, the metadata database needs to be updated. This can be done by running: - -``` -docker-compose run --rm eeweather rebuild-db -``` diff --git a/bump_version.sh b/bump_version.sh deleted file mode 100755 index dc9f723..0000000 --- a/bump_version.sh +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/bash - -#################################### -# # -# Prints commands necessary to # -# do a version bump. Usage: # -# # -# ./bump_version.sh X.X.X Y.Y.Y # -# # -# where X.X.X is the old version # -# and X.X.X is the new version # -# # -#################################### - -set -e # fail script on any error, show commands - -OLD_VERSION=$1 # e.g., 0.0.0 -NEW_VERSION=$2 # e.g., 0.0.1 -NEW_VERSION_LENGTH=$(printf "%s" "$NEW_VERSION" | wc -c) -DASHES=$(printf "%${NEW_VERSION_LENGTH}s" | sed 's/ /-/g') - -echo "git checkout master" -echo "git pull" -echo "git checkout -b release/v${NEW_VERSION}" -echo "" -echo "sed -i -e 's/${OLD_VERSION}/${NEW_VERSION}/g' eeweather/__version__.py" -echo "sed -i -e '/Development/,/-----------/ c\\ -Development\\ ------------\\ -\\ -* Placeholder\\ -\\ -${NEW_VERSION}\\ -${DASHES}\\ -' CHANGELOG.md" -echo "rm -f eeweather/__version__.py-e" -echo "rm -f CHANGELOG.md-e" -echo "" -echo "git commit -am \"Bump version\"" -echo "git tag v${NEW_VERSION}" -echo "git push -u origin release/v${NEW_VERSION} --tags" -echo "docker-compose run --rm python setup.py upload" -echo "git checkout master" -echo "git pull" -echo "git merge release/v${NEW_VERSION}" -echo "git push" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..35d77cc --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,82 @@ +[build-system] +requires = ["hatchling>=1.27"] +build-backend = "hatchling.build" + +[project] +name = "eeweather" +dynamic = ["version"] +description = "Weather station wrangling for EEmeter" +readme = "README.md" +requires-python = ">=3.10" +license = "Apache-2.0" +license-files = ["LICENSE"] +authors = [{ name = "opendsm", email = "opendsm@lists.lfenergy.org" }] +classifiers = [ + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", +] + +dependencies = [ + "attrs", + "click", + "pandas>=1.0.0", + "pyproj>=1.9.6", + "pytz", + "requests", + "retry", + "shapely", +] + +[project.optional-dependencies] +dev = [ + "black", + "coverage", + "pytest", + "pytest-cov", + "pytest-xdist", + "syrupy>=5,<6", + "tox", +] + +[project.scripts] +eeweather = "eeweather.cli:cli" + +[project.urls] +Homepage = "https://github.com/opendsm/eeweather" +Documentation = "https://eeweather.readthedocs.io" +Repository = "https://github.com/opendsm/eeweather" +Issues = "https://github.com/opendsm/eeweather/issues" + +[tool.hatch.version] +path = "eeweather/__version__.py" + +[tool.hatch.build.targets.wheel] +packages = ["eeweather"] + +[tool.pytest.ini_options] +# --cov / --cov-report are off by default to keep normal runs fast; coverage +# runs via `tox -e coverage`. +addopts = [ + "-n", "auto", # parallel run (pytest-xdist) + "-vv", # verbose +] +filterwarnings = [ + "error", +] + +[tool.coverage.run] +omit = [ + ".tox/*", + # metadata-db rebuild code; runs against live primary sources, not unit-testable + "eeweather/database.py", +] + +[tool.coverage.report] +exclude_lines = [ + "pragma: no cover", + "if __name__ == .__main__.:", + "raise NotImplementedError", +] diff --git a/pytest.ini b/pytest.ini deleted file mode 100644 index 6c7d969..0000000 --- a/pytest.ini +++ /dev/null @@ -1,13 +0,0 @@ -[pytest] -addopts = - # run in parallel - requires pytest-xdist - -n auto - - # show coverage - --cov=./ - - # show lines missing coverage - --cov-report term-missing - - # verbose output - -vv diff --git a/setup.py b/setup.py deleted file mode 100644 index f08bbfc..0000000 --- a/setup.py +++ /dev/null @@ -1,104 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -""" - -Copyright 2018-2023 OpenEEmeter contributors - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -""" -# Setup.py inspired by https://github.com/kennethreitz/setup.py - -# Note: To use the 'upload' functionality of this file, you must: -# $ pip install twine - -import io -import os -import sys -from shutil import rmtree - -from setuptools import find_packages, setup, Command - -NAME = "eeweather" -REQUIRED = ["click", "pandas>=1.0.0", "pyproj>=1.9.6", "requests", "shapely", "retry"] - -here = os.path.abspath(os.path.dirname(__file__)) - -# Import the README and use it as the long-description. -with io.open(os.path.join(here, "README.rst"), encoding="utf-8") as f: - long_description = "\n" + f.read() - -# Load the package's __version__.py module as a dictionary. -about = {} -with open(os.path.join(here, NAME, "__version__.py")) as f: - exec(f.read(), about) - - -class UploadCommand(Command): - """Support setup.py upload.""" - - description = "Build and publish the package." - user_options = [] - - @staticmethod - def status(s): - """Prints things in bold.""" - print("\033[1m{0}\033[0m".format(s)) - - def initialize_options(self): - pass - - def finalize_options(self): - pass - - def run(self): - try: - self.status("Removing previous builds…") - rmtree(os.path.join(here, "dist")) - except OSError: - pass - - self.status("Building Source and Wheel (universal) distribution…") - os.system("{0} setup.py sdist bdist_wheel --universal".format(sys.executable)) - - self.status("Uploading the package to PyPi via Twine…") - os.system("twine upload dist/*") - - sys.exit() - - -# Where the magic happens: -setup( - name=NAME, - version=about["__version__"], - description=about["__description__"], - long_description=long_description, - author=about["__author__"], - author_email=about["__author_email__"], - url=about["__url__"], - packages=find_packages(exclude=("tests",)), - entry_points={"console_scripts": ["eeweather=eeweather.cli:cli"]}, - install_requires=REQUIRED, - include_package_data=True, - license=about["__license__"], - classifiers=[ - "License :: OSI Approved :: Apache Software License", - "Programming Language :: Python", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.4", - "Programming Language :: Python :: 3.5", - "Programming Language :: Python :: 3.6", - ], - # $ setup.py publish support. - cmdclass={"upload": UploadCommand}, -) diff --git a/tox.ini b/tox.ini index f15748c..88421b4 100644 --- a/tox.ini +++ b/tox.ini @@ -1,10 +1,17 @@ [tox] -envlist = py{35,36,37,310} +envlist = 3.{10, 11, 12, 13, 14} [testenv] -passenv = HOME +package = editable +deps = + pytest + pytest-cov + pytest-xdist + syrupy>=5,<6 commands = - pip install -r requirements.txt - pip install funcsigs pathlib2 - pip install -e . - py.test -n0 {posargs} + pytest tests/ + +[testenv:coverage] +# Runs serially: the tracer can't attach to xdist workers. +commands = + pytest tests/ -p no:xdist --cov=eeweather --cov-report=term-missing --cov-report=xml From b201634964ec4f8077e64b97a2c8b38d980d7439 Mon Sep 17 00:00:00 2001 From: Travis Sikes <124101151+travis-recurve@users.noreply.github.com> Date: Tue, 14 Jul 2026 18:25:04 -0500 Subject: [PATCH 2/8] Rewrite key-value cache on stdlib sqlite3, dropping sqlalchemy - KeyValueStore keeps its public interface; urls remain sqlite:///path form, non-sqlite urls now raise ValueError - updated timestamps stored as UTC ISO strings, returned tz-aware - delete get_datetime_if_exists/is_tz_naive helpers - tests backdate cache entries via sqlite3 instead of sqlalchemy sessions Signed-off-by: Travis Sikes <124101151+travis-recurve@users.noreply.github.com> --- eeweather/cache.py | 148 ++++++++++++++++++----------------------- tests/test_cache.py | 20 ++---- tests/test_stations.py | 70 ++++++------------- 3 files changed, 91 insertions(+), 147 deletions(-) diff --git a/eeweather/cache.py b/eeweather/cache.py index 491a58b..c3620e7 100644 --- a/eeweather/cache.py +++ b/eeweather/cache.py @@ -17,47 +17,37 @@ limitations under the License. """ -import os +import datetime import json +import os +import sqlite3 -try: - from sqlalchemy import ( - create_engine, - MetaData, - Table, - Column, - String, - DateTime, - ) - from sqlalchemy.orm import Session - from sqlalchemy.sql import select, func - from sqlalchemy.exc import IntegrityError -except ImportError: # pragma: no cover - has_sqlalchemy = False -else: - has_sqlalchemy = True import pytz -def get_datetime_if_exists(data): - if data is None: - return None - else: - dt = data[0] - if is_tz_naive(dt): - return pytz.UTC.localize(data[0]) - else: - return dt +SQLITE_URL_PREFIX = "sqlite:///" + + +def _sqlite_path_from_url(url): + if not url.startswith(SQLITE_URL_PREFIX): + raise ValueError( + "EEweather cache urls must have the form sqlite:///path/to/cache.db," + " got: {}".format(url) + ) -def is_tz_naive(dt): - return dt.tzinfo is None or dt.tzinfo.utcoffset(dt) is None + return url[len(SQLITE_URL_PREFIX) :] class KeyValueStore(object): + """JSON key-value store on a local sqlite database. + + The database location is taken from the url argument, the + EEWEATHER_CACHE_URL environment variable, or ~/.eeweather/cache.db, + in that order. Urls have the form sqlite:///path/to/cache.db. + """ + def __init__(self, url=None): - if not has_sqlalchemy: # pragma: no cover - raise ImportError("KeyValueStore requires sqlalchemy.") self._prepare_db(url) def __repr__(self): @@ -70,76 +60,68 @@ def _get_url(self): # pragma: no cover (tests always provide url) if not os.path.exists(directory): os.makedirs(directory) url = "sqlite:///{}/cache.db".format(directory) + return url def _prepare_db(self, url=None): - # set url if url is None: # pragma: no cover (tests always provide url) url = self._get_url() self.url = url - self.eng = create_engine(url) - metadata = MetaData() - - tbl_items = Table( - "items", - metadata, - Column("key", String, unique=True, index=True), # arbitrary unique key - Column("data", String), # arbitrary json - Column("updated", DateTime(timezone=True)), # time of last transaction - ) - - # only create if not already created - tbl_items.create(checkfirst=True, bind=self.eng) + self._path = _sqlite_path_from_url(url) + with self._connect() as conn: + conn.execute( + "create table if not exists items (" + " key text unique," + " data text," + " updated text)" + ) + conn.execute("create index if not exists ix_items_key on items (key)") - self.items = tbl_items + def _connect(self): + return sqlite3.connect(self._path) def key_exists(self, key): - s = select(self.items.c.key).where(self.items.c.key == key) - with Session(self.eng) as session: - result = session.execute(s) - return result.fetchone() is not None + with self._connect() as conn: + row = conn.execute("select 1 from items where key = ?", (key,)).fetchone() + + return row is not None def save_json(self, key, data): data = json.dumps(data, separators=(",", ":")) - updated = func.now() - try: - s = self.items.insert().values(key=key, data=data, updated=updated) - with Session(self.eng) as session: - session.execute(s) - session.commit() - except IntegrityError: - s = ( - self.items.update() - .where(self.items.c.key == key) - .values(key=key, data=data, updated=updated) + updated = datetime.datetime.now(pytz.UTC).isoformat() + with self._connect() as conn: + conn.execute( + "insert into items (key, data, updated) values (?, ?, ?)" + " on conflict (key) do update set data = ?, updated = ?", + (key, data, updated, data, updated), ) - with Session(self.eng) as session: - session.execute(s) - session.commit() def retrieve_json(self, key): - s = select(self.items.c.data).where(self.items.c.key == key) - with Session(self.eng) as session: - result = session.execute(s) - data = result.fetchone() - if data is None: - return None - else: - return json.loads(data[0]) + with self._connect() as conn: + row = conn.execute( + "select data from items where key = ?", (key,) + ).fetchone() + + if row is None: + return None + + return json.loads(row[0]) def key_updated(self, key): - s = select(self.items.c.updated).where(self.items.c.key == key) - with Session(self.eng) as session: - result = session.execute(s) - data = result.fetchone() - return get_datetime_if_exists(data) + with self._connect() as conn: + row = conn.execute( + "select updated from items where key = ?", (key,) + ).fetchone() + + if row is None: + return None + + return datetime.datetime.fromisoformat(row[0]) def clear(self, key=None): - if key is None: - s = self.items.delete() - else: - s = self.items.delete().where(self.items.c.key == key) - with Session(self.eng) as session: - session.execute(s) - session.commit() + with self._connect() as conn: + if key is None: + conn.execute("delete from items") + else: + conn.execute("delete from items where key = ?", (key,)) diff --git a/tests/test_cache.py b/tests/test_cache.py index 404ee62..4de5633 100644 --- a/tests/test_cache.py +++ b/tests/test_cache.py @@ -18,14 +18,14 @@ """ import tempfile -from eeweather.cache import KeyValueStore, get_datetime_if_exists +from eeweather.cache import KeyValueStore from datetime import datetime from datetime import UTC -import pytz import pytest + @pytest.fixture def s(): return KeyValueStore("sqlite:///{}/cache.db".format(tempfile.mkdtemp())) @@ -46,6 +46,7 @@ def test_key_value_store(s): assert data["b"][1] == "two" assert data["b"][2] == 3.0 dt1 = s.key_updated("a") + assert dt1.tzinfo is not None assert dt1.date() == datetime.now(UTC).date() # update key 'a' @@ -73,15 +74,6 @@ def test_key_value_store_clear_single_key(s): assert s.key_exists("b") is False -def test_get_datetime_if_exists(s): - data = None - result = get_datetime_if_exists(data) - assert result == None - - data = [datetime(2018, 1, 1)] - result = get_datetime_if_exists(data) - assert result == pytz.utc.localize(datetime(2018, 1, 1)) - - data = [pytz.utc.localize(datetime(2018, 1, 1))] - result = get_datetime_if_exists(data) - assert result == pytz.utc.localize(datetime(2018, 1, 1)) +def test_key_value_store_rejects_non_sqlite_url(): + with pytest.raises(ValueError, match="sqlite:///"): + KeyValueStore("postgresql://user@host/db") diff --git a/tests/test_stations.py b/tests/test_stations.py index ca16790..b13301b 100644 --- a/tests/test_stations.py +++ b/tests/test_stations.py @@ -20,6 +20,7 @@ from datetime import datetime import pandas as pd import pytest +import sqlite3 import pytz from eeweather import ( @@ -105,7 +106,6 @@ ) import eeweather.testing -from sqlalchemy.orm import Session @pytest.fixture @@ -151,6 +151,13 @@ def monkeypatch_make_api_request_v2(monkeypatch): ) + +def _backdate_cache_key(store, key, updated): + with sqlite3.connect(store._path) as conn: + conn.execute( + "update items set updated = ? where key = ?", (updated.isoformat(), key) + ) + def test_get_isd_station_metadata(): assert get_isd_station_metadata("722874") == { "ba_climate_zone": "Hot-Dry", @@ -679,15 +686,9 @@ def test_cached_isd_hourly_temp_data_is_expired_true( # manually expire key value item key = get_isd_hourly_temp_data_cache_key("722874", 2007) - store = monkeypatch_key_value_store - s = ( - store.items.update() - .where(store.items.c.key == key) - .values(updated=pytz.UTC.localize(datetime(2007, 3, 3))) + _backdate_cache_key( + monkeypatch_key_value_store, key, pytz.UTC.localize(datetime(2007, 3, 3)) ) - with Session(store.eng) as session: - session.execute(s) - session.commit() assert cached_isd_hourly_temp_data_is_expired("722874", 2007) is True @@ -699,15 +700,9 @@ def test_cached_isd_daily_temp_data_is_expired_true( # manually expire key value item key = get_isd_daily_temp_data_cache_key("722874", 2007) - store = monkeypatch_key_value_store - s = ( - store.items.update() - .where(store.items.c.key == key) - .values(updated=pytz.UTC.localize(datetime(2007, 3, 3))) + _backdate_cache_key( + monkeypatch_key_value_store, key, pytz.UTC.localize(datetime(2007, 3, 3)) ) - with Session(store.eng) as session: - session.execute(s) - session.commit() assert cached_isd_daily_temp_data_is_expired("722874", 2007) is True @@ -719,15 +714,9 @@ def test_cached_gsod_daily_temp_data_is_expired_true( # manually expire key value item key = get_gsod_daily_temp_data_cache_key("722874", 2007) - store = monkeypatch_key_value_store - s = ( - store.items.update() - .where(store.items.c.key == key) - .values(updated=pytz.UTC.localize(datetime(2007, 3, 3))) + _backdate_cache_key( + monkeypatch_key_value_store, key, pytz.UTC.localize(datetime(2007, 3, 3)) ) - with Session(store.eng) as session: - session.execute(s) - session.commit() assert cached_gsod_daily_temp_data_is_expired("722874", 2007) is True @@ -869,15 +858,9 @@ def test_validate_isd_hourly_temp_data_cache_expired( # manually expire key value item key = get_isd_hourly_temp_data_cache_key("722874", 2007) - store = monkeypatch_key_value_store - s = ( - store.items.update() - .where(store.items.c.key == key) - .values(updated=pytz.UTC.localize(datetime(2007, 3, 3))) + _backdate_cache_key( + monkeypatch_key_value_store, key, pytz.UTC.localize(datetime(2007, 3, 3)) ) - with Session(store.eng) as session: - session.execute(s) - session.commit() assert validate_isd_hourly_temp_data_cache("722874", 2007) is False @@ -889,15 +872,9 @@ def test_validate_isd_daily_temp_data_cache_expired( # manually expire key value item key = get_isd_daily_temp_data_cache_key("722874", 2007) - store = monkeypatch_key_value_store - s = ( - store.items.update() - .where(store.items.c.key == key) - .values(updated=pytz.UTC.localize(datetime(2007, 3, 3))) + _backdate_cache_key( + monkeypatch_key_value_store, key, pytz.UTC.localize(datetime(2007, 3, 3)) ) - with Session(store.eng) as session: - session.execute(s) - session.commit() assert validate_isd_daily_temp_data_cache("722874", 2007) is False @@ -909,17 +886,10 @@ def test_validate_gsod_daily_temp_data_cache_expired( # manually expire key value item key = get_gsod_daily_temp_data_cache_key("722874", 2007) - store = monkeypatch_key_value_store - s = ( - store.items.update() - .where(store.items.c.key == key) - .values(updated=pytz.UTC.localize(datetime(2007, 3, 3))) + _backdate_cache_key( + monkeypatch_key_value_store, key, pytz.UTC.localize(datetime(2007, 3, 3)) ) - with Session(store.eng) as session: - session.execute(s) - session.commit() - assert validate_gsod_daily_temp_data_cache("722874", 2007) is False From c4230fd052b869412b45d40acf655a167e88fe50 Mon Sep 17 00:00:00 2001 From: Travis Sikes <124101151+travis-recurve@users.noreply.github.com> Date: Tue, 14 Jul 2026 18:27:31 -0500 Subject: [PATCH 3/8] Fix modern-environment breakage in testing helpers, CLI test, and access_api - pkg_resources (removed in setuptools >=81) replaced with importlib.resources - CLI test invokes --help explicitly (click >=8.2 exits 2 on bare group) - retry dependency replaced with an explicit request retry loop - attrs dependency replaced with stdlib dataclass - DatasetType.ISD value fixed from 'IDS' to 'ISD' Signed-off-by: Travis Sikes <124101151+travis-recurve@users.noreply.github.com> --- eeweather/access_api.py | 36 +++++++++++++++------- eeweather/testing.py | 67 +++++++++++++++++++++++++---------------- pyproject.toml | 2 -- tests/test_cli.py | 3 +- 4 files changed, 68 insertions(+), 40 deletions(-) diff --git a/eeweather/access_api.py b/eeweather/access_api.py index 7675fec..5a07bde 100644 --- a/eeweather/access_api.py +++ b/eeweather/access_api.py @@ -24,17 +24,21 @@ import csv import io -import attrs +from dataclasses import dataclass + import requests -import retry + + + +API_REQUEST_TRIES = 3 class DatasetType: - ISD = "IDS" + ISD = "ISD" GSOD = "GSOD" -@attrs.define +@dataclass class FileParseResult: """ contains information about file that will be useful @@ -95,10 +99,12 @@ def from_file_path(cls, file_path: str): usaf_id, wban_id, year = file_name_dash_split year = int(year) - return FileParseResult( + result = FileParseResult( dataset_type=dataset_type, usaf_id=usaf_id, wban_id=wban_id, year=year ) + return result + def _get_api_request_params(dataset_type: str, usaf_id: str, wban_id: str, year: int): params = {} @@ -123,7 +129,6 @@ def _get_api_request_params(dataset_type: str, usaf_id: str, wban_id: str, year: return params -@retry.retry(tries=3) def make_api_request( dataset_type: str, usaf_id: str, wban_id: str, year: int ) -> list[tuple[datetime.datetime, float]]: @@ -131,6 +136,9 @@ def make_api_request( makes api request to the access api when given the necessary information about the weather station to fetch data for. + the request is retried on connection and http errors, as the api has been + shown to intermittently fail. + returns a list of tuples where the first element is the datetime and the second is the temperature that the datetime refers to """ @@ -138,11 +146,17 @@ def make_api_request( dataset_type=dataset_type, usaf_id=usaf_id, wban_id=wban_id, year=year ) - resp = requests.get( - url="https://www.ncei.noaa.gov/access/services/data/v1", params=params - ) - - resp.raise_for_status() + for attempt in range(API_REQUEST_TRIES): + try: + resp = requests.get( + url="https://www.ncei.noaa.gov/access/services/data/v1", params=params + ) + resp.raise_for_status() + except requests.RequestException: + if attempt == API_REQUEST_TRIES - 1: + raise + else: + break csv_data = io.StringIO(resp.text) dict_reader = csv.DictReader(csv_data) diff --git a/eeweather/testing.py b/eeweather/testing.py index 1fc2486..dd2d02a 100644 --- a/eeweather/testing.py +++ b/eeweather/testing.py @@ -20,8 +20,8 @@ import datetime import pytz +from importlib.resources import files from io import BytesIO -import pkg_resources import re import tempfile @@ -29,41 +29,37 @@ from eeweather.cache import KeyValueStore + +def _resource_bytes(name): + return files("eeweather.resources").joinpath(name).read_bytes() + + def write_isd_file(bytes_string): - with pkg_resources.resource_stream("eeweather.resources", "ISD.gz") as f: - bytes_string.write(f.read()) + bytes_string.write(_resource_bytes("ISD.gz")) def write_tmy3_file(): - data = pkg_resources.resource_string("eeweather.resources", "722880TYA.CSV") - return data.decode("ascii") + return _resource_bytes("722880TYA.CSV").decode("ascii") def write_cz2010_file(): - data = pkg_resources.resource_string("eeweather.resources", "722880_CZ2010.CSV") - return data.decode("ascii") + return _resource_bytes("722880_CZ2010.CSV").decode("ascii") def write_missing_isd_file(bytes_string): - with pkg_resources.resource_stream("eeweather.resources", "ISD-MISSING.gz") as f: - bytes_string.write(f.read()) + bytes_string.write(_resource_bytes("ISD-MISSING.gz")) def write_nan_isd_file(bytes_string): - with pkg_resources.resource_stream("eeweather.resources", "ISD-NAN.gz") as f: - bytes_string.write(f.read()) + bytes_string.write(_resource_bytes("ISD-NAN.gz")) def write_gsod_file(bytes_string): - with pkg_resources.resource_stream("eeweather.resources", "GSOD.op.gz") as f: - bytes_string.write(f.read()) + bytes_string.write(_resource_bytes("GSOD.op.gz")) def write_missing_gsod_file(bytes_string): - with pkg_resources.resource_stream( - "eeweather.resources", "GSOD-MISSING.op.gz" - ) as f: - bytes_string.write(f.read()) + bytes_string.write(_resource_bytes("GSOD-MISSING.op.gz")) def mock_request_text_tmy3(url): @@ -98,6 +94,7 @@ def read_file_as_bytes(self, filename): write_missing_gsod_file(bytes_string) bytes_string.seek(0) + return bytes_string @@ -116,38 +113,56 @@ def get_store(self): def monkey_patch_make_api_request_return_empty( dataset_type: str, usaf_id: str, wban_id: str, year: int ): - if usaf_id == "722874" and year == 2006 and dataset_type == "GSOD": - return [(datetime.datetime(2006, 1, 4, 0, 0, 0, tzinfo=pytz.UTC), float("nan"))] + single_nan_day = ( + datetime.datetime(2006, 1, 4, 0, 0, 0, tzinfo=pytz.UTC), + float("nan"), + ) + + return [single_nan_day] if usaf_id == "722874" and year == 2006: return [] if usaf_id == "722874" and year == 2005: - return [(datetime.datetime(2005, 1, 1, 0, 0, 0), float("nan"))] + single_naive_nan_day = (datetime.datetime(2005, 1, 1, 0, 0, 0), float("nan")) + + return [single_naive_nan_day] - return _original_make_api_request( + result = _original_make_api_request( dataset_type=dataset_type, usaf_id=usaf_id, wban_id=wban_id, year=year ) + return result + def monkey_patch_make_api_request_return_empty_v2( dataset_type: str, usaf_id: str, wban_id: str, year: int ): - if usaf_id == "722874" and year == 2006: - return [(datetime.datetime(2006, 1, 4, 0, 0, 0, tzinfo=pytz.UTC), float("nan"))] + single_nan_day = ( + datetime.datetime(2006, 1, 4, 0, 0, 0, tzinfo=pytz.UTC), + float("nan"), + ) + + return [single_nan_day] if usaf_id == "722874" and year == 2005: - return [(datetime.datetime(2005, 1, 1, 0, 0, 0), float("nan"))] + single_naive_nan_day = (datetime.datetime(2005, 1, 1, 0, 0, 0), float("nan")) + + return [single_naive_nan_day] if usaf_id == "994035": start_date = datetime.datetime(2013, 1, 1, 0, 0, 0) - return [ + nan_hours = [ (start_date + datetime.timedelta(hours=1) * i, float("nan")) for i in range(8611) ] - return _original_make_api_request( + return nan_hours + + result = _original_make_api_request( dataset_type=dataset_type, usaf_id=usaf_id, wban_id=wban_id, year=year ) + + return result diff --git a/pyproject.toml b/pyproject.toml index 35d77cc..64a382e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,13 +20,11 @@ classifiers = [ ] dependencies = [ - "attrs", "click", "pandas>=1.0.0", "pyproj>=1.9.6", "pytz", "requests", - "retry", "shapely", ] diff --git a/tests/test_cli.py b/tests/test_cli.py index bb0d9f9..94a5a8c 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -30,10 +30,11 @@ ) + def test_eeweather_cli(): runner = CliRunner() - result = runner.invoke(cli) + result = runner.invoke(cli, ["--help"]) assert result.exit_code == 0 assert len(result.output) > 100 From 46db05c19a3314590cfc7ab27483522e5a32f050 Mon Sep 17 00:00:00 2001 From: Travis Sikes <124101151+travis-recurve@users.noreply.github.com> Date: Tue, 14 Jul 2026 18:31:20 -0500 Subject: [PATCH 4/8] Warn on data gaps in load results and fix missing-year handling - hourly/daily/gsod loaders emit warnings when returned data is empty, ends more than a day before the requested end, or has an internal gap over 7 days - all-years-missing tolerant path returns a NaN series over the requested range instead of crashing on pd.concat of an empty list - loaders now always cover the full requested range, including when the data slice is empty - error_on_missing_years added to daily/gsod loaders and defaulted True everywhere, matching the ISDStation method default Signed-off-by: Travis Sikes <124101151+travis-recurve@users.noreply.github.com> --- eeweather/stations.py | 278 +++++++++++++++++++++++++++++++----------- 1 file changed, 206 insertions(+), 72 deletions(-) diff --git a/eeweather/stations.py b/eeweather/stations.py index 93bf6cf..741f0c8 100644 --- a/eeweather/stations.py +++ b/eeweather/stations.py @@ -19,6 +19,8 @@ """ from datetime import datetime, timedelta, timezone import gzip +import warnings as pywarnings + import pandas as pd import pytz @@ -115,6 +117,73 @@ def _datetime_is_utc(dt): return False if orig_tzinfo is None else dt.utcoffset().seconds == 0 +TRAILING_GAP_WARNING_THRESHOLD = timedelta(days=1) +INTERNAL_GAP_WARNING_THRESHOLD = timedelta(days=7) + + +def _data_gap_warnings(ts): + """EEWeatherWarnings for requested ranges the returned data does not cover. + + Emitted when the series is entirely empty, when it ends more than + TRAILING_GAP_WARNING_THRESHOLD before the end of the requested range, or + when it contains an internal gap longer than INTERNAL_GAP_WARNING_THRESHOLD. + """ + warnings = [] + if len(ts) == 0: + return warnings + + if ts.isna().all(): + warnings.append( + EEWeatherWarning( + qualified_name="eeweather.no_data_in_requested_range", + description="No data was available within the requested range.", + data={ + "requested_start": ts.index[0].isoformat(), + "requested_end": ts.index[-1].isoformat(), + }, + ) + ) + + return warnings + + last_valid = ts.last_valid_index() + trailing_gap = ts.index[-1] - last_valid + if trailing_gap > TRAILING_GAP_WARNING_THRESHOLD: + warnings.append( + EEWeatherWarning( + qualified_name="eeweather.data_truncated", + description=( + "Data ends {} before the end of the requested range.".format( + trailing_gap + ) + ), + data={ + "last_valid": last_valid.isoformat(), + "requested_end": ts.index[-1].isoformat(), + }, + ) + ) + + interior = ts.loc[ts.first_valid_index() : last_valid] + if len(interior) > 1: + period = interior.index[1] - interior.index[0] + is_missing = interior.isna() + max_gap_periods = int(is_missing.groupby((~is_missing).cumsum()).sum().max()) + max_gap = max_gap_periods * period + if max_gap > INTERNAL_GAP_WARNING_THRESHOLD: + warnings.append( + EEWeatherWarning( + qualified_name="eeweather.data_gap", + description=( + "Data contains an internal gap of {}.".format(max_gap) + ), + data={"max_gap_days": max_gap / timedelta(days=1)}, + ) + ) + + return warnings + + def get_isd_filenames(usaf_id, target_year=None, filename_format=None, with_host=False): valid_usaf_id_or_raise(usaf_id) if filename_format is None: @@ -864,7 +933,7 @@ def load_isd_hourly_temp_data( end, read_from_cache=True, write_to_cache=True, - error_on_missing_years=False, + error_on_missing_years=True, fetch_from_web=True, ): warnings = [] @@ -894,7 +963,6 @@ def load_isd_hourly_temp_data( data={"year": year}, ) ) - pass else: data = [ load_isd_hourly_temp_data_cached_proxy( @@ -907,99 +975,145 @@ def load_isd_hourly_temp_data( for year in range(start.year, end.year + 1) ] - # get raw data from loaded years into hourly form - ts = pd.concat(data).resample("h").mean() + if data: + # get raw data from loaded years into hourly form + ts = pd.concat(data).resample("h").mean() - # whittle down to desired range - ts = ts[start:end] + # whittle down to desired range + ts = ts[start:end] + else: + ts = pd.Series([], dtype=float, index=pd.DatetimeIndex([], tz=pytz.UTC)) + + # because start and end dates need to fall exactly on hours + ts_start = datetime(start.year, start.month, start.day, start.hour, tzinfo=pytz.UTC) + # add an hour if not already exactly on an hour, which guarantees + # that ts_start is greater than or equal to start. + if ts_start < start: + ts_start += timedelta(seconds=3600) + ts_end = datetime(end.year, end.month, end.day, end.hour, tzinfo=pytz.UTC) + + # fill in gaps, covering the full requested range even when no data loaded + ts = ts.reindex(pd.date_range(ts_start, ts_end, freq="h", tz=pytz.UTC)) + warnings.extend(_data_gap_warnings(ts)) - if len(ts) > 0: - # because start and end dates need.to fall exactly on hours - ts_start = datetime( - start.year, start.month, start.day, start.hour, tzinfo=pytz.UTC - ) - # add an hour if not already exactly on an hour, which guarantees - # that ts_start is greater than or equal to start. - if ts_start < start: - ts_start += timedelta(seconds=3600) - ts_end = datetime(end.year, end.month, end.day, end.hour, tzinfo=pytz.UTC) - # fill in gaps - ts = ts.reindex(pd.date_range(ts_start, ts_end, freq="h", tz=pytz.UTC)) return ts, warnings def load_isd_daily_temp_data( - usaf_id, start, end, read_from_cache=True, write_to_cache=True, fetch_from_web=True + usaf_id, + start, + end, + read_from_cache=True, + write_to_cache=True, + error_on_missing_years=True, + fetch_from_web=True, ): # CalTRACK 2.3.3 if start.tzinfo != pytz.UTC: raise NonUTCTimezoneInfoError(start) if end.tzinfo != pytz.UTC: raise NonUTCTimezoneInfoError(end) - data = [ - load_isd_daily_temp_data_cached_proxy( - usaf_id, - year, - read_from_cache=read_from_cache, - write_to_cache=write_to_cache, - fetch_from_web=fetch_from_web, - ) - for year in range(start.year, end.year + 1) - ] - # get raw data - ts = pd.concat(data).resample("D").mean() + data = [] + for year in range(start.year, end.year + 1): + try: + data.append( + load_isd_daily_temp_data_cached_proxy( + usaf_id, + year, + read_from_cache=read_from_cache, + write_to_cache=write_to_cache, + fetch_from_web=fetch_from_web, + ) + ) + except ISDDataNotAvailableError: + if error_on_missing_years: + raise + pywarnings.warn( + "eeweather: ISD data not available for {} in {}".format(usaf_id, year) + ) - # whittle down - ts = ts[start:end] + if data: + # get raw data + ts = pd.concat(data).resample("D").mean() + + # whittle down + ts = ts[start:end] + else: + ts = pd.Series([], dtype=float, index=pd.DatetimeIndex([], tz=pytz.UTC)) + + # because start and end dates need to fall exactly on days + ts_start = datetime(start.year, start.month, start.day, tzinfo=pytz.UTC) + # add a day if not already exactly on a day, which guarantees + # that ts_start is greater than or equal to start. + if ts_start < start: + ts_start += timedelta(days=1) + ts_end = datetime(end.year, end.month, end.day, tzinfo=pytz.UTC) + + # fill in gaps, covering the full requested range even when no data loaded + ts = ts.reindex(pd.date_range(ts_start, ts_end, freq="D", tz=pytz.UTC)) + for warning in _data_gap_warnings(ts): + pywarnings.warn("eeweather: {}".format(warning.description)) - if len(ts) > 0: - # because start and end dates need.to fall exactly on days - ts_start = datetime(start.year, start.month, start.day, tzinfo=pytz.UTC) - # add a day if not already exactly on a day, which guarantees - # that ts_start is greater than or equal to start. - if ts_start < start: - ts_start += timedelta(days=1) - ts_end = datetime(end.year, end.month, end.day, tzinfo=pytz.UTC) - # fill in gaps - ts = ts.reindex(pd.date_range(ts_start, ts_end, freq="D", tz=pytz.UTC)) return ts def load_gsod_daily_temp_data( - usaf_id, start, end, read_from_cache=True, write_to_cache=True, fetch_from_web=True + usaf_id, + start, + end, + read_from_cache=True, + write_to_cache=True, + error_on_missing_years=True, + fetch_from_web=True, ): # CalTRACK 2.3.3 if start.tzinfo != pytz.UTC: raise NonUTCTimezoneInfoError(start) if end.tzinfo != pytz.UTC: raise NonUTCTimezoneInfoError(end) - data = [ - load_gsod_daily_temp_data_cached_proxy( - usaf_id, - year, - read_from_cache=read_from_cache, - write_to_cache=write_to_cache, - fetch_from_web=fetch_from_web, - ) - for year in range(start.year, end.year + 1) - ] - # get raw data - ts = pd.concat(data).resample("D").mean() - # whittle down - ts = ts[start:end] + data = [] + for year in range(start.year, end.year + 1): + try: + data.append( + load_gsod_daily_temp_data_cached_proxy( + usaf_id, + year, + read_from_cache=read_from_cache, + write_to_cache=write_to_cache, + fetch_from_web=fetch_from_web, + ) + ) + except GSODDataNotAvailableError: + if error_on_missing_years: + raise + pywarnings.warn( + "eeweather: GSOD data not available for {} in {}".format(usaf_id, year) + ) + + if data: + # get raw data + ts = pd.concat(data).resample("D").mean() + + # whittle down + ts = ts[start:end] + else: + ts = pd.Series([], dtype=float, index=pd.DatetimeIndex([], tz=pytz.UTC)) + + # because start and end dates need to fall exactly on days + ts_start = datetime(start.year, start.month, start.day, tzinfo=pytz.UTC) + # add a day if not already exactly on a day, which guarantees + # that ts_start is greater than or equal to start. + if ts_start < start: + ts_start += timedelta(days=1) + ts_end = datetime(end.year, end.month, end.day, tzinfo=pytz.UTC) + + # fill in gaps, covering the full requested range even when no data loaded + ts = ts.reindex(pd.date_range(ts_start, ts_end, freq="D", tz=pytz.UTC)) + for warning in _data_gap_warnings(ts): + pywarnings.warn("eeweather: {}".format(warning.description)) - if len(ts) > 0: - # because start and end dates need.to fall exactly on days - ts_start = datetime(start.year, start.month, start.day, tzinfo=pytz.UTC) - # add a day if not already exactly on a day, which guarantees - # that ts_start is greater than or equal to start. - if ts_start < start: - ts_start += timedelta(days=1) - ts_end = datetime(end.year, end.month, end.day, tzinfo=pytz.UTC) - # fill in gaps - ts = ts.reindex(pd.date_range(ts_start, ts_end, freq="D", tz=pytz.UTC)) return ts @@ -1509,7 +1623,13 @@ def load_isd_hourly_temp_data( ) def load_isd_daily_temp_data( - self, start, end, read_from_cache=True, write_to_cache=True, fetch_from_web=True + self, + start, + end, + read_from_cache=True, + write_to_cache=True, + fetch_from_web=True, + error_on_missing_years=True, ): """Load resampled daily ISD temperature data from start date to end date (inclusive). @@ -1524,9 +1644,12 @@ def load_isd_daily_temp_data( read_from_cache : bool Whether or not to load data from cache. fetch_from_web : bool - Whether or not to fetch data from ftp. + Whether or not to fetch data from the web. write_to_cache : bool Whether or not to write newly loaded data to cache. + error_on_missing_years : bool + Whether to raise when data is unavailable for a year in the range, + or to warn and fill that year with NaN. """ return load_isd_daily_temp_data( self.usaf_id, @@ -1535,10 +1658,17 @@ def load_isd_daily_temp_data( read_from_cache=read_from_cache, write_to_cache=write_to_cache, fetch_from_web=fetch_from_web, + error_on_missing_years=error_on_missing_years, ) def load_gsod_daily_temp_data( - self, start, end, read_from_cache=True, write_to_cache=True, fetch_from_web=True + self, + start, + end, + read_from_cache=True, + write_to_cache=True, + fetch_from_web=True, + error_on_missing_years=True, ): """Load resampled daily GSOD temperature data from start date to end date (inclusive). @@ -1555,7 +1685,10 @@ def load_gsod_daily_temp_data( write_to_cache : bool Whether or not to write newly loaded data to cache. fetch_from_web : bool - Whether or not to fetch data from ftp. + Whether or not to fetch data from the web. + error_on_missing_years : bool + Whether to raise when data is unavailable for a year in the range, + or to warn and fill that year with NaN. """ return load_gsod_daily_temp_data( self.usaf_id, @@ -1564,6 +1697,7 @@ def load_gsod_daily_temp_data( read_from_cache=read_from_cache, write_to_cache=write_to_cache, fetch_from_web=fetch_from_web, + error_on_missing_years=error_on_missing_years, ) def load_tmy3_hourly_temp_data( From 0acaede48e24d4f06d496d67e9fd94720b36465b Mon Sep 17 00:00:00 2001 From: Travis Sikes <124101151+travis-recurve@users.noreply.github.com> Date: Tue, 14 Jul 2026 18:38:17 -0500 Subject: [PATCH 5/8] Serve captured access-api payloads in tests via transport-level mock - tests/fixtures holds real recorded NCEI responses (gzipped) for station 722874, years 1800/2005/2006/2007/2050, both datasets - mock_api_transport fixture intercepts requests.get and serves fixtures; unmatched requests fail the test rather than reaching the network - replaces the FTP-proxy mock, which no longer intercepted the api fetch path and let tests reach the live api - make_api_request monkeypatch fixtures depend on the transport mock so delegated calls also stay offline Signed-off-by: Travis Sikes <124101151+travis-recurve@users.noreply.github.com> --- tests/conftest.py | 68 ++++++++++++ .../global-hourly_72287493134_1800.csv.gz | Bin 0 -> 121 bytes .../global-hourly_72287493134_2005.csv.gz | Bin 0 -> 48002 bytes .../global-hourly_72287493134_2006.csv.gz | Bin 0 -> 46229 bytes .../global-hourly_72287493134_2007.csv.gz | Bin 0 -> 45021 bytes .../global-hourly_72287493134_2050.csv.gz | Bin 0 -> 121 bytes ...summary-of-the-day_72287493134_1800.csv.gz | Bin 0 -> 89 bytes ...summary-of-the-day_72287493134_2005.csv.gz | Bin 0 -> 1756 bytes ...summary-of-the-day_72287493134_2006.csv.gz | Bin 0 -> 1793 bytes ...summary-of-the-day_72287493134_2007.csv.gz | Bin 0 -> 1777 bytes ...summary-of-the-day_72287493134_2050.csv.gz | Bin 0 -> 89 bytes tests/test_stations.py | 103 ++++++++---------- 12 files changed, 116 insertions(+), 55 deletions(-) create mode 100644 tests/conftest.py create mode 100644 tests/fixtures/global-hourly_72287493134_1800.csv.gz create mode 100644 tests/fixtures/global-hourly_72287493134_2005.csv.gz create mode 100644 tests/fixtures/global-hourly_72287493134_2006.csv.gz create mode 100644 tests/fixtures/global-hourly_72287493134_2007.csv.gz create mode 100644 tests/fixtures/global-hourly_72287493134_2050.csv.gz create mode 100644 tests/fixtures/global-summary-of-the-day_72287493134_1800.csv.gz create mode 100644 tests/fixtures/global-summary-of-the-day_72287493134_2005.csv.gz create mode 100644 tests/fixtures/global-summary-of-the-day_72287493134_2006.csv.gz create mode 100644 tests/fixtures/global-summary-of-the-day_72287493134_2007.csv.gz create mode 100644 tests/fixtures/global-summary-of-the-day_72287493134_2050.csv.gz diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..14a80a1 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" + +Copyright 2018-2023 OpenEEmeter contributors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +""" +import gzip + +from pathlib import Path + +import pytest + + + +FIXTURE_DIR = Path(__file__).parent / "fixtures" + +ACCESS_API_URL = "https://www.ncei.noaa.gov/access/services/data/v1" + + +class MockAccessAPIResponse: + def __init__(self, text): + self.text = text + + def raise_for_status(self): + pass + + +@pytest.fixture +def mock_api_transport(monkeypatch): + """Serve captured NCEI access api payloads for all api requests. + + Fixture files are real responses recorded from the api, named + {dataset}_{station}_{year}.csv.gz. A request with no matching fixture + fails the test; no request reaches the network. + """ + + def mock_get(url, params=None, **kwargs): + assert url == ACCESS_API_URL, "unexpected url: {}".format(url) + name = "{}_{}_{}.csv.gz".format( + params["dataset"], params["stations"], params["startDate"][:4] + ) + path = FIXTURE_DIR / name + if not path.exists(): + raise AssertionError( + "no captured fixture for {}; tests must not hit the network".format( + name + ) + ) + + with gzip.open(path, "rb") as f: + text = f.read().decode() + + return MockAccessAPIResponse(text) + + monkeypatch.setattr("eeweather.access_api.requests.get", mock_get) diff --git a/tests/fixtures/global-hourly_72287493134_1800.csv.gz b/tests/fixtures/global-hourly_72287493134_1800.csv.gz new file mode 100644 index 0000000000000000000000000000000000000000..60ff10eac1e990d40f8fa6b2fbc7a472873210ee GIT binary patch literal 121 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%0D_h(ojhK;Hxat@Y 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

^n;A*E@% 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 Nts(k+;%R=a{{!Fd8FK&t literal 0 HcmV?d00001 diff --git a/tests/fixtures/global-hourly_72287493134_2050.csv.gz b/tests/fixtures/global-hourly_72287493134_2050.csv.gz new file mode 100644 index 0000000000000000000000000000000000000000..3fa97ef7a91b3ada9024b0e19ec2311165f7449b GIT binary patch literal 121 zcmV-<0EYh`iwFqW$5v_r|7UD(Vqt78Xm53LY)@ z6^gM9z#t3+`;6f_OIQRUBnLb8Q&4&TEdtfwot^@Wu7hrR7JS>ape|k=SQeuv7acORDVo{}TewuDcMyhT~Vr9I!k&%VDiKVfju}Qq4 tg@J)ya&Z|$Fc)7T&&My{gD(XZ74j6a1}U!F$LJNqaO}*QPZA6a3;>j+A5;JU literal 0 HcmV?d00001 diff --git a/tests/fixtures/global-summary-of-the-day_72287493134_2005.csv.gz b/tests/fixtures/global-summary-of-the-day_72287493134_2005.csv.gz new file mode 100644 index 0000000000000000000000000000000000000000..3d5862a1cd0249e63bc915afa12b19c116678633 GIT binary patch literal 1756 zcmV<21|#_&iwFqZ$5v_r|7UD(Vqt78b9HTPVRCsbZ)PoYXk{&AVR>ISGBP+fG&wUd zGc;c^FfcVPV{>)@jhahtB{vL3=UGL=#!bN=z| z+c-WIYxJ#=&xtiHGz)9`|C(-Wt`YVK*38fxShL=9`Deo#dyg|d4Qu?ZabmL^p~3Ny zE6$6|C0CsFvtvyQjblxZxdzsZ(2#N7ah}wkcbsQuzQ5xW3gUjE)T!3=3)!ULru0|)@ib3 zvT<6B)3K(9hS)sn+>lwXd$0wcDH?1ceAZwKwdZ0BISVw{!Zlj$9Syde8Zu5Y9Q&@x zaJ;{6w%|1lwiwe`wZGc7-wkWDItSaf-v`$8%I21}#9}tj@Jp~}J@DNkSBcFY<6xWX z{oZ1~pJxh=p(Ixq);x&wwck&Bh|S}H&9gd}Tkdxj=h*KC_gBmP-XRZL?ssFFlB+HE zyAzvZzYh|h*zcYA75jaV_0k9VeC_wyn8qqTx2Pqi5Sv@(Gal!vCC<7I#kmJtCa!6F zuw`N<^k56A*?O|Y**GI&Xjn5J*i)WyJ!=VvobOvLfi*Q-da|W6jfU?NYqEYO_Vnt0 z(UUEmX=Zf?>B$ylng?+fub9yDo^mjaROdwxww&YO+z7VdGp;|lr}Vt193;-c7M4G{ z9*kpE9o~~I%=cgmK2t_=L*ZJCOvdzBkw z;|BIUxG{+D!3})38o`ZqFij5)j!$p{Gkk2^AakvH-Q#^@FnjWS1J8AFW8t%M1UHrv zzbm_C?G@0{cF0bC}X0l~4O|qq9jaD_}%$fwh$;_-ts6A!Q z&t%JBnpH7#CR;iiC*zFsCu$NS>lJJ{h&{m;VRL1ivCTJI@R|l&SbTKWIj^gZp<10| znsLVaJ=lU-w>EAl)|6-E+G-LqSDDW%xiR3rSji3ihPIL$_>Q)c8^$zwRyL@SP+YmoR{+*pmxHN$t}*9r~Jv5Om|W?R9Hb4{`4;s)19%!O>WWD9-|w`2>B zvjtm7jcv&mobwiJS@<2mf-Ps9iDo?*$HL}?H6G(&&BYdKk4QaN)FgOc*v1yT7Qq%{ zbB*e)$+9M)npK_MmTY19bKiGx4DXr*+Y|33M)FX#y6ai8VKEH0 zEV6fkEsOc?VGoXTu!Y%tvjxrN!4`5>`t}A(#%WcZ;K>%8Kb~yC?`)oI!Dp@~TMjmt zJ@Ct``-NxSGKudZ)&0VgErV%VRoD4;-@(4uZ?K+h!S$hUZz+y7_P}?q`bm826~XJJ zQq|a=Y%yZbec!?H(Tp?BRUOrPg6Dk)->E(CJI3OZbqn$R9cMd;U%?i*PvuB%DAQQ{Sua@25tO;$8ivkvfLK4I%afH|RLkH?o%|zbW9g zxW5Y%%__b-yfjvP&wXjU=ovUQ_jh5UslNG&Y;19?(c(;z>|Z^7Cv){GhIjv}vvFqe zZB(*|` z70-3|ro#J|?7gWCYg*BlE7_YmV7)5Yn>yh8v+TX82i9b7D)HTl9z4n3RNS8+dv7YX zN2FrQ-kXZ!BdzFgPKIQ yzIQTC@)^hH?o}f;XFe0(lN)$V)#^1>uh^o=jY0Nu%O2n}=l=uR+p8vQGXMZhJeL&! literal 0 HcmV?d00001 diff --git a/tests/fixtures/global-summary-of-the-day_72287493134_2006.csv.gz b/tests/fixtures/global-summary-of-the-day_72287493134_2006.csv.gz new file mode 100644 index 0000000000000000000000000000000000000000..a0b0a7bd8ec8f7dfbef0f1baaf0d135ca147c139 GIT binary patch literal 1793 zcmV+c2mbgUiwFqa$5v_r|7UD(Vqt78b9HTPVRCsbZ)PoYXk{&AVR>ISGBP+fG&wUd zGc;c^FfcYQV{>)@jhe~M95)Pv?|BMi&dH!j?MDOlA%`qL{`Y^D^mtV4zEp7l1BQ)) z#7$pQ8b1E}`u_FjKYu@dfBg9V_4EAe>*rtpK7M-)_c`h+R_ghmejNRe!_GhFKfZly z<5{`Jp)sy0Z%utRuBmTLe=e?Rzcjr)JJ zYb^KO92&7sfz3S5w&UD{U-pi3^XI`e9XS=6fxU!Z6YGc=F08}z?;b%Z?&>+l*Y2Q=KC67|gN@nDP8L@pZF?3!On zQ?s+@~OF}P;O$7rn94k2Qr-u8!&$~D~C3*>`^;6=!7qw2DcU~Jf??vr3VGpkjoOc)bx_Sw|*LB{x zUpVioe$Y!CYOe}D3!57_&ua|5#8fs9Xn6hLycZGYtC!$5qnBu6uM*r~d(~Sn(YeO6 zz3Q!(5PMZ^1GrZn<2_8fA5{FtR`ez@{JtSZAU48hSLTh8w?&neilM4Y{3ck>#(go@$C7O_{) z`tW+|CB!;2>q#ou(u;`CX3JSWY_A4xoEqaAhh}n3dLL}yhN$NjcMxe$&+aKL?jS|& zH9uHqW#63^cMzV725y{w@x8!}s@5sl`%epQ@blHcjoy_#9U7j~&5hG$vChOgB8Cfh zE1q|7V*ElqVYu>pS{C?5FmN96}cd%vfH_r~X41U+^!Ir6fk6cu)S=oC+54KEU zGuSf3USLZX@c~WZvDfv(v#ASlt{`CgkF)5Tt!8>5L_Y;MRHTJV|25ZqWIUz;0e zPI;Wc4SwGl!Hucnv*X-FoWTwLyTbrCMi;fZxgm40xiRHl?>NsQ^0m1!U9A&w7VC@; zG!q)J*FtUZykFelIYm#xd$t*D;l1$;w(#>cqbK3_iy3T@ng&hfnx1if23uVDJ~NKZ zU<-ePonXu0@ADIE5k1=swp5V|u*F3#uAYR)$I?E0Mo)5x_<${@G!q&T!i z*fP{Q@jVrqn)PEV*uuYqE7-#O%oS{@YOjgBi*;6ZPFJwy5H?%XeBqkt!#mfM?7Xjd zOHpygTMBd7q4OEZ%9)t6?%W*+COC*d}u zCovI2x8x1vrSXLGFHQ8=ooi~s-j}B3dB5IZd3?~5NWW&%^S?AJw+Gy)!uQ>i@EIzz z+wVIE*JQstSj?|>Ix}f8zuLRfw1k-!^Q-)w#A1GxzY$r?uk!Dp*^Mn+V@K}$#TFjt zYsQS*eEq(|a|*Voe1R=ft<$r!V>h-8u9?X@w#ED^zsH&7Zz&e@tAcegzsi5RvHScg z&xOYwaGooiw?RoJtV-{>u7Q~6AV-Dgv|U*^eNlU=i^Dn1uC#5ygR?Xj3m zY%>4=)dr$Q literal 0 HcmV?d00001 diff --git a/tests/fixtures/global-summary-of-the-day_72287493134_2007.csv.gz b/tests/fixtures/global-summary-of-the-day_72287493134_2007.csv.gz new file mode 100644 index 0000000000000000000000000000000000000000..d82c4df9720b1cfe784fce695eae1bd84975372e GIT binary patch literal 1777 zcmVISGBP+fG&wUd zGc;c^FfcbRV{>)@jhjo3BsUC1_ddm-*LERE{g(rH7GC%Rc- zNEAuEq$JMQzdyhK{NwMxzJC4s{rk@!=RZGx{Q1w*YxAnxTazp=bHA`j91~B{?;_58E?&e4X&AQo13y{y*2Aqsm6}C zrigLO^0nLT=OX-UZ$H=Znq2etb8WB1H4Wo*u6g^pE;ZNfXID1A{oG8%!WQz7&*cX+ zJjdLS8{8guXt;m8U@oDl$T8!Zx1YNydwQO$KCmx@Jrf$?pOtIMk0DDVj?lbg(W}xl?B&8W9ZZ;9GZ0hbn)!jv3(Vx>fGr2j4F_9JdluI?#^Gzf*>dI~ zxA|tvIgWEpn)42}oXiw955!AoZiY`~&j)@6TU2g z`MOGczgRw3u;rXD154Lcd`-3e))3dnus7d&@sYgxH)w&kO;To_-Y781~GuSd{ z-23Ca!`B72@LHk=TcoCAE}@BYC6AYdpT*i2*3R<~Y#EeMJ=nr)tq!(~L#zvIS;A(p zMcUk856=xx&+k3hA~h515_8?(N)tZ3*)li}2e@&b&4uRnGq0ltxH0%0$N)D6zYiba z#xONbhsL;OWOd7kn#7bnE7yP<{ER<>8%x*>ZY<&Fn;WC3aVqL4VRJ)n2%Gx{YyZH{ zHnV*?zzu27&5glpfB|ldLunjy@f^Fkq3sDj^LX9d82o!Wzzw-CZf=aBG!x^9b%mcB z)ogC?aqgN#j5C8R+=nyRa;R}imWMOg!dW+iE&R@5KG-5`PTvA%u!S>x23rm>*Ugr3 zh_!FFIM;Z_)fsH5!arb3r#U}^EnUskq2Y12$a&$P+s{+@8EoP2dNbJ4#9UxY6YJV+ z;r`id;WmRUDmOf>{bsO5+B5Qf3bqvG!#KZl4cMaMb+cvioL^we-49hx>4!cf`6D?ihKzJkFIuV;HA$jbj|{!+n>+*M;*=6Fvl6hRElA-Vt++ z?Ax^BE~SY)#9c}kKEz$hWH#Fo_au}*m&TKQacSaQ*|{dpmBuwKxlgz>J&Eb186V7* z)!~;W%jZ+G-)^`MQIpU&-%FF-bzhq7Zt&974>T=#le#oLxu3r@Bf0y!G;ud5G%MlZ zsoD1=+#a{27QHl4V>{QBzICeD@I&-*Ur;F_L%bIl%X5t`_Qs9dvh&F)|2@p4OgY0MryW;{1MdM5e0 z{DXY4=h)$>n literal 0 HcmV?d00001 diff --git a/tests/fixtures/global-summary-of-the-day_72287493134_2050.csv.gz b/tests/fixtures/global-summary-of-the-day_72287493134_2050.csv.gz new file mode 100644 index 0000000000000000000000000000000000000000..b7398533b4e9aa3609b5b8b8ea712d7f2543c5da GIT binary patch literal 89 zcmb2|=HR%0JS>ape|k=SQeuv7acORDVo{}TewuDcMyhT~Vr9I!k&%VDiKVfju}Qp< tfvJIBa&Z|$Fc)7T&&My{gD(XZ74j6a1}U!F$LJNqaO}*QPZA6a3;>n-A6EbX literal 0 HcmV?d00001 diff --git a/tests/test_stations.py b/tests/test_stations.py index b13301b..fe74390 100644 --- a/tests/test_stations.py +++ b/tests/test_stations.py @@ -99,7 +99,6 @@ NonUTCTimezoneInfoError, ) from eeweather.testing import ( - MockNOAAFTPConnectionProxy, MockKeyValueStoreProxy, mock_request_text_tmy3, mock_request_text_cz2010, @@ -108,12 +107,6 @@ import eeweather.testing -@pytest.fixture -def monkeypatch_noaa_ftp(monkeypatch): - monkeypatch.setattr( - "eeweather.connections.noaa_ftp_connection_proxy", MockNOAAFTPConnectionProxy() - ) - @pytest.fixture def monkeypatch_tmy3_request(monkeypatch): @@ -136,7 +129,7 @@ def monkeypatch_key_value_store(monkeypatch): @pytest.fixture -def monkeypatch_make_api_request(monkeypatch): +def monkeypatch_make_api_request(monkeypatch, mock_api_transport): monkeypatch.setattr( "eeweather.access_api.make_api_request", eeweather.testing.monkey_patch_make_api_request_return_empty, @@ -144,7 +137,7 @@ def monkeypatch_make_api_request(monkeypatch): @pytest.fixture -def monkeypatch_make_api_request_v2(monkeypatch): +def monkeypatch_make_api_request_v2(monkeypatch, mock_api_transport): monkeypatch.setattr( "eeweather.access_api.make_api_request", eeweather.testing.monkey_patch_make_api_request_return_empty_v2, @@ -404,27 +397,27 @@ def test_isd_station_get_isd_file_metadata(): # fetch raw -def test_fetch_isd_raw_temp_data(monkeypatch_noaa_ftp): +def test_fetch_isd_raw_temp_data(mock_api_transport): data = fetch_isd_raw_temp_data("722874", 2007) assert round(data.sum()) == pytest.approx(185945, 0.00001) assert data.shape == (11094,) -def test_fetch_gsod_raw_temp_data(monkeypatch_noaa_ftp): +def test_fetch_gsod_raw_temp_data(mock_api_transport): data = fetch_gsod_raw_temp_data("722874", 2007) assert data.sum() == pytest.approx(6509.5, 0.00001) assert data.shape == (365,) # station fetch raw -def test_isd_station_fetch_isd_raw_temp_data(monkeypatch_noaa_ftp): +def test_isd_station_fetch_isd_raw_temp_data(mock_api_transport): station = ISDStation("722874") data = station.fetch_isd_raw_temp_data(2007) assert round(data.sum()) == pytest.approx(185945, 0.00001) assert data.shape == (11094,) -def test_isd_station_fetch_gsod_raw_temp_data(monkeypatch_noaa_ftp): +def test_isd_station_fetch_gsod_raw_temp_data(mock_api_transport): station = ISDStation("722874") data = station.fetch_gsod_raw_temp_data(2007) assert data.sum() == pytest.approx(6509.5, 0.00001) @@ -443,12 +436,12 @@ def test_fetch_gsod_raw_temp_data_invalid_station(): # fetch raw invalid year -def test_fetch_isd_raw_temp_data_invalid_year(monkeypatch_noaa_ftp): +def test_fetch_isd_raw_temp_data_invalid_year(mock_api_transport): with pytest.raises(ISDDataNotAvailableError): fetch_isd_raw_temp_data("722874", 1800) -def test_fetch_gsod_raw_temp_data_invalid_year(monkeypatch_noaa_ftp): +def test_fetch_gsod_raw_temp_data_invalid_year(mock_api_transport): with pytest.raises(GSODDataNotAvailableError): fetch_gsod_raw_temp_data("722874", 1800) @@ -462,19 +455,19 @@ def test_isd_station_fetch_isd_raw_temp_data_all_nan(monkeypatch_make_api_reques # fetch -def test_fetch_isd_hourly_temp_data(monkeypatch_noaa_ftp): +def test_fetch_isd_hourly_temp_data(mock_api_transport): data = fetch_isd_hourly_temp_data("722874", 2007) assert data.sum() == pytest.approx(156160.0355, 0.00001) assert data.shape == (8760,) -def test_fetch_isd_daily_temp_data(monkeypatch_noaa_ftp): +def test_fetch_isd_daily_temp_data(mock_api_transport): data = fetch_isd_daily_temp_data("722874", 2007) assert data.sum() == pytest.approx(6510.002260821784, 0.00001) assert data.shape == (365,) -def test_fetch_gsod_daily_temp_data(monkeypatch_noaa_ftp): +def test_fetch_gsod_daily_temp_data(mock_api_transport): data = fetch_gsod_daily_temp_data("722874", 2007) assert data.sum() == pytest.approx(6509.5, 0.00001) assert data.shape == (365,) @@ -493,21 +486,21 @@ def test_fetch_cz2010_hourly_temp_data(monkeypatch_cz2010_request): # station fetch -def test_isd_station_fetch_isd_hourly_temp_data(monkeypatch_noaa_ftp): +def test_isd_station_fetch_isd_hourly_temp_data(mock_api_transport): station = ISDStation("722874") data = station.fetch_isd_hourly_temp_data(2007) assert data.sum() == pytest.approx(156160.0355, 0.00001) assert data.shape == (8760,) -def test_isd_station_fetch_isd_daily_temp_data(monkeypatch_noaa_ftp): +def test_isd_station_fetch_isd_daily_temp_data(mock_api_transport): station = ISDStation("722874") data = station.fetch_isd_daily_temp_data(2007) assert data.sum() == pytest.approx(6510, 0.00001) assert data.shape == (365,) -def test_isd_station_fetch_gsod_daily_temp_data(monkeypatch_noaa_ftp): +def test_isd_station_fetch_gsod_daily_temp_data(mock_api_transport): station = ISDStation("722874") data = station.fetch_gsod_daily_temp_data(2007) assert data.sum() == pytest.approx(6509.5, 0.00001) @@ -554,7 +547,7 @@ def test_fetch_cz2010_hourly_temp_data_invalid(): fetch_cz2010_hourly_temp_data("INVALID") -def test_fetch_tmy3_hourly_temp_data_not_in_tmy3_list(monkeypatch_noaa_ftp): +def test_fetch_tmy3_hourly_temp_data_not_in_tmy3_list(mock_api_transport): data = fetch_isd_hourly_temp_data("722874", 2007) assert data.sum() == pytest.approx(156160.0355, 0.00001) assert data.shape == (8760,) @@ -658,21 +651,21 @@ def test_isd_station_cached_gsod_daily_temp_data_is_expired_empty( # cache expired false def test_cached_isd_hourly_temp_data_is_expired_false( - monkeypatch_noaa_ftp, monkeypatch_key_value_store + mock_api_transport, monkeypatch_key_value_store ): load_isd_hourly_temp_data_cached_proxy("722874", 2007) assert cached_isd_hourly_temp_data_is_expired("722874", 2007) is False def test_cached_isd_daily_temp_data_is_expired_false( - monkeypatch_noaa_ftp, monkeypatch_key_value_store + mock_api_transport, monkeypatch_key_value_store ): load_isd_daily_temp_data_cached_proxy("722874", 2007) assert cached_isd_daily_temp_data_is_expired("722874", 2007) is False def test_cached_gsod_daily_temp_data_is_expired_false( - monkeypatch_noaa_ftp, monkeypatch_key_value_store + mock_api_transport, monkeypatch_key_value_store ): load_gsod_daily_temp_data_cached_proxy("722874", 2007) assert cached_gsod_daily_temp_data_is_expired("722874", 2007) is False @@ -680,7 +673,7 @@ def test_cached_gsod_daily_temp_data_is_expired_false( # cache expired true def test_cached_isd_hourly_temp_data_is_expired_true( - monkeypatch_noaa_ftp, monkeypatch_key_value_store + mock_api_transport, monkeypatch_key_value_store ): load_isd_hourly_temp_data_cached_proxy("722874", 2007) @@ -694,7 +687,7 @@ def test_cached_isd_hourly_temp_data_is_expired_true( def test_cached_isd_daily_temp_data_is_expired_true( - monkeypatch_noaa_ftp, monkeypatch_key_value_store + mock_api_transport, monkeypatch_key_value_store ): load_isd_daily_temp_data_cached_proxy("722874", 2007) @@ -708,7 +701,7 @@ def test_cached_isd_daily_temp_data_is_expired_true( def test_cached_gsod_daily_temp_data_is_expired_true( - monkeypatch_noaa_ftp, monkeypatch_key_value_store + mock_api_transport, monkeypatch_key_value_store ): load_gsod_daily_temp_data_cached_proxy("722874", 2007) @@ -780,35 +773,35 @@ def test_isd_station_validate_cz2010_hourly_temp_data_cache_empty( # error on non-existent when relying on cache def test_raise_on_missing_isd_hourly_temp_data_cache_data_no_web_fetch( - monkeypatch_noaa_ftp, monkeypatch_key_value_store + mock_api_transport, monkeypatch_key_value_store ): with pytest.raises(ISDDataNotAvailableError): load_isd_hourly_temp_data_cached_proxy("722874", 1907, fetch_from_web=False) def test_raise_on_missing_isd_daily_temp_data_cache_data_no_web_fetch( - monkeypatch_noaa_ftp, monkeypatch_key_value_store + mock_api_transport, monkeypatch_key_value_store ): with pytest.raises(ISDDataNotAvailableError): load_isd_daily_temp_data_cached_proxy("722874", 1907, fetch_from_web=False) def test_raise_on_missing_gsod_daily_temp_data_cache_data_no_web_fetch( - monkeypatch_noaa_ftp, monkeypatch_key_value_store + mock_api_transport, monkeypatch_key_value_store ): with pytest.raises(GSODDataNotAvailableError): load_gsod_daily_temp_data_cached_proxy("722874", 1907, fetch_from_web=False) def test_raise_on_missing_tmy3_hourly_temp_data_cache_data_no_web_fetch( - monkeypatch_noaa_ftp, monkeypatch_key_value_store + mock_api_transport, monkeypatch_key_value_store ): with pytest.raises(TMY3DataNotAvailableError): load_tmy3_hourly_temp_data_cached_proxy("722874", fetch_from_web=False) def test_raise_on_missing_cz2010_hourly_temp_data_cache_data_no_web_fetch( - monkeypatch_noaa_ftp, monkeypatch_key_value_store + mock_api_transport, monkeypatch_key_value_store ): with pytest.raises(CZ2010DataNotAvailableError): load_cz2010_hourly_temp_data_cached_proxy("722874", fetch_from_web=False) @@ -816,21 +809,21 @@ def test_raise_on_missing_cz2010_hourly_temp_data_cache_data_no_web_fetch( # validate updated recently def test_validate_isd_hourly_temp_data_cache_updated_recently( - monkeypatch_noaa_ftp, monkeypatch_key_value_store + mock_api_transport, monkeypatch_key_value_store ): load_isd_hourly_temp_data_cached_proxy("722874", 2007) assert validate_isd_hourly_temp_data_cache("722874", 2007) is True def test_validate_isd_daily_temp_data_cache_updated_recently( - monkeypatch_noaa_ftp, monkeypatch_key_value_store + mock_api_transport, monkeypatch_key_value_store ): load_isd_daily_temp_data_cached_proxy("722874", 2007) assert validate_isd_daily_temp_data_cache("722874", 2007) is True def test_validate_gsod_daily_temp_data_cache_updated_recently( - monkeypatch_noaa_ftp, monkeypatch_key_value_store + mock_api_transport, monkeypatch_key_value_store ): load_gsod_daily_temp_data_cached_proxy("722874", 2007) assert validate_gsod_daily_temp_data_cache("722874", 2007) is True @@ -852,7 +845,7 @@ def test_validate_cz2010_hourly_temp_data_cache_updated_recently( # validate expired def test_validate_isd_hourly_temp_data_cache_expired( - monkeypatch_noaa_ftp, monkeypatch_key_value_store + mock_api_transport, monkeypatch_key_value_store ): load_isd_hourly_temp_data_cached_proxy("722874", 2007) @@ -866,7 +859,7 @@ def test_validate_isd_hourly_temp_data_cache_expired( def test_validate_isd_daily_temp_data_cache_expired( - monkeypatch_noaa_ftp, monkeypatch_key_value_store + mock_api_transport, monkeypatch_key_value_store ): load_isd_daily_temp_data_cached_proxy("722874", 2007) @@ -880,7 +873,7 @@ def test_validate_isd_daily_temp_data_cache_expired( def test_validate_gsod_daily_temp_data_cache_expired( - monkeypatch_noaa_ftp, monkeypatch_key_value_store + mock_api_transport, monkeypatch_key_value_store ): load_gsod_daily_temp_data_cached_proxy("722874", 2007) @@ -1226,7 +1219,7 @@ def test_isd_station_write_read_destroy_cz2010_hourly_temp_data_to_from_cache( # load cached proxy def test_load_isd_hourly_temp_data_cached_proxy( - monkeypatch_noaa_ftp, monkeypatch_key_value_store + mock_api_transport, monkeypatch_key_value_store ): # doesn't yet guarantee that all code paths are taken, # except that coverage picks it up either here or elsewhere @@ -1237,7 +1230,7 @@ def test_load_isd_hourly_temp_data_cached_proxy( def test_load_isd_daily_temp_data_cached_proxy( - monkeypatch_noaa_ftp, monkeypatch_key_value_store + mock_api_transport, monkeypatch_key_value_store ): # doesn't yet guarantee that all code paths are taken, # except that coverage picks it up either here or elsewhere @@ -1248,7 +1241,7 @@ def test_load_isd_daily_temp_data_cached_proxy( def test_load_gsod_daily_temp_data_cached_proxy( - monkeypatch_noaa_ftp, monkeypatch_key_value_store + mock_api_transport, monkeypatch_key_value_store ): # doesn't yet guarantee that all code paths are taken, # except that coverage picks it up either here or elsewhere @@ -1282,7 +1275,7 @@ def test_load_cz2010_hourly_temp_data_cached_proxy( # station load cached proxy def test_isd_station_load_isd_hourly_temp_data_cached_proxy( - monkeypatch_noaa_ftp, monkeypatch_key_value_store + mock_api_transport, monkeypatch_key_value_store ): station = ISDStation("722874") @@ -1295,7 +1288,7 @@ def test_isd_station_load_isd_hourly_temp_data_cached_proxy( def test_isd_station_load_isd_daily_temp_data_cached_proxy( - monkeypatch_noaa_ftp, monkeypatch_key_value_store + mock_api_transport, monkeypatch_key_value_store ): station = ISDStation("722874") @@ -1308,7 +1301,7 @@ def test_isd_station_load_isd_daily_temp_data_cached_proxy( def test_isd_station_load_gsod_daily_temp_data_cached_proxy( - monkeypatch_noaa_ftp, monkeypatch_key_value_store + mock_api_transport, monkeypatch_key_value_store ): station = ISDStation("722874") @@ -1438,14 +1431,14 @@ def test_load_cz2010_hourly_temp_data( end = datetime(2007, 4, 3, tzinfo=pytz.UTC) ts = load_cz2010_hourly_temp_data("722880", start, end) assert ts.index[0] == start - assert pd.notnull(ts[1]) + assert pd.notnull(ts.iloc[1]) assert ts.index[-1] == end assert pd.notnull(ts.iloc[-1]) # station load data between dates def test_isd_station_load_isd_hourly_temp_data( - monkeypatch_noaa_ftp, monkeypatch_key_value_store + mock_api_transport, monkeypatch_key_value_store ): station = ISDStation("722874") start = datetime(2007, 3, 3, tzinfo=pytz.UTC) @@ -1456,7 +1449,7 @@ def test_isd_station_load_isd_hourly_temp_data( def test_isd_station_load_isd_daily_temp_data( - monkeypatch_noaa_ftp, monkeypatch_key_value_store + mock_api_transport, monkeypatch_key_value_store ): station = ISDStation("722874") start = datetime(2007, 3, 3, tzinfo=pytz.UTC) @@ -1467,7 +1460,7 @@ def test_isd_station_load_isd_daily_temp_data( def test_isd_station_load_gsod_daily_temp_data( - monkeypatch_noaa_ftp, monkeypatch_key_value_store + mock_api_transport, monkeypatch_key_value_store ): station = ISDStation("722874") start = datetime(2007, 3, 3, tzinfo=pytz.UTC) @@ -1501,7 +1494,7 @@ def test_isd_station_load_cz2010_hourly_temp_data( # load cached def test_load_cached_isd_hourly_temp_data( - monkeypatch_noaa_ftp, monkeypatch_key_value_store + mock_api_transport, monkeypatch_key_value_store ): ts = load_cached_isd_hourly_temp_data("722874") assert ts is None @@ -1517,7 +1510,7 @@ def test_load_cached_isd_hourly_temp_data( def test_load_cached_isd_daily_temp_data( - monkeypatch_noaa_ftp, monkeypatch_key_value_store + mock_api_transport, monkeypatch_key_value_store ): ts = load_cached_isd_daily_temp_data("722874") assert ts is None @@ -1533,7 +1526,7 @@ def test_load_cached_isd_daily_temp_data( def test_load_cached_gsod_daily_temp_data( - monkeypatch_noaa_ftp, monkeypatch_key_value_store + mock_api_transport, monkeypatch_key_value_store ): ts = load_cached_gsod_daily_temp_data("722874") assert ts is None @@ -1582,7 +1575,7 @@ def test_load_cached_cz2010_hourly_temp_data( # station load cached def test_isd_station_load_cached_isd_hourly_temp_data( - monkeypatch_noaa_ftp, monkeypatch_key_value_store + mock_api_transport, monkeypatch_key_value_store ): station = ISDStation("722874") @@ -1600,7 +1593,7 @@ def test_isd_station_load_cached_isd_hourly_temp_data( def test_isd_station_load_cached_isd_daily_temp_data( - monkeypatch_noaa_ftp, monkeypatch_key_value_store + mock_api_transport, monkeypatch_key_value_store ): station = ISDStation("722874") @@ -1618,7 +1611,7 @@ def test_isd_station_load_cached_isd_daily_temp_data( def test_isd_station_load_cached_gsod_daily_temp_data( - monkeypatch_noaa_ftp, monkeypatch_key_value_store + mock_api_transport, monkeypatch_key_value_store ): station = ISDStation("722874") From a3d8f348631ade9a4ea480838d559c37eec90f44 Mon Sep 17 00:00:00 2001 From: Travis Sikes <124101151+travis-recurve@users.noreply.github.com> Date: Tue, 14 Jul 2026 18:45:53 -0500 Subject: [PATCH 6/8] Pin load behavior with real-data regression tests and cover failure paths All data tests pin real captured observations; no synthesized weather data. - regression pins on captured 2007 data: hourly/daily counts, means, first values with explicit tolerances - truncation warnings pinned against station 724940, whose 2025 data ends Aug 27; sub-day trailing gap pinned as non-warning on the same station - internal-gap warnings pinned against station 720193, whose 2019 data has a real mid-year outage (16.1 days hourly, 25 days daily) - all-NaN-year behavior pinned against station 722874 in 2025 (temperature reported missing all year) - missing-year strict/tolerant behavior tests for hourly, daily, and gsod - degenerate sub-hour range returns empty without warning - access_api tests built from captured payload rows: retry exhaustion and recovery, missing-temp NaN, gsod unit conversion, malformed-row rejection - coverage floor set at 94 (measured 95.3; access_api at 100) Signed-off-by: Travis Sikes <124101151+travis-recurve@users.noreply.github.com> --- CHANGELOG.md | 18 ++ pyproject.toml | 3 + .../global-hourly_72019300117_2019.csv.gz | Bin 0 -> 84976 bytes .../global-hourly_72287493134_2025.csv.gz | Bin 0 -> 754 bytes .../global-hourly_72494023234_2025.csv.gz | Bin 0 -> 35577 bytes ...summary-of-the-day_72019300117_2019.csv.gz | Bin 0 -> 1722 bytes ...summary-of-the-day_72287493134_2025.csv.gz | Bin 0 -> 89 bytes ...summary-of-the-day_72494023234_2025.csv.gz | Bin 0 -> 1179 bytes tests/test_access_api.py | 170 ++++++++++++ tests/test_stations.py | 246 ++++++++++++++++++ 10 files changed, 437 insertions(+) create mode 100644 tests/fixtures/global-hourly_72019300117_2019.csv.gz create mode 100644 tests/fixtures/global-hourly_72287493134_2025.csv.gz create mode 100644 tests/fixtures/global-hourly_72494023234_2025.csv.gz create mode 100644 tests/fixtures/global-summary-of-the-day_72019300117_2019.csv.gz create mode 100644 tests/fixtures/global-summary-of-the-day_72287493134_2025.csv.gz create mode 100644 tests/fixtures/global-summary-of-the-day_72494023234_2025.csv.gz create mode 100644 tests/test_access_api.py diff --git a/CHANGELOG.md b/CHANGELOG.md index e364796..fbd8adc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,24 @@ Development * Remove deprecated `typing` dependency * Switch from snapshottest to syrupy for snapshot testing. * Update internal database (2025-03-12). +* Modernize packaging: pyproject.toml with hatchling replaces setup.py, + Pipfile, and MANIFEST.in; python >=3.10. +* Add test workflow (python/os matrix) and tox environments for current + python versions. +* Rewrite key-value cache on stdlib sqlite3; sqlalchemy is no longer used + or required. Cache urls must have the sqlite:/// form. +* Replace retry and attrs dependencies with stdlib equivalents; fix + pkg_resources import broken on setuptools >=81. +* Warn when loaded data is empty, truncated, or contains a multi-day + internal gap. Requests ending after a station's last available + observation previously returned NaN-padded series silently. +* Fix crash (`No objects to concatenate`) when all years in a requested + range are missing and `error_on_missing_years=False`. +* Loaders always return a series covering the full requested range. +* Add `error_on_missing_years` to daily ISD/GSOD loaders; default is True + for all loaders, matching the ISDStation method default. +* Tests run fully offline against captured NCEI access api payloads; + add coverage floor. 0.3.29 ------ diff --git a/pyproject.toml b/pyproject.toml index 64a382e..53070ad 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -78,3 +78,6 @@ exclude_lines = [ "if __name__ == .__main__.:", "raise NotImplementedError", ] +# Conservative floor for `tox -e coverage`. Raise it as test coverage is +# added. The full suite measures 95.3%. +fail_under = 94 diff --git a/tests/fixtures/global-hourly_72019300117_2019.csv.gz b/tests/fixtures/global-hourly_72019300117_2019.csv.gz new file mode 100644 index 0000000000000000000000000000000000000000..cb45a15d5c130af802ad91f1c9062175a171c7e7 GIT binary patch literal 84976 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

}W; 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 U&DE0{_LSbj?z#%jJ?2aQ2JGn;y8r+H literal 0 HcmV?d00001 diff --git a/tests/fixtures/global-hourly_72287493134_2025.csv.gz b/tests/fixtures/global-hourly_72287493134_2025.csv.gz new file mode 100644 index 0000000000000000000000000000000000000000..12d5d21b4aed656b023e6e6d237e84b5ae79d177 GIT binary patch literal 754 zcmb2|=HSRW5thaDKRqWuDKSSkBfqpLr!wB$$jHLn#M0Q%*d*S_z{pfDxwwpB?TzzU z!htfZ5BB;i-dr_d=lAc=kHxN3I+~SbEgJLn@BKqZ#5bH0XH%QWqaG<^Azxf^EC1W> z&)*OKKD>PP-_K9Kl+@Mj*}Jdu&!2+2JMrJ*`LFwLH~;=!-@iP5UHQL?eLMHxuHSoS z-v0Of&wrnu`uFzXhi4ZakC0uy^X!fo>EjdS`))tI(f`-bU%vnN>8rm!3(vo|Z||J_ z_x{~j|9t-O%D=DfzWh{G|7-bz{Qq($ddKhozgQ7^A;fWEQxNM^t}M|lAs0AVbKOO^ ztW>!A#@Dnu`0Txq&E^PZd)BvrvvR9$I-6FnNaMfyX5lQ`kj?Fx-)cma;>1ltkW4yK zRpR8B@q78Le=E1uuX;N_izw#HZS^bC{I9;roF&_3x-deRD#TB-k7F&P3P#Wr4gG&vZp1T4O$b~WlFr@Yx{`L(rbgS KT@1EnU;qG*I&|>> literal 0 HcmV?d00001 diff --git a/tests/fixtures/global-hourly_72494023234_2025.csv.gz b/tests/fixtures/global-hourly_72494023234_2025.csv.gz new file mode 100644 index 0000000000000000000000000000000000000000..05ac885ce54d48f0ecaf30b9634c4ecda36984dc GIT binary patch literal 35577 zcmZ6y2|QHM`#&CyG9<=U$THS3lETQoj4^hGhC)$xgG4CF+Q`_K$dYBokReM#A<{ym zFc@nkp-9qV%i8};eLkPx_w|3ho^$U#=bn4+nLFn^=REJ{{fH;Avln;U6IlOv`31OM z@Kf{-2nq5Fb2+K3s-b#ZSw&ez)kXQZGU}My<&*zadzpeA?$~ zaPM^x79RKRX1$NDS=jmDx)wT=nxImxmU+RPU82n7d(-hpXHR0;gY-dE>Y!1Zv%{+qjnLW zzHTgUzFlwM2x$K!ySX`c?a$n5{~w2yo!Z@g$;v1}W7_I>^tVx>G(!3XY><|&jut#i zjppIE;o`_%Vn>?y^>-S6$YkJ`6~q}=}$dhrC?98X5s zus3E1MtFw022GHH7%`}6-9bdGMfZEGJ6fw0QoOtFG<#$qme_!aD-f}j*}NN4gc3lO zOc`!HM0vptiCIB@oAqvwlT8rtGGel$l;M)p&UoE>ZC_?7{{rdWaIxsy-h&lS+&EqG z=f+gs8&v%own>7GW1NWyzXtmdA|z~x@Xou9*a731Oz%wSeo`5EXrVpS2U~4ZMig!w zOG%`ix}w&YLKMBTPQNL7$4ahbekdSRkV8xDG-6@wO`k7+sNe8-+Vj+E4eO|}xW`f*YIx--{#A}p%dR33tsV?+v=W9?Mh~oNbzOrMz9NrQJIZxkm2pmMI4N3<*@mR@sz~&{uU1fPv3Gp?#m%0FD-Hq znFwFWFJJxqewNl2Mm7HU(jt-(G0q_q5drtEQ;^}e+^ktR8oH(2Y@K`>8Gd%AW+dGE z!v~7+CcnUGQkZDx5dFo*Fs)k6S$*oPFSI z-H2PU945vo9 ze;{|*LzLnY{2biC&oU{zyS~~dE8Z_*IntVjUWWxwen51M(3W?xW!xg!y3BH=5;my8 z+)j$-_kcjEM_&ZLnqy5mym>iUFv{DYcPuUdB195uh!qtbY6xX0zcj>>;sXOHW9uwy=? zRKK-y!8+GQNpj0pf@_Dp^FbsFh0yKVuJ&iFOu&WI4EJ69At8xBBn>&|NG)p2q3a*3 z?(DfKiKYvOEDUbu1e+j&3qH!M}Bv_0HFhoTE6x z;V(Dap7>-Zct;EeMcLNJX-apf|H%=^2y)@xV6Q-dr7smEwlZ5e- z1YC&UOd&~9Y$9X+{7<5=45OlR>6vi#@<9!neeTab@9dC2u}AO;ljI;!&rM2umNdHA zjONscjU>8;>@K+~&8mEb5zL@0F2*y3@%&PeyE*CbB+(^eP#omidb}2;^-BA3u578v zr?bwEWs-#Mfsdps8%;SQ8GSck{TS8n4tJPEQ8icQ+5~s+t`Z|Re|$Bje9R^N7|l>9 zWt15eH%7io^W5eu5x3s#0K^^^;Bm-Qu>uNypDS1U}P|>ZXBT&c<{^ zwtzLJ8O_?9LDL(&tQ#J;GvHuiHYWb1Zsj^Bi|>jc?{l&Cxb%(m0Jzi>pGQ1D=uhI1 zG7Qqrydoo^XhsoYL<~;aIX6Ek-WDgjdQZ`{e-i!FxYyi-Lq<9)oi}elvE!X_vfedL zc;R#a1^atZ5%Qb*2v(_` z5)d#1OosQQSY3_e628|Khs%7e<$kie%hYI*tc zGFq3_!0l$V=y)14Q&b2tIWKbuAgKPf`a?D_8PNR33ni=Gijek&xSk z&+cki>jmHTXE;2x@fwHvIbIQi-MoBsUtnq(y1=c1{?4repPKUgE;P>a7DVk^>#*&Z zYDJdYz5mES$$cMNd8!={_*0^^gva}4_zO#c7h&H2JH7|k%Rt$iDTW4XE^a*5y8&5V zl5#&^;cntQ>1yptevFe=s^B?~=9O0ZZYi?gLVe3-%scGiKBTZkdTU>oD>QSonbd4! zbOT&$=$4o`qcd7dZ7S*@ufA^6Jx!cDVGAZ12aSGZs=s<&hvI)_&MRGe`KFG+FU`}N zvL?>X7%-FGrC*>97aB|ZHMA_#U#8qXlwpI;-W(PV7LQ9AxwPij?JWZu3Nv`QzeP*Q zB#-`?TSzf+Rt7YtEUly@Sw_s|AcFU`Vnv0?M+2jTFi-dqdwmvF}Mf%ur^*dtJCS!y~Cb^_G*XxJALtWKl8U_QApfBfLS zOX9F@Z>}EZ6USNh@yyM|gU0^02YntL?(^np0_4Kf*{Cdu0|j6tUYOb@X%l14ywKMt zU6O+0pN*$TlJ?3+B>$!;=hS~>KN#h z5?-DH#^09m8{&&R!GH!RPP-{K zL3JBq-SAVy2~l-bxf^|pcdk%apeNGUhn|(NA*&dy0``QPO4IMtZ>g6Lv-Y|VKwL^S zeLLQ`+axNL2t6^mB8m2V;2q-_XGgZbAmA;VB>P)(uGoc{q1m00KT7iS76W_zZZG?r zpW%IAi*j0o;i@8LD?zX3fV9{#AN>34!KVn{d?EI$b)$=guk$U?E&T$OSvZDw*qx|% z-WqRBv{eYH^k_9TPuV06{Fw^SuS$It2Ru3ND3Yh!k}nz>Ad>KiLwpp$lB-^u0Td$T zprD=i??R;Nwv_-uU<7i0x?sg_{-~3H=Iasl^UuT96|$?Sd-#NbV)(EV__U*WS^s~x zKp)C9u7r+xi#jdi`LM5(x@ny?cua~Tb>I7O3n40!@vP)S6VDEz|K@fEnu^C$Y><^% zdbUVd87{t7nDOx*c0-C|j{JwS?_+J$*0*)N$YO9jv+!wiWtNKg3)lUYb@+tU=7dr%$S#gzMIyJMxW02~92+Wz~ zErVkNTi4WT+lP12>EV`SjuFz8) zc4YoaeFZxhn1ZS?$RA78OAlW@PLqhj%SUAy2wZKSzz`&PX{-VFvf0{<$ZjXV0|LT} zceBm5@C#?EY`R>zKu!q%ESQ+PDFtpav!F$hY(4N1=3x&a-=CsFKgTGj>cgMbp^z{E zFR|b46S0z+XeeB9Zh}{+I?|bXymKgp^vYZ3%?(?$PUI6{q#6#!bLF2bNztVFX084c z^QU~RSM=O>gguyoxEibGZ9xhJ$#V+2fFU+KBa~OU0ExdFj$pHMeaiQabeK8}H_JXqvMmGk_M38J^&h4_ zH0$4QcTE>TH3E-6(^fC8mC4;dw~R^*Bj2bzT%Nn%>;yL`r}g!7H+}}UE@HTRT#n#< zC&`Y>`#z;HMYX{~{&S4&o4sYZ`!#782Dwjy*<{7wGW6qM2)Ze_5Ny6}6A<95-y-zh zfkwHf;*4JkTCyK2<14v}1plyU??67|NVTcJ3v2H;RkAp?-Z0E`b=XcTmVSU}DiHp+ zYOMK}(&UlSWI?0DxWwaR{=@q6$D^%~FjNJGQJQSedSHs^Vcw;2W3t$58g=kHqKhEvSwJjia4qvonQcB--8c)rDNKA!&V zQMX{ef%8L=fzo6CHtR5Y-UhoVg&3{*P_cBq9-vHdSS>cm2k3XkB@9;)8NAzv1{me* z%11#$dUXa^+RKUiWFYkOdg#H7;;4PrqkGXI2Ix^mJ16g*-*?-Vjg{acaLN~s6T9=P zZEF>-ZI2sr(vLnLX(bZ8Q(BtPb*P0tHD28cD0}C{Zo?N(1#Qi`Bd>cF7B}jirF^BV zE5VI^bcn+dk_jINrO-IcW*KF0*-(7em_4zZ=EC(j4H!BIiWTUGr11JqgB~&Zd!u?+ zf13CEE59R&xuoaC4mE#=Yz9IA>;O@r(^nQ=@3Nmec{PACZ`^yK^@TA)twx;(_OrQ2 zg0lr?vt{%9Yj<0H#SY^7)9G*HX5;zy@2xr;r{C+9;Ak^UF+KNv$XA2%H8 zn^rH!9T*?utuj1WVg?21+$mp1#TFBaSq(oE-}tV5l$VY9*;o2Gl8ohipqzt7Q`vT1m;gl`b+XRcu6eG@2g4Ag6p&gfP7Q ze|!45DLmm>UT()Df8Ar#>Xbs$`>p+V1D9Ir4LO$I7f&T#Lz_9YU#%HA;TZTrw}7-_ zu83EcU=B+72T7>@m*zd6fMN5zfOA@Su&pIdS`*uQsAcK=I2u3(H_UaxzqxAu+M|97 zj6^;HC(CU-~JT zm}6Xyi(=-6#zZ1->@j~_zwmLhPg0mMV3E5wh|&EI%;6FhI+`+aF31tawCqj}R>&t|l$mRg-Ep82rDPzWTRT8{ah4TbcNw-mnAM_cn5wdG zIDh?8s>i!WO1kI~3HUU539b~sow3}kOH=ALh%nGa4<8FN7KhIdVlVX{WbaJvWJQma z!Nj`)-!zI3lq^wK?X(_@asEudlcSi^bWa>@fk8uAjuxlksyk}2`Y{iAE?a5w;v@iK z62Ct%_R%u*Cr_)}GW@+u%0&H4F#P+Vtg`exY%s{BEaQCQWAq#MTA29DFU_#nV-0b+ zp9>5M85Rqro|42K#SXt+D1VcJd$*IjZ6oRc$8}DWH0ri~Oz|nVTbdPlc+)qfZxA>ONXa>rI8N}BDL@qbR4 z(Pod=VXG@DyCxjqJrcj$6p7L$e_JHqMlu`Y1u&Pn`O~G;Z|KbP2E|dRnEWXtM3i)v zUgmwhAiosct_gWNgFQ=+m$Gfc`tb;im3h)`jaR#lo6~7XV)o?t#&#@!k2v&G8u6Dg z^!x*be@e=*Ac__G`P;bO1~qb3bMw{6ic9|pNq^N?lD?5I{nT_)IPQJ7Mp?#Feo<=z zhBB^Ok|ko(lY;n!%?gqVM5Hg@O)-oq$ig1s2(EF@Q0MPXW9mu~8=9X9KT?D@uIDC( zvM*o&bK{XFI#FHCGK(uL$J4}9weMG8@$P*QjiN-eBhO}B9Ko{FuwghZT=oD3g`~-? z@Gbl*u{*9EZPff~0`t?vY<3L4Ydb0o$I$a}#xb zCd!xOFB5s1vJR{EyBx@$YmX~E+rRt)U73!nYS)v1D2B@A?sqcbl!m-dzj19-Zgs_a zVNg(dMeLh&M`USSq6s_43&F~yt4WAeK^tN)lH2J3nbRL$n9lQaS$23f z=8T|rEYxozEZ*Y$&^uDHqaXEHHFhUM3BwTA*+xAUFO`O-za8I@)4w=ZOEpG(-tGr* zg=E2F>|TD>Cq8`JsFNi|_d6e^KipF4hIIFCZItO>dB`r1AqnkOY#chyerlwvO4w)UINfqB#ulPySe6Vqn26g7$Q$qsw zya)rL#6^hBfkb~jdwl{tLD_Q_&C(>jck0(jH-cgY(5(?tg{~idoQG|Sm*c4nf3&%< z9akaCC5?8+BTql&veTT7vP=cVf&ITc)d)PvGNlQY?>(a%Dhl8-s>W;2*=Y=Octhbc zLox@af|I5b-gCAF7bgZophoyA zPAHY6Hf0oQInn!mg zkX{)cWY0tHMc=&$--}e`!%3W`N!El)U0td;j)q?)qJOX(^<_ZHKW}T6sG~Bc7)>xm z>F|PQuhrk06mZNy+t#S;H_ED_d8P<6SB1Q8V{dZIoXa;@x5?V~HQ3Ajhq5zL7A!bOn|5o)pzw$s?f69uC-1fKnZwbqFZ*36{>A}y-*HCoalq}fyRJ!_ z9x}+jW>v|!Yub)Q$%3s>F-q<|o$ziWjfW78x$B0>oWi!B;Z+1V5A=e>Nc!=9N;4L$g-H49jmDm2n?}WZ#Bpcxi-(0%zc8Obn7^5!{sw(!f?6sj5Iuj!Eq$w#eQIj#M1@`& z92oItEeN(q@nJ2P<$#wJIg)LyEu(L}GgmQVI>X#RTcD7)W@Kw)zljZp0dN>vT5>$tBP;!X9jOkF{{9 zQh%-iiQAvV;o*yz%;5NMq3F^4DbZ$hZ0iLtQrcex!U`L;GzAxk6=ct9nUB^}D4vUn|79$pK?Ny*ah zCfQ~f`E1gJ1wx|hZr18hN7mu*r+u?{ZVlMdeqzLB@r}O0iO5fId9!R}w(uz=>NXi4 z1~U+|tzhKZR@50If(@~fvB$W4%10neJpu#>uLWO|!urk9HL1JaI02+EJ}z;e9c8bJ z9j(_;fUr!5@KtK*MU5ptoaTIgh>O5_EM#|>_fm!1_ZDH*J;o_!;=&%-6lE&3DJ$G3 zo0mY+QS**`D6FdI#CJ*lq@?F^InF9yU!(AYFEndNUP%#N?3ON&;6RCf5N*@-h*uJ^rJ3#U0ygcQw2?3<#UA4Us0htLWD zL77g_?cj4e=5L$xFg@#~6#rhnxFg=9^fVZ;LHEUNIo}7_VCfU?~RZf zodSt{Yk`Lz+rm(@GrwVpEVuT;401-O(n>D0P!r(WZPSHUIjbzFvb6r3-1!**ySzj- zHENJJ`D;@U1{W0R@j8txF5ENO1UrF(p>}Ol5|toXFVrfJs2TKWL=DMyYkFyK%k z`w5uPfX$;gvboB_Ao5ogYC+|mO|e5-dWx^-UA2YqYMG~*3!E&)4k??O1jeWhRhJ-~ zeIX#>z~kkrPL)Mq3I?1HDry{+!}yOJUb9*?2(9GKlnnb@%Q~yb+L#6p z*#)iwEg}+^I9tZN%3iikZ>?OWBTq#SQeYP*02%~|el4Kfu_?3X?3|b4!KuMzPGztj z1vG-C2`t}xn)*D0aT|+}lV1yNT20k39;az4XSv~g<{?W+Nyy=9$dXx`ND%x^6zi3c z$XYHWmkv#Jg*-^Vfn2e|Rle)2VYo_Nk{89lH;ILQ^7jMokXBT_$vJySoxfy8mU?{i)YV+ht;vg{UMZK2im$F>%sjAneRW zSn3G4D8tcH3Y1}MP8U8W1IIH=6ktTGg5jJ-hqlra#?Vg-2GVfHB?IbwaVD)Of&t}4 z*H6KPb(e8*_|_jIMwA_UOT*8yyIL&0UtpmqX3lg1fQ^F!j*tHQM-ymUmti*VpOG;jU2#-!sgzS;k1vcZy1CJGe zKN;NKT5z-r(R42gS|$qJ#s9aZ~~=Va#LgNq!dmsULV*%L{x!~mtGHGXdn zJ)Jzwc>*?EJE+tp7(rY>NA8;KY^Q8)ROsB1cD~q$ou*W zwd~#goI$qKbFA!g0(h=`WKx{4eY1emoF?_b_f7DaI67L$ z-^6KG(6PJR+f}pbkWH)88$Mn$6AFsAOj6m5W{Xa7lp=_P0RW-E1^_MfSgET>VIEht zsP0V^^2=88ldQNZSfjX4jG)#cysgu|X9UqGZjd)%<$=}87W#(&s9&y3E$m4SU1*K! zrysEM!2rB#BBv(;U4Ke|y|7ZBWW5^v0QIw?2sjFdLjf!2RNUT#ilRBG`8Rm$%K(&M zy?ZSZ*eHvUhvx)2mW-_u8~;6cm3TBuC-l%`gZ_!vVmU&I-py#ur6Ibg(6#os+{}+w z*$1xlcwIquPE_#wmfKbpKIlq#RsQ+iIKhMs?fUCWbCss<2E&2cF*{V>Z)KsYqvs3m zgVBYH+j}FZ@#m{@;JqupzVMq0e$DUMQ*(;S2o=r0(jr&P`p^^i>HZC2^%IEGT8Ptk z4pTG>M3t8a!!VAbnk|^!!eBIIT^#NiPqZ4{pY1A&Peh$a8V>j18|oLM++ST@TD-ri zWxZzh#x+FB6;ugn(XAL-H7%@>^QDhC}}}>&kO$ zR1iOxYR~=?3u)DFM{LG63oSd6o!XbQeJ^~yQuI=NW~4ubR2QkTH1>`Jz;Cd@hIgsS z|CI{&_obU#e9MHkD^acOQ9x~`$_GU@s^9JAd$5)FM2RAB#cyXGYY)g~IC@dV-)fPGi3U7bc*U=+gd@OV(?f1{V721=Sp1gl)b6 zH`g54xq~=`8nFT`Y2>{hjLKdLqD*|?+TDt(8LqX=tVhGhTkm1qPalOEItqYnuXOkp zq%fr~?IpWDpUa2AOcS&ohF%-G2msd7bMuPC;QOs{=?8BsLj0rxD91I8j!>}I6Q9KK zP*(-fRz`o01qU=tqHlp^-qDHuK1vBL3vTe5{mpi7w#6m4G?*DNNP9mhg7xVUF8(3x z?)IW0F{{`g?%D5|JYo)ZUlRIyOW}Vpg1hf+&ECGLbIJnw5F%b7141y{H zezL`gDeI?T?H>ZBhZO?=IgOF-FC7!48EKHHf2v=G#Y*%0IKR3nF~|?Cp_X_>nzgqY z7IXJRqW;ifBl0g5n71&s;|qFM80?x=<-1d%zaSByZUEc#7B zhMrI?2)JSmz$FaaCKH6X34+k?&w`cLBBm6CPcGKb(QoEYB5>^hOYGm>W41N?)g&YD z=r8>kv&Uj*kpGa1E`VRq1I?19=h4QHH1~P*G`lJPv!Qd~Pb`Z>Q6o`{y66SC41i32 zr3c(!z)B-HHfNo&e`T0&i6`6BL+8a>dR;T{s<@gxL{~2Ub%}@(?41gS} zK73}(qg*gZJ9S*e^B4}4l6je#j_-5BN-6%e^lN}t6Xw8sHE%g4fXfSOt^{_sHcgz4 z1)Uce{U0dn!dXJqcu!S>xD#F?F$AoFor+^c{s2eH(JT&|J{f~J4Ne)_aVD)NPNNvD ziu^iCZbl7)gtoa*YH-=N)J6vdMJ7MS?%ZP?pV?P;@Dt^ERt$!?;=$Qj0qpLVDc&%E zQUGhXw?cm1%Q&UdH6r?CBOC@5$UwIX8@gmcG`iXvICORbF&D0kfWK2{Dn+#?S*<5o zRvk6`I4yT*72^DPk-&E~Z^qBtho=N5Y9RkR=N?e3@&+IR zF9loy0FgIPG_UoGX<(n<(e(JQsIECGA3tPmk^vNNvi<)P%}y=VOk-YhW_^N5v{|2Q z$tj0+D~}ysGH*YIm~z`ol5F*p3kl7hAC3kKO|qLvmYWEj$4Ds4&78-&?@DOw)u2f4 zlRu?{#YHnJlxbEph~}q7!v5has+bF)%Dhqm8@q}tBP;6ECJ6M)uf2+9&qwIw49o9*9 zw$=>ORZ+{z@7}g3>a9wlLi&+VFg){@SGu-RTba6>p(e=~;{IC)!O|KisPM2!^|wh)`TGtS$5ko*A6Nih93>po z0`ENV<7EL!P+2eBrdIdHLPw&v(Ye_uybq0Ii zA41U!CFe|H3ud4OT`NhNcgv$sKA;V)vK7|&##oIu>aV6dl7~VR!6@P+A{eY1YKqXV z&rF{aUri_{OPGlw?sDpFjJ2iy{N$!j42MFaeq6Q_V(lKAr0cPi3OWPwdTyS8diG0W z)35A|t|R%?53{=KS*{z1&R+wpcHV>-tJFq)xh_!Hpg&?Qe>=_gs5q$jH~$|i-}2_^ zn9L9)&gCHoBc~c5uOcwF9pZyXw1Xby2=I)ipnuTx%S({-3YsjB_Ru(1f+~|Wz}w>u z^=MFL7Yj&128*9y7Zae(onc$hu#cH%AbAQM`Pjw2vu!9l*1Zz&;>$R{aTR@_(2=d= zlyB^(8Eh#-82+~(mG}p#t{XIT@9Rq3@&hEJwF+npU+}p&LS{K_DW5&;XkiZWL8-FQ zCxQL3K{VMD&`JVO5IR`QoAv4phkV0WfECweAG34$HejdBe{uQ8!;BoBJ#4m#fa+kC zvL5Tc`M{3yWKmHXE}a|hbIXy+wjuR-_Kbk0hJ74i2Tw88tjrQZfywuYJzL%RR=c4I1`EhY$+;j|iN{!&y&%I42wDAVNENd{0)y9U+!@1ZY8YT;S*6$x ztmvFI<;4?g%yoi2kGo=DZ#@16Ffy6H#g4$_iE&N9^Fj%z9x)M*w3ML6eIEx=&ng1r zN@^YggysIdLO>S}ZF~U+YRy_xos2qaPBj?t!l72ZnLtOydCaO$mV7%R?V$J)%ykHh=AqWjCeq%HE!#W~s>H;qv zsNk@%!OVO4PJ`oI8ZSQg(_bS0FS;!4_zy~=2_>|k>KtJ1y z_X%5iyWL2(FSuH=fB}^7uE6WUaz(U9Sb&G^Y+nEr-OZT}K0rqYbde7vxt-_YG9SUy_0<&HPTc90vSG=ZRQA>b>Au zeo%$)fZ$2VI6)E3H%Ay3WaF#`Aex;5z-&zSQUo1}@<_XC@UB@*ImRkbiU3GXi8QIU zuYuDE%dyFP)@Wd0q}(tA(G$OxtfS5T4Rxq|1GWT@!9s1`n!GdAYV8lF^Kv#xpQBK@*`Kzp;ZR_#TYiC5j<>w_C9g#$`!ivf$t=J30j9%zPkA%63c z>|i_#;0#$-N?f#M3rxdRInd8h+0Hq(hK-M7F$lPknGRqpxZV?iHH;1HbPH@Q!T)SN z`VjeNW|Sx#;v>3ow-BG;9Q*krhh>MCoVVB{r?OvzHXIS5Ua|7A^kuJww_1Z0L2aeP z(@?4M#1)%1o+QGXb9lFV0CFv6m2R zAL&LZwhlaMmV7*^Gqs+e+E3jF5aP^l(wUg#+crE0sS-!*C8!>3%8vHryQdUzLlpwF zFANSwFo9p|1@Gbk;8jsnQy%SSmaye7T>z;rZVxh9fEGT?!Du6}33qw@O$*MAtYt5c zKI`)aRM`^A9^S>|r5!@jeBXVDmYX`5e{Nc8Vg7Ka<-JfPOBxenAZeG%NF3?Xo)t{| zmfi-`P`_jB=Ydud&x?!D{H_xxF0u}9=IP5^lf`)yLh%k>(ENB2CS#R*gRZ^MRHLVC znl&GWPTCw!=hfl!?rzXIlRoAoErB_#7<2HtC2u{YjdWn+Y}9Yby1G%XuW|`_M~iTV zK~iby>_I*$*D#tgm~ZKCUe!SvS6x|AMTgmtCphq~{Im{;riPjUJ!tjObMhx$^yu4e zK~~;;Cw3DFKlu5?N#l7`f)>q2EMc+_8_+^?kt! z;2HH4JrGL)7#dBS6Dc&?oDuR4iTv3gK2_?;nR0%=xqkP{PwNxLq%aS@BkgJQ#tXoW z`~YRP0TiarbP8215L1ZGs@FE4;CIP3Gndr<)l>*8d)64z38742&QOeDPo3nK-cs}-tqd+_h$m*gw zu6xMQgKV$EJyUXtcWp-c5nsKsR+IQX9&vKZT2<-U6!O@amN?mkIrDro44up@k@@ZG z)#YiT@J6tb9>M=Gaxww}c6{5Y)1+5*LfLLAr2?Luirp!#)h@J4CgXh6Iy<+xrS!33Ug)gKIr_d<&g z2jB3^sB@delJq-7`fza=G+jci7kr%Ml+tSEmew7;K{3gHo^DUE04-f%efy)o&y zBXrxjy03PGyzY1;bX1fA+umq99je{A0JZGc^rs}8o!GAA;+3>Y-S08>PmEn%%j!X# z#W&}CIBKt$bP&+kU3*)CvnXN>eKR`%Zcx-{ z^oejN``$T5*q{IKy|ri2^X(1Ar3zZge=q9oB~HkK7FR?Y~}T17pRQ|od-p#FFQpR9HmWy z9cJIphZ$GnK7XNPXVU1}LZP5unqIqfcdYSgg*!(NZ{F3>_081hZ$V?V8^Bp?T}qx# zY2u&9o#hBd9AgXevn9J1@^{yn#vHlxe@^>s<`>g{J~#7%`|;XE>*gR^sxM~CTlM10(a_e{U16dp z1oCaC1@h~Eqe%m;hovd*!aEZ2w`L|pfN7cn6FS}=6vJrfQ_59_mx&WOV2SCOO8|yk?+2Sd8qV2ic8`_0(fu`k0%`FN5Q&Ryyx*@I z<>@h>G+AaOf~@`xW-p*kt$8Gk5y}i|rMmBPW~~UsWImC^4W8yL$e)R+l~zX;xg{0X zXq|K)yZ<=nF5Ok7{A&sQOAEN+b^5Ue>gmh7^aGYm+yQt(n0BH}^vUU+?QCB3O969c z!3aXt@DzVOMIM-G{0nyv#kG7fqFlUYL%ZYr|IdO-9KCe@xVuG3==UonxRY%NhNTim z$Pj2~sGzu5$o?1ym%^dAo7tdXrX~Z91{NM5Q$(Mf(|Rl6{1EuB=gRe1S~c#l-?*8b z)Hx?^`ZF&2ie6_0Eb){Se>oOmm4Yh}rl_OPfdt|-gB{$s0bXVRFfFjZmr^FA(8`PR zqNK5+i6TISFW}zM41WS3B7D7zyR#6LsHwKQ-U8wE!Sp9mz@Sc5v;*`3RbYR~bR6-*SKfaB^tk{bj@hkj zWK|XZf=3yLf`Z){2a5gS3Y2b)0 zVYJLOE<(8=Ful3*o&J}&f5_S^Ycm8S7XztgE5ddqqfDfQ`CbHw<>VfxfGdzPfjthk z^ni9SUhQAJ(8i2{_#y2z&@BxWJ%eV1BvYdu0~CcxTy?-<_V^R7;sl| zUc-5f1Js;f!+75(!hRqg*!{zoTVqbHyVZK&puGk%s^ajx_3;@<>|BA)Bzw^r43mhz zlX(-;{~*LCw`FuGu@GhB47g!v?FOT$SIMRR0gRi=$aVWGAm} zkKs){cwbmIgui=vJbl?(Kc){*IT7@Y=ua@-wm)z3@vhfx69N;DN%NmGksS^yB6Aj= z{A1c!U|sp?x^1Tb_v`YJ@GiBAX%0|@`y3)P_lxsHY2>ca&NgS_{Ep4utKE?AG<6Xt zK(b9S0o&L4)8SCNryJG_U*|uH`WQ(nBPBuT#uFpiRp^NdYZ65LRk%ky*W>k`NT_M^ z$;C9>x6xUTJjQ%1AlY2@J8%#$OWd1n%5}$#T<{KszC?Z?ab#Xla^LM^3qQ`=r~tkJ zZ8`vv@HdUP?l>~; zR~XY$x59RXnzH18%QEhwiTA$eQl&eS_vH|FlP}kT8VA2KV?T|3ZB7XZqOvb^ehZY4 zl*43 zkuW+Sm}n>70(fTtzjBqTvFFSJF+v_`k8np{O&?o}jYN4`5d~=vv7C4(DqCgs0IR_g z>RE44T>2)65Q=zc`|fC2lf&kvdRMN!Eb!0Sy-kk)_eFU&mV27snV;%5R35ruNB(jj ziSxv>^(0s7|I6k-Jy-alft4#{*s_Avg7}|OBt7_yfVXCqZ5EPw;!qW}XUji$kDISY z66FX3JJsiIp67tObW4#x%v%Z&3Ot$o<(DsK36F5uTWK>~IW0;FHZf*GD-?X5vs{E7 zxwMu8-%-UXaN-_r?F`vL7`!(OP%Fj4w`{KR*Mfk4xp}Y_T9AeyOAG44XZf1$E%(>* z*xU1EA^(zAEOC{6;$2X);V?a0+9iDfq$m> zV43uhPjGQFyEeUZr{gNm*in%7mcWx9mekt6_3fHjGJqZIkSdjUPrUrsN6ij1Er6K< zp3D}q^X9LWZE~1Y`}HuAl9umqowC*3Mc|1u;M-HETw>p|XsPaDSX`xGht*3^aV2WuJd3wXM4Kpo=L%jd!4IzZXrpZ1WlTepAcU z0zl@&*W7kRe<=-Wywx*og*+`HcU&W^TV1{4fR_k#ju2lzjBcJV{X~$r$gs_oEX3bf z|6f(DiYJQ@{&_H4<%V-~Kqdf3jywcYk@2+UQ#gdG%XHnCFFEq||H-fPBoM@jGL+raebF#Ybl z0C9kyi@*KsHH5g7a@&JRluS}TU&mUQ=ooV?wOU`N%br~1rhx0O6QK3JK;$Ob9M4fK zy%urI6}XEYZL}Y8YKw0^!>V*S*zYz#MU}dnn0{x#m?GtcfC7uT)0}f-sWZQ;^hf$R z+;^%Z+-hB-AVT3gutZTt$}~3k8v&T2df}Wb-_TCoOOLMud_-$jko7a*{9~c3Tg$s? z^i|FvfNI=4cT*|&EBqfW0$Di{04LA=e^tE+JXHPrKK>+X48>TpgfZEs>|10VYeF*& zB1_3mDNAL~GRUqdSuzY6q!3EhN+lvRgo+Z`Qz3yYqIdf*_jG1|# z`@Zh$y57G4kI>KRm0k`LSeqRU-`GlZN;ED7a^O_$>4%-Tg;YFyo`OC4Yk`>kypi$n z#3o!et&HP`HkoZ2NdIgv8z^YNGQOTbS)3|b;z8yMf(DwQv5D@ipm#SPxW1`9ff6(} z^e0=(1B#DHSBA7sBC_TIAQfKvGLmC&|s6 z97oHA%@~>+cD6hiEn(+Gd5zw#Whtn9BNHKHRKTZ1`T7gvJhjD>pyl0v)tJR)YwYJ> zRd|}Fc@GJwo8z-oQGbB3V))E@NZlb94eZM5($FW*7B3EQPdkjlx6*lWDAPobZoLBH z`t%!Re|bb%@raH!XtD!wBw^C4i7waaQDG=PaWJ#zuJN&c9{%>6I#FpWVf0gdVo~u7 zN;LQ#;1&(PfgnRilC$H1@@`+;ONBhPGtv^`s=H|5GY~gWRqlNtnvVr zc7ox_m)~B|bb-29yV^OB-pnx>(AAdXOt(ZPbAcu9*IiFS>vrGj&fBkISFVmDP-@E_ z7)lQ_&2M=UpGU@VO;uBXuv(%Z1JO1JIVUiJNX+W`u#OZ z7dNl6W`DpTrB!HH`WCDD^P$wS3HR=k`dMQMyYoaRno;L00)4KRoyj5Ye_u2+D6V`| zqWctKVUo>#3-T|;*PYhV=k)alWcT_L77F&1u)WzJ2!0(aI>DQ%^+AsJ(=5H=K03sV zHC+-_7@u~ckzZ}MwN?HYSPe***#w}UbwnU`xY2JP_TWag60_lQ@Ly1Q-oVitYX!h) z+5ZdBhmR*Id(ZyviCie$8_G%C2bK}{?k;_!0M`dTvf0TdkxZ$db{S_*g7pX2RIAMx zG0Xo)XM4XS&;u* z?6jru75VhjKn8p|cmeymexIWPoO55Ax#TPS=@c;hs29}sI8G!+NA>4DFKp@7=Hs3H*ep(Jf3whwxbahYGwwT9*^b3no> z5A#WF8xP!l%1wNd+%fm&0Ez zf+mS88NnH^6dVAiaI*B1Q)((!@gSSmFI_IMfUHBp=k3=(VOGco-Gp6ZHAHUqSmDt7( zy$8~~Je9VzfMcnzVcPQg5n9LD+gaJE8Gc-{IUXOHE`4B6z0#ibxhwd)H6{tNZHMZ> zA>{D`ftvp23)8c|L%Kvd)=q+5*YBIBQ^WQLor~e)64|u}nFe1@MG8LlBh`N5npJ1i~V^noNv8BnjWXpf~0)OwfI=V#7eSHv900Lcyg!Rf?9_ z73TC$wA|4xK!pIPQ7t50ZbyPftQd*M(#FNOK{AGf7c;p9S$#6G>|Bw>(NPnzuzz!O zrQxGktLc+cvo_oDP))huT`v~cF{m$SfeExgrX~;>x`o4&%lbTsnY)0NU>MZ?H+I!d z9E%=aBr%K_Qv^@a!z5NNwXRb3svOj(^e}UT z!Ss^*L5255W8=Askw-z*4+HYp2cy$3FFH~VtG%?P>_sDsCD=*NQO?!jc^&J4K)sQA zc|&9}eziPsy!D}_TAexYwsJ9fUW+rt>oz5Op9}l#B}DcBQ*ZYZ%PW{E^SpbPW&)Zl zje7E`!`V8GBC8AbFd;La+5I4;bqROqUBt2tm1?*|$&5Eue{rJ?ZK4&k3s{D1jipZR zw5qyT22@6?yYTG%#Ov?KDP*Hijj15fx8%jNo!M5h^aUUlwmXso7ToMnqF%t;6E(u=b%g_|sj@ucUcMzruQrn<7 zJ&A^Nyp@qC?1ndghVlXh#IhMVx0?^7|JD|g61QmbTSY0;QViD*AWZM!e`Sq;55UXi z3Ge}s*EBeF4OorGX9B`3n7fXODM@7Z|gab%*TnolL znOa4cjc`9wV#fBrD(s6(G!d4;0wTVQetzVd0ca6M((#R$qu)~+-w_6@%-rKxkJL?6 z^y<$Hjx}OR^kttN@jGWMoq^A|6!1IBp4PLGId$rSW7>~`RSC58)q>TM`xt4wW)TnK zP$~0BZ*P?+oXl%IEJ>=5flsaCy7E@RN}i#C^q7Ir+cqU4cT91|$OXMWwJw|L&j?Qo6tgfozG0(BGD;_@HmK7fS_t@)SR1 zwLv6M!;cz?mi4?9R-uf%5Z@Dg|0rlSmpj}fCr=u8D8Dw~oZ@=p(KL4<(|hwa=u~d^ zbh__8`kfA4(kdVN{a&*oJI%We*4jUqR@Nn5c(=`oAgO74Lj@*~uK(mcU?M4@DvshV zgQ&)UA*9;TuR@O`i*do?b~Tf9 z{|wPdNrP@eLM|nFF%1F`T>;vsialQ62X-l6rW2VAT{74eR_q1(FVU#Y82W)&SK~DQ zM%A;ScPXHpO%3FdC|nWasZV9V>3`ON&Ve_5p(GsS?{BR^X{>S{tkqpMm}d_o9O-B7 zhwfPjv>%9JB{N<}tZd$wivJQ4&KIH&cuqVf)w$Yex`c^}`N+p?n!Zg52+0NUD@xj{ zikFKpDAa&kTv0gCnkS7jDC%);ITm~C*qM~)U}dE$%3{57Ss-U$BvUVA3(5cc`)@ax6%kq59=chMgV^GRk>27ehU6@upj#{J&NkvAk?CA4X{BBY(npY|ne?yOyAYNJts7t7-xYJkci4cN>~h}btA1OC z{NJ~p{lp;%wFi%oql})nSt*GRKb=f>SAFFk@x|?lGoZ0cr~ja3cb}`FS#4EBlZ{ue2XbeJGH)t`C`hH#?Y()$J`;MMyIokq;AGL zj2wr+ftKrIs+$@MDgD&*3z*XfPW%w%aJk|q$o!RsPkwcf!?+S-*A0Kq>`36I-W^5~ ztJx_8@9D2r6zIxw>BI0VO+fkQxXuNOTrXr2~l;~V!#`BS_mvdEN z&+a%FF&>UMcwsU^V?h;}<0f`)P!sCyi=-G13yXPUWME9|efM`}o@*jdKya;6`io5tYzv5X+m+kv}WW z{_I^d>a&am|IcK^B`L0t=r?R?hOui#TwWu^I&lrnhyPb}dyg1bDc$IKiamJ9VD=Bz`prjc5ICb4u>~ziE)n22ib<_~9H7iY;k;}#h-SCIH zhH#h!7{2LE|G8~Msb~Q}k~B}29ZTp4#7F*$h(pU8_mO5ZegC}tiER>yPXCg4`;LtDGP;z!S2=r2v2*Xn2u^CEa1r0-YIb-YMg z51V{q6yLtimszgd(a*1-dkF{vik)eCKa3D2Rs5OG%Gl>#?Ty1wXZI?M2ZXU$d1xa~ zwk#brV>lkFV#loUV@O!+dmDfbjxP@9f%$4Jv#Sr^-X z1^w|0|IITOvj`5EHX-Jo2jc79LvsK580XPXhE04|D#uCf%1Nlb_1YMdz8> zyr*XO8ull_0q&H3YK$8klWgLl(g89jwjrv93uQ4aHEpJeZWk63Uw<*tZyh1OP+J+d zJhIiMePQS=E`p$-@fK#X1wG#be=K? z5CVS;G5;)UFr+gl5#SZ$x}{=6T&SS?l0k8DBv5js6gnY$X(6k61NSWlWOaW8$eKwN zNXi9qJ0Xlc#3gSpJ<{9jQZ~us+!q&ZBD@zHb{K30$^Wx)Itm|TzQNj|x3^5l4}khq zyieaL5z()G;187%KXumd3=YK7GG=M^XBnDX}|Ao4?~r znBM@_VKD(8@>h?8SS`(5Y*`A#Yo_`d)8#2W z`fkGJ&`1En{=d}wZOZ_&^9FBl%=f0&pf!8%#^;1{XmQRe>Q&Rk?DpkPI<6mDJb9Ie zr#~my>4^dj?{yN@pq40IR_sN%cab1%mFQJ!M?BU~C+^sl@$_5NrlFQ#h(db_M1B>n z(5KgcB()=US5N15!?2X};IOw+v~T(YO-H)3G_WTWRm5H>qVNeTPa?gha#Y{~b|8Mq z2@D7fy7=JCQdNr%JSu!yWpM3Nf{?IX(0Q`mJ_v$t1FSqgZEh%YuB>)Ph{FY9XSCWm2GQ-|)-J z{<|vn4gE3Rx^noXBI-0-P>u2;JNC@@guDZ~RnH_+qbTE1TmYu;ey~%%H2nb_Zp)YT zOr9nQ2?J0*fDZ~^=QO20&^Cc=0=;!@<4iD0a{3^HSeOB{SrHlK+>sV{Mezw%j3!kH zI%j^7qK;jK8w0ZZ=JwufJ27|z2Jn6m8P4=$uj#1O|CJ=B@0}k~AVWddf7_BjHEkrd zV66 zhz7Xo(}9B4qqxZHF$@ySOy(TO+yiV2#tSUF^-E*K4Nh^u7-J%)1l29nkU^J?syJH! zn+F5~nv`sJs5iW~?;vcqa)r^hZJ^e$W~m>BbIJXA^vd;=%;uBrSGdZ7xhZ8+{)4Oh z;DL73GKQrL<80l3+n^R3jUJ1EHAN$Lx#GmWD_37~{t1bJEbelfiH zJs3^tvi`M?f7r8%Mu7#+3G(V+b8*bv-b?2(*|cJ5hGr>n2H+(ORtobSx_0GQJ?^wl zX)dVycCLs5qzmda@`f=r*-X90y#>A6dNrT$b5Js56XDr(e4XDlRhrQ8NkcTj)P>_1 zQRMZKv*OaG*p8d(DnVCu{cDPF{xvaC$BvS|dK@i&?eTA1YtA%Tx5iHAL>?>U+$QVV z{)hG4q`!XBN;z=**_j=oSKY;)^%{IUJ*`P@`bSB|-z^HnFPGvu8=;%=Y{=_Nm{AHl zamKdP;th}~=#5-fTMGOO8x85ED!Y;|UV}F4_F~9aK@V_g%v|v%0?_kH9Y6rEe7Kz2 z4wvMpOXCL1bd5$yaRXeffErgbc>3knd+EAt6=3K}lgaqBKPW_He2`zM-*S7I7_@Wt zNzWsZX(uQaXOg|TJ&DK7DBYe%0?l*ib%y+8OqWUeD5VoY4eVk8{q_5qcD!m|tYS$CLY;=!Zp~qpD5-gc30>lAdylsmv6yaHg zOW{gj(oIgW*&W!ZPQ9J2Tl*BBCCW$ST_!&!@9sw`f-gE_r%`UQ^tr9vV7B^d{2*Sf!Ak9Ss7&)P0ywXo~B(pq9UYa%0>$LGF*X~sU^f52iCRT_4Uu5SuQP+kN{d@qMhVCa`ju(Vq z)v)V-w-;OO|5-0QyU& z&y&ILkeP!nULeNtactdVy%wI0)peAG5|xUc45Ol9SjBK5nS= zTLr-T28)k=h=jVHp_ZjoXC7y=!`DX{pB1&lkXwDh1}RJ7 z;x+^%2QVM2sVqls^*c7Clxbx^|KDdbM!R12R+20@x{Rayk2F=IBZ_+d5w!C7Ck3li zjpz1qv?gWW><52xWgrBqQV%RM1^qNKEPesDBo=L)%2XCRXekofIE&*YylAD8OjrVv zSjgq1FV!4x5sE7QC2I1+AY&|1@;NWvsMyf8CaJ@N4}61ntpg~0gAD)L=RH7e+{ln&92nNfxc?->M>wwSnwGBC2CjT*}uJ%s@KKI zikkRfSc7a2#@u*|ESRW)9vB<-K%IMt_?Q@xiNo1v&$yRVK!UYLe4*A<#vt(xT&dye zqJN(t7JSmf;USA>G<)|j^~H5VF(rY_p3oSVkMD$3K>}npojZVa`j92=YtXZ zN9uz)5Ps1N^IW&#B0!9UEaiBMPsx}(v9BTg{1sV0_2?VdC{Erqebq5>(o3`8hgiYI z8UMbAgk*_iFAdL()4my+=eFa{VP(*nEq|u9xp{(LV7z*!=C_RUdE(E@JAJ>E$a|H{ zT_~CRfpMADD()=}{b~4JF43Vh9xTqytwc0%RT+jNqGJHd16PsDSXdH&tDWBrm@V1y zM#k%5(U(dR4#Mboh23Ac>8boUDpJc!eTA@uII1UO*5VZh?iJOaBr`!+x~7+TD6hMOTa*t48>o`*iYky%Mc*%2#iGx>rVy#tr$ z;aav^KguS7xtNR7WcNy-67@bscjf+`vWR47oYeCei@*0siD&EuUqHN=JpC}`VNd+e z%lMyJf58{c8c3tMJ;bu`lP^Ai1Y8bHRxBXq^19GG>TiM? zVe;HMBd1sY62H8uMY*3#3f(b!_=<7*T0$kw?u0{~cc0PwPnNgV`=~ zF}NA&BhLH4Ilu{-m&FHJ7`%qTmL4X;0Om~A90xFHKJCKGfjnhr@x2GK@Xt=pMV@G3 zgp;`@(H+w_w&lfA70xW4amhXI79MmFZn&WL##zi(iLzV??I9kNlrB_)V!?9mGMsbn zhUAkN^@d?^!=gujzYKUj5MXU$kSFuZNt(Ro^O!#R?lMS~|L#`S3L|`Z%d33h6oGR$ zPoQ}N)qj|=V|os)`00Reauy#UF&kA&f(xTDSu*X@j;v{uV1)OWIcbF_z4mj;;c z2cra~ClN7VizlU+O=hVFOoE@UdQAc(`7j4e%=(t@M{ud6fSC*QQrSu~;)n;pY(jTn zp@799_0lgohoxpPZ6!p`z&cIY8QNLUCfRN(jBc3(85=C7o%9g-ZHy8cHv$uW@LFYD zXy@keNRFRgg9_gzPxOnf6D~GsH~oz>S0~G56#^ANRXSQ~7zZX+&`jF)pMq3NTl);; zH=?V3+cPbJLJ3A!3Vb|(;8R>PdKF*~ zbxu$4Fdz?V95 zGWoyu<3MbO9wAbmx$Ezs>_fA?2tChZtOr*`A+?vMw=@@?aCu4$Oo_R0ay&NV-eh+k zF#g625*A5O(l<=IkhY{mVc$c@+aBUcDk_BwQyBeyKjT_mg0F4^72)jw_q(f>xz(We zn5ME55BE@?MjEco#hNaU;F8{a%Xl;Lsizlj*-7g3{Y`}?xq{b7%t|9+zeW>yhHvePk$X)Xlw?MjAOa4cx?V#^k zn}fZ3%2d6<;RcdTD+bVt7yZdXyk?#$)=M6)*X_MW|<_MvjkK3kNU=OFw-iTe4#VJZ4% zF}%IFP1H`NVO(o#A8^}fOVV6#=aqFP3z?QS|k z47wGG7AS*TW8a(wxCwi#HyC4Hi=f@kU=Z-BioSaKJ*BSa%1BMm-?1H0u!uq~rL?W} zKW(He{gVqnvSed48=ndVya-#lGS3Lp>yzJWysn0dS)#tltkYoQG~1je_2dXtA7DR? zegXf9s<(G_^uFY~s-7e}Bm0#-?26l3<&j`+DX3c0&T zhqTjz{Mb$k?@+--6|_bY_a0=z3Z_ANi`aQ{7?*e0@gr`fIog1J#~)vB_nSUVXAkzG ziWByHU(JcmzjpI=gs9q`Mu!nqRYs2r<^V#5zKZTY8DnvE|W=|Rb(G<$PZa_Q`?U*Ev8}9;)s#KkiMd=xh31m7)U3q*o!tXHSymI zkX+7Ik+{29gvDm^y;>PbUf)1_4DFwmsH+b2@n2nKnCQ?Lq{{8{#?kL8< zifiP1R)wD|IB2ydT=phW*^f=|mNv{@Gi59pmXZfd+R19y2pB(bLhMAm^)ZS1Rvoy* zJiAwLj|n*ZK9;k4aoL4@F{7Au0)xa=28n6t#NVc{obL-tk!d|TDf=De&lr*yhB}5b$HNui$fX7RhfRbF?a45!WMgvl4LSrZ?Swwfs&!a zmFwO21`4wI)rgjGQWl9L{MW*$u#zm^fJtnz97x?hY0v2Een-_m$BVCcu*lEt<({01 zYUM&+P#fBO)xG+5Pv10|1 zcHe@YpjTMP*L5wv3Vf4#F+H?W=7izz)H55S4ed#efAme;m^vjmqVCxo3~aIkieu?) zKg*3bYb#FhgRdH^wh2CR;Hc@H?h>q4}*? zdZ~8t8YSY7xX0{)8ui^>6xuo;@*Mn;env{#`6IEUtEQD-O^|~Brr7WZ74!NGaLveW>T18Yja7URTy3|;v_lAG= zigse`(3;CA-wzSAK9*nv2I9Iy|Hf|FC85AlT^PszCz5Ygt%jv4lf@GXuc-3lISux} ztM8h4u-i3tH|>o5&KY@V8!YPLv_ky7OxxqbSsQe5J(PYI;h!<=4}^4M!|-a9Xp-+o`YIzL8-@S;@tc4iKjwYCS*e2 z{PwWuj(AIIWXD9Muyfrp{u|f*exHRVqCh&s;UFj8LcR z)Rl;P^ksLw4Dxe|@OUBeGfyU99yK!t#a6!Pv9Fg2VKp*%^Mal?7c&%5Vm!`-RMk%6-138Es&KrC1m+Z#eC4obv!og@~n7IHN4w%vIbHMsn^mCL}Xj@sh1 zb2z0>NMSf7oR`1tV%w>N8hL~I>@P9wr)$n#HcC%ROWBz?1F|9KCrq~p2h;d!0ZOLd zu#EIx;H!eay#psAy*BUaD8uX+{MrZc$@$#Wrf6>Ji#L*{>GT^U@r%1^R$-73II;YD zSc{P)Z`tuAM6gncxBzpN9gM-L_-{O-cAK}fP}bx_d)_xv?3wjyTqiM<-b+d_0SS{y zc^yOG&uRwcz}mk{ZY2Yg(peaUran$}c0W^1{gW;8DW`;$u|Y&`|AN6BeKg_|i@CDH zls#ueh`|#35rb(TBZB^# zJ;LblHizsT%t^aHpl<-PjwGEc7~jp83U5=q4O;$5PaQOIuQq;P)^C$>&L~%wTpeWX z&{P3?7U(vNx!oe%8;}H(+481OZU&=-;iOm$jHTf*%UW?;C=-?JxdL{jq2J{yF8by` zXuy=w;`wVTw-90%_9BgllNn;B{E^Y1Nv6Wy+}|&cS*)dQAmg1$P9$;(0Y2{;AI!9cF5upW8f0 zJN8T{?Id>R=^G~yhjBz|;%zHf9LN(-QC8!K3z0WiNb1*A0zd=*{tHWuy&>Xz8n6DN z^ZG0oerG1QJF$Ppp<(VXjSv>G*^MtK-PErcJ#Rh_rWuvPziMT`u6o1PS^xF%&YDY= zCdDB{?8h@K6Bf>e(gH|8vZqcK+zzzy9K#5^j5*1rA^EH{6fr4~+337GCOH?K4K8jN(~5oS7XXn)fPvH^M(QqA0w0&vbd?@X!`RW0?Je zhxmJ%Q)@?Nh%YXeEE=l24jyqGlv*zg#P;SC%JLgHDJ3*}>@R$JqJ;Gb=|YXUt7icA zSahN6aIE+Z^G0RvHfThyUBdbnSq5QFN=^@T&% znYN^xuLu;#r3^^rH_4}bTk!W*?|)QenS2ahRh3O)(u))KdiSm4%Ua0fME!*?H#H@n zY5l*TA~wjZ8&}lj1)fJMCG7UxIn(CD^`ciYi9*d~BAFdYksRD; z@o-;=Ikfh6mzY&zS=V}D9#iVT&Vsq)A$teHdb=GFL6Hg|*!8}j*Aj91t>b3RZ<1L^ zmCzcmiZr{0NQ{2XCQA;_-62i(GWc~hL^w6hIc?V7#Ncpee#045>8|re%s2If%uX`R zOwTe^hdYvm5RT-YEM7>SdE3{6BJFrD!*ZBp=8w$z8HbMuJ3h;$(j{Bz`Lfe=wB~_* zSVYZRg+29+I(zDc&`a+Eha5%rRXTltSBSDjiwHWBbI!>2bp60E+W%5Fh*@G0wU-=! z#io$!Q&iMpz;{vCrbk9n4^l|o2J%4H-Fw4O|B4V~{G_w5^hB4V=b8+1d=Knd3 z37+@*6Hzew`yM;Kbs4dP$y69!E<0NdxCRAv<*E_=v%d~*weU0?GpMpxFCKo5r*dD5 zuZ)QCJCyI?g!$#2ijNS6`IWDXzcoU%_W_uLVYqhuA$z1*NDN~aL2FGZSScjJF(gJ% zp28ZmhACQHjDp!;HfwmtCmsNugl_G%=PFc=ug3t!Re@~_vp)!+Zk?|c$g&@;!*3x_ z=i1UCm<*ZDRUJu(8w-R;R z`lQ&VjZvEz8abZ_DXeb62=Bop{(?`+KaYd}G}Ha8SMoG2`h|1N}=VXQ&<$)~z}`tQaq?Ae3Exw6u2IezOJp98S4DGdh!GT^tpdi5#FGG4nO+ zNrx6LHa7(u=x>i=c#9zxkoJIu*{itF78PhEcMM(O+p)^-nPs^?eV6(g! zket2r%xuv|*N0w_LTDrNwCh;)JYw&3 zQG&UIRe*YF&tTEwrUXzgx%qR59zGTi3)$wrNn36nN4uni-*sZjZZO53P%S<6k*5qN z)I~M&2Z#U+sclv1zP{AaqI=L7ZBmzFtN#&ld#!pWCGg3QM6GsVMLUJb+9Y;V@8f?M zhBaDhYs&WsOV4^~{;Ga^p?yiPB2;iu!${TTiBMAftCf>9(n6t3C~xNMC71+E)(5Uz z=c|wSbu{a6rA&1SwHLSnSp}V&ZRCMAikDt~9JvT~R7&mrG95|VL7%2enAVcjoH3|N9bHIK3jdt;r>B3BKhm3;rOQ?;tOB7 zeXF)2H_RDH?*3%*H>sqOlIuGM;EFtK5U$}OBNwi5uUyArxyClGUTdz`yi@5CAu_vx zs?+5_BtPZkrheCF!fFueB{i6veeTpJA_E#^bRW)g&^{Ox+E{-x0K#ksc;^9m}Y(H0SRjscDkv=�x$?Z}F>z(?cX@vur_9P_I!|RN$ zANiWc5oZM@u@1e2#Wdc~bdQDOs)!_?WO;cNbk;0*7I_$I@>}GgqwUl?$v3(c;NIXXrN$ho<+X8F|y<_W_`P#a9K)hyBkzk}$s^(ny zau@gIPN**UxXYEX*51VUe#sCYs3L&&$L$=ZBlbnPOoxj~f5@?`S3e*uTMtAdvs_@{ zrbg7U&g4r+ue*1`Bj9mV_Hs+~fHcukdwy-@NM__G;@yj!#~Yhk7B5Jy5%-G0Q1}z3 z4vHJ*c~wwnFwDv$pE^KA1s)(S;BA`)P2#wj{Ck;RiwX7?iihZ8Ox}ONBTnO{8NT{y ztsddlytv&Z1U<5m@s)Cbc73s|R~WBbYK44p{U`Q*?&1)@yVB!Q_QB(WAh}(F?bR-!W7;8gPe^!p`cYdt%JqGls zxX0Gh3{N;y;$QWV*)__Deg?(Y4%VgZw9(4!=%W&Eyl`79O1QZbrW^&)(=&73$eIG3 zT_5%n0?>cMin>$^C=-_0atGOe|7syisl~lIi(Ac^9m^HOeUB|{`Jvm+Tt0&VaE4L1FeLZgy>DN)U;jTE6Iy6$hma{ME&t=+2Uuo_o;6JuS1>Z~Liu+z!(>ftFJW$vJzni%z-LLgRAfjxA&{vM z`s9d3<^G8rDaQ9GF21w8U0hL42R@p9)-VbhA;=kR6>eEE8y*;so+Ii!u-wtbGD0}~ z?+kzbw1~CK`B(gQm?MSHifr&RnfEarmJ;m6T^yDs9$6gVS@u|CjWOO%A*3mW`V~gn z1NZN|o?3ep9_fc9@mp8~M*1bxQEK8eHYge$Qs*&28J6e$O$%}ZBK<7ByPo7|%0Zd@ zaw*USYj*2a=#IxqZYJlW(&_?LTCig!}Pr^jN-eTu8+I})3C4FrCEQ9QrNGT z{h;Wa8x~RB9s09q(NH{7)lWAj(U5UJT0Af&i-sEed_Qy5mj8O0dM@#s{BtMH?RX1# z6jOxsu;<(EKlZIkrT8r-m98i?XAk#65BJC9Jljg$JM$ML$K!kU%+Eb?b?WKv9_=k0 z8%k85&?CWJmTplH+(@1JQ8;`AU!zE*Q<6x-9N?m=#qpXZyya?5>VHv}=>PI+*fRPNepwbVct`m>(?U zhCeArkQiP1EU>lZIm?T5t#Dd?tMEjflk2XcgT3zRDSczxX6Bi_-cgUAWs}`3#XG95 z`uP+J=71U%{sYEx6k|uj^u{F7AU=ad1zjowXAD-3kYbi`rs1FS$)|q2;gw@b)V6GO z2|8!ZuG8-SAZpO~b`E!&;o^t8OZ$r^>TP){(t=*{m|h&IVwy#{)GU5D36AIL(Fv*{1R1Q#-}ZNQ$K`xLdu zrKA{dei45EMm6jw{o(g-$Oswq-F(Y|1voA&EohdP*~)|Dl7M|(P>5^*WgdpYwa^X% zJK(@IJmF&6;Me0-NRV-XsmbCV6@KL{e)EwKquy5NI?(#CcC<-p~8rL(N0GF>Q>?(dlQ&K}CE+l_k_ zA^nKD5mnzPKp0Mr0a?9%3Sy=4>fxN;+p4HZwrb0eh&Kyc1u)f2R#OXXl+^ho$U1Ab zxIUcfbnKyQ`3#9oq!yyK5dBQd^8OhrsDd;C?sumETr-lX;t%J(A1Q+#>lts_=*tHo zBf=z{CZ7Osqi#P`F6jC7Ant39hgr!cq2;@g7`w>^x!sOJ3f}$@?7q$2GMPvT?yR&zGd$gqW=8(RP6f{8YE_*6stJv^^d^ IWd7&>1L(=jaR2}S literal 0 HcmV?d00001 diff --git a/tests/fixtures/global-summary-of-the-day_72019300117_2019.csv.gz b/tests/fixtures/global-summary-of-the-day_72019300117_2019.csv.gz new file mode 100644 index 0000000000000000000000000000000000000000..b20c4c3494a4c9474ffd9ffa53bda3941ca3fbc4 GIT binary patch literal 1722 zcmV;r21WTFiwFpc%T{Uv|7UD(Vqt78b9HTPVRCsbZ)PoYXk{&AVR>ISGB7bYGcYhQ zF*jc_FflnUV{>)@jhf4DX?@K@!!|?uRs6!`{VbIAK$-zp1;0+{`K$2Zy(`@&2k)OasKoAnuJK=*VxPt}<<^wX;F=1};F|VJQ|=X!{}uz($2KX&K2#AoN4JI`f`wfsO1xzB#* zxeT#i?x-JOryz&C#=IhSo@Z}}UD#Rm+?79p{O}z5*zbi;)DO2)-l*qd(6Ie-u%#U| zE(cpqJB4cs;xewO$aCeIdoO&@xIEdy&$}mEq|XC;Dl`*ZGI zYjLcZu(LQO&T;|AP7U7+FFQt+UeDkd zKNmGQ#_Ojh$ELDVpmDCLyV|JPBMqhLh)b*$yIQT_SgR_oxjQ@crAHE)wHG1$0b4jX zD%f)7uyf7IbBO#{+tq4)VT-U6yXRm9TTXw1YwkSvgVu9Rw(#dgO}0!?KZ`A`37;2R zx(lBdTe`~OVoNW|PKQRs9>@=`pT(9_Bi5S8A=fOnocUq?w3q&;a?Q$fQFaQ}8eCHm zmvc>nM);F?7Hb7G2iJ@@G;>!Q4czEO#I?B5RSp+7dKGcmww_yZV^aP!aHH{ew3gfm z6?^QS7cIGABF~o3O71h>tvEMYa$|`6peG5DXU}>T{#5jtJa*4K3r)uv6l(?i;rq3? z(T0j^qJFrY#f|R5=hc&RqnZx3bl!(|u%!n*7aeTryl?5rmY{Lc1{4BPF)AQBAmf+8?4z`4g{4BNve|~kaRg~F8Ol!EJuiCpB(By9^mV+((37Yd+q0!7 zTe#1W+-OSUc%B;9l-=_^k{kREEs`5kY5J~yB6|{kuNB#o@SZ=C8%hIiOc6V{!Jj+v z!VT^-xFIza8sSfaKfyKq4W9$C7p@s#i^$>JF*Cpo!KeT?q9~2;I2PbW6mc#VH^P*i zw&P)d8_~p`E^b6sngNZ7ePS)XU**_6;{rX2*wX>F1n0&8TY`U=8DNXZ;Q(8rD?4ph z8v|?+wK2dJaRvw25~gBLws4;<-`^|O7&HghICv;D+57SQJZ$0l0b9C=-L^G9vL`7j zKjRI}1jo3~V9OzVMo*&h1GX6D*hsdR*i*1Y<>z4wj~#5O%1&UvL|iM+L*-|}4v!sd zQRf0|;XVIMws7{&WD9>6p2-%z7c<#%C{072#ai3GWoF;P->qi$Er(hw@2t2Tuw@84 z4_kztZGSkEEuq$```8y-IzJZ^Z0TyhEZ-{&*W?|nurqh}bu;f^tB7l{U9M0W$tC`<-=sUF?;6|l==B06bD`{M_ z@=X1?G!=JW#x?ovrf^NiT7zry&g$TrvAH+CG!yrJT!U{nDnDj#XdJN%P1&5&OH()B zQ!Y(I4*6c-4t6R#vAI9IG~*3_k{jHgXTF8kD!8HY18zu70i$^Rcz#phvEvT5i2CuY z=gu{;`R;jX^1Cq4^TQ3!1aRXJ`B^V70yfkBXPCaLC z)t)}w;6A%;W=b!OZ)Qp_O+oD3XU`dOVW(|ocP~xfF~O4?F3t|PAvF_cnXd(Igs_92 QISGBi0fFfubT zGc;c^FfuhRV{>)@jhVfU961bx^Lq+o;`5+INu(4Su!9Ty19;#6S+23u#hIjv11w;y zQJ|<2`HAYi{r&j%@!#)Xw|{TnzkU2T|M~dw^Uv*{TiDp+ux@>v|7nNKuSYw7&R@QK z8T-Dt#y&OE?t^RkLo@HjH3M-Du9*)_Q)@Xi!8P&FxQeqrHGbSX*X&1}ao<$aj)x{h zoYs&}P$z-gzCG zq2~GCEq&%SW|z-h_-qpzk+Z*%b0B9CXF(%8+*pg(b3f`c?Ikx1Y&n_Gx#p^Qp0g!e z7OfvkwuD-1Rvuci<)HppvSrZvF|b9{n1L-r?dxL82$9dl7Ok{GGUfF`)6yyJTIyE^x0zYnfSuJW@$zpFE~^tp3QgNE-N{XUeY zSIq3$?;$+A`rW6fAN2cHn!s8@voNpn^TI5l&K}&;`HiF=NsIZ;D&cvs}tPtq1FoYj#z6|y)(fLKg3$##uomx zR=vMwawAln4o%~lQJ*Qe!Ff278zDSwQP)^oZ)kSyp(URWu4%PDmOk?{wKwYd`34bd zC7-#6;KovWkNQmOnPet6wy4948)wb)zPM%*H=479EzZA3d9r1xIFGY%KDT(Xg?}gU zWDDPyCtI4zCn^s;*&_4VRe$-*w^N?a^V=!Ur&(2po@{ZEGuX1knLgPf^2wP*#EH5# zTKe3$W+P5ejg@z$zp!OOS8`21s(C(g zCgC2&3pYfZ{4P4UW>j-Rbu4Iey5NuI7gDp~%K5wpZd_N4XNuR~u7c^q;yVhK6 t@hSENwoFk!Pqqk6N6quSTl&n;%kup$_T{yQV9V$G>wlX2i)pkW003roW6=Nr literal 0 HcmV?d00001 diff --git a/tests/test_access_api.py b/tests/test_access_api.py new file mode 100644 index 0000000..da64017 --- /dev/null +++ b/tests/test_access_api.py @@ -0,0 +1,170 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" + +Copyright 2018-2023 OpenEEmeter contributors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +""" +import gzip + +from pathlib import Path + +import pytest +import requests + +from eeweather.access_api import ( + API_REQUEST_TRIES, + DatasetType, + FileParseResult, + _get_api_request_params, + make_api_request, +) + + + +FIXTURE_DIR = Path(__file__).parent / "fixtures" + + +def _fixture_head(name, n_rows=1): + """Header plus the first n_rows data rows of a captured api payload.""" + with gzip.open(FIXTURE_DIR / name, "rb") as f: + lines = f.read().decode().strip().split("\n") + + return "\n".join(lines[: n_rows + 1]) + "\n" + + +class MockResponse: + def __init__(self, text): + self.text = text + + def raise_for_status(self): + pass + + +def test_file_parse_result_from_isd_file_path(): + result = FileParseResult.from_file_path("/pub/data/noaa/2007/722874-93134-2007.gz") + + assert result.dataset_type == DatasetType.ISD + assert result.usaf_id == "722874" + assert result.wban_id == "93134" + assert result.year == 2007 + + +def test_file_parse_result_from_gsod_file_path(): + result = FileParseResult.from_file_path( + "/pub/data/gsod/2007/722874-93134-2007.op.gz" + ) + + assert result.dataset_type == DatasetType.GSOD + assert result.usaf_id == "722874" + assert result.wban_id == "93134" + assert result.year == 2007 + + +def test_file_parse_result_ambiguous_path_raises(): + with pytest.raises(ValueError, match="ambiguous"): + FileParseResult.from_file_path("/pub/data/gsod/noaa/722874-93134-2007.gz") + + +def test_file_parse_result_unrecognized_path_raises(): + with pytest.raises(ValueError, match="cannot be determined"): + FileParseResult.from_file_path("/pub/data/other/722874-93134-2007.gz") + + +def test_get_api_request_params_unsupported_dataset_raises(): + with pytest.raises(ValueError, match="not supported"): + _get_api_request_params("UNSUPPORTED", "722874", "93134", 2007) + + +def test_make_api_request_retries_then_raises(monkeypatch): + calls = [] + + def failing_get(url, params=None): + calls.append(url) + raise requests.ConnectionError("refused") + + monkeypatch.setattr("eeweather.access_api.requests.get", failing_get) + + with pytest.raises(requests.ConnectionError): + make_api_request(DatasetType.ISD, "722874", "93134", 2007) + + assert len(calls) == API_REQUEST_TRIES + + +def test_make_api_request_succeeds_after_transient_failure(monkeypatch): + # first captured 2007 observation for 722874 is +0150,5 -> 15.0 C + payload = _fixture_head("global-hourly_72287493134_2007.csv.gz") + calls = [] + + def flaky_get(url, params=None): + calls.append(url) + if len(calls) == 1: + raise requests.ConnectionError("refused") + + return MockResponse(payload) + + monkeypatch.setattr("eeweather.access_api.requests.get", flaky_get) + + elements = make_api_request(DatasetType.ISD, "722874", "93134", 2007) + + assert len(calls) == 2 + assert len(elements) == 1 + assert elements[0][1] == pytest.approx(15.0, abs=1e-9) + + +def test_make_api_request_missing_isd_temp_parses_as_nan(monkeypatch): + # 722874's 2025 observations report temperature as missing (+9999,9) + payload = _fixture_head("global-hourly_72287493134_2025.csv.gz") + + def mock_get(url, params=None): + return MockResponse(payload) + + monkeypatch.setattr("eeweather.access_api.requests.get", mock_get) + + elements = make_api_request(DatasetType.ISD, "722874", "93134", 2025) + + assert len(elements) == 1 + assert elements[0][1] != elements[0][1] # NaN + + +def test_make_api_request_gsod_converts_fahrenheit_to_celsius(monkeypatch): + # first captured 2007 GSOD observation for 722874 is 56.0 F -> 13.333 C + payload = _fixture_head("global-summary-of-the-day_72287493134_2007.csv.gz") + + def mock_get(url, params=None): + return MockResponse(payload) + + monkeypatch.setattr("eeweather.access_api.requests.get", mock_get) + + elements = make_api_request(DatasetType.GSOD, "722874", "93134", 2007) + + assert len(elements) == 1 + assert elements[0][1] == pytest.approx((56.0 - 32.0) * 5.0 / 9.0, abs=1e-9) + + +def test_make_api_request_malformed_isd_temp_raises(monkeypatch): + # a captured observation with its scale suffix stripped; valid payloads + # always carry a "value,quality" pair, so a bare value must be rejected + payload = _fixture_head("global-hourly_72287493134_2007.csv.gz").replace( + "+0150,5", "+0150" + ) + + def mock_get(url, params=None): + return MockResponse(payload) + + monkeypatch.setattr("eeweather.access_api.requests.get", mock_get) + + with pytest.raises(ValueError, match="unexpected temp value"): + make_api_request(DatasetType.ISD, "722874", "93134", 2007) diff --git a/tests/test_stations.py b/tests/test_stations.py index fe74390..7c1d7a5 100644 --- a/tests/test_stations.py +++ b/tests/test_stations.py @@ -1815,3 +1815,249 @@ def test_isd_station_load_isd_hourly_temp_data_missing_years( assert pd.isnull(ts.iloc[0]) assert ts.index[-1] == end assert pd.notnull(ts.iloc[-1]) + + +# station 720193's 2019 data has a real mid-year outage +def test_load_isd_hourly_temp_data_warns_on_internal_gap( + mock_api_transport, monkeypatch_key_value_store +): + start = datetime(2019, 1, 1, tzinfo=pytz.UTC) + end = datetime(2019, 12, 31, tzinfo=pytz.UTC) + + ts, warnings = load_isd_hourly_temp_data("720193", start, end) + + assert len(ts) == 8737 + assert int(ts.notna().sum()) == 8106 + assert [w.qualified_name for w in warnings] == ["eeweather.data_gap"] + assert warnings[0].data["max_gap_days"] == pytest.approx(16.125, abs=1e-9) + + +def test_load_gsod_daily_temp_data_warns_on_internal_gap( + mock_api_transport, monkeypatch_key_value_store +): + start = datetime(2019, 1, 1, tzinfo=pytz.UTC) + end = datetime(2019, 12, 31, tzinfo=pytz.UTC) + + with pytest.warns(UserWarning, match="internal gap of 25 days"): + ts = load_gsod_daily_temp_data("720193", start, end) + + assert len(ts) == 365 + assert int(ts.notna().sum()) == 340 + assert ts.mean() == pytest.approx(12.24902, abs=1e-5) + + +# a trailing gap shorter than a day does not warn: station 724940's last +# 2025 observation is 17 hours before the requested end +def test_load_isd_hourly_temp_data_short_trailing_gap_no_warning( + mock_api_transport, monkeypatch_key_value_store +): + start = datetime(2025, 6, 1, tzinfo=pytz.UTC) + end = datetime(2025, 8, 28, tzinfo=pytz.UTC) + + ts, warnings = load_isd_hourly_temp_data("724940", start, end) + + assert len(ts) == 2113 + assert int(ts.notna().sum()) == 2096 + assert ts.last_valid_index() == datetime(2025, 8, 27, 7, tzinfo=pytz.UTC) + assert warnings == [] + + +# regression pins on real captured 2007 data +def test_load_isd_hourly_temp_data_2007_regression_values( + mock_api_transport, monkeypatch_key_value_store +): + start = datetime(2007, 1, 1, tzinfo=pytz.UTC) + end = datetime(2007, 12, 31, tzinfo=pytz.UTC) + + ts, warnings = load_isd_hourly_temp_data("722874", start, end) + + assert len(ts) == 8737 + assert int(ts.notna().sum()) == 8732 + assert ts.mean() == pytest.approx(17.851869, abs=1e-5) + assert ts.first_valid_index() == datetime(2007, 1, 1, tzinfo=pytz.UTC) + assert ts.dropna().iloc[0] == pytest.approx(14.89, abs=1e-5) + assert warnings == [] + + +def test_load_isd_daily_temp_data_2007_regression_values( + mock_api_transport, monkeypatch_key_value_store +): + start = datetime(2007, 1, 1, tzinfo=pytz.UTC) + end = datetime(2007, 12, 31, tzinfo=pytz.UTC) + + ts = load_isd_daily_temp_data("722874", start, end) + + assert len(ts) == 365 + assert int(ts.notna().sum()) == 365 + assert ts.mean() == pytest.approx(17.835623, abs=1e-5) + assert ts.iloc[0] == pytest.approx(13.222929, abs=1e-5) + + +# truncated data warns: station 724940 ISD data ends 2025-08-27 +def test_load_isd_hourly_temp_data_warns_on_truncated_data( + mock_api_transport, monkeypatch_key_value_store +): + start = datetime(2025, 6, 1, tzinfo=pytz.UTC) + end = datetime(2025, 10, 1, tzinfo=pytz.UTC) + + ts, warnings = load_isd_hourly_temp_data("724940", start, end) + + assert len(ts) == 2929 + assert int(ts.notna().sum()) == 2096 + assert ts.last_valid_index() == datetime(2025, 8, 27, 7, tzinfo=pytz.UTC) + assert [w.qualified_name for w in warnings] == ["eeweather.data_truncated"] + assert warnings[0].data["last_valid"] == "2025-08-27T07:00:00+00:00" + assert warnings[0].data["requested_end"] == "2025-10-01T00:00:00+00:00" + + +def test_load_gsod_daily_temp_data_warns_on_truncated_data( + mock_api_transport, monkeypatch_key_value_store +): + start = datetime(2025, 6, 1, tzinfo=pytz.UTC) + end = datetime(2025, 10, 1, tzinfo=pytz.UTC) + + with pytest.warns(UserWarning, match="Data ends 35 days"): + ts = load_gsod_daily_temp_data("724940", start, end) + + assert len(ts) == 123 + assert int(ts.notna().sum()) == 88 + assert ts.last_valid_index() == datetime(2025, 8, 27, tzinfo=pytz.UTC) + + +# all-years-missing behavior +def test_load_isd_hourly_temp_data_missing_year_strict_raises( + mock_api_transport, monkeypatch_key_value_store +): + start = datetime(2050, 1, 1, tzinfo=pytz.UTC) + end = datetime(2050, 6, 1, tzinfo=pytz.UTC) + + with pytest.raises(ISDDataNotAvailableError): + load_isd_hourly_temp_data("722874", start, end) + + +def test_load_isd_hourly_temp_data_missing_year_tolerant_returns_nan_range( + mock_api_transport, monkeypatch_key_value_store +): + start = datetime(2050, 1, 1, tzinfo=pytz.UTC) + end = datetime(2050, 6, 1, tzinfo=pytz.UTC) + + ts, warnings = load_isd_hourly_temp_data( + "722874", start, end, error_on_missing_years=False + ) + + assert ts.index[0] == start + assert ts.index[-1] == end + assert ts.isna().all() + assert [w.qualified_name for w in warnings] == [ + "eeweather.isd_data_not_available", + "eeweather.no_data_in_requested_range", + ] + + +def test_load_isd_daily_temp_data_missing_year_strict_raises( + mock_api_transport, monkeypatch_key_value_store +): + start = datetime(2050, 1, 1, tzinfo=pytz.UTC) + end = datetime(2050, 6, 1, tzinfo=pytz.UTC) + + with pytest.raises(ISDDataNotAvailableError): + load_isd_daily_temp_data("722874", start, end) + + +def test_load_isd_daily_temp_data_missing_year_tolerant_warns_and_fills_nan( + mock_api_transport, monkeypatch_key_value_store +): + start = datetime(2050, 1, 1, tzinfo=pytz.UTC) + end = datetime(2050, 6, 1, tzinfo=pytz.UTC) + + with pytest.warns(UserWarning) as record: + ts = load_isd_daily_temp_data( + "722874", start, end, error_on_missing_years=False + ) + + messages = [str(w.message) for w in record] + assert any("ISD data not available for 722874 in 2050" in m for m in messages) + assert any("No data was available" in m for m in messages) + + assert ts.index[0] == start + assert ts.index[-1] == end + assert ts.isna().all() + + +def test_load_gsod_daily_temp_data_missing_year_strict_raises( + mock_api_transport, monkeypatch_key_value_store +): + start = datetime(2050, 1, 1, tzinfo=pytz.UTC) + end = datetime(2050, 6, 1, tzinfo=pytz.UTC) + + with pytest.raises(GSODDataNotAvailableError): + load_gsod_daily_temp_data("722874", start, end) + + +def test_load_gsod_daily_temp_data_missing_year_tolerant_warns_and_fills_nan( + mock_api_transport, monkeypatch_key_value_store +): + start = datetime(2050, 1, 1, tzinfo=pytz.UTC) + end = datetime(2050, 6, 1, tzinfo=pytz.UTC) + + with pytest.warns(UserWarning) as record: + ts = load_gsod_daily_temp_data( + "722874", start, end, error_on_missing_years=False + ) + + messages = [str(w.message) for w in record] + assert any("GSOD data not available for 722874 in 2050" in m for m in messages) + assert any("No data was available" in m for m in messages) + + assert ts.index[0] == start + assert ts.index[-1] == end + assert ts.isna().all() + + +# a year that exists but contains no valid temperatures: 722874 in 2025 +# reports only daily summaries with missing temperature values +def test_fetch_isd_raw_temp_data_all_nan_year(mock_api_transport): + ts = fetch_isd_raw_temp_data("722874", 2025) + + assert len(ts) == 206 + assert ts.isna().all() + + +def test_load_isd_hourly_temp_data_all_nan_year_warns_no_data( + mock_api_transport, monkeypatch_key_value_store +): + start = datetime(2025, 1, 1, tzinfo=pytz.UTC) + end = datetime(2025, 6, 1, tzinfo=pytz.UTC) + + ts, warnings = load_isd_hourly_temp_data("722874", start, end) + + assert ts.isna().all() + assert [w.qualified_name for w in warnings] == [ + "eeweather.no_data_in_requested_range" + ] + + +# start not exactly on an hour rounds forward to the next hour +def test_load_isd_hourly_temp_data_start_mid_hour_aligns_forward( + mock_api_transport, monkeypatch_key_value_store +): + start = datetime(2007, 1, 1, 0, 30, tzinfo=pytz.UTC) + end = datetime(2007, 2, 1, tzinfo=pytz.UTC) + + ts, warnings = load_isd_hourly_temp_data("722874", start, end) + + assert ts.index[0] == datetime(2007, 1, 1, 1, 0, tzinfo=pytz.UTC) + assert ts.index[-1] == end + + +# a sub-hour range contains no aligned hours; returns empty without warning +def test_load_isd_hourly_temp_data_sub_hour_range_returns_empty( + mock_api_transport, monkeypatch_key_value_store +): + start = datetime(2007, 6, 1, 12, 30, tzinfo=pytz.UTC) + end = datetime(2007, 6, 1, 12, 45, tzinfo=pytz.UTC) + + ts, warnings = load_isd_hourly_temp_data("722874", start, end) + + assert len(ts) == 0 + assert warnings == [] From d7cafc4a8624c6b6f5af68b8f661e06674668eb7 Mon Sep 17 00:00:00 2001 From: Travis Sikes <124101151+travis-recurve@users.noreply.github.com> Date: Tue, 14 Jul 2026 19:00:08 -0500 Subject: [PATCH 7/8] Update CONTRIBUTING release steps and gitignore for current tooling - releasing goes through the GitHub release publish workflow - drop gitignore whitelists for deleted config files; ignore coverage.xml Signed-off-by: Travis Sikes <124101151+travis-recurve@users.noreply.github.com> --- .gitignore | 5 +++-- CONTRIBUTING.md | 32 +++----------------------------- 2 files changed, 6 insertions(+), 31 deletions(-) diff --git a/.gitignore b/.gitignore index d95402d..f1f5006 100644 --- a/.gitignore +++ b/.gitignore @@ -13,10 +13,11 @@ _build/ build/ dist/ +# coverage +coverage.xml + # config files .* !.github/ !.gitignore -!.coveragerc -!.travis.yml !.gitattributes diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 34da119..e271246 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -23,35 +23,9 @@ Releasing 5. make a new branch called release/vX.X.X 6. bump version - edit `__version__.py` with the new version 7. Rename `Development` section with the new version in CHANGELOG.md -8. commit changes -9. create a tag called vX.X.X on release/vX.X.X branch -10. push tag and branch -11. submit to pypi with `pipenv run python setup.py upload` (must have proper credentials) -12. merge release branch to master - -Release command cheatsheet - -``` -git checkout master -git pull -git checkout -b release/vX.X.X - -# then bump versions -vim eeweather/__version__.py -vim CHANGELOG.md -git commit -am "Bump version" - -git tag vX.X.X -git push -u origin release/vX.X.X --tags -docker-compose run --rm pipenv run python setup.py upload -git checkout master -git pull -git merge release/vX.X.X -git push -``` - -Or, use the `./bump_version.sh X.X.X Y.Y.Y` command to generate some more -specific commands. +8. commit changes, create and merge the release PR +9. create a GitHub release with a tag called vX.X.X; the publish workflow + builds and uploads the package to pypi Updating the internal db ------------------------ From 8ffd2bd8db929e63e03f1055e73c5b51ecc16b4b Mon Sep 17 00:00:00 2001 From: Travis Sikes <124101151+travis-recurve@users.noreply.github.com> Date: Tue, 14 Jul 2026 22:54:23 -0500 Subject: [PATCH 8/8] Close sqlite connections; cache the metadata connection per thread - cache operations close their connection on exit (python 3.13 warns on connections garbage-collected open, and warnings are errors in tests) - the metadata db proxy serves one cached read connection per thread, so call sites do not leak or close - datetime.UTC (python 3.11+) replaced with timezone.utc in tests to keep the 3.10 floor Signed-off-by: Travis Sikes <124101151+travis-recurve@users.noreply.github.com> --- eeweather/cache.py | 11 +++++++---- eeweather/connections.py | 20 +++++++++++++++++++- tests/test_cache.py | 5 ++--- tests/test_stations.py | 3 ++- 4 files changed, 30 insertions(+), 9 deletions(-) diff --git a/eeweather/cache.py b/eeweather/cache.py index c3620e7..cf04880 100644 --- a/eeweather/cache.py +++ b/eeweather/cache.py @@ -17,6 +17,7 @@ limitations under the License. """ +import contextlib import datetime import json import os @@ -69,7 +70,7 @@ def _prepare_db(self, url=None): self.url = url self._path = _sqlite_path_from_url(url) - with self._connect() as conn: + with self._connect() as conn, conn: conn.execute( "create table if not exists items (" " key text unique," @@ -79,7 +80,9 @@ def _prepare_db(self, url=None): conn.execute("create index if not exists ix_items_key on items (key)") def _connect(self): - return sqlite3.connect(self._path) + # closes the connection on exit; writes commit via the inner + # transaction context in each caller + return contextlib.closing(sqlite3.connect(self._path)) def key_exists(self, key): with self._connect() as conn: @@ -90,7 +93,7 @@ def key_exists(self, key): def save_json(self, key, data): data = json.dumps(data, separators=(",", ":")) updated = datetime.datetime.now(pytz.UTC).isoformat() - with self._connect() as conn: + with self._connect() as conn, conn: conn.execute( "insert into items (key, data, updated) values (?, ?, ?)" " on conflict (key) do update set data = ?, updated = ?", @@ -120,7 +123,7 @@ def key_updated(self, key): return datetime.datetime.fromisoformat(row[0]) def clear(self, key=None): - with self._connect() as conn: + with self._connect() as conn, conn: if key is None: conn.execute("delete from items") else: diff --git a/eeweather/connections.py b/eeweather/connections.py index a03166b..46d5bdb 100644 --- a/eeweather/connections.py +++ b/eeweather/connections.py @@ -23,6 +23,7 @@ import logging import os import sqlite3 +import threading from .cache import KeyValueStore @@ -91,16 +92,33 @@ def read_file_as_bytes(self, filename): # pragma: no cover class MetadataDBConnectionProxy(object): + """Serves a cached read connection to the packaged metadata database. + + Connections are cached per thread and reused, so callers do not close + them. + """ + def __init__(self): root_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) path = os.path.join(root_dir, "eeweather", "resources") self.db_path = os.path.join(path, "metadata.db") + self._local = threading.local() def get_connection(self): - return sqlite3.connect(self.db_path) + connection = getattr(self._local, "connection", None) + if connection is None: + connection = sqlite3.connect(self.db_path) + self._local.connection = connection + + return connection def reset_database(self): # pragma: no cover + connection = getattr(self._local, "connection", None) + if connection is not None: + connection.close() + self._local.connection = None os.remove(self.db_path) + return self.get_connection() diff --git a/tests/test_cache.py b/tests/test_cache.py index 4de5633..ebba018 100644 --- a/tests/test_cache.py +++ b/tests/test_cache.py @@ -19,8 +19,7 @@ """ import tempfile from eeweather.cache import KeyValueStore -from datetime import datetime -from datetime import UTC +from datetime import datetime, timezone import pytest @@ -47,7 +46,7 @@ def test_key_value_store(s): assert data["b"][2] == 3.0 dt1 = s.key_updated("a") assert dt1.tzinfo is not None - assert dt1.date() == datetime.now(UTC).date() + assert dt1.date() == datetime.now(timezone.utc).date() # update key 'a' s.save_json("a", ["updated"]) diff --git a/tests/test_stations.py b/tests/test_stations.py index 7c1d7a5..139786d 100644 --- a/tests/test_stations.py +++ b/tests/test_stations.py @@ -19,6 +19,7 @@ """ from datetime import datetime import pandas as pd +import contextlib import pytest import sqlite3 import pytz @@ -146,7 +147,7 @@ def monkeypatch_make_api_request_v2(monkeypatch, mock_api_transport): def _backdate_cache_key(store, key, updated): - with sqlite3.connect(store._path) as conn: + with contextlib.closing(sqlite3.connect(store._path)) as conn, conn: conn.execute( "update items set updated = ? where key = ?", (updated.isoformat(), key) )