···11+# Byte-compiled / optimized / DLL files
22+__pycache__/
33+*.py[cod]
44+*$py.class
55+66+# C extensions
77+*.so
88+99+# Distribution / packaging
1010+.Python
1111+build/
1212+develop-eggs/
1313+dist/
1414+downloads/
1515+eggs/
1616+.eggs/
1717+lib/
1818+lib64/
1919+parts/
2020+sdist/
2121+var/
2222+wheels/
2323+share/python-wheels/
2424+*.egg-info/
2525+.installed.cfg
2626+*.egg
2727+MANIFEST
2828+2929+# PyInstaller
3030+# Usually these files are written by a python script from a template
3131+# before PyInstaller builds the exe, so as to inject date/other infos into it.
3232+*.manifest
3333+*.spec
3434+3535+# Installer logs
3636+pip-log.txt
3737+pip-delete-this-directory.txt
3838+3939+# Unit test / coverage reports
4040+htmlcov/
4141+.tox/
4242+.nox/
4343+.coverage
4444+.coverage.*
4545+.cache
4646+nosetests.xml
4747+coverage.xml
4848+*.cover
4949+*.py,cover
5050+.hypothesis/
5151+.pytest_cache/
5252+cover/
5353+5454+# Translations
5555+*.mo
5656+*.pot
5757+5858+# Django stuff:
5959+*.log
6060+local_settings.py
6161+db.sqlite3
6262+db.sqlite3-journal
6363+6464+# Flask stuff:
6565+instance/
6666+.webassets-cache
6767+6868+# Scrapy stuff:
6969+.scrapy
7070+7171+# Sphinx documentation
7272+docs/_build/
7373+7474+# PyBuilder
7575+.pybuilder/
7676+target/
7777+7878+# Jupyter Notebook
7979+.ipynb_checkpoints
8080+8181+# IPython
8282+profile_default/
8383+ipython_config.py
8484+8585+# pyenv
8686+# For a library or package, you might want to ignore these files since the code is
8787+# intended to run in multiple environments; otherwise, check them in:
8888+# .python-version
8989+9090+# pipenv
9191+# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
9292+# However, in case of collaboration, if having platform-specific dependencies or dependencies
9393+# having no cross-platform support, pipenv may install dependencies that don't work, or not
9494+# install all needed dependencies.
9595+#Pipfile.lock
9696+9797+# poetry
9898+# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
9999+# This is especially recommended for binary packages to ensure reproducibility, and is more
100100+# commonly ignored for libraries.
101101+# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
102102+#poetry.lock
103103+104104+# pdm
105105+# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
106106+#pdm.lock
107107+# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
108108+# in version control.
109109+# https://pdm.fming.dev/#use-with-ide
110110+.pdm.toml
111111+112112+# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
113113+__pypackages__/
114114+115115+# Celery stuff
116116+celerybeat-schedule
117117+celerybeat.pid
118118+119119+# SageMath parsed files
120120+*.sage.py
121121+122122+# Environments
123123+.env
124124+.venv
125125+env/
126126+venv/
127127+ENV/
128128+env.bak/
129129+venv.bak/
130130+131131+# Spyder project settings
132132+.spyderproject
133133+.spyproject
134134+135135+# Rope project settings
136136+.ropeproject
137137+138138+# mkdocs documentation
139139+/site
140140+141141+# mypy
142142+.mypy_cache/
143143+.dmypy.json
144144+dmypy.json
145145+146146+# Pyre type checker
147147+.pyre/
148148+149149+# pytype static type analyzer
150150+.pytype/
151151+152152+# Cython debug symbols
153153+cython_debug/
154154+155155+# PyCharm
156156+# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
157157+# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
158158+# and can be added to the global gitignore or merged into this file. For a more nuclear
159159+# option (not recommended) you can uncomment the following to ignore the entire idea folder.
160160+#.idea/
+21
LICENSE
···11+MIT License
22+33+Copyright (c) 2024 David Buchanan
44+55+Permission is hereby granted, free of charge, to any person obtaining a copy
66+of this software and associated documentation files (the "Software"), to deal
77+in the Software without restriction, including without limitation the rights
88+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
99+copies of the Software, and to permit persons to whom the Software is
1010+furnished to do so, subject to the following conditions:
1111+1212+The above copyright notice and this permission notice shall be included in all
1313+copies or substantial portions of the Software.
1414+1515+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1616+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1717+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1818+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1919+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
2020+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
2121+SOFTWARE.