├── census_map_downloader ├── geotypes │ ├── __init__.py │ ├── states_carto.py │ ├── congress_carto.py │ ├── counties.py │ ├── counties_carto.py │ ├── places.py │ ├── blocks.py │ ├── countysubdivision_carto.py │ ├── legislativedistrict_upper_carto.py │ ├── legislativedistrict_lower_carto.py │ ├── zctas.py │ └── tracts.py ├── __init__.py ├── cli.py └── base.py ├── MANIFEST.in ├── setup.cfg ├── Pipfile ├── download.py ├── LICENSE ├── .pre-commit-config.yaml ├── .gitignore ├── setup.py ├── README.md ├── .github └── workflows │ └── continuous-deployment.yaml ├── test.py ├── notebooks └── testing.ipynb └── Pipfile.lock /census_map_downloader/geotypes/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include LICENSE 2 | include README.md 3 | -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | [bdist_wheel] 2 | universal = 1 3 | 4 | [flake8] 5 | max-line-length = 149 6 | 7 | [metadata] 8 | license-file = LICENSE 9 | -------------------------------------------------------------------------------- /Pipfile: -------------------------------------------------------------------------------- 1 | [[source]] 2 | name = "pypi" 3 | url = "https://pypi.org/simple" 4 | verify_ssl = true 5 | 6 | [dev-packages] 7 | twine = "*" 8 | flake8 = "*" 9 | setuptools-scm = "*" 10 | pre-commit = "*" 11 | sphinx = "*" 12 | myst-parser = "*" 13 | jupyterlab = "*" 14 | descartes = "*" 15 | matplotlib = "*" 16 | 17 | [packages] 18 | geopandas = "*" 19 | us = "*" 20 | click = "*" 21 | 22 | [requires] 23 | python_version = "3.9" 24 | -------------------------------------------------------------------------------- /download.py: -------------------------------------------------------------------------------- 1 | """ 2 | Download all the data. 3 | """ 4 | import logging 5 | 6 | import census_map_downloader 7 | 8 | 9 | def main(): 10 | # Configure logging 11 | logger = logging.getLogger("census_map_downloader") 12 | logger.setLevel(logging.DEBUG) 13 | ch = logging.StreamHandler() 14 | ch.setLevel(logging.DEBUG) 15 | formatter = logging.Formatter("%(asctime)s|%(name)s|%(levelname)s|%(message)s") 16 | ch.setFormatter(formatter) 17 | logger.addHandler(ch) 18 | data_dir = "./" 19 | census_map_downloader.BlocksDownloader2018(data_dir=data_dir).run() 20 | census_map_downloader.TractsDownloader2010(data_dir=data_dir).run() 21 | census_map_downloader.CountiesDownloader2018(data_dir=data_dir).run() 22 | census_map_downloader.PlacesDownloader2018(data_dir=data_dir).run() 23 | census_map_downloader.ZctasDownloader2018(data_dir=data_dir).run() 24 | 25 | 26 | if __name__ == "__main__": 27 | main() 28 | -------------------------------------------------------------------------------- /census_map_downloader/geotypes/states_carto.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python 2 | import collections 3 | 4 | # Logging 5 | import logging 6 | 7 | from census_map_downloader.base import BaseDownloader 8 | 9 | logger = logging.getLogger(__name__) 10 | 11 | 12 | class StatesCartoDownloader(BaseDownloader): 13 | """ 14 | Download cartographic states. 15 | """ 16 | 17 | YEAR_LIST = [2018] 18 | PROCESSED_NAME = "states_carto" 19 | # Docs (https://www2.census.gov/geo/tiger/GENZ2018/2018_file_name_def.pdf?#) 20 | FIELD_CROSSWALK = collections.OrderedDict( 21 | { 22 | "STATEFP": "state_fips", 23 | "GEOID": "geoid", 24 | "NAME": "name", 25 | "geometry": "geometry", 26 | "ALAND": "land_area", 27 | "AWATER": "water_area", 28 | } 29 | ) 30 | 31 | @property 32 | def url(self): 33 | return f"https://www2.census.gov/geo/tiger/GENZ{self.year}/shp/cb_{self.year}_us_state_500k.zip" 34 | 35 | @property 36 | def zip_name(self): 37 | return f"cb_{self.year}_us_state_500k.zip" 38 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Los Angeles Times Data Desk 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | # See https://pre-commit.com for more information 2 | # See https://pre-commit.com/hooks.html for more hooks 3 | repos: 4 | - repo: https://github.com/pre-commit/pre-commit-hooks 5 | rev: v4.1.0 6 | hooks: 7 | - id: trailing-whitespace 8 | - id: end-of-file-fixer 9 | - id: check-yaml 10 | - id: check-added-large-files 11 | args: ['--maxkb=10000'] 12 | - id: check-case-conflict 13 | - id: mixed-line-ending 14 | 15 | - repo: https://github.com/psf/black 16 | rev: 22.3.0 17 | hooks: 18 | - id: black 19 | 20 | - repo: https://github.com/asottile/blacken-docs 21 | rev: v1.12.1 22 | hooks: 23 | - id: blacken-docs 24 | additional_dependencies: [black] 25 | 26 | - repo: https://github.com/timothycrosley/isort 27 | rev: 5.10.1 28 | hooks: 29 | - id: isort 30 | args: ["--profile", "black", "--filter-files"] 31 | 32 | - repo: https://gitlab.com/pycqa/flake8 33 | rev: 3.9.2 34 | hooks: 35 | - id: flake8 36 | 37 | - repo: https://github.com/asottile/pyupgrade 38 | rev: v2.31.0 39 | hooks: 40 | - id: pyupgrade 41 | args: [--py37-plus] 42 | -------------------------------------------------------------------------------- /census_map_downloader/__init__.py: -------------------------------------------------------------------------------- 1 | from .base import BaseDownloader 2 | from .geotypes.blocks import BlocksDownloader 3 | from .geotypes.congress_carto import CongressCartoDownloader 4 | from .geotypes.counties import CountiesDownloader 5 | from .geotypes.counties_carto import CountiesCartoDownloader 6 | from .geotypes.countysubdivision_carto import CountySubdivisionCartoDownloader 7 | from .geotypes.legislativedistrict_lower_carto import ( 8 | LegislativeDistrictLowerCartoDownloader, 9 | ) 10 | from .geotypes.legislativedistrict_upper_carto import ( 11 | LegislativeDistrictUpperCartoDownloader, 12 | ) 13 | from .geotypes.places import PlacesDownloader 14 | from .geotypes.states_carto import StatesCartoDownloader 15 | from .geotypes.tracts import TractsDownloader 16 | from .geotypes.zctas import ZctasDownloader 17 | 18 | __all__ = ( 19 | "BaseDownloader", 20 | "CountiesDownloader", 21 | "PlacesDownloader", 22 | "TractsDownloader", 23 | "ZctasDownloader", 24 | "BlocksDownloader", 25 | "CountiesCartoDownloader", 26 | "CongressCartoDownloader", 27 | "StatesCartoDownloader", 28 | "LegislativeDistrictLowerCartoDownloader", 29 | "LegislativeDistrictUpperCartoDownloader", 30 | "CountySubdivisionCartoDownloader", 31 | ) 32 | -------------------------------------------------------------------------------- /census_map_downloader/geotypes/congress_carto.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python 2 | import collections 3 | 4 | # Logging 5 | import logging 6 | 7 | from census_map_downloader.base import BaseDownloader 8 | 9 | logger = logging.getLogger(__name__) 10 | 11 | 12 | class CongressCartoDownloader(BaseDownloader): 13 | """ 14 | Download cartographic congressional districts. 15 | """ 16 | 17 | YEAR_LIST = [2018] 18 | PROCESSED_NAME = "congressionaldistricts_carto" 19 | # Docs (https://www2.census.gov/geo/tiger/GENZ2018/2018_file_name_def.pdf?#) 20 | FIELD_CROSSWALK = collections.OrderedDict( 21 | { 22 | "STATEFP": "state_fip", 23 | "CD116FP": "congresional_district", 24 | "GEOID": "geoid", 25 | "geometry": "geometry", 26 | "LSAD": "legal_statistical_area", 27 | "CDSESSN": "congressional_session_code", 28 | "ALAND": "land_area", 29 | "AWATER": "water_area", 30 | } 31 | ) 32 | 33 | @property 34 | def url(self): 35 | return f"https://www2.census.gov/geo/tiger/GENZ{self.year}/shp/cb_{self.year}_us_cd116_500k.zip" 36 | 37 | @property 38 | def zip_name(self): 39 | return f"cb_{self.year}_us_cd116_500k.zip" 40 | -------------------------------------------------------------------------------- /census_map_downloader/geotypes/counties.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python 2 | import collections 3 | 4 | # Logging 5 | import logging 6 | 7 | from census_map_downloader.base import BaseDownloader 8 | 9 | logger = logging.getLogger(__name__) 10 | 11 | 12 | class CountiesDownloader(BaseDownloader): 13 | """ 14 | Download counties. 15 | """ 16 | 17 | YEAR_LIST = [ 18 | 2011, 19 | 2012, 20 | 2013, 21 | 2014, 22 | 2015, 23 | 2016, 24 | 2017, 25 | 2018, 26 | 2019, 27 | 2020, 28 | ] 29 | PROCESSED_NAME = "counties" 30 | # Docs pg 21 (https://www2.census.gov/geo/pdfs/maps-data/data/tiger/tgrshp2018/TGRSHP2018_TechDoc_Ch3.pdf) 31 | FIELD_CROSSWALK = collections.OrderedDict( 32 | { 33 | "STATEFP": "state_fips", 34 | "COUNTYFP": "county_fips", 35 | "GEOID": "geoid", 36 | "NAME": "county_name", 37 | "geometry": "geometry", 38 | } 39 | ) 40 | 41 | @property 42 | def url(self): 43 | return f"https://www2.census.gov/geo/tiger/TIGER{self.year}/COUNTY/tl_{self.year}_us_county.zip" 44 | 45 | @property 46 | def zip_name(self): 47 | return f"tl_{self.year}_us_county.zip" 48 | -------------------------------------------------------------------------------- /census_map_downloader/geotypes/counties_carto.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python 2 | import collections 3 | 4 | # Logging 5 | import logging 6 | 7 | from census_map_downloader.base import BaseDownloader 8 | 9 | logger = logging.getLogger(__name__) 10 | 11 | 12 | class CountiesCartoDownloader(BaseDownloader): 13 | """ 14 | Download cartographic counties. 15 | """ 16 | 17 | YEAR_LIST = [ 18 | 2014, 19 | 2015, 20 | 2016, 21 | 2017, 22 | 2018, 23 | 2019, 24 | ] 25 | PROCESSED_NAME = "counties_carto" 26 | # Docs (https://www2.census.gov/geo/tiger/GENZ2018/2018_file_name_def.pdf?#) 27 | FIELD_CROSSWALK = collections.OrderedDict( 28 | { 29 | "STATEFP": "state_fips", 30 | "COUNTYFP": "county_fips", 31 | "GEOID": "geoid", 32 | "NAME": "county_name", 33 | "geometry": "geometry", 34 | "ALAND": "land_area", 35 | "AWATER": "water_area", 36 | } 37 | ) 38 | 39 | @property 40 | def url(self): 41 | return f"https://www2.census.gov/geo/tiger/GENZ{self.year}/shp/cb_{self.year}_us_county_500k.zip" 42 | 43 | @property 44 | def zip_name(self): 45 | return f"cb_{self.year}_us_county_500k.zip" 46 | -------------------------------------------------------------------------------- /census_map_downloader/geotypes/places.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python 2 | import collections 3 | 4 | # Logging 5 | import logging 6 | 7 | from census_map_downloader.base import BaseStateDownloader, BaseStateListDownloader 8 | 9 | logger = logging.getLogger(__name__) 10 | 11 | 12 | class StatePlacesDownloader(BaseStateDownloader): 13 | """ 14 | Download places for a single state. 15 | """ 16 | 17 | YEAR_LIST = [2018] 18 | PROCESSED_NAME = "places" 19 | # Page 47 https://www2.census.gov/geo/pdfs/maps-data/data/tiger/tgrshp2018/TGRSHP2018_TechDoc_Ch3.pdf 20 | FIELD_CROSSWALK = collections.OrderedDict( 21 | { 22 | "STATEFP": "state_fips", 23 | "PLACEFP": "place_id", 24 | "GEOID": "geoid", 25 | "NAME": "place_name", 26 | "geometry": "geometry", 27 | } 28 | ) 29 | 30 | @property 31 | def url(self): 32 | return f"https://www2.census.gov/geo/tiger/TIGER{self.year}/PLACE/tl_{self.year}_{self.state.fips}_place.zip" 33 | 34 | @property 35 | def zip_name(self): 36 | return f"tl_{self.year}_{self.state.fips}_place.zip" 37 | 38 | 39 | class PlacesDownloader(BaseStateListDownloader): 40 | """ 41 | Download all places in the United States. 42 | """ 43 | 44 | YEAR_LIST = [2018] 45 | PROCESSED_NAME = "places" 46 | DOWNLOADER_CLASS = StatePlacesDownloader 47 | -------------------------------------------------------------------------------- /census_map_downloader/geotypes/blocks.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python 2 | import collections 3 | 4 | # Logging 5 | import logging 6 | 7 | from census_map_downloader.base import BaseStateDownloader, BaseStateListDownloader 8 | 9 | logger = logging.getLogger(__name__) 10 | 11 | 12 | class StateBlocksDownloader(BaseStateDownloader): 13 | """ 14 | Download blocks for a single state. 15 | """ 16 | 17 | YEAR_LIST = [2018] 18 | PROCESSED_NAME = "blocks" 19 | # Docs pg 14 (https://www2.census.gov/geo/pdfs/maps-data/data/tiger/tgrshp2018/TGRSHP2018_TechDoc_Ch3.pdf) 20 | FIELD_CROSSWALK = collections.OrderedDict( 21 | { 22 | "STATEFP10": "state_fips", 23 | "COUNTYFP10": "county_fips", 24 | "BLOCKCE10": "block_id", 25 | "GEOID10": "geoid", 26 | "NAME10": "block_name", 27 | "geometry": "geometry", 28 | } 29 | ) 30 | 31 | @property 32 | def url(self): 33 | return f"https://www2.census.gov/geo/tiger/TIGER{self.year}/TABBLOCK/tl_{self.year}_{self.state.fips}_tabblock10.zip" 34 | 35 | @property 36 | def zip_name(self): 37 | return f"tl_{self.year}_{self.state.fips}_tabblock10.zip" 38 | 39 | 40 | class BlocksDownloader(BaseStateListDownloader): 41 | """ 42 | Download all blocks in the United States. 43 | """ 44 | 45 | YEAR_LIST = [2018] 46 | DOWNLOADER_CLASS = StateBlocksDownloader 47 | 48 | def merge(self): 49 | """ 50 | No merging on this downloader because it is too big. 51 | """ 52 | pass 53 | 54 | def process(self): 55 | """ 56 | No processing on this downloader because it is too big. 57 | """ 58 | pass 59 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | processed/ 2 | raw/ 3 | data/ 4 | 5 | # Byte-compiled / optimized / DLL files 6 | __pycache__/ 7 | *.py[cod] 8 | *$py.class 9 | 10 | # C extensions 11 | *.so 12 | 13 | # Distribution / packaging 14 | .Python 15 | build/ 16 | develop-eggs/ 17 | dist/ 18 | downloads/ 19 | eggs/ 20 | .eggs/ 21 | lib/ 22 | lib64/ 23 | parts/ 24 | sdist/ 25 | var/ 26 | wheels/ 27 | *.egg-info/ 28 | .installed.cfg 29 | *.egg 30 | MANIFEST 31 | 32 | # PyInstaller 33 | # Usually these files are written by a python script from a template 34 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 35 | *.manifest 36 | *.spec 37 | 38 | # Installer logs 39 | pip-log.txt 40 | pip-delete-this-directory.txt 41 | 42 | # Unit test / coverage reports 43 | htmlcov/ 44 | .tox/ 45 | .coverage 46 | .coverage.* 47 | .cache 48 | nosetests.xml 49 | coverage.xml 50 | *.cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | 63 | # Flask stuff: 64 | instance/ 65 | .webassets-cache 66 | 67 | # Scrapy stuff: 68 | .scrapy 69 | 70 | # Sphinx documentation 71 | docs/_build/ 72 | 73 | # PyBuilder 74 | target/ 75 | 76 | # Jupyter Notebook 77 | .ipynb_checkpoints 78 | 79 | # pyenv 80 | .python-version 81 | 82 | # celery beat schedule file 83 | celerybeat-schedule 84 | 85 | # SageMath parsed files 86 | *.sage.py 87 | 88 | # Environments 89 | .env 90 | .venv 91 | env/ 92 | venv/ 93 | ENV/ 94 | env.bak/ 95 | venv.bak/ 96 | 97 | # Spyder project settings 98 | .spyderproject 99 | .spyproject 100 | 101 | # Rope project settings 102 | .ropeproject 103 | 104 | # mkdocs documentation 105 | /site 106 | 107 | # mypy 108 | .mypy_cache/ 109 | .DS_Store 110 | -------------------------------------------------------------------------------- /census_map_downloader/geotypes/countysubdivision_carto.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python 2 | import collections 3 | 4 | # Logging 5 | import logging 6 | 7 | from census_map_downloader.base import BaseStateDownloader, BaseStateListDownloader 8 | 9 | logger = logging.getLogger(__name__) 10 | 11 | 12 | class StateCountySubdivisionCartoDownloader(BaseStateDownloader): 13 | """ 14 | Download cartographic county subdivisions for a single state. 15 | """ 16 | 17 | YEAR_LIST = [2018] 18 | PROCESSED_NAME = "county_subdivision_carto" 19 | # Docs (https://www2.census.gov/geo/tiger/GENZ2018/2018_file_name_def.pdf?#) 20 | FIELD_CROSSWALK = collections.OrderedDict( 21 | { 22 | "STATEFP": "state_fips", 23 | "COUNTYFP": "county_fips", 24 | "COUSUBFP": "county_subdivision_fips", 25 | "GEOID": "geoid", 26 | "NAME": "name", 27 | "geometry": "geometry", 28 | "ALAND": "land_area", 29 | "AWATER": "water_area", 30 | } 31 | ) 32 | 33 | @property 34 | def url(self): 35 | return f"https://www2.census.gov/geo/tiger/GENZ{self.year}/shp/cb_{self.year}_{self.state.fips}_cousub_500k.zip" 36 | 37 | @property 38 | def zip_name(self): 39 | return f"cb_{self.year}_{self.state.fips}_cousub_500k.zip" 40 | 41 | 42 | class CountySubdivisionCartoDownloader(BaseStateListDownloader): 43 | """ 44 | Download all cartographic county subdivisions in the United States. 45 | """ 46 | 47 | YEAR_LIST = [2018] 48 | DOWNLOADER_CLASS = StateCountySubdivisionCartoDownloader 49 | 50 | def merge(self): 51 | """ 52 | No merging on this downloader because it is too big. 53 | """ 54 | pass 55 | 56 | def process(self): 57 | """ 58 | No processing on this downloader because it is too big. 59 | """ 60 | pass 61 | -------------------------------------------------------------------------------- /census_map_downloader/geotypes/legislativedistrict_upper_carto.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python 2 | import collections 3 | 4 | # Logging 5 | import logging 6 | 7 | from census_map_downloader.base import BaseStateDownloader, BaseStateListDownloader 8 | 9 | logger = logging.getLogger(__name__) 10 | 11 | 12 | class StateLegislativeDistrictUpperCartoDownloader(BaseStateDownloader): 13 | """ 14 | Download cartographic state legislative districts (upper chamber) for a single state. 15 | """ 16 | 17 | YEAR_LIST = [2018] 18 | PROCESSED_NAME = "legislative_district_upper_carto" 19 | # Docs (https://www2.census.gov/geo/tiger/GENZ2018/2018_file_name_def.pdf?#) 20 | FIELD_CROSSWALK = collections.OrderedDict( 21 | { 22 | "STATEFP": "state_fips", 23 | "GEOID": "geoid", 24 | "LSY": "legislative_session_year", 25 | "NAME": "name", 26 | "geometry": "geometry", 27 | "ALAND": "land_area", 28 | "AWATER": "water_area", 29 | } 30 | ) 31 | 32 | @property 33 | def url(self): 34 | return f"https://www2.census.gov/geo/tiger/GENZ{self.year}/shp/cb_{self.year}_{self.state.fips}_sldu_500k.zip" 35 | 36 | @property 37 | def zip_name(self): 38 | return f"cb_{self.year}_{self.state.fips}_sldu_500k.zip" 39 | 40 | 41 | class LegislativeDistrictUpperCartoDownloader(BaseStateListDownloader): 42 | """ 43 | Download all cartographic state legislative districts (upper chamber) in the United States. 44 | """ 45 | 46 | YEAR_LIST = [2018] 47 | DOWNLOADER_CLASS = StateLegislativeDistrictUpperCartoDownloader 48 | 49 | def merge(self): 50 | """ 51 | No merging on this downloader because it is too big. 52 | """ 53 | pass 54 | 55 | def process(self): 56 | """ 57 | No processing on this downloader because it is too big. 58 | """ 59 | pass 60 | -------------------------------------------------------------------------------- /census_map_downloader/geotypes/legislativedistrict_lower_carto.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python 2 | import collections 3 | 4 | # Logging 5 | import logging 6 | 7 | from census_map_downloader.base import BaseStateDownloader, BaseStateListDownloader 8 | 9 | logger = logging.getLogger(__name__) 10 | 11 | 12 | class StateLegislativeDistrictLowerCartoDownloader(BaseStateDownloader): 13 | """ 14 | Download cartographic state legislative districts (lower chamber) for a single state. 15 | """ 16 | 17 | YEAR_LIST = [2018] 18 | PROCESSED_NAME = "legislative_district_lower_carto" 19 | # Docs (https://www2.census.gov/geo/tiger/GENZ2018/2018_file_name_def.pdf?#) 20 | FIELD_CROSSWALK = collections.OrderedDict( 21 | { 22 | "STATEFP": "state_fips", 23 | "GEOID": "geoid", 24 | "LSY": "legislative_session_year", 25 | "NAME": "name", 26 | "geometry": "geometry", 27 | "ALAND": "land_area", 28 | "AWATER": "water_area", 29 | } 30 | ) 31 | 32 | def __init__(self, state, data_dir, year): 33 | if state == "NE": 34 | # Nebraska has a unicameral legislature 35 | raise ValueError(f"State {state} is not supported for this geotype") 36 | 37 | super().__init__(state, data_dir, year) 38 | 39 | @property 40 | def url(self): 41 | return f"https://www2.census.gov/geo/tiger/GENZ{self.year}/shp/cb_{self.year}_{self.state.fips}_sldl_500k.zip" 42 | 43 | @property 44 | def zip_name(self): 45 | return f"cb_{self.year}_{self.state.fips}_sldl_500k.zip" 46 | 47 | 48 | class LegislativeDistrictLowerCartoDownloader(BaseStateListDownloader): 49 | """ 50 | Download all cartographic state legislative districts (lower chamber) in the United States. 51 | """ 52 | 53 | YEAR_LIST = [2018] 54 | DOWNLOADER_CLASS = StateLegislativeDistrictLowerCartoDownloader 55 | 56 | def merge(self): 57 | """ 58 | No merging on this downloader because it is too big. 59 | """ 60 | pass 61 | 62 | def process(self): 63 | """ 64 | No processing on this downloader because it is too big. 65 | """ 66 | pass 67 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from setuptools import setup 4 | 5 | 6 | def read(fname): 7 | with open(os.path.join(os.path.dirname(__file__), fname)) as f: 8 | return f.read() 9 | 10 | 11 | def version_scheme(version): 12 | """ 13 | Version scheme hack for setuptools_scm. 14 | 15 | Appears to be necessary to due to the bug documented here: https://github.com/pypa/setuptools_scm/issues/342 16 | 17 | If that issue is resolved, this method can be removed. 18 | """ 19 | import time 20 | 21 | from setuptools_scm.version import guess_next_version 22 | 23 | if version.exact: 24 | return version.format_with("{tag}") 25 | else: 26 | _super_value = version.format_next_version(guess_next_version) 27 | now = int(time.time()) 28 | return _super_value + str(now) 29 | 30 | 31 | def local_version(version): 32 | """ 33 | Local version scheme hack for setuptools_scm. 34 | 35 | Appears to be necessary to due to the bug documented here: https://github.com/pypa/setuptools_scm/issues/342 36 | 37 | If that issue is resolved, this method can be removed. 38 | """ 39 | return "" 40 | 41 | 42 | setup( 43 | name="census-map-downloader", 44 | description="Easily download U.S. census maps", 45 | long_description=read("README.md"), 46 | long_description_content_type="text/markdown", 47 | url="https://github.com/datadesk", 48 | license="MIT", 49 | packages=( 50 | "census_map_downloader", 51 | "census_map_downloader.geotypes", 52 | ), 53 | install_requires=("geopandas", "us", "click"), 54 | entry_points=""" 55 | [console_scripts] 56 | censusmapdownloader=census_map_downloader.cli:cmd 57 | """, 58 | use_scm_version={"version_scheme": version_scheme, "local_scheme": local_version}, 59 | classifiers=[ 60 | "Development Status :: 5 - Production/Stable", 61 | "Programming Language :: Python", 62 | "Programming Language :: Python :: 3.7", 63 | "Programming Language :: Python :: 3.8", 64 | "Programming Language :: Python :: 3.9", 65 | "Programming Language :: Python :: 3.10", 66 | "Programming Language :: Python :: 3 :: Only", 67 | "License :: OSI Approved :: MIT License", 68 | ], 69 | project_urls={ 70 | "Maintainer": "https://github.com/datadesk", 71 | "Source": "https://github.com/datadesk/census-map-downloader", 72 | "Tracker": "https://github.com/datadesk/census-map-downloader/issues", 73 | }, 74 | ) 75 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # census-map-downloader 2 | 3 | Easily download U.S. census maps 4 | 5 | ## Installation 6 | 7 | ```bash 8 | pipenv install census-map-downloader 9 | ``` 10 | 11 | ## Command line usage 12 | 13 | ``` 14 | Usage: censusmapdownloader [OPTIONS] COMMAND [ARGS]... 15 | 16 | Easily download U.S. census maps 17 | 18 | Options: 19 | --data-dir TEXT The folder where you want to download the data 20 | --year INTEGER The vintage of data to download. By default it gets the 21 | latest year. Not all data are available for every year. 22 | 23 | --help Show this message and exit. 24 | 25 | Commands: 26 | blocks Download blocks 27 | congress-carto Download cartographic congressional districts 28 | counties Download counties 29 | counties-carto Download cartographic counties 30 | countysubdivision Download cartographic county subdivisions 31 | legislative-lower-carto Download cartographic state legislative... 32 | legislative-upper-carto Download cartographic state legislative... 33 | places Download places 34 | states-carto Download cartographic states 35 | tracts Download tracts 36 | zctas Download ZCTAs 37 | ``` 38 | 39 | ## Examples 40 | 41 | Here's an example of downloading all counties 42 | 43 | ```bash 44 | censusmapdownloader counties 45 | ``` 46 | 47 | You can specify the download directory with --data-dir 48 | 49 | ```bash 50 | censusmapdownloader --data-dir ./my-special-folder/ counties 51 | ``` 52 | 53 | ## Contributing 54 | 55 | Install dependencies for development 56 | 57 | ```bash 58 | pipenv install --dev 59 | ``` 60 | 61 | Run tests 62 | 63 | ```bash 64 | pipenv run python test.py 65 | ``` 66 | 67 | ### Adding additional years to a dataset 68 | 69 | Downloader classes for different geography types are defined in modules of {code}`census_map_downloader.geotypes`. For example, the downloader for counties is {code}`census_map_downloader.geotypes.counties.CountiesDownloader`. 70 | 71 | If the URL and fields in a shapefile are the same as those for years that are already supported, you can just add the year to the {code}`YEAR_LIST` attribute. 72 | 73 | If the fields are the same, but the URL changes between groups of years, add logic to the {code}`url` property method of the downloader classes to alter the URL based on {code}`self.year`. 74 | 75 | If the fields and URL change from year to year, consider creating classes for each year and delegating to {code}`census_map_downloader.geotypes.tracts.TractsDownloader` is an example of a class that uses this approach. 76 | 77 | ## Developing the CLI 78 | 79 | The command-line interface is implemented using Click and setuptools. To install it locally for development inside your virtual environment, run the following installation command, as [prescribed by the Click documentation](https://click.palletsprojects.com/en/7.x/setuptools/#setuptools-integration). 80 | 81 | ```bash 82 | pipenv run pip install --editable . 83 | ``` 84 | 85 | ## Links 86 | 87 | * Issues: [github.com/datadesk/census-map-downloader/issues](https://github.com/datadesk/census-map-downloader/issues) 88 | * Packaging: [pypi.python.org/pypi/census-map-downloader](https://pypi.python.org/pypi/census-map-downloader) 89 | * Testing: [github.com/datadesk/census-map-downloader/actions](https://github.com/datadesk/census-map-downloader/actions) 90 | -------------------------------------------------------------------------------- /census_map_downloader/cli.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python 2 | """ 3 | Command-line interface. 4 | """ 5 | import click 6 | 7 | import census_map_downloader 8 | 9 | 10 | @click.group(help="Easily download U.S. census maps") 11 | @click.option( 12 | "--data-dir", 13 | nargs=1, 14 | default="./", 15 | help="The folder where you want to download the data", 16 | ) 17 | @click.option( 18 | "--year", 19 | default=None, 20 | type=int, 21 | help="The vintage of data to download. By default it gets the latest year. Not all data are available for every year.", 22 | ) 23 | @click.pass_context 24 | def cmd(ctx, data_dir="./", year=None): 25 | ctx.ensure_object(dict) 26 | ctx.obj["data_dir"] = data_dir 27 | ctx.obj["year"] = year 28 | 29 | 30 | @cmd.command(help="Download places") 31 | @click.pass_context 32 | def places(ctx): 33 | obj = census_map_downloader.PlacesDownloader( 34 | data_dir=ctx.obj["data_dir"], year=ctx.obj["year"] 35 | ) 36 | obj.run() 37 | 38 | 39 | @cmd.command(help="Download tracts") 40 | @click.pass_context 41 | def tracts(ctx): 42 | obj = census_map_downloader.TractsDownloader( 43 | data_dir=ctx.obj["data_dir"], year=ctx.obj["year"] 44 | ) 45 | obj.run() 46 | 47 | 48 | @cmd.command(help="Download counties") 49 | @click.pass_context 50 | def counties(ctx): 51 | obj = census_map_downloader.CountiesDownloader( 52 | data_dir=ctx.obj["data_dir"], year=ctx.obj["year"] 53 | ) 54 | obj.run() 55 | 56 | 57 | @cmd.command(help="Download cartographic counties") 58 | @click.pass_context 59 | def counties_carto(ctx): 60 | obj = census_map_downloader.CountiesCartoDownloader( 61 | data_dir=ctx.obj["data_dir"], year=ctx.obj["year"] 62 | ) 63 | obj.run() 64 | 65 | 66 | @cmd.command(help="Download cartographic congressional districts") 67 | @click.pass_context 68 | def congress_carto(ctx): 69 | obj = census_map_downloader.CongressCartoDownloader( 70 | data_dir=ctx.obj["data_dir"], year=ctx.obj["year"] 71 | ) 72 | obj.run() 73 | 74 | 75 | @cmd.command(help="Download cartographic states") 76 | @click.pass_context 77 | def states_carto(ctx): 78 | obj = census_map_downloader.StatesCartoDownloader( 79 | data_dir=ctx.obj["data_dir"], year=ctx.obj["year"] 80 | ) 81 | obj.run() 82 | 83 | 84 | @cmd.command(help="Download cartographic state legislative districts(lower)") 85 | @click.pass_context 86 | def legislative_lower_carto(ctx): 87 | obj = census_map_downloader.LegislativeDistrictLowerCartoDownloader( 88 | data_dir=ctx.obj["data_dir"], year=ctx.obj["year"] 89 | ) 90 | obj.run() 91 | 92 | 93 | @cmd.command(help="Download cartographic state legislative districts(upper)") 94 | @click.pass_context 95 | def legislative_upper_carto(ctx): 96 | obj = census_map_downloader.LegislativeDistrictUpperCartoDownloader( 97 | data_dir=ctx.obj["data_dir"], year=ctx.obj["year"] 98 | ) 99 | obj.run() 100 | 101 | 102 | @cmd.command(help="Download cartographic county subdivisions") 103 | @click.pass_context 104 | def countysubdivision(ctx): 105 | obj = census_map_downloader.CountySubdivisionCartoDownloader( 106 | data_dir=ctx.obj["data_dir"], year=ctx.obj["year"] 107 | ) 108 | obj.run() 109 | 110 | 111 | @cmd.command(help="Download ZCTAs") 112 | @click.pass_context 113 | def zctas(ctx): 114 | obj = census_map_downloader.ZctasDownloader( 115 | data_dir=ctx.obj["data_dir"], year=ctx.obj["year"] 116 | ) 117 | obj.run() 118 | 119 | 120 | @cmd.command(help="Download blocks") 121 | @click.pass_context 122 | def blocks(ctx): 123 | obj = census_map_downloader.BlocksDownloader( 124 | data_dir=ctx.obj["data_dir"], year=ctx.obj["year"] 125 | ) 126 | obj.run() 127 | 128 | 129 | if __name__ == "__main__": 130 | cmd() 131 | -------------------------------------------------------------------------------- /.github/workflows/continuous-deployment.yaml: -------------------------------------------------------------------------------- 1 | name: Testing and deployment 2 | on: 3 | push: 4 | workflow_dispatch: 5 | 6 | jobs: 7 | lint-python: 8 | name: Lint 9 | runs-on: ubuntu-latest 10 | steps: 11 | - name: Checkout 12 | uses: actions/checkout@v3 13 | 14 | - id: setup-python 15 | name: Setup Python 16 | uses: actions/setup-python@v4 17 | with: 18 | python-version: '3.9' 19 | cache: 'pipenv' 20 | 21 | - id: install-pipenv 22 | name: Install pipenv 23 | run: curl https://raw.githubusercontent.com/pypa/pipenv/master/get-pipenv.py | python 24 | shell: bash 25 | 26 | - id: install-python-dependencies 27 | name: Install Python dependencies 28 | run: pipenv install --dev --python=`which python` 29 | shell: bash 30 | 31 | - id: run 32 | name: Run 33 | run: pipenv run flake8 census_map_downloader 34 | 35 | test-python: 36 | strategy: 37 | matrix: 38 | python: ['3.7', '3.8', '3.9', '3.10'] 39 | name: Test 40 | runs-on: ubuntu-latest 41 | steps: 42 | - name: Checkout 43 | uses: actions/checkout@v3 44 | 45 | - id: setup-python 46 | name: Setup Python 47 | uses: actions/setup-python@v4 48 | with: 49 | python-version: '3.9' 50 | cache: 'pipenv' 51 | 52 | - id: install-pipenv 53 | name: Install pipenv 54 | run: curl https://raw.githubusercontent.com/pypa/pipenv/master/get-pipenv.py | python 55 | shell: bash 56 | 57 | - id: install-python-dependencies 58 | name: Install Python dependencies 59 | run: pipenv install --dev --python=`which python` 60 | shell: bash 61 | 62 | - id: run 63 | name: Run 64 | run: pipenv run python test.py 65 | shell: bash 66 | 67 | test-build: 68 | name: Build Python package 69 | runs-on: ubuntu-latest 70 | needs: [test-python] 71 | steps: 72 | - name: Checkout 73 | uses: actions/checkout@v3 74 | 75 | - name: Install pipenv 76 | run: pipx install pipenv 77 | 78 | - uses: actions/setup-python@v3 79 | with: 80 | python-version: '3.9' 81 | cache: 'pipenv' 82 | 83 | - id: pipenv-install 84 | name: Install Python dependencies 85 | run: pipenv install --dev --python `which python` 86 | 87 | - id: build 88 | name: Build release 89 | run: | 90 | pipenv run python setup.py sdist 91 | pipenv run python setup.py bdist_wheel 92 | ls -l dist 93 | 94 | - id: check 95 | name: Check release 96 | run: | 97 | pipenv run twine check dist/* 98 | 99 | - id: save 100 | name: Save artifact 101 | uses: actions/upload-artifact@v2 102 | with: 103 | name: test-release-${{ github.run_number }} 104 | path: ./dist 105 | if-no-files-found: error 106 | 107 | tag-release: 108 | name: Tagged PyPI release 109 | runs-on: ubuntu-latest 110 | needs: [test-build] 111 | if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags') 112 | steps: 113 | - uses: actions/setup-python@v3 114 | with: 115 | python-version: '3.9' 116 | 117 | - id: fetch 118 | name: Fetch artifact 119 | uses: actions/download-artifact@v2 120 | with: 121 | name: test-release-${{ github.run_number }} 122 | path: ./dist 123 | 124 | - id: publish 125 | name: Publish release 126 | uses: pypa/gh-action-pypi-publish@release/v1 127 | with: 128 | user: __token__ 129 | password: ${{ secrets.PYPI_API_TOKEN }} 130 | verbose: true 131 | verify_metadata: false 132 | -------------------------------------------------------------------------------- /census_map_downloader/geotypes/zctas.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python 2 | import collections 3 | 4 | # Logging 5 | import logging 6 | from urllib.request import urlretrieve 7 | 8 | import geopandas as gpd 9 | import pandas as pd 10 | import us 11 | 12 | from census_map_downloader.base import BaseDownloader 13 | 14 | logger = logging.getLogger(__name__) 15 | 16 | 17 | class ZctasDownloader(BaseDownloader): 18 | """ 19 | Download 5-digit ZIP Code Tabulation Area 20 | """ 21 | 22 | YEAR_LIST = [ 23 | 2012, 24 | 2013, 25 | 2014, 26 | 2015, 27 | 2016, 28 | 2017, 29 | 2018, 30 | 2019, 31 | 2020, 32 | ] 33 | # Docs pg 62 https://www2.census.gov/geo/pdfs/maps-data/data/tiger/tgrshp2018/TGRSHP2018_TechDoc_Ch3.pdf 34 | PROCESSED_NAME = "zctas" 35 | FIELD_CROSSWALK = collections.OrderedDict( 36 | {"GEOID10": "geoid", "geometry": "geometry"} 37 | ) 38 | 39 | @property 40 | def url(self): 41 | return f"https://www2.census.gov/geo/tiger/TIGER{self.year}/ZCTA5/tl_{self.year}_us_zcta510.zip" 42 | 43 | @property 44 | def zip_name(self): 45 | return f"tl_{self.year}_us_zcta510.zip" 46 | 47 | # Add a raw download path for the relationships files 48 | 49 | @property 50 | def relationship_name(self): 51 | return "zcta_county_rel_10.txt" 52 | 53 | @property 54 | def relationship_path(self): 55 | return self.raw_dir.joinpath(self.relationship_name) 56 | 57 | def download(self): 58 | # Do the regular download 59 | super().download() 60 | 61 | # Also download the relationship file that connects ZCTAs to counties 62 | if self.relationship_path.exists(): 63 | logger.debug( 64 | f"Relationship file already exists at {self.relationship_path}" 65 | ) 66 | return 67 | self.relationship_url = ( 68 | "https://www2.census.gov/geo/docs/maps-data/data/rel/zcta_county_rel_10.txt" 69 | ) 70 | logger.debug(f"Downloading {self.relationship_url} to {self.relationship_path}") 71 | urlretrieve(self.relationship_url, self.relationship_path) 72 | 73 | def process(self): 74 | """ 75 | Refine the raw data and convert it to our preferred format, GeoJSON. 76 | """ 77 | # Read in the raw shape 78 | gdf = gpd.read_file(self.shp_path) 79 | 80 | # Trim it down to the subset of fields we want to keep 81 | trimmed = gdf[list(self.FIELD_CROSSWALK.keys())] 82 | 83 | # Rename the fields using the crosswalk 84 | trimmed.rename(columns=self.FIELD_CROSSWALK, inplace=True) 85 | 86 | # Read relationship file 87 | df = pd.read_csv( 88 | self.relationship_path, 89 | usecols=["ZCTA5", "STATE"], 90 | dtype={"ZCTA5": str, "STATE": str}, 91 | ) 92 | 93 | # Loop through the 50 states 94 | for state in us.STATES: 95 | # Filter down to the ZCTAs in this state 96 | state_df = trimmed[ 97 | trimmed.geoid.isin(df.loc[df.STATE == state.fips, "ZCTA5"]) 98 | ] 99 | 100 | # Set page for this GeoJSON 101 | state_geojson_path = self.processed_dir.joinpath( 102 | f"{self.PROCESSED_NAME}_{state.abbr.lower()}.geojson" 103 | ) 104 | 105 | # Check if the geojson file already exists 106 | if state_geojson_path.exists(): 107 | logger.debug(f"GeoJSON file already exists at {state_geojson_path}") 108 | continue 109 | 110 | # Write it out as GeoJSON 111 | logger.debug( 112 | f"Writing out {len(state_df)} shapes in {state} to {state_geojson_path}" 113 | ) 114 | state_df.to_file(state_geojson_path, driver="GeoJSON") 115 | -------------------------------------------------------------------------------- /test.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python 2 | import shutil 3 | import unittest 4 | from pathlib import Path 5 | 6 | import census_map_downloader 7 | 8 | 9 | class BaseDownloaderTestCase(unittest.TestCase): 10 | def test_init_unsupported_year(self): 11 | """Test that constructor raises an exception for an unsupported year""" 12 | 13 | with self.assertRaises(ValueError): 14 | census_map_downloader.BaseDownloader(year=1900) 15 | 16 | 17 | class CountiesDownloaderTestCase(unittest.TestCase): 18 | def setUp(self): 19 | self.MOST_RECENT_YEAR = 2020 20 | self.DATA_DIR = Path(__file__).resolve().parent / "test-data" 21 | 22 | self.DATA_DIR.mkdir(exist_ok=True) 23 | 24 | def tearDown(self): 25 | """Tear down test environment""" 26 | shutil.rmtree(self.DATA_DIR) 27 | 28 | def test_init_default_year(self): 29 | """ 30 | Test that a default year attribute is set when no year is passed to 31 | constructor 32 | """ 33 | downloader = census_map_downloader.CountiesDownloader() 34 | self.assertEqual(downloader.year, self.MOST_RECENT_YEAR) 35 | 36 | def test_init_specify_year(self): 37 | """ 38 | Test that the year attribute is set to the year passed to the 39 | constructor 40 | """ 41 | downloader = census_map_downloader.CountiesDownloader(year=2018) 42 | self.assertEqual(downloader.year, 2018) 43 | 44 | def test_url_default_year(self): 45 | """ 46 | Test that the download URL reflects the default year when no year is 47 | passed to thee constructor 48 | """ 49 | downloader = census_map_downloader.CountiesDownloader() 50 | self.assertTrue(str(self.MOST_RECENT_YEAR) in downloader.url) 51 | 52 | def test_url_specify_year(self): 53 | """ 54 | Test that the download URL reflects the year passed to the constructor 55 | """ 56 | downloader = census_map_downloader.CountiesDownloader(year=2018) 57 | self.assertTrue("2018" in downloader.url) 58 | 59 | def test_run_default_year(self): 60 | """ 61 | Test that the default year's shapefile is downloaded and processed 62 | when no year is passed to the constructor 63 | """ 64 | # TODO: This is more of an integration test because it makes a request 65 | # and touches the filesystem. It might be better to mock 66 | # various classes and methods to detect whether things like 67 | # urlretrive() are called. We don't need to test their 68 | # functionality. 69 | downloader = census_map_downloader.CountiesDownloader(data_dir=self.DATA_DIR) 70 | downloader.run() 71 | 72 | shapefile_zip_path = ( 73 | self.DATA_DIR / "raw" / f"tl_{self.MOST_RECENT_YEAR}_us_county.zip" 74 | ) 75 | self.assertTrue(shapefile_zip_path.is_file()) 76 | shapefile_path = ( 77 | self.DATA_DIR / "raw" / f"tl_{self.MOST_RECENT_YEAR}_us_county.shp" 78 | ) 79 | self.assertTrue(shapefile_path.is_file()) 80 | geojson_path = ( 81 | self.DATA_DIR / "processed" / f"counties_{self.MOST_RECENT_YEAR}.geojson" 82 | ) 83 | self.assertTrue(geojson_path.is_file()) 84 | 85 | def test_run_specify_year(self): 86 | """ 87 | Test that the shapefile that is downloaded and processed 88 | reflects the year passed to the constructor 89 | """ 90 | # TODO: This is more of an integration test because it makes a request 91 | # and touches the filesystem. It might be better to mock 92 | # various classes and methods to detect whether things like 93 | # urlretrive() are called. We don't need to test their 94 | # functionality. 95 | year = 2018 96 | downloader = census_map_downloader.CountiesDownloader( 97 | data_dir=self.DATA_DIR, year=year 98 | ) 99 | downloader.run() 100 | 101 | shapefile_zip_path = self.DATA_DIR / "raw" / f"tl_{year}_us_county.zip" 102 | self.assertTrue(shapefile_zip_path.is_file()) 103 | shapefile_path = self.DATA_DIR / "raw" / f"tl_{year}_us_county.shp" 104 | self.assertTrue(shapefile_path.is_file()) 105 | geojson_path = self.DATA_DIR / "processed" / f"counties_{year}.geojson" 106 | self.assertTrue(geojson_path.is_file()) 107 | 108 | 109 | if __name__ == "__main__": 110 | unittest.main() 111 | -------------------------------------------------------------------------------- /census_map_downloader/geotypes/tracts.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python 2 | import collections 3 | 4 | # Logging 5 | import logging 6 | 7 | from census_map_downloader.base import BaseStateDownloader, BaseStateListDownloader 8 | 9 | logger = logging.getLogger(__name__) 10 | 11 | 12 | class StateTractsDownloader2010(BaseStateDownloader): 13 | """ 14 | Download 2010 tracts for a single state. 15 | """ 16 | 17 | YEAR_LIST = [2010] 18 | PROCESSED_NAME = "tracts" 19 | # Docs pg 57 (https://www2.census.gov/geo/pdfs/maps-data/data/tiger/tgrshp2018/TGRSHP2018_TechDoc_Ch3.pdf) 20 | FIELD_CROSSWALK = collections.OrderedDict( 21 | { 22 | "STATEFP10": "state_fips", 23 | "COUNTYFP10": "county_fips", 24 | "TRACTCE10": "tract_id", 25 | "GEOID10": "geoid", 26 | "NAME10": "tract_name", 27 | "geometry": "geometry", 28 | } 29 | ) 30 | 31 | @property 32 | def url(self): 33 | return self.state.shapefile_urls("tract") 34 | 35 | @property 36 | def zip_name(self): 37 | return f"tl_2010_{self.state.fips}_tract10.zip" 38 | 39 | 40 | class StateTractsDownloader2000(StateTractsDownloader2010): 41 | """ 42 | Download 2000 tracts for a single state. 43 | """ 44 | 45 | YEAR_LIST = [2000] 46 | # Docs pg 57 (https://www2.census.gov/geo/pdfs/maps-data/data/tiger/tgrshp2010/TGRSHP10SF1.pdf) 47 | FIELD_CROSSWALK = collections.OrderedDict( 48 | { 49 | "STATEFP00": "state_fips", 50 | "COUNTYFP00": "county_fips", 51 | "TRACTCE00": "tract_id", 52 | "CTIDFP00": "geoid", 53 | "NAME00": "tract_name", 54 | "geometry": "geometry", 55 | } 56 | ) 57 | 58 | @property 59 | def url(self): 60 | return f"https://www2.census.gov/geo/tiger/TIGER2009/{self.zip_folder}/{self.zip_name}" 61 | 62 | @property 63 | def zip_name(self): 64 | return f"tl_2009_{self.state.fips}_tract00.zip" 65 | 66 | @property 67 | def zip_folder(self): 68 | return f"{self.state.fips}_{self.state.name.upper().replace(' ', '_')}" 69 | 70 | 71 | class StateTractsDownloader2011To2020(BaseStateDownloader): 72 | """ 73 | Download 2011-2020 tracts for a single state. 74 | """ 75 | 76 | YEAR_LIST = [ 77 | 2011, 78 | 2012, 79 | 2013, 80 | 2014, 81 | 2015, 82 | 2016, 83 | 2017, 84 | 2018, 85 | 2019, 86 | 2020, 87 | ] 88 | PROCESSED_NAME = "tracts" 89 | # Docs pg 57 (https://www2.census.gov/geo/pdfs/maps-data/data/tiger/tgrshp2018/TGRSHP2018_TechDoc_Ch3.pdf) 90 | FIELD_CROSSWALK = collections.OrderedDict( 91 | { 92 | "STATEFP": "state_fips", 93 | "COUNTYFP": "county_fips", 94 | "TRACTCE": "tract_id", 95 | "GEOID": "geoid", 96 | "NAME": "tract_name", 97 | "geometry": "geometry", 98 | } 99 | ) 100 | 101 | @property 102 | def url(self): 103 | return ( 104 | f"https://www2.census.gov/geo/tiger/TIGER{self.year}/TRACT/{self.zip_name}" 105 | ) 106 | 107 | @property 108 | def zip_name(self): 109 | return f"tl_{self.year}_{self.state.fips}_tract.zip" 110 | 111 | @property 112 | def zip_folder(self): 113 | return f"tl_{self.year}_{self.state.fips}_tract" 114 | 115 | 116 | class TractsDownloader(BaseStateListDownloader): 117 | """ 118 | Download all 2000 tracts in the United States. 119 | """ 120 | 121 | YEAR_LIST = [ 122 | 2000, 123 | 2010, 124 | 2011, 125 | 2012, 126 | 2013, 127 | 2014, 128 | 2015, 129 | 2016, 130 | 2017, 131 | 2018, 132 | 2019, 133 | 2020, 134 | ] 135 | PROCESSED_NAME = "tracts" 136 | 137 | def __init__(self, data_dir=None, year=None): 138 | # Delegate to separate classes depending on the year. 139 | # This approach avoids branching inside the property methods of the 140 | # downloader classes and allows differences in vintages to be defined 141 | # in a more declarative way. 142 | if year == 2000: 143 | self.DOWNLOADER_CLASS = StateTractsDownloader2000 144 | elif year == 2010: 145 | self.DOWNLOADER_CLASS = StateTractsDownloader2010 146 | else: 147 | self.DOWNLOADER_CLASS = StateTractsDownloader2011To2020 148 | 149 | super().__init__(data_dir, year) 150 | -------------------------------------------------------------------------------- /census_map_downloader/base.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python 2 | # Logging 3 | import logging 4 | import pathlib 5 | import time 6 | import zipfile 7 | from urllib.request import urlretrieve 8 | 9 | import geopandas as gpd 10 | import us 11 | 12 | logger = logging.getLogger(__name__) 13 | 14 | 15 | class BaseDownloader: 16 | YEAR_LIST = [2018] 17 | THIS_DIR = pathlib.Path(__file__).parent 18 | PARENT_DIR = THIS_DIR.parent 19 | 20 | def __init__(self, data_dir=None, year=None): 21 | # Set the download directory 22 | if data_dir: 23 | self.data_dir = pathlib.Path(str(data_dir)) 24 | else: 25 | self.data_dir = self.PARENT_DIR.joinpath("data") 26 | 27 | if year is None: 28 | # If year is not specified, use the most recent year 29 | self.year = self.YEAR_LIST[-1] 30 | else: 31 | self.year = year 32 | 33 | # Validate the year 34 | if self.year not in self.YEAR_LIST: 35 | raise ValueError("This year is not supported for this geotype") 36 | 37 | # Initialize all the directories we will need 38 | if not self.data_dir.exists(): 39 | self.data_dir.mkdir() 40 | self.raw_dir = self.data_dir.joinpath("raw") 41 | if not self.raw_dir.exists(): 42 | self.raw_dir.mkdir() 43 | self.processed_dir = self.data_dir.joinpath("processed") 44 | if not self.processed_dir.exists(): 45 | self.processed_dir.mkdir() 46 | 47 | def run(self): 48 | """ 49 | Execute the downloader to fetch, prep and clean the source geotype files. 50 | """ 51 | self.download() 52 | self.unzip() 53 | self.process() 54 | 55 | @property 56 | def zip_name(self): 57 | """ 58 | The name of the source zipfile 59 | """ 60 | raise NotImplementedError( 61 | "All geotype subclasses must provide their own zip_name property." 62 | ) 63 | 64 | @property 65 | def zip_path(self): 66 | """ 67 | The full path to the source zipfile. 68 | """ 69 | return self.raw_dir.joinpath(self.zip_name) 70 | 71 | @property 72 | def shp_name(self): 73 | """ 74 | The name of the source shapefile. 75 | """ 76 | return self.zip_name.replace(".zip", ".shp") 77 | 78 | @property 79 | def shp_path(self): 80 | """ 81 | The full path to the source shapefile. 82 | """ 83 | return self.raw_dir.joinpath(self.shp_name) 84 | 85 | @property 86 | def geojson_name(self): 87 | """ 88 | The name of the target GeoJSON created by this downloader. 89 | """ 90 | return f"{self.PROCESSED_NAME}_{self.year}.geojson" 91 | 92 | @property 93 | def geojson_path(self): 94 | """ 95 | The full path to the target GeoJSON created by this downloader. 96 | """ 97 | return self.processed_dir.joinpath(self.geojson_name) 98 | 99 | def download(self): 100 | """ 101 | Download the source geotype files. 102 | """ 103 | # Check if the zip file already exists 104 | if self.zip_path.exists(): 105 | logger.debug(f"ZIP file already exists at {self.zip_path}") 106 | return 107 | 108 | # If it doesn't, download it from the Census site 109 | logger.debug(f"Downloading {self.url} to {self.zip_path}") 110 | urlretrieve(self.url, self.zip_path) 111 | time.sleep(1) 112 | 113 | def unzip(self): 114 | """ 115 | Unzip the source geotype files. 116 | """ 117 | # Check if the shape has already been unzipped 118 | if self.shp_path.exists(): 119 | logger.debug(f"SHP already unzipped at {self.shp_path}") 120 | return 121 | 122 | # If not, unzip it now. 123 | logger.debug(f"Unzipping {self.zip_path} to {self.raw_dir}") 124 | with zipfile.ZipFile(self.zip_path, "r") as z: 125 | z.extractall(self.raw_dir) 126 | 127 | def process(self): 128 | """ 129 | Refine the source data and convert to cleaned GeoJSON. 130 | """ 131 | # Check if the geojson file already exists 132 | if self.geojson_path.exists(): 133 | logger.debug(f"GeoJSON file already exists at {self.geojson_path}") 134 | return 135 | 136 | # Read in the source shapefile 137 | gdf = gpd.read_file(self.shp_path) 138 | 139 | # Trim it down to the subset of fields we want to keep 140 | trimmed = gdf[list(self.FIELD_CROSSWALK.keys())] 141 | 142 | # Rename the fields using the crosswalk 143 | cleaned = trimmed.rename(columns=self.FIELD_CROSSWALK) 144 | 145 | # Write out a GeoJSON file 146 | logger.debug(f"Writing out {len(cleaned)} shapes to {self.geojson_path}") 147 | cleaned.to_file(self.geojson_path, driver="GeoJSON") 148 | 149 | 150 | class BaseStateDownloader(BaseDownloader): 151 | """ 152 | A base downloader for a single state's source files. 153 | """ 154 | 155 | def __init__(self, state, data_dir, year): 156 | # Configure the state 157 | self.state = us.states.lookup(state) 158 | super().__init__(data_dir, year) 159 | 160 | @property 161 | def geojson_name(self): 162 | return f"{self.PROCESSED_NAME}_{self.year}_{self.state.abbr.lower()}.geojson" 163 | 164 | 165 | class BaseStateListDownloader(BaseDownloader): 166 | """ 167 | A base downloader that will retrieve all 50 states. 168 | """ 169 | 170 | def run(self): 171 | self.download() 172 | self.merge() 173 | self.process() 174 | 175 | @property 176 | def merged_path(self): 177 | """ 178 | The location of all the source shapefiles merged together. 179 | """ 180 | return self.raw_dir.joinpath(f"{self.PROCESSED_NAME}_{self.year}.shp") 181 | 182 | def download(self): 183 | # Loop through all the states and download the shapes 184 | for state in us.STATES: 185 | logger.debug(f"Downloading {state}") 186 | try: 187 | runner = self.DOWNLOADER_CLASS( 188 | state.abbr, data_dir=self.data_dir, year=self.year 189 | ) 190 | except ValueError as e: 191 | # Creating the downloader class instance for the state raised 192 | # a `ValueError`. This is usually because the geotype isn't 193 | # supported for a particular state. For example, Nebraska 194 | # only has one chamber, so there's no file for the lower 195 | # cabinet. 196 | # Log this issue and keep going with the other states. 197 | logger.warning(e) 198 | continue 199 | 200 | runner.run() 201 | 202 | def merge(self): 203 | """ 204 | Combine all the source shapefiles into a single shapefile. 205 | """ 206 | if self.merged_path.exists(): 207 | logger.debug(f"SHP file already exists at {self.merged_path}") 208 | return 209 | 210 | # Open all the shapes 211 | path_list = [ 212 | self.DOWNLOADER_CLASS( 213 | state.abbr, data_dir=self.data_dir, year=self.year 214 | ).shp_path 215 | for state in us.STATES 216 | ] 217 | df_list = [gpd.read_file(p) for p in path_list] 218 | 219 | # Concatenate them together 220 | df = gpd.pd.concat(df_list) 221 | 222 | logger.debug(f"Writing file with {len(df)} tracts to {self.merged_path}") 223 | df.to_file(self.merged_path, index=False) 224 | 225 | def process(self): 226 | """ 227 | Process the raw data and convert it to our preferred format, GeoJSON. 228 | """ 229 | if self.geojson_path.exists(): 230 | logger.debug(f"GeoJSON file already exists at {self.geojson_path}") 231 | return 232 | 233 | gdf = gpd.read_file(self.merged_path) 234 | logger.debug(f"Writing out {len(gdf)} shapes to {self.geojson_path}") 235 | gdf.to_file(self.geojson_path, driver="GeoJSON") 236 | -------------------------------------------------------------------------------- /notebooks/testing.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "import geopandas as gpd" 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": 2, 15 | "metadata": {}, 16 | "outputs": [], 17 | "source": [ 18 | "%matplotlib inline" 19 | ] 20 | }, 21 | { 22 | "cell_type": "markdown", 23 | "metadata": {}, 24 | "source": [ 25 | "Counties" 26 | ] 27 | }, 28 | { 29 | "cell_type": "code", 30 | "execution_count": 3, 31 | "metadata": {}, 32 | "outputs": [], 33 | "source": [ 34 | "counties = gpd.read_file(\"../processed/counties_2018.geojson\")" 35 | ] 36 | }, 37 | { 38 | "cell_type": "code", 39 | "execution_count": 4, 40 | "metadata": {}, 41 | "outputs": [ 42 | { 43 | "name": "stdout", 44 | "output_type": "stream", 45 | "text": [ 46 | "\n", 47 | "RangeIndex: 3233 entries, 0 to 3232\n", 48 | "Data columns (total 5 columns):\n", 49 | "state_fips 3233 non-null object\n", 50 | "county_fips 3233 non-null object\n", 51 | "county_identifier 3233 non-null object\n", 52 | "county_name 3233 non-null object\n", 53 | "geometry 3233 non-null object\n", 54 | "dtypes: object(5)\n", 55 | "memory usage: 126.4+ KB\n" 56 | ] 57 | } 58 | ], 59 | "source": [ 60 | "counties.info()" 61 | ] 62 | }, 63 | { 64 | "cell_type": "code", 65 | "execution_count": 5, 66 | "metadata": {}, 67 | "outputs": [ 68 | { 69 | "data": { 70 | "text/html": [ 71 | "
\n", 72 | "\n", 85 | "\n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | "
state_fipscounty_fipscounty_identifiercounty_namegeometry
03103931039CumingPOLYGON ((-97.019516 42.004097, -97.019519 42....
15306953069WahkiakumPOLYGON ((-123.436394 46.238197, -123.447592 4...
23501135011De BacaPOLYGON ((-104.567387 33.997566, -104.567717 3...
33110931109LancasterPOLYGON ((-96.910751 40.784944, -96.910753 40....
43112931129NuckollsPOLYGON ((-98.273667 40.089399, -98.273667 40....
\n", 139 | "
" 140 | ], 141 | "text/plain": [ 142 | " state_fips county_fips county_identifier county_name \\\n", 143 | "0 31 039 31039 Cuming \n", 144 | "1 53 069 53069 Wahkiakum \n", 145 | "2 35 011 35011 De Baca \n", 146 | "3 31 109 31109 Lancaster \n", 147 | "4 31 129 31129 Nuckolls \n", 148 | "\n", 149 | " geometry \n", 150 | "0 POLYGON ((-97.019516 42.004097, -97.019519 42.... \n", 151 | "1 POLYGON ((-123.436394 46.238197, -123.447592 4... \n", 152 | "2 POLYGON ((-104.567387 33.997566, -104.567717 3... \n", 153 | "3 POLYGON ((-96.910751 40.784944, -96.910753 40.... \n", 154 | "4 POLYGON ((-98.273667 40.089399, -98.273667 40.... " 155 | ] 156 | }, 157 | "execution_count": 5, 158 | "metadata": {}, 159 | "output_type": "execute_result" 160 | } 161 | ], 162 | "source": [ 163 | "counties.head()" 164 | ] 165 | }, 166 | { 167 | "cell_type": "code", 168 | "execution_count": 9, 169 | "metadata": {}, 170 | "outputs": [], 171 | "source": [ 172 | "assert len(counties[counties.county_identifier.str.startswith(\"06\")]) == 58" 173 | ] 174 | }, 175 | { 176 | "cell_type": "code", 177 | "execution_count": null, 178 | "metadata": {}, 179 | "outputs": [], 180 | "source": [ 181 | "# counties.plot()" 182 | ] 183 | }, 184 | { 185 | "cell_type": "markdown", 186 | "metadata": {}, 187 | "source": [ 188 | "Blocks" 189 | ] 190 | }, 191 | { 192 | "cell_type": "code", 193 | "execution_count": 12, 194 | "metadata": {}, 195 | "outputs": [], 196 | "source": [ 197 | "blocks = gpd.read_file(\"../processed/blocks_2018_ak.geojson\")" 198 | ] 199 | }, 200 | { 201 | "cell_type": "code", 202 | "execution_count": 13, 203 | "metadata": {}, 204 | "outputs": [ 205 | { 206 | "name": "stdout", 207 | "output_type": "stream", 208 | "text": [ 209 | "\n", 210 | "RangeIndex: 45292 entries, 0 to 45291\n", 211 | "Data columns (total 6 columns):\n", 212 | "state_fips 45292 non-null object\n", 213 | "county_fips 45292 non-null object\n", 214 | "block_id 45292 non-null object\n", 215 | "geoid 45292 non-null object\n", 216 | "block_name 45292 non-null object\n", 217 | "geometry 45292 non-null object\n", 218 | "dtypes: object(6)\n", 219 | "memory usage: 2.1+ MB\n" 220 | ] 221 | } 222 | ], 223 | "source": [ 224 | "blocks.info()" 225 | ] 226 | }, 227 | { 228 | "cell_type": "code", 229 | "execution_count": 14, 230 | "metadata": {}, 231 | "outputs": [ 232 | { 233 | "data": { 234 | "text/html": [ 235 | "
\n", 236 | "\n", 249 | "\n", 250 | " \n", 251 | " \n", 252 | " \n", 253 | " \n", 254 | " \n", 255 | " \n", 256 | " \n", 257 | " \n", 258 | " \n", 259 | " \n", 260 | " \n", 261 | " \n", 262 | " \n", 263 | " \n", 264 | " \n", 265 | " \n", 266 | " \n", 267 | " \n", 268 | " \n", 269 | " \n", 270 | " \n", 271 | " \n", 272 | " \n", 273 | " \n", 274 | " \n", 275 | " \n", 276 | " \n", 277 | " \n", 278 | " \n", 279 | " \n", 280 | " \n", 281 | " \n", 282 | " \n", 283 | " \n", 284 | " \n", 285 | " \n", 286 | " \n", 287 | " \n", 288 | " \n", 289 | " \n", 290 | " \n", 291 | " \n", 292 | " \n", 293 | " \n", 294 | " \n", 295 | " \n", 296 | " \n", 297 | " \n", 298 | " \n", 299 | " \n", 300 | " \n", 301 | " \n", 302 | " \n", 303 | " \n", 304 | " \n", 305 | " \n", 306 | " \n", 307 | " \n", 308 | "
state_fipscounty_fipsblock_idgeoidblock_namegeometry
0020682489020680001002489Block 2489POLYGON ((-152.542201 63.520813, -152.541776 6...
1022201411022200001001411Block 1411POLYGON ((-134.908035 57.120795, -134.907602 5...
2022201106022200001001106Block 1106POLYGON ((-135.896472 57.999021, -135.895952 5...
3022201187022200001001187Block 1187POLYGON ((-135.806357 57.698174, -135.806305 5...
4022201212022200001001212Block 1212POLYGON ((-134.999708 57.544697, -134.999605 5...
\n", 309 | "
" 310 | ], 311 | "text/plain": [ 312 | " state_fips county_fips block_id geoid block_name \\\n", 313 | "0 02 068 2489 020680001002489 Block 2489 \n", 314 | "1 02 220 1411 022200001001411 Block 1411 \n", 315 | "2 02 220 1106 022200001001106 Block 1106 \n", 316 | "3 02 220 1187 022200001001187 Block 1187 \n", 317 | "4 02 220 1212 022200001001212 Block 1212 \n", 318 | "\n", 319 | " geometry \n", 320 | "0 POLYGON ((-152.542201 63.520813, -152.541776 6... \n", 321 | "1 POLYGON ((-134.908035 57.120795, -134.907602 5... \n", 322 | "2 POLYGON ((-135.896472 57.999021, -135.895952 5... \n", 323 | "3 POLYGON ((-135.806357 57.698174, -135.806305 5... \n", 324 | "4 POLYGON ((-134.999708 57.544697, -134.999605 5... " 325 | ] 326 | }, 327 | "execution_count": 14, 328 | "metadata": {}, 329 | "output_type": "execute_result" 330 | } 331 | ], 332 | "source": [ 333 | "blocks.head()" 334 | ] 335 | }, 336 | { 337 | "cell_type": "markdown", 338 | "metadata": {}, 339 | "source": [ 340 | "ZCTA" 341 | ] 342 | }, 343 | { 344 | "cell_type": "code", 345 | "execution_count": 22, 346 | "metadata": {}, 347 | "outputs": [], 348 | "source": [ 349 | "zcta = gpd.read_file(\"../processed/zctas_2018_ia.geojson\")" 350 | ] 351 | }, 352 | { 353 | "cell_type": "code", 354 | "execution_count": 23, 355 | "metadata": {}, 356 | "outputs": [ 357 | { 358 | "name": "stdout", 359 | "output_type": "stream", 360 | "text": [ 361 | "\n", 362 | "RangeIndex: 935 entries, 0 to 934\n", 363 | "Data columns (total 3 columns):\n", 364 | "zcta 935 non-null object\n", 365 | "geoid 935 non-null object\n", 366 | "geometry 935 non-null object\n", 367 | "dtypes: object(3)\n", 368 | "memory usage: 22.0+ KB\n" 369 | ] 370 | } 371 | ], 372 | "source": [ 373 | "zcta.info()" 374 | ] 375 | }, 376 | { 377 | "cell_type": "code", 378 | "execution_count": 25, 379 | "metadata": {}, 380 | "outputs": [ 381 | { 382 | "data": { 383 | "text/html": [ 384 | "
\n", 385 | "\n", 398 | "\n", 399 | " \n", 400 | " \n", 401 | " \n", 402 | " \n", 403 | " \n", 404 | " \n", 405 | " \n", 406 | " \n", 407 | " \n", 408 | " \n", 409 | " \n", 410 | " \n", 411 | " \n", 412 | " \n", 413 | " \n", 414 | " \n", 415 | " \n", 416 | " \n", 417 | " \n", 418 | " \n", 419 | " \n", 420 | " \n", 421 | " \n", 422 | " \n", 423 | " \n", 424 | " \n", 425 | " \n", 426 | " \n", 427 | " \n", 428 | " \n", 429 | " \n", 430 | " \n", 431 | " \n", 432 | " \n", 433 | " \n", 434 | " \n", 435 | " \n", 436 | " \n", 437 | " \n", 438 | " \n", 439 | "
zctageoidgeometry
05064250642POLYGON ((-92.866195 42.455834, -92.856454 42....
15064350643POLYGON ((-92.573013 42.413197, -92.572936 42....
25064450644POLYGON ((-92.031019 42.533212, -92.030995 42....
35064550645POLYGON ((-92.575824 43.097594, -92.575433 43....
45064750647POLYGON ((-92.554782 42.698177, -92.554422 42....
\n", 440 | "
" 441 | ], 442 | "text/plain": [ 443 | " zcta geoid geometry\n", 444 | "0 50642 50642 POLYGON ((-92.866195 42.455834, -92.856454 42....\n", 445 | "1 50643 50643 POLYGON ((-92.573013 42.413197, -92.572936 42....\n", 446 | "2 50644 50644 POLYGON ((-92.031019 42.533212, -92.030995 42....\n", 447 | "3 50645 50645 POLYGON ((-92.575824 43.097594, -92.575433 43....\n", 448 | "4 50647 50647 POLYGON ((-92.554782 42.698177, -92.554422 42...." 449 | ] 450 | }, 451 | "execution_count": 25, 452 | "metadata": {}, 453 | "output_type": "execute_result" 454 | } 455 | ], 456 | "source": [ 457 | "zcta.head()" 458 | ] 459 | }, 460 | { 461 | "cell_type": "markdown", 462 | "metadata": {}, 463 | "source": [ 464 | "Places" 465 | ] 466 | }, 467 | { 468 | "cell_type": "code", 469 | "execution_count": 29, 470 | "metadata": {}, 471 | "outputs": [], 472 | "source": [ 473 | "places = gpd.read_file(\"../processed/places_2018.geojson\")" 474 | ] 475 | }, 476 | { 477 | "cell_type": "code", 478 | "execution_count": 30, 479 | "metadata": {}, 480 | "outputs": [ 481 | { 482 | "name": "stdout", 483 | "output_type": "stream", 484 | "text": [ 485 | "\n", 486 | "RangeIndex: 354 entries, 0 to 353\n", 487 | "Data columns (total 17 columns):\n", 488 | "STATEFP 354 non-null object\n", 489 | "PLACEFP 354 non-null object\n", 490 | "PLACENS 354 non-null object\n", 491 | "GEOID 354 non-null object\n", 492 | "NAME 354 non-null object\n", 493 | "NAMELSAD 354 non-null object\n", 494 | "LSAD 354 non-null object\n", 495 | "CLASSFP 354 non-null object\n", 496 | "PCICBSA 354 non-null object\n", 497 | "PCINECTA 354 non-null object\n", 498 | "MTFCC 354 non-null object\n", 499 | "FUNCSTAT 354 non-null object\n", 500 | "ALAND 354 non-null int64\n", 501 | "AWATER 354 non-null int64\n", 502 | "INTPTLAT 354 non-null object\n", 503 | "INTPTLON 354 non-null object\n", 504 | "geometry 354 non-null object\n", 505 | "dtypes: int64(2), object(15)\n", 506 | "memory usage: 47.1+ KB\n" 507 | ] 508 | } 509 | ], 510 | "source": [ 511 | "places.info()" 512 | ] 513 | }, 514 | { 515 | "cell_type": "code", 516 | "execution_count": 31, 517 | "metadata": {}, 518 | "outputs": [ 519 | { 520 | "data": { 521 | "text/html": [ 522 | "
\n", 523 | "\n", 536 | "\n", 537 | " \n", 538 | " \n", 539 | " \n", 540 | " \n", 541 | " \n", 542 | " \n", 543 | " \n", 544 | " \n", 545 | " \n", 546 | " \n", 547 | " \n", 548 | " \n", 549 | " \n", 550 | " \n", 551 | " \n", 552 | " \n", 553 | " \n", 554 | " \n", 555 | " \n", 556 | " \n", 557 | " \n", 558 | " \n", 559 | " \n", 560 | " \n", 561 | " \n", 562 | " \n", 563 | " \n", 564 | " \n", 565 | " \n", 566 | " \n", 567 | " \n", 568 | " \n", 569 | " \n", 570 | " \n", 571 | " \n", 572 | " \n", 573 | " \n", 574 | " \n", 575 | " \n", 576 | " \n", 577 | " \n", 578 | " \n", 579 | " \n", 580 | " \n", 581 | " \n", 582 | " \n", 583 | " \n", 584 | " \n", 585 | " \n", 586 | " \n", 587 | " \n", 588 | " \n", 589 | " \n", 590 | " \n", 591 | " \n", 592 | " \n", 593 | " \n", 594 | " \n", 595 | " \n", 596 | " \n", 597 | " \n", 598 | " \n", 599 | " \n", 600 | " \n", 601 | " \n", 602 | " \n", 603 | " \n", 604 | " \n", 605 | " \n", 606 | " \n", 607 | " \n", 608 | " \n", 609 | " \n", 610 | " \n", 611 | " \n", 612 | " \n", 613 | " \n", 614 | " \n", 615 | " \n", 616 | " \n", 617 | " \n", 618 | " \n", 619 | " \n", 620 | " \n", 621 | " \n", 622 | " \n", 623 | " \n", 624 | " \n", 625 | " \n", 626 | " \n", 627 | " \n", 628 | " \n", 629 | " \n", 630 | " \n", 631 | " \n", 632 | " \n", 633 | " \n", 634 | " \n", 635 | " \n", 636 | " \n", 637 | " \n", 638 | " \n", 639 | " \n", 640 | " \n", 641 | " \n", 642 | " \n", 643 | " \n", 644 | " \n", 645 | " \n", 646 | " \n", 647 | " \n", 648 | " \n", 649 | " \n", 650 | " \n", 651 | " \n", 652 | " \n", 653 | " \n", 654 | " \n", 655 | " \n", 656 | " \n", 657 | " \n", 658 | " \n", 659 | " \n", 660 | " \n", 661 | "
STATEFPPLACEFPPLACENSGEOIDNAMENAMELSADLSADCLASSFPPCICBSAPCINECTAMTFCCFUNCSTATALANDAWATERINTPTLATINTPTLONgeometry
00216360024193710216360Coffman CoveCoffman Cove city25C1NNG4110A281510346262727+56.0017524-132.8419314POLYGON ((-132.904509 56.026356, -132.904024 5...
10234460024194010234460HydaburgHydaburg city25C1NNG4110A74192920743+55.2058418-132.8204379POLYGON ((-132.829834 55.208439, -132.829386 5...
20237650024194060237650KasaanKasaan city25C1NNG4110A157034141904849+55.5611447-132.4068335POLYGON ((-132.478383 55.561556, -132.475771 5...
30240400024194120240400KlawockKlawock city25C1NNG4110A1884219634266+55.5564133-133.0862916POLYGON ((-133.103904 55.558798, -133.103102 5...
40277140024188620277140Thorne BayThorne Bay city25C1NNG4110A690817237883794+55.6670265-132.5356533POLYGON ((-132.643987 55.709716, -132.63119 55...
\n", 662 | "
" 663 | ], 664 | "text/plain": [ 665 | " STATEFP PLACEFP PLACENS GEOID NAME NAMELSAD LSAD \\\n", 666 | "0 02 16360 02419371 0216360 Coffman Cove Coffman Cove city 25 \n", 667 | "1 02 34460 02419401 0234460 Hydaburg Hydaburg city 25 \n", 668 | "2 02 37650 02419406 0237650 Kasaan Kasaan city 25 \n", 669 | "3 02 40400 02419412 0240400 Klawock Klawock city 25 \n", 670 | "4 02 77140 02418862 0277140 Thorne Bay Thorne Bay city 25 \n", 671 | "\n", 672 | " CLASSFP PCICBSA PCINECTA MTFCC FUNCSTAT ALAND AWATER INTPTLAT \\\n", 673 | "0 C1 N N G4110 A 28151034 6262727 +56.0017524 \n", 674 | "1 C1 N N G4110 A 741929 20743 +55.2058418 \n", 675 | "2 C1 N N G4110 A 15703414 1904849 +55.5611447 \n", 676 | "3 C1 N N G4110 A 1884219 634266 +55.5564133 \n", 677 | "4 C1 N N G4110 A 69081723 7883794 +55.6670265 \n", 678 | "\n", 679 | " INTPTLON geometry \n", 680 | "0 -132.8419314 POLYGON ((-132.904509 56.026356, -132.904024 5... \n", 681 | "1 -132.8204379 POLYGON ((-132.829834 55.208439, -132.829386 5... \n", 682 | "2 -132.4068335 POLYGON ((-132.478383 55.561556, -132.475771 5... \n", 683 | "3 -133.0862916 POLYGON ((-133.103904 55.558798, -133.103102 5... \n", 684 | "4 -132.5356533 POLYGON ((-132.643987 55.709716, -132.63119 55... " 685 | ] 686 | }, 687 | "execution_count": 31, 688 | "metadata": {}, 689 | "output_type": "execute_result" 690 | } 691 | ], 692 | "source": [ 693 | "places.head()" 694 | ] 695 | } 696 | ], 697 | "metadata": { 698 | "kernelspec": { 699 | "display_name": "Python 3", 700 | "language": "python", 701 | "name": "python3" 702 | }, 703 | "language_info": { 704 | "codemirror_mode": { 705 | "name": "ipython", 706 | "version": 3 707 | }, 708 | "file_extension": ".py", 709 | "mimetype": "text/x-python", 710 | "name": "python", 711 | "nbconvert_exporter": "python", 712 | "pygments_lexer": "ipython3", 713 | "version": "3.6.8" 714 | } 715 | }, 716 | "nbformat": 4, 717 | "nbformat_minor": 4 718 | } 719 | -------------------------------------------------------------------------------- /Pipfile.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_meta": { 3 | "hash": { 4 | "sha256": "461754a7ffa00df318580ce64be60fb3a702dabb1cb04ccd423856cf087b98bc" 5 | }, 6 | "pipfile-spec": 6, 7 | "requires": { 8 | "python_version": "3.9" 9 | }, 10 | "sources": [ 11 | { 12 | "name": "pypi", 13 | "url": "https://pypi.org/simple", 14 | "verify_ssl": true 15 | } 16 | ] 17 | }, 18 | "default": { 19 | "attrs": { 20 | "hashes": [ 21 | "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6", 22 | "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c" 23 | ], 24 | "markers": "python_version >= '3.5'", 25 | "version": "==22.1.0" 26 | }, 27 | "certifi": { 28 | "hashes": [ 29 | "sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14", 30 | "sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382" 31 | ], 32 | "markers": "python_version >= '3.6'", 33 | "version": "==2022.9.24" 34 | }, 35 | "click": { 36 | "hashes": [ 37 | "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e", 38 | "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48" 39 | ], 40 | "index": "pypi", 41 | "version": "==8.1.3" 42 | }, 43 | "click-plugins": { 44 | "hashes": [ 45 | "sha256:46ab999744a9d831159c3411bb0c79346d94a444df9a3a3742e9ed63645f264b", 46 | "sha256:5d262006d3222f5057fd81e1623d4443e41dcda5dc815c06b442aa3c02889fc8" 47 | ], 48 | "version": "==1.1.1" 49 | }, 50 | "cligj": { 51 | "hashes": [ 52 | "sha256:a4bc13d623356b373c2c27c53dbd9c68cae5d526270bfa71f6c6fa69669c6b27", 53 | "sha256:c1ca117dbce1fe20a5809dc96f01e1c2840f6dcc939b3ddbb1111bf330ba82df" 54 | ], 55 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' and python_version < '4'", 56 | "version": "==0.7.2" 57 | }, 58 | "fiona": { 59 | "hashes": [ 60 | "sha256:18649326a7724611b16b648e14fd094089d517413b95ac91d0cdb0adc5fcb8de", 61 | "sha256:3f26c8b6ea9bc92cbd52a4dd83ffd44472450bf92f4e3d4ef2341adc2f35a54d", 62 | "sha256:59a3800bc09ebee3516d64d02a8a6818d07ab1573c6096f3ef3468bf9f8f95f8", 63 | "sha256:6ba2294bc6adcbc36229862667aac6b98e6c306e1958caf53b8bfcf9a3b8c77a", 64 | "sha256:75924f69c51db6e258c91308780546278028c509db12aa33a47692a0266c9667", 65 | "sha256:89cfcc3bdb4aba7bba1eb552b3866b851334693ab694529803122b21f5927960", 66 | "sha256:904793b17aee70ca9c3d582dbf01623eccfdeacd00c5e1a8e421be41f2e43d67", 67 | "sha256:a82a99ce9b3e7825740157c45c9fb2259d4e92f0a886aaac25f0db40ffe1eea3", 68 | "sha256:b5cad3424b7473eb0e19f17ee45abec92133a694a4b452a278f02e3b8d0f810f", 69 | "sha256:b88e2e6548a41c1dfa3f96c8275ff472a3edca729e14a641c0fa5b2e146a8ab5", 70 | "sha256:c28d9ffa5d230a1d9eaf571529fa9eb7573d39613354c090ad077ad153a37ee1", 71 | "sha256:c4aafdd565b3a30bdd78cafae35d4945f6741eef31401c1bb1e166b6262d7539", 72 | "sha256:ce9a22c9883cc5d11c05ba3fb9db5082044a07c6b299753ea5bb8e178b8ba53b", 73 | "sha256:d0df3e105ad7f0cca5f16b441c232fd693ef6c4adf2c1b6271aaaa1cdc06164d", 74 | "sha256:d47777890aa1d715025abc7a6d6b2a6bb8d2a37cc94c44ce95940b80eda21444", 75 | "sha256:df34c980cd7396adfbc89bbb363bdd6e358c76f91969fc98c9dfc076dd11638d", 76 | "sha256:e33860aaf70bbd2726cff12fd3857bd832b6dc2ad3ce4b27e7563bd68abdc26f", 77 | "sha256:e3ed1c0c1c60f710a612aaeb294de54214d228c4ef40e0c1dc159e46f86a9446", 78 | "sha256:ed75dd29c89e0e455e3a322f28cd92f192bcb8fced16e2bfb6422a7f95ffe5e9" 79 | ], 80 | "version": "==1.8.22" 81 | }, 82 | "geopandas": { 83 | "hashes": [ 84 | "sha256:0cf7f59a7b962bdbee09c1848b1715d1c445d5d27302f219f7f88b4484adef1c", 85 | "sha256:917655f25ee3022809114d833d45969d38afe9f7e5ff2a3b875a85f9bf686819" 86 | ], 87 | "index": "pypi", 88 | "version": "==0.12.1" 89 | }, 90 | "jellyfish": { 91 | "hashes": [ 92 | "sha256:5104e45a2b804b48a46a92a5e6d6e86830fe60ae83b1da32c867402c8f4c2094" 93 | ], 94 | "version": "==0.6.1" 95 | }, 96 | "munch": { 97 | "hashes": [ 98 | "sha256:2d735f6f24d4dba3417fa448cae40c6e896ec1fdab6cdb5e6510999758a4dbd2", 99 | "sha256:6f44af89a2ce4ed04ff8de41f70b226b984db10a91dcc7b9ac2efc1c77022fdd" 100 | ], 101 | "version": "==2.5.0" 102 | }, 103 | "numpy": { 104 | "hashes": [ 105 | "sha256:01dd17cbb340bf0fc23981e52e1d18a9d4050792e8fb8363cecbf066a84b827d", 106 | "sha256:06005a2ef6014e9956c09ba07654f9837d9e26696a0470e42beedadb78c11b07", 107 | "sha256:09b7847f7e83ca37c6e627682f145856de331049013853f344f37b0c9690e3df", 108 | "sha256:0aaee12d8883552fadfc41e96b4c82ee7d794949e2a7c3b3a7201e968c7ecab9", 109 | "sha256:0cbe9848fad08baf71de1a39e12d1b6310f1d5b2d0ea4de051058e6e1076852d", 110 | "sha256:1b1766d6f397c18153d40015ddfc79ddb715cabadc04d2d228d4e5a8bc4ded1a", 111 | "sha256:33161613d2269025873025b33e879825ec7b1d831317e68f4f2f0f84ed14c719", 112 | "sha256:5039f55555e1eab31124a5768898c9e22c25a65c1e0037f4d7c495a45778c9f2", 113 | "sha256:522e26bbf6377e4d76403826ed689c295b0b238f46c28a7251ab94716da0b280", 114 | "sha256:56e454c7833e94ec9769fa0f86e6ff8e42ee38ce0ce1fa4cbb747ea7e06d56aa", 115 | "sha256:58f545efd1108e647604a1b5aa809591ccd2540f468a880bedb97247e72db387", 116 | "sha256:5e05b1c973a9f858c74367553e236f287e749465f773328c8ef31abe18f691e1", 117 | "sha256:7903ba8ab592b82014713c491f6c5d3a1cde5b4a3bf116404e08f5b52f6daf43", 118 | "sha256:8969bfd28e85c81f3f94eb4a66bc2cf1dbdc5c18efc320af34bffc54d6b1e38f", 119 | "sha256:92c8c1e89a1f5028a4c6d9e3ccbe311b6ba53694811269b992c0b224269e2398", 120 | "sha256:9c88793f78fca17da0145455f0d7826bcb9f37da4764af27ac945488116efe63", 121 | "sha256:a7ac231a08bb37f852849bbb387a20a57574a97cfc7b6cabb488a4fc8be176de", 122 | "sha256:abdde9f795cf292fb9651ed48185503a2ff29be87770c3b8e2a14b0cd7aa16f8", 123 | "sha256:af1da88f6bc3d2338ebbf0e22fe487821ea4d8e89053e25fa59d1d79786e7481", 124 | "sha256:b2a9ab7c279c91974f756c84c365a669a887efa287365a8e2c418f8b3ba73fb0", 125 | "sha256:bf837dc63ba5c06dc8797c398db1e223a466c7ece27a1f7b5232ba3466aafe3d", 126 | "sha256:ca51fcfcc5f9354c45f400059e88bc09215fb71a48d3768fb80e357f3b457e1e", 127 | "sha256:ce571367b6dfe60af04e04a1834ca2dc5f46004ac1cc756fb95319f64c095a96", 128 | "sha256:d208a0f8729f3fb790ed18a003f3a57895b989b40ea4dce4717e9cf4af62c6bb", 129 | "sha256:dbee87b469018961d1ad79b1a5d50c0ae850000b639bcb1b694e9981083243b6", 130 | "sha256:e9f4c4e51567b616be64e05d517c79a8a22f3606499941d97bb76f2ca59f982d", 131 | "sha256:f063b69b090c9d918f9df0a12116029e274daf0181df392839661c4c7ec9018a", 132 | "sha256:f9a909a8bae284d46bbfdefbdd4a262ba19d3bc9921b1e76126b1d21c3c34135" 133 | ], 134 | "markers": "python_version < '3.10'", 135 | "version": "==1.23.5" 136 | }, 137 | "packaging": { 138 | "hashes": [ 139 | "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb", 140 | "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522" 141 | ], 142 | "markers": "python_version >= '3.6'", 143 | "version": "==21.3" 144 | }, 145 | "pandas": { 146 | "hashes": [ 147 | "sha256:0183cb04a057cc38fde5244909fca9826d5d57c4a5b7390c0cc3fa7acd9fa883", 148 | "sha256:1fc87eac0541a7d24648a001d553406f4256e744d92df1df8ebe41829a915028", 149 | "sha256:220b98d15cee0b2cd839a6358bd1f273d0356bf964c1a1aeb32d47db0215488b", 150 | "sha256:2552bffc808641c6eb471e55aa6899fa002ac94e4eebfa9ec058649122db5824", 151 | "sha256:315e19a3e5c2ab47a67467fc0362cb36c7c60a93b6457f675d7d9615edad2ebe", 152 | "sha256:344021ed3e639e017b452aa8f5f6bf38a8806f5852e217a7594417fb9bbfa00e", 153 | "sha256:375262829c8c700c3e7cbb336810b94367b9c4889818bbd910d0ecb4e45dc261", 154 | "sha256:457d8c3d42314ff47cc2d6c54f8fc0d23954b47977b2caed09cd9635cb75388b", 155 | "sha256:4aed257c7484d01c9a194d9a94758b37d3d751849c05a0050c087a358c41ad1f", 156 | "sha256:530948945e7b6c95e6fa7aa4be2be25764af53fba93fe76d912e35d1c9ee46f5", 157 | "sha256:5ae7e989f12628f41e804847a8cc2943d362440132919a69429d4dea1f164da0", 158 | "sha256:71f510b0efe1629bf2f7c0eadb1ff0b9cf611e87b73cd017e6b7d6adb40e2b3a", 159 | "sha256:73f219fdc1777cf3c45fde7f0708732ec6950dfc598afc50588d0d285fddaefc", 160 | "sha256:8092a368d3eb7116e270525329a3e5c15ae796ccdf7ccb17839a73b4f5084a39", 161 | "sha256:82ae615826da838a8e5d4d630eb70c993ab8636f0eff13cb28aafc4291b632b5", 162 | "sha256:9608000a5a45f663be6af5c70c3cbe634fa19243e720eb380c0d378666bc7702", 163 | "sha256:a40dd1e9f22e01e66ed534d6a965eb99546b41d4d52dbdb66565608fde48203f", 164 | "sha256:b4f5a82afa4f1ff482ab8ded2ae8a453a2cdfde2001567b3ca24a4c5c5ca0db3", 165 | "sha256:c009a92e81ce836212ce7aa98b219db7961a8b95999b97af566b8dc8c33e9519", 166 | "sha256:c218796d59d5abd8780170c937b812c9637e84c32f8271bbf9845970f8c1351f", 167 | "sha256:cc3cd122bea268998b79adebbb8343b735a5511ec14efb70a39e7acbc11ccbdc", 168 | "sha256:d0d8fd58df5d17ddb8c72a5075d87cd80d71b542571b5f78178fb067fa4e9c72", 169 | "sha256:e18bc3764cbb5e118be139b3b611bc3fbc5d3be42a7e827d1096f46087b395eb", 170 | "sha256:e2b83abd292194f350bb04e188f9379d36b8dfac24dd445d5c87575f3beaf789", 171 | "sha256:e7469271497960b6a781eaa930cba8af400dd59b62ec9ca2f4d31a19f2f91090", 172 | "sha256:e9dbacd22555c2d47f262ef96bb4e30880e5956169741400af8b306bbb24a273", 173 | "sha256:f6257b314fc14958f8122779e5a1557517b0f8e500cfb2bd53fa1f75a8ad0af2" 174 | ], 175 | "markers": "python_version >= '3.8'", 176 | "version": "==1.5.2" 177 | }, 178 | "pyparsing": { 179 | "hashes": [ 180 | "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb", 181 | "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc" 182 | ], 183 | "markers": "python_full_version >= '3.6.8'", 184 | "version": "==3.0.9" 185 | }, 186 | "pyproj": { 187 | "hashes": [ 188 | "sha256:0fff9c3a991508f16027be27d153f6c5583d03799443639d13c681e60f49e2d7", 189 | "sha256:12f62c20656ac9b6076ebb213e9a635d52f4f01fef95310121d337e62e910cb6", 190 | "sha256:14ad113b5753c6057f9b2f3c85a6497cef7fa237c4328f2943c0223e98c1dde6", 191 | "sha256:1f9c100fd0fd80edbc7e4daa303600a8cbef6f0de43d005617acb38276b88dc0", 192 | "sha256:221d8939685e0c43ee594c9f04b6a73a10e8e1cc0e85f28be0b4eb2f1bc8777d", 193 | "sha256:25a36e297f3e0524694d40259e3e895edc1a47492a0e30608268ffc1328e3f5d", 194 | "sha256:2cb8592259ea54e7557523b079d3f2304081680bdb48bfbf0fd879ee6156129c", 195 | "sha256:3b85acf09e5a9e35cd9ee72989793adb7089b4e611be02a43d3d0bda50ad116b", 196 | "sha256:45554f47d1a12a84b0620e4abc08a2a1b5d9f273a4759eaef75e74788ec7162a", 197 | "sha256:4688b4cd62cbd86b5e855f9e27d90fbb53f2b4c2ea1cd394a46919e1a4151b89", 198 | "sha256:47ad53452ae1dc8b0bf1df920a210bb5616989085aa646592f8681f1d741a754", 199 | "sha256:48787962232109bad8b72e27949037a9b03591228a6955f25dbe451233e8648a", 200 | "sha256:4a23d84c5ffc383c7d9f0bde3a06fc1f6697b1b96725597f8f01e7b4bef0a2b5", 201 | "sha256:4e161114bc92701647a83c4bbce79489984f12d980cabb365516e953d1450885", 202 | "sha256:4fd425ee8b6781c249c7adb7daa2e6c41ce573afabe4f380f5eecd913b56a3be", 203 | "sha256:52e54796e2d9554a5eb8f11df4748af1fbbc47f76aa234d6faf09216a84554c5", 204 | "sha256:5816807ca0bdc7256558770c6206a6783a3f02bcf844f94ee245f197bb5f7285", 205 | "sha256:65a0bcdbad95b3c00b419e5d75b1f7e450ec17349b5ea16bf7438ac1d50a12a2", 206 | "sha256:77d5f519f3cdb94b026ecca626f78db4f041afe201cf082079c8c0092a30b087", 207 | "sha256:82200b4569d68b421c079d2973475b58d5959306fe758b43366e79fe96facfe5", 208 | "sha256:954b068136518b3174d0a99448056e97af62b63392a95c420894f7de2229dae6", 209 | "sha256:9a496d9057b2128db9d733e66b206f2d5954bbae6b800d412f562d780561478c", 210 | "sha256:a454a7c4423faa2a14e939d08ef293ee347fa529c9df79022b0585a6e1d8310c", 211 | "sha256:a708445927ace9857f52c3ba67d2915da7b41a8fdcd9b8f99a4c9ed60a75eb33", 212 | "sha256:aa5171f700f174777a9e9ed8f4655583243967c0f9cf2c90e3f54e54ff740134", 213 | "sha256:ccb4b70ad25218027f77e0c8934d10f9b7cdf91d5e64080147743d58fddbc3c0", 214 | "sha256:d94afed99f31673d3d19fe750283621e193e2a53ca9e0443bf9d092c3905833b", 215 | "sha256:e7e609903572a56cca758bbaee5c1663c3e829ddce5eec4f368e68277e37022b", 216 | "sha256:f343725566267a296b09ee7e591894f1fdc90f84f8ad5ec476aeb53bd4479c07", 217 | "sha256:f80adda8c54b84271a93829477a01aa57bc178c834362e9f74e1de1b5033c74c" 218 | ], 219 | "markers": "python_version >= '3.8'", 220 | "version": "==3.4.0" 221 | }, 222 | "python-dateutil": { 223 | "hashes": [ 224 | "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", 225 | "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" 226 | ], 227 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 228 | "version": "==2.8.2" 229 | }, 230 | "pytz": { 231 | "hashes": [ 232 | "sha256:222439474e9c98fced559f1709d89e6c9cbf8d79c794ff3eb9f8800064291427", 233 | "sha256:e89512406b793ca39f5971bc999cc538ce125c0e51c27941bef4568b460095e2" 234 | ], 235 | "version": "==2022.6" 236 | }, 237 | "setuptools": { 238 | "hashes": [ 239 | "sha256:57f6f22bde4e042978bcd50176fdb381d7c21a9efa4041202288d3737a0c6a54", 240 | "sha256:a7620757bf984b58deaf32fc8a4577a9bbc0850cf92c20e1ce41c38c19e5fb75" 241 | ], 242 | "markers": "python_version >= '3.7'", 243 | "version": "==65.6.3" 244 | }, 245 | "shapely": { 246 | "hashes": [ 247 | "sha256:02dd5d7dc6e46515d88874134dc8fcdc65826bca93c3eecee59d1910c42c1b17", 248 | "sha256:0b4ee3132ee90f07d63db3aea316c4c065ed7a26231458dda0874414a09d6ba3", 249 | "sha256:0d885cb0cf670c1c834df3f371de8726efdf711f18e2a75da5cfa82843a7ab65", 250 | "sha256:147066da0be41b147a61f8eb805dea3b13709dbc873a431ccd7306e24d712bc0", 251 | "sha256:21776184516a16bf82a0c3d6d6a312b3cd15a4cabafc61ee01cf2714a82e8396", 252 | "sha256:2e0a8c2e55f1be1312b51c92b06462ea89e6bb703fab4b114e7a846d941cfc40", 253 | "sha256:2fd15397638df291c427a53d641d3e6fd60458128029c8c4f487190473a69a91", 254 | "sha256:3480657460e939f45a7d359ef0e172a081f249312557fe9aa78c4fd3a362d993", 255 | "sha256:370b574c78dc5af3a198a6da5d9b3d7c04654bd2ef7e80e80a3a0992dfb2d9cd", 256 | "sha256:38f0fbbcb8ca20c16451c966c1f527cc43968e121c8a048af19ed3e339a921cd", 257 | "sha256:4728666fff8cccc65a07448cae72c75a8773fea061c3f4f139c44adc429b18c3", 258 | "sha256:48dcfffb9e225c0481120f4bdf622131c8c95f342b00b158cdbe220edbbe20b6", 259 | "sha256:532a55ee2a6c52d23d6f7d1567c8f0473635f3b270262c44e1b0c88096827e22", 260 | "sha256:5d7f85c2d35d39ff53c9216bc76b7641c52326f7e09aaad1789a3611a0f812f2", 261 | "sha256:65b21243d8f6bcd421210daf1fabb9de84de2c04353c5b026173b88d17c1a581", 262 | "sha256:66bdac74fbd1d3458fa787191a90fa0ae610f09e2a5ec398c36f968cc0ed743f", 263 | "sha256:6d388c0c1bd878ed1af4583695690aa52234b02ed35f93a1c8486ff52a555838", 264 | "sha256:6fe855e7d45685926b6ba00aaeb5eba5862611f7465775dacd527e081a8ced6d", 265 | "sha256:753ed0e21ab108bd4282405b9b659f2e985e8502b1a72b978eaa51d3496dee19", 266 | "sha256:783bad5f48e2708a0e2f695a34ed382e4162c795cb2f0368b39528ac1d6db7ed", 267 | "sha256:78fb9d929b8ee15cfd424b6c10879ce1907f24e05fb83310fc47d2cd27088e40", 268 | "sha256:84010db15eb364a52b74ea8804ef92a6a930dfc1981d17a369444b6ddec66efd", 269 | "sha256:8d086591f744be483b34628b391d741e46f2645fe37594319e0a673cc2c26bcf", 270 | "sha256:8e59817b0fe63d34baedaabba8c393c0090f061917d18fc0bcc2f621937a8f73", 271 | "sha256:99a2f0da0109e81e0c101a2b4cd8412f73f5f299e7b5b2deaf64cd2a100ac118", 272 | "sha256:99ab0ddc05e44acabdbe657c599fdb9b2d82e86c5493bdae216c0c4018a82dee", 273 | "sha256:a23ef3882d6aa203dd3623a3d55d698f59bfbd9f8a3bfed52c2da05a7f0f8640", 274 | "sha256:a354199219c8d836f280b88f2c5102c81bb044ccea45bd361dc38a79f3873714", 275 | "sha256:a74631e511153366c6dbe3229fa93f877e3c87ea8369cd00f1d38c76b0ed9ace", 276 | "sha256:ab38f7b5196ace05725e407cb8cab9ff66edb8e6f7bb36a398e8f73f52a7aaa2", 277 | "sha256:adcf8a11b98af9375e32bff91de184f33a68dc48b9cb9becad4f132fa25cfa3c", 278 | "sha256:b65f5d530ba91e49ffc7c589255e878d2506a8b96ffce69d3b7c4500a9a9eaf8", 279 | "sha256:be9423d5a3577ac2e92c7e758bd8a2b205f5e51a012177a590bc46fc51eb4834", 280 | "sha256:c2822111ddc5bcfb116e6c663e403579d0fe3f147d2a97426011a191c43a7458", 281 | "sha256:c6a9a4a31cd6e86d0fbe8473ceed83d4fe760b19d949fb557ef668defafea0f6", 282 | "sha256:d048f93e42ba578b82758c15d8ae037d08e69d91d9872bca5a1895b118f4e2b0", 283 | "sha256:e9c30b311de2513555ab02464ebb76115d242842b29c412f5a9aa0cac57be9f6", 284 | "sha256:ec14ceca36f67cb48b34d02d7f65a9acae15cd72b48e303531893ba4a960f3ea", 285 | "sha256:ef3be705c3eac282a28058e6c6e5503419b250f482320df2172abcbea642c831" 286 | ], 287 | "markers": "python_version >= '3.6'", 288 | "version": "==1.8.5.post1" 289 | }, 290 | "six": { 291 | "hashes": [ 292 | "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", 293 | "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" 294 | ], 295 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 296 | "version": "==1.16.0" 297 | }, 298 | "us": { 299 | "hashes": [ 300 | "sha256:cb11ad0d43deff3a1c3690c74f0c731cff5b862c73339df2edd91133e1496fbc" 301 | ], 302 | "index": "pypi", 303 | "version": "==2.0.2" 304 | } 305 | }, 306 | "develop": { 307 | "alabaster": { 308 | "hashes": [ 309 | "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359", 310 | "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02" 311 | ], 312 | "version": "==0.7.12" 313 | }, 314 | "anyio": { 315 | "hashes": [ 316 | "sha256:25ea0d673ae30af41a0c442f81cf3b38c7e79fdc7b60335a4c14e05eb0947421", 317 | "sha256:fbbe32bd270d2a2ef3ed1c5d45041250284e31fc0a4df4a5a6071842051a51e3" 318 | ], 319 | "markers": "python_full_version >= '3.6.2'", 320 | "version": "==3.6.2" 321 | }, 322 | "argon2-cffi": { 323 | "hashes": [ 324 | "sha256:8c976986f2c5c0e5000919e6de187906cfd81fb1c72bf9d88c01177e77da7f80", 325 | "sha256:d384164d944190a7dd7ef22c6aa3ff197da12962bd04b17f64d4e93d934dba5b" 326 | ], 327 | "markers": "python_version >= '3.6'", 328 | "version": "==21.3.0" 329 | }, 330 | "argon2-cffi-bindings": { 331 | "hashes": [ 332 | "sha256:20ef543a89dee4db46a1a6e206cd015360e5a75822f76df533845c3cbaf72670", 333 | "sha256:2c3e3cc67fdb7d82c4718f19b4e7a87123caf8a93fde7e23cf66ac0337d3cb3f", 334 | "sha256:3b9ef65804859d335dc6b31582cad2c5166f0c3e7975f324d9ffaa34ee7e6583", 335 | "sha256:3e385d1c39c520c08b53d63300c3ecc28622f076f4c2b0e6d7e796e9f6502194", 336 | "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c", 337 | "sha256:5e00316dabdaea0b2dd82d141cc66889ced0cdcbfa599e8b471cf22c620c329a", 338 | "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082", 339 | "sha256:6a22ad9800121b71099d0fb0a65323810a15f2e292f2ba450810a7316e128ee5", 340 | "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f", 341 | "sha256:93f9bf70084f97245ba10ee36575f0c3f1e7d7724d67d8e5b08e61787c320ed7", 342 | "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d", 343 | "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f", 344 | "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae", 345 | "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3", 346 | "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86", 347 | "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367", 348 | "sha256:d4966ef5848d820776f5f562a7d45fdd70c2f330c961d0d745b784034bd9f48d", 349 | "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93", 350 | "sha256:ed2937d286e2ad0cc79a7087d3c272832865f779430e0cc2b4f3718d3159b0cb", 351 | "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e", 352 | "sha256:f9f8b450ed0547e3d473fdc8612083fd08dd2120d6ac8f73828df9b7d45bb351" 353 | ], 354 | "markers": "python_version >= '3.6'", 355 | "version": "==21.2.0" 356 | }, 357 | "asttokens": { 358 | "hashes": [ 359 | "sha256:1b28ed85e254b724439afc783d4bee767f780b936c3fe8b3275332f42cf5f561", 360 | "sha256:4aa76401a151c8cc572d906aad7aea2a841780834a19d780f4321c0fe1b54635" 361 | ], 362 | "version": "==2.1.0" 363 | }, 364 | "attrs": { 365 | "hashes": [ 366 | "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6", 367 | "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c" 368 | ], 369 | "markers": "python_version >= '3.5'", 370 | "version": "==22.1.0" 371 | }, 372 | "babel": { 373 | "hashes": [ 374 | "sha256:1ad3eca1c885218f6dce2ab67291178944f810a10a9b5f3cb8382a5a232b64fe", 375 | "sha256:5ef4b3226b0180dedded4229651c8b0e1a3a6a2837d45a073272f313e4cf97f6" 376 | ], 377 | "markers": "python_version >= '3.6'", 378 | "version": "==2.11.0" 379 | }, 380 | "backcall": { 381 | "hashes": [ 382 | "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e", 383 | "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255" 384 | ], 385 | "version": "==0.2.0" 386 | }, 387 | "beautifulsoup4": { 388 | "hashes": [ 389 | "sha256:58d5c3d29f5a36ffeb94f02f0d786cd53014cf9b3b3951d42e0080d8a9498d30", 390 | "sha256:ad9aa55b65ef2808eb405f46cf74df7fcb7044d5cbc26487f96eb2ef2e436693" 391 | ], 392 | "markers": "python_version >= '3.6'", 393 | "version": "==4.11.1" 394 | }, 395 | "bleach": { 396 | "hashes": [ 397 | "sha256:085f7f33c15bd408dd9b17a4ad77c577db66d76203e5984b1bd59baeee948b2a", 398 | "sha256:0d03255c47eb9bd2f26aa9bb7f2107732e7e8fe195ca2f64709fcf3b0a4a085c" 399 | ], 400 | "markers": "python_version >= '3.7'", 401 | "version": "==5.0.1" 402 | }, 403 | "certifi": { 404 | "hashes": [ 405 | "sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14", 406 | "sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382" 407 | ], 408 | "markers": "python_version >= '3.6'", 409 | "version": "==2022.9.24" 410 | }, 411 | "cffi": { 412 | "hashes": [ 413 | "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5", 414 | "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef", 415 | "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104", 416 | "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426", 417 | "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405", 418 | "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375", 419 | "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a", 420 | "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e", 421 | "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc", 422 | "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf", 423 | "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185", 424 | "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497", 425 | "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3", 426 | "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35", 427 | "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c", 428 | "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83", 429 | "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21", 430 | "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca", 431 | "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984", 432 | "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac", 433 | "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd", 434 | "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee", 435 | "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a", 436 | "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2", 437 | "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192", 438 | "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7", 439 | "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585", 440 | "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f", 441 | "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e", 442 | "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27", 443 | "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b", 444 | "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e", 445 | "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e", 446 | "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d", 447 | "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c", 448 | "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415", 449 | "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82", 450 | "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02", 451 | "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314", 452 | "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325", 453 | "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c", 454 | "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3", 455 | "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914", 456 | "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045", 457 | "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d", 458 | "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9", 459 | "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5", 460 | "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2", 461 | "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c", 462 | "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3", 463 | "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2", 464 | "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8", 465 | "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d", 466 | "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d", 467 | "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9", 468 | "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162", 469 | "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76", 470 | "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4", 471 | "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e", 472 | "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9", 473 | "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6", 474 | "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b", 475 | "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01", 476 | "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0" 477 | ], 478 | "version": "==1.15.1" 479 | }, 480 | "cfgv": { 481 | "hashes": [ 482 | "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426", 483 | "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736" 484 | ], 485 | "markers": "python_full_version >= '3.6.1'", 486 | "version": "==3.3.1" 487 | }, 488 | "charset-normalizer": { 489 | "hashes": [ 490 | "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845", 491 | "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f" 492 | ], 493 | "markers": "python_version >= '3.6'", 494 | "version": "==2.1.1" 495 | }, 496 | "comm": { 497 | "hashes": [ 498 | "sha256:788a4ec961956c1cb2b0ba3c21f2458ff5757bb2f552032b140787af88d670a3", 499 | "sha256:f395ea64f4f261f35ffc2fbf80a62ec071375dac48cd3ea56092711e74dd063e" 500 | ], 501 | "markers": "python_version >= '3.6'", 502 | "version": "==0.1.1" 503 | }, 504 | "commonmark": { 505 | "hashes": [ 506 | "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60", 507 | "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9" 508 | ], 509 | "version": "==0.9.1" 510 | }, 511 | "contourpy": { 512 | "hashes": [ 513 | "sha256:0236875c5a0784215b49d00ebbe80c5b6b5d5244b3655a36dda88105334dea17", 514 | "sha256:03d1b9c6b44a9e30d554654c72be89af94fab7510b4b9f62356c64c81cec8b7d", 515 | "sha256:0537cc1195245bbe24f2913d1f9211b8f04eb203de9044630abd3664c6cc339c", 516 | "sha256:06ca79e1efbbe2df795822df2fa173d1a2b38b6e0f047a0ec7903fbca1d1847e", 517 | "sha256:08e8d09d96219ace6cb596506fb9b64ea5f270b2fb9121158b976d88871fcfd1", 518 | "sha256:0b1e66346acfb17694d46175a0cea7d9036f12ed0c31dfe86f0f405eedde2bdd", 519 | "sha256:0b97454ed5b1368b66ed414c754cba15b9750ce69938fc6153679787402e4cdf", 520 | "sha256:0e4854cc02006ad6684ce092bdadab6f0912d131f91c2450ce6dbdea78ee3c0b", 521 | "sha256:12a7dc8439544ed05c6553bf026d5e8fa7fad48d63958a95d61698df0e00092b", 522 | "sha256:1b1ee48a130da4dd0eb8055bbab34abf3f6262957832fd575e0cab4979a15a41", 523 | "sha256:1c0e1308307a75e07d1f1b5f0f56b5af84538a5e9027109a7bcf6cb47c434e72", 524 | "sha256:1dedf4c64185a216c35eb488e6f433297c660321275734401760dafaeb0ad5c2", 525 | "sha256:208bc904889c910d95aafcf7be9e677726df9ef71e216780170dbb7e37d118fa", 526 | "sha256:211dfe2bd43bf5791d23afbe23a7952e8ac8b67591d24be3638cabb648b3a6eb", 527 | "sha256:341330ed19074f956cb20877ad8d2ae50e458884bfa6a6df3ae28487cc76c768", 528 | "sha256:344cb3badf6fc7316ad51835f56ac387bdf86c8e1b670904f18f437d70da4183", 529 | "sha256:358f6364e4873f4d73360b35da30066f40387dd3c427a3e5432c6b28dd24a8fa", 530 | "sha256:371f6570a81dfdddbb837ba432293a63b4babb942a9eb7aaa699997adfb53278", 531 | "sha256:375d81366afd547b8558c4720337218345148bc2fcffa3a9870cab82b29667f2", 532 | "sha256:3a1917d3941dd58732c449c810fa7ce46cc305ce9325a11261d740118b85e6f3", 533 | "sha256:4081918147fc4c29fad328d5066cfc751da100a1098398742f9f364be63803fc", 534 | "sha256:444fb776f58f4906d8d354eb6f6ce59d0a60f7b6a720da6c1ccb839db7c80eb9", 535 | "sha256:46deb310a276cc5c1fd27958e358cce68b1e8a515fa5a574c670a504c3a3fe30", 536 | "sha256:494efed2c761f0f37262815f9e3c4bb9917c5c69806abdee1d1cb6611a7174a0", 537 | "sha256:50627bf76abb6ba291ad08db583161939c2c5fab38c38181b7833423ab9c7de3", 538 | "sha256:5641927cc5ae66155d0c80195dc35726eae060e7defc18b7ab27600f39dd1fe7", 539 | "sha256:5b117d29433fc8393b18a696d794961464e37afb34a6eeb8b2c37b5f4128a83e", 540 | "sha256:613c665529899b5d9fade7e5d1760111a0b011231277a0d36c49f0d3d6914bd6", 541 | "sha256:6e459ebb8bb5ee4c22c19cc000174f8059981971a33ce11e17dddf6aca97a142", 542 | "sha256:6f56515e7c6fae4529b731f6c117752247bef9cdad2b12fc5ddf8ca6a50965a5", 543 | "sha256:730c27978a0003b47b359935478b7d63fd8386dbb2dcd36c1e8de88cbfc1e9de", 544 | "sha256:75a2e638042118118ab39d337da4c7908c1af74a8464cad59f19fbc5bbafec9b", 545 | "sha256:78ced51807ccb2f45d4ea73aca339756d75d021069604c2fccd05390dc3c28eb", 546 | "sha256:7ee394502026d68652c2824348a40bf50f31351a668977b51437131a90d777ea", 547 | "sha256:8468b40528fa1e15181cccec4198623b55dcd58306f8815a793803f51f6c474a", 548 | "sha256:84c593aeff7a0171f639da92cb86d24954bbb61f8a1b530f74eb750a14685832", 549 | "sha256:913bac9d064cff033cf3719e855d4f1db9f1c179e0ecf3ba9fdef21c21c6a16a", 550 | "sha256:9447c45df407d3ecb717d837af3b70cfef432138530712263730783b3d016512", 551 | "sha256:9b0e7fe7f949fb719b206548e5cde2518ffb29936afa4303d8a1c4db43dcb675", 552 | "sha256:9bc407a6af672da20da74823443707e38ece8b93a04009dca25856c2d9adadb1", 553 | "sha256:9e8e686a6db92a46111a1ee0ee6f7fbfae4048f0019de207149f43ac1812cf95", 554 | "sha256:9fc4e7973ed0e1fe689435842a6e6b330eb7ccc696080dda9a97b1a1b78e41db", 555 | "sha256:a457ee72d9032e86730f62c5eeddf402e732fdf5ca8b13b41772aa8ae13a4563", 556 | "sha256:a628bba09ba72e472bf7b31018b6281fd4cc903f0888049a3724afba13b6e0b8", 557 | "sha256:a79d239fc22c3b8d9d3de492aa0c245533f4f4c7608e5749af866949c0f1b1b9", 558 | "sha256:aa4674cf3fa2bd9c322982644967f01eed0c91bb890f624e0e0daf7a5c3383e9", 559 | "sha256:acd2bd02f1a7adff3a1f33e431eb96ab6d7987b039d2946a9b39fe6fb16a1036", 560 | "sha256:b3b1bd7577c530eaf9d2bc52d1a93fef50ac516a8b1062c3d1b9bcec9ebe329b", 561 | "sha256:b48d94386f1994db7c70c76b5808c12e23ed7a4ee13693c2fc5ab109d60243c0", 562 | "sha256:b64f747e92af7da3b85631a55d68c45a2d728b4036b03cdaba4bd94bcc85bd6f", 563 | "sha256:b98c820608e2dca6442e786817f646d11057c09a23b68d2b3737e6dcb6e4a49b", 564 | "sha256:c1baa49ab9fedbf19d40d93163b7d3e735d9cd8d5efe4cce9907902a6dad391f", 565 | "sha256:c38c6536c2d71ca2f7e418acaf5bca30a3af7f2a2fa106083c7d738337848dbe", 566 | "sha256:c78bfbc1a7bff053baf7e508449d2765964d67735c909b583204e3240a2aca45", 567 | "sha256:cd2bc0c8f2e8de7dd89a7f1c10b8844e291bca17d359373203ef2e6100819edd", 568 | "sha256:d2eff2af97ea0b61381828b1ad6cd249bbd41d280e53aea5cccd7b2b31b8225c", 569 | "sha256:d8834c14b8c3dd849005e06703469db9bf96ba2d66a3f88ecc539c9a8982e0ee", 570 | "sha256:d912f0154a20a80ea449daada904a7eb6941c83281a9fab95de50529bfc3a1da", 571 | "sha256:da1ef35fd79be2926ba80fbb36327463e3656c02526e9b5b4c2b366588b74d9a", 572 | "sha256:dbe6fe7a1166b1ddd7b6d887ea6fa8389d3f28b5ed3f73a8f40ece1fc5a3d340", 573 | "sha256:dcd556c8fc37a342dd636d7eef150b1399f823a4462f8c968e11e1ebeabee769", 574 | "sha256:e13b31d1b4b68db60b3b29f8e337908f328c7f05b9add4b1b5c74e0691180109", 575 | "sha256:e1739496c2f0108013629aa095cc32a8c6363444361960c07493818d0dea2da4", 576 | "sha256:e43255a83835a129ef98f75d13d643844d8c646b258bebd11e4a0975203e018f", 577 | "sha256:e626cefff8491bce356221c22af5a3ea528b0b41fbabc719c00ae233819ea0bf", 578 | "sha256:eadad75bf91897f922e0fb3dca1b322a58b1726a953f98c2e5f0606bd8408621", 579 | "sha256:f33da6b5d19ad1bb5e7ad38bb8ba5c426d2178928bc2b2c44e8823ea0ecb6ff3", 580 | "sha256:f4052a8a4926d4468416fc7d4b2a7b2a3e35f25b39f4061a7e2a3a2748c4fc48", 581 | "sha256:f6ca38dd8d988eca8f07305125dec6f54ac1c518f1aaddcc14d08c01aebb6efc" 582 | ], 583 | "markers": "python_version >= '3.7'", 584 | "version": "==1.0.6" 585 | }, 586 | "cryptography": { 587 | "hashes": [ 588 | "sha256:0e70da4bdff7601b0ef48e6348339e490ebfb0cbe638e083c9c41fb49f00c8bd", 589 | "sha256:10652dd7282de17990b88679cb82f832752c4e8237f0c714be518044269415db", 590 | "sha256:175c1a818b87c9ac80bb7377f5520b7f31b3ef2a0004e2420319beadedb67290", 591 | "sha256:1d7e632804a248103b60b16fb145e8df0bc60eed790ece0d12efe8cd3f3e7744", 592 | "sha256:1f13ddda26a04c06eb57119caf27a524ccae20533729f4b1e4a69b54e07035eb", 593 | "sha256:2ec2a8714dd005949d4019195d72abed84198d877112abb5a27740e217e0ea8d", 594 | "sha256:2fa36a7b2cc0998a3a4d5af26ccb6273f3df133d61da2ba13b3286261e7efb70", 595 | "sha256:2fb481682873035600b5502f0015b664abc26466153fab5c6bc92c1ea69d478b", 596 | "sha256:3178d46f363d4549b9a76264f41c6948752183b3f587666aff0555ac50fd7876", 597 | "sha256:4367da5705922cf7070462e964f66e4ac24162e22ab0a2e9d31f1b270dd78083", 598 | "sha256:4eb85075437f0b1fd8cd66c688469a0c4119e0ba855e3fef86691971b887caf6", 599 | "sha256:50a1494ed0c3f5b4d07650a68cd6ca62efe8b596ce743a5c94403e6f11bf06c1", 600 | "sha256:53049f3379ef05182864d13bb9686657659407148f901f3f1eee57a733fb4b00", 601 | "sha256:6391e59ebe7c62d9902c24a4d8bcbc79a68e7c4ab65863536127c8a9cd94043b", 602 | "sha256:67461b5ebca2e4c2ab991733f8ab637a7265bb582f07c7c88914b5afb88cb95b", 603 | "sha256:78e47e28ddc4ace41dd38c42e6feecfdadf9c3be2af389abbfeef1ff06822285", 604 | "sha256:80ca53981ceeb3241998443c4964a387771588c4e4a5d92735a493af868294f9", 605 | "sha256:8a4b2bdb68a447fadebfd7d24855758fe2d6fecc7fed0b78d190b1af39a8e3b0", 606 | "sha256:8e45653fb97eb2f20b8c96f9cd2b3a0654d742b47d638cf2897afbd97f80fa6d", 607 | "sha256:998cd19189d8a747b226d24c0207fdaa1e6658a1d3f2494541cb9dfbf7dcb6d2", 608 | "sha256:a10498349d4c8eab7357a8f9aa3463791292845b79597ad1b98a543686fb1ec8", 609 | "sha256:b4cad0cea995af760f82820ab4ca54e5471fc782f70a007f31531957f43e9dee", 610 | "sha256:bfe6472507986613dc6cc00b3d492b2f7564b02b3b3682d25ca7f40fa3fd321b", 611 | "sha256:c9e0d79ee4c56d841bd4ac6e7697c8ff3c8d6da67379057f29e66acffcd1e9a7", 612 | "sha256:ca57eb3ddaccd1112c18fc80abe41db443cc2e9dcb1917078e02dfa010a4f353", 613 | "sha256:ce127dd0a6a0811c251a6cddd014d292728484e530d80e872ad9806cfb1c5b3c" 614 | ], 615 | "markers": "python_version >= '3.6'", 616 | "version": "==38.0.4" 617 | }, 618 | "cycler": { 619 | "hashes": [ 620 | "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3", 621 | "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f" 622 | ], 623 | "markers": "python_version >= '3.6'", 624 | "version": "==0.11.0" 625 | }, 626 | "debugpy": { 627 | "hashes": [ 628 | "sha256:34d2cdd3a7c87302ba5322b86e79c32c2115be396f3f09ca13306d8a04fe0f16", 629 | "sha256:3c9f985944a30cfc9ae4306ac6a27b9c31dba72ca943214dad4a0ab3840f6161", 630 | "sha256:4e255982552b0edfe3a6264438dbd62d404baa6556a81a88f9420d3ed79b06ae", 631 | "sha256:5ad571a36cec137ae6ed951d0ff75b5e092e9af6683da084753231150cbc5b25", 632 | "sha256:6efc30325b68e451118b795eff6fe8488253ca3958251d5158106d9c87581bc6", 633 | "sha256:7c302095a81be0d5c19f6529b600bac971440db3e226dce85347cc27e6a61908", 634 | "sha256:84c39940a0cac410bf6aa4db00ba174f973eef521fbe9dd058e26bcabad89c4f", 635 | "sha256:86d784b72c5411c833af1cd45b83d80c252b77c3bfdb43db17c441d772f4c734", 636 | "sha256:adcfea5ea06d55d505375995e150c06445e2b20cd12885bcae566148c076636b", 637 | "sha256:b8deaeb779699350deeed835322730a3efec170b88927debc9ba07a1a38e2585", 638 | "sha256:c4b2bd5c245eeb49824bf7e539f95fb17f9a756186e51c3e513e32999d8846f3", 639 | "sha256:c4cd6f37e3c168080d61d698390dfe2cd9e74ebf80b448069822a15dadcda57d", 640 | "sha256:cca23cb6161ac89698d629d892520327dd1be9321c0960e610bbcb807232b45d", 641 | "sha256:d5c814596a170a0a58fa6fad74947e30bfd7e192a5d2d7bd6a12156c2899e13a", 642 | "sha256:daadab4403427abd090eccb38d8901afd8b393e01fd243048fab3f1d7132abb4", 643 | "sha256:dda8652520eae3945833e061cbe2993ad94a0b545aebd62e4e6b80ee616c76b2", 644 | "sha256:e8922090514a890eec99cfb991bab872dd2e353ebb793164d5f01c362b9a40bf", 645 | "sha256:fc233a0160f3b117b20216f1169e7211b83235e3cd6749bcdd8dbb72177030c7" 646 | ], 647 | "markers": "python_version >= '3.7'", 648 | "version": "==1.6.3" 649 | }, 650 | "decorator": { 651 | "hashes": [ 652 | "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330", 653 | "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186" 654 | ], 655 | "markers": "python_version >= '3.5'", 656 | "version": "==5.1.1" 657 | }, 658 | "defusedxml": { 659 | "hashes": [ 660 | "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", 661 | "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61" 662 | ], 663 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", 664 | "version": "==0.7.1" 665 | }, 666 | "descartes": { 667 | "hashes": [ 668 | "sha256:135a502146af5ed6ff359975e2ebc5fa4b71b5432c355c2cafdc6dea1337035b", 669 | "sha256:4c62dc41109689d03e4b35de0a2bcbdeeb81047badc607c4415d5c753bd683af", 670 | "sha256:b7e412e7e6e294412f1d0f661f187babc970088c2456089e6801eebb043c2e1b" 671 | ], 672 | "index": "pypi", 673 | "version": "==1.1.0" 674 | }, 675 | "distlib": { 676 | "hashes": [ 677 | "sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46", 678 | "sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e" 679 | ], 680 | "version": "==0.3.6" 681 | }, 682 | "docutils": { 683 | "hashes": [ 684 | "sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6", 685 | "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc" 686 | ], 687 | "markers": "python_version >= '3.7'", 688 | "version": "==0.19" 689 | }, 690 | "entrypoints": { 691 | "hashes": [ 692 | "sha256:b706eddaa9218a19ebcd67b56818f05bb27589b1ca9e8d797b74affad4ccacd4", 693 | "sha256:f174b5ff827504fd3cd97cc3f8649f3693f51538c7e4bdf3ef002c8429d42f9f" 694 | ], 695 | "markers": "python_version >= '3.6'", 696 | "version": "==0.4" 697 | }, 698 | "executing": { 699 | "hashes": [ 700 | "sha256:0314a69e37426e3608aada02473b4161d4caf5a4b244d1d0c48072b8fee7bacc", 701 | "sha256:19da64c18d2d851112f09c287f8d3dbbdf725ab0e569077efb6cdcbd3497c107" 702 | ], 703 | "version": "==1.2.0" 704 | }, 705 | "fastjsonschema": { 706 | "hashes": [ 707 | "sha256:01e366f25d9047816fe3d288cbfc3e10541daf0af2044763f3d0ade42476da18", 708 | "sha256:21f918e8d9a1a4ba9c22e09574ba72267a6762d47822db9add95f6454e51cc1c" 709 | ], 710 | "version": "==2.16.2" 711 | }, 712 | "filelock": { 713 | "hashes": [ 714 | "sha256:55447caa666f2198c5b6b13a26d2084d26fa5b115c00d065664b2124680c4edc", 715 | "sha256:617eb4e5eedc82fc5f47b6d61e4d11cb837c56cb4544e39081099fa17ad109d4" 716 | ], 717 | "markers": "python_version >= '3.7'", 718 | "version": "==3.8.0" 719 | }, 720 | "flake8": { 721 | "hashes": [ 722 | "sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7", 723 | "sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181" 724 | ], 725 | "index": "pypi", 726 | "version": "==6.0.0" 727 | }, 728 | "fonttools": { 729 | "hashes": [ 730 | "sha256:2bb244009f9bf3fa100fc3ead6aeb99febe5985fa20afbfbaa2f8946c2fbdaf1", 731 | "sha256:820466f43c8be8c3009aef8b87e785014133508f0de64ec469e4efb643ae54fb" 732 | ], 733 | "markers": "python_version >= '3.7'", 734 | "version": "==4.38.0" 735 | }, 736 | "identify": { 737 | "hashes": [ 738 | "sha256:906036344ca769539610436e40a684e170c3648b552194980bb7b617a8daeb9f", 739 | "sha256:a390fb696e164dbddb047a0db26e57972ae52fbd037ae68797e5ae2f4492485d" 740 | ], 741 | "markers": "python_version >= '3.7'", 742 | "version": "==2.5.9" 743 | }, 744 | "idna": { 745 | "hashes": [ 746 | "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4", 747 | "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" 748 | ], 749 | "markers": "python_version >= '3.5'", 750 | "version": "==3.4" 751 | }, 752 | "imagesize": { 753 | "hashes": [ 754 | "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", 755 | "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a" 756 | ], 757 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 758 | "version": "==1.4.1" 759 | }, 760 | "importlib-metadata": { 761 | "hashes": [ 762 | "sha256:d5059f9f1e8e41f80e9c56c2ee58811450c31984dfa625329ffd7c0dad88a73b", 763 | "sha256:d84d17e21670ec07990e1044a99efe8d615d860fd176fc29ef5c306068fda313" 764 | ], 765 | "markers": "python_version < '3.10'", 766 | "version": "==5.1.0" 767 | }, 768 | "ipykernel": { 769 | "hashes": [ 770 | "sha256:18c298565218e602939dd03b56206912433ebdb6b5800afd9177bbce8d96318b", 771 | "sha256:71f21ce281da5a4e73ec4a7ecdf98802d9e65d58cdb7e22ff824ca994ce5114b" 772 | ], 773 | "markers": "python_version >= '3.8'", 774 | "version": "==6.18.1" 775 | }, 776 | "ipython": { 777 | "hashes": [ 778 | "sha256:352042ddcb019f7c04e48171b4dd78e4c4bb67bf97030d170e154aac42b656d9", 779 | "sha256:882899fe78d5417a0aa07f995db298fa28b58faeba2112d2e3a4c95fe14bb738" 780 | ], 781 | "markers": "python_version >= '3.8'", 782 | "version": "==8.7.0" 783 | }, 784 | "ipython-genutils": { 785 | "hashes": [ 786 | "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8", 787 | "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8" 788 | ], 789 | "version": "==0.2.0" 790 | }, 791 | "jaraco.classes": { 792 | "hashes": [ 793 | "sha256:2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158", 794 | "sha256:89559fa5c1d3c34eff6f631ad80bb21f378dbcbb35dd161fd2c6b93f5be2f98a" 795 | ], 796 | "markers": "python_version >= '3.7'", 797 | "version": "==3.2.3" 798 | }, 799 | "jedi": { 800 | "hashes": [ 801 | "sha256:203c1fd9d969ab8f2119ec0a3342e0b49910045abe6af0a3ae83a5764d54639e", 802 | "sha256:bae794c30d07f6d910d32a7048af09b5a39ed740918da923c6b780790ebac612" 803 | ], 804 | "markers": "python_version >= '3.6'", 805 | "version": "==0.18.2" 806 | }, 807 | "jeepney": { 808 | "hashes": [ 809 | "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806", 810 | "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755" 811 | ], 812 | "markers": "sys_platform == 'linux'", 813 | "version": "==0.8.0" 814 | }, 815 | "jinja2": { 816 | "hashes": [ 817 | "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852", 818 | "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61" 819 | ], 820 | "markers": "python_version >= '3.7'", 821 | "version": "==3.1.2" 822 | }, 823 | "json5": { 824 | "hashes": [ 825 | "sha256:993189671e7412e9cdd8be8dc61cf402e8e579b35f1d1bb20ae6b09baa78bbce", 826 | "sha256:ad9f048c5b5a4c3802524474ce40a622fae789860a86f10cc4f7e5f9cf9b46ab" 827 | ], 828 | "version": "==0.9.10" 829 | }, 830 | "jsonschema": { 831 | "hashes": [ 832 | "sha256:05b2d22c83640cde0b7e0aa329ca7754fbd98ea66ad8ae24aa61328dfe057fa3", 833 | "sha256:410ef23dcdbca4eaedc08b850079179883c2ed09378bd1f760d4af4aacfa28d7" 834 | ], 835 | "markers": "python_version >= '3.7'", 836 | "version": "==4.17.1" 837 | }, 838 | "jupyter-client": { 839 | "hashes": [ 840 | "sha256:330f6b627e0b4bf2f54a3a0dd9e4a22d2b649c8518168afedce2c96a1ceb2860", 841 | "sha256:df56ae23b8e1da1b66f89dee1368e948b24a7f780fa822c5735187589fc4c157" 842 | ], 843 | "markers": "python_version >= '3.7'", 844 | "version": "==7.4.7" 845 | }, 846 | "jupyter-core": { 847 | "hashes": [ 848 | "sha256:a5ae7c09c55c0b26f692ec69323ba2b62e8d7295354d20f6cd57b749de4a05bf", 849 | "sha256:f5740d99606958544396914b08e67b668f45e7eff99ab47a7f4bcead419c02f4" 850 | ], 851 | "markers": "python_version >= '3.8'", 852 | "version": "==5.1.0" 853 | }, 854 | "jupyter-server": { 855 | "hashes": [ 856 | "sha256:438496cac509709cc85e60172e5538ca45b4c8a0862bb97cd73e49f2ace419cb", 857 | "sha256:f7f7a2f9d36f4150ad125afef0e20b1c76c8ff83eb5e39fb02d3b9df0f9b79ab" 858 | ], 859 | "markers": "python_version >= '3.7'", 860 | "version": "==1.23.3" 861 | }, 862 | "jupyterlab": { 863 | "hashes": [ 864 | "sha256:e02556c8ea1b386963c4b464e4618aee153c5416b07ab481425c817a033323a2", 865 | "sha256:f433059fe0e12d75ea90a81a0b6721113bb132857e3ec2197780b6fe84cbcbde" 866 | ], 867 | "index": "pypi", 868 | "version": "==3.5.0" 869 | }, 870 | "jupyterlab-pygments": { 871 | "hashes": [ 872 | "sha256:2405800db07c9f770863bcf8049a529c3dd4d3e28536638bd7c1c01d2748309f", 873 | "sha256:7405d7fde60819d905a9fa8ce89e4cd830e318cdad22a0030f7a901da705585d" 874 | ], 875 | "markers": "python_version >= '3.7'", 876 | "version": "==0.2.2" 877 | }, 878 | "jupyterlab-server": { 879 | "hashes": [ 880 | "sha256:635a0b176a901f19351c02221a124e59317c476f511200409b7d867e8b2905c3", 881 | "sha256:d18eb623428b4ee732c2258afaa365eedd70f38b609981ea040027914df32bc6" 882 | ], 883 | "markers": "python_version >= '3.7'", 884 | "version": "==2.16.3" 885 | }, 886 | "keyring": { 887 | "hashes": [ 888 | "sha256:3dd30011d555f1345dec2c262f0153f2f0ca6bca041fb1dc4588349bb4c0ac1e", 889 | "sha256:ad192263e2cdd5f12875dedc2da13534359a7e760e77f8d04b50968a821c2361" 890 | ], 891 | "markers": "python_version >= '3.7'", 892 | "version": "==23.11.0" 893 | }, 894 | "kiwisolver": { 895 | "hashes": [ 896 | "sha256:02f79693ec433cb4b5f51694e8477ae83b3205768a6fb48ffba60549080e295b", 897 | "sha256:03baab2d6b4a54ddbb43bba1a3a2d1627e82d205c5cf8f4c924dc49284b87166", 898 | "sha256:1041feb4cda8708ce73bb4dcb9ce1ccf49d553bf87c3954bdfa46f0c3f77252c", 899 | "sha256:10ee06759482c78bdb864f4109886dff7b8a56529bc1609d4f1112b93fe6423c", 900 | "sha256:1d1573129aa0fd901076e2bfb4275a35f5b7aa60fbfb984499d661ec950320b0", 901 | "sha256:283dffbf061a4ec60391d51e6155e372a1f7a4f5b15d59c8505339454f8989e4", 902 | "sha256:28bc5b299f48150b5f822ce68624e445040595a4ac3d59251703779836eceff9", 903 | "sha256:2a66fdfb34e05b705620dd567f5a03f239a088d5a3f321e7b6ac3239d22aa286", 904 | "sha256:2e307eb9bd99801f82789b44bb45e9f541961831c7311521b13a6c85afc09767", 905 | "sha256:2e407cb4bd5a13984a6c2c0fe1845e4e41e96f183e5e5cd4d77a857d9693494c", 906 | "sha256:2f5e60fabb7343a836360c4f0919b8cd0d6dbf08ad2ca6b9cf90bf0c76a3c4f6", 907 | "sha256:36dafec3d6d6088d34e2de6b85f9d8e2324eb734162fba59d2ba9ed7a2043d5b", 908 | "sha256:3fe20f63c9ecee44560d0e7f116b3a747a5d7203376abeea292ab3152334d004", 909 | "sha256:41dae968a94b1ef1897cb322b39360a0812661dba7c682aa45098eb8e193dbdf", 910 | "sha256:4bd472dbe5e136f96a4b18f295d159d7f26fd399136f5b17b08c4e5f498cd494", 911 | "sha256:4ea39b0ccc4f5d803e3337dd46bcce60b702be4d86fd0b3d7531ef10fd99a1ac", 912 | "sha256:5853eb494c71e267912275e5586fe281444eb5e722de4e131cddf9d442615626", 913 | "sha256:5bce61af018b0cb2055e0e72e7d65290d822d3feee430b7b8203d8a855e78766", 914 | "sha256:6295ecd49304dcf3bfbfa45d9a081c96509e95f4b9d0eb7ee4ec0530c4a96514", 915 | "sha256:62ac9cc684da4cf1778d07a89bf5f81b35834cb96ca523d3a7fb32509380cbf6", 916 | "sha256:70e7c2e7b750585569564e2e5ca9845acfaa5da56ac46df68414f29fea97be9f", 917 | "sha256:7577c1987baa3adc4b3c62c33bd1118c3ef5c8ddef36f0f2c950ae0b199e100d", 918 | "sha256:75facbe9606748f43428fc91a43edb46c7ff68889b91fa31f53b58894503a191", 919 | "sha256:787518a6789009c159453da4d6b683f468ef7a65bbde796bcea803ccf191058d", 920 | "sha256:78d6601aed50c74e0ef02f4204da1816147a6d3fbdc8b3872d263338a9052c51", 921 | "sha256:7c43e1e1206cd421cd92e6b3280d4385d41d7166b3ed577ac20444b6995a445f", 922 | "sha256:81e38381b782cc7e1e46c4e14cd997ee6040768101aefc8fa3c24a4cc58e98f8", 923 | "sha256:841293b17ad704d70c578f1f0013c890e219952169ce8a24ebc063eecf775454", 924 | "sha256:872b8ca05c40d309ed13eb2e582cab0c5a05e81e987ab9c521bf05ad1d5cf5cb", 925 | "sha256:877272cf6b4b7e94c9614f9b10140e198d2186363728ed0f701c6eee1baec1da", 926 | "sha256:8c808594c88a025d4e322d5bb549282c93c8e1ba71b790f539567932722d7bd8", 927 | "sha256:8ed58b8acf29798b036d347791141767ccf65eee7f26bde03a71c944449e53de", 928 | "sha256:91672bacaa030f92fc2f43b620d7b337fd9a5af28b0d6ed3f77afc43c4a64b5a", 929 | "sha256:968f44fdbf6dd757d12920d63b566eeb4d5b395fd2d00d29d7ef00a00582aac9", 930 | "sha256:9f85003f5dfa867e86d53fac6f7e6f30c045673fa27b603c397753bebadc3008", 931 | "sha256:a553dadda40fef6bfa1456dc4be49b113aa92c2a9a9e8711e955618cd69622e3", 932 | "sha256:a68b62a02953b9841730db7797422f983935aeefceb1679f0fc85cbfbd311c32", 933 | "sha256:abbe9fa13da955feb8202e215c4018f4bb57469b1b78c7a4c5c7b93001699938", 934 | "sha256:ad881edc7ccb9d65b0224f4e4d05a1e85cf62d73aab798943df6d48ab0cd79a1", 935 | "sha256:b1792d939ec70abe76f5054d3f36ed5656021dcad1322d1cc996d4e54165cef9", 936 | "sha256:b428ef021242344340460fa4c9185d0b1f66fbdbfecc6c63eff4b7c29fad429d", 937 | "sha256:b533558eae785e33e8c148a8d9921692a9fe5aa516efbdff8606e7d87b9d5824", 938 | "sha256:ba59c92039ec0a66103b1d5fe588fa546373587a7d68f5c96f743c3396afc04b", 939 | "sha256:bc8d3bd6c72b2dd9decf16ce70e20abcb3274ba01b4e1c96031e0c4067d1e7cd", 940 | "sha256:bc9db8a3efb3e403e4ecc6cd9489ea2bac94244f80c78e27c31dcc00d2790ac2", 941 | "sha256:bf7d9fce9bcc4752ca4a1b80aabd38f6d19009ea5cbda0e0856983cf6d0023f5", 942 | "sha256:c2dbb44c3f7e6c4d3487b31037b1bdbf424d97687c1747ce4ff2895795c9bf69", 943 | "sha256:c79ebe8f3676a4c6630fd3f777f3cfecf9289666c84e775a67d1d358578dc2e3", 944 | "sha256:c97528e64cb9ebeff9701e7938653a9951922f2a38bd847787d4a8e498cc83ae", 945 | "sha256:d0611a0a2a518464c05ddd5a3a1a0e856ccc10e67079bb17f265ad19ab3c7597", 946 | "sha256:d06adcfa62a4431d404c31216f0f8ac97397d799cd53800e9d3efc2fbb3cf14e", 947 | "sha256:d41997519fcba4a1e46eb4a2fe31bc12f0ff957b2b81bac28db24744f333e955", 948 | "sha256:d5b61785a9ce44e5a4b880272baa7cf6c8f48a5180c3e81c59553ba0cb0821ca", 949 | "sha256:da152d8cdcab0e56e4f45eb08b9aea6455845ec83172092f09b0e077ece2cf7a", 950 | "sha256:da7e547706e69e45d95e116e6939488d62174e033b763ab1496b4c29b76fabea", 951 | "sha256:db5283d90da4174865d520e7366801a93777201e91e79bacbac6e6927cbceede", 952 | "sha256:db608a6757adabb32f1cfe6066e39b3706d8c3aa69bbc353a5b61edad36a5cb4", 953 | "sha256:e0ea21f66820452a3f5d1655f8704a60d66ba1191359b96541eaf457710a5fc6", 954 | "sha256:e7da3fec7408813a7cebc9e4ec55afed2d0fd65c4754bc376bf03498d4e92686", 955 | "sha256:e92a513161077b53447160b9bd8f522edfbed4bd9759e4c18ab05d7ef7e49408", 956 | "sha256:ecb1fa0db7bf4cff9dac752abb19505a233c7f16684c5826d1f11ebd9472b871", 957 | "sha256:efda5fc8cc1c61e4f639b8067d118e742b812c930f708e6667a5ce0d13499e29", 958 | "sha256:f0a1dbdb5ecbef0d34eb77e56fcb3e95bbd7e50835d9782a45df81cc46949750", 959 | "sha256:f0a71d85ecdd570ded8ac3d1c0f480842f49a40beb423bb8014539a9f32a5897", 960 | "sha256:f4f270de01dd3e129a72efad823da90cc4d6aafb64c410c9033aba70db9f1ff0", 961 | "sha256:f6cb459eea32a4e2cf18ba5fcece2dbdf496384413bc1bae15583f19e567f3b2", 962 | "sha256:f8ad8285b01b0d4695102546b342b493b3ccc6781fc28c8c6a1bb63e95d22f09", 963 | "sha256:f9f39e2f049db33a908319cf46624a569b36983c7c78318e9726a4cb8923b26c" 964 | ], 965 | "markers": "python_version >= '3.7'", 966 | "version": "==1.4.4" 967 | }, 968 | "markdown-it-py": { 969 | "hashes": [ 970 | "sha256:93de681e5c021a432c63147656fe21790bc01231e0cd2da73626f1aa3ac0fe27", 971 | "sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da" 972 | ], 973 | "markers": "python_version >= '3.7'", 974 | "version": "==2.1.0" 975 | }, 976 | "markupsafe": { 977 | "hashes": [ 978 | "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003", 979 | "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88", 980 | "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5", 981 | "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7", 982 | "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a", 983 | "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603", 984 | "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1", 985 | "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135", 986 | "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247", 987 | "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6", 988 | "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601", 989 | "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77", 990 | "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02", 991 | "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e", 992 | "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63", 993 | "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f", 994 | "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980", 995 | "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b", 996 | "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812", 997 | "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff", 998 | "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96", 999 | "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1", 1000 | "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925", 1001 | "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a", 1002 | "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6", 1003 | "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e", 1004 | "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f", 1005 | "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4", 1006 | "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f", 1007 | "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3", 1008 | "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c", 1009 | "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a", 1010 | "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417", 1011 | "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a", 1012 | "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a", 1013 | "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37", 1014 | "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452", 1015 | "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933", 1016 | "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a", 1017 | "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7" 1018 | ], 1019 | "markers": "python_version >= '3.7'", 1020 | "version": "==2.1.1" 1021 | }, 1022 | "matplotlib": { 1023 | "hashes": [ 1024 | "sha256:0844523dfaaff566e39dbfa74e6f6dc42e92f7a365ce80929c5030b84caa563a", 1025 | "sha256:0eda9d1b43f265da91fb9ae10d6922b5a986e2234470a524e6b18f14095b20d2", 1026 | "sha256:168093410b99f647ba61361b208f7b0d64dde1172b5b1796d765cd243cadb501", 1027 | "sha256:1836f366272b1557a613f8265db220eb8dd883202bbbabe01bad5a4eadfd0c95", 1028 | "sha256:19d61ee6414c44a04addbe33005ab1f87539d9f395e25afcbe9a3c50ce77c65c", 1029 | "sha256:252957e208c23db72ca9918cb33e160c7833faebf295aaedb43f5b083832a267", 1030 | "sha256:32d29c8c26362169c80c5718ce367e8c64f4dd068a424e7110df1dd2ed7bd428", 1031 | "sha256:380d48c15ec41102a2b70858ab1dedfa33eb77b2c0982cb65a200ae67a48e9cb", 1032 | "sha256:3964934731fd7a289a91d315919cf757f293969a4244941ab10513d2351b4e83", 1033 | "sha256:3cef89888a466228fc4e4b2954e740ce8e9afde7c4315fdd18caa1b8de58ca17", 1034 | "sha256:4426c74761790bff46e3d906c14c7aab727543293eed5a924300a952e1a3a3c1", 1035 | "sha256:5024b8ed83d7f8809982d095d8ab0b179bebc07616a9713f86d30cf4944acb73", 1036 | "sha256:52c2bdd7cd0bf9d5ccdf9c1816568fd4ccd51a4d82419cc5480f548981b47dd0", 1037 | "sha256:54fa9fe27f5466b86126ff38123261188bed568c1019e4716af01f97a12fe812", 1038 | "sha256:5ba73aa3aca35d2981e0b31230d58abb7b5d7ca104e543ae49709208d8ce706a", 1039 | "sha256:5e16dcaecffd55b955aa5e2b8a804379789c15987e8ebd2f32f01398a81e975b", 1040 | "sha256:5ecfc6559132116dedfc482d0ad9df8a89dc5909eebffd22f3deb684132d002f", 1041 | "sha256:74153008bd24366cf099d1f1e83808d179d618c4e32edb0d489d526523a94d9f", 1042 | "sha256:78ec3c3412cf277e6252764ee4acbdbec6920cc87ad65862272aaa0e24381eee", 1043 | "sha256:795ad83940732b45d39b82571f87af0081c120feff2b12e748d96bb191169e33", 1044 | "sha256:7f716b6af94dc1b6b97c46401774472f0867e44595990fe80a8ba390f7a0a028", 1045 | "sha256:83dc89c5fd728fdb03b76f122f43b4dcee8c61f1489e232d9ad0f58020523e1c", 1046 | "sha256:8a0ae37576ed444fe853709bdceb2be4c7df6f7acae17b8378765bd28e61b3ae", 1047 | "sha256:8a8dbe2cb7f33ff54b16bb5c500673502a35f18ac1ed48625e997d40c922f9cc", 1048 | "sha256:8a9d899953c722b9afd7e88dbefd8fb276c686c3116a43c577cfabf636180558", 1049 | "sha256:8d0068e40837c1d0df6e3abf1cdc9a34a6d2611d90e29610fa1d2455aeb4e2e5", 1050 | "sha256:9347cc6822f38db2b1d1ce992f375289670e595a2d1c15961aacbe0977407dfc", 1051 | "sha256:9f335e5625feb90e323d7e3868ec337f7b9ad88b5d633f876e3b778813021dab", 1052 | "sha256:b03fd10a1709d0101c054883b550f7c4c5e974f751e2680318759af005964990", 1053 | "sha256:b0ca2c60d3966dfd6608f5f8c49b8a0fcf76de6654f2eda55fc6ef038d5a6f27", 1054 | "sha256:b2604c6450f9dd2c42e223b1f5dca9643a23cfecc9fde4a94bb38e0d2693b136", 1055 | "sha256:ca0e7a658fbafcddcaefaa07ba8dae9384be2343468a8e011061791588d839fa", 1056 | "sha256:d0e9ac04065a814d4cf2c6791a2ad563f739ae3ae830d716d54245c2b96fead6", 1057 | "sha256:d50e8c1e571ee39b5dfbc295c11ad65988879f68009dd281a6e1edbc2ff6c18c", 1058 | "sha256:d840adcad7354be6f2ec28d0706528b0026e4c3934cc6566b84eac18633eab1b", 1059 | "sha256:e0bbee6c2a5bf2a0017a9b5e397babb88f230e6f07c3cdff4a4c4bc75ed7c617", 1060 | "sha256:e5afe0a7ea0e3a7a257907060bee6724a6002b7eec55d0db16fd32409795f3e1", 1061 | "sha256:e68be81cd8c22b029924b6d0ee814c337c0e706b8d88495a617319e5dd5441c3", 1062 | "sha256:ec9be0f4826cdb3a3a517509dcc5f87f370251b76362051ab59e42b6b765f8c4", 1063 | "sha256:f04f97797df35e442ed09f529ad1235d1f1c0f30878e2fe09a2676b71a8801e0", 1064 | "sha256:f41e57ad63d336fe50d3a67bb8eaa26c09f6dda6a59f76777a99b8ccd8e26aec" 1065 | ], 1066 | "index": "pypi", 1067 | "version": "==3.6.2" 1068 | }, 1069 | "matplotlib-inline": { 1070 | "hashes": [ 1071 | "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311", 1072 | "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304" 1073 | ], 1074 | "markers": "python_version >= '3.5'", 1075 | "version": "==0.1.6" 1076 | }, 1077 | "mccabe": { 1078 | "hashes": [ 1079 | "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", 1080 | "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" 1081 | ], 1082 | "markers": "python_version >= '3.6'", 1083 | "version": "==0.7.0" 1084 | }, 1085 | "mdit-py-plugins": { 1086 | "hashes": [ 1087 | "sha256:3fc13298497d6e04fe96efdd41281bfe7622152f9caa1815ea99b5c893de9441", 1088 | "sha256:606a7f29cf56dbdfaf914acb21709b8f8ee29d857e8f29dcc33d8cb84c57bfa1" 1089 | ], 1090 | "markers": "python_version >= '3.7'", 1091 | "version": "==0.3.1" 1092 | }, 1093 | "mdurl": { 1094 | "hashes": [ 1095 | "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", 1096 | "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba" 1097 | ], 1098 | "markers": "python_version >= '3.7'", 1099 | "version": "==0.1.2" 1100 | }, 1101 | "mistune": { 1102 | "hashes": [ 1103 | "sha256:182cc5ee6f8ed1b807de6b7bb50155df7b66495412836b9a74c8fbdfc75fe36d", 1104 | "sha256:9ee0a66053e2267aba772c71e06891fa8f1af6d4b01d5e84e267b4570d4d9808" 1105 | ], 1106 | "version": "==2.0.4" 1107 | }, 1108 | "more-itertools": { 1109 | "hashes": [ 1110 | "sha256:250e83d7e81d0c87ca6bd942e6aeab8cc9daa6096d12c5308f3f92fa5e5c1f41", 1111 | "sha256:5a6257e40878ef0520b1803990e3e22303a41b5714006c32a3fd8304b26ea1ab" 1112 | ], 1113 | "markers": "python_version >= '3.7'", 1114 | "version": "==9.0.0" 1115 | }, 1116 | "myst-parser": { 1117 | "hashes": [ 1118 | "sha256:61b275b85d9f58aa327f370913ae1bec26ebad372cc99f3ab85c8ec3ee8d9fb8", 1119 | "sha256:79317f4bb2c13053dd6e64f9da1ba1da6cd9c40c8a430c447a7b146a594c246d" 1120 | ], 1121 | "index": "pypi", 1122 | "version": "==0.18.1" 1123 | }, 1124 | "nbclassic": { 1125 | "hashes": [ 1126 | "sha256:c74d8a500f8e058d46b576a41e5bc640711e1032cf7541dde5f73ea49497e283", 1127 | "sha256:cbf05df5842b420d5cece0143462380ea9d308ff57c2dc0eb4d6e035b18fbfb3" 1128 | ], 1129 | "markers": "python_version >= '3.7'", 1130 | "version": "==0.4.8" 1131 | }, 1132 | "nbclient": { 1133 | "hashes": [ 1134 | "sha256:434c91385cf3e53084185334d675a0d33c615108b391e260915d1aa8e86661b8", 1135 | "sha256:a1d844efd6da9bc39d2209bf996dbd8e07bf0f36b796edfabaa8f8a9ab77c3aa" 1136 | ], 1137 | "markers": "python_version >= '3.7'", 1138 | "version": "==0.7.0" 1139 | }, 1140 | "nbconvert": { 1141 | "hashes": [ 1142 | "sha256:3e90e108bb5637b5b8a1422af1156af1368b39dd25369ff7faa7dfdcdef18f81", 1143 | "sha256:8fdc44fd7d9424db7fdc6e1e834a02f6b8620ffb653767388be2f9eb16f84184" 1144 | ], 1145 | "markers": "python_version >= '3.7'", 1146 | "version": "==7.2.5" 1147 | }, 1148 | "nbformat": { 1149 | "hashes": [ 1150 | "sha256:1b05ec2c552c2f1adc745f4eddce1eac8ca9ffd59bb9fd859e827eaa031319f9", 1151 | "sha256:1d4760c15c1a04269ef5caf375be8b98dd2f696e5eb9e603ec2bf091f9b0d3f3" 1152 | ], 1153 | "markers": "python_version >= '3.7'", 1154 | "version": "==5.7.0" 1155 | }, 1156 | "nest-asyncio": { 1157 | "hashes": [ 1158 | "sha256:b9a953fb40dceaa587d109609098db21900182b16440652454a146cffb06e8b8", 1159 | "sha256:d267cc1ff794403f7df692964d1d2a3fa9418ffea2a3f6859a439ff482fef290" 1160 | ], 1161 | "markers": "python_version >= '3.5'", 1162 | "version": "==1.5.6" 1163 | }, 1164 | "nodeenv": { 1165 | "hashes": [ 1166 | "sha256:27083a7b96a25f2f5e1d8cb4b6317ee8aeda3bdd121394e5ac54e498028a042e", 1167 | "sha256:e0e7f7dfb85fc5394c6fe1e8fa98131a2473e04311a45afb6508f7cf1836fa2b" 1168 | ], 1169 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", 1170 | "version": "==1.7.0" 1171 | }, 1172 | "notebook": { 1173 | "hashes": [ 1174 | "sha256:c1897e5317e225fc78b45549a6ab4b668e4c996fd03a04e938fe5e7af2bfffd0", 1175 | "sha256:e04f9018ceb86e4fa841e92ea8fb214f8d23c1cedfde530cc96f92446924f0e4" 1176 | ], 1177 | "markers": "python_version >= '3.7'", 1178 | "version": "==6.5.2" 1179 | }, 1180 | "notebook-shim": { 1181 | "hashes": [ 1182 | "sha256:090e0baf9a5582ff59b607af523ca2db68ff216da0c69956b62cab2ef4fc9c3f", 1183 | "sha256:9c6c30f74c4fbea6fce55c1be58e7fd0409b1c681b075dcedceb005db5026949" 1184 | ], 1185 | "markers": "python_version >= '3.7'", 1186 | "version": "==0.2.2" 1187 | }, 1188 | "numpy": { 1189 | "hashes": [ 1190 | "sha256:01dd17cbb340bf0fc23981e52e1d18a9d4050792e8fb8363cecbf066a84b827d", 1191 | "sha256:06005a2ef6014e9956c09ba07654f9837d9e26696a0470e42beedadb78c11b07", 1192 | "sha256:09b7847f7e83ca37c6e627682f145856de331049013853f344f37b0c9690e3df", 1193 | "sha256:0aaee12d8883552fadfc41e96b4c82ee7d794949e2a7c3b3a7201e968c7ecab9", 1194 | "sha256:0cbe9848fad08baf71de1a39e12d1b6310f1d5b2d0ea4de051058e6e1076852d", 1195 | "sha256:1b1766d6f397c18153d40015ddfc79ddb715cabadc04d2d228d4e5a8bc4ded1a", 1196 | "sha256:33161613d2269025873025b33e879825ec7b1d831317e68f4f2f0f84ed14c719", 1197 | "sha256:5039f55555e1eab31124a5768898c9e22c25a65c1e0037f4d7c495a45778c9f2", 1198 | "sha256:522e26bbf6377e4d76403826ed689c295b0b238f46c28a7251ab94716da0b280", 1199 | "sha256:56e454c7833e94ec9769fa0f86e6ff8e42ee38ce0ce1fa4cbb747ea7e06d56aa", 1200 | "sha256:58f545efd1108e647604a1b5aa809591ccd2540f468a880bedb97247e72db387", 1201 | "sha256:5e05b1c973a9f858c74367553e236f287e749465f773328c8ef31abe18f691e1", 1202 | "sha256:7903ba8ab592b82014713c491f6c5d3a1cde5b4a3bf116404e08f5b52f6daf43", 1203 | "sha256:8969bfd28e85c81f3f94eb4a66bc2cf1dbdc5c18efc320af34bffc54d6b1e38f", 1204 | "sha256:92c8c1e89a1f5028a4c6d9e3ccbe311b6ba53694811269b992c0b224269e2398", 1205 | "sha256:9c88793f78fca17da0145455f0d7826bcb9f37da4764af27ac945488116efe63", 1206 | "sha256:a7ac231a08bb37f852849bbb387a20a57574a97cfc7b6cabb488a4fc8be176de", 1207 | "sha256:abdde9f795cf292fb9651ed48185503a2ff29be87770c3b8e2a14b0cd7aa16f8", 1208 | "sha256:af1da88f6bc3d2338ebbf0e22fe487821ea4d8e89053e25fa59d1d79786e7481", 1209 | "sha256:b2a9ab7c279c91974f756c84c365a669a887efa287365a8e2c418f8b3ba73fb0", 1210 | "sha256:bf837dc63ba5c06dc8797c398db1e223a466c7ece27a1f7b5232ba3466aafe3d", 1211 | "sha256:ca51fcfcc5f9354c45f400059e88bc09215fb71a48d3768fb80e357f3b457e1e", 1212 | "sha256:ce571367b6dfe60af04e04a1834ca2dc5f46004ac1cc756fb95319f64c095a96", 1213 | "sha256:d208a0f8729f3fb790ed18a003f3a57895b989b40ea4dce4717e9cf4af62c6bb", 1214 | "sha256:dbee87b469018961d1ad79b1a5d50c0ae850000b639bcb1b694e9981083243b6", 1215 | "sha256:e9f4c4e51567b616be64e05d517c79a8a22f3606499941d97bb76f2ca59f982d", 1216 | "sha256:f063b69b090c9d918f9df0a12116029e274daf0181df392839661c4c7ec9018a", 1217 | "sha256:f9a909a8bae284d46bbfdefbdd4a262ba19d3bc9921b1e76126b1d21c3c34135" 1218 | ], 1219 | "markers": "python_version < '3.10'", 1220 | "version": "==1.23.5" 1221 | }, 1222 | "packaging": { 1223 | "hashes": [ 1224 | "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb", 1225 | "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522" 1226 | ], 1227 | "markers": "python_version >= '3.6'", 1228 | "version": "==21.3" 1229 | }, 1230 | "pandocfilters": { 1231 | "hashes": [ 1232 | "sha256:0b679503337d233b4339a817bfc8c50064e2eff681314376a47cb582305a7a38", 1233 | "sha256:33aae3f25fd1a026079f5d27bdd52496f0e0803b3469282162bafdcbdf6ef14f" 1234 | ], 1235 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 1236 | "version": "==1.5.0" 1237 | }, 1238 | "parso": { 1239 | "hashes": [ 1240 | "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0", 1241 | "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75" 1242 | ], 1243 | "markers": "python_version >= '3.6'", 1244 | "version": "==0.8.3" 1245 | }, 1246 | "pexpect": { 1247 | "hashes": [ 1248 | "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937", 1249 | "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c" 1250 | ], 1251 | "markers": "sys_platform != 'win32'", 1252 | "version": "==4.8.0" 1253 | }, 1254 | "pickleshare": { 1255 | "hashes": [ 1256 | "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca", 1257 | "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56" 1258 | ], 1259 | "version": "==0.7.5" 1260 | }, 1261 | "pillow": { 1262 | "hashes": [ 1263 | "sha256:03150abd92771742d4a8cd6f2fa6246d847dcd2e332a18d0c15cc75bf6703040", 1264 | "sha256:073adb2ae23431d3b9bcbcff3fe698b62ed47211d0716b067385538a1b0f28b8", 1265 | "sha256:0b07fffc13f474264c336298d1b4ce01d9c5a011415b79d4ee5527bb69ae6f65", 1266 | "sha256:0b7257127d646ff8676ec8a15520013a698d1fdc48bc2a79ba4e53df792526f2", 1267 | "sha256:12ce4932caf2ddf3e41d17fc9c02d67126935a44b86df6a206cf0d7161548627", 1268 | "sha256:15c42fb9dea42465dfd902fb0ecf584b8848ceb28b41ee2b58f866411be33f07", 1269 | "sha256:18498994b29e1cf86d505edcb7edbe814d133d2232d256db8c7a8ceb34d18cef", 1270 | "sha256:1c7c8ae3864846fc95f4611c78129301e203aaa2af813b703c55d10cc1628535", 1271 | "sha256:22b012ea2d065fd163ca096f4e37e47cd8b59cf4b0fd47bfca6abb93df70b34c", 1272 | "sha256:276a5ca930c913f714e372b2591a22c4bd3b81a418c0f6635ba832daec1cbcfc", 1273 | "sha256:2e0918e03aa0c72ea56edbb00d4d664294815aa11291a11504a377ea018330d3", 1274 | "sha256:3033fbe1feb1b59394615a1cafaee85e49d01b51d54de0cbf6aa8e64182518a1", 1275 | "sha256:3168434d303babf495d4ba58fc22d6604f6e2afb97adc6a423e917dab828939c", 1276 | "sha256:32a44128c4bdca7f31de5be641187367fe2a450ad83b833ef78910397db491aa", 1277 | "sha256:3dd6caf940756101205dffc5367babf288a30043d35f80936f9bfb37f8355b32", 1278 | "sha256:40e1ce476a7804b0fb74bcfa80b0a2206ea6a882938eaba917f7a0f004b42502", 1279 | "sha256:41e0051336807468be450d52b8edd12ac60bebaa97fe10c8b660f116e50b30e4", 1280 | "sha256:4390e9ce199fc1951fcfa65795f239a8a4944117b5935a9317fb320e7767b40f", 1281 | "sha256:502526a2cbfa431d9fc2a079bdd9061a2397b842bb6bc4239bb176da00993812", 1282 | "sha256:51e0e543a33ed92db9f5ef69a0356e0b1a7a6b6a71b80df99f1d181ae5875636", 1283 | "sha256:57751894f6618fd4308ed8e0c36c333e2f5469744c34729a27532b3db106ee20", 1284 | "sha256:5d77adcd56a42d00cc1be30843d3426aa4e660cab4a61021dc84467123f7a00c", 1285 | "sha256:655a83b0058ba47c7c52e4e2df5ecf484c1b0b0349805896dd350cbc416bdd91", 1286 | "sha256:68943d632f1f9e3dce98908e873b3a090f6cba1cbb1b892a9e8d97c938871fbe", 1287 | "sha256:6c738585d7a9961d8c2821a1eb3dcb978d14e238be3d70f0a706f7fa9316946b", 1288 | "sha256:73bd195e43f3fadecfc50c682f5055ec32ee2c933243cafbfdec69ab1aa87cad", 1289 | "sha256:772a91fc0e03eaf922c63badeca75e91baa80fe2f5f87bdaed4280662aad25c9", 1290 | "sha256:77ec3e7be99629898c9a6d24a09de089fa5356ee408cdffffe62d67bb75fdd72", 1291 | "sha256:7db8b751ad307d7cf238f02101e8e36a128a6cb199326e867d1398067381bff4", 1292 | "sha256:801ec82e4188e935c7f5e22e006d01611d6b41661bba9fe45b60e7ac1a8f84de", 1293 | "sha256:82409ffe29d70fd733ff3c1025a602abb3e67405d41b9403b00b01debc4c9a29", 1294 | "sha256:828989c45c245518065a110434246c44a56a8b2b2f6347d1409c787e6e4651ee", 1295 | "sha256:829f97c8e258593b9daa80638aee3789b7df9da5cf1336035016d76f03b8860c", 1296 | "sha256:871b72c3643e516db4ecf20efe735deb27fe30ca17800e661d769faab45a18d7", 1297 | "sha256:89dca0ce00a2b49024df6325925555d406b14aa3efc2f752dbb5940c52c56b11", 1298 | "sha256:90fb88843d3902fe7c9586d439d1e8c05258f41da473952aa8b328d8b907498c", 1299 | "sha256:97aabc5c50312afa5e0a2b07c17d4ac5e865b250986f8afe2b02d772567a380c", 1300 | "sha256:9aaa107275d8527e9d6e7670b64aabaaa36e5b6bd71a1015ddd21da0d4e06448", 1301 | "sha256:9f47eabcd2ded7698106b05c2c338672d16a6f2a485e74481f524e2a23c2794b", 1302 | "sha256:a0a06a052c5f37b4ed81c613a455a81f9a3a69429b4fd7bb913c3fa98abefc20", 1303 | "sha256:ab388aaa3f6ce52ac1cb8e122c4bd46657c15905904b3120a6248b5b8b0bc228", 1304 | "sha256:ad58d27a5b0262c0c19b47d54c5802db9b34d38bbf886665b626aff83c74bacd", 1305 | "sha256:ae5331c23ce118c53b172fa64a4c037eb83c9165aba3a7ba9ddd3ec9fa64a699", 1306 | "sha256:af0372acb5d3598f36ec0914deed2a63f6bcdb7b606da04dc19a88d31bf0c05b", 1307 | "sha256:afa4107d1b306cdf8953edde0534562607fe8811b6c4d9a486298ad31de733b2", 1308 | "sha256:b03ae6f1a1878233ac620c98f3459f79fd77c7e3c2b20d460284e1fb370557d4", 1309 | "sha256:b0915e734b33a474d76c28e07292f196cdf2a590a0d25bcc06e64e545f2d146c", 1310 | "sha256:b4012d06c846dc2b80651b120e2cdd787b013deb39c09f407727ba90015c684f", 1311 | "sha256:b472b5ea442148d1c3e2209f20f1e0bb0eb556538690fa70b5e1f79fa0ba8dc2", 1312 | "sha256:b59430236b8e58840a0dfb4099a0e8717ffb779c952426a69ae435ca1f57210c", 1313 | "sha256:b90f7616ea170e92820775ed47e136208e04c967271c9ef615b6fbd08d9af0e3", 1314 | "sha256:b9a65733d103311331875c1dca05cb4606997fd33d6acfed695b1232ba1df193", 1315 | "sha256:bac18ab8d2d1e6b4ce25e3424f709aceef668347db8637c2296bcf41acb7cf48", 1316 | "sha256:bca31dd6014cb8b0b2db1e46081b0ca7d936f856da3b39744aef499db5d84d02", 1317 | "sha256:be55f8457cd1eac957af0c3f5ece7bc3f033f89b114ef30f710882717670b2a8", 1318 | "sha256:c7025dce65566eb6e89f56c9509d4f628fddcedb131d9465cacd3d8bac337e7e", 1319 | "sha256:c935a22a557a560108d780f9a0fc426dd7459940dc54faa49d83249c8d3e760f", 1320 | "sha256:dbb8e7f2abee51cef77673be97760abff1674ed32847ce04b4af90f610144c7b", 1321 | "sha256:e6ea6b856a74d560d9326c0f5895ef8050126acfdc7ca08ad703eb0081e82b74", 1322 | "sha256:ebf2029c1f464c59b8bdbe5143c79fa2045a581ac53679733d3a91d400ff9efb", 1323 | "sha256:f1ff2ee69f10f13a9596480335f406dd1f70c3650349e2be67ca3139280cade0" 1324 | ], 1325 | "markers": "python_version >= '3.7'", 1326 | "version": "==9.3.0" 1327 | }, 1328 | "pkginfo": { 1329 | "hashes": [ 1330 | "sha256:848865108ec99d4901b2f7e84058b6e7660aae8ae10164e015a6dcf5b242a594", 1331 | "sha256:a84da4318dd86f870a9447a8c98340aa06216bfc6f2b7bdc4b8766984ae1867c" 1332 | ], 1333 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", 1334 | "version": "==1.8.3" 1335 | }, 1336 | "platformdirs": { 1337 | "hashes": [ 1338 | "sha256:1006647646d80f16130f052404c6b901e80ee4ed6bef6792e1f238a8969106f7", 1339 | "sha256:af0276409f9a02373d540bf8480021a048711d572745aef4b7842dad245eba10" 1340 | ], 1341 | "markers": "python_version >= '3.7'", 1342 | "version": "==2.5.4" 1343 | }, 1344 | "pre-commit": { 1345 | "hashes": [ 1346 | "sha256:51a5ba7c480ae8072ecdb6933df22d2f812dc897d5fe848778116129a681aac7", 1347 | "sha256:a978dac7bc9ec0bcee55c18a277d553b0f419d259dadb4b9418ff2d00eb43959" 1348 | ], 1349 | "index": "pypi", 1350 | "version": "==2.20.0" 1351 | }, 1352 | "prometheus-client": { 1353 | "hashes": [ 1354 | "sha256:be26aa452490cfcf6da953f9436e95a9f2b4d578ca80094b4458930e5f584ab1", 1355 | "sha256:db7c05cbd13a0f79975592d112320f2605a325969b270a94b71dcabc47b931d2" 1356 | ], 1357 | "markers": "python_version >= '3.6'", 1358 | "version": "==0.15.0" 1359 | }, 1360 | "prompt-toolkit": { 1361 | "hashes": [ 1362 | "sha256:535c29c31216c77302877d5120aef6c94ff573748a5b5ca5b1b1f76f5e700c73", 1363 | "sha256:ced598b222f6f4029c0800cefaa6a17373fb580cd093223003475ce32805c35b" 1364 | ], 1365 | "markers": "python_full_version >= '3.6.2'", 1366 | "version": "==3.0.33" 1367 | }, 1368 | "psutil": { 1369 | "hashes": [ 1370 | "sha256:149555f59a69b33f056ba1c4eb22bb7bf24332ce631c44a319cec09f876aaeff", 1371 | "sha256:16653106f3b59386ffe10e0bad3bb6299e169d5327d3f187614b1cb8f24cf2e1", 1372 | "sha256:3d7f9739eb435d4b1338944abe23f49584bde5395f27487d2ee25ad9a8774a62", 1373 | "sha256:3ff89f9b835100a825b14c2808a106b6fdcc4b15483141482a12c725e7f78549", 1374 | "sha256:54c0d3d8e0078b7666984e11b12b88af2db11d11249a8ac8920dd5ef68a66e08", 1375 | "sha256:54d5b184728298f2ca8567bf83c422b706200bcbbfafdc06718264f9393cfeb7", 1376 | "sha256:6001c809253a29599bc0dfd5179d9f8a5779f9dffea1da0f13c53ee568115e1e", 1377 | "sha256:68908971daf802203f3d37e78d3f8831b6d1014864d7a85937941bb35f09aefe", 1378 | "sha256:6b92c532979bafc2df23ddc785ed116fced1f492ad90a6830cf24f4d1ea27d24", 1379 | "sha256:852dd5d9f8a47169fe62fd4a971aa07859476c2ba22c2254d4a1baa4e10b95ad", 1380 | "sha256:9120cd39dca5c5e1c54b59a41d205023d436799b1c8c4d3ff71af18535728e94", 1381 | "sha256:c1ca331af862803a42677c120aff8a814a804e09832f166f226bfd22b56feee8", 1382 | "sha256:efeae04f9516907be44904cc7ce08defb6b665128992a56957abc9b61dca94b7", 1383 | "sha256:fd8522436a6ada7b4aad6638662966de0d61d241cb821239b2ae7013d41a43d4" 1384 | ], 1385 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 1386 | "version": "==5.9.4" 1387 | }, 1388 | "ptyprocess": { 1389 | "hashes": [ 1390 | "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", 1391 | "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220" 1392 | ], 1393 | "markers": "os_name != 'nt'", 1394 | "version": "==0.7.0" 1395 | }, 1396 | "pure-eval": { 1397 | "hashes": [ 1398 | "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350", 1399 | "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3" 1400 | ], 1401 | "version": "==0.2.2" 1402 | }, 1403 | "pycodestyle": { 1404 | "hashes": [ 1405 | "sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053", 1406 | "sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610" 1407 | ], 1408 | "markers": "python_version >= '3.6'", 1409 | "version": "==2.10.0" 1410 | }, 1411 | "pycparser": { 1412 | "hashes": [ 1413 | "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9", 1414 | "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206" 1415 | ], 1416 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 1417 | "version": "==2.21" 1418 | }, 1419 | "pyflakes": { 1420 | "hashes": [ 1421 | "sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf", 1422 | "sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd" 1423 | ], 1424 | "markers": "python_version >= '3.6'", 1425 | "version": "==3.0.1" 1426 | }, 1427 | "pygments": { 1428 | "hashes": [ 1429 | "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1", 1430 | "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42" 1431 | ], 1432 | "markers": "python_version >= '3.6'", 1433 | "version": "==2.13.0" 1434 | }, 1435 | "pyparsing": { 1436 | "hashes": [ 1437 | "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb", 1438 | "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc" 1439 | ], 1440 | "markers": "python_full_version >= '3.6.8'", 1441 | "version": "==3.0.9" 1442 | }, 1443 | "pyrsistent": { 1444 | "hashes": [ 1445 | "sha256:055ab45d5911d7cae397dc418808d8802fb95262751872c841c170b0dbf51eed", 1446 | "sha256:111156137b2e71f3a9936baf27cb322e8024dac3dc54ec7fb9f0bcf3249e68bb", 1447 | "sha256:187d5730b0507d9285a96fca9716310d572e5464cadd19f22b63a6976254d77a", 1448 | "sha256:21455e2b16000440e896ab99e8304617151981ed40c29e9507ef1c2e4314ee95", 1449 | "sha256:2aede922a488861de0ad00c7630a6e2d57e8023e4be72d9d7147a9fcd2d30712", 1450 | "sha256:3ba4134a3ff0fc7ad225b6b457d1309f4698108fb6b35532d015dca8f5abed73", 1451 | "sha256:456cb30ca8bff00596519f2c53e42c245c09e1a4543945703acd4312949bfd41", 1452 | "sha256:71d332b0320642b3261e9fee47ab9e65872c2bd90260e5d225dabeed93cbd42b", 1453 | "sha256:879b4c2f4d41585c42df4d7654ddffff1239dc4065bc88b745f0341828b83e78", 1454 | "sha256:9cd3e9978d12b5d99cbdc727a3022da0430ad007dacf33d0bf554b96427f33ab", 1455 | "sha256:a178209e2df710e3f142cbd05313ba0c5ebed0a55d78d9945ac7a4e09d923308", 1456 | "sha256:b39725209e06759217d1ac5fcdb510e98670af9e37223985f330b611f62e7425", 1457 | "sha256:bfa0351be89c9fcbcb8c9879b826f4353be10f58f8a677efab0c017bf7137ec2", 1458 | "sha256:bfd880614c6237243ff53a0539f1cb26987a6dc8ac6e66e0c5a40617296a045e", 1459 | "sha256:c43bec251bbd10e3cb58ced80609c5c1eb238da9ca78b964aea410fb820d00d6", 1460 | "sha256:d690b18ac4b3e3cab73b0b7aa7dbe65978a172ff94970ff98d82f2031f8971c2", 1461 | "sha256:d6982b5a0237e1b7d876b60265564648a69b14017f3b5f908c5be2de3f9abb7a", 1462 | "sha256:dec3eac7549869365fe263831f576c8457f6c833937c68542d08fde73457d291", 1463 | "sha256:e371b844cec09d8dc424d940e54bba8f67a03ebea20ff7b7b0d56f526c71d584", 1464 | "sha256:e5d8f84d81e3729c3b506657dddfe46e8ba9c330bf1858ee33108f8bb2adb38a", 1465 | "sha256:ea6b79a02a28550c98b6ca9c35b9f492beaa54d7c5c9e9949555893c8a9234d0", 1466 | "sha256:f1258f4e6c42ad0b20f9cfcc3ada5bd6b83374516cd01c0960e3cb75fdca6770" 1467 | ], 1468 | "markers": "python_version >= '3.7'", 1469 | "version": "==0.19.2" 1470 | }, 1471 | "python-dateutil": { 1472 | "hashes": [ 1473 | "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", 1474 | "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" 1475 | ], 1476 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 1477 | "version": "==2.8.2" 1478 | }, 1479 | "pytz": { 1480 | "hashes": [ 1481 | "sha256:222439474e9c98fced559f1709d89e6c9cbf8d79c794ff3eb9f8800064291427", 1482 | "sha256:e89512406b793ca39f5971bc999cc538ce125c0e51c27941bef4568b460095e2" 1483 | ], 1484 | "version": "==2022.6" 1485 | }, 1486 | "pyyaml": { 1487 | "hashes": [ 1488 | "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf", 1489 | "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293", 1490 | "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b", 1491 | "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57", 1492 | "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b", 1493 | "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4", 1494 | "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07", 1495 | "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba", 1496 | "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9", 1497 | "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287", 1498 | "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513", 1499 | "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0", 1500 | "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782", 1501 | "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0", 1502 | "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92", 1503 | "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f", 1504 | "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2", 1505 | "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc", 1506 | "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1", 1507 | "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c", 1508 | "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86", 1509 | "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4", 1510 | "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c", 1511 | "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34", 1512 | "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b", 1513 | "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d", 1514 | "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c", 1515 | "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb", 1516 | "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7", 1517 | "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737", 1518 | "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3", 1519 | "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d", 1520 | "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358", 1521 | "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53", 1522 | "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78", 1523 | "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803", 1524 | "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a", 1525 | "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f", 1526 | "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174", 1527 | "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5" 1528 | ], 1529 | "markers": "python_version >= '3.6'", 1530 | "version": "==6.0" 1531 | }, 1532 | "pyzmq": { 1533 | "hashes": [ 1534 | "sha256:0108358dab8c6b27ff6b985c2af4b12665c1bc659648284153ee501000f5c107", 1535 | "sha256:07bec1a1b22dacf718f2c0e71b49600bb6a31a88f06527dfd0b5aababe3fa3f7", 1536 | "sha256:0e8f482c44ccb5884bf3f638f29bea0f8dc68c97e38b2061769c4cb697f6140d", 1537 | "sha256:0ec91f1bad66f3ee8c6deb65fa1fe418e8ad803efedd69c35f3b5502f43bd1dc", 1538 | "sha256:0f14cffd32e9c4c73da66db97853a6aeceaac34acdc0fae9e5bbc9370281864c", 1539 | "sha256:15975747462ec49fdc863af906bab87c43b2491403ab37a6d88410635786b0f4", 1540 | "sha256:1724117bae69e091309ffb8255412c4651d3f6355560d9af312d547f6c5bc8b8", 1541 | "sha256:1a7c280185c4da99e0cc06c63bdf91f5b0b71deb70d8717f0ab870a43e376db8", 1542 | "sha256:1b7928bb7580736ffac5baf814097be342ba08d3cfdfb48e52773ec959572287", 1543 | "sha256:2032d9cb994ce3b4cba2b8dfae08c7e25bc14ba484c770d4d3be33c27de8c45b", 1544 | "sha256:20e7eeb1166087db636c06cae04a1ef59298627f56fb17da10528ab52a14c87f", 1545 | "sha256:216f5d7dbb67166759e59b0479bca82b8acf9bed6015b526b8eb10143fb08e77", 1546 | "sha256:28b119ba97129d3001673a697b7cce47fe6de1f7255d104c2f01108a5179a066", 1547 | "sha256:3104f4b084ad5d9c0cb87445cc8cfd96bba710bef4a66c2674910127044df209", 1548 | "sha256:3e6192dbcefaaa52ed81be88525a54a445f4b4fe2fffcae7fe40ebb58bd06bfd", 1549 | "sha256:42d4f97b9795a7aafa152a36fe2ad44549b83a743fd3e77011136def512e6c2a", 1550 | "sha256:44e706bac34e9f50779cb8c39f10b53a4d15aebb97235643d3112ac20bd577b4", 1551 | "sha256:47b11a729d61a47df56346283a4a800fa379ae6a85870d5a2e1e4956c828eedc", 1552 | "sha256:4854f9edc5208f63f0841c0c667260ae8d6846cfa233c479e29fdc85d42ebd58", 1553 | "sha256:48f721f070726cd2a6e44f3c33f8ee4b24188e4b816e6dd8ba542c8c3bb5b246", 1554 | "sha256:52afb0ac962963fff30cf1be775bc51ae083ef4c1e354266ab20e5382057dd62", 1555 | "sha256:54d8b9c5e288362ec8595c1d98666d36f2070fd0c2f76e2b3c60fbad9bd76227", 1556 | "sha256:5bd3d7dfd9cd058eb68d9a905dec854f86649f64d4ddf21f3ec289341386c44b", 1557 | "sha256:613010b5d17906c4367609e6f52e9a2595e35d5cc27d36ff3f1b6fa6e954d944", 1558 | "sha256:624321120f7e60336be8ec74a172ae7fba5c3ed5bf787cc85f7e9986c9e0ebc2", 1559 | "sha256:65c94410b5a8355cfcf12fd600a313efee46ce96a09e911ea92cf2acf6708804", 1560 | "sha256:6640f83df0ae4ae1104d4c62b77e9ef39be85ebe53f636388707d532bee2b7b8", 1561 | "sha256:687700f8371643916a1d2c61f3fdaa630407dd205c38afff936545d7b7466066", 1562 | "sha256:77c2713faf25a953c69cf0f723d1b7dd83827b0834e6c41e3fb3bbc6765914a1", 1563 | "sha256:78068e8678ca023594e4a0ab558905c1033b2d3e806a0ad9e3094e231e115a33", 1564 | "sha256:7a23ccc1083c260fa9685c93e3b170baba45aeed4b524deb3f426b0c40c11639", 1565 | "sha256:7abddb2bd5489d30ffeb4b93a428130886c171b4d355ccd226e83254fcb6b9ef", 1566 | "sha256:80093b595921eed1a2cead546a683b9e2ae7f4a4592bb2ab22f70d30174f003a", 1567 | "sha256:8242543c522d84d033fe79be04cb559b80d7eb98ad81b137ff7e0a9020f00ace", 1568 | "sha256:838812c65ed5f7c2bd11f7b098d2e5d01685a3f6d1f82849423b570bae698c00", 1569 | "sha256:83ea1a398f192957cb986d9206ce229efe0ee75e3c6635baff53ddf39bd718d5", 1570 | "sha256:8421aa8c9b45ea608c205db9e1c0c855c7e54d0e9c2c2f337ce024f6843cab3b", 1571 | "sha256:858375573c9225cc8e5b49bfac846a77b696b8d5e815711b8d4ba3141e6e8879", 1572 | "sha256:86de64468cad9c6d269f32a6390e210ca5ada568c7a55de8e681ca3b897bb340", 1573 | "sha256:87f7ac99b15270db8d53f28c3c7b968612993a90a5cf359da354efe96f5372b4", 1574 | "sha256:8bad8210ad4df68c44ff3685cca3cda448ee46e20d13edcff8909eba6ec01ca4", 1575 | "sha256:8bb4af15f305056e95ca1bd086239b9ebc6ad55e9f49076d27d80027f72752f6", 1576 | "sha256:8c78bfe20d4c890cb5580a3b9290f700c570e167d4cdcc55feec07030297a5e3", 1577 | "sha256:8f3f3154fde2b1ff3aa7b4f9326347ebc89c8ef425ca1db8f665175e6d3bd42f", 1578 | "sha256:94010bd61bc168c103a5b3b0f56ed3b616688192db7cd5b1d626e49f28ff51b3", 1579 | "sha256:941fab0073f0a54dc33d1a0460cb04e0d85893cb0c5e1476c785000f8b359409", 1580 | "sha256:9dca7c3956b03b7663fac4d150f5e6d4f6f38b2462c1e9afd83bcf7019f17913", 1581 | "sha256:a180dbd5ea5d47c2d3b716d5c19cc3fb162d1c8db93b21a1295d69585bfddac1", 1582 | "sha256:a2712aee7b3834ace51738c15d9ee152cc5a98dc7d57dd93300461b792ab7b43", 1583 | "sha256:a435ef8a3bd95c8a2d316d6e0ff70d0db524f6037411652803e118871d703333", 1584 | "sha256:abb756147314430bee5d10919b8493c0ccb109ddb7f5dfd2fcd7441266a25b75", 1585 | "sha256:abe6eb10122f0d746a0d510c2039ae8edb27bc9af29f6d1b05a66cc2401353ff", 1586 | "sha256:acbd0a6d61cc954b9f535daaa9ec26b0a60a0d4353c5f7c1438ebc88a359a47e", 1587 | "sha256:ae08ac90aa8fa14caafc7a6251bd218bf6dac518b7bff09caaa5e781119ba3f2", 1588 | "sha256:ae61446166983c663cee42c852ed63899e43e484abf080089f771df4b9d272ef", 1589 | "sha256:afe1f3bc486d0ce40abb0a0c9adb39aed3bbac36ebdc596487b0cceba55c21c1", 1590 | "sha256:b946da90dc2799bcafa682692c1d2139b2a96ec3c24fa9fc6f5b0da782675330", 1591 | "sha256:b947e264f0e77d30dcbccbb00f49f900b204b922eb0c3a9f0afd61aaa1cedc3d", 1592 | "sha256:bb5635c851eef3a7a54becde6da99485eecf7d068bd885ac8e6d173c4ecd68b0", 1593 | "sha256:bcbebd369493d68162cddb74a9c1fcebd139dfbb7ddb23d8f8e43e6c87bac3a6", 1594 | "sha256:c31805d2c8ade9b11feca4674eee2b9cce1fec3e8ddb7bbdd961a09dc76a80ea", 1595 | "sha256:c8840f064b1fb377cffd3efeaad2b190c14d4c8da02316dae07571252d20b31f", 1596 | "sha256:ccb94342d13e3bf3ffa6e62f95b5e3f0bc6bfa94558cb37f4b3d09d6feb536ff", 1597 | "sha256:d66689e840e75221b0b290b0befa86f059fb35e1ee6443bce51516d4d61b6b99", 1598 | "sha256:dabf1a05318d95b1537fd61d9330ef4313ea1216eea128a17615038859da3b3b", 1599 | "sha256:db03704b3506455d86ec72c3358a779e9b1d07b61220dfb43702b7b668edcd0d", 1600 | "sha256:de4217b9eb8b541cf2b7fde4401ce9d9a411cc0af85d410f9d6f4333f43640be", 1601 | "sha256:df0841f94928f8af9c7a1f0aaaffba1fb74607af023a152f59379c01c53aee58", 1602 | "sha256:dfb992dbcd88d8254471760879d48fb20836d91baa90f181c957122f9592b3dc", 1603 | "sha256:e7e66b4e403c2836ac74f26c4b65d8ac0ca1eef41dfcac2d013b7482befaad83", 1604 | "sha256:e8012bce6836d3f20a6c9599f81dfa945f433dab4dbd0c4917a6fb1f998ab33d", 1605 | "sha256:f01de4ec083daebf210531e2cca3bdb1608dbbbe00a9723e261d92087a1f6ebc", 1606 | "sha256:f0d945a85b70da97ae86113faf9f1b9294efe66bd4a5d6f82f2676d567338b66", 1607 | "sha256:fa0ae3275ef706c0309556061185dd0e4c4cd3b7d6f67ae617e4e677c7a41e2e" 1608 | ], 1609 | "markers": "python_version >= '3.6'", 1610 | "version": "==24.0.1" 1611 | }, 1612 | "readme-renderer": { 1613 | "hashes": [ 1614 | "sha256:cd653186dfc73055656f090f227f5cb22a046d7f71a841dfa305f55c9a513273", 1615 | "sha256:f67a16caedfa71eef48a31b39708637a6f4664c4394801a7b0d6432d13907343" 1616 | ], 1617 | "markers": "python_version >= '3.7'", 1618 | "version": "==37.3" 1619 | }, 1620 | "requests": { 1621 | "hashes": [ 1622 | "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983", 1623 | "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349" 1624 | ], 1625 | "markers": "python_version >= '3.7' and python_full_version < '4.0.0'", 1626 | "version": "==2.28.1" 1627 | }, 1628 | "requests-toolbelt": { 1629 | "hashes": [ 1630 | "sha256:18565aa58116d9951ac39baa288d3adb5b3ff975c4f25eee78555d89e8f247f7", 1631 | "sha256:62e09f7ff5ccbda92772a29f394a49c3ad6cb181d568b1337626b2abb628a63d" 1632 | ], 1633 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 1634 | "version": "==0.10.1" 1635 | }, 1636 | "rfc3986": { 1637 | "hashes": [ 1638 | "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd", 1639 | "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c" 1640 | ], 1641 | "markers": "python_version >= '3.7'", 1642 | "version": "==2.0.0" 1643 | }, 1644 | "rich": { 1645 | "hashes": [ 1646 | "sha256:a4eb26484f2c82589bd9a17c73d32a010b1e29d89f1604cd9bf3a2097b81bb5e", 1647 | "sha256:ba3a3775974105c221d31141f2c116f4fd65c5ceb0698657a11e9f295ec93fd0" 1648 | ], 1649 | "markers": "python_full_version >= '3.6.3' and python_full_version < '4.0.0'", 1650 | "version": "==12.6.0" 1651 | }, 1652 | "secretstorage": { 1653 | "hashes": [ 1654 | "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77", 1655 | "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99" 1656 | ], 1657 | "markers": "sys_platform == 'linux'", 1658 | "version": "==3.3.3" 1659 | }, 1660 | "send2trash": { 1661 | "hashes": [ 1662 | "sha256:d2c24762fd3759860a0aff155e45871447ea58d2be6bdd39b5c8f966a0c99c2d", 1663 | "sha256:f20eaadfdb517eaca5ce077640cb261c7d2698385a6a0f072a4a5447fd49fa08" 1664 | ], 1665 | "version": "==1.8.0" 1666 | }, 1667 | "setuptools": { 1668 | "hashes": [ 1669 | "sha256:57f6f22bde4e042978bcd50176fdb381d7c21a9efa4041202288d3737a0c6a54", 1670 | "sha256:a7620757bf984b58deaf32fc8a4577a9bbc0850cf92c20e1ce41c38c19e5fb75" 1671 | ], 1672 | "markers": "python_version >= '3.7'", 1673 | "version": "==65.6.3" 1674 | }, 1675 | "setuptools-scm": { 1676 | "hashes": [ 1677 | "sha256:031e13af771d6f892b941adb6ea04545bbf91ebc5ce68c78aaf3fff6e1fb4844", 1678 | "sha256:7930f720905e03ccd1e1d821db521bff7ec2ac9cf0ceb6552dd73d24a45d3b02" 1679 | ], 1680 | "index": "pypi", 1681 | "version": "==7.0.5" 1682 | }, 1683 | "six": { 1684 | "hashes": [ 1685 | "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", 1686 | "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" 1687 | ], 1688 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 1689 | "version": "==1.16.0" 1690 | }, 1691 | "sniffio": { 1692 | "hashes": [ 1693 | "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101", 1694 | "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384" 1695 | ], 1696 | "markers": "python_version >= '3.7'", 1697 | "version": "==1.3.0" 1698 | }, 1699 | "snowballstemmer": { 1700 | "hashes": [ 1701 | "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1", 1702 | "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a" 1703 | ], 1704 | "version": "==2.2.0" 1705 | }, 1706 | "soupsieve": { 1707 | "hashes": [ 1708 | "sha256:3b2503d3c7084a42b1ebd08116e5f81aadfaea95863628c80a3b774a11b7c759", 1709 | "sha256:fc53893b3da2c33de295667a0e19f078c14bf86544af307354de5fcf12a3f30d" 1710 | ], 1711 | "markers": "python_version >= '3.6'", 1712 | "version": "==2.3.2.post1" 1713 | }, 1714 | "sphinx": { 1715 | "hashes": [ 1716 | "sha256:060ca5c9f7ba57a08a1219e547b269fadf125ae25b06b9fa7f66768efb652d6d", 1717 | "sha256:51026de0a9ff9fc13c05d74913ad66047e104f56a129ff73e174eb5c3ee794b5" 1718 | ], 1719 | "index": "pypi", 1720 | "version": "==5.3.0" 1721 | }, 1722 | "sphinxcontrib-applehelp": { 1723 | "hashes": [ 1724 | "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a", 1725 | "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58" 1726 | ], 1727 | "markers": "python_version >= '3.5'", 1728 | "version": "==1.0.2" 1729 | }, 1730 | "sphinxcontrib-devhelp": { 1731 | "hashes": [ 1732 | "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e", 1733 | "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4" 1734 | ], 1735 | "markers": "python_version >= '3.5'", 1736 | "version": "==1.0.2" 1737 | }, 1738 | "sphinxcontrib-htmlhelp": { 1739 | "hashes": [ 1740 | "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07", 1741 | "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2" 1742 | ], 1743 | "markers": "python_version >= '3.6'", 1744 | "version": "==2.0.0" 1745 | }, 1746 | "sphinxcontrib-jsmath": { 1747 | "hashes": [ 1748 | "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", 1749 | "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8" 1750 | ], 1751 | "markers": "python_version >= '3.5'", 1752 | "version": "==1.0.1" 1753 | }, 1754 | "sphinxcontrib-qthelp": { 1755 | "hashes": [ 1756 | "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72", 1757 | "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6" 1758 | ], 1759 | "markers": "python_version >= '3.5'", 1760 | "version": "==1.0.3" 1761 | }, 1762 | "sphinxcontrib-serializinghtml": { 1763 | "hashes": [ 1764 | "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd", 1765 | "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952" 1766 | ], 1767 | "markers": "python_version >= '3.5'", 1768 | "version": "==1.1.5" 1769 | }, 1770 | "stack-data": { 1771 | "hashes": [ 1772 | "sha256:32d2dd0376772d01b6cb9fc996f3c8b57a357089dec328ed4b6553d037eaf815", 1773 | "sha256:cbb2a53eb64e5785878201a97ed7c7b94883f48b87bfb0bbe8b623c74679e4a8" 1774 | ], 1775 | "version": "==0.6.2" 1776 | }, 1777 | "terminado": { 1778 | "hashes": [ 1779 | "sha256:520feaa3aeab8ad64a69ca779be54be9234edb2d0d6567e76c93c2c9a4e6e43f", 1780 | "sha256:bf6fe52accd06d0661d7611cc73202121ec6ee51e46d8185d489ac074ca457c2" 1781 | ], 1782 | "markers": "python_version >= '3.7'", 1783 | "version": "==0.17.0" 1784 | }, 1785 | "tinycss2": { 1786 | "hashes": [ 1787 | "sha256:2b80a96d41e7c3914b8cda8bc7f705a4d9c49275616e886103dd839dfc847847", 1788 | "sha256:8cff3a8f066c2ec677c06dbc7b45619804a6938478d9d73c284b29d14ecb0627" 1789 | ], 1790 | "markers": "python_version >= '3.7'", 1791 | "version": "==1.2.1" 1792 | }, 1793 | "toml": { 1794 | "hashes": [ 1795 | "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", 1796 | "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" 1797 | ], 1798 | "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", 1799 | "version": "==0.10.2" 1800 | }, 1801 | "tomli": { 1802 | "hashes": [ 1803 | "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", 1804 | "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" 1805 | ], 1806 | "markers": "python_version >= '3.7'", 1807 | "version": "==2.0.1" 1808 | }, 1809 | "tornado": { 1810 | "hashes": [ 1811 | "sha256:1d54d13ab8414ed44de07efecb97d4ef7c39f7438cf5e976ccd356bebb1b5fca", 1812 | "sha256:20f638fd8cc85f3cbae3c732326e96addff0a15e22d80f049e00121651e82e72", 1813 | "sha256:5c87076709343557ef8032934ce5f637dbb552efa7b21d08e89ae7619ed0eb23", 1814 | "sha256:5f8c52d219d4995388119af7ccaa0bcec289535747620116a58d830e7c25d8a8", 1815 | "sha256:6fdfabffd8dfcb6cf887428849d30cf19a3ea34c2c248461e1f7d718ad30b66b", 1816 | "sha256:87dcafae3e884462f90c90ecc200defe5e580a7fbbb4365eda7c7c1eb809ebc9", 1817 | "sha256:9b630419bde84ec666bfd7ea0a4cb2a8a651c2d5cccdbdd1972a0c859dfc3c13", 1818 | "sha256:b8150f721c101abdef99073bf66d3903e292d851bee51910839831caba341a75", 1819 | "sha256:ba09ef14ca9893954244fd872798b4ccb2367c165946ce2dd7376aebdde8e3ac", 1820 | "sha256:d3a2f5999215a3a06a4fc218026cd84c61b8b2b40ac5296a6db1f1451ef04c1e", 1821 | "sha256:e5f923aa6a47e133d1cf87d60700889d7eae68988704e20c75fb2d65677a8e4b" 1822 | ], 1823 | "markers": "python_version >= '3.7'", 1824 | "version": "==6.2" 1825 | }, 1826 | "traitlets": { 1827 | "hashes": [ 1828 | "sha256:1201b2c9f76097195989cdf7f65db9897593b0dfd69e4ac96016661bb6f0d30f", 1829 | "sha256:b122f9ff2f2f6c1709dab289a05555be011c87828e911c0cf4074b85cb780a79" 1830 | ], 1831 | "markers": "python_version >= '3.7'", 1832 | "version": "==5.5.0" 1833 | }, 1834 | "twine": { 1835 | "hashes": [ 1836 | "sha256:42026c18e394eac3e06693ee52010baa5313e4811d5a11050e7d48436cf41b9e", 1837 | "sha256:96b1cf12f7ae611a4a40b6ae8e9570215daff0611828f5fe1f37a16255ab24a0" 1838 | ], 1839 | "index": "pypi", 1840 | "version": "==4.0.1" 1841 | }, 1842 | "typing-extensions": { 1843 | "hashes": [ 1844 | "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa", 1845 | "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e" 1846 | ], 1847 | "markers": "python_version >= '3.7'", 1848 | "version": "==4.4.0" 1849 | }, 1850 | "urllib3": { 1851 | "hashes": [ 1852 | "sha256:47cc05d99aaa09c9e72ed5809b60e7ba354e64b59c9c173ac3018642d8bb41fc", 1853 | "sha256:c083dd0dce68dbfbe1129d5271cb90f9447dea7d52097c6e0126120c521ddea8" 1854 | ], 1855 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", 1856 | "version": "==1.26.13" 1857 | }, 1858 | "virtualenv": { 1859 | "hashes": [ 1860 | "sha256:40a7e06a98728fd5769e1af6fd1a706005b4bb7e16176a272ed4292473180389", 1861 | "sha256:7d6a8d55b2f73b617f684ee40fd85740f062e1f2e379412cb1879c7136f05902" 1862 | ], 1863 | "markers": "python_version >= '3.6'", 1864 | "version": "==20.17.0" 1865 | }, 1866 | "wcwidth": { 1867 | "hashes": [ 1868 | "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784", 1869 | "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83" 1870 | ], 1871 | "version": "==0.2.5" 1872 | }, 1873 | "webencodings": { 1874 | "hashes": [ 1875 | "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", 1876 | "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923" 1877 | ], 1878 | "version": "==0.5.1" 1879 | }, 1880 | "websocket-client": { 1881 | "hashes": [ 1882 | "sha256:d6b06432f184438d99ac1f456eaf22fe1ade524c3dd16e661142dc54e9cba574", 1883 | "sha256:d6e8f90ca8e2dd4e8027c4561adeb9456b54044312dba655e7cae652ceb9ae59" 1884 | ], 1885 | "markers": "python_version >= '3.7'", 1886 | "version": "==1.4.2" 1887 | }, 1888 | "zipp": { 1889 | "hashes": [ 1890 | "sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa", 1891 | "sha256:a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766" 1892 | ], 1893 | "markers": "python_version >= '3.7'", 1894 | "version": "==3.11.0" 1895 | } 1896 | } 1897 | } 1898 | --------------------------------------------------------------------------------