{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "(06:Documentation)=\n",
    "# Documentation\n",
    "<hr style=\"height:1px;border:none;color:#666;background-color:#666;\" />"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Writing documentation\\index{documentation} for your package is arguably one of the most important, but perhaps least exciting, parts of the packaging process. The purpose of documentation is to help users understand how they can use and interact with your package, without having to read the source code. For the users of your code (including your future self), having readable and accessible documentation is invaluable. The reality is, if no one knows how to use your package, it will probably not get used!\n",
    "\n",
    "In **{numref}`03:Package-documentation`**, we walked through the steps required to create documentation, compile it into a user-friendly and shareable HTML format, and then host it online. We'll revise those steps here and will provide more detail about the documentation workflow and the individual elements of package documentation."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "(06:Documentation-content-and-workflow)=\n",
    "## Documentation content and workflow"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To give you an idea of what we mean when we say \"documentation\", {numref}`06-documentation-table` shows the documentation included with a typical Python package and where it is usually located in the package's directory structure.\n",
    "\n",
    "```{table} Typical Python package documentation.\n",
    ":name: 06-documentation-table\n",
    "|Documentation|Typical location|Description|\n",
    "|:---    | :--- | :---      |\n",
    "|README|Root |Provides high-level information about the package, e.g., what it does, how to install it, and how to use it.|\n",
    "|License|Root |Explains who owns the copyright to your package source and how it can be used and shared.|\n",
    "|Contributing guidelines|Root |Explains how to contribute to the project.|\n",
    "|Code of conduct|Root |Defines standards for how to appropriately engage with and contribute to the project and its community.|\n",
    "|Changelog|Root |A chronologically ordered list of notable changes to the package over time, usually organized by version.|\n",
    "|Docstrings| *.py* files |Text appearing as the first statement in a function, method, class, or module in Python that describes what the code does and how to use it. Accessible to users via the `help()` command.|\n",
    "|Typehints| *.py* files |Type annotations of functions and methods that aid in development and documentation.|\n",
    "|Examples|*`docs/`* |Step-by-step, tutorial-like examples showing how the package works in more detail.|\n",
    "|API reference|*`docs/`* | An organized list of the user-facing functionality of your package (i.e., functions, classes, etc.) along with a short description of what they do and how to use them. Typically created automatically from your package's docstrings using the `sphinx` tool as we'll discuss in **{numref}`03:Building-documentation`**.|\n",
    "```\n",
    "\n",
    "\\newpage\n",
    "\n",
    "We'll discuss what each of these pieces of documentation are and how to write them in **{numref}`06:Writing-documentation`**. But it's first helpful to understand the big-picture documentation workflow and what we're aiming to build.\n",
    "\n",
    "The typical workflow for documenting a Python package consists of three steps:\n",
    "\n",
    "1. **Write documentation**: manually write the documentation source files that will support your package, such as those listed in {numref}`06-documentation-table`. These are usually written in a plain-text format like [Markdown](https://en.wikipedia.org/wiki/Markdown) (*.md*). [reStructuredText](https://www.sphinx-doc.org/en/master/usage/restructuredtext/index.html) (*.rst*), which we explain in **{numref}`06:Writing-documentation`**. Below we show an example of the *`README.md`* file we wrote for the `pycounts` package we developed in **Chapter 3: {ref}`03:How-to-package-a-Python`**.\n",
    "\n",
    "    ````xml\n",
    "    # pycounts\n",
    "\n",
    "    Calculate word counts in a text file!\n",
    "\n",
    "    ## Installation\n",
    "\n",
    "    ```bash\n",
    "    $ pip install pycounts\n",
    "    ```\n",
    "\n",
    "    ## Usage\n",
    "\n",
    "    `pycounts` can be used to count words in a text file and plot\n",
    "    results as follows:\n",
    "\n",
    "    ```python\n",
    "    from pycounts.pycounts import count_words\n",
    "    from pycounts.plotting import plot_words\n",
    "    import matplotlib.pyplot as plt\n",
    "\n",
    "    file_path = \"test.txt\"  # path to your file\n",
    "    counts = count_words(file_path)\n",
    "    fig = plot_words(counts, n=10)\n",
    "    plt.show()\n",
    "    ```\n",
    "\n",
    "    ...rest of file hidden...\n",
    "    ````\n",
    "\n",
    "2. **Build documentation\\index{documentation!build documentation}**: compile and render the manually written documentation into an organized, coherent, and shareable format, such as HTML or PDF, using the documentation generator tool `sphinx`. To help you understand what this means, {numref}`06-documentation-1-fig` shows an example of what the README document above looks like when it's \"built\".\n",
    "\n",
    "    ```{figure} images/06-documentation-1.png\n",
    "    ---\n",
    "    width: 100%\n",
    "    name: 06-documentation-1-fig\n",
    "    alt: Example of HTML documentation generated by sphinx.\n",
    "    ---\n",
    "    Example of HTML documentation generated by sphinx.\n",
    "    ```\n",
    "\n",
    "3. **Host documentation\\index{documentation!host documentation} online**: share documentation online so it can be easily accessed by anyone with an internet connection, using a free service like [Read the Docs](https://readthedocs.org)\\index{Read the Docs} or [GitHub Pages](https://pages.github.com). For example, the documentation we built for `pycounts` in **{numref}`03:Package-documentation`** is available online at <https://pycounts.readthedocs.io/en/latest/>.\n",
    "\n",
    "In the remaining sections of this chapter, we'll walk through each of the above steps of the documentation workflow."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "(06:Writing-documentation)=\n",
    "## Writing documentation"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "{numref}`06-documentation-table` shows the typical documentation included in a package and where it is usually located in the package's directory structure. There's a lot of content to think about here, but the reality is that most developers make Python packages from templates that create most of this documentation\\index{documentation} automatically. For example, consider the `pycounts` package we created using the `py-pkgs-cookiecutter` template in **{numref}`03:Creating-a-package-structure`**:\n",
    "\n",
    "```{code-block} md\n",
    "---\n",
    "emphasize-lines: 3-9\n",
    "---\n",
    "pycounts\n",
    "├── .readthedocs.yml\n",
    "├── CHANGELOG.md      <--------\n",
    "├── CONDUCT.md        <--------\n",
    "├── CONTRIBUTING.md   <--------\n",
    "├── docs              <--------\n",
    "│   └── ...           <--------\n",
    "├── LICENSE           <--------\n",
    "├── README.md         <--------\n",
    "├── poetry.lock\n",
    "├── pyproject.toml\n",
    "├── src\n",
    "│   └── ...\n",
    "└── tests\n",
    "    └── ...\n",
    "```\n",
    "\n",
    "Documentation is typically written in a plain-text markup format, such as [Markdown](https://en.wikipedia.org/wiki/Markdown)\\index{Markdown} (*.md*) or [reStructuredText](https://www.sphinx-doc.org/en/master/usage/restructuredtext/index.html)\\index{reStructuredText} (*.rst*). With a plain-text markup language, documents are written in plain-text and a special syntax is used to specify how the text should be formatted when it is rendered by a suitable tool. We saw an example of a raw and rendered Markdown document in **{numref}`06:Documentation-content-and-workflow`**. As you can see from the structure of our `pycounts` package above, we use Markdown (*.md*) in this book because it is widely used, and we feel it has a less verbose and more intuitive syntax than reStructuredText. Automatic Markdown-rendering is also supported on a wide variety of IDEs\\index{integrated development environment} and websites. We'll show examples of Markdown syntax and writing the documents above in the following sections, and you can check out the [Markdown Guide](https://www.markdownguide.org) to learn more about Markdown."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "(06:README)=\n",
    "### README"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The README\\index{documentation!README} file is the \"map\" of your package. It's typically the first thing users will see and read when interacting with your package and should provide high-level information such as: what your package does, how it can be installed, a brief demonstration of usage, who created the package, how it is licensed, and how to contribute to it. The README is the \"gateway\" to your package. Without it, users won't know where to begin.\n",
    "\n",
    "As an example of a README file, we show the full README of our `pycounts` package below, which we developed in **Chapter 3: {ref}`03:How-to-package-a-Python`**.\n",
    "\n",
    "```{tip}\n",
    "In the Markdown text below, the following syntax is used:\n",
    "\n",
    "- Headers are denoted with number signs (\\#). The number of number signs corresponds to the heading level.\n",
    "- Code blocks are bounded by three back-ticks. A programming language can succeed the opening bounds to specify how the code syntax should be highlighted.\n",
    "- Links are defined using brackets \\[\\] to enclose the link text, followed by the URL in parentheses ().\n",
    "```\n",
    "\n",
    "\\newpage\n",
    "\n",
    "````xml\n",
    "# pycounts\n",
    "\n",
    "Calculate word counts in a text file!\n",
    "\n",
    "## Installation\n",
    "\n",
    "```bash\n",
    "$ pip install pycounts\n",
    "```\n",
    "\n",
    "## Usage\n",
    "\n",
    "`pycounts` can be used to count words in a text file and plot results\n",
    "as follows:\n",
    "\n",
    "```python\n",
    "from pycounts.pycounts import count_words\n",
    "from pycounts.plotting import plot_words\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "file_path = \"test.txt\"  # path to your file\n",
    "counts = count_words(file_path)\n",
    "fig = plot_words(counts, n=10)\n",
    "plt.show()\n",
    "```\n",
    "\n",
    "## Contributing\n",
    "\n",
    "Interested in contributing? Check out the contributing guidelines. \n",
    "Please note that this project is released with a Code of Conduct. \n",
    "By contributing to this project, you agree to abide by its terms.\n",
    "\n",
    "## License\n",
    "\n",
    "`pycounts` was created by Tomas Beuzen. It is licensed under the terms\n",
    "of the MIT license.\n",
    "\n",
    "## Credits\n",
    "\n",
    "`pycounts` was created with \n",
    "[`cookiecutter`](https://cookiecutter.readthedocs.io/en/latest/) and \n",
    "the `py-pkgs-cookiecutter` \n",
    "[template](https://github.com/py-pkgs/py-pkgs-cookiecutter).\n",
    "````\n",
    "\n",
    "To stress the point once more, while the raw text above doesn't look like much, the Markdown syntax formats the text nicely when rendered by a tool like `sphinx` into what we showed in {numref}`06-documentation-1-fig`. This is why we use Markdown to write package documentation — it can be easily written in plain-text but renders into something so much more!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "(06:License)=\n",
    "### License"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A license\\index{documentation!license} tells others what they can and can't do with your code. The [Open Source Initiative (OSI)](https://opensource.org/) is a good place to learn more about different licenses, and GitHub also has a [useful tool](https://choosealicense.com/) for helping choose the most appropriate license for your package. Some common licenses used for Python packages include:\n",
    "\n",
    "- Creative Commons CC0 1.0 Universal (CC0 1.0): releases your software into the public domain, such that others can use it for any purpose. \n",
    "- MIT license: allows users to do whatever they want with your software, as long as they include the original copyright and license notice in any copy or substantial modification of it. \n",
    "- GNU General Public License v3 (GPL-3): less permissive than the above licenses. Any changes made to your software must be recorded, and the complete source code of the original software and modifications of it must be made available under the same GPL-3 license.\n",
    "\n",
    "If you don't include a license, then default copyright laws apply, which typically means that you retain all rights to your source code, and no one may download, reproduce, distribute, or create derivative works from your package. This might be fine if you want to keep your work private or proprietary, but if you open-source your work without a license, others will be unable to use or contribute to it."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Contributing guidelines"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A contributing guidelines\\index{documentation!contributing guidelines} file (often named \"CONTRIBUTING\") outlines procedures for how users can contribute to your project. These guidelines will vary depending on how you're sharing your package's source with others, but they typically include information on what kinds of contributions you're accepting, and how to make those contributions (usually via the use of a version control system). GitHub provides a good [guide](https://help.github.com/en/github/building-a-strong-community/setting-guidelines-for-repository-contributors) for adding a contributing file to your project.\n",
    "\n",
    "Having clear contributing guidelines streamlines the incorporation of contributions into your package. Without contributing guidelines, it's not clear how others should effectively contribute, or if you would like contributions at all. As a result, you may receive contributions you don't want, or in a way you don't want, which could waste your and other people's time."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Code of conduct"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A code of conduct\\index{documentation!code of conduct} file (often named \"CONDUCT\") is used to define community standards, identify a welcoming and inclusive project, and outline procedures for handling abuse. GitHub provides an excellent [guide](https://help.github.com/en/github/building-a-strong-community/adding-a-code-of-conduct-to-your-project) for adding a code of conduct to your project. A code of conduct helps the community feel safe, respected, and welcome to contribute to your package. Without it, others may not want to contribute to your package, and conflicts may arise among contributors with conflicting ideas."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "(06:Changelog)=\n",
    "### Changelog"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A changelog\\index{documentation!changelog} is a file which contains a chronologically ordered list of changes made to your package. Changes are typically organized per released version of your package, something we'll discuss more in **Chapter 7: {ref}`07:Releasing-and-versioning`**. Having a changelog helps users and contributors understand the history of a package and how it has evolved over time. Without it, there's no easy way for users to understand when, what, and why changes were made to your package.\n",
    "\n",
    "Changelog's are made for humans to read. They typically contain dot-points of important changes made for each version of your package, grouped into categories such as: \"Feature\", \"Fix\", \"Documentation\", \"Tests\", and with the latest version at the top of the file. An example of a hypothetical changelog for our `pycounts` package is shown below.\n",
    "\n",
    "```{tip}\n",
    "In the Markdown text below the syntax `<!-- ... -->` indicates a comment. Comments aren't included in the rendered version of the document.\n",
    "```\n",
    "\n",
    "\\newpage\n",
    "\n",
    "```xml\n",
    "# Changelog\n",
    "\n",
    "<!--next-version-placeholder-->\n",
    "\n",
    "## v0.2.1 (12/09/2021)\n",
    "\n",
    "### Fix\n",
    "\n",
    "- Changed confusing error message in plotting.plot_words()\n",
    "\n",
    "## v0.2.0 (10/09/2021)\n",
    "\n",
    "### Feature\n",
    "\n",
    "- Added a \"stop_words\" argument to pycounts.count_words()\n",
    "\n",
    "### Documentation\n",
    "\n",
    "- Added new usage examples\n",
    "- Now hosting documentation on Read the Docs\n",
    "\n",
    "## v0.1.0 (24/08/2021)\n",
    "\n",
    "- First release of `pycounts`\n",
    "```\n",
    "\n",
    "```{tip}\n",
    "In **Chapter 8: {ref}`08:Continuous-integration-and-deployment`**, we'll show how you can automatically update your changelog from your version control commit messages when you make a new release of your package.\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "(06:Examples)=\n",
    "### Examples"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Creating examples of how to use your package can be invaluable to new and existing users alike. Unlike the brief \"Usage\" heading in the README in **{numref}`06:README`**, these examples are more like tutorials, including a mix of text, figures, and code that demonstrate the functionality and common workflows of your package step-by-step. The examples should be realistic and illustrate workflows that users of your package might actually do (as opposed to toy examples).\n",
    "\n",
    "It's important to think about your audience here too. Sometimes, it's necessary to create examples for different levels of expertise. Examples for new users will introduce the basic functionality of your package step-by-step, with plenty of commentary about what each piece of code is doing and why. Examples for more competent users might be more code-based, requiring less explanation of each step, and will likely explore more advanced usage of the package.\n",
    "\n",
    "You could certainly write examples from scratch using a plain-text format like Markdown, but this can be inefficient and prone to errors. Instead, we recommend creating examples using a computational notebook like a Jupyter Notebook{cite:p}`jupyter2016` (*.ipynb* file). Jupyter Notebooks are interactive documents that can contain code, equations, text, and visualizations. They are effective for demonstrating examples because they directly import and use code from your package; this ensures you don't make mistakes when writing out your example, and it allows users to download, execute, and interact with the notebooks themselves (as opposed to just reading text). \n",
    "\n",
    "To create examples in a Jupyter\\index{Jupyter} notebook\\index{Jupyter!notebook}, you'll need to install the Jupyter software. If you're using a `poetry`-managed project, as we do in this book, you can install the Jupyter software as a development dependency of your package with the following command:\n",
    "\n",
    "```{attention}\n",
    "If you're following on from **Chapter 3: {ref}`03:How-to-package-a-Python`** and created a virtual environment for your `pycounts` package using `conda`, as we did in **{numref}`03:Create-a-virtual-environment`**, be sure to activate that environment before continuing by running `conda activate pycounts` at the command line.\n",
    "```\n",
    "\n",
    "```\n",
    "$ poetry add --group dev jupyter\n",
    "```\n",
    "\n",
    "Once installed, you can launch the Jupyter Notebook application with the following command:\n",
    "\n",
    "```\n",
    "$ jupyter notebook\n",
    "```\n",
    "\n",
    "\\newpage\n",
    "\n",
    "```{tip}\n",
    "If you're developing your Python package in an IDE\\index{integrated development environment} that natively supports Jupyter Notebooks, such as Visual Studio Code\\index{Visual Studio Code} or JupyterLab, you can simply open *`docs/example.ipynb`* to edit it, without needing to run the `jupyter notebook` command above.\n",
    "```\n",
    "\n",
    "Notebooks are made of \"cells\" that can contain Python code or Markdown text. Discussing how to use the Jupyter application is beyond the scope of this book, and we refer readers to the Jupyter [documentation](https://jupyter-notebook.readthedocs.io/en/latest/?badge=latest) to learn more. However, as an example, {numref}`06-jupyter-example-1-fig` and {numref}`06-jupyter-example-2-fig` show the example notebook that we created to support our `pycounts` package in **{numref}`03:Creating-usage-examples`**.\n",
    "\n",
    "```{figure} images/06-jupyter-example-1.png\n",
    "---\n",
    "width: 100%\n",
    "name: 06-jupyter-example-1-fig\n",
    "alt: First half of Jupyter Notebook demonstrating an example workflow using the pycounts package.\n",
    "---\n",
    "First half of Jupyter Notebook demonstrating an example workflow using the pycounts package.\n",
    "```\n",
    "\n",
    "```{figure} images/06-jupyter-example-2.png\n",
    "---\n",
    "width: 100%\n",
    "name: 06-jupyter-example-2-fig\n",
    "alt: Second half of Jupyter Notebook demonstrating an example workflow using the pycounts package.\n",
    "---\n",
    "Second half of Jupyter Notebook demonstrating an example workflow using the pycounts package.\n",
    "```\n",
    "\n",
    "In **{numref}`06:Building-documentation`**, we'll show how we can use `sphinx` to automatically execute notebooks and include their content (including the outputs of code cells) into our built documentation so that users can easily read and navigate through them without having to even start the Jupyter application!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "(06:Docstrings)=\n",
    "### Docstrings"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A docstring\\index{docstring} is a string, surrounded by triple-quotes, at the start of a module, class, or function in Python (preceding any code) that provides documentation on what the object does and how to use it. Docstrings automatically become the documented object's documentation, accessible to users via the `help()` function. Docstrings are a user's first port-of-call when they are trying to use code from your package; they really are a necessity when creating packages, even for yourself.\n",
    "\n",
    "General docstring convention in Python is described in [Python Enhancement Proposal (PEP) 257 — Docstring Conventions](https://www.python.org/dev/peps/pep-0257/), but there is flexibility in how you write your docstrings. A minimal docstring contains a single line describing what the object does, and that might be sufficient for a simple function or for when your code is in the early stages of development. However, for code you intend to share with others (including your future self) a more comprehensive docstring should be written. \n",
    "\n",
    "A typical docstring will include:\n",
    "\n",
    "1. A one-line summary that does not use variable names or the function name.\n",
    "2. An extended description.\n",
    "3. Parameter types and descriptions.\n",
    "4. Returned value types and descriptions.\n",
    "5. Example usage.\n",
    "6. Potentially more.\n",
    "\n",
    "There are different \"docstring styles\" used in Python to organize this information, such as [numpydoc style](https://numpydoc.readthedocs.io/en/latest/format.html#docstring-standard), [Google style](https://github.com/google/styleguide/blob/gh-pages/pyguide.md#38-comments-and-docstrings), and [sphinx style](https://sphinx-rtd-tutorial.readthedocs.io/en/latest/docstrings.html#the-sphinx-docstring-format). In this book, we've been using the numpydoc style because we find it has an intuitive syntax and is human-readable. In the numpydoc style:\n",
    "\n",
    "- Section headers are denoted as text underlined with dashes:\n",
    "\n",
    "    ```xml\n",
    "    Parameters\n",
    "    ----------\n",
    "    ```\n",
    "\n",
    "- Input arguments are denoted as:\n",
    "\n",
    "    ```xml\n",
    "    name : type\n",
    "        Description of parameter `name`.\n",
    "    ```\n",
    "\n",
    "- Output values use the same syntax above, but specifying the `name` is optional.\n",
    "\n",
    "As an example of a docstring, consider the `count_words()` function of our `pycounts` package:\n",
    "\n",
    "\\newpage\n",
    "\n",
    "```python\n",
    "def count_words(input_file):\n",
    "    \"\"\"Count words in a text file.\n",
    "\n",
    "    Words are made lowercase and punctuation is removed \n",
    "    before counting.\n",
    "\n",
    "    Parameters\n",
    "    ----------\n",
    "    input_file : str\n",
    "        Path to text file.\n",
    "\n",
    "    Returns\n",
    "    -------\n",
    "    collections.Counter\n",
    "        dict-like object where keys are words and values are counts.\n",
    "\n",
    "    Examples\n",
    "    --------\n",
    "    >>> count_words(\"text.txt\")\n",
    "    \"\"\"\n",
    "    text = load_text(input_file)\n",
    "    text = clean_text(text)\n",
    "    words = text.split()\n",
    "    return Counter(words)\n",
    "```\n",
    "\n",
    "You can add information to your docstrings at your discretion — you won't always need all the sections above, and in some case you may want to include additional sections from the numpydoc style [documentation](https://numpydoc.readthedocs.io/en/latest/format.html#docstring-standard)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "(06:Typehints)=\n",
    "### Typehints"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Typehints in Python are a powerful tool for documentation and readability. They help users understand your code by specifying the expected types of variables, function parameters, and return values. Introduced in Python 3.5 through [PEP 484](https://www.python.org/dev/peps/pep-0484/), typehints offer a way to statically indicate the types within your Python code, enabling tools like type checkers, IDEs, and linters to provide better support for code verification, auto-completion, and refactoring.\n",
    "\n",
    "At their core, typehints allow you to annotate variables and function signatures with type information. This is purely for documentation and tooling purposes; Python itself does not enforce these types at runtime. Here’s a simple example:\n",
    "\n",
    "```python\n",
    "def greet(name: str) -> str:\n",
    "    return f\"Hello, {name}\"\n",
    "```\n",
    "\n",
    "In this function, `name: str` specifies that `name` should be a string, and `-> str` indicates that the function returns a string.\n",
    "\n",
    "For more complex types, the `typing` module provides a wealth of typehints like `List`, `Dict`, `Optional`, and `Union`:\n",
    "\n",
    "```python\n",
    "from typing import List, Optional\n",
    "\n",
    "def process_items(items: List[str]) -> Optional[str]:\n",
    "    if isinstance(items, list):\n",
    "        return \" \".join(items)\n",
    "    return None\n",
    "```\n",
    "\n",
    "Here, `List[str]` denotes a list of strings, and `Optional[str]` indicates that the function returns either a string or `None`.\n",
    "\n",
    "Typehints are also invaluable for annotating classes and methods, clarifying the expected types of instance variables and method parameters:\n",
    "\n",
    "```python\n",
    "class Item:\n",
    "    def __init__(self, name: str, quantity: int) -> None:\n",
    "        self.name: str = name\n",
    "        self.quantity: int = quantity\n",
    "\n",
    "    def total_cost(self, price_per_item: float) -> float:\n",
    "        return self.quantity * price_per_item\n",
    "```\n",
    "\n",
    "Typehints have several advantages:\n",
    "1. **Improved Readability:** Typehints make the code easier to understand, as the types of variables and return values are explicitly documented.\n",
    "2. **Better Tool Support:** Enhanced auto-completion, error detection, and refactoring support in IDEs.\n",
    "3. **Facilitated Debugging:** While not enforced at runtime, typehints can help catch type-related errors early in the development process with static type checkers like `mypy`.\n",
    "4. **Documentation:** Automatic documentation tools can utilize typehints to generate more informative documentation.\n",
    "\n",
    "\n",
    "Follow these best practices when using typehints:\n",
    "- **Gradual Typing:** You don’t need to annotate all your code at once. Python’s dynamic nature is preserved, allowing you to introduce typehints gradually.\n",
    "- **Use `mypy` for Type Checking:** `mypy` is a static type checker for Python that can catch type errors based on your annotations.\n",
    "- **Be Specific:** When possible, use specific types (e.g., `List[int]` instead of `list`) to provide clearer documentation and better tooling support.\n",
    "\n",
    "In summary, typehints are a valuable addition to the Python language, offering a robust way to document the types within your code, enhance readability, and improve tooling support. While optional, their use in large codebases or libraries can significantly aid in maintainability and developer efficiency."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Application programming interface (API) reference"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "An application programming interface\\index{application programming interface} (API) reference sheet is an organized index of your package's user-facing functionality and associated docstrings. It helps users efficiently understand and search through your package's functionality without having to dig in to the source code or run the Python `help()` command on every object they need to know about.\n",
    "\n",
    "As a concrete example of what we're talking about, {numref}`06-documentation-2-fig` shows an API reference for our `pycounts` package, and {numref}`06-documentation-3-fig` shows the detail we get when we click on the `pycounts.plotting` module.\n",
    "\n",
    "```{figure} images/06-documentation-2.png\n",
    "---\n",
    "width: 100%\n",
    "name: 06-documentation-2-fig\n",
    "alt: API reference for the pycounts package.\n",
    "---\n",
    "API reference for the pycounts package.\n",
    "```\n",
    "\n",
    "```{figure} images/06-documentation-3.png\n",
    "---\n",
    "width: 100%\n",
    "name: 06-documentation-3-fig\n",
    "alt: API reference for the pycounts.plotting package.\n",
    "---\n",
    "API reference for the pycounts.plotting package.\n",
    "```\n",
    "\n",
    "You could create an API reference by manually copying and pasting the names of all of your package's Python objects (functions, modules, classes, etc.) and their docstrings into a plain-text file, but that would be incredibly tedious and not reproducible. Instead, API references are usually generated automatically using `sphinx`, which can parse your source code to extract Python objects and their docstrings and render them into an API reference. We'll demonstrate how to do this in **{numref}`06:Building-documentation`**."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Other package documentation"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In this section, we've only explored the core documentation typically included in a Python package. But you can add as much documentation as you wish! For example, you might wish to write documents for frequently asked questions (FAQs), a document referencing how your project compares to similar projects, information on project funding and attribution, etc. In general, the more documentation the better!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "(06:Building-documentation)=\n",
    "## Building documentation"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "At the moment, the documentation\\index{documentation!build documentation} we've written is spread throughout our package's directory structure in the form of plain-text Markdown files, Jupyter Notebooks, and docstrings in our Python modules. Rather than requiring users to search through this directory structure to find documentation, it's common to use a documentation generator like `sphinx`\\index{sphinx} to compile and render all of this plain-text documentation into a user-friendly output format, such as HTML or PDF, that is easy to view, navigate, and share with others. We showed an example of `sphinx`-generated documentation in {numref}`06-documentation-1-fig`. As we'll see in this section, `sphinx` also has a rich ecosystem of extensions that can be used to help customize and automatically generate content to complement your manually-written documentation.\n",
    "\n",
    "We'll demonstrate the process of building documentation with `sphinx` using our `pycounts` package. This section will effectively walk through the same steps we went through in **{numref}`03:Building-documentation`**, so for readers who have recently read that section, feel free to skip to **{numref}`06:Hosting-documentation-online`**. \n",
    "\n",
    "The source and configuration files to build documentation using `sphinx` live in a *`docs/`* folder in the root of your package. The `py-pkgs-cookiecutter` automatically created this folder for us:\n",
    "\n",
    "```{code-block} md\n",
    "---\n",
    "emphasize-lines: 6-15\n",
    "---\n",
    "pycounts\n",
    "├── .readthedocs.yml\n",
    "├── CHANGELOG.md\n",
    "├── CONDUCT.md\n",
    "├── CONTRIBUTING.md\n",
    "├── docs                <---------\n",
    "│   ├── changelog.md\n",
    "│   ├── conduct.md\n",
    "│   ├── conf.py\n",
    "│   ├── contributing.md\n",
    "│   ├── example.ipynb\n",
    "│   ├── index.md\n",
    "│   ├── make.bat\n",
    "│   ├── Makefile\n",
    "│   └── requirements.txt\n",
    "├── LICENSE\n",
    "├── pyproject.toml\n",
    "├── README.md\n",
    "├── src\n",
    "│   └── ...\n",
    "└── tests\n",
    "    └── ...\n",
    "```\n",
    "\n",
    "```{tip}\n",
    "If you don't use a template to create your Python package directory structure, the `sphinx` command `sphinx-quickstart` can be used to quickly create the source files in the *`docs/`* directory for you.\n",
    "```\n",
    "\n",
    "The *`docs/`* directory includes:\n",
    "\n",
    "- *`Makefile`*/*`make.bat`*: files that contain commands needed to build our documentation with `sphinx` and do not need to be modified. [Make](https://www.gnu.org/software/make/)\\index{Make} is a tool used to run commands to efficiently read, process, and write files. A Makefile\\index{Make!Makefile} defines the tasks for Make to execute. If you're interested in learning more about Make, we recommend the [Learn Makefiles](https://makefiletutorial.com) tutorial. But for building documentation with `sphinx`, all you need to know is that having these Makefiles allows us to build documentation with the simple command `make html` and to clean documentation (i.e., remove it so we can make a fresh copy) with the command `make clean`. We'll use these commands later in this section.\n",
    "- *`requirements.txt`*: contains a list of documentation-specific dependencies required to host our documentation online on [Read the Docs](https://readthedocs.org/), which we'll discuss in **{numref}`06:Hosting-documentation-online`**.\n",
    "- *`conf.py`* is a configuration file controlling how `sphinx` builds your documentation. You can read more about *`conf.py`* in the `sphinx` [documentation](https://www.sphinx-doc.org/en/master/usage/configuration.html), and we'll touch on it again shortly, but for now, it has been pre-populated by the `py-pkgs-cookiecutter` template and does not need to be modified.\n",
    "- The remaining files in the *`docs/`* directory form the content of our generated documentation, as we'll discuss in the remainder of this section.\n",
    "\n",
    "The *`index.md`* file will form the landing page of our documentation. Think of it as the homepage of a website. For your landing page, you'd typically want some high-level information about your package, and then links to the rest of the documentation you want to expose to a user. For example, the landing page we are going to build will look like {numref}`06-documentation-4-fig`.\n",
    "\n",
    "\\newpage\n",
    "\n",
    "```{figure} images/06-documentation-4.png\n",
    "---\n",
    "width: 100%\n",
    "name: 06-documentation-4-fig\n",
    "alt: The documentation homepage generated by sphinx.\n",
    "---\n",
    "The documentation homepage generated by sphinx.\n",
    "```\n",
    "\n",
    "\\newpage\n",
    "\n",
    "If you open *`index.md`* in an editor of your choice you'll see we're generating this content with a particular kind of syntax explained below.\n",
    "\n",
    "````xml\n",
    "```{include} ../README.md\n",
    "```\n",
    "\n",
    "```{toctree}\n",
    ":maxdepth: 1\n",
    ":hidden:\n",
    "\n",
    "example.ipynb\n",
    "changelog.md\n",
    "contributing.md\n",
    "conduct.md\n",
    "autoapi/index\n",
    "```\n",
    "````\n",
    "\n",
    "Sphinx natively supports [reStructuredText](https://www.sphinx-doc.org/en/master/usage/restructuredtext/index.html), but many developers prefer to work in Markdown (as we do in this book). The syntax shown above in *`index.md`* is a flavor of Markdown known as [Markedly Structured Text (MyST)](https://myst-parser.readthedocs.io/en/latest/syntax/syntax.html). MyST is based on Markdown but with additional syntax options inspired by reStructuredText and compatible for use with `sphinx`. For example, the `{include}` syntax specifies that we want the *`index.md`* landing page to include the content of the *`README.md`* in our package's root directory (think of it as a copy-paste operation).\n",
    "\n",
    "The `{toctree}` syntax defines what documents will be listed in the table of contents (ToC) on the left-hand side of {numref}`06-documentation-4-fig`. The argument `:maxdepth: 1` indicates how many heading levels the ToC should include, and `:hidden:` specifies that the ToC should only appear in the side bar and not in the index page itself. The ToC then lists the documents we want to include and link to in our documentation. \"example.ipynb\" is the Jupyter Notebook we showed in section **{numref}`06:Examples`**. `sphinx` doesn't support relative links in a ToC, so to include the documents *`CHANGELOG.md`*, *`CONTRIBUTING.md`*, and *`CONDUCT.md`* from our root, we create \"stub files\" *`changelog.md`*, *`contributing.md`*, and *`conduct.md`*, which contain links to these documents with the `{include}` syntax from earlier (which does support relative links). For example, *`changelog.md`* contains the following text:\n",
    "\n",
    "````xml\n",
    "```{include} ../CHANGELOG.md\n",
    "```\n",
    "````\n",
    "\n",
    "The final document in the ToC, \"autoapi/index\" is an API reference sheet that will be generated automatically for us, from our package structure and docstrings, when we build our documentation with `sphinx`.\n",
    "\n",
    "Before we can go ahead and build our documentation with `sphinx`, it relies on a few `sphinx` extensions that need to be installed and configured:\n",
    "\n",
    "- [myst-nb](https://myst-nb.readthedocs.io/en/latest/): extension that enables `sphinx` to parse Markdown, MyST, and notebook files (`sphinx` only supports reStructuredTex, *.rst* files, by default).\n",
    "- [sphinx-rtd-theme](https://sphinx-rtd-theme.readthedocs.io/en/stable/): a custom theme for styling the way our documentation will look. It looks much better than the `sphinx` default.\n",
    "- [sphinx-autoapi](https://sphinx-autoapi.readthedocs.io/en/latest/): extension that will parse our source code and docstrings to create an API reference sheet.\n",
    "- [sphinx.ext.napoleon](https://sphinxcontrib-napoleon.readthedocs.io/en/latest/): enables `sphinx` to parse numpydoc style docstrings.\n",
    "- [sphinx.ext.viewcode](https://www.sphinx-doc.org/en/master/usage/extensions/viewcode.html): adds a helpful link to the source code of each object in the API reference sheet.\n",
    "\n",
    "These extensions are not necessary to create documentation with `sphinx`, but they are all commonly used in Python packaging documentation and significantly improve the look and user-experience of the generated documentation. Extensions without the `sphinx.ext` prefix need to be installed. We can install them as development dependencies in a `poetry`-managed project with the following command:\n",
    "\n",
    "```\n",
    "$ poetry add --group dev myst-nb sphinx-autoapi sphinx-rtd-theme\n",
    "```\n",
    "\n",
    "Once installed, any extensions you want to use need to be added to a list called `extensions` in the *`conf.py`* configuration file and configured. Configuration options for each extension (if they exist) can be viewed in their respective documentation, but the `py-pkgs-cookiecutter` has already taken care of everything for us, by defining the following variables within *`conf.py`*:\n",
    "\n",
    "```python\n",
    "extensions = [\n",
    "    \"myst_nb\",\n",
    "    \"autoapi.extension\",\n",
    "    \"sphinx.ext.napoleon\",\n",
    "    \"sphinx.ext.viewcode\",\n",
    "]\n",
    "autoapi_dirs = [\"../src\"]  # location to parse for API reference\n",
    "html_theme = \"sphinx_rtd_theme\"\n",
    "```\n",
    "\n",
    "With our documentation structure set up, and our extensions configured, we can now navigate to the *`docs/`* directory and build our documentation with `sphinx` using the following commands:\n",
    "\n",
    "```\n",
    "$ cd docs\n",
    "$ make html\n",
    "```\n",
    "\n",
    "```md\n",
    "Running Sphinx\n",
    "...\n",
    "build succeeded.\n",
    "The HTML pages are in _build/html.\n",
    "```\n",
    "\n",
    "If we now look inside our *`docs/`* directory we see a new directory *`_build/html`*, which contains our built documentation as HTML files. If you open *`_build/html/index.html`* you should see the landing page in {numref}`06-documentation-4-fig`.\n",
    "\n",
    "```{note}\n",
    "If you make significant changes to your documentation, it can be a good idea to delete the *`_build/`* folder before building it again. You can do this easily by adding the `clean` option into the `make html` command: `make clean html`.\n",
    "```\n",
    "\n",
    "The `sphinx-autoapi` and `sphinx.ext.napoleon` extensions extracted the docstrings within each module and rendered them into our documentation. If you click \"API Reference\" you should now be able to view pages like those shown in {numref}`06-documentation-2-fig` and {numref}`06-documentation-3-fig`.\n",
    "\n",
    "If you navigate to the \"Example usage\" page, you should see a rendered version of our Jupyter Notebook example, as shown in {numref}`06-documentation-5-fig`. This was made possible using the `myst-nb` extension.\n",
    "\n",
    "```{figure} images/06-documentation-5.png\n",
    "---\n",
    "width: 100%\n",
    "name: 06-documentation-5-fig\n",
    "alt: Jupyter Notebook example rendered into pycounts's documentation.\n",
    "---\n",
    "Jupyter Notebook example rendered into pycounts's documentation.\n",
    "```\n",
    "\n",
    "Ultimately, you can efficiently make beautiful and many-featured documentation with `sphinx` and its ecosystem of extensions. You can now use this documentation yourself or potentially share it with others, but it really shines when you host it on the web using a free service like [Read the Docs](https://readthedocs.org/), as we'll do in the next section. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "(06:Hosting-documentation-online)=\n",
    "## Hosting documentation online"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If you intend to share your package with others, it will be useful to make your documentation accessible online\\index{documentation!host documentation}. It's common to host Python package documentation on the free online hosting service [Read the Docs](https://readthedocs.org/)\\index{Read the Docs}, which can automate the building, deployment, and hosting of your documentation. Read the Docs works by connecting to an online repository hosting your package documentation, such as a GitHub repository. When you push changes to your repository, Read the Docs automatically builds a fresh copy of your documentation (i.e., runs `make html`) and hosts it at the URL <https://pkgname.readthedocs.io/> (you can also configure Read the Docs to use a custom domain name). This means that any changes you make to your documentation source files are immediately deployed to your users. If you need your documentation to be private (i.e., only available to employees of a company), Read the Docs offers a paid \"Business plan\" with this functionality.\n",
    "\n",
    "```{tip}\n",
    "[GitHub Pages](https://pages.github.com)\\index{GitHub Pages} is another popular service used for hosting documentation from a repository. However, it doesn't natively support automatic building of your documentation when you push changes to the source files, which is why we prefer to use Read the Docs here. If you did want to host your docs on GitHub Pages, we recommend using the [ghp-import](https://github.com/c-w/ghp-import) package, or setting up an automated GitHub Actions workflow using the [peaceiris/actions-gh-pages](https://github.com/peaceiris/actions-gh-pages) action (we'll learn more about GitHub Actions in **Chapter 8: {ref}`08:Continuous-integration-and-deployment`**).\n",
    "```\n",
    "\n",
    "The [Read the Docs](https://readthedocs.org) documentation will provide the most up-to-date steps required to host your documentation online. For our `pycounts` package, this involved the following steps:\n",
    "\n",
    "1. Visit <https://readthedocs.org/> and click on \"Sign up\".\n",
    "2. Select \"Sign up with GitHub\".\n",
    "3. Click \"Import a Project\".\n",
    "4. Click \"Import Manually\".\n",
    "5. Fill in the project details by:\n",
    "    - Providing your package name (e.g., `pycounts`).\n",
    "    - The GitHub repository URL (e.g., <https://github.com/TomasBeuzen/pycounts>).\n",
    "    - Specifying the default branch as `main`.\n",
    "6. Click \"Next\" and then \"Build version\".\n",
    "\n",
    "After following the steps above, your documentation should be successfully built by [Read the Docs](https://readthedocs.org/), and you should be able to access it via the \"View Docs\" button on the build page. For example, the documentation for `pycounts` is now available at <https://pycounts.readthedocs.io/en/latest/>. This documentation will be automatically re-built by Read the Docs each time you push changes to the specified default branch of your GitHub repository.\n",
    "\n",
    "```{attention}\n",
    "The *`.readthedocs.yml`* file that `py-pkgs-cookiecutter` created for us in the root directory of our Python package contains the configuration settings necessary for Read the Docs to properly build our documentation. It specifies what version of Python to use and tells Read the Docs that our documentation requires the extra packages specified in *`pycounts/docs/requirements.txt`* to be generated correctly.\n",
    "```"
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "Tags",
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.18"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": true,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  },
  "toc-autonumbering": false,
  "widgets": {
   "application/vnd.jupyter.widget-state+json": {
    "state": {
     "06e8b80b569b4ac2bb5a989af9695ced": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {
       "height": "350px"
      }
     },
     "07d43b717dd94d33a8eeae066f36d839": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "09294cf0fd6549c78d0f15acf20400b2": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "096724e20b094296bb243e553b2820e6": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatSliderModel",
      "state": {
       "description": "m",
       "layout": "IPY_MODEL_d2ef8aa5fad04047a98f733f89624812",
       "max": 2,
       "min": -2,
       "step": 0.1,
       "style": "IPY_MODEL_d3343e0c83844ad987beb592199dd6f6",
       "value": -0.1
      }
     },
     "0b412fd29e8a44f5bfaaa9a7122a33c3": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "VBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_1da474a760df45c3a290bbf3ba8a7f94",
        "IPY_MODEL_acc0b478d5b748c29c4683cbcfc8e0f3"
       ],
       "layout": "IPY_MODEL_9a4a74191d4b483f8e6ca535c155a33f"
      }
     },
     "107d8e3c4e4249429f4ea5f86f97caa7": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "SliderStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "1455d02e130148c4a24a0943765db04a": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "1574978c1a56499dbe842cb3bf5b9e8f": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "16770b98026442368338a8d27ffceab4": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "1989b160147948d4a6414de3b6c60694": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "1a1f847a77d44da7977d6ed1ae70ac12": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "VBoxModel",
      "state": {
       "_dom_classes": [
        "widget-interact"
       ],
       "children": [
        "IPY_MODEL_884172dbe7194ea7aba24ace80d35049",
        "IPY_MODEL_384a6bfb62454f0bb09a41d14a5eb9c9",
        "IPY_MODEL_8cc71f1ee02d4a10acbda0a6f9cbc4fb"
       ],
       "layout": "IPY_MODEL_da554c291c9f4442991fcf6d620e017e"
      }
     },
     "1cb1287d7a5940829cb770a5553a95b3": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {
       "height": "350px"
      }
     },
     "1da474a760df45c3a290bbf3ba8a7f94": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "IntSliderModel",
      "state": {
       "layout": "IPY_MODEL_323357ab97fc4ed0af4ab5743aa038cc",
       "style": "IPY_MODEL_64e2b864e41244388bcb173e865939f8"
      }
     },
     "1ecb0c5110084d99bd02c6845b36b5f5": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "1ff35f5f7c9543158cd8fcb2fe45e951": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "200d9095bbf14c67af4083eebe042331": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "VBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_ce130e9bb1874109b6e9641a6f6b872a",
        "IPY_MODEL_544ffe02934f47abbe60aa68b1552268"
       ],
       "layout": "IPY_MODEL_2949d658a5e24ae8af8b48f1c68ca710"
      }
     },
     "204835ba5cf741febeb96117f71f03db": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "IntSliderModel",
      "state": {
       "layout": "IPY_MODEL_e788ecb6fbad4de6aac05557dcf109f5",
       "style": "IPY_MODEL_871a273a718c4b7ab105f4bf6f9500e1"
      }
     },
     "20f7461031e44d41bd5b14f4cdd8542a": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "24102f82e9cf49aca85e512f59a1db81": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "262d0a636bf64c67a8b3b7fdb6852569": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "2844ba0a05594aeeb871eaf4fae2c4b9": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "28a33b60ad9947cebcab993a3ecd7b01": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "IntSliderModel",
      "state": {
       "layout": "IPY_MODEL_1989b160147948d4a6414de3b6c60694",
       "style": "IPY_MODEL_f24ec537d93846e48f35cf5bca83e11d",
       "value": 40
      }
     },
     "2949d658a5e24ae8af8b48f1c68ca710": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "2ad8e9ec7f1d4f5f89fadb89c51892cd": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatSliderModel",
      "state": {
       "description": "m",
       "layout": "IPY_MODEL_3679e8d246954e7295c526cec653232b",
       "max": 2,
       "min": -2,
       "step": 0.1,
       "style": "IPY_MODEL_455179b0a10a4d3793163b6270e8c1d4"
      }
     },
     "2be4850df84041778088cca110e64d11": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_3b84503a8368455bac727f95db5d01d0",
        "IPY_MODEL_5ed1935a5446410aa7103f97d2500695"
       ],
       "layout": "IPY_MODEL_5bc7f1fcf97f41fea3a8623cf73e21a3"
      }
     },
     "2ec147d796d24e06a192384ff4f271d8": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "IntSliderModel",
      "state": {
       "layout": "IPY_MODEL_1ecb0c5110084d99bd02c6845b36b5f5",
       "style": "IPY_MODEL_750974cf708b48bcac5c4b3e178f9e34"
      }
     },
     "323357ab97fc4ed0af4ab5743aa038cc": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "3679e8d246954e7295c526cec653232b": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "373d595c629d4c96ab6c69cabadfbae3": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "SliderStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "384a6bfb62454f0bb09a41d14a5eb9c9": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatSliderModel",
      "state": {
       "description": "b",
       "layout": "IPY_MODEL_79023cd4f95e412d86f33dacb04f9cce",
       "max": 3,
       "min": -3,
       "step": 0.5,
       "style": "IPY_MODEL_da243475d71a41f48bf4855c01052769"
      }
     },
     "3966b0590b414fe1873b43e1835dbc0b": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "VBoxModel",
      "state": {
       "_dom_classes": [
        "widget-interact"
       ],
       "children": [
        "IPY_MODEL_096724e20b094296bb243e553b2820e6",
        "IPY_MODEL_890cbfc7c0f343d2b7991c18b88b8177",
        "IPY_MODEL_fcc376497f9d4b8aa11a102ebc19b6ab"
       ],
       "layout": "IPY_MODEL_ae6272a2743a4752b8798fed0b5dc332"
      }
     },
     "39af2f7e78ff42679117a13c8e3e0c02": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "layout": "IPY_MODEL_43d437e0efff40b0b7c59c66b9b815f5",
       "outputs": [
        {
         "name": "stdout",
         "output_type": "stream",
         "text": "0 * 0 = 0\n"
        }
       ]
      }
     },
     "3ac4ddb748c447f9903d248db1422cf1": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_b8aa32ebeb924971ade818f6af335eec",
        "IPY_MODEL_e6a05e8e4f6a4cefb61f5f99b1eb13c2"
       ],
       "layout": "IPY_MODEL_e57657510026435496e5903d5c875cbe"
      }
     },
     "3b84503a8368455bac727f95db5d01d0": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "VBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_ce130e9bb1874109b6e9641a6f6b872a",
        "IPY_MODEL_544ffe02934f47abbe60aa68b1552268"
       ],
       "layout": "IPY_MODEL_20f7461031e44d41bd5b14f4cdd8542a"
      }
     },
     "3ccc38f44df249cd833536b7a8a34327": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "SliderStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "4007d719e1aa45349acb4e9f80f0e4ba": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "VBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_2ec147d796d24e06a192384ff4f271d8",
        "IPY_MODEL_f285911bbe39497a88f0994509363fbb"
       ],
       "layout": "IPY_MODEL_9ecdf012164d45aaa03c28b34bebf7fa"
      }
     },
     "42727846507043a098dc2e932813ee65": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "IntSliderModel",
      "state": {
       "layout": "IPY_MODEL_16770b98026442368338a8d27ffceab4",
       "style": "IPY_MODEL_b1e4ec6cae8d454999896d5ec41be03c"
      }
     },
     "43d437e0efff40b0b7c59c66b9b815f5": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "454c456031894c1498a69aaa4dcb0e97": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "455179b0a10a4d3793163b6270e8c1d4": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "SliderStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "479edca2ec334d01b8af52d21f4c1565": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "SliderStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "494640e15fe7442ebfa3b6786ef64d82": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "SliderStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "4af9e16a11ed4597bbd81a734add4f5c": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_535d254dd54d41ada990b62be72d5a14",
        "IPY_MODEL_e6a05e8e4f6a4cefb61f5f99b1eb13c2"
       ],
       "layout": "IPY_MODEL_7415264924174df19d8822f16c379f55"
      }
     },
     "4c8b0dc16ddc40af8b131803f5280311": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_edcfad1763d44bbab957f8d4f981f4e4",
        "IPY_MODEL_d11a21b0488f4970babc1c7ad3f86aa8"
       ],
       "layout": "IPY_MODEL_ef77db303b044fe783f80b51f045e866"
      }
     },
     "4d8487b20ef9419aab03dcc0c813fc77": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "VBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_cf422506005a43978b50beb43766a819",
        "IPY_MODEL_78efe79186ed46c78e9d91400f519f1d"
       ],
       "layout": "IPY_MODEL_ce3b1869747b4502b90f4448204f5d94"
      }
     },
     "4f613b87c7184b80bbc2806c184eb4cb": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "VBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_9053f57dacfc4255ad1dc0b717cbd4be",
        "IPY_MODEL_42727846507043a098dc2e932813ee65"
       ],
       "layout": "IPY_MODEL_8c5220ab1fe748d0abf46067668fd9d1"
      }
     },
     "50f2a1ea21a24ed9a0db566a4678e24e": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "IntSliderModel",
      "state": {
       "layout": "IPY_MODEL_933e89a135cd42e196abb362e0302570",
       "style": "IPY_MODEL_b4ed787903d4445cb7fd4c6827acf9cd"
      }
     },
     "527235c0249e4be68af5cc1b5f6ecaa8": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "SliderStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "535d254dd54d41ada990b62be72d5a14": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "VBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_50f2a1ea21a24ed9a0db566a4678e24e",
        "IPY_MODEL_bfe8c68e54b24762adb625e2d926bc2e"
       ],
       "layout": "IPY_MODEL_d9616e978f2840609e88757e2e7e47f3"
      }
     },
     "544ffe02934f47abbe60aa68b1552268": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "IntSliderModel",
      "state": {
       "layout": "IPY_MODEL_7acc7084e5c34c5a9b18b84c2a78660b",
       "style": "IPY_MODEL_d10b5afbdea647baa88b2156fda8c6c0"
      }
     },
     "54bac03c012745098c9455c5a2325e0a": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "layout": "IPY_MODEL_1cb1287d7a5940829cb770a5553a95b3",
       "outputs": [
        {
         "data": {
          "image/png": "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\n",
          "text/plain": "<Figure size 432x288 with 1 Axes>"
         },
         "metadata": {
          "needs_background": "light"
         },
         "output_type": "display_data"
        }
       ]
      }
     },
     "57c1af3db3d44cc7bfcfc97614bea646": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "IntSliderModel",
      "state": {
       "layout": "IPY_MODEL_9053341eacf94d139041e6aa7cc93233",
       "style": "IPY_MODEL_527235c0249e4be68af5cc1b5f6ecaa8",
       "value": 40
      }
     },
     "587b16eff8dc4011bcc72b4f4070b14d": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "58a162ea4105481e9d1345fdc79c9f1d": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "SliderStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "5ab9a789ce9a4e97845523051ef0762c": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "layout": "IPY_MODEL_965ef0e308be48eaa8b8ef19c63bed40",
       "outputs": [
        {
         "name": "stdout",
         "output_type": "stream",
         "text": "0 * 0 = 0\n"
        }
       ]
      }
     },
     "5bc7f1fcf97f41fea3a8623cf73e21a3": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "5d02d239659c496cbb1972806465cbba": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "5d68805b72bd49498579e5c204071464": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "VBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_1da474a760df45c3a290bbf3ba8a7f94",
        "IPY_MODEL_acc0b478d5b748c29c4683cbcfc8e0f3"
       ],
       "layout": "IPY_MODEL_72b02467571a402da6d4414c5e4489fa"
      }
     },
     "5e5877766afd49fcbb63cdbbff1f5684": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatSliderModel",
      "state": {
       "description": "b",
       "layout": "IPY_MODEL_1ff35f5f7c9543158cd8fcb2fe45e951",
       "max": 3,
       "min": -3,
       "step": 0.5,
       "style": "IPY_MODEL_7bc761c122284f8b9822ff186e0f78bd",
       "value": -1
      }
     },
     "5ed1935a5446410aa7103f97d2500695": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "layout": "IPY_MODEL_262d0a636bf64c67a8b3b7fdb6852569",
       "outputs": [
        {
         "name": "stdout",
         "output_type": "stream",
         "text": "0 * 0 = 0\n"
        }
       ]
      }
     },
     "645724dd1b174799b0ff40a9e6d6ab62": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_98b7be5be6ad4194bafdff2ffd9a89f0",
        "IPY_MODEL_e5aa35e4f4aa46cf8044c66339de4b96"
       ],
       "layout": "IPY_MODEL_454c456031894c1498a69aaa4dcb0e97"
      }
     },
     "64c7a0f8b8904b1ca743bc4911a341b2": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "SliderStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "64e2b864e41244388bcb173e865939f8": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "SliderStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "6991e87f25be44a78f759d7fd412588b": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "VBoxModel",
      "state": {
       "_dom_classes": [
        "widget-interact"
       ],
       "children": [
        "IPY_MODEL_2ad8e9ec7f1d4f5f89fadb89c51892cd",
        "IPY_MODEL_5e5877766afd49fcbb63cdbbff1f5684",
        "IPY_MODEL_81a51a474122457fa2f9da64776cf5d1"
       ],
       "layout": "IPY_MODEL_8a2b88d881b247d08b03cb1b7183128d"
      }
     },
     "6a03b9b6618c43bb80bcccfc6f7c19f9": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {
       "height": "350px"
      }
     },
     "6b15b70b85584ce18f7b6efe71563f96": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "SliderStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "6c890acf62af426cab22ed65ff429088": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "6ffdc8fcab164aedbf54cf3a45384d64": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "72b02467571a402da6d4414c5e4489fa": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "7415264924174df19d8822f16c379f55": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "750974cf708b48bcac5c4b3e178f9e34": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "SliderStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "78efe79186ed46c78e9d91400f519f1d": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "IntSliderModel",
      "state": {
       "layout": "IPY_MODEL_fdfc64c80c3c407bacf0a395dede228c",
       "style": "IPY_MODEL_8b9cd3fe33484cb794a9c2a4d60caa9a"
      }
     },
     "79023cd4f95e412d86f33dacb04f9cce": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "7a81ba3691dc47449c052dcd9070b618": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatSliderModel",
      "state": {
       "description": "m",
       "layout": "IPY_MODEL_ac55030546d54b0ca4d7e4fbf355a3c8",
       "max": 2,
       "min": -2,
       "step": 0.1,
       "style": "IPY_MODEL_6b15b70b85584ce18f7b6efe71563f96"
      }
     },
     "7acc7084e5c34c5a9b18b84c2a78660b": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "7b066d9aaaa34fcda5803a72047566f0": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "IntSliderModel",
      "state": {
       "layout": "IPY_MODEL_d6b85a8f0ec64ee491848be1b8bf8188",
       "style": "IPY_MODEL_3ccc38f44df249cd833536b7a8a34327",
       "value": 40
      }
     },
     "7bc761c122284f8b9822ff186e0f78bd": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "SliderStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "7c23e7df356f475e994f2f3e70730747": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "7d29dde0dd4046fb9717131bf06b637f": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatSliderModel",
      "state": {
       "description": "b",
       "layout": "IPY_MODEL_b674d805670c4a969daa587ae7d22805",
       "max": 3,
       "min": -3,
       "step": 0.5,
       "style": "IPY_MODEL_494640e15fe7442ebfa3b6786ef64d82",
       "value": -1
      }
     },
     "81a51a474122457fa2f9da64776cf5d1": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "layout": "IPY_MODEL_94487d6608754721aa3f4401e77dc292",
       "outputs": [
        {
         "data": {
          "image/png": "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\n",
          "text/plain": "<Figure size 432x288 with 1 Axes>"
         },
         "metadata": {
          "needs_background": "light"
         },
         "output_type": "display_data"
        }
       ]
      }
     },
     "856e6ab0a1b14ac490277652b9beabf6": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_0b412fd29e8a44f5bfaaa9a7122a33c3",
        "IPY_MODEL_5ab9a789ce9a4e97845523051ef0762c"
       ],
       "layout": "IPY_MODEL_f55ac2b80afd433a919cc2d7ab87b098"
      }
     },
     "871a273a718c4b7ab105f4bf6f9500e1": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "SliderStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "884172dbe7194ea7aba24ace80d35049": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatSliderModel",
      "state": {
       "description": "m",
       "layout": "IPY_MODEL_d2e7ead2f8d74c5180cbabbb30b674a8",
       "max": 2,
       "min": -2,
       "step": 0.1,
       "style": "IPY_MODEL_373d595c629d4c96ab6c69cabadfbae3"
      }
     },
     "890cbfc7c0f343d2b7991c18b88b8177": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatSliderModel",
      "state": {
       "description": "b",
       "layout": "IPY_MODEL_24102f82e9cf49aca85e512f59a1db81",
       "max": 3,
       "min": -3,
       "step": 0.5,
       "style": "IPY_MODEL_64c7a0f8b8904b1ca743bc4911a341b2",
       "value": -0.5
      }
     },
     "8a2b88d881b247d08b03cb1b7183128d": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "8b9cd3fe33484cb794a9c2a4d60caa9a": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "SliderStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "8c5220ab1fe748d0abf46067668fd9d1": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "8cc71f1ee02d4a10acbda0a6f9cbc4fb": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "layout": "IPY_MODEL_6a03b9b6618c43bb80bcccfc6f7c19f9",
       "outputs": [
        {
         "data": {
          "image/png": "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\n",
          "text/plain": "<Figure size 432x288 with 1 Axes>"
         },
         "metadata": {
          "needs_background": "light"
         },
         "output_type": "display_data"
        }
       ]
      }
     },
     "8dda8bf6c916451e91b96e56fc4d2a76": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "SliderStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "9053341eacf94d139041e6aa7cc93233": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "9053f57dacfc4255ad1dc0b717cbd4be": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "IntSliderModel",
      "state": {
       "layout": "IPY_MODEL_ef44415ff8dd456681965184a2a299e8",
       "style": "IPY_MODEL_cc29a198d1d44797a909ea9a68a5d484"
      }
     },
     "907bd0f286754766afa0d6ba1612d301": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_4d8487b20ef9419aab03dcc0c813fc77",
        "IPY_MODEL_d11a21b0488f4970babc1c7ad3f86aa8"
       ],
       "layout": "IPY_MODEL_1574978c1a56499dbe842cb3bf5b9e8f"
      }
     },
     "90a70b5f560f437f9bb9422a4a6f6592": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "933e89a135cd42e196abb362e0302570": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "935fac04b32e4e0b9e1f9ea118a04ee1": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "IntSliderModel",
      "state": {
       "layout": "IPY_MODEL_b9e169b8efac4eeb990ae37db1e8de12",
       "max": 200,
       "style": "IPY_MODEL_9927296f85f248858bdc0a0abcc67e94",
       "value": 100
      }
     },
     "94487d6608754721aa3f4401e77dc292": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {
       "height": "350px"
      }
     },
     "965ef0e308be48eaa8b8ef19c63bed40": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "97c973da7b714095959a2a66d7d28c65": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "98b7be5be6ad4194bafdff2ffd9a89f0": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "VBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_b12e150681c94126b68be84b0d7cf158",
        "IPY_MODEL_204835ba5cf741febeb96117f71f03db"
       ],
       "layout": "IPY_MODEL_7c23e7df356f475e994f2f3e70730747"
      }
     },
     "9927296f85f248858bdc0a0abcc67e94": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "SliderStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "9a4a74191d4b483f8e6ca535c155a33f": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "9c4a507b139f440fabaa95140d4b2193": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "9ecdf012164d45aaa03c28b34bebf7fa": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "a5e552b00bc54d1991d64d1e61258563": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "VBoxModel",
      "state": {
       "_dom_classes": [
        "widget-interact"
       ],
       "children": [
        "IPY_MODEL_7a81ba3691dc47449c052dcd9070b618",
        "IPY_MODEL_7d29dde0dd4046fb9717131bf06b637f",
        "IPY_MODEL_54bac03c012745098c9455c5a2325e0a"
       ],
       "layout": "IPY_MODEL_2844ba0a05594aeeb871eaf4fae2c4b9"
      }
     },
     "ac55030546d54b0ca4d7e4fbf355a3c8": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "acc0b478d5b748c29c4683cbcfc8e0f3": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "IntSliderModel",
      "state": {
       "layout": "IPY_MODEL_c69f7b00b5a54f60908cb3d92021daf6",
       "style": "IPY_MODEL_479edca2ec334d01b8af52d21f4c1565"
      }
     },
     "ae6272a2743a4752b8798fed0b5dc332": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "b070d7bd6a794d2ba0242e4220af368f": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "b12e150681c94126b68be84b0d7cf158": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "IntSliderModel",
      "state": {
       "layout": "IPY_MODEL_1455d02e130148c4a24a0943765db04a",
       "style": "IPY_MODEL_c2bcf8f8ff7b4623a8311427461ec26b"
      }
     },
     "b1e4ec6cae8d454999896d5ec41be03c": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "SliderStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "b4ed787903d4445cb7fd4c6827acf9cd": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "SliderStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "b65b837d3b614513bef7014f6e97b8be": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "layout": "IPY_MODEL_d9226ab50b4a4df9bdd6574f239a76a5",
       "outputs": [
        {
         "name": "stdout",
         "output_type": "stream",
         "text": "0 * 0 = 0\n"
        }
       ]
      }
     },
     "b674d805670c4a969daa587ae7d22805": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "b8aa32ebeb924971ade818f6af335eec": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "VBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_50f2a1ea21a24ed9a0db566a4678e24e",
        "IPY_MODEL_bfe8c68e54b24762adb625e2d926bc2e"
       ],
       "layout": "IPY_MODEL_587b16eff8dc4011bcc72b4f4070b14d"
      }
     },
     "b9e169b8efac4eeb990ae37db1e8de12": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "bba860475dc34aa295f004356f4c7e70": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_4f613b87c7184b80bbc2806c184eb4cb",
        "IPY_MODEL_b65b837d3b614513bef7014f6e97b8be"
       ],
       "layout": "IPY_MODEL_f128f679eeb840f88c63d5fb65e08abe"
      }
     },
     "be52a81fc3e44efc8f0d70d81da55763": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_4007d719e1aa45349acb4e9f80f0e4ba",
        "IPY_MODEL_39af2f7e78ff42679117a13c8e3e0c02"
       ],
       "layout": "IPY_MODEL_90a70b5f560f437f9bb9422a4a6f6592"
      }
     },
     "bf592509273c491c9496cc5bce017755": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_200d9095bbf14c67af4083eebe042331",
        "IPY_MODEL_5ed1935a5446410aa7103f97d2500695"
       ],
       "layout": "IPY_MODEL_b070d7bd6a794d2ba0242e4220af368f"
      }
     },
     "bfe8c68e54b24762adb625e2d926bc2e": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "IntSliderModel",
      "state": {
       "layout": "IPY_MODEL_09294cf0fd6549c78d0f15acf20400b2",
       "style": "IPY_MODEL_d5700c1140ff4a598008ed28c45f7d25"
      }
     },
     "c2bcf8f8ff7b4623a8311427461ec26b": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "SliderStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "c2cc4c190c324cc0a0ce9bf781a499eb": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "c69f7b00b5a54f60908cb3d92021daf6": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "cc29a198d1d44797a909ea9a68a5d484": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "SliderStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "cd9593419907498e8a80fa9fb7850749": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "SliderStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "ce130e9bb1874109b6e9641a6f6b872a": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "IntSliderModel",
      "state": {
       "layout": "IPY_MODEL_c2cc4c190c324cc0a0ce9bf781a499eb",
       "style": "IPY_MODEL_cd9593419907498e8a80fa9fb7850749"
      }
     },
     "ce3b1869747b4502b90f4448204f5d94": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "cf422506005a43978b50beb43766a819": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "IntSliderModel",
      "state": {
       "layout": "IPY_MODEL_9c4a507b139f440fabaa95140d4b2193",
       "style": "IPY_MODEL_107d8e3c4e4249429f4ea5f86f97caa7"
      }
     },
     "d10b5afbdea647baa88b2156fda8c6c0": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "SliderStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "d11a21b0488f4970babc1c7ad3f86aa8": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "layout": "IPY_MODEL_97c973da7b714095959a2a66d7d28c65",
       "outputs": [
        {
         "name": "stdout",
         "output_type": "stream",
         "text": "0 * 0 = 0\n"
        }
       ]
      }
     },
     "d2a772f4a9db458db7a47d77c13dd3d5": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "IntSliderModel",
      "state": {
       "layout": "IPY_MODEL_6ffdc8fcab164aedbf54cf3a45384d64",
       "style": "IPY_MODEL_e0dea1c96cc34a53938b3f0c52e09fe1",
       "value": 40
      }
     },
     "d2e7ead2f8d74c5180cbabbb30b674a8": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "d2ef8aa5fad04047a98f733f89624812": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "d3343e0c83844ad987beb592199dd6f6": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "SliderStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "d5700c1140ff4a598008ed28c45f7d25": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "SliderStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "d67190fd827a4b1a8ca8079df64d0a0a": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "d6b85a8f0ec64ee491848be1b8bf8188": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "d9226ab50b4a4df9bdd6574f239a76a5": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "d9616e978f2840609e88757e2e7e47f3": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "da243475d71a41f48bf4855c01052769": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "SliderStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "da554c291c9f4442991fcf6d620e017e": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "e0dea1c96cc34a53938b3f0c52e09fe1": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "SliderStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "e57657510026435496e5903d5c875cbe": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "e5aa35e4f4aa46cf8044c66339de4b96": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "layout": "IPY_MODEL_fc608307f2064139ade48955ecbaf7e9",
       "outputs": [
        {
         "name": "stdout",
         "output_type": "stream",
         "text": "0 * 0 = 0\n"
        }
       ]
      }
     },
     "e6a05e8e4f6a4cefb61f5f99b1eb13c2": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "layout": "IPY_MODEL_d67190fd827a4b1a8ca8079df64d0a0a",
       "outputs": [
        {
         "name": "stdout",
         "output_type": "stream",
         "text": "0 * 0 = 0\n"
        }
       ]
      }
     },
     "e788ecb6fbad4de6aac05557dcf109f5": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "ea2be2adfc72403eb1236220a37dfd36": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_5d68805b72bd49498579e5c204071464",
        "IPY_MODEL_5ab9a789ce9a4e97845523051ef0762c"
       ],
       "layout": "IPY_MODEL_6c890acf62af426cab22ed65ff429088"
      }
     },
     "ec1db3073c594dac8b081d2ad5e072e1": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "IntSliderModel",
      "state": {
       "layout": "IPY_MODEL_5d02d239659c496cbb1972806465cbba",
       "style": "IPY_MODEL_58a162ea4105481e9d1345fdc79c9f1d",
       "value": 40
      }
     },
     "edcfad1763d44bbab957f8d4f981f4e4": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "VBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_cf422506005a43978b50beb43766a819",
        "IPY_MODEL_78efe79186ed46c78e9d91400f519f1d"
       ],
       "layout": "IPY_MODEL_fd89962cc1214dd7afd0ee8f6c352b76"
      }
     },
     "ef44415ff8dd456681965184a2a299e8": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "ef77db303b044fe783f80b51f045e866": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "f128f679eeb840f88c63d5fb65e08abe": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "f24ec537d93846e48f35cf5bca83e11d": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "SliderStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "f285911bbe39497a88f0994509363fbb": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "IntSliderModel",
      "state": {
       "layout": "IPY_MODEL_07d43b717dd94d33a8eeae066f36d839",
       "style": "IPY_MODEL_8dda8bf6c916451e91b96e56fc4d2a76"
      }
     },
     "f55ac2b80afd433a919cc2d7ab87b098": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "fc608307f2064139ade48955ecbaf7e9": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "fcc376497f9d4b8aa11a102ebc19b6ab": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "layout": "IPY_MODEL_06e8b80b569b4ac2bb5a989af9695ced",
       "outputs": [
        {
         "data": {
          "image/png": "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\n",
          "text/plain": "<Figure size 432x288 with 1 Axes>"
         },
         "metadata": {
          "needs_background": "light"
         },
         "output_type": "display_data"
        }
       ]
      }
     },
     "fd89962cc1214dd7afd0ee8f6c352b76": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "fdfc64c80c3c407bacf0a395dede228c": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     }
    },
    "version_major": 2,
    "version_minor": 0
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}