├── .gitignore ├── README.md ├── images ├── dog.jpg ├── fgsm_formula.png ├── funny_cat.jpg ├── ifgsm_formula.png ├── iterative_fgsm_total.jpg ├── iterative_fgsm_total.png ├── step_1_to_9.jpg ├── streamlit_app.gif └── subscribe.jpg ├── notebooks ├── end2end.ipynb └── end2end_old.ipynb ├── poetry.lock ├── pyproject.toml └── src ├── __init__.py ├── fgsm.py ├── imagenet_class_labels.py ├── model.py ├── streamlit_app.py └── viz.py /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .idea/ 3 | .venv/ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 |

Breaking deep learning models with adversarial examples 😈

3 |

Or maybe it's just that beautiful things are so easily broken by the world.

4 |

-- Cassandra Clare, City of Fallen Angels

5 |
6 | 7 | ![](http://datamachines.xyz/wp-content/uploads/2021/06/camaleon-2048x1524.jpg) 8 | 9 | ## Table of Contents 10 | 11 | 1. [What is this repo about?](#what-is-this-repo-about) 12 | 2. [Quick setup](#quick-setup) 13 | 3. [Fast Gradient Sign method](#fast-gradient-sign-method) 14 | 4. [Adversarial example generator](#adversarial-example-generator) 15 | 5. [Let's connect!](#lets-connect) 16 | 17 | 18 | ## What is this repo about? 19 | 20 | PyTorch code and [streamlit app](https://share.streamlit.io/paulescu/adversarial-machine-learning/main/src/streamlit_app.py) that demonstrate how easy it is to break deep learning models in computer vision. 21 | More precisely, Inception V3. 22 | 23 | If you do not know what adversarial examples are go check my blog post. 24 | 25 | [📝 Adversarial examples to break deep learning models](http://datamachines.xyz/2021/07/05/adversarial-examples-to-break-deep-learning-models/) 26 | 27 | Also available in [Medium](https://towardsdatascience.com/adversarial-examples-to-break-deep-learning-models-e7f543833eae) and in [Hackernoon](https://hackernoon.com/adversarial-examples-in-machine-learning-explained) 28 | 29 | ## Quick setup 30 | 31 | Create a virtualenv with your preferred tool (`virtualenv`, `conda`, `poetry`) 32 | and activate it. 33 | 34 | Then install the code as a local package 35 | ``` 36 | $ (venv) pip install . 37 | ``` 38 | 39 | 40 | ## Fast Gradient Sign method 41 | 42 | We use the vanilla fast gradient sign method 43 | 44 | ![](images/fgsm_formula.png) 45 | 46 | 47 | And its iterative version. 48 | 49 | ![](images/ifgsm_formula.png) 50 | 51 | 52 | In the code you can find the "magic" that transforms a nice puppy into a paper towel. 53 | 54 | ![](images/step_1_to_9.jpg) 55 | 56 | ## Adversarial example generator 57 | 58 | 👉 [Streamlit app to generate adversarial examples](https://share.streamlit.io/paulescu/adversarial-machine-learning/main/src/streamlit_app.py) 59 | ![](images/streamlit_app.gif) 60 | 61 | ## Let's connect 62 | 63 | If you want to learn more about real-world ML topics and become a better data scientist 64 | 65 | 👉 [Subscribe](http://datamachines.xyz/subscribe) to the datamachines newsletter. 66 | 67 | 👉🏽 Follow me on [Twitter](https://twitter.com/paulabartabajo_) and/or [LinkedIn](https://www.linkedin.com/in/pau-labarta-bajo-4432074b/) 68 | -------------------------------------------------------------------------------- /images/dog.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Paulescu/adversarial-machine-learning/2e34528d356357a4c6abd9fde6d7356e684eee53/images/dog.jpg -------------------------------------------------------------------------------- /images/fgsm_formula.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Paulescu/adversarial-machine-learning/2e34528d356357a4c6abd9fde6d7356e684eee53/images/fgsm_formula.png -------------------------------------------------------------------------------- /images/funny_cat.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Paulescu/adversarial-machine-learning/2e34528d356357a4c6abd9fde6d7356e684eee53/images/funny_cat.jpg -------------------------------------------------------------------------------- /images/ifgsm_formula.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Paulescu/adversarial-machine-learning/2e34528d356357a4c6abd9fde6d7356e684eee53/images/ifgsm_formula.png -------------------------------------------------------------------------------- /images/iterative_fgsm_total.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Paulescu/adversarial-machine-learning/2e34528d356357a4c6abd9fde6d7356e684eee53/images/iterative_fgsm_total.jpg -------------------------------------------------------------------------------- /images/iterative_fgsm_total.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Paulescu/adversarial-machine-learning/2e34528d356357a4c6abd9fde6d7356e684eee53/images/iterative_fgsm_total.png -------------------------------------------------------------------------------- /images/step_1_to_9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Paulescu/adversarial-machine-learning/2e34528d356357a4c6abd9fde6d7356e684eee53/images/step_1_to_9.jpg -------------------------------------------------------------------------------- /images/streamlit_app.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Paulescu/adversarial-machine-learning/2e34528d356357a4c6abd9fde6d7356e684eee53/images/streamlit_app.gif -------------------------------------------------------------------------------- /images/subscribe.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Paulescu/adversarial-machine-learning/2e34528d356357a4c6abd9fde6d7356e684eee53/images/subscribe.jpg -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | [[package]] 2 | name = "absl-py" 3 | version = "0.13.0" 4 | description = "Abseil Python Common Libraries, see https://github.com/abseil/abseil-py." 5 | category = "main" 6 | optional = false 7 | python-versions = "*" 8 | 9 | [package.dependencies] 10 | six = "*" 11 | 12 | [[package]] 13 | name = "altair" 14 | version = "4.2.0" 15 | description = "Altair: A declarative statistical visualization library for Python." 16 | category = "main" 17 | optional = false 18 | python-versions = ">=3.7" 19 | 20 | [package.dependencies] 21 | entrypoints = "*" 22 | jinja2 = "*" 23 | jsonschema = ">=3.0" 24 | numpy = "*" 25 | pandas = ">=0.18" 26 | toolz = "*" 27 | 28 | [package.extras] 29 | dev = ["black", "docutils", "ipython", "flake8", "pytest", "sphinx", "mistune (<2.0.0)", "m2r", "vega-datasets", "recommonmark"] 30 | 31 | [[package]] 32 | name = "appnope" 33 | version = "0.1.2" 34 | description = "Disable App Nap on macOS >= 10.9" 35 | category = "main" 36 | optional = false 37 | python-versions = "*" 38 | 39 | [[package]] 40 | name = "argon2-cffi" 41 | version = "20.1.0" 42 | description = "The secure Argon2 password hashing algorithm." 43 | category = "main" 44 | optional = false 45 | python-versions = "*" 46 | 47 | [package.dependencies] 48 | cffi = ">=1.0.0" 49 | six = "*" 50 | 51 | [package.extras] 52 | dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest", "sphinx", "wheel", "pre-commit"] 53 | docs = ["sphinx"] 54 | tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest"] 55 | 56 | [[package]] 57 | name = "astor" 58 | version = "0.8.1" 59 | description = "Read/rewrite/write Python ASTs" 60 | category = "main" 61 | optional = false 62 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" 63 | 64 | [[package]] 65 | name = "async-generator" 66 | version = "1.10" 67 | description = "Async generators and context managers for Python 3.5+" 68 | category = "main" 69 | optional = false 70 | python-versions = ">=3.5" 71 | 72 | [[package]] 73 | name = "atomicwrites" 74 | version = "1.4.0" 75 | description = "Atomic file writes." 76 | category = "dev" 77 | optional = false 78 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 79 | 80 | [[package]] 81 | name = "attrs" 82 | version = "21.2.0" 83 | description = "Classes Without Boilerplate" 84 | category = "main" 85 | optional = false 86 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 87 | 88 | [package.extras] 89 | dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"] 90 | docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] 91 | tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"] 92 | tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"] 93 | 94 | [[package]] 95 | name = "backcall" 96 | version = "0.2.0" 97 | description = "Specifications for callback functions passed in to an API" 98 | category = "main" 99 | optional = false 100 | python-versions = "*" 101 | 102 | [[package]] 103 | name = "backports.zoneinfo" 104 | version = "0.2.1" 105 | description = "Backport of the standard library zoneinfo module" 106 | category = "main" 107 | optional = false 108 | python-versions = ">=3.6" 109 | 110 | [package.extras] 111 | tzdata = ["tzdata"] 112 | 113 | [[package]] 114 | name = "base58" 115 | version = "2.1.1" 116 | description = "Base58 and Base58Check implementation." 117 | category = "main" 118 | optional = false 119 | python-versions = ">=3.5" 120 | 121 | [package.extras] 122 | tests = ["mypy", "PyHamcrest (>=2.0.2)", "pytest (>=4.6)", "pytest-benchmark", "pytest-cov", "pytest-flake8"] 123 | 124 | [[package]] 125 | name = "bleach" 126 | version = "3.3.0" 127 | description = "An easy safelist-based HTML-sanitizing tool." 128 | category = "main" 129 | optional = false 130 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 131 | 132 | [package.dependencies] 133 | packaging = "*" 134 | six = ">=1.9.0" 135 | webencodings = "*" 136 | 137 | [[package]] 138 | name = "blinker" 139 | version = "1.4" 140 | description = "Fast, simple object-to-object and broadcast signaling" 141 | category = "main" 142 | optional = false 143 | python-versions = "*" 144 | 145 | [[package]] 146 | name = "cachetools" 147 | version = "5.0.0" 148 | description = "Extensible memoizing collections and decorators" 149 | category = "main" 150 | optional = false 151 | python-versions = "~=3.7" 152 | 153 | [[package]] 154 | name = "certifi" 155 | version = "2021.5.30" 156 | description = "Python package for providing Mozilla's CA Bundle." 157 | category = "main" 158 | optional = false 159 | python-versions = "*" 160 | 161 | [[package]] 162 | name = "cffi" 163 | version = "1.14.5" 164 | description = "Foreign Function Interface for Python calling C code." 165 | category = "main" 166 | optional = false 167 | python-versions = "*" 168 | 169 | [package.dependencies] 170 | pycparser = "*" 171 | 172 | [[package]] 173 | name = "chardet" 174 | version = "4.0.0" 175 | description = "Universal encoding detector for Python 2 and 3" 176 | category = "main" 177 | optional = false 178 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 179 | 180 | [[package]] 181 | name = "cleverhans" 182 | version = "3.1.0" 183 | description = "" 184 | category = "main" 185 | optional = false 186 | python-versions = "*" 187 | 188 | [package.dependencies] 189 | joblib = "*" 190 | matplotlib = "*" 191 | mnist = ">=0.2,<1.0" 192 | nose = "*" 193 | numpy = "*" 194 | pycodestyle = "*" 195 | scipy = "*" 196 | tensorflow-probability = "*" 197 | 198 | [package.extras] 199 | pytorch = ["torch (>=1.1.0)", "torchvision (==0.3.0)"] 200 | tf = ["tensorflow (>=1.0.0)"] 201 | tf_gpu = ["tensorflow-gpu (>=1.0.0)"] 202 | 203 | [[package]] 204 | name = "click" 205 | version = "8.0.4" 206 | description = "Composable command line interface toolkit" 207 | category = "main" 208 | optional = false 209 | python-versions = ">=3.6" 210 | 211 | [package.dependencies] 212 | colorama = {version = "*", markers = "platform_system == \"Windows\""} 213 | importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} 214 | 215 | [[package]] 216 | name = "cloudpickle" 217 | version = "1.6.0" 218 | description = "Extended pickling support for Python objects" 219 | category = "main" 220 | optional = false 221 | python-versions = ">=3.5" 222 | 223 | [[package]] 224 | name = "colorama" 225 | version = "0.4.4" 226 | description = "Cross-platform colored terminal text." 227 | category = "main" 228 | optional = false 229 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 230 | 231 | [[package]] 232 | name = "cycler" 233 | version = "0.10.0" 234 | description = "Composable style cycles" 235 | category = "main" 236 | optional = false 237 | python-versions = "*" 238 | 239 | [package.dependencies] 240 | six = "*" 241 | 242 | [[package]] 243 | name = "decorator" 244 | version = "5.0.9" 245 | description = "Decorators for Humans" 246 | category = "main" 247 | optional = false 248 | python-versions = ">=3.5" 249 | 250 | [[package]] 251 | name = "defusedxml" 252 | version = "0.7.1" 253 | description = "XML bomb protection for Python stdlib modules" 254 | category = "main" 255 | optional = false 256 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 257 | 258 | [[package]] 259 | name = "dm-tree" 260 | version = "0.1.6" 261 | description = "Tree is a library for working with nested data structures." 262 | category = "main" 263 | optional = false 264 | python-versions = "*" 265 | 266 | [package.dependencies] 267 | six = ">=1.12.0" 268 | 269 | [[package]] 270 | name = "easydict" 271 | version = "1.9" 272 | description = "Access dict values as attributes (works recursively)." 273 | category = "main" 274 | optional = false 275 | python-versions = "*" 276 | 277 | [[package]] 278 | name = "entrypoints" 279 | version = "0.3" 280 | description = "Discover and load entry points from installed packages." 281 | category = "main" 282 | optional = false 283 | python-versions = ">=2.7" 284 | 285 | [[package]] 286 | name = "gast" 287 | version = "0.4.0" 288 | description = "Python AST that abstracts the underlying Python version" 289 | category = "main" 290 | optional = false 291 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 292 | 293 | [[package]] 294 | name = "gitdb" 295 | version = "4.0.9" 296 | description = "Git Object Database" 297 | category = "main" 298 | optional = false 299 | python-versions = ">=3.6" 300 | 301 | [package.dependencies] 302 | smmap = ">=3.0.1,<6" 303 | 304 | [[package]] 305 | name = "gitpython" 306 | version = "3.1.27" 307 | description = "GitPython is a python library used to interact with Git repositories" 308 | category = "main" 309 | optional = false 310 | python-versions = ">=3.7" 311 | 312 | [package.dependencies] 313 | gitdb = ">=4.0.1,<5" 314 | typing-extensions = {version = ">=3.7.4.3", markers = "python_version < \"3.8\""} 315 | 316 | [[package]] 317 | name = "idna" 318 | version = "2.10" 319 | description = "Internationalized Domain Names in Applications (IDNA)" 320 | category = "main" 321 | optional = false 322 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 323 | 324 | [[package]] 325 | name = "importlib-metadata" 326 | version = "4.5.0" 327 | description = "Read metadata from Python packages" 328 | category = "main" 329 | optional = false 330 | python-versions = ">=3.6" 331 | 332 | [package.dependencies] 333 | typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} 334 | zipp = ">=0.5" 335 | 336 | [package.extras] 337 | docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] 338 | testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] 339 | 340 | [[package]] 341 | name = "ipykernel" 342 | version = "5.5.5" 343 | description = "IPython Kernel for Jupyter" 344 | category = "main" 345 | optional = false 346 | python-versions = ">=3.5" 347 | 348 | [package.dependencies] 349 | appnope = {version = "*", markers = "platform_system == \"Darwin\""} 350 | ipython = ">=5.0.0" 351 | jupyter-client = "*" 352 | tornado = ">=4.2" 353 | traitlets = ">=4.1.0" 354 | 355 | [package.extras] 356 | test = ["pytest (!=5.3.4)", "pytest-cov", "flaky", "nose", "jedi (<=0.17.2)"] 357 | 358 | [[package]] 359 | name = "ipython" 360 | version = "7.25.0" 361 | description = "IPython: Productive Interactive Computing" 362 | category = "main" 363 | optional = false 364 | python-versions = ">=3.7" 365 | 366 | [package.dependencies] 367 | appnope = {version = "*", markers = "sys_platform == \"darwin\""} 368 | backcall = "*" 369 | colorama = {version = "*", markers = "sys_platform == \"win32\""} 370 | decorator = "*" 371 | jedi = ">=0.16" 372 | matplotlib-inline = "*" 373 | pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} 374 | pickleshare = "*" 375 | prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0" 376 | pygments = "*" 377 | traitlets = ">=4.2" 378 | 379 | [package.extras] 380 | all = ["Sphinx (>=1.3)", "ipykernel", "ipyparallel", "ipywidgets", "nbconvert", "nbformat", "nose (>=0.10.1)", "notebook", "numpy (>=1.17)", "pygments", "qtconsole", "requests", "testpath"] 381 | doc = ["Sphinx (>=1.3)"] 382 | kernel = ["ipykernel"] 383 | nbconvert = ["nbconvert"] 384 | nbformat = ["nbformat"] 385 | notebook = ["notebook", "ipywidgets"] 386 | parallel = ["ipyparallel"] 387 | qtconsole = ["qtconsole"] 388 | test = ["nose (>=0.10.1)", "requests", "testpath", "pygments", "nbformat", "ipykernel", "numpy (>=1.17)"] 389 | 390 | [[package]] 391 | name = "ipython-genutils" 392 | version = "0.2.0" 393 | description = "Vestigial utilities from IPython" 394 | category = "main" 395 | optional = false 396 | python-versions = "*" 397 | 398 | [[package]] 399 | name = "ipywidgets" 400 | version = "7.6.3" 401 | description = "IPython HTML widgets for Jupyter" 402 | category = "main" 403 | optional = false 404 | python-versions = "*" 405 | 406 | [package.dependencies] 407 | ipykernel = ">=4.5.1" 408 | ipython = {version = ">=4.0.0", markers = "python_version >= \"3.3\""} 409 | jupyterlab-widgets = {version = ">=1.0.0", markers = "python_version >= \"3.6\""} 410 | nbformat = ">=4.2.0" 411 | traitlets = ">=4.3.1" 412 | widgetsnbextension = ">=3.5.0,<3.6.0" 413 | 414 | [package.extras] 415 | test = ["pytest (>=3.6.0)", "pytest-cov", "mock"] 416 | 417 | [[package]] 418 | name = "jedi" 419 | version = "0.18.0" 420 | description = "An autocompletion tool for Python that can be used for text editors." 421 | category = "main" 422 | optional = false 423 | python-versions = ">=3.6" 424 | 425 | [package.dependencies] 426 | parso = ">=0.8.0,<0.9.0" 427 | 428 | [package.extras] 429 | qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] 430 | testing = ["Django (<3.1)", "colorama", "docopt", "pytest (<6.0.0)"] 431 | 432 | [[package]] 433 | name = "jinja2" 434 | version = "3.0.1" 435 | description = "A very fast and expressive template engine." 436 | category = "main" 437 | optional = false 438 | python-versions = ">=3.6" 439 | 440 | [package.dependencies] 441 | MarkupSafe = ">=2.0" 442 | 443 | [package.extras] 444 | i18n = ["Babel (>=2.7)"] 445 | 446 | [[package]] 447 | name = "joblib" 448 | version = "1.0.1" 449 | description = "Lightweight pipelining with Python functions" 450 | category = "main" 451 | optional = false 452 | python-versions = ">=3.6" 453 | 454 | [[package]] 455 | name = "jsonschema" 456 | version = "3.2.0" 457 | description = "An implementation of JSON Schema validation for Python" 458 | category = "main" 459 | optional = false 460 | python-versions = "*" 461 | 462 | [package.dependencies] 463 | attrs = ">=17.4.0" 464 | importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} 465 | pyrsistent = ">=0.14.0" 466 | six = ">=1.11.0" 467 | 468 | [package.extras] 469 | format = ["idna", "jsonpointer (>1.13)", "rfc3987", "strict-rfc3339", "webcolors"] 470 | format_nongpl = ["idna", "jsonpointer (>1.13)", "webcolors", "rfc3986-validator (>0.1.0)", "rfc3339-validator"] 471 | 472 | [[package]] 473 | name = "jupyter" 474 | version = "1.0.0" 475 | description = "Jupyter metapackage. Install all the Jupyter components in one go." 476 | category = "main" 477 | optional = false 478 | python-versions = "*" 479 | 480 | [package.dependencies] 481 | ipykernel = "*" 482 | ipywidgets = "*" 483 | jupyter-console = "*" 484 | nbconvert = "*" 485 | notebook = "*" 486 | qtconsole = "*" 487 | 488 | [[package]] 489 | name = "jupyter-client" 490 | version = "6.2.0" 491 | description = "Jupyter protocol implementation and client libraries" 492 | category = "main" 493 | optional = false 494 | python-versions = ">=3.6.1" 495 | 496 | [package.dependencies] 497 | jupyter-core = ">=4.6.0" 498 | nest-asyncio = ">=1.5" 499 | python-dateutil = ">=2.1" 500 | pyzmq = ">=13" 501 | tornado = ">=4.1" 502 | traitlets = "*" 503 | 504 | [package.extras] 505 | doc = ["sphinx (>=1.3.6)", "sphinx-rtd-theme", "sphinxcontrib-github-alt"] 506 | test = ["async-generator", "ipykernel", "ipython", "mock", "pytest-asyncio", "pytest-timeout", "pytest", "mypy", "pre-commit", "jedi (<0.18)"] 507 | 508 | [[package]] 509 | name = "jupyter-console" 510 | version = "6.4.0" 511 | description = "Jupyter terminal console" 512 | category = "main" 513 | optional = false 514 | python-versions = ">=3.6" 515 | 516 | [package.dependencies] 517 | ipykernel = "*" 518 | ipython = "*" 519 | jupyter-client = "*" 520 | prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0" 521 | pygments = "*" 522 | 523 | [package.extras] 524 | test = ["pexpect"] 525 | 526 | [[package]] 527 | name = "jupyter-core" 528 | version = "4.7.1" 529 | description = "Jupyter core package. A base package on which Jupyter projects rely." 530 | category = "main" 531 | optional = false 532 | python-versions = ">=3.6" 533 | 534 | [package.dependencies] 535 | pywin32 = {version = ">=1.0", markers = "sys_platform == \"win32\""} 536 | traitlets = "*" 537 | 538 | [[package]] 539 | name = "jupyterlab-pygments" 540 | version = "0.1.2" 541 | description = "Pygments theme using JupyterLab CSS variables" 542 | category = "main" 543 | optional = false 544 | python-versions = "*" 545 | 546 | [package.dependencies] 547 | pygments = ">=2.4.1,<3" 548 | 549 | [[package]] 550 | name = "jupyterlab-widgets" 551 | version = "1.0.0" 552 | description = "A JupyterLab extension." 553 | category = "main" 554 | optional = false 555 | python-versions = ">=3.6" 556 | 557 | [[package]] 558 | name = "kiwisolver" 559 | version = "1.3.1" 560 | description = "A fast implementation of the Cassowary constraint solver" 561 | category = "main" 562 | optional = false 563 | python-versions = ">=3.6" 564 | 565 | [[package]] 566 | name = "markupsafe" 567 | version = "2.0.1" 568 | description = "Safely add untrusted strings to HTML/XML markup." 569 | category = "main" 570 | optional = false 571 | python-versions = ">=3.6" 572 | 573 | [[package]] 574 | name = "matplotlib" 575 | version = "3.4.2" 576 | description = "Python plotting package" 577 | category = "main" 578 | optional = false 579 | python-versions = ">=3.7" 580 | 581 | [package.dependencies] 582 | cycler = ">=0.10" 583 | kiwisolver = ">=1.0.1" 584 | numpy = ">=1.16" 585 | pillow = ">=6.2.0" 586 | pyparsing = ">=2.2.1" 587 | python-dateutil = ">=2.7" 588 | 589 | [[package]] 590 | name = "matplotlib-inline" 591 | version = "0.1.2" 592 | description = "Inline Matplotlib backend for Jupyter" 593 | category = "main" 594 | optional = false 595 | python-versions = ">=3.5" 596 | 597 | [package.dependencies] 598 | traitlets = "*" 599 | 600 | [[package]] 601 | name = "mistune" 602 | version = "0.8.4" 603 | description = "The fastest markdown parser in pure Python" 604 | category = "main" 605 | optional = false 606 | python-versions = "*" 607 | 608 | [[package]] 609 | name = "mnist" 610 | version = "0.2.2" 611 | description = "Python utilities to download and parse the MNIST dataset" 612 | category = "main" 613 | optional = false 614 | python-versions = "*" 615 | 616 | [package.dependencies] 617 | numpy = "*" 618 | 619 | [[package]] 620 | name = "more-itertools" 621 | version = "8.8.0" 622 | description = "More routines for operating on iterables, beyond itertools" 623 | category = "dev" 624 | optional = false 625 | python-versions = ">=3.5" 626 | 627 | [[package]] 628 | name = "nbclient" 629 | version = "0.5.3" 630 | description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." 631 | category = "main" 632 | optional = false 633 | python-versions = ">=3.6.1" 634 | 635 | [package.dependencies] 636 | async-generator = "*" 637 | jupyter-client = ">=6.1.5" 638 | nbformat = ">=5.0" 639 | nest-asyncio = "*" 640 | traitlets = ">=4.2" 641 | 642 | [package.extras] 643 | dev = ["codecov", "coverage", "ipython", "ipykernel", "ipywidgets", "pytest (>=4.1)", "pytest-cov (>=2.6.1)", "check-manifest", "flake8", "mypy", "tox", "bumpversion", "xmltodict", "pip (>=18.1)", "wheel (>=0.31.0)", "setuptools (>=38.6.0)", "twine (>=1.11.0)", "black"] 644 | sphinx = ["Sphinx (>=1.7)", "sphinx-book-theme", "mock", "moto", "myst-parser"] 645 | test = ["codecov", "coverage", "ipython", "ipykernel", "ipywidgets", "pytest (>=4.1)", "pytest-cov (>=2.6.1)", "check-manifest", "flake8", "mypy", "tox", "bumpversion", "xmltodict", "pip (>=18.1)", "wheel (>=0.31.0)", "setuptools (>=38.6.0)", "twine (>=1.11.0)", "black"] 646 | 647 | [[package]] 648 | name = "nbconvert" 649 | version = "6.1.0" 650 | description = "Converting Jupyter Notebooks" 651 | category = "main" 652 | optional = false 653 | python-versions = ">=3.7" 654 | 655 | [package.dependencies] 656 | bleach = "*" 657 | defusedxml = "*" 658 | entrypoints = ">=0.2.2" 659 | jinja2 = ">=2.4" 660 | jupyter-core = "*" 661 | jupyterlab-pygments = "*" 662 | mistune = ">=0.8.1,<2" 663 | nbclient = ">=0.5.0,<0.6.0" 664 | nbformat = ">=4.4" 665 | pandocfilters = ">=1.4.1" 666 | pygments = ">=2.4.1" 667 | testpath = "*" 668 | traitlets = ">=5.0" 669 | 670 | [package.extras] 671 | all = ["pytest", "pytest-cov", "pytest-dependency", "ipykernel", "ipywidgets (>=7)", "pyppeteer (==0.2.2)", "tornado (>=4.0)", "sphinx (>=1.5.1)", "sphinx-rtd-theme", "nbsphinx (>=0.2.12)", "ipython"] 672 | docs = ["sphinx (>=1.5.1)", "sphinx-rtd-theme", "nbsphinx (>=0.2.12)", "ipython"] 673 | serve = ["tornado (>=4.0)"] 674 | test = ["pytest", "pytest-cov", "pytest-dependency", "ipykernel", "ipywidgets (>=7)", "pyppeteer (==0.2.2)"] 675 | webpdf = ["pyppeteer (==0.2.2)"] 676 | 677 | [[package]] 678 | name = "nbformat" 679 | version = "5.1.3" 680 | description = "The Jupyter Notebook format" 681 | category = "main" 682 | optional = false 683 | python-versions = ">=3.5" 684 | 685 | [package.dependencies] 686 | ipython-genutils = "*" 687 | jsonschema = ">=2.4,<2.5.0 || >2.5.0" 688 | jupyter-core = "*" 689 | traitlets = ">=4.1" 690 | 691 | [package.extras] 692 | fast = ["fastjsonschema"] 693 | test = ["check-manifest", "fastjsonschema", "testpath", "pytest", "pytest-cov"] 694 | 695 | [[package]] 696 | name = "nest-asyncio" 697 | version = "1.5.1" 698 | description = "Patch asyncio to allow nested event loops" 699 | category = "main" 700 | optional = false 701 | python-versions = ">=3.5" 702 | 703 | [[package]] 704 | name = "nose" 705 | version = "1.3.7" 706 | description = "nose extends unittest to make testing easier" 707 | category = "main" 708 | optional = false 709 | python-versions = "*" 710 | 711 | [[package]] 712 | name = "notebook" 713 | version = "6.4.0" 714 | description = "A web-based notebook environment for interactive computing" 715 | category = "main" 716 | optional = false 717 | python-versions = ">=3.6" 718 | 719 | [package.dependencies] 720 | argon2-cffi = "*" 721 | ipykernel = "*" 722 | ipython-genutils = "*" 723 | jinja2 = "*" 724 | jupyter-client = ">=5.3.4" 725 | jupyter-core = ">=4.6.1" 726 | nbconvert = "*" 727 | nbformat = "*" 728 | prometheus-client = "*" 729 | pyzmq = ">=17" 730 | Send2Trash = ">=1.5.0" 731 | terminado = ">=0.8.3" 732 | tornado = ">=6.1" 733 | traitlets = ">=4.2.1" 734 | 735 | [package.extras] 736 | docs = ["sphinx", "nbsphinx", "sphinxcontrib-github-alt", "sphinx-rtd-theme", "myst-parser"] 737 | json-logging = ["json-logging"] 738 | test = ["pytest", "coverage", "requests", "nbval", "selenium", "pytest-cov", "requests-unixsocket"] 739 | 740 | [[package]] 741 | name = "numpy" 742 | version = "1.21.0" 743 | description = "NumPy is the fundamental package for array computing with Python." 744 | category = "main" 745 | optional = false 746 | python-versions = ">=3.7" 747 | 748 | [[package]] 749 | name = "packaging" 750 | version = "20.9" 751 | description = "Core utilities for Python packages" 752 | category = "main" 753 | optional = false 754 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 755 | 756 | [package.dependencies] 757 | pyparsing = ">=2.0.2" 758 | 759 | [[package]] 760 | name = "pandas" 761 | version = "1.1.5" 762 | description = "Powerful data structures for data analysis, time series, and statistics" 763 | category = "main" 764 | optional = false 765 | python-versions = ">=3.6.1" 766 | 767 | [package.dependencies] 768 | numpy = ">=1.15.4" 769 | python-dateutil = ">=2.7.3" 770 | pytz = ">=2017.2" 771 | 772 | [package.extras] 773 | test = ["pytest (>=4.0.2)", "pytest-xdist", "hypothesis (>=3.58)"] 774 | 775 | [[package]] 776 | name = "pandocfilters" 777 | version = "1.4.3" 778 | description = "Utilities for writing pandoc filters in python" 779 | category = "main" 780 | optional = false 781 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 782 | 783 | [[package]] 784 | name = "parso" 785 | version = "0.8.2" 786 | description = "A Python Parser" 787 | category = "main" 788 | optional = false 789 | python-versions = ">=3.6" 790 | 791 | [package.extras] 792 | qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] 793 | testing = ["docopt", "pytest (<6.0.0)"] 794 | 795 | [[package]] 796 | name = "pexpect" 797 | version = "4.8.0" 798 | description = "Pexpect allows easy control of interactive console applications." 799 | category = "main" 800 | optional = false 801 | python-versions = "*" 802 | 803 | [package.dependencies] 804 | ptyprocess = ">=0.5" 805 | 806 | [[package]] 807 | name = "pickleshare" 808 | version = "0.7.5" 809 | description = "Tiny 'shelve'-like database with concurrency support" 810 | category = "main" 811 | optional = false 812 | python-versions = "*" 813 | 814 | [[package]] 815 | name = "pillow" 816 | version = "8.2.0" 817 | description = "Python Imaging Library (Fork)" 818 | category = "main" 819 | optional = false 820 | python-versions = ">=3.6" 821 | 822 | [[package]] 823 | name = "pluggy" 824 | version = "0.13.1" 825 | description = "plugin and hook calling mechanisms for python" 826 | category = "dev" 827 | optional = false 828 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 829 | 830 | [package.dependencies] 831 | importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} 832 | 833 | [package.extras] 834 | dev = ["pre-commit", "tox"] 835 | 836 | [[package]] 837 | name = "prometheus-client" 838 | version = "0.11.0" 839 | description = "Python client for the Prometheus monitoring system." 840 | category = "main" 841 | optional = false 842 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 843 | 844 | [package.extras] 845 | twisted = ["twisted"] 846 | 847 | [[package]] 848 | name = "prompt-toolkit" 849 | version = "3.0.19" 850 | description = "Library for building powerful interactive command lines in Python" 851 | category = "main" 852 | optional = false 853 | python-versions = ">=3.6.1" 854 | 855 | [package.dependencies] 856 | wcwidth = "*" 857 | 858 | [[package]] 859 | name = "protobuf" 860 | version = "3.19.4" 861 | description = "Protocol Buffers" 862 | category = "main" 863 | optional = false 864 | python-versions = ">=3.5" 865 | 866 | [[package]] 867 | name = "ptyprocess" 868 | version = "0.7.0" 869 | description = "Run a subprocess in a pseudo terminal" 870 | category = "main" 871 | optional = false 872 | python-versions = "*" 873 | 874 | [[package]] 875 | name = "py" 876 | version = "1.10.0" 877 | description = "library with cross-python path, ini-parsing, io, code, log facilities" 878 | category = "main" 879 | optional = false 880 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 881 | 882 | [[package]] 883 | name = "pyarrow" 884 | version = "7.0.0" 885 | description = "Python library for Apache Arrow" 886 | category = "main" 887 | optional = false 888 | python-versions = ">=3.7" 889 | 890 | [package.dependencies] 891 | numpy = ">=1.16.6" 892 | 893 | [[package]] 894 | name = "pycodestyle" 895 | version = "2.7.0" 896 | description = "Python style guide checker" 897 | category = "main" 898 | optional = false 899 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 900 | 901 | [[package]] 902 | name = "pycparser" 903 | version = "2.20" 904 | description = "C parser in Python" 905 | category = "main" 906 | optional = false 907 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 908 | 909 | [[package]] 910 | name = "pydeck" 911 | version = "0.7.1" 912 | description = "Widget for deck.gl maps" 913 | category = "main" 914 | optional = false 915 | python-versions = ">=3.7" 916 | 917 | [package.dependencies] 918 | ipykernel = {version = ">=5.1.2", markers = "python_version >= \"3.4\""} 919 | ipywidgets = ">=7.0.0" 920 | jinja2 = ">=2.10.1" 921 | numpy = ">=1.16.4" 922 | traitlets = ">=4.3.2" 923 | 924 | [package.extras] 925 | testing = ["pytest"] 926 | 927 | [[package]] 928 | name = "pygments" 929 | version = "2.9.0" 930 | description = "Pygments is a syntax highlighting package written in Python." 931 | category = "main" 932 | optional = false 933 | python-versions = ">=3.5" 934 | 935 | [[package]] 936 | name = "pympler" 937 | version = "1.0.1" 938 | description = "A development tool to measure, monitor and analyze the memory behavior of Python objects." 939 | category = "main" 940 | optional = false 941 | python-versions = ">=3.6" 942 | 943 | [[package]] 944 | name = "pyparsing" 945 | version = "2.4.7" 946 | description = "Python parsing module" 947 | category = "main" 948 | optional = false 949 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" 950 | 951 | [[package]] 952 | name = "pyrsistent" 953 | version = "0.17.3" 954 | description = "Persistent/Functional/Immutable data structures" 955 | category = "main" 956 | optional = false 957 | python-versions = ">=3.5" 958 | 959 | [[package]] 960 | name = "pytest" 961 | version = "5.4.3" 962 | description = "pytest: simple powerful testing with Python" 963 | category = "dev" 964 | optional = false 965 | python-versions = ">=3.5" 966 | 967 | [package.dependencies] 968 | atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} 969 | attrs = ">=17.4.0" 970 | colorama = {version = "*", markers = "sys_platform == \"win32\""} 971 | importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} 972 | more-itertools = ">=4.0.0" 973 | packaging = "*" 974 | pluggy = ">=0.12,<1.0" 975 | py = ">=1.5.0" 976 | wcwidth = "*" 977 | 978 | [package.extras] 979 | checkqa-mypy = ["mypy (==v0.761)"] 980 | testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] 981 | 982 | [[package]] 983 | name = "python-dateutil" 984 | version = "2.8.1" 985 | description = "Extensions to the standard Python datetime module" 986 | category = "main" 987 | optional = false 988 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" 989 | 990 | [package.dependencies] 991 | six = ">=1.5" 992 | 993 | [[package]] 994 | name = "pytz" 995 | version = "2021.3" 996 | description = "World timezone definitions, modern and historical" 997 | category = "main" 998 | optional = false 999 | python-versions = "*" 1000 | 1001 | [[package]] 1002 | name = "pytz-deprecation-shim" 1003 | version = "0.1.0.post0" 1004 | description = "Shims to make deprecation of pytz easier" 1005 | category = "main" 1006 | optional = false 1007 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" 1008 | 1009 | [package.dependencies] 1010 | "backports.zoneinfo" = {version = "*", markers = "python_version >= \"3.6\" and python_version < \"3.9\""} 1011 | tzdata = {version = "*", markers = "python_version >= \"3.6\""} 1012 | 1013 | [[package]] 1014 | name = "pywin32" 1015 | version = "301" 1016 | description = "Python for Window Extensions" 1017 | category = "main" 1018 | optional = false 1019 | python-versions = "*" 1020 | 1021 | [[package]] 1022 | name = "pywinpty" 1023 | version = "1.1.3" 1024 | description = "Pseudo terminal support for Windows from Python." 1025 | category = "main" 1026 | optional = false 1027 | python-versions = ">=3.6" 1028 | 1029 | [[package]] 1030 | name = "pyzmq" 1031 | version = "22.1.0" 1032 | description = "Python bindings for 0MQ" 1033 | category = "main" 1034 | optional = false 1035 | python-versions = ">=3.6" 1036 | 1037 | [package.dependencies] 1038 | cffi = {version = "*", markers = "implementation_name == \"pypy\""} 1039 | py = {version = "*", markers = "implementation_name == \"pypy\""} 1040 | 1041 | [[package]] 1042 | name = "qtconsole" 1043 | version = "5.1.0" 1044 | description = "Jupyter Qt console" 1045 | category = "main" 1046 | optional = false 1047 | python-versions = ">= 3.6" 1048 | 1049 | [package.dependencies] 1050 | ipykernel = ">=4.1" 1051 | ipython-genutils = "*" 1052 | jupyter-client = ">=4.1" 1053 | jupyter-core = "*" 1054 | pygments = "*" 1055 | pyzmq = ">=17.1" 1056 | qtpy = "*" 1057 | traitlets = "*" 1058 | 1059 | [package.extras] 1060 | doc = ["Sphinx (>=1.3)"] 1061 | test = ["flaky", "pytest", "pytest-qt"] 1062 | 1063 | [[package]] 1064 | name = "qtpy" 1065 | version = "1.9.0" 1066 | description = "Provides an abstraction layer on top of the various Qt bindings (PyQt5, PyQt4 and PySide) and additional custom QWidgets." 1067 | category = "main" 1068 | optional = false 1069 | python-versions = "*" 1070 | 1071 | [[package]] 1072 | name = "requests" 1073 | version = "2.25.1" 1074 | description = "Python HTTP for Humans." 1075 | category = "main" 1076 | optional = false 1077 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 1078 | 1079 | [package.dependencies] 1080 | certifi = ">=2017.4.17" 1081 | chardet = ">=3.0.2,<5" 1082 | idna = ">=2.5,<3" 1083 | urllib3 = ">=1.21.1,<1.27" 1084 | 1085 | [package.extras] 1086 | security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] 1087 | socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] 1088 | 1089 | [[package]] 1090 | name = "scipy" 1091 | version = "1.6.1" 1092 | description = "SciPy: Scientific Library for Python" 1093 | category = "main" 1094 | optional = false 1095 | python-versions = ">=3.7" 1096 | 1097 | [package.dependencies] 1098 | numpy = ">=1.16.5" 1099 | 1100 | [[package]] 1101 | name = "send2trash" 1102 | version = "1.7.1" 1103 | description = "Send file to trash natively under Mac OS X, Windows and Linux." 1104 | category = "main" 1105 | optional = false 1106 | python-versions = "*" 1107 | 1108 | [package.extras] 1109 | win32 = ["pywin32"] 1110 | 1111 | [[package]] 1112 | name = "six" 1113 | version = "1.16.0" 1114 | description = "Python 2 and 3 compatibility utilities" 1115 | category = "main" 1116 | optional = false 1117 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" 1118 | 1119 | [[package]] 1120 | name = "smmap" 1121 | version = "5.0.0" 1122 | description = "A pure Python implementation of a sliding window memory map manager" 1123 | category = "main" 1124 | optional = false 1125 | python-versions = ">=3.6" 1126 | 1127 | [[package]] 1128 | name = "streamlit" 1129 | version = "1.5.1" 1130 | description = "The fastest way to build data apps in Python" 1131 | category = "main" 1132 | optional = false 1133 | python-versions = ">=3.6" 1134 | 1135 | [package.dependencies] 1136 | altair = ">=3.2.0" 1137 | astor = "*" 1138 | attrs = "*" 1139 | base58 = "*" 1140 | blinker = "*" 1141 | cachetools = ">=4.0" 1142 | click = ">=7.0" 1143 | gitpython = "!=3.1.19" 1144 | numpy = "*" 1145 | packaging = "*" 1146 | pandas = ">=0.21.0" 1147 | pillow = ">=6.2.0" 1148 | protobuf = ">=3.6.0,<3.11 || >3.11" 1149 | pyarrow = "*" 1150 | pydeck = ">=0.1.dev5" 1151 | pympler = ">=0.9" 1152 | python-dateutil = "*" 1153 | requests = "*" 1154 | toml = "*" 1155 | tornado = ">=5.0" 1156 | typing-extensions = {version = "*", markers = "python_version < \"3.8\""} 1157 | tzlocal = "*" 1158 | validators = "*" 1159 | watchdog = {version = "*", markers = "platform_system != \"Darwin\""} 1160 | 1161 | [[package]] 1162 | name = "tensorflow-probability" 1163 | version = "0.13.0" 1164 | description = "Probabilistic modeling and statistical inference in TensorFlow" 1165 | category = "main" 1166 | optional = false 1167 | python-versions = "*" 1168 | 1169 | [package.dependencies] 1170 | cloudpickle = ">=1.3" 1171 | decorator = "*" 1172 | dm-tree = "*" 1173 | gast = ">=0.3.2" 1174 | numpy = ">=1.13.3" 1175 | six = ">=1.10.0" 1176 | 1177 | [package.extras] 1178 | jax = ["jax", "jaxlib"] 1179 | tfds = ["tensorflow-datasets (>=2.2.0)"] 1180 | 1181 | [[package]] 1182 | name = "terminado" 1183 | version = "0.10.1" 1184 | description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." 1185 | category = "main" 1186 | optional = false 1187 | python-versions = ">=3.6" 1188 | 1189 | [package.dependencies] 1190 | ptyprocess = {version = "*", markers = "os_name != \"nt\""} 1191 | pywinpty = {version = ">=1.1.0", markers = "os_name == \"nt\""} 1192 | tornado = ">=4" 1193 | 1194 | [package.extras] 1195 | test = ["pytest"] 1196 | 1197 | [[package]] 1198 | name = "testpath" 1199 | version = "0.5.0" 1200 | description = "Test utilities for code working with files and commands" 1201 | category = "main" 1202 | optional = false 1203 | python-versions = ">= 3.5" 1204 | 1205 | [package.extras] 1206 | test = ["pytest", "pathlib2"] 1207 | 1208 | [[package]] 1209 | name = "toml" 1210 | version = "0.10.2" 1211 | description = "Python Library for Tom's Obvious, Minimal Language" 1212 | category = "main" 1213 | optional = false 1214 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" 1215 | 1216 | [[package]] 1217 | name = "toolz" 1218 | version = "0.11.2" 1219 | description = "List processing tools and functional utilities" 1220 | category = "main" 1221 | optional = false 1222 | python-versions = ">=3.5" 1223 | 1224 | [[package]] 1225 | name = "torch" 1226 | version = "1.9.0" 1227 | description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" 1228 | category = "main" 1229 | optional = false 1230 | python-versions = ">=3.6.2" 1231 | 1232 | [package.dependencies] 1233 | typing-extensions = "*" 1234 | 1235 | [[package]] 1236 | name = "torchvision" 1237 | version = "0.10.0" 1238 | description = "image and video datasets and models for torch deep learning" 1239 | category = "main" 1240 | optional = false 1241 | python-versions = "*" 1242 | 1243 | [package.dependencies] 1244 | numpy = "*" 1245 | pillow = ">=5.3.0" 1246 | torch = "1.9.0" 1247 | 1248 | [package.extras] 1249 | scipy = ["scipy"] 1250 | 1251 | [[package]] 1252 | name = "tornado" 1253 | version = "6.1" 1254 | description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." 1255 | category = "main" 1256 | optional = false 1257 | python-versions = ">= 3.5" 1258 | 1259 | [[package]] 1260 | name = "traitlets" 1261 | version = "5.0.5" 1262 | description = "Traitlets Python configuration system" 1263 | category = "main" 1264 | optional = false 1265 | python-versions = ">=3.7" 1266 | 1267 | [package.dependencies] 1268 | ipython-genutils = "*" 1269 | 1270 | [package.extras] 1271 | test = ["pytest"] 1272 | 1273 | [[package]] 1274 | name = "typing-extensions" 1275 | version = "3.10.0.0" 1276 | description = "Backported and Experimental Type Hints for Python 3.5+" 1277 | category = "main" 1278 | optional = false 1279 | python-versions = "*" 1280 | 1281 | [[package]] 1282 | name = "tzdata" 1283 | version = "2021.5" 1284 | description = "Provider of IANA time zone data" 1285 | category = "main" 1286 | optional = false 1287 | python-versions = ">=2" 1288 | 1289 | [[package]] 1290 | name = "tzlocal" 1291 | version = "4.1" 1292 | description = "tzinfo object for the local timezone" 1293 | category = "main" 1294 | optional = false 1295 | python-versions = ">=3.6" 1296 | 1297 | [package.dependencies] 1298 | "backports.zoneinfo" = {version = "*", markers = "python_version < \"3.9\""} 1299 | pytz-deprecation-shim = "*" 1300 | tzdata = {version = "*", markers = "platform_system == \"Windows\""} 1301 | 1302 | [package.extras] 1303 | devenv = ["black", "pyroma", "pytest-cov", "zest.releaser"] 1304 | test = ["pytest-mock (>=3.3)", "pytest (>=4.3)"] 1305 | 1306 | [[package]] 1307 | name = "urllib3" 1308 | version = "1.26.6" 1309 | description = "HTTP library with thread-safe connection pooling, file post, and more." 1310 | category = "main" 1311 | optional = false 1312 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" 1313 | 1314 | [package.extras] 1315 | brotli = ["brotlipy (>=0.6.0)"] 1316 | secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] 1317 | socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] 1318 | 1319 | [[package]] 1320 | name = "validators" 1321 | version = "0.18.2" 1322 | description = "Python Data Validation for Humans™." 1323 | category = "main" 1324 | optional = false 1325 | python-versions = ">=3.4" 1326 | 1327 | [package.dependencies] 1328 | decorator = ">=3.4.0" 1329 | six = ">=1.4.0" 1330 | 1331 | [package.extras] 1332 | test = ["pytest (>=2.2.3)", "flake8 (>=2.4.0)", "isort (>=4.2.2)"] 1333 | 1334 | [[package]] 1335 | name = "watchdog" 1336 | version = "2.1.6" 1337 | description = "Filesystem events monitoring" 1338 | category = "main" 1339 | optional = false 1340 | python-versions = ">=3.6" 1341 | 1342 | [package.extras] 1343 | watchmedo = ["PyYAML (>=3.10)"] 1344 | 1345 | [[package]] 1346 | name = "wcwidth" 1347 | version = "0.2.5" 1348 | description = "Measures the displayed width of unicode strings in a terminal" 1349 | category = "main" 1350 | optional = false 1351 | python-versions = "*" 1352 | 1353 | [[package]] 1354 | name = "webencodings" 1355 | version = "0.5.1" 1356 | description = "Character encoding aliases for legacy web content" 1357 | category = "main" 1358 | optional = false 1359 | python-versions = "*" 1360 | 1361 | [[package]] 1362 | name = "widgetsnbextension" 1363 | version = "3.5.1" 1364 | description = "IPython HTML widgets for Jupyter" 1365 | category = "main" 1366 | optional = false 1367 | python-versions = "*" 1368 | 1369 | [package.dependencies] 1370 | notebook = ">=4.4.1" 1371 | 1372 | [[package]] 1373 | name = "zipp" 1374 | version = "3.4.1" 1375 | description = "Backport of pathlib-compatible object wrapper for zip files" 1376 | category = "main" 1377 | optional = false 1378 | python-versions = ">=3.6" 1379 | 1380 | [package.extras] 1381 | docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] 1382 | testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] 1383 | 1384 | [metadata] 1385 | lock-version = "1.1" 1386 | python-versions = "^3.7" 1387 | content-hash = "f8477cbda9f0a2d8b5da4781c7cc6f6861cd56f8875ef6be5a2e3792a8df316c" 1388 | 1389 | [metadata.files] 1390 | absl-py = [ 1391 | {file = "absl-py-0.13.0.tar.gz", hash = "sha256:6953272383486044699fd0e9f00aad167a27e08ce19aae66c6c4b10e7e767793"}, 1392 | {file = "absl_py-0.13.0-py3-none-any.whl", hash = "sha256:62bd4e248ddb19d81aec8f9446b407ff37c8175c2ba88266a7afa9b4ce4a333b"}, 1393 | ] 1394 | altair = [ 1395 | {file = "altair-4.2.0-py3-none-any.whl", hash = "sha256:0c724848ae53410c13fa28be2b3b9a9dcb7b5caa1a70f7f217bd663bb419935a"}, 1396 | {file = "altair-4.2.0.tar.gz", hash = "sha256:d87d9372e63b48cd96b2a6415f0cf9457f50162ab79dc7a31cd7e024dd840026"}, 1397 | ] 1398 | appnope = [ 1399 | {file = "appnope-0.1.2-py2.py3-none-any.whl", hash = "sha256:93aa393e9d6c54c5cd570ccadd8edad61ea0c4b9ea7a01409020c9aa019eb442"}, 1400 | {file = "appnope-0.1.2.tar.gz", hash = "sha256:dd83cd4b5b460958838f6eb3000c660b1f9caf2a5b1de4264e941512f603258a"}, 1401 | ] 1402 | argon2-cffi = [ 1403 | {file = "argon2-cffi-20.1.0.tar.gz", hash = "sha256:d8029b2d3e4b4cea770e9e5a0104dd8fa185c1724a0f01528ae4826a6d25f97d"}, 1404 | {file = "argon2_cffi-20.1.0-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:6ea92c980586931a816d61e4faf6c192b4abce89aa767ff6581e6ddc985ed003"}, 1405 | {file = "argon2_cffi-20.1.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:05a8ac07c7026542377e38389638a8a1e9b78f1cd8439cd7493b39f08dd75fbf"}, 1406 | {file = "argon2_cffi-20.1.0-cp27-cp27m-win32.whl", hash = "sha256:0bf066bc049332489bb2d75f69216416329d9dc65deee127152caeb16e5ce7d5"}, 1407 | {file = "argon2_cffi-20.1.0-cp27-cp27m-win_amd64.whl", hash = "sha256:57358570592c46c420300ec94f2ff3b32cbccd10d38bdc12dc6979c4a8484fbc"}, 1408 | {file = "argon2_cffi-20.1.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:7d455c802727710e9dfa69b74ccaab04568386ca17b0ad36350b622cd34606fe"}, 1409 | {file = "argon2_cffi-20.1.0-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:b160416adc0f012fb1f12588a5e6954889510f82f698e23ed4f4fa57f12a0647"}, 1410 | {file = "argon2_cffi-20.1.0-cp35-cp35m-win32.whl", hash = "sha256:9bee3212ba4f560af397b6d7146848c32a800652301843df06b9e8f68f0f7361"}, 1411 | {file = "argon2_cffi-20.1.0-cp35-cp35m-win_amd64.whl", hash = "sha256:392c3c2ef91d12da510cfb6f9bae52512a4552573a9e27600bdb800e05905d2b"}, 1412 | {file = "argon2_cffi-20.1.0-cp36-cp36m-win32.whl", hash = "sha256:ba7209b608945b889457f949cc04c8e762bed4fe3fec88ae9a6b7765ae82e496"}, 1413 | {file = "argon2_cffi-20.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:da7f0445b71db6d3a72462e04f36544b0de871289b0bc8a7cc87c0f5ec7079fa"}, 1414 | {file = "argon2_cffi-20.1.0-cp37-abi3-macosx_10_6_intel.whl", hash = "sha256:cc0e028b209a5483b6846053d5fd7165f460a1f14774d79e632e75e7ae64b82b"}, 1415 | {file = "argon2_cffi-20.1.0-cp37-cp37m-win32.whl", hash = "sha256:18dee20e25e4be86680b178b35ccfc5d495ebd5792cd00781548d50880fee5c5"}, 1416 | {file = "argon2_cffi-20.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:6678bb047373f52bcff02db8afab0d2a77d83bde61cfecea7c5c62e2335cb203"}, 1417 | {file = "argon2_cffi-20.1.0-cp38-cp38-win32.whl", hash = "sha256:77e909cc756ef81d6abb60524d259d959bab384832f0c651ed7dcb6e5ccdbb78"}, 1418 | {file = "argon2_cffi-20.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:9dfd5197852530294ecb5795c97a823839258dfd5eb9420233c7cfedec2058f2"}, 1419 | ] 1420 | astor = [ 1421 | {file = "astor-0.8.1-py2.py3-none-any.whl", hash = "sha256:070a54e890cefb5b3739d19f30f5a5ec840ffc9c50ffa7d23cc9fc1a38ebbfc5"}, 1422 | {file = "astor-0.8.1.tar.gz", hash = "sha256:6a6effda93f4e1ce9f618779b2dd1d9d84f1e32812c23a29b3fff6fd7f63fa5e"}, 1423 | ] 1424 | async-generator = [ 1425 | {file = "async_generator-1.10-py3-none-any.whl", hash = "sha256:01c7bf666359b4967d2cda0000cc2e4af16a0ae098cbffcb8472fb9e8ad6585b"}, 1426 | {file = "async_generator-1.10.tar.gz", hash = "sha256:6ebb3d106c12920aaae42ccb6f787ef5eefdcdd166ea3d628fa8476abe712144"}, 1427 | ] 1428 | atomicwrites = [ 1429 | {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, 1430 | {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, 1431 | ] 1432 | attrs = [ 1433 | {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"}, 1434 | {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"}, 1435 | ] 1436 | backcall = [ 1437 | {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, 1438 | {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, 1439 | ] 1440 | "backports.zoneinfo" = [ 1441 | {file = "backports.zoneinfo-0.2.1-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:da6013fd84a690242c310d77ddb8441a559e9cb3d3d59ebac9aca1a57b2e18bc"}, 1442 | {file = "backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:89a48c0d158a3cc3f654da4c2de1ceba85263fafb861b98b59040a5086259722"}, 1443 | {file = "backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:1c5742112073a563c81f786e77514969acb58649bcdf6cdf0b4ed31a348d4546"}, 1444 | {file = "backports.zoneinfo-0.2.1-cp36-cp36m-win32.whl", hash = "sha256:e8236383a20872c0cdf5a62b554b27538db7fa1bbec52429d8d106effbaeca08"}, 1445 | {file = "backports.zoneinfo-0.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:8439c030a11780786a2002261569bdf362264f605dfa4d65090b64b05c9f79a7"}, 1446 | {file = "backports.zoneinfo-0.2.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:f04e857b59d9d1ccc39ce2da1021d196e47234873820cbeaad210724b1ee28ac"}, 1447 | {file = "backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:17746bd546106fa389c51dbea67c8b7c8f0d14b5526a579ca6ccf5ed72c526cf"}, 1448 | {file = "backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5c144945a7752ca544b4b78c8c41544cdfaf9786f25fe5ffb10e838e19a27570"}, 1449 | {file = "backports.zoneinfo-0.2.1-cp37-cp37m-win32.whl", hash = "sha256:e55b384612d93be96506932a786bbcde5a2db7a9e6a4bb4bffe8b733f5b9036b"}, 1450 | {file = "backports.zoneinfo-0.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a76b38c52400b762e48131494ba26be363491ac4f9a04c1b7e92483d169f6582"}, 1451 | {file = "backports.zoneinfo-0.2.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:8961c0f32cd0336fb8e8ead11a1f8cd99ec07145ec2931122faaac1c8f7fd987"}, 1452 | {file = "backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e81b76cace8eda1fca50e345242ba977f9be6ae3945af8d46326d776b4cf78d1"}, 1453 | {file = "backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7b0a64cda4145548fed9efc10322770f929b944ce5cee6c0dfe0c87bf4c0c8c9"}, 1454 | {file = "backports.zoneinfo-0.2.1-cp38-cp38-win32.whl", hash = "sha256:1b13e654a55cd45672cb54ed12148cd33628f672548f373963b0bff67b217328"}, 1455 | {file = "backports.zoneinfo-0.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:4a0f800587060bf8880f954dbef70de6c11bbe59c673c3d818921f042f9954a6"}, 1456 | {file = "backports.zoneinfo-0.2.1.tar.gz", hash = "sha256:fadbfe37f74051d024037f223b8e001611eac868b5c5b06144ef4d8b799862f2"}, 1457 | ] 1458 | base58 = [ 1459 | {file = "base58-2.1.1-py3-none-any.whl", hash = "sha256:11a36f4d3ce51dfc1043f3218591ac4eb1ceb172919cebe05b52a5bcc8d245c2"}, 1460 | {file = "base58-2.1.1.tar.gz", hash = "sha256:c5d0cb3f5b6e81e8e35da5754388ddcc6d0d14b6c6a132cb93d69ed580a7278c"}, 1461 | ] 1462 | bleach = [ 1463 | {file = "bleach-3.3.0-py2.py3-none-any.whl", hash = "sha256:6123ddc1052673e52bab52cdc955bcb57a015264a1c57d37bea2f6b817af0125"}, 1464 | {file = "bleach-3.3.0.tar.gz", hash = "sha256:98b3170739e5e83dd9dc19633f074727ad848cbedb6026708c8ac2d3b697a433"}, 1465 | ] 1466 | blinker = [ 1467 | {file = "blinker-1.4.tar.gz", hash = "sha256:471aee25f3992bd325afa3772f1063dbdbbca947a041b8b89466dc00d606f8b6"}, 1468 | ] 1469 | cachetools = [ 1470 | {file = "cachetools-5.0.0-py3-none-any.whl", hash = "sha256:8fecd4203a38af17928be7b90689d8083603073622229ca7077b72d8e5a976e4"}, 1471 | {file = "cachetools-5.0.0.tar.gz", hash = "sha256:486471dfa8799eb7ec503a8059e263db000cdda20075ce5e48903087f79d5fd6"}, 1472 | ] 1473 | certifi = [ 1474 | {file = "certifi-2021.5.30-py2.py3-none-any.whl", hash = "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8"}, 1475 | {file = "certifi-2021.5.30.tar.gz", hash = "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee"}, 1476 | ] 1477 | cffi = [ 1478 | {file = "cffi-1.14.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:bb89f306e5da99f4d922728ddcd6f7fcebb3241fc40edebcb7284d7514741991"}, 1479 | {file = "cffi-1.14.5-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:34eff4b97f3d982fb93e2831e6750127d1355a923ebaeeb565407b3d2f8d41a1"}, 1480 | {file = "cffi-1.14.5-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:99cd03ae7988a93dd00bcd9d0b75e1f6c426063d6f03d2f90b89e29b25b82dfa"}, 1481 | {file = "cffi-1.14.5-cp27-cp27m-win32.whl", hash = "sha256:65fa59693c62cf06e45ddbb822165394a288edce9e276647f0046e1ec26920f3"}, 1482 | {file = "cffi-1.14.5-cp27-cp27m-win_amd64.whl", hash = "sha256:51182f8927c5af975fece87b1b369f722c570fe169f9880764b1ee3bca8347b5"}, 1483 | {file = "cffi-1.14.5-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:43e0b9d9e2c9e5d152946b9c5fe062c151614b262fda2e7b201204de0b99e482"}, 1484 | {file = "cffi-1.14.5-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:cbde590d4faaa07c72bf979734738f328d239913ba3e043b1e98fe9a39f8b2b6"}, 1485 | {file = "cffi-1.14.5-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:5de7970188bb46b7bf9858eb6890aad302577a5f6f75091fd7cdd3ef13ef3045"}, 1486 | {file = "cffi-1.14.5-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:a465da611f6fa124963b91bf432d960a555563efe4ed1cc403ba5077b15370aa"}, 1487 | {file = "cffi-1.14.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:d42b11d692e11b6634f7613ad8df5d6d5f8875f5d48939520d351007b3c13406"}, 1488 | {file = "cffi-1.14.5-cp35-cp35m-win32.whl", hash = "sha256:72d8d3ef52c208ee1c7b2e341f7d71c6fd3157138abf1a95166e6165dd5d4369"}, 1489 | {file = "cffi-1.14.5-cp35-cp35m-win_amd64.whl", hash = "sha256:29314480e958fd8aab22e4a58b355b629c59bf5f2ac2492b61e3dc06d8c7a315"}, 1490 | {file = "cffi-1.14.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:3d3dd4c9e559eb172ecf00a2a7517e97d1e96de2a5e610bd9b68cea3925b4892"}, 1491 | {file = "cffi-1.14.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:48e1c69bbacfc3d932221851b39d49e81567a4d4aac3b21258d9c24578280058"}, 1492 | {file = "cffi-1.14.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:69e395c24fc60aad6bb4fa7e583698ea6cc684648e1ffb7fe85e3c1ca131a7d5"}, 1493 | {file = "cffi-1.14.5-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:9e93e79c2551ff263400e1e4be085a1210e12073a31c2011dbbda14bda0c6132"}, 1494 | {file = "cffi-1.14.5-cp36-cp36m-win32.whl", hash = "sha256:58e3f59d583d413809d60779492342801d6e82fefb89c86a38e040c16883be53"}, 1495 | {file = "cffi-1.14.5-cp36-cp36m-win_amd64.whl", hash = "sha256:005a36f41773e148deac64b08f233873a4d0c18b053d37da83f6af4d9087b813"}, 1496 | {file = "cffi-1.14.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2894f2df484ff56d717bead0a5c2abb6b9d2bf26d6960c4604d5c48bbc30ee73"}, 1497 | {file = "cffi-1.14.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0857f0ae312d855239a55c81ef453ee8fd24136eaba8e87a2eceba644c0d4c06"}, 1498 | {file = "cffi-1.14.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:cd2868886d547469123fadc46eac7ea5253ea7fcb139f12e1dfc2bbd406427d1"}, 1499 | {file = "cffi-1.14.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:35f27e6eb43380fa080dccf676dece30bef72e4a67617ffda586641cd4508d49"}, 1500 | {file = "cffi-1.14.5-cp37-cp37m-win32.whl", hash = "sha256:9ff227395193126d82e60319a673a037d5de84633f11279e336f9c0f189ecc62"}, 1501 | {file = "cffi-1.14.5-cp37-cp37m-win_amd64.whl", hash = "sha256:9cf8022fb8d07a97c178b02327b284521c7708d7c71a9c9c355c178ac4bbd3d4"}, 1502 | {file = "cffi-1.14.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b198cec6c72df5289c05b05b8b0969819783f9418e0409865dac47288d2a053"}, 1503 | {file = "cffi-1.14.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:ad17025d226ee5beec591b52800c11680fca3df50b8b29fe51d882576e039ee0"}, 1504 | {file = "cffi-1.14.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6c97d7350133666fbb5cf4abdc1178c812cb205dc6f41d174a7b0f18fb93337e"}, 1505 | {file = "cffi-1.14.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8ae6299f6c68de06f136f1f9e69458eae58f1dacf10af5c17353eae03aa0d827"}, 1506 | {file = "cffi-1.14.5-cp38-cp38-win32.whl", hash = "sha256:b85eb46a81787c50650f2392b9b4ef23e1f126313b9e0e9013b35c15e4288e2e"}, 1507 | {file = "cffi-1.14.5-cp38-cp38-win_amd64.whl", hash = "sha256:1f436816fc868b098b0d63b8920de7d208c90a67212546d02f84fe78a9c26396"}, 1508 | {file = "cffi-1.14.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1071534bbbf8cbb31b498d5d9db0f274f2f7a865adca4ae429e147ba40f73dea"}, 1509 | {file = "cffi-1.14.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:9de2e279153a443c656f2defd67769e6d1e4163952b3c622dcea5b08a6405322"}, 1510 | {file = "cffi-1.14.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6e4714cc64f474e4d6e37cfff31a814b509a35cb17de4fb1999907575684479c"}, 1511 | {file = "cffi-1.14.5-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:158d0d15119b4b7ff6b926536763dc0714313aa59e320ddf787502c70c4d4bee"}, 1512 | {file = "cffi-1.14.5-cp39-cp39-win32.whl", hash = "sha256:afb29c1ba2e5a3736f1c301d9d0abe3ec8b86957d04ddfa9d7a6a42b9367e396"}, 1513 | {file = "cffi-1.14.5-cp39-cp39-win_amd64.whl", hash = "sha256:f2d45f97ab6bb54753eab54fffe75aaf3de4ff2341c9daee1987ee1837636f1d"}, 1514 | {file = "cffi-1.14.5.tar.gz", hash = "sha256:fd78e5fee591709f32ef6edb9a015b4aa1a5022598e36227500c8f4e02328d9c"}, 1515 | ] 1516 | chardet = [ 1517 | {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"}, 1518 | {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"}, 1519 | ] 1520 | cleverhans = [ 1521 | {file = "cleverhans-3.1.0-py3-none-any.whl", hash = "sha256:37a0a8b60995875ee78726fdfdfa8b9228c494681495eed1751b6604eb53ed3f"}, 1522 | ] 1523 | click = [ 1524 | {file = "click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1"}, 1525 | {file = "click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb"}, 1526 | ] 1527 | cloudpickle = [ 1528 | {file = "cloudpickle-1.6.0-py3-none-any.whl", hash = "sha256:3a32d0eb0bc6f4d0c57fbc4f3e3780f7a81e6fee0fa935072884d58ae8e1cc7c"}, 1529 | {file = "cloudpickle-1.6.0.tar.gz", hash = "sha256:9bc994f9e9447593bd0a45371f0e7ac7333710fcf64a4eb9834bf149f4ef2f32"}, 1530 | ] 1531 | colorama = [ 1532 | {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, 1533 | ] 1534 | cycler = [ 1535 | {file = "cycler-0.10.0-py2.py3-none-any.whl", hash = "sha256:1d8a5ae1ff6c5cf9b93e8811e581232ad8920aeec647c37316ceac982b08cb2d"}, 1536 | {file = "cycler-0.10.0.tar.gz", hash = "sha256:cd7b2d1018258d7247a71425e9f26463dfb444d411c39569972f4ce586b0c9d8"}, 1537 | ] 1538 | decorator = [ 1539 | {file = "decorator-5.0.9-py3-none-any.whl", hash = "sha256:6e5c199c16f7a9f0e3a61a4a54b3d27e7dad0dbdde92b944426cb20914376323"}, 1540 | {file = "decorator-5.0.9.tar.gz", hash = "sha256:72ecfba4320a893c53f9706bebb2d55c270c1e51a28789361aa93e4a21319ed5"}, 1541 | ] 1542 | defusedxml = [ 1543 | {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, 1544 | {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, 1545 | ] 1546 | dm-tree = [ 1547 | {file = "dm-tree-0.1.6.tar.gz", hash = "sha256:6776404b23b4522c01012ffb314632aba092c9541577004ab153321e87da439a"}, 1548 | {file = "dm_tree-0.1.6-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:a8814a5c838f79e9db22a51369c74f4d92e7f1485ec55d7f665ae4d98478cb4f"}, 1549 | {file = "dm_tree-0.1.6-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:e28ba91d3d97230b831716db401ce116ae5c7dcd025161ac16ecb8bd5c870a85"}, 1550 | {file = "dm_tree-0.1.6-cp36-cp36m-manylinux_2_24_x86_64.whl", hash = "sha256:603392f1a7818a4f43a7033c2061ae7c2085a4a728171b0bbca76bd107fcdfb0"}, 1551 | {file = "dm_tree-0.1.6-cp36-cp36m-win_amd64.whl", hash = "sha256:2c91e472aab5c5e083c12d0a9396bbd7695031348721f709a9c6f2449e53dab6"}, 1552 | {file = "dm_tree-0.1.6-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:889eae86e0d2d4b8da8eb2edc7186b45a5f92e00c8dd77f2a5c8422f03db18f4"}, 1553 | {file = "dm_tree-0.1.6-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:2fa9c6e56cbd22cdffec42dc8b20464872b07c4535d8effc537fe0d31930b084"}, 1554 | {file = "dm_tree-0.1.6-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:c4e8d868fc9a75cbdb67e78069b33e62a4c69bc182c1d2adc29ab08e283912d8"}, 1555 | {file = "dm_tree-0.1.6-cp37-cp37m-win_amd64.whl", hash = "sha256:6d5f64d89f657b11f429e13b1378c8cfbe4baef50e7ab31f3689bfe0cf4a2508"}, 1556 | {file = "dm_tree-0.1.6-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:8d59c5098456667b28c607110537c86c25cbd0ee455f21d033c60ef2d7f48d81"}, 1557 | {file = "dm_tree-0.1.6-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:f3bec40e658fe7546c3a56849c743ac9a498e620b3236e82e171801938a56679"}, 1558 | {file = "dm_tree-0.1.6-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:e87d06478356a2d92c3940dedebcd92a14ad37fba10ebb1839c8140693b83c0a"}, 1559 | {file = "dm_tree-0.1.6-cp38-cp38-win_amd64.whl", hash = "sha256:02ffa673f20b1756dcf085ef2c354bc59416d843b384c7b71c421f873ffc36c0"}, 1560 | {file = "dm_tree-0.1.6-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:affc7a6d29442a143c60efb2f03bcb95424d4fe6168f3d31de892c1e601fa0e6"}, 1561 | {file = "dm_tree-0.1.6-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:bd347c74254ba320d57b0e102558c1189e3b4ae1bae952f9aef156b5914567c8"}, 1562 | {file = "dm_tree-0.1.6-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:8425454192e954692d9a1e0f7b374b3b7030916b17b6055951dc17d58b6fe1b8"}, 1563 | {file = "dm_tree-0.1.6-cp39-cp39-win_amd64.whl", hash = "sha256:5269183f80f1ae37543a2a30a8f78e4b0460d5da74fb5ac42dc8a476ef8d707e"}, 1564 | ] 1565 | easydict = [ 1566 | {file = "easydict-1.9.tar.gz", hash = "sha256:3f3f0dab07c299f0f4df032db1f388d985bb57fa4c5be30acd25c5f9a516883b"}, 1567 | ] 1568 | entrypoints = [ 1569 | {file = "entrypoints-0.3-py2.py3-none-any.whl", hash = "sha256:589f874b313739ad35be6e0cd7efde2a4e9b6fea91edcc34e58ecbb8dbe56d19"}, 1570 | {file = "entrypoints-0.3.tar.gz", hash = "sha256:c70dd71abe5a8c85e55e12c19bd91ccfeec11a6e99044204511f9ed547d48451"}, 1571 | ] 1572 | gast = [ 1573 | {file = "gast-0.4.0-py3-none-any.whl", hash = "sha256:b7adcdd5adbebf1adf17378da5ba3f543684dbec47b1cda1f3997e573cd542c4"}, 1574 | {file = "gast-0.4.0.tar.gz", hash = "sha256:40feb7b8b8434785585ab224d1568b857edb18297e5a3047f1ba012bc83b42c1"}, 1575 | ] 1576 | gitdb = [ 1577 | {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"}, 1578 | {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"}, 1579 | ] 1580 | gitpython = [ 1581 | {file = "GitPython-3.1.27-py3-none-any.whl", hash = "sha256:5b68b000463593e05ff2b261acff0ff0972df8ab1b70d3cdbd41b546c8b8fc3d"}, 1582 | {file = "GitPython-3.1.27.tar.gz", hash = "sha256:1c885ce809e8ba2d88a29befeb385fcea06338d3640712b59ca623c220bb5704"}, 1583 | ] 1584 | idna = [ 1585 | {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, 1586 | {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, 1587 | ] 1588 | importlib-metadata = [ 1589 | {file = "importlib_metadata-4.5.0-py3-none-any.whl", hash = "sha256:833b26fb89d5de469b24a390e9df088d4e52e4ba33b01dc5e0e4f41b81a16c00"}, 1590 | {file = "importlib_metadata-4.5.0.tar.gz", hash = "sha256:b142cc1dd1342f31ff04bb7d022492b09920cb64fed867cd3ea6f80fe3ebd139"}, 1591 | ] 1592 | ipykernel = [ 1593 | {file = "ipykernel-5.5.5-py3-none-any.whl", hash = "sha256:29eee66548ee7c2edb7941de60c0ccf0a7a8dd957341db0a49c5e8e6a0fcb712"}, 1594 | {file = "ipykernel-5.5.5.tar.gz", hash = "sha256:e976751336b51082a89fc2099fb7f96ef20f535837c398df6eab1283c2070884"}, 1595 | ] 1596 | ipython = [ 1597 | {file = "ipython-7.25.0-py3-none-any.whl", hash = "sha256:aa21412f2b04ad1a652e30564fff6b4de04726ce875eab222c8430edc6db383a"}, 1598 | {file = "ipython-7.25.0.tar.gz", hash = "sha256:54bbd1fe3882457aaf28ae060a5ccdef97f212a741754e420028d4ec5c2291dc"}, 1599 | ] 1600 | ipython-genutils = [ 1601 | {file = "ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8"}, 1602 | {file = "ipython_genutils-0.2.0.tar.gz", hash = "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"}, 1603 | ] 1604 | ipywidgets = [ 1605 | {file = "ipywidgets-7.6.3-py2.py3-none-any.whl", hash = "sha256:e6513cfdaf5878de30f32d57f6dc2474da395a2a2991b94d487406c0ab7f55ca"}, 1606 | {file = "ipywidgets-7.6.3.tar.gz", hash = "sha256:9f1a43e620530f9e570e4a493677d25f08310118d315b00e25a18f12913c41f0"}, 1607 | ] 1608 | jedi = [ 1609 | {file = "jedi-0.18.0-py2.py3-none-any.whl", hash = "sha256:18456d83f65f400ab0c2d3319e48520420ef43b23a086fdc05dff34132f0fb93"}, 1610 | {file = "jedi-0.18.0.tar.gz", hash = "sha256:92550a404bad8afed881a137ec9a461fed49eca661414be45059329614ed0707"}, 1611 | ] 1612 | jinja2 = [ 1613 | {file = "Jinja2-3.0.1-py3-none-any.whl", hash = "sha256:1f06f2da51e7b56b8f238affdd6b4e2c61e39598a378cc49345bc1bd42a978a4"}, 1614 | {file = "Jinja2-3.0.1.tar.gz", hash = "sha256:703f484b47a6af502e743c9122595cc812b0271f661722403114f71a79d0f5a4"}, 1615 | ] 1616 | joblib = [ 1617 | {file = "joblib-1.0.1-py3-none-any.whl", hash = "sha256:feeb1ec69c4d45129954f1b7034954241eedfd6ba39b5e9e4b6883be3332d5e5"}, 1618 | {file = "joblib-1.0.1.tar.gz", hash = "sha256:9c17567692206d2f3fb9ecf5e991084254fe631665c450b443761c4186a613f7"}, 1619 | ] 1620 | jsonschema = [ 1621 | {file = "jsonschema-3.2.0-py2.py3-none-any.whl", hash = "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163"}, 1622 | {file = "jsonschema-3.2.0.tar.gz", hash = "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"}, 1623 | ] 1624 | jupyter = [ 1625 | {file = "jupyter-1.0.0-py2.py3-none-any.whl", hash = "sha256:5b290f93b98ffbc21c0c7e749f054b3267782166d72fa5e3ed1ed4eaf34a2b78"}, 1626 | {file = "jupyter-1.0.0.tar.gz", hash = "sha256:d9dc4b3318f310e34c82951ea5d6683f67bed7def4b259fafbfe4f1beb1d8e5f"}, 1627 | {file = "jupyter-1.0.0.zip", hash = "sha256:3e1f86076bbb7c8c207829390305a2b1fe836d471ed54be66a3b8c41e7f46cc7"}, 1628 | ] 1629 | jupyter-client = [ 1630 | {file = "jupyter_client-6.2.0-py3-none-any.whl", hash = "sha256:9715152067e3f7ea3b56f341c9a0f9715c8c7cc316ee0eb13c3c84f5ca0065f5"}, 1631 | {file = "jupyter_client-6.2.0.tar.gz", hash = "sha256:e2ab61d79fbf8b56734a4c2499f19830fbd7f6fefb3e87868ef0545cb3c17eb9"}, 1632 | ] 1633 | jupyter-console = [ 1634 | {file = "jupyter_console-6.4.0-py3-none-any.whl", hash = "sha256:7799c4ea951e0e96ba8260575423cb323ea5a03fcf5503560fa3e15748869e27"}, 1635 | {file = "jupyter_console-6.4.0.tar.gz", hash = "sha256:242248e1685039cd8bff2c2ecb7ce6c1546eb50ee3b08519729e6e881aec19c7"}, 1636 | ] 1637 | jupyter-core = [ 1638 | {file = "jupyter_core-4.7.1-py3-none-any.whl", hash = "sha256:8c6c0cac5c1b563622ad49321d5ec47017bd18b94facb381c6973a0486395f8e"}, 1639 | {file = "jupyter_core-4.7.1.tar.gz", hash = "sha256:79025cb3225efcd36847d0840f3fc672c0abd7afd0de83ba8a1d3837619122b4"}, 1640 | ] 1641 | jupyterlab-pygments = [ 1642 | {file = "jupyterlab_pygments-0.1.2-py2.py3-none-any.whl", hash = "sha256:abfb880fd1561987efaefcb2d2ac75145d2a5d0139b1876d5be806e32f630008"}, 1643 | {file = "jupyterlab_pygments-0.1.2.tar.gz", hash = "sha256:cfcda0873626150932f438eccf0f8bf22bfa92345b814890ab360d666b254146"}, 1644 | ] 1645 | jupyterlab-widgets = [ 1646 | {file = "jupyterlab_widgets-1.0.0-py3-none-any.whl", hash = "sha256:caeaf3e6103180e654e7d8d2b81b7d645e59e432487c1d35a41d6d3ee56b3fef"}, 1647 | {file = "jupyterlab_widgets-1.0.0.tar.gz", hash = "sha256:5c1a29a84d3069208cb506b10609175b249b6486d6b1cbae8fcde2a11584fb78"}, 1648 | ] 1649 | kiwisolver = [ 1650 | {file = "kiwisolver-1.3.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:fd34fbbfbc40628200730bc1febe30631347103fc8d3d4fa012c21ab9c11eca9"}, 1651 | {file = "kiwisolver-1.3.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:d3155d828dec1d43283bd24d3d3e0d9c7c350cdfcc0bd06c0ad1209c1bbc36d0"}, 1652 | {file = "kiwisolver-1.3.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:5a7a7dbff17e66fac9142ae2ecafb719393aaee6a3768c9de2fd425c63b53e21"}, 1653 | {file = "kiwisolver-1.3.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:f8d6f8db88049a699817fd9178782867bf22283e3813064302ac59f61d95be05"}, 1654 | {file = "kiwisolver-1.3.1-cp36-cp36m-manylinux2014_ppc64le.whl", hash = "sha256:5f6ccd3dd0b9739edcf407514016108e2280769c73a85b9e59aa390046dbf08b"}, 1655 | {file = "kiwisolver-1.3.1-cp36-cp36m-win32.whl", hash = "sha256:225e2e18f271e0ed8157d7f4518ffbf99b9450fca398d561eb5c4a87d0986dd9"}, 1656 | {file = "kiwisolver-1.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:cf8b574c7b9aa060c62116d4181f3a1a4e821b2ec5cbfe3775809474113748d4"}, 1657 | {file = "kiwisolver-1.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:232c9e11fd7ac3a470d65cd67e4359eee155ec57e822e5220322d7b2ac84fbf0"}, 1658 | {file = "kiwisolver-1.3.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:b38694dcdac990a743aa654037ff1188c7a9801ac3ccc548d3341014bc5ca278"}, 1659 | {file = "kiwisolver-1.3.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ca3820eb7f7faf7f0aa88de0e54681bddcb46e485beb844fcecbcd1c8bd01689"}, 1660 | {file = "kiwisolver-1.3.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:c8fd0f1ae9d92b42854b2979024d7597685ce4ada367172ed7c09edf2cef9cb8"}, 1661 | {file = "kiwisolver-1.3.1-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:1e1bc12fb773a7b2ffdeb8380609f4f8064777877b2225dec3da711b421fda31"}, 1662 | {file = "kiwisolver-1.3.1-cp37-cp37m-win32.whl", hash = "sha256:72c99e39d005b793fb7d3d4e660aed6b6281b502e8c1eaf8ee8346023c8e03bc"}, 1663 | {file = "kiwisolver-1.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:8be8d84b7d4f2ba4ffff3665bcd0211318aa632395a1a41553250484a871d454"}, 1664 | {file = "kiwisolver-1.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:31dfd2ac56edc0ff9ac295193eeaea1c0c923c0355bf948fbd99ed6018010b72"}, 1665 | {file = "kiwisolver-1.3.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:563c649cfdef27d081c84e72a03b48ea9408c16657500c312575ae9d9f7bc1c3"}, 1666 | {file = "kiwisolver-1.3.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:78751b33595f7f9511952e7e60ce858c6d64db2e062afb325985ddbd34b5c131"}, 1667 | {file = "kiwisolver-1.3.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:a357fd4f15ee49b4a98b44ec23a34a95f1e00292a139d6015c11f55774ef10de"}, 1668 | {file = "kiwisolver-1.3.1-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:5989db3b3b34b76c09253deeaf7fbc2707616f130e166996606c284395da3f18"}, 1669 | {file = "kiwisolver-1.3.1-cp38-cp38-win32.whl", hash = "sha256:c08e95114951dc2090c4a630c2385bef681cacf12636fb0241accdc6b303fd81"}, 1670 | {file = "kiwisolver-1.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:44a62e24d9b01ba94ae7a4a6c3fb215dc4af1dde817e7498d901e229aaf50e4e"}, 1671 | {file = "kiwisolver-1.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:50af681a36b2a1dee1d3c169ade9fdc59207d3c31e522519181e12f1b3ba7000"}, 1672 | {file = "kiwisolver-1.3.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:a53d27d0c2a0ebd07e395e56a1fbdf75ffedc4a05943daf472af163413ce9598"}, 1673 | {file = "kiwisolver-1.3.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:834ee27348c4aefc20b479335fd422a2c69db55f7d9ab61721ac8cd83eb78882"}, 1674 | {file = "kiwisolver-1.3.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5c3e6455341008a054cccee8c5d24481bcfe1acdbc9add30aa95798e95c65621"}, 1675 | {file = "kiwisolver-1.3.1-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:acef3d59d47dd85ecf909c359d0fd2c81ed33bdff70216d3956b463e12c38a54"}, 1676 | {file = "kiwisolver-1.3.1-cp39-cp39-win32.whl", hash = "sha256:c5518d51a0735b1e6cee1fdce66359f8d2b59c3ca85dc2b0813a8aa86818a030"}, 1677 | {file = "kiwisolver-1.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:b9edd0110a77fc321ab090aaa1cfcaba1d8499850a12848b81be2222eab648f6"}, 1678 | {file = "kiwisolver-1.3.1-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0cd53f403202159b44528498de18f9285b04482bab2a6fc3f5dd8dbb9352e30d"}, 1679 | {file = "kiwisolver-1.3.1-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:33449715e0101e4d34f64990352bce4095c8bf13bed1b390773fc0a7295967b3"}, 1680 | {file = "kiwisolver-1.3.1-pp36-pypy36_pp73-win32.whl", hash = "sha256:401a2e9afa8588589775fe34fc22d918ae839aaaf0c0e96441c0fdbce6d8ebe6"}, 1681 | {file = "kiwisolver-1.3.1.tar.gz", hash = "sha256:950a199911a8d94683a6b10321f9345d5a3a8433ec58b217ace979e18f16e248"}, 1682 | ] 1683 | markupsafe = [ 1684 | {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, 1685 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, 1686 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, 1687 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, 1688 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, 1689 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, 1690 | {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, 1691 | {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, 1692 | {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, 1693 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, 1694 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, 1695 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, 1696 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, 1697 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, 1698 | {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, 1699 | {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, 1700 | {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, 1701 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, 1702 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, 1703 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, 1704 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, 1705 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, 1706 | {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, 1707 | {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, 1708 | {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, 1709 | {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, 1710 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, 1711 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, 1712 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, 1713 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, 1714 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, 1715 | {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, 1716 | {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, 1717 | {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, 1718 | ] 1719 | matplotlib = [ 1720 | {file = "matplotlib-3.4.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c541ee5a3287efe066bbe358320853cf4916bc14c00c38f8f3d8d75275a405a9"}, 1721 | {file = "matplotlib-3.4.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:3a5c18dbd2c7c366da26a4ad1462fe3e03a577b39e3b503bbcf482b9cdac093c"}, 1722 | {file = "matplotlib-3.4.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:a9d8cb5329df13e0cdaa14b3b43f47b5e593ec637f13f14db75bb16e46178b05"}, 1723 | {file = "matplotlib-3.4.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:7ad19f3fb6145b9eb41c08e7cbb9f8e10b91291396bee21e9ce761bb78df63ec"}, 1724 | {file = "matplotlib-3.4.2-cp37-cp37m-win32.whl", hash = "sha256:7a58f3d8fe8fac3be522c79d921c9b86e090a59637cb88e3bc51298d7a2c862a"}, 1725 | {file = "matplotlib-3.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6382bc6e2d7e481bcd977eb131c31dee96e0fb4f9177d15ec6fb976d3b9ace1a"}, 1726 | {file = "matplotlib-3.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6a6a44f27aabe720ec4fd485061e8a35784c2b9ffa6363ad546316dfc9cea04e"}, 1727 | {file = "matplotlib-3.4.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1c1779f7ab7d8bdb7d4c605e6ffaa0614b3e80f1e3c8ccf7b9269a22dbc5986b"}, 1728 | {file = "matplotlib-3.4.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5826f56055b9b1c80fef82e326097e34dc4af8c7249226b7dd63095a686177d1"}, 1729 | {file = "matplotlib-3.4.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:0bea5ec5c28d49020e5d7923c2725b837e60bc8be99d3164af410eb4b4c827da"}, 1730 | {file = "matplotlib-3.4.2-cp38-cp38-win32.whl", hash = "sha256:6475d0209024a77f869163ec3657c47fed35d9b6ed8bccba8aa0f0099fbbdaa8"}, 1731 | {file = "matplotlib-3.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:21b31057bbc5e75b08e70a43cefc4c0b2c2f1b1a850f4a0f7af044eb4163086c"}, 1732 | {file = "matplotlib-3.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b26535b9de85326e6958cdef720ecd10bcf74a3f4371bf9a7e5b2e659c17e153"}, 1733 | {file = "matplotlib-3.4.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:32fa638cc10886885d1ca3d409d4473d6a22f7ceecd11322150961a70fab66dd"}, 1734 | {file = "matplotlib-3.4.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:956c8849b134b4a343598305a3ca1bdd3094f01f5efc8afccdebeffe6b315247"}, 1735 | {file = "matplotlib-3.4.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:85f191bb03cb1a7b04b5c2cca4792bef94df06ef473bc49e2818105671766fee"}, 1736 | {file = "matplotlib-3.4.2-cp39-cp39-win32.whl", hash = "sha256:b1d5a2cedf5de05567c441b3a8c2651fbde56df08b82640e7f06c8cd91e201f6"}, 1737 | {file = "matplotlib-3.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:df815378a754a7edd4559f8c51fc7064f779a74013644a7f5ac7a0c31f875866"}, 1738 | {file = "matplotlib-3.4.2.tar.gz", hash = "sha256:d8d994cefdff9aaba45166eb3de4f5211adb4accac85cbf97137e98f26ea0219"}, 1739 | ] 1740 | matplotlib-inline = [ 1741 | {file = "matplotlib-inline-0.1.2.tar.gz", hash = "sha256:f41d5ff73c9f5385775d5c0bc13b424535c8402fe70ea8210f93e11f3683993e"}, 1742 | {file = "matplotlib_inline-0.1.2-py3-none-any.whl", hash = "sha256:5cf1176f554abb4fa98cb362aa2b55c500147e4bdbb07e3fda359143e1da0811"}, 1743 | ] 1744 | mistune = [ 1745 | {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"}, 1746 | {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, 1747 | ] 1748 | mnist = [ 1749 | {file = "mnist-0.2.2-py2.py3-none-any.whl", hash = "sha256:80e2b07992e5cc61e6247751ce8926f6d15ab3ebde1508d9bbc8891a766c7b91"}, 1750 | {file = "mnist-0.2.2.tar.gz", hash = "sha256:24934fade9fbbd8adc98713ba805282e7e579224e888169bb5c8ab777efa7b54"}, 1751 | ] 1752 | more-itertools = [ 1753 | {file = "more-itertools-8.8.0.tar.gz", hash = "sha256:83f0308e05477c68f56ea3a888172c78ed5d5b3c282addb67508e7ba6c8f813a"}, 1754 | {file = "more_itertools-8.8.0-py3-none-any.whl", hash = "sha256:2cf89ec599962f2ddc4d568a05defc40e0a587fbc10d5989713638864c36be4d"}, 1755 | ] 1756 | nbclient = [ 1757 | {file = "nbclient-0.5.3-py3-none-any.whl", hash = "sha256:e79437364a2376892b3f46bedbf9b444e5396cfb1bc366a472c37b48e9551500"}, 1758 | {file = "nbclient-0.5.3.tar.gz", hash = "sha256:db17271330c68c8c88d46d72349e24c147bb6f34ec82d8481a8f025c4d26589c"}, 1759 | ] 1760 | nbconvert = [ 1761 | {file = "nbconvert-6.1.0-py3-none-any.whl", hash = "sha256:37cd92ff2ae6a268e62075ff8b16129e0be4939c4dfcee53dc77cc8a7e06c684"}, 1762 | {file = "nbconvert-6.1.0.tar.gz", hash = "sha256:d22a8ff202644d31db254d24d52c3a96c82156623fcd7c7f987bba2612303ec9"}, 1763 | ] 1764 | nbformat = [ 1765 | {file = "nbformat-5.1.3-py3-none-any.whl", hash = "sha256:eb8447edd7127d043361bc17f2f5a807626bc8e878c7709a1c647abda28a9171"}, 1766 | {file = "nbformat-5.1.3.tar.gz", hash = "sha256:b516788ad70771c6250977c1374fcca6edebe6126fd2adb5a69aa5c2356fd1c8"}, 1767 | ] 1768 | nest-asyncio = [ 1769 | {file = "nest_asyncio-1.5.1-py3-none-any.whl", hash = "sha256:76d6e972265063fe92a90b9cc4fb82616e07d586b346ed9d2c89a4187acea39c"}, 1770 | {file = "nest_asyncio-1.5.1.tar.gz", hash = "sha256:afc5a1c515210a23c461932765691ad39e8eba6551c055ac8d5546e69250d0aa"}, 1771 | ] 1772 | nose = [ 1773 | {file = "nose-1.3.7-py2-none-any.whl", hash = "sha256:dadcddc0aefbf99eea214e0f1232b94f2fa9bd98fa8353711dacb112bfcbbb2a"}, 1774 | {file = "nose-1.3.7-py3-none-any.whl", hash = "sha256:9ff7c6cc443f8c51994b34a667bbcf45afd6d945be7477b52e97516fd17c53ac"}, 1775 | {file = "nose-1.3.7.tar.gz", hash = "sha256:f1bffef9cbc82628f6e7d7b40d7e255aefaa1adb6a1b1d26c69a8b79e6208a98"}, 1776 | ] 1777 | notebook = [ 1778 | {file = "notebook-6.4.0-py3-none-any.whl", hash = "sha256:f7f0a71a999c7967d9418272ae4c3378a220bd28330fbfb49860e46cf8a5838a"}, 1779 | {file = "notebook-6.4.0.tar.gz", hash = "sha256:9c4625e2a2aa49d6eae4ce20cbc3d8976db19267e32d2a304880e0c10bf8aef9"}, 1780 | ] 1781 | numpy = [ 1782 | {file = "numpy-1.21.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d5caa946a9f55511e76446e170bdad1d12d6b54e17a2afe7b189112ed4412bb8"}, 1783 | {file = "numpy-1.21.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ac4fd578322842dbda8d968e3962e9f22e862b6ec6e3378e7415625915e2da4d"}, 1784 | {file = "numpy-1.21.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:598fe100b2948465cf3ed64b1a326424b5e4be2670552066e17dfaa67246011d"}, 1785 | {file = "numpy-1.21.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c55407f739f0bfcec67d0df49103f9333edc870061358ac8a8c9e37ea02fcd2"}, 1786 | {file = "numpy-1.21.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:75579acbadbf74e3afd1153da6177f846212ea2a0cc77de53523ae02c9256513"}, 1787 | {file = "numpy-1.21.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cc367c86eb87e5b7c9592935620f22d13b090c609f1b27e49600cd033b529f54"}, 1788 | {file = "numpy-1.21.0-cp37-cp37m-win32.whl", hash = "sha256:d89b0dc7f005090e32bb4f9bf796e1dcca6b52243caf1803fdd2b748d8561f63"}, 1789 | {file = "numpy-1.21.0-cp37-cp37m-win_amd64.whl", hash = "sha256:eda2829af498946c59d8585a9fd74da3f810866e05f8df03a86f70079c7531dd"}, 1790 | {file = "numpy-1.21.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:1a784e8ff7ea2a32e393cc53eb0003eca1597c7ca628227e34ce34eb11645a0e"}, 1791 | {file = "numpy-1.21.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bba474a87496d96e61461f7306fba2ebba127bed7836212c360f144d1e72ac54"}, 1792 | {file = "numpy-1.21.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fd0a359c1c17f00cb37de2969984a74320970e0ceef4808c32e00773b06649d9"}, 1793 | {file = "numpy-1.21.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e4d5a86a5257843a18fb1220c5f1c199532bc5d24e849ed4b0289fb59fbd4d8f"}, 1794 | {file = "numpy-1.21.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:620732f42259eb2c4642761bd324462a01cdd13dd111740ce3d344992dd8492f"}, 1795 | {file = "numpy-1.21.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9205711e5440954f861ceeea8f1b415d7dd15214add2e878b4d1cf2bcb1a914"}, 1796 | {file = "numpy-1.21.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ad09f55cc95ed8d80d8ab2052f78cc21cb231764de73e229140d81ff49d8145e"}, 1797 | {file = "numpy-1.21.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a1f2fb2da242568af0271455b89aee0f71e4e032086ee2b4c5098945d0e11cf6"}, 1798 | {file = "numpy-1.21.0-cp38-cp38-win32.whl", hash = "sha256:e58ddb53a7b4959932f5582ac455ff90dcb05fac3f8dcc8079498d43afbbde6c"}, 1799 | {file = "numpy-1.21.0-cp38-cp38-win_amd64.whl", hash = "sha256:d2910d0a075caed95de1a605df00ee03b599de5419d0b95d55342e9a33ad1fb3"}, 1800 | {file = "numpy-1.21.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a290989cd671cd0605e9c91a70e6df660f73ae87484218e8285c6522d29f6e38"}, 1801 | {file = "numpy-1.21.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3537b967b350ad17633b35c2f4b1a1bbd258c018910b518c30b48c8e41272717"}, 1802 | {file = "numpy-1.21.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccc6c650f8700ce1e3a77668bb7c43e45c20ac06ae00d22bdf6760b38958c883"}, 1803 | {file = "numpy-1.21.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:709884863def34d72b183d074d8ba5cfe042bc3ff8898f1ffad0209161caaa99"}, 1804 | {file = "numpy-1.21.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:bebab3eaf0641bba26039fb0b2c5bf9b99407924b53b1ea86e03c32c64ef5aef"}, 1805 | {file = "numpy-1.21.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf680682ad0a3bef56dae200dbcbac2d57294a73e5b0f9864955e7dd7c2c2491"}, 1806 | {file = "numpy-1.21.0-cp39-cp39-win32.whl", hash = "sha256:d95d16204cd51ff1a1c8d5f9958ce90ae190be81d348b514f9be39f878b8044a"}, 1807 | {file = "numpy-1.21.0-cp39-cp39-win_amd64.whl", hash = "sha256:2ba579dde0563f47021dcd652253103d6fd66165b18011dce1a0609215b2791e"}, 1808 | {file = "numpy-1.21.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3c40e6b860220ed862e8097b8f81c9af6d7405b723f4a7af24a267b46f90e461"}, 1809 | {file = "numpy-1.21.0.zip", hash = "sha256:e80fe25cba41c124d04c662f33f6364909b985f2eb5998aaa5ae4b9587242cce"}, 1810 | ] 1811 | packaging = [ 1812 | {file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"}, 1813 | {file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"}, 1814 | ] 1815 | pandas = [ 1816 | {file = "pandas-1.1.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:bf23a3b54d128b50f4f9d4675b3c1857a688cc6731a32f931837d72effb2698d"}, 1817 | {file = "pandas-1.1.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:5a780260afc88268a9d3ac3511d8f494fdcf637eece62fb9eb656a63d53eb7ca"}, 1818 | {file = "pandas-1.1.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:b61080750d19a0122469ab59b087380721d6b72a4e7d962e4d7e63e0c4504814"}, 1819 | {file = "pandas-1.1.5-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:0de3ddb414d30798cbf56e642d82cac30a80223ad6fe484d66c0ce01a84d6f2f"}, 1820 | {file = "pandas-1.1.5-cp36-cp36m-win32.whl", hash = "sha256:70865f96bb38fec46f7ebd66d4b5cfd0aa6b842073f298d621385ae3898d28b5"}, 1821 | {file = "pandas-1.1.5-cp36-cp36m-win_amd64.whl", hash = "sha256:19a2148a1d02791352e9fa637899a78e371a3516ac6da5c4edc718f60cbae648"}, 1822 | {file = "pandas-1.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:26fa92d3ac743a149a31b21d6f4337b0594b6302ea5575b37af9ca9611e8981a"}, 1823 | {file = "pandas-1.1.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:c16d59c15d946111d2716856dd5479221c9e4f2f5c7bc2d617f39d870031e086"}, 1824 | {file = "pandas-1.1.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:3be7a7a0ca71a2640e81d9276f526bca63505850add10206d0da2e8a0a325dae"}, 1825 | {file = "pandas-1.1.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:573fba5b05bf2c69271a32e52399c8de599e4a15ab7cec47d3b9c904125ab788"}, 1826 | {file = "pandas-1.1.5-cp37-cp37m-win32.whl", hash = "sha256:21b5a2b033380adbdd36b3116faaf9a4663e375325831dac1b519a44f9e439bb"}, 1827 | {file = "pandas-1.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:24c7f8d4aee71bfa6401faeba367dd654f696a77151a8a28bc2013f7ced4af98"}, 1828 | {file = "pandas-1.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2860a97cbb25444ffc0088b457da0a79dc79f9c601238a3e0644312fcc14bf11"}, 1829 | {file = "pandas-1.1.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:5008374ebb990dad9ed48b0f5d0038124c73748f5384cc8c46904dace27082d9"}, 1830 | {file = "pandas-1.1.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:2c2f7c670ea4e60318e4b7e474d56447cf0c7d83b3c2a5405a0dbb2600b9c48e"}, 1831 | {file = "pandas-1.1.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:0a643bae4283a37732ddfcecab3f62dd082996021b980f580903f4e8e01b3c5b"}, 1832 | {file = "pandas-1.1.5-cp38-cp38-win32.whl", hash = "sha256:5447ea7af4005b0daf695a316a423b96374c9c73ffbd4533209c5ddc369e644b"}, 1833 | {file = "pandas-1.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:4c62e94d5d49db116bef1bd5c2486723a292d79409fc9abd51adf9e05329101d"}, 1834 | {file = "pandas-1.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:731568be71fba1e13cae212c362f3d2ca8932e83cb1b85e3f1b4dd77d019254a"}, 1835 | {file = "pandas-1.1.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:c61c043aafb69329d0f961b19faa30b1dab709dd34c9388143fc55680059e55a"}, 1836 | {file = "pandas-1.1.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:2b1c6cd28a0dfda75c7b5957363333f01d370936e4c6276b7b8e696dd500582a"}, 1837 | {file = "pandas-1.1.5-cp39-cp39-win32.whl", hash = "sha256:c94ff2780a1fd89f190390130d6d36173ca59fcfb3fe0ff596f9a56518191ccb"}, 1838 | {file = "pandas-1.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:edda9bacc3843dfbeebaf7a701763e68e741b08fccb889c003b0a52f0ee95782"}, 1839 | {file = "pandas-1.1.5.tar.gz", hash = "sha256:f10fc41ee3c75a474d3bdf68d396f10782d013d7f67db99c0efbfd0acb99701b"}, 1840 | ] 1841 | pandocfilters = [ 1842 | {file = "pandocfilters-1.4.3.tar.gz", hash = "sha256:bc63fbb50534b4b1f8ebe1860889289e8af94a23bff7445259592df25a3906eb"}, 1843 | ] 1844 | parso = [ 1845 | {file = "parso-0.8.2-py2.py3-none-any.whl", hash = "sha256:a8c4922db71e4fdb90e0d0bc6e50f9b273d3397925e5e60a717e719201778d22"}, 1846 | {file = "parso-0.8.2.tar.gz", hash = "sha256:12b83492c6239ce32ff5eed6d3639d6a536170723c6f3f1506869f1ace413398"}, 1847 | ] 1848 | pexpect = [ 1849 | {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, 1850 | {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, 1851 | ] 1852 | pickleshare = [ 1853 | {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, 1854 | {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, 1855 | ] 1856 | pillow = [ 1857 | {file = "Pillow-8.2.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:dc38f57d8f20f06dd7c3161c59ca2c86893632623f33a42d592f097b00f720a9"}, 1858 | {file = "Pillow-8.2.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a013cbe25d20c2e0c4e85a9daf438f85121a4d0344ddc76e33fd7e3965d9af4b"}, 1859 | {file = "Pillow-8.2.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8bb1e155a74e1bfbacd84555ea62fa21c58e0b4e7e6b20e4447b8d07990ac78b"}, 1860 | {file = "Pillow-8.2.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c5236606e8570542ed424849f7852a0ff0bce2c4c8d0ba05cc202a5a9c97dee9"}, 1861 | {file = "Pillow-8.2.0-cp36-cp36m-win32.whl", hash = "sha256:12e5e7471f9b637762453da74e390e56cc43e486a88289995c1f4c1dc0bfe727"}, 1862 | {file = "Pillow-8.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:5afe6b237a0b81bd54b53f835a153770802f164c5570bab5e005aad693dab87f"}, 1863 | {file = "Pillow-8.2.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:cb7a09e173903541fa888ba010c345893cd9fc1b5891aaf060f6ca77b6a3722d"}, 1864 | {file = "Pillow-8.2.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0d19d70ee7c2ba97631bae1e7d4725cdb2ecf238178096e8c82ee481e189168a"}, 1865 | {file = "Pillow-8.2.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:083781abd261bdabf090ad07bb69f8f5599943ddb539d64497ed021b2a67e5a9"}, 1866 | {file = "Pillow-8.2.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:c6b39294464b03457f9064e98c124e09008b35a62e3189d3513e5148611c9388"}, 1867 | {file = "Pillow-8.2.0-cp37-cp37m-win32.whl", hash = "sha256:01425106e4e8cee195a411f729cff2a7d61813b0b11737c12bd5991f5f14bcd5"}, 1868 | {file = "Pillow-8.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3b570f84a6161cf8865c4e08adf629441f56e32f180f7aa4ccbd2e0a5a02cba2"}, 1869 | {file = "Pillow-8.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:031a6c88c77d08aab84fecc05c3cde8414cd6f8406f4d2b16fed1e97634cc8a4"}, 1870 | {file = "Pillow-8.2.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:66cc56579fd91f517290ab02c51e3a80f581aba45fd924fcdee01fa06e635812"}, 1871 | {file = "Pillow-8.2.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6c32cc3145928c4305d142ebec682419a6c0a8ce9e33db900027ddca1ec39178"}, 1872 | {file = "Pillow-8.2.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:624b977355cde8b065f6d51b98497d6cd5fbdd4f36405f7a8790e3376125e2bb"}, 1873 | {file = "Pillow-8.2.0-cp38-cp38-win32.whl", hash = "sha256:5cbf3e3b1014dddc45496e8cf38b9f099c95a326275885199f427825c6522232"}, 1874 | {file = "Pillow-8.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:463822e2f0d81459e113372a168f2ff59723e78528f91f0bd25680ac185cf797"}, 1875 | {file = "Pillow-8.2.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:95d5ef984eff897850f3a83883363da64aae1000e79cb3c321915468e8c6add5"}, 1876 | {file = "Pillow-8.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b91c36492a4bbb1ee855b7d16fe51379e5f96b85692dc8210831fbb24c43e484"}, 1877 | {file = "Pillow-8.2.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:d68cb92c408261f806b15923834203f024110a2e2872ecb0bd2a110f89d3c602"}, 1878 | {file = "Pillow-8.2.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f217c3954ce5fd88303fc0c317af55d5e0204106d86dea17eb8205700d47dec2"}, 1879 | {file = "Pillow-8.2.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5b70110acb39f3aff6b74cf09bb4169b167e2660dabc304c1e25b6555fa781ef"}, 1880 | {file = "Pillow-8.2.0-cp39-cp39-win32.whl", hash = "sha256:a7d5e9fad90eff8f6f6106d3b98b553a88b6f976e51fce287192a5d2d5363713"}, 1881 | {file = "Pillow-8.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:238c197fc275b475e87c1453b05b467d2d02c2915fdfdd4af126145ff2e4610c"}, 1882 | {file = "Pillow-8.2.0-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:0e04d61f0064b545b989126197930807c86bcbd4534d39168f4aa5fda39bb8f9"}, 1883 | {file = "Pillow-8.2.0-pp36-pypy36_pp73-manylinux2010_i686.whl", hash = "sha256:63728564c1410d99e6d1ae8e3b810fe012bc440952168af0a2877e8ff5ab96b9"}, 1884 | {file = "Pillow-8.2.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:c03c07ed32c5324939b19e36ae5f75c660c81461e312a41aea30acdd46f93a7c"}, 1885 | {file = "Pillow-8.2.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:4d98abdd6b1e3bf1a1cbb14c3895226816e666749ac040c4e2554231068c639b"}, 1886 | {file = "Pillow-8.2.0-pp37-pypy37_pp73-manylinux2010_i686.whl", hash = "sha256:aac00e4bc94d1b7813fe882c28990c1bc2f9d0e1aa765a5f2b516e8a6a16a9e4"}, 1887 | {file = "Pillow-8.2.0-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:22fd0f42ad15dfdde6c581347eaa4adb9a6fc4b865f90b23378aa7914895e120"}, 1888 | {file = "Pillow-8.2.0-pp37-pypy37_pp73-win32.whl", hash = "sha256:e98eca29a05913e82177b3ba3d198b1728e164869c613d76d0de4bde6768a50e"}, 1889 | {file = "Pillow-8.2.0.tar.gz", hash = "sha256:a787ab10d7bb5494e5f76536ac460741788f1fbce851068d73a87ca7c35fc3e1"}, 1890 | ] 1891 | pluggy = [ 1892 | {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, 1893 | {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, 1894 | ] 1895 | prometheus-client = [ 1896 | {file = "prometheus_client-0.11.0-py2.py3-none-any.whl", hash = "sha256:b014bc76815eb1399da8ce5fc84b7717a3e63652b0c0f8804092c9363acab1b2"}, 1897 | {file = "prometheus_client-0.11.0.tar.gz", hash = "sha256:3a8baade6cb80bcfe43297e33e7623f3118d660d41387593758e2fb1ea173a86"}, 1898 | ] 1899 | prompt-toolkit = [ 1900 | {file = "prompt_toolkit-3.0.19-py3-none-any.whl", hash = "sha256:7089d8d2938043508aa9420ec18ce0922885304cddae87fb96eebca942299f88"}, 1901 | {file = "prompt_toolkit-3.0.19.tar.gz", hash = "sha256:08360ee3a3148bdb5163621709ee322ec34fc4375099afa4bbf751e9b7b7fa4f"}, 1902 | ] 1903 | protobuf = [ 1904 | {file = "protobuf-3.19.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f51d5a9f137f7a2cec2d326a74b6e3fc79d635d69ffe1b036d39fc7d75430d37"}, 1905 | {file = "protobuf-3.19.4-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:09297b7972da685ce269ec52af761743714996b4381c085205914c41fcab59fb"}, 1906 | {file = "protobuf-3.19.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:072fbc78d705d3edc7ccac58a62c4c8e0cec856987da7df8aca86e647be4e35c"}, 1907 | {file = "protobuf-3.19.4-cp310-cp310-win32.whl", hash = "sha256:7bb03bc2873a2842e5ebb4801f5c7ff1bfbdf426f85d0172f7644fcda0671ae0"}, 1908 | {file = "protobuf-3.19.4-cp310-cp310-win_amd64.whl", hash = "sha256:f358aa33e03b7a84e0d91270a4d4d8f5df6921abe99a377828839e8ed0c04e07"}, 1909 | {file = "protobuf-3.19.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:1c91ef4110fdd2c590effb5dca8fdbdcb3bf563eece99287019c4204f53d81a4"}, 1910 | {file = "protobuf-3.19.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c438268eebb8cf039552897d78f402d734a404f1360592fef55297285f7f953f"}, 1911 | {file = "protobuf-3.19.4-cp36-cp36m-win32.whl", hash = "sha256:835a9c949dc193953c319603b2961c5c8f4327957fe23d914ca80d982665e8ee"}, 1912 | {file = "protobuf-3.19.4-cp36-cp36m-win_amd64.whl", hash = "sha256:4276cdec4447bd5015453e41bdc0c0c1234eda08420b7c9a18b8d647add51e4b"}, 1913 | {file = "protobuf-3.19.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6cbc312be5e71869d9d5ea25147cdf652a6781cf4d906497ca7690b7b9b5df13"}, 1914 | {file = "protobuf-3.19.4-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:54a1473077f3b616779ce31f477351a45b4fef8c9fd7892d6d87e287a38df368"}, 1915 | {file = "protobuf-3.19.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:435bb78b37fc386f9275a7035fe4fb1364484e38980d0dd91bc834a02c5ec909"}, 1916 | {file = "protobuf-3.19.4-cp37-cp37m-win32.whl", hash = "sha256:16f519de1313f1b7139ad70772e7db515b1420d208cb16c6d7858ea989fc64a9"}, 1917 | {file = "protobuf-3.19.4-cp37-cp37m-win_amd64.whl", hash = "sha256:cdc076c03381f5c1d9bb1abdcc5503d9ca8b53cf0a9d31a9f6754ec9e6c8af0f"}, 1918 | {file = "protobuf-3.19.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:69da7d39e39942bd52848438462674c463e23963a1fdaa84d88df7fbd7e749b2"}, 1919 | {file = "protobuf-3.19.4-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:48ed3877fa43e22bcacc852ca76d4775741f9709dd9575881a373bd3e85e54b2"}, 1920 | {file = "protobuf-3.19.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd95d1dfb9c4f4563e6093a9aa19d9c186bf98fa54da5252531cc0d3a07977e7"}, 1921 | {file = "protobuf-3.19.4-cp38-cp38-win32.whl", hash = "sha256:b38057450a0c566cbd04890a40edf916db890f2818e8682221611d78dc32ae26"}, 1922 | {file = "protobuf-3.19.4-cp38-cp38-win_amd64.whl", hash = "sha256:7ca7da9c339ca8890d66958f5462beabd611eca6c958691a8fe6eccbd1eb0c6e"}, 1923 | {file = "protobuf-3.19.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:36cecbabbda242915529b8ff364f2263cd4de7c46bbe361418b5ed859677ba58"}, 1924 | {file = "protobuf-3.19.4-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:c1068287025f8ea025103e37d62ffd63fec8e9e636246b89c341aeda8a67c934"}, 1925 | {file = "protobuf-3.19.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96bd766831596d6014ca88d86dc8fe0fb2e428c0b02432fd9db3943202bf8c5e"}, 1926 | {file = "protobuf-3.19.4-cp39-cp39-win32.whl", hash = "sha256:84123274d982b9e248a143dadd1b9815049f4477dc783bf84efe6250eb4b836a"}, 1927 | {file = "protobuf-3.19.4-cp39-cp39-win_amd64.whl", hash = "sha256:3112b58aac3bac9c8be2b60a9daf6b558ca3f7681c130dcdd788ade7c9ffbdca"}, 1928 | {file = "protobuf-3.19.4-py2.py3-none-any.whl", hash = "sha256:8961c3a78ebfcd000920c9060a262f082f29838682b1f7201889300c1fbe0616"}, 1929 | {file = "protobuf-3.19.4.tar.gz", hash = "sha256:9df0c10adf3e83015ced42a9a7bd64e13d06c4cf45c340d2c63020ea04499d0a"}, 1930 | ] 1931 | ptyprocess = [ 1932 | {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, 1933 | {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, 1934 | ] 1935 | py = [ 1936 | {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"}, 1937 | {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"}, 1938 | ] 1939 | pyarrow = [ 1940 | {file = "pyarrow-7.0.0-cp310-cp310-macosx_10_13_universal2.whl", hash = "sha256:0f15213f380539c9640cb2413dc677b55e70f04c9e98cfc2e1d8b36c770e1036"}, 1941 | {file = "pyarrow-7.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:29c4e3b3be0b94d07ff4921a5e410fc690a3a066a850a302fc504de5fc638495"}, 1942 | {file = "pyarrow-7.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8a9bfc8a016bcb8f9a8536d2fa14a890b340bc7a236275cd60fd4fb8b93ff405"}, 1943 | {file = "pyarrow-7.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:49d431ed644a3e8f53ae2bbf4b514743570b495b5829548db51610534b6eeee7"}, 1944 | {file = "pyarrow-7.0.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:aa6442a321c1e49480b3d436f7d631c895048a16df572cf71c23c6b53c45ed66"}, 1945 | {file = "pyarrow-7.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6b01a23cb401750092c6f7c4dcae67cd8fd6b99ae710e26f654f23508f25f25"}, 1946 | {file = "pyarrow-7.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f10928745c6ff66e121552731409803bed86c66ac79c64c90438b053b5242c5"}, 1947 | {file = "pyarrow-7.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:759090caa1474cafb5e68c93a9bd6cb45d8bb8e4f2cad2f1a0cc9439bae8ae88"}, 1948 | {file = "pyarrow-7.0.0-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:e3fe34bcfc28d9c4a747adc3926d2307a04c5c50b89155946739515ccfe5eab0"}, 1949 | {file = "pyarrow-7.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:040dce5345603e4e621bcf4f3b21f18d557852e7b15307e559bb14c8951c8714"}, 1950 | {file = "pyarrow-7.0.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ed4b647c3345ae3463d341a9d28d0260cd302fb92ecf4e2e3e0f1656d6e0e55c"}, 1951 | {file = "pyarrow-7.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7fecd5d5604f47e003f50887a42aee06cb8b7bf8e8bf7dc543a22331d9ba832"}, 1952 | {file = "pyarrow-7.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f2d00b892fe865e43346acb78761ba268f8bb1cbdba588816590abcb780ee3d"}, 1953 | {file = "pyarrow-7.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:f439f7d77201681fd31391d189aa6b1322d27c9311a8f2fce7d23972471b02b6"}, 1954 | {file = "pyarrow-7.0.0-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:3e06b0e29ce1e32f219c670c6b31c33d25a5b8e29c7828f873373aab78bf30a5"}, 1955 | {file = "pyarrow-7.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:13dc05bcf79dbc1bd2de1b05d26eb64824b85883d019d81ca3c2eca9b68b5a44"}, 1956 | {file = "pyarrow-7.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:06183a7ff2b0c030ec0413fc4dc98abad8cf336c78c280a0b7f4bcbebb78d125"}, 1957 | {file = "pyarrow-7.0.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:702c5a9f960b56d03569eaaca2c1a05e8728f05ea1a2138ef64234aa53cd5884"}, 1958 | {file = "pyarrow-7.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7313038203df77ec4092d6363dbc0945071caa72635f365f2b1ae0dd7469865"}, 1959 | {file = "pyarrow-7.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e87d1f7dc7a0b2ecaeb0c7a883a85710f5b5626d4134454f905571c04bc73d5a"}, 1960 | {file = "pyarrow-7.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:ba69488ae25c7fde1a2ae9ea29daf04d676de8960ffd6f82e1e13ca945bb5861"}, 1961 | {file = "pyarrow-7.0.0-cp39-cp39-macosx_10_13_universal2.whl", hash = "sha256:11a591f11d2697c751261c9d57e6e5b0d38fdc7f0cc57f4fd6edc657da7737df"}, 1962 | {file = "pyarrow-7.0.0-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:6183c700877852dc0f8a76d4c0c2ffd803ba459e2b4a452e355c2d58d48cf39f"}, 1963 | {file = "pyarrow-7.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d1748154714b543e6ae8452a68d4af85caf5298296a7e5d4d00f1b3021838ac6"}, 1964 | {file = "pyarrow-7.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcc8f934c7847a88f13ec35feecffb61fe63bb7a3078bd98dd353762e969ce60"}, 1965 | {file = "pyarrow-7.0.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:759f59ac77b84878dbd54d06cf6df74ff781b8e7cf9313eeffbb5ec97b94385c"}, 1966 | {file = "pyarrow-7.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d3e3f93ac2993df9c5e1922eab7bdea047b9da918a74e52145399bc1f0099a3"}, 1967 | {file = "pyarrow-7.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:306120af554e7e137895254a3b4741fad682875a5f6403509cd276de3fe5b844"}, 1968 | {file = "pyarrow-7.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:087769dac6e567d58d59b94c4f866b3356c00d3db5b261387ece47e7324c2150"}, 1969 | {file = "pyarrow-7.0.0.tar.gz", hash = "sha256:da656cad3c23a2ebb6a307ab01d35fce22f7850059cffafcb90d12590f8f4f38"}, 1970 | ] 1971 | pycodestyle = [ 1972 | {file = "pycodestyle-2.7.0-py2.py3-none-any.whl", hash = "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068"}, 1973 | {file = "pycodestyle-2.7.0.tar.gz", hash = "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef"}, 1974 | ] 1975 | pycparser = [ 1976 | {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"}, 1977 | {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, 1978 | ] 1979 | pydeck = [ 1980 | {file = "pydeck-0.7.1-py2.py3-none-any.whl", hash = "sha256:7fc49b00840608068b930f9269169c7c9f3198b8b4635c934ba6d887c4e54503"}, 1981 | {file = "pydeck-0.7.1.tar.gz", hash = "sha256:907601c99f7510e16d27d7cb62bfa145216d166a2b5c9c50cfe2b65b032ebd2e"}, 1982 | ] 1983 | pygments = [ 1984 | {file = "Pygments-2.9.0-py3-none-any.whl", hash = "sha256:d66e804411278594d764fc69ec36ec13d9ae9147193a1740cd34d272ca383b8e"}, 1985 | {file = "Pygments-2.9.0.tar.gz", hash = "sha256:a18f47b506a429f6f4b9df81bb02beab9ca21d0a5fee38ed15aef65f0545519f"}, 1986 | ] 1987 | pympler = [ 1988 | {file = "Pympler-1.0.1-py3-none-any.whl", hash = "sha256:d260dda9ae781e1eab6ea15bacb84015849833ba5555f141d2d9b7b7473b307d"}, 1989 | {file = "Pympler-1.0.1.tar.gz", hash = "sha256:993f1a3599ca3f4fcd7160c7545ad06310c9e12f70174ae7ae8d4e25f6c5d3fa"}, 1990 | ] 1991 | pyparsing = [ 1992 | {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, 1993 | {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, 1994 | ] 1995 | pyrsistent = [ 1996 | {file = "pyrsistent-0.17.3.tar.gz", hash = "sha256:2e636185d9eb976a18a8a8e96efce62f2905fea90041958d8cc2a189756ebf3e"}, 1997 | ] 1998 | pytest = [ 1999 | {file = "pytest-5.4.3-py3-none-any.whl", hash = "sha256:5c0db86b698e8f170ba4582a492248919255fcd4c79b1ee64ace34301fb589a1"}, 2000 | {file = "pytest-5.4.3.tar.gz", hash = "sha256:7979331bfcba207414f5e1263b5a0f8f521d0f457318836a7355531ed1a4c7d8"}, 2001 | ] 2002 | python-dateutil = [ 2003 | {file = "python-dateutil-2.8.1.tar.gz", hash = "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c"}, 2004 | {file = "python_dateutil-2.8.1-py2.py3-none-any.whl", hash = "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"}, 2005 | ] 2006 | pytz = [ 2007 | {file = "pytz-2021.3-py2.py3-none-any.whl", hash = "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c"}, 2008 | {file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"}, 2009 | ] 2010 | pytz-deprecation-shim = [ 2011 | {file = "pytz_deprecation_shim-0.1.0.post0-py2.py3-none-any.whl", hash = "sha256:8314c9692a636c8eb3bda879b9f119e350e93223ae83e70e80c31675a0fdc1a6"}, 2012 | {file = "pytz_deprecation_shim-0.1.0.post0.tar.gz", hash = "sha256:af097bae1b616dde5c5744441e2ddc69e74dfdcb0c263129610d85b87445a59d"}, 2013 | ] 2014 | pywin32 = [ 2015 | {file = "pywin32-301-cp35-cp35m-win32.whl", hash = "sha256:93367c96e3a76dfe5003d8291ae16454ca7d84bb24d721e0b74a07610b7be4a7"}, 2016 | {file = "pywin32-301-cp35-cp35m-win_amd64.whl", hash = "sha256:9635df6998a70282bd36e7ac2a5cef9ead1627b0a63b17c731312c7a0daebb72"}, 2017 | {file = "pywin32-301-cp36-cp36m-win32.whl", hash = "sha256:c866f04a182a8cb9b7855de065113bbd2e40524f570db73ef1ee99ff0a5cc2f0"}, 2018 | {file = "pywin32-301-cp36-cp36m-win_amd64.whl", hash = "sha256:dafa18e95bf2a92f298fe9c582b0e205aca45c55f989937c52c454ce65b93c78"}, 2019 | {file = "pywin32-301-cp37-cp37m-win32.whl", hash = "sha256:98f62a3f60aa64894a290fb7494bfa0bfa0a199e9e052e1ac293b2ad3cd2818b"}, 2020 | {file = "pywin32-301-cp37-cp37m-win_amd64.whl", hash = "sha256:fb3b4933e0382ba49305cc6cd3fb18525df7fd96aa434de19ce0878133bf8e4a"}, 2021 | {file = "pywin32-301-cp38-cp38-win32.whl", hash = "sha256:88981dd3cfb07432625b180f49bf4e179fb8cbb5704cd512e38dd63636af7a17"}, 2022 | {file = "pywin32-301-cp38-cp38-win_amd64.whl", hash = "sha256:8c9d33968aa7fcddf44e47750e18f3d034c3e443a707688a008a2e52bbef7e96"}, 2023 | {file = "pywin32-301-cp39-cp39-win32.whl", hash = "sha256:595d397df65f1b2e0beaca63a883ae6d8b6df1cdea85c16ae85f6d2e648133fe"}, 2024 | {file = "pywin32-301-cp39-cp39-win_amd64.whl", hash = "sha256:87604a4087434cd814ad8973bd47d6524bd1fa9e971ce428e76b62a5e0860fdf"}, 2025 | ] 2026 | pywinpty = [ 2027 | {file = "pywinpty-1.1.3-cp36-none-win_amd64.whl", hash = "sha256:81dc6f16d917b756e06fc58943e9750d59dbefc0ffd2086871d3fa5f33824446"}, 2028 | {file = "pywinpty-1.1.3-cp37-none-win_amd64.whl", hash = "sha256:54557887e712ea3215ab0d9f089ed55a6cc8d826cd5d1e340d75300654c9663f"}, 2029 | {file = "pywinpty-1.1.3-cp38-none-win_amd64.whl", hash = "sha256:f5e25197397f1fef0362caf3eb89f25441827a1e48bf15827c27021592fd2160"}, 2030 | {file = "pywinpty-1.1.3-cp39-none-win_amd64.whl", hash = "sha256:b767276224f86b7560eb9173ba7956758cafcdfab97bb33837d42d2a0f1dbf67"}, 2031 | {file = "pywinpty-1.1.3.tar.gz", hash = "sha256:3a1d57b338390333812a5eed31c93c7d8ba82b131078063703e731946d90c9f2"}, 2032 | ] 2033 | pyzmq = [ 2034 | {file = "pyzmq-22.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4e9b9a2f6944acdaf57316436c1acdcb30b8df76726bcf570ad9342bc5001654"}, 2035 | {file = "pyzmq-22.1.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:24fb5bb641f0b2aa25fc3832f4b6fc62430f14a7d328229fe994b2bcdc07c93a"}, 2036 | {file = "pyzmq-22.1.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:c4674004ed64685a38bee222cd75afa769424ec603f9329f0dd4777138337f48"}, 2037 | {file = "pyzmq-22.1.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:461ed80d741692d9457ab820b1cc057ba9c37c394e67b647b639f623c8b321f6"}, 2038 | {file = "pyzmq-22.1.0-cp36-cp36m-win32.whl", hash = "sha256:de5806be66c9108e4dcdaced084e8ceae14100aa559e2d57b4f0cceb98c462de"}, 2039 | {file = "pyzmq-22.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a1c77796f395804d6002ff56a6a8168c1f98579896897ad7e35665a9b4a9eec5"}, 2040 | {file = "pyzmq-22.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c6a81c9e6754465d09a87e3acd74d9bb1f0039b2d785c6899622f0afdb41d760"}, 2041 | {file = "pyzmq-22.1.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0f0f27eaab9ba7b92d73d71c51d1a04464a1da6097a252d007922103253d2313"}, 2042 | {file = "pyzmq-22.1.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:4b8fb1b3174b56fd020e4b10232b1764e52cf7f3babcfb460c5253bdc48adad0"}, 2043 | {file = "pyzmq-22.1.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:c8fff75af4c7af92dce9f81fa2a83ed009c3e1f33ee8b5222db2ef80b94e242e"}, 2044 | {file = "pyzmq-22.1.0-cp37-cp37m-win32.whl", hash = "sha256:cb9f9fe1305ef69b65794655fd89b2209b11bff3e837de981820a8aa051ef914"}, 2045 | {file = "pyzmq-22.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bf80b2cec42d96117248b99d3c86e263a00469c840a778e6cb52d916f4fdf82c"}, 2046 | {file = "pyzmq-22.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0ea7f4237991b0f745a4432c63e888450840bf8cb6c48b93fb7d62864f455529"}, 2047 | {file = "pyzmq-22.1.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:12ffcf33db6ba7c0e5aaf901e65517f5e2b719367b80bcbfad692f546a297c7a"}, 2048 | {file = "pyzmq-22.1.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d3ecfee2ee8d91ab2e08d2d8e89302c729b244e302bbc39c5b5dde42306ff003"}, 2049 | {file = "pyzmq-22.1.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:68e2c4505992ab5b89f976f89a9135742b18d60068f761bef994a6805f1cae0c"}, 2050 | {file = "pyzmq-22.1.0-cp38-cp38-win32.whl", hash = "sha256:285514956c08c7830da9d94e01f5414661a987831bd9f95e4d89cc8aaae8da10"}, 2051 | {file = "pyzmq-22.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:d5e5be93e1714a59a535bbbc086b9e4fd2448c7547c5288548f6fd86353cad9e"}, 2052 | {file = "pyzmq-22.1.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:b2f707b52e09098a7770503e39294ca6e22ae5138ffa1dd36248b6436d23d78e"}, 2053 | {file = "pyzmq-22.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:18dd2ca4540c476558099891c129e6f94109971d110b549db2a9775c817cedbd"}, 2054 | {file = "pyzmq-22.1.0-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:c6d0c32532a0519997e1ded767e184ebb8543bdb351f8eff8570bd461e874efc"}, 2055 | {file = "pyzmq-22.1.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:9ee48413a2d3cd867fd836737b4c89c24cea1150a37f4856d82d20293fa7519f"}, 2056 | {file = "pyzmq-22.1.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:4c4fe69c7dc0d13d4ae180ad650bb900854367f3349d3c16f0569f6c6447f698"}, 2057 | {file = "pyzmq-22.1.0-cp39-cp39-win32.whl", hash = "sha256:fc712a90401bcbf3fa25747f189d6dcfccbecc32712701cad25c6355589dac57"}, 2058 | {file = "pyzmq-22.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:68be16107f41563b9f67d93dff1c9f5587e0f76aa8fd91dc04c83d813bcdab1f"}, 2059 | {file = "pyzmq-22.1.0-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:734ea6565c71fc2d03d5b8c7d0d7519c96bb5567e0396da1b563c24a4ac66f0c"}, 2060 | {file = "pyzmq-22.1.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:1389b615917d4196962a9b469e947ba862a8ec6f5094a47da5e7a8d404bc07a4"}, 2061 | {file = "pyzmq-22.1.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:41049cff5265e9cd75606aa2c90a76b9c80b98d8fe70ee08cf4af3cedb113358"}, 2062 | {file = "pyzmq-22.1.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f49755684a963731479ff3035d45a8185545b4c9f662d368bd349c419839886d"}, 2063 | {file = "pyzmq-22.1.0-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:6355f81947e1fe6e7bb9e123aeb3067264391d3ebe8402709f824ef8673fa6f3"}, 2064 | {file = "pyzmq-22.1.0-pp37-pypy37_pp73-win32.whl", hash = "sha256:089b974ec04d663b8685ac90e86bfe0e4da9d911ff3cf52cb765ff22408b102d"}, 2065 | {file = "pyzmq-22.1.0.tar.gz", hash = "sha256:7040d6dd85ea65703904d023d7f57fab793d7ffee9ba9e14f3b897f34ff2415d"}, 2066 | ] 2067 | qtconsole = [ 2068 | {file = "qtconsole-5.1.0-py3-none-any.whl", hash = "sha256:3a2adecc43ff201a08972fb2179df22e7b3a08d71b9ed680f46ad1bfd4fb9132"}, 2069 | {file = "qtconsole-5.1.0.tar.gz", hash = "sha256:12c734494901658787339dea9bbd82f3dc0d5e394071377a1c77b4a0954d7d8b"}, 2070 | ] 2071 | qtpy = [ 2072 | {file = "QtPy-1.9.0-py2.py3-none-any.whl", hash = "sha256:fa0b8363b363e89b2a6f49eddc162a04c0699ae95e109a6be3bb145a913190ea"}, 2073 | {file = "QtPy-1.9.0.tar.gz", hash = "sha256:2db72c44b55d0fe1407be8fba35c838ad0d6d3bb81f23007886dc1fc0f459c8d"}, 2074 | ] 2075 | requests = [ 2076 | {file = "requests-2.25.1-py2.py3-none-any.whl", hash = "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"}, 2077 | {file = "requests-2.25.1.tar.gz", hash = "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804"}, 2078 | ] 2079 | scipy = [ 2080 | {file = "scipy-1.6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a15a1f3fc0abff33e792d6049161b7795909b40b97c6cc2934ed54384017ab76"}, 2081 | {file = "scipy-1.6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:e79570979ccdc3d165456dd62041d9556fb9733b86b4b6d818af7a0afc15f092"}, 2082 | {file = "scipy-1.6.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:a423533c55fec61456dedee7b6ee7dce0bb6bfa395424ea374d25afa262be261"}, 2083 | {file = "scipy-1.6.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:33d6b7df40d197bdd3049d64e8e680227151673465e5d85723b3b8f6b15a6ced"}, 2084 | {file = "scipy-1.6.1-cp37-cp37m-win32.whl", hash = "sha256:6725e3fbb47da428794f243864f2297462e9ee448297c93ed1dcbc44335feb78"}, 2085 | {file = "scipy-1.6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:5fa9c6530b1661f1370bcd332a1e62ca7881785cc0f80c0d559b636567fab63c"}, 2086 | {file = "scipy-1.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bd50daf727f7c195e26f27467c85ce653d41df4358a25b32434a50d8870fc519"}, 2087 | {file = "scipy-1.6.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:f46dd15335e8a320b0fb4685f58b7471702234cba8bb3442b69a3e1dc329c345"}, 2088 | {file = "scipy-1.6.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:0e5b0ccf63155d90da576edd2768b66fb276446c371b73841e3503be1d63fb5d"}, 2089 | {file = "scipy-1.6.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:2481efbb3740977e3c831edfd0bd9867be26387cacf24eb5e366a6a374d3d00d"}, 2090 | {file = "scipy-1.6.1-cp38-cp38-win32.whl", hash = "sha256:68cb4c424112cd4be886b4d979c5497fba190714085f46b8ae67a5e4416c32b4"}, 2091 | {file = "scipy-1.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:5f331eeed0297232d2e6eea51b54e8278ed8bb10b099f69c44e2558c090d06bf"}, 2092 | {file = "scipy-1.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0c8a51d33556bf70367452d4d601d1742c0e806cd0194785914daf19775f0e67"}, 2093 | {file = "scipy-1.6.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:83bf7c16245c15bc58ee76c5418e46ea1811edcc2e2b03041b804e46084ab627"}, 2094 | {file = "scipy-1.6.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:794e768cc5f779736593046c9714e0f3a5940bc6dcc1dba885ad64cbfb28e9f0"}, 2095 | {file = "scipy-1.6.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5da5471aed911fe7e52b86bf9ea32fb55ae93e2f0fac66c32e58897cfb02fa07"}, 2096 | {file = "scipy-1.6.1-cp39-cp39-win32.whl", hash = "sha256:8e403a337749ed40af60e537cc4d4c03febddcc56cd26e774c9b1b600a70d3e4"}, 2097 | {file = "scipy-1.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:a5193a098ae9f29af283dcf0041f762601faf2e595c0db1da929875b7570353f"}, 2098 | {file = "scipy-1.6.1.tar.gz", hash = "sha256:c4fceb864890b6168e79b0e714c585dbe2fd4222768ee90bc1aa0f8218691b11"}, 2099 | ] 2100 | send2trash = [ 2101 | {file = "Send2Trash-1.7.1-py3-none-any.whl", hash = "sha256:c20fee8c09378231b3907df9c215ec9766a84ee20053d99fbad854fe8bd42159"}, 2102 | {file = "Send2Trash-1.7.1.tar.gz", hash = "sha256:17730aa0a33ab82ed6ca76be3bb25f0433d0014f1ccf63c979bab13a5b9db2b2"}, 2103 | ] 2104 | six = [ 2105 | {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, 2106 | {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, 2107 | ] 2108 | smmap = [ 2109 | {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, 2110 | {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, 2111 | ] 2112 | streamlit = [ 2113 | {file = "streamlit-1.5.1-py2.py3-none-any.whl", hash = "sha256:65eb527816cf93532dcec2aaaac8e48b304b830b1147beaef41d5e50db85334e"}, 2114 | {file = "streamlit-1.5.1.tar.gz", hash = "sha256:94f6dc49a607a2fa909ee286d2120769b69af1899573bc56568301eee0b3b76a"}, 2115 | ] 2116 | tensorflow-probability = [ 2117 | {file = "tensorflow_probability-0.13.0-py2.py3-none-any.whl", hash = "sha256:308c05998731d0de077a81f4537bef34523cab406fdae09e3e11854d45a075bb"}, 2118 | ] 2119 | terminado = [ 2120 | {file = "terminado-0.10.1-py3-none-any.whl", hash = "sha256:c89ace5bffd0e7268bdcf22526830eb787fd146ff9d78691a0528386f92b9ae3"}, 2121 | {file = "terminado-0.10.1.tar.gz", hash = "sha256:89d5dac2f4e2b39758a0ff9a3b643707c95a020a6df36e70583b88297cd59cbe"}, 2122 | ] 2123 | testpath = [ 2124 | {file = "testpath-0.5.0-py3-none-any.whl", hash = "sha256:8044f9a0bab6567fc644a3593164e872543bb44225b0e24846e2c89237937589"}, 2125 | {file = "testpath-0.5.0.tar.gz", hash = "sha256:1acf7a0bcd3004ae8357409fc33751e16d37ccc650921da1094a86581ad1e417"}, 2126 | ] 2127 | toml = [ 2128 | {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, 2129 | {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, 2130 | ] 2131 | toolz = [ 2132 | {file = "toolz-0.11.2-py3-none-any.whl", hash = "sha256:a5700ce83414c64514d82d60bcda8aabfde092d1c1a8663f9200c07fdcc6da8f"}, 2133 | {file = "toolz-0.11.2.tar.gz", hash = "sha256:6b312d5e15138552f1bda8a4e66c30e236c831b612b2bf0005f8a1df10a4bc33"}, 2134 | ] 2135 | torch = [ 2136 | {file = "torch-1.9.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:3a2d070cf28860d285d4ab156f3954c0c1d12f4c037aa312a7c029227c0d106b"}, 2137 | {file = "torch-1.9.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:b296e65e25081af147af936f1e3a1f17f583a9afacfa5309742678ffef728ace"}, 2138 | {file = "torch-1.9.0-cp36-cp36m-win_amd64.whl", hash = "sha256:117098d4924b260a24a47c6b3fe37f2ae41f04a2ea2eff9f553ae9210b12fa54"}, 2139 | {file = "torch-1.9.0-cp36-none-macosx_10_9_x86_64.whl", hash = "sha256:d6103b9a634993bd967337a1149f9d8b23922f42a3660676239399e15c1b4515"}, 2140 | {file = "torch-1.9.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:0164673908e6b291ace592d382eba3e258b3bad009b8078cad8f3b9e00d8f23e"}, 2141 | {file = "torch-1.9.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:52548b45efff772fe3810fe91daf34f981ac0ca1a7227f6226fd5693f53b5b88"}, 2142 | {file = "torch-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62c0a7e433681d0861494d1ede96d2485e4dbb3ea8fd867e8419addebf5de1af"}, 2143 | {file = "torch-1.9.0-cp37-none-macosx_10_9_x86_64.whl", hash = "sha256:d88333091fd1627894bbf0d6dcef58a90e36bdf0d90a5d4675b5e07e72075511"}, 2144 | {file = "torch-1.9.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:1d8139dcc864f48dc316376384f50e47a459284ad1cb84449242f4964e25aaec"}, 2145 | {file = "torch-1.9.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:0aa4cca3f16fab40cb8dae6a49d0eccdc8f4ead9d1a6428cd9ba12befe082b2a"}, 2146 | {file = "torch-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:646de1bef85d6c7590e98f8ea52e47acdcf58330982e4f5d73f5ca28dea2d552"}, 2147 | {file = "torch-1.9.0-cp38-none-macosx_10_9_x86_64.whl", hash = "sha256:e596f0105f748cf09d4763152d8157aaf58d5231232eaf2c5673d4562ba86ad3"}, 2148 | {file = "torch-1.9.0-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:ecc7193fff7741ced3db1f760666c8454d6664956288c54d1b49613b987a42f4"}, 2149 | {file = "torch-1.9.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:95eeec3a6c42fd35aca552777b7d9979ed489760423de97c0118a45e849a61f4"}, 2150 | {file = "torch-1.9.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:8a2b2012b3c7d6019e189496688fa77de7029a220840b406d8302d1c8021a11c"}, 2151 | {file = "torch-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:7e2b14fe5b3a8266cbe2f6740c0195497507974ced7bc21e99971561913a0c28"}, 2152 | {file = "torch-1.9.0-cp39-none-macosx_10_9_x86_64.whl", hash = "sha256:0a9e74b5057463ce4e55d9332a5670993fc9e1299c52e1740e505eda106fb355"}, 2153 | {file = "torch-1.9.0-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:569ead6ae6bb0e636df0fc8af660ef03260e630dc5f2f4cf3198027e7b6bb481"}, 2154 | ] 2155 | torchvision = [ 2156 | {file = "torchvision-0.10.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f26c5ba220445ee8e892033234485c9276304874e87ec9d5146779167be3148d"}, 2157 | {file = "torchvision-0.10.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d5c80cf058c0ecb010a97dc71225f5274e45c596bfad7505e0d000abcccb7063"}, 2158 | {file = "torchvision-0.10.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:6d69bf15a6e885e3b8c674a524bc6b53016879cb8b0fd8537327edd2d243cab1"}, 2159 | {file = "torchvision-0.10.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6b917d4762deaaa4c0cdd106403ea8384a1fdf93de424097bd71f3ebfdc76b41"}, 2160 | {file = "torchvision-0.10.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a405d968e7e94c0744870eef31c977635e2123b0b46becc1461a28b7c27d3c0c"}, 2161 | {file = "torchvision-0.10.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:9597da592f76d22d9e80a4a072294e093f8c3a06c404f3ff237f359b9225e097"}, 2162 | {file = "torchvision-0.10.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:ce2aae5567522f2a877c6334796721af07c164e94ff75876821fadb3310cfe7e"}, 2163 | {file = "torchvision-0.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:576d7b070f25cbfc78a710960fd8fa6d3961d640db05f7ace69d9a3e5bbf754a"}, 2164 | {file = "torchvision-0.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ad24107b2ed0ccc372af92822f1f8f5530907b6fb7520a08195cf0bb07446923"}, 2165 | {file = "torchvision-0.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bb04708354fb6d639f6e47d8066b0d546fbe0a3a68685cf8d413a6370c8f63ad"}, 2166 | {file = "torchvision-0.10.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:aa709fa63896f93e03a03976230a51050fcd5f1b45cf663f62d91b7eaaf8ac09"}, 2167 | {file = "torchvision-0.10.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:4796e1fb2995c6e495c5ea4e2b0fe0e4be44bd9416ef4a1349c1a406675cbdee"}, 2168 | {file = "torchvision-0.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:487bbfd89575a52cd18bca8a33e24c373570e060f801265051c3a0aafc769720"}, 2169 | {file = "torchvision-0.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f68291559a4cf1245c95efc5e47ebe158819aceec4e1f585d2fe133cd2c9d8e8"}, 2170 | {file = "torchvision-0.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ae9606cc248de9b3a077710529b11c57315d2914c8ee3099fbd93a62f56a1661"}, 2171 | {file = "torchvision-0.10.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:20a57ce42fa20c26d800c65d5b88dbaaa115a01f4f5623d41abfb182b854f199"}, 2172 | {file = "torchvision-0.10.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:a30466893a5b97073c992859f3645e3e1f41daf2c1b4db6cb2ac8ec7d0e1f6bc"}, 2173 | {file = "torchvision-0.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:da65af25b51caf43327ecb3ccf550eedfd62d1f73511db44370b4b9522569b8d"}, 2174 | ] 2175 | tornado = [ 2176 | {file = "tornado-6.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32"}, 2177 | {file = "tornado-6.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:0d321a39c36e5f2c4ff12b4ed58d41390460f798422c4504e09eb5678e09998c"}, 2178 | {file = "tornado-6.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9de9e5188a782be6b1ce866e8a51bc76a0fbaa0e16613823fc38e4fc2556ad05"}, 2179 | {file = "tornado-6.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:61b32d06ae8a036a6607805e6720ef00a3c98207038444ba7fd3d169cd998910"}, 2180 | {file = "tornado-6.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:3e63498f680547ed24d2c71e6497f24bca791aca2fe116dbc2bd0ac7f191691b"}, 2181 | {file = "tornado-6.1-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:6c77c9937962577a6a76917845d06af6ab9197702a42e1346d8ae2e76b5e3675"}, 2182 | {file = "tornado-6.1-cp35-cp35m-win32.whl", hash = "sha256:6286efab1ed6e74b7028327365cf7346b1d777d63ab30e21a0f4d5b275fc17d5"}, 2183 | {file = "tornado-6.1-cp35-cp35m-win_amd64.whl", hash = "sha256:fa2ba70284fa42c2a5ecb35e322e68823288a4251f9ba9cc77be04ae15eada68"}, 2184 | {file = "tornado-6.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0a00ff4561e2929a2c37ce706cb8233b7907e0cdc22eab98888aca5dd3775feb"}, 2185 | {file = "tornado-6.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:748290bf9112b581c525e6e6d3820621ff020ed95af6f17fedef416b27ed564c"}, 2186 | {file = "tornado-6.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:e385b637ac3acaae8022e7e47dfa7b83d3620e432e3ecb9a3f7f58f150e50921"}, 2187 | {file = "tornado-6.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:25ad220258349a12ae87ede08a7b04aca51237721f63b1808d39bdb4b2164558"}, 2188 | {file = "tornado-6.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:65d98939f1a2e74b58839f8c4dab3b6b3c1ce84972ae712be02845e65391ac7c"}, 2189 | {file = "tornado-6.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:e519d64089b0876c7b467274468709dadf11e41d65f63bba207e04217f47c085"}, 2190 | {file = "tornado-6.1-cp36-cp36m-win32.whl", hash = "sha256:b87936fd2c317b6ee08a5741ea06b9d11a6074ef4cc42e031bc6403f82a32575"}, 2191 | {file = "tornado-6.1-cp36-cp36m-win_amd64.whl", hash = "sha256:cc0ee35043162abbf717b7df924597ade8e5395e7b66d18270116f8745ceb795"}, 2192 | {file = "tornado-6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7250a3fa399f08ec9cb3f7b1b987955d17e044f1ade821b32e5f435130250d7f"}, 2193 | {file = "tornado-6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ed3ad863b1b40cd1d4bd21e7498329ccaece75db5a5bf58cd3c9f130843e7102"}, 2194 | {file = "tornado-6.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:dcef026f608f678c118779cd6591c8af6e9b4155c44e0d1bc0c87c036fb8c8c4"}, 2195 | {file = "tornado-6.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:70dec29e8ac485dbf57481baee40781c63e381bebea080991893cd297742b8fd"}, 2196 | {file = "tornado-6.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:d3f7594930c423fd9f5d1a76bee85a2c36fd8b4b16921cae7e965f22575e9c01"}, 2197 | {file = "tornado-6.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3447475585bae2e77ecb832fc0300c3695516a47d46cefa0528181a34c5b9d3d"}, 2198 | {file = "tornado-6.1-cp37-cp37m-win32.whl", hash = "sha256:e7229e60ac41a1202444497ddde70a48d33909e484f96eb0da9baf8dc68541df"}, 2199 | {file = "tornado-6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:cb5ec8eead331e3bb4ce8066cf06d2dfef1bfb1b2a73082dfe8a161301b76e37"}, 2200 | {file = "tornado-6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:20241b3cb4f425e971cb0a8e4ffc9b0a861530ae3c52f2b0434e6c1b57e9fd95"}, 2201 | {file = "tornado-6.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:c77da1263aa361938476f04c4b6c8916001b90b2c2fdd92d8d535e1af48fba5a"}, 2202 | {file = "tornado-6.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:fba85b6cd9c39be262fcd23865652920832b61583de2a2ca907dbd8e8a8c81e5"}, 2203 | {file = "tornado-6.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:1e8225a1070cd8eec59a996c43229fe8f95689cb16e552d130b9793cb570a288"}, 2204 | {file = "tornado-6.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d14d30e7f46a0476efb0deb5b61343b1526f73ebb5ed84f23dc794bdb88f9d9f"}, 2205 | {file = "tornado-6.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8f959b26f2634a091bb42241c3ed8d3cedb506e7c27b8dd5c7b9f745318ddbb6"}, 2206 | {file = "tornado-6.1-cp38-cp38-win32.whl", hash = "sha256:34ca2dac9e4d7afb0bed4677512e36a52f09caa6fded70b4e3e1c89dbd92c326"}, 2207 | {file = "tornado-6.1-cp38-cp38-win_amd64.whl", hash = "sha256:6196a5c39286cc37c024cd78834fb9345e464525d8991c21e908cc046d1cc02c"}, 2208 | {file = "tornado-6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0ba29bafd8e7e22920567ce0d232c26d4d47c8b5cf4ed7b562b5db39fa199c5"}, 2209 | {file = "tornado-6.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:33892118b165401f291070100d6d09359ca74addda679b60390b09f8ef325ffe"}, 2210 | {file = "tornado-6.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7da13da6f985aab7f6f28debab00c67ff9cbacd588e8477034c0652ac141feea"}, 2211 | {file = "tornado-6.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:e0791ac58d91ac58f694d8d2957884df8e4e2f6687cdf367ef7eb7497f79eaa2"}, 2212 | {file = "tornado-6.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:66324e4e1beede9ac79e60f88de548da58b1f8ab4b2f1354d8375774f997e6c0"}, 2213 | {file = "tornado-6.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:a48900ecea1cbb71b8c71c620dee15b62f85f7c14189bdeee54966fbd9a0c5bd"}, 2214 | {file = "tornado-6.1-cp39-cp39-win32.whl", hash = "sha256:d3d20ea5782ba63ed13bc2b8c291a053c8d807a8fa927d941bd718468f7b950c"}, 2215 | {file = "tornado-6.1-cp39-cp39-win_amd64.whl", hash = "sha256:548430be2740e327b3fe0201abe471f314741efcb0067ec4f2d7dcfb4825f3e4"}, 2216 | {file = "tornado-6.1.tar.gz", hash = "sha256:33c6e81d7bd55b468d2e793517c909b139960b6c790a60b7991b9b6b76fb9791"}, 2217 | ] 2218 | traitlets = [ 2219 | {file = "traitlets-5.0.5-py3-none-any.whl", hash = "sha256:69ff3f9d5351f31a7ad80443c2674b7099df13cc41fc5fa6e2f6d3b0330b0426"}, 2220 | {file = "traitlets-5.0.5.tar.gz", hash = "sha256:178f4ce988f69189f7e523337a3e11d91c786ded9360174a3d9ca83e79bc5396"}, 2221 | ] 2222 | typing-extensions = [ 2223 | {file = "typing_extensions-3.10.0.0-py2-none-any.whl", hash = "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497"}, 2224 | {file = "typing_extensions-3.10.0.0-py3-none-any.whl", hash = "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84"}, 2225 | {file = "typing_extensions-3.10.0.0.tar.gz", hash = "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342"}, 2226 | ] 2227 | tzdata = [ 2228 | {file = "tzdata-2021.5-py2.py3-none-any.whl", hash = "sha256:3eee491e22ebfe1e5cfcc97a4137cd70f092ce59144d81f8924a844de05ba8f5"}, 2229 | {file = "tzdata-2021.5.tar.gz", hash = "sha256:68dbe41afd01b867894bbdfd54fa03f468cfa4f0086bfb4adcd8de8f24f3ee21"}, 2230 | ] 2231 | tzlocal = [ 2232 | {file = "tzlocal-4.1-py3-none-any.whl", hash = "sha256:28ba8d9fcb6c9a782d6e0078b4f6627af1ea26aeaa32b4eab5324abc7df4149f"}, 2233 | {file = "tzlocal-4.1.tar.gz", hash = "sha256:0f28015ac68a5c067210400a9197fc5d36ba9bc3f8eaf1da3cbd59acdfed9e09"}, 2234 | ] 2235 | urllib3 = [ 2236 | {file = "urllib3-1.26.6-py2.py3-none-any.whl", hash = "sha256:39fb8672126159acb139a7718dd10806104dec1e2f0f6c88aab05d17df10c8d4"}, 2237 | {file = "urllib3-1.26.6.tar.gz", hash = "sha256:f57b4c16c62fa2760b7e3d97c35b255512fb6b59a259730f36ba32ce9f8e342f"}, 2238 | ] 2239 | validators = [ 2240 | {file = "validators-0.18.2-py3-none-any.whl", hash = "sha256:0143dcca8a386498edaf5780cbd5960da1a4c85e0719f3ee5c9b41249c4fefbd"}, 2241 | {file = "validators-0.18.2.tar.gz", hash = "sha256:37cd9a9213278538ad09b5b9f9134266e7c226ab1fede1d500e29e0a8fbb9ea6"}, 2242 | ] 2243 | watchdog = [ 2244 | {file = "watchdog-2.1.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9693f35162dc6208d10b10ddf0458cc09ad70c30ba689d9206e02cd836ce28a3"}, 2245 | {file = "watchdog-2.1.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:aba5c812f8ee8a3ff3be51887ca2d55fb8e268439ed44110d3846e4229eb0e8b"}, 2246 | {file = "watchdog-2.1.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4ae38bf8ba6f39d5b83f78661273216e7db5b00f08be7592062cb1fc8b8ba542"}, 2247 | {file = "watchdog-2.1.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ad6f1796e37db2223d2a3f302f586f74c72c630b48a9872c1e7ae8e92e0ab669"}, 2248 | {file = "watchdog-2.1.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:922a69fa533cb0c793b483becaaa0845f655151e7256ec73630a1b2e9ebcb660"}, 2249 | {file = "watchdog-2.1.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b2fcf9402fde2672545b139694284dc3b665fd1be660d73eca6805197ef776a3"}, 2250 | {file = "watchdog-2.1.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3386b367e950a11b0568062b70cc026c6f645428a698d33d39e013aaeda4cc04"}, 2251 | {file = "watchdog-2.1.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8f1c00aa35f504197561060ca4c21d3cc079ba29cf6dd2fe61024c70160c990b"}, 2252 | {file = "watchdog-2.1.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b52b88021b9541a60531142b0a451baca08d28b74a723d0c99b13c8c8d48d604"}, 2253 | {file = "watchdog-2.1.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8047da932432aa32c515ec1447ea79ce578d0559362ca3605f8e9568f844e3c6"}, 2254 | {file = "watchdog-2.1.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e92c2d33858c8f560671b448205a268096e17870dcf60a9bb3ac7bfbafb7f5f9"}, 2255 | {file = "watchdog-2.1.6-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b7d336912853d7b77f9b2c24eeed6a5065d0a0cc0d3b6a5a45ad6d1d05fb8cd8"}, 2256 | {file = "watchdog-2.1.6-py3-none-manylinux2014_aarch64.whl", hash = "sha256:cca7741c0fcc765568350cb139e92b7f9f3c9a08c4f32591d18ab0a6ac9e71b6"}, 2257 | {file = "watchdog-2.1.6-py3-none-manylinux2014_armv7l.whl", hash = "sha256:25fb5240b195d17de949588628fdf93032ebf163524ef08933db0ea1f99bd685"}, 2258 | {file = "watchdog-2.1.6-py3-none-manylinux2014_i686.whl", hash = "sha256:be9be735f827820a06340dff2ddea1fb7234561fa5e6300a62fe7f54d40546a0"}, 2259 | {file = "watchdog-2.1.6-py3-none-manylinux2014_ppc64.whl", hash = "sha256:d0d19fb2441947b58fbf91336638c2b9f4cc98e05e1045404d7a4cb7cddc7a65"}, 2260 | {file = "watchdog-2.1.6-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:3becdb380d8916c873ad512f1701f8a92ce79ec6978ffde92919fd18d41da7fb"}, 2261 | {file = "watchdog-2.1.6-py3-none-manylinux2014_s390x.whl", hash = "sha256:ae67501c95606072aafa865b6ed47343ac6484472a2f95490ba151f6347acfc2"}, 2262 | {file = "watchdog-2.1.6-py3-none-manylinux2014_x86_64.whl", hash = "sha256:e0f30db709c939cabf64a6dc5babb276e6d823fd84464ab916f9b9ba5623ca15"}, 2263 | {file = "watchdog-2.1.6-py3-none-win32.whl", hash = "sha256:e02794ac791662a5eafc6ffeaf9bcc149035a0e48eb0a9d40a8feb4622605a3d"}, 2264 | {file = "watchdog-2.1.6-py3-none-win_amd64.whl", hash = "sha256:bd9ba4f332cf57b2c1f698be0728c020399ef3040577cde2939f2e045b39c1e5"}, 2265 | {file = "watchdog-2.1.6-py3-none-win_ia64.whl", hash = "sha256:a0f1c7edf116a12f7245be06120b1852275f9506a7d90227648b250755a03923"}, 2266 | {file = "watchdog-2.1.6.tar.gz", hash = "sha256:a36e75df6c767cbf46f61a91c70b3ba71811dfa0aca4a324d9407a06a8b7a2e7"}, 2267 | ] 2268 | wcwidth = [ 2269 | {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, 2270 | {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, 2271 | ] 2272 | webencodings = [ 2273 | {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, 2274 | {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, 2275 | ] 2276 | widgetsnbextension = [ 2277 | {file = "widgetsnbextension-3.5.1-py2.py3-none-any.whl", hash = "sha256:bd314f8ceb488571a5ffea6cc5b9fc6cba0adaf88a9d2386b93a489751938bcd"}, 2278 | {file = "widgetsnbextension-3.5.1.tar.gz", hash = "sha256:079f87d87270bce047512400efd70238820751a11d2d8cb137a5a5bdbaf255c7"}, 2279 | ] 2280 | zipp = [ 2281 | {file = "zipp-3.4.1-py3-none-any.whl", hash = "sha256:51cb66cc54621609dd593d1787f286ee42a5c0adbb4b29abea5a63edc3e03098"}, 2282 | {file = "zipp-3.4.1.tar.gz", hash = "sha256:3607921face881ba3e026887d8150cca609d517579abe052ac81fc5aeffdbd76"}, 2283 | ] 2284 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "src" 3 | version = "0.1.0" 4 | description = "" 5 | authors = ["Pau "] 6 | 7 | [tool.poetry.dependencies] 8 | python = "^3.7" 9 | torch = "^1.9.0" 10 | cleverhans = "^3.1.0" 11 | torchvision = "^0.10.0" 12 | absl-py = "^0.13.0" 13 | easydict = "^1.9" 14 | jupyter = "^1.0.0" 15 | requests = "^2.25.1" 16 | streamlit = "^1.5.1" 17 | 18 | [tool.poetry.dev-dependencies] 19 | pytest = "^5.2" 20 | 21 | [build-system] 22 | requires = ["poetry>=0.12"] 23 | build-backend = "poetry.masonry.api" 24 | -------------------------------------------------------------------------------- /src/__init__.py: -------------------------------------------------------------------------------- 1 | __version__ = '0.1.0' 2 | -------------------------------------------------------------------------------- /src/fgsm.py: -------------------------------------------------------------------------------- 1 | from typing import Tuple, List, Optional 2 | 3 | import torch 4 | from torch.autograd import Variable 5 | import torch.nn as nn 6 | 7 | from src.model import inverse_preprocess 8 | 9 | 10 | def fast_gradient_sign( 11 | model: nn.Module, 12 | x: torch.Tensor, 13 | eps: float, 14 | output_type: Optional[str] = 'tensor' 15 | ) -> Tuple[torch.Tensor, torch.Tensor]: 16 | """""" 17 | assert output_type in {'tensor', 'rgb'}, 'Invalid output_type!' 18 | 19 | # tensor to variable so we can compute gradients with respect to it. 20 | img_variable = Variable(x, requires_grad=True) 21 | 22 | # forward pass on the original image 23 | output = model.forward(img_variable) 24 | 25 | # predicted class 26 | y_true = torch.max(output.data, 1)[1][0].item() 27 | target = Variable(torch.LongTensor([y_true]), requires_grad=False) 28 | 29 | # loss 30 | loss_fn = torch.nn.CrossEntropyLoss() 31 | loss = loss_fn(output, target) 32 | 33 | # compute gradient wrt each variable (requires_grad=True) 34 | # which you can later access with "var.grad.data" 35 | loss.backward(retain_graph=True) 36 | 37 | # sign of the gradient wrt input image 38 | x_grad = torch.sign(img_variable.grad.data) 39 | 40 | # FGSM 41 | x_adversarial = img_variable.data + eps * x_grad 42 | 43 | if output_type == 'tensor': 44 | return x_adversarial, x_grad 45 | else: 46 | return inverse_preprocess(x_adversarial), inverse_preprocess(x_grad) 47 | 48 | def iterative_fast_gradient_sign( 49 | model: nn.Module, 50 | x_: torch.Tensor, 51 | epsilon, 52 | n_steps: int, 53 | alpha: float 54 | # ) -> List[Tuple[torch.Tensor, torch.Tensor]]: 55 | ) -> Tuple[torch.Tensor, torch.Tensor]: 56 | """""" 57 | x = x_.clone().detach() 58 | 59 | for step in range(n_steps): 60 | 61 | # one step using basic FGSM 62 | x_adv, grad = fast_gradient_sign(model, x, alpha) 63 | 64 | # total perturbation 65 | total_grad = x_adv - x_ 66 | 67 | # force total perturbation to be lower than epsilon in 68 | # absolute value 69 | total_grad = torch.clamp(total_grad, -epsilon, epsilon) 70 | 71 | # add total perturbation to the original image 72 | x_adv = x_ + total_grad 73 | 74 | print('Step ', step + 1) 75 | # visualize(x, x_adv, grad, eps) 76 | 77 | x = x_adv 78 | 79 | return x_adv, total_grad 80 | 81 | 82 | def iterative_fast_gradient_sign_( 83 | model: nn.Module, 84 | x_: torch.Tensor, 85 | epsilon, 86 | n_steps: int, 87 | alpha: float 88 | # ) -> List[Tuple[torch.Tensor, torch.Tensor]]: 89 | ) -> Tuple[torch.Tensor, torch.Tensor]: 90 | """""" 91 | x = x_.clone().detach() 92 | 93 | for step in range(n_steps): 94 | 95 | # one step using basic FGSM 96 | x_adv, grad = fast_gradient_sign(model, x, alpha) 97 | 98 | # total perturbation 99 | total_grad = x_adv - x_ 100 | 101 | # force total perturbation to be lower than epsilon in 102 | # absolute value 103 | total_grad = torch.clamp(total_grad, -epsilon, epsilon) 104 | 105 | # add total perturbation to the original image 106 | x_adv = x_ + total_grad 107 | 108 | x = x_adv 109 | 110 | yield inverse_preprocess(x_adv), inverse_preprocess(grad) 111 | -------------------------------------------------------------------------------- /src/imagenet_class_labels.py: -------------------------------------------------------------------------------- 1 | id2label = { 2 | 0: 'tench', 3 | 1: 'goldfish', 4 | 2: 'great white shark', 5 | 3: 'tiger shark', 6 | 4: 'hammerhead', 7 | 5: 'electric ray', 8 | 6: 'stingray', 9 | 7: 'cock', 10 | 8: 'hen', 11 | 9: 'ostrich', 12 | 10: 'brambling', 13 | 11: 'goldfinch', 14 | 12: 'house finch', 15 | 13: 'junco', 16 | 14: 'indigo bunting', 17 | 15: 'robin', 18 | 16: 'bulbul', 19 | 17: 'jay', 20 | 18: 'magpie', 21 | 19: 'chickadee', 22 | 20: 'water ouzel', 23 | 21: 'kite', 24 | 22: 'bald eagle', 25 | 23: 'vulture', 26 | 24: 'great grey owl', 27 | 25: 'European fire salamander', 28 | 26: 'common newt', 29 | 27: 'eft', 30 | 28: 'spotted salamander', 31 | 29: 'axolotl', 32 | 30: 'bullfrog', 33 | 31: 'tree frog', 34 | 32: 'tailed frog', 35 | 33: 'loggerhead', 36 | 34: 'leatherback turtle', 37 | 35: 'mud turtle', 38 | 36: 'terrapin', 39 | 37: 'box turtle', 40 | 38: 'banded gecko', 41 | 39: 'common iguana', 42 | 40: 'American chameleon', 43 | 41: 'whiptail', 44 | 42: 'agama', 45 | 43: 'frilled lizard', 46 | 44: 'alligator lizard', 47 | 45: 'Gila monster', 48 | 46: 'green lizard', 49 | 47: 'African chameleon', 50 | 48: 'Komodo dragon', 51 | 49: 'African crocodile', 52 | 50: 'American alligator', 53 | 51: 'triceratops', 54 | 52: 'thunder snake', 55 | 53: 'ringneck snake', 56 | 54: 'hognose snake', 57 | 55: 'green snake', 58 | 56: 'king snake', 59 | 57: 'garter snake', 60 | 58: 'water snake', 61 | 59: 'vine snake', 62 | 60: 'night snake', 63 | 61: 'boa constrictor', 64 | 62: 'rock python', 65 | 63: 'Indian cobra', 66 | 64: 'green mamba', 67 | 65: 'sea snake', 68 | 66: 'horned viper', 69 | 67: 'diamondback', 70 | 68: 'sidewinder', 71 | 69: 'trilobite', 72 | 70: 'harvestman', 73 | 71: 'scorpion', 74 | 72: 'black and gold garden spider', 75 | 73: 'barn spider', 76 | 74: 'garden spider', 77 | 75: 'black widow', 78 | 76: 'tarantula', 79 | 77: 'wolf spider', 80 | 78: 'tick', 81 | 79: 'centipede', 82 | 80: 'black grouse', 83 | 81: 'ptarmigan', 84 | 82: 'ruffed grouse', 85 | 83: 'prairie chicken', 86 | 84: 'peacock', 87 | 85: 'quail', 88 | 86: 'partridge', 89 | 87: 'African grey', 90 | 88: 'macaw', 91 | 89: 'sulphur-crested cockatoo', 92 | 90: 'lorikeet', 93 | 91: 'coucal', 94 | 92: 'bee eater', 95 | 93: 'hornbill', 96 | 94: 'hummingbird', 97 | 95: 'jacamar', 98 | 96: 'toucan', 99 | 97: 'drake', 100 | 98: 'red-breasted merganser', 101 | 99: 'goose', 102 | 100: 'black swan', 103 | 101: 'tusker', 104 | 102: 'echidna', 105 | 103: 'platypus', 106 | 104: 'wallaby', 107 | 105: 'koala', 108 | 106: 'wombat', 109 | 107: 'jellyfish', 110 | 108: 'sea anemone', 111 | 109: 'brain coral', 112 | 110: 'flatworm', 113 | 111: 'nematode', 114 | 112: 'conch', 115 | 113: 'snail', 116 | 114: 'slug', 117 | 115: 'sea slug', 118 | 116: 'chiton', 119 | 117: 'chambered nautilus', 120 | 118: 'Dungeness crab', 121 | 119: 'rock crab', 122 | 120: 'fiddler crab', 123 | 121: 'king crab', 124 | 122: 'American lobster', 125 | 123: 'spiny lobster', 126 | 124: 'crayfish', 127 | 125: 'hermit crab', 128 | 126: 'isopod', 129 | 127: 'white stork', 130 | 128: 'black stork', 131 | 129: 'spoonbill', 132 | 130: 'flamingo', 133 | 131: 'little blue heron', 134 | 132: 'American egret', 135 | 133: 'bittern', 136 | 134: 'crane', 137 | 135: 'limpkin', 138 | 136: 'European gallinule', 139 | 137: 'American coot', 140 | 138: 'bustard', 141 | 139: 'ruddy turnstone', 142 | 140: 'red-backed sandpiper', 143 | 141: 'redshank', 144 | 142: 'dowitcher', 145 | 143: 'oystercatcher', 146 | 144: 'pelican', 147 | 145: 'king penguin', 148 | 146: 'albatross', 149 | 147: 'grey whale', 150 | 148: 'killer whale', 151 | 149: 'dugong', 152 | 150: 'sea lion', 153 | 151: 'Chihuahua', 154 | 152: 'Japanese spaniel', 155 | 153: 'Maltese dog', 156 | 154: 'Pekinese', 157 | 155: 'Shih-Tzu', 158 | 156: 'Blenheim spaniel', 159 | 157: 'papillon', 160 | 158: 'toy terrier', 161 | 159: 'Rhodesian ridgeback', 162 | 160: 'Afghan hound', 163 | 161: 'basset', 164 | 162: 'beagle', 165 | 163: 'bloodhound', 166 | 164: 'bluetick', 167 | 165: 'black-and-tan coonhound', 168 | 166: 'Walker hound', 169 | 167: 'English foxhound', 170 | 168: 'redbone', 171 | 169: 'borzoi', 172 | 170: 'Irish wolfhound', 173 | 171: 'Italian greyhound', 174 | 172: 'whippet', 175 | 173: 'Ibizan hound', 176 | 174: 'Norwegian elkhound', 177 | 175: 'otterhound', 178 | 176: 'Saluki', 179 | 177: 'Scottish deerhound', 180 | 178: 'Weimaraner', 181 | 179: 'Staffordshire bullterrier', 182 | 180: 'American Staffordshire terrier', 183 | 181: 'Bedlington terrier', 184 | 182: 'Border terrier', 185 | 183: 'Kerry blue terrier', 186 | 184: 'Irish terrier', 187 | 185: 'Norfolk terrier', 188 | 186: 'Norwich terrier', 189 | 187: 'Yorkshire terrier', 190 | 188: 'wire-haired fox terrier', 191 | 189: 'Lakeland terrier', 192 | 190: 'Sealyham terrier', 193 | 191: 'Airedale', 194 | 192: 'cairn', 195 | 193: 'Australian terrier', 196 | 194: 'Dandie Dinmont', 197 | 195: 'Boston bull', 198 | 196: 'miniature schnauzer', 199 | 197: 'giant schnauzer', 200 | 198: 'standard schnauzer', 201 | 199: 'Scotch terrier', 202 | 200: 'Tibetan terrier', 203 | 201: 'silky terrier', 204 | 202: 'soft-coated wheaten terrier', 205 | 203: 'West Highland white terrier', 206 | 204: 'Lhasa', 207 | 205: 'flat-coated retriever', 208 | 206: 'curly-coated retriever', 209 | 207: 'golden retriever', 210 | 208: 'Labrador retriever', 211 | 209: 'Chesapeake Bay retriever', 212 | 210: 'German short-haired pointer', 213 | 211: 'vizsla', 214 | 212: 'English setter', 215 | 213: 'Irish setter', 216 | 214: 'Gordon setter', 217 | 215: 'Brittany spaniel', 218 | 216: 'clumber', 219 | 217: 'English springer', 220 | 218: 'Welsh springer spaniel', 221 | 219: 'cocker spaniel', 222 | 220: 'Sussex spaniel', 223 | 221: 'Irish water spaniel', 224 | 222: 'kuvasz', 225 | 223: 'schipperke', 226 | 224: 'groenendael', 227 | 225: 'malinois', 228 | 226: 'briard', 229 | 227: 'kelpie', 230 | 228: 'komondor', 231 | 229: 'Old English sheepdog', 232 | 230: 'Shetland sheepdog', 233 | 231: 'collie', 234 | 232: 'Border collie', 235 | 233: 'Bouvier des Flandres', 236 | 234: 'Rottweiler', 237 | 235: 'German shepherd', 238 | 236: 'Doberman', 239 | 237: 'miniature pinscher', 240 | 238: 'Greater Swiss Mountain dog', 241 | 239: 'Bernese mountain dog', 242 | 240: 'Appenzeller', 243 | 241: 'EntleBucher', 244 | 242: 'boxer', 245 | 243: 'bull mastiff', 246 | 244: 'Tibetan mastiff', 247 | 245: 'French bulldog', 248 | 246: 'Great Dane', 249 | 247: 'Saint Bernard', 250 | 248: 'Eskimo dog', 251 | 249: 'malamute', 252 | 250: 'Siberian husky', 253 | 251: 'dalmatian', 254 | 252: 'affenpinscher', 255 | 253: 'basenji', 256 | 254: 'pug', 257 | 255: 'Leonberg', 258 | 256: 'Newfoundland', 259 | 257: 'Great Pyrenees', 260 | 258: 'Samoyed', 261 | 259: 'Pomeranian', 262 | 260: 'chow', 263 | 261: 'keeshond', 264 | 262: 'Brabancon griffon', 265 | 263: 'Pembroke', 266 | 264: 'Cardigan', 267 | 265: 'toy poodle', 268 | 266: 'miniature poodle', 269 | 267: 'standard poodle', 270 | 268: 'Mexican hairless', 271 | 269: 'timber wolf', 272 | 270: 'white wolf', 273 | 271: 'red wolf', 274 | 272: 'coyote', 275 | 273: 'dingo', 276 | 274: 'dhole', 277 | 275: 'African hunting dog', 278 | 276: 'hyena', 279 | 277: 'red fox', 280 | 278: 'kit fox', 281 | 279: 'Arctic fox', 282 | 280: 'grey fox', 283 | 281: 'tabby', 284 | 282: 'tiger cat', 285 | 283: 'Persian cat', 286 | 284: 'Siamese cat', 287 | 285: 'Egyptian cat', 288 | 286: 'cougar', 289 | 287: 'lynx', 290 | 288: 'leopard', 291 | 289: 'snow leopard', 292 | 290: 'jaguar', 293 | 291: 'lion', 294 | 292: 'tiger', 295 | 293: 'cheetah', 296 | 294: 'brown bear', 297 | 295: 'American black bear', 298 | 296: 'ice bear', 299 | 297: 'sloth bear', 300 | 298: 'mongoose', 301 | 299: 'meerkat', 302 | 300: 'tiger beetle', 303 | 301: 'ladybug', 304 | 302: 'ground beetle', 305 | 303: 'long-horned beetle', 306 | 304: 'leaf beetle', 307 | 305: 'dung beetle', 308 | 306: 'rhinoceros beetle', 309 | 307: 'weevil', 310 | 308: 'fly', 311 | 309: 'bee', 312 | 310: 'ant', 313 | 311: 'grasshopper', 314 | 312: 'cricket', 315 | 313: 'walking stick', 316 | 314: 'cockroach', 317 | 315: 'mantis', 318 | 316: 'cicada', 319 | 317: 'leafhopper', 320 | 318: 'lacewing', 321 | 319: 'dragonfly', 322 | 320: 'damselfly', 323 | 321: 'admiral', 324 | 322: 'ringlet', 325 | 323: 'monarch', 326 | 324: 'cabbage butterfly', 327 | 325: 'sulphur butterfly', 328 | 326: 'lycaenid', 329 | 327: 'starfish', 330 | 328: 'sea urchin', 331 | 329: 'sea cucumber', 332 | 330: 'wood rabbit', 333 | 331: 'hare', 334 | 332: 'Angora', 335 | 333: 'hamster', 336 | 334: 'porcupine', 337 | 335: 'fox squirrel', 338 | 336: 'marmot', 339 | 337: 'beaver', 340 | 338: 'guinea pig', 341 | 339: 'sorrel', 342 | 340: 'zebra', 343 | 341: 'hog', 344 | 342: 'wild boar', 345 | 343: 'warthog', 346 | 344: 'hippopotamus', 347 | 345: 'ox', 348 | 346: 'water buffalo', 349 | 347: 'bison', 350 | 348: 'ram', 351 | 349: 'bighorn', 352 | 350: 'ibex', 353 | 351: 'hartebeest', 354 | 352: 'impala', 355 | 353: 'gazelle', 356 | 354: 'Arabian camel', 357 | 355: 'llama', 358 | 356: 'weasel', 359 | 357: 'mink', 360 | 358: 'polecat', 361 | 359: 'black-footed ferret', 362 | 360: 'otter', 363 | 361: 'skunk', 364 | 362: 'badger', 365 | 363: 'armadillo', 366 | 364: 'three-toed sloth', 367 | 365: 'orangutan', 368 | 366: 'gorilla', 369 | 367: 'chimpanzee', 370 | 368: 'gibbon', 371 | 369: 'siamang', 372 | 370: 'guenon', 373 | 371: 'patas', 374 | 372: 'baboon', 375 | 373: 'macaque', 376 | 374: 'langur', 377 | 375: 'colobus', 378 | 376: 'proboscis monkey', 379 | 377: 'marmoset', 380 | 378: 'capuchin', 381 | 379: 'howler monkey', 382 | 380: 'titi', 383 | 381: 'spider monkey', 384 | 382: 'squirrel monkey', 385 | 383: 'Madagascar cat', 386 | 384: 'indri', 387 | 385: 'Indian elephant', 388 | 386: 'African elephant', 389 | 387: 'lesser panda', 390 | 388: 'giant panda', 391 | 389: 'barracouta', 392 | 390: 'eel', 393 | 391: 'coho', 394 | 392: 'rock beauty', 395 | 393: 'anemone fish', 396 | 394: 'sturgeon', 397 | 395: 'gar', 398 | 396: 'lionfish', 399 | 397: 'puffer', 400 | 398: 'abacus', 401 | 399: 'abaya', 402 | 400: 'academic gown', 403 | 401: 'accordion', 404 | 402: 'acoustic guitar', 405 | 403: 'aircraft carrier', 406 | 404: 'airliner', 407 | 405: 'airship', 408 | 406: 'altar', 409 | 407: 'ambulance', 410 | 408: 'amphibian', 411 | 409: 'analog clock', 412 | 410: 'apiary', 413 | 411: 'apron', 414 | 412: 'ashcan', 415 | 413: 'assault rifle', 416 | 414: 'backpack', 417 | 415: 'bakery', 418 | 416: 'balance beam', 419 | 417: 'balloon', 420 | 418: 'ballpoint', 421 | 419: 'Band Aid', 422 | 420: 'banjo', 423 | 421: 'bannister', 424 | 422: 'barbell', 425 | 423: 'barber chair', 426 | 424: 'barbershop', 427 | 425: 'barn', 428 | 426: 'barometer', 429 | 427: 'barrel', 430 | 428: 'barrow', 431 | 429: 'baseball', 432 | 430: 'basketball', 433 | 431: 'bassinet', 434 | 432: 'bassoon', 435 | 433: 'bathing cap', 436 | 434: 'bath towel', 437 | 435: 'bathtub', 438 | 436: 'beach wagon', 439 | 437: 'beacon', 440 | 438: 'beaker', 441 | 439: 'bearskin', 442 | 440: 'beer bottle', 443 | 441: 'beer glass', 444 | 442: 'bell cote', 445 | 443: 'bib', 446 | 444: 'bicycle-built-for-two', 447 | 445: 'bikini', 448 | 446: 'binder', 449 | 447: 'binoculars', 450 | 448: 'birdhouse', 451 | 449: 'boathouse', 452 | 450: 'bobsled', 453 | 451: 'bolo tie', 454 | 452: 'bonnet', 455 | 453: 'bookcase', 456 | 454: 'bookshop', 457 | 455: 'bottlecap', 458 | 456: 'bow', 459 | 457: 'bow tie', 460 | 458: 'brass', 461 | 459: 'brassiere', 462 | 460: 'breakwater', 463 | 461: 'breastplate', 464 | 462: 'broom', 465 | 463: 'bucket', 466 | 464: 'buckle', 467 | 465: 'bulletproof vest', 468 | 466: 'bullet train', 469 | 467: 'butcher shop', 470 | 468: 'cab', 471 | 469: 'caldron', 472 | 470: 'candle', 473 | 471: 'cannon', 474 | 472: 'canoe', 475 | 473: 'can opener', 476 | 474: 'cardigan', 477 | 475: 'car mirror', 478 | 476: 'carousel', 479 | 477: "carpenter's kit", 480 | 478: 'carton', 481 | 479: 'car wheel', 482 | 480: 'cash machine', 483 | 481: 'cassette', 484 | 482: 'cassette player', 485 | 483: 'castle', 486 | 484: 'catamaran', 487 | 485: 'CD player', 488 | 486: 'cello', 489 | 487: 'cellular telephone', 490 | 488: 'chain', 491 | 489: 'chainlink fence', 492 | 490: 'chain mail', 493 | 491: 'chain saw', 494 | 492: 'chest', 495 | 493: 'chiffonier', 496 | 494: 'chime', 497 | 495: 'china cabinet', 498 | 496: 'Christmas stocking', 499 | 497: 'church', 500 | 498: 'cinema', 501 | 499: 'cleaver', 502 | 500: 'cliff dwelling', 503 | 501: 'cloak', 504 | 502: 'clog', 505 | 503: 'cocktail shaker', 506 | 504: 'coffee mug', 507 | 505: 'coffeepot', 508 | 506: 'coil', 509 | 507: 'combination lock', 510 | 508: 'computer keyboard', 511 | 509: 'confectionery', 512 | 510: 'container ship', 513 | 511: 'convertible', 514 | 512: 'corkscrew', 515 | 513: 'cornet', 516 | 514: 'cowboy boot', 517 | 515: 'cowboy hat', 518 | 516: 'cradle', 519 | 517: 'crane', 520 | 518: 'crash helmet', 521 | 519: 'crate', 522 | 520: 'crib', 523 | 521: 'Crock Pot', 524 | 522: 'croquet ball', 525 | 523: 'crutch', 526 | 524: 'cuirass', 527 | 525: 'dam', 528 | 526: 'desk', 529 | 527: 'desktop computer', 530 | 528: 'dial telephone', 531 | 529: 'diaper', 532 | 530: 'digital clock', 533 | 531: 'digital watch', 534 | 532: 'dining table', 535 | 533: 'dishrag', 536 | 534: 'dishwasher', 537 | 535: 'disk brake', 538 | 536: 'dock', 539 | 537: 'dogsled', 540 | 538: 'dome', 541 | 539: 'doormat', 542 | 540: 'drilling platform', 543 | 541: 'drum', 544 | 542: 'drumstick', 545 | 543: 'dumbbell', 546 | 544: 'Dutch oven', 547 | 545: 'electric fan', 548 | 546: 'electric guitar', 549 | 547: 'electric locomotive', 550 | 548: 'entertainment center', 551 | 549: 'envelope', 552 | 550: 'espresso maker', 553 | 551: 'face powder', 554 | 552: 'feather boa', 555 | 553: 'file', 556 | 554: 'fireboat', 557 | 555: 'fire engine', 558 | 556: 'fire screen', 559 | 557: 'flagpole', 560 | 558: 'flute', 561 | 559: 'folding chair', 562 | 560: 'football helmet', 563 | 561: 'forklift', 564 | 562: 'fountain', 565 | 563: 'fountain pen', 566 | 564: 'four-poster', 567 | 565: 'freight car', 568 | 566: 'French horn', 569 | 567: 'frying pan', 570 | 568: 'fur coat', 571 | 569: 'garbage truck', 572 | 570: 'gasmask', 573 | 571: 'gas pump', 574 | 572: 'goblet', 575 | 573: 'go-kart', 576 | 574: 'golf ball', 577 | 575: 'golfcart', 578 | 576: 'gondola', 579 | 577: 'gong', 580 | 578: 'gown', 581 | 579: 'grand piano', 582 | 580: 'greenhouse', 583 | 581: 'grille', 584 | 582: 'grocery store', 585 | 583: 'guillotine', 586 | 584: 'hair slide', 587 | 585: 'hair spray', 588 | 586: 'half track', 589 | 587: 'hammer', 590 | 588: 'hamper', 591 | 589: 'hand blower', 592 | 590: 'hand-held computer', 593 | 591: 'handkerchief', 594 | 592: 'hard disc', 595 | 593: 'harmonica', 596 | 594: 'harp', 597 | 595: 'harvester', 598 | 596: 'hatchet', 599 | 597: 'holster', 600 | 598: 'home theater', 601 | 599: 'honeycomb', 602 | 600: 'hook', 603 | 601: 'hoopskirt', 604 | 602: 'horizontal bar', 605 | 603: 'horse cart', 606 | 604: 'hourglass', 607 | 605: 'iPod', 608 | 606: 'iron', 609 | 607: "jack-o'-lantern", 610 | 608: 'jean', 611 | 609: 'jeep', 612 | 610: 'jersey', 613 | 611: 'jigsaw puzzle', 614 | 612: 'jinrikisha', 615 | 613: 'joystick', 616 | 614: 'kimono', 617 | 615: 'knee pad', 618 | 616: 'knot', 619 | 617: 'lab coat', 620 | 618: 'ladle', 621 | 619: 'lampshade', 622 | 620: 'laptop', 623 | 621: 'lawn mower', 624 | 622: 'lens cap', 625 | 623: 'letter opener', 626 | 624: 'library', 627 | 625: 'lifeboat', 628 | 626: 'lighter', 629 | 627: 'limousine', 630 | 628: 'liner', 631 | 629: 'lipstick', 632 | 630: 'Loafer', 633 | 631: 'lotion', 634 | 632: 'loudspeaker', 635 | 633: 'loupe', 636 | 634: 'lumbermill', 637 | 635: 'magnetic compass', 638 | 636: 'mailbag', 639 | 637: 'mailbox', 640 | 638: 'maillot', 641 | 639: 'maillot', 642 | 640: 'manhole cover', 643 | 641: 'maraca', 644 | 642: 'marimba', 645 | 643: 'mask', 646 | 644: 'matchstick', 647 | 645: 'maypole', 648 | 646: 'maze', 649 | 647: 'measuring cup', 650 | 648: 'medicine chest', 651 | 649: 'megalith', 652 | 650: 'microphone', 653 | 651: 'microwave', 654 | 652: 'military uniform', 655 | 653: 'milk can', 656 | 654: 'minibus', 657 | 655: 'miniskirt', 658 | 656: 'minivan', 659 | 657: 'missile', 660 | 658: 'mitten', 661 | 659: 'mixing bowl', 662 | 660: 'mobile home', 663 | 661: 'Model T', 664 | 662: 'modem', 665 | 663: 'monastery', 666 | 664: 'monitor', 667 | 665: 'moped', 668 | 666: 'mortar', 669 | 667: 'mortarboard', 670 | 668: 'mosque', 671 | 669: 'mosquito net', 672 | 670: 'motor scooter', 673 | 671: 'mountain bike', 674 | 672: 'mountain tent', 675 | 673: 'mouse', 676 | 674: 'mousetrap', 677 | 675: 'moving van', 678 | 676: 'muzzle', 679 | 677: 'nail', 680 | 678: 'neck brace', 681 | 679: 'necklace', 682 | 680: 'nipple', 683 | 681: 'notebook', 684 | 682: 'obelisk', 685 | 683: 'oboe', 686 | 684: 'ocarina', 687 | 685: 'odometer', 688 | 686: 'oil filter', 689 | 687: 'organ', 690 | 688: 'oscilloscope', 691 | 689: 'overskirt', 692 | 690: 'oxcart', 693 | 691: 'oxygen mask', 694 | 692: 'packet', 695 | 693: 'paddle', 696 | 694: 'paddlewheel', 697 | 695: 'padlock', 698 | 696: 'paintbrush', 699 | 697: 'pajama', 700 | 698: 'palace', 701 | 699: 'panpipe', 702 | 700: 'paper towel', 703 | 701: 'parachute', 704 | 702: 'parallel bars', 705 | 703: 'park bench', 706 | 704: 'parking meter', 707 | 705: 'passenger car', 708 | 706: 'patio', 709 | 707: 'pay-phone', 710 | 708: 'pedestal', 711 | 709: 'pencil box', 712 | 710: 'pencil sharpener', 713 | 711: 'perfume', 714 | 712: 'Petri dish', 715 | 713: 'photocopier', 716 | 714: 'pick', 717 | 715: 'pickelhaube', 718 | 716: 'picket fence', 719 | 717: 'pickup', 720 | 718: 'pier', 721 | 719: 'piggy bank', 722 | 720: 'pill bottle', 723 | 721: 'pillow', 724 | 722: 'ping-pong ball', 725 | 723: 'pinwheel', 726 | 724: 'pirate', 727 | 725: 'pitcher', 728 | 726: 'plane', 729 | 727: 'planetarium', 730 | 728: 'plastic bag', 731 | 729: 'plate rack', 732 | 730: 'plow', 733 | 731: 'plunger', 734 | 732: 'Polaroid camera', 735 | 733: 'pole', 736 | 734: 'police van', 737 | 735: 'poncho', 738 | 736: 'pool table', 739 | 737: 'pop bottle', 740 | 738: 'pot', 741 | 739: "potter's wheel", 742 | 740: 'power drill', 743 | 741: 'prayer rug', 744 | 742: 'printer', 745 | 743: 'prison', 746 | 744: 'projectile', 747 | 745: 'projector', 748 | 746: 'puck', 749 | 747: 'punching bag', 750 | 748: 'purse', 751 | 749: 'quill', 752 | 750: 'quilt', 753 | 751: 'racer', 754 | 752: 'racket', 755 | 753: 'radiator', 756 | 754: 'radio', 757 | 755: 'radio telescope', 758 | 756: 'rain barrel', 759 | 757: 'recreational vehicle', 760 | 758: 'reel', 761 | 759: 'reflex camera', 762 | 760: 'refrigerator', 763 | 761: 'remote control', 764 | 762: 'restaurant', 765 | 763: 'revolver', 766 | 764: 'rifle', 767 | 765: 'rocking chair', 768 | 766: 'rotisserie', 769 | 767: 'rubber eraser', 770 | 768: 'rugby ball', 771 | 769: 'rule', 772 | 770: 'running shoe', 773 | 771: 'safe', 774 | 772: 'safety pin', 775 | 773: 'saltshaker', 776 | 774: 'sandal', 777 | 775: 'sarong', 778 | 776: 'sax', 779 | 777: 'scabbard', 780 | 778: 'scale', 781 | 779: 'school bus', 782 | 780: 'schooner', 783 | 781: 'scoreboard', 784 | 782: 'screen', 785 | 783: 'screw', 786 | 784: 'screwdriver', 787 | 785: 'seat belt', 788 | 786: 'sewing machine', 789 | 787: 'shield', 790 | 788: 'shoe shop', 791 | 789: 'shoji', 792 | 790: 'shopping basket', 793 | 791: 'shopping cart', 794 | 792: 'shovel', 795 | 793: 'shower cap', 796 | 794: 'shower curtain', 797 | 795: 'ski', 798 | 796: 'ski mask', 799 | 797: 'sleeping bag', 800 | 798: 'slide rule', 801 | 799: 'sliding door', 802 | 800: 'slot', 803 | 801: 'snorkel', 804 | 802: 'snowmobile', 805 | 803: 'snowplow', 806 | 804: 'soap dispenser', 807 | 805: 'soccer ball', 808 | 806: 'sock', 809 | 807: 'solar dish', 810 | 808: 'sombrero', 811 | 809: 'soup bowl', 812 | 810: 'space bar', 813 | 811: 'space heater', 814 | 812: 'space shuttle', 815 | 813: 'spatula', 816 | 814: 'speedboat', 817 | 815: 'spider web', 818 | 816: 'spindle', 819 | 817: 'sports car', 820 | 818: 'spotlight', 821 | 819: 'stage', 822 | 820: 'steam locomotive', 823 | 821: 'steel arch bridge', 824 | 822: 'steel drum', 825 | 823: 'stethoscope', 826 | 824: 'stole', 827 | 825: 'stone wall', 828 | 826: 'stopwatch', 829 | 827: 'stove', 830 | 828: 'strainer', 831 | 829: 'streetcar', 832 | 830: 'stretcher', 833 | 831: 'studio couch', 834 | 832: 'stupa', 835 | 833: 'submarine', 836 | 834: 'suit', 837 | 835: 'sundial', 838 | 836: 'sunglass', 839 | 837: 'sunglasses', 840 | 838: 'sunscreen', 841 | 839: 'suspension bridge', 842 | 840: 'swab', 843 | 841: 'sweatshirt', 844 | 842: 'swimming trunks', 845 | 843: 'swing', 846 | 844: 'switch', 847 | 845: 'syringe', 848 | 846: 'table lamp', 849 | 847: 'tank', 850 | 848: 'tape player', 851 | 849: 'teapot', 852 | 850: 'teddy', 853 | 851: 'television', 854 | 852: 'tennis ball', 855 | 853: 'thatch', 856 | 854: 'theater curtain', 857 | 855: 'thimble', 858 | 856: 'thresher', 859 | 857: 'throne', 860 | 858: 'tile roof', 861 | 859: 'toaster', 862 | 860: 'tobacco shop', 863 | 861: 'toilet seat', 864 | 862: 'torch', 865 | 863: 'totem pole', 866 | 864: 'tow truck', 867 | 865: 'toyshop', 868 | 866: 'tractor', 869 | 867: 'trailer truck', 870 | 868: 'tray', 871 | 869: 'trench coat', 872 | 870: 'tricycle', 873 | 871: 'trimaran', 874 | 872: 'tripod', 875 | 873: 'triumphal arch', 876 | 874: 'trolleybus', 877 | 875: 'trombone', 878 | 876: 'tub', 879 | 877: 'turnstile', 880 | 878: 'typewriter keyboard', 881 | 879: 'umbrella', 882 | 880: 'unicycle', 883 | 881: 'upright', 884 | 882: 'vacuum', 885 | 883: 'vase', 886 | 884: 'vault', 887 | 885: 'velvet', 888 | 886: 'vending machine', 889 | 887: 'vestment', 890 | 888: 'viaduct', 891 | 889: 'violin', 892 | 890: 'volleyball', 893 | 891: 'waffle iron', 894 | 892: 'wall clock', 895 | 893: 'wallet', 896 | 894: 'wardrobe', 897 | 895: 'warplane', 898 | 896: 'washbasin', 899 | 897: 'washer', 900 | 898: 'water bottle', 901 | 899: 'water jug', 902 | 900: 'water tower', 903 | 901: 'whiskey jug', 904 | 902: 'whistle', 905 | 903: 'wig', 906 | 904: 'window screen', 907 | 905: 'window shade', 908 | 906: 'Windsor tie', 909 | 907: 'wine bottle', 910 | 908: 'wing', 911 | 909: 'wok', 912 | 910: 'wooden spoon', 913 | 911: 'wool', 914 | 912: 'worm fence', 915 | 913: 'wreck', 916 | 914: 'yawl', 917 | 915: 'yurt', 918 | 916: 'web site', 919 | 917: 'comic book', 920 | 918: 'crossword puzzle', 921 | 919: 'street sign', 922 | 920: 'traffic light', 923 | 921: 'book jacket', 924 | 922: 'menu', 925 | 923: 'plate', 926 | 924: 'guacamole', 927 | 925: 'consomme', 928 | 926: 'hot pot', 929 | 927: 'trifle', 930 | 928: 'ice cream', 931 | 929: 'ice lolly', 932 | 930: 'French loaf', 933 | 931: 'bagel', 934 | 932: 'pretzel', 935 | 933: 'cheeseburger', 936 | 934: 'hotdog', 937 | 935: 'mashed potato', 938 | 936: 'head cabbage', 939 | 937: 'broccoli', 940 | 938: 'cauliflower', 941 | 939: 'zucchini', 942 | 940: 'spaghetti squash', 943 | 941: 'acorn squash', 944 | 942: 'butternut squash', 945 | 943: 'cucumber', 946 | 944: 'artichoke', 947 | 945: 'bell pepper', 948 | 946: 'cardoon', 949 | 947: 'mushroom', 950 | 948: 'Granny Smith', 951 | 949: 'strawberry', 952 | 950: 'orange', 953 | 951: 'lemon', 954 | 952: 'fig', 955 | 953: 'pineapple', 956 | 954: 'banana', 957 | 955: 'jackfruit', 958 | 956: 'custard apple', 959 | 957: 'pomegranate', 960 | 958: 'hay', 961 | 959: 'carbonara', 962 | 960: 'chocolate sauce', 963 | 961: 'dough', 964 | 962: 'meat loaf', 965 | 963: 'pizza', 966 | 964: 'potpie', 967 | 965: 'burrito', 968 | 966: 'red wine', 969 | 967: 'espresso', 970 | 968: 'cup', 971 | 969: 'eggnog', 972 | 970: 'alp', 973 | 971: 'bubble', 974 | 972: 'cliff', 975 | 973: 'coral reef', 976 | 974: 'geyser', 977 | 975: 'lakeside', 978 | 976: 'promontory', 979 | 977: 'sandbar', 980 | 978: 'seashore', 981 | 979: 'valley', 982 | 980: 'volcano', 983 | 981: 'ballplayer', 984 | 982: 'groom', 985 | 983: 'scuba diver', 986 | 984: 'rapeseed', 987 | 985: 'daisy', 988 | 986: "yellow lady's slipper", 989 | 987: 'corn', 990 | 988: 'acorn', 991 | 989: 'hip', 992 | 990: 'buckeye', 993 | 991: 'coral fungus', 994 | 992: 'agaric', 995 | 993: 'gyromitra', 996 | 994: 'stinkhorn', 997 | 995: 'earthstar', 998 | 996: 'hen-of-the-woods', 999 | 997: 'bolete', 1000 | 998: 'ear', 1001 | 999: 'toilet tissue' 1002 | } -------------------------------------------------------------------------------- /src/model.py: -------------------------------------------------------------------------------- 1 | from typing import Dict 2 | 3 | import torch 4 | from torch import Tensor 5 | from torchvision import transforms 6 | from torchvision.models import inception_v3 7 | import torch.nn as nn 8 | import torch.nn.functional as F 9 | 10 | from src.imagenet_class_labels import id2label 11 | 12 | 13 | def load_model() -> nn.Module: 14 | model = inception_v3(pretrained=True) 15 | model.eval() 16 | n_params = sum(p.numel() for p in model.parameters()) 17 | print(f'{n_params:,} parameters') # 27,161,264 parameters 18 | return model 19 | 20 | def predict(model: nn.Module, image) -> Dict: 21 | 22 | # resize and normalize input pixel ranges 23 | img = preprocess(image) 24 | 25 | output = model.forward(img) 26 | class_idx = torch.max(output.data, 1)[1][0].item() 27 | label = id2label[class_idx] 28 | output_probs = F.softmax(output, dim=1) 29 | confidence = round(torch.max(output_probs.data, 1)[0][0].item(), 4) 30 | 31 | return { 32 | 'id': class_idx, 33 | 'label': label, 34 | 'confidence': confidence, 35 | } 36 | 37 | 38 | def preprocess(img) -> Tensor: 39 | """ 40 | Inception V3 model from pytorch expects input images with pixel values between -1 and 1 41 | and dimensions 299 x 299 42 | """ 43 | mean = [0.485, 0.456, 0.406] 44 | std = [0.229, 0.224, 0.225] 45 | 46 | preprocess_fn = transforms.Compose([ 47 | transforms.Resize((299,299)), 48 | transforms.ToTensor(), 49 | transforms.Normalize(mean, std) 50 | ]) 51 | image_tensor = preprocess_fn(img) 52 | 53 | # add batch dimension: C x H x W ==> B x C x H x W 54 | image_tensor = image_tensor.unsqueeze(0) 55 | 56 | return image_tensor 57 | 58 | def inverse_preprocess(x: Tensor): 59 | """""" 60 | t = x.squeeze(0) 61 | 62 | mean = [0.485, 0.456, 0.406] 63 | std = [0.229, 0.224, 0.225] 64 | t = t.mul(torch.FloatTensor(std).view(3,1,1)).add(torch.FloatTensor(mean).view(3,1,1)) #.numpy() 65 | 66 | im = transforms.ToPILImage()(t) #.convert("RGB") #.Resize((299, 299)) 67 | 68 | return im 69 | -------------------------------------------------------------------------------- /src/streamlit_app.py: -------------------------------------------------------------------------------- 1 | import io 2 | 3 | import requests 4 | import streamlit as st 5 | # import pandas as pd 6 | # import numpy as np 7 | from PIL import Image 8 | 9 | from src.model import preprocess, inverse_preprocess, load_model, predict 10 | from src.fgsm import fast_gradient_sign, iterative_fast_gradient_sign_ 11 | 12 | st.title('Adversarial example generator') 13 | 14 | doc_markdown = """ 15 | ## What are adversarial examples? 💡 16 | 17 | 👉🏽 Do you think it is impossible to fool the vision system of a self-driving Tesla car? 18 | 19 | 👉🏽 Or that machine learning models used in malware detection software are too good to be evaded by hackers? 20 | 21 | 👉🏽 Or that face recognition systems in airports are bulletproof? 22 | 23 | Like any of us machine learning enthusiasts, you might fall into the trap of thinking that deep models used out there are perfect. 24 | 25 | ### Well, you are WRONG. 26 | 27 | There are easy ways to build **adversarial examples** that can fool any deep learning model and create security issues. 28 | 29 | With this app you can create your own adversarial examples, using the **Iterative Fast Gradient Sign Method**, and fool [`Inception-v3`](https://en.wikipedia.org/wiki/Inceptionv3) 30 | 31 | 32 | """ 33 | 34 | # The model 35 | @st.cache 36 | def load_model_(): 37 | return load_model() 38 | 39 | model = load_model_() 40 | 41 | st.sidebar.title('Iterative FGSM parameters') 42 | st.markdown(doc_markdown) 43 | 44 | # Input image 45 | example_url = 'https://github.com/Paulescu/adversarial-machine-learning/blob/main/images/dog.jpg?raw=true' 46 | # url = st.sidebar.text_input('Introduce URL of the initial image 👇🏼', example_url) 47 | st.markdown('## Original image') 48 | url = st.text_input('Introduce URL of the initial image 👇🏼', example_url) 49 | 50 | IMAGE_WIDTH = 350 51 | 52 | @st.cache 53 | def fetch_image(url): 54 | response = requests.get(url) 55 | x = Image.open(io.BytesIO(response.content)) 56 | x = inverse_preprocess(preprocess(x)) 57 | return x 58 | img = fetch_image(url) 59 | 60 | prediction = predict(model, img) 61 | caption = f'{prediction["label"]} \n {prediction["confidence"]:.0%}' 62 | st.image(img, caption=caption, width=IMAGE_WIDTH*2) 63 | 64 | # Selector parameters 65 | epsilon = st.sidebar.slider('Step size', min_value=0.0, max_value=0.25, step=0.01, value=0.09, format="%.3f") 66 | alpha = st.sidebar.slider('Max perturbation', min_value=0.00, max_value=0.250, step=0.001, value=0.025, format="%.3f") 67 | n_steps = st.sidebar.number_input('Number of steps', step=1, min_value=1, max_value=50, value=9) 68 | 69 | # image_width = 299 70 | st.markdown('## FGSM steps') 71 | image_width = int(IMAGE_WIDTH * 2 / 3) 72 | iterator = iterative_fast_gradient_sign_(model, preprocess(img), epsilon, n_steps=n_steps, alpha=alpha) 73 | counter = 1 74 | for x_adv, grad in iterator: 75 | 76 | st.markdown(f'## Step {counter}') 77 | 78 | # get model predictions 79 | prediction_adv = predict(model, x_adv) 80 | 81 | # print them 82 | caption_adv = f'= {prediction_adv["label"]} \n {prediction_adv["confidence"]:.0%}' 83 | st.image([x_adv, grad, x_adv], width=image_width, caption=['', f'* {epsilon}', caption_adv], output_format='JPEG') 84 | 85 | counter += 1 86 | 87 | # x_adv, grad = fast_gradient_sign(model, preprocess(img), epsilon, output_type='rgb') 88 | # prediction_adv = predict(model, x_adv) 89 | # for i in range(0, 3): 90 | # caption_adv = f'= {prediction_adv["label"]} \n {prediction_adv["confidence"]:.0%}' 91 | # st.image([grad, x_adv], width=image_width, caption=[f'* {epsilon}', caption_adv], output_format='JPEG') 92 | 93 | -------------------------------------------------------------------------------- /src/viz.py: -------------------------------------------------------------------------------- 1 | # from pdb import set_trace as stop 2 | 3 | import numpy as np 4 | import matplotlib.pyplot as plt 5 | 6 | 7 | def plot(x, x_adv, x_grad, epsilon, x_label, x_prob, x_adv_label, x_adv_prob): 8 | """""" 9 | 10 | # figure, ax = plt.subplots(1,3, figsize=(18,8)) 11 | figure, ax = plt.subplots(1,3, figsize=(12,8)) 12 | ax[0].imshow(x) 13 | ax[0].set_title('Original', fontsize=16) 14 | 15 | ax[1].imshow(x_grad) 16 | ax[1].set_title('Perturbation', fontsize=16) 17 | ax[1].set_yticklabels([]) 18 | ax[1].set_xticklabels([]) 19 | ax[1].set_xticks([]) 20 | ax[1].set_yticks([]) 21 | 22 | ax[2].imshow(x_adv) 23 | ax[2].set_title('New', fontsize=16) 24 | 25 | ax[0].axis('off') 26 | ax[2].axis('off') 27 | 28 | ax[0].text(1.1,0.5, "+{}*".format(round(epsilon,3)), size=15, ha="center", 29 | transform=ax[0].transAxes) 30 | 31 | ax[0].text(0.5,-0.13, "Prediction: {}\n Probability: {:.0%}".format(x_label, x_prob), size=12, ha="center", 32 | transform=ax[0].transAxes) 33 | 34 | ax[1].text(1.1,0.5, " = ", size=15, ha="center", transform=ax[1].transAxes) 35 | 36 | ax[2].text(0.5,-0.13, "Prediction: {}\n Probability: {:.0%}".format(x_adv_label, x_adv_prob), size=12, ha="center", 37 | transform=ax[2].transAxes) 38 | 39 | 40 | plt.show() 41 | 42 | 43 | def plot_single(x): 44 | """""" 45 | # figure, ax = plt.subplots(1,3, figsize=(18,8)) 46 | figure, ax = plt.subplots(1,3, figsize=(12,8)) 47 | ax[0].imshow(x) 48 | ax[0].set_title('Clean Example', fontsize=16) 49 | 50 | plt.show() 51 | 52 | 53 | def visualize_OLD(x, x_adv, x_grad, epsilon): 54 | """""" 55 | # get predicted label and confidence of x 56 | x_predictions = get_predictions(x) 57 | x_label = x_predictions.label 58 | x_prob = x_predictions.confidence 59 | 60 | # get predicted label and confidence of x_adv 61 | x_adv_predictions = get_predictions(x_adv) 62 | x_adv_label = x_adv_predictions.label 63 | x_adv_prob = x_adv_predictions.confidence 64 | 65 | # transform x into its raw form for visualization 66 | x = x.squeeze(0) # remove batch dimension: B x C x H x W ==> C x H x W 67 | x = inverse_preprocess(x) 68 | x = np.transpose( x , (1,2,0)) # C x H x W ==> H x W x C 69 | x = np.clip(x, 0, 1) 70 | 71 | # transform x_adv into its raw form for visualization 72 | x_adv = x_adv.squeeze(0) 73 | x_adv = inverse_preprocess(x_adv) 74 | x_adv = np.transpose( x_adv , (1,2,0)) # C X H X W ==> H X W X C 75 | x_adv = np.clip(x_adv, 0, 1) 76 | 77 | # transform grad into its raw form for visualization 78 | x_grad = x_grad.squeeze(0).numpy() 79 | x_grad = np.transpose(x_grad, (1,2,0)) 80 | x_grad = np.clip(x_grad, 0, 1) 81 | 82 | # ---------------- 83 | # start plotting 84 | # ---------------- 85 | figure, ax = plt.subplots(1,3, figsize=(18,8)) 86 | ax[0].imshow(x) 87 | ax[0].set_title('Clean Example', fontsize=20) 88 | 89 | ax[1].imshow(x_grad) 90 | ax[1].set_title('Perturbation', fontsize=20) 91 | ax[1].set_yticklabels([]) 92 | ax[1].set_xticklabels([]) 93 | ax[1].set_xticks([]) 94 | ax[1].set_yticks([]) 95 | 96 | 97 | ax[2].imshow(x_adv) 98 | ax[2].set_title('Adversarial Example', fontsize=20) 99 | 100 | ax[0].axis('off') 101 | ax[2].axis('off') 102 | 103 | ax[0].text(1.1,0.5, "+{}*".format(round(epsilon,3)), size=15, ha="center", 104 | transform=ax[0].transAxes) 105 | 106 | ax[0].text(0.5,-0.13, "Prediction: {}\n Probability: {}".format(x_label, x_prob), size=15, ha="center", 107 | transform=ax[0].transAxes) 108 | 109 | ax[1].text(1.1,0.5, " = ", size=15, ha="center", transform=ax[1].transAxes) 110 | 111 | ax[2].text(0.5,-0.13, "Prediction: {}\n Probability: {}".format(x_adv_label, x_adv_prob), size=15, ha="center", 112 | transform=ax[2].transAxes) 113 | 114 | 115 | plt.show() --------------------------------------------------------------------------------