summaryrefslogtreecommitdiff
path: root/doc
diff options
context:
space:
mode:
Diffstat (limited to 'doc')
-rw-r--r--doc/DISTUTILS.rst.txt62
-rw-r--r--doc/HOWTO_RELEASE.rst.txt30
-rw-r--r--doc/RELEASE_WALKTHROUGH.rst.txt173
-rw-r--r--doc/TESTS.rst.txt27
-rw-r--r--doc/changelog/1.19.0-changelog.rst592
-rw-r--r--doc/changelog/1.19.1-changelog.rst53
-rw-r--r--doc/changelog/1.19.2-changelog.rst30
-rw-r--r--doc/changelog/1.19.3-changelog.rst31
-rw-r--r--doc/changelog/1.19.4-changelog.rst16
-rw-r--r--doc/neps/_static/casting_flow.svg2212
-rw-r--r--doc/neps/_static/dtype_hierarchy.svg935
-rw-r--r--doc/neps/_static/nep-0041-type-sketch-no-fonts.svg1110
-rw-r--r--doc/neps/_static/nep-0041-type-sketch.svg523
-rw-r--r--doc/neps/_static/nep43-sketch-with-text.svg1304
-rw-r--r--doc/neps/_static/nep43-sketch.svg3009
-rw-r--r--doc/neps/conf.py78
-rw-r--r--doc/neps/content.rst25
-rw-r--r--doc/neps/nep-0000.rst8
-rw-r--r--doc/neps/nep-0002-warnfix.rst10
-rw-r--r--doc/neps/nep-0010-new-iterator-ufunc.rst48
-rw-r--r--doc/neps/nep-0011-deferred-ufunc-evaluation.rst8
-rw-r--r--doc/neps/nep-0012-missing-data.rst56
-rw-r--r--doc/neps/nep-0013-ufunc-overrides.rst2
-rw-r--r--doc/neps/nep-0016-benchmark.py2
-rw-r--r--doc/neps/nep-0025-missing-data-3.rst4
-rw-r--r--doc/neps/nep-0029-deprecation_policy.rst28
-rw-r--r--doc/neps/nep-0035-array-creation-dispatch-with-array-function.rst395
-rw-r--r--doc/neps/nep-0036-fair-play.rst177
-rw-r--r--doc/neps/nep-0040-legacy-datatype-impl.rst30
-rw-r--r--doc/neps/nep-0041-improved-dtype-support.rst152
-rw-r--r--doc/neps/nep-0042-new-dtypes.rst1417
-rw-r--r--doc/neps/nep-0043-extensible-ufuncs.rst1309
-rw-r--r--doc/neps/nep-0045-c_style_guide.rst13
-rw-r--r--doc/neps/roadmap.rst101
-rw-r--r--doc/release/upcoming_changes/13516.performance.rst47
-rw-r--r--doc/release/upcoming_changes/14882.deprecation.rst30
-rw-r--r--doc/release/upcoming_changes/15121.new_function.rst6
-rw-r--r--doc/release/upcoming_changes/15852.new_feature.rst24
-rw-r--r--doc/release/upcoming_changes/16056.deprecation.rst13
-rw-r--r--doc/release/upcoming_changes/16134.compatibility.rst8
-rw-r--r--doc/release/upcoming_changes/16134.improvement.rst6
-rw-r--r--doc/release/upcoming_changes/16200.compatibility.rst76
-rw-r--r--doc/release/upcoming_changes/16232.deprecation.rst6
-rw-r--r--doc/release/upcoming_changes/16350.compatibility.rst8
-rw-r--r--doc/release/upcoming_changes/16476.new_feature.rst9
-rw-r--r--doc/release/upcoming_changes/16515.new_feature.rst8
-rw-r--r--doc/release/upcoming_changes/16519.improvement.rst4
-rw-r--r--doc/release/upcoming_changes/16554.compatibility.rst10
-rw-r--r--doc/release/upcoming_changes/16554.deprecation.rst8
-rw-r--r--doc/release/upcoming_changes/16554.expired.rst5
-rw-r--r--doc/release/upcoming_changes/16558.new_feature.rst9
-rw-r--r--doc/release/upcoming_changes/16570.compatibility.rst4
-rw-r--r--doc/release/upcoming_changes/16589.compatibility.rst8
-rw-r--r--doc/release/upcoming_changes/16592.compatibility.rst13
-rw-r--r--doc/release/upcoming_changes/16594.new_feature.rst4
-rw-r--r--doc/release/upcoming_changes/16650.compatibility.rst16
-rw-r--r--doc/release/upcoming_changes/16675.improvement.rst4
-rw-r--r--doc/release/upcoming_changes/16710.improvement.rst3
-rw-r--r--doc/release/upcoming_changes/16730.improvement.rst9
-rw-r--r--doc/release/upcoming_changes/16815.compatibility.rst8
-rw-r--r--doc/release/upcoming_changes/16841.change.rst19
-rw-r--r--doc/release/upcoming_changes/16986.improvement.rst7
-rw-r--r--doc/release/upcoming_changes/17010.compatibility.rst24
-rw-r--r--doc/release/upcoming_changes/17029.compatibility.rst14
-rw-r--r--doc/release/upcoming_changes/17067.expired.rst8
-rw-r--r--doc/release/upcoming_changes/17068.compatibility.rst4
-rw-r--r--doc/release/upcoming_changes/17116.expired.rst2
-rw-r--r--doc/release/upcoming_changes/17123.new_feature.rst12
-rw-r--r--doc/release/upcoming_changes/17195.improvement.rst5
-rw-r--r--doc/release/upcoming_changes/17219.new_feature.rst12
-rw-r--r--doc/release/upcoming_changes/17233.deprecation.rst4
-rw-r--r--doc/release/upcoming_changes/17241.compatibility.rst6
-rw-r--r--doc/release/upcoming_changes/17284.new_feature.rst6
-rw-r--r--doc/release/upcoming_changes/17344.new_feature.rst3
-rw-r--r--doc/release/upcoming_changes/17394.new_function.rst6
-rw-r--r--doc/release/upcoming_changes/17456.new_feature.rst5
-rw-r--r--doc/release/upcoming_changes/17535.new_function.rst15
-rw-r--r--doc/release/upcoming_changes/17577.compatibility.rst6
-rw-r--r--doc/release/upcoming_changes/17580.compatibility.rst4
-rw-r--r--doc/release/upcoming_changes/17596.future.rst30
-rw-r--r--doc/release/upcoming_changes/17706.compatibility.rst10
-rw-r--r--doc/release/upcoming_changes/README.rst8
m---------doc/scipy-sphinx-theme0
-rw-r--r--doc/source/_static/numpy.css40
-rw-r--r--doc/source/_static/numpy_logo.pngbin6103 -> 0 bytes
-rw-r--r--doc/source/_static/numpylogo.svg23
-rw-r--r--doc/source/_templates/autosummary/attribute.rst5
-rw-r--r--doc/source/_templates/autosummary/base.rst5
-rw-r--r--doc/source/_templates/autosummary/member.rst6
-rw-r--r--doc/source/_templates/autosummary/method.rst5
-rw-r--r--doc/source/_templates/defindex.html35
-rw-r--r--doc/source/_templates/indexcontent.html40
-rw-r--r--doc/source/_templates/layout.html30
-rw-r--r--doc/source/about.rst62
-rw-r--r--doc/source/conf.py159
-rw-r--r--doc/source/contents.rst25
-rw-r--r--doc/source/dev/conduct/code_of_conduct.rst163
-rw-r--r--doc/source/dev/conduct/report_handling_manual.rst220
-rw-r--r--doc/source/dev/development_environment.rst2
-rw-r--r--doc/source/dev/development_workflow.rst37
-rw-r--r--doc/source/dev/gitwash/development_setup.rst231
-rw-r--r--doc/source/dev/gitwash/forked_page.pngbin0 -> 3345 bytes
-rwxr-xr-x[-rw-r--r--]doc/source/dev/gitwash/forking_button.pngbin13092 -> 8066 bytes
-rw-r--r--doc/source/dev/gitwash/forking_message.pngbin0 -> 14880 bytes
-rw-r--r--doc/source/dev/gitwash/git_links.inc4
-rw-r--r--doc/source/dev/governance/governance.rst3
-rw-r--r--doc/source/dev/governance/people.rst23
-rw-r--r--doc/source/dev/howto-docs.rst265
-rw-r--r--doc/source/dev/index.rst39
-rw-r--r--doc/source/dev/reviewer_guidelines.rst119
-rw-r--r--doc/source/dev/style_guide.rst8
-rw-r--r--doc/source/doc_conventions.rst23
-rw-r--r--doc/source/docs/howto_document.rst63
-rw-r--r--doc/source/f2py/allocarr_session.dat9
-rw-r--r--doc/source/f2py/common_session.dat6
-rw-r--r--doc/source/f2py/distutils.rst2
-rw-r--r--doc/source/f2py/moddata_session.dat14
-rw-r--r--doc/source/f2py/python-usage.rst2
-rw-r--r--doc/source/glossary.rst518
-rw-r--r--doc/source/license.rst35
-rw-r--r--doc/source/reference/arrays.classes.rst10
-rw-r--r--doc/source/reference/arrays.datetime.rst2
-rw-r--r--doc/source/reference/arrays.dtypes.rst55
-rw-r--r--doc/source/reference/arrays.indexing.rst21
-rw-r--r--doc/source/reference/arrays.interface.rst113
-rw-r--r--doc/source/reference/arrays.ndarray.rst20
-rw-r--r--doc/source/reference/arrays.nditer.cython.rst2
-rw-r--r--doc/source/reference/arrays.nditer.rst8
-rw-r--r--doc/source/reference/arrays.scalars.rst374
-rw-r--r--doc/source/reference/c-api/array.rst412
-rw-r--r--doc/source/reference/c-api/config.rst79
-rw-r--r--doc/source/reference/c-api/coremath.rst46
-rw-r--r--doc/source/reference/c-api/deprecations.rst4
-rw-r--r--doc/source/reference/c-api/dtype.rst45
-rw-r--r--doc/source/reference/c-api/iterator.rst60
-rw-r--r--doc/source/reference/c-api/types-and-structures.rst562
-rw-r--r--doc/source/reference/c-api/ufunc.rst169
-rw-r--r--doc/source/reference/distutils.rst1
-rw-r--r--doc/source/reference/figures/opt-infra.odgbin0 -> 13809 bytes
-rw-r--r--doc/source/reference/figures/opt-infra.pngbin0 -> 54081 bytes
-rw-r--r--doc/source/reference/global_state.rst19
-rw-r--r--doc/source/reference/index.rst2
-rw-r--r--doc/source/reference/internals.code-explanations.rst7
-rw-r--r--doc/source/reference/internals.rst158
-rw-r--r--doc/source/reference/maskedarray.baseclass.rst4
-rw-r--r--doc/source/reference/maskedarray.generic.rst18
-rw-r--r--doc/source/reference/random/c-api.rst23
-rw-r--r--doc/source/reference/random/generator.rst94
-rw-r--r--doc/source/reference/random/index.rst76
-rw-r--r--doc/source/reference/random/legacy.rst2
-rw-r--r--doc/source/reference/random/new-or-different.rst4
-rw-r--r--doc/source/reference/routines.array-manipulation.rst1
-rw-r--r--doc/source/reference/routines.char.rst2
-rw-r--r--doc/source/reference/routines.ctypeslib.rst1
-rw-r--r--doc/source/reference/routines.financial.rst21
-rw-r--r--doc/source/reference/routines.indexing.rst1
-rw-r--r--doc/source/reference/routines.io.rst4
-rw-r--r--doc/source/reference/routines.ma.rst5
-rw-r--r--doc/source/reference/routines.other.rst1
-rw-r--r--doc/source/reference/routines.rst1
-rw-r--r--doc/source/reference/routines.set.rst5
-rw-r--r--doc/source/reference/simd/simd-optimizations-tables-diff.inc37
-rw-r--r--doc/source/reference/simd/simd-optimizations-tables.inc103
-rw-r--r--doc/source/reference/simd/simd-optimizations.py190
-rw-r--r--doc/source/reference/simd/simd-optimizations.rst527
-rw-r--r--doc/source/reference/typing.rst2
-rw-r--r--doc/source/reference/ufuncs.rst24
-rw-r--r--doc/source/release.rst4
-rw-r--r--doc/source/release/1.16.0-notes.rst4
-rw-r--r--doc/source/release/1.17.0-notes.rst7
-rw-r--r--doc/source/release/1.19.0-notes.rst358
-rw-r--r--doc/source/release/1.19.1-notes.rst68
-rw-r--r--doc/source/release/1.19.2-notes.rst57
-rw-r--r--doc/source/release/1.19.3-notes.rst46
-rw-r--r--doc/source/release/1.19.4-notes.rst30
-rw-r--r--doc/source/release/1.5.0-notes.rst4
-rw-r--r--doc/source/user/absolute_beginners.rst21
-rw-r--r--doc/source/user/basics.broadcasting.rst176
-rw-r--r--doc/source/user/basics.byteswapping.rst150
-rw-r--r--doc/source/user/basics.creation.rst139
-rw-r--r--doc/source/user/basics.dispatch.rst266
-rw-r--r--doc/source/user/basics.indexing.rst452
-rw-r--r--doc/source/user/basics.io.genfromtxt.rst26
-rw-r--r--doc/source/user/basics.rec.rst646
-rw-r--r--doc/source/user/basics.subclassing.rst749
-rw-r--r--doc/source/user/basics.types.rst337
-rw-r--r--doc/source/user/building.rst37
-rw-r--r--doc/source/user/c-info.beyond-basics.rst2
-rw-r--r--doc/source/user/c-info.how-to-extend.rst10
-rw-r--r--doc/source/user/how-to-how-to.rst118
-rw-r--r--doc/source/user/how-to-io.rst328
-rw-r--r--doc/source/user/howtos_index.rst3
-rw-r--r--doc/source/user/index.rst31
-rw-r--r--doc/source/user/install.rst17
-rw-r--r--doc/source/user/ionumpy.rst20
-rw-r--r--doc/source/user/misc.rst222
-rw-r--r--doc/source/user/numpy-for-matlab-users.rst765
-rw-r--r--doc/source/user/quickstart.rst28
-rw-r--r--doc/source/user/setting-up.rst10
-rw-r--r--doc/source/user/troubleshooting-importerror.rst10
-rw-r--r--doc/source/user/tutorial-ma.rst386
-rw-r--r--doc/source/user/tutorial-svd.rst33
-rw-r--r--doc/source/user/tutorials_index.rst7
-rw-r--r--doc/source/user/whatisnumpy.rst2
-rw-r--r--doc/source/user/who_covid_19_sit_rep_time_series.csv115
m---------doc/sphinxext0
206 files changed, 22747 insertions, 2999 deletions
diff --git a/doc/DISTUTILS.rst.txt b/doc/DISTUTILS.rst.txt
index 15073f754..c58a423c0 100644
--- a/doc/DISTUTILS.rst.txt
+++ b/doc/DISTUTILS.rst.txt
@@ -385,46 +385,46 @@ that should be repeated using a variable expansion similar to the
named repeat rules of the Fortran-specific repeats.
NumPy Distutils preprocesses C source files (extension: :file:`.c.src`) written
-in a custom templating language to generate C code. The :c:data:`@` symbol is
+in a custom templating language to generate C code. The ``@`` symbol is
used to wrap macro-style variables to empower a string substitution mechanism
that might describe (for instance) a set of data types.
-The template language blocks are delimited by :c:data:`/**begin repeat`
-and :c:data:`/**end repeat**/` lines, which may also be nested using
-consecutively numbered delimiting lines such as :c:data:`/**begin repeat1`
-and :c:data:`/**end repeat1**/`:
+The template language blocks are delimited by ``/**begin repeat``
+and ``/**end repeat**/`` lines, which may also be nested using
+consecutively numbered delimiting lines such as ``/**begin repeat1``
+and ``/**end repeat1**/``:
-1. "/\**begin repeat "on a line by itself marks the beginning of
-a segment that should be repeated.
+1. ``/**begin repeat`` on a line by itself marks the beginning of
+ a segment that should be repeated.
2. Named variable expansions are defined using ``#name=item1, item2, item3,
-..., itemN#`` and placed on successive lines. These variables are
-replaced in each repeat block with corresponding word. All named
-variables in the same repeat block must define the same number of
-words.
+ ..., itemN#`` and placed on successive lines. These variables are
+ replaced in each repeat block with corresponding word. All named
+ variables in the same repeat block must define the same number of
+ words.
3. In specifying the repeat rule for a named variable, ``item*N`` is short-
-hand for ``item, item, ..., item`` repeated N times. In addition,
-parenthesis in combination with \*N can be used for grouping several
-items that should be repeated. Thus, #name=(item1, item2)*4# is
-equivalent to #name=item1, item2, item1, item2, item1, item2, item1,
-item2#
+ hand for ``item, item, ..., item`` repeated N times. In addition,
+ parenthesis in combination with ``*N`` can be used for grouping several
+ items that should be repeated. Thus, ``#name=(item1, item2)*4#`` is
+ equivalent to ``#name=item1, item2, item1, item2, item1, item2, item1,
+ item2#``.
-4. "\*/ "on a line by itself marks the end of the variable expansion
-naming. The next line is the first line that will be repeated using
-the named rules.
+4. ``*/`` on a line by itself marks the end of the variable expansion
+ naming. The next line is the first line that will be repeated using
+ the named rules.
5. Inside the block to be repeated, the variables that should be expanded
-are specified as ``@name@``
+ are specified as ``@name@``.
-6. "/\**end repeat**/ "on a line by itself marks the previous line
-as the last line of the block to be repeated.
+6. ``/**end repeat**/`` on a line by itself marks the previous line
+ as the last line of the block to be repeated.
7. A loop in the NumPy C source code may have a ``@TYPE@`` variable, targeted
-for string substitution, which is preprocessed to a number of otherwise
-identical loops with several strings such as INT, LONG, UINT, ULONG. The
-``@TYPE@`` style syntax thus reduces code duplication and maintenance burden by
-mimicking languages that have generic type support.
+ for string substitution, which is preprocessed to a number of otherwise
+ identical loops with several strings such as ``INT``, ``LONG``, ``UINT``,
+ ``ULONG``. The ``@TYPE@`` style syntax thus reduces code duplication and
+ maintenance burden by mimicking languages that have generic type support.
The above rules may be clearer in the following template source example:
@@ -464,13 +464,13 @@ The above rules may be clearer in the following template source example:
/**end repeat**/
-The preprocessing of generically typed C source files (whether in NumPy
+The preprocessing of generically-typed C source files (whether in NumPy
proper or in any third party package using NumPy Distutils) is performed
by `conv_template.py`_.
-The type specific C files generated (extension: .c)
+The type-specific C files generated (extension: ``.c``)
by these modules during the build process are ready to be compiled. This
form of generic typing is also supported for C header files (preprocessed
-to produce .h files).
+to produce ``.h`` files).
.. _conv_template.py: https://github.com/numpy/numpy/blob/master/numpy/distutils/conv_template.py
@@ -587,10 +587,6 @@ The header of a typical SciPy ``__init__.py`` is::
test = Tester().test
bench = Tester().bench
-Note that NumPy submodules still use a file named ``info.py`` in which the
-module docstring and ``__all__`` dict are defined. These files will be removed
-at some point.
-
Extra features in NumPy Distutils
'''''''''''''''''''''''''''''''''
diff --git a/doc/HOWTO_RELEASE.rst.txt b/doc/HOWTO_RELEASE.rst.txt
index 6af8d9ca6..5a9c4d505 100644
--- a/doc/HOWTO_RELEASE.rst.txt
+++ b/doc/HOWTO_RELEASE.rst.txt
@@ -19,18 +19,11 @@ Source tree
NumPy Docs
----------
- https://github.com/numpy/numpy/blob/master/doc/HOWTO_RELEASE.rst.txt
-- http://projects.scipy.org/numpy/wiki/MicrosoftToolchainSupport (dead link)
SciPy.org wiki
--------------
- https://www.scipy.org/Installing_SciPy and links on that page.
-- http://new.scipy.org/building/windows.html (dead link)
-
-
-Doc wiki
---------
-- http://docs.scipy.org/numpy/docs/numpy-docs/user/install.rst/ (dead link)
Release Scripts
@@ -40,16 +33,17 @@ Release Scripts
Supported platforms and versions
================================
-`NEP 29`_ outlines which Python versions are supported; For the first half of
-2020, this will be Python >= 3.6. We test NumPy against all these versions
-every time we merge code to master. Binary installers may be available for a
-subset of these versions (see below).
+:ref:`NEP 29 <NEP29>` outlines which Python versions
+are supported; For the first half of 2020, this will be Python >= 3.6. We test
+NumPy against all these versions every time we merge code to master. Binary
+installers may be available for a subset of these versions (see below).
OS X
----
-OS X versions >= 10.9 are supported, for Python version support see `NEP 29`_.
-We build binary wheels for OSX that are compatible with Python.org Python,
-system Python, homebrew and macports - see this `OSX wheel building summary
+OS X versions >= 10.9 are supported, for Python version support see
+:ref:`NEP 29 <NEP29>`. We build binary wheels for
+OSX that are compatible with Python.org Python, system Python, homebrew and
+macports - see this `OSX wheel building summary
<https://github.com/MacPython/wiki/wiki/Spinning-wheels>`_ for details.
@@ -95,7 +89,6 @@ You will need Cython for building the binaries. Cython compiles the ``.pyx``
files in the NumPy distribution to ``.c`` files.
.. _mingw-w64 toolchain : https://mingwpy.github.io
-.. _NEP 29 : https://numpy.org/neps/nep-0029-deprecation_policy.html
OpenBLAS
------------
@@ -397,8 +390,11 @@ create an archive of the documentation in the numpy/doc repo::
# This checks out github.com/numpy/doc and adds (``git add``) the
# documentation to the checked out repo.
make merge-doc
- # Now edit the ``index.html`` file in the repo to reflect the new content,
- # and commit the changes
+ # Now edit the ``index.html`` file in the repo to reflect the new content.
+ # If the documentation is for a non-patch release (e.g. 1.19 -> 1.20),
+ # make sure to update the ``stable`` symlink to point to the new directory.
+ ln -sfn <latest_stable_directory> stable
+ # Commit the changes
git -C build/merge commit -am "Add documentation for <version>"
# Push to numpy/doc repo
git -C build/merge push
diff --git a/doc/RELEASE_WALKTHROUGH.rst.txt b/doc/RELEASE_WALKTHROUGH.rst.txt
index 0ff9ff933..733f681af 100644
--- a/doc/RELEASE_WALKTHROUGH.rst.txt
+++ b/doc/RELEASE_WALKTHROUGH.rst.txt
@@ -1,41 +1,37 @@
-This file contains a walkthrough of the NumPy 1.14.5 release on Linux, modified
+This file contains a walkthrough of the NumPy 1.19.0 release on Linux, modified
for building on azure and uploading to anaconda.org
The commands can be copied into the command line, but be sure to
-replace 1.14.5 by the correct version.
+replace 1.19.0 by the correct version.
This should be read together with the general directions in `releasing`.
-Release Walkthrough
-====================
-
-Note that in the code snippets below, ``upstream`` refers to the root repository on
-github and ``origin`` to a fork in your personal account. You may need to make adjustments
-if you have not forked the repository but simply cloned it locally. You can
-also edit ``.git/config`` and add ``upstream`` if it isn't already present.
-
+Release Preparation
+===================
Backport Pull Requests
----------------------
Changes that have been marked for this release must be backported to the
-maintenance/1.14.x branch.
+maintenance/1.19.x branch.
Update Release documentation
----------------------------
-The file ``doc/changelog/1.14.5-changelog.rst`` should be updated to reflect
+The file ``doc/changelog/1.19.0-changelog.rst`` should be updated to reflect
the final list of changes and contributors. This text can be generated by::
- $ python tools/changelog.py $GITHUB v1.14.4..maintenance/1.14.x > doc/changelog/1.14.5-changelog.rst
+ $ python tools/changelog.py $GITHUB v1.18.0..maintenance/1.19.x > doc/changelog/1.19.0-changelog.rst
where ``GITHUB`` contains your github access token. This text may also be
-appended to ``doc/release/1.14.5-notes.rst`` for release updates, though not
-for new releases like ``1.14.0``, as the changelogs for ``*.0`` releases tend to be
-excessively long. The ``doc/source/release.rst`` file should also be
-updated with a link to the new release notes. These changes should be committed
-to the maintenance branch, and later will be forward ported to master.
+appended to ``doc/release/1.19.0-notes.rst`` for patch release, though not for
+new releases like ``1.19.0``, as the changelogs for ``*.0`` releases tend to be
+excessively long. The ``doc/source/release.rst`` file should also be updated
+with a link to the new release notes. These changes should be committed to the
+maintenance branch, and later will be forward ported to master. The changelog
+should be reviewed for name duplicates or short names and the ``.mailmap`` file
+updated if needed.
Finish the Release Note
@@ -46,25 +42,33 @@ Finish the Release Note
This has changed now that we use ``towncrier``. See the instructions for
creating the release note in ``doc/release/upcoming_changes/README.rst``.
-Fill out the release note ``doc/release/1.14.5-notes.rst`` calling out
+Fill out the release note ``doc/release/1.19.0-notes.rst`` calling out
significant changes.
+Release Walkthrough
+====================
+
+Note that in the code snippets below, ``upstream`` refers to the root repository on
+github and ``origin`` to a fork in your personal account. You may need to make adjustments
+if you have not forked the repository but simply cloned it locally. You can
+also edit ``.git/config`` and add ``upstream`` if it isn't already present.
+
Prepare the release commit
--------------------------
Checkout the branch for the release, make sure it is up to date, and clean the
repository::
- $ git checkout maintenance/1.14.x
- $ git pull upstream maintenance/1.14.x
+ $ git checkout maintenance/1.19.x
+ $ git pull upstream maintenance/1.19.x
$ git submodule update
$ git clean -xdfq
Edit pavement.py and setup.py as detailed in HOWTO_RELEASE::
- $ gvim pavement.py setup.py
- $ git commit -a -m"REL: NumPy 1.14.5 release."
+ $ gvim pavement.py setup.py # Generally only setup.py needs updating
+ $ git commit -a -m"REL: NumPy 1.19.0 release."
Sanity check::
@@ -73,9 +77,7 @@ Sanity check::
Push this release directly onto the end of the maintenance branch. This
requires write permission to the numpy repository::
- $ git push upstream maintenance/1.14.x
-
-As an example, see the 1.14.3 REL commit: `<https://github.com/numpy/numpy/commit/73299826729be58cec179b52c656adfcaefada93>`_.
+ $ git push upstream HEAD
Build source releases
@@ -86,7 +88,7 @@ Paver is used to build the source releases. It will create the ``release`` and
source releases in the latter. ::
$ python3 -m cython --version # check for correct cython version
- $ paver sdist # sdist will do a git clean -xdf, so we omit that
+ $ paver sdist # sdist will do a git clean -xdfq, so we omit that
Build wheels
@@ -94,55 +96,46 @@ Build wheels
Trigger the wheels build by pointing the numpy-wheels repository at this
commit. This can take up to an hour. The numpy-wheels repository is cloned from
-`<https://github.com/MacPython/numpy-wheels>`_. Start with a pull as the repo
-may have been accessed and changed by someone else and a push will fail::
+`<https://github.com/MacPython/numpy-wheels>`_. If this is the first release in
+a series, start with a pull as the repo may have been accessed and changed by
+someone else, then create a new branch for the series. If the branch already
+exists skip this::
$ cd ../numpy-wheels
+ $ git co master
$ git pull upstream master
- $ git branch <new version> # only when starting new numpy version
- $ git checkout v1.14.x # v1.14.x already existed for the 1.14.4 release
+ $ git branch v1.19.x
-Edit the ``azure/posix.yml`` and ``azure/windows.yml`` files to make sure they
-have the correct version, and put in the commit hash for the ``REL`` commit
-created above for ``BUILD_COMMIT``, see an _example::
+Checkout the new branch and edit the ``azure-pipelines.yml`` and
+``.travis.yml`` files to make sure they have the correct version, and put in
+the commit hash for the ``REL`` commit created above for ``BUILD_COMMIT``. The
+``azure/posix.yml`` and ``.travis.yml`` files may also need the Cython versions
+updated to keep up with Python releases, but generally just do::
- $ gvim azure/posix.yml azure/windows.yml
- $ git commit -a
+ $ git checkout v1.19.x
+ $ gvim azure-pipelines .travis.yml
+ $ git commit -a -m"NumPy 1.19.0 release."
$ git push upstream HEAD
Now wait. If you get nervous at the amount of time taken -- the builds can take
a while -- you can check the build progress by following the links
-provided at `<https://github.com/MacPython/numpy-wheels>`_ to check the
+provided at `<https://github.com/MacPython/numpy-wheels>`_ to check the
build status. Check if all the needed wheels have been built and
-uploaded before proceeding. There should currently be 21 of them at
-`<https://anaconda.org/multibuild-wheels-staging/numpy/files>`_, 3 for Mac, 6
-for Windows, and 12 for Linux.
+uploaded to the staging repository before proceeding.
-.. example_: https://github.com/MacPython/numpy-wheels/pull/80/commits/cbf4af4
-
-Note that sometimes builds, like tests, fail for unrelated reasons and
-you will need to restart them.
+Note that sometimes builds, like tests, fail for unrelated reasons and you will
+need to rerun them. You will need to be logged in under 'numpy' to do this
+on azure.
Download wheels
---------------
-When the wheels have all been successfully built, download them using the ``wheel-uploader``
-in the ``terryfy`` repository. The terryfy repository may be cloned from
-`<https://github.com/MacPython/terryfy>`_ if you don't already have it. The
-wheels can also be uploaded using the ``wheel-uploader``, but we prefer to
-download all the wheels to the ``../numpy/release/installers`` directory and
-upload later using ``twine``::
+When the wheels have all been successfully built and staged, download them from the
+Anaconda staging directory using the ``tools/download-wheels.py`` script::
- $ cd ../terryfy
- $ git pull upstream master
- $ CDN_URL=https://anaconda.org/multibuild-wheels-staging/numpy/files
- $ NPY_WHLS=../numpy/release/installers
- $ ./wheel-uploader -u $CDN_URL -n -v -w $NPY_WHLS -t win numpy 1.14.5
- $ ./wheel-uploader -u $CDN_URL -n -v -w $NPY_WHLS -t manylinux1 numpy 1.14.5
- $ ./wheel-uploader -u $CDN_URL -n -v -w $NPY_WHLS -t macosx numpy 1.14.5
+ $ cd ../numpy
+ $ python3 tools/download-wheels.py 1.19.0
-If you do this often, consider making CDN_URL and NPY_WHLS part of your default
-environment.
Generate the README files
-------------------------
@@ -150,18 +143,16 @@ Generate the README files
This needs to be done after all installers are downloaded, but before the pavement
file is updated for continued development::
- $ cd ../numpy
$ paver write_release
Tag the release
---------------
-Once the wheels have been built and downloaded without errors, go back to your
-numpy repository in the maintenance branch and tag the ``REL`` commit, signing
+Once the wheels have been built and downloaded without errors tag the ``REL`` commit, signing
it with your gpg key::
- $ git tag -s v1.14.5
+ $ git tag -s -m"NumPy 1.19.0 release" v1.19.0
You should upload your public gpg key to github, so that the tag will appear
"verified" there.
@@ -169,7 +160,7 @@ You should upload your public gpg key to github, so that the tag will appear
Check that the files in ``release/installers`` have the correct versions, then
push the tag upstream::
- $ git push upstream v1.14.5
+ $ git push upstream v1.19.0
We wait until this point to push the tag because it is public and should not
be changed after it has been pushed.
@@ -185,9 +176,9 @@ Add another ``REL`` commit to the numpy maintenance branch, which resets the
Create release notes for next release and edit them to set the version::
- $ cp doc/source/release/template.rst doc/source/release/1.14.6-notes.rst
- $ gvim doc/source/release/1.14.6-notes.rst
- $ git add doc/source/release/1.14.6-notes.rst
+ $ cp doc/source/release/template.rst doc/source/release/1.19.1-notes.rst
+ $ gvim doc/source/release/1.19.1-notes.rst
+ $ git add doc/source/release/1.19.1-notes.rst
Add new release notes to the documentation release list::
@@ -195,26 +186,24 @@ Add new release notes to the documentation release list::
Commit the result::
- $ git commit -a -m"REL: prepare 1.14.x for further development"
- $ git push upstream maintenance/1.14.x
+ $ git commit -a -m"REL: prepare 1.19.x for further development"
+ $ git push upstream HEAD
Upload to PyPI
--------------
Upload to PyPI using ``twine``. A recent version of ``twine`` of is needed
-after recent PyPI changes, version ``1.11.0`` was used here.
-
-.. code-block:: sh
+after recent PyPI changes, version ``3.1.1`` was used here::
$ cd ../numpy
$ twine upload release/installers/*.whl
- $ twine upload release/installers/numpy-1.14.5.zip # Upload last.
+ $ twine upload release/installers/numpy-1.19.0.zip # Upload last.
-If one of the commands breaks in the middle, which is not uncommon, you may
-need to selectively upload the remaining files because PyPI does not allow the
-same file to be uploaded twice. The source file should be uploaded last to
-avoid synchronization problems if pip users access the files while this is in
+If one of the commands breaks in the middle, you may need to selectively upload
+the remaining files because PyPI does not allow the same file to be uploaded
+twice. The source file should be uploaded last to avoid synchronization
+problems that might occur if pip users access the files while this is in
process. Note that PyPI only allows a single source distribution, here we have
chosen the zip archive.
@@ -222,15 +211,16 @@ chosen the zip archive.
Upload files to github
----------------------
-Go to `<https://github.com/numpy/numpy/releases>`_, there should be a ``v1.14.5
+Go to `<https://github.com/numpy/numpy/releases>`_, there should be a ``v1.19.0
tag``, click on it and hit the edit button for that tag. There are two ways to
-add files, using an editable text window and as binary uploads.
+add files, using an editable text window and as binary uploads. Cut and paste
+the ``release/README.md`` file contents into the text window. You will probably
+need to make some edits to get it to look right. Then
-- Cut and paste the ``release/README.md`` file contents into the text window.
-- Upload ``release/installers/numpy-1.14.5.tar.gz`` as a binary file.
-- Upload ``release/installers/numpy-1.14.5.zip`` as a binary file.
+- Upload ``release/installers/numpy-1.19.0.tar.gz`` as a binary file.
+- Upload ``release/installers/numpy-1.19.0.zip`` as a binary file.
- Upload ``release/README.rst`` as a binary file.
-- Upload ``doc/changelog/1.14.5-changelog.rst`` as a binary file.
+- Upload ``doc/changelog/1.19.0-changelog.rst`` as a binary file.
- Check the pre-release button if this is a pre-releases.
- Hit the ``{Publish,Update} release`` button at the bottom.
@@ -255,7 +245,7 @@ If the release series is a new one, you will need to add a new section to the
Otherwise, only the ``zip`` and ``pdf`` links should be updated with the
new tag name::
- $ gvim doc/build/merge/index.html +/'tag v1.14'
+ $ gvim doc/build/merge/index.html +/'tag v1.19'
You can "test run" the new documentation in a browser to make sure the links
work::
@@ -265,7 +255,7 @@ work::
Once everything seems satisfactory, commit and upload the changes::
$ pushd doc/build/merge
- $ git commit -am"Add documentation for v1.14.5"
+ $ git commit -am"Add documentation for v1.19.0"
$ git push
$ popd
@@ -277,7 +267,7 @@ This assumes that you have forked `<https://github.com/scipy/scipy.org>`_::
$ cd ../scipy.org
$ git checkout master
$ git pull upstream master
- $ git checkout -b numpy-1.14.5
+ $ git checkout -b numpy-1.19.0
$ gvim www/index.rst # edit the News section
$ git commit -a
$ git push origin HEAD
@@ -300,13 +290,14 @@ Post-Release Tasks
Checkout master and forward port the documentation changes::
- $ git checkout -b update-after-1.14.5-release
- $ git checkout maintenance/1.14.x doc/source/release/1.14.5-notes.rst
- $ git checkout maintenance/1.14.x doc/changelog/1.14.5-changelog.rst
+ $ git checkout -b post-1.19.0-release-update
+ $ git checkout maintenance/1.19.x doc/source/release/1.19.0-notes.rst
+ $ git checkout maintenance/1.19.x doc/changelog/1.19.0-changelog.rst
+ $ git checkout maintenance/1.19.x .mailmap # only if updated for release.
$ gvim doc/source/release.rst # Add link to new notes
- $ git add doc/changelog/1.14.5-changelog.rst doc/source/release/1.14.5-notes.rst
+ $ git add doc/changelog/1.19.0-changelog.rst doc/source/release/1.19.0-notes.rst
$ git status # check status before commit
- $ git commit -a -m"REL: Update master after 1.14.5 release."
+ $ git commit -a -m"REL: Update master after 1.19.0 release."
$ git push origin HEAD
Go to github and make a PR.
diff --git a/doc/TESTS.rst.txt b/doc/TESTS.rst.txt
index 4ab39c586..d1af7017b 100644
--- a/doc/TESTS.rst.txt
+++ b/doc/TESTS.rst.txt
@@ -136,43 +136,24 @@ modules and develop tests for it.
Labeling tests
--------------
-As an alternative to ``pytest.mark.<label>``, there are a number of labels you
-can use.
-
Unlabeled tests like the ones above are run in the default
``numpy.test()`` run. If you want to label your test as slow - and
therefore reserved for a full ``numpy.test(label='full')`` run, you
-can label it with a decorator::
+can label it with ``pytest.mark.slow``::
- # numpy.testing module includes 'import decorators as dec'
- from numpy.testing import dec, assert_
+ import pytest
- @dec.slow
+ @pytest.mark.slow
def test_big(self):
print 'Big, slow test'
Similarly for methods::
class test_zzz:
- @dec.slow
+ @pytest.mark.slow
def test_simple(self):
assert_(zzz() == 'Hello from zzz')
-Available labels are:
-
-- ``slow``: marks a test as taking a long time
-- ``setastest(tf)``: work-around for test discovery when the test name is
- non conformant
-- ``skipif(condition, msg=None)``: skips the test when ``eval(condition)`` is
- ``True``
-- ``knownfailureif(fail_cond, msg=None)``: will avoid running the test if
- ``eval(fail_cond)`` is ``True``, useful for tests that conditionally segfault
-- ``deprecated(conditional=True)``: filters deprecation warnings emitted in the
- test
-- ``paramaterize(var, input)``: an alternative to
- `pytest.mark.paramaterized
- <https://docs.pytest.org/en/latest/parametrize.html>`_
-
Easier setup and teardown functions / methods
---------------------------------------------
diff --git a/doc/changelog/1.19.0-changelog.rst b/doc/changelog/1.19.0-changelog.rst
new file mode 100644
index 000000000..bd743832a
--- /dev/null
+++ b/doc/changelog/1.19.0-changelog.rst
@@ -0,0 +1,592 @@
+
+Contributors
+============
+
+A total of 126 people contributed to this release. People with a "+" by their
+names contributed a patch for the first time.
+
+* Alex Henrie
+* Alexandre de Siqueira +
+* Andras Deak
+* Andrea Sangalli +
+* Andreas Klöckner +
+* Andrei Shirobokov +
+* Anirudh Subramanian +
+* Anne Bonner
+* Anton Ritter-Gogerly +
+* Benjamin Trendelkamp-Schroer +
+* Bharat Raghunathan
+* Brandt Bucher +
+* Brian Wignall
+* Bui Duc Minh +
+* Changqing Li +
+* Charles Harris
+* Chris Barker
+* Chris Holland +
+* Christian Kastner +
+* Chunlin +
+* Chunlin Fang +
+* Damien Caliste +
+* Dan Allan
+* Daniel Hrisca
+* Daniel Povey +
+* Dustan Levenstein +
+* Emmanuelle Gouillart +
+* Eric Larson
+* Eric M. Bray
+* Eric Mariasis +
+* Eric Wieser
+* Erik Welch +
+* Fabio Zeiser +
+* Gabriel Gerlero +
+* Ganesh Kathiresan +
+* Gengxin Xie +
+* Guilherme Leobas
+* Guillaume Peillex +
+* Hameer Abbasi
+* Hao Jin +
+* Harshal Prakash Patankar +
+* Heshy Roskes +
+* Himanshu Garg +
+* Huon Wilson +
+* John Han +
+* John Kirkham
+* Jon Dufresne
+* Jon Morris +
+* Josh Wilson
+* Justus Magin
+* Kai Striega
+* Kerem Hallaç +
+* Kevin Sheppard
+* Kirill Zinovjev +
+* Marcin Podhajski +
+* Mark Harfouche
+* Marten van Kerkwijk
+* Martin Michlmayr +
+* Masashi Kishimoto +
+* Mathieu Lamarre
+* Matt Hancock +
+* MatteoRaso +
+* Matthew Harrigan
+* Matthias Bussonnier
+* Matti Picus
+* Max Balandat +
+* Maximilian Konrad +
+* Maxwell Aladago
+* Maxwell Bileschi +
+* Melissa Weber Mendonça +
+* Michael Felt
+* Michael Hirsch +
+* Mike Taves
+* Nico Schlömer
+* Pan Jan +
+* Paul Rougieux +
+* Pauli Virtanen
+* Peter Andreas Entschev
+* Petre-Flaviu Gostin +
+* Pierre de Buyl
+* Piotr Gaiński +
+* Przemyslaw Bartosik +
+* Raghuveer Devulapalli
+* Rakesh Vasudevan +
+* Ralf Gommers
+* RenaRuirui +
+* Robert Kern
+* Roman Yurchak
+* Ross Barnowski +
+* Ryan +
+* Ryan Soklaski
+* Sanjeev Kumar +
+* SanthoshBala18 +
+* Sayed Adel +
+* Sebastian Berg
+* Seth Troisi
+* Sha Liu +
+* Siba Smarak Panigrahi +
+* Simon Gasse +
+* Stephan Hoyer
+* Steve Dower +
+* Thomas A Caswell
+* Till Hoffmann +
+* Tim Hoffmann
+* Tina Oberoi +
+* Tirth Patel
+* Tyler Reddy
+* Warren Weckesser
+* Wojciech Rzadkowski +
+* Xavier Thomas +
+* Yilin LI +
+* Zac Hatfield-Dodds +
+* Zé Vinícius +
+* @Adam +
+* @Anthony +
+* @Jim +
+* @bartosz-grabowski +
+* @dojafrat +
+* @gamboon +
+* @jfbu +
+* @keremh +
+* @mayeut +
+* @ndunnewind +
+* @nglinh +
+* @shreepads +
+* @sslivkoff +
+
+
+Pull requests merged
+====================
+
+A total of 452 pull requests were merged for this release.
+
+* `#8255 <https://github.com/numpy/numpy/pull/8255>`__: ENH: add identity kwarg to frompyfunc
+* `#12646 <https://github.com/numpy/numpy/pull/12646>`__: TST: check exception details in refguide_check.py
+* `#13421 <https://github.com/numpy/numpy/pull/13421>`__: ENH: improve runtime detection of CPU features
+* `#14326 <https://github.com/numpy/numpy/pull/14326>`__: TST: Add assert_array_equal test for big integer arrays.
+* `#14376 <https://github.com/numpy/numpy/pull/14376>`__: MAINT: Remove unnecessary 'from __future__ import ...' statements
+* `#14530 <https://github.com/numpy/numpy/pull/14530>`__: MAINT: Fix typos and copy edit NEP-0030.
+* `#14546 <https://github.com/numpy/numpy/pull/14546>`__: DOC: NumPy for absolute beginners tutorial
+* `#14715 <https://github.com/numpy/numpy/pull/14715>`__: NEP: Proposal for array creation dispatching with `__array_function__`
+* `#14867 <https://github.com/numpy/numpy/pull/14867>`__: ENH: Use AVX-512F for np.maximum and np.minimum
+* `#14924 <https://github.com/numpy/numpy/pull/14924>`__: BUG: Fix numpy.random.dirichlet returns NaN for small 'alpha'...
+* `#14933 <https://github.com/numpy/numpy/pull/14933>`__: API: Use `ResultType` in `PyArray_ConvertToCommonType`
+* `#14942 <https://github.com/numpy/numpy/pull/14942>`__: MAINT,API: ignore and NULL fasttake/fastputmask ArrFuncs slots
+* `#14981 <https://github.com/numpy/numpy/pull/14981>`__: BUG: Make ``ediff1d`` kwarg casting consistent
+* `#14988 <https://github.com/numpy/numpy/pull/14988>`__: DOC: linalg: Include information about scipy.linalg.
+* `#14995 <https://github.com/numpy/numpy/pull/14995>`__: BUG: Use ``__array__`` during dimension discovery
+* `#15011 <https://github.com/numpy/numpy/pull/15011>`__: MAINT: cleanup compat.py3k.py
+* `#15022 <https://github.com/numpy/numpy/pull/15022>`__: ENH: f2py: improve error messages
+* `#15028 <https://github.com/numpy/numpy/pull/15028>`__: [DOC] LaTeX: fix preamble (closes #15026)
+* `#15035 <https://github.com/numpy/numpy/pull/15035>`__: BUG: add endfunction, endsubroutine to valid fortran end words
+* `#15040 <https://github.com/numpy/numpy/pull/15040>`__: TST: Add test for object method (and general unary) loops
+* `#15042 <https://github.com/numpy/numpy/pull/15042>`__: REL: Update master after 1.18.x branch.
+* `#15043 <https://github.com/numpy/numpy/pull/15043>`__: DOC: Update HOWTO_RELEASE.rst.txt
+* `#15046 <https://github.com/numpy/numpy/pull/15046>`__: API, DOC: change names to multivariate_hypergeometric, improve...
+* `#15050 <https://github.com/numpy/numpy/pull/15050>`__: DOC: Fix statement about norms
+* `#15052 <https://github.com/numpy/numpy/pull/15052>`__: MAINT: follow-up cleanup for blas64 PR
+* `#15054 <https://github.com/numpy/numpy/pull/15054>`__: DOC: add docstrings to refguide-check
+* `#15066 <https://github.com/numpy/numpy/pull/15066>`__: Revert "DEP: issue deprecation warning when creating ragged array...
+* `#15069 <https://github.com/numpy/numpy/pull/15069>`__: ENH: add support for ILP64 OpenBLAS (without symbol suffix)
+* `#15070 <https://github.com/numpy/numpy/pull/15070>`__: DOC: correct version for NaT sort
+* `#15072 <https://github.com/numpy/numpy/pull/15072>`__: TST: Check requires_memory immediately before the test
+* `#15073 <https://github.com/numpy/numpy/pull/15073>`__: MAINT: core: Fix a very long line in the ufunc docstrings.
+* `#15076 <https://github.com/numpy/numpy/pull/15076>`__: BUG: test, fix flexible dtype conversion on class with __array__
+* `#15082 <https://github.com/numpy/numpy/pull/15082>`__: TST: add value to pytest.ini for pytest6 compatibility
+* `#15085 <https://github.com/numpy/numpy/pull/15085>`__: MAINT: Ragged cleanup
+* `#15097 <https://github.com/numpy/numpy/pull/15097>`__: DOC: bring the out parameter docstring into line with ufuncs
+* `#15106 <https://github.com/numpy/numpy/pull/15106>`__: ENH: f2py: add --f2cmap option for specifying the name of .f2py_f2cmap
+* `#15107 <https://github.com/numpy/numpy/pull/15107>`__: TST: add BLAS ILP64 run in Travis & Azure
+* `#15110 <https://github.com/numpy/numpy/pull/15110>`__: MAINT: Fix expm1 instability for small complex numbers.
+* `#15115 <https://github.com/numpy/numpy/pull/15115>`__: MAINT: random: Remove a few unused imports from test files.
+* `#15116 <https://github.com/numpy/numpy/pull/15116>`__: MAINT: Bump pytest from 5.3.1 to 5.3.2
+* `#15118 <https://github.com/numpy/numpy/pull/15118>`__: API: remove undocumented use of __array__(dtype, context)
+* `#15120 <https://github.com/numpy/numpy/pull/15120>`__: MAINT,CI: fix signed-unsigned comparison warning
+* `#15124 <https://github.com/numpy/numpy/pull/15124>`__: DOC: Update documentation of np.clip
+* `#15125 <https://github.com/numpy/numpy/pull/15125>`__: DOC: Remove reference to basic RNG
+* `#15126 <https://github.com/numpy/numpy/pull/15126>`__: MAINT: Fix randint 0d limits and other 0d cleanups
+* `#15129 <https://github.com/numpy/numpy/pull/15129>`__: DOC: Fix typos, via a Levenshtein-style corrector
+* `#15133 <https://github.com/numpy/numpy/pull/15133>`__: MAINT: CI: Clean up .travis.yml
+* `#15136 <https://github.com/numpy/numpy/pull/15136>`__: DOC: Correct choice signature
+* `#15138 <https://github.com/numpy/numpy/pull/15138>`__: DOC: Correct documentation in choice
+* `#15143 <https://github.com/numpy/numpy/pull/15143>`__: TST: shippable build efficiency
+* `#15144 <https://github.com/numpy/numpy/pull/15144>`__: BUG: ensure reduction output matches input along non-reduction...
+* `#15149 <https://github.com/numpy/numpy/pull/15149>`__: REL: Update master after NumPy 1.18.0 release.
+* `#15150 <https://github.com/numpy/numpy/pull/15150>`__: MAINT: Update pavement.py for towncrier.
+* `#15153 <https://github.com/numpy/numpy/pull/15153>`__: DOC: update cholesky docstring regarding input checking
+* `#15154 <https://github.com/numpy/numpy/pull/15154>`__: DOC: update documentation on how to build NumPy
+* `#15156 <https://github.com/numpy/numpy/pull/15156>`__: DOC: add moved modules to 1.18 release note
+* `#15160 <https://github.com/numpy/numpy/pull/15160>`__: MAINT: Update required cython version to 0.29.14.
+* `#15164 <https://github.com/numpy/numpy/pull/15164>`__: BUG: searchsorted: passing the keys as a keyword argument
+* `#15170 <https://github.com/numpy/numpy/pull/15170>`__: BUG: use tmp dir and check version for cython test
+* `#15178 <https://github.com/numpy/numpy/pull/15178>`__: TST: improve assert message of assert_array_max_ulp
+* `#15187 <https://github.com/numpy/numpy/pull/15187>`__: MAINT: unskip test on win32
+* `#15189 <https://github.com/numpy/numpy/pull/15189>`__: ENH: Add property-based tests using Hypothesis
+* `#15194 <https://github.com/numpy/numpy/pull/15194>`__: BUG: test, fix for c++ compilation
+* `#15196 <https://github.com/numpy/numpy/pull/15196>`__: DOC: Adding instructions for building documentation to developer...
+* `#15197 <https://github.com/numpy/numpy/pull/15197>`__: DOC: NEP 37: A dispatch protocol for NumPy-like modules
+* `#15203 <https://github.com/numpy/numpy/pull/15203>`__: MAINT: Do not use private Python function in testing
+* `#15205 <https://github.com/numpy/numpy/pull/15205>`__: DOC: Improvements to Quickstart Tutorial.
+* `#15211 <https://github.com/numpy/numpy/pull/15211>`__: BUG: distutils: fix msvc+gfortran openblas handling corner case
+* `#15212 <https://github.com/numpy/numpy/pull/15212>`__: BUG: lib: Fix handling of integer arrays by gradient.
+* `#15215 <https://github.com/numpy/numpy/pull/15215>`__: MAINT: lib: A little bit of clean up for the new year.
+* `#15216 <https://github.com/numpy/numpy/pull/15216>`__: REL: Update master after NumPy 1.16.6 and 1.17.5 releases.
+* `#15217 <https://github.com/numpy/numpy/pull/15217>`__: DEP: records: Deprecate treating shape=0 as shape=None
+* `#15218 <https://github.com/numpy/numpy/pull/15218>`__: ENH: build fallback lapack_lite with 64-bit integers on 64-bit...
+* `#15224 <https://github.com/numpy/numpy/pull/15224>`__: MAINT: linalg: use symbol suffix in fallback lapack_lite
+* `#15227 <https://github.com/numpy/numpy/pull/15227>`__: DOC: typo in release.rst
+* `#15228 <https://github.com/numpy/numpy/pull/15228>`__: NEP: universal SIMD NEP 38
+* `#15229 <https://github.com/numpy/numpy/pull/15229>`__: MAINT: Remove unused int_asbuffer
+* `#15232 <https://github.com/numpy/numpy/pull/15232>`__: MAINT: Cleaning up PY_MAJOR_VERSION/PY_VERSION_HEX
+* `#15233 <https://github.com/numpy/numpy/pull/15233>`__: MAINT: Clean up more PY_VERSION_HEX
+* `#15236 <https://github.com/numpy/numpy/pull/15236>`__: MAINT: Remove implicit inheritance from object class
+* `#15238 <https://github.com/numpy/numpy/pull/15238>`__: MAINT: only add --std=c99 where needed
+* `#15239 <https://github.com/numpy/numpy/pull/15239>`__: MAINT: Remove Python2 newbuffer getbuffer
+* `#15240 <https://github.com/numpy/numpy/pull/15240>`__: MAINT: Py3K array_as_buffer and gentype_as_buffer
+* `#15241 <https://github.com/numpy/numpy/pull/15241>`__: MAINT: Remove references to non-existent sys.exc_clear()
+* `#15242 <https://github.com/numpy/numpy/pull/15242>`__: DOC: Update HOWTO_RELEASE.rst
+* `#15248 <https://github.com/numpy/numpy/pull/15248>`__: MAINT: cleanup use of sys.exc_info
+* `#15249 <https://github.com/numpy/numpy/pull/15249>`__: MAINT: Eliminate some calls to `eval`
+* `#15251 <https://github.com/numpy/numpy/pull/15251>`__: MAINT: Improve const-correctness of shapes and strides
+* `#15253 <https://github.com/numpy/numpy/pull/15253>`__: DOC: clarify the effect of None parameters passed to ndarray.view
+* `#15254 <https://github.com/numpy/numpy/pull/15254>`__: MAINT: Improve const-correctness of string arguments
+* `#15255 <https://github.com/numpy/numpy/pull/15255>`__: MAINT: Delete numpy.distutils.compat
+* `#15256 <https://github.com/numpy/numpy/pull/15256>`__: MAINT: Implement keyword-only arguments as syntax
+* `#15260 <https://github.com/numpy/numpy/pull/15260>`__: MAINT: Remove FIXME comments introduced in the previous commit
+* `#15261 <https://github.com/numpy/numpy/pull/15261>`__: MAINT: Work with unicode strings in `dtype('i8,i8')`
+* `#15262 <https://github.com/numpy/numpy/pull/15262>`__: BUG: Use PyDict_GetItemWithError() instead of PyDict_GetItem()
+* `#15263 <https://github.com/numpy/numpy/pull/15263>`__: MAINT: Remove python2 array_{get,set}slice
+* `#15264 <https://github.com/numpy/numpy/pull/15264>`__: DOC: Add some missing functions in the list of available ufuncs.
+* `#15265 <https://github.com/numpy/numpy/pull/15265>`__: MAINT: Tidy PyArray_DescrConverter
+* `#15266 <https://github.com/numpy/numpy/pull/15266>`__: MAINT: remove duplicated if statements between DescrConverters
+* `#15267 <https://github.com/numpy/numpy/pull/15267>`__: BUG: Fix PyArray_DescrAlignConverter2 on tuples
+* `#15268 <https://github.com/numpy/numpy/pull/15268>`__: MAINT: Remove Python2 ndarray.__unicode__
+* `#15272 <https://github.com/numpy/numpy/pull/15272>`__: MAINT: Remove Python 2 divide
+* `#15273 <https://github.com/numpy/numpy/pull/15273>`__: MAINT: minor formatting fixups for NEP-37
+* `#15274 <https://github.com/numpy/numpy/pull/15274>`__: MAINT: Post NumPy 1.18.1 update.
+* `#15275 <https://github.com/numpy/numpy/pull/15275>`__: MAINT: travis-ci: Update CI scripts.
+* `#15278 <https://github.com/numpy/numpy/pull/15278>`__: BENCH: Add benchmark for small array coercions
+* `#15279 <https://github.com/numpy/numpy/pull/15279>`__: BUILD: use standard build of OpenBLAS for aarch64, ppc64le, s390x
+* `#15280 <https://github.com/numpy/numpy/pull/15280>`__: BENCH: Add basic benchmarks for take and putmask
+* `#15281 <https://github.com/numpy/numpy/pull/15281>`__: MAINT: Cleanup most PY3K #ifdef guards
+* `#15282 <https://github.com/numpy/numpy/pull/15282>`__: DOC: BLD: add empty release notes for 1.19.0 to fix doc build...
+* `#15284 <https://github.com/numpy/numpy/pull/15284>`__: MAINT: Use a simpler return convention for internal functions
+* `#15285 <https://github.com/numpy/numpy/pull/15285>`__: MAINT: Simplify np.int_ inheritance
+* `#15286 <https://github.com/numpy/numpy/pull/15286>`__: DOC" Update np.full docstring.
+* `#15287 <https://github.com/numpy/numpy/pull/15287>`__: MAINT: Express PyArray_DescrAlignConverter in terms of _convert_from_any
+* `#15288 <https://github.com/numpy/numpy/pull/15288>`__: MAINT: Push down declarations in _convert_from_*
+* `#15289 <https://github.com/numpy/numpy/pull/15289>`__: MAINT: C code simplifications
+* `#15291 <https://github.com/numpy/numpy/pull/15291>`__: BUG: Add missing error handling to _convert_from_list
+* `#15295 <https://github.com/numpy/numpy/pull/15295>`__: DOC: Added tutorial about linear algebra on multidimensional...
+* `#15300 <https://github.com/numpy/numpy/pull/15300>`__: MAINT: Refactor dtype conversion functions to be more similar
+* `#15303 <https://github.com/numpy/numpy/pull/15303>`__: DOC: Updating f2py docs to python 3 and fixing some typos
+* `#15304 <https://github.com/numpy/numpy/pull/15304>`__: MAINT: Remove NPY_PY3K constant
+* `#15305 <https://github.com/numpy/numpy/pull/15305>`__: MAINT: Remove sys.version checks in tests
+* `#15307 <https://github.com/numpy/numpy/pull/15307>`__: MAINT: cleanup sys.version dependant code
+* `#15310 <https://github.com/numpy/numpy/pull/15310>`__: MAINT: Ensure `_convert_from_*` functions set errors
+* `#15312 <https://github.com/numpy/numpy/pull/15312>`__: MAINT: Avoid escaping unicode in error messages
+* `#15315 <https://github.com/numpy/numpy/pull/15315>`__: MAINT: Change file extension of ma README to rst.
+* `#15319 <https://github.com/numpy/numpy/pull/15319>`__: BUG: fix NameError in clip nan propagation tests
+* `#15323 <https://github.com/numpy/numpy/pull/15323>`__: NEP: document reimplementation of NEP 34
+* `#15324 <https://github.com/numpy/numpy/pull/15324>`__: MAINT: fix typos
+* `#15328 <https://github.com/numpy/numpy/pull/15328>`__: TST: move pypy CI to ubuntu 18.04
+* `#15329 <https://github.com/numpy/numpy/pull/15329>`__: TST: move _no_tracing to testing._private, remove testing.support
+* `#15333 <https://github.com/numpy/numpy/pull/15333>`__: BUG: Add some missing C error handling
+* `#15335 <https://github.com/numpy/numpy/pull/15335>`__: MAINT: Remove sys.version checks
+* `#15336 <https://github.com/numpy/numpy/pull/15336>`__: DEP: Deprecate `->f->fastclip` at registration time
+* `#15338 <https://github.com/numpy/numpy/pull/15338>`__: DOC: document site.cfg.example
+* `#15350 <https://github.com/numpy/numpy/pull/15350>`__: MAINT: Fix mistype in histogramdd docstring
+* `#15351 <https://github.com/numpy/numpy/pull/15351>`__: DOC, BLD: reword release note, upgrade sphinx version
+* `#15353 <https://github.com/numpy/numpy/pull/15353>`__: MAINT: Remove unnecessary calls to PyArray_DATA from binomial...
+* `#15354 <https://github.com/numpy/numpy/pull/15354>`__: MAINT: Bump pytest from 5.3.2 to 5.3.3
+* `#15358 <https://github.com/numpy/numpy/pull/15358>`__: MAINT: Remove six
+* `#15361 <https://github.com/numpy/numpy/pull/15361>`__: MAINT: Revise imports from collections.abc module
+* `#15362 <https://github.com/numpy/numpy/pull/15362>`__: MAINT: remove internal functions required to handle Python2/3...
+* `#15364 <https://github.com/numpy/numpy/pull/15364>`__: MAINT: Remove other uses of six module
+* `#15366 <https://github.com/numpy/numpy/pull/15366>`__: MAINT: resolve pyflake F403 'from module import *' used
+* `#15368 <https://github.com/numpy/numpy/pull/15368>`__: MAINT: Update tox for supported Python versions
+* `#15369 <https://github.com/numpy/numpy/pull/15369>`__: MAINT: simd: Avoid signed comparison warning
+* `#15370 <https://github.com/numpy/numpy/pull/15370>`__: DOC: Updating Chararry Buffer datatypes #15360
+* `#15374 <https://github.com/numpy/numpy/pull/15374>`__: TST: Simplify unicode test
+* `#15375 <https://github.com/numpy/numpy/pull/15375>`__: MAINT: Use `with open` when possible
+* `#15377 <https://github.com/numpy/numpy/pull/15377>`__: MAINT: Cleanup python2 references
+* `#15379 <https://github.com/numpy/numpy/pull/15379>`__: MAINT: Python2 Cleanups
+* `#15381 <https://github.com/numpy/numpy/pull/15381>`__: DEP: add PendingDeprecation to matlib.py funky namespace
+* `#15385 <https://github.com/numpy/numpy/pull/15385>`__: BUG, MAINT: Stop using the error-prone deprecated Py_UNICODE...
+* `#15386 <https://github.com/numpy/numpy/pull/15386>`__: MAINT: clean up some macros in scalarapi.c
+* `#15393 <https://github.com/numpy/numpy/pull/15393>`__: MAINT/BUG: Fixups to scalar base classes
+* `#15397 <https://github.com/numpy/numpy/pull/15397>`__: BUG: np.load does not handle empty array with an empty descr
+* `#15398 <https://github.com/numpy/numpy/pull/15398>`__: MAINT: Revise imports from urllib modules
+* `#15399 <https://github.com/numpy/numpy/pull/15399>`__: MAINT: Remove Python3 DeprecationWarning from pytest.ini
+* `#15400 <https://github.com/numpy/numpy/pull/15400>`__: MAINT: cleanup _pytesttester.py
+* `#15401 <https://github.com/numpy/numpy/pull/15401>`__: BUG: Flags should not contain spaces
+* `#15403 <https://github.com/numpy/numpy/pull/15403>`__: MAINT: Clean up, mostly unused imports.
+* `#15405 <https://github.com/numpy/numpy/pull/15405>`__: BUG/TEST: core: Fix an undefined name in a test.
+* `#15407 <https://github.com/numpy/numpy/pull/15407>`__: MAINT: Replace basestring with str.
+* `#15408 <https://github.com/numpy/numpy/pull/15408>`__: ENH: Use AVX-512F for complex number arithmetic, absolute, square...
+* `#15414 <https://github.com/numpy/numpy/pull/15414>`__: MAINT: Remove Python2 workarounds
+* `#15417 <https://github.com/numpy/numpy/pull/15417>`__: MAINT: Cleanup references to python2
+* `#15418 <https://github.com/numpy/numpy/pull/15418>`__: MAINT, DOC: Remove use of old Python __builtin__, now known as...
+* `#15421 <https://github.com/numpy/numpy/pull/15421>`__: ENH: Make use of ExitStack in npyio.py
+* `#15422 <https://github.com/numpy/numpy/pull/15422>`__: MAINT: Inline gentype_getreadbuf
+* `#15423 <https://github.com/numpy/numpy/pull/15423>`__: MAINT: Use f-strings for clarity.
+* `#15427 <https://github.com/numpy/numpy/pull/15427>`__: DEP: Schedule unused C-API functions for removal/disabling
+* `#15428 <https://github.com/numpy/numpy/pull/15428>`__: DOC: Improve ndarray.ctypes example
+* `#15429 <https://github.com/numpy/numpy/pull/15429>`__: DOC: distutils: Add a docstring to show_config().
+* `#15430 <https://github.com/numpy/numpy/pull/15430>`__: MAINT: Use contextmanager in _run_doctests
+* `#15434 <https://github.com/numpy/numpy/pull/15434>`__: MAINT: Updated polynomial to use fstrings
+* `#15435 <https://github.com/numpy/numpy/pull/15435>`__: DOC: Fix Incorrect document in Beginner Docs
+* `#15436 <https://github.com/numpy/numpy/pull/15436>`__: MAINT: Update core.py with fstrings (issue #15420)
+* `#15439 <https://github.com/numpy/numpy/pull/15439>`__: DOC: fix docstrings so `python tools/refguide-check --rst <file>...
+* `#15441 <https://github.com/numpy/numpy/pull/15441>`__: MAINT: Tidy macros in scalar_new
+* `#15444 <https://github.com/numpy/numpy/pull/15444>`__: MAINT: use 'yield from <expr>' for simple cases
+* `#15445 <https://github.com/numpy/numpy/pull/15445>`__: MAINT: Bump pytest from 5.3.3 to 5.3.4
+* `#15446 <https://github.com/numpy/numpy/pull/15446>`__: BUG: Reject nonsense arguments to scalar constructors
+* `#15449 <https://github.com/numpy/numpy/pull/15449>`__: DOC: Update refguide_check note on how to skip code
+* `#15451 <https://github.com/numpy/numpy/pull/15451>`__: MAINT: Simplify `np.object_.__new__`
+* `#15452 <https://github.com/numpy/numpy/pull/15452>`__: STY,MAINT: avoid 'multiple imports on one line'
+* `#15464 <https://github.com/numpy/numpy/pull/15464>`__: MAINT: Cleanup duplicate line in refguide_check
+* `#15465 <https://github.com/numpy/numpy/pull/15465>`__: MAINT: cleanup unused imports; avoid redefinition of imports
+* `#15468 <https://github.com/numpy/numpy/pull/15468>`__: BUG: Fix for SVD not always sorted with hermitian=True
+* `#15469 <https://github.com/numpy/numpy/pull/15469>`__: MAINT: Simplify scalar __new__ some more
+* `#15474 <https://github.com/numpy/numpy/pull/15474>`__: MAINT: Eliminate messy _WORK macro
+* `#15476 <https://github.com/numpy/numpy/pull/15476>`__: update result of rng.random(3) to current rng output
+* `#15480 <https://github.com/numpy/numpy/pull/15480>`__: DOC: Correct get_state doc
+* `#15482 <https://github.com/numpy/numpy/pull/15482>`__: MAINT: Use `.identifier = val` to fill type structs
+* `#15483 <https://github.com/numpy/numpy/pull/15483>`__: [DOC] Mention behaviour of np.squeeze with one element
+* `#15484 <https://github.com/numpy/numpy/pull/15484>`__: ENH: fixing generic error messages to be more specific in multiarray/descriptor.c
+* `#15487 <https://github.com/numpy/numpy/pull/15487>`__: BUG: Fixing result of np quantile edge case
+* `#15491 <https://github.com/numpy/numpy/pull/15491>`__: TST: mark the top 3 slowest tests to save ~10 seconds
+* `#15493 <https://github.com/numpy/numpy/pull/15493>`__: MAINT: Bump pytest from 5.3.4 to 5.3.5
+* `#15500 <https://github.com/numpy/numpy/pull/15500>`__: MAINT: Use True/False instead of 1/0 in np.dtype.__reduce__
+* `#15503 <https://github.com/numpy/numpy/pull/15503>`__: MAINT: Do not allow `copyswap` and friends to fail silently
+* `#15504 <https://github.com/numpy/numpy/pull/15504>`__: DOC: Remove duplicated code in true_divide docstring
+* `#15505 <https://github.com/numpy/numpy/pull/15505>`__: NEP 40: Informational NEP about current DTypes
+* `#15510 <https://github.com/numpy/numpy/pull/15510>`__: DOC: Update unique docstring example
+* `#15511 <https://github.com/numpy/numpy/pull/15511>`__: MAINT: Large overhead in some random functions
+* `#15516 <https://github.com/numpy/numpy/pull/15516>`__: TST: Fix missing output in refguide-check
+* `#15521 <https://github.com/numpy/numpy/pull/15521>`__: MAINT: Simplify arraydescr_richcompare
+* `#15522 <https://github.com/numpy/numpy/pull/15522>`__: MAINT: Fix internal misuses of `NPY_TITLE_KEY`
+* `#15524 <https://github.com/numpy/numpy/pull/15524>`__: DOC: Update instructions for building/archiving docs.
+* `#15526 <https://github.com/numpy/numpy/pull/15526>`__: BUG: Fix inline assembly that detects cpu features on x86(32bit)
+* `#15532 <https://github.com/numpy/numpy/pull/15532>`__: update doctests, small bugs and changes of repr
+* `#15534 <https://github.com/numpy/numpy/pull/15534>`__: DEP: Do not allow "abstract" dtype conversion/creation
+* `#15536 <https://github.com/numpy/numpy/pull/15536>`__: DOC: Minor copyediting on NEP 37.
+* `#15538 <https://github.com/numpy/numpy/pull/15538>`__: MAINT: Extract repeated code to a helper function
+* `#15543 <https://github.com/numpy/numpy/pull/15543>`__: NEP: edit and move NEP 38 to accepted status
+* `#15547 <https://github.com/numpy/numpy/pull/15547>`__: MAINT: Refresh Doxyfile and modernize numpyfilter.py
+* `#15549 <https://github.com/numpy/numpy/pull/15549>`__: TST: Accuracy test float32 sin/cos/exp/log for AVX platforms
+* `#15550 <https://github.com/numpy/numpy/pull/15550>`__: DOC: Improve the `numpy.linalg.eig` docstring.
+* `#15554 <https://github.com/numpy/numpy/pull/15554>`__: NEP 44 - Restructuring the NumPy Documentation
+* `#15556 <https://github.com/numpy/numpy/pull/15556>`__: TST: (Travis CI) Use full python3-dbg path for virtual env creation
+* `#15560 <https://github.com/numpy/numpy/pull/15560>`__: BUG, DOC: restore missing import
+* `#15566 <https://github.com/numpy/numpy/pull/15566>`__: DOC: Removing bad practices from quick start + some PEP8
+* `#15574 <https://github.com/numpy/numpy/pull/15574>`__: TST: Do not create symbolic link named gfortran.
+* `#15575 <https://github.com/numpy/numpy/pull/15575>`__: DOC: Document caveat in random.uniform
+* `#15579 <https://github.com/numpy/numpy/pull/15579>`__: DOC: numpy.clip is equivalent to minimum(..., maximum(...))
+* `#15582 <https://github.com/numpy/numpy/pull/15582>`__: MAINT: Bump cython from 0.29.14 to 0.29.15
+* `#15583 <https://github.com/numpy/numpy/pull/15583>`__: MAINT: Bump hypothesis from 5.3.0 to 5.5.4
+* `#15585 <https://github.com/numpy/numpy/pull/15585>`__: BLD: manylinux2010 docker reports machine=i686
+* `#15598 <https://github.com/numpy/numpy/pull/15598>`__: BUG: Ignore differences in NAN for computing ULP differences
+* `#15600 <https://github.com/numpy/numpy/pull/15600>`__: TST: use manylinux2010 docker instead of ubuntu
+* `#15610 <https://github.com/numpy/numpy/pull/15610>`__: TST: mask DeprecationWarning in xfailed test
+* `#15612 <https://github.com/numpy/numpy/pull/15612>`__: BUG: Fix bug in AVX-512F np.maximum and np.minimum
+* `#15615 <https://github.com/numpy/numpy/pull/15615>`__: BUG: Remove check requiring natural alignment of float/double...
+* `#15616 <https://github.com/numpy/numpy/pull/15616>`__: DOC: Add missing imports, definitions and dummy file
+* `#15619 <https://github.com/numpy/numpy/pull/15619>`__: DOC: Fix documentation for apply_along_axis
+* `#15624 <https://github.com/numpy/numpy/pull/15624>`__: DOC: fix printing, np., deprecation for refguide
+* `#15631 <https://github.com/numpy/numpy/pull/15631>`__: MAINT: Pull identical line out of conditional.
+* `#15633 <https://github.com/numpy/numpy/pull/15633>`__: DOC: remove broken link in f2py tutorial
+* `#15639 <https://github.com/numpy/numpy/pull/15639>`__: BLD: update openblas download to new location, use manylinux2010-base
+* `#15648 <https://github.com/numpy/numpy/pull/15648>`__: MAINT: AVX512 implementation with intrinsic for float64 input...
+* `#15653 <https://github.com/numpy/numpy/pull/15653>`__: BLD: update OpenBLAS to pre-0.3.9 version
+* `#15662 <https://github.com/numpy/numpy/pull/15662>`__: DOC: Refactor `np.polynomial` docs using `automodule`
+* `#15665 <https://github.com/numpy/numpy/pull/15665>`__: BUG: fix doctest exception messages
+* `#15672 <https://github.com/numpy/numpy/pull/15672>`__: MAINT: Added comment pointing FIXME to relevant PR.
+* `#15673 <https://github.com/numpy/numpy/pull/15673>`__: DOC: Make extension module wording more clear
+* `#15678 <https://github.com/numpy/numpy/pull/15678>`__: DOC: Improve np.finfo docs
+* `#15680 <https://github.com/numpy/numpy/pull/15680>`__: DOC: Improve Benchmark README with environment setup and more...
+* `#15682 <https://github.com/numpy/numpy/pull/15682>`__: MAINT: Bump hypothesis from 5.5.4 to 5.6.0
+* `#15683 <https://github.com/numpy/numpy/pull/15683>`__: NEP: move NEP 44 to accepted status
+* `#15694 <https://github.com/numpy/numpy/pull/15694>`__: DOC: Fix indexing docs to pass refguide
+* `#15695 <https://github.com/numpy/numpy/pull/15695>`__: MAINT: Test during import to detect bugs with Accelerate(MacOS)...
+* `#15696 <https://github.com/numpy/numpy/pull/15696>`__: MAINT: Add a fast path to var for complex input
+* `#15701 <https://github.com/numpy/numpy/pull/15701>`__: MAINT: Convert shebang from python to python3 (#15687)
+* `#15702 <https://github.com/numpy/numpy/pull/15702>`__: MAINT: replace optparse with argparse for 'doc' and 'tools' scripts
+* `#15703 <https://github.com/numpy/numpy/pull/15703>`__: DOC: Fix quickstart doc to pass refguide
+* `#15706 <https://github.com/numpy/numpy/pull/15706>`__: MAINT: Fixing typos in f2py comments and code.
+* `#15710 <https://github.com/numpy/numpy/pull/15710>`__: DOC: fix SVD tutorial to pass refguide
+* `#15714 <https://github.com/numpy/numpy/pull/15714>`__: MAINT: use list-based APIs to call subprocesses
+* `#15715 <https://github.com/numpy/numpy/pull/15715>`__: ENH: update numpy.linalg.multi_dot to accept an `out` argument
+* `#15716 <https://github.com/numpy/numpy/pull/15716>`__: TST: always use 'python -mpip' not 'pip'
+* `#15717 <https://github.com/numpy/numpy/pull/15717>`__: DOC: update datetime reference to pass refguide
+* `#15718 <https://github.com/numpy/numpy/pull/15718>`__: DOC: Fix coremath.rst to fix refguide_check
+* `#15720 <https://github.com/numpy/numpy/pull/15720>`__: DOC: fix remaining doc files for refguide_check
+* `#15723 <https://github.com/numpy/numpy/pull/15723>`__: BUG: fix logic error when nm fails on 32-bit
+* `#15724 <https://github.com/numpy/numpy/pull/15724>`__: TST: Remove nose from the test_requirements.txt file.
+* `#15733 <https://github.com/numpy/numpy/pull/15733>`__: DOC: Allow NEPs to link to python, numpy, scipy, and matplotlib...
+* `#15736 <https://github.com/numpy/numpy/pull/15736>`__: BUG: Guarantee array is in valid state after memory error occurs...
+* `#15738 <https://github.com/numpy/numpy/pull/15738>`__: MAINT: Remove non-native byte order from _var check.
+* `#15740 <https://github.com/numpy/numpy/pull/15740>`__: MAINT: Add better error handling in linalg.norm for vectors and...
+* `#15745 <https://github.com/numpy/numpy/pull/15745>`__: MAINT: doc: Remove doc/summarize.py
+* `#15747 <https://github.com/numpy/numpy/pull/15747>`__: BUG: lib: Handle axes with length 0 in np.unique.
+* `#15749 <https://github.com/numpy/numpy/pull/15749>`__: DOC: document inconsistency between the shape of data and mask...
+* `#15750 <https://github.com/numpy/numpy/pull/15750>`__: BUG, TST: fix f2py for PyPy, skip one test for PyPy
+* `#15752 <https://github.com/numpy/numpy/pull/15752>`__: MAINT: Fix swig tests issue #15743
+* `#15757 <https://github.com/numpy/numpy/pull/15757>`__: MAINT: CI: Add an explicit 'pr' section to azure-pipelines.yml
+* `#15762 <https://github.com/numpy/numpy/pull/15762>`__: MAINT: Bump pytest from 5.3.5 to 5.4.1
+* `#15766 <https://github.com/numpy/numpy/pull/15766>`__: BUG,MAINT: Remove incorrect special case in string to number...
+* `#15768 <https://github.com/numpy/numpy/pull/15768>`__: REL: Update master after 1.18.2 release.
+* `#15769 <https://github.com/numpy/numpy/pull/15769>`__: ENH: Allow toggling madvise hugepage and fix default
+* `#15771 <https://github.com/numpy/numpy/pull/15771>`__: DOC: Fix runtests example in developer docs
+* `#15773 <https://github.com/numpy/numpy/pull/15773>`__: DEP: Make issubdtype consistent for types and dtypes
+* `#15774 <https://github.com/numpy/numpy/pull/15774>`__: MAINT: remove useless `global` statements
+* `#15778 <https://github.com/numpy/numpy/pull/15778>`__: BLD: Add requirements.txt file for building docs
+* `#15781 <https://github.com/numpy/numpy/pull/15781>`__: BUG: don't add 'public' or 'private' if the other one exists
+* `#15784 <https://github.com/numpy/numpy/pull/15784>`__: ENH: Use TypeError in `np.array` for python consistency
+* `#15794 <https://github.com/numpy/numpy/pull/15794>`__: BUG: Add basic __format__ for masked element to fix incorrect...
+* `#15797 <https://github.com/numpy/numpy/pull/15797>`__: TST: Add unit test for out=None of np.einsum
+* `#15799 <https://github.com/numpy/numpy/pull/15799>`__: MAINT: Cleanups to np.insert and np.delete
+* `#15800 <https://github.com/numpy/numpy/pull/15800>`__: BUG: Add error-checking versions of strided casts.
+* `#15802 <https://github.com/numpy/numpy/pull/15802>`__: DEP: Make `np.insert` and `np.delete` on 0d arrays with an axis...
+* `#15803 <https://github.com/numpy/numpy/pull/15803>`__: DOC: correct possible list lengths for `extobj` in ufunc calls
+* `#15804 <https://github.com/numpy/numpy/pull/15804>`__: DEP: Make np.delete on out-of-bounds indices an error
+* `#15805 <https://github.com/numpy/numpy/pull/15805>`__: DEP: Forbid passing non-integral index arrays to `insert` and...
+* `#15806 <https://github.com/numpy/numpy/pull/15806>`__: TST: Parametrize sort test
+* `#15809 <https://github.com/numpy/numpy/pull/15809>`__: TST: switch PyPy job with CPython
+* `#15812 <https://github.com/numpy/numpy/pull/15812>`__: TST: Remove code that is not supposed to warn out of warning...
+* `#15815 <https://github.com/numpy/numpy/pull/15815>`__: DEP: Do not cast boolean indices to integers in np.delete
+* `#15816 <https://github.com/numpy/numpy/pull/15816>`__: MAINT: simplify code that assumes str/unicode and int/long are...
+* `#15830 <https://github.com/numpy/numpy/pull/15830>`__: MAINT: pathlib and hashlib are in stdlib in Python 3.5+
+* `#15832 <https://github.com/numpy/numpy/pull/15832>`__: ENH: improved error message `IndexError: too many indices for...
+* `#15836 <https://github.com/numpy/numpy/pull/15836>`__: BUG: Fix IndexError for illegal axis in np.mean
+* `#15839 <https://github.com/numpy/numpy/pull/15839>`__: DOC: Minor fix to _hist_bin_fd documentation
+* `#15840 <https://github.com/numpy/numpy/pull/15840>`__: BUG,DEP: Make `scalar.__round__()` behave like pythons round
+* `#15843 <https://github.com/numpy/numpy/pull/15843>`__: DOC: First steps towards docs restructuring (NEP 44)
+* `#15848 <https://github.com/numpy/numpy/pull/15848>`__: DOC, TST: enable refguide_check in circleci
+* `#15850 <https://github.com/numpy/numpy/pull/15850>`__: DOC: fix typo in C-API reference
+* `#15854 <https://github.com/numpy/numpy/pull/15854>`__: DOC: Fix docstring for _hist_bin_auto.
+* `#15866 <https://github.com/numpy/numpy/pull/15866>`__: MAINT: Bump cython from 0.29.15 to 0.29.16
+* `#15867 <https://github.com/numpy/numpy/pull/15867>`__: DEP: Deprecate ndarray.tostring()
+* `#15868 <https://github.com/numpy/numpy/pull/15868>`__: TST: use draft OpenBLAS build
+* `#15872 <https://github.com/numpy/numpy/pull/15872>`__: BUG: Fix eigh and cholesky methods of numpy.random.multivariate_normal
+* `#15876 <https://github.com/numpy/numpy/pull/15876>`__: BUG: Check that `pvals` is 1D in `_generator.multinomial`.
+* `#15877 <https://github.com/numpy/numpy/pull/15877>`__: DOC: Add missing signature from nditer docstring
+* `#15881 <https://github.com/numpy/numpy/pull/15881>`__: BUG: Fix empty_like to respect shape=()
+* `#15882 <https://github.com/numpy/numpy/pull/15882>`__: BUG: Do not ignore empty tuple of strides in ndarray.__new__
+* `#15883 <https://github.com/numpy/numpy/pull/15883>`__: MAINT: Remove duplicated code in iotools.py
+* `#15884 <https://github.com/numpy/numpy/pull/15884>`__: BUG: Setting a 0d array's strides to themselves should be legal
+* `#15885 <https://github.com/numpy/numpy/pull/15885>`__: BUG: Respect itershape=() in nditer
+* `#15887 <https://github.com/numpy/numpy/pull/15887>`__: MAINT: Clean-up 'next = __next__' used for Python 2 compatibility
+* `#15893 <https://github.com/numpy/numpy/pull/15893>`__: TST: Run test_large_zip in a child process
+* `#15894 <https://github.com/numpy/numpy/pull/15894>`__: DOC: Add missing doc of numpy.ma.apply_over_axes in API list.
+* `#15899 <https://github.com/numpy/numpy/pull/15899>`__: DOC: Improve record module documentation
+* `#15901 <https://github.com/numpy/numpy/pull/15901>`__: DOC: Fixed order of items and link to mailing list in dev docs...
+* `#15903 <https://github.com/numpy/numpy/pull/15903>`__: BLD: report clang version on macOS
+* `#15904 <https://github.com/numpy/numpy/pull/15904>`__: MAINT: records: Remove private `format_parser._descr` attribute
+* `#15914 <https://github.com/numpy/numpy/pull/15914>`__: BUG: random: Disallow p=0 in negative_binomial
+* `#15921 <https://github.com/numpy/numpy/pull/15921>`__: ENH: Use sysconfig instead of probing Makefile
+* `#15928 <https://github.com/numpy/numpy/pull/15928>`__: DOC: Update np.copy docstring to include ragged case
+* `#15931 <https://github.com/numpy/numpy/pull/15931>`__: DOC: Correct private function name to PyArray_AdaptFlexibleDType
+* `#15936 <https://github.com/numpy/numpy/pull/15936>`__: MAINT: Fix capitalization in error message in `mtrand.pyx`
+* `#15939 <https://github.com/numpy/numpy/pull/15939>`__: DOC: Update np.rollaxis docstring
+* `#15949 <https://github.com/numpy/numpy/pull/15949>`__: BUG: fix AttributeError on accessing object in nested MaskedArray.
+* `#15951 <https://github.com/numpy/numpy/pull/15951>`__: BUG: Alpha parameter must be 1D in `generator.dirichlet`
+* `#15953 <https://github.com/numpy/numpy/pull/15953>`__: NEP: minor maintenance, update filename and fix a cross-reference
+* `#15964 <https://github.com/numpy/numpy/pull/15964>`__: MAINT: Bump hypothesis from 5.8.0 to 5.8.3
+* `#15967 <https://github.com/numpy/numpy/pull/15967>`__: TST: Add slow_pypy support
+* `#15968 <https://github.com/numpy/numpy/pull/15968>`__: DOC: Added note to angle function docstring about angle(0) being...
+* `#15982 <https://github.com/numpy/numpy/pull/15982>`__: MAINT/BUG: Cleanup and minor fixes to conform_reduce_result
+* `#15985 <https://github.com/numpy/numpy/pull/15985>`__: BUG: Avoid duplication in stack trace of `linspace(a, b, num=1.5)`
+* `#15988 <https://github.com/numpy/numpy/pull/15988>`__: BUG: Fix inf and NaN-warnings in half float `nextafter`
+* `#15989 <https://github.com/numpy/numpy/pull/15989>`__: MAINT: Remove 0d check for PyArray_ISONESEGMENT
+* `#15990 <https://github.com/numpy/numpy/pull/15990>`__: DEV: Pass additional runtests.py args to ASV
+* `#15993 <https://github.com/numpy/numpy/pull/15993>`__: DOC: Fix method documentation of function sort in MaskedArray
+* `#16000 <https://github.com/numpy/numpy/pull/16000>`__: NEP: Improve Value Based Casting paragraph in NEP 40
+* `#16001 <https://github.com/numpy/numpy/pull/16001>`__: DOC: add note on flatten ordering in matlab page
+* `#16007 <https://github.com/numpy/numpy/pull/16007>`__: TST: Add tests for the conversion utilities
+* `#16008 <https://github.com/numpy/numpy/pull/16008>`__: BUG: Unify handling of string enum converters
+* `#16009 <https://github.com/numpy/numpy/pull/16009>`__: MAINT: Replace npyiter_order_converter with PyArray_OrderConverter
+* `#16010 <https://github.com/numpy/numpy/pull/16010>`__: BUG: Fix lexsort axis check
+* `#16011 <https://github.com/numpy/numpy/pull/16011>`__: DOC: Clarify single-segment arrays in np reference
+* `#16014 <https://github.com/numpy/numpy/pull/16014>`__: DOC: Change import error "howto" to link to new troubleshooting...
+* `#16015 <https://github.com/numpy/numpy/pull/16015>`__: DOC: update first section of NEP 37 (``__array_function__`` downsides)
+* `#16021 <https://github.com/numpy/numpy/pull/16021>`__: REL: Update master after 1.18.3 release.
+* `#16024 <https://github.com/numpy/numpy/pull/16024>`__: MAINT: Bump hypothesis from 5.8.3 to 5.10.1
+* `#16025 <https://github.com/numpy/numpy/pull/16025>`__: DOC: initialise random number generator before first use in quickstart
+* `#16032 <https://github.com/numpy/numpy/pull/16032>`__: ENH: Fix exception causes in build_clib.py
+* `#16038 <https://github.com/numpy/numpy/pull/16038>`__: MAINT,TST: Move _repr_latex tests to test_printing.
+* `#16041 <https://github.com/numpy/numpy/pull/16041>`__: BUG: missing 'f' prefix for fstring
+* `#16042 <https://github.com/numpy/numpy/pull/16042>`__: ENH: Fix exception causes in build_ext.py
+* `#16053 <https://github.com/numpy/numpy/pull/16053>`__: DOC: Small typo fixes to NEP 40.
+* `#16054 <https://github.com/numpy/numpy/pull/16054>`__: DOC, BLD: update release howto and walkthrough for ananconda.org...
+* `#16061 <https://github.com/numpy/numpy/pull/16061>`__: ENH: Chained exceptions in linalg.py and polyutils.py
+* `#16064 <https://github.com/numpy/numpy/pull/16064>`__: MAINT: Chain exceptions in several places.
+* `#16067 <https://github.com/numpy/numpy/pull/16067>`__: MAINT: Chain exceptions in memmap.py and core.py
+* `#16068 <https://github.com/numpy/numpy/pull/16068>`__: BUG: Fix string to bool cast regression
+* `#16069 <https://github.com/numpy/numpy/pull/16069>`__: DOC: Added page describing how to contribute to the docs team
+* `#16075 <https://github.com/numpy/numpy/pull/16075>`__: DOC: add a note on sampling 2-D arrays to random.choice docstring
+* `#16076 <https://github.com/numpy/numpy/pull/16076>`__: BUG: random: Generator.integers(2**32) always returned 0.
+* `#16077 <https://github.com/numpy/numpy/pull/16077>`__: BLD: fix path to libgfortran on macOS
+* `#16078 <https://github.com/numpy/numpy/pull/16078>`__: DOC: Add axis to random module "new or different" docs
+* `#16079 <https://github.com/numpy/numpy/pull/16079>`__: DOC,BLD: Limit timeit iterations in random docs.
+* `#16081 <https://github.com/numpy/numpy/pull/16081>`__: DOC: add note on type casting to numpy.left_shift().
+* `#16083 <https://github.com/numpy/numpy/pull/16083>`__: DOC: improve development debugging doc
+* `#16084 <https://github.com/numpy/numpy/pull/16084>`__: DOC: tweak neps/scope.rst
+* `#16085 <https://github.com/numpy/numpy/pull/16085>`__: MAINT: Bump cython from 0.29.16 to 0.29.17
+* `#16086 <https://github.com/numpy/numpy/pull/16086>`__: MAINT: Bump hypothesis from 5.10.1 to 5.10.4
+* `#16094 <https://github.com/numpy/numpy/pull/16094>`__: TST: use latest released PyPy instead of nightly builds
+* `#16097 <https://github.com/numpy/numpy/pull/16097>`__: MAINT, DOC: Improve grammar on a comment in the quickstart
+* `#16100 <https://github.com/numpy/numpy/pull/16100>`__: NEP 41: Accept NEP 41 and add DType<->scalar duplication paragraph
+* `#16101 <https://github.com/numpy/numpy/pull/16101>`__: BLD: put openblas library in local directory on windows
+* `#16113 <https://github.com/numpy/numpy/pull/16113>`__: MAINT: Fix random.PCG64 signature
+* `#16119 <https://github.com/numpy/numpy/pull/16119>`__: DOC: Move misplaced news fragment for gh-13421
+* `#16122 <https://github.com/numpy/numpy/pull/16122>`__: DOC: Fix links for NEP 40 in NEP 41
+* `#16125 <https://github.com/numpy/numpy/pull/16125>`__: BUG: lib: Fix a problem with vectorize with default parameters.
+* `#16129 <https://github.com/numpy/numpy/pull/16129>`__: ENH: Better error message when ``bins`` has float value in ``histogramdd``.
+* `#16133 <https://github.com/numpy/numpy/pull/16133>`__: MAINT: Unify casting error creation (outside the iterator)
+* `#16141 <https://github.com/numpy/numpy/pull/16141>`__: BENCH: Default to building HEAD instead of master
+* `#16144 <https://github.com/numpy/numpy/pull/16144>`__: REL: Update master after NumPy 1.18.4 release
+* `#16145 <https://github.com/numpy/numpy/pull/16145>`__: DOC: Add VSCode help link to importerror troubleshooting
+* `#16147 <https://github.com/numpy/numpy/pull/16147>`__: CI: pin 32-bit manylinux2010 image tag
+* `#16151 <https://github.com/numpy/numpy/pull/16151>`__: MAINT: Bump pytz from 2019.3 to 2020.1
+* `#16153 <https://github.com/numpy/numpy/pull/16153>`__: BUG: Correct loop order in MT19937 jump
+* `#16155 <https://github.com/numpy/numpy/pull/16155>`__: CI: unpin 32-bit manylinux2010 image tag
+* `#16162 <https://github.com/numpy/numpy/pull/16162>`__: BUG: add missing numpy/__init__.pxd to the wheel
+* `#16168 <https://github.com/numpy/numpy/pull/16168>`__: BUG:Umath remove unnecessary include of simd.inc in fast_loop_macro.h
+* `#16169 <https://github.com/numpy/numpy/pull/16169>`__: DOC,BLD: Add :doc: to whitelisted roles in refguide_check.
+* `#16170 <https://github.com/numpy/numpy/pull/16170>`__: ENH: resync numpy/__init__.pxd with upstream
+* `#16171 <https://github.com/numpy/numpy/pull/16171>`__: ENH: allow choosing which manylinux artifact to download
+* `#16173 <https://github.com/numpy/numpy/pull/16173>`__: MAINT: Mark tests as a subpackage rather than data.
+* `#16182 <https://github.com/numpy/numpy/pull/16182>`__: Update Docs : point users of np.outer to np.multiply.outer
+* `#16183 <https://github.com/numpy/numpy/pull/16183>`__: DOC: Fix link to numpy docs in README.
+* `#16185 <https://github.com/numpy/numpy/pull/16185>`__: ENH: Allow pickle with protocol 5 when higher is requested
+* `#16188 <https://github.com/numpy/numpy/pull/16188>`__: MAINT: cleanups to _iotools.StringConverter
+* `#16197 <https://github.com/numpy/numpy/pull/16197>`__: DOC: Unify cross-references between array joining methods
+* `#16199 <https://github.com/numpy/numpy/pull/16199>`__: DOC: Improve docstring of ``numpy.core.records``
+* `#16201 <https://github.com/numpy/numpy/pull/16201>`__: DOC: update Code of Conduct committee
+* `#16203 <https://github.com/numpy/numpy/pull/16203>`__: MAINT: Bump hypothesis from 5.10.4 to 5.12.0
+* `#16204 <https://github.com/numpy/numpy/pull/16204>`__: MAINT: Bump pytest from 5.4.1 to 5.4.2
+* `#16210 <https://github.com/numpy/numpy/pull/16210>`__: DOC: warn about runtime of shares_memory
+* `#16213 <https://github.com/numpy/numpy/pull/16213>`__: ENH: backport scipy changes to openblas download script
+* `#16214 <https://github.com/numpy/numpy/pull/16214>`__: BUG: skip complex256 arcsinh precision test on glibc2.17
+* `#16215 <https://github.com/numpy/numpy/pull/16215>`__: MAINT: Chain exceptions and use NameError in np.bmat
+* `#16216 <https://github.com/numpy/numpy/pull/16216>`__: DOC,BLD: pin sphinx to <3.0 in doc_requirements.txt
+* `#16223 <https://github.com/numpy/numpy/pull/16223>`__: BUG: fix signature of PyArray_SearchSorted in __init__.pxd
+* `#16224 <https://github.com/numpy/numpy/pull/16224>`__: ENH: add manylinux1 openblas hashes
+* `#16226 <https://github.com/numpy/numpy/pull/16226>`__: DOC: Fix Generator.choice docstring
+* `#16227 <https://github.com/numpy/numpy/pull/16227>`__: DOC: Add PyDev instructions to troubleshooting doc
+* `#16228 <https://github.com/numpy/numpy/pull/16228>`__: DOC: Add Clang and MSVC to supported compilers list
+* `#16240 <https://github.com/numpy/numpy/pull/16240>`__: DOC: Warn about behavior of ptp with signed integers.
+* `#16258 <https://github.com/numpy/numpy/pull/16258>`__: DOC: Update the f2py section of the "Using Python as Glue" page.
+* `#16263 <https://github.com/numpy/numpy/pull/16263>`__: BUG: Add missing decref in fromarray error path
+* `#16265 <https://github.com/numpy/numpy/pull/16265>`__: ENH: Add tool for downloading release wheels from Anaconda.
+* `#16269 <https://github.com/numpy/numpy/pull/16269>`__: DOC: Fix typos and cosmetic issues
+* `#16280 <https://github.com/numpy/numpy/pull/16280>`__: REL: Prepare for the 1.19.0 release
+* `#16293 <https://github.com/numpy/numpy/pull/16293>`__: BUG: Fix tools/download-wheels.py.
+* `#16301 <https://github.com/numpy/numpy/pull/16301>`__: BUG: Require Python >= 3.6 in setup.py
+* `#16312 <https://github.com/numpy/numpy/pull/16312>`__: BUG: relpath fails for different drives on windows
+* `#16314 <https://github.com/numpy/numpy/pull/16314>`__: DOC: Fix documentation rendering,
+* `#16341 <https://github.com/numpy/numpy/pull/16341>`__: BUG: Don't segfault on bad __len__ when assigning. (gh-16327)
+* `#16342 <https://github.com/numpy/numpy/pull/16342>`__: MAINT: Stop Using PyEval_Call* and simplify some uses
+* `#16343 <https://github.com/numpy/numpy/pull/16343>`__: BLD: Avoid "visibility attribute not supported" warning.
+* `#16344 <https://github.com/numpy/numpy/pull/16344>`__: BUG: Allow attaching documentation twice in add_docstring
+* `#16355 <https://github.com/numpy/numpy/pull/16355>`__: MAINT: Remove f-strings in setup.py. (gh-16346)
+* `#16356 <https://github.com/numpy/numpy/pull/16356>`__: BUG: Indentation for docstrings
+* `#16358 <https://github.com/numpy/numpy/pull/16358>`__: BUG: Fix dtype leak in `PyArray_FromAny` error path
+* `#16383 <https://github.com/numpy/numpy/pull/16383>`__: ENH: Optimize Cpu feature detect in X86, fix for GCC on macOS...
+* `#16398 <https://github.com/numpy/numpy/pull/16398>`__: MAINT: core: Use a raw string for the fromstring docstring.
+* `#16399 <https://github.com/numpy/numpy/pull/16399>`__: MAINT: Make ctypes optional on Windows
+* `#16400 <https://github.com/numpy/numpy/pull/16400>`__: BUG: Fix small leaks in error path and ``empty_like`` with shape
+* `#16402 <https://github.com/numpy/numpy/pull/16402>`__: TST, MAINT: Fix detecting and testing armhf features
+* `#16412 <https://github.com/numpy/numpy/pull/16412>`__: DOC,BLD: Update sphinx conf to use xelatex.
+* `#16413 <https://github.com/numpy/numpy/pull/16413>`__: DOC,BLD: Update make dist html target.
+* `#16414 <https://github.com/numpy/numpy/pull/16414>`__: MAINT, DOC: add index for user docs.
+* `#16437 <https://github.com/numpy/numpy/pull/16437>`__: MAINT: support python 3.10
+* `#16456 <https://github.com/numpy/numpy/pull/16456>`__: DOC: Fix troubleshooting code snippet when env vars are empty
+* `#16457 <https://github.com/numpy/numpy/pull/16457>`__: REL: Prepare for the NumPy 1.19.0rc2 release.
+* `#16526 <https://github.com/numpy/numpy/pull/16526>`__: MAINT:ARMHF Fix detecting feature groups NEON_HALF and NEON_VFPV4
+* `#16527 <https://github.com/numpy/numpy/pull/16527>`__: BUG:random: Error when ``size`` is smaller than broadcast input...
+* `#16528 <https://github.com/numpy/numpy/pull/16528>`__: BUG: fix GCC 10 major version comparison
+* `#16563 <https://github.com/numpy/numpy/pull/16563>`__: BUG: Ensure SeedSequence 0-padding does not collide with spawn...
+* `#16586 <https://github.com/numpy/numpy/pull/16586>`__: BUG: fix sin/cos bug when input is strided array
+* `#16602 <https://github.com/numpy/numpy/pull/16602>`__: MAINT: Move and improve ``test_ignore_nan_ulperror``.
+* `#16645 <https://github.com/numpy/numpy/pull/16645>`__: REL: Update 1.19.0-changelog.rst for 1.19.0 release.
diff --git a/doc/changelog/1.19.1-changelog.rst b/doc/changelog/1.19.1-changelog.rst
new file mode 100644
index 000000000..3b46ffadf
--- /dev/null
+++ b/doc/changelog/1.19.1-changelog.rst
@@ -0,0 +1,53 @@
+
+Contributors
+============
+
+A total of 15 people contributed to this release. People with a "+" by their
+names contributed a patch for the first time.
+
+* Abhinav Reddy +
+* Anirudh Subramanian
+* Antonio Larrosa +
+* Charles Harris
+* Chunlin Fang
+* Eric Wieser
+* Etienne Guesnet +
+* Kevin Sheppard
+* Matti Picus
+* Raghuveer Devulapalli
+* Roman Yurchak
+* Ross Barnowski
+* Sayed Adel
+* Sebastian Berg
+* Tyler Reddy
+
+Pull requests merged
+====================
+
+A total of 25 pull requests were merged for this release.
+
+* `#16649 <https://github.com/numpy/numpy/pull/16649>`__: MAINT, CI: disable Shippable cache
+* `#16652 <https://github.com/numpy/numpy/pull/16652>`__: MAINT: Replace `PyUString_GET_SIZE` with `PyUnicode_GetLength`.
+* `#16654 <https://github.com/numpy/numpy/pull/16654>`__: REL: Fix outdated docs link
+* `#16656 <https://github.com/numpy/numpy/pull/16656>`__: BUG: raise IEEE exception on AIX
+* `#16672 <https://github.com/numpy/numpy/pull/16672>`__: BUG: Fix bug in AVX complex absolute while processing array of...
+* `#16693 <https://github.com/numpy/numpy/pull/16693>`__: TST: Add extra debugging information to CPU features detection
+* `#16703 <https://github.com/numpy/numpy/pull/16703>`__: BLD: Add CPU entry for Emscripten / WebAssembly
+* `#16705 <https://github.com/numpy/numpy/pull/16705>`__: TST: Disable Python 3.9-dev testing.
+* `#16714 <https://github.com/numpy/numpy/pull/16714>`__: MAINT: Disable use_hugepages in case of ValueError
+* `#16724 <https://github.com/numpy/numpy/pull/16724>`__: BUG: Fix PyArray_SearchSorted signature.
+* `#16768 <https://github.com/numpy/numpy/pull/16768>`__: MAINT: Fixes for deprecated functions in scalartypes.c.src
+* `#16772 <https://github.com/numpy/numpy/pull/16772>`__: MAINT: Remove unneeded call to PyUnicode_READY
+* `#16776 <https://github.com/numpy/numpy/pull/16776>`__: MAINT: Fix deprecated functions in scalarapi.c
+* `#16779 <https://github.com/numpy/numpy/pull/16779>`__: BLD, ENH: Add RPATH support for AIX
+* `#16780 <https://github.com/numpy/numpy/pull/16780>`__: BUG: Fix default fallback in genfromtxt
+* `#16784 <https://github.com/numpy/numpy/pull/16784>`__: BUG: Added missing return after raising error in methods.c
+* `#16795 <https://github.com/numpy/numpy/pull/16795>`__: BLD: update cython to 0.29.21
+* `#16832 <https://github.com/numpy/numpy/pull/16832>`__: MAINT: setuptools 49.2.0 emits a warning, avoid it
+* `#16872 <https://github.com/numpy/numpy/pull/16872>`__: BUG: Validate output size in bin- and multinomial
+* `#16875 <https://github.com/numpy/numpy/pull/16875>`__: BLD, MAINT: Pin setuptools
+* `#16904 <https://github.com/numpy/numpy/pull/16904>`__: DOC: Reconstruct Testing Guideline.
+* `#16905 <https://github.com/numpy/numpy/pull/16905>`__: TST, BUG: Re-raise MemoryError exception in test_large_zip's...
+* `#16906 <https://github.com/numpy/numpy/pull/16906>`__: BUG,DOC: Fix bad MPL kwarg.
+* `#16916 <https://github.com/numpy/numpy/pull/16916>`__: BUG: Fix string/bytes to complex assignment
+* `#16922 <https://github.com/numpy/numpy/pull/16922>`__: REL: Prepare for NumPy 1.19.1 release
diff --git a/doc/changelog/1.19.2-changelog.rst b/doc/changelog/1.19.2-changelog.rst
new file mode 100644
index 000000000..47db1dd59
--- /dev/null
+++ b/doc/changelog/1.19.2-changelog.rst
@@ -0,0 +1,30 @@
+
+Contributors
+============
+
+A total of 8 people contributed to this release. People with a "+" by their
+names contributed a patch for the first time.
+
+* Charles Harris
+* Matti Picus
+* Pauli Virtanen
+* Philippe Ombredanne +
+* Sebastian Berg
+* Stefan Behnel +
+* Stephan Loyd +
+* Zac Hatfield-Dodds
+
+Pull requests merged
+====================
+
+A total of 9 pull requests were merged for this release.
+
+* `#16959 <https://github.com/numpy/numpy/pull/16959>`__: TST: Change aarch64 to arm64 in travis.yml.
+* `#16998 <https://github.com/numpy/numpy/pull/16998>`__: MAINT: Configure hypothesis in ``np.test()`` for determinism,...
+* `#17000 <https://github.com/numpy/numpy/pull/17000>`__: BLD: pin setuptools < 49.2.0
+* `#17015 <https://github.com/numpy/numpy/pull/17015>`__: ENH: Add NumPy declarations to be used by Cython 3.0+
+* `#17125 <https://github.com/numpy/numpy/pull/17125>`__: BUG: Remove non-threadsafe sigint handling from fft calculation
+* `#17243 <https://github.com/numpy/numpy/pull/17243>`__: BUG: core: fix ilp64 blas dot/vdot/... for strides > int32 max
+* `#17244 <https://github.com/numpy/numpy/pull/17244>`__: DOC: Use SPDX license expressions with correct license
+* `#17245 <https://github.com/numpy/numpy/pull/17245>`__: DOC: Fix the link to the quick-start in the old API functions
+* `#17272 <https://github.com/numpy/numpy/pull/17272>`__: BUG: fix pickling of arrays larger than 2GiB
diff --git a/doc/changelog/1.19.3-changelog.rst b/doc/changelog/1.19.3-changelog.rst
new file mode 100644
index 000000000..5e8dfa10b
--- /dev/null
+++ b/doc/changelog/1.19.3-changelog.rst
@@ -0,0 +1,31 @@
+
+Contributors
+============
+
+A total of 8 people contributed to this release. People with a "+" by their
+names contributed a patch for the first time.
+
+* Charles Harris
+* Chris Brown +
+* Daniel Vanzo +
+* E. Madison Bray +
+* Hugo van Kemenade +
+* Ralf Gommers
+* Sebastian Berg
+* @danbeibei +
+
+Pull requests merged
+====================
+
+A total of 10 pull requests were merged for this release.
+
+* `#17298 <https://github.com/numpy/numpy/pull/17298>`__: BLD: set upper versions for build dependencies
+* `#17336 <https://github.com/numpy/numpy/pull/17336>`__: BUG: Set deprecated fields to null in PyArray_InitArrFuncs
+* `#17446 <https://github.com/numpy/numpy/pull/17446>`__: ENH: Warn on unsupported Python 3.10+
+* `#17450 <https://github.com/numpy/numpy/pull/17450>`__: MAINT: Update test_requirements.txt.
+* `#17522 <https://github.com/numpy/numpy/pull/17522>`__: ENH: Support for the NVIDIA HPC SDK nvfortran compiler
+* `#17568 <https://github.com/numpy/numpy/pull/17568>`__: BUG: Cygwin Workaround for #14787 on affected platforms
+* `#17647 <https://github.com/numpy/numpy/pull/17647>`__: BUG: Fix memory leak of buffer-info cache due to relaxed strides
+* `#17652 <https://github.com/numpy/numpy/pull/17652>`__: MAINT: Backport openblas_support from master.
+* `#17653 <https://github.com/numpy/numpy/pull/17653>`__: TST: Add Python 3.9 to the CI testing on Windows, Mac.
+* `#17660 <https://github.com/numpy/numpy/pull/17660>`__: TST: Simplify source path names in test_extending.
diff --git a/doc/changelog/1.19.4-changelog.rst b/doc/changelog/1.19.4-changelog.rst
new file mode 100644
index 000000000..82632b990
--- /dev/null
+++ b/doc/changelog/1.19.4-changelog.rst
@@ -0,0 +1,16 @@
+
+Contributors
+============
+
+A total of 1 people contributed to this release. People with a "+" by their
+names contributed a patch for the first time.
+
+* Charles Harris
+
+Pull requests merged
+====================
+
+A total of 2 pull requests were merged for this release.
+
+* `#17679 <https://github.com/numpy/numpy/pull/17679>`__: MAINT: Add check for Windows 10 version 2004 bug.
+* `#17680 <https://github.com/numpy/numpy/pull/17680>`__: REV: Revert OpenBLAS to 1.19.2 version for 1.19.4
diff --git a/doc/neps/_static/casting_flow.svg b/doc/neps/_static/casting_flow.svg
new file mode 100644
index 000000000..8b4b96477
--- /dev/null
+++ b/doc/neps/_static/casting_flow.svg
@@ -0,0 +1,2212 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="908pt"
+ height="444pt"
+ viewBox="0 0 908 444"
+ version="1.1"
+ id="svg2577"
+ sodipodi:docname="casting_flow.svg"
+ inkscape:version="1.0rc1 (09960d6f05, 2020-04-09)">
+ <metadata
+ id="metadata2581">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview
+ inkscape:document-rotation="0"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="2560"
+ inkscape:window-height="1376"
+ id="namedview2579"
+ showgrid="false"
+ inkscape:zoom="1.1348363"
+ inkscape:cx="754.6365"
+ inkscape:cy="382.73477"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="surface392452" />
+ <defs
+ id="defs1910">
+ <g
+ id="g1908">
+ <symbol
+ overflow="visible"
+ id="glyph0-0">
+ <path
+ style="stroke:none;"
+ d="M 0.640625 2.265625 L 0.640625 -9.015625 L 7.03125 -9.015625 L 7.03125 2.265625 Z M 1.359375 1.546875 L 6.328125 1.546875 L 6.328125 -8.296875 L 1.359375 -8.296875 Z M 1.359375 1.546875 "
+ id="path1734" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph0-1">
+ <path
+ style="stroke:none;"
+ d="M 8.234375 -8.609375 L 8.234375 -7.28125 C 7.816406 -7.675781 7.363281 -7.96875 6.875 -8.15625 C 6.394531 -8.351562 5.882812 -8.453125 5.34375 -8.453125 C 4.28125 -8.453125 3.460938 -8.125 2.890625 -7.46875 C 2.328125 -6.820312 2.046875 -5.882812 2.046875 -4.65625 C 2.046875 -3.425781 2.328125 -2.484375 2.890625 -1.828125 C 3.460938 -1.179688 4.28125 -0.859375 5.34375 -0.859375 C 5.882812 -0.859375 6.394531 -0.953125 6.875 -1.140625 C 7.363281 -1.335938 7.816406 -1.632812 8.234375 -2.03125 L 8.234375 -0.71875 C 7.796875 -0.414062 7.328125 -0.1875 6.828125 -0.03125 C 6.335938 0.113281 5.820312 0.1875 5.28125 0.1875 C 3.863281 0.1875 2.75 -0.242188 1.9375 -1.109375 C 1.125 -1.972656 0.71875 -3.15625 0.71875 -4.65625 C 0.71875 -6.15625 1.125 -7.335938 1.9375 -8.203125 C 2.75 -9.066406 3.863281 -9.5 5.28125 -9.5 C 5.832031 -9.5 6.351562 -9.421875 6.84375 -9.265625 C 7.34375 -9.117188 7.804688 -8.898438 8.234375 -8.609375 Z M 8.234375 -8.609375 "
+ id="path1737" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph0-2">
+ <path
+ style="stroke:none;"
+ d="M 4.390625 -3.515625 C 3.460938 -3.515625 2.816406 -3.40625 2.453125 -3.1875 C 2.097656 -2.976562 1.921875 -2.617188 1.921875 -2.109375 C 1.921875 -1.703125 2.050781 -1.378906 2.3125 -1.140625 C 2.582031 -0.898438 2.953125 -0.78125 3.421875 -0.78125 C 4.054688 -0.78125 4.566406 -1.003906 4.953125 -1.453125 C 5.335938 -1.910156 5.53125 -2.515625 5.53125 -3.265625 L 5.53125 -3.515625 Z M 6.671875 -4 L 6.671875 0 L 5.53125 0 L 5.53125 -1.0625 C 5.269531 -0.632812 4.941406 -0.316406 4.546875 -0.109375 C 4.160156 0.0859375 3.679688 0.1875 3.109375 0.1875 C 2.390625 0.1875 1.816406 -0.015625 1.390625 -0.421875 C 0.972656 -0.828125 0.765625 -1.363281 0.765625 -2.03125 C 0.765625 -2.820312 1.023438 -3.414062 1.546875 -3.8125 C 2.078125 -4.21875 2.867188 -4.421875 3.921875 -4.421875 L 5.53125 -4.421875 L 5.53125 -4.53125 C 5.53125 -5.0625 5.351562 -5.46875 5 -5.75 C 4.65625 -6.039062 4.171875 -6.1875 3.546875 -6.1875 C 3.140625 -6.1875 2.75 -6.140625 2.375 -6.046875 C 2 -5.953125 1.632812 -5.8125 1.28125 -5.625 L 1.28125 -6.671875 C 1.695312 -6.835938 2.101562 -6.960938 2.5 -7.046875 C 2.894531 -7.128906 3.28125 -7.171875 3.65625 -7.171875 C 4.675781 -7.171875 5.429688 -6.90625 5.921875 -6.375 C 6.421875 -5.851562 6.671875 -5.0625 6.671875 -4 Z M 6.671875 -4 "
+ id="path1740" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph0-3">
+ <path
+ style="stroke:none;"
+ d="M 5.671875 -6.796875 L 5.671875 -5.703125 C 5.347656 -5.867188 5.007812 -5.992188 4.65625 -6.078125 C 4.300781 -6.160156 3.9375 -6.203125 3.5625 -6.203125 C 3 -6.203125 2.570312 -6.113281 2.28125 -5.9375 C 2 -5.769531 1.859375 -5.507812 1.859375 -5.15625 C 1.859375 -4.882812 1.957031 -4.671875 2.15625 -4.515625 C 2.363281 -4.367188 2.773438 -4.226562 3.390625 -4.09375 L 3.78125 -4 C 4.601562 -3.832031 5.1875 -3.585938 5.53125 -3.265625 C 5.875 -2.941406 6.046875 -2.5 6.046875 -1.9375 C 6.046875 -1.28125 5.785156 -0.757812 5.265625 -0.375 C 4.753906 0 4.050781 0.1875 3.15625 0.1875 C 2.78125 0.1875 2.390625 0.148438 1.984375 0.078125 C 1.578125 0.00390625 1.144531 -0.101562 0.6875 -0.25 L 0.6875 -1.4375 C 1.113281 -1.21875 1.53125 -1.050781 1.9375 -0.9375 C 2.351562 -0.832031 2.765625 -0.78125 3.171875 -0.78125 C 3.710938 -0.78125 4.128906 -0.875 4.421875 -1.0625 C 4.710938 -1.25 4.859375 -1.507812 4.859375 -1.84375 C 4.859375 -2.15625 4.753906 -2.394531 4.546875 -2.5625 C 4.335938 -2.726562 3.875 -2.890625 3.15625 -3.046875 L 2.765625 -3.140625 C 2.046875 -3.285156 1.53125 -3.515625 1.21875 -3.828125 C 0.90625 -4.140625 0.75 -4.566406 0.75 -5.109375 C 0.75 -5.765625 0.976562 -6.269531 1.4375 -6.625 C 1.90625 -6.988281 2.570312 -7.171875 3.4375 -7.171875 C 3.851562 -7.171875 4.25 -7.140625 4.625 -7.078125 C 5 -7.015625 5.347656 -6.921875 5.671875 -6.796875 Z M 5.671875 -6.796875 "
+ id="path1743" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph0-4">
+ <path
+ style="stroke:none;"
+ d="M 2.34375 -8.984375 L 2.34375 -7 L 4.71875 -7 L 4.71875 -6.109375 L 2.34375 -6.109375 L 2.34375 -2.3125 C 2.34375 -1.738281 2.421875 -1.367188 2.578125 -1.203125 C 2.734375 -1.046875 3.050781 -0.96875 3.53125 -0.96875 L 4.71875 -0.96875 L 4.71875 0 L 3.53125 0 C 2.644531 0 2.03125 -0.164062 1.6875 -0.5 C 1.351562 -0.832031 1.1875 -1.4375 1.1875 -2.3125 L 1.1875 -6.109375 L 0.34375 -6.109375 L 0.34375 -7 L 1.1875 -7 L 1.1875 -8.984375 Z M 2.34375 -8.984375 "
+ id="path1746" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph0-5">
+ <path
+ style="stroke:none;"
+ d="M 1.203125 -7 L 2.359375 -7 L 2.359375 0 L 1.203125 0 Z M 1.203125 -9.71875 L 2.359375 -9.71875 L 2.359375 -8.265625 L 1.203125 -8.265625 Z M 1.203125 -9.71875 "
+ id="path1749" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph0-6">
+ <path
+ style="stroke:none;"
+ d="M 7.015625 -4.21875 L 7.015625 0 L 5.875 0 L 5.875 -4.1875 C 5.875 -4.851562 5.742188 -5.347656 5.484375 -5.671875 C 5.222656 -6.003906 4.835938 -6.171875 4.328125 -6.171875 C 3.703125 -6.171875 3.207031 -5.972656 2.84375 -5.578125 C 2.488281 -5.179688 2.3125 -4.640625 2.3125 -3.953125 L 2.3125 0 L 1.15625 0 L 1.15625 -7 L 2.3125 -7 L 2.3125 -5.90625 C 2.59375 -6.332031 2.914062 -6.648438 3.28125 -6.859375 C 3.65625 -7.066406 4.085938 -7.171875 4.578125 -7.171875 C 5.378906 -7.171875 5.984375 -6.921875 6.390625 -6.421875 C 6.804688 -5.921875 7.015625 -5.1875 7.015625 -4.21875 Z M 7.015625 -4.21875 "
+ id="path1752" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph0-7">
+ <path
+ style="stroke:none;"
+ d="M 5.8125 -3.578125 C 5.8125 -4.410156 5.640625 -5.054688 5.296875 -5.515625 C 4.953125 -5.972656 4.46875 -6.203125 3.84375 -6.203125 C 3.226562 -6.203125 2.75 -5.972656 2.40625 -5.515625 C 2.0625 -5.054688 1.890625 -4.410156 1.890625 -3.578125 C 1.890625 -2.753906 2.0625 -2.113281 2.40625 -1.65625 C 2.75 -1.195312 3.226562 -0.96875 3.84375 -0.96875 C 4.46875 -0.96875 4.953125 -1.195312 5.296875 -1.65625 C 5.640625 -2.113281 5.8125 -2.753906 5.8125 -3.578125 Z M 6.953125 -0.875 C 6.953125 0.320312 6.6875 1.207031 6.15625 1.78125 C 5.632812 2.363281 4.828125 2.65625 3.734375 2.65625 C 3.328125 2.65625 2.945312 2.625 2.59375 2.5625 C 2.238281 2.507812 1.890625 2.421875 1.546875 2.296875 L 1.546875 1.171875 C 1.890625 1.359375 2.222656 1.492188 2.546875 1.578125 C 2.878906 1.671875 3.21875 1.71875 3.5625 1.71875 C 4.3125 1.71875 4.875 1.519531 5.25 1.125 C 5.625 0.726562 5.8125 0.132812 5.8125 -0.65625 L 5.8125 -1.234375 C 5.570312 -0.816406 5.265625 -0.503906 4.890625 -0.296875 C 4.523438 -0.0976562 4.082031 0 3.5625 0 C 2.707031 0 2.015625 -0.328125 1.484375 -0.984375 C 0.960938 -1.640625 0.703125 -2.503906 0.703125 -3.578125 C 0.703125 -4.660156 0.960938 -5.53125 1.484375 -6.1875 C 2.015625 -6.84375 2.707031 -7.171875 3.5625 -7.171875 C 4.082031 -7.171875 4.523438 -7.066406 4.890625 -6.859375 C 5.265625 -6.648438 5.570312 -6.34375 5.8125 -5.9375 L 5.8125 -7 L 6.953125 -7 Z M 6.953125 -0.875 "
+ id="path1755" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph0-8">
+ <path
+ style="stroke:none;"
+ d="M 1.25 -9.328125 L 2.515625 -9.328125 L 2.515625 0 L 1.25 0 Z M 1.25 -9.328125 "
+ id="path1758" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph0-9">
+ <path
+ style="stroke:none;"
+ d="M 6.65625 -5.65625 C 6.9375 -6.164062 7.273438 -6.546875 7.671875 -6.796875 C 8.078125 -7.046875 8.550781 -7.171875 9.09375 -7.171875 C 9.820312 -7.171875 10.382812 -6.914062 10.78125 -6.40625 C 11.175781 -5.894531 11.375 -5.164062 11.375 -4.21875 L 11.375 0 L 10.21875 0 L 10.21875 -4.1875 C 10.21875 -4.851562 10.097656 -5.347656 9.859375 -5.671875 C 9.628906 -6.003906 9.269531 -6.171875 8.78125 -6.171875 C 8.1875 -6.171875 7.710938 -5.972656 7.359375 -5.578125 C 7.015625 -5.179688 6.84375 -4.640625 6.84375 -3.953125 L 6.84375 0 L 5.6875 0 L 5.6875 -4.1875 C 5.6875 -4.863281 5.566406 -5.363281 5.328125 -5.6875 C 5.097656 -6.007812 4.734375 -6.171875 4.234375 -6.171875 C 3.648438 -6.171875 3.179688 -5.96875 2.828125 -5.5625 C 2.484375 -5.164062 2.3125 -4.628906 2.3125 -3.953125 L 2.3125 0 L 1.15625 0 L 1.15625 -7 L 2.3125 -7 L 2.3125 -5.90625 C 2.582031 -6.332031 2.898438 -6.648438 3.265625 -6.859375 C 3.628906 -7.066406 4.0625 -7.171875 4.5625 -7.171875 C 5.070312 -7.171875 5.503906 -7.039062 5.859375 -6.78125 C 6.222656 -6.519531 6.488281 -6.144531 6.65625 -5.65625 Z M 6.65625 -5.65625 "
+ id="path1761" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph0-10">
+ <path
+ style="stroke:none;"
+ d="M 2.3125 -1.046875 L 2.3125 2.65625 L 1.15625 2.65625 L 1.15625 -7 L 2.3125 -7 L 2.3125 -5.9375 C 2.5625 -6.351562 2.867188 -6.660156 3.234375 -6.859375 C 3.597656 -7.066406 4.039062 -7.171875 4.5625 -7.171875 C 5.40625 -7.171875 6.09375 -6.832031 6.625 -6.15625 C 7.15625 -5.476562 7.421875 -4.59375 7.421875 -3.5 C 7.421875 -2.394531 7.15625 -1.503906 6.625 -0.828125 C 6.09375 -0.148438 5.40625 0.1875 4.5625 0.1875 C 4.039062 0.1875 3.597656 0.0859375 3.234375 -0.109375 C 2.867188 -0.316406 2.5625 -0.628906 2.3125 -1.046875 Z M 6.234375 -3.5 C 6.234375 -4.34375 6.054688 -5.003906 5.703125 -5.484375 C 5.359375 -5.960938 4.882812 -6.203125 4.28125 -6.203125 C 3.664062 -6.203125 3.179688 -5.960938 2.828125 -5.484375 C 2.484375 -5.003906 2.3125 -4.34375 2.3125 -3.5 C 2.3125 -2.644531 2.484375 -1.976562 2.828125 -1.5 C 3.179688 -1.019531 3.664062 -0.78125 4.28125 -0.78125 C 4.882812 -0.78125 5.359375 -1.019531 5.703125 -1.5 C 6.054688 -1.976562 6.234375 -2.644531 6.234375 -3.5 Z M 6.234375 -3.5 "
+ id="path1764" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph0-11">
+ <path
+ style="stroke:none;"
+ d="M 1.203125 -9.71875 L 2.359375 -9.71875 L 2.359375 0 L 1.203125 0 Z M 1.203125 -9.71875 "
+ id="path1767" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph0-12">
+ <path
+ style="stroke:none;"
+ d="M 1.09375 -9.71875 L 3.75 -9.71875 L 3.75 -8.828125 L 2.25 -8.828125 L 2.25 0.796875 L 3.75 0.796875 L 3.75 1.6875 L 1.09375 1.6875 Z M 1.09375 -9.71875 "
+ id="path1770" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph0-13">
+ <path
+ style="stroke:none;"
+ d="M 2.453125 -1.0625 L 6.859375 -1.0625 L 6.859375 0 L 0.9375 0 L 0.9375 -1.0625 C 1.414062 -1.5625 2.066406 -2.226562 2.890625 -3.0625 C 3.722656 -3.894531 4.242188 -4.429688 4.453125 -4.671875 C 4.859375 -5.128906 5.140625 -5.515625 5.296875 -5.828125 C 5.460938 -6.140625 5.546875 -6.445312 5.546875 -6.75 C 5.546875 -7.25 5.367188 -7.65625 5.015625 -7.96875 C 4.671875 -8.28125 4.21875 -8.4375 3.65625 -8.4375 C 3.257812 -8.4375 2.84375 -8.363281 2.40625 -8.21875 C 1.96875 -8.082031 1.5 -7.878906 1 -7.609375 L 1 -8.875 C 1.507812 -9.082031 1.984375 -9.238281 2.421875 -9.34375 C 2.867188 -9.445312 3.273438 -9.5 3.640625 -9.5 C 4.609375 -9.5 5.378906 -9.253906 5.953125 -8.765625 C 6.523438 -8.285156 6.8125 -7.640625 6.8125 -6.828125 C 6.8125 -6.453125 6.738281 -6.09375 6.59375 -5.75 C 6.445312 -5.40625 6.1875 -5 5.8125 -4.53125 C 5.707031 -4.40625 5.375 -4.054688 4.8125 -3.484375 C 4.257812 -2.910156 3.472656 -2.101562 2.453125 -1.0625 Z M 2.453125 -1.0625 "
+ id="path1773" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph0-14">
+ <path
+ style="stroke:none;"
+ d="M 4.84375 -8.234375 L 1.65625 -3.25 L 4.84375 -3.25 Z M 4.5 -9.328125 L 6.09375 -9.328125 L 6.09375 -3.25 L 7.421875 -3.25 L 7.421875 -2.203125 L 6.09375 -2.203125 L 6.09375 0 L 4.84375 0 L 4.84375 -2.203125 L 0.625 -2.203125 L 0.625 -3.421875 Z M 4.5 -9.328125 "
+ id="path1776" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph0-15">
+ <path
+ style="stroke:none;"
+ d="M 1.5 -1.59375 L 2.8125 -1.59375 L 2.8125 -0.515625 L 1.796875 1.484375 L 0.984375 1.484375 L 1.5 -0.515625 Z M 1.5 -1.59375 "
+ id="path1779" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph0-16">
+ <path
+ style="stroke:none;"
+ d=""
+ id="path1782" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph0-17">
+ <path
+ style="stroke:none;"
+ d="M 6.84375 -9.015625 L 6.84375 -7.796875 C 6.363281 -8.023438 5.910156 -8.191406 5.484375 -8.296875 C 5.066406 -8.410156 4.660156 -8.46875 4.265625 -8.46875 C 3.578125 -8.46875 3.046875 -8.332031 2.671875 -8.0625 C 2.296875 -7.800781 2.109375 -7.425781 2.109375 -6.9375 C 2.109375 -6.519531 2.234375 -6.207031 2.484375 -6 C 2.734375 -5.789062 3.203125 -5.625 3.890625 -5.5 L 4.65625 -5.34375 C 5.59375 -5.15625 6.285156 -4.835938 6.734375 -4.390625 C 7.179688 -3.941406 7.40625 -3.335938 7.40625 -2.578125 C 7.40625 -1.671875 7.101562 -0.984375 6.5 -0.515625 C 5.894531 -0.046875 5.007812 0.1875 3.84375 0.1875 C 3.394531 0.1875 2.921875 0.132812 2.421875 0.03125 C 1.929688 -0.0703125 1.414062 -0.21875 0.875 -0.40625 L 0.875 -1.71875 C 1.394531 -1.425781 1.898438 -1.207031 2.390625 -1.0625 C 2.878906 -0.914062 3.363281 -0.84375 3.84375 -0.84375 C 4.5625 -0.84375 5.113281 -0.984375 5.5 -1.265625 C 5.894531 -1.546875 6.09375 -1.953125 6.09375 -2.484375 C 6.09375 -2.941406 5.953125 -3.296875 5.671875 -3.546875 C 5.390625 -3.804688 4.925781 -4.003906 4.28125 -4.140625 L 3.515625 -4.28125 C 2.578125 -4.46875 1.894531 -4.757812 1.46875 -5.15625 C 1.050781 -5.5625 0.84375 -6.117188 0.84375 -6.828125 C 0.84375 -7.660156 1.132812 -8.3125 1.71875 -8.78125 C 2.300781 -9.257812 3.101562 -9.5 4.125 -9.5 C 4.5625 -9.5 5.003906 -9.457031 5.453125 -9.375 C 5.910156 -9.300781 6.375 -9.179688 6.84375 -9.015625 Z M 6.84375 -9.015625 "
+ id="path1785" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph0-18">
+ <path
+ style="stroke:none;"
+ d="M 5.265625 -5.921875 C 5.128906 -5.992188 4.984375 -6.046875 4.828125 -6.078125 C 4.679688 -6.117188 4.519531 -6.140625 4.34375 -6.140625 C 3.6875 -6.140625 3.179688 -5.925781 2.828125 -5.5 C 2.484375 -5.082031 2.3125 -4.476562 2.3125 -3.6875 L 2.3125 0 L 1.15625 0 L 1.15625 -7 L 2.3125 -7 L 2.3125 -5.90625 C 2.5625 -6.332031 2.878906 -6.648438 3.265625 -6.859375 C 3.648438 -7.066406 4.117188 -7.171875 4.671875 -7.171875 C 4.753906 -7.171875 4.84375 -7.164062 4.9375 -7.15625 C 5.03125 -7.144531 5.132812 -7.128906 5.25 -7.109375 Z M 5.265625 -5.921875 "
+ id="path1788" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph0-19">
+ <path
+ style="stroke:none;"
+ d="M 3.890625 -9.71875 L 3.890625 1.6875 L 1.25 1.6875 L 1.25 0.796875 L 2.734375 0.796875 L 2.734375 -8.828125 L 1.25 -8.828125 L 1.25 -9.71875 Z M 3.890625 -9.71875 "
+ id="path1791" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph0-20">
+ <path
+ style="stroke:none;"
+ d="M 4.0625 -8.5 C 3.414062 -8.5 2.925781 -8.175781 2.59375 -7.53125 C 2.269531 -6.894531 2.109375 -5.9375 2.109375 -4.65625 C 2.109375 -3.375 2.269531 -2.410156 2.59375 -1.765625 C 2.925781 -1.128906 3.414062 -0.8125 4.0625 -0.8125 C 4.71875 -0.8125 5.207031 -1.128906 5.53125 -1.765625 C 5.863281 -2.410156 6.03125 -3.375 6.03125 -4.65625 C 6.03125 -5.9375 5.863281 -6.894531 5.53125 -7.53125 C 5.207031 -8.175781 4.71875 -8.5 4.0625 -8.5 Z M 4.0625 -9.5 C 5.113281 -9.5 5.914062 -9.082031 6.46875 -8.25 C 7.019531 -7.425781 7.296875 -6.226562 7.296875 -4.65625 C 7.296875 -3.082031 7.019531 -1.878906 6.46875 -1.046875 C 5.914062 -0.222656 5.113281 0.1875 4.0625 0.1875 C 3.019531 0.1875 2.222656 -0.222656 1.671875 -1.046875 C 1.117188 -1.878906 0.84375 -3.082031 0.84375 -4.65625 C 0.84375 -6.226562 1.117188 -7.425781 1.671875 -8.25 C 2.222656 -9.082031 3.019531 -9.5 4.0625 -9.5 Z M 4.0625 -9.5 "
+ id="path1794" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph0-21">
+ <path
+ style="stroke:none;"
+ d="M 5.8125 -5.9375 L 5.8125 -9.71875 L 6.953125 -9.71875 L 6.953125 0 L 5.8125 0 L 5.8125 -1.046875 C 5.570312 -0.628906 5.265625 -0.316406 4.890625 -0.109375 C 4.523438 0.0859375 4.082031 0.1875 3.5625 0.1875 C 2.71875 0.1875 2.03125 -0.148438 1.5 -0.828125 C 0.96875 -1.503906 0.703125 -2.394531 0.703125 -3.5 C 0.703125 -4.59375 0.96875 -5.476562 1.5 -6.15625 C 2.03125 -6.832031 2.71875 -7.171875 3.5625 -7.171875 C 4.082031 -7.171875 4.523438 -7.066406 4.890625 -6.859375 C 5.265625 -6.660156 5.570312 -6.351562 5.8125 -5.9375 Z M 1.890625 -3.5 C 1.890625 -2.644531 2.0625 -1.976562 2.40625 -1.5 C 2.757812 -1.019531 3.238281 -0.78125 3.84375 -0.78125 C 4.457031 -0.78125 4.9375 -1.019531 5.28125 -1.5 C 5.632812 -1.976562 5.8125 -2.644531 5.8125 -3.5 C 5.8125 -4.34375 5.632812 -5.003906 5.28125 -5.484375 C 4.9375 -5.960938 4.457031 -6.203125 3.84375 -6.203125 C 3.238281 -6.203125 2.757812 -5.960938 2.40625 -5.484375 C 2.0625 -5.003906 1.890625 -4.34375 1.890625 -3.5 Z M 1.890625 -3.5 "
+ id="path1797" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph0-22">
+ <path
+ style="stroke:none;"
+ d="M 1.203125 -7 L 2.359375 -7 L 2.359375 0.125 C 2.359375 1.019531 2.1875 1.664062 1.84375 2.0625 C 1.507812 2.457031 0.960938 2.65625 0.203125 2.65625 L -0.234375 2.65625 L -0.234375 1.6875 L 0.078125 1.6875 C 0.515625 1.6875 0.8125 1.582031 0.96875 1.375 C 1.125 1.175781 1.203125 0.757812 1.203125 0.125 Z M 1.203125 -9.71875 L 2.359375 -9.71875 L 2.359375 -8.265625 L 1.203125 -8.265625 Z M 1.203125 -9.71875 "
+ id="path1800" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph0-23">
+ <path
+ style="stroke:none;"
+ d="M 1.09375 -2.765625 L 1.09375 -7 L 2.234375 -7 L 2.234375 -2.8125 C 2.234375 -2.144531 2.363281 -1.644531 2.625 -1.3125 C 2.882812 -0.976562 3.269531 -0.8125 3.78125 -0.8125 C 4.40625 -0.8125 4.894531 -1.007812 5.25 -1.40625 C 5.613281 -1.800781 5.796875 -2.34375 5.796875 -3.03125 L 5.796875 -7 L 6.953125 -7 L 6.953125 0 L 5.796875 0 L 5.796875 -1.078125 C 5.515625 -0.648438 5.191406 -0.332031 4.828125 -0.125 C 4.460938 0.0820312 4.035156 0.1875 3.546875 0.1875 C 2.742188 0.1875 2.132812 -0.0625 1.71875 -0.5625 C 1.300781 -1.0625 1.09375 -1.796875 1.09375 -2.765625 Z M 3.984375 -7.171875 Z M 3.984375 -7.171875 "
+ id="path1803" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph0-24">
+ <path
+ style="stroke:none;"
+ d="M 6.515625 2.125 L 6.515625 3.015625 L -0.125 3.015625 L -0.125 2.125 Z M 6.515625 2.125 "
+ id="path1806" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph0-25">
+ <path
+ style="stroke:none;"
+ d="M 7.1875 -3.78125 L 7.1875 -3.21875 L 1.90625 -3.21875 C 1.957031 -2.425781 2.195312 -1.820312 2.625 -1.40625 C 3.050781 -1 3.644531 -0.796875 4.40625 -0.796875 C 4.84375 -0.796875 5.269531 -0.847656 5.6875 -0.953125 C 6.101562 -1.066406 6.515625 -1.226562 6.921875 -1.4375 L 6.921875 -0.359375 C 6.515625 -0.179688 6.09375 -0.046875 5.65625 0.046875 C 5.21875 0.140625 4.78125 0.1875 4.34375 0.1875 C 3.21875 0.1875 2.328125 -0.132812 1.671875 -0.78125 C 1.023438 -1.4375 0.703125 -2.320312 0.703125 -3.4375 C 0.703125 -4.582031 1.007812 -5.488281 1.625 -6.15625 C 2.25 -6.832031 3.085938 -7.171875 4.140625 -7.171875 C 5.078125 -7.171875 5.816406 -6.863281 6.359375 -6.25 C 6.910156 -5.644531 7.1875 -4.820312 7.1875 -3.78125 Z M 6.046875 -4.125 C 6.035156 -4.75 5.859375 -5.25 5.515625 -5.625 C 5.171875 -6 4.71875 -6.1875 4.15625 -6.1875 C 3.507812 -6.1875 2.992188 -6.003906 2.609375 -5.640625 C 2.222656 -5.285156 2 -4.78125 1.9375 -4.125 Z M 6.046875 -4.125 "
+ id="path1809" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph0-26">
+ <path
+ style="stroke:none;"
+ d="M 6.25 -6.734375 L 6.25 -5.65625 C 5.914062 -5.832031 5.585938 -5.960938 5.265625 -6.046875 C 4.941406 -6.140625 4.613281 -6.1875 4.28125 -6.1875 C 3.53125 -6.1875 2.945312 -5.953125 2.53125 -5.484375 C 2.125 -5.015625 1.921875 -4.351562 1.921875 -3.5 C 1.921875 -2.644531 2.125 -1.976562 2.53125 -1.5 C 2.945312 -1.03125 3.53125 -0.796875 4.28125 -0.796875 C 4.613281 -0.796875 4.941406 -0.835938 5.265625 -0.921875 C 5.585938 -1.015625 5.914062 -1.148438 6.25 -1.328125 L 6.25 -0.265625 C 5.925781 -0.117188 5.59375 -0.0078125 5.25 0.0625 C 4.90625 0.144531 4.539062 0.1875 4.15625 0.1875 C 3.09375 0.1875 2.25 -0.144531 1.625 -0.8125 C 1.007812 -1.476562 0.703125 -2.375 0.703125 -3.5 C 0.703125 -4.632812 1.015625 -5.53125 1.640625 -6.1875 C 2.273438 -6.84375 3.132812 -7.171875 4.21875 -7.171875 C 4.570312 -7.171875 4.914062 -7.132812 5.25 -7.0625 C 5.59375 -6.988281 5.925781 -6.878906 6.25 -6.734375 Z M 6.25 -6.734375 "
+ id="path1812" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph0-27">
+ <path
+ style="stroke:none;"
+ d="M 3.921875 -6.1875 C 3.304688 -6.1875 2.816406 -5.945312 2.453125 -5.46875 C 2.097656 -4.988281 1.921875 -4.332031 1.921875 -3.5 C 1.921875 -2.65625 2.097656 -1.992188 2.453125 -1.515625 C 2.804688 -1.035156 3.296875 -0.796875 3.921875 -0.796875 C 4.535156 -0.796875 5.019531 -1.035156 5.375 -1.515625 C 5.726562 -2.003906 5.90625 -2.664062 5.90625 -3.5 C 5.90625 -4.320312 5.726562 -4.972656 5.375 -5.453125 C 5.019531 -5.941406 4.535156 -6.1875 3.921875 -6.1875 Z M 3.921875 -7.171875 C 4.921875 -7.171875 5.703125 -6.84375 6.265625 -6.1875 C 6.835938 -5.539062 7.125 -4.644531 7.125 -3.5 C 7.125 -2.351562 6.835938 -1.453125 6.265625 -0.796875 C 5.703125 -0.140625 4.921875 0.1875 3.921875 0.1875 C 2.910156 0.1875 2.117188 -0.140625 1.546875 -0.796875 C 0.984375 -1.453125 0.703125 -2.351562 0.703125 -3.5 C 0.703125 -4.644531 0.984375 -5.539062 1.546875 -6.1875 C 2.117188 -6.84375 2.910156 -7.171875 3.921875 -7.171875 Z M 3.921875 -7.171875 "
+ id="path1815" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph0-28">
+ <path
+ style="stroke:none;"
+ d="M 3.96875 -9.703125 C 3.40625 -8.742188 2.988281 -7.796875 2.71875 -6.859375 C 2.445312 -5.929688 2.3125 -4.984375 2.3125 -4.015625 C 2.3125 -3.054688 2.445312 -2.101562 2.71875 -1.15625 C 3 -0.21875 3.414062 0.726562 3.96875 1.6875 L 2.96875 1.6875 C 2.34375 0.707031 1.875 -0.253906 1.5625 -1.203125 C 1.25 -2.148438 1.09375 -3.085938 1.09375 -4.015625 C 1.09375 -4.941406 1.25 -5.875 1.5625 -6.8125 C 1.875 -7.757812 2.34375 -8.722656 2.96875 -9.703125 Z M 3.96875 -9.703125 "
+ id="path1818" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph0-29">
+ <path
+ style="stroke:none;"
+ d="M 1.03125 -9.703125 L 2.03125 -9.703125 C 2.65625 -8.722656 3.117188 -7.757812 3.421875 -6.8125 C 3.734375 -5.875 3.890625 -4.941406 3.890625 -4.015625 C 3.890625 -3.085938 3.734375 -2.148438 3.421875 -1.203125 C 3.117188 -0.253906 2.65625 0.707031 2.03125 1.6875 L 1.03125 1.6875 C 1.582031 0.726562 1.992188 -0.21875 2.265625 -1.15625 C 2.535156 -2.101562 2.671875 -3.054688 2.671875 -4.015625 C 2.671875 -4.984375 2.535156 -5.929688 2.265625 -6.859375 C 1.992188 -7.796875 1.582031 -8.742188 1.03125 -9.703125 Z M 1.03125 -9.703125 "
+ id="path1821" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph0-30">
+ <path
+ style="stroke:none;"
+ d="M 4.0625 -4.4375 C 3.46875 -4.4375 3 -4.273438 2.65625 -3.953125 C 2.3125 -3.628906 2.140625 -3.1875 2.140625 -2.625 C 2.140625 -2.0625 2.3125 -1.617188 2.65625 -1.296875 C 3 -0.972656 3.46875 -0.8125 4.0625 -0.8125 C 4.664062 -0.8125 5.140625 -0.972656 5.484375 -1.296875 C 5.828125 -1.617188 6 -2.0625 6 -2.625 C 6 -3.1875 5.828125 -3.628906 5.484375 -3.953125 C 5.140625 -4.273438 4.664062 -4.4375 4.0625 -4.4375 Z M 2.8125 -4.96875 C 2.269531 -5.101562 1.847656 -5.351562 1.546875 -5.71875 C 1.242188 -6.09375 1.09375 -6.546875 1.09375 -7.078125 C 1.09375 -7.828125 1.359375 -8.414062 1.890625 -8.84375 C 2.421875 -9.28125 3.144531 -9.5 4.0625 -9.5 C 5 -9.5 5.726562 -9.28125 6.25 -8.84375 C 6.78125 -8.414062 7.046875 -7.828125 7.046875 -7.078125 C 7.046875 -6.546875 6.894531 -6.09375 6.59375 -5.71875 C 6.289062 -5.351562 5.875 -5.101562 5.34375 -4.96875 C 5.945312 -4.820312 6.414062 -4.539062 6.75 -4.125 C 7.09375 -3.71875 7.265625 -3.21875 7.265625 -2.625 C 7.265625 -1.71875 6.988281 -1.019531 6.4375 -0.53125 C 5.882812 -0.0507812 5.09375 0.1875 4.0625 0.1875 C 3.039062 0.1875 2.253906 -0.0507812 1.703125 -0.53125 C 1.148438 -1.019531 0.875 -1.71875 0.875 -2.625 C 0.875 -3.21875 1.039062 -3.71875 1.375 -4.125 C 1.71875 -4.539062 2.195312 -4.820312 2.8125 -4.96875 Z M 2.34375 -6.953125 C 2.34375 -6.472656 2.492188 -6.097656 2.796875 -5.828125 C 3.097656 -5.554688 3.519531 -5.421875 4.0625 -5.421875 C 4.601562 -5.421875 5.023438 -5.554688 5.328125 -5.828125 C 5.640625 -6.097656 5.796875 -6.472656 5.796875 -6.953125 C 5.796875 -7.441406 5.640625 -7.820312 5.328125 -8.09375 C 5.023438 -8.363281 4.601562 -8.5 4.0625 -8.5 C 3.519531 -8.5 3.097656 -8.363281 2.796875 -8.09375 C 2.492188 -7.820312 2.34375 -7.441406 2.34375 -6.953125 Z M 2.34375 -6.953125 "
+ id="path1824" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph0-31">
+ <path
+ style="stroke:none;"
+ d="M 1.9375 -1.59375 L 3.203125 -1.59375 L 3.203125 0 L 1.9375 0 Z M 1.9375 -9.328125 L 3.203125 -9.328125 L 3.203125 -5.234375 L 3.078125 -3 L 2.0625 -3 L 1.9375 -5.234375 Z M 1.9375 -9.328125 "
+ id="path1827" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph0-32">
+ <path
+ style="stroke:none;"
+ d="M 1.359375 -5.8125 L 9.359375 -5.8125 L 9.359375 -4.765625 L 1.359375 -4.765625 Z M 1.359375 -3.265625 L 9.359375 -3.265625 L 9.359375 -2.203125 L 1.359375 -2.203125 Z M 1.359375 -3.265625 "
+ id="path1830" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph0-33">
+ <path
+ style="stroke:none;"
+ d="M 4.75 -9.71875 L 4.75 -8.765625 L 3.65625 -8.765625 C 3.238281 -8.765625 2.945312 -8.679688 2.78125 -8.515625 C 2.625 -8.347656 2.546875 -8.046875 2.546875 -7.609375 L 2.546875 -7 L 4.4375 -7 L 4.4375 -6.109375 L 2.546875 -6.109375 L 2.546875 0 L 1.390625 0 L 1.390625 -6.109375 L 0.296875 -6.109375 L 0.296875 -7 L 1.390625 -7 L 1.390625 -7.484375 C 1.390625 -8.265625 1.570312 -8.832031 1.9375 -9.1875 C 2.300781 -9.539062 2.875 -9.71875 3.65625 -9.71875 Z M 4.75 -9.71875 "
+ id="path1833" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph0-34">
+ <path
+ style="stroke:none;"
+ d="M 2.296875 -9.328125 L 2.296875 -5.859375 L 1.234375 -5.859375 L 1.234375 -9.328125 Z M 4.65625 -9.328125 L 4.65625 -5.859375 L 3.59375 -5.859375 L 3.59375 -9.328125 Z M 4.65625 -9.328125 "
+ id="path1836" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph1-0">
+ <path
+ style="stroke:none;"
+ d="M 0.984375 3.484375 L 0.984375 -13.921875 L 10.859375 -13.921875 L 10.859375 3.484375 Z M 2.09375 2.390625 L 9.765625 2.390625 L 9.765625 -12.8125 L 2.09375 -12.8125 Z M 2.09375 2.390625 "
+ id="path1839" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph1-1">
+ <path
+ style="stroke:none;"
+ d="M 12.515625 -6.578125 L 12.515625 0 L 9.046875 0 L 9.046875 -5.03125 C 9.046875 -5.96875 9.023438 -6.613281 8.984375 -6.96875 C 8.941406 -7.320312 8.867188 -7.582031 8.765625 -7.75 C 8.628906 -7.96875 8.445312 -8.140625 8.21875 -8.265625 C 7.988281 -8.390625 7.722656 -8.453125 7.421875 -8.453125 C 6.703125 -8.453125 6.132812 -8.175781 5.71875 -7.625 C 5.3125 -7.070312 5.109375 -6.300781 5.109375 -5.3125 L 5.109375 0 L 1.65625 0 L 1.65625 -10.796875 L 5.109375 -10.796875 L 5.109375 -9.21875 C 5.628906 -9.851562 6.179688 -10.316406 6.765625 -10.609375 C 7.347656 -10.910156 7.992188 -11.0625 8.703125 -11.0625 C 9.953125 -11.0625 10.898438 -10.675781 11.546875 -9.90625 C 12.191406 -9.144531 12.515625 -8.035156 12.515625 -6.578125 Z M 12.515625 -6.578125 "
+ id="path1842" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph1-2">
+ <path
+ style="stroke:none;"
+ d="M 5.109375 -1.5625 L 5.109375 4.109375 L 1.65625 4.109375 L 1.65625 -10.796875 L 5.109375 -10.796875 L 5.109375 -9.21875 C 5.585938 -9.851562 6.113281 -10.316406 6.6875 -10.609375 C 7.269531 -10.910156 7.9375 -11.0625 8.6875 -11.0625 C 10.019531 -11.0625 11.113281 -10.53125 11.96875 -9.46875 C 12.820312 -8.414062 13.25 -7.054688 13.25 -5.390625 C 13.25 -3.722656 12.820312 -2.359375 11.96875 -1.296875 C 11.113281 -0.242188 10.019531 0.28125 8.6875 0.28125 C 7.9375 0.28125 7.269531 0.128906 6.6875 -0.171875 C 6.113281 -0.472656 5.585938 -0.9375 5.109375 -1.5625 Z M 7.40625 -8.546875 C 6.664062 -8.546875 6.097656 -8.273438 5.703125 -7.734375 C 5.304688 -7.191406 5.109375 -6.410156 5.109375 -5.390625 C 5.109375 -4.367188 5.304688 -3.585938 5.703125 -3.046875 C 6.097656 -2.503906 6.664062 -2.234375 7.40625 -2.234375 C 8.144531 -2.234375 8.707031 -2.5 9.09375 -3.03125 C 9.488281 -3.570312 9.6875 -4.359375 9.6875 -5.390625 C 9.6875 -6.421875 9.488281 -7.203125 9.09375 -7.734375 C 8.707031 -8.273438 8.144531 -8.546875 7.40625 -8.546875 Z M 7.40625 -8.546875 "
+ id="path1845" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph1-3">
+ <path
+ style="stroke:none;"
+ d="M 2.015625 -3.734375 L 5.484375 -3.734375 L 5.484375 0 L 2.015625 0 Z M 2.015625 -3.734375 "
+ id="path1848" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph1-4">
+ <path
+ style="stroke:none;"
+ d="M 6.5 -4.859375 C 5.78125 -4.859375 5.238281 -4.734375 4.875 -4.484375 C 4.507812 -4.242188 4.328125 -3.882812 4.328125 -3.40625 C 4.328125 -2.976562 4.472656 -2.640625 4.765625 -2.390625 C 5.054688 -2.140625 5.460938 -2.015625 5.984375 -2.015625 C 6.640625 -2.015625 7.1875 -2.242188 7.625 -2.703125 C 8.070312 -3.171875 8.296875 -3.757812 8.296875 -4.46875 L 8.296875 -4.859375 Z M 11.78125 -6.15625 L 11.78125 0 L 8.296875 0 L 8.296875 -1.59375 C 7.828125 -0.945312 7.300781 -0.472656 6.71875 -0.171875 C 6.144531 0.128906 5.445312 0.28125 4.625 0.28125 C 3.5 0.28125 2.585938 -0.0390625 1.890625 -0.6875 C 1.191406 -1.34375 0.84375 -2.191406 0.84375 -3.234375 C 0.84375 -4.503906 1.28125 -5.4375 2.15625 -6.03125 C 3.03125 -6.625 4.398438 -6.921875 6.265625 -6.921875 L 8.296875 -6.921875 L 8.296875 -7.1875 C 8.296875 -7.726562 8.078125 -8.125 7.640625 -8.375 C 7.210938 -8.632812 6.539062 -8.765625 5.625 -8.765625 C 4.882812 -8.765625 4.195312 -8.691406 3.5625 -8.546875 C 2.925781 -8.398438 2.335938 -8.175781 1.796875 -7.875 L 1.796875 -10.515625 C 2.535156 -10.691406 3.273438 -10.828125 4.015625 -10.921875 C 4.765625 -11.015625 5.515625 -11.0625 6.265625 -11.0625 C 8.210938 -11.0625 9.617188 -10.675781 10.484375 -9.90625 C 11.347656 -9.132812 11.78125 -7.882812 11.78125 -6.15625 Z M 11.78125 -6.15625 "
+ id="path1851" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph1-5">
+ <path
+ style="stroke:none;"
+ d="M 9.6875 -7.859375 C 9.382812 -8.003906 9.082031 -8.109375 8.78125 -8.171875 C 8.476562 -8.242188 8.175781 -8.28125 7.875 -8.28125 C 6.988281 -8.28125 6.304688 -7.992188 5.828125 -7.421875 C 5.347656 -6.847656 5.109375 -6.03125 5.109375 -4.96875 L 5.109375 0 L 1.65625 0 L 1.65625 -10.796875 L 5.109375 -10.796875 L 5.109375 -9.03125 C 5.554688 -9.738281 6.066406 -10.253906 6.640625 -10.578125 C 7.210938 -10.898438 7.898438 -11.0625 8.703125 -11.0625 C 8.816406 -11.0625 8.941406 -11.054688 9.078125 -11.046875 C 9.210938 -11.035156 9.410156 -11.015625 9.671875 -10.984375 Z M 9.6875 -7.859375 "
+ id="path1854" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph1-6">
+ <path
+ style="stroke:none;"
+ d="M 0.234375 -10.796875 L 3.6875 -10.796875 L 6.59375 -3.46875 L 9.0625 -10.796875 L 12.515625 -10.796875 L 7.96875 1.015625 C 7.519531 2.222656 6.988281 3.066406 6.375 3.546875 C 5.769531 4.023438 4.96875 4.265625 3.96875 4.265625 L 1.984375 4.265625 L 1.984375 2 L 3.0625 2 C 3.644531 2 4.066406 1.90625 4.328125 1.71875 C 4.597656 1.53125 4.804688 1.195312 4.953125 0.71875 L 5.046875 0.421875 Z M 0.234375 -10.796875 "
+ id="path1857" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph1-7">
+ <path
+ style="stroke:none;"
+ d="M 7.4375 2.609375 L 4.578125 2.609375 C 3.597656 1.015625 2.875 -0.492188 2.40625 -1.921875 C 1.9375 -3.347656 1.703125 -4.769531 1.703125 -6.1875 C 1.703125 -7.59375 1.9375 -9.015625 2.40625 -10.453125 C 2.875 -11.898438 3.597656 -13.410156 4.578125 -14.984375 L 7.4375 -14.984375 C 6.613281 -13.460938 5.992188 -11.972656 5.578125 -10.515625 C 5.171875 -9.054688 4.96875 -7.617188 4.96875 -6.203125 C 4.96875 -4.773438 5.171875 -3.332031 5.578125 -1.875 C 5.992188 -0.414062 6.613281 1.078125 7.4375 2.609375 Z M 7.4375 2.609375 "
+ id="path1860" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph1-8">
+ <path
+ style="stroke:none;"
+ d="M 7.265625 -11.34375 L 3.203125 -5.3125 L 7.265625 -5.3125 Z M 6.65625 -14.390625 L 10.78125 -14.390625 L 10.78125 -5.3125 L 12.828125 -5.3125 L 12.828125 -2.625 L 10.78125 -2.625 L 10.78125 0 L 7.265625 0 L 7.265625 -2.625 L 0.890625 -2.625 L 0.890625 -5.8125 Z M 6.65625 -14.390625 "
+ id="path1863" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph1-9">
+ <path
+ style="stroke:none;"
+ d="M 5.6875 -2.734375 L 12.03125 -2.734375 L 12.03125 0 L 1.5625 0 L 1.5625 -2.734375 L 6.8125 -7.375 C 7.28125 -7.789062 7.628906 -8.203125 7.859375 -8.609375 C 8.085938 -9.015625 8.203125 -9.4375 8.203125 -9.875 C 8.203125 -10.550781 7.972656 -11.09375 7.515625 -11.5 C 7.066406 -11.914062 6.460938 -12.125 5.703125 -12.125 C 5.128906 -12.125 4.5 -12 3.8125 -11.75 C 3.125 -11.5 2.382812 -11.128906 1.59375 -10.640625 L 1.59375 -13.8125 C 2.4375 -14.082031 3.265625 -14.289062 4.078125 -14.4375 C 4.890625 -14.582031 5.691406 -14.65625 6.484375 -14.65625 C 8.203125 -14.65625 9.535156 -14.273438 10.484375 -13.515625 C 11.441406 -12.753906 11.921875 -11.695312 11.921875 -10.34375 C 11.921875 -9.5625 11.71875 -8.832031 11.3125 -8.15625 C 10.914062 -7.476562 10.066406 -6.566406 8.765625 -5.421875 Z M 5.6875 -2.734375 "
+ id="path1866" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph1-10">
+ <path
+ style="stroke:none;"
+ d="M 2.015625 -3.734375 L 5.484375 -3.734375 L 5.484375 -0.796875 L 3.109375 2.8125 L 1.046875 2.8125 L 2.015625 -0.796875 Z M 2.015625 -3.734375 "
+ id="path1869" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph1-11">
+ <path
+ style="stroke:none;"
+ d=""
+ id="path1872" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph1-12">
+ <path
+ style="stroke:none;"
+ d="M 9 -9.21875 L 9 -15 L 12.484375 -15 L 12.484375 0 L 9 0 L 9 -1.5625 C 8.53125 -0.925781 8.007812 -0.457031 7.4375 -0.15625 C 6.863281 0.132812 6.203125 0.28125 5.453125 0.28125 C 4.117188 0.28125 3.023438 -0.242188 2.171875 -1.296875 C 1.316406 -2.359375 0.890625 -3.722656 0.890625 -5.390625 C 0.890625 -7.054688 1.316406 -8.414062 2.171875 -9.46875 C 3.023438 -10.53125 4.117188 -11.0625 5.453125 -11.0625 C 6.191406 -11.0625 6.847656 -10.910156 7.421875 -10.609375 C 8.003906 -10.316406 8.53125 -9.851562 9 -9.21875 Z M 6.734375 -2.234375 C 7.472656 -2.234375 8.035156 -2.5 8.421875 -3.03125 C 8.804688 -3.570312 9 -4.359375 9 -5.390625 C 9 -6.421875 8.804688 -7.203125 8.421875 -7.734375 C 8.035156 -8.273438 7.472656 -8.546875 6.734375 -8.546875 C 5.992188 -8.546875 5.429688 -8.273438 5.046875 -7.734375 C 4.660156 -7.203125 4.46875 -6.421875 4.46875 -5.390625 C 4.46875 -4.359375 4.660156 -3.570312 5.046875 -3.03125 C 5.429688 -2.5 5.992188 -2.234375 6.734375 -2.234375 Z M 6.734375 -2.234375 "
+ id="path1875" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph1-13">
+ <path
+ style="stroke:none;"
+ d="M 5.421875 -13.875 L 5.421875 -10.796875 L 8.984375 -10.796875 L 8.984375 -8.328125 L 5.421875 -8.328125 L 5.421875 -3.75 C 5.421875 -3.25 5.519531 -2.910156 5.71875 -2.734375 C 5.925781 -2.554688 6.328125 -2.46875 6.921875 -2.46875 L 8.6875 -2.46875 L 8.6875 0 L 5.734375 0 C 4.367188 0 3.398438 -0.28125 2.828125 -0.84375 C 2.265625 -1.414062 1.984375 -2.382812 1.984375 -3.75 L 1.984375 -8.328125 L 0.265625 -8.328125 L 0.265625 -10.796875 L 1.984375 -10.796875 L 1.984375 -13.875 Z M 5.421875 -13.875 "
+ id="path1878" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph1-14">
+ <path
+ style="stroke:none;"
+ d="M 12.4375 -5.421875 L 12.4375 -4.453125 L 4.375 -4.453125 C 4.457031 -3.640625 4.75 -3.03125 5.25 -2.625 C 5.75 -2.21875 6.445312 -2.015625 7.34375 -2.015625 C 8.070312 -2.015625 8.816406 -2.117188 9.578125 -2.328125 C 10.335938 -2.546875 11.117188 -2.875 11.921875 -3.3125 L 11.921875 -0.65625 C 11.109375 -0.34375 10.289062 -0.109375 9.46875 0.046875 C 8.65625 0.203125 7.84375 0.28125 7.03125 0.28125 C 5.070312 0.28125 3.550781 -0.210938 2.46875 -1.203125 C 1.382812 -2.203125 0.84375 -3.597656 0.84375 -5.390625 C 0.84375 -7.148438 1.375 -8.535156 2.4375 -9.546875 C 3.507812 -10.554688 4.976562 -11.0625 6.84375 -11.0625 C 8.539062 -11.0625 9.894531 -10.550781 10.90625 -9.53125 C 11.925781 -8.507812 12.4375 -7.140625 12.4375 -5.421875 Z M 8.890625 -6.578125 C 8.890625 -7.234375 8.695312 -7.757812 8.3125 -8.15625 C 7.9375 -8.5625 7.4375 -8.765625 6.8125 -8.765625 C 6.144531 -8.765625 5.601562 -8.578125 5.1875 -8.203125 C 4.769531 -7.828125 4.507812 -7.285156 4.40625 -6.578125 Z M 8.890625 -6.578125 "
+ id="path1881" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph1-15">
+ <path
+ style="stroke:none;"
+ d="M 2.09375 -9.515625 L 14.453125 -9.515625 L 14.453125 -7.25 L 2.09375 -7.25 Z M 2.09375 -5.125 L 14.453125 -5.125 L 14.453125 -2.84375 L 2.09375 -2.84375 Z M 2.09375 -5.125 "
+ id="path1884" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph1-16">
+ <path
+ style="stroke:none;"
+ d="M 1.65625 -10.796875 L 5.109375 -10.796875 L 5.109375 0 L 1.65625 0 Z M 1.65625 -15 L 5.109375 -15 L 5.109375 -12.1875 L 1.65625 -12.1875 Z M 1.65625 -15 "
+ id="path1887" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph1-17">
+ <path
+ style="stroke:none;"
+ d="M 1.578125 2.609375 C 2.398438 1.078125 3.015625 -0.414062 3.421875 -1.875 C 3.835938 -3.332031 4.046875 -4.773438 4.046875 -6.203125 C 4.046875 -7.617188 3.835938 -9.054688 3.421875 -10.515625 C 3.015625 -11.972656 2.398438 -13.460938 1.578125 -14.984375 L 4.453125 -14.984375 C 5.421875 -13.410156 6.140625 -11.898438 6.609375 -10.453125 C 7.085938 -9.015625 7.328125 -7.59375 7.328125 -6.1875 C 7.328125 -4.769531 7.09375 -3.347656 6.625 -1.921875 C 6.15625 -0.492188 5.429688 1.015625 4.453125 2.609375 Z M 1.578125 2.609375 "
+ id="path1890" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph1-18">
+ <path
+ style="stroke:none;"
+ d="M 10.09375 -10.46875 L 10.09375 -7.84375 C 9.351562 -8.144531 8.640625 -8.375 7.953125 -8.53125 C 7.265625 -8.6875 6.617188 -8.765625 6.015625 -8.765625 C 5.359375 -8.765625 4.867188 -8.679688 4.546875 -8.515625 C 4.222656 -8.359375 4.0625 -8.109375 4.0625 -7.765625 C 4.0625 -7.484375 4.179688 -7.269531 4.421875 -7.125 C 4.671875 -6.976562 5.109375 -6.867188 5.734375 -6.796875 L 6.328125 -6.71875 C 8.097656 -6.488281 9.285156 -6.113281 9.890625 -5.59375 C 10.503906 -5.082031 10.8125 -4.28125 10.8125 -3.1875 C 10.8125 -2.03125 10.390625 -1.160156 9.546875 -0.578125 C 8.703125 -0.00390625 7.4375 0.28125 5.75 0.28125 C 5.03125 0.28125 4.289062 0.222656 3.53125 0.109375 C 2.769531 -0.00390625 1.988281 -0.171875 1.1875 -0.390625 L 1.1875 -3.015625 C 1.875 -2.679688 2.578125 -2.429688 3.296875 -2.265625 C 4.023438 -2.097656 4.757812 -2.015625 5.5 -2.015625 C 6.175781 -2.015625 6.6875 -2.109375 7.03125 -2.296875 C 7.375 -2.484375 7.546875 -2.757812 7.546875 -3.125 C 7.546875 -3.4375 7.425781 -3.664062 7.1875 -3.8125 C 6.957031 -3.96875 6.488281 -4.085938 5.78125 -4.171875 L 5.171875 -4.25 C 3.640625 -4.4375 2.5625 -4.789062 1.9375 -5.3125 C 1.320312 -5.832031 1.015625 -6.625 1.015625 -7.6875 C 1.015625 -8.832031 1.40625 -9.679688 2.1875 -10.234375 C 2.976562 -10.785156 4.1875 -11.0625 5.8125 -11.0625 C 6.445312 -11.0625 7.113281 -11.007812 7.8125 -10.90625 C 8.507812 -10.8125 9.269531 -10.664062 10.09375 -10.46875 Z M 10.09375 -10.46875 "
+ id="path1893" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph1-19">
+ <path
+ style="stroke:none;"
+ d="M 8.40625 -14.390625 L 8.40625 -9.046875 L 6.125 -9.046875 L 6.125 -14.390625 Z M 4.171875 -14.390625 L 4.171875 -9.046875 L 1.875 -9.046875 L 1.875 -14.390625 Z M 4.171875 -14.390625 "
+ id="path1896" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph1-20">
+ <path
+ style="stroke:none;"
+ d="M 11.828125 -13.9375 L 11.828125 -10.890625 C 11.035156 -11.242188 10.265625 -11.507812 9.515625 -11.6875 C 8.765625 -11.875 8.054688 -11.96875 7.390625 -11.96875 C 6.503906 -11.96875 5.847656 -11.84375 5.421875 -11.59375 C 4.992188 -11.351562 4.78125 -10.976562 4.78125 -10.46875 C 4.78125 -10.082031 4.921875 -9.78125 5.203125 -9.5625 C 5.492188 -9.34375 6.015625 -9.15625 6.765625 -9 L 8.34375 -8.6875 C 9.945312 -8.363281 11.085938 -7.875 11.765625 -7.21875 C 12.441406 -6.5625 12.78125 -5.628906 12.78125 -4.421875 C 12.78125 -2.835938 12.304688 -1.65625 11.359375 -0.875 C 10.421875 -0.101562 8.984375 0.28125 7.046875 0.28125 C 6.140625 0.28125 5.222656 0.191406 4.296875 0.015625 C 3.378906 -0.148438 2.460938 -0.40625 1.546875 -0.75 L 1.546875 -3.890625 C 2.460938 -3.398438 3.347656 -3.03125 4.203125 -2.78125 C 5.066406 -2.53125 5.894531 -2.40625 6.6875 -2.40625 C 7.5 -2.40625 8.117188 -2.539062 8.546875 -2.8125 C 8.984375 -3.082031 9.203125 -3.46875 9.203125 -3.96875 C 9.203125 -4.414062 9.054688 -4.757812 8.765625 -5 C 8.472656 -5.25 7.890625 -5.472656 7.015625 -5.671875 L 5.578125 -5.984375 C 4.128906 -6.296875 3.070312 -6.789062 2.40625 -7.46875 C 1.75 -8.144531 1.421875 -9.050781 1.421875 -10.1875 C 1.421875 -11.625 1.878906 -12.726562 2.796875 -13.5 C 3.722656 -14.269531 5.054688 -14.65625 6.796875 -14.65625 C 7.585938 -14.65625 8.398438 -14.59375 9.234375 -14.46875 C 10.078125 -14.351562 10.941406 -14.175781 11.828125 -13.9375 Z M 11.828125 -13.9375 "
+ id="path1899" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph1-21">
+ <path
+ style="stroke:none;"
+ d="M 9.078125 -7.21875 C 9.078125 -9.007812 8.910156 -10.273438 8.578125 -11.015625 C 8.242188 -11.753906 7.675781 -12.125 6.875 -12.125 C 6.082031 -12.125 5.515625 -11.753906 5.171875 -11.015625 C 4.828125 -10.273438 4.65625 -9.007812 4.65625 -7.21875 C 4.65625 -5.394531 4.828125 -4.109375 5.171875 -3.359375 C 5.515625 -2.617188 6.082031 -2.25 6.875 -2.25 C 7.664062 -2.25 8.226562 -2.617188 8.5625 -3.359375 C 8.90625 -4.109375 9.078125 -5.394531 9.078125 -7.21875 Z M 12.796875 -7.1875 C 12.796875 -4.800781 12.28125 -2.957031 11.25 -1.65625 C 10.226562 -0.363281 8.769531 0.28125 6.875 0.28125 C 4.976562 0.28125 3.515625 -0.363281 2.484375 -1.65625 C 1.453125 -2.957031 0.9375 -4.800781 0.9375 -7.1875 C 0.9375 -9.570312 1.453125 -11.410156 2.484375 -12.703125 C 3.515625 -14.003906 4.976562 -14.65625 6.875 -14.65625 C 8.769531 -14.65625 10.226562 -14.003906 11.25 -12.703125 C 12.28125 -11.410156 12.796875 -9.570312 12.796875 -7.1875 Z M 12.796875 -7.1875 "
+ id="path1902" />
+ </symbol>
+ <symbol
+ overflow="visible"
+ id="glyph1-22">
+ <path
+ style="stroke:none;"
+ d="M 15.578125 -6.859375 L 15.578125 -5.515625 L 11.796875 -1.71875 L 10.390625 -3.125 L 12.3125 -5.03125 L 1.125 -5.03125 L 1.125 -7.34375 L 12.3125 -7.34375 L 10.390625 -9.265625 L 11.796875 -10.65625 Z M 15.578125 -6.859375 "
+ id="path1905" />
+ </symbol>
+ </g>
+ </defs>
+ <g
+ id="surface392452">
+ <rect
+ x="0"
+ y="0"
+ width="908"
+ height="444"
+ style="fill:rgb(100%,100%,100%);fill-opacity:1;stroke:none;"
+ id="rect1912" />
+ <path
+ style="fill-rule:evenodd;fill:rgb(41.176471%,77.254903%,47.058824%);fill-opacity:0.592157;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 37.690003 18.712741 L 47.059925 18.712741 L 47.059925 20.612741 L 37.690003 20.612741 Z M 37.690003 18.712741 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path1914" />
+ <g
+ style="fill:rgb(0%,0%,0%);fill-opacity:1;"
+ id="g1968">
+ <use
+ xlink:href="#glyph0-1"
+ x="273.335938"
+ y="24.88878"
+ id="use1916" />
+ <use
+ xlink:href="#glyph0-2"
+ x="282.224826"
+ y="24.88878"
+ id="use1918" />
+ <use
+ xlink:href="#glyph0-3"
+ x="290.002604"
+ y="24.88878"
+ id="use1920" />
+ <use
+ xlink:href="#glyph0-4"
+ x="296.669271"
+ y="24.88878"
+ id="use1922" />
+ <use
+ xlink:href="#glyph0-5"
+ x="301.669271"
+ y="24.88878"
+ id="use1924" />
+ <use
+ xlink:href="#glyph0-6"
+ x="305.280382"
+ y="24.88878"
+ id="use1926" />
+ <use
+ xlink:href="#glyph0-7"
+ x="313.335938"
+ y="24.88878"
+ id="use1928" />
+ <use
+ xlink:href="#glyph0-8"
+ x="321.391493"
+ y="24.88878"
+ id="use1930" />
+ <use
+ xlink:href="#glyph0-9"
+ x="325.280382"
+ y="24.88878"
+ id="use1932" />
+ <use
+ xlink:href="#glyph0-10"
+ x="337.780382"
+ y="24.88878"
+ id="use1934" />
+ <use
+ xlink:href="#glyph0-11"
+ x="345.835938"
+ y="24.88878"
+ id="use1936" />
+ <use
+ xlink:href="#glyph0-12"
+ x="349.447049"
+ y="24.88878"
+ id="use1938" />
+ <use
+ xlink:href="#glyph0-8"
+ x="354.447049"
+ y="24.88878"
+ id="use1940" />
+ <use
+ xlink:href="#glyph0-6"
+ x="358.335938"
+ y="24.88878"
+ id="use1942" />
+ <use
+ xlink:href="#glyph0-4"
+ x="366.391493"
+ y="24.88878"
+ id="use1944" />
+ <use
+ xlink:href="#glyph0-13"
+ x="371.391493"
+ y="24.88878"
+ id="use1946" />
+ <use
+ xlink:href="#glyph0-14"
+ x="379.447049"
+ y="24.88878"
+ id="use1948" />
+ <use
+ xlink:href="#glyph0-15"
+ x="387.502604"
+ y="24.88878"
+ id="use1950" />
+ <use
+ xlink:href="#glyph0-16"
+ x="391.669271"
+ y="24.88878"
+ id="use1952" />
+ <use
+ xlink:href="#glyph0-17"
+ x="395.835938"
+ y="24.88878"
+ id="use1954" />
+ <use
+ xlink:href="#glyph0-4"
+ x="403.891493"
+ y="24.88878"
+ id="use1956" />
+ <use
+ xlink:href="#glyph0-18"
+ x="408.891493"
+ y="24.88878"
+ id="use1958" />
+ <use
+ xlink:href="#glyph0-5"
+ x="414.169271"
+ y="24.88878"
+ id="use1960" />
+ <use
+ xlink:href="#glyph0-6"
+ x="417.780382"
+ y="24.88878"
+ id="use1962" />
+ <use
+ xlink:href="#glyph0-7"
+ x="425.835938"
+ y="24.88878"
+ id="use1964" />
+ <use
+ xlink:href="#glyph0-19"
+ x="433.891493"
+ y="24.88878"
+ id="use1966" />
+ </g>
+ <path
+ style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-dasharray:0.2,0.2;stroke-miterlimit:10;"
+ d="M 42.374964 20.662937 L 42.374964 21.218991 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path1970" />
+ <path
+ style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 42.124964 21.218991 L 42.374964 21.718991 L 42.624964 21.218991 Z M 42.124964 21.218991 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path1972" />
+ <path
+ style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 32.07594 22.801609 L 36.211292 22.813327 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path1974" />
+ <path
+ style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 36.586292 22.814499 L 36.085706 23.063132 L 36.211292 22.813327 L 36.087073 22.563132 Z M 36.586292 22.814499 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path1976" />
+ <path
+ style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 56.489612 22.817429 L 48.53844 22.825046 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path1978" />
+ <path
+ style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 48.16344 22.825437 L 48.66305 22.574851 L 48.53844 22.825046 L 48.663636 23.074851 Z M 48.16344 22.825437 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path1980" />
+ <path
+ style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 41.592932 23.830124 L 40.322034 25.453757 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path1982" />
+ <path
+ style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 40.090979 25.748874 L 40.202307 25.201218 L 40.322034 25.453757 L 40.596057 25.509421 Z M 40.090979 25.748874 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path1984" />
+ <path
+ style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 43.056604 23.830124 L 44.151331 25.434812 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path1986" />
+ <path
+ style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 44.362659 25.744577 L 43.874378 25.472507 L 44.151331 25.434812 L 44.287464 25.190671 Z M 44.362659 25.744577 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path1988" />
+ <path
+ style="fill-rule:evenodd;fill:rgb(61.176473%,63.921571%,97.647059%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 29.543714 22.614499 L 32.026331 21.881296 L 32.026331 23.714499 L 29.543714 23.714499 Z M 29.543714 22.614499 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path1990" />
+ <g
+ style="fill:rgb(0%,0%,0%);fill-opacity:1;"
+ id="g2002">
+ <use
+ xlink:href="#glyph0-5"
+ x="107.921875"
+ y="94.923937"
+ id="use1992" />
+ <use
+ xlink:href="#glyph0-6"
+ x="111.532986"
+ y="94.923937"
+ id="use1994" />
+ <use
+ xlink:href="#glyph0-4"
+ x="119.588542"
+ y="94.923937"
+ id="use1996" />
+ <use
+ xlink:href="#glyph0-13"
+ x="124.588542"
+ y="94.923937"
+ id="use1998" />
+ <use
+ xlink:href="#glyph0-14"
+ x="132.644097"
+ y="94.923937"
+ id="use2000" />
+ </g>
+ <path
+ style="fill-rule:evenodd;fill:rgb(100%,70.19608%,14.509805%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 56.539612 22.616257 L 58.539612 21.816257 L 58.539612 23.816257 L 56.539612 23.816257 Z M 56.539612 22.616257 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2004" />
+ <g
+ style="fill:rgb(0%,0%,0%);fill-opacity:1;"
+ id="g2012">
+ <use
+ xlink:href="#glyph0-17"
+ x="647.332031"
+ y="95.959093"
+ id="use2006" />
+ <use
+ xlink:href="#glyph0-13"
+ x="655.387587"
+ y="95.959093"
+ id="use2008" />
+ <use
+ xlink:href="#glyph0-20"
+ x="663.443142"
+ y="95.959093"
+ id="use2010" />
+ </g>
+ <path
+ style="fill-rule:evenodd;fill:rgb(41.176471%,77.254903%,47.058824%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 36.747425 21.881101 L 48.002503 21.881101 L 48.002503 23.781101 L 36.747425 23.781101 Z M 36.747425 21.881101 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2014" />
+ <g
+ style="fill:rgb(0%,0%,0%);fill-opacity:1;"
+ id="g2076">
+ <use
+ xlink:href="#glyph0-2"
+ x="260.152344"
+ y="88.252062"
+ id="use2016" />
+ <use
+ xlink:href="#glyph0-21"
+ x="267.930122"
+ y="88.252062"
+ id="use2018" />
+ <use
+ xlink:href="#glyph0-22"
+ x="275.985677"
+ y="88.252062"
+ id="use2020" />
+ <use
+ xlink:href="#glyph0-23"
+ x="279.596788"
+ y="88.252062"
+ id="use2022" />
+ <use
+ xlink:href="#glyph0-3"
+ x="287.652344"
+ y="88.252062"
+ id="use2024" />
+ <use
+ xlink:href="#glyph0-4"
+ x="294.31901"
+ y="88.252062"
+ id="use2026" />
+ <use
+ xlink:href="#glyph0-24"
+ x="299.31901"
+ y="88.252062"
+ id="use2028" />
+ <use
+ xlink:href="#glyph0-21"
+ x="305.707899"
+ y="88.252062"
+ id="use2030" />
+ <use
+ xlink:href="#glyph0-25"
+ x="313.763455"
+ y="88.252062"
+ id="use2032" />
+ <use
+ xlink:href="#glyph0-3"
+ x="321.541233"
+ y="88.252062"
+ id="use2034" />
+ <use
+ xlink:href="#glyph0-26"
+ x="328.207899"
+ y="88.252062"
+ id="use2036" />
+ <use
+ xlink:href="#glyph0-18"
+ x="335.152344"
+ y="88.252062"
+ id="use2038" />
+ <use
+ xlink:href="#glyph0-5"
+ x="340.430122"
+ y="88.252062"
+ id="use2040" />
+ <use
+ xlink:href="#glyph0-10"
+ x="344.041233"
+ y="88.252062"
+ id="use2042" />
+ <use
+ xlink:href="#glyph0-4"
+ x="352.096788"
+ y="88.252062"
+ id="use2044" />
+ <use
+ xlink:href="#glyph0-27"
+ x="357.096788"
+ y="88.252062"
+ id="use2046" />
+ <use
+ xlink:href="#glyph0-18"
+ x="364.874566"
+ y="88.252062"
+ id="use2048" />
+ <use
+ xlink:href="#glyph0-3"
+ x="370.152344"
+ y="88.252062"
+ id="use2050" />
+ <use
+ xlink:href="#glyph0-28"
+ x="376.81901"
+ y="88.252062"
+ id="use2052" />
+ <use
+ xlink:href="#glyph0-5"
+ x="381.81901"
+ y="88.252062"
+ id="use2054" />
+ <use
+ xlink:href="#glyph0-6"
+ x="385.430122"
+ y="88.252062"
+ id="use2056" />
+ <use
+ xlink:href="#glyph0-4"
+ x="393.485677"
+ y="88.252062"
+ id="use2058" />
+ <use
+ xlink:href="#glyph0-13"
+ x="398.485677"
+ y="88.252062"
+ id="use2060" />
+ <use
+ xlink:href="#glyph0-14"
+ x="406.541233"
+ y="88.252062"
+ id="use2062" />
+ <use
+ xlink:href="#glyph0-15"
+ x="414.596788"
+ y="88.252062"
+ id="use2064" />
+ <use
+ xlink:href="#glyph0-16"
+ x="418.763455"
+ y="88.252062"
+ id="use2066" />
+ <use
+ xlink:href="#glyph0-17"
+ x="422.930122"
+ y="88.252062"
+ id="use2068" />
+ <use
+ xlink:href="#glyph0-13"
+ x="430.985677"
+ y="88.252062"
+ id="use2070" />
+ <use
+ xlink:href="#glyph0-20"
+ x="439.041233"
+ y="88.252062"
+ id="use2072" />
+ <use
+ xlink:href="#glyph0-29"
+ x="447.096788"
+ y="88.252062"
+ id="use2074" />
+ </g>
+ <path
+ style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 37.777112 25.887156 L 41.350745 25.887156 L 40.622815 27.887156 L 37.049182 27.887156 Z M 37.777112 25.887156 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2078" />
+ <g
+ style="fill:rgb(0%,0%,0%);fill-opacity:1;"
+ id="g2090">
+ <use
+ xlink:href="#glyph0-5"
+ x="276.222656"
+ y="169.377062"
+ id="use2080" />
+ <use
+ xlink:href="#glyph0-6"
+ x="279.833767"
+ y="169.377062"
+ id="use2082" />
+ <use
+ xlink:href="#glyph0-4"
+ x="287.889323"
+ y="169.377062"
+ id="use2084" />
+ <use
+ xlink:href="#glyph0-13"
+ x="292.889323"
+ y="169.377062"
+ id="use2086" />
+ <use
+ xlink:href="#glyph0-14"
+ x="300.944878"
+ y="169.377062"
+ id="use2088" />
+ </g>
+ <path
+ style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 44.26344 25.887156 L 46.748792 25.887156 L 46.020862 27.887156 L 43.535511 27.887156 Z M 44.26344 25.887156 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2092" />
+ <g
+ style="fill:rgb(0%,0%,0%);fill-opacity:1;"
+ id="g2098">
+ <use
+ xlink:href="#glyph0-17"
+ x="403.40625"
+ y="169.377062"
+ id="use2094" />
+ <use
+ xlink:href="#glyph0-30"
+ x="411.461806"
+ y="169.377062"
+ id="use2096" />
+ </g>
+ <path
+ style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 57.539612 25.68364 L 59.946643 26.887156 L 57.539612 28.090671 L 55.132776 26.887156 Z M 57.539612 25.68364 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2100" />
+ <g
+ style="fill:rgb(0%,0%,0%);fill-opacity:1;"
+ id="g2106">
+ <use
+ xlink:href="#glyph0-31"
+ x="651.492188"
+ y="169.377062"
+ id="use2102" />
+ <use
+ xlink:href="#glyph0-32"
+ x="656.492188"
+ y="169.377062"
+ id="use2104" />
+ </g>
+ <path
+ style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 46.416761 26.887156 L 54.596057 26.887156 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2108" />
+ <path
+ style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 54.971057 26.887156 L 54.471057 27.137156 L 54.596057 26.887156 L 54.471057 26.637156 Z M 54.971057 26.887156 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2110" />
+ <path
+ style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 57.539612 23.866257 L 57.539612 25.146921 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2112" />
+ <path
+ style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 57.539612 25.521921 L 57.289612 25.021921 L 57.539612 25.146921 L 57.789612 25.021921 Z M 57.539612 25.521921 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2114" />
+ <path
+ style="fill-rule:evenodd;fill:rgb(41.176471%,77.254903%,47.058824%);fill-opacity:0.592157;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 60.273401 28.318015 L 69.890979 28.318015 L 69.890979 30.218015 L 60.273401 30.218015 Z M 60.273401 28.318015 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2116" />
+ <g
+ style="fill:rgb(0%,0%,0%);fill-opacity:1;"
+ id="g2172">
+ <use
+ xlink:href="#glyph0-1"
+ x="724.980469"
+ y="216.994249"
+ id="use2118" />
+ <use
+ xlink:href="#glyph0-2"
+ x="733.869358"
+ y="216.994249"
+ id="use2120" />
+ <use
+ xlink:href="#glyph0-3"
+ x="741.647135"
+ y="216.994249"
+ id="use2122" />
+ <use
+ xlink:href="#glyph0-4"
+ x="748.313802"
+ y="216.994249"
+ id="use2124" />
+ <use
+ xlink:href="#glyph0-5"
+ x="753.313802"
+ y="216.994249"
+ id="use2126" />
+ <use
+ xlink:href="#glyph0-6"
+ x="756.924913"
+ y="216.994249"
+ id="use2128" />
+ <use
+ xlink:href="#glyph0-7"
+ x="764.980469"
+ y="216.994249"
+ id="use2130" />
+ <use
+ xlink:href="#glyph0-8"
+ x="773.036024"
+ y="216.994249"
+ id="use2132" />
+ <use
+ xlink:href="#glyph0-9"
+ x="776.924913"
+ y="216.994249"
+ id="use2134" />
+ <use
+ xlink:href="#glyph0-10"
+ x="789.424913"
+ y="216.994249"
+ id="use2136" />
+ <use
+ xlink:href="#glyph0-11"
+ x="797.480469"
+ y="216.994249"
+ id="use2138" />
+ <use
+ xlink:href="#glyph0-12"
+ x="801.09158"
+ y="216.994249"
+ id="use2140" />
+ <use
+ xlink:href="#glyph0-17"
+ x="806.09158"
+ y="216.994249"
+ id="use2142" />
+ <use
+ xlink:href="#glyph0-4"
+ x="814.147135"
+ y="216.994249"
+ id="use2144" />
+ <use
+ xlink:href="#glyph0-18"
+ x="819.147135"
+ y="216.994249"
+ id="use2146" />
+ <use
+ xlink:href="#glyph0-5"
+ x="824.424913"
+ y="216.994249"
+ id="use2148" />
+ <use
+ xlink:href="#glyph0-6"
+ x="828.036024"
+ y="216.994249"
+ id="use2150" />
+ <use
+ xlink:href="#glyph0-7"
+ x="836.09158"
+ y="216.994249"
+ id="use2152" />
+ <use
+ xlink:href="#glyph0-15"
+ x="844.147135"
+ y="216.994249"
+ id="use2154" />
+ <use
+ xlink:href="#glyph0-16"
+ x="848.313802"
+ y="216.994249"
+ id="use2156" />
+ <use
+ xlink:href="#glyph0-17"
+ x="852.480469"
+ y="216.994249"
+ id="use2158" />
+ <use
+ xlink:href="#glyph0-4"
+ x="860.536024"
+ y="216.994249"
+ id="use2160" />
+ <use
+ xlink:href="#glyph0-18"
+ x="865.536024"
+ y="216.994249"
+ id="use2162" />
+ <use
+ xlink:href="#glyph0-5"
+ x="870.813802"
+ y="216.994249"
+ id="use2164" />
+ <use
+ xlink:href="#glyph0-6"
+ x="874.424913"
+ y="216.994249"
+ id="use2166" />
+ <use
+ xlink:href="#glyph0-7"
+ x="882.480469"
+ y="216.994249"
+ id="use2168" />
+ <use
+ xlink:href="#glyph0-19"
+ x="890.536024"
+ y="216.994249"
+ id="use2170" />
+ </g>
+ <path
+ style="fill-rule:evenodd;fill:rgb(41.176471%,77.254903%,47.058824%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 51.584729 31.317234 L 63.49469 31.317234 L 63.49469 33.217234 L 51.584729 33.217234 Z M 51.584729 31.317234 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2174" />
+ <g
+ style="fill:rgb(0%,0%,0%);fill-opacity:1;"
+ id="g2234">
+ <use
+ xlink:href="#glyph0-7"
+ x="565.378906"
+ y="276.978624"
+ id="use2176" />
+ <use
+ xlink:href="#glyph0-25"
+ x="573.434462"
+ y="276.978624"
+ id="use2178" />
+ <use
+ xlink:href="#glyph0-4"
+ x="581.21224"
+ y="276.978624"
+ id="use2180" />
+ <use
+ xlink:href="#glyph0-24"
+ x="586.21224"
+ y="276.978624"
+ id="use2182" />
+ <use
+ xlink:href="#glyph0-4"
+ x="592.601128"
+ y="276.978624"
+ id="use2184" />
+ <use
+ xlink:href="#glyph0-18"
+ x="597.601128"
+ y="276.978624"
+ id="use2186" />
+ <use
+ xlink:href="#glyph0-2"
+ x="602.878906"
+ y="276.978624"
+ id="use2188" />
+ <use
+ xlink:href="#glyph0-6"
+ x="610.656684"
+ y="276.978624"
+ id="use2190" />
+ <use
+ xlink:href="#glyph0-3"
+ x="618.71224"
+ y="276.978624"
+ id="use2192" />
+ <use
+ xlink:href="#glyph0-33"
+ x="625.378906"
+ y="276.978624"
+ id="use2194" />
+ <use
+ xlink:href="#glyph0-25"
+ x="629.823351"
+ y="276.978624"
+ id="use2196" />
+ <use
+ xlink:href="#glyph0-18"
+ x="637.601128"
+ y="276.978624"
+ id="use2198" />
+ <use
+ xlink:href="#glyph0-33"
+ x="642.878906"
+ y="276.978624"
+ id="use2200" />
+ <use
+ xlink:href="#glyph0-23"
+ x="647.323351"
+ y="276.978624"
+ id="use2202" />
+ <use
+ xlink:href="#glyph0-6"
+ x="655.378906"
+ y="276.978624"
+ id="use2204" />
+ <use
+ xlink:href="#glyph0-26"
+ x="663.434462"
+ y="276.978624"
+ id="use2206" />
+ <use
+ xlink:href="#glyph0-4"
+ x="670.378906"
+ y="276.978624"
+ id="use2208" />
+ <use
+ xlink:href="#glyph0-5"
+ x="675.378906"
+ y="276.978624"
+ id="use2210" />
+ <use
+ xlink:href="#glyph0-27"
+ x="678.990017"
+ y="276.978624"
+ id="use2212" />
+ <use
+ xlink:href="#glyph0-6"
+ x="686.767795"
+ y="276.978624"
+ id="use2214" />
+ <use
+ xlink:href="#glyph0-28"
+ x="694.823351"
+ y="276.978624"
+ id="use2216" />
+ <use
+ xlink:href="#glyph0-17"
+ x="699.823351"
+ y="276.978624"
+ id="use2218" />
+ <use
+ xlink:href="#glyph0-30"
+ x="707.878906"
+ y="276.978624"
+ id="use2220" />
+ <use
+ xlink:href="#glyph0-15"
+ x="715.934462"
+ y="276.978624"
+ id="use2222" />
+ <use
+ xlink:href="#glyph0-16"
+ x="720.101128"
+ y="276.978624"
+ id="use2224" />
+ <use
+ xlink:href="#glyph0-17"
+ x="724.267795"
+ y="276.978624"
+ id="use2226" />
+ <use
+ xlink:href="#glyph0-13"
+ x="732.323351"
+ y="276.978624"
+ id="use2228" />
+ <use
+ xlink:href="#glyph0-20"
+ x="740.378906"
+ y="276.978624"
+ id="use2230" />
+ <use
+ xlink:href="#glyph0-29"
+ x="748.434462"
+ y="276.978624"
+ id="use2232" />
+ </g>
+ <path
+ style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-dasharray:0.2,0.2;stroke-miterlimit:10;"
+ d="M 62.568518 30.267624 L 60.621643 31.041648 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2236" />
+ <path
+ style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 60.529456 30.809421 L 60.15719 31.226413 L 60.714026 31.27407 Z M 60.529456 30.809421 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2238" />
+ <path
+ style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 57.539612 28.140671 L 57.539612 30.780906 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2240" />
+ <path
+ style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 57.539612 31.155906 L 57.289612 30.655906 L 57.539612 30.780906 L 57.789612 30.655906 Z M 57.539612 31.155906 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2242" />
+ <path
+ style="fill-rule:evenodd;fill:rgb(41.176471%,77.254903%,47.058824%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 36.420081 31.317234 L 48.330042 31.317234 L 48.330042 33.217234 L 36.420081 33.217234 Z M 36.420081 31.317234 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2244" />
+ <g
+ style="fill:rgb(0%,0%,0%);fill-opacity:1;"
+ id="g2308">
+ <use
+ xlink:href="#glyph0-7"
+ x="257.789062"
+ y="276.978624"
+ id="use2246" />
+ <use
+ xlink:href="#glyph0-25"
+ x="265.844618"
+ y="276.978624"
+ id="use2248" />
+ <use
+ xlink:href="#glyph0-4"
+ x="273.622396"
+ y="276.978624"
+ id="use2250" />
+ <use
+ xlink:href="#glyph0-24"
+ x="278.622396"
+ y="276.978624"
+ id="use2252" />
+ <use
+ xlink:href="#glyph0-4"
+ x="285.011285"
+ y="276.978624"
+ id="use2254" />
+ <use
+ xlink:href="#glyph0-18"
+ x="290.011285"
+ y="276.978624"
+ id="use2256" />
+ <use
+ xlink:href="#glyph0-2"
+ x="295.289062"
+ y="276.978624"
+ id="use2258" />
+ <use
+ xlink:href="#glyph0-6"
+ x="303.06684"
+ y="276.978624"
+ id="use2260" />
+ <use
+ xlink:href="#glyph0-3"
+ x="311.122396"
+ y="276.978624"
+ id="use2262" />
+ <use
+ xlink:href="#glyph0-33"
+ x="317.789062"
+ y="276.978624"
+ id="use2264" />
+ <use
+ xlink:href="#glyph0-25"
+ x="322.233507"
+ y="276.978624"
+ id="use2266" />
+ <use
+ xlink:href="#glyph0-18"
+ x="330.011285"
+ y="276.978624"
+ id="use2268" />
+ <use
+ xlink:href="#glyph0-33"
+ x="335.289062"
+ y="276.978624"
+ id="use2270" />
+ <use
+ xlink:href="#glyph0-23"
+ x="339.733507"
+ y="276.978624"
+ id="use2272" />
+ <use
+ xlink:href="#glyph0-6"
+ x="347.789062"
+ y="276.978624"
+ id="use2274" />
+ <use
+ xlink:href="#glyph0-26"
+ x="355.844618"
+ y="276.978624"
+ id="use2276" />
+ <use
+ xlink:href="#glyph0-4"
+ x="362.789062"
+ y="276.978624"
+ id="use2278" />
+ <use
+ xlink:href="#glyph0-5"
+ x="367.789062"
+ y="276.978624"
+ id="use2280" />
+ <use
+ xlink:href="#glyph0-27"
+ x="371.400174"
+ y="276.978624"
+ id="use2282" />
+ <use
+ xlink:href="#glyph0-6"
+ x="379.177951"
+ y="276.978624"
+ id="use2284" />
+ <use
+ xlink:href="#glyph0-28"
+ x="387.233507"
+ y="276.978624"
+ id="use2286" />
+ <use
+ xlink:href="#glyph0-5"
+ x="392.233507"
+ y="276.978624"
+ id="use2288" />
+ <use
+ xlink:href="#glyph0-6"
+ x="395.844618"
+ y="276.978624"
+ id="use2290" />
+ <use
+ xlink:href="#glyph0-4"
+ x="403.900174"
+ y="276.978624"
+ id="use2292" />
+ <use
+ xlink:href="#glyph0-13"
+ x="408.900174"
+ y="276.978624"
+ id="use2294" />
+ <use
+ xlink:href="#glyph0-14"
+ x="416.955729"
+ y="276.978624"
+ id="use2296" />
+ <use
+ xlink:href="#glyph0-15"
+ x="425.011285"
+ y="276.978624"
+ id="use2298" />
+ <use
+ xlink:href="#glyph0-16"
+ x="429.177951"
+ y="276.978624"
+ id="use2300" />
+ <use
+ xlink:href="#glyph0-17"
+ x="433.344618"
+ y="276.978624"
+ id="use2302" />
+ <use
+ xlink:href="#glyph0-30"
+ x="441.400174"
+ y="276.978624"
+ id="use2304" />
+ <use
+ xlink:href="#glyph0-29"
+ x="449.455729"
+ y="276.978624"
+ id="use2306" />
+ </g>
+ <path
+ style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 39.807776 27.917038 L 41.537659 30.848484 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2310" />
+ <path
+ style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 41.728284 31.171335 L 41.258948 30.86782 L 41.537659 30.848484 L 41.689417 30.613718 Z M 41.728284 31.171335 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2312" />
+ <path
+ style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 44.612464 27.917038 L 43.111682 30.834812 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2314" />
+ <path
+ style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 42.940198 31.16821 L 42.946643 30.609226 L 43.111682 30.834812 L 43.391175 30.837937 Z M 42.940198 31.16821 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2316" />
+ <path
+ style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-dasharray:0.2,0.2;stroke-miterlimit:10;"
+ d="M 42.374964 23.831491 L 42.374964 30.654929 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2318" />
+ <path
+ style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 42.124964 30.654929 L 42.374964 31.154929 L 42.624964 30.654929 Z M 42.124964 30.654929 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2320" />
+ <path
+ style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 30.784925 25.633054 L 33.293128 26.887156 L 30.784925 28.141257 L 28.276917 26.887156 Z M 30.784925 25.633054 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2322" />
+ <g
+ style="fill:rgb(0%,0%,0%);fill-opacity:1;"
+ id="g2330">
+ <use
+ xlink:href="#glyph0-31"
+ x="114.308594"
+ y="169.377062"
+ id="use2324" />
+ <use
+ xlink:href="#glyph0-32"
+ x="119.308594"
+ y="169.377062"
+ id="use2326" />
+ <use
+ xlink:href="#glyph0-16"
+ x="130.141927"
+ y="169.377062"
+ id="use2328" />
+ </g>
+ <path
+ style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 30.784925 23.76489 L 30.784925 25.096335 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2332" />
+ <path
+ style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 30.784925 25.471335 L 30.534925 24.971335 L 30.784925 25.096335 L 31.034925 24.971335 Z M 30.784925 25.471335 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2334" />
+ <path
+ style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 37.381214 26.887156 L 33.830042 26.887156 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2336" />
+ <path
+ style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 33.455042 26.887156 L 33.955042 26.637156 L 33.830042 26.887156 L 33.955042 27.137156 Z M 33.455042 26.887156 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2338" />
+ <path
+ style="fill-rule:evenodd;fill:rgb(61.176473%,63.921571%,97.647059%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 28.660706 35.381882 L 32.909339 34.542038 L 32.909339 36.642038 L 28.660706 36.642038 Z M 28.660706 35.381882 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2340" />
+ <g
+ style="fill:rgb(0%,0%,0%);fill-opacity:1;"
+ id="g2360">
+ <use
+ xlink:href="#glyph0-5"
+ x="94.875"
+ y="351.869249"
+ id="use2342" />
+ <use
+ xlink:href="#glyph0-6"
+ x="98.486111"
+ y="351.869249"
+ id="use2344" />
+ <use
+ xlink:href="#glyph0-4"
+ x="106.541667"
+ y="351.869249"
+ id="use2346" />
+ <use
+ xlink:href="#glyph0-13"
+ x="111.541667"
+ y="351.869249"
+ id="use2348" />
+ <use
+ xlink:href="#glyph0-14"
+ x="119.597222"
+ y="351.869249"
+ id="use2350" />
+ <use
+ xlink:href="#glyph0-28"
+ x="127.652778"
+ y="351.869249"
+ id="use2352" />
+ <use
+ xlink:href="#glyph0-14"
+ x="132.652778"
+ y="351.869249"
+ id="use2354" />
+ <use
+ xlink:href="#glyph0-13"
+ x="140.708333"
+ y="351.869249"
+ id="use2356" />
+ <use
+ xlink:href="#glyph0-29"
+ x="148.763889"
+ y="351.869249"
+ id="use2358" />
+ </g>
+ <path
+ style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 37.764612 35.581101 C 37.764612 36.05239 37.000354 36.434421 36.057776 36.434421 C 35.115198 36.434421 34.351136 36.05239 34.351136 35.581101 C 34.351136 35.109812 35.115198 34.727781 36.057776 34.727781 C 37.000354 34.727781 37.764612 35.109812 37.764612 35.581101 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2362" />
+ <path
+ style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-dasharray:0.2,0.2;stroke-miterlimit:10;"
+ d="M 40.467932 33.267624 L 37.821448 34.655906 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2364" />
+ <path
+ style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 37.705237 34.434616 L 37.378675 34.888132 L 37.937659 34.87739 Z M 37.705237 34.434616 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2366" />
+ <path
+ style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 32.959534 35.587546 L 33.814417 35.585788 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2368" />
+ <path
+ style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 34.189417 35.585007 L 33.690003 35.835984 L 33.814417 35.585788 L 33.689026 35.335984 Z M 34.189417 35.585007 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2370" />
+ <path
+ style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 37.812268 35.570554 L 39.839807 35.558249 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2372" />
+ <path
+ style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 40.214807 35.555906 L 39.71637 35.808835 L 39.839807 35.558249 L 39.713245 35.308835 Z M 40.214807 35.555906 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2374" />
+ <path
+ style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 40.726721 34.542624 L 44.835315 34.542624 L 44.107386 36.542624 L 39.998792 36.542624 Z M 40.726721 34.542624 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2376" />
+ <g
+ style="fill:rgb(0%,0%,0%);fill-opacity:1;"
+ id="g2394">
+ <use
+ xlink:href="#glyph0-17"
+ x="330.019531"
+ y="342.48253"
+ id="use2378" />
+ <use
+ xlink:href="#glyph0-30"
+ x="338.075087"
+ y="342.48253"
+ id="use2380" />
+ <use
+ xlink:href="#glyph0-28"
+ x="346.130642"
+ y="342.48253"
+ id="use2382" />
+ <use
+ xlink:href="#glyph0-34"
+ x="351.130642"
+ y="342.48253"
+ id="use2384" />
+ <use
+ xlink:href="#glyph0-14"
+ x="356.963976"
+ y="342.48253"
+ id="use2386" />
+ <use
+ xlink:href="#glyph0-13"
+ x="365.019531"
+ y="342.48253"
+ id="use2388" />
+ <use
+ xlink:href="#glyph0-34"
+ x="373.075087"
+ y="342.48253"
+ id="use2390" />
+ <use
+ xlink:href="#glyph0-29"
+ x="378.90842"
+ y="342.48253"
+ id="use2392" />
+ </g>
+ <path
+ style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 50.59469 35.581101 C 50.59469 36.05239 49.830432 36.434421 48.887854 36.434421 C 47.945276 36.434421 47.181214 36.05239 47.181214 35.581101 C 47.181214 35.109812 47.945276 34.727781 48.887854 34.727781 C 49.830432 34.727781 50.59469 35.109812 50.59469 35.581101 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2396" />
+ <path
+ style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-dasharray:0.2,0.2;stroke-miterlimit:10;"
+ d="M 54.927893 33.267624 L 50.860901 34.825437 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2398" />
+ <path
+ style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 50.771643 34.591843 L 50.394104 35.004148 L 50.950354 35.058835 Z M 50.771643 34.591843 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2400" />
+ <path
+ style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 44.49762 35.554929 L 46.650745 35.56782 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2402" />
+ <path
+ style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 47.025745 35.569968 L 46.524182 35.817038 L 46.650745 35.56782 L 46.527307 35.317038 Z M 47.025745 35.569968 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2404" />
+ <path
+ style="fill-rule:evenodd;fill:rgb(100%,70.19608%,14.509805%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 54.63805 34.542624 L 61.1693 34.542624 L 60.44137 36.542624 L 53.91012 36.542624 Z M 54.63805 34.542624 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2406" />
+ <g
+ style="fill:rgb(0%,0%,0%);fill-opacity:1;"
+ id="g2426">
+ <use
+ xlink:href="#glyph0-17"
+ x="628.445313"
+ y="342.48253"
+ id="use2408" />
+ <use
+ xlink:href="#glyph0-13"
+ x="636.500868"
+ y="342.48253"
+ id="use2410" />
+ <use
+ xlink:href="#glyph0-20"
+ x="644.556424"
+ y="342.48253"
+ id="use2412" />
+ <use
+ xlink:href="#glyph0-28"
+ x="652.611979"
+ y="342.48253"
+ id="use2414" />
+ <use
+ xlink:href="#glyph0-34"
+ x="657.611979"
+ y="342.48253"
+ id="use2416" />
+ <use
+ xlink:href="#glyph0-14"
+ x="663.445313"
+ y="342.48253"
+ id="use2418" />
+ <use
+ xlink:href="#glyph0-13"
+ x="671.500868"
+ y="342.48253"
+ id="use2420" />
+ <use
+ xlink:href="#glyph0-34"
+ x="679.556424"
+ y="342.48253"
+ id="use2422" />
+ <use
+ xlink:href="#glyph0-29"
+ x="685.389757"
+ y="342.48253"
+ id="use2424" />
+ </g>
+ <path
+ style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 50.577698 35.573484 L 53.753479 35.559421 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2428" />
+ <path
+ style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
+ d="M 54.128479 35.557663 L 53.629651 35.810007 L 53.753479 35.559421 L 53.627503 35.310007 Z M 54.128479 35.557663 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2430" />
+ <path
+ style="fill-rule:evenodd;fill:rgb(100%, 100%, 100%);fill-opacity:1;stroke-width:0.20012599;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%, 0%, 0%);stroke-opacity:1;stroke-miterlimit:10;stroke-dasharray:none"
+ d="M 24.669495 38.169382 L 66.289417 38.169382 L 66.289417 40.751023 L 24.669495 40.751023 Z M 24.669495 38.169382 "
+ transform="matrix(20,0,0,20,-491.389899,-372.25483)"
+ id="path2432" />
+ <g
+ style="fill:rgb(0%,0%,0%);fill-opacity:1;"
+ id="g2574">
+ <use
+ xlink:href="#glyph1-1"
+ x="13.492188"
+ y="422.957954"
+ id="use2434" />
+ <use
+ xlink:href="#glyph1-2"
+ x="27.658854"
+ y="422.957954"
+ id="use2436" />
+ <use
+ xlink:href="#glyph1-3"
+ x="41.825521"
+ y="422.957954"
+ id="use2438" />
+ <use
+ xlink:href="#glyph1-4"
+ x="49.325521"
+ y="422.957954"
+ id="use2440" />
+ <use
+ xlink:href="#glyph1-5"
+ x="62.658854"
+ y="422.957954"
+ id="use2442" />
+ <use
+ xlink:href="#glyph1-5"
+ x="72.381076"
+ y="422.957954"
+ id="use2444" />
+ <use
+ xlink:href="#glyph1-4"
+ x="82.103299"
+ y="422.957954"
+ id="use2446" />
+ <use
+ xlink:href="#glyph1-6"
+ x="94.881076"
+ y="422.957954"
+ id="use2448" />
+ <use
+ xlink:href="#glyph1-7"
+ x="107.658854"
+ y="422.957954"
+ id="use2450" />
+ <use
+ xlink:href="#glyph1-8"
+ x="116.825521"
+ y="422.957954"
+ id="use2452"
+ style="fill:#9ca1f8;fill-opacity:1" />
+ <use
+ xlink:href="#glyph1-9"
+ x="130.436632"
+ y="422.957954"
+ id="use2454"
+ style="fill:#9ca1f8;fill-opacity:1" />
+ <use
+ xlink:href="#glyph1-10"
+ x="144.047743"
+ y="422.957954"
+ id="use2456" />
+ <use
+ xlink:href="#glyph1-11"
+ x="151.547743"
+ y="422.957954"
+ id="use2458" />
+ <use
+ xlink:href="#glyph1-12"
+ x="158.492188"
+ y="422.957954"
+ id="use2460" />
+ <use
+ xlink:href="#glyph1-13"
+ x="172.658854"
+ y="422.957954"
+ id="use2462" />
+ <use
+ xlink:href="#glyph1-6"
+ x="182.103299"
+ y="422.957954"
+ id="use2464" />
+ <use
+ xlink:href="#glyph1-2"
+ x="194.881076"
+ y="422.957954"
+ id="use2466" />
+ <use
+ xlink:href="#glyph1-14"
+ x="209.047743"
+ y="422.957954"
+ id="use2468" />
+ <use
+ xlink:href="#glyph1-15"
+ x="222.381076"
+ y="422.957954"
+ id="use2470" />
+ <use
+ xlink:href="#glyph1-16"
+ x="239.047743"
+ y="422.957954"
+ id="use2472"
+ style="fill:#9ca1f8;fill-opacity:1" />
+ <use
+ xlink:href="#glyph1-1"
+ x="245.71441"
+ y="422.957954"
+ id="use2474"
+ style="fill:#9ca1f8;fill-opacity:1" />
+ <use
+ xlink:href="#glyph1-13"
+ x="259.881076"
+ y="422.957954"
+ id="use2476"
+ style="fill:#9ca1f8;fill-opacity:1" />
+ <use
+ xlink:href="#glyph1-9"
+ x="269.325521"
+ y="422.957954"
+ id="use2478"
+ style="fill:#9ca1f8;fill-opacity:1" />
+ <use
+ xlink:href="#glyph1-8"
+ x="282.936632"
+ y="422.957954"
+ id="use2480"
+ style="fill:#9ca1f8;fill-opacity:1" />
+ <use
+ xlink:href="#glyph1-17"
+ x="296.547743"
+ y="422.957954"
+ id="use2482" />
+ <use
+ xlink:href="#glyph1-3"
+ x="305.71441"
+ y="422.957954"
+ id="use2484" />
+ <use
+ xlink:href="#glyph1-4"
+ x="313.21441"
+ y="422.957954"
+ id="use2486" />
+ <use
+ xlink:href="#glyph1-18"
+ x="326.547743"
+ y="422.957954"
+ id="use2488" />
+ <use
+ xlink:href="#glyph1-13"
+ x="338.21441"
+ y="422.957954"
+ id="use2490" />
+ <use
+ xlink:href="#glyph1-6"
+ x="347.658854"
+ y="422.957954"
+ id="use2492" />
+ <use
+ xlink:href="#glyph1-2"
+ x="360.436632"
+ y="422.957954"
+ id="use2494" />
+ <use
+ xlink:href="#glyph1-14"
+ x="374.603299"
+ y="422.957954"
+ id="use2496" />
+ <use
+ xlink:href="#glyph1-7"
+ x="387.936632"
+ y="422.957954"
+ id="use2498" />
+ <use
+ xlink:href="#glyph1-19"
+ x="397.103299"
+ y="422.957954"
+ id="use2500"
+ style="fill:#000000;fill-opacity:1" />
+ <use
+ xlink:href="#glyph1-20"
+ x="407.381076"
+ y="422.957954"
+ id="use2502"
+ style="fill:#ffb323;fill-opacity:1" />
+ <use
+ xlink:href="#glyph1-9"
+ x="421.547743"
+ y="422.957954"
+ id="use2504"
+ style="fill:#ffb323;fill-opacity:1" />
+ <use
+ xlink:href="#glyph1-21"
+ x="435.158854"
+ y="422.957954"
+ id="use2506"
+ style="fill:#ffb323;fill-opacity:1" />
+ <use
+ xlink:href="#glyph1-19"
+ x="448.769965"
+ y="422.957954"
+ id="use2508"
+ style="fill:#000000;fill-opacity:1" />
+ <use
+ xlink:href="#glyph1-17"
+ x="459.047743"
+ y="422.957954"
+ id="use2510" />
+ <use
+ xlink:href="#glyph1-11"
+ x="468.21441"
+ y="422.957954"
+ id="use2512" />
+ <use
+ xlink:href="#glyph1-11"
+ x="475.158854"
+ y="422.957954"
+ id="use2514" />
+ <use
+ xlink:href="#glyph1-22"
+ x="482.103299"
+ y="422.957954"
+ id="use2516" />
+ <use
+ xlink:href="#glyph1-11"
+ x="498.769965"
+ y="422.957954"
+ id="use2518" />
+ <use
+ xlink:href="#glyph1-1"
+ x="505.71441"
+ y="422.957954"
+ id="use2520" />
+ <use
+ xlink:href="#glyph1-2"
+ x="519.881076"
+ y="422.957954"
+ id="use2522" />
+ <use
+ xlink:href="#glyph1-3"
+ x="534.047743"
+ y="422.957954"
+ id="use2524" />
+ <use
+ xlink:href="#glyph1-4"
+ x="541.547743"
+ y="422.957954"
+ id="use2526" />
+ <use
+ xlink:href="#glyph1-5"
+ x="554.881076"
+ y="422.957954"
+ id="use2528" />
+ <use
+ xlink:href="#glyph1-5"
+ x="564.603299"
+ y="422.957954"
+ id="use2530" />
+ <use
+ xlink:href="#glyph1-4"
+ x="574.325521"
+ y="422.957954"
+ id="use2532" />
+ <use
+ xlink:href="#glyph1-6"
+ x="587.103299"
+ y="422.957954"
+ id="use2534" />
+ <use
+ xlink:href="#glyph1-7"
+ x="599.881076"
+ y="422.957954"
+ id="use2536" />
+ <use
+ xlink:href="#glyph1-19"
+ x="609.047743"
+ y="422.957954"
+ id="use2538"
+ style="fill:#ffb323;fill-opacity:1" />
+ <use
+ xlink:href="#glyph1-8"
+ x="619.325521"
+ y="422.957954"
+ id="use2540"
+ style="fill:#ffb323;fill-opacity:1" />
+ <use
+ xlink:href="#glyph1-9"
+ x="632.936632"
+ y="422.957954"
+ id="use2542"
+ style="fill:#ffb323;fill-opacity:1" />
+ <use
+ xlink:href="#glyph1-19"
+ x="646.547743"
+ y="422.957954"
+ id="use2544"
+ style="fill:#ffb323;fill-opacity:1" />
+ <use
+ xlink:href="#glyph1-10"
+ x="656.825521"
+ y="422.957954"
+ id="use2546" />
+ <use
+ xlink:href="#glyph1-11"
+ x="664.325521"
+ y="422.957954"
+ id="use2548" />
+ <use
+ xlink:href="#glyph1-12"
+ x="671.269965"
+ y="422.957954"
+ id="use2550" />
+ <use
+ xlink:href="#glyph1-13"
+ x="685.436632"
+ y="422.957954"
+ id="use2552" />
+ <use
+ xlink:href="#glyph1-6"
+ x="694.881076"
+ y="422.957954"
+ id="use2554" />
+ <use
+ xlink:href="#glyph1-2"
+ x="707.658854"
+ y="422.957954"
+ id="use2556" />
+ <use
+ xlink:href="#glyph1-14"
+ x="721.825521"
+ y="422.957954"
+ id="use2558" />
+ <use
+ xlink:href="#glyph1-15"
+ x="735.158854"
+ y="422.957954"
+ id="use2560" />
+ <use
+ xlink:href="#glyph1-19"
+ x="751.825521"
+ y="422.957954"
+ id="use2562" />
+ <use
+ xlink:href="#glyph1-20"
+ x="762.103299"
+ y="422.957954"
+ id="use2564"
+ style="fill:#ffb323;fill-opacity:1" />
+ <use
+ xlink:href="#glyph1-9"
+ x="776.269965"
+ y="422.957954"
+ id="use2566"
+ style="fill:#ffb323;fill-opacity:1" />
+ <use
+ xlink:href="#glyph1-21"
+ x="789.881076"
+ y="422.957954"
+ id="use2568"
+ style="fill:#ffb323;fill-opacity:1" />
+ <use
+ xlink:href="#glyph1-19"
+ x="803.492188"
+ y="422.957954"
+ id="use2570" />
+ <use
+ xlink:href="#glyph1-17"
+ x="813.769965"
+ y="422.957954"
+ id="use2572" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:14.6266px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;stroke:#cccccc;stroke-width:0.483685"
+ x="61.029861"
+ y="206.28314"
+ id="text2605"><tspan
+ sodipodi:role="line"
+ id="tspan2603"
+ x="61.029861"
+ y="206.28314"
+ style="stroke:#cccccc;stroke-width:0.483685">cast not required</tspan></text>
+ <text
+ id="text2609"
+ y="127.66325"
+ x="395.55035"
+ style="font-size:14.6266px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;stroke:#cccccc;stroke-width:0.483685"
+ xml:space="preserve"><tspan
+ style="stroke:#cccccc;stroke-width:0.483685"
+ y="127.66325"
+ x="395.55035"
+ id="tspan2607"
+ sodipodi:role="line">only implements S8</tspan></text>
+ </g>
+</svg>
diff --git a/doc/neps/_static/dtype_hierarchy.svg b/doc/neps/_static/dtype_hierarchy.svg
new file mode 100644
index 000000000..3bade3d0f
--- /dev/null
+++ b/doc/neps/_static/dtype_hierarchy.svg
@@ -0,0 +1,935 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="432.64694mm"
+ height="374.31384mm"
+ viewBox="0 0 432.64693 374.31384"
+ version="1.1"
+ id="svg8"
+ inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
+ sodipodi:docname="dtype_hierarchy.svg"
+ inkscape:export-filename="/home/sebastian/BIDS/dtypes/dtype_hierarchy.png"
+ inkscape:export-xdpi="43.502129"
+ inkscape:export-ydpi="43.502129">
+ <defs
+ id="defs2">
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker1380"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow2Mend">
+ <path
+ transform="scale(-0.6)"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ id="path1378"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Mstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path835"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+ transform="matrix(0.4,0,0,0.4,4,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Mend"
+ style="overflow:visible"
+ inkscape:isstock="true"
+ inkscape:collect="always">
+ <path
+ id="path856"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="scale(-0.6)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Send"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Send"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path844"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path832"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.49497475"
+ inkscape:cx="-261.18562"
+ inkscape:cy="440.75659"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="3440"
+ inkscape:window-height="1376"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ fit-margin-top="10"
+ fit-margin-left="10"
+ fit-margin-right="10"
+ fit-margin-bottom="10" />
+ <metadata
+ id="metadata5">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(1.2604327,40.771063)">
+ <rect
+ style="opacity:1;fill:#ff9000;fill-opacity:1;stroke:none;stroke-width:1.16499996;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect2120"
+ width="44.63401"
+ height="17.105249"
+ x="23.573442"
+ y="161.07759"
+ rx="2.843874"
+ ry="2.5766025" />
+ <text
+ id="text2124"
+ y="172.67239"
+ x="30.910395"
+ style="font-style:normal;font-weight:normal;font-size:8.75081348px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-opacity:1"
+ y="172.67239"
+ x="30.910395"
+ id="tspan2122"
+ sodipodi:role="line">DType</tspan></text>
+ <g
+ id="g1288">
+ <rect
+ style="opacity:1;fill:#4dabcf;fill-opacity:1;stroke:none;stroke-width:1.37016749;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect2146"
+ width="61.739262"
+ height="17.105249"
+ x="42.09428"
+ y="203.41173"
+ rx="2.843874"
+ ry="2.5766025" />
+ <text
+ id="text2150"
+ y="215.00667"
+ x="56.400177"
+ style="font-style:normal;font-weight:normal;font-size:8.75081348px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+ xml:space="preserve"><tspan
+ style="stroke-width:0.26458332"
+ y="215.00667"
+ x="56.400177"
+ id="tspan2148"
+ sodipodi:role="line">Float64</tspan></text>
+ </g>
+ <g
+ id="g1283">
+ <rect
+ ry="2.5766025"
+ rx="2.843874"
+ y="182.24493"
+ x="42.09428"
+ height="17.105249"
+ width="61.739262"
+ id="rect2154"
+ style="opacity:1;fill:#4dabcf;fill-opacity:1;stroke:none;stroke-width:1.37016749;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:8.75081348px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+ x="61.425056"
+ y="194.36903"
+ id="text2158"><tspan
+ sodipodi:role="line"
+ id="tspan2156"
+ x="61.425056"
+ y="194.36903"
+ style="stroke-width:0.26458332">Int64</tspan></text>
+ </g>
+ <g
+ id="g1334"
+ transform="translate(46.037524,104.2459)">
+ <path
+ inkscape:connector-curvature="0"
+ id="path827"
+ d="m 58.264755,86.658881 h 10.69078"
+ style="fill:none;stroke:#000000;stroke-width:1.16499996;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2Mend)"
+ sodipodi:nodetypes="cc" />
+ </g>
+ <g
+ transform="translate(25.819071,143.16003)"
+ id="g2205">
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#9866cf;stroke-width:1.16499996;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect2199"
+ width="44.63401"
+ height="17.105249"
+ x="92.475258"
+ y="39.0849"
+ rx="0"
+ ry="0" />
+ <text
+ id="text2203"
+ y="50.67984"
+ x="99.81221"
+ style="font-style:normal;font-weight:normal;font-size:8.75081348px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+ xml:space="preserve"><tspan
+ style="stroke-width:0.26458332"
+ y="50.67984"
+ x="99.81221"
+ id="tspan2201"
+ sodipodi:role="line">&gt;int64</tspan></text>
+ </g>
+ <g
+ id="g2213"
+ transform="translate(75.560923,143.16003)">
+ <rect
+ ry="0"
+ rx="0"
+ y="39.0849"
+ x="92.475258"
+ height="17.105249"
+ width="44.63401"
+ id="rect2207"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#9866cf;stroke-width:1.16499996;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:8.75081348px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+ x="99.81221"
+ y="50.67984"
+ id="text2211"><tspan
+ sodipodi:role="line"
+ id="tspan2209"
+ x="99.81221"
+ y="50.67984"
+ style="stroke-width:0.26458332">&lt;int64</tspan></text>
+ </g>
+ <g
+ id="g2663"
+ transform="translate(-50.910137,157.97679)">
+ <g
+ id="g2645"
+ transform="translate(96.947661,-32.563904)">
+ <path
+ inkscape:connector-curvature="0"
+ id="path2643"
+ d="m 58.264755,86.658881 h 10.69078"
+ style="fill:none;stroke:#000000;stroke-width:1.16499996;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2Mend)"
+ sodipodi:nodetypes="cc" />
+ </g>
+ <g
+ transform="translate(76.729209,6.3500001)"
+ id="g2653">
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#9866cf;stroke-width:1.16499996;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect2647"
+ width="44.63401"
+ height="17.105249"
+ x="92.475258"
+ y="39.0849"
+ rx="0"
+ ry="0" />
+ <text
+ id="text2651"
+ y="50.67984"
+ x="97.166374"
+ style="font-style:normal;font-weight:normal;font-size:8.75081348px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+ xml:space="preserve"><tspan
+ style="stroke-width:0.26458332"
+ y="50.67984"
+ x="97.166374"
+ id="tspan2649"
+ sodipodi:role="line">&gt;float64</tspan></text>
+ </g>
+ <g
+ id="g2661"
+ transform="translate(126.47106,6.3500001)">
+ <rect
+ ry="0"
+ rx="0"
+ y="39.0849"
+ x="92.475258"
+ height="17.105249"
+ width="44.63401"
+ id="rect2655"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#9866cf;stroke-width:1.16499996;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:8.75081348px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+ x="96.637207"
+ y="50.67984"
+ id="text2659"><tspan
+ sodipodi:role="line"
+ id="tspan2657"
+ x="96.637207"
+ y="50.67984"
+ style="stroke-width:0.26458332">&lt;float64</tspan></text>
+ </g>
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:8.51278019px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+ x="146.93526"
+ y="178.48193"
+ id="text2737"><tspan
+ sodipodi:role="line"
+ id="tspan2735"
+ x="146.93526"
+ y="178.48193"
+ style="fill:#9866cf;fill-opacity:1;stroke-width:0.26458332">Instances</tspan></text>
+ <text
+ id="text2675-3"
+ y="153.10063"
+ x="8.1723146"
+ style="font-style:normal;font-weight:normal;font-size:11.38954353px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458329"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';stroke-width:0.26458329"
+ y="153.10063"
+ x="8.1723146"
+ id="tspan2673-6"
+ sodipodi:role="line">Concrete Types:</tspan></text>
+ <text
+ id="text3215"
+ y="72.108665"
+ x="243.3298"
+ style="font-style:normal;font-weight:normal;font-size:8.51278019px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+ xml:space="preserve"><tspan
+ style="fill:#9866cf;fill-opacity:1;stroke-width:0.26458332"
+ y="72.108665"
+ x="243.3298"
+ id="tspan3213"
+ sodipodi:role="line">Instances</tspan></text>
+ <g
+ id="g1293">
+ <rect
+ style="opacity:1;fill:#4dabcf;fill-opacity:1;stroke:none;stroke-width:1.37016749;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect2146-6"
+ width="61.739262"
+ height="17.105249"
+ x="42.297195"
+ y="224.75034"
+ rx="2.843874"
+ ry="2.5766025" />
+ <text
+ id="text2150-7"
+ y="236.34528"
+ x="47.843731"
+ style="font-style:normal;font-weight:normal;font-size:8.75081348px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+ xml:space="preserve"><tspan
+ style="stroke-width:0.26458332"
+ y="236.34528"
+ x="47.843731"
+ id="tspan2148-5"
+ sodipodi:role="line">datetime64</tspan></text>
+ </g>
+ <g
+ transform="translate(-50.910137,179.14359)"
+ id="g1057">
+ <g
+ transform="translate(96.947661,-32.563904)"
+ id="g1039">
+ <path
+ sodipodi:nodetypes="cc"
+ style="fill:none;stroke:#000000;stroke-width:1.16499996;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2Mend)"
+ d="m 58.264755,86.658881 h 10.69078"
+ id="path1037"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ id="g1047"
+ transform="translate(76.729209,6.3500001)">
+ <rect
+ ry="0"
+ rx="0"
+ y="39.0849"
+ x="92.475258"
+ height="17.105249"
+ width="44.63401"
+ id="rect1041"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#9866cf;stroke-width:1.16499996;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:8.75081348px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+ x="98.777588"
+ y="50.67984"
+ id="text1045"><tspan
+ sodipodi:role="line"
+ id="tspan1043"
+ x="98.777588"
+ y="50.67984"
+ style="stroke-width:0.26458332">&lt;M8[s]</tspan></text>
+ </g>
+ <g
+ transform="translate(126.47106,6.3500001)"
+ id="g1055">
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#9866cf;stroke-width:1.16499996;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect1049"
+ width="44.63401"
+ height="17.105249"
+ x="92.475258"
+ y="39.0849"
+ rx="0"
+ ry="0" />
+ <text
+ id="text1053"
+ y="50.67984"
+ x="96.000237"
+ style="font-style:normal;font-weight:normal;font-size:8.75081348px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+ xml:space="preserve"><tspan
+ style="stroke-width:0.26458332"
+ y="50.67984"
+ x="96.000237"
+ id="tspan1051"
+ sodipodi:role="line">&gt;M8[ns]</tspan></text>
+ <rect
+ ry="0"
+ rx="0"
+ y="39.0849"
+ x="92.475258"
+ height="17.105249"
+ width="44.63401"
+ id="rect1207"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#9866cf;stroke-width:1.16499996;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <g
+ id="g1265"
+ style="fill:#9866cf;fill-opacity:1"
+ transform="matrix(2.2707534,0,0,2.2707534,-177.4572,-60.535544)">
+ <circle
+ r="1.1358955"
+ cy="47.637524"
+ cx="141.20377"
+ id="path1256"
+ style="opacity:1;fill:#9866cf;fill-opacity:1;stroke:none;stroke-width:1.71979165;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <circle
+ style="opacity:1;fill:#9866cf;fill-opacity:1;stroke:none;stroke-width:1.71979165;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="circle1258"
+ cx="144.21054"
+ cy="47.637524"
+ r="1.1358955" />
+ <circle
+ r="1.1358955"
+ cy="47.637524"
+ cx="147.21733"
+ id="circle1260"
+ style="opacity:1;fill:#9866cf;fill-opacity:1;stroke:none;stroke-width:1.71979165;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ </g>
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:11.38954353px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458329"
+ x="8.1723146"
+ y="-22.317886"
+ id="text2802"><tspan
+ sodipodi:role="line"
+ id="tspan2800"
+ x="8.1723146"
+ y="-22.317886"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';stroke-width:0.26458329">Concept:</tspan></text>
+ <ellipse
+ ry="11.626225"
+ rx="29.800554"
+ cy="-4.7734947"
+ cx="53.874973"
+ id="path2804"
+ style="opacity:1;fill:#ffc553;fill-opacity:1;stroke:none;stroke-width:1.16499996;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:8.75081348px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-opacity:1"
+ x="28.792381"
+ y="-2.5054595"
+ id="text2808"><tspan
+ sodipodi:role="line"
+ id="tspan2806"
+ x="28.792381"
+ y="-2.5054595"
+ style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-opacity:1">DTypeMeta</tspan></text>
+ <rect
+ ry="2.5766025"
+ rx="2.843874"
+ y="-14.100398"
+ x="96.558197"
+ height="17.105249"
+ width="44.63401"
+ id="rect2810"
+ style="opacity:1;fill:#ff9000;fill-opacity:1;stroke:none;stroke-width:1.16499996;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:8.75081348px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-opacity:1"
+ x="104.69695"
+ y="-3.0399978"
+ id="text2814"><tspan
+ sodipodi:role="line"
+ id="tspan2812"
+ x="104.69695"
+ y="-3.0399978"
+ style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-opacity:1">DType</tspan></text>
+ <g
+ transform="translate(25.655198,-91.784983)"
+ id="g2818">
+ <path
+ sodipodi:nodetypes="cc"
+ style="fill:none;stroke:#000000;stroke-width:1.16499996;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2Mend)"
+ d="m 58.264755,86.658881 h 10.69078"
+ id="path2816"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ id="g2846"
+ transform="translate(4.3286934,-30.623148)">
+ <rect
+ ry="2.5766025"
+ rx="2.843874"
+ y="39.0849"
+ x="108.87944"
+ height="52.384823"
+ width="90.871613"
+ id="rect2840"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#ff9153;stroke-width:1.16499996;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:9.03164291px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+ x="112.0525"
+ y="50.851093"
+ id="text2844"><tspan
+ id="tspan2842"
+ sodipodi:role="line"
+ x="112.0525"
+ y="50.851093"
+ style="stroke-width:0.26458332">AbstractDtypes:</tspan><tspan
+ sodipodi:role="line"
+ x="112.0525"
+ y="62.140648"
+ style="stroke-width:0.26458332"
+ id="tspan3068">• type hierarchy</tspan><tspan
+ sodipodi:role="line"
+ x="112.0525"
+ y="73.430199"
+ style="stroke-width:0.26458332"
+ id="tspan3078">• UFunc resolution</tspan><tspan
+ sodipodi:role="line"
+ x="112.0525"
+ y="84.719757"
+ style="stroke-width:0.26458332"
+ id="tspan3072">• may promote</tspan><tspan
+ sodipodi:role="line"
+ x="112.0525"
+ y="96.009308"
+ style="stroke-width:0.26458332"
+ id="tspan3066" /></text>
+ </g>
+ <g
+ transform="translate(20.732865,35.976636)"
+ id="g2854">
+ <rect
+ style="opacity:1;fill:#4dabcf;fill-opacity:1;stroke:none;stroke-width:1.16499996;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect2848"
+ width="91.940727"
+ height="47.306705"
+ x="92.475258"
+ y="39.0849"
+ rx="2.843874"
+ ry="2.5766025" />
+ <text
+ id="text2852"
+ y="49.872658"
+ x="96.583473"
+ style="font-style:normal;font-weight:normal;font-size:8.75081348px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+ xml:space="preserve"><tspan
+ style="stroke-width:0.26458332"
+ y="49.872658"
+ x="96.583473"
+ id="tspan2850"
+ sodipodi:role="line">Concrete DTypes:</tspan><tspan
+ style="stroke-width:0.26458332"
+ y="60.811176"
+ x="96.583473"
+ sodipodi:role="line"
+ id="tspan3086">• casting/promotion</tspan><tspan
+ style="stroke-width:0.26458332"
+ y="71.749695"
+ x="96.583473"
+ sodipodi:role="line"
+ id="tspan3088">• UFunc signature</tspan></text>
+ </g>
+ <g
+ transform="translate(148.727,10.030009)"
+ id="g2858">
+ <path
+ sodipodi:nodetypes="cc"
+ style="fill:none;stroke:#000000;stroke-width:1.16499996;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2Mend)"
+ d="m 58.264755,86.658881 h 10.69078"
+ id="path2856"
+ inkscape:connector-curvature="0" />
+ </g>
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#9866cf;stroke-width:1.16499996;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect2860"
+ width="84.724449"
+ height="45.435818"
+ x="220.98373"
+ y="75.328812"
+ rx="0"
+ ry="0" />
+ <text
+ id="text2864"
+ y="86.923752"
+ x="228.32069"
+ style="font-style:normal;font-weight:normal;font-size:8.75081348px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+ xml:space="preserve"><tspan
+ style="stroke-width:0.26458332"
+ y="86.923752"
+ x="228.32069"
+ id="tspan2862"
+ sodipodi:role="line">DType Instances</tspan><tspan
+ id="tspan3074"
+ style="stroke-width:0.26458332"
+ y="97.862267"
+ x="228.32069"
+ sodipodi:role="line">• Describe data</tspan><tspan
+ id="tspan3076"
+ style="stroke-width:0.26458332"
+ y="108.80079"
+ x="228.32069"
+ sodipodi:role="line">• `arr.dtype`</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:8.75081348px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+ x="228.32069"
+ y="38.240372"
+ id="text3096"><tspan
+ sodipodi:role="line"
+ x="228.32069"
+ y="38.240372"
+ style="stroke-width:0.26458332"
+ id="tspan3094">(Cannot be instantiated)</tspan></text>
+ <text
+ id="text3223"
+ y="277.53149"
+ x="163.20908"
+ style="font-style:normal;font-weight:normal;font-size:8.75081348px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+ xml:space="preserve"><tspan
+ id="tspan3221"
+ style="stroke-width:0.26458332"
+ y="277.53149"
+ x="163.20908"
+ sodipodi:role="line">Concrete Types form</tspan><tspan
+ style="stroke-width:0.26458332"
+ y="288.47"
+ x="163.20908"
+ sodipodi:role="line"
+ id="tspan3225">leaves of the tree;</tspan><tspan
+ id="tspan3248"
+ style="stroke-width:0.26458332"
+ y="299.40854"
+ x="163.20908"
+ sodipodi:role="line">the inheritance is abstract</tspan><tspan
+ id="tspan3270"
+ style="stroke-width:0.26458332"
+ y="310.34705"
+ x="163.20908"
+ sodipodi:role="line">similar to Python's abc.ABC. </tspan></text>
+ <g
+ id="g3084"
+ transform="translate(35.454183,8.4666671)">
+ <g
+ transform="translate(111.41246,-60.58556)"
+ id="g3058">
+ <path
+ sodipodi:nodetypes="cc"
+ style="fill:none;stroke:#000000;stroke-width:1.16499996;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2Mend)"
+ d="m 58.264755,86.658881 h 10.69078"
+ id="path3056"
+ inkscape:connector-curvature="0" />
+ </g>
+ <text
+ id="text3062"
+ y="33.375549"
+ x="177.81163"
+ style="font-style:normal;font-weight:normal;font-size:25.73707581px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+ xml:space="preserve"><tspan
+ style="stroke-width:0.26458332"
+ y="33.375549"
+ x="177.81163"
+ id="tspan3060"
+ sodipodi:role="line">x</tspan></text>
+ </g>
+ <path
+ sodipodi:nodetypes="ccc"
+ inkscape:connector-curvature="0"
+ id="path3217"
+ d="m 240.37519,140.22719 v 115.49978 l -21.73363,-0.0959"
+ style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cc"
+ style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 373.75879,132.43914 H 41.810036"
+ id="path3219"
+ inkscape:connector-curvature="0" />
+ <g
+ id="g1383"
+ transform="translate(1.5875)">
+ <g
+ transform="translate(282.50926,124.19261)"
+ id="g1309">
+ <rect
+ ry="2.5766025"
+ rx="2.843874"
+ y="182.24493"
+ x="42.09428"
+ height="17.105249"
+ width="61.739262"
+ id="rect1303"
+ style="opacity:1;fill:#4dabcf;fill-opacity:1;stroke:none;stroke-width:1.37016749;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:8.75081348px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+ x="61.425056"
+ y="194.36903"
+ id="text1307"><tspan
+ sodipodi:role="line"
+ id="tspan1305"
+ x="61.425056"
+ y="194.36903"
+ style="stroke-width:0.26458332">Int64</tspan></text>
+ </g>
+ <g
+ transform="translate(283.57834,60.501707)"
+ id="g1301">
+ <rect
+ style="opacity:1;fill:#4dabcf;fill-opacity:1;stroke:none;stroke-width:1.37016749;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect1295"
+ width="61.739262"
+ height="17.105249"
+ x="42.09428"
+ y="203.41173"
+ rx="2.843874"
+ ry="2.5766025" />
+ <text
+ id="text1299"
+ y="215.00667"
+ x="56.400177"
+ style="font-style:normal;font-weight:normal;font-size:8.75081348px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+ xml:space="preserve"><tspan
+ style="stroke-width:0.26458332"
+ y="215.00667"
+ x="56.400177"
+ id="tspan1297"
+ sodipodi:role="line">Float64</tspan></text>
+ </g>
+ <g
+ transform="translate(185.91751,182.30441)"
+ id="g2195">
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#ff9153;stroke-width:1.16499996;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect2187"
+ width="44.63401"
+ height="17.105249"
+ x="108.87944"
+ y="39.0849"
+ rx="2.843874"
+ ry="2.5766025" />
+ <text
+ id="text2193"
+ y="50.321926"
+ x="113.11084"
+ style="font-style:normal;font-weight:normal;font-size:9.03164291px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+ xml:space="preserve"><tspan
+ style="stroke-width:0.26458332"
+ y="50.321926"
+ x="113.11084"
+ sodipodi:role="line"
+ id="tspan2191">Inexact</tspan></text>
+ </g>
+ <g
+ id="g2671"
+ transform="translate(172.15917,161.04236)">
+ <rect
+ ry="2.5766025"
+ rx="2.843874"
+ y="39.0849"
+ x="108.87944"
+ height="17.105249"
+ width="44.63401"
+ id="rect2665"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#ff9153;stroke-width:1.16499996;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:9.03164291px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+ x="112.0525"
+ y="50.851093"
+ id="text2669"><tspan
+ id="tspan2667"
+ sodipodi:role="line"
+ x="112.0525"
+ y="50.851093"
+ style="stroke-width:0.26458332">Numeric</tspan></text>
+ </g>
+ <g
+ id="g2701"
+ transform="translate(170.57168,118.51826)">
+ <rect
+ ry="2.5766025"
+ rx="2.843874"
+ y="39.0849"
+ x="92.475258"
+ height="17.105249"
+ width="44.63401"
+ id="rect2695"
+ style="opacity:1;fill:#ff9153;fill-opacity:1;stroke:none;stroke-width:1.16499996;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:8.75081348px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+ x="99.81221"
+ y="50.67984"
+ id="text2699"><tspan
+ sodipodi:role="line"
+ id="tspan2697"
+ x="99.81221"
+ y="50.67984"
+ style="stroke-width:0.26458332">DType</tspan></text>
+ </g>
+ <g
+ id="g2709"
+ transform="translate(201.26335,203.56648)">
+ <rect
+ ry="2.5766025"
+ rx="2.843874"
+ y="39.0849"
+ x="108.87944"
+ height="17.105249"
+ width="44.63401"
+ id="rect2703"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#ff9153;stroke-width:1.16499996;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:9.03164291px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+ x="112.0525"
+ y="50.321926"
+ id="text2707"><tspan
+ id="tspan2705"
+ sodipodi:role="line"
+ x="112.0525"
+ y="50.321926"
+ style="stroke-width:0.26458332">Floating</tspan></text>
+ </g>
+ <g
+ id="g2717"
+ transform="translate(185.38297,221.7489)">
+ <rect
+ ry="2.5766025"
+ rx="2.843874"
+ y="63.42659"
+ x="108.87944"
+ height="17.105249"
+ width="44.63401"
+ id="rect2711"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#ff9153;stroke-width:1.16499996;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:9.03164291px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+ x="113.11084"
+ y="74.663612"
+ id="text2715"><tspan
+ id="tspan2713"
+ sodipodi:role="line"
+ x="113.11084"
+ y="74.663612"
+ style="stroke-width:0.26458332">Integral</tspan></text>
+ </g>
+ <text
+ id="text2774"
+ y="149.89339"
+ x="244.4957"
+ style="font-style:normal;font-weight:normal;font-size:11.38954258px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458329"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';stroke-width:0.26458329"
+ y="149.89339"
+ x="244.4957"
+ id="tspan2772"
+ sodipodi:role="line">Abstract Types (Hierarchy):</tspan></text>
+ <g
+ transform="translate(238.74141,-45.88513)"
+ id="g1317">
+ <rect
+ style="opacity:1;fill:#4dabcf;fill-opacity:1;stroke:none;stroke-width:1.37016749;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect1311"
+ width="61.739262"
+ height="17.105249"
+ x="42.297195"
+ y="224.75034"
+ rx="2.843874"
+ ry="2.5766025" />
+ <text
+ id="text1315"
+ y="236.34528"
+ x="47.843731"
+ style="font-style:normal;font-weight:normal;font-size:8.75081348px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+ xml:space="preserve"><tspan
+ style="stroke-width:0.26458332"
+ y="236.34528"
+ x="47.843731"
+ id="tspan1313"
+ sodipodi:role="line">datetime64</tspan></text>
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/doc/neps/_static/nep-0041-type-sketch-no-fonts.svg b/doc/neps/_static/nep-0041-type-sketch-no-fonts.svg
new file mode 100644
index 000000000..3250396c5
--- /dev/null
+++ b/doc/neps/_static/nep-0041-type-sketch-no-fonts.svg
@@ -0,0 +1,1110 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ inkscape:version="1.0rc1 (09960d6f05, 2020-04-09)"
+ sodipodi:docname="nep-0041-type-sketch-no-fonts.svg"
+ id="svg8"
+ version="1.1"
+ viewBox="0 0 390.05549 139.7222"
+ height="139.7222mm"
+ width="390.05548mm">
+ <defs
+ id="defs2">
+ <rect
+ x="-108.43283"
+ y="116.0488"
+ width="38.824516"
+ height="5.9122801"
+ id="rect3054" />
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker7096"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Send">
+ <path
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
+ style="fill:#00b200;fill-opacity:1;fill-rule:evenodd;stroke:#00b200;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path7094"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker5628"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Send">
+ <path
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
+ style="fill:#000081;fill-opacity:1;fill-rule:evenodd;stroke:#000081;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path5626"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker5618"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Sstart">
+ <path
+ transform="matrix(0.2,0,0,0.2,1.2,0)"
+ style="fill:#000081;fill-opacity:1;fill-rule:evenodd;stroke:#000081;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path5616"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker4826"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Send">
+ <path
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
+ style="fill:#206120;fill-opacity:1;fill-rule:evenodd;stroke:#206120;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path4824"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Send"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker4400"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4398"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#00b200;fill-opacity:1;fill-rule:evenodd;stroke:#00b200;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker4390"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Send">
+ <path
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
+ style="fill:#b7943d;fill-opacity:1;fill-rule:evenodd;stroke:#b7943d;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path4388"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker2037"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Send">
+ <path
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
+ style="fill:#f4ae00;fill-opacity:1;fill-rule:evenodd;stroke:#ffc433;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path2035"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <rect
+ id="rect1296"
+ height="8.8755655"
+ width="16.467854"
+ y="100.87298"
+ x="-2.9674385" />
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="Arrow1Lend"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Lend">
+ <path
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path915"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="Arrow1Lstart"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Lstart">
+ <path
+ transform="matrix(0.8,0,0,0.8,10,0)"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path912"
+ inkscape:connector-curvature="0" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ inkscape:guide-bbox="true"
+ showguides="true"
+ inkscape:window-maximized="1"
+ inkscape:window-y="27"
+ inkscape:window-x="0"
+ inkscape:window-height="1376"
+ inkscape:window-width="2560"
+ showgrid="false"
+ inkscape:document-rotation="0"
+ inkscape:current-layer="layer1"
+ inkscape:document-units="mm"
+ inkscape:cy="290.82008"
+ inkscape:cx="134.87089"
+ inkscape:zoom="0.98994949"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ lock-margins="true"
+ fit-margin-top="2"
+ fit-margin-left="2"
+ fit-margin-right="2"
+ fit-margin-bottom="2"
+ objecttolerance="29.7"
+ gridtolerance="20.4"
+ guidetolerance="19.1"
+ inkscape:snap-perpendicular="true"
+ inkscape:snap-tangential="true" />
+ <metadata
+ id="metadata5">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1"
+ transform="translate(143.44857,-67.864137)">
+ <path
+ sodipodi:nodetypes="sssssssss"
+ inkscape:connector-curvature="0"
+ id="path1976"
+ style="opacity:1;fill:#ddb9b9;fill-opacity:0.796078;stroke:none;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.2, 2.4;stroke-dashoffset:0;stroke-opacity:0.497957"
+ d="m 175.57699,126.11316 h 65.38081 c 1.14406,0 2.06509,0.92103 2.06509,2.06509 v 15.54342 c 0,1.14406 -0.92103,2.06509 -2.06509,2.06509 h -65.38081 c -1.14406,0 -2.06509,-0.92103 -2.06509,-2.06509 v -15.54342 c 0,-1.14406 0.92103,-2.06509 2.06509,-2.06509 z" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3044"
+ d="M 172.89254,70.114137 V 205.33633"
+ style="fill:none;stroke:#808080;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ d="M 55.143494,98.892926 H 240.95778 c 1.14406,0 2.06509,0.921034 2.06509,2.065094 v 15.54342 c 0,1.14406 -0.92103,2.06509 -2.06509,2.06509 H 55.143494 c -1.14406,0 -2.06509,-0.92103 -2.06509,-2.06509 v -15.54342 c 0,-1.14406 0.92103,-2.065094 2.06509,-2.065094 z"
+ style="opacity:1;fill:#ddb9b9;fill-opacity:0.796609;stroke:none;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.2, 2.4;stroke-dashoffset:0;stroke-opacity:0.497957"
+ id="rect5208"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssssssss" />
+ <path
+ d="M -60.569299,98.727824 H 50.002364 c 1.14406,0 2.06509,0.92103 2.06509,2.065086 v 15.70853 c 0,1.14406 -0.92103,2.06509 -2.06509,2.06509 H -60.569299 c -1.14406,0 -2.06509,-0.92103 -2.06509,-2.06509 v -15.70853 c 0,-1.144056 0.92103,-2.065086 2.06509,-2.065086 z"
+ style="opacity:0.25;fill:#000080;fill-opacity:0.4;stroke:none;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.2, 2.4;stroke-dashoffset:0;stroke-opacity:0.497957"
+ id="rect4618"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssssssss" />
+ <g
+ style="font-size:6.7452px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;stroke-width:0.505891"
+ id="text4368" />
+ <g
+ style="font-size:3.52778px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect1296)"
+ id="text1294" />
+ <g
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.76111px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke-width:0.105503"
+ id="text1931"
+ aria-label="Value Storage">
+ <path
+ id="path1309"
+ style="fill:#000000;stroke-width:0.105503"
+ d="m 177.73074,82.757808 h 1.46657 l 1.50069,4.176144 1.49689,-4.176144 h 1.46658 l -2.09565,5.65788 h -1.73943 z" />
+ <path
+ id="path1311"
+ style="fill:#000000;stroke-width:0.105503"
+ d="m 185.82912,86.505727 q -0.42443,0 -0.64044,0.144005 -0.21222,0.144005 -0.21222,0.424436 0,0.257693 0.17053,0.405487 0.17432,0.144005 0.48128,0.144005 0.38275,0 0.64424,-0.272851 0.26148,-0.276641 0.26148,-0.689708 v -0.155374 z m 2.07292,-0.511597 v 2.421558 h -1.36805 v -0.629075 q -0.27285,0.38654 -0.61392,0.564651 -0.34106,0.174322 -0.82992,0.174322 -0.65939,0 -1.07246,-0.38275 -0.40928,-0.38654 -0.40928,-1.000456 0,-0.746552 0.5116,-1.095195 0.51539,-0.348644 1.61437,-0.348644 h 0.79961 v -0.106109 q 0,-0.322116 -0.25391,-0.469911 -0.2539,-0.151584 -0.79202,-0.151584 -0.43581,0 -0.81098,0.08716 -0.37517,0.08716 -0.69729,0.261483 v -1.034562 q 0.43581,-0.106109 0.8754,-0.159164 0.4396,-0.05684 0.87919,-0.05684 1.14825,0 1.65606,0.454753 0.5116,0.450963 0.5116,1.470366 z" />
+ <path
+ id="path1313"
+ style="fill:#000000;stroke-width:0.105503"
+ d="m 189.16397,82.519063 h 1.35668 v 5.896625 h -1.35668 z" />
+ <path
+ id="path1315"
+ style="fill:#000000;stroke-width:0.105503"
+ d="m 191.7788,86.76342 v -2.592089 h 1.36426 v 0.424435 q 0,0.344854 -0.004,0.86782 -0.004,0.519176 -0.004,0.693497 0,0.511597 0.0265,0.738973 0.0265,0.223587 0.0909,0.325906 0.0834,0.132636 0.216,0.204639 0.13643,0.072 0.31075,0.072 0.42444,0 0.66697,-0.325906 0.24254,-0.325906 0.24254,-0.905715 v -2.095651 h 1.35667 v 4.244357 h -1.35667 v -0.613916 q -0.30696,0.371381 -0.65182,0.549492 -0.34106,0.174322 -0.75413,0.174322 -0.73518,0 -1.12172,-0.450963 -0.38275,-0.450963 -0.38275,-1.311203 z" />
+ <path
+ id="path1317"
+ style="fill:#000000;stroke-width:0.105503"
+ d="m 201.5863,86.28214 v 0.38654 h -3.1719 q 0.0493,0.47749 0.34485,0.716235 0.29559,0.238745 0.82613,0.238745 0.42823,0 0.8754,-0.125057 0.45097,-0.128846 0.92467,-0.386539 v 1.04593 q -0.48128,0.181901 -0.96256,0.272852 -0.48128,0.09474 -0.96256,0.09474 -1.15204,0 -1.79249,-0.583599 -0.63665,-0.587389 -0.63665,-1.644688 0,-1.038352 0.62529,-1.63332 0.62907,-0.594968 1.72806,-0.594968 1.00045,0 1.59921,0.602547 0.60255,0.602548 0.60255,1.610582 z m -1.39458,-0.450963 q 0,-0.386539 -0.22737,-0.621495 -0.22359,-0.238745 -0.58739,-0.238745 -0.39412,0 -0.64045,0.223587 -0.24632,0.219797 -0.30695,0.636653 z" />
+ <path
+ id="path1319"
+ style="fill:#000000;stroke-width:0.105503"
+ d="m 209.3133,82.93592 v 1.197515 q -0.46612,-0.208429 -0.9095,-0.314538 -0.44339,-0.106109 -0.83751,-0.106109 -0.52296,0 -0.77308,0.144005 -0.25011,0.144005 -0.25011,0.447174 0,0.227376 0.16674,0.356223 0.17053,0.125057 0.61392,0.216007 l 0.62149,0.125057 q 0.94361,0.18948 1.34152,0.57602 0.39791,0.38654 0.39791,1.098985 0,0.936032 -0.55707,1.394575 -0.55328,0.454752 -1.69395,0.454752 -0.53813,0 -1.08004,-0.102319 -0.54191,-0.10232 -1.08383,-0.303169 v -1.231621 q 0.54192,0.28801 1.04593,0.435804 0.50781,0.144005 0.97772,0.144005 0.47749,0 0.7314,-0.159163 0.2539,-0.159163 0.2539,-0.454752 0,-0.265273 -0.17432,-0.409278 -0.17054,-0.144005 -0.68592,-0.257693 l -0.56465,-0.125057 q -0.84887,-0.181901 -1.24299,-0.579809 -0.39033,-0.397909 -0.39033,-1.072458 0,-0.845082 0.5457,-1.299835 0.5457,-0.454752 1.5689,-0.454752 0.46612,0 0.95877,0.072 0.49265,0.06821 1.0194,0.208429 z" />
+ <path
+ id="path1321"
+ style="fill:#000000;stroke-width:0.105503"
+ d="m 212.38667,82.966236 v 1.205095 h 1.39836 v 0.970138 h -1.39836 v 1.800062 q 0,0.29559 0.11748,0.401699 0.11747,0.102319 0.46612,0.102319 h 0.69728 v 0.970139 h -1.1634 q -0.8034,0 -1.14068,-0.333486 -0.33348,-0.337274 -0.33348,-1.140671 v -1.800062 h -0.67455 v -0.970138 h 0.67455 v -1.205095 z" />
+ <path
+ id="path1323"
+ style="fill:#000000;stroke-width:0.105503"
+ d="m 216.63482,85.03915 q -0.45097,0 -0.68971,0.325906 -0.23496,0.322116 -0.23496,0.932243 0,0.610126 0.23496,0.936032 0.23874,0.322116 0.68971,0.322116 0.44338,0 0.67834,-0.322116 0.23495,-0.325906 0.23495,-0.936032 0,-0.610127 -0.23495,-0.932243 -0.23496,-0.325906 -0.67834,-0.325906 z m 0,-0.970139 q 1.09519,0 1.70911,0.591179 0.6177,0.591178 0.6177,1.637109 0,1.045931 -0.6177,1.637109 -0.61392,0.591178 -1.70911,0.591178 -1.09899,0 -1.72048,-0.591178 -0.61771,-0.591178 -0.61771,-1.637109 0,-1.045931 0.61771,-1.637109 0.62149,-0.591179 1.72048,-0.591179 z" />
+ <path
+ id="path1325"
+ style="fill:#000000;stroke-width:0.105503"
+ d="m 223.09988,85.32716 q -0.17811,-0.08337 -0.35622,-0.121267 -0.17433,-0.04169 -0.35244,-0.04169 -0.52296,0 -0.80718,0.337275 -0.28043,0.333485 -0.28043,0.95877 v 1.955436 h -1.35668 v -4.244357 h 1.35668 v 0.697287 q 0.26148,-0.416857 0.59875,-0.606337 0.34107,-0.19327 0.81477,-0.19327 0.0682,0 0.14779,0.0076 0.0796,0.0038 0.23117,0.02274 z" />
+ <path
+ id="path1327"
+ style="fill:#000000;stroke-width:0.105503"
+ d="m 225.67681,86.505727 q -0.42443,0 -0.64044,0.144005 -0.21222,0.144005 -0.21222,0.424436 0,0.257693 0.17053,0.405487 0.17433,0.144005 0.48128,0.144005 0.38275,0 0.64424,-0.272851 0.26148,-0.276641 0.26148,-0.689708 v -0.155374 z m 2.07292,-0.511597 v 2.421558 h -1.36805 v -0.629075 q -0.27285,0.38654 -0.61392,0.564651 -0.34106,0.174322 -0.82992,0.174322 -0.65939,0 -1.07246,-0.38275 -0.40928,-0.38654 -0.40928,-1.000456 0,-0.746552 0.5116,-1.095195 0.51539,-0.348644 1.61437,-0.348644 h 0.79961 v -0.106109 q 0,-0.322116 -0.2539,-0.469911 -0.25391,-0.151584 -0.79203,-0.151584 -0.43581,0 -0.81098,0.08716 -0.37517,0.08716 -0.69728,0.261483 v -1.034562 q 0.4358,-0.106109 0.87539,-0.159164 0.4396,-0.05684 0.87919,-0.05684 1.14825,0 1.65606,0.454753 0.5116,0.450963 0.5116,1.470366 z" />
+ <path
+ id="path1329"
+ style="fill:#000000;stroke-width:0.105503"
+ d="m 231.89934,87.695663 q -0.28043,0.371381 -0.6177,0.545703 -0.33728,0.174322 -0.78066,0.174322 -0.77687,0 -1.28468,-0.610127 -0.5078,-0.613916 -0.5078,-1.561317 0,-0.95119 0.5078,-1.557527 0.50781,-0.610126 1.28468,-0.610126 0.44338,0 0.78066,0.174321 0.33727,0.174322 0.6177,0.549493 v -0.629074 h 1.36426 v 3.816131 q 0,1.023193 -0.64802,1.561317 -0.64424,0.541914 -1.87207,0.541914 -0.39791,0 -0.76929,-0.06063 -0.37138,-0.06063 -0.74655,-0.185691 v -1.057299 q 0.35622,0.204638 0.69729,0.303168 0.34106,0.102319 0.68592,0.102319 0.66697,0 0.97771,-0.291799 0.31075,-0.2918 0.31075,-0.913295 z M 231.005,85.054308 q -0.42065,0 -0.65561,0.310748 -0.23495,0.310748 -0.23495,0.879188 0,0.583599 0.22737,0.886768 0.22738,0.299378 0.66319,0.299378 0.42443,0 0.65939,-0.310747 0.23495,-0.310748 0.23495,-0.875399 0,-0.56844 -0.23495,-0.879188 -0.23496,-0.310748 -0.65939,-0.310748 z" />
+ <path
+ id="path1331"
+ style="fill:#000000;stroke-width:0.105503"
+ d="m 238.804,86.28214 v 0.38654 h -3.1719 q 0.0493,0.47749 0.34486,0.716235 0.29559,0.238745 0.82613,0.238745 0.42823,0 0.8754,-0.125057 0.45096,-0.128846 0.92466,-0.386539 v 1.04593 q -0.48128,0.181901 -0.96256,0.272852 -0.48128,0.09474 -0.96256,0.09474 -1.15204,0 -1.79248,-0.583599 -0.63665,-0.587389 -0.63665,-1.644688 0,-1.038352 0.62528,-1.63332 0.62908,-0.594968 1.72806,-0.594968 1.00046,0 1.59922,0.602547 0.60254,0.602548 0.60254,1.610582 z m -1.39457,-0.450963 q 0,-0.386539 -0.22738,-0.621495 -0.22358,-0.238745 -0.58739,-0.238745 -0.39412,0 -0.64044,0.223587 -0.24632,0.219797 -0.30696,0.636653 z" />
+ </g>
+ <g
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.76111px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke-width:0.105503"
+ id="text1935"
+ aria-label="Parameters and
+Storage options">
+ <path
+ id="path1254"
+ style="fill:#000000;stroke-width:0.105503"
+ d="m 78.339383,73.092678 h 2.421558 q 1.080037,0 1.656057,0.481279 0.579809,0.47749 0.579809,1.364258 0,0.890557 -0.579809,1.371837 -0.57602,0.47749 -1.656057,0.47749 h -0.96256 v 1.963015 h -1.458998 z m 1.458998,1.057299 v 1.580265 h 0.807186 q 0.424436,0 0.655601,-0.204638 0.231166,-0.208429 0.231166,-0.587389 0,-0.378961 -0.231166,-0.583599 -0.231165,-0.204639 -0.655601,-0.204639 z" />
+ <path
+ id="path1256"
+ style="fill:#000000;stroke-width:0.105503"
+ d="m 85.660899,76.840596 q -0.424436,0 -0.640443,0.144005 -0.212218,0.144005 -0.212218,0.424436 0,0.257693 0.170532,0.405488 0.174322,0.144005 0.48128,0.144005 0.38275,0 0.644233,-0.272852 0.261482,-0.276641 0.261482,-0.689708 V 76.840596 Z M 87.733813,76.329 v 2.421557 h -1.368048 v -0.629074 q -0.272851,0.386539 -0.613915,0.564651 -0.341065,0.174321 -0.829924,0.174321 -0.659391,0 -1.072458,-0.38275 -0.409277,-0.386539 -0.409277,-1.000455 0,-0.746552 0.511596,-1.095196 0.515387,-0.348643 1.614372,-0.348643 h 0.799606 v -0.106109 q 0,-0.322117 -0.253903,-0.469911 -0.253904,-0.151584 -0.792027,-0.151584 -0.435805,0 -0.810976,0.08716 -0.375171,0.08716 -0.697287,0.261483 v -1.034562 q 0.435805,-0.106109 0.875399,-0.159163 0.439594,-0.05684 0.879188,-0.05684 1.14825,0 1.656057,0.454752 0.511597,0.450963 0.511597,1.470367 z" />
+ <path
+ id="path1258"
+ style="fill:#000000;stroke-width:0.105503"
+ d="m 92.148702,75.662029 q -0.178112,-0.08337 -0.356223,-0.121267 -0.174322,-0.04169 -0.352433,-0.04169 -0.522966,0 -0.807186,0.337275 -0.280431,0.333485 -0.280431,0.95877 v 1.955436 H 88.995751 V 74.5062 h 1.356678 v 0.697287 q 0.261483,-0.416856 0.598758,-0.606336 0.341064,-0.19327 0.814765,-0.19327 0.06821,0 0.147794,0.0076 0.07958,0.0038 0.231166,0.02274 z" />
+ <path
+ id="path1260"
+ style="fill:#000000;stroke-width:0.105503"
+ d="m 94.725633,76.840596 q -0.424436,0 -0.640444,0.144005 -0.212217,0.144005 -0.212217,0.424436 0,0.257693 0.170532,0.405488 0.174322,0.144005 0.48128,0.144005 0.38275,0 0.644232,-0.272852 0.261483,-0.276641 0.261483,-0.689708 V 76.840596 Z M 96.798546,76.329 v 2.421557 h -1.368047 v -0.629074 q -0.272852,0.386539 -0.613916,0.564651 -0.341064,0.174321 -0.829923,0.174321 -0.659391,0 -1.072458,-0.38275 -0.409278,-0.386539 -0.409278,-1.000455 0,-0.746552 0.511597,-1.095196 0.515386,-0.348643 1.614371,-0.348643 h 0.799607 v -0.106109 q 0,-0.322117 -0.253904,-0.469911 -0.253903,-0.151584 -0.792027,-0.151584 -0.435804,0 -0.810975,0.08716 -0.375171,0.08716 -0.697287,0.261483 v -1.034562 q 0.435804,-0.106109 0.875398,-0.159163 0.439594,-0.05684 0.879188,-0.05684 1.148251,0 1.656058,0.454752 0.511596,0.450963 0.511596,1.470367 z" />
+ <path
+ id="path1262"
+ style="fill:#000000;stroke-width:0.105503"
+ d="m 101.99409,75.211066 q 0.2577,-0.394118 0.61013,-0.598757 0.35622,-0.208428 0.78066,-0.208428 0.73139,0 1.11414,0.450963 0.38275,0.450963 0.38275,1.311203 v 2.58451 h -1.36426 v -2.213129 q 0.004,-0.04927 0.004,-0.102319 0.004,-0.05306 0.004,-0.151585 0,-0.450962 -0.13263,-0.651811 -0.13264,-0.204639 -0.42823,-0.204639 -0.38654,0 -0.59876,0.318327 -0.20842,0.318326 -0.216,0.920874 v 2.084282 h -1.36426 v -2.213129 q 0,-0.704866 -0.12127,-0.905715 -0.12126,-0.204639 -0.43201,-0.204639 -0.390332,0 -0.602549,0.322116 -0.212218,0.318327 -0.212218,0.913295 v 2.088072 H 98.052905 V 74.5062 h 1.364258 v 0.621495 q 0.250114,-0.360012 0.57223,-0.541913 0.325907,-0.181901 0.716237,-0.181901 0.43959,0 0.77687,0.212218 0.33727,0.212217 0.51159,0.594967 z" />
+ <path
+ id="path1264"
+ style="fill:#000000;stroke-width:0.105503"
+ d="m 110.38428,76.61701 v 0.386539 h -3.1719 q 0.0493,0.47749 0.34485,0.716236 0.29559,0.238745 0.82614,0.238745 0.42822,0 0.8754,-0.125057 0.45096,-0.128847 0.92466,-0.38654 v 1.045931 q -0.48128,0.181901 -0.96256,0.272851 -0.48128,0.09474 -0.96256,0.09474 -1.15204,0 -1.79248,-0.583599 -0.63666,-0.587388 -0.63666,-1.644688 0,-1.038352 0.62529,-1.633319 0.62907,-0.594968 1.72806,-0.594968 1.00045,0 1.59921,0.602547 0.60255,0.602547 0.60255,1.610582 z m -1.39458,-0.450963 q 0,-0.38654 -0.22737,-0.621495 -0.22359,-0.238745 -0.58739,-0.238745 -0.39412,0 -0.64044,0.223586 -0.24633,0.219797 -0.30696,0.636654 z" />
+ <path
+ id="path1266"
+ style="fill:#000000;stroke-width:0.105503"
+ d="M 112.893,73.301106 V 74.5062 h 1.39836 v 0.970139 H 112.893 v 1.800062 q 0,0.295589 0.11747,0.401698 0.11748,0.102319 0.46613,0.102319 h 0.69728 v 0.970139 h -1.16341 q -0.80339,0 -1.14067,-0.333485 -0.33348,-0.337275 -0.33348,-1.140671 v -1.800062 h -0.67455 V 74.5062 h 0.67455 v -1.205094 z" />
+ <path
+ id="path1268"
+ style="fill:#000000;stroke-width:0.105503"
+ d="m 119.35806,76.61701 v 0.386539 h -3.1719 q 0.0493,0.47749 0.34486,0.716236 0.29558,0.238745 0.82613,0.238745 0.42822,0 0.8754,-0.125057 0.45096,-0.128847 0.92466,-0.38654 v 1.045931 q -0.48128,0.181901 -0.96256,0.272851 -0.48128,0.09474 -0.96256,0.09474 -1.15204,0 -1.79248,-0.583599 -0.63665,-0.587388 -0.63665,-1.644688 0,-1.038352 0.62528,-1.633319 0.62908,-0.594968 1.72806,-0.594968 1.00046,0 1.59921,0.602547 0.60255,0.602547 0.60255,1.610582 z m -1.39457,-0.450963 q 0,-0.38654 -0.22738,-0.621495 -0.22359,-0.238745 -0.58739,-0.238745 -0.39412,0 -0.64044,0.223586 -0.24633,0.219797 -0.30696,0.636654 z" />
+ <path
+ id="path1270"
+ style="fill:#000000;stroke-width:0.105503"
+ d="m 123.53799,75.662029 q -0.17811,-0.08337 -0.35622,-0.121267 -0.17432,-0.04169 -0.35243,-0.04169 -0.52297,0 -0.80719,0.337275 -0.28043,0.333485 -0.28043,0.95877 v 1.955436 h -1.35668 V 74.5062 h 1.35668 v 0.697287 q 0.26148,-0.416856 0.59876,-0.606336 0.34106,-0.19327 0.81476,-0.19327 0.0682,0 0.1478,0.0076 0.0796,0.0038 0.23116,0.02274 z" />
+ <path
+ id="path1272"
+ style="fill:#000000;stroke-width:0.105503"
+ d="m 127.52845,74.638836 v 1.030773 q -0.4358,-0.181901 -0.84129,-0.272852 -0.40549,-0.09095 -0.7655,-0.09095 -0.38654,0 -0.57602,0.09853 -0.18569,0.09474 -0.18569,0.295589 0,0.162953 0.14021,0.250114 0.14401,0.08716 0.5116,0.128847 l 0.23874,0.03411 q 1.04215,0.132636 1.40216,0.435805 0.36001,0.303168 0.36001,0.95119 0,0.67834 -0.50023,1.019404 -0.50023,0.341064 -1.4931,0.341064 -0.42065,0 -0.87161,-0.06821 -0.44717,-0.06442 -0.92087,-0.19706 v -1.030772 q 0.40548,0.197059 0.82992,0.295589 0.42822,0.09853 0.86782,0.09853 0.39791,0 0.59876,-0.109899 0.20084,-0.109898 0.20084,-0.325906 0,-0.181901 -0.14021,-0.269062 -0.13643,-0.09095 -0.54949,-0.140215 l -0.23875,-0.03032 q -0.90571,-0.113688 -1.26952,-0.420646 -0.3638,-0.306958 -0.3638,-0.932243 0,-0.674549 0.46233,-1.000455 0.46234,-0.325906 1.41732,-0.325906 0.37517,0 0.78823,0.05684 0.41307,0.05684 0.89814,0.178111 z" />
+ <path
+ id="path1274"
+ style="fill:#000000;stroke-width:0.105503"
+ d="m 133.43644,76.840596 q -0.42443,0 -0.64044,0.144005 -0.21222,0.144005 -0.21222,0.424436 0,0.257693 0.17053,0.405488 0.17432,0.144005 0.48128,0.144005 0.38275,0 0.64424,-0.272852 0.26148,-0.276641 0.26148,-0.689708 V 76.840596 Z M 135.50935,76.329 v 2.421557 h -1.36804 v -0.629074 q -0.27285,0.386539 -0.61392,0.564651 -0.34106,0.174321 -0.82992,0.174321 -0.65939,0 -1.07246,-0.38275 -0.40928,-0.386539 -0.40928,-1.000455 0,-0.746552 0.5116,-1.095196 0.51539,-0.348643 1.61437,-0.348643 h 0.79961 v -0.106109 q 0,-0.322117 -0.25391,-0.469911 -0.2539,-0.151584 -0.79202,-0.151584 -0.43581,0 -0.81098,0.08716 -0.37517,0.08716 -0.69729,0.261483 v -1.034562 q 0.43581,-0.106109 0.8754,-0.159163 0.4396,-0.05684 0.87919,-0.05684 1.14825,0 1.65606,0.454752 0.51159,0.450963 0.51159,1.470367 z" />
+ <path
+ id="path1276"
+ style="fill:#000000;stroke-width:0.105503"
+ d="m 141.03839,76.166047 v 2.58451 h -1.36426 v -0.420646 -1.557528 q 0,-0.549492 -0.0265,-0.75792 -0.0227,-0.208429 -0.0834,-0.306958 -0.0796,-0.132637 -0.21601,-0.204639 -0.13642,-0.07579 -0.31074,-0.07579 -0.42444,0 -0.66697,0.329695 -0.24254,0.325906 -0.24254,0.905716 v 2.088072 h -1.35668 V 74.5062 h 1.35668 v 0.621495 q 0.30696,-0.371381 0.65181,-0.545703 0.34486,-0.178111 0.76171,-0.178111 0.73519,0 1.11415,0.450963 0.38275,0.450963 0.38275,1.311203 z" />
+ <path
+ id="path1278"
+ style="fill:#000000;stroke-width:0.105503"
+ d="m 145.18421,75.127695 v -2.273763 h 1.36426 v 5.896625 h -1.36426 v -0.613916 q -0.28043,0.375171 -0.6177,0.549493 -0.33728,0.174321 -0.78066,0.174321 -0.78445,0 -1.28847,-0.621495 -0.50401,-0.625284 -0.50401,-1.606792 0,-0.981507 0.50401,-1.603003 0.50402,-0.625284 1.28847,-0.625284 0.43959,0 0.77687,0.178111 0.34106,0.174322 0.62149,0.545703 z m -0.89434,2.747463 q 0.4358,0 0.66318,-0.318326 0.23116,-0.318327 0.23116,-0.924664 0,-0.606337 -0.23116,-0.924663 -0.22738,-0.318327 -0.66318,-0.318327 -0.43202,0 -0.66318,0.318327 -0.22738,0.318326 -0.22738,0.924663 0,0.606337 0.22738,0.924664 0.23116,0.318326 0.66318,0.318326 z" />
+ <path
+ id="path1280"
+ style="fill:#000000;stroke-width:0.105503"
+ d="m 82.276782,82.972176 v 1.197515 q -0.466121,-0.208428 -0.909505,-0.314537 -0.443383,-0.106109 -0.837502,-0.106109 -0.522966,0 -0.773079,0.144005 -0.250114,0.144005 -0.250114,0.447173 0,0.227377 0.166742,0.356223 0.170532,0.125057 0.613916,0.216008 l 0.621495,0.125057 q 0.943612,0.18948 1.34152,0.57602 0.397909,0.386539 0.397909,1.098985 0,0.936032 -0.557072,1.394574 -0.553282,0.454753 -1.693953,0.454753 -0.538124,0 -1.080038,-0.10232 -0.541913,-0.102319 -1.083826,-0.303168 v -1.231621 q 0.541913,0.28801 1.04593,0.435804 0.507807,0.144005 0.977718,0.144005 0.47749,0 0.731394,-0.159163 0.253903,-0.159164 0.253903,-0.454753 0,-0.265272 -0.174321,-0.409277 -0.170533,-0.144005 -0.685919,-0.257693 L 79.817329,86.0986 q -0.848871,-0.181901 -1.24299,-0.57981 -0.390329,-0.397908 -0.390329,-1.072458 0,-0.845081 0.545703,-1.299834 0.545703,-0.454752 1.568896,-0.454752 0.466121,0 0.95877,0.072 0.492648,0.06821 1.019403,0.208428 z" />
+ <path
+ id="path1282"
+ style="fill:#000000;stroke-width:0.105503"
+ d="m 85.350152,83.002493 v 1.205094 h 1.398364 v 0.970139 h -1.398364 v 1.800062 q 0,0.295589 0.117477,0.401698 0.117478,0.10232 0.466122,0.10232 h 0.697287 v 0.970138 h -1.163409 q -0.803396,0 -1.140671,-0.333485 -0.333485,-0.337275 -0.333485,-1.140671 v -1.800062 h -0.674549 v -0.970139 h 0.674549 v -1.205094 z" />
+ <path
+ id="path1284"
+ style="fill:#000000;stroke-width:0.105503"
+ d="m 89.598298,85.075407 q -0.450963,0 -0.689708,0.325906 -0.234955,0.322116 -0.234955,0.932242 0,0.610127 0.234955,0.936033 0.238745,0.322116 0.689708,0.322116 0.443384,0 0.678339,-0.322116 0.234956,-0.325906 0.234956,-0.936033 0,-0.610126 -0.234956,-0.932242 -0.234955,-0.325906 -0.678339,-0.325906 z m 0,-0.970139 q 1.095196,0 1.709112,0.591178 0.617705,0.591179 0.617705,1.637109 0,1.045931 -0.617705,1.637109 -0.613916,0.591179 -1.709112,0.591179 -1.098985,0 -1.72048,-0.591179 -0.617706,-0.591178 -0.617706,-1.637109 0,-1.04593 0.617706,-1.637109 0.621495,-0.591178 1.72048,-0.591178 z" />
+ <path
+ id="path1286"
+ style="fill:#000000;stroke-width:0.105503"
+ d="m 96.063363,85.363417 q -0.178111,-0.08337 -0.356223,-0.121268 -0.174322,-0.04169 -0.352433,-0.04169 -0.522965,0 -0.807186,0.337274 -0.28043,0.333486 -0.28043,0.95877 v 1.955436 h -1.356679 v -4.244357 h 1.356679 v 0.697288 q 0.261482,-0.416857 0.598757,-0.606337 0.341064,-0.19327 0.814765,-0.19327 0.06821,0 0.147795,0.0076 0.07958,0.0038 0.231165,0.02274 z" />
+ <path
+ id="path1288"
+ style="fill:#000000;stroke-width:0.105503"
+ d="m 98.640295,86.541984 q -0.424436,0 -0.640443,0.144005 -0.212218,0.144005 -0.212218,0.424435 0,0.257693 0.170532,0.405488 0.174322,0.144005 0.48128,0.144005 0.38275,0 0.644233,-0.272852 0.261482,-0.276641 0.261482,-0.689708 v -0.155373 z m 2.072915,-0.511597 v 2.421557 H 99.345161 V 87.82287 q -0.272851,0.38654 -0.613916,0.564651 -0.341064,0.174322 -0.829923,0.174322 -0.659391,0 -1.072458,-0.38275 -0.409277,-0.38654 -0.409277,-1.000456 0,-0.746552 0.511596,-1.095196 0.515387,-0.348643 1.614372,-0.348643 h 0.799606 v -0.106109 q 0,-0.322116 -0.253903,-0.469911 -0.253904,-0.151584 -0.792027,-0.151584 -0.435805,0 -0.810976,0.08716 -0.375171,0.08716 -0.697287,0.261482 v -1.034562 q 0.435804,-0.106108 0.875399,-0.159163 0.439594,-0.05684 0.879188,-0.05684 1.14825,0 1.656055,0.454753 0.5116,0.450962 0.5116,1.470366 z" />
+ <path
+ id="path1290"
+ style="fill:#000000;stroke-width:0.105503"
+ d="m 104.86282,87.731919 q -0.28043,0.371382 -0.6177,0.545703 -0.33728,0.174322 -0.78066,0.174322 -0.77687,0 -1.28468,-0.610126 -0.5078,-0.613916 -0.5078,-1.561317 0,-0.951191 0.5078,-1.557528 0.50781,-0.610126 1.28468,-0.610126 0.44338,0 0.78066,0.174322 0.33727,0.174322 0.6177,0.549493 v -0.629075 h 1.36426 v 3.816132 q 0,1.023193 -0.64802,1.561317 -0.64423,0.541913 -1.87207,0.541913 -0.3979,0 -0.76928,-0.06063 -0.37139,-0.06063 -0.74656,-0.185691 v -1.0573 q 0.35623,0.204639 0.69729,0.303169 0.34106,0.102319 0.68592,0.102319 0.66697,0 0.97772,-0.291799 0.31074,-0.2918 0.31074,-0.913295 z m -0.89434,-2.641354 q -0.42065,0 -0.6556,0.310748 -0.23496,0.310747 -0.23496,0.879188 0,0.583599 0.22738,0.886767 0.22737,0.299379 0.66318,0.299379 0.42443,0 0.65939,-0.310747 0.23495,-0.310748 0.23495,-0.875399 0,-0.568441 -0.23495,-0.879188 -0.23496,-0.310748 -0.65939,-0.310748 z" />
+ <path
+ id="path1292"
+ style="fill:#000000;stroke-width:0.105503"
+ d="m 111.76748,86.318397 v 0.38654 h -3.17189 q 0.0493,0.47749 0.34485,0.716235 0.29559,0.238745 0.82613,0.238745 0.42823,0 0.8754,-0.125057 0.45096,-0.128847 0.92467,-0.38654 v 1.045931 q -0.48128,0.181901 -0.96256,0.272852 -0.48128,0.09474 -0.96256,0.09474 -1.15204,0 -1.79249,-0.583599 -0.63665,-0.587389 -0.63665,-1.644689 0,-1.038351 0.62528,-1.633319 0.62908,-0.594968 1.72806,-0.594968 1.00046,0 1.59922,0.602547 0.60254,0.602547 0.60254,1.610582 z m -1.39457,-0.450963 q 0,-0.38654 -0.22738,-0.621495 -0.22358,-0.238745 -0.58738,-0.238745 -0.39412,0 -0.64045,0.223586 -0.24632,0.219798 -0.30696,0.636654 z" />
+ <path
+ id="path1294"
+ style="fill:#000000;stroke-width:0.105503"
+ d="m 117.51631,85.075407 q -0.45096,0 -0.6897,0.325906 -0.23496,0.322116 -0.23496,0.932242 0,0.610127 0.23496,0.936033 0.23874,0.322116 0.6897,0.322116 0.44339,0 0.67834,-0.322116 0.23496,-0.325906 0.23496,-0.936033 0,-0.610126 -0.23496,-0.932242 -0.23495,-0.325906 -0.67834,-0.325906 z m 0,-0.970139 q 1.0952,0 1.70912,0.591178 0.6177,0.591179 0.6177,1.637109 0,1.045931 -0.6177,1.637109 -0.61392,0.591179 -1.70912,0.591179 -1.09898,0 -1.72048,-0.591179 -0.6177,-0.591178 -0.6177,-1.637109 0,-1.04593 0.6177,-1.637109 0.6215,-0.591178 1.72048,-0.591178 z" />
+ <path
+ id="path1296"
+ style="fill:#000000;stroke-width:0.105503"
+ d="m 122.18511,87.838028 v 2.228288 h -1.35668 v -5.858729 h 1.35668 v 0.621495 q 0.28043,-0.371381 0.62149,-0.545703 0.34107,-0.178111 0.78445,-0.178111 0.78445,0 1.28847,0.625285 0.50401,0.621495 0.50401,1.603002 0,0.981508 -0.50401,1.606793 -0.50402,0.621495 -1.28847,0.621495 -0.44338,0 -0.78445,-0.174322 -0.34106,-0.178111 -0.62149,-0.549493 z m 0.90192,-2.747463 q -0.4358,0 -0.67076,0.322116 -0.23116,0.318327 -0.23116,0.920874 0,0.602547 0.23116,0.924664 0.23496,0.318327 0.67076,0.318327 0.43581,0 0.66318,-0.318327 0.23117,-0.318327 0.23117,-0.924664 0,-0.606336 -0.23117,-0.924663 -0.22737,-0.318327 -0.66318,-0.318327 z" />
+ <path
+ id="path1298"
+ style="fill:#000000;stroke-width:0.105503"
+ d="m 127.86573,83.002493 v 1.205094 h 1.39836 v 0.970139 h -1.39836 v 1.800062 q 0,0.295589 0.11747,0.401698 0.11748,0.10232 0.46612,0.10232 h 0.69729 v 0.970138 h -1.16341 q -0.80339,0 -1.14067,-0.333485 -0.33348,-0.337275 -0.33348,-1.140671 v -1.800062 h -0.67455 v -0.970139 h 0.67455 v -1.205094 z" />
+ <path
+ id="path1300"
+ style="fill:#000000;stroke-width:0.105503"
+ d="m 130.09401,84.207587 h 1.35668 v 4.244357 h -1.35668 z m 0,-1.652267 h 1.35668 v 1.106564 h -1.35668 z" />
+ <path
+ id="path1302"
+ style="fill:#000000;stroke-width:0.105503"
+ d="m 134.77417,85.075407 q -0.45096,0 -0.68971,0.325906 -0.23495,0.322116 -0.23495,0.932242 0,0.610127 0.23495,0.936033 0.23875,0.322116 0.68971,0.322116 0.44339,0 0.67834,-0.322116 0.23496,-0.325906 0.23496,-0.936033 0,-0.610126 -0.23496,-0.932242 -0.23495,-0.325906 -0.67834,-0.325906 z m 0,-0.970139 q 1.0952,0 1.70911,0.591178 0.61771,0.591179 0.61771,1.637109 0,1.045931 -0.61771,1.637109 -0.61391,0.591179 -1.70911,0.591179 -1.09898,0 -1.72048,-0.591179 -0.6177,-0.591178 -0.6177,-1.637109 0,-1.04593 0.6177,-1.637109 0.6215,-0.591178 1.72048,-0.591178 z" />
+ <path
+ id="path1304"
+ style="fill:#000000;stroke-width:0.105503"
+ d="m 142.35338,85.867434 v 2.58451 h -1.36426 v -0.420646 -1.557527 q 0,-0.549493 -0.0265,-0.757921 -0.0227,-0.208428 -0.0834,-0.306958 -0.0796,-0.132636 -0.21601,-0.204639 -0.13643,-0.07579 -0.31075,-0.07579 -0.42444,0 -0.66697,0.329696 -0.24253,0.325906 -0.24253,0.905715 v 2.088072 h -1.35668 v -4.244357 h 1.35668 v 0.621495 q 0.30695,-0.371381 0.65181,-0.545703 0.34485,-0.178111 0.76171,-0.178111 0.73518,0 1.11414,0.450963 0.38275,0.450963 0.38275,1.311203 z" />
+ <path
+ id="path1306"
+ style="fill:#000000;stroke-width:0.105503"
+ d="m 146.92743,84.340223 v 1.030773 q -0.4358,-0.181901 -0.84129,-0.272852 -0.40549,-0.09095 -0.7655,-0.09095 -0.38654,0 -0.57602,0.09853 -0.18569,0.09474 -0.18569,0.295589 0,0.162953 0.14022,0.250114 0.144,0.08716 0.51159,0.128846 l 0.23875,0.03411 q 1.04214,0.132636 1.40215,0.435804 0.36001,0.303168 0.36001,0.951191 0,0.678339 -0.50022,1.019403 -0.50023,0.341065 -1.49311,0.341065 -0.42065,0 -0.87161,-0.06821 -0.44717,-0.06442 -0.92087,-0.19706 v -1.030772 q 0.40549,0.197059 0.82992,0.295589 0.42823,0.09853 0.86782,0.09853 0.39791,0 0.59876,-0.109899 0.20085,-0.109898 0.20085,-0.325906 0,-0.181901 -0.14022,-0.269062 -0.13642,-0.09095 -0.54949,-0.140215 l -0.23875,-0.03032 q -0.90571,-0.113688 -1.26951,-0.420646 -0.36381,-0.306958 -0.36381,-0.932242 0,-0.67455 0.46234,-1.000456 0.46233,-0.325906 1.41731,-0.325906 0.37517,0 0.78824,0.05684 0.41306,0.05684 0.89813,0.178111 z" />
+ </g>
+ <g
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.72103px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke-width:0.105503"
+ id="text1939"
+ aria-label="Value Space and
+Behaviour">
+ <path
+ id="path1209"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -41.05733,73.092678 h 1.466577 l 1.500683,4.176144 1.496894,-4.176144 h 1.466577 l -2.095652,5.657879 h -1.739428 z" />
+ <path
+ id="path1211"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -32.958945,76.840596 q -0.424436,0 -0.640444,0.144005 -0.212217,0.144005 -0.212217,0.424436 0,0.257693 0.170532,0.405488 0.174322,0.144005 0.48128,0.144005 0.38275,0 0.644232,-0.272852 0.261483,-0.276641 0.261483,-0.689708 V 76.840596 Z M -30.886032,76.329 v 2.421557 h -1.368047 v -0.629074 q -0.272851,0.386539 -0.613916,0.564651 -0.341064,0.174321 -0.829923,0.174321 -0.659391,0 -1.072458,-0.38275 -0.409278,-0.386539 -0.409278,-1.000455 0,-0.746552 0.511597,-1.095196 0.515386,-0.348643 1.614371,-0.348643 h 0.799607 v -0.106109 q 0,-0.322117 -0.253903,-0.469911 -0.253904,-0.151584 -0.792028,-0.151584 -0.435804,0 -0.810975,0.08716 -0.375171,0.08716 -0.697287,0.261483 v -1.034562 q 0.435804,-0.106109 0.875398,-0.159163 0.439594,-0.05684 0.879188,-0.05684 1.148251,0 1.656058,0.454752 0.511596,0.450963 0.511596,1.470367 z" />
+ <path
+ id="path1213"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -29.624094,72.853932 h 1.356679 v 5.896625 h -1.356679 z" />
+ <path
+ id="path1215"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="M -27.009267,77.098289 V 74.5062 h 1.364258 v 0.424436 q 0,0.344854 -0.0038,0.867819 -0.0038,0.519176 -0.0038,0.693498 0,0.511596 0.02653,0.738973 0.02653,0.223586 0.09095,0.325906 0.08337,0.132636 0.216008,0.204638 0.136426,0.072 0.310747,0.072 0.424436,0 0.666971,-0.325906 0.242534,-0.325906 0.242534,-0.905716 V 74.5062 h 1.356679 v 4.244357 h -1.356679 v -0.613916 q -0.306958,0.371381 -0.651812,0.549493 -0.341064,0.174321 -0.754131,0.174321 -0.735183,0 -1.121723,-0.450962 -0.38275,-0.450963 -0.38275,-1.311204 z" />
+ <path
+ id="path1217"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -17.201771,76.61701 v 0.386539 h -3.171899 q 0.04927,0.47749 0.344854,0.716236 0.295589,0.238745 0.826134,0.238745 0.428225,0 0.875399,-0.125057 0.450962,-0.128847 0.924663,-0.38654 v 1.045931 q -0.48128,0.181901 -0.96256,0.272851 -0.481279,0.09474 -0.962559,0.09474 -1.15204,0 -1.792483,-0.583599 -0.636653,-0.587388 -0.636653,-1.644688 0,-1.038352 0.625284,-1.633319 0.629075,-0.594968 1.72806,-0.594968 1.000455,0 1.599213,0.602547 0.602547,0.602547 0.602547,1.610582 z m -1.394574,-0.450963 q 0,-0.38654 -0.227377,-0.621495 -0.223586,-0.238745 -0.587388,-0.238745 -0.394119,0 -0.640443,0.223586 -0.246325,0.219797 -0.306958,0.636654 z" />
+ <path
+ id="path1219"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -9.4747663,73.270789 v 1.197515 q -0.4661213,-0.208428 -0.9095047,-0.314537 -0.443384,-0.106109 -0.837503,-0.106109 -0.522965,0 -0.773079,0.144005 -0.250114,0.144005 -0.250114,0.447173 0,0.227376 0.166742,0.356223 0.170533,0.125057 0.613916,0.216007 l 0.621496,0.125057 q 0.943611,0.189481 1.3415195,0.57602 0.3979084,0.38654 0.3979084,1.098986 0,0.936032 -0.5570718,1.394574 -0.5532821,0.454752 -1.6939531,0.454752 -0.538124,0 -1.080037,-0.102319 -0.541914,-0.102319 -1.083827,-0.303168 v -1.231622 q 0.541913,0.28801 1.045931,0.435805 0.507807,0.144005 0.977718,0.144005 0.47749,0 0.731393,-0.159164 0.253904,-0.159163 0.253904,-0.454752 0,-0.265272 -0.174322,-0.409277 -0.170532,-0.144005 -0.685918,-0.257693 l -0.564652,-0.125057 q -0.848871,-0.181901 -1.24299,-0.57981 -0.390329,-0.397908 -0.390329,-1.072458 0,-0.845082 0.545703,-1.299834 0.545703,-0.454753 1.568896,-0.454753 0.466122,0 0.95877,0.072 0.492649,0.06821 1.0194037,0.208428 z" />
+ <path
+ id="path1221"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -6.5264561,78.136641 v 2.228287 H -7.8831345 V 74.5062 h 1.3566784 v 0.621495 q 0.2804307,-0.371381 0.6214951,-0.545703 0.3410644,-0.178111 0.7844481,-0.178111 0.7844481,0 1.2884655,0.625284 0.5040174,0.621496 0.5040174,1.603003 0,0.981508 -0.5040174,1.606792 -0.5040174,0.621495 -1.2884655,0.621495 -0.4433837,0 -0.7844481,-0.174321 -0.3410644,-0.178112 -0.6214951,-0.549493 z m 0.9019258,-2.747463 q -0.4358045,0 -0.6707599,0.322116 -0.2311659,0.318327 -0.2311659,0.920874 0,0.602547 0.2311659,0.924664 0.2349554,0.318326 0.6707599,0.318326 0.4358046,0 0.6631808,-0.318326 0.2311659,-0.318327 0.2311659,-0.924664 0,-0.606337 -0.2311659,-0.924663 -0.2273762,-0.318327 -0.6631808,-0.318327 z" />
+ <path
+ id="path1223"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -0.425192,76.840596 q -0.4244357,0 -0.6404431,0.144005 -0.2122179,0.144005 -0.2122179,0.424436 0,0.257693 0.1705322,0.405488 0.1743218,0.144005 0.48127976,0.144005 0.38275005,0 0.64423275,-0.272852 0.26148271,-0.276641 0.26148271,-0.689708 V 76.840596 Z M 1.6477216,76.329 v 2.421557 H 0.27967442 v -0.629074 q -0.27285152,0.386539 -0.61391592,0.564651 -0.3410644,0.174321 -0.8299234,0.174321 -0.6593911,0 -1.072458,-0.38275 -0.4092773,-0.386539 -0.4092773,-1.000455 0,-0.746552 0.5115966,-1.095196 0.5153862,-0.348643 1.61437149,-0.348643 h 0.79960653 v -0.106109 q 0,-0.322117 -0.2539035,-0.469911 -0.2539035,-0.151584 -0.79202732,-0.151584 -0.4358045,0 -0.8109753,0.08716 -0.3751709,0.08716 -0.6972873,0.261483 v -1.034562 q 0.4358046,-0.106109 0.8753987,-0.159163 0.43959407,-0.05684 0.87918819,-0.05684 1.14825013,0 1.65605711,0.454752 0.5115966,0.450963 0.5115966,1.470367 z" />
+ <path
+ id="path1225"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m 6.3392508,74.638836 v 1.106565 Q 6.0626097,75.55592 5.7821789,75.46497 q -0.2766411,-0.09095 -0.5760198,-0.09095 -0.5684407,0 -0.8867675,0.333486 -0.3145371,0.329695 -0.3145371,0.924663 0,0.594968 0.3145371,0.928453 0.3183268,0.329696 0.8867675,0.329696 0.3183267,0 0.6025471,-0.09474 0.2880099,-0.09474 0.5305446,-0.280431 V 78.6255 q -0.3183268,0.117478 -0.6480224,0.174322 -0.325906,0.06063 -0.6556015,0.06063 -1.1482502,0 -1.7962725,-0.587388 -0.6480224,-0.591178 -0.6480224,-1.640899 0,-1.04972 0.6480224,-1.637109 0.6480223,-0.591178 1.7962725,-0.591178 0.3334852,0 0.6556015,0.06063 0.325906,0.05684 0.6480224,0.174322 z" />
+ <path
+ id="path1227"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m 11.747019,76.61701 v 0.386539 H 8.5751198 q 0.049265,0.47749 0.344854,0.716236 0.2955891,0.238745 0.8261337,0.238745 0.4282255,0 0.8753985,-0.125057 0.450963,-0.128847 0.924664,-0.38654 v 1.045931 q -0.48128,0.181901 -0.96256,0.272851 -0.48128,0.09474 -0.9625594,0.09474 -1.1520398,0 -1.7924829,-0.583599 -0.6366536,-0.587388 -0.6366536,-1.644688 0,-1.038352 0.6252848,-1.633319 0.6290743,-0.594968 1.7280596,-0.594968 1.0004555,0 1.5992135,0.602547 0.602547,0.602547 0.602547,1.610582 z m -1.394575,-0.450963 q 0,-0.38654 -0.227376,-0.621495 -0.2235867,-0.238745 -0.5873887,-0.238745 -0.3941189,0 -0.6404432,0.223586 -0.2463243,0.219797 -0.3069579,0.636654 z" />
+ <path
+ id="path1229"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m 17.37837,76.840596 q -0.424436,0 -0.640443,0.144005 -0.212218,0.144005 -0.212218,0.424436 0,0.257693 0.170532,0.405488 0.174322,0.144005 0.48128,0.144005 0.38275,0 0.644233,-0.272852 0.261483,-0.276641 0.261483,-0.689708 V 76.840596 Z M 19.451284,76.329 v 2.421557 h -1.368047 v -0.629074 q -0.272852,0.386539 -0.613916,0.564651 -0.341065,0.174321 -0.829924,0.174321 -0.659391,0 -1.072458,-0.38275 -0.409277,-0.386539 -0.409277,-1.000455 0,-0.746552 0.511597,-1.095196 0.515386,-0.348643 1.614371,-0.348643 h 0.799607 v -0.106109 q 0,-0.322117 -0.253904,-0.469911 -0.253903,-0.151584 -0.792027,-0.151584 -0.435805,0 -0.810976,0.08716 -0.37517,0.08716 -0.697287,0.261483 v -1.034562 q 0.435805,-0.106109 0.875399,-0.159163 0.439594,-0.05684 0.879188,-0.05684 1.14825,0 1.656057,0.454752 0.511597,0.450963 0.511597,1.470367 z" />
+ <path
+ id="path1231"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m 24.980316,76.166047 v 2.58451 h -1.364258 v -0.420646 -1.557528 q 0,-0.549492 -0.02653,-0.75792 -0.02274,-0.208429 -0.08337,-0.306958 -0.07958,-0.132637 -0.216007,-0.204639 -0.136426,-0.07579 -0.310748,-0.07579 -0.424435,0 -0.66697,0.329695 -0.242535,0.325906 -0.242535,0.905716 v 2.088072 H 20.713221 V 74.5062 h 1.356678 v 0.621495 q 0.306958,-0.371381 0.651812,-0.545703 0.344854,-0.178111 0.761711,-0.178111 0.735183,0 1.114143,0.450963 0.382751,0.450963 0.382751,1.311203 z" />
+ <path
+ id="path1233"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m 29.126141,75.127695 v -2.273763 h 1.364258 v 5.896625 h -1.364258 v -0.613916 q -0.28043,0.375171 -0.617705,0.549493 -0.337275,0.174321 -0.780659,0.174321 -0.784448,0 -1.288465,-0.621495 -0.504018,-0.625284 -0.504018,-1.606792 0,-0.981507 0.504018,-1.603003 0.504017,-0.625284 1.288465,-0.625284 0.439594,0 0.776869,0.178111 0.341065,0.174322 0.621495,0.545703 z m -0.894346,2.747463 q 0.435804,0 0.66318,-0.318326 0.231166,-0.318327 0.231166,-0.924664 0,-0.606337 -0.231166,-0.924663 -0.227376,-0.318327 -0.66318,-0.318327 -0.432015,0 -0.663181,0.318327 -0.227376,0.318326 -0.227376,0.924663 0,0.606337 0.227376,0.924664 0.231166,0.318326 0.663181,0.318326 z" />
+ <path
+ id="path1235"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -38.116597,84.984456 q 0.344854,0 0.522965,-0.151584 0.178112,-0.151584 0.178112,-0.447173 0,-0.2918 -0.178112,-0.443384 -0.178111,-0.155374 -0.522965,-0.155374 h -0.807186 v 1.197515 z m 0.04926,2.474612 q 0.439594,0 0.659391,-0.185691 0.223586,-0.18569 0.223586,-0.560861 0,-0.367592 -0.219797,-0.549493 -0.219797,-0.18569 -0.66318,-0.18569 h -0.856451 v 1.481735 z m 1.356678,-2.035018 q 0.469911,0.136426 0.727604,0.504018 0.257693,0.367591 0.257693,0.901926 0,0.818554 -0.553282,1.220252 -0.553282,0.401698 -1.682584,0.401698 h -2.421558 v -5.657879 h 2.190392 q 1.178567,0 1.705322,0.356223 0.530544,0.356222 0.530544,1.140671 0,0.413066 -0.19327,0.704866 -0.193269,0.28801 -0.560861,0.428225 z" />
+ <path
+ id="path1237"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -30.291064,86.318397 v 0.38654 h -3.171899 q 0.04927,0.47749 0.344854,0.716235 0.295589,0.238745 0.826134,0.238745 0.428225,0 0.875399,-0.125057 0.450962,-0.128847 0.924663,-0.38654 v 1.045931 q -0.48128,0.181901 -0.96256,0.272852 -0.481279,0.09474 -0.962559,0.09474 -1.15204,0 -1.792483,-0.583599 -0.636653,-0.587389 -0.636653,-1.644689 0,-1.038351 0.625284,-1.633319 0.629075,-0.594968 1.72806,-0.594968 1.000455,0 1.599213,0.602547 0.602547,0.602547 0.602547,1.610582 z m -1.394574,-0.450963 q 0,-0.38654 -0.227377,-0.621495 -0.223586,-0.238745 -0.587388,-0.238745 -0.394119,0 -0.640443,0.223586 -0.246325,0.219798 -0.306958,0.636654 z" />
+ <path
+ id="path1239"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -24.996987,85.867434 v 2.58451 h -1.364258 V 88.031298 86.48135 q 0,-0.557072 -0.02653,-0.7655 -0.02274,-0.208428 -0.08337,-0.306958 -0.07958,-0.132636 -0.216008,-0.204639 -0.136425,-0.07579 -0.310747,-0.07579 -0.424436,0 -0.666971,0.329696 -0.242534,0.325906 -0.242534,0.905715 v 2.088072 h -1.356679 V 82.55532 h 1.356679 v 2.273762 q 0.306958,-0.371381 0.651812,-0.545703 0.344854,-0.178111 0.76171,-0.178111 0.735183,0 1.114144,0.450963 0.38275,0.450963 0.38275,1.311203 z" />
+ <path
+ id="path1241"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -21.836456,86.541984 q -0.424436,0 -0.640444,0.144005 -0.212217,0.144005 -0.212217,0.424435 0,0.257693 0.170532,0.405488 0.174322,0.144005 0.48128,0.144005 0.38275,0 0.644232,-0.272852 0.261483,-0.276641 0.261483,-0.689708 v -0.155373 z m 2.072913,-0.511597 v 2.421557 H -21.13159 V 87.82287 q -0.272852,0.38654 -0.613916,0.564651 -0.341064,0.174322 -0.829923,0.174322 -0.659391,0 -1.072458,-0.38275 -0.409278,-0.38654 -0.409278,-1.000456 0,-0.746552 0.511597,-1.095196 0.515386,-0.348643 1.614371,-0.348643 h 0.799607 v -0.106109 q 0,-0.322116 -0.253903,-0.469911 -0.253904,-0.151584 -0.792028,-0.151584 -0.435804,0 -0.810975,0.08716 -0.375171,0.08716 -0.697287,0.261482 v -1.034562 q 0.435804,-0.106108 0.875398,-0.159163 0.439594,-0.05684 0.879188,-0.05684 1.148251,0 1.656058,0.454753 0.511596,0.450962 0.511596,1.470366 z" />
+ <path
+ id="path1243"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -19.035938,84.207587 h 1.356678 l 1.0573,2.933154 1.05351,-2.933154 h 1.360468 l -1.671215,4.244357 h -1.489315 z" />
+ <path
+ id="path1245"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -13.442484,84.207587 h 1.356679 v 4.244357 h -1.356679 z m 0,-1.652267 h 1.356679 v 1.106564 h -1.356679 z" />
+ <path
+ id="path1247"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -8.7623213,85.075407 q -0.4509629,0 -0.689708,0.325906 -0.2349555,0.322116 -0.2349555,0.932242 0,0.610127 0.2349555,0.936033 0.2387451,0.322116 0.689708,0.322116 0.4433837,0 0.6783392,-0.322116 0.2349555,-0.325906 0.2349555,-0.936033 0,-0.610126 -0.2349555,-0.932242 -0.2349555,-0.325906 -0.6783392,-0.325906 z m 0,-0.970139 q 1.0951957,0 1.7091116,0.591178 0.6177055,0.591179 0.6177055,1.637109 0,1.045931 -0.6177055,1.637109 -0.6139159,0.591179 -1.7091116,0.591179 -1.0989853,0 -1.7204807,-0.591179 -0.617705,-0.591178 -0.617705,-1.637109 0,-1.04593 0.617705,-1.637109 0.6214954,-0.591178 1.7204807,-0.591178 z" />
+ <path
+ id="path1249"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -5.4956836,86.799677 v -2.59209 h 1.3642576 v 0.424436 q 0,0.344854 -0.00379,0.867819 -0.00379,0.519176 -0.00379,0.693498 0,0.511597 0.026527,0.738973 0.026527,0.223587 0.09095,0.325906 0.083371,0.132636 0.2160074,0.204638 0.1364258,0.072 0.3107476,0.072 0.4244357,0 0.6669703,-0.325906 0.2425347,-0.325906 0.2425347,-0.905715 v -2.095652 h 1.3566784 v 4.244357 h -1.3566784 v -0.613916 q -0.3069579,0.371382 -0.6518119,0.549493 -0.3410644,0.174322 -0.7541313,0.174322 -0.7351833,0 -1.1217229,-0.450963 -0.3827501,-0.450963 -0.3827501,-1.311203 z" />
+ <path
+ id="path1251"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m 3.2279882,85.363417 q -0.1781114,-0.08337 -0.3562228,-0.121268 -0.1743218,-0.04169 -0.3524332,-0.04169 -0.5229654,0 -0.8071857,0.337274 -0.2804308,0.333486 -0.2804308,0.95877 v 1.955436 H 0.07503736 V 84.207587 H 1.4317157 v 0.697288 q 0.2614827,-0.416857 0.5987575,-0.606337 0.3410644,-0.19327 0.814765,-0.19327 0.068213,0 0.1477946,0.0076 0.079582,0.0038 0.2311658,0.02274 z" />
+ </g>
+ <g
+ style="font-size:11.263px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ id="text1968"
+ aria-label="type">
+ <path
+ id="path1200"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ d="m -12.982713,110.86802 q -0.340778,0.22526 -0.825954,0.36965 -0.485175,0.1444 -1.051213,0.1444 -1.120524,0 -1.686562,-0.57759 -0.566038,-0.58336 -0.566038,-1.54794 v -3.08433 h -1.328456 v -1.08009 h 1.328456 v -1.34579 l 1.524837,-0.18482 v 1.53061 h 2.021564 l -0.155949,1.08009 h -1.865615 v 3.07855 q 0,0.47363 0.231036,0.69311 0.231036,0.21949 0.74509,0.21949 0.329227,0 0.600694,-0.0751 0.277243,-0.0809 0.502503,-0.20216 z" />
+ <path
+ id="path1202"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ d="m -5.7917378,105.09212 -2.0735471,6.12823 q -0.3754333,1.12052 -1.1147482,1.76742 -0.7393148,0.65268 -2.0677709,0.74509 l -0.190605,-1.1032 q 0.612245,-0.0866 0.981903,-0.25991 0.375433,-0.17328 0.5949171,-0.4563 0.22526,-0.28302 0.3869851,-0.70466 h -0.5198308 l -2.0042364,-6.11667 h 1.611475 l 1.3862158,5.10012 1.4439743,-5.10012 z" />
+ <path
+ id="path1204"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ d="m -1.2403471,104.91884 q 0.80284968,0 1.29380094,0.39854 0.49095126,0.39276 0.71043535,1.12052 0.22525999,0.72199 0.22525999,1.69812 0,0.94147 -0.27146716,1.67501 -0.27146717,0.73354 -0.79707382,1.15518 -0.51983075,0.41586 -1.2822492,0.41586 -0.9356953,0 -1.513285,-0.66423 v 2.84752 l -1.5248369,0.16172 v -8.63496 h 1.3400081 l 0.080863,0.74509 q 0.3581056,-0.47362 0.8086256,-0.69311 0.4562959,-0.22526 0.9299195,-0.22526 z m -0.4447441,1.14363 q -0.3869851,0 -0.6815559,0.23104 -0.2887948,0.23103 -0.5082789,0.57181 v 2.73777 q 0.4216405,0.6238 1.0743168,0.6238 0.5833657,0 0.88948821,-0.48517 0.31189844,-0.49096 0.31189844,-1.58838 0,-1.16095 -0.27724306,-1.62302 -0.27724309,-0.46785 -0.80862559,-0.46785 z" />
+ <path
+ id="path1206"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ d="m 3.8308738,108.61542 q 0.069311,0.8606 0.508279,1.24181 0.4389681,0.38121 1.0685409,0.38121 0.4389682,0 0.8259533,-0.13862 0.3869852,-0.13862 0.7624185,-0.38698 l 0.6353487,0.87216 q -0.4274164,0.3581 -1.0223338,0.57759 -0.5891416,0.21948 -1.2995769,0.21948 -0.9934543,0 -1.6750102,-0.41009 -0.67578,-0.41009 -1.0223338,-1.13785 -0.3465538,-0.72776 -0.3465538,-1.67501 0,-0.91259 0.335002,-1.64613 0.3407779,-0.73354 0.9819025,-1.16096 0.6469005,-0.43319 1.5537164,-0.43319 1.2591456,0 1.9984604,0.82018 0.7393148,0.82018 0.7393148,2.26993 0,0.335 -0.028879,0.60647 z m 1.3111287,-2.62226 q -0.5544862,0 -0.9125918,0.39854 -0.3523297,0.39853 -0.4158646,1.24759 h 2.5760502 q -0.011552,-0.77397 -0.3176744,-1.20716 -0.3061225,-0.43897 -0.9299194,-0.43897 z" />
+ </g>
+ <g
+ style="font-size:11.263px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#800000;fill-opacity:0.976587;stroke-width:0.265;stroke-miterlimit:4;stroke-dasharray:none"
+ id="text1972"
+ aria-label="instance">
+ <path
+ id="path1183"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#800000;fill-opacity:0.976587;stroke-width:0.265;stroke-miterlimit:4;stroke-dasharray:none"
+ d="m 123.54934,104.04259 q 0.41586,0 0.68156,0.25991 0.26569,0.25992 0.26569,0.6469 0,0.38699 -0.26569,0.65268 -0.2657,0.25991 -0.68156,0.25991 -0.42164,0 -0.68733,-0.25991 -0.26569,-0.26569 -0.26569,-0.65268 0,-0.38698 0.26569,-0.6469 0.26569,-0.25991 0.68733,-0.25991 z m 0.98768,3.08433 v 5.03658 h 1.61147 v 1.08009 h -4.92684 v -1.08009 h 1.79053 v -3.95649 h -1.73277 v -1.08009 z" />
+ <path
+ id="path1185"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#800000;fill-opacity:0.976587;stroke-width:0.265;stroke-miterlimit:4;stroke-dasharray:none"
+ d="m 127.95056,113.24359 v -6.11667 h 1.32845 l 0.10974,0.75664 q 0.7913,-0.92992 1.94071,-0.92992 0.82017,0 1.25337,0.4794 0.43896,0.47362 0.43896,1.33423 v 4.47632 h -1.52483 v -3.8814 q 0,-0.69311 -0.1444,-0.9819 -0.13862,-0.2888 -0.60069,-0.2888 -0.37544,0 -0.69889,0.23681 -0.32345,0.23681 -0.57759,0.57759 v 4.3377 z" />
+ <path
+ id="path1187"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#800000;fill-opacity:0.976587;stroke-width:0.265;stroke-miterlimit:4;stroke-dasharray:none"
+ d="m 137.2093,112.29057 q 0.53716,0 0.86061,-0.18483 0.32923,-0.18483 0.32923,-0.53138 0,-0.21949 -0.10974,-0.37544 -0.10397,-0.16172 -0.41587,-0.29457 -0.3119,-0.13862 -0.93569,-0.30612 -0.58915,-0.15017 -1.03389,-0.36966 -0.43897,-0.22526 -0.68733,-0.57759 -0.24259,-0.35233 -0.24259,-0.88948 0,-0.79708 0.67001,-1.29958 0.67,-0.50828 1.87139,-0.50828 0.78552,0 1.37466,0.20793 0.58914,0.20216 1.01078,0.50828 l -0.6238,0.92992 q -0.36965,-0.23681 -0.80285,-0.38121 -0.42741,-0.15017 -0.92414,-0.15017 -0.53716,0 -0.78552,0.15595 -0.24259,0.15595 -0.24259,0.43319 0,0.19638 0.1213,0.335 0.12707,0.13285 0.45052,0.25992 0.32922,0.12129 0.93569,0.29457 0.59492,0.1675 1.03389,0.38698 0.44474,0.21949 0.68733,0.58337 0.24259,0.3581 0.24259,0.94724 0,0.66423 -0.38699,1.09743 -0.38698,0.43319 -1.02233,0.6469 -0.63535,0.20793 -1.36889,0.20793 -0.86639,0 -1.51329,-0.24837 -0.6469,-0.24836 -1.09742,-0.64112 l 0.7913,-0.88949 q 0.35811,0.28302 0.8144,0.46785 0.46207,0.18483 0.99923,0.18483 z" />
+ <path
+ id="path1189"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#800000;fill-opacity:0.976587;stroke-width:0.265;stroke-miterlimit:4;stroke-dasharray:none"
+ d="m 147.09185,112.90281 q -0.34078,0.22526 -0.82596,0.36966 -0.48517,0.1444 -1.05121,0.1444 -1.12052,0 -1.68656,-0.57759 -0.56604,-0.58337 -0.56604,-1.54794 v -3.08433 h -1.32846 v -1.08009 h 1.32846 v -1.34579 l 1.52484,-0.18483 v 1.53062 h 2.02156 l -0.15595,1.08009 h -1.86561 v 3.07855 q 0,0.47363 0.23103,0.69311 0.23104,0.21948 0.74509,0.21948 0.32923,0 0.6007,-0.0751 0.27724,-0.0809 0.5025,-0.20216 z" />
+ <path
+ id="path1191"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#800000;fill-opacity:0.976587;stroke-width:0.265;stroke-miterlimit:4;stroke-dasharray:none"
+ d="m 153.62437,111.63212 q 0,0.35233 0.10397,0.51405 0.10396,0.16173 0.335,0.23681 l -0.32923,1.02234 q -0.48517,-0.052 -0.83173,-0.24259 -0.34655,-0.19638 -0.53138,-0.58337 -0.34655,0.42164 -0.87794,0.62958 -0.5256,0.20793 -1.10319,0.20793 -0.9357,0 -1.48441,-0.53138 -0.54871,-0.53139 -0.54871,-1.38044 0,-0.97613 0.76242,-1.50174 0.7682,-0.53138 2.17174,-0.53138 h 0.85483 v -0.32923 q 0,-0.54293 -0.34078,-0.78552 -0.335,-0.24836 -0.9588,-0.24836 -0.29457,0 -0.73931,0.0809 -0.44474,0.0751 -0.90682,0.23681 l -0.36388,-1.04543 q 0.58337,-0.21949 1.17251,-0.32345 0.59492,-0.10397 1.08009,-0.10397 1.28803,0 1.91182,0.54871 0.6238,0.54293 0.6238,1.54216 z m -2.73777,0.68155 q 0.34655,0 0.69888,-0.1906 0.35233,-0.19638 0.56026,-0.55449 v -1.18983 h -0.60069 q -0.84906,0 -1.23027,0.27146 -0.37543,0.27147 -0.37543,0.7682 0,0.89526 0.94725,0.89526 z" />
+ <path
+ id="path1193"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#800000;fill-opacity:0.976587;stroke-width:0.265;stroke-miterlimit:4;stroke-dasharray:none"
+ d="m 155.6748,113.24359 v -6.11667 h 1.32845 l 0.10974,0.75664 q 0.7913,-0.92992 1.94071,-0.92992 0.82017,0 1.25337,0.4794 0.43896,0.47362 0.43896,1.33423 v 4.47632 h -1.52483 v -3.8814 q 0,-0.69311 -0.1444,-0.9819 -0.13862,-0.2888 -0.60069,-0.2888 -0.37544,0 -0.69889,0.23681 -0.32345,0.23681 -0.57759,0.57759 v 4.3377 z" />
+ <path
+ id="path1195"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#800000;fill-opacity:0.976587;stroke-width:0.265;stroke-miterlimit:4;stroke-dasharray:none"
+ d="m 165.68441,112.19238 q 0.40431,0 0.75664,-0.15018 0.35233,-0.15017 0.68733,-0.3812 l 0.69311,0.97612 q -0.40431,0.34078 -0.97612,0.56026 -0.57182,0.21949 -1.22449,0.21949 -0.96458,0 -1.65191,-0.39854 -0.68156,-0.39854 -1.04544,-1.12052 -0.36388,-0.72199 -0.36388,-1.67501 0,-0.94147 0.36966,-1.68079 0.37543,-0.73931 1.06276,-1.16095 0.69311,-0.42742 1.65191,-0.42742 0.65845,0 1.18983,0.1906 0.53716,0.18483 0.98191,0.55449 l -0.67578,0.9357 q -0.34078,-0.23104 -0.70466,-0.35811 -0.36388,-0.12707 -0.74509,-0.12707 -0.67578,0 -1.1032,0.49095 -0.42164,0.48518 -0.42164,1.5826 0,1.08587 0.43319,1.53061 0.43319,0.43897 1.08587,0.43897 z" />
+ <path
+ id="path1197"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#800000;fill-opacity:0.976587;stroke-width:0.265;stroke-miterlimit:4;stroke-dasharray:none"
+ d="m 170.83649,110.65021 q 0.0693,0.86061 0.50828,1.24182 0.43897,0.38121 1.06854,0.38121 0.43897,0 0.82596,-0.13862 0.38698,-0.13862 0.76242,-0.38699 l 0.63535,0.87216 q -0.42742,0.35811 -1.02234,0.57759 -0.58914,0.21949 -1.29958,0.21949 -0.99345,0 -1.67501,-0.41009 -0.67578,-0.41009 -1.02233,-1.13785 -0.34655,-0.72777 -0.34655,-1.67501 0,-0.91259 0.335,-1.64613 0.34078,-0.73354 0.9819,-1.16096 0.6469,-0.43319 1.55372,-0.43319 1.25914,0 1.99846,0.82018 0.73931,0.82017 0.73931,2.26992 0,0.33501 -0.0289,0.60647 z m 1.31113,-2.62225 q -0.55448,0 -0.91259,0.39853 -0.35233,0.39854 -0.41586,1.2476 h 2.57605 q -0.0115,-0.77397 -0.31768,-1.20717 -0.30612,-0.43896 -0.92992,-0.43896 z" />
+ </g>
+ <path
+ sodipodi:nodetypes="sssssssss"
+ inkscape:connector-curvature="0"
+ id="path1974"
+ style="opacity:0.25;fill:#000080;fill-opacity:0.4;stroke:none;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.2, 2.4;stroke-dashoffset:0;stroke-opacity:0.497957"
+ d="m -60.569299,125.94806 h 72.698771 c 1.14406,0 2.06509,0.92103 2.06509,2.06508 v 15.70853 c 0,1.14406 -0.92103,2.06509 -2.06509,2.06509 h -72.698771 c -1.14406,0 -2.06509,-0.92103 -2.06509,-2.06509 v -15.70853 c 0,-1.14405 0.92103,-2.06508 2.06509,-2.06508 z" />
+ <g
+ style="font-size:11.263px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ id="text1980"
+ aria-label="ABC">
+ <path
+ id="path1176"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ d="m -29.753207,138.03049 h -2.628033 l -0.496728,1.83096 h -1.634579 l 2.500964,-7.98807 h 1.940701 l 2.495188,7.98807 h -1.680786 z m -2.345015,-1.18406 h 2.050444 l -1.022334,-3.78899 z" />
+ <path
+ id="path1178"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ d="m -21.112481,137.54532 q 0,0.67578 -0.265692,1.1263 -0.259915,0.44474 -0.710435,0.71043 -0.45052,0.25992 -1.022334,0.36966 -0.571814,0.10974 -1.184059,0.10974 h -2.47786 v -7.98807 h 2.333463 q 0.779746,0 1.455526,0.18483 0.681556,0.18483 1.103196,0.62958 0.421641,0.43896 0.421641,1.21871 0,0.49095 -0.207932,0.84328 -0.202157,0.34656 -0.542935,0.56604 -0.335002,0.21948 -0.721987,0.31767 0.433192,0.0693 0.849057,0.27147 0.42164,0.19638 0.693108,0.59492 0.277243,0.39276 0.277243,1.04544 z m -1.946478,-3.5002 q 0,-0.54293 -0.340778,-0.77974 -0.340778,-0.23682 -0.993454,-0.23682 h -0.797074 v 2.10821 h 0.866385 q 0.641124,0 0.953023,-0.25414 0.311898,-0.25992 0.311898,-0.83751 z m 0.306123,3.45976 q 0,-0.72776 -0.415865,-0.98767 -0.410088,-0.2657 -1.039661,-0.2657 h -0.981903 v 2.42588 h 0.912592 q 0.381209,0 0.727763,-0.0866 0.35233,-0.0924 0.571814,-0.34078 0.22526,-0.25413 0.22526,-0.74509 z" />
+ <path
+ id="path1180"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ d="m -16.514884,131.70011 q 0.83173,0 1.409319,0.21948 0.57759,0.21371 1.068541,0.61802 l -0.802849,0.95303 q -0.346554,-0.28302 -0.750867,-0.4332 -0.404313,-0.15595 -0.866385,-0.15595 -0.560262,0 -1.028109,0.29457 -0.462072,0.29458 -0.739315,0.94725 -0.277243,0.6469 -0.277243,1.70967 0,1.04543 0.265691,1.69234 0.271467,0.64112 0.733539,0.94147 0.467848,0.30034 1.056989,0.30034 0.623797,0 1.033886,-0.2137 0.415864,-0.21949 0.739315,-0.48518 l 0.74509,0.94147 q -0.42164,0.41587 -1.056989,0.71044 -0.629573,0.29457 -1.530613,0.29457 -1.045437,0 -1.865614,-0.47363 -0.820178,-0.4794 -1.288025,-1.40932 -0.467848,-0.93569 -0.467848,-2.2988 0,-1.34001 0.479399,-2.26415 0.485176,-0.92992 1.305353,-1.40932 0.825953,-0.4794 1.836735,-0.4794 z" />
+ </g>
+ <g
+ style="font-size:11.263px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#830000;fill-opacity:1;stroke-width:0.264583"
+ id="text1984"
+ aria-label="instance">
+ <path
+ id="path1159"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#830000;fill-opacity:1;stroke-width:0.264583"
+ d="m 183.76608,131.26282 q 0.41587,0 0.68156,0.25991 0.26569,0.25992 0.26569,0.6469 0,0.38699 -0.26569,0.65268 -0.26569,0.25991 -0.68156,0.25991 -0.42164,0 -0.68733,-0.25991 -0.26569,-0.26569 -0.26569,-0.65268 0,-0.38698 0.26569,-0.6469 0.26569,-0.25991 0.68733,-0.25991 z m 0.98768,3.08433 v 5.03658 h 1.61148 v 1.08009 h -4.92684 v -1.08009 h 1.79052 v -3.95649 h -1.73276 v -1.08009 z" />
+ <path
+ id="path1161"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#830000;fill-opacity:1;stroke-width:0.264583"
+ d="m 188.1673,140.46382 v -6.11667 h 1.32846 l 0.10974,0.75664 q 0.7913,-0.92992 1.9407,-0.92992 0.82018,0 1.25337,0.4794 0.43897,0.47362 0.43897,1.33423 v 4.47632 h -1.52484 v -3.8814 q 0,-0.69311 -0.1444,-0.9819 -0.13862,-0.2888 -0.60069,-0.2888 -0.37543,0 -0.69888,0.23681 -0.32345,0.23681 -0.57759,0.57759 v 4.3377 z" />
+ <path
+ id="path1163"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#830000;fill-opacity:1;stroke-width:0.264583"
+ d="m 197.42605,139.5108 q 0.53716,0 0.86061,-0.18483 0.32922,-0.18483 0.32922,-0.53138 0,-0.21949 -0.10974,-0.37544 -0.10397,-0.16172 -0.41586,-0.29457 -0.3119,-0.13862 -0.9357,-0.30612 -0.58914,-0.15017 -1.03389,-0.36966 -0.43896,-0.22526 -0.68733,-0.57759 -0.24259,-0.35233 -0.24259,-0.88948 0,-0.79708 0.67001,-1.29958 0.67,-0.50828 1.87139,-0.50828 0.78552,0 1.37466,0.20793 0.58914,0.20216 1.01078,0.50828 l -0.62379,0.92992 q -0.36966,-0.23681 -0.80285,-0.38121 -0.42742,-0.15017 -0.92415,-0.15017 -0.53715,0 -0.78552,0.15595 -0.24258,0.15595 -0.24258,0.43319 0,0.19638 0.12129,0.335 0.12707,0.13285 0.45052,0.25992 0.32923,0.12129 0.93569,0.29457 0.59492,0.1675 1.03389,0.38698 0.44474,0.21949 0.68733,0.58337 0.24259,0.3581 0.24259,0.94725 0,0.66422 -0.38699,1.09742 -0.38698,0.43319 -1.02233,0.6469 -0.63535,0.20793 -1.36889,0.20793 -0.86638,0 -1.51328,-0.24837 -0.6469,-0.24836 -1.09742,-0.64112 l 0.7913,-0.88949 q 0.3581,0.28302 0.8144,0.46785 0.46207,0.18483 0.99923,0.18483 z" />
+ <path
+ id="path1165"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#830000;fill-opacity:1;stroke-width:0.264583"
+ d="m 207.30859,140.12304 q -0.34078,0.22526 -0.82595,0.36966 -0.48518,0.1444 -1.05122,0.1444 -1.12052,0 -1.68656,-0.57759 -0.56604,-0.58337 -0.56604,-1.54794 v -3.08433 h -1.32845 v -1.08009 h 1.32845 v -1.34579 l 1.52484,-0.18483 v 1.53062 h 2.02156 l -0.15594,1.08009 h -1.86562 v 3.07855 q 0,0.47363 0.23104,0.69311 0.23103,0.21948 0.74509,0.21948 0.32922,0 0.60069,-0.0751 0.27724,-0.0809 0.5025,-0.20216 z" />
+ <path
+ id="path1167"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#830000;fill-opacity:1;stroke-width:0.264583"
+ d="m 213.84111,138.85235 q 0,0.35233 0.10397,0.51405 0.10397,0.16173 0.335,0.23681 l -0.32922,1.02234 q -0.48518,-0.052 -0.83173,-0.24259 -0.34656,-0.19638 -0.53139,-0.58337 -0.34655,0.42164 -0.87793,0.62958 -0.52561,0.20793 -1.1032,0.20793 -0.93569,0 -1.4844,-0.53138 -0.54871,-0.53139 -0.54871,-1.38044 0,-0.97613 0.76241,-1.50174 0.7682,-0.53138 2.17174,-0.53138 h 0.85483 v -0.32923 q 0,-0.54293 -0.34077,-0.78552 -0.33501,-0.24836 -0.9588,-0.24836 -0.29457,0 -0.73932,0.0809 -0.44474,0.0751 -0.90681,0.23681 l -0.36388,-1.04543 q 0.58336,-0.21949 1.1725,-0.32345 0.59492,-0.10397 1.0801,-0.10397 1.28802,0 1.91182,0.54871 0.62379,0.54293 0.62379,1.54216 z m -2.73777,0.68155 q 0.34655,0 0.69888,-0.1906 0.35233,-0.19638 0.56026,-0.55449 v -1.18983 h -0.60069 q -0.84906,0 -1.23027,0.27146 -0.37543,0.27147 -0.37543,0.7682 0,0.89526 0.94725,0.89526 z" />
+ <path
+ id="path1169"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#830000;fill-opacity:1;stroke-width:0.264583"
+ d="m 215.89154,140.46382 v -6.11667 H 217.22 l 0.10974,0.75664 q 0.7913,-0.92992 1.9407,-0.92992 0.82018,0 1.25337,0.4794 0.43897,0.47362 0.43897,1.33423 v 4.47632 h -1.52484 v -3.8814 q 0,-0.69311 -0.1444,-0.9819 -0.13862,-0.2888 -0.60069,-0.2888 -0.37543,0 -0.69888,0.23681 -0.32345,0.23681 -0.57759,0.57759 v 4.3377 z" />
+ <path
+ id="path1171"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#830000;fill-opacity:1;stroke-width:0.264583"
+ d="m 225.90115,139.41261 q 0.40432,0 0.75665,-0.15018 0.35233,-0.15017 0.68733,-0.3812 l 0.69311,0.97612 q -0.40432,0.34078 -0.97613,0.56026 -0.57181,0.21949 -1.22449,0.21949 -0.96458,0 -1.65191,-0.39854 -0.68155,-0.39854 -1.04544,-1.12052 -0.36388,-0.72199 -0.36388,-1.67501 0,-0.94147 0.36966,-1.68079 0.37543,-0.73931 1.06277,-1.16095 0.6931,-0.42742 1.6519,-0.42742 0.65845,0 1.18984,0.1906 0.53716,0.18483 0.9819,0.55449 l -0.67578,0.9357 q -0.34078,-0.23104 -0.70466,-0.35811 -0.36388,-0.12707 -0.74509,-0.12707 -0.67578,0 -1.1032,0.49095 -0.42164,0.48518 -0.42164,1.5826 0,1.08587 0.4332,1.53061 0.43319,0.43897 1.08586,0.43897 z" />
+ <path
+ id="path1173"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#830000;fill-opacity:1;stroke-width:0.264583"
+ d="m 231.05324,137.87044 q 0.0693,0.86061 0.50828,1.24182 0.43897,0.38121 1.06854,0.38121 0.43897,0 0.82595,-0.13862 0.38699,-0.13862 0.76242,-0.38699 l 0.63535,0.87216 q -0.42742,0.35811 -1.02234,0.57759 -0.58914,0.21949 -1.29957,0.21949 -0.99346,0 -1.67501,-0.41009 -0.67578,-0.41009 -1.02234,-1.13785 -0.34655,-0.72777 -0.34655,-1.67501 0,-0.91259 0.335,-1.64613 0.34078,-0.73354 0.9819,-1.16096 0.64691,-0.43319 1.55372,-0.43319 1.25915,0 1.99846,0.82018 0.73932,0.82017 0.73932,2.26992 0,0.33501 -0.0289,0.60647 z m 1.31113,-2.62225 q -0.55449,0 -0.91259,0.39853 -0.35233,0.39854 -0.41587,1.2476 h 2.57605 q -0.0115,-0.77397 -0.31767,-1.20717 -0.30613,-0.43896 -0.92992,-0.43896 z" />
+ </g>
+ <path
+ d="M 17.347598,126.00309 H 170.2081 c 1.14406,0 2.06509,0.92103 2.06509,2.06508 v 15.70853 c 0,1.14406 -0.92103,2.06509 -2.06509,2.06509 H 17.347598 c -1.14406,0 -2.06509,-0.92103 -2.06509,-2.06509 v -15.70853 c 0,-1.14405 0.92103,-2.06508 2.06509,-2.06508 z"
+ style="opacity:0.25;fill:#000080;fill-opacity:0.4;stroke:none;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.2, 2.4;stroke-dashoffset:0;stroke-opacity:0.497957"
+ id="path1986"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssssssss" />
+ <g
+ style="font-size:11.263px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ id="text1990"
+ aria-label="type">
+ <path
+ id="path1150"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ d="m 86.078604,138.14328 q -0.340778,0.22526 -0.825953,0.36965 -0.485176,0.1444 -1.051214,0.1444 -1.120524,0 -1.686562,-0.57759 -0.566038,-0.58336 -0.566038,-1.54794 v -3.08433 h -1.328456 v -1.08009 h 1.328456 v -1.34578 l 1.524837,-0.18483 v 1.53061 h 2.021564 l -0.155949,1.08009 h -1.865615 v 3.07856 q 0,0.47362 0.231036,0.6931 0.231036,0.21949 0.745091,0.21949 0.329226,0 0.600693,-0.0751 0.277243,-0.0809 0.502503,-0.20216 z" />
+ <path
+ id="path1152"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ d="m 93.26958,132.36738 -2.073547,6.12823 q -0.375434,1.12052 -1.114749,1.76742 -0.739314,0.65268 -2.067771,0.74509 l -0.190604,-1.10319 q 0.612245,-0.0866 0.981902,-0.25992 0.375433,-0.17328 0.594918,-0.4563 0.22526,-0.28301 0.386985,-0.70466 h -0.519831 l -2.004236,-6.11667 h 1.611475 l 1.386215,5.10012 1.443974,-5.10012 z" />
+ <path
+ id="path1154"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ d="m 97.82097,132.1941 q 0.80285,0 1.293801,0.39854 0.490952,0.39276 0.710436,1.12052 0.225263,0.72199 0.225263,1.69812 0,0.94147 -0.271471,1.67501 -0.271467,0.73354 -0.797073,1.15518 -0.519831,0.41586 -1.28225,0.41586 -0.935695,0 -1.513285,-0.66423 v 2.84752 l -1.524836,0.16173 v -8.63497 h 1.340008 l 0.08086,0.74509 q 0.358106,-0.47362 0.808626,-0.69311 0.456296,-0.22526 0.929919,-0.22526 z m -0.444744,1.14363 q -0.386985,0 -0.681556,0.23104 -0.288795,0.23103 -0.508279,0.57181 v 2.73778 q 0.421641,0.62379 1.074317,0.62379 0.583366,0 0.889488,-0.48517 0.311899,-0.49095 0.311899,-1.58838 0,-1.16095 -0.277243,-1.62302 -0.277243,-0.46785 -0.808626,-0.46785 z" />
+ <path
+ id="path1156"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ d="m 102.89219,135.89068 q 0.0693,0.86061 0.50828,1.24181 0.43897,0.38121 1.06854,0.38121 0.43897,0 0.82595,-0.13862 0.38699,-0.13862 0.76242,-0.38698 l 0.63535,0.87216 q -0.42741,0.3581 -1.02233,0.57759 -0.58914,0.21948 -1.29958,0.21948 -0.99345,0 -1.67501,-0.41009 -0.67578,-0.41009 -1.02233,-1.13785 -0.34656,-0.72776 -0.34656,-1.67501 0,-0.91259 0.33501,-1.64613 0.34077,-0.73354 0.9819,-1.16096 0.6469,-0.43319 1.55371,-0.43319 1.25915,0 1.99846,0.82018 0.73932,0.82018 0.73932,2.26993 0,0.335 -0.0289,0.60647 z m 1.31113,-2.62226 q -0.55449,0 -0.91259,0.39854 -0.35233,0.39853 -0.41587,1.24759 h 2.57605 q -0.0115,-0.77397 -0.31767,-1.20716 -0.30612,-0.43897 -0.92992,-0.43897 z" />
+ </g>
+ <path
+ sodipodi:nodetypes="sssssssss"
+ inkscape:connector-curvature="0"
+ id="path1992"
+ style="opacity:0.25;fill:#000080;fill-opacity:0.4;stroke:none;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.2, 2.4;stroke-dashoffset:0;stroke-opacity:0.497957"
+ d="M -60.569299,153.16829 H 49.987465 c 1.14406,0 2.06509,0.92103 2.06509,2.06508 v 15.70853 c 0,1.14406 -0.92103,2.06509 -2.06509,2.06509 H -60.569299 c -1.14406,0 -2.06509,-0.92103 -2.06509,-2.06509 v -15.70853 c 0,-1.14405 0.92103,-2.06508 2.06509,-2.06508 z" />
+ <g
+ style="font-size:11.263px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ id="text1998"
+ aria-label="DType">
+ <path
+ id="path1139"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ d="m -16.103363,161.78806 q 0,1.23027 -0.32345,2.02157 -0.323451,0.78552 -0.866385,1.22449 -0.542934,0.43897 -1.218714,0.61224 -0.670004,0.17328 -1.368888,0.17328 h -2.044668 v -7.98806 h 1.906046 q 0.745091,0 1.443975,0.16172 0.698883,0.15595 1.253369,0.57759 0.560262,0.42164 0.889489,1.20139 0.329226,0.77397 0.329226,2.01578 z m -1.651907,0 q 0,-0.88948 -0.167501,-1.43819 -0.161725,-0.54871 -0.444744,-0.83751 -0.283019,-0.29457 -0.641125,-0.39854 -0.358105,-0.10396 -0.74509,-0.10396 h -0.589142 v 5.63727 h 0.594918 q 0.542934,0 0.993454,-0.23681 0.45052,-0.23681 0.721987,-0.85483 0.277243,-0.6238 0.277243,-1.76743 z" />
+ <path
+ id="path1141"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ d="m -11.482662,159.07339 v 6.74625 h -1.57682 v -6.74625 h -2.333462 v -1.24181 h 6.3130554 l -0.1617251,1.24181 z" />
+ <path
+ id="path1143"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ d="m -2.3221052,159.70297 -2.0735471,6.12822 q -0.3754333,1.12053 -1.1147481,1.76743 -0.7393149,0.65267 -2.0677712,0.74509 l -0.1906046,-1.1032 q 0.6122451,-0.0866 0.9819025,-0.25991 0.3754333,-0.17328 0.5949174,-0.4563 0.22526,-0.28302 0.3869851,-0.70466 h -0.5198307 l -2.0042364,-6.11667 h 1.6114754 l 1.3862153,5.10011 1.4439743,-5.10011 z" />
+ <path
+ id="path1145"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ d="m 2.229285,159.52969 q 0.8028497,0 1.293801,0.39854 0.4909512,0.39276 0.7104353,1.12052 0.22526,0.72199 0.22526,1.69811 0,0.94148 -0.2714671,1.67501 -0.2714672,0.73354 -0.7970738,1.15518 -0.5198308,0.41587 -1.2822492,0.41587 -0.9356954,0 -1.51328509,-0.66423 v 2.84752 l -1.52483686,0.16172 v -8.63496 H 0.4098774 l 0.0808626,0.74509 q 0.35810562,-0.47363 0.80862564,-0.69311 0.4562958,-0.22526 0.9299194,-0.22526 z m -0.4447441,1.14363 q -0.3869851,0 -0.6815558,0.23103 -0.2887949,0.23104 -0.50827899,0.57182 v 2.73777 q 0.42164049,0.6238 1.07431689,0.6238 0.5833656,0 0.8894882,-0.48518 0.3118984,-0.49095 0.3118984,-1.58837 0,-1.16095 -0.2772431,-1.62303 -0.277243,-0.46784 -0.8086256,-0.46784 z" />
+ <path
+ id="path1147"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ d="m 7.3005069,163.22626 q 0.069311,0.86061 0.508279,1.24182 0.4389681,0.38121 1.0685409,0.38121 0.4389682,0 0.8259533,-0.13862 0.3869849,-0.13862 0.7624189,-0.38699 l 0.635348,0.87216 q -0.427416,0.35811 -1.022334,0.57759 -0.5891411,0.21949 -1.2995764,0.21949 -0.9934543,0 -1.6750102,-0.41009 -0.67578,-0.41009 -1.0223338,-1.13785 -0.3465538,-0.72777 -0.3465538,-1.67501 0,-0.91259 0.335002,-1.64613 0.3407779,-0.73354 0.9819025,-1.16096 0.6469005,-0.43319 1.5537164,-0.43319 1.2591456,0 1.9984603,0.82018 0.739315,0.82017 0.739315,2.26992 0,0.33501 -0.02888,0.60647 z m 1.3111287,-2.62225 q -0.5544862,0 -0.9125918,0.39853 -0.3523297,0.39854 -0.4158646,1.2476 h 2.5760502 q -0.011552,-0.77397 -0.3176744,-1.20717 -0.3061225,-0.43896 -0.9299194,-0.43896 z" />
+ </g>
+ <path
+ d="m -60.569299,180.38852 h 72.698771 c 1.14406,0 2.06509,0.92103 2.06509,2.06508 v 15.70853 c 0,1.14406 -0.92103,2.06509 -2.06509,2.06509 h -72.698771 c -1.14406,0 -2.06509,-0.92103 -2.06509,-2.06509 V 182.4536 c 0,-1.14405 0.92103,-2.06508 2.06509,-2.06508 z"
+ style="opacity:0.25;fill:#000080;fill-opacity:0.4;stroke:none;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.2, 2.4;stroke-dashoffset:0;stroke-opacity:0.497957"
+ id="path2004"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssssssss" />
+ <path
+ d="m 175.57697,180.55362 h 65.38081 c 1.14406,0 2.06509,0.92103 2.06509,2.06509 v 15.54342 c 0,1.14406 -0.92103,2.06509 -2.06509,2.06509 h -65.38081 c -1.14406,0 -2.06509,-0.92103 -2.06509,-2.06509 v -15.54342 c 0,-1.14406 0.92103,-2.06509 2.06509,-2.06509 z"
+ style="opacity:1;fill:#ddb9b9;fill-opacity:0.796078;stroke:none;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.2, 2.4;stroke-dashoffset:0;stroke-opacity:0.497957"
+ id="path2006"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssssssss" />
+ <g
+ style="font-size:11.263px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ id="text2010"
+ aria-label="base dtype">
+ <path
+ id="path1120"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ d="m -56.5562,187.97729 q 0.306123,-0.39854 0.721988,-0.62957 0.42164,-0.23104 0.906816,-0.23104 1.19561,0 1.732769,0.87794 0.537158,0.87216 0.537158,2.33923 0,0.94148 -0.277243,1.67501 -0.277243,0.73354 -0.825953,1.15518 -0.542935,0.41587 -1.334233,0.41587 -0.99923,0 -1.565268,-0.75664 l -0.06931,0.58336 h -1.35156 v -8.55988 l 1.524836,-0.16172 z m 1.068541,4.46477 q 0.583366,0 0.912592,-0.49673 0.329226,-0.49673 0.329226,-1.59415 0,-1.16095 -0.300346,-1.62303 -0.300347,-0.46784 -0.825954,-0.46784 -0.381209,0 -0.67578,0.23103 -0.288794,0.23104 -0.508279,0.57182 v 2.73777 q 0.196381,0.30612 0.462072,0.47363 0.265692,0.1675 0.606469,0.1675 z" />
+ <path
+ id="path1122"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ d="m -46.269343,191.79516 q 0,0.35233 0.103966,0.51405 0.103966,0.16173 0.335002,0.23681 l -0.329226,1.02234 q -0.485175,-0.052 -0.831729,-0.24259 -0.346554,-0.19638 -0.531383,-0.58337 -0.346553,0.42164 -0.877936,0.62958 -0.525607,0.20793 -1.103196,0.20793 -0.935696,0 -1.484406,-0.53138 -0.54871,-0.53139 -0.54871,-1.38044 0,-0.97613 0.762418,-1.50174 0.768195,-0.53138 2.171738,-0.53138 h 0.854832 v -0.32923 q 0,-0.54293 -0.340778,-0.78552 -0.335002,-0.24836 -0.958798,-0.24836 -0.294571,0 -0.739315,0.0809 -0.444744,0.0751 -0.906816,0.23681 l -0.363882,-1.04543 q 0.583366,-0.21949 1.172507,-0.32345 0.594918,-0.10397 1.080093,-0.10397 1.288025,0 1.911822,0.54871 0.623797,0.54293 0.623797,1.54216 z m -2.737775,0.68155 q 0.346554,0 0.698883,-0.1906 0.35233,-0.19638 0.560262,-0.55449 v -1.18983 h -0.600693 q -0.849057,0 -1.230266,0.27146 -0.375433,0.27147 -0.375433,0.7682 0,0.89526 0.947247,0.89526 z" />
+ <path
+ id="path1124"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ d="m -41.891229,192.45361 q 0.537158,0 0.860609,-0.18483 0.329226,-0.18483 0.329226,-0.53138 0,-0.21949 -0.109742,-0.37544 -0.103967,-0.16172 -0.415865,-0.29457 -0.311898,-0.13862 -0.935695,-0.30612 -0.589142,-0.15017 -1.033886,-0.36966 -0.438968,-0.22526 -0.687332,-0.57759 -0.242587,-0.35233 -0.242587,-0.88948 0,-0.79708 0.670004,-1.29958 0.670004,-0.50828 1.87139,-0.50828 0.785522,0 1.374664,0.20793 0.589141,0.20216 1.010782,0.50828 l -0.623797,0.92992 q -0.369657,-0.23681 -0.80285,-0.38121 -0.427416,-0.15017 -0.924143,-0.15017 -0.537159,0 -0.785522,0.15595 -0.242588,0.15595 -0.242588,0.43319 0,0.19638 0.121294,0.335 0.12707,0.13285 0.45052,0.25992 0.329226,0.12129 0.935695,0.29457 0.594918,0.1675 1.033886,0.38698 0.444744,0.21949 0.687332,0.58337 0.242587,0.3581 0.242587,0.94725 0,0.66422 -0.386985,1.09742 -0.386985,0.43319 -1.022334,0.6469 -0.635348,0.20793 -1.368887,0.20793 -0.866385,0 -1.513285,-0.24837 -0.646901,-0.24836 -1.097421,-0.64112 l 0.791298,-0.88949 q 0.358106,0.28302 0.814402,0.46785 0.462071,0.18483 0.99923,0.18483 z" />
+ <path
+ id="path1126"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ d="m -35.988279,190.81325 q 0.06931,0.86061 0.508279,1.24182 0.438968,0.38121 1.068541,0.38121 0.438968,0 0.825953,-0.13862 0.386985,-0.13862 0.762419,-0.38699 l 0.635348,0.87216 q -0.427416,0.35811 -1.022333,0.57759 -0.589142,0.21949 -1.299577,0.21949 -0.993455,0 -1.675011,-0.41009 -0.67578,-0.41009 -1.022333,-1.13785 -0.346554,-0.72777 -0.346554,-1.67501 0,-0.91259 0.335002,-1.64613 0.340778,-0.73354 0.981902,-1.16096 0.646901,-0.43319 1.553717,-0.43319 1.259145,0 1.99846,0.82018 0.739315,0.82017 0.739315,2.26992 0,0.33501 -0.02888,0.60647 z m 1.311129,-2.62225 q -0.554486,0 -0.912592,0.39853 -0.35233,0.39854 -0.415865,1.2476 h 2.57605 q -0.01155,-0.77397 -0.317674,-1.20717 -0.306122,-0.43896 -0.929919,-0.43896 z" />
+ <path
+ id="path1128"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ d="m -19.879335,184.68503 1.524837,0.16172 v 8.55988 h -1.35156 l -0.09242,-0.72199 q -0.283019,0.40432 -0.710435,0.65268 -0.427417,0.24259 -0.993454,0.24259 -0.773971,0 -1.28225,-0.40431 -0.502503,-0.40432 -0.750866,-1.13208 -0.242588,-0.73354 -0.242588,-1.70389 0,-0.92992 0.288795,-1.65768 0.294571,-0.73354 0.837505,-1.14941 0.542934,-0.41586 1.293801,-0.41586 0.895264,0 1.47863,0.61802 z m -1.068541,3.5695 q -0.57759,0 -0.912592,0.5025 -0.329226,0.49673 -0.329226,1.58838 0,1.15518 0.306122,1.62302 0.306123,0.46785 0.825954,0.46785 0.381209,0 0.670004,-0.22526 0.288795,-0.23104 0.508279,-0.57181 v -2.78399 q -0.213709,-0.28301 -0.4794,-0.43896 -0.259915,-0.16173 -0.589141,-0.16173 z" />
+ <path
+ id="path1130"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ d="m -11.215505,193.06585 q -0.340778,0.22526 -0.825954,0.36966 -0.485175,0.1444 -1.051213,0.1444 -1.120524,0 -1.686562,-0.57759 -0.566038,-0.58337 -0.566038,-1.54794 v -3.08433 h -1.328456 v -1.08009 h 1.328456 v -1.34579 l 1.524837,-0.18483 v 1.53062 h 2.021564 l -0.155949,1.08009 h -1.865615 v 3.07855 q 0,0.47363 0.231036,0.69311 0.231036,0.21948 0.745091,0.21948 0.329226,0 0.600693,-0.0751 0.277243,-0.0809 0.502503,-0.20216 z" />
+ <path
+ id="path1132"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ d="m -4.0245292,187.28996 -2.0735471,6.12822 q -0.3754333,1.12053 -1.1147482,1.76743 -0.7393148,0.65267 -2.0677712,0.74509 l -0.1906046,-1.1032 q 0.6122451,-0.0866 0.9819025,-0.25991 0.3754334,-0.17328 0.5949175,-0.4563 0.2252599,-0.28302 0.3869851,-0.70466 H -8.027226 l -2.004236,-6.11667 h 1.611475 l 1.3862153,5.10011 1.4439743,-5.10011 z" />
+ <path
+ id="path1134"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ d="m 0.52686192,187.11668 q 0.80284968,0 1.29380098,0.39854 0.4909513,0.39276 0.7104353,1.12052 0.22526,0.72199 0.22526,1.69811 0,0.94148 -0.2714671,1.67501 -0.2714672,0.73354 -0.7970738,1.15518 -0.5198308,0.41587 -1.28224922,0.41587 -0.93569535,0 -1.51328508,-0.66423 v 2.84752 l -1.5248368,0.16172 v -8.63496 h 1.3400081 l 0.080863,0.74509 q 0.35810559,-0.47363 0.80862557,-0.69311 0.45629588,-0.22526 0.92991945,-0.22526 z m -0.44474409,1.14363 q -0.38698511,0 -0.68155586,0.23103 -0.28879486,0.23104 -0.50827897,0.57182 v 2.73777 q 0.42164051,0.6238 1.07431689,0.6238 0.58336562,0 0.88948817,-0.48518 0.31189844,-0.49095 0.31189844,-1.58837 0,-1.16095 -0.27724306,-1.62303 -0.27724306,-0.46784 -0.80862561,-0.46784 z" />
+ <path
+ id="path1136"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ d="m 5.5980838,190.81325 q 0.069311,0.86061 0.508279,1.24182 0.4389682,0.38121 1.0685409,0.38121 0.4389682,0 0.8259533,-0.13862 0.3869852,-0.13862 0.7624185,-0.38699 l 0.6353487,0.87216 q -0.4274164,0.35811 -1.0223338,0.57759 -0.5891416,0.21949 -1.2995769,0.21949 -0.9934543,0 -1.6750102,-0.41009 -0.67578,-0.41009 -1.0223338,-1.13785 -0.3465538,-0.72777 -0.3465538,-1.67501 0,-0.91259 0.335002,-1.64613 0.3407779,-0.73354 0.9819025,-1.16096 0.6469005,-0.43319 1.5537164,-0.43319 1.2591456,0 1.9984604,0.82018 0.7393149,0.82017 0.7393149,2.26992 0,0.33501 -0.02888,0.60647 z M 6.9092125,188.191 q -0.5544862,0 -0.9125918,0.39853 -0.3523297,0.39854 -0.4158646,1.2476 H 8.1568063 Q 8.1452545,189.06316 7.8391319,188.62996 7.5330094,188.191 6.9092125,188.191 Z" />
+ </g>
+ <g
+ style="font-size:11.263px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#800000;fill-opacity:0.8;stroke-width:0.264583"
+ id="text2014"
+ aria-label="element">
+ <path
+ id="path1105"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#800000;fill-opacity:0.8;stroke-width:0.264583"
+ d="m 186.26703,191.99035 q 0.0693,0.86061 0.50828,1.24182 0.43897,0.3812 1.06854,0.3812 0.43897,0 0.82596,-0.13862 0.38698,-0.13862 0.76241,-0.38698 l 0.63535,0.87216 q -0.42741,0.3581 -1.02233,0.57759 -0.58914,0.21948 -1.29958,0.21948 -0.99345,0 -1.67501,-0.41009 -0.67578,-0.41009 -1.02233,-1.13785 -0.34656,-0.72776 -0.34656,-1.67501 0,-0.91259 0.33501,-1.64613 0.34077,-0.73354 0.9819,-1.16095 0.6469,-0.4332 1.55372,-0.4332 1.25914,0 1.99846,0.82018 0.73931,0.82018 0.73931,2.26993 0,0.335 -0.0289,0.60647 z m 1.31113,-2.62226 q -0.55448,0 -0.91259,0.39854 -0.35233,0.39853 -0.41586,1.24759 h 2.57605 q -0.0116,-0.77397 -0.31768,-1.20716 -0.30612,-0.43897 -0.92992,-0.43897 z" />
+ <path
+ id="path1107"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#800000;fill-opacity:0.8;stroke-width:0.264583"
+ d="m 194.80957,186.02385 v 6.7809 q 0,0.39854 0.23681,0.56604 0.23681,0.1675 0.62957,0.1675 0.24837,0 0.4794,-0.052 0.23104,-0.0577 0.43897,-0.13862 l 0.37543,1.03966 q -0.28879,0.15018 -0.70466,0.25992 -0.41008,0.10974 -0.95302,0.10974 -0.99923,0 -1.51328,-0.57181 -0.51406,-0.57182 -0.51406,-1.54217 v -5.53908 h -1.83096 v -1.08009 z" />
+ <path
+ id="path1109"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#800000;fill-opacity:0.8;stroke-width:0.264583"
+ d="m 200.12915,191.99035 q 0.0693,0.86061 0.50828,1.24182 0.43897,0.3812 1.06854,0.3812 0.43897,0 0.82596,-0.13862 0.38698,-0.13862 0.76242,-0.38698 l 0.63534,0.87216 q -0.42741,0.3581 -1.02233,0.57759 -0.58914,0.21948 -1.29958,0.21948 -0.99345,0 -1.67501,-0.41009 -0.67578,-0.41009 -1.02233,-1.13785 -0.34655,-0.72776 -0.34655,-1.67501 0,-0.91259 0.335,-1.64613 0.34078,-0.73354 0.9819,-1.16095 0.6469,-0.4332 1.55372,-0.4332 1.25914,0 1.99846,0.82018 0.73931,0.82018 0.73931,2.26993 0,0.335 -0.0289,0.60647 z m 1.31113,-2.62226 q -0.55448,0 -0.91259,0.39854 -0.35233,0.39853 -0.41586,1.24759 h 2.57605 q -0.0116,-0.77397 -0.31768,-1.20716 -0.30612,-0.43897 -0.92992,-0.43897 z" />
+ <path
+ id="path1111"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#800000;fill-opacity:0.8;stroke-width:0.264583"
+ d="m 210.10989,188.29377 q 0.57759,0 0.91259,0.38699 0.335,0.38121 0.335,1.36889 v 4.53407 h -1.32846 v -4.34347 q 0,-0.41009 -0.0635,-0.58337 -0.0635,-0.17905 -0.30035,-0.17905 -0.1906,0 -0.38698,0.11552 -0.19638,0.10974 -0.39854,0.39854 v 4.59183 h -1.1494 v -4.34347 q 0,-0.41009 -0.0635,-0.58337 -0.0635,-0.17905 -0.30034,-0.17905 -0.19061,0 -0.38699,0.11552 -0.19638,0.10974 -0.39854,0.39854 v 4.59183 h -1.34578 v -6.11667 h 1.13785 l 0.0982,0.63535 q 0.27147,-0.37543 0.57182,-0.58914 0.30034,-0.21949 0.72198,-0.21949 0.34656,0 0.61225,0.17328 0.27147,0.1675 0.38698,0.57759 0.26569,-0.335 0.58914,-0.54293 0.32923,-0.20794 0.75665,-0.20794 z" />
+ <path
+ id="path1113"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#800000;fill-opacity:0.8;stroke-width:0.264583"
+ d="m 213.99127,191.99035 q 0.0693,0.86061 0.50828,1.24182 0.43897,0.3812 1.06854,0.3812 0.43897,0 0.82596,-0.13862 0.38698,-0.13862 0.76242,-0.38698 l 0.63534,0.87216 q -0.42741,0.3581 -1.02233,0.57759 -0.58914,0.21948 -1.29958,0.21948 -0.99345,0 -1.67501,-0.41009 -0.67578,-0.41009 -1.02233,-1.13785 -0.34655,-0.72776 -0.34655,-1.67501 0,-0.91259 0.335,-1.64613 0.34078,-0.73354 0.9819,-1.16095 0.6469,-0.4332 1.55372,-0.4332 1.25914,0 1.99846,0.82018 0.73931,0.82018 0.73931,2.26993 0,0.335 -0.0289,0.60647 z m 1.31113,-2.62226 q -0.55448,0 -0.91259,0.39854 -0.35233,0.39853 -0.41586,1.24759 H 216.55 q -0.0116,-0.77397 -0.31768,-1.20716 -0.30612,-0.43897 -0.92992,-0.43897 z" />
+ <path
+ id="path1115"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#800000;fill-opacity:0.8;stroke-width:0.264583"
+ d="m 219.62276,194.58372 v -6.11667 h 1.32845 l 0.10974,0.75664 q 0.7913,-0.92992 1.94071,-0.92992 0.82017,0 1.25337,0.4794 0.43896,0.47363 0.43896,1.33423 v 4.47632 h -1.52483 v -3.8814 q 0,-0.69311 -0.1444,-0.9819 -0.13862,-0.2888 -0.60069,-0.2888 -0.37544,0 -0.69889,0.23682 -0.32345,0.23681 -0.57759,0.57759 v 4.33769 z" />
+ <path
+ id="path1117"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#800000;fill-opacity:0.8;stroke-width:0.264583"
+ d="m 231.83299,194.24295 q -0.34078,0.22526 -0.82596,0.36965 -0.48517,0.1444 -1.05121,0.1444 -1.12052,0 -1.68656,-0.57759 -0.56604,-0.58336 -0.56604,-1.54794 v -3.08433 h -1.32846 v -1.08009 h 1.32846 v -1.34578 l 1.52484,-0.18483 v 1.53061 h 2.02156 l -0.15595,1.08009 h -1.86561 v 3.07856 q 0,0.47362 0.23103,0.6931 0.23104,0.21949 0.74509,0.21949 0.32923,0 0.6007,-0.0751 0.27724,-0.0809 0.5025,-0.20216 z" />
+ </g>
+ <path
+ sodipodi:nodetypes="sssssssss"
+ inkscape:connector-curvature="0"
+ id="path2016"
+ style="opacity:0.25;fill:#000081;fill-opacity:0.4;stroke:none;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.2, 2.4;stroke-dashoffset:0;stroke-opacity:0.497957"
+ d="M 17.463123,180.38852 H 170.32495 c 1.14406,0 2.06509,0.92103 2.06509,2.06508 v 15.70853 c 0,1.14406 -0.92103,2.06509 -2.06509,2.06509 H 17.463123 c -1.14406,0 -2.06509,-0.92103 -2.06509,-2.06509 V 182.4536 c 0,-1.14405 0.92103,-2.06508 2.06509,-2.06508 z" />
+ <g
+ style="font-size:11.263px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ id="text2020"
+ aria-label="dtype">
+ <path
+ id="path1094"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ d="m 81.083132,184.68503 1.524837,0.16172 v 8.55988 h -1.35156 l -0.09242,-0.72199 q -0.283019,0.40432 -0.710435,0.65268 -0.427416,0.24259 -0.993454,0.24259 -0.77397,0 -1.282249,-0.40431 -0.502503,-0.40432 -0.750867,-1.13208 -0.242588,-0.73354 -0.242588,-1.70389 0,-0.92992 0.288795,-1.65768 0.294571,-0.73354 0.837505,-1.14941 0.542935,-0.41586 1.293801,-0.41586 0.895264,0 1.47863,0.61802 z m -1.068541,3.5695 q -0.57759,0 -0.912592,0.5025 -0.329226,0.49673 -0.329226,1.58838 0,1.15518 0.306123,1.62302 0.306122,0.46785 0.825953,0.46785 0.381209,0 0.670004,-0.22526 0.288795,-0.23104 0.508279,-0.57181 v -2.78399 q -0.213708,-0.28301 -0.4794,-0.43896 -0.259915,-0.16173 -0.589141,-0.16173 z" />
+ <path
+ id="path1096"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ d="m 89.746961,193.06585 q -0.340778,0.22526 -0.825953,0.36966 -0.485175,0.1444 -1.051213,0.1444 -1.120524,0 -1.686562,-0.57759 -0.566038,-0.58337 -0.566038,-1.54794 v -3.08433 h -1.328457 v -1.08009 h 1.328457 v -1.34579 l 1.524837,-0.18483 v 1.53062 h 2.021564 l -0.15595,1.08009 h -1.865614 v 3.07855 q 0,0.47363 0.231036,0.69311 0.231035,0.21948 0.74509,0.21948 0.329226,0 0.600694,-0.0751 0.277243,-0.0809 0.502503,-0.20216 z" />
+ <path
+ id="path1098"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ d="m 96.937937,187.28996 -2.073547,6.12822 q -0.375433,1.12053 -1.114748,1.76743 -0.739315,0.65267 -2.067771,0.74509 l -0.190605,-1.1032 q 0.612245,-0.0866 0.981902,-0.25991 0.375434,-0.17328 0.594918,-0.4563 0.22526,-0.28302 0.386985,-0.70466 H 92.93524 l -2.004236,-6.11667 h 1.611475 l 1.386216,5.10011 1.443974,-5.10011 z" />
+ <path
+ id="path1100"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ d="m 101.48933,187.11668 q 0.80285,0 1.2938,0.39854 0.49095,0.39276 0.71043,1.12052 0.22526,0.72199 0.22526,1.69811 0,0.94148 -0.27146,1.67501 -0.27147,0.73354 -0.79708,1.15518 -0.51983,0.41587 -1.28225,0.41587 -0.93569,0 -1.513282,-0.66423 v 2.84752 l -1.524837,0.16172 v -8.63496 h 1.340009 l 0.08086,0.74509 q 0.358108,-0.47363 0.808628,-0.69311 0.45629,-0.22526 0.92992,-0.22526 z m -0.44475,1.14363 q -0.38698,0 -0.68155,0.23103 -0.2888,0.23104 -0.508282,0.57182 v 2.73777 q 0.421642,0.6238 1.074322,0.6238 0.58336,0 0.88948,-0.48518 0.3119,-0.49095 0.3119,-1.58837 0,-1.16095 -0.27724,-1.62303 -0.27724,-0.46784 -0.80863,-0.46784 z" />
+ <path
+ id="path1102"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ d="m 106.56055,190.81325 q 0.0693,0.86061 0.50828,1.24182 0.43897,0.38121 1.06854,0.38121 0.43897,0 0.82595,-0.13862 0.38699,-0.13862 0.76242,-0.38699 l 0.63535,0.87216 q -0.42742,0.35811 -1.02233,0.57759 -0.58915,0.21949 -1.29958,0.21949 -0.99346,0 -1.67501,-0.41009 -0.67578,-0.41009 -1.02234,-1.13785 -0.34655,-0.72777 -0.34655,-1.67501 0,-0.91259 0.335,-1.64613 0.34078,-0.73354 0.98191,-1.16096 0.6469,-0.43319 1.55371,-0.43319 1.25915,0 1.99846,0.82018 0.73932,0.82017 0.73932,2.26992 0,0.33501 -0.0289,0.60647 z m 1.31113,-2.62225 q -0.55449,0 -0.91259,0.39853 -0.35233,0.39854 -0.41587,1.2476 h 2.57605 q -0.0115,-0.77397 -0.31767,-1.20717 -0.30613,-0.43896 -0.92992,-0.43896 z" />
+ </g>
+ <path
+ sodipodi:nodetypes="sssssssss"
+ inkscape:connector-curvature="0"
+ id="path2022"
+ style="opacity:1;fill:#ddb9b9;fill-opacity:0.796078;stroke:none;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.2, 2.4;stroke-dashoffset:0;stroke-opacity:0.497957"
+ d="m 175.57697,153.33338 h 65.38081 c 1.14406,0 2.06509,0.92103 2.06509,2.06509 v 15.54342 c 0,1.14406 -0.92103,2.06509 -2.06509,2.06509 h -65.38081 c -1.14406,0 -2.06509,-0.92103 -2.06509,-2.06509 v -15.54342 c 0,-1.14406 0.92103,-2.06509 2.06509,-2.06509 z" />
+ <g
+ style="font-size:11.263px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#800000;fill-opacity:0.8;stroke-width:0.264583"
+ id="text2026"
+ aria-label="element">
+ <path
+ id="path1079"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#800000;fill-opacity:0.8;stroke-width:0.264583"
+ d="m 186.26703,164.7701 q 0.0693,0.86061 0.50828,1.24182 0.43897,0.38121 1.06854,0.38121 0.43897,0 0.82596,-0.13862 0.38698,-0.13862 0.76241,-0.38699 l 0.63535,0.87216 q -0.42741,0.35811 -1.02233,0.57759 -0.58914,0.21949 -1.29958,0.21949 -0.99345,0 -1.67501,-0.41009 -0.67578,-0.41009 -1.02233,-1.13785 -0.34656,-0.72777 -0.34656,-1.67501 0,-0.9126 0.33501,-1.64613 0.34077,-0.73354 0.9819,-1.16096 0.6469,-0.43319 1.55372,-0.43319 1.25914,0 1.99846,0.82017 0.73931,0.82018 0.73931,2.26993 0,0.335 -0.0289,0.60647 z m 1.31113,-2.62226 q -0.55448,0 -0.91259,0.39854 -0.35233,0.39854 -0.41586,1.2476 h 2.57605 q -0.0116,-0.77398 -0.31768,-1.20717 -0.30612,-0.43897 -0.92992,-0.43897 z" />
+ <path
+ id="path1081"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#800000;fill-opacity:0.8;stroke-width:0.264583"
+ d="m 194.80957,158.8036 v 6.7809 q 0,0.39854 0.23681,0.56604 0.23681,0.1675 0.62957,0.1675 0.24837,0 0.4794,-0.052 0.23104,-0.0578 0.43897,-0.13862 l 0.37543,1.03966 q -0.28879,0.15017 -0.70466,0.25991 -0.41008,0.10975 -0.95302,0.10975 -0.99923,0 -1.51328,-0.57182 -0.51406,-0.57181 -0.51406,-1.54216 v -5.53909 h -1.83096 v -1.08009 z" />
+ <path
+ id="path1083"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#800000;fill-opacity:0.8;stroke-width:0.264583"
+ d="m 200.12915,164.7701 q 0.0693,0.86061 0.50828,1.24182 0.43897,0.38121 1.06854,0.38121 0.43897,0 0.82596,-0.13862 0.38698,-0.13862 0.76242,-0.38699 l 0.63534,0.87216 q -0.42741,0.35811 -1.02233,0.57759 -0.58914,0.21949 -1.29958,0.21949 -0.99345,0 -1.67501,-0.41009 -0.67578,-0.41009 -1.02233,-1.13785 -0.34655,-0.72777 -0.34655,-1.67501 0,-0.9126 0.335,-1.64613 0.34078,-0.73354 0.9819,-1.16096 0.6469,-0.43319 1.55372,-0.43319 1.25914,0 1.99846,0.82017 0.73931,0.82018 0.73931,2.26993 0,0.335 -0.0289,0.60647 z m 1.31113,-2.62226 q -0.55448,0 -0.91259,0.39854 -0.35233,0.39854 -0.41586,1.2476 h 2.57605 q -0.0116,-0.77398 -0.31768,-1.20717 -0.30612,-0.43897 -0.92992,-0.43897 z" />
+ <path
+ id="path1085"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#800000;fill-opacity:0.8;stroke-width:0.264583"
+ d="m 210.10989,161.07353 q 0.57759,0 0.91259,0.38698 0.335,0.38121 0.335,1.36889 v 4.53408 h -1.32846 V 163.02 q 0,-0.41008 -0.0635,-0.58336 -0.0635,-0.17905 -0.30035,-0.17905 -0.1906,0 -0.38698,0.11551 -0.19638,0.10975 -0.39854,0.39854 v 4.59184 h -1.1494 V 163.02 q 0,-0.41008 -0.0635,-0.58336 -0.0635,-0.17905 -0.30034,-0.17905 -0.19061,0 -0.38699,0.11551 -0.19638,0.10975 -0.39854,0.39854 v 4.59184 h -1.34578 v -6.11668 h 1.13785 l 0.0982,0.63535 q 0.27147,-0.37543 0.57182,-0.58914 0.30034,-0.21948 0.72198,-0.21948 0.34656,0 0.61225,0.17327 0.27147,0.16751 0.38698,0.57759 0.26569,-0.335 0.58914,-0.54293 0.32923,-0.20793 0.75665,-0.20793 z" />
+ <path
+ id="path1087"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#800000;fill-opacity:0.8;stroke-width:0.264583"
+ d="m 213.99127,164.7701 q 0.0693,0.86061 0.50828,1.24182 0.43897,0.38121 1.06854,0.38121 0.43897,0 0.82596,-0.13862 0.38698,-0.13862 0.76242,-0.38699 l 0.63534,0.87216 q -0.42741,0.35811 -1.02233,0.57759 -0.58914,0.21949 -1.29958,0.21949 -0.99345,0 -1.67501,-0.41009 -0.67578,-0.41009 -1.02233,-1.13785 -0.34655,-0.72777 -0.34655,-1.67501 0,-0.9126 0.335,-1.64613 0.34078,-0.73354 0.9819,-1.16096 0.6469,-0.43319 1.55372,-0.43319 1.25914,0 1.99846,0.82017 0.73931,0.82018 0.73931,2.26993 0,0.335 -0.0289,0.60647 z m 1.31113,-2.62226 q -0.55448,0 -0.91259,0.39854 -0.35233,0.39854 -0.41586,1.2476 H 216.55 q -0.0116,-0.77398 -0.31768,-1.20717 -0.30612,-0.43897 -0.92992,-0.43897 z" />
+ <path
+ id="path1089"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#800000;fill-opacity:0.8;stroke-width:0.264583"
+ d="m 219.62276,167.36348 v -6.11668 h 1.32845 l 0.10974,0.75665 q 0.7913,-0.92992 1.94071,-0.92992 0.82017,0 1.25337,0.4794 0.43896,0.47362 0.43896,1.33423 v 4.47632 h -1.52483 v -3.8814 q 0,-0.69311 -0.1444,-0.98191 -0.13862,-0.28879 -0.60069,-0.28879 -0.37544,0 -0.69889,0.23681 -0.32345,0.23681 -0.57759,0.57759 v 4.3377 z" />
+ <path
+ id="path1091"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#800000;fill-opacity:0.8;stroke-width:0.264583"
+ d="m 231.83299,167.0227 q -0.34078,0.22526 -0.82596,0.36966 -0.48517,0.1444 -1.05121,0.1444 -1.12052,0 -1.68656,-0.57759 -0.56604,-0.58337 -0.56604,-1.54794 v -3.08433 h -1.32846 v -1.0801 h 1.32846 v -1.34578 l 1.52484,-0.18483 v 1.53061 h 2.02156 l -0.15595,1.0801 h -1.86561 v 3.07855 q 0,0.47362 0.23103,0.69311 0.23104,0.21948 0.74509,0.21948 0.32923,0 0.6007,-0.0751 0.27724,-0.0809 0.5025,-0.20216 z" />
+ </g>
+ <path
+ d="M 55.175507,153.27835 H 170.22016 c 1.14406,0 2.06509,0.92103 2.06509,2.06509 v 15.54342 c 0,1.14406 -0.92103,2.06509 -2.06509,2.06509 H 55.175507 c -1.14406,0 -2.06509,-0.92103 -2.06509,-2.06509 v -15.54342 c 0,-1.14406 0.92103,-2.06509 2.06509,-2.06509 z"
+ style="opacity:0.25;fill:#d99b00;fill-opacity:1;stroke:none;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.2, 2.4;stroke-dashoffset:0;stroke-opacity:0.497957"
+ id="path2031"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssssssss" />
+ <g
+ style="font-size:11.263px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#b27d00;fill-opacity:1;stroke-width:0.264583"
+ id="text2035"
+ aria-label="dtype">
+ <path
+ id="path1068"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#b27d00;fill-opacity:1;stroke-width:0.264583"
+ d="m 99.886927,157.49231 1.524833,0.16172 v 8.55988 h -1.35156 l -0.09241,-0.72198 q -0.283019,0.40431 -0.710435,0.65267 -0.427416,0.24259 -0.993454,0.24259 -0.773971,0 -1.28225,-0.40431 -0.502503,-0.40432 -0.750866,-1.13208 -0.242588,-0.73354 -0.242588,-1.70389 0,-0.92992 0.288795,-1.65768 0.294571,-0.73354 0.837505,-1.1494 0.542934,-0.41587 1.293801,-0.41587 0.895264,0 1.47863,0.61802 z m -1.068541,3.5695 q -0.57759,0 -0.912592,0.50251 -0.329226,0.49672 -0.329226,1.58837 0,1.15518 0.306122,1.62302 0.306123,0.46785 0.825954,0.46785 0.381209,0 0.670004,-0.22526 0.288795,-0.23103 0.508279,-0.57181 v -2.78398 q -0.213708,-0.28302 -0.4794,-0.43897 -0.259915,-0.16173 -0.589141,-0.16173 z" />
+ <path
+ id="path1070"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#b27d00;fill-opacity:1;stroke-width:0.264583"
+ d="m 108.55076,165.87314 q -0.34078,0.22526 -0.82596,0.36965 -0.48517,0.1444 -1.05121,0.1444 -1.12052,0 -1.68656,-0.57759 -0.56604,-0.58337 -0.56604,-1.54794 v -3.08433 h -1.32846 v -1.08009 h 1.32846 v -1.34579 l 1.52484,-0.18482 v 1.53061 h 2.02156 l -0.15595,1.08009 h -1.86561 v 3.07855 q 0,0.47363 0.23103,0.69311 0.23104,0.21949 0.74509,0.21949 0.32923,0 0.6007,-0.0751 0.27724,-0.0809 0.5025,-0.20216 z" />
+ <path
+ id="path1072"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#b27d00;fill-opacity:1;stroke-width:0.264583"
+ d="m 115.74173,160.09724 -2.07355,6.12822 q -0.37543,1.12053 -1.11474,1.76743 -0.73932,0.65268 -2.06777,0.74509 l -0.19061,-1.1032 q 0.61225,-0.0866 0.9819,-0.25991 0.37544,-0.17328 0.59492,-0.4563 0.22526,-0.28302 0.38699,-0.70466 h -0.51983 l -2.00424,-6.11667 h 1.61147 l 1.38622,5.10012 1.44397,-5.10012 z" />
+ <path
+ id="path1074"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#b27d00;fill-opacity:1;stroke-width:0.264583"
+ d="m 120.29312,159.92396 q 0.80285,0 1.2938,0.39854 0.49095,0.39276 0.71044,1.12052 0.22526,0.72199 0.22526,1.69812 0,0.94147 -0.27147,1.67501 -0.27147,0.73353 -0.79707,1.15518 -0.51983,0.41586 -1.28225,0.41586 -0.9357,0 -1.51329,-0.66423 v 2.84752 l -1.52483,0.16172 v -8.63496 h 1.34 l 0.0809,0.74509 q 0.3581,-0.47362 0.80862,-0.69311 0.4563,-0.22526 0.92992,-0.22526 z m -0.44474,1.14363 q -0.38699,0 -0.68156,0.23103 -0.28879,0.23104 -0.50828,0.57182 v 2.73777 q 0.42164,0.6238 1.07432,0.6238 0.58337,0 0.88949,-0.48517 0.3119,-0.49096 0.3119,-1.58838 0,-1.16095 -0.27725,-1.62302 -0.27724,-0.46785 -0.80862,-0.46785 z" />
+ <path
+ id="path1076"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#b27d00;fill-opacity:1;stroke-width:0.264583"
+ d="m 125.36434,163.62054 q 0.0693,0.8606 0.50828,1.24181 0.43897,0.38121 1.06854,0.38121 0.43897,0 0.82596,-0.13862 0.38698,-0.13862 0.76242,-0.38698 l 0.63534,0.87216 q -0.42741,0.3581 -1.02233,0.57759 -0.58914,0.21948 -1.29958,0.21948 -0.99345,0 -1.67501,-0.41009 -0.67578,-0.41009 -1.02233,-1.13785 -0.34655,-0.72776 -0.34655,-1.67501 0,-0.91259 0.335,-1.64613 0.34078,-0.73354 0.9819,-1.16096 0.6469,-0.43319 1.55372,-0.43319 1.25914,0 1.99846,0.82018 0.73931,0.82018 0.73931,2.26993 0,0.335 -0.0289,0.60647 z m 1.31113,-2.62226 q -0.55448,0 -0.91259,0.39853 -0.35233,0.39854 -0.41586,1.2476 h 2.57605 q -0.0116,-0.77397 -0.31768,-1.20716 -0.30612,-0.43897 -0.92992,-0.43897 z" />
+ </g>
+ <path
+ style="fill:none;stroke:#808080;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 52.572927,70.114137 V 205.33633"
+ id="path3042"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <g
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.72103px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke-width:0.105503"
+ id="text3050"
+ aria-label="Python type">
+ <path
+ id="path1047"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -121.47364,105.10011 h 2.42156 q 1.08004,0 1.65606,0.48128 0.57981,0.47749 0.57981,1.36426 0,0.89055 -0.57981,1.37183 -0.57602,0.47749 -1.65606,0.47749 h -0.96256 v 1.96302 h -1.459 z m 1.459,1.0573 v 1.58026 h 0.80719 q 0.42443,0 0.6556,-0.20464 0.23117,-0.20842 0.23117,-0.58738 0,-0.37896 -0.23117,-0.5836 -0.23117,-0.20464 -0.6556,-0.20464 z" />
+ <path
+ id="path1049"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -116.25914,106.51363 h 1.35668 l 1.14067,2.8801 0.97014,-2.8801 h 1.35668 l -1.78491,4.64606 q -0.26906,0.70865 -0.62907,0.98908 -0.35622,0.28422 -0.94361,0.28422 h -0.78445 v -0.89055 h 0.42443 q 0.34486,0 0.50023,-0.1099 0.15917,-0.1099 0.24633,-0.39412 l 0.0379,-0.11748 z" />
+ <path
+ id="path1051"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -109.16121,105.30854 v 1.20509 h 1.39836 v 0.97014 h -1.39836 v 1.80006 q 0,0.29559 0.11748,0.4017 0.11747,0.10232 0.46612,0.10232 h 0.69729 v 0.97014 h -1.16341 q -0.8034,0 -1.14067,-0.33349 -0.33349,-0.33727 -0.33349,-1.14067 v -1.80006 h -0.67455 v -0.97014 h 0.67455 v -1.20509 z" />
+ <path
+ id="path1053"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -102.66583,108.17348 v 2.58451 h -1.36426 v -0.42065 -1.54995 q 0,-0.55707 -0.0265,-0.7655 -0.0227,-0.20842 -0.0834,-0.30695 -0.0796,-0.13264 -0.21601,-0.20464 -0.13643,-0.0758 -0.31075,-0.0758 -0.42444,0 -0.66697,0.3297 -0.24253,0.32591 -0.24253,0.90572 v 2.08807 h -1.35668 v -5.89663 h 1.35668 v 2.27377 q 0.30695,-0.37139 0.65181,-0.54571 0.34485,-0.17811 0.76171,-0.17811 0.73518,0 1.11414,0.45096 0.38275,0.45097 0.38275,1.31121 z" />
+ <path
+ id="path1055"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -99.387821,107.38145 q -0.450963,0 -0.689709,0.32591 -0.23495,0.32211 -0.23495,0.93224 0,0.61013 0.23495,0.93603 0.238746,0.32212 0.689709,0.32212 0.443384,0 0.678339,-0.32212 0.234956,-0.3259 0.234956,-0.93603 0,-0.61013 -0.234956,-0.93224 -0.234955,-0.32591 -0.678339,-0.32591 z m 0,-0.97014 q 1.095196,0 1.709112,0.59118 0.617705,0.59118 0.617705,1.63711 0,1.04593 -0.617705,1.63711 -0.613916,0.59118 -1.709112,0.59118 -1.098989,0 -1.720479,-0.59118 -0.61771,-0.59118 -0.61771,-1.63711 0,-1.04593 0.61771,-1.63711 0.62149,-0.59118 1.720479,-0.59118 z" />
+ <path
+ id="path1057"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -91.808612,108.17348 v 2.58451 h -1.364257 v -0.42065 -1.55753 q 0,-0.54949 -0.02653,-0.75792 -0.02274,-0.20842 -0.08337,-0.30695 -0.07958,-0.13264 -0.216007,-0.20464 -0.136426,-0.0758 -0.310748,-0.0758 -0.424435,0 -0.66697,0.3297 -0.242535,0.32591 -0.242535,0.90572 v 2.08807 h -1.356678 v -4.24436 h 1.356678 v 0.6215 q 0.306958,-0.37139 0.651812,-0.54571 0.344854,-0.17811 0.761711,-0.17811 0.735183,0 1.114143,0.45096 0.38275,0.45097 0.38275,1.31121 z" />
+ <path
+ id="path1059"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -86.366739,105.30854 v 1.20509 h 1.398364 v 0.97014 h -1.398364 v 1.80006 q 0,0.29559 0.117478,0.4017 0.117478,0.10232 0.466121,0.10232 h 0.697287 v 0.97014 h -1.163408 q -0.803396,0 -1.140671,-0.33349 -0.333485,-0.33727 -0.333485,-1.14067 v -1.80006 h -0.67455 v -0.97014 h 0.67455 v -1.20509 z" />
+ <path
+ id="path1061"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -84.695524,106.51363 h 1.356678 l 1.140671,2.8801 0.970139,-2.8801 h 1.356678 l -1.784903,4.64606 q -0.269062,0.70865 -0.629075,0.98908 -0.356222,0.28422 -0.943611,0.28422 h -0.784448 v -0.89055 h 0.424435 q 0.344854,0 0.500228,-0.1099 0.159164,-0.1099 0.246325,-0.39412 l 0.0379,-0.11748 z" />
+ <path
+ id="path1063"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -77.722654,110.14407 v 2.22829 h -1.356678 v -5.85873 h 1.356678 v 0.6215 q 0.280431,-0.37139 0.621496,-0.54571 0.341064,-0.17811 0.784448,-0.17811 0.784448,0 1.288465,0.62529 0.504018,0.62149 0.504018,1.603 0,0.98151 -0.504018,1.60679 -0.504017,0.6215 -1.288465,0.6215 -0.443384,0 -0.784448,-0.17433 -0.341065,-0.17811 -0.621496,-0.54949 z m 0.901926,-2.74746 q -0.435804,0 -0.67076,0.32212 -0.231166,0.31832 -0.231166,0.92087 0,0.60255 0.231166,0.92466 0.234956,0.31833 0.67076,0.31833 0.435805,0 0.663181,-0.31833 0.231166,-0.31832 0.231166,-0.92466 0,-0.60634 -0.231166,-0.92466 -0.227376,-0.31833 -0.663181,-0.31833 z" />
+ <path
+ id="path1065"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -69.286993,108.62444 v 0.38654 h -3.171899 q 0.04927,0.47749 0.344854,0.71624 0.295589,0.23874 0.826134,0.23874 0.428225,0 0.875398,-0.12506 0.450963,-0.12884 0.924664,-0.38654 v 1.04593 q -0.48128,0.18191 -0.96256,0.27286 -0.48128,0.0947 -0.962559,0.0947 -1.15204,0 -1.792483,-0.5836 -0.636654,-0.58739 -0.636654,-1.64469 0,-1.03835 0.625285,-1.63332 0.629074,-0.59497 1.72806,-0.59497 1.000455,0 1.599213,0.60255 0.602547,0.60255 0.602547,1.61058 z m -1.394575,-0.45096 q 0,-0.38654 -0.227376,-0.6215 -0.223587,-0.23874 -0.587389,-0.23874 -0.394118,0 -0.640443,0.22358 -0.246324,0.2198 -0.306958,0.63666 z" />
+ </g>
+ <g
+ style="font-size:3.52778px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect3054)"
+ id="text3052" />
+ <g
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.72103px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke-width:0.105503"
+ id="text3062"
+ aria-label="Python type
+with ABC">
+ <path
+ id="path1011"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -121.47364,128.2522 h 2.42156 q 1.08004,0 1.65606,0.48128 0.57981,0.47749 0.57981,1.36426 0,0.89055 -0.57981,1.37183 -0.57602,0.47749 -1.65606,0.47749 h -0.96256 v 1.96302 h -1.459 z m 1.459,1.0573 v 1.58027 h 0.80719 q 0.42443,0 0.6556,-0.20464 0.23117,-0.20843 0.23117,-0.58739 0,-0.37896 -0.23117,-0.5836 -0.23117,-0.20464 -0.6556,-0.20464 z" />
+ <path
+ id="path1013"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -116.25914,129.66572 h 1.35668 l 1.14067,2.8801 0.97014,-2.8801 h 1.35668 l -1.78491,4.64606 q -0.26906,0.70865 -0.62907,0.98908 -0.35622,0.28423 -0.94361,0.28423 h -0.78445 v -0.89056 h 0.42443 q 0.34486,0 0.50023,-0.1099 0.15917,-0.1099 0.24633,-0.39412 l 0.0379,-0.11748 z" />
+ <path
+ id="path1015"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -109.16121,128.46063 v 1.20509 h 1.39836 v 0.97014 h -1.39836 v 1.80006 q 0,0.29559 0.11748,0.4017 0.11747,0.10232 0.46612,0.10232 h 0.69729 v 0.97014 h -1.16341 q -0.8034,0 -1.14067,-0.33349 -0.33349,-0.33727 -0.33349,-1.14067 v -1.80006 h -0.67455 v -0.97014 h 0.67455 v -1.20509 z" />
+ <path
+ id="path1017"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -102.66583,131.32557 v 2.58451 h -1.36426 v -0.42065 -1.54994 q 0,-0.55708 -0.0265,-0.7655 -0.0227,-0.20843 -0.0834,-0.30696 -0.0796,-0.13264 -0.21601,-0.20464 -0.13643,-0.0758 -0.31075,-0.0758 -0.42444,0 -0.66697,0.32969 -0.24253,0.32591 -0.24253,0.90572 v 2.08807 h -1.35668 v -5.89662 h 1.35668 v 2.27376 q 0.30695,-0.37138 0.65181,-0.5457 0.34485,-0.17812 0.76171,-0.17812 0.73518,0 1.11414,0.45097 0.38275,0.45096 0.38275,1.3112 z" />
+ <path
+ id="path1019"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -99.387821,130.53354 q -0.450963,0 -0.689709,0.32591 -0.23495,0.32211 -0.23495,0.93224 0,0.61013 0.23495,0.93603 0.238746,0.32212 0.689709,0.32212 0.443384,0 0.678339,-0.32212 0.234956,-0.3259 0.234956,-0.93603 0,-0.61013 -0.234956,-0.93224 -0.234955,-0.32591 -0.678339,-0.32591 z m 0,-0.97014 q 1.095196,0 1.709112,0.59118 0.617705,0.59118 0.617705,1.63711 0,1.04593 -0.617705,1.63711 -0.613916,0.59118 -1.709112,0.59118 -1.098989,0 -1.720479,-0.59118 -0.61771,-0.59118 -0.61771,-1.63711 0,-1.04593 0.61771,-1.63711 0.62149,-0.59118 1.720479,-0.59118 z" />
+ <path
+ id="path1021"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -91.808612,131.32557 v 2.58451 h -1.364257 v -0.42065 -1.55752 q 0,-0.5495 -0.02653,-0.75792 -0.02274,-0.20843 -0.08337,-0.30696 -0.07958,-0.13264 -0.216007,-0.20464 -0.136426,-0.0758 -0.310748,-0.0758 -0.424435,0 -0.66697,0.32969 -0.242535,0.32591 -0.242535,0.90572 v 2.08807 h -1.356678 v -4.24436 h 1.356678 v 0.6215 q 0.306958,-0.37138 0.651812,-0.5457 0.344854,-0.17812 0.761711,-0.17812 0.735183,0 1.114143,0.45097 0.38275,0.45096 0.38275,1.3112 z" />
+ <path
+ id="path1023"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -86.366739,128.46063 v 1.20509 h 1.398364 v 0.97014 h -1.398364 v 1.80006 q 0,0.29559 0.117478,0.4017 0.117478,0.10232 0.466121,0.10232 h 0.697287 v 0.97014 h -1.163408 q -0.803396,0 -1.140671,-0.33349 -0.333485,-0.33727 -0.333485,-1.14067 v -1.80006 h -0.67455 v -0.97014 h 0.67455 v -1.20509 z" />
+ <path
+ id="path1025"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -84.695524,129.66572 h 1.356678 l 1.140671,2.8801 0.970139,-2.8801 h 1.356678 l -1.784903,4.64606 q -0.269062,0.70865 -0.629075,0.98908 -0.356222,0.28423 -0.943611,0.28423 h -0.784448 v -0.89056 h 0.424435 q 0.344854,0 0.500228,-0.1099 0.159164,-0.1099 0.246325,-0.39412 l 0.0379,-0.11748 z" />
+ <path
+ id="path1027"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -77.722654,133.29616 v 2.22829 h -1.356678 v -5.85873 h 1.356678 v 0.6215 q 0.280431,-0.37138 0.621496,-0.5457 0.341064,-0.17812 0.784448,-0.17812 0.784448,0 1.288465,0.62529 0.504018,0.62149 0.504018,1.603 0,0.98151 -0.504018,1.60679 -0.504017,0.6215 -1.288465,0.6215 -0.443384,0 -0.784448,-0.17432 -0.341065,-0.17811 -0.621496,-0.5495 z m 0.901926,-2.74746 q -0.435804,0 -0.67076,0.32212 -0.231166,0.31832 -0.231166,0.92087 0,0.60255 0.231166,0.92466 0.234956,0.31833 0.67076,0.31833 0.435805,0 0.663181,-0.31833 0.231166,-0.31832 0.231166,-0.92466 0,-0.60634 -0.231166,-0.92466 -0.227376,-0.31833 -0.663181,-0.31833 z" />
+ <path
+ id="path1029"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -69.286993,131.77653 v 0.38654 h -3.171899 q 0.04927,0.47749 0.344854,0.71624 0.295589,0.23874 0.826134,0.23874 0.428225,0 0.875398,-0.12505 0.450963,-0.12885 0.924664,-0.38654 v 1.04593 q -0.48128,0.1819 -0.96256,0.27285 -0.48128,0.0947 -0.962559,0.0947 -1.15204,0 -1.792483,-0.5836 -0.636654,-0.58739 -0.636654,-1.64469 0,-1.03835 0.625285,-1.63332 0.629074,-0.59497 1.72806,-0.59497 1.000455,0 1.599213,0.60255 0.602547,0.60255 0.602547,1.61058 z m -1.394575,-0.45096 q 0,-0.38654 -0.227376,-0.6215 -0.223587,-0.23874 -0.587389,-0.23874 -0.394118,0 -0.640443,0.22359 -0.246324,0.21979 -0.306958,0.63665 z" />
+ <path
+ id="path1031"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -121.91323,139.36711 h 1.31878 l 0.71245,2.92557 0.71623,-2.92557 h 1.1331 l 0.71244,2.89526 0.71624,-2.89526 h 1.31878 l -1.11793,4.24436 h -1.48174 l -0.71624,-2.918 -0.71244,2.918 h -1.48174 z" />
+ <path
+ id="path1033"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -114.36434,139.36711 h 1.35668 v 4.24436 h -1.35668 z m 0,-1.65227 h 1.35668 v 1.10657 h -1.35668 z" />
+ <path
+ id="path1035"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -110.2223,138.16202 v 1.20509 h 1.39836 v 0.97014 h -1.39836 v 1.80006 q 0,0.29559 0.11748,0.4017 0.11748,0.10232 0.46612,0.10232 h 0.69729 v 0.97014 h -1.16341 q -0.8034,0 -1.14067,-0.33349 -0.33349,-0.33727 -0.33349,-1.14067 v -1.80006 h -0.67455 v -0.97014 h 0.67455 v -1.20509 z" />
+ <path
+ id="path1037"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -103.72692,141.02696 v 2.58451 h -1.36426 v -0.42065 -1.54995 q 0,-0.55707 -0.0265,-0.7655 -0.0227,-0.20843 -0.0834,-0.30696 -0.0796,-0.13263 -0.21601,-0.20463 -0.13643,-0.0758 -0.31075,-0.0758 -0.42443,0 -0.66697,0.3297 -0.24253,0.32591 -0.24253,0.90572 v 2.08807 h -1.35668 v -5.89663 h 1.35668 v 2.27377 q 0.30695,-0.37139 0.65181,-0.54571 0.34485,-0.17811 0.76171,-0.17811 0.73518,0 1.11414,0.45096 0.38275,0.45097 0.38275,1.31121 z" />
+ <path
+ id="path1039"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -96.272765,142.58069 h -2.281342 l -0.360013,1.03078 h -1.46658 l 2.095655,-5.65788 h 1.739428 l 2.095651,5.65788 h -1.466576 z m -1.91754,-1.04972 h 1.549948 l -0.773079,-2.25102 z" />
+ <path
+ id="path1041"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -91.43344,140.14398 q 0.344854,0 0.522965,-0.15158 0.178112,-0.15159 0.178112,-0.44718 0,-0.2918 -0.178112,-0.44338 -0.178111,-0.15538 -0.522965,-0.15538 h -0.807186 v 1.19752 z m 0.04927,2.47461 q 0.439594,0 0.659391,-0.18569 0.223586,-0.18569 0.223586,-0.56086 0,-0.36759 -0.219797,-0.54949 -0.219797,-0.18569 -0.66318,-0.18569 h -0.856451 v 1.48173 z m 1.356678,-2.03502 q 0.469911,0.13643 0.727604,0.50402 0.257693,0.36759 0.257693,0.90193 0,0.81855 -0.553282,1.22025 -0.553282,0.4017 -1.682584,0.4017 h -2.421558 v -5.65788 h 2.190392 q 1.178567,0 1.705322,0.35622 0.530544,0.35622 0.530544,1.14067 0,0.41307 -0.19327,0.70487 -0.193269,0.28801 -0.560861,0.42822 z" />
+ <path
+ id="path1043"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -83.297161,143.30072 q -0.401698,0.20843 -0.837502,0.31454 -0.435805,0.10611 -0.909505,0.10611 -1.413523,0 -2.239657,-0.78824 -0.826133,-0.79203 -0.826133,-2.14492 0,-1.35668 0.826133,-2.14491 0.826134,-0.79203 2.239657,-0.79203 0.4737,0 0.909505,0.10611 0.435804,0.10611 0.837502,0.31453 v 1.17099 q -0.405488,-0.27664 -0.799606,-0.40549 -0.394119,-0.12884 -0.829924,-0.12884 -0.780658,0 -1.227832,0.50023 -0.447173,0.50022 -0.447173,1.37941 0,0.8754 0.447173,1.37563 0.447174,0.50023 1.227832,0.50023 0.435805,0 0.829924,-0.12885 0.394118,-0.12885 0.799606,-0.40549 z" />
+ </g>
+ <g
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.72103px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke-width:0.105503"
+ id="text3070"
+ aria-label="NEP 41 Proposal">
+ <path
+ id="path984"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -139.86458,159.57088 h 1.62953 l 2.05775,3.88056 v -3.88056 h 1.38321 v 5.65788 h -1.62953 l -2.05776,-3.88056 v 3.88056 h -1.3832 z" />
+ <path
+ id="path986"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -133.3692,159.57088 h 3.9374 v 1.10278 h -2.4784 v 1.05351 h 2.33061 v 1.10277 h -2.33061 v 1.29604 h 2.56177 v 1.10278 h -4.02077 z" />
+ <path
+ id="path988"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -128.06754,159.57088 h 2.42156 q 1.08003,0 1.65605,0.48128 0.57981,0.47749 0.57981,1.36426 0,0.89055 -0.57981,1.37183 -0.57602,0.47749 -1.65605,0.47749 h -0.96256 v 1.96302 h -1.459 z m 1.459,1.0573 v 1.58027 h 0.80718 q 0.42444,0 0.6556,-0.20464 0.23117,-0.20843 0.23117,-0.58739 0,-0.37896 -0.23117,-0.5836 -0.23116,-0.20464 -0.6556,-0.20464 z" />
+ <path
+ id="path990"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -117.53244,160.77218 -1.59921,2.36851 h 1.59921 z m -0.24254,-1.2013 h 1.62195 v 3.56981 h 0.80719 v 1.0573 h -0.80719 v 1.03077 h -1.37941 v -1.03077 h -2.50872 v -1.25057 z" />
+ <path
+ id="path992"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -114.08011,164.22072 h 1.28846 v -3.65696 l -1.32257,0.27285 v -0.99288 l 1.31499,-0.27285 h 1.387 v 4.64984 h 1.28846 v 1.00804 h -3.95634 z" />
+ <path
+ id="path994"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -106.175,159.57088 h 2.42156 q 1.08004,0 1.65606,0.48128 0.57981,0.47749 0.57981,1.36426 0,0.89055 -0.57981,1.37183 -0.57602,0.47749 -1.65606,0.47749 h -0.96256 v 1.96302 h -1.459 z m 1.459,1.0573 v 1.58027 h 0.80719 q 0.42443,0 0.6556,-0.20464 0.23116,-0.20843 0.23116,-0.58739 0,-0.37896 -0.23116,-0.5836 -0.23117,-0.20464 -0.6556,-0.20464 z" />
+ <path
+ id="path996"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -97.394486,162.14023 q -0.178112,-0.0834 -0.356223,-0.12127 -0.174322,-0.0417 -0.352433,-0.0417 -0.522966,0 -0.807186,0.33727 -0.280431,0.33349 -0.280431,0.95877 v 1.95544 h -1.356681 v -4.24436 h 1.356681 v 0.69729 q 0.261483,-0.41686 0.598758,-0.60634 0.341064,-0.19327 0.814765,-0.19327 0.06821,0 0.147794,0.008 0.07958,0.004 0.231166,0.0227 z" />
+ <path
+ id="path998"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -94.700075,161.85222 q -0.450963,0 -0.689708,0.32591 -0.234955,0.32211 -0.234955,0.93224 0,0.61013 0.234955,0.93603 0.238745,0.32212 0.689708,0.32212 0.443384,0 0.678339,-0.32212 0.234956,-0.3259 0.234956,-0.93603 0,-0.61013 -0.234956,-0.93224 -0.234955,-0.32591 -0.678339,-0.32591 z m 0,-0.97014 q 1.095196,0 1.709112,0.59118 0.617705,0.59118 0.617705,1.63711 0,1.04593 -0.617705,1.63711 -0.613916,0.59118 -1.709112,0.59118 -1.098985,0 -1.72048,-0.59118 -0.617706,-0.59118 -0.617706,-1.63711 0,-1.04593 0.617706,-1.63711 0.621495,-0.59118 1.72048,-0.59118 z" />
+ <path
+ id="path1000"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -90.031282,164.61484 v 2.22829 h -1.356678 v -5.85873 h 1.356678 v 0.6215 q 0.280431,-0.37138 0.621495,-0.54571 0.341065,-0.17811 0.784449,-0.17811 0.784448,0 1.288465,0.62529 0.504017,0.62149 0.504017,1.603 0,0.98151 -0.504017,1.60679 -0.504017,0.6215 -1.288465,0.6215 -0.443384,0 -0.784449,-0.17432 -0.341064,-0.17811 -0.621495,-0.5495 z m 0.901926,-2.74746 q -0.435804,0 -0.67076,0.32212 -0.231166,0.31832 -0.231166,0.92087 0,0.60255 0.231166,0.92466 0.234956,0.31833 0.67076,0.31833 0.435805,0 0.663181,-0.31833 0.231166,-0.31832 0.231166,-0.92466 0,-0.60634 -0.231166,-0.92466 -0.227376,-0.31833 -0.663181,-0.31833 z" />
+ <path
+ id="path1002"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -83.812544,161.85222 q -0.450963,0 -0.689708,0.32591 -0.234955,0.32211 -0.234955,0.93224 0,0.61013 0.234955,0.93603 0.238745,0.32212 0.689708,0.32212 0.443384,0 0.67834,-0.32212 0.234955,-0.3259 0.234955,-0.93603 0,-0.61013 -0.234955,-0.93224 -0.234956,-0.32591 -0.67834,-0.32591 z m 0,-0.97014 q 1.095196,0 1.709112,0.59118 0.617705,0.59118 0.617705,1.63711 0,1.04593 -0.617705,1.63711 -0.613916,0.59118 -1.709112,0.59118 -1.098985,0 -1.72048,-0.59118 -0.617706,-0.59118 -0.617706,-1.63711 0,-1.04593 0.617706,-1.63711 0.621495,-0.59118 1.72048,-0.59118 z" />
+ <path
+ id="path1004"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -77.184525,161.11704 v 1.03077 q -0.435804,-0.1819 -0.841292,-0.27285 -0.405488,-0.0909 -0.7655,-0.0909 -0.38654,0 -0.57602,0.0985 -0.185691,0.0947 -0.185691,0.29559 0,0.16295 0.140216,0.25011 0.144005,0.0872 0.511596,0.12885 l 0.238745,0.0341 q 1.042142,0.13263 1.402154,0.4358 0.360012,0.30317 0.360012,0.95119 0,0.67834 -0.500227,1.0194 -0.500228,0.34107 -1.493105,0.34107 -0.420646,0 -0.871609,-0.0682 -0.447173,-0.0644 -0.920873,-0.19706 v -1.03078 q 0.405487,0.19706 0.829923,0.29559 0.428225,0.0985 0.867819,0.0985 0.397909,0 0.598758,-0.1099 0.200849,-0.10989 0.200849,-0.3259 0,-0.1819 -0.140215,-0.26906 -0.136426,-0.0909 -0.549493,-0.14022 l -0.238745,-0.0303 q -0.905716,-0.11368 -1.269518,-0.42064 -0.363802,-0.30696 -0.363802,-0.93224 0,-0.67455 0.462332,-1.00046 0.462332,-0.32591 1.417312,-0.32591 0.375171,0 0.788238,0.0568 0.413067,0.0568 0.898136,0.17811 z" />
+ <path
+ id="path1006"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -73.978521,163.3188 q -0.424436,0 -0.640444,0.144 -0.212217,0.14401 -0.212217,0.42444 0,0.25769 0.170532,0.40549 0.174322,0.144 0.481279,0.144 0.382751,0 0.644233,-0.27285 0.261483,-0.27664 0.261483,-0.68971 v -0.15537 z m 2.072913,-0.5116 v 2.42156 h -1.368047 v -0.62907 q -0.272852,0.38654 -0.613916,0.56465 -0.341064,0.17432 -0.829923,0.17432 -0.659391,0 -1.072458,-0.38275 -0.409278,-0.38654 -0.409278,-1.00046 0,-0.74655 0.511597,-1.09519 0.515386,-0.34865 1.614371,-0.34865 h 0.799607 v -0.10611 q 0,-0.32211 -0.253904,-0.46991 -0.253903,-0.15158 -0.792027,-0.15158 -0.435804,0 -0.810975,0.0872 -0.375171,0.0872 -0.697287,0.26148 v -1.03456 q 0.435804,-0.10611 0.875398,-0.15916 0.439594,-0.0568 0.879188,-0.0568 1.148251,0 1.656058,0.45476 0.511596,0.45096 0.511596,1.47036 z" />
+ <path
+ id="path1008"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -70.643667,159.33214 h 1.356679 v 5.89662 h -1.356679 z" />
+ </g>
+ <g
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.72103px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke-width:0.105503"
+ id="text3076"
+ aria-label="Alternative">
+ <path
+ id="path961"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -113.68979,192.17046 h -2.28134 l -0.36001,1.03077 h -1.46658 l 2.09565,-5.65788 h 1.73943 l 2.09565,5.65788 h -1.46658 z m -1.91754,-1.04972 h 1.54995 l -0.77308,-2.25102 z" />
+ <path
+ id="path963"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -111.17728,187.30461 h 1.35668 v 5.89662 h -1.35668 z" />
+ <path
+ id="path965"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -107.03524,187.75178 v 1.2051 h 1.39836 v 0.97013 h -1.39836 v 1.80007 q 0,0.29559 0.11747,0.40169 0.11748,0.10232 0.46612,0.10232 h 0.69729 v 0.97014 h -1.16341 q -0.80339,0 -1.14067,-0.33348 -0.33348,-0.33728 -0.33348,-1.14067 v -1.80007 h -0.67455 v -0.97013 h 0.67455 v -1.2051 z" />
+ <path
+ id="path967"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -100.57018,191.06769 v 0.38654 h -3.1719 q 0.0493,0.47749 0.34486,0.71623 0.29559,0.23875 0.82613,0.23875 0.42823,0 0.8754,-0.12506 0.45096,-0.12885 0.92466,-0.38654 v 1.04593 q -0.48128,0.1819 -0.96256,0.27285 -0.48128,0.0947 -0.96256,0.0947 -1.15204,0 -1.79248,-0.5836 -0.63665,-0.58739 -0.63665,-1.64469 0,-1.03835 0.62528,-1.63332 0.62908,-0.59496 1.72806,-0.59496 1.00046,0 1.59921,0.60254 0.60255,0.60255 0.60255,1.61059 z m -1.39457,-0.45097 q 0,-0.38654 -0.22738,-0.62149 -0.22359,-0.23875 -0.58739,-0.23875 -0.39412,0 -0.64044,0.22359 -0.24633,0.2198 -0.30696,0.63665 z" />
+ <path
+ id="path969"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -96.390244,190.11271 q -0.178112,-0.0834 -0.356223,-0.12127 -0.174322,-0.0417 -0.352434,-0.0417 -0.522965,0 -0.807185,0.33728 -0.280431,0.33348 -0.280431,0.95877 v 1.95543 h -1.356678 v -4.24435 h 1.356678 v 0.69728 q 0.261483,-0.41685 0.598758,-0.60633 0.341064,-0.19327 0.814764,-0.19327 0.06821,0 0.147795,0.008 0.07958,0.004 0.231166,0.0227 z" />
+ <path
+ id="path971"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -91.448601,190.61672 v 2.58451 h -1.364258 v -0.42064 -1.55753 q 0,-0.54949 -0.02653,-0.75792 -0.02274,-0.20843 -0.08337,-0.30696 -0.07958,-0.13264 -0.216007,-0.20464 -0.136426,-0.0758 -0.310748,-0.0758 -0.424435,0 -0.66697,0.3297 -0.242535,0.3259 -0.242535,0.90571 v 2.08807 h -1.356678 v -4.24435 h 1.356678 v 0.62149 q 0.306958,-0.37138 0.651812,-0.5457 0.344854,-0.17811 0.761711,-0.17811 0.735183,0 1.114144,0.45096 0.38275,0.45096 0.38275,1.3112 z" />
+ <path
+ id="path973"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -88.288071,191.29127 q -0.424435,0 -0.640443,0.14401 -0.212218,0.144 -0.212218,0.42443 0,0.2577 0.170532,0.40549 0.174322,0.14401 0.48128,0.14401 0.38275,0 0.644233,-0.27286 0.261483,-0.27664 0.261483,-0.6897 v -0.15538 z m 2.072914,-0.51159 v 2.42155 h -1.368047 v -0.62907 q -0.272852,0.38654 -0.613916,0.56465 -0.341065,0.17432 -0.829924,0.17432 -0.659391,0 -1.072458,-0.38275 -0.409277,-0.38654 -0.409277,-1.00045 0,-0.74656 0.511597,-1.0952 0.515386,-0.34864 1.614371,-0.34864 h 0.799607 v -0.10611 q 0,-0.32212 -0.253904,-0.46991 -0.253903,-0.15159 -0.792027,-0.15159 -0.435805,0 -0.810976,0.0872 -0.37517,0.0872 -0.697287,0.26149 v -1.03457 q 0.435805,-0.1061 0.875399,-0.15916 0.439594,-0.0568 0.879188,-0.0568 1.14825,0 1.656057,0.45475 0.511597,0.45096 0.511597,1.47037 z" />
+ <path
+ id="path975"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -83.471483,187.75178 v 1.2051 h 1.398364 v 0.97013 h -1.398364 v 1.80007 q 0,0.29559 0.117478,0.40169 0.117478,0.10232 0.466121,0.10232 h 0.697288 v 0.97014 h -1.163409 q -0.803396,0 -1.140671,-0.33348 -0.333485,-0.33728 -0.333485,-1.14067 v -1.80007 h -0.67455 v -0.97013 h 0.67455 v -1.2051 z" />
+ <path
+ id="path977"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -81.243196,188.95688 h 1.356678 v 4.24435 h -1.356678 z m 0,-1.65227 h 1.356678 v 1.10656 h -1.356678 z" />
+ <path
+ id="path979"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -79.117229,188.95688 h 1.356678 l 1.0573,2.93315 1.05351,-2.93315 h 1.360468 l -1.671216,4.24435 h -1.489314 z" />
+ <path
+ id="path981"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ d="m -69.286993,191.06769 v 0.38654 h -3.171899 q 0.04927,0.47749 0.344854,0.71623 0.295589,0.23875 0.826134,0.23875 0.428225,0 0.875398,-0.12506 0.450963,-0.12885 0.924664,-0.38654 v 1.04593 q -0.48128,0.1819 -0.96256,0.27285 -0.48128,0.0947 -0.962559,0.0947 -1.15204,0 -1.792483,-0.5836 -0.636654,-0.58739 -0.636654,-1.64469 0,-1.03835 0.625285,-1.63332 0.629074,-0.59496 1.72806,-0.59496 1.000455,0 1.599213,0.60254 0.602547,0.60255 0.602547,1.61059 z m -1.394575,-0.45097 q 0,-0.38654 -0.227376,-0.62149 -0.223587,-0.23875 -0.587389,-0.23875 -0.394118,0 -0.640443,0.22359 -0.246324,0.2198 -0.306958,0.63665 z" />
+ </g>
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path960"
+ d="M 244.3569,149.56007 H -141.19857"
+ style="fill:none;stroke:#808080;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/doc/neps/_static/nep-0041-type-sketch.svg b/doc/neps/_static/nep-0041-type-sketch.svg
new file mode 100644
index 000000000..9e597db9d
--- /dev/null
+++ b/doc/neps/_static/nep-0041-type-sketch.svg
@@ -0,0 +1,523 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ inkscape:version="1.0rc1 (09960d6f05, 2020-04-09)"
+ sodipodi:docname="nep-0041-type-sketch.svg"
+ id="svg8"
+ version="1.1"
+ viewBox="0 0 390.05549 139.7222"
+ height="139.7222mm"
+ width="390.05548mm">
+ <defs
+ id="defs2">
+ <rect
+ x="-108.43283"
+ y="116.0488"
+ width="38.824516"
+ height="5.9122801"
+ id="rect3054" />
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker7096"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Send">
+ <path
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
+ style="fill:#00b200;fill-opacity:1;fill-rule:evenodd;stroke:#00b200;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path7094"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker5628"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Send">
+ <path
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
+ style="fill:#000081;fill-opacity:1;fill-rule:evenodd;stroke:#000081;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path5626"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker5618"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Sstart">
+ <path
+ transform="matrix(0.2,0,0,0.2,1.2,0)"
+ style="fill:#000081;fill-opacity:1;fill-rule:evenodd;stroke:#000081;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path5616"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker4826"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Send">
+ <path
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
+ style="fill:#206120;fill-opacity:1;fill-rule:evenodd;stroke:#206120;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path4824"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Send"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker4400"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4398"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#00b200;fill-opacity:1;fill-rule:evenodd;stroke:#00b200;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker4390"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Send">
+ <path
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
+ style="fill:#b7943d;fill-opacity:1;fill-rule:evenodd;stroke:#b7943d;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path4388"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker2037"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Send">
+ <path
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
+ style="fill:#f4ae00;fill-opacity:1;fill-rule:evenodd;stroke:#ffc433;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path2035"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <rect
+ id="rect1296"
+ height="8.8755655"
+ width="16.467854"
+ y="100.87298"
+ x="-2.9674385" />
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="Arrow1Lend"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Lend">
+ <path
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path915"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="Arrow1Lstart"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Lstart">
+ <path
+ transform="matrix(0.8,0,0,0.8,10,0)"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path912"
+ inkscape:connector-curvature="0" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ inkscape:guide-bbox="true"
+ showguides="true"
+ inkscape:window-maximized="1"
+ inkscape:window-y="27"
+ inkscape:window-x="0"
+ inkscape:window-height="1376"
+ inkscape:window-width="2560"
+ showgrid="false"
+ inkscape:document-rotation="0"
+ inkscape:current-layer="layer1"
+ inkscape:document-units="mm"
+ inkscape:cy="290.82008"
+ inkscape:cx="134.87089"
+ inkscape:zoom="0.98994949"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ lock-margins="true"
+ fit-margin-top="2"
+ fit-margin-left="2"
+ fit-margin-right="2"
+ fit-margin-bottom="2"
+ objecttolerance="29.7"
+ gridtolerance="20.4"
+ guidetolerance="19.1"
+ inkscape:snap-perpendicular="true"
+ inkscape:snap-tangential="true" />
+ <metadata
+ id="metadata5">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1"
+ transform="translate(143.44857,-67.864137)">
+ <path
+ sodipodi:nodetypes="sssssssss"
+ inkscape:connector-curvature="0"
+ id="path1976"
+ style="opacity:1;fill:#ddb9b9;fill-opacity:0.796078;stroke:none;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.2, 2.4;stroke-dashoffset:0;stroke-opacity:0.497957"
+ d="m 175.57699,126.11316 h 65.38081 c 1.14406,0 2.06509,0.92103 2.06509,2.06509 v 15.54342 c 0,1.14406 -0.92103,2.06509 -2.06509,2.06509 h -65.38081 c -1.14406,0 -2.06509,-0.92103 -2.06509,-2.06509 v -15.54342 c 0,-1.14406 0.92103,-2.06509 2.06509,-2.06509 z" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3044"
+ d="M 172.89254,70.114137 V 205.33633"
+ style="fill:none;stroke:#808080;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ d="M 55.143494,98.892926 H 240.95778 c 1.14406,0 2.06509,0.921034 2.06509,2.065094 v 15.54342 c 0,1.14406 -0.92103,2.06509 -2.06509,2.06509 H 55.143494 c -1.14406,0 -2.06509,-0.92103 -2.06509,-2.06509 v -15.54342 c 0,-1.14406 0.92103,-2.065094 2.06509,-2.065094 z"
+ style="opacity:1;fill:#ddb9b9;fill-opacity:0.796609;stroke:none;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.2, 2.4;stroke-dashoffset:0;stroke-opacity:0.497957"
+ id="rect5208"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssssssss" />
+ <path
+ d="M -60.569299,98.727824 H 50.002364 c 1.14406,0 2.06509,0.92103 2.06509,2.065086 v 15.70853 c 0,1.14406 -0.92103,2.06509 -2.06509,2.06509 H -60.569299 c -1.14406,0 -2.06509,-0.92103 -2.06509,-2.06509 v -15.70853 c 0,-1.144056 0.92103,-2.065086 2.06509,-2.065086 z"
+ style="opacity:0.25;fill:#000080;fill-opacity:0.4;stroke:none;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.2, 2.4;stroke-dashoffset:0;stroke-opacity:0.497957"
+ id="rect4618"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssssssss" />
+ <g
+ style="font-size:6.7452px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;stroke-width:0.505891"
+ id="text4368" />
+ <g
+ style="font-size:3.52778px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect1296)"
+ id="text1294" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.76111px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke-width:0.105503"
+ x="177.69284"
+ y="88.415688"
+ id="text1931"><tspan
+ sodipodi:role="line"
+ id="tspan1929"
+ x="177.69284"
+ y="88.415688"
+ style="fill:#000000;stroke-width:0.105503">Value Storage</tspan></text>
+ <text
+ id="text1935"
+ y="78.750557"
+ x="77.626938"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.76111px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke-width:0.105503"
+ xml:space="preserve"><tspan
+ style="fill:#000000;stroke-width:0.105503"
+ y="78.750557"
+ x="77.626938"
+ id="tspan1933"
+ sodipodi:role="line">Parameters and</tspan><tspan
+ style="fill:#000000;stroke-width:0.105503"
+ y="88.451942"
+ x="77.626938"
+ sodipodi:role="line"
+ id="tspan3040">Storage options</tspan></text>
+ <text
+ id="text1939"
+ y="78.750557"
+ x="-41.095226"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.72103px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke-width:0.105503"
+ xml:space="preserve"><tspan
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ y="78.750557"
+ x="-41.095226"
+ sodipodi:role="line"
+ id="tspan3034">Value Space and</tspan><tspan
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ y="88.451942"
+ x="-41.095226"
+ sodipodi:role="line"
+ id="tspan3038">Behaviour</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:11.263px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ x="-19.191803"
+ y="111.20879"
+ id="text1968"><tspan
+ sodipodi:role="line"
+ id="tspan1965"
+ x="-19.191803"
+ y="111.20879"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000081;fill-opacity:1;stroke-width:0.264583">type</tspan></text>
+ <text
+ id="text1972"
+ y="113.24359"
+ x="120.08958"
+ style="font-size:11.263px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#800000;fill-opacity:0.976587;stroke-width:0.265;stroke-miterlimit:4;stroke-dasharray:none"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#800000;fill-opacity:0.976587;stroke-width:0.265;stroke-miterlimit:4;stroke-dasharray:none"
+ y="113.24359"
+ x="120.08958"
+ id="tspan1970"
+ sodipodi:role="line">instance</tspan></text>
+ <path
+ sodipodi:nodetypes="sssssssss"
+ inkscape:connector-curvature="0"
+ id="path1974"
+ style="opacity:0.25;fill:#000080;fill-opacity:0.4;stroke:none;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.2, 2.4;stroke-dashoffset:0;stroke-opacity:0.497957"
+ d="m -60.569299,125.94806 h 72.698771 c 1.14406,0 2.06509,0.92103 2.06509,2.06508 v 15.70853 c 0,1.14406 -0.92103,2.06509 -2.06509,2.06509 h -72.698771 c -1.14406,0 -2.06509,-0.92103 -2.06509,-2.06509 v -15.70853 c 0,-1.14405 0.92103,-2.06508 2.06509,-2.06508 z" />
+ <text
+ id="text1980"
+ y="139.86145"
+ x="-34.512547"
+ style="font-size:11.263px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ y="139.86145"
+ x="-34.512547"
+ id="tspan1978"
+ sodipodi:role="line">ABC</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:11.263px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#830000;fill-opacity:1;stroke-width:0.264583"
+ x="180.30632"
+ y="140.46382"
+ id="text1984"><tspan
+ sodipodi:role="line"
+ id="tspan1982"
+ x="180.30632"
+ y="140.46382"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#830000;fill-opacity:1;stroke-width:0.264583">instance</tspan></text>
+ <path
+ d="M 17.347598,126.00309 H 170.2081 c 1.14406,0 2.06509,0.92103 2.06509,2.06508 v 15.70853 c 0,1.14406 -0.92103,2.06509 -2.06509,2.06509 H 17.347598 c -1.14406,0 -2.06509,-0.92103 -2.06509,-2.06509 v -15.70853 c 0,-1.14405 0.92103,-2.06508 2.06509,-2.06508 z"
+ style="opacity:0.25;fill:#000080;fill-opacity:0.4;stroke:none;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.2, 2.4;stroke-dashoffset:0;stroke-opacity:0.497957"
+ id="path1986"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssssssss" />
+ <text
+ xml:space="preserve"
+ style="font-size:11.263px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ x="79.869514"
+ y="138.48405"
+ id="text1990"><tspan
+ sodipodi:role="line"
+ id="tspan1988"
+ x="79.869514"
+ y="138.48405"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000081;fill-opacity:1;stroke-width:0.264583">type</tspan></text>
+ <path
+ sodipodi:nodetypes="sssssssss"
+ inkscape:connector-curvature="0"
+ id="path1992"
+ style="opacity:0.25;fill:#000080;fill-opacity:0.4;stroke:none;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.2, 2.4;stroke-dashoffset:0;stroke-opacity:0.497957"
+ d="M -60.569299,153.16829 H 49.987465 c 1.14406,0 2.06509,0.92103 2.06509,2.06508 v 15.70853 c 0,1.14406 -0.92103,2.06509 -2.06509,2.06509 H -60.569299 c -1.14406,0 -2.06509,-0.92103 -2.06509,-2.06509 v -15.70853 c 0,-1.14405 0.92103,-2.06508 2.06509,-2.06508 z" />
+ <text
+ id="text1998"
+ y="165.81964"
+ x="-22.653231"
+ style="font-size:11.263px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ y="165.81964"
+ x="-22.653231"
+ id="tspan1996"
+ sodipodi:role="line">DType</tspan></text>
+ <path
+ d="m -60.569299,180.38852 h 72.698771 c 1.14406,0 2.06509,0.92103 2.06509,2.06508 v 15.70853 c 0,1.14406 -0.92103,2.06509 -2.06509,2.06509 h -72.698771 c -1.14406,0 -2.06509,-0.92103 -2.06509,-2.06509 V 182.4536 c 0,-1.14405 0.92103,-2.06508 2.06509,-2.06508 z"
+ style="opacity:0.25;fill:#000080;fill-opacity:0.4;stroke:none;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.2, 2.4;stroke-dashoffset:0;stroke-opacity:0.497957"
+ id="path2004"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssssssss" />
+ <path
+ d="m 175.57697,180.55362 h 65.38081 c 1.14406,0 2.06509,0.92103 2.06509,2.06509 v 15.54342 c 0,1.14406 -0.92103,2.06509 -2.06509,2.06509 h -65.38081 c -1.14406,0 -2.06509,-0.92103 -2.06509,-2.06509 v -15.54342 c 0,-1.14406 0.92103,-2.06509 2.06509,-2.06509 z"
+ style="opacity:1;fill:#ddb9b9;fill-opacity:0.796078;stroke:none;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.2, 2.4;stroke-dashoffset:0;stroke-opacity:0.497957"
+ id="path2006"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssssssss" />
+ <text
+ xml:space="preserve"
+ style="font-size:11.263px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ x="-59.010956"
+ y="193.40663"
+ id="text2010"><tspan
+ sodipodi:role="line"
+ id="tspan2008"
+ x="-59.010956"
+ y="193.40663"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000081;fill-opacity:1;stroke-width:0.264583">base dtype</tspan></text>
+ <text
+ id="text2014"
+ y="194.58372"
+ x="184.03754"
+ style="font-size:11.263px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#800000;fill-opacity:0.8;stroke-width:0.264583"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#800000;fill-opacity:0.8;stroke-width:0.264583"
+ y="194.58372"
+ x="184.03754"
+ id="tspan2012"
+ sodipodi:role="line">element</tspan></text>
+ <path
+ sodipodi:nodetypes="sssssssss"
+ inkscape:connector-curvature="0"
+ id="path2016"
+ style="opacity:0.25;fill:#000081;fill-opacity:0.4;stroke:none;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.2, 2.4;stroke-dashoffset:0;stroke-opacity:0.497957"
+ d="M 17.463123,180.38852 H 170.32495 c 1.14406,0 2.06509,0.92103 2.06509,2.06508 v 15.70853 c 0,1.14406 -0.92103,2.06509 -2.06509,2.06509 H 17.463123 c -1.14406,0 -2.06509,-0.92103 -2.06509,-2.06509 V 182.4536 c 0,-1.14405 0.92103,-2.06508 2.06509,-2.06508 z" />
+ <text
+ id="text2020"
+ y="193.40663"
+ x="76.606812"
+ style="font-size:11.263px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000081;fill-opacity:1;stroke-width:0.264583"
+ y="193.40663"
+ x="76.606812"
+ id="tspan2018"
+ sodipodi:role="line">dtype</tspan></text>
+ <path
+ sodipodi:nodetypes="sssssssss"
+ inkscape:connector-curvature="0"
+ id="path2022"
+ style="opacity:1;fill:#ddb9b9;fill-opacity:0.796078;stroke:none;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.2, 2.4;stroke-dashoffset:0;stroke-opacity:0.497957"
+ d="m 175.57697,153.33338 h 65.38081 c 1.14406,0 2.06509,0.92103 2.06509,2.06509 v 15.54342 c 0,1.14406 -0.92103,2.06509 -2.06509,2.06509 h -65.38081 c -1.14406,0 -2.06509,-0.92103 -2.06509,-2.06509 v -15.54342 c 0,-1.14406 0.92103,-2.06509 2.06509,-2.06509 z" />
+ <text
+ xml:space="preserve"
+ style="font-size:11.263px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#800000;fill-opacity:0.8;stroke-width:0.264583"
+ x="184.03754"
+ y="167.36348"
+ id="text2026"><tspan
+ sodipodi:role="line"
+ id="tspan2024"
+ x="184.03754"
+ y="167.36348"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#800000;fill-opacity:0.8;stroke-width:0.264583">element</tspan></text>
+ <path
+ d="M 55.175507,153.27835 H 170.22016 c 1.14406,0 2.06509,0.92103 2.06509,2.06509 v 15.54342 c 0,1.14406 -0.92103,2.06509 -2.06509,2.06509 H 55.175507 c -1.14406,0 -2.06509,-0.92103 -2.06509,-2.06509 v -15.54342 c 0,-1.14406 0.92103,-2.06509 2.06509,-2.06509 z"
+ style="opacity:0.25;fill:#d99b00;fill-opacity:1;stroke:none;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.2, 2.4;stroke-dashoffset:0;stroke-opacity:0.497957"
+ id="path2031"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssssssss" />
+ <text
+ id="text2035"
+ y="166.21391"
+ x="95.410606"
+ style="font-size:11.263px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#b27d00;fill-opacity:1;stroke-width:0.264583"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#b27d00;fill-opacity:1;stroke-width:0.264583"
+ y="166.21391"
+ x="95.410606"
+ id="tspan2033"
+ sodipodi:role="line">dtype</tspan></text>
+ <path
+ style="fill:none;stroke:#808080;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 52.572927,70.114137 V 205.33633"
+ id="path3042"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.72103px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke-width:0.105503"
+ x="-122.18608"
+ y="110.75799"
+ id="text3050"><tspan
+ id="tspan3048"
+ sodipodi:role="line"
+ x="-122.18608"
+ y="110.75799"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503">Python type</tspan></text>
+ <text
+ xml:space="preserve"
+ id="text3052"
+ style="font-size:3.52778px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect3054);" />
+ <text
+ id="text3062"
+ y="133.91008"
+ x="-122.18608"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.72103px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke-width:0.105503"
+ xml:space="preserve"><tspan
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ y="133.91008"
+ x="-122.18608"
+ sodipodi:role="line"
+ id="tspan3060">Python type</tspan><tspan
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ y="143.61147"
+ x="-122.18608"
+ sodipodi:role="line"
+ id="tspan3064">with ABC</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.72103px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke-width:0.105503"
+ x="-140.57703"
+ y="165.22876"
+ id="text3070"><tspan
+ id="tspan3068"
+ sodipodi:role="line"
+ x="-140.57703"
+ y="165.22876"
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503">NEP 41 Proposal</tspan></text>
+ <text
+ id="text3076"
+ y="193.20123"
+ x="-117.83562"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.72103px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke-width:0.105503"
+ xml:space="preserve"><tspan
+ style="font-size:7.76111px;fill:#000000;stroke-width:0.105503"
+ y="193.20123"
+ x="-117.83562"
+ sodipodi:role="line"
+ id="tspan3074">Alternative</tspan></text>
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path960"
+ d="M 244.3569,149.56007 H -141.19857"
+ style="fill:none;stroke:#808080;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/doc/neps/_static/nep43-sketch-with-text.svg b/doc/neps/_static/nep43-sketch-with-text.svg
new file mode 100644
index 000000000..212cfe89c
--- /dev/null
+++ b/doc/neps/_static/nep43-sketch-with-text.svg
@@ -0,0 +1,1304 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
+ sodipodi:docname="nep43-sketch-with-text.svg"
+ id="svg8"
+ version="1.1"
+ viewBox="0 0 289.35355 238.13675"
+ height="238.13675mm"
+ width="289.35355mm">
+ <defs
+ id="defs2">
+ <linearGradient
+ id="linearGradient5092"
+ inkscape:collect="always">
+ <stop
+ id="stop5088"
+ offset="0"
+ style="stop-color:#800000;stop-opacity:1;" />
+ <stop
+ id="stop5090"
+ offset="1"
+ style="stop-color:#800000;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5078"
+ inkscape:collect="always">
+ <stop
+ id="stop5074"
+ offset="0"
+ style="stop-color:#000080;stop-opacity:1;" />
+ <stop
+ id="stop5076"
+ offset="1"
+ style="stop-color:#000080;stop-opacity:0;" />
+ </linearGradient>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker7096"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Send">
+ <path
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
+ style="fill:#00b200;fill-opacity:1;fill-rule:evenodd;stroke:#00b200;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path7094"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:collect="always"
+ inkscape:stockid="Arrow1Send"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker6260"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path6258"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#000081;fill-opacity:1;fill-rule:evenodd;stroke:#000081;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker5628"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Send">
+ <path
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
+ style="fill:#000081;fill-opacity:1;fill-rule:evenodd;stroke:#000081;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path5626"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker5618"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Sstart">
+ <path
+ transform="matrix(0.2,0,0,0.2,1.2,0)"
+ style="fill:#000081;fill-opacity:1;fill-rule:evenodd;stroke:#000081;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path5616"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:collect="always"
+ inkscape:stockid="Arrow1Send"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker5002"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5000"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#000081;fill-opacity:1;fill-rule:evenodd;stroke:#000081;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker4826"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Send">
+ <path
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
+ style="fill:#206120;fill-opacity:1;fill-rule:evenodd;stroke:#206120;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path4824"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:collect="always"
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="Arrow1Sstart"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Sstart">
+ <path
+ transform="matrix(0.2,0,0,0.2,1.2,0)"
+ style="fill:#800000;fill-opacity:1;fill-rule:evenodd;stroke:#800000;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path924"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Send"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker4400"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4398"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#00b200;fill-opacity:1;fill-rule:evenodd;stroke:#00b200;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker4390"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Send">
+ <path
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
+ style="fill:#b7943d;fill-opacity:1;fill-rule:evenodd;stroke:#b7943d;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path4388"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:collect="always"
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker3453"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Send">
+ <path
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
+ style="fill:#800000;fill-opacity:1;fill-rule:evenodd;stroke:#800000;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path3451"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:collect="always"
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker2179"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Send">
+ <path
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
+ style="fill:#206120;fill-opacity:1;fill-rule:evenodd;stroke:#206120;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path2177"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker2037"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Send">
+ <path
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
+ style="fill:#f4ae00;fill-opacity:1;fill-rule:evenodd;stroke:#ffc433;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path2035"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:collect="always"
+ inkscape:stockid="Arrow1Send"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker1480"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path1478"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#ffc433;fill-opacity:1;fill-rule:evenodd;stroke:#ffc433;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <rect
+ id="rect1296"
+ height="8.8755655"
+ width="16.467854"
+ y="100.87298"
+ x="-2.9674385" />
+ <marker
+ inkscape:collect="always"
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="Arrow1Send"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Send">
+ <path
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
+ style="fill:#00b200;fill-opacity:1;fill-rule:evenodd;stroke:#00b200;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path927"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="Arrow1Lend"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Lend">
+ <path
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path915"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="Arrow1Lstart"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Lstart">
+ <path
+ transform="matrix(0.8,0,0,0.8,10,0)"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path912"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:collect="always"
+ inkscape:stockid="Arrow1Send"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Send-5"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path927-6"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#00b200;fill-opacity:1;fill-rule:evenodd;stroke:#00b200;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
+ </marker>
+ <linearGradient
+ gradientTransform="translate(0.29900013,18.755984)"
+ gradientUnits="userSpaceOnUse"
+ y2="220.58623"
+ x2="-9.5455313"
+ y1="221.22202"
+ x1="-44.254147"
+ id="linearGradient5080"
+ xlink:href="#linearGradient5078"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientTransform="translate(0.29900013,18.755984)"
+ gradientUnits="userSpaceOnUse"
+ y2="161.24438"
+ x2="216.83401"
+ y1="161.02299"
+ x1="248.04567"
+ id="linearGradient5094"
+ xlink:href="#linearGradient5092"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientTransform="translate(0.29900013,18.755984)"
+ y2="221.80334"
+ x2="4.2398605"
+ y1="221.22202"
+ x1="-44.254147"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5200"
+ xlink:href="#linearGradient5078"
+ inkscape:collect="always" />
+ </defs>
+ <sodipodi:namedview
+ inkscape:guide-bbox="true"
+ showguides="true"
+ inkscape:window-maximized="1"
+ inkscape:window-y="27"
+ inkscape:window-x="0"
+ inkscape:window-height="1376"
+ inkscape:window-width="2560"
+ showgrid="false"
+ inkscape:document-rotation="0"
+ inkscape:current-layer="g4988"
+ inkscape:document-units="mm"
+ inkscape:cy="408.92855"
+ inkscape:cx="490.09169"
+ inkscape:zoom="0.7"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ lock-margins="true"
+ fit-margin-top="2"
+ fit-margin-left="2"
+ fit-margin-right="2"
+ fit-margin-bottom="2" />
+ <metadata
+ id="metadata5">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1"
+ transform="translate(46.254147,-52.135225)">
+ <rect
+ style="opacity:0.25;fill:url(#linearGradient5094);fill-opacity:1;stroke:none;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.2, 2.4;stroke-dashoffset:0;stroke-opacity:0.497957"
+ id="rect5086"
+ width="53.12854"
+ height="221.86719"
+ x="187.97086"
+ y="66.404785"
+ ry="2.065089"
+ rx="2.065089" />
+ <rect
+ style="opacity:0.25;fill:url(#linearGradient5200);fill-opacity:1;stroke:none;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.2, 2.4;stroke-dashoffset:0;stroke-opacity:0.497957"
+ id="rect5198"
+ width="71.246887"
+ height="16.547533"
+ x="-44.254147"
+ y="133.66225"
+ ry="2.065089"
+ rx="2.065089" />
+ <rect
+ rx="2.065089"
+ ry="2.065089"
+ y="157.51857"
+ x="-44.254147"
+ height="130.7534"
+ width="65.95256"
+ id="rect5064"
+ style="opacity:0.25;fill:url(#linearGradient5080);fill-opacity:1;stroke:none;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.2, 2.4;stroke-dashoffset:0;stroke-opacity:0.497957" />
+ <rect
+ rx="2.065089"
+ ry="2.065089"
+ y="181.42923"
+ x="28.783215"
+ height="16.350454"
+ width="55.675358"
+ id="rect4614"
+ style="opacity:0.25;fill:#800000;fill-opacity:0.639216;stroke:none;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.2, 2.4;stroke-dashoffset:0;stroke-opacity:0.497957" />
+ <rect
+ style="opacity:0.25;fill:#000080;fill-opacity:0.4;stroke:none;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.2, 2.4;stroke-dashoffset:0;stroke-opacity:0.497957"
+ id="rect4618"
+ width="72.423012"
+ height="19.838709"
+ x="28.783215"
+ y="134.54594"
+ ry="2.065089"
+ rx="2.065089" />
+ <rect
+ rx="2.065089"
+ ry="2.065089"
+ y="224.65892"
+ x="36.191555"
+ height="16.652536"
+ width="116.8335"
+ id="rect4620"
+ style="opacity:0.25;fill:#000080;fill-opacity:0.4;stroke:none;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.2, 2.4;stroke-dashoffset:0;stroke-opacity:0.497957" />
+ <path
+ style="fill:none;stroke:#ffc433;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.2, 2.4;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker1480)"
+ d="M 162.39696,87.706466 V 102.33478"
+ id="path1476"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path4822"
+ d="m 87.064551,181.16793 v 56.58639"
+ style="fill:none;stroke:#206120;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker4826)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path2033"
+ d="M 162.39696,243.19694 V 134.06539"
+ style="fill:#f4ae00;fill-opacity:1;stroke:#ffc433;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.2, 2.4;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker2037)" />
+ <path
+ style="fill:none;stroke:#00b200;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker4400)"
+ d="m 82.917295,224.24439 v 13.50993"
+ id="path4310"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path4312"
+ d="m 149.89381,181.16793 v 56.58639"
+ style="opacity:0.5;fill:none;fill-opacity:0.501961;stroke:#b7943d;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker4390)" />
+ <rect
+ style="fill:none;stroke:#000080;stroke-width:1.412;stroke-linecap:round;stroke-miterlimit:10;stroke-opacity:1"
+ id="rect4314"
+ width="158.89915"
+ height="24.343685"
+ x="28.543333"
+ y="241.1985" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000080;fill-opacity:1;stroke:#000000;stroke-width:0.398751;stroke-opacity:0"
+ x="22.815491"
+ y="252.4229"
+ id="text4320"><tspan
+ sodipodi:role="line"
+ id="tspan4316"
+ x="22.815491"
+ y="252.4229"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#000080;fill-opacity:1;stroke:#000000;stroke-width:0.398751;stroke-opacity:0">Loop</tspan><tspan
+ sodipodi:role="line"
+ x="22.815493"
+ y="260.36038"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#000080;fill-opacity:1;stroke:#000000;stroke-width:0.398751;stroke-opacity:0"
+ id="tspan4318">descriptors</tspan></text>
+ <rect
+ y="197.56255"
+ x="28.168863"
+ height="24.343685"
+ width="158.89915"
+ id="rect4322"
+ style="opacity:0.6;fill:#ffffff;stroke:#800000;stroke-width:1.412;stroke-linecap:round;stroke-miterlimit:10;stroke-opacity:0.8" />
+ <text
+ id="text4328"
+ y="208.32829"
+ x="22.815491"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#800000;fill-opacity:0.8;stroke-width:0.398751"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#800000;fill-opacity:0.8;stroke-width:0.398751"
+ y="208.32829"
+ x="22.815489"
+ sodipodi:role="line"
+ id="tspan4326">Resolver</tspan><tspan
+ id="tspan4554"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#800000;fill-opacity:0.8;stroke-width:0.398751"
+ y="216.26579"
+ x="22.815489"
+ sodipodi:role="line">Input</tspan></text>
+ <rect
+ y="200.65752"
+ x="142.70969"
+ height="17.717829"
+ width="39.227802"
+ id="rect4330"
+ style="opacity:0.5;fill:#ffc333;fill-opacity:0.46663;stroke:none;stroke-width:1.10816;stroke-linecap:round;stroke-miterlimit:10" />
+ <rect
+ y="201.09155"
+ x="89.303658"
+ height="17.131346"
+ width="39.31385"
+ id="rect4332"
+ style="fill:#00b200;fill-opacity:0.483526;stroke:none;stroke-width:1.09086;stroke-linecap:round;stroke-miterlimit:10" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.4527px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;stroke-width:0.933951"
+ x="77.700294"
+ y="213.4348"
+ id="text4336"><tspan
+ sodipodi:role="line"
+ id="tspan4334"
+ x="77.700294"
+ y="213.4348"
+ style="stroke-width:0.933951">+</tspan></text>
+ <text
+ id="text4340"
+ y="214.15385"
+ x="130.39491"
+ style="font-size:12.4527px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke-width:0.933951"
+ xml:space="preserve"><tspan
+ style="fill:#000000;fill-opacity:1;stroke-width:0.933951"
+ y="214.15385"
+ x="130.39491"
+ id="tspan4338"
+ sodipodi:role="line">→</tspan></text>
+ <rect
+ style="fill:#00b200;fill-opacity:0.483526;stroke:none;stroke-width:1.09086;stroke-linecap:round;stroke-miterlimit:10"
+ id="rect4342"
+ width="39.31385"
+ height="17.131346"
+ x="37.217079"
+ y="200.69289" />
+ <rect
+ style="fill:#ffc333;fill-opacity:0.46663;stroke:none;stroke-width:1.10816;stroke-linecap:round;stroke-miterlimit:10"
+ id="rect4344"
+ width="39.227802"
+ height="17.717829"
+ x="142.70969"
+ y="244.04799" />
+ <rect
+ style="fill:#00b200;fill-opacity:0.483526;stroke:none;stroke-width:1.09086;stroke-linecap:round;stroke-miterlimit:10"
+ id="rect4346"
+ width="39.31385"
+ height="17.131346"
+ x="89.303658"
+ y="244.48203" />
+ <text
+ id="text4350"
+ y="256.82526"
+ x="77.700294"
+ style="font-size:12.4527px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;stroke-width:0.933951"
+ xml:space="preserve"><tspan
+ style="stroke-width:0.933951"
+ y="256.82526"
+ x="77.700294"
+ id="tspan4348"
+ sodipodi:role="line">+</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.4527px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;stroke-width:0.933951"
+ x="130.39491"
+ y="257.54431"
+ id="text4354"><tspan
+ sodipodi:role="line"
+ id="tspan4352"
+ x="130.39491"
+ y="257.54431"
+ style="stroke-width:0.933951">→</tspan></text>
+ <rect
+ y="244.08336"
+ x="37.217079"
+ height="17.131346"
+ width="39.31385"
+ id="rect4356"
+ style="fill:#00b200;fill-opacity:0.483526;stroke:none;stroke-width:1.09086;stroke-linecap:round;stroke-miterlimit:10" />
+ <text
+ id="text4360"
+ y="211.66945"
+ x="49.371288"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:6.7452px;line-height:1.25;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';letter-spacing:0px;word-spacing:0px;stroke-width:0.505891"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ y="211.66945"
+ x="49.371288"
+ id="tspan4358"
+ sodipodi:role="line">&gt;U5</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:6.7452px;line-height:1.25;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';letter-spacing:0px;word-spacing:0px;stroke-width:0.505891"
+ x="100.25864"
+ y="212.11256"
+ id="text4364"><tspan
+ sodipodi:role="line"
+ id="tspan4362"
+ x="100.25864"
+ y="212.11256"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891">&lt;U8</tspan></text>
+ <text
+ id="text4368"
+ y="212.01785"
+ x="150.35503"
+ style="font-size:6.7452px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;stroke-width:0.505891"
+ xml:space="preserve"><tspan
+ style="stroke-width:0.505891"
+ y="212.01785"
+ x="150.35503"
+ id="tspan4366"
+ sodipodi:role="line" /></text>
+ <text
+ id="text4374"
+ y="230.71275"
+ x="38.610909"
+ style="font-size:5.3167px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000080;stroke-width:0.398751"
+ xml:space="preserve"><tspan
+ style="fill:#000080;stroke-width:0.398751"
+ y="230.71275"
+ x="38.610909"
+ sodipodi:role="line"
+ id="tspan4372">set descriptors</tspan><tspan
+ id="tspan1803"
+ style="fill:#000080;stroke-width:0.398751"
+ y="237.35863"
+ x="38.610909"
+ sodipodi:role="line">for inner-loop…</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:6.7452px;line-height:1.25;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';letter-spacing:0px;word-spacing:0px;stroke-width:0.505891"
+ x="49.371288"
+ y="255.05992"
+ id="text4378"><tspan
+ sodipodi:role="line"
+ id="tspan4376"
+ x="49.371288"
+ y="255.05992"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891">&lt;U5</tspan></text>
+ <text
+ id="text4382"
+ y="255.50304"
+ x="100.25864"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:6.7452px;line-height:1.25;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';letter-spacing:0px;word-spacing:0px;stroke-width:0.505891"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ y="255.50304"
+ x="100.25864"
+ id="tspan4380"
+ sodipodi:role="line">&lt;U8</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:6.7452px;line-height:1.25;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';letter-spacing:0px;word-spacing:0px;stroke-width:0.505891"
+ x="152.65042"
+ y="255.36224"
+ id="text4386"><tspan
+ sodipodi:role="line"
+ id="tspan4384"
+ x="152.65042"
+ y="255.36224"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891">&lt;U13</tspan></text>
+ <rect
+ y="65.16613"
+ x="29.071695"
+ height="24.343685"
+ width="158.89915"
+ id="rect833"
+ style="fill:none;stroke:#cccccc;stroke-width:1.412;stroke-linecap:round;stroke-miterlimit:10" />
+ <text
+ id="text841"
+ y="79.000191"
+ x="22.683092"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#8f8f8f;fill-opacity:1;stroke-width:0.398752"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#8f8f8f;fill-opacity:1;stroke-width:0.398752"
+ y="79.000191"
+ x="22.68309"
+ id="tspan839"
+ sodipodi:role="line">User Input</tspan></text>
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path910"
+ d="M 31.352669,92.208912 V 194.08332"
+ style="fill:none;stroke:#00b200;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Send)" />
+ <path
+ id="path1730"
+ style="fill:none;fill-opacity:0.483526;stroke:#00b200;stroke-width:1.2;stroke-linecap:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker7096)"
+ d="m 31.352669,146.65942 h 51.793437 v 4.50227"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="fill:none;stroke:#00b200;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Send-5)"
+ d="M 83.488644,92.208912 V 102.42617"
+ id="path910-2"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path2175"
+ d="m 35.539436,181.16793 v 12.91539"
+ style="fill:none;stroke:#206120;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker2179)" />
+ <rect
+ style="opacity:0.8;fill:#ffffff;stroke:#800000;stroke-width:1.412;stroke-linecap:round;stroke-miterlimit:10;stroke-opacity:1"
+ id="rect833-3"
+ width="158.89915"
+ height="24.343685"
+ x="28.977177"
+ y="106.27831" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#800000;fill-opacity:0.8;stroke-width:0.398751"
+ x="22.815489"
+ y="117.5332"
+ id="text841-6"><tspan
+ sodipodi:role="line"
+ id="tspan839-7"
+ x="22.815487"
+ y="117.5332"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#800000;fill-opacity:0.8;stroke-width:0.398751">Input/Output</tspan><tspan
+ id="tspan3693"
+ sodipodi:role="line"
+ x="22.815491"
+ y="125.4707"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#800000;fill-opacity:0.8;stroke-width:0.398751">Operands</tspan></text>
+ <rect
+ y="68.992058"
+ x="37.217079"
+ height="17.131346"
+ width="39.31385"
+ id="rect874"
+ style="fill:#00b200;fill-opacity:0.483526;stroke:none;stroke-width:1.09086;stroke-linecap:round;stroke-miterlimit:10" />
+ <rect
+ style="opacity:0.5;fill:#ffc333;fill-opacity:0.46663;stroke:none;stroke-width:1.10816;stroke-linecap:round;stroke-miterlimit:10"
+ id="rect876"
+ width="39.227802"
+ height="17.717829"
+ x="142.70969"
+ y="68.95668" />
+ <rect
+ style="fill:#00b200;fill-opacity:0.483526;stroke:none;stroke-width:1.09086;stroke-linecap:round;stroke-miterlimit:10"
+ id="rect878"
+ width="39.31385"
+ height="17.131346"
+ x="89.303658"
+ y="69.390724" />
+ <text
+ id="text882"
+ y="81.733971"
+ x="77.700294"
+ style="font-size:12.4527px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;stroke-width:0.933951"
+ xml:space="preserve"><tspan
+ style="stroke-width:0.933951"
+ y="81.733971"
+ x="77.700294"
+ id="tspan880"
+ sodipodi:role="line">+</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.4527px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;stroke-width:0.933951"
+ x="130.39491"
+ y="82.453018"
+ id="text886"><tspan
+ sodipodi:role="line"
+ id="tspan884"
+ x="130.39491"
+ y="82.453018"
+ style="stroke-width:0.933951">→</tspan></text>
+ <rect
+ style="opacity:0.6;fill:#ffffff;stroke:#000080;stroke-width:1.412;stroke-linecap:round;stroke-miterlimit:10;stroke-opacity:0.5"
+ id="rect888"
+ width="158.89915"
+ height="24.343685"
+ x="28.168863"
+ y="154.17207" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000081;fill-opacity:1;stroke-width:0.398751"
+ x="22.815491"
+ y="156.80496"
+ id="text892"><tspan
+ sodipodi:role="line"
+ id="tspan890"
+ x="22.815491"
+ y="156.80496"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#000081;fill-opacity:1;stroke-width:0.398751" /><tspan
+ id="tspan894"
+ sodipodi:role="line"
+ x="22.815489"
+ y="164.74246"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#000081;fill-opacity:1;stroke-width:0.398751">DType classes</tspan><tspan
+ id="tspan5908"
+ sodipodi:role="line"
+ x="22.815491"
+ y="172.67996"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#000081;fill-opacity:1;stroke-width:0.398751">of the <tspan
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Bold'"
+ id="tspan1154">ArrayMethod</tspan></tspan><tspan
+ id="tspan5906"
+ sodipodi:role="line"
+ x="22.815491"
+ y="180.67947"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#000081;fill-opacity:1;stroke-width:0.398751" /></text>
+ <rect
+ y="109.79432"
+ x="142.70969"
+ height="17.717829"
+ width="39.227802"
+ id="rect1272"
+ style="opacity:0.5;fill:#ffc333;fill-opacity:0.46663;stroke:none;stroke-width:1.10816;stroke-linecap:round;stroke-miterlimit:10" />
+ <rect
+ y="110.22836"
+ x="89.303658"
+ height="17.131346"
+ width="39.31385"
+ id="rect1274"
+ style="fill:#00b200;fill-opacity:0.483526;stroke:none;stroke-width:1.09086;stroke-linecap:round;stroke-miterlimit:10" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.4527px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;stroke-width:0.933951"
+ x="77.700294"
+ y="122.57161"
+ id="text1278"><tspan
+ sodipodi:role="line"
+ id="tspan1276"
+ x="77.700294"
+ y="122.57161"
+ style="stroke-width:0.933951">+</tspan></text>
+ <text
+ id="text1282"
+ y="123.29066"
+ x="130.39491"
+ style="font-size:12.4527px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;stroke-width:0.933951"
+ xml:space="preserve"><tspan
+ style="stroke-width:0.933951"
+ y="123.29066"
+ x="130.39491"
+ id="tspan1280"
+ sodipodi:role="line">→</tspan></text>
+ <text
+ id="text1292"
+ y="142.74757"
+ x="35.332455"
+ style="font-size:5.3167px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000080;stroke-width:0.398751"
+ xml:space="preserve"><tspan
+ id="tspan1300"
+ style="fill:#000080;stroke-width:0.398751"
+ y="142.74757"
+ x="35.332455"
+ sodipodi:role="line">Promotion (if necessary)</tspan></text>
+ <text
+ style="font-size:3.52778px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect1296);"
+ id="text1294"
+ xml:space="preserve" />
+ <text
+ xml:space="preserve"
+ style="font-size:5.3167px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ x="164.28925"
+ y="99.407722"
+ id="text1292-5"><tspan
+ sodipodi:role="line"
+ x="164.28925"
+ y="99.407722"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="tspan1300-3">If provided</tspan></text>
+ <rect
+ style="fill:#00b200;fill-opacity:0.483526;stroke:none;stroke-width:1.09086;stroke-linecap:round;stroke-miterlimit:10"
+ id="rect1270"
+ width="39.31385"
+ height="17.131346"
+ x="37.217079"
+ y="109.8297" />
+ <rect
+ style="fill:#9f8a56;fill-opacity:0.46663;stroke:none;stroke-width:1.10816;stroke-linecap:round;stroke-miterlimit:10"
+ id="rect1907"
+ width="39.227802"
+ height="17.717829"
+ x="142.70969"
+ y="157.26704" />
+ <rect
+ style="fill:#206020;fill-opacity:0.483526;stroke:none;stroke-width:1.09086;stroke-linecap:round;stroke-miterlimit:10"
+ id="rect1909"
+ width="39.31385"
+ height="17.131346"
+ x="89.303658"
+ y="157.70108" />
+ <text
+ id="text1913"
+ y="170.04433"
+ x="77.700294"
+ style="font-size:12.4527px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;stroke-width:0.933951"
+ xml:space="preserve"><tspan
+ style="stroke-width:0.933951"
+ y="170.04433"
+ x="77.700294"
+ id="tspan1911"
+ sodipodi:role="line">+</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.4527px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke-width:0.933951"
+ x="130.39491"
+ y="170.76338"
+ id="text1917"><tspan
+ sodipodi:role="line"
+ id="tspan1915"
+ x="130.39491"
+ y="170.76338"
+ style="fill:#000000;fill-opacity:1;stroke-width:0.933951">→</tspan></text>
+ <rect
+ y="157.30241"
+ x="37.217079"
+ height="17.131346"
+ width="39.31385"
+ id="rect1919"
+ style="fill:#206020;fill-opacity:0.483526;stroke:none;stroke-width:1.09086;stroke-linecap:round;stroke-miterlimit:10" />
+ <text
+ id="text1937"
+ y="79.968613"
+ x="49.371288"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:6.7452px;line-height:1.25;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';letter-spacing:0px;word-spacing:0px;stroke-width:0.505891"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ y="79.968613"
+ x="49.371288"
+ id="tspan1935"
+ sodipodi:role="line">&gt;U5</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:6.7452px;line-height:1.25;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';letter-spacing:0px;word-spacing:0px;stroke-width:0.505891"
+ x="103.54726"
+ y="80.411743"
+ id="text1941"><tspan
+ sodipodi:role="line"
+ id="tspan1939"
+ x="103.54726"
+ y="80.411743"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891">S8</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:6.7452px;line-height:1.25;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';letter-spacing:0px;word-spacing:0px;stroke-width:0.505891"
+ x="49.371288"
+ y="120.80625"
+ id="text1949"><tspan
+ sodipodi:role="line"
+ id="tspan1947"
+ x="49.371288"
+ y="120.80625"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891">&gt;U5</tspan></text>
+ <text
+ id="text1953"
+ y="121.24938"
+ x="100.58635"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:6.7452px;line-height:1.25;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';letter-spacing:0px;word-spacing:0px;stroke-width:0.505891"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ y="121.24938"
+ x="100.58635"
+ id="tspan1951"
+ sodipodi:role="line">&lt;S8</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:6.7452px;line-height:1.25;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';letter-spacing:0px;word-spacing:0px;stroke-width:0.505891"
+ x="43.083893"
+ y="168.38272"
+ id="text1967"><tspan
+ sodipodi:role="line"
+ id="tspan1965"
+ x="43.083893"
+ y="168.38272"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891">Unicode</tspan></text>
+ <text
+ id="text1971"
+ y="168.78139"
+ x="94.035469"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:6.7452px;line-height:1.25;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';letter-spacing:0px;word-spacing:0px;stroke-width:0.505891"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ y="168.78139"
+ x="94.035469"
+ id="tspan1969"
+ sodipodi:role="line">Unicode</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:6.7452px;line-height:1.25;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';letter-spacing:0px;word-spacing:0px;stroke-width:0.505891"
+ x="148.53348"
+ y="168.64059"
+ id="text1989"><tspan
+ sodipodi:role="line"
+ id="tspan1987"
+ x="148.53348"
+ y="168.64059"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891">Unicode</tspan></text>
+ <text
+ id="text2113"
+ y="144.74529"
+ x="164.28925"
+ style="font-size:5.3167px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ xml:space="preserve"><tspan
+ id="tspan2111"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ y="144.74529"
+ x="164.28925"
+ sodipodi:role="line">If not provided</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:5.3167px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ x="39.131157"
+ y="187.32767"
+ id="text2441"><tspan
+ id="tspan2767"
+ sodipodi:role="line"
+ x="39.131157"
+ y="187.32767"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751">Cast descriptors</tspan><tspan
+ id="tspan4558"
+ sodipodi:role="line"
+ x="39.131157"
+ y="193.97354"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751">to Loop DTypes</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:6.7452px;line-height:1.25;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';letter-spacing:0px;word-spacing:0px;opacity:0.5;stroke-width:0.505891"
+ x="152.65042"
+ y="121.10858"
+ id="text3113"><tspan
+ sodipodi:role="line"
+ id="tspan3111"
+ x="152.65042"
+ y="121.10858"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891">&lt;U13</tspan></text>
+ <g
+ transform="translate(232.48255,-0.55871913)"
+ id="g4067">
+ <g
+ transform="translate(-7.4083337)"
+ id="g4102">
+ <path
+ id="path3217"
+ style="fill:none;fill-opacity:0.483526;stroke:#800000;stroke-width:1.2;stroke-linecap:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow1Sstart);marker-end:url(#marker3453)"
+ d="m -33.43701,119.33194 h 18.789774 v 41.58775 93.14908 H -33.43701"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ </g>
+ </g>
+ <g
+ id="g4988"
+ transform="rotate(180,-31.440594,176.71768)">
+ <path
+ id="path4980"
+ style="fill:none;fill-opacity:0.483526;stroke:#000081;stroke-width:1.2;stroke-linecap:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5002)"
+ d="M -21.573873,211.51421 H -87.252914"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-size:10.5833px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ x="21.68927"
+ y="-291.25931"
+ id="text4984"
+ transform="scale(-1)"><tspan
+ sodipodi:role="line"
+ x="21.68927"
+ y="-291.25931"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="tspan4982">Registered</tspan></text>
+ <path
+ sodipodi:nodetypes="ccc"
+ inkscape:connector-curvature="0"
+ d="m -94.24417,121.2914 64.203629,-0.52916 V 83.191271"
+ style="fill:none;fill-opacity:0.483526;stroke:#000081;stroke-width:1.2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker5618)"
+ id="path6082" />
+ <text
+ transform="scale(-1)"
+ id="text6086"
+ y="-123.67085"
+ x="28.974308"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.3167px;line-height:1.25;font-family:fira;-inkscape-font-specification:fira;letter-spacing:0px;word-spacing:0px;fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ xml:space="preserve"><tspan
+ id="tspan6084"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ y="-123.67085"
+ x="28.974308"
+ sodipodi:role="line">resolve_descriptors</tspan></text>
+ <path
+ id="path6252"
+ style="fill:none;fill-opacity:0.483526;stroke:#000081;stroke-width:1.2;stroke-linecap:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker6260)"
+ d="M -30.040541,83.191271 H -85.328359"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-size:5.3167px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ x="91.053413"
+ y="-80.689705"
+ id="text6256"
+ transform="scale(-1)"><tspan
+ sodipodi:role="line"
+ x="91.053413"
+ y="-80.689705"
+ style="fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="tspan6254" /><tspan
+ sodipodi:role="line"
+ x="91.053413"
+ y="-74.043831"
+ style="fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="tspan7420" /></text>
+ <text
+ xml:space="preserve"
+ style="font-size:5.3167px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ x="89.791664"
+ y="-80.862366"
+ id="text7434"
+ transform="scale(-1)"><tspan
+ sodipodi:role="line"
+ x="89.791664"
+ y="-80.862366"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="tspan4836">Perform operation with these descriptors</tspan><tspan
+ sodipodi:role="line"
+ x="89.791664"
+ y="-74.216492"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="tspan5896">(setup, inner-loop function, teardown)</tspan><tspan
+ sodipodi:role="line"
+ x="89.791664"
+ y="-67.570618"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="tspan4840" /></text>
+ <text
+ transform="scale(-1)"
+ id="text7580"
+ y="-291.25931"
+ x="255.89056"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ y="-291.25931"
+ x="255.89056"
+ sodipodi:role="line"
+ id="tspan7582">NumPy</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:5.3167px;line-height:1.65;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ x="20.452068"
+ y="-214.1572"
+ id="text1141"
+ transform="scale(-1)"><tspan
+ sodipodi:role="line"
+ x="20.452068"
+ y="-214.1572"
+ style="fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="tspan1143">Registered or default</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.45542px;line-height:1.25;font-family:fira;-inkscape-font-specification:fira;letter-spacing:0px;word-spacing:0px;fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ x="113.16111"
+ y="25.668264"
+ id="text4678"
+ transform="rotate(90)"><tspan
+ sodipodi:role="line"
+ x="113.16111"
+ y="25.668264"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="tspan4676">ArrayMethod</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:3.52777px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
+ x="92.373795"
+ y="-75.619186"
+ id="text4844"
+ transform="scale(-1)"><tspan
+ sodipodi:role="line"
+ id="tspan4842"
+ x="92.373795"
+ y="-75.619186"
+ style="stroke-width:0.264583" /></text>
+ <text
+ transform="rotate(-90)"
+ id="text4856"
+ y="-282.71359"
+ x="-235.48586"
+ style="font-size:5.3167px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ xml:space="preserve"><tspan
+ id="tspan4852"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ y="-282.71359"
+ x="-235.48586"
+ sodipodi:role="line">Casting, Result Allocation and Outer Iteration</tspan><tspan
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ y="-276.06772"
+ x="-235.48586"
+ sodipodi:role="line"
+ id="tspan4918">done by UFunc Machinery (within <tspan
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Bold'"
+ id="tspan1182">ArrayMethod)</tspan></tspan><tspan
+ id="tspan4854"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ y="-269.36993"
+ x="-235.48586"
+ sodipodi:role="line" /></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.3167px;line-height:1.25;font-family:fira;-inkscape-font-specification:fira;letter-spacing:0px;word-spacing:0px;fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ x="20.532179"
+ y="-205.57103"
+ id="text5366"
+ transform="scale(-1)"><tspan
+ sodipodi:role="line"
+ x="20.532179"
+ y="-205.57103"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="tspan5364">Promoter</tspan></text>
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:6.7452px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#008100;fill-opacity:1;stroke-width:0.505891"
+ x="72.261002"
+ y="61.442417"
+ id="text1097"><tspan
+ sodipodi:role="line"
+ id="tspan1095"
+ x="72.261002"
+ y="61.442417"
+ style="fill:#008100;fill-opacity:1;stroke-width:0.505891">Inputs</tspan></text>
+ <text
+ id="text1101"
+ y="61.442417"
+ x="150.49973"
+ style="font-size:6.7452px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#d99b00;fill-opacity:1;stroke-width:0.505891"
+ xml:space="preserve"><tspan
+ style="fill:#d99b00;fill-opacity:1;stroke-width:0.505891"
+ y="61.442417"
+ x="150.49973"
+ id="tspan1099"
+ sodipodi:role="line">Output</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:5.3167px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000080;stroke-width:0.398751"
+ x="144.32066"
+ y="230.83656"
+ id="text1791"><tspan
+ id="tspan1795"
+ sodipodi:role="line"
+ x="144.32066"
+ y="230.83656"
+ style="text-align:end;text-anchor:end;fill:#000080;stroke-width:0.398751">… including correct</tspan><tspan
+ id="tspan1807"
+ sodipodi:role="line"
+ x="144.32066"
+ y="237.48244"
+ style="text-align:end;text-anchor:end;fill:#000080;stroke-width:0.398751">output descriptor</tspan></text>
+ <rect
+ rx="2.065089"
+ ry="2.065089"
+ y="134.54594"
+ x="101.20623"
+ height="19.673599"
+ width="46.424511"
+ id="rect5208"
+ style="opacity:0.25;fill:#830000;fill-opacity:0.64;stroke:none;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.2, 2.4;stroke-dashoffset:0;stroke-opacity:0.497957" />
+ <text
+ xml:space="preserve"
+ style="font-size:5.3167px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ x="103.66331"
+ y="142.74757"
+ id="text5218"><tspan
+ sodipodi:role="line"
+ x="103.66331"
+ y="142.74757"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="tspan5216">+ <tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code'"
+ id="tspan1156">ArrayMethod</tspan></tspan><tspan
+ id="tspan5904"
+ sodipodi:role="line"
+ x="103.66331"
+ y="149.44537"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"> lookup</tspan></text>
+ </g>
+</svg>
diff --git a/doc/neps/_static/nep43-sketch.svg b/doc/neps/_static/nep43-sketch.svg
new file mode 100644
index 000000000..372c0ee46
--- /dev/null
+++ b/doc/neps/_static/nep43-sketch.svg
@@ -0,0 +1,3009 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
+ sodipodi:docname="nep43-sketch.svg"
+ id="svg8"
+ version="1.1"
+ viewBox="0 0 289.35355 238.13675"
+ height="238.13675mm"
+ width="289.35355mm">
+ <defs
+ id="defs2">
+ <linearGradient
+ id="linearGradient5092"
+ inkscape:collect="always">
+ <stop
+ id="stop5088"
+ offset="0"
+ style="stop-color:#800000;stop-opacity:1;" />
+ <stop
+ id="stop5090"
+ offset="1"
+ style="stop-color:#800000;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5078"
+ inkscape:collect="always">
+ <stop
+ id="stop5074"
+ offset="0"
+ style="stop-color:#000080;stop-opacity:1;" />
+ <stop
+ id="stop5076"
+ offset="1"
+ style="stop-color:#000080;stop-opacity:0;" />
+ </linearGradient>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker7096"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Send">
+ <path
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
+ style="fill:#00b200;fill-opacity:1;fill-rule:evenodd;stroke:#00b200;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path7094"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:collect="always"
+ inkscape:stockid="Arrow1Send"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker6260"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path6258"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#000081;fill-opacity:1;fill-rule:evenodd;stroke:#000081;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker5628"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Send">
+ <path
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
+ style="fill:#000081;fill-opacity:1;fill-rule:evenodd;stroke:#000081;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path5626"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker5618"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Sstart">
+ <path
+ transform="matrix(0.2,0,0,0.2,1.2,0)"
+ style="fill:#000081;fill-opacity:1;fill-rule:evenodd;stroke:#000081;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path5616"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:collect="always"
+ inkscape:stockid="Arrow1Send"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker5002"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5000"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#000081;fill-opacity:1;fill-rule:evenodd;stroke:#000081;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker4826"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Send">
+ <path
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
+ style="fill:#206120;fill-opacity:1;fill-rule:evenodd;stroke:#206120;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path4824"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:collect="always"
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="Arrow1Sstart"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Sstart">
+ <path
+ transform="matrix(0.2,0,0,0.2,1.2,0)"
+ style="fill:#800000;fill-opacity:1;fill-rule:evenodd;stroke:#800000;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path924"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Send"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker4400"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4398"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#00b200;fill-opacity:1;fill-rule:evenodd;stroke:#00b200;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker4390"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Send">
+ <path
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
+ style="fill:#b7943d;fill-opacity:1;fill-rule:evenodd;stroke:#b7943d;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path4388"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:collect="always"
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker3453"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Send">
+ <path
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
+ style="fill:#800000;fill-opacity:1;fill-rule:evenodd;stroke:#800000;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path3451"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:collect="always"
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker2179"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Send">
+ <path
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
+ style="fill:#206120;fill-opacity:1;fill-rule:evenodd;stroke:#206120;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path2177"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker2037"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Send">
+ <path
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
+ style="fill:#f4ae00;fill-opacity:1;fill-rule:evenodd;stroke:#ffc433;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path2035"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:collect="always"
+ inkscape:stockid="Arrow1Send"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker1480"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path1478"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#ffc433;fill-opacity:1;fill-rule:evenodd;stroke:#ffc433;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <rect
+ id="rect1296"
+ height="8.8755655"
+ width="16.467854"
+ y="100.87298"
+ x="-2.9674385" />
+ <marker
+ inkscape:collect="always"
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="Arrow1Send"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Send">
+ <path
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
+ style="fill:#00b200;fill-opacity:1;fill-rule:evenodd;stroke:#00b200;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path927"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="Arrow1Lend"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Lend">
+ <path
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path915"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="Arrow1Lstart"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Lstart">
+ <path
+ transform="matrix(0.8,0,0,0.8,10,0)"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path912"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:collect="always"
+ inkscape:stockid="Arrow1Send"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Send-5"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path927-6"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#00b200;fill-opacity:1;fill-rule:evenodd;stroke:#00b200;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
+ </marker>
+ <linearGradient
+ gradientTransform="translate(0.29900013,18.755984)"
+ gradientUnits="userSpaceOnUse"
+ y2="220.58623"
+ x2="-9.5455313"
+ y1="221.22202"
+ x1="-44.254147"
+ id="linearGradient5080"
+ xlink:href="#linearGradient5078"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientTransform="translate(0.29900013,18.755984)"
+ gradientUnits="userSpaceOnUse"
+ y2="161.24438"
+ x2="216.83401"
+ y1="161.02299"
+ x1="248.04567"
+ id="linearGradient5094"
+ xlink:href="#linearGradient5092"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientTransform="translate(0.29900013,18.755984)"
+ y2="221.80334"
+ x2="4.2398605"
+ y1="221.22202"
+ x1="-44.254147"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5200"
+ xlink:href="#linearGradient5078"
+ inkscape:collect="always" />
+ </defs>
+ <sodipodi:namedview
+ inkscape:guide-bbox="true"
+ showguides="true"
+ inkscape:window-maximized="1"
+ inkscape:window-y="27"
+ inkscape:window-x="0"
+ inkscape:window-height="1376"
+ inkscape:window-width="2560"
+ showgrid="false"
+ inkscape:document-rotation="0"
+ inkscape:current-layer="text892"
+ inkscape:document-units="mm"
+ inkscape:cy="408.92855"
+ inkscape:cx="490.09169"
+ inkscape:zoom="0.7"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ lock-margins="true"
+ fit-margin-top="2"
+ fit-margin-left="2"
+ fit-margin-right="2"
+ fit-margin-bottom="2" />
+ <metadata
+ id="metadata5">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1"
+ transform="translate(46.254147,-52.135225)">
+ <path
+ id="rect5086"
+ style="opacity:0.25;fill:url(#linearGradient5094);fill-opacity:1;stroke:none;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.2, 2.4;stroke-dashoffset:0;stroke-opacity:0.497957"
+ d="m 190.03594,66.404785 h 48.99837 c 1.14406,0 2.06509,0.92103 2.06509,2.065089 V 286.20688 c 0,1.14406 -0.92103,2.06509 -2.06509,2.06509 h -48.99837 c -1.14405,0 -2.06508,-0.92103 -2.06508,-2.06509 V 68.469874 c 0,-1.144059 0.92103,-2.065089 2.06508,-2.065089 z" />
+ <path
+ id="rect5198"
+ style="opacity:0.25;fill:url(#linearGradient5200);fill-opacity:1;stroke:none;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.2, 2.4;stroke-dashoffset:0;stroke-opacity:0.497957"
+ d="m -42.189058,133.66225 h 67.11671 c 1.144059,0 2.065089,0.92103 2.065089,2.06509 v 12.41735 c 0,1.14406 -0.92103,2.06509 -2.065089,2.06509 h -67.11671 c -1.144059,0 -2.065089,-0.92103 -2.065089,-2.06509 v -12.41735 c 0,-1.14406 0.92103,-2.06509 2.065089,-2.06509 z" />
+ <path
+ id="rect5064"
+ style="opacity:0.25;fill:url(#linearGradient5080);fill-opacity:1;stroke:none;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.2, 2.4;stroke-dashoffset:0;stroke-opacity:0.497957"
+ d="m -42.189058,157.51857 h 61.822383 c 1.144059,0 2.065089,0.92103 2.065089,2.06509 v 126.62322 c 0,1.14406 -0.92103,2.06509 -2.065089,2.06509 h -61.822383 c -1.144059,0 -2.065089,-0.92103 -2.065089,-2.06509 V 159.58366 c 0,-1.14406 0.92103,-2.06509 2.065089,-2.06509 z" />
+ <path
+ id="rect4614"
+ style="opacity:0.25;fill:#800000;fill-opacity:0.639216;stroke:none;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.2, 2.4;stroke-dashoffset:0;stroke-opacity:0.497957"
+ d="m 30.848304,181.42923 h 51.545179 c 1.14406,0 2.065089,0.92103 2.065089,2.06509 v 12.22028 c 0,1.14405 -0.921029,2.06508 -2.065089,2.06508 H 30.848304 c -1.14406,0 -2.065089,-0.92103 -2.065089,-2.06508 v -12.22028 c 0,-1.14406 0.921029,-2.06509 2.065089,-2.06509 z" />
+ <path
+ id="rect4618"
+ style="opacity:0.25;fill:#000080;fill-opacity:0.4;stroke:none;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.2, 2.4;stroke-dashoffset:0;stroke-opacity:0.497957"
+ d="m 30.848304,134.54594 h 68.292833 c 1.144063,0 2.065093,0.92103 2.065093,2.06509 v 15.70853 c 0,1.14406 -0.92103,2.06509 -2.065093,2.06509 H 30.848304 c -1.14406,0 -2.065089,-0.92103 -2.065089,-2.06509 v -15.70853 c 0,-1.14406 0.921029,-2.06509 2.065089,-2.06509 z" />
+ <path
+ id="rect4620"
+ style="opacity:0.25;fill:#000080;fill-opacity:0.4;stroke:none;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.2, 2.4;stroke-dashoffset:0;stroke-opacity:0.497957"
+ d="M 38.256644,224.65892 H 150.95997 c 1.14406,0 2.06509,0.92103 2.06509,2.06509 v 12.52236 c 0,1.14406 -0.92103,2.06509 -2.06509,2.06509 H 38.256644 c -1.144059,0 -2.065089,-0.92103 -2.065089,-2.06509 v -12.52236 c 0,-1.14406 0.92103,-2.06509 2.065089,-2.06509 z" />
+ <path
+ style="fill:none;stroke:#ffc433;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.2, 2.4;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker1480)"
+ d="M 162.39696,87.706466 V 102.33478"
+ id="path1476"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path4822"
+ d="m 87.064551,181.16793 v 56.58639"
+ style="fill:none;stroke:#206120;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker4826)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path2033"
+ d="M 162.39696,243.19694 V 134.06539"
+ style="fill:#f4ae00;fill-opacity:1;stroke:#ffc433;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.2, 2.4;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker2037)" />
+ <path
+ style="fill:none;stroke:#00b200;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker4400)"
+ d="m 82.917295,224.24439 v 13.50993"
+ id="path4310"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path4312"
+ d="m 149.89381,181.16793 v 56.58639"
+ style="opacity:0.5;fill:none;fill-opacity:0.501961;stroke:#b7943d;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker4390)" />
+ <path
+ id="rect4314"
+ style="fill:none;stroke:#000080;stroke-width:1.412;stroke-linecap:round;stroke-miterlimit:10;stroke-opacity:1"
+ d="M 28.543333,241.1985 H 187.44249 v 24.34369 H 28.543333 Z" />
+ <g
+ aria-label="Loop
+descriptors"
+ id="text4320"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000080;fill-opacity:1;stroke:#000000;stroke-width:0.398751;stroke-opacity:0">
+ <path
+ d="m 6.0816287,247.79372 h 1.1937255 v 3.72691 h 2.0959961 v 0.90227 H 6.0816287 Z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#000080;fill-opacity:1;stroke:#000000;stroke-width:0.398751;stroke-opacity:0"
+ id="path2125" />
+ <path
+ d="m 11.730896,249.66028 q -0.368969,0 -0.564306,0.26665 -0.192237,0.26355 -0.192237,0.76274 0,0.49919 0.192237,0.76584 0.195337,0.26355 0.564306,0.26355 0.362769,0 0.555005,-0.26355 0.192236,-0.26665 0.192236,-0.76584 0,-0.49919 -0.192236,-0.76274 -0.192236,-0.26665 -0.555005,-0.26665 z m 0,-0.79375 q 0.89607,0 1.398364,0.48369 0.505396,0.48369 0.505396,1.33945 0,0.85576 -0.505396,1.33945 -0.502294,0.48369 -1.398364,0.48369 -0.89917,0 -1.407666,-0.48369 -0.5053953,-0.48369 -0.5053953,-1.33945 0,-0.85576 0.5053953,-1.33945 0.508496,-0.48369 1.407666,-0.48369 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#000080;fill-opacity:1;stroke:#000000;stroke-width:0.398751;stroke-opacity:0"
+ id="path2127" />
+ <path
+ d="m 16.09342,249.66028 q -0.368969,0 -0.564306,0.26665 -0.192237,0.26355 -0.192237,0.76274 0,0.49919 0.192237,0.76584 0.195337,0.26355 0.564306,0.26355 0.362769,0 0.555005,-0.26355 0.192236,-0.26665 0.192236,-0.76584 0,-0.49919 -0.192236,-0.76274 -0.192236,-0.26665 -0.555005,-0.26665 z m 0,-0.79375 q 0.89607,0 1.398364,0.48369 0.505396,0.48369 0.505396,1.33945 0,0.85576 -0.505396,1.33945 -0.502294,0.48369 -1.398364,0.48369 -0.89917,0 -1.407666,-0.48369 -0.505395,-0.48369 -0.505395,-1.33945 0,-0.85576 0.505395,-1.33945 0.508496,-0.48369 1.407666,-0.48369 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#000080;fill-opacity:1;stroke:#000000;stroke-width:0.398751;stroke-opacity:0"
+ id="path2129" />
+ <path
+ d="m 19.913343,251.9206 v 1.82315 h -1.11001 v -4.79351 h 1.11001 v 0.5085 q 0.229443,-0.30386 0.508496,-0.44649 0.279053,-0.14572 0.641821,-0.14572 0.641821,0 1.054199,0.51159 0.412378,0.5085 0.412378,1.31155 0,0.80305 -0.412378,1.31465 -0.412378,0.50849 -1.054199,0.50849 -0.362768,0 -0.641821,-0.14262 -0.279053,-0.14573 -0.508496,-0.44959 z m 0.737939,-2.24792 q -0.356567,0 -0.548804,0.26355 -0.189135,0.26045 -0.189135,0.75344 0,0.49299 0.189135,0.75654 0.192237,0.26045 0.548804,0.26045 0.356568,0 0.542603,-0.26045 0.189135,-0.26045 0.189135,-0.75654 0,-0.49609 -0.189135,-0.75654 -0.186035,-0.26045 -0.542603,-0.26045 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#000080;fill-opacity:1;stroke:#000000;stroke-width:0.398751;stroke-opacity:0"
+ id="path2131" />
+ <path
+ d="m -14.847326,257.39624 v -1.86035 h 1.116211 v 4.82451 h -1.116211 v -0.5023 q -0.229443,0.30696 -0.505396,0.44959 -0.275952,0.14262 -0.63872,0.14262 -0.641822,0 -1.054199,-0.50849 -0.412378,-0.5116 -0.412378,-1.31465 0,-0.80305 0.412378,-1.31155 0.412377,-0.51159 1.054199,-0.51159 0.359668,0 0.63562,0.14572 0.279053,0.14263 0.508496,0.44649 z m -0.731738,2.24792 q 0.356567,0 0.542602,-0.26045 0.189136,-0.26045 0.189136,-0.75654 0,-0.49609 -0.189136,-0.75654 -0.186035,-0.26045 -0.542602,-0.26045 -0.353467,0 -0.542603,0.26045 -0.186035,0.26045 -0.186035,0.75654 0,0.49609 0.186035,0.75654 0.189136,0.26045 0.542603,0.26045 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#000080;fill-opacity:1;stroke:#000000;stroke-width:0.398751;stroke-opacity:0"
+ id="path2133" />
+ <path
+ d="m -9.1980587,258.61477 v 0.31626 h -2.5951903 q 0.04031,0.39067 0.282153,0.58601 0.241846,0.19533 0.675928,0.19533 0.350366,0 0.716235,-0.10231 0.36897,-0.10542 0.7565432,-0.31626 v 0.85576 q -0.3937744,0.14883 -0.7875492,0.22324 -0.393774,0.0775 -0.787548,0.0775 -0.942579,0 -1.466578,-0.47749 -0.520898,-0.48059 -0.520898,-1.34565 0,-0.84956 0.511597,-1.33635 0.514697,-0.48679 1.413867,-0.48679 0.818555,0 1.3084471,0.49299 0.4929932,0.49299 0.4929932,1.31775 z m -1.1410153,-0.36897 q 0,-0.31626 -0.186035,-0.5085 -0.182935,-0.19534 -0.480591,-0.19534 -0.322461,0 -0.523999,0.18294 -0.201538,0.17983 -0.251148,0.5209 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#000080;fill-opacity:1;stroke:#000000;stroke-width:0.398751;stroke-opacity:0"
+ id="path2135" />
+ <path
+ d="m -5.644787,256.99626 v 0.84336 q -0.3565674,-0.14883 -0.6883301,-0.22324 -0.3317627,-0.0744 -0.6263184,-0.0744 -0.3162597,0 -0.471289,0.0806 -0.1519287,0.0775 -0.1519287,0.24185 0,0.13332 0.1147217,0.20463 0.1178222,0.0713 0.4185791,0.10542 l 0.1953369,0.0279 q 0.8526611,0.10852 1.1472167,0.35657 0.2945557,0.24804 0.2945557,0.77824 0,0.55501 -0.4092773,0.83406 -0.4092774,0.27905 -1.2216309,0.27905 -0.344165,0 -0.7131347,-0.0558 -0.3658692,-0.0527 -0.7534424,-0.16123 v -0.84336 q 0.3317627,0.16123 0.6790283,0.24185 0.3503662,0.0806 0.7100342,0.0806 0.3255615,0 0.4898925,-0.0899 0.1643311,-0.0899 0.1643311,-0.26665 0,-0.14883 -0.1147217,-0.22014 -0.1116211,-0.0744 -0.4495849,-0.11473 l -0.1953369,-0.0248 q -0.7410401,-0.093 -1.0386963,-0.34417 -0.2976563,-0.25114 -0.2976563,-0.76274 0,-0.5519 0.3782715,-0.81855 0.3782715,-0.26665 1.1596191,-0.26665 0.306958,0 0.6449219,0.0465 0.3379639,0.0465 0.7348389,0.14573 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#000080;fill-opacity:1;stroke:#000000;stroke-width:0.398751;stroke-opacity:0"
+ id="path2137" />
+ <path
+ d="m -1.772156,256.99626 v 0.90537 q -0.2263427,-0.15503 -0.4557861,-0.22944 -0.2263428,-0.0744 -0.471289,-0.0744 -0.4650879,0 -0.7255371,0.27285 -0.2573487,0.26975 -0.2573487,0.75654 0,0.48679 0.2573487,0.75964 0.2604492,0.26975 0.7255371,0.26975 0.2604492,0 0.4929931,-0.0775 0.2356445,-0.0775 0.434082,-0.22944 v 0.90847 q -0.2604492,0.0961 -0.5302002,0.14262 -0.2666503,0.0496 -0.5364013,0.0496 -0.9394775,0 -1.4696777,-0.48059 -0.5302002,-0.48369 -0.5302002,-1.34255 0,-0.85886 0.5302002,-1.33945 0.5302002,-0.48369 1.4696777,-0.48369 0.2728515,0 0.5364013,0.0496 0.2666504,0.0465 0.5302002,0.14263 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#000080;fill-opacity:1;stroke:#000000;stroke-width:0.398751;stroke-opacity:0"
+ id="path2139" />
+ <path
+ d="m 1.7656118,257.83342 q -0.1457275,-0.0682 -0.291455,-0.0992 -0.142627,-0.0341 -0.2883545,-0.0341 -0.42788089,0 -0.66042483,0.27596 -0.22944335,0.27285 -0.22944335,0.78444 v 1.59991 h -1.11000975 v -3.47266 h 1.11000975 v 0.57051 q 0.21394042,-0.34107 0.48989257,-0.49609 0.27905271,-0.15813 0.66662601,-0.15813 0.05581,0 0.1209228,0.006 0.065112,0.003 0.1891357,0.0186 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#000080;fill-opacity:1;stroke:#000000;stroke-width:0.398751;stroke-opacity:0"
+ id="path2141" />
+ <path
+ d="m 2.3175162,256.88774 h 1.1100097 v 3.47266 H 2.3175162 Z m 0,-1.35185 h 1.1100097 v 0.90537 H 2.3175162 Z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#000080;fill-opacity:1;stroke:#000000;stroke-width:0.398751;stroke-opacity:0"
+ id="path2143" />
+ <path
+ d="m 5.6041388,259.8581 v 1.82315 H 4.494129 v -4.79351 h 1.1100098 v 0.5085 q 0.2294433,-0.30386 0.5084961,-0.44649 0.2790527,-0.14572 0.6418212,-0.14572 0.6418213,0 1.0541992,0.51159 0.412378,0.5085 0.412378,1.31155 0,0.80305 -0.412378,1.31465 -0.4123779,0.50849 -1.0541992,0.50849 -0.3627685,0 -0.6418212,-0.14262 -0.2790528,-0.14573 -0.5084961,-0.44959 z m 0.7379394,-2.24792 q -0.3565674,0 -0.5488037,0.26355 -0.1891357,0.26045 -0.1891357,0.75344 0,0.49299 0.1891357,0.75654 0.1922363,0.26045 0.5488037,0.26045 0.3565674,0 0.5426025,-0.26045 0.1891358,-0.26045 0.1891358,-0.75654 0,-0.49609 -0.1891358,-0.75654 -0.1860351,-0.26045 -0.5426025,-0.26045 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#000080;fill-opacity:1;stroke:#000000;stroke-width:0.398751;stroke-opacity:0"
+ id="path2145" />
+ <path
+ d="m 10.251916,255.90175 v 0.98599 h 1.144116 v 0.79375 h -1.144116 v 1.47278 q 0,0.24185 0.09612,0.32866 0.09612,0.0837 0.381372,0.0837 h 0.570508 v 0.79375 h -0.95188 q -0.6573241,0 -0.9332762,-0.27285 -0.2728516,-0.27596 -0.2728516,-0.93328 v -1.47278 H 8.5900019 v -0.79375 h 0.5519043 v -0.98599 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#000080;fill-opacity:1;stroke:#000000;stroke-width:0.398751;stroke-opacity:0"
+ id="path2147" />
+ <path
+ d="m 13.727674,257.59778 q -0.36897,0 -0.564307,0.26665 -0.192236,0.26355 -0.192236,0.76274 0,0.49919 0.192236,0.76584 0.195337,0.26355 0.564307,0.26355 0.362768,0 0.555005,-0.26355 0.192236,-0.26665 0.192236,-0.76584 0,-0.49919 -0.192236,-0.76274 -0.192237,-0.26665 -0.555005,-0.26665 z m 0,-0.79375 q 0.896069,0 1.398364,0.48369 0.505396,0.48369 0.505396,1.33945 0,0.85576 -0.505396,1.33945 -0.502295,0.48369 -1.398364,0.48369 -0.89917,0 -1.407666,-0.48369 -0.505396,-0.48369 -0.505396,-1.33945 0,-0.85576 0.505396,-1.33945 0.508496,-0.48369 1.407666,-0.48369 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#000080;fill-opacity:1;stroke:#000000;stroke-width:0.398751;stroke-opacity:0"
+ id="path2149" />
+ <path
+ d="m 19.017271,257.83342 q -0.145727,-0.0682 -0.291455,-0.0992 -0.142627,-0.0341 -0.288354,-0.0341 -0.427881,0 -0.660425,0.27596 -0.229443,0.27285 -0.229443,0.78444 v 1.59991 h -1.11001 v -3.47266 h 1.11001 v 0.57051 q 0.21394,-0.34107 0.489892,-0.49609 0.279053,-0.15813 0.666626,-0.15813 0.05581,0 0.120923,0.006 0.06511,0.003 0.189136,0.0186 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#000080;fill-opacity:1;stroke:#000000;stroke-width:0.398751;stroke-opacity:0"
+ id="path2151" />
+ <path
+ d="m 22.282188,256.99626 v 0.84336 q -0.356567,-0.14883 -0.68833,-0.22324 -0.331763,-0.0744 -0.626318,-0.0744 -0.31626,0 -0.471289,0.0806 -0.151929,0.0775 -0.151929,0.24185 0,0.13332 0.114722,0.20463 0.117822,0.0713 0.418579,0.10542 l 0.195337,0.0279 q 0.852661,0.10852 1.147216,0.35657 0.294556,0.24804 0.294556,0.77824 0,0.55501 -0.409277,0.83406 -0.409278,0.27905 -1.221631,0.27905 -0.344165,0 -0.713135,-0.0558 -0.365869,-0.0527 -0.753442,-0.16123 v -0.84336 q 0.331763,0.16123 0.679028,0.24185 0.350366,0.0806 0.710034,0.0806 0.325562,0 0.489893,-0.0899 0.164331,-0.0899 0.164331,-0.26665 0,-0.14883 -0.114722,-0.22014 -0.111621,-0.0744 -0.449585,-0.11473 l -0.195337,-0.0248 q -0.74104,-0.093 -1.038696,-0.34417 -0.297656,-0.25114 -0.297656,-0.76274 0,-0.5519 0.378271,-0.81855 0.378272,-0.26665 1.159619,-0.26665 0.306958,0 0.644922,0.0465 0.337964,0.0465 0.734839,0.14573 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#000080;fill-opacity:1;stroke:#000000;stroke-width:0.398751;stroke-opacity:0"
+ id="path2153" />
+ </g>
+ <path
+ id="rect4322"
+ style="opacity:0.6;fill:#ffffff;stroke:#800000;stroke-width:1.412;stroke-linecap:round;stroke-miterlimit:10;stroke-opacity:0.8"
+ d="M 28.168863,197.56255 H 187.06802 v 24.34368 H 28.168863 Z" />
+ <g
+ aria-label="Resolver
+Input"
+ id="text4328"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#800000;fill-opacity:0.8;stroke-width:0.398751">
+ <path
+ d="m -5.998254,205.75171 q 0.3751709,0 0.5364014,-0.13953 0.164331,-0.13953 0.164331,-0.45889 0,-0.31626 -0.164331,-0.45268 -0.1612305,-0.13643 -0.5364014,-0.13643 h -0.5022949 v 1.18753 z m -0.5022949,0.82475 v 1.75183 h -1.1937255 v -4.62917 h 1.8231445 q 0.9146728,0 1.3394531,0.30696 0.4278808,0.30695 0.4278808,0.97048 0,0.45889 -0.2232422,0.75344 -0.2201416,0.29456 -0.6666259,0.43408 0.2449463,0.0558 0.4371826,0.25425 0.1953369,0.19534 0.3937744,0.59531 l 0.6480224,1.31465 h -1.2712402 l -0.5643066,-1.15031 q -0.1705322,-0.34727 -0.3472656,-0.47439 -0.1736328,-0.12713 -0.4650879,-0.12713 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#800000;fill-opacity:0.8;stroke-width:0.398751"
+ id="path2325" />
+ <path
+ d="m 0.61219533,206.58266 v 0.31626 H -1.9829951 q 0.040308,0.39068 0.2821534,0.58601 0.2418457,0.19534 0.6759277,0.19534 0.35036618,0 0.71623532,-0.10232 0.36896972,-0.10542 0.75654295,-0.31626 v 0.85576 q -0.3937744,0.14883 -0.78754881,0.22325 -0.39377441,0.0775 -0.78754886,0.0775 -0.9425781,0 -1.4665771,-0.47749 -0.5208984,-0.48059 -0.5208984,-1.34565 0,-0.84957 0.5115967,-1.33636 0.5146972,-0.48679 1.4138671,-0.48679 0.8185547,0 1.30844727,0.49299 0.49299316,0.493 0.49299316,1.31775 z m -1.14101561,-0.36897 q 0,-0.31626 -0.18603515,-0.50849 -0.18293457,-0.19534 -0.48059077,-0.19534 -0.322461,0 -0.5239991,0.18293 -0.201538,0.17984 -0.2511474,0.5209 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#800000;fill-opacity:0.8;stroke-width:0.398751"
+ id="path2327" />
+ <path
+ d="m 4.1654665,204.96416 v 0.84336 q -0.3565673,-0.14883 -0.68833,-0.22325 -0.3317627,-0.0744 -0.6263184,-0.0744 -0.3162597,0 -0.471289,0.0806 -0.1519287,0.0775 -0.1519287,0.24184 0,0.13333 0.1147216,0.20464 0.1178223,0.0713 0.4185791,0.10542 l 0.1953369,0.0279 q 0.8526612,0.10852 1.1472168,0.35656 0.2945557,0.24805 0.2945557,0.77825 0,0.555 -0.4092774,0.83406 -0.4092773,0.27905 -1.2216308,0.27905 -0.344165,0 -0.7131348,-0.0558 -0.3658691,-0.0527 -0.7534423,-0.16123 v -0.84336 q 0.3317627,0.16123 0.6790283,0.24185 0.3503662,0.0806 0.7100342,0.0806 0.3255615,0 0.4898925,-0.0899 0.1643311,-0.0899 0.1643311,-0.26665 0,-0.14883 -0.1147217,-0.22014 -0.1116211,-0.0744 -0.449585,-0.11472 l -0.1953369,-0.0248 q -0.74104,-0.093 -1.0386962,-0.34417 -0.2976563,-0.25115 -0.2976563,-0.76274 0,-0.55191 0.3782715,-0.81856 0.3782715,-0.26665 1.1596191,-0.26665 0.306958,0 0.6449219,0.0465 0.3379638,0.0465 0.7348388,0.14573 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#800000;fill-opacity:0.8;stroke-width:0.398751"
+ id="path2329" />
+ <path
+ d="m 6.8846806,205.56567 q -0.3689697,0 -0.5643066,0.26665 -0.1922363,0.26355 -0.1922363,0.76275 0,0.49919 0.1922363,0.76584 0.1953369,0.26355 0.5643066,0.26355 0.3627686,0 0.5550049,-0.26355 0.1922363,-0.26665 0.1922363,-0.76584 0,-0.4992 -0.1922363,-0.76275 -0.1922363,-0.26665 -0.5550049,-0.26665 z m 0,-0.79375 q 0.8960693,0 1.3983642,0.48369 0.5053955,0.48369 0.5053955,1.33946 0,0.85576 -0.5053955,1.33945 -0.5022949,0.48369 -1.3983642,0.48369 -0.8991699,0 -1.407666,-0.48369 -0.5053955,-0.48369 -0.5053955,-1.33945 0,-0.85577 0.5053955,-1.33946 0.5084961,-0.48369 1.407666,-0.48369 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#800000;fill-opacity:0.8;stroke-width:0.398751"
+ id="path2331" />
+ <path
+ d="m 9.5945924,203.50378 h 1.1100096 v 4.82451 H 9.5945924 Z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#800000;fill-opacity:0.8;stroke-width:0.398751"
+ id="path2333" />
+ <path
+ d="m 11.334021,204.85564 h 1.110009 l 0.865064,2.39985 0.861963,-2.39985 h 1.11311 l -1.367358,3.47265 h -1.218531 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#800000;fill-opacity:0.8;stroke-width:0.398751"
+ id="path2335" />
+ <path
+ d="m 19.376941,206.58266 v 0.31626 H 16.78175 q 0.04031,0.39068 0.282153,0.58601 0.241846,0.19534 0.675928,0.19534 0.350366,0 0.716236,-0.10232 0.368969,-0.10542 0.756543,-0.31626 v 0.85576 q -0.393775,0.14883 -0.787549,0.22325 -0.393775,0.0775 -0.787549,0.0775 -0.942578,0 -1.466577,-0.47749 -0.520899,-0.48059 -0.520899,-1.34565 0,-0.84957 0.511597,-1.33636 0.514697,-0.48679 1.413867,-0.48679 0.818555,0 1.308447,0.49299 0.492994,0.493 0.492994,1.31775 z m -1.141016,-0.36897 q 0,-0.31626 -0.186035,-0.50849 -0.182935,-0.19534 -0.480591,-0.19534 -0.322461,0 -0.523999,0.18293 -0.201538,0.17984 -0.251147,0.5209 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#800000;fill-opacity:0.8;stroke-width:0.398751"
+ id="path2337" />
+ <path
+ d="m 22.796886,205.80132 q -0.145727,-0.0682 -0.291455,-0.0992 -0.142627,-0.0341 -0.288354,-0.0341 -0.427881,0 -0.660425,0.27595 -0.229444,0.27285 -0.229444,0.78445 v 1.5999 h -1.110009 v -3.47265 h 1.110009 v 0.5705 q 0.213941,-0.34106 0.489893,-0.49609 0.279053,-0.15813 0.666626,-0.15813 0.05581,0 0.120923,0.006 0.06511,0.003 0.189136,0.0186 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#800000;fill-opacity:0.8;stroke-width:0.398751"
+ id="path2339" />
+ <path
+ d="M 4.4135135,211.63662 H 5.607239 v 4.62917 H 4.4135135 Z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#800000;fill-opacity:0.8;stroke-width:0.398751"
+ id="path2341" />
+ <path
+ d="m 10.21781,214.15119 v 2.1146 H 9.1015992 v -0.34416 -1.27434 q 0,-0.44959 -0.021704,-0.62012 -0.018603,-0.17053 -0.068213,-0.25115 -0.065112,-0.10852 -0.1767334,-0.16743 -0.1116211,-0.062 -0.254248,-0.062 -0.3472656,0 -0.5457031,0.26975 -0.1984375,0.26665 -0.1984375,0.74104 v 1.70842 H 6.7265504 v -3.47265 h 1.1100098 v 0.50849 q 0.2511474,-0.30385 0.5333007,-0.44648 0.2821534,-0.14573 0.6232178,-0.14573 0.6015137,0 0.9115723,0.36897 0.313159,0.36897 0.313159,1.0728 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#800000;fill-opacity:0.8;stroke-width:0.398751"
+ id="path2343" />
+ <path
+ d="m 12.357215,215.7635 v 1.82314 h -1.11001 v -4.7935 h 1.11001 v 0.50849 q 0.229443,-0.30385 0.508496,-0.44648 0.279052,-0.14573 0.641821,-0.14573 0.641821,0 1.054199,0.5116 0.412378,0.50849 0.412378,1.31155 0,0.80305 -0.412378,1.31464 -0.412378,0.5085 -1.054199,0.5085 -0.362769,0 -0.641821,-0.14263 -0.279053,-0.14572 -0.508496,-0.44958 z m 0.737939,-2.24793 q -0.356567,0 -0.548804,0.26355 -0.189135,0.26045 -0.189135,0.75345 0,0.49299 0.189135,0.75654 0.192237,0.26045 0.548804,0.26045 0.356567,0 0.542603,-0.26045 0.189135,-0.26045 0.189135,-0.75654 0,-0.4961 -0.189135,-0.75655 -0.186036,-0.26045 -0.542603,-0.26045 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#800000;fill-opacity:0.8;stroke-width:0.398751"
+ id="path2345" />
+ <path
+ d="m 15.755457,214.91394 v -2.1208 h 1.116211 v 0.34726 q 0,0.28216 -0.0031,0.71004 -0.0031,0.42478 -0.0031,0.5674 0,0.41858 0.0217,0.60462 0.0217,0.18293 0.07441,0.26665 0.06821,0.10852 0.176733,0.16743 0.111621,0.0589 0.254248,0.0589 0.347266,0 0.545703,-0.26665 0.198438,-0.26665 0.198438,-0.74104 v -1.71462 h 1.110009 v 3.47265 h -1.110009 v -0.50229 q -0.251148,0.30386 -0.533301,0.44958 -0.279053,0.14263 -0.617017,0.14263 -0.601513,0 -0.917773,-0.36897 -0.313159,-0.36897 -0.313159,-1.0728 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#800000;fill-opacity:0.8;stroke-width:0.398751"
+ id="path2347" />
+ <path
+ d="m 21.525646,211.80715 v 0.98599 h 1.144117 v 0.79375 h -1.144117 v 1.47277 q 0,0.24185 0.09612,0.32867 0.09612,0.0837 0.381372,0.0837 h 0.570507 v 0.79375 h -0.951879 q -0.657325,0 -0.933277,-0.27285 -0.272851,-0.27595 -0.272851,-0.93328 v -1.47277 h -0.551905 v -0.79375 h 0.551905 v -0.98599 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#800000;fill-opacity:0.8;stroke-width:0.398751"
+ id="path2349" />
+ </g>
+ <path
+ id="rect4330"
+ style="opacity:0.5;fill:#ffc333;fill-opacity:0.46663;stroke:none;stroke-width:1.10816;stroke-linecap:round;stroke-miterlimit:10"
+ d="m 142.70969,200.65752 h 39.2278 v 17.71783 h -39.2278 z" />
+ <path
+ id="rect4332"
+ style="fill:#00b200;fill-opacity:0.483526;stroke:none;stroke-width:1.09086;stroke-linecap:round;stroke-miterlimit:10"
+ d="M 89.303658,201.09155 H 128.61751 V 218.2229 H 89.303658 Z" />
+ <g
+ aria-label="+"
+ id="text4336"
+ style="font-size:12.4527px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;stroke-width:0.933951">
+ <path
+ d="m 83.42805,205.62754 v 3.38679 h 3.386794 v 1.03368 H 83.42805 v 3.38679 h -1.021511 v -3.38679 h -3.386793 v -1.03368 h 3.386793 v -3.38679 z"
+ style="stroke-width:0.933951"
+ id="path2606" />
+ </g>
+ <g
+ aria-label="→"
+ id="text4340"
+ style="font-size:12.4527px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke-width:0.933951">
+ <path
+ d="m 140.22087,209.97661 v 0.54723 l -2.3896,2.38961 -0.72965,-0.72965 1.41673,-1.41674 h -7.41203 v -1.03367 h 7.41203 l -1.41673,-1.41674 0.72965,-0.72965 z"
+ style="fill:#000000;fill-opacity:1;stroke-width:0.933951"
+ id="path2693" />
+ </g>
+ <path
+ id="rect4342"
+ style="fill:#00b200;fill-opacity:0.483526;stroke:none;stroke-width:1.09086;stroke-linecap:round;stroke-miterlimit:10"
+ d="M 37.217079,200.69289 H 76.53093 v 17.13134 H 37.217079 Z" />
+ <path
+ id="rect4344"
+ style="fill:#ffc333;fill-opacity:0.46663;stroke:none;stroke-width:1.10816;stroke-linecap:round;stroke-miterlimit:10"
+ d="m 142.70969,244.04799 h 39.2278 v 17.71783 h -39.2278 z" />
+ <path
+ id="rect4346"
+ style="fill:#00b200;fill-opacity:0.483526;stroke:none;stroke-width:1.09086;stroke-linecap:round;stroke-miterlimit:10"
+ d="m 89.303658,244.48203 h 39.313852 v 17.13134 H 89.303658 Z" />
+ <g
+ aria-label="+"
+ id="text4350"
+ style="font-size:12.4527px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;stroke-width:0.933951">
+ <path
+ d="m 83.42805,249.018 v 3.38679 h 3.386794 v 1.03367 H 83.42805 v 3.3868 h -1.021511 v -3.3868 h -3.386793 v -1.03367 h 3.386793 V 249.018 Z"
+ style="stroke-width:0.933951"
+ id="path3035" />
+ </g>
+ <g
+ aria-label="→"
+ id="text4354"
+ style="font-size:12.4527px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;stroke-width:0.933951">
+ <path
+ d="m 140.22087,253.36706 v 0.54724 l -2.3896,2.38961 -0.72965,-0.72965 1.41673,-1.41674 h -7.41203 v -1.03367 h 7.41203 l -1.41673,-1.41674 0.72965,-0.72965 z"
+ style="stroke-width:0.933951"
+ id="path3122" />
+ </g>
+ <path
+ id="rect4356"
+ style="fill:#00b200;fill-opacity:0.483526;stroke:none;stroke-width:1.09086;stroke-linecap:round;stroke-miterlimit:10"
+ d="M 37.217079,244.08336 H 76.53093 V 261.2147 H 37.217079 Z" />
+ <g
+ aria-label="&gt;U5"
+ id="text4360"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:6.7452px;line-height:1.25;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';letter-spacing:0px;word-spacing:0px;stroke-width:0.505891">
+ <path
+ d="m 50.308698,207.47705 2.691162,1.66381 v 0.71603 l -2.670407,1.66382 -0.432385,-0.63301 2.317582,-1.38709 -2.317582,-1.35942 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path3294" />
+ <path
+ d="m 57.30986,206.88555 v 3.19964 q 0,0.48773 -0.197167,0.87169 -0.197167,0.3805 -0.581125,0.59842 -0.380498,0.21792 -0.93741,0.21792 -0.56037,0 -0.940869,-0.211 -0.380498,-0.21447 -0.574207,-0.59496 -0.193708,-0.3805 -0.193708,-0.88207 v -3.19964 h 0.947787 v 2.93329 q 0,0.61226 0.166036,0.92012 0.166036,0.3044 0.594961,0.3044 0.432385,0 0.59842,-0.3044 0.166036,-0.30786 0.166036,-0.92012 v -2.93329 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path3296" />
+ <path
+ d="m 61.166722,206.88555 -0.107232,0.67106 h -1.79872 v 1.19684 q 0.190249,-0.0934 0.380499,-0.13145 0.190249,-0.0381 0.366662,-0.0381 0.377039,0 0.677979,0.18333 0.30094,0.18333 0.477352,0.52924 0.176413,0.34245 0.176413,0.82326 0,0.48081 -0.22484,0.85439 -0.221381,0.37358 -0.622634,0.58805 -0.401252,0.211 -0.940868,0.211 -0.48773,0 -0.868229,-0.17987 -0.377039,-0.17987 -0.646847,-0.48427 l 0.532698,-0.49465 q 0.377039,0.44622 0.930491,0.44622 0.411631,0 0.653766,-0.24905 0.242135,-0.24906 0.242135,-0.68836 0,-0.48773 -0.204085,-0.68835 -0.204086,-0.20063 -0.518862,-0.20063 -0.311317,0 -0.643388,0.15912 h -0.639929 v -2.50783 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path3298" />
+ </g>
+ <g
+ aria-label="&lt;U8"
+ id="text4364"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:6.7452px;line-height:1.25;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';letter-spacing:0px;word-spacing:0px;stroke-width:0.505891">
+ <path
+ d="m 103.47904,207.92016 0.40817,0.64685 -2.31412,1.37671 2.31412,1.36634 -0.43239,0.65376 -2.6704,-1.66381 v -0.71257 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path3385" />
+ <path
+ d="m 108.19721,207.32866 v 3.19965 q 0,0.48773 -0.19717,0.87168 -0.19717,0.3805 -0.58112,0.59842 -0.3805,0.21793 -0.93741,0.21793 -0.56037,0 -0.94087,-0.21101 -0.3805,-0.21446 -0.57421,-0.59496 -0.19371,-0.3805 -0.19371,-0.88206 v -3.19965 h 0.94779 v 2.9333 q 0,0.61225 0.16604,0.92011 0.16603,0.3044 0.59496,0.3044 0.43238,0 0.59842,-0.3044 0.16603,-0.30786 0.16603,-0.92011 v -2.9333 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path3387" />
+ <path
+ d="m 112.17168,208.47362 q 0,0.33898 -0.19371,0.58458 -0.19025,0.24559 -0.57767,0.46352 0.96163,0.45659 0.96163,1.29715 0,0.37704 -0.20063,0.69527 -0.20063,0.31824 -0.5915,0.51195 -0.38742,0.19025 -0.95125,0.19025 -0.56037,0 -0.94087,-0.18679 -0.38049,-0.19025 -0.5742,-0.50157 -0.19371,-0.31132 -0.19371,-0.6849 0,-0.422 0.24559,-0.7264 0.24906,-0.3044 0.66415,-0.48773 -0.37358,-0.21447 -0.54654,-0.46006 -0.17295,-0.24905 -0.17295,-0.65031 0,-0.41855 0.21446,-0.70565 0.21792,-0.29056 0.56729,-0.4393 0.35283,-0.14874 0.75754,-0.14874 0.42546,0 0.77137,0.14528 0.34937,0.14182 0.55345,0.42201 0.20755,0.28018 0.20755,0.68144 z m -2.19652,0.0484 q 0,0.31132 0.20755,0.4739 0.211,0.15911 0.61571,0.30439 0.26981,-0.17987 0.38396,-0.35628 0.11415,-0.17987 0.11415,-0.42201 0,-0.29402 -0.16949,-0.47389 -0.16604,-0.18333 -0.48773,-0.18333 -0.31478,0 -0.49119,0.16949 -0.17296,0.1695 -0.17296,0.48773 z m 1.46319,2.29683 q 0,-0.26635 -0.12106,-0.42893 -0.11761,-0.16257 -0.34937,-0.27672 -0.23176,-0.11415 -0.57421,-0.23522 -0.23867,0.1349 -0.40125,0.35629 -0.15912,0.22138 -0.15912,0.56728 0,0.33553 0.20063,0.53962 0.20063,0.20409 0.60188,0.20409 0.40471,0 0.60188,-0.21101 0.20062,-0.21446 0.20062,-0.5154 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path3389" />
+ </g>
+ <text
+ id="text4368"
+ y="212.01785"
+ x="150.35503"
+ style="font-size:6.7452px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;stroke-width:0.505891"
+ xml:space="preserve"><tspan
+ style="stroke-width:0.505891"
+ y="212.01785"
+ x="150.35503"
+ id="tspan4366"
+ sodipodi:role="line" /></text>
+ <g
+ aria-label="set descriptors
+for inner-loop…"
+ id="text4374"
+ style="font-size:5.3167px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000080;stroke-width:0.398751">
+ <path
+ d="m 40.965521,227.89085 v 0.45171 q -0.202491,-0.10384 -0.420559,-0.15576 -0.218068,-0.0519 -0.451712,-0.0519 -0.355658,0 -0.534785,0.10903 -0.176531,0.10904 -0.176531,0.32711 0,0.16614 0.127206,0.2622 0.127206,0.0934 0.511421,0.17912 l 0.163551,0.0363 q 0.508825,0.10903 0.7217,0.30893 0.215472,0.1973 0.215472,0.55296 0,0.40498 -0.32191,0.64122 -0.319313,0.23624 -0.880059,0.23624 -0.233644,0 -0.488056,-0.0467 -0.251817,-0.0441 -0.53219,-0.13499 v -0.49325 q 0.264797,0.13759 0.521806,0.20768 0.257008,0.0675 0.508824,0.0675 0.337486,0 0.519209,-0.11423 0.181723,-0.11682 0.181723,-0.3271 0,-0.1947 -0.132398,-0.29855 -0.129802,-0.10384 -0.573726,-0.19989 l -0.166147,-0.0389 q -0.443923,-0.0935 -0.641223,-0.28557 -0.197299,-0.1947 -0.197299,-0.53219 0,-0.41017 0.290757,-0.63343 0.290757,-0.22326 0.825542,-0.22326 0.264797,0 0.498441,0.0389 0.233644,0.0389 0.430943,0.11682 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path3476" />
+ <path
+ d="m 44.368936,229.13955 v 0.23364 h -2.196254 q 0.03115,0.49325 0.295949,0.75286 0.267393,0.25701 0.742469,0.25701 0.275181,0 0.532189,-0.0675 0.259605,-0.0675 0.514017,-0.20249 v 0.45171 q -0.257008,0.10903 -0.526997,0.16615 -0.269989,0.0571 -0.547765,0.0571 -0.69574,0 -1.103319,-0.40498 -0.404983,-0.40499 -0.404983,-1.09554 0,-0.71391 0.384214,-1.13187 0.386811,-0.42056 1.041014,-0.42056 0.586706,0 0.926788,0.37902 0.342678,0.37643 0.342678,1.02544 z m -0.477672,-0.14019 q -0.0052,-0.392 -0.220664,-0.62564 -0.212876,-0.23365 -0.565938,-0.23365 -0.399791,0 -0.641223,0.22586 -0.238836,0.22585 -0.275181,0.63603 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path3478" />
+ <path
+ d="m 45.625422,226.97964 v 0.82554 h 0.983901 v 0.37124 h -0.983901 v 1.57839 q 0,0.35566 0.09605,0.45691 0.09865,0.10124 0.397194,0.10124 h 0.490653 v 0.39979 H 46.11867 q -0.552957,0 -0.763237,-0.20508 -0.210279,-0.20769 -0.210279,-0.75286 v -1.57839 h -0.350466 v -0.37124 h 0.350466 v -0.82554 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path3480" />
+ <path
+ d="m 50.840876,228.24651 v -1.5732 h 0.477673 v 4.03944 h -0.477673 v -0.43613 q -0.15057,0.2596 -0.381618,0.38681 -0.228452,0.12461 -0.550362,0.12461 -0.526997,0 -0.859291,-0.42056 -0.329697,-0.42056 -0.329697,-1.10592 0,-0.68535 0.329697,-1.10591 0.332294,-0.42056 0.859291,-0.42056 0.32191,0 0.550362,0.12721 0.231048,0.12461 0.381618,0.38421 z m -1.62772,1.01505 q 0,0.527 0.215472,0.82814 0.218068,0.29855 0.59709,0.29855 0.379023,0 0.597091,-0.29855 0.218067,-0.30114 0.218067,-0.82814 0,-0.52699 -0.218067,-0.82554 -0.218068,-0.30114 -0.597091,-0.30114 -0.379022,0 -0.59709,0.30114 -0.215472,0.29855 -0.215472,0.82554 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path3482" />
+ <path
+ d="m 54.78946,229.13955 v 0.23364 h -2.196254 q 0.03115,0.49325 0.295949,0.75286 0.267393,0.25701 0.742469,0.25701 0.275181,0 0.532189,-0.0675 0.259605,-0.0675 0.514017,-0.20249 v 0.45171 q -0.257008,0.10903 -0.526997,0.16615 -0.269988,0.0571 -0.547765,0.0571 -0.69574,0 -1.103319,-0.40498 -0.404983,-0.40499 -0.404983,-1.09554 0,-0.71391 0.384214,-1.13187 0.386811,-0.42056 1.041014,-0.42056 0.586706,0 0.926788,0.37902 0.342678,0.37643 0.342678,1.02544 z m -0.477672,-0.14019 q -0.0052,-0.392 -0.220664,-0.62564 -0.212875,-0.23365 -0.565938,-0.23365 -0.399791,0 -0.641223,0.22586 -0.238836,0.22585 -0.27518,0.63603 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path3484" />
+ <path
+ d="m 57.427042,227.89085 v 0.45171 q -0.202491,-0.10384 -0.420559,-0.15576 -0.218068,-0.0519 -0.451712,-0.0519 -0.355658,0 -0.534785,0.10903 -0.176531,0.10904 -0.176531,0.32711 0,0.16614 0.127206,0.2622 0.127206,0.0934 0.511421,0.17912 l 0.163551,0.0363 q 0.508825,0.10903 0.7217,0.30893 0.215472,0.1973 0.215472,0.55296 0,0.40498 -0.321909,0.64122 -0.319314,0.23624 -0.88006,0.23624 -0.233644,0 -0.488056,-0.0467 -0.251817,-0.0441 -0.532189,-0.13499 v -0.49325 q 0.264796,0.13759 0.521805,0.20768 0.257008,0.0675 0.508824,0.0675 0.337486,0 0.519209,-0.11423 0.181724,-0.11682 0.181724,-0.3271 0,-0.1947 -0.132399,-0.29855 -0.129802,-0.10384 -0.573726,-0.19989 l -0.166146,-0.0389 q -0.443924,-0.0935 -0.641224,-0.28557 -0.197299,-0.1947 -0.197299,-0.53219 0,-0.41017 0.290757,-0.63343 0.290757,-0.22326 0.825542,-0.22326 0.264797,0 0.498441,0.0389 0.233644,0.0389 0.430943,0.11682 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path3486" />
+ <path
+ d="m 60.435858,227.91681 v 0.44652 q -0.202492,-0.11163 -0.407579,-0.16614 -0.202492,-0.0571 -0.410175,-0.0571 -0.464692,0 -0.721701,0.29595 -0.257008,0.29335 -0.257008,0.82554 0,0.53219 0.257008,0.82814 0.257009,0.29336 0.721701,0.29336 0.207683,0 0.410175,-0.0545 0.205087,-0.0571 0.407579,-0.16874 v 0.44132 q -0.199895,0.0935 -0.415367,0.14019 -0.212876,0.0467 -0.454308,0.0467 -0.656799,0 -1.04361,-0.41277 -0.386811,-0.41277 -0.386811,-1.11371 0,-0.71131 0.389407,-1.11889 0.392003,-0.40758 1.072166,-0.40758 0.220664,0 0.430944,0.0467 0.21028,0.0441 0.407579,0.13499 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path3488" />
+ <path
+ d="m 62.951426,228.2517 q -0.08048,-0.0467 -0.176531,-0.0675 -0.09346,-0.0234 -0.207683,-0.0234 -0.404984,0 -0.623051,0.2648 -0.215472,0.2622 -0.215472,0.75545 v 1.53166 h -0.480268 v -2.90757 h 0.480268 v 0.45171 q 0.150571,-0.26479 0.392003,-0.392 0.241432,-0.1298 0.586706,-0.1298 0.04933,0 0.109034,0.008 0.05971,0.005 0.132398,0.0182 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path3490" />
+ <path
+ d="m 63.452462,227.80518 h 0.477672 v 2.90757 h -0.477672 z m 0,-1.13187 h 0.477672 v 0.60488 h -0.477672 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path3492" />
+ <path
+ d="m 65.391708,230.27662 v 1.54205 H 64.91144 v -4.01349 h 0.480268 v 0.44133 q 0.150571,-0.2596 0.379023,-0.38421 0.231048,-0.12721 0.550361,-0.12721 0.529593,0 0.859291,0.42056 0.332294,0.42056 0.332294,1.10591 0,0.68536 -0.332294,1.10592 -0.329698,0.42056 -0.859291,0.42056 -0.319313,0 -0.550361,-0.12461 -0.228452,-0.12721 -0.379023,-0.38681 z m 1.625124,-1.01506 q 0,-0.52699 -0.218067,-0.82554 -0.215472,-0.30114 -0.594495,-0.30114 -0.379022,0 -0.59709,0.30114 -0.215472,0.29855 -0.215472,0.82554 0,0.527 0.215472,0.82814 0.218068,0.29855 0.59709,0.29855 0.379023,0 0.594495,-0.29855 0.218067,-0.30114 0.218067,-0.82814 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path3494" />
+ <path
+ d="m 68.776951,226.97964 v 0.82554 h 0.983901 v 0.37124 h -0.983901 v 1.57839 q 0,0.35566 0.09605,0.45691 0.09865,0.10124 0.397195,0.10124 h 0.490652 v 0.39979 H 69.2702 q -0.552958,0 -0.763237,-0.20508 -0.21028,-0.20769 -0.21028,-0.75286 v -1.57839 h -0.350466 v -0.37124 h 0.350466 v -0.82554 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path3496" />
+ <path
+ d="m 71.515778,228.14007 q -0.384215,0 -0.607475,0.30114 -0.22326,0.29855 -0.22326,0.82035 0,0.52181 0.220664,0.82295 0.22326,0.29855 0.610071,0.29855 0.381618,0 0.604878,-0.30115 0.22326,-0.30114 0.22326,-0.82035 0,-0.51661 -0.22326,-0.81775 -0.22326,-0.30374 -0.604878,-0.30374 z m 0,-0.40498 q 0.623051,0 0.978709,0.40498 0.355658,0.40499 0.355658,1.12149 0,0.71392 -0.355658,1.1215 -0.355658,0.40498 -0.978709,0.40498 -0.625647,0 -0.981305,-0.40498 -0.353062,-0.40758 -0.353062,-1.1215 0,-0.7165 0.353062,-1.12149 0.355658,-0.40498 0.981305,-0.40498 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path3498" />
+ <path
+ d="m 75.326773,228.2517 q -0.08048,-0.0467 -0.176531,-0.0675 -0.09346,-0.0234 -0.207683,-0.0234 -0.404983,0 -0.623051,0.2648 -0.215472,0.2622 -0.215472,0.75545 v 1.53166 h -0.480268 v -2.90757 h 0.480268 v 0.45171 q 0.150571,-0.26479 0.392003,-0.392 0.241432,-0.1298 0.586706,-0.1298 0.04932,0 0.109034,0.008 0.05971,0.005 0.132398,0.0182 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path3500" />
+ <path
+ d="m 77.681384,227.89085 v 0.45171 q -0.202492,-0.10384 -0.42056,-0.15576 -0.218068,-0.0519 -0.451712,-0.0519 -0.355658,0 -0.534785,0.10903 -0.176531,0.10904 -0.176531,0.32711 0,0.16614 0.127206,0.2622 0.127207,0.0934 0.511421,0.17912 l 0.163551,0.0363 q 0.508825,0.10903 0.7217,0.30893 0.215472,0.1973 0.215472,0.55296 0,0.40498 -0.321909,0.64122 -0.319314,0.23624 -0.88006,0.23624 -0.233644,0 -0.488056,-0.0467 -0.251816,-0.0441 -0.532189,-0.13499 v -0.49325 q 0.264796,0.13759 0.521805,0.20768 0.257008,0.0675 0.508825,0.0675 0.337485,0 0.519209,-0.11423 0.181723,-0.11682 0.181723,-0.3271 0,-0.1947 -0.132399,-0.29855 -0.129802,-0.10384 -0.573725,-0.19989 l -0.166147,-0.0389 q -0.443924,-0.0935 -0.641223,-0.28557 -0.1973,-0.1947 -0.1973,-0.53219 0,-0.41017 0.290757,-0.63343 0.290757,-0.22326 0.825542,-0.22326 0.264797,0 0.498441,0.0389 0.233644,0.0389 0.430944,0.11682 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path3502" />
+ <path
+ d="m 40.583903,233.31918 v 0.3972 h -0.456904 q -0.257009,0 -0.358254,0.10384 -0.09865,0.10384 -0.09865,0.37383 v 0.25701 h 0.786601 v 0.37123 h -0.786601 v 2.53634 h -0.480268 v -2.53634 h -0.456904 v -0.37123 h 0.456904 v -0.20249 q 0,-0.48546 0.225855,-0.70613 0.225856,-0.22326 0.716509,-0.22326 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path3504" />
+ <path
+ d="m 42.110377,234.78595 q -0.384215,0 -0.607475,0.30114 -0.223259,0.29854 -0.223259,0.82035 0,0.5218 0.220663,0.82295 0.22326,0.29854 0.610071,0.29854 0.381619,0 0.604878,-0.30114 0.22326,-0.30114 0.22326,-0.82035 0,-0.51661 -0.22326,-0.81775 -0.223259,-0.30374 -0.604878,-0.30374 z m 0,-0.40499 q 0.623051,0 0.978709,0.40499 0.355658,0.40498 0.355658,1.12149 0,0.71391 -0.355658,1.12149 -0.355658,0.40498 -0.978709,0.40498 -0.625647,0 -0.981305,-0.40498 -0.353062,-0.40758 -0.353062,-1.12149 0,-0.71651 0.353062,-1.12149 0.355658,-0.40499 0.981305,-0.40499 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path3506" />
+ <path
+ d="m 45.921371,234.89758 q -0.08048,-0.0467 -0.176531,-0.0675 -0.09346,-0.0234 -0.207684,-0.0234 -0.404983,0 -0.62305,0.26479 -0.215472,0.2622 -0.215472,0.75545 v 1.53167 h -0.480268 v -2.90757 h 0.480268 v 0.45171 q 0.150571,-0.2648 0.392003,-0.392 0.241432,-0.12981 0.586706,-0.12981 0.04932,0 0.109034,0.008 0.05971,0.005 0.132398,0.0182 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path3508" />
+ <path
+ d="m 48.112433,234.45106 h 0.477673 v 2.90757 h -0.477673 z m 0,-1.13188 h 0.477673 v 0.60488 h -0.477673 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path3510" />
+ <path
+ d="m 52.0065,235.6037 v 1.75493 h -0.477672 v -1.73935 q 0,-0.41277 -0.160955,-0.61786 -0.160955,-0.20509 -0.482864,-0.20509 -0.386811,0 -0.610071,0.24663 -0.22326,0.24662 -0.22326,0.67237 v 1.6433 H 49.57141 v -2.90757 h 0.480268 v 0.45171 q 0.171339,-0.2622 0.402387,-0.392 0.233644,-0.12981 0.537382,-0.12981 0.501036,0 0.758045,0.31153 0.257008,0.30893 0.257008,0.91121 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path3512" />
+ <path
+ d="m 55.376166,235.6037 v 1.75493 h -0.477672 v -1.73935 q 0,-0.41277 -0.160955,-0.61786 -0.160954,-0.20509 -0.482864,-0.20509 -0.386811,0 -0.610071,0.24663 -0.223259,0.24662 -0.223259,0.67237 v 1.6433 h -0.480269 v -2.90757 h 0.480269 v 0.45171 q 0.171339,-0.2622 0.402387,-0.392 0.233644,-0.12981 0.537381,-0.12981 0.501036,0 0.758045,0.31153 0.257008,0.30893 0.257008,0.91121 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path3514" />
+ <path
+ d="m 58.815927,235.78543 v 0.23364 h -2.196254 q 0.03115,0.49325 0.295949,0.75285 0.267392,0.25701 0.742469,0.25701 0.27518,0 0.532189,-0.0675 0.259604,-0.0675 0.514017,-0.20249 v 0.45171 q -0.257009,0.10904 -0.526997,0.16615 -0.269989,0.0571 -0.547766,0.0571 -0.69574,0 -1.103319,-0.40498 -0.404983,-0.40498 -0.404983,-1.09553 0,-0.71391 0.384215,-1.13188 0.38681,-0.42056 1.041014,-0.42056 0.586706,0 0.926788,0.37903 0.342678,0.37642 0.342678,1.02544 z m -0.477673,-0.14019 q -0.0052,-0.392 -0.220663,-0.62565 -0.212876,-0.23364 -0.565938,-0.23364 -0.399791,0 -0.641223,0.22585 -0.238836,0.22586 -0.275181,0.63603 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path3516" />
+ <path
+ d="m 61.284766,234.89758 q -0.08048,-0.0467 -0.176531,-0.0675 -0.09346,-0.0234 -0.207684,-0.0234 -0.404983,0 -0.623051,0.26479 -0.215471,0.2622 -0.215471,0.75545 v 1.53167 H 59.58176 v -2.90757 h 0.480269 v 0.45171 q 0.15057,-0.2648 0.392002,-0.392 0.241433,-0.12981 0.586707,-0.12981 0.04932,0 0.109034,0.008 0.05971,0.005 0.132398,0.0182 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path3518" />
+ <path
+ d="m 61.204288,235.68937 h 1.399268 v 0.42575 h -1.399268 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path3520" />
+ <path
+ d="m 63.364198,233.31918 h 0.477672 v 4.03945 h -0.477672 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path3522" />
+ <path
+ d="m 65.968029,234.78595 q -0.384214,0 -0.607474,0.30114 -0.22326,0.29854 -0.22326,0.82035 0,0.5218 0.220664,0.82295 0.22326,0.29854 0.61007,0.29854 0.381619,0 0.604879,-0.30114 0.22326,-0.30114 0.22326,-0.82035 0,-0.51661 -0.22326,-0.81775 -0.22326,-0.30374 -0.604879,-0.30374 z m 0,-0.40499 q 0.623051,0 0.978709,0.40499 0.355658,0.40498 0.355658,1.12149 0,0.71391 -0.355658,1.12149 -0.355658,0.40498 -0.978709,0.40498 -0.625647,0 -0.981305,-0.40498 -0.353062,-0.40758 -0.353062,-1.12149 0,-0.71651 0.353062,-1.12149 0.355658,-0.40499 0.981305,-0.40499 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path3524" />
+ <path
+ d="m 69.220875,234.78595 q -0.384215,0 -0.607474,0.30114 -0.22326,0.29854 -0.22326,0.82035 0,0.5218 0.220664,0.82295 0.223259,0.29854 0.61007,0.29854 0.381619,0 0.604879,-0.30114 0.223259,-0.30114 0.223259,-0.82035 0,-0.51661 -0.223259,-0.81775 -0.22326,-0.30374 -0.604879,-0.30374 z m 0,-0.40499 q 0.623051,0 0.978709,0.40499 0.355658,0.40498 0.355658,1.12149 0,0.71391 -0.355658,1.12149 -0.355658,0.40498 -0.978709,0.40498 -0.625647,0 -0.981305,-0.40498 -0.353062,-0.40758 -0.353062,-1.12149 0,-0.71651 0.353062,-1.12149 0.355658,-0.40499 0.981305,-0.40499 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path3526" />
+ <path
+ d="m 71.80913,236.92249 v 1.54205 h -0.480269 v -4.01348 h 0.480269 v 0.44133 q 0.15057,-0.25961 0.379022,-0.38422 0.231048,-0.12721 0.550362,-0.12721 0.529593,0 0.85929,0.42056 0.332294,0.42056 0.332294,1.10592 0,0.68536 -0.332294,1.10591 -0.329697,0.42056 -0.85929,0.42056 -0.319314,0 -0.550362,-0.12461 -0.228452,-0.1272 -0.379022,-0.38681 z m 1.625124,-1.01505 q 0,-0.527 -0.218068,-0.82554 -0.215472,-0.30114 -0.594494,-0.30114 -0.379023,0 -0.597091,0.30114 -0.215471,0.29854 -0.215471,0.82554 0,0.527 0.215471,0.82814 0.218068,0.29854 0.597091,0.29854 0.379022,0 0.594494,-0.29854 0.218068,-0.30114 0.218068,-0.82814 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path3528" />
+ <path
+ d="m 76.604025,236.69923 h 0.550361 v 0.6594 h -0.550361 z m 1.767907,0 h 0.552957 v 0.6594 h -0.552957 z m -3.53841,0 h 0.552958 v 0.6594 h -0.552958 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path3530" />
+ </g>
+ <g
+ aria-label="&lt;U5"
+ id="text4378"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:6.7452px;line-height:1.25;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';letter-spacing:0px;word-spacing:0px;stroke-width:0.505891">
+ <path
+ d="m 52.591689,250.86752 0.408171,0.64685 -2.314122,1.37671 2.314122,1.36634 -0.432385,0.65376 -2.670407,-1.66382 v -0.71256 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path3617" />
+ <path
+ d="m 57.30986,250.27602 v 3.19964 q 0,0.48773 -0.197167,0.87169 -0.197167,0.3805 -0.581125,0.59842 -0.380498,0.21792 -0.93741,0.21792 -0.56037,0 -0.940869,-0.211 -0.380498,-0.21446 -0.574207,-0.59496 -0.193708,-0.3805 -0.193708,-0.88207 v -3.19964 h 0.947787 v 2.9333 q 0,0.61225 0.166036,0.92011 0.166036,0.3044 0.594961,0.3044 0.432385,0 0.59842,-0.3044 0.166036,-0.30786 0.166036,-0.92011 v -2.9333 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path3619" />
+ <path
+ d="m 61.166722,250.27602 -0.107232,0.67106 h -1.79872 v 1.19684 q 0.190249,-0.0934 0.380499,-0.13145 0.190249,-0.038 0.366662,-0.038 0.377039,0 0.677979,0.18334 0.30094,0.18333 0.477352,0.52923 0.176413,0.34245 0.176413,0.82326 0,0.48082 -0.22484,0.8544 -0.221381,0.37358 -0.622634,0.58804 -0.401252,0.211 -0.940868,0.211 -0.48773,0 -0.868229,-0.17987 -0.377039,-0.17987 -0.646847,-0.48427 l 0.532698,-0.49465 q 0.377039,0.44622 0.930491,0.44622 0.411631,0 0.653766,-0.24905 0.242135,-0.24905 0.242135,-0.68836 0,-0.48773 -0.204085,-0.68835 -0.204086,-0.20063 -0.518862,-0.20063 -0.311317,0 -0.643388,0.15912 h -0.639929 v -2.50783 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path3621" />
+ </g>
+ <g
+ aria-label="&lt;U8"
+ id="text4382"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:6.7452px;line-height:1.25;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';letter-spacing:0px;word-spacing:0px;stroke-width:0.505891">
+ <path
+ d="m 103.47904,251.31064 0.40817,0.64684 -2.31412,1.37672 2.31412,1.36633 -0.43239,0.65377 -2.6704,-1.66382 v -0.71257 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path3708" />
+ <path
+ d="m 108.19721,250.71913 v 3.19965 q 0,0.48773 -0.19717,0.87169 -0.19717,0.3805 -0.58112,0.59842 -0.3805,0.21792 -0.93741,0.21792 -0.56037,0 -0.94087,-0.211 -0.3805,-0.21447 -0.57421,-0.59497 -0.19371,-0.38049 -0.19371,-0.88206 v -3.19965 h 0.94779 v 2.9333 q 0,0.61226 0.16604,0.92011 0.16603,0.3044 0.59496,0.3044 0.43238,0 0.59842,-0.3044 0.16603,-0.30785 0.16603,-0.92011 v -2.9333 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path3710" />
+ <path
+ d="m 112.17168,251.86409 q 0,0.33899 -0.19371,0.58458 -0.19025,0.2456 -0.57767,0.46352 0.96163,0.4566 0.96163,1.29715 0,0.37704 -0.20063,0.69528 -0.20063,0.31823 -0.5915,0.51194 -0.38742,0.19025 -0.95125,0.19025 -0.56037,0 -0.94087,-0.18679 -0.38049,-0.19025 -0.5742,-0.50157 -0.19371,-0.31131 -0.19371,-0.68489 0,-0.42201 0.24559,-0.72641 0.24906,-0.3044 0.66415,-0.48773 -0.37358,-0.21446 -0.54654,-0.46006 -0.17295,-0.24905 -0.17295,-0.6503 0,-0.41855 0.21446,-0.70566 0.21792,-0.29056 0.56729,-0.4393 0.35283,-0.14874 0.75754,-0.14874 0.42546,0 0.77137,0.14528 0.34937,0.14182 0.55345,0.42201 0.20755,0.28018 0.20755,0.68144 z m -2.19652,0.0484 q 0,0.31132 0.20755,0.4739 0.211,0.15912 0.61571,0.3044 0.26981,-0.17988 0.38396,-0.35629 0.11415,-0.17987 0.11415,-0.42201 0,-0.29402 -0.16949,-0.47389 -0.16604,-0.18333 -0.48773,-0.18333 -0.31478,0 -0.49119,0.16949 -0.17296,0.1695 -0.17296,0.48773 z m 1.46319,2.29683 q 0,-0.26635 -0.12106,-0.42892 -0.11761,-0.16258 -0.34937,-0.27673 -0.23176,-0.11415 -0.57421,-0.23522 -0.23867,0.13491 -0.40125,0.35629 -0.15912,0.22138 -0.15912,0.56729 0,0.33553 0.20063,0.53961 0.20063,0.20409 0.60188,0.20409 0.40471,0 0.60188,-0.21101 0.20062,-0.21446 0.20062,-0.5154 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path3712" />
+ </g>
+ <g
+ aria-label="&lt;U13"
+ id="text4386"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:6.7452px;line-height:1.25;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';letter-spacing:0px;word-spacing:0px;stroke-width:0.505891">
+ <path
+ d="m 155.87082,251.16984 0.40817,0.64685 -2.31412,1.37671 2.31412,1.36634 -0.43238,0.65376 -2.67041,-1.66381 v -0.71257 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path3799" />
+ <path
+ d="m 160.58899,250.57834 v 3.19965 q 0,0.48773 -0.19716,0.87168 -0.19717,0.3805 -0.58113,0.59842 -0.3805,0.21793 -0.93741,0.21793 -0.56037,0 -0.94087,-0.21101 -0.3805,-0.21446 -0.5742,-0.59496 -0.19371,-0.3805 -0.19371,-0.88206 v -3.19965 h 0.94778 v 2.9333 q 0,0.61225 0.16604,0.92011 0.16604,0.3044 0.59496,0.3044 0.43239,0 0.59842,-0.3044 0.16604,-0.30786 0.16604,-0.92011 v -2.9333 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path3801" />
+ <path
+ d="m 164.68107,254.66005 v 0.70219 h -2.98518 v -0.70219 h 1.15879 v -3.1616 l -1.02043,0.63302 -0.39087,-0.63302 1.50123,-0.92011 h 0.80597 v 4.08171 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path3803" />
+ <path
+ d="m 166.97789,250.47457 q 0.49119,0 0.84401,0.16603 0.35283,0.16258 0.53962,0.43931 0.18679,0.27672 0.18679,0.60879 0,0.44968 -0.26981,0.74025 -0.26981,0.2871 -0.69181,0.39433 0.31477,0.038 0.56383,0.17295 0.25251,0.13145 0.40125,0.3805 0.14874,0.24906 0.14874,0.62956 0,0.40471 -0.21792,0.73678 -0.21792,0.33207 -0.61918,0.52924 -0.39779,0.19371 -0.94433,0.19371 -0.49118,0 -0.90627,-0.17296 -0.41163,-0.17641 -0.7022,-0.5154 l 0.53616,-0.48427 q 0.20409,0.23868 0.46698,0.34937 0.26635,0.11069 0.55345,0.11069 0.40471,0 0.64685,-0.20755 0.24559,-0.211 0.24559,-0.5915 0,-0.42547 -0.23868,-0.60188 -0.23521,-0.17987 -0.63301,-0.17987 h -0.42546 l 0.10723,-0.65031 h 0.30094 q 0.32515,0 0.55345,-0.16949 0.23176,-0.17296 0.23176,-0.52924 0,-0.31132 -0.21792,-0.48427 -0.21793,-0.17642 -0.54654,-0.17642 -0.29748,0 -0.52924,0.11069 -0.23175,0.1107 -0.44968,0.31478 l -0.47389,-0.50157 q 0.63647,-0.61225 1.53929,-0.61225 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path3805" />
+ </g>
+ <path
+ id="rect833"
+ style="fill:none;stroke:#cccccc;stroke-width:1.412;stroke-linecap:round;stroke-miterlimit:10"
+ d="M 29.071695,65.16613 H 187.97085 V 89.509815 H 29.071695 Z" />
+ <g
+ aria-label="User Input"
+ id="text841"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#8f8f8f;fill-opacity:1;stroke-width:0.398752">
+ <path
+ d="m -14.303797,74.371016 h 1.193726 v 2.775024 q 0,0.573609 0.186035,0.821656 0.189135,0.244946 0.613916,0.244946 0.427881,0 0.613916,-0.244946 0.189135,-0.248047 0.189135,-0.821656 v -2.775024 h 1.193726 v 2.775024 q 0,0.982886 -0.492993,1.463477 -0.492993,0.480591 -1.503784,0.480591 -1.007691,0 -1.500684,-0.480591 -0.492993,-0.480591 -0.492993,-1.463477 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#8f8f8f;fill-opacity:1;stroke-width:0.398752"
+ id="path3977" />
+ <path
+ d="m -6.4841194,75.636055 v 0.843359 q -0.3565674,-0.148828 -0.68833,-0.223242 -0.3317627,-0.07441 -0.6263184,-0.07441 -0.3162598,0 -0.471289,0.08061 -0.1519288,0.07752 -0.1519288,0.241846 0,0.133325 0.1147217,0.204639 0.1178223,0.07131 0.4185791,0.10542 l 0.1953369,0.02791 q 0.8526611,0.10852 1.1472168,0.356567 0.2945557,0.248047 0.2945557,0.778247 0,0.555005 -0.4092774,0.834058 -0.4092773,0.279053 -1.2216308,0.279053 -0.344165,0 -0.7131348,-0.05581 -0.3658691,-0.05271 -0.7534423,-0.16123 v -0.84336 q 0.3317627,0.161231 0.6790283,0.241846 0.3503662,0.08062 0.7100341,0.08062 0.3255616,0 0.4898926,-0.08992 0.1643311,-0.08992 0.1643311,-0.26665 0,-0.148828 -0.1147217,-0.220142 -0.1116211,-0.07441 -0.449585,-0.114721 l -0.1953369,-0.02481 q -0.74104,-0.09302 -1.0386963,-0.344165 -0.2976562,-0.251148 -0.2976562,-0.762744 0,-0.551905 0.3782715,-0.818555 0.3782715,-0.26665 1.1596191,-0.26665 0.306958,0 0.6449219,0.04651 0.3379638,0.04651 0.7348388,0.145727 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#8f8f8f;fill-opacity:1;stroke-width:0.398752"
+ id="path3979" />
+ <path
+ d="m -1.951063,77.254561 v 0.31626 h -2.5951904 q 0.040308,0.390673 0.2821533,0.58601 0.2418457,0.195337 0.6759277,0.195337 0.3503662,0 0.7162354,-0.102319 0.3689697,-0.10542 0.7565429,-0.31626 v 0.855762 q -0.3937744,0.148828 -0.7875488,0.223242 -0.3937744,0.07752 -0.7875488,0.07752 -0.9425781,0 -1.4665771,-0.477491 -0.5208985,-0.48059 -0.5208985,-1.345654 0,-0.84956 0.5115967,-1.336352 0.5146973,-0.486792 1.4138672,-0.486792 0.8185546,0 1.3084472,0.492993 0.4929932,0.492993 0.4929932,1.317749 z m -1.1410156,-0.36897 q 0,-0.31626 -0.1860352,-0.508496 -0.1829346,-0.195337 -0.4805908,-0.195337 -0.3224609,0 -0.523999,0.182935 -0.2015381,0.179834 -0.2511475,0.520898 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#8f8f8f;fill-opacity:1;stroke-width:0.398752"
+ id="path3981" />
+ <path
+ d="M 1.4688835,76.473213 Q 1.3231559,76.405 1.1774284,76.373994 q -0.142627,-0.03411 -0.2883545,-0.03411 -0.42788085,0 -0.6604248,0.275952 -0.22944335261,0.272852 -0.22944335261,0.784448 v 1.599903 H -1.110804 v -3.472656 h 1.11000974739 v 0.570507 Q 0.21314617,75.756978 0.48909832,75.601949 q 0.27905273,-0.15813 0.66662598,-0.15813 0.05581,0 0.1209228,0.0062 0.065112,0.0031 0.1891358,0.0186 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#8f8f8f;fill-opacity:1;stroke-width:0.398752"
+ id="path3983" />
+ <path
+ d="m 4.2811144,74.371016 h 1.1937255 v 4.629175 H 4.2811144 Z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#8f8f8f;fill-opacity:1;stroke-width:0.398752"
+ id="path3985" />
+ <path
+ d="m 10.085411,76.885591 v 2.1146 H 8.9691999 v -0.344165 -1.274341 q 0,-0.449585 -0.021704,-0.620117 -0.018604,-0.170533 -0.068213,-0.251148 -0.065112,-0.10852 -0.1767334,-0.167431 -0.1116211,-0.06201 -0.254248,-0.06201 -0.3472657,0 -0.5457032,0.269751 -0.1984375,0.26665 -0.1984375,0.74104 v 1.708423 H 6.5941511 v -3.472656 h 1.1100097 v 0.508496 q 0.2511475,-0.303858 0.5333008,-0.446485 0.2821533,-0.145727 0.6232178,-0.145727 0.6015136,0 0.9115722,0.368969 0.3131594,0.36897 0.3131594,1.072803 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#8f8f8f;fill-opacity:1;stroke-width:0.398752"
+ id="path3987" />
+ <path
+ d="m 12.224816,78.497896 v 1.823144 h -1.11001 v -4.793505 h 1.11001 v 0.508496 q 0.229443,-0.303858 0.508496,-0.446485 0.279052,-0.145727 0.641821,-0.145727 0.641821,0 1.054199,0.511596 0.412378,0.508496 0.412378,1.311548 0,0.803052 -0.412378,1.314649 -0.412378,0.508496 -1.054199,0.508496 -0.362769,0 -0.641821,-0.142627 -0.279053,-0.145728 -0.508496,-0.449585 z m 0.737939,-2.247925 q -0.356567,0 -0.548804,0.26355 -0.189135,0.260449 -0.189135,0.753442 0,0.492993 0.189135,0.756543 0.192237,0.260449 0.548804,0.260449 0.356567,0 0.542602,-0.260449 0.189136,-0.260449 0.189136,-0.756543 0,-0.496094 -0.189136,-0.756543 -0.186035,-0.260449 -0.542602,-0.260449 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#8f8f8f;fill-opacity:1;stroke-width:0.398752"
+ id="path3989" />
+ <path
+ d="m 15.623058,77.648335 v -2.1208 h 1.116211 V 75.8748 q 0,0.282153 -0.0031,0.710034 -0.0031,0.424781 -0.0031,0.567408 0,0.418579 0.0217,0.604614 0.0217,0.182934 0.07441,0.26665 0.06821,0.108521 0.176734,0.167432 0.111621,0.05891 0.254248,0.05891 0.347265,0 0.545703,-0.26665 0.198437,-0.266651 0.198437,-0.74104 v -1.714624 h 1.11001 v 3.472656 h -1.11001 v -0.502295 q -0.251147,0.303857 -0.5333,0.449585 -0.279053,0.142627 -0.617017,0.142627 -0.601514,0 -0.917773,-0.36897 -0.31316,-0.36897 -0.31316,-1.072803 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#8f8f8f;fill-opacity:1;stroke-width:0.398752"
+ id="path3991" />
+ <path
+ d="m 21.393247,74.541548 v 0.985987 h 1.144117 v 0.79375 h -1.144117 v 1.472778 q 0,0.241846 0.09612,0.328662 0.09612,0.08372 0.381372,0.08372 h 0.570507 v 0.79375 h -0.951879 q -0.657325,0 -0.933277,-0.272852 -0.272851,-0.275952 -0.272851,-0.933276 v -1.472778 h -0.551905 v -0.79375 h 0.551905 v -0.985987 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#8f8f8f;fill-opacity:1;stroke-width:0.398752"
+ id="path3993" />
+ </g>
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path910"
+ d="M 31.352669,92.208912 V 194.08332"
+ style="fill:none;stroke:#00b200;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Send)" />
+ <path
+ id="path1730"
+ style="fill:none;fill-opacity:0.483526;stroke:#00b200;stroke-width:1.2;stroke-linecap:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker7096)"
+ d="m 31.352669,146.65942 h 51.793437 v 4.50227"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="fill:none;stroke:#00b200;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Send-5)"
+ d="M 83.488644,92.208912 V 102.42617"
+ id="path910-2"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path2175"
+ d="m 35.539436,181.16793 v 12.91539"
+ style="fill:none;stroke:#206120;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker2179)" />
+ <path
+ id="rect833-3"
+ style="opacity:0.8;fill:#ffffff;stroke:#800000;stroke-width:1.412;stroke-linecap:round;stroke-miterlimit:10;stroke-opacity:1"
+ d="M 28.977177,106.27831 H 187.87633 V 130.622 H 28.977177 Z" />
+ <g
+ aria-label="Input/Output
+Operands"
+ id="text841-6"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#800000;fill-opacity:0.8;stroke-width:0.398751">
+ <path
+ d="m -22.961561,112.90403 h 1.193725 v 4.62917 h -1.193725 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#800000;fill-opacity:0.8;stroke-width:0.398751"
+ id="path4165" />
+ <path
+ d="m -17.157265,115.4186 v 2.1146 h -1.116211 v -0.34416 -1.27434 q 0,-0.44959 -0.0217,-0.62012 -0.0186,-0.17053 -0.06821,-0.25115 -0.06511,-0.10852 -0.176733,-0.16743 -0.111621,-0.062 -0.254248,-0.062 -0.347266,0 -0.545703,0.26975 -0.198438,0.26665 -0.198438,0.74104 v 1.70842 h -1.110009 v -3.47265 h 1.110009 v 0.50849 q 0.251148,-0.30385 0.533301,-0.44648 0.282154,-0.14573 0.623218,-0.14573 0.601514,0 0.911572,0.36897 0.313159,0.36897 0.313159,1.0728 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#800000;fill-opacity:0.8;stroke-width:0.398751"
+ id="path4167" />
+ <path
+ d="m -15.01786,117.03091 v 1.82314 h -1.11001 v -4.7935 h 1.11001 v 0.50849 q 0.229443,-0.30385 0.508496,-0.44648 0.279053,-0.14573 0.641821,-0.14573 0.641822,0 1.054199,0.5116 0.412378,0.50849 0.412378,1.31155 0,0.80305 -0.412378,1.31464 -0.412377,0.5085 -1.054199,0.5085 -0.362768,0 -0.641821,-0.14263 -0.279053,-0.14572 -0.508496,-0.44958 z m 0.737939,-2.24793 q -0.356567,0 -0.548803,0.26355 -0.189136,0.26045 -0.189136,0.75345 0,0.49299 0.189136,0.75654 0.192236,0.26045 0.548803,0.26045 0.356568,0 0.542603,-0.26045 0.189136,-0.26045 0.189136,-0.75654 0,-0.4961 -0.189136,-0.75655 -0.186035,-0.26045 -0.542603,-0.26045 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#800000;fill-opacity:0.8;stroke-width:0.398751"
+ id="path4169" />
+ <path
+ d="m -11.619618,116.18135 v -2.1208 h 1.116211 v 0.34726 q 0,0.28216 -0.0031,0.71004 -0.0031,0.42478 -0.0031,0.5674 0,0.41858 0.0217,0.60462 0.0217,0.18293 0.07441,0.26665 0.06821,0.10852 0.176733,0.16743 0.111621,0.0589 0.2542482,0.0589 0.3472657,0 0.5457032,-0.26665 0.1984375,-0.26665 0.1984375,-0.74104 v -1.71462 h 1.1100097 v 3.47265 h -1.1100097 v -0.50229 q -0.2511475,0.30386 -0.5333008,0.44958 -0.2790531,0.14263 -0.6170171,0.14263 -0.601513,0 -0.917773,-0.36897 -0.313159,-0.36897 -0.313159,-1.0728 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#800000;fill-opacity:0.8;stroke-width:0.398751"
+ id="path4171" />
+ <path
+ d="m -5.8494283,113.07456 v 0.98599 h 1.1441162 v 0.79375 h -1.1441162 v 1.47278 q 0,0.24184 0.096118,0.32866 0.096118,0.0837 0.3813721,0.0837 h 0.5705078 v 0.79375 h -0.9518799 q -0.6573242,0 -0.9332764,-0.27285 -0.2728515,-0.27595 -0.2728515,-0.93327 v -1.47278 h -0.5519043 v -0.79375 h 0.5519043 v -0.98599 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#800000;fill-opacity:0.8;stroke-width:0.398751"
+ id="path4173" />
+ <path
+ d="m -2.9286771,112.90403 h 0.6883301 l -1.6340088,5.21828 h -0.6852295 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#800000;fill-opacity:0.8;stroke-width:0.398751"
+ id="path4175" />
+ <path
+ d="m 0.45716313,113.68538 q -0.54570312,0 -0.84645995,0.40307 -0.30075683,0.40308 -0.30075683,1.13482 0,0.72863 0.30075683,1.13171 0.30075683,0.40308 0.84645995,0.40308 0.54880367,0 0.84956057,-0.40308 0.3007568,-0.40308 0.3007568,-1.13171 0,-0.73174 -0.3007568,-1.13482 -0.3007569,-0.40307 -0.84956057,-0.40307 z m 0,-0.86507 q 1.11621097,0 1.74873047,0.63872 0.6325195,0.63872 0.6325195,1.76424 0,1.12241 -0.6325195,1.76113 -0.6325195,0.63872 -1.74873047,0.63872 -1.11311033,0 -1.74873043,-0.63872 -0.6325195,-0.63872 -0.6325195,-1.76113 0,-1.12552 0.6325195,-1.76424 0.6356201,-0.63872 1.74873043,-0.63872 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#800000;fill-opacity:0.8;stroke-width:0.398751"
+ id="path4177" />
+ <path
+ d="m 3.653868,116.18135 v -2.1208 h 1.1162109 v 0.34726 q 0,0.28216 -0.0031,0.71004 -0.0031,0.42478 -0.0031,0.5674 0,0.41858 0.021704,0.60462 0.021704,0.18293 0.074414,0.26665 0.068213,0.10852 0.1767334,0.16743 0.1116211,0.0589 0.2542481,0.0589 0.3472656,0 0.5457031,-0.26665 0.1984375,-0.26665 0.1984375,-0.74104 v -1.71462 h 1.1100097 v 3.47265 H 6.035118 v -0.50229 q -0.2511475,0.30386 -0.5333008,0.44958 -0.2790527,0.14263 -0.6170166,0.14263 -0.6015136,0 -0.9177734,-0.36897 -0.3131592,-0.36897 -0.3131592,-1.0728 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#800000;fill-opacity:0.8;stroke-width:0.398751"
+ id="path4179" />
+ <path
+ d="m 9.4240588,113.07456 v 0.98599 h 1.1441162 v 0.79375 H 9.4240588 v 1.47278 q 0,0.24184 0.096118,0.32866 0.096118,0.0837 0.381372,0.0837 h 0.570508 v 0.79375 h -0.95188 q -0.6573242,0 -0.9332764,-0.27285 -0.2728515,-0.27595 -0.2728515,-0.93327 V 114.8543 H 7.7621448 v -0.79375 h 0.5519043 v -0.98599 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#800000;fill-opacity:0.8;stroke-width:0.398751"
+ id="path4181" />
+ <path
+ d="m 12.357212,117.03091 v 1.82314 h -1.110009 v -4.7935 h 1.110009 v 0.50849 q 0.229444,-0.30385 0.508496,-0.44648 0.279053,-0.14573 0.641822,-0.14573 0.641821,0 1.054199,0.5116 0.412378,0.50849 0.412378,1.31155 0,0.80305 -0.412378,1.31464 -0.412378,0.5085 -1.054199,0.5085 -0.362769,0 -0.641822,-0.14263 -0.279052,-0.14572 -0.508496,-0.44958 z m 0.73794,-2.24793 q -0.356568,0 -0.548804,0.26355 -0.189136,0.26045 -0.189136,0.75345 0,0.49299 0.189136,0.75654 0.192236,0.26045 0.548804,0.26045 0.356567,0 0.542602,-0.26045 0.189136,-0.26045 0.189136,-0.75654 0,-0.4961 -0.189136,-0.75655 -0.186035,-0.26045 -0.542602,-0.26045 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#800000;fill-opacity:0.8;stroke-width:0.398751"
+ id="path4183" />
+ <path
+ d="m 15.755455,116.18135 v -2.1208 h 1.116211 v 0.34726 q 0,0.28216 -0.0031,0.71004 -0.0031,0.42478 -0.0031,0.5674 0,0.41858 0.0217,0.60462 0.0217,0.18293 0.07441,0.26665 0.06821,0.10852 0.176734,0.16743 0.111621,0.0589 0.254248,0.0589 0.347265,0 0.545703,-0.26665 0.198437,-0.26665 0.198437,-0.74104 v -1.71462 h 1.11001 v 3.47265 h -1.11001 v -0.50229 q -0.251147,0.30386 -0.5333,0.44958 -0.279053,0.14263 -0.617017,0.14263 -0.601514,0 -0.917774,-0.36897 -0.313159,-0.36897 -0.313159,-1.0728 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#800000;fill-opacity:0.8;stroke-width:0.398751"
+ id="path4185" />
+ <path
+ d="m 21.525644,113.07456 v 0.98599 h 1.144116 v 0.79375 h -1.144116 v 1.47278 q 0,0.24184 0.09612,0.32866 0.09612,0.0837 0.381372,0.0837 h 0.570508 v 0.79375 h -0.95188 q -0.657324,0 -0.933276,-0.27285 -0.272852,-0.27595 -0.272852,-0.93327 V 114.8543 H 19.86373 v -0.79375 h 0.551904 v -0.98599 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#800000;fill-opacity:0.8;stroke-width:0.398751"
+ id="path4187" />
+ <path
+ d="m -8.999623,121.62288 q -0.5457031,0 -0.84646,0.40307 -0.300757,0.40308 -0.300757,1.13482 0,0.72863 0.300757,1.13171 0.3007569,0.40308 0.84646,0.40308 0.5488037,0 0.8495605,-0.40308 0.3007569,-0.40308 0.3007569,-1.13171 0,-0.73174 -0.3007569,-1.13482 -0.3007568,-0.40307 -0.8495605,-0.40307 z m 0,-0.86507 q 1.1162109,0 1.7487304,0.63872 0.6325196,0.63872 0.6325196,1.76424 0,1.12241 -0.6325196,1.76113 -0.6325195,0.63872 -1.7487304,0.63872 -1.11311,0 -1.74873,-0.63872 -0.63252,-0.63872 -0.63252,-1.76113 0,-1.12552 0.63252,-1.76424 0.63562,-0.63872 1.74873,-0.63872 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#800000;fill-opacity:0.8;stroke-width:0.398751"
+ id="path4189" />
+ <path
+ d="m -4.6557023,124.96841 v 1.82314 H -5.765712 v -4.7935 h 1.1100097 v 0.50849 q 0.2294434,-0.30385 0.5084961,-0.44648 0.2790527,-0.14573 0.6418213,-0.14573 0.6418213,0 1.0541992,0.5116 0.4123779,0.50849 0.4123779,1.31155 0,0.80305 -0.4123779,1.31464 -0.4123779,0.5085 -1.0541992,0.5085 -0.3627686,0 -0.6418213,-0.14263 -0.2790527,-0.14572 -0.5084961,-0.44958 z m 0.7379395,-2.24793 q -0.3565674,0 -0.5488037,0.26355 -0.1891358,0.26045 -0.1891358,0.75345 0,0.49299 0.1891358,0.75654 0.1922363,0.26045 0.5488037,0.26045 0.3565673,0 0.5426025,-0.26045 0.1891357,-0.26045 0.1891357,-0.75654 0,-0.4961 -0.1891357,-0.75655 -0.1860352,-0.26045 -0.5426025,-0.26045 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#800000;fill-opacity:0.8;stroke-width:0.398751"
+ id="path4191" />
+ <path
+ d="m 2.2462018,123.72507 v 0.31626 h -2.59519041 q 0.0403076,0.39068 0.28215332,0.58601 0.2418457,0.19534 0.67592772,0.19534 0.35036621,0 0.71623537,-0.10232 0.3689697,-0.10542 0.7565429,-0.31626 v 0.85576 q -0.3937744,0.14883 -0.7875488,0.22325 -0.39377439,0.0775 -0.7875488,0.0775 -0.94257811,0 -1.46657713,-0.47749 -0.52089847,-0.48059 -0.52089847,-1.34565 0,-0.84957 0.51159671,-1.33636 0.51469726,-0.48679 1.41386717,-0.48679 0.81855472,0 1.30844722,0.49299 0.4929932,0.493 0.4929932,1.31775 z M 1.1051862,123.3561 q 0,-0.31626 -0.18603518,-0.50849 -0.18293457,-0.19534 -0.48059081,-0.19534 -0.32246093,0 -0.52399902,0.18293 -0.20153808,0.17984 -0.25114745,0.5209 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#800000;fill-opacity:0.8;stroke-width:0.398751"
+ id="path4193" />
+ <path
+ d="m 5.6661473,122.94373 q -0.1457275,-0.0682 -0.2914551,-0.0992 -0.1426269,-0.0341 -0.2883544,-0.0341 -0.4278809,0 -0.6604248,0.27595 -0.2294434,0.27285 -0.2294434,0.78445 v 1.5999 H 3.0864599 v -3.47265 h 1.1100097 v 0.5705 q 0.2139404,-0.34106 0.4898926,-0.49609 0.2790527,-0.15813 0.6666259,-0.15813 0.055811,0 0.1209229,0.006 0.065112,0.003 0.1891357,0.0186 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#800000;fill-opacity:0.8;stroke-width:0.398751"
+ id="path4195" />
+ <path
+ d="m 7.7745458,123.90801 q -0.3472656,0 -0.523999,0.11782 -0.1736329,0.11782 -0.1736329,0.34727 0,0.21084 0.1395264,0.33176 0.142627,0.11782 0.3937744,0.11782 0.3131592,0 0.5270996,-0.22324 0.2139405,-0.22634 0.2139405,-0.56431 v -0.12712 z m 1.6960205,-0.41858 v 1.98127 H 8.3512548 v -0.51469 q -0.2232422,0.31626 -0.502295,0.46198 -0.2790527,0.14263 -0.6790283,0.14263 -0.5395019,0 -0.8774658,-0.31316 -0.3348633,-0.31626 -0.3348633,-0.81855 0,-0.61082 0.4185791,-0.89607 0.4216797,-0.28526 1.3208496,-0.28526 h 0.6542237 v -0.0868 q 0,-0.26355 -0.2077393,-0.38448 -0.2077393,-0.12402 -0.6480225,-0.12402 -0.3565673,0 -0.6635253,0.0713 -0.306958,0.0713 -0.5705078,0.21394 v -0.84646 q 0.3565673,-0.0868 0.7162353,-0.13022 0.359668,-0.0465 0.7193359,-0.0465 0.9394776,0 1.3549561,0.37207 0.4185791,0.36897 0.4185791,1.20303 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#800000;fill-opacity:0.8;stroke-width:0.398751"
+ id="path4197" />
+ <path
+ d="m 13.994321,123.3561 v 2.1146 H 12.87811 v -0.34416 -1.27434 q 0,-0.44959 -0.0217,-0.62012 -0.0186,-0.17053 -0.06821,-0.25115 -0.06511,-0.10852 -0.176734,-0.16743 -0.111621,-0.062 -0.254248,-0.062 -0.347265,0 -0.545703,0.26975 -0.198437,0.26665 -0.198437,0.74104 v 1.70842 h -1.11001 v -3.47265 h 1.11001 v 0.50849 q 0.251147,-0.30385 0.533301,-0.44648 0.282153,-0.14573 0.623217,-0.14573 0.601514,0 0.911573,0.36897 0.313159,0.36897 0.313159,1.0728 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#800000;fill-opacity:0.8;stroke-width:0.398751"
+ id="path4199" />
+ <path
+ d="m 17.386362,122.50654 v -1.86035 h 1.116211 v 4.82451 h -1.116211 v -0.50229 q -0.229443,0.30696 -0.505395,0.44958 -0.275952,0.14263 -0.638721,0.14263 -0.641821,0 -1.054199,-0.5085 -0.412378,-0.51159 -0.412378,-1.31464 0,-0.80306 0.412378,-1.31155 0.412378,-0.5116 1.054199,-0.5116 0.359668,0 0.63562,0.14573 0.279053,0.14263 0.508496,0.44648 z m -0.731738,2.24793 q 0.356567,0 0.542602,-0.26045 0.189136,-0.26045 0.189136,-0.75654 0,-0.4961 -0.189136,-0.75655 -0.186035,-0.26045 -0.542602,-0.26045 -0.353467,0 -0.542603,0.26045 -0.186035,0.26045 -0.186035,0.75655 0,0.49609 0.186035,0.75654 0.189136,0.26045 0.542603,0.26045 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#800000;fill-opacity:0.8;stroke-width:0.398751"
+ id="path4201" />
+ <path
+ d="m 22.282188,122.10657 v 0.84336 q -0.356567,-0.14883 -0.68833,-0.22325 -0.331763,-0.0744 -0.626318,-0.0744 -0.31626,0 -0.471289,0.0806 -0.151929,0.0775 -0.151929,0.24184 0,0.13333 0.114722,0.20464 0.117822,0.0713 0.418579,0.10542 l 0.195337,0.0279 q 0.852661,0.10852 1.147216,0.35656 0.294556,0.24805 0.294556,0.77825 0,0.555 -0.409277,0.83406 -0.409278,0.27905 -1.221631,0.27905 -0.344165,0 -0.713135,-0.0558 -0.365869,-0.0527 -0.753442,-0.16123 v -0.84336 q 0.331762,0.16123 0.679028,0.24185 0.350366,0.0806 0.710034,0.0806 0.325562,0 0.489893,-0.0899 0.164331,-0.0899 0.164331,-0.26665 0,-0.14882 -0.114722,-0.22014 -0.111621,-0.0744 -0.449585,-0.11472 l -0.195337,-0.0248 q -0.74104,-0.093 -1.038696,-0.34417 -0.297656,-0.25115 -0.297656,-0.76274 0,-0.55191 0.378271,-0.81856 0.378272,-0.26665 1.159619,-0.26665 0.306958,0 0.644922,0.0465 0.337964,0.0465 0.734839,0.14573 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#800000;fill-opacity:0.8;stroke-width:0.398751"
+ id="path4203" />
+ </g>
+ <path
+ id="rect874"
+ style="fill:#00b200;fill-opacity:0.483526;stroke:none;stroke-width:1.09086;stroke-linecap:round;stroke-miterlimit:10"
+ d="M 37.217079,68.992058 H 76.53093 V 86.123404 H 37.217079 Z" />
+ <path
+ id="rect876"
+ style="opacity:0.5;fill:#ffc333;fill-opacity:0.46663;stroke:none;stroke-width:1.10816;stroke-linecap:round;stroke-miterlimit:10"
+ d="m 142.70969,68.95668 h 39.2278 v 17.717829 h -39.2278 z" />
+ <path
+ id="rect878"
+ style="fill:#00b200;fill-opacity:0.483526;stroke:none;stroke-width:1.09086;stroke-linecap:round;stroke-miterlimit:10"
+ d="M 89.303658,69.390724 H 128.61751 V 86.52207 H 89.303658 Z" />
+ <g
+ aria-label="+"
+ id="text882"
+ style="font-size:12.4527px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;stroke-width:0.933951">
+ <path
+ d="m 83.42805,73.926712 v 3.386793 h 3.386794 v 1.033672 H 83.42805 v 3.386794 h -1.021511 v -3.386794 h -3.386793 v -1.033672 h 3.386793 v -3.386793 z"
+ style="stroke-width:0.933951"
+ id="path4545" />
+ </g>
+ <g
+ aria-label="→"
+ id="text886"
+ style="font-size:12.4527px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;stroke-width:0.933951">
+ <path
+ d="m 140.22087,78.27577 v 0.547238 l -2.3896,2.389605 -0.72965,-0.729651 1.41673,-1.416738 h -7.41203 v -1.033671 h 7.41203 l -1.41673,-1.416738 0.72965,-0.72965 z"
+ style="stroke-width:0.933951"
+ id="path4632" />
+ </g>
+ <path
+ id="rect888"
+ style="opacity:0.6;fill:#ffffff;stroke:#000080;stroke-width:1.412;stroke-linecap:round;stroke-miterlimit:10;stroke-opacity:0.5"
+ d="M 28.168863,154.17207 H 187.06802 v 24.34369 H 28.168863 Z" />
+ <g
+ aria-label="
+DType classes
+of the ArrayMethod
+"
+ id="text892"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000081;fill-opacity:1;stroke-width:0.398751">
+ <path
+ d="m -25.330407,161.01556 v 2.82463 h 0.427881 q 0.731738,0 1.116211,-0.36277 0.387573,-0.36277 0.387573,-1.0542 0,-0.68833 -0.384473,-1.04799 -0.384472,-0.35967 -1.119311,-0.35967 z m -1.193726,-0.90227 h 1.258838 q 1.0542,0 1.568897,0.15193 0.517798,0.14882 0.886767,0.50849 0.325562,0.31316 0.483692,0.72244 0.15813,0.40928 0.15813,0.92707 0,0.524 -0.15813,0.93638 -0.15813,0.40928 -0.483692,0.72244 -0.37207,0.35967 -0.892968,0.51159 -0.520899,0.14883 -1.562696,0.14883 h -1.258838 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#000081;fill-opacity:1;stroke-width:0.398751"
+ id="path4804" />
+ <path
+ d="m -21.805041,160.11329 h 4.266406 v 0.90227 h -1.53479 v 3.7269 h -1.193725 v -3.7269 h -1.537891 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#000081;fill-opacity:1;stroke-width:0.398751"
+ id="path4806" />
+ <path
+ d="m -18.180456,161.26981 h 1.11001 l 0.933276,2.35644 0.79375,-2.35644 h 1.11001 l -1.460376,3.80131 q -0.220141,0.57981 -0.514697,0.80926 -0.291455,0.23254 -0.772046,0.23254 h -0.641821 v -0.72864 h 0.347265 q 0.282154,0 0.409278,-0.0899 0.130224,-0.0899 0.201538,-0.32246 l 0.03101,-0.0961 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#000081;fill-opacity:1;stroke-width:0.398751"
+ id="path4808" />
+ <path
+ d="m -12.475378,164.24017 v 1.82314 h -1.110009 v -4.7935 h 1.110009 v 0.50849 q 0.229444,-0.30386 0.508497,-0.44648 0.279052,-0.14573 0.641821,-0.14573 0.641821,0 1.054199,0.5116 0.412378,0.50849 0.412378,1.31154 0,0.80306 -0.412378,1.31465 -0.412378,0.5085 -1.054199,0.5085 -0.362769,0 -0.641821,-0.14263 -0.279053,-0.14573 -0.508497,-0.44958 z m 0.73794,-2.24793 q -0.356567,0 -0.548804,0.26355 -0.189136,0.26045 -0.189136,0.75344 0,0.493 0.189136,0.75655 0.192237,0.26045 0.548804,0.26045 0.356567,0 0.542602,-0.26045 0.189136,-0.26045 0.189136,-0.75655 0,-0.49609 -0.189136,-0.75654 -0.186035,-0.26045 -0.542602,-0.26045 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#000081;fill-opacity:1;stroke-width:0.398751"
+ id="path4810" />
+ <path
+ d="m -5.5734734,162.99683 v 0.31626 h -2.5951904 q 0.040308,0.39068 0.2821533,0.58601 0.2418457,0.19534 0.6759277,0.19534 0.3503662,0 0.7162354,-0.10232 0.3689697,-0.10542 0.7565429,-0.31626 v 0.85576 q -0.3937744,0.14883 -0.7875488,0.22324 -0.3937744,0.0775 -0.7875488,0.0775 -0.9425781,0 -1.4665771,-0.47749 -0.5208985,-0.48059 -0.5208985,-1.34566 0,-0.84956 0.5115967,-1.33635 0.5146973,-0.48679 1.4138672,-0.48679 0.8185546,0 1.3084472,0.49299 0.4929932,0.493 0.4929932,1.31775 z m -1.1410156,-0.36897 q 0,-0.31626 -0.1860352,-0.50849 -0.1829346,-0.19534 -0.4805908,-0.19534 -0.3224609,0 -0.523999,0.18293 -0.2015381,0.17984 -0.2511475,0.5209 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#000081;fill-opacity:1;stroke-width:0.398751"
+ id="path4812" />
+ <path
+ d="m 0.28353303,161.37833 v 0.90537 q -0.22634277,-0.15503 -0.45578612,-0.22945 -0.22634277,-0.0744 -0.47128906,-0.0744 -0.46508785,0 -0.72553705,0.27285 -0.2573487,0.26975 -0.2573487,0.75654 0,0.4868 0.2573487,0.75965 0.2604492,0.26975 0.72553705,0.26975 0.26044922,0 0.49299316,-0.0775 0.23564453,-0.0775 0.43408202,-0.22944 v 0.90847 q -0.26044921,0.0961 -0.53020018,0.14263 -0.26665039,0.0496 -0.53640136,0.0496 -0.93947749,0 -1.46967769,-0.48059 -0.5302002,-0.48369 -0.5302002,-1.34256 0,-0.85886 0.5302002,-1.33945 0.5302002,-0.48369 1.46967769,-0.48369 0.27285155,0 0.53640136,0.0496 0.26665038,0.0465 0.53020018,0.14263 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#000081;fill-opacity:1;stroke-width:0.398751"
+ id="path4814" />
+ <path
+ d="m 1.2416134,159.91795 h 1.1100097 v 4.82451 H 1.2416134 Z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#000081;fill-opacity:1;stroke-width:0.398751"
+ id="path4816" />
+ <path
+ d="m 4.9747184,163.17977 q -0.3472656,0 -0.523999,0.11782 -0.1736328,0.11782 -0.1736328,0.34726 0,0.21084 0.1395264,0.33177 0.1426269,0.11782 0.3937744,0.11782 0.3131592,0 0.5270996,-0.22324 0.2139404,-0.22635 0.2139404,-0.56431 v -0.12712 z m 1.6960205,-0.41858 v 1.98127 H 5.5514274 v -0.5147 q -0.2232422,0.31626 -0.5022949,0.46199 -0.2790527,0.14263 -0.6790283,0.14263 -0.539502,0 -0.8774658,-0.31316 -0.3348633,-0.31626 -0.3348633,-0.81855 0,-0.61082 0.4185791,-0.89607 0.4216797,-0.28526 1.3208496,-0.28526 h 0.6542236 v -0.0868 q 0,-0.26355 -0.2077392,-0.38448 -0.2077393,-0.12402 -0.6480225,-0.12402 -0.3565674,0 -0.6635254,0.0713 -0.306958,0.0713 -0.5705078,0.21394 v -0.84646 q 0.3565674,-0.0868 0.7162354,-0.13022 0.3596679,-0.0465 0.7193359,-0.0465 0.9394775,0 1.354956,0.37207 0.4185791,0.36897 0.4185791,1.20303 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#000081;fill-opacity:1;stroke-width:0.398751"
+ id="path4818" />
+ <path
+ d="m 10.416248,161.37833 v 0.84336 q -0.356567,-0.14883 -0.6883298,-0.22325 -0.3317627,-0.0744 -0.6263184,-0.0744 -0.3162597,0 -0.471289,0.0806 -0.1519287,0.0775 -0.1519287,0.24185 0,0.13333 0.1147217,0.20464 0.1178222,0.0713 0.4185791,0.10542 l 0.1953369,0.0279 q 0.8526612,0.10852 1.1472172,0.35657 0.294555,0.24805 0.294555,0.77825 0,0.555 -0.409277,0.83406 -0.4092775,0.27905 -1.221631,0.27905 -0.344165,0 -0.7131347,-0.0558 -0.3658692,-0.0527 -0.7534424,-0.16123 v -0.84336 q 0.3317627,0.16123 0.6790283,0.24184 0.3503662,0.0806 0.7100342,0.0806 0.3255615,0 0.4898925,-0.0899 0.1643311,-0.0899 0.1643311,-0.26665 0,-0.14883 -0.1147217,-0.22014 -0.1116211,-0.0744 -0.4495849,-0.11472 l -0.1953369,-0.0248 q -0.7410401,-0.093 -1.0386963,-0.34416 -0.2976563,-0.25115 -0.2976563,-0.76274 0,-0.55191 0.3782715,-0.81856 0.3782715,-0.26665 1.1596191,-0.26665 0.306958,0 0.6449219,0.0465 0.3379636,0.0465 0.7348386,0.14573 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#000081;fill-opacity:1;stroke-width:0.398751"
+ id="path4820" />
+ <path
+ d="m 14.195862,161.37833 v 0.84336 q -0.356568,-0.14883 -0.68833,-0.22325 -0.331763,-0.0744 -0.626319,-0.0744 -0.316259,0 -0.471289,0.0806 -0.151928,0.0775 -0.151928,0.24185 0,0.13333 0.114721,0.20464 0.117823,0.0713 0.418579,0.10542 l 0.195337,0.0279 q 0.852661,0.10852 1.147217,0.35657 0.294556,0.24805 0.294556,0.77825 0,0.555 -0.409278,0.83406 -0.409277,0.27905 -1.22163,0.27905 -0.344166,0 -0.713135,-0.0558 -0.365869,-0.0527 -0.753443,-0.16123 v -0.84336 q 0.331763,0.16123 0.679029,0.24184 0.350366,0.0806 0.710034,0.0806 0.325561,0 0.489892,-0.0899 0.164331,-0.0899 0.164331,-0.26665 0,-0.14883 -0.114721,-0.22014 -0.111621,-0.0744 -0.449585,-0.11472 l -0.195337,-0.0248 q -0.74104,-0.093 -1.038696,-0.34416 -0.297657,-0.25115 -0.297657,-0.76274 0,-0.55191 0.378272,-0.81856 0.378271,-0.26665 1.159619,-0.26665 0.306958,0 0.644922,0.0465 0.337964,0.0465 0.734839,0.14573 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#000081;fill-opacity:1;stroke-width:0.398751"
+ id="path4823" />
+ <path
+ d="m 18.728918,162.99683 v 0.31626 h -2.595191 q 0.04031,0.39068 0.282154,0.58601 0.241845,0.19534 0.675927,0.19534 0.350366,0 0.716236,-0.10232 0.368969,-0.10542 0.756543,-0.31626 v 0.85576 q -0.393775,0.14883 -0.787549,0.22324 -0.393775,0.0775 -0.787549,0.0775 -0.942578,0 -1.466577,-0.47749 -0.520899,-0.48059 -0.520899,-1.34566 0,-0.84956 0.511597,-1.33635 0.514697,-0.48679 1.413867,-0.48679 0.818555,0 1.308447,0.49299 0.492994,0.493 0.492994,1.31775 z m -1.141016,-0.36897 q 0,-0.31626 -0.186035,-0.50849 -0.182935,-0.19534 -0.480591,-0.19534 -0.322461,0 -0.523999,0.18293 -0.201538,0.17984 -0.251147,0.5209 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#000081;fill-opacity:1;stroke-width:0.398751"
+ id="path4825" />
+ <path
+ d="m 22.282188,161.37833 v 0.84336 q -0.356567,-0.14883 -0.68833,-0.22325 -0.331762,-0.0744 -0.626318,-0.0744 -0.31626,0 -0.471289,0.0806 -0.151929,0.0775 -0.151929,0.24185 0,0.13333 0.114722,0.20464 0.117822,0.0713 0.418579,0.10542 l 0.195337,0.0279 q 0.852661,0.10852 1.147217,0.35657 0.294555,0.24805 0.294555,0.77825 0,0.555 -0.409277,0.83406 -0.409277,0.27905 -1.221631,0.27905 -0.344165,0 -0.713135,-0.0558 -0.365869,-0.0527 -0.753442,-0.16123 v -0.84336 q 0.331763,0.16123 0.679028,0.24184 0.350367,0.0806 0.710034,0.0806 0.325562,0 0.489893,-0.0899 0.164331,-0.0899 0.164331,-0.26665 0,-0.14883 -0.114722,-0.22014 -0.111621,-0.0744 -0.449585,-0.11472 l -0.195336,-0.0248 q -0.74104,-0.093 -1.038697,-0.34416 -0.297656,-0.25115 -0.297656,-0.76274 0,-0.55191 0.378272,-0.81856 0.378271,-0.26665 1.159619,-0.26665 0.306958,0 0.644921,0.0465 0.337964,0.0465 0.734839,0.14573 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#000081;fill-opacity:1;stroke-width:0.398751"
+ id="path4827" />
+ <path
+ d="m -41.392532,169.91734 q -0.36897,0 -0.564307,0.26665 -0.192236,0.26355 -0.192236,0.76274 0,0.4992 0.192236,0.76585 0.195337,0.26355 0.564307,0.26355 0.362769,0 0.555005,-0.26355 0.192236,-0.26665 0.192236,-0.76585 0,-0.49919 -0.192236,-0.76274 -0.192236,-0.26665 -0.555005,-0.26665 z m 0,-0.79375 q 0.896069,0 1.398364,0.48369 0.505396,0.48369 0.505396,1.33945 0,0.85577 -0.505396,1.33946 -0.502295,0.48369 -1.398364,0.48369 -0.89917,0 -1.407666,-0.48369 -0.505395,-0.48369 -0.505395,-1.33946 0,-0.85576 0.505395,-1.33945 0.508496,-0.48369 1.407666,-0.48369 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#000081;fill-opacity:1;stroke-width:0.398751"
+ id="path4829" />
+ <path
+ d="m -36.397488,167.85545 v 0.72864 h -0.613916 q -0.235644,0 -0.328662,0.0868 -0.09302,0.0837 -0.09302,0.29456 v 0.24185 h 0.94878 v 0.79375 h -0.94878 v 2.6789 h -1.110009 v -2.6789 h -0.551905 v -0.79375 h 0.551905 v -0.24185 q 0,-0.56741 0.316259,-0.83716 0.31626,-0.27285 0.979786,-0.27285 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#000081;fill-opacity:1;stroke-width:0.398751"
+ id="path4831" />
+ <path
+ d="m -32.496951,168.22132 v 0.98599 h 1.144116 v 0.79375 h -1.144116 v 1.47277 q 0,0.24185 0.09612,0.32867 0.09612,0.0837 0.381372,0.0837 h 0.570508 v 0.79375 h -0.95188 q -0.657324,0 -0.933276,-0.27285 -0.272852,-0.27595 -0.272852,-0.93328 v -1.47277 h -0.551904 v -0.79375 h 0.551904 v -0.98599 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#000081;fill-opacity:1;stroke-width:0.398751"
+ id="path4833" />
+ <path
+ d="m -27.182547,170.56536 v 2.1146 h -1.116211 v -0.34416 -1.26814 q 0,-0.45579 -0.0217,-0.62632 -0.0186,-0.17053 -0.06821,-0.25115 -0.06511,-0.10852 -0.176733,-0.16743 -0.111621,-0.062 -0.254248,-0.062 -0.347266,0 -0.545703,0.26975 -0.198438,0.26665 -0.198438,0.74104 v 1.70842 h -1.110009 v -4.82451 h 1.110009 v 1.86035 q 0.251148,-0.30386 0.533301,-0.44648 0.282153,-0.14573 0.623218,-0.14573 0.601514,0 0.911572,0.36897 0.313159,0.36897 0.313159,1.0728 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#000081;fill-opacity:1;stroke-width:0.398751"
+ id="path4835" />
+ <path
+ d="m -22.686697,170.93433 v 0.31626 h -2.59519 q 0.04031,0.39068 0.282153,0.58601 0.241846,0.19534 0.675928,0.19534 0.350366,0 0.716235,-0.10232 0.36897,-0.10542 0.756543,-0.31626 v 0.85576 q -0.393774,0.14883 -0.787549,0.22324 -0.393774,0.0775 -0.787548,0.0775 -0.942578,0 -1.466577,-0.47749 -0.520899,-0.48059 -0.520899,-1.34566 0,-0.84956 0.511597,-1.33635 0.514697,-0.48679 1.413867,-0.48679 0.818555,0 1.308447,0.49299 0.492993,0.493 0.492993,1.31775 z m -1.141015,-0.36897 q 0,-0.31626 -0.186035,-0.50849 -0.182935,-0.19534 -0.480591,-0.19534 -0.322461,0 -0.523999,0.18293 -0.201538,0.17984 -0.251148,0.5209 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:end;text-anchor:end;fill:#000081;fill-opacity:1;stroke-width:0.398751"
+ id="path4837" />
+ <path
+ d="m -17.563893,171.7063 h -1.322103 l -0.237718,0.97366 h -1.116948 l 1.380718,-4.51338 h 1.296051 l 1.380718,4.51338 h -1.143 z m -1.152769,-0.77503 h 0.976923 l -0.488462,-1.99618 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Bold'"
+ id="path4839" />
+ <path
+ d="m -15.772877,172.67996 v -0.69036 h 0.455897 v -2.0841 h -0.455897 v -0.68385 h 1.240692 l 0.188872,0.77829 q 0.185615,-0.44613 0.472179,-0.66431 0.289821,-0.21818 0.706641,-0.21818 0.175846,0 0.312616,0.0293 0.136769,0.026 0.257256,0.0749 l -0.192128,1.44585 h -0.644769 v -0.63826 q -0.293077,0.0521 -0.514513,0.31913 -0.221436,0.26377 -0.341923,0.65128 v 0.98995 h 0.683846 v 0.69036 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Bold'"
+ id="path4841" />
+ <path
+ d="m -11.865195,172.67996 v -0.69036 h 0.455898 v -2.0841 h -0.455898 v -0.68385 h 1.240692 l 0.188872,0.77829 q 0.185616,-0.44613 0.4721797,-0.66431 0.2898206,-0.21818 0.7066411,-0.21818 0.1758461,0 0.3126153,0.0293 0.1367693,0.026 0.2572564,0.0749 l -0.1921282,1.44585 h -0.6447692 v -0.63826 q -0.2930769,0.0521 -0.5145131,0.31913 -0.221436,0.26377 -0.341923,0.65128 v 0.98995 h 0.6838464 v 0.69036 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Bold'"
+ id="path4843" />
+ <path
+ d="m -5.0788439,171.6835 q 0,0.19539 0.052103,0.28331 0.055359,0.0879 0.1758462,0.13351 l -0.2116667,0.67733 q -0.3061026,-0.0293 -0.5177692,-0.13351 -0.2084103,-0.10746 -0.3288975,-0.32238 -0.198641,0.23771 -0.508,0.35495 -0.3093589,0.11397 -0.6317435,0.11397 -0.5340513,0 -0.8531795,-0.30285 -0.3158718,-0.3061 -0.3158718,-0.78479 0,-0.56336 0.4396154,-0.86946 0.4428718,-0.30611 1.2439487,-0.30611 h 0.4656666 v -0.13025 q 0,-0.5308 -0.6838461,-0.5308 -0.1660769,0 -0.4265897,0.0488 -0.2605129,0.0456 -0.5210257,0.13351 l -0.2377179,-0.68384 q 0.3354102,-0.127 0.6968718,-0.19213 0.3647179,-0.0651 0.651282,-0.0651 0.7717692,0 1.1397436,0.31587 0.3712307,0.31262 0.3712307,0.90528 z m -1.6151794,0.37123 q 0.1660769,0 0.3484359,-0.0977 0.1823589,-0.10095 0.2767948,-0.28331 v -0.5601 h -0.254 q -0.4298461,0 -0.6317435,0.13351 -0.2018975,0.13026 -0.2018975,0.38426 0,0.19864 0.1204872,0.31261 0.1237436,0.11072 0.3419231,0.11072 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Bold'"
+ id="path4845" />
+ <path
+ d="m -0.81295823,169.22165 -1.15276917,3.45831 q -0.2279488,0.6871 -0.690359,1.04531 -0.4591538,0.3582 -1.2472051,0.40379 l -0.1172308,-0.72618 q 0.3419231,-0.0423 0.5503333,-0.127 0.2116667,-0.0847 0.3386667,-0.2312 0.1302564,-0.14328 0.2246923,-0.36472 h -0.3516923 l -1.0974102,-3.45831 h 1.087641 l 0.6708205,2.80052 0.7294359,-2.80052 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Bold'"
+ id="path4847" />
+ <path
+ d="m 2.9091107,168.16658 0.254,4.51338 H 2.2317774 l -0.055359,-1.93105 q -0.00977,-0.3582 -0.00651,-0.62197 0.00651,-0.26377 0.022795,-0.50475 0.016282,-0.24423 0.039077,-0.54707 l -0.508,2.83633 H 0.91618767 l -0.54707692,-2.83633 q 0.0260513,0.2833 0.0423333,0.53405 0.016282,0.24748 0.0195385,0.52102 0.006513,0.27354 0,0.635 l -0.0325641,1.91477 h -0.91505127 l 0.25399999,-4.51338 h 1.09741024 l 0.50148719,2.91774 0.4754359,-2.91774 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Bold'"
+ id="path4849" />
+ <path
+ d="m 4.625231,171.2504 q 0.052102,0.42333 0.2767948,0.60895 0.2246923,0.18236 0.5535898,0.18236 0.2377179,0 0.4591538,-0.0782 0.2214359,-0.0781 0.4265898,-0.20841 l 0.413564,0.5601 q -0.2442307,0.20841 -0.5926666,0.34193 -0.3451795,0.13351 -0.7880513,0.13351 -0.5926666,0 -0.9932051,-0.23446 -0.4005384,-0.23772 -0.6024359,-0.65128 -0.2018974,-0.41357 -0.2018974,-0.95088 0,-0.51125 0.1953846,-0.92807 0.1953846,-0.42008 0.5698718,-0.66757 0.3777436,-0.25074 0.9215641,-0.25074 0.4949743,0 0.8564359,0.21167 0.3647179,0.21166 0.5633589,0.60895 0.2018975,0.39728 0.2018975,0.95412 0,0.0879 -0.00651,0.18888 -0.00326,0.10094 -0.013026,0.1791 z m 0.6382564,-1.45236 q -0.2767949,0 -0.4461282,0.19864 -0.1693334,0.19864 -0.2051539,0.635 h 1.27 q -0.00326,-0.37774 -0.1465384,-0.60569 -0.1432821,-0.22795 -0.4721795,-0.22795 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Bold'"
+ id="path4851" />
+ <path
+ d="m 10.753783,172.47806 q -0.201897,0.13026 -0.488461,0.22144 -0.2865644,0.0912 -0.6447695,0.0912 -0.6773333,0 -1.0062308,-0.34518 -0.3288974,-0.34844 -0.3288974,-0.94436 v -1.56959 H 7.5592448 v -0.7099 h 0.7261795 v -0.74897 l 1.0290256,-0.12374 v 0.87271 h 1.1136921 l -0.100948,0.7099 H 9.3144499 v 1.56959 q 0,0.25726 0.1172308,0.36798 0.1172308,0.11071 0.3744872,0.11071 0.1823589,0 0.3321541,-0.0423 0.153051,-0.0456 0.273538,-0.11397 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Bold'"
+ id="path4853" />
+ <path
+ d="m 12.577365,167.7465 v 1.81708 q 0.433103,-0.4559 1.016,-0.4559 0.46241,0 0.706641,0.27028 0.244231,0.27028 0.244231,0.762 v 2.54 h -1.029026 v -2.25343 q 0,-0.31262 -0.07164,-0.43636 -0.06838,-0.12375 -0.260513,-0.12375 -0.16282,0 -0.312615,0.11398 -0.146539,0.11072 -0.293077,0.3061 v 2.39346 h -1.029026 v -4.83251 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Bold'"
+ id="path4855" />
+ <path
+ d="m 16.953969,169.10768 q 0.534051,0 0.908538,0.22795 0.374487,0.22795 0.573128,0.64151 0.198641,0.41031 0.198641,0.9639 0,0.8662 -0.442872,1.35792 -0.442871,0.49172 -1.237435,0.49172 -0.794564,0 -1.237436,-0.48521 -0.442872,-0.4852 -0.442872,-1.35792 0,-0.55033 0.198641,-0.9639 0.201897,-0.41356 0.576385,-0.64476 0.377743,-0.23121 0.905282,-0.23121 z m 0,0.75874 q -0.315872,0 -0.468923,0.26052 -0.149795,0.25725 -0.149795,0.82061 0,0.57313 0.149795,0.83039 0.153051,0.25725 0.468923,0.25725 0.315871,0 0.465666,-0.25725 0.153052,-0.25726 0.153052,-0.8369 0,-0.5601 -0.153052,-0.81736 -0.149795,-0.25726 -0.465666,-0.25726 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Bold'"
+ id="path4857" />
+ <path
+ d="m 21.330576,167.73999 1.029026,0.10746 v 4.83251 h -0.911795 l -0.0521,-0.381 q -0.143282,0.2019 -0.381,0.34844 -0.237718,0.14328 -0.576384,0.14328 -0.429847,0 -0.713154,-0.23121 -0.280051,-0.2312 -0.420077,-0.64476 -0.136769,-0.41682 -0.136769,-0.97367 0,-0.53405 0.166077,-0.94762 0.166076,-0.41356 0.475435,-0.64802 0.309359,-0.23772 0.735949,-0.23772 0.465667,0 0.784795,0.31913 z m -0.508,2.11992 q -0.267026,0 -0.429846,0.254 -0.162821,0.25074 -0.162821,0.83364 0,0.42659 0.06838,0.66431 0.06839,0.23446 0.188872,0.3289 0.120487,0.0944 0.276795,0.0944 0.172589,0 0.312615,-0.10746 0.143282,-0.10746 0.254,-0.29308 v -1.49143 q -0.107462,-0.13351 -0.227949,-0.20841 -0.120487,-0.0749 -0.280051,-0.0749 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Bold'"
+ id="path4859" />
+ </g>
+ <path
+ id="rect1272"
+ style="opacity:0.5;fill:#ffc333;fill-opacity:0.46663;stroke:none;stroke-width:1.10816;stroke-linecap:round;stroke-miterlimit:10"
+ d="m 142.70969,109.79432 h 39.2278 v 17.71783 h -39.2278 z" />
+ <path
+ id="rect1274"
+ style="fill:#00b200;fill-opacity:0.483526;stroke:none;stroke-width:1.09086;stroke-linecap:round;stroke-miterlimit:10"
+ d="m 89.303658,110.22836 h 39.313852 v 17.13135 H 89.303658 Z" />
+ <g
+ aria-label="+"
+ id="text1278"
+ style="font-size:12.4527px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;stroke-width:0.933951">
+ <path
+ d="m 83.42805,114.76435 v 3.38679 h 3.386794 v 1.03368 H 83.42805 v 3.38679 h -1.021511 v -3.38679 h -3.386793 v -1.03368 h 3.386793 v -3.38679 z"
+ style="stroke-width:0.933951"
+ id="path5116" />
+ </g>
+ <g
+ aria-label="→"
+ id="text1282"
+ style="font-size:12.4527px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;stroke-width:0.933951">
+ <path
+ d="m 140.22087,119.11341 v 0.54724 l -2.3896,2.3896 -0.72965,-0.72965 1.41673,-1.41674 h -7.41203 v -1.03367 h 7.41203 l -1.41673,-1.41674 0.72965,-0.72965 z"
+ style="stroke-width:0.933951"
+ id="path5203" />
+ </g>
+ <g
+ aria-label="Promotion (if necessary)"
+ id="text1292"
+ style="font-size:5.3167px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000080;stroke-width:0.398751">
+ <path
+ d="m 36.378661,139.30262 v 1.45638 h 0.659395 q 0.366043,0 0.565938,-0.18951 0.199895,-0.18951 0.199895,-0.53998 0,-0.34787 -0.199895,-0.53738 -0.199895,-0.18951 -0.565938,-0.18951 z m -0.524401,-0.43094 h 1.183796 q 0.651607,0 0.983901,0.29595 0.33489,0.29335 0.33489,0.86188 0,0.57373 -0.33489,0.86708 -0.332294,0.29336 -0.983901,0.29336 h -0.659395 v 1.55762 H 35.85426 Z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path5290" />
+ <path
+ d="m 40.630982,140.28652 q -0.08048,-0.0467 -0.176531,-0.0675 -0.09346,-0.0234 -0.207683,-0.0234 -0.404983,0 -0.623051,0.2648 -0.215472,0.2622 -0.215472,0.75545 v 1.53166 H 38.927977 V 139.84 h 0.480268 v 0.45172 q 0.150571,-0.2648 0.392003,-0.39201 0.241432,-0.1298 0.586706,-0.1298 0.04932,0 0.109034,0.008 0.05971,0.005 0.132398,0.0182 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path5292" />
+ <path
+ d="m 42.14188,140.17489 q -0.384214,0 -0.607474,0.30114 -0.22326,0.29855 -0.22326,0.82035 0,0.52181 0.220664,0.82295 0.22326,0.29855 0.61007,0.29855 0.381619,0 0.604879,-0.30115 0.22326,-0.30114 0.22326,-0.82035 0,-0.51661 -0.22326,-0.81775 -0.22326,-0.30374 -0.604879,-0.30374 z m 0,-0.40498 q 0.623051,0 0.978709,0.40498 0.355658,0.40499 0.355658,1.12149 0,0.71392 -0.355658,1.1215 -0.355658,0.40498 -0.978709,0.40498 -0.625647,0 -0.981305,-0.40498 -0.353062,-0.40758 -0.353062,-1.1215 0,-0.7165 0.353062,-1.12149 0.355658,-0.40498 0.981305,-0.40498 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path5294" />
+ <path
+ d="m 46.531792,140.39815 q 0.179127,-0.32191 0.428347,-0.47507 0.249221,-0.15317 0.586706,-0.15317 0.454308,0 0.700933,0.31931 0.246624,0.31672 0.246624,0.90343 v 1.75492 h -0.480269 v -1.73935 q 0,-0.41796 -0.147974,-0.62045 -0.147975,-0.20249 -0.451712,-0.20249 -0.371234,0 -0.586706,0.24662 -0.215472,0.24663 -0.215472,0.67238 v 1.64329 h -0.480268 v -1.73935 q 0,-0.42056 -0.147975,-0.62045 -0.147974,-0.20249 -0.456904,-0.20249 -0.366042,0 -0.581514,0.24922 -0.215471,0.24662 -0.215471,0.66978 v 1.64329 H 44.249868 V 139.84 h 0.480269 v 0.45172 q 0.163551,-0.2674 0.392002,-0.3946 0.228452,-0.12721 0.542574,-0.12721 0.316717,0 0.537381,0.16096 0.22326,0.16095 0.329698,0.46728 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path5296" />
+ <path
+ d="m 50.573834,140.17489 q -0.384215,0 -0.607475,0.30114 -0.22326,0.29855 -0.22326,0.82035 0,0.52181 0.220664,0.82295 0.22326,0.29855 0.610071,0.29855 0.381618,0 0.604878,-0.30115 0.22326,-0.30114 0.22326,-0.82035 0,-0.51661 -0.22326,-0.81775 -0.22326,-0.30374 -0.604878,-0.30374 z m 0,-0.40498 q 0.623051,0 0.978709,0.40498 0.355658,0.40499 0.355658,1.12149 0,0.71392 -0.355658,1.1215 -0.355658,0.40498 -0.978709,0.40498 -0.625647,0 -0.981305,-0.40498 -0.353062,-0.40758 -0.353062,-1.1215 0,-0.7165 0.353062,-1.12149 0.355658,-0.40498 0.981305,-0.40498 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path5298" />
+ <path
+ d="M 53.172476,139.01446 V 139.84 h 0.983901 v 0.37124 h -0.983901 v 1.57839 q 0,0.35566 0.09605,0.45691 0.09865,0.10124 0.397195,0.10124 h 0.490652 v 0.39979 h -0.490652 q -0.552958,0 -0.763237,-0.20508 -0.21028,-0.20769 -0.21028,-0.75286 v -1.57839 H 52.341742 V 139.84 h 0.350466 v -0.82554 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path5300" />
+ <path
+ d="m 54.784619,139.84 h 0.477673 v 2.90757 h -0.477673 z m 0,-1.13187 h 0.477673 v 0.60488 h -0.477673 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path5302" />
+ <path
+ d="m 57.388453,140.17489 q -0.384215,0 -0.607475,0.30114 -0.22326,0.29855 -0.22326,0.82035 0,0.52181 0.220664,0.82295 0.22326,0.29855 0.610071,0.29855 0.381618,0 0.604878,-0.30115 0.22326,-0.30114 0.22326,-0.82035 0,-0.51661 -0.22326,-0.81775 -0.22326,-0.30374 -0.604878,-0.30374 z m 0,-0.40498 q 0.623051,0 0.978709,0.40498 0.355658,0.40499 0.355658,1.12149 0,0.71392 -0.355658,1.1215 -0.355658,0.40498 -0.978709,0.40498 -0.625647,0 -0.981305,-0.40498 -0.353062,-0.40758 -0.353062,-1.1215 0,-0.7165 0.353062,-1.12149 0.355658,-0.40498 0.981305,-0.40498 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path5304" />
+ <path
+ d="m 61.931531,140.99265 v 1.75492 h -0.477672 v -1.73935 q 0,-0.41277 -0.160955,-0.61785 -0.160955,-0.20509 -0.482864,-0.20509 -0.386811,0 -0.610071,0.24662 -0.22326,0.24663 -0.22326,0.67238 v 1.64329 H 59.496441 V 139.84 h 0.480268 v 0.45172 q 0.171339,-0.26221 0.402387,-0.39201 0.233644,-0.1298 0.537381,-0.1298 0.501037,0 0.758046,0.31153 0.257008,0.30893 0.257008,0.91121 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path5306" />
+ <path
+ d="m 65.721757,138.71332 q -0.34787,0.59709 -0.516613,1.1812 -0.168742,0.58411 -0.168742,1.1838 0,0.59968 0.168742,1.18899 0.171339,0.5867 0.516613,1.1812 H 65.30639 q -0.389407,-0.61007 -0.58411,-1.19938 -0.192107,-0.5893 -0.192107,-1.17081 0,-0.57892 0.192107,-1.16563 0.192107,-0.5867 0.58411,-1.19937 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path5308" />
+ <path
+ d="m 66.648545,139.84 h 0.477673 v 2.90757 h -0.477673 z m 0,-1.13187 h 0.477673 v 0.60488 h -0.477673 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path5310" />
+ <path
+ d="m 69.597651,138.70813 v 0.39719 h -0.456904 q -0.257009,0 -0.358254,0.10384 -0.09865,0.10385 -0.09865,0.37384 v 0.257 h 0.786602 v 0.37124 h -0.786602 v 2.53633 h -0.480268 v -2.53633 H 67.746671 V 139.84 h 0.456904 v -0.20249 q 0,-0.48546 0.225856,-0.70612 0.225856,-0.22326 0.716508,-0.22326 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path5312" />
+ <path
+ d="m 74.104386,140.99265 v 1.75492 h -0.477672 v -1.73935 q 0,-0.41277 -0.160955,-0.61785 -0.160954,-0.20509 -0.482864,-0.20509 -0.386811,0 -0.610071,0.24662 -0.223259,0.24663 -0.223259,0.67238 v 1.64329 H 71.669296 V 139.84 h 0.480269 v 0.45172 q 0.171339,-0.26221 0.402387,-0.39201 0.233644,-0.1298 0.537381,-0.1298 0.501036,0 0.758045,0.31153 0.257008,0.30893 0.257008,0.91121 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path5314" />
+ <path
+ d="m 77.544147,141.17437 v 0.23364 h -2.196254 q 0.03115,0.49325 0.295949,0.75286 0.267392,0.25701 0.742469,0.25701 0.27518,0 0.532189,-0.0675 0.259604,-0.0675 0.514017,-0.20249 v 0.45171 q -0.257009,0.10903 -0.526997,0.16615 -0.269989,0.0571 -0.547766,0.0571 -0.69574,0 -1.103319,-0.40498 -0.404983,-0.40499 -0.404983,-1.09553 0,-0.71392 0.384215,-1.13188 0.38681,-0.42056 1.041014,-0.42056 0.586706,0 0.926788,0.37902 0.342678,0.37643 0.342678,1.02544 z m -0.477673,-0.14019 q -0.0052,-0.392 -0.220663,-0.62564 -0.212876,-0.23365 -0.565938,-0.23365 -0.399791,0 -0.641223,0.22586 -0.238836,0.22586 -0.275181,0.63603 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path5316" />
+ <path
+ d="m 80.420563,139.95163 v 0.44652 q -0.202492,-0.11163 -0.407579,-0.16614 -0.202492,-0.0571 -0.410175,-0.0571 -0.464692,0 -0.721701,0.29595 -0.257008,0.29336 -0.257008,0.82554 0,0.53219 0.257008,0.82814 0.257009,0.29336 0.721701,0.29336 0.207683,0 0.410175,-0.0545 0.205087,-0.0571 0.407579,-0.16874 v 0.44132 q -0.199895,0.0935 -0.415367,0.14019 -0.212876,0.0467 -0.454308,0.0467 -0.656799,0 -1.04361,-0.41277 -0.386811,-0.41277 -0.386811,-1.11371 0,-0.71131 0.389407,-1.11889 0.392003,-0.40758 1.072166,-0.40758 0.220664,0 0.430944,0.0467 0.21028,0.0441 0.407579,0.13499 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path5318" />
+ <path
+ d="m 83.738307,141.17437 v 0.23364 h -2.196254 q 0.03115,0.49325 0.295949,0.75286 0.267393,0.25701 0.742469,0.25701 0.275181,0 0.532189,-0.0675 0.259605,-0.0675 0.514017,-0.20249 v 0.45171 q -0.257008,0.10903 -0.526997,0.16615 -0.269989,0.0571 -0.547765,0.0571 -0.69574,0 -1.10332,-0.40498 -0.404983,-0.40499 -0.404983,-1.09553 0,-0.71392 0.384215,-1.13188 0.386811,-0.42056 1.041014,-0.42056 0.586706,0 0.926788,0.37902 0.342678,0.37643 0.342678,1.02544 z m -0.477672,-0.14019 q -0.0052,-0.392 -0.220664,-0.62564 -0.212876,-0.23365 -0.565938,-0.23365 -0.399791,0 -0.641223,0.22586 -0.238836,0.22586 -0.275181,0.63603 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path5320" />
+ <path
+ d="m 86.375891,139.92567 v 0.45171 q -0.202491,-0.10384 -0.420559,-0.15576 -0.218068,-0.0519 -0.451712,-0.0519 -0.355658,0 -0.534785,0.10904 -0.176531,0.10903 -0.176531,0.3271 0,0.16614 0.127206,0.2622 0.127206,0.0934 0.511421,0.17912 l 0.163551,0.0363 q 0.508824,0.10903 0.7217,0.30893 0.215472,0.1973 0.215472,0.55296 0,0.40498 -0.32191,0.64122 -0.319313,0.23624 -0.880059,0.23624 -0.233644,0 -0.488056,-0.0467 -0.251817,-0.0441 -0.53219,-0.13499 v -0.49325 q 0.264797,0.13759 0.521805,0.20768 0.257009,0.0675 0.508825,0.0675 0.337486,0 0.519209,-0.11423 0.181723,-0.11682 0.181723,-0.3271 0,-0.1947 -0.132398,-0.29854 -0.129802,-0.10385 -0.573726,-0.1999 l -0.166147,-0.0389 q -0.443923,-0.0935 -0.641223,-0.28557 -0.197299,-0.1947 -0.197299,-0.53218 0,-0.41018 0.290757,-0.63344 0.290757,-0.22326 0.825542,-0.22326 0.264797,0 0.498441,0.0389 0.233644,0.0389 0.430943,0.11682 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path5322" />
+ <path
+ d="m 89.145869,139.92567 v 0.45171 q -0.202492,-0.10384 -0.42056,-0.15576 -0.218067,-0.0519 -0.451711,-0.0519 -0.355659,0 -0.534786,0.10904 -0.176531,0.10903 -0.176531,0.3271 0,0.16614 0.127206,0.2622 0.127207,0.0934 0.511421,0.17912 l 0.163551,0.0363 q 0.508825,0.10903 0.721701,0.30893 0.215471,0.1973 0.215471,0.55296 0,0.40498 -0.321909,0.64122 -0.319314,0.23624 -0.880059,0.23624 -0.233644,0 -0.488057,-0.0467 -0.251816,-0.0441 -0.532189,-0.13499 v -0.49325 q 0.264797,0.13759 0.521805,0.20768 0.257008,0.0675 0.508825,0.0675 0.337486,0 0.519209,-0.11423 0.181723,-0.11682 0.181723,-0.3271 0,-0.1947 -0.132398,-0.29854 -0.129803,-0.10385 -0.573726,-0.1999 l -0.166147,-0.0389 q -0.443924,-0.0935 -0.641223,-0.28557 -0.1973,-0.1947 -0.1973,-0.53218 0,-0.41018 0.290757,-0.63344 0.290757,-0.22326 0.825543,-0.22326 0.264796,0 0.49844,0.0389 0.233644,0.0389 0.430944,0.11682 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path5324" />
+ <path
+ d="m 91.383661,141.286 q -0.578918,0 -0.802178,0.1324 -0.22326,0.1324 -0.22326,0.45171 0,0.25441 0.166147,0.40498 0.168743,0.14798 0.456904,0.14798 0.397195,0 0.636031,-0.28037 0.241432,-0.28297 0.241432,-0.75026 V 141.286 Z m 0.952748,-0.1973 v 1.65887 h -0.477672 v -0.44132 q -0.163551,0.26479 -0.407579,0.392 -0.244028,0.12461 -0.59709,0.12461 -0.44652,0 -0.711317,-0.24922 -0.2622,-0.25182 -0.2622,-0.67238 0,-0.49065 0.327102,-0.73987 0.329697,-0.24922 0.981304,-0.24922 h 0.66978 v -0.0467 q 0,-0.3297 -0.218068,-0.50882 -0.215471,-0.18173 -0.607474,-0.18173 -0.249221,0 -0.485461,0.0597 -0.23624,0.0597 -0.454307,0.17913 v -0.44133 q 0.2622,-0.10124 0.508824,-0.15057 0.246625,-0.0519 0.480269,-0.0519 0.630839,0 0.942364,0.3271 0.311525,0.3271 0.311525,0.99169 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path5326" />
+ <path
+ d="m 95.005145,140.28652 q -0.08048,-0.0467 -0.176531,-0.0675 -0.09346,-0.0234 -0.207684,-0.0234 -0.404983,0 -0.623051,0.2648 -0.215471,0.2622 -0.215471,0.75545 v 1.53166 H 93.302139 V 139.84 h 0.480269 v 0.45172 q 0.15057,-0.2648 0.392002,-0.39201 0.241433,-0.1298 0.586706,-0.1298 0.04932,0 0.109034,0.008 0.05971,0.005 0.132399,0.0182 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path5328" />
+ <path
+ d="m 96.715936,143.01756 q -0.202492,0.51921 -0.394599,0.67757 -0.192107,0.15836 -0.514017,0.15836 h -0.381619 v -0.39979 h 0.280373 q 0.1973,0 0.306334,-0.0935 0.109034,-0.0935 0.241432,-0.44133 l 0.08567,-0.21806 -1.176008,-2.86085 h 0.506229 l 0.908615,2.27414 0.908616,-2.27414 h 0.506229 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path5330" />
+ <path
+ d="m 98.577302,138.71332 h 0.415367 q 0.389407,0.61267 0.581514,1.19937 0.194703,0.58671 0.194703,1.16563 0,0.58151 -0.194703,1.17081 -0.192107,0.58931 -0.581514,1.19938 h -0.415367 q 0.345274,-0.5945 0.514017,-1.1812 0.171339,-0.58931 0.171339,-1.18899 0,-0.59969 -0.171339,-1.1838 -0.168743,-0.58411 -0.514017,-1.1812 z"
+ style="fill:#000080;stroke-width:0.398751"
+ id="path5332" />
+ </g>
+ <text
+ style="font-size:3.52778px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect1296);"
+ id="text1294"
+ xml:space="preserve" />
+ <g
+ aria-label="If provided"
+ id="text1292-5"
+ style="font-size:5.3167px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#800000;fill-opacity:1;stroke-width:0.398751">
+ <path
+ d="m 164.81105,95.531827 h 0.5244 v 3.875895 h -0.5244 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path5419" />
+ <path
+ d="m 167.83025,95.368277 v 0.397194 h -0.4569 q -0.25701,0 -0.35826,0.103842 -0.0986,0.103842 -0.0986,0.373831 v 0.257008 h 0.7866 v 0.371235 h -0.7866 v 2.536335 h -0.48027 v -2.536335 h -0.4569 v -0.371235 h 0.4569 v -0.202491 q 0,-0.485461 0.22586,-0.706125 0.22586,-0.223259 0.71651,-0.223259 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path5421" />
+ <path
+ d="m 170.38216,98.971587 v 1.542053 h -0.48027 v -4.013488 h 0.48027 v 0.441328 q 0.15057,-0.259605 0.37903,-0.384215 0.23104,-0.127206 0.55036,-0.127206 0.52959,0 0.85929,0.420559 0.33229,0.42056 0.33229,1.105915 0,0.685356 -0.33229,1.105915 -0.3297,0.42056 -0.85929,0.42056 -0.31932,0 -0.55036,-0.12461 -0.22846,-0.127207 -0.37903,-0.386811 z m 1.62513,-1.015054 q 0,-0.526997 -0.21807,-0.825542 -0.21547,-0.301141 -0.5945,-0.301141 -0.37902,0 -0.59709,0.301141 -0.21547,0.298545 -0.21547,0.825542 0,0.526997 0.21547,0.828139 0.21807,0.298545 0.59709,0.298545 0.37903,0 0.5945,-0.298545 0.21807,-0.301142 0.21807,-0.828139 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path5423" />
+ <path
+ d="m 174.97976,96.946672 q -0.0805,-0.04673 -0.17653,-0.0675 -0.0935,-0.02336 -0.20769,-0.02336 -0.40498,0 -0.62305,0.264797 -0.21547,0.2622 -0.21547,0.755449 v 1.531666 h -0.48027 v -2.90757 h 0.48027 v 0.451712 q 0.15057,-0.264797 0.392,-0.392003 0.24144,-0.129802 0.58671,-0.129802 0.0493,0 0.10903,0.0078 0.0597,0.0052 0.1324,0.01817 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path5425" />
+ <path
+ d="m 176.49066,96.835042 q -0.38422,0 -0.60748,0.301141 -0.22326,0.298545 -0.22326,0.82035 0,0.521805 0.22067,0.822947 0.22326,0.298545 0.61007,0.298545 0.38162,0 0.60488,-0.301141 0.22326,-0.301142 0.22326,-0.820351 0,-0.516613 -0.22326,-0.817754 -0.22326,-0.303737 -0.60488,-0.303737 z m 0,-0.404983 q 0.62305,0 0.97871,0.404983 0.35565,0.404983 0.35565,1.121491 0,0.713913 -0.35565,1.121492 -0.35566,0.404983 -0.97871,0.404983 -0.62565,0 -0.98131,-0.404983 -0.35306,-0.407579 -0.35306,-1.121492 0,-0.716508 0.35306,-1.121491 0.35566,-0.404983 0.98131,-0.404983 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path5427" />
+ <path
+ d="m 178.27414,96.500152 h 0.50623 l 0.90861,2.440282 0.90862,-2.440282 h 0.50623 l -1.09034,2.90757 h -0.64901 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path5429" />
+ <path
+ d="m 181.76322,96.500152 h 0.47768 v 2.90757 h -0.47768 z m 0,-1.131875 h 0.47768 v 0.604878 h -0.47768 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path5431" />
+ <path
+ d="m 185.15366,96.94148 v -1.573203 h 0.47767 v 4.039445 h -0.47767 v -0.436135 q -0.15057,0.259604 -0.38162,0.386811 -0.22845,0.12461 -0.55036,0.12461 -0.527,0 -0.85929,-0.42056 -0.3297,-0.420559 -0.3297,-1.105915 0,-0.685355 0.3297,-1.105915 0.33229,-0.420559 0.85929,-0.420559 0.32191,0 0.55036,0.127206 0.23105,0.12461 0.38162,0.384215 z m -1.62772,1.015053 q 0,0.526997 0.21547,0.828139 0.21807,0.298545 0.59709,0.298545 0.37902,0 0.59709,-0.298545 0.21807,-0.301142 0.21807,-0.828139 0,-0.526997 -0.21807,-0.825542 -0.21807,-0.301141 -0.59709,-0.301141 -0.37902,0 -0.59709,0.301141 -0.21547,0.298545 -0.21547,0.825542 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path5433" />
+ <path
+ d="m 189.10224,97.834519 v 0.233644 h -2.19625 q 0.0311,0.493249 0.29595,0.752853 0.26739,0.257009 0.74247,0.257009 0.27518,0 0.53219,-0.0675 0.2596,-0.0675 0.51401,-0.202492 v 0.451712 q -0.25701,0.109034 -0.52699,0.166147 -0.26999,0.05711 -0.54777,0.05711 -0.69574,0 -1.10332,-0.404983 -0.40498,-0.404983 -0.40498,-1.095531 0,-0.713913 0.38421,-1.131876 0.38681,-0.420559 1.04102,-0.420559 0.5867,0 0.92678,0.379023 0.34268,0.376426 0.34268,1.025437 z m -0.47767,-0.140186 q -0.005,-0.392003 -0.22066,-0.625647 -0.21288,-0.233644 -0.56594,-0.233644 -0.39979,0 -0.64122,0.225856 -0.23884,0.225856 -0.27519,0.636031 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path5435" />
+ <path
+ d="m 191.79953,96.94148 v -1.573203 h 0.47768 v 4.039445 h -0.47768 v -0.436135 q -0.15057,0.259604 -0.38161,0.386811 -0.22846,0.12461 -0.55037,0.12461 -0.52699,0 -0.85929,-0.42056 -0.32969,-0.420559 -0.32969,-1.105915 0,-0.685355 0.32969,-1.105915 0.3323,-0.420559 0.85929,-0.420559 0.32191,0 0.55037,0.127206 0.23104,0.12461 0.38161,0.384215 z m -1.62772,1.015053 q 0,0.526997 0.21548,0.828139 0.21806,0.298545 0.59709,0.298545 0.37902,0 0.59709,-0.298545 0.21806,-0.301142 0.21806,-0.828139 0,-0.526997 -0.21806,-0.825542 -0.21807,-0.301141 -0.59709,-0.301141 -0.37903,0 -0.59709,0.301141 -0.21548,0.298545 -0.21548,0.825542 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path5437" />
+ </g>
+ <path
+ id="rect1270"
+ style="fill:#00b200;fill-opacity:0.483526;stroke:none;stroke-width:1.09086;stroke-linecap:round;stroke-miterlimit:10"
+ d="M 37.217079,109.8297 H 76.53093 v 17.13134 H 37.217079 Z" />
+ <path
+ id="rect1907"
+ style="fill:#9f8a56;fill-opacity:0.46663;stroke:none;stroke-width:1.10816;stroke-linecap:round;stroke-miterlimit:10"
+ d="m 142.70969,157.26704 h 39.2278 v 17.71783 h -39.2278 z" />
+ <path
+ id="rect1909"
+ style="fill:#206020;fill-opacity:0.483526;stroke:none;stroke-width:1.09086;stroke-linecap:round;stroke-miterlimit:10"
+ d="m 89.303658,157.70108 h 39.313852 v 17.13135 H 89.303658 Z" />
+ <g
+ aria-label="+"
+ id="text1913"
+ style="font-size:12.4527px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;stroke-width:0.933951">
+ <path
+ d="m 83.42805,162.23707 v 3.38679 h 3.386794 v 1.03367 H 83.42805 v 3.3868 h -1.021511 v -3.3868 h -3.386793 v -1.03367 h 3.386793 v -3.38679 z"
+ style="stroke-width:0.933951"
+ id="path5779" />
+ </g>
+ <g
+ aria-label="→"
+ id="text1917"
+ style="font-size:12.4527px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke-width:0.933951">
+ <path
+ d="m 140.22087,166.58613 v 0.54724 l -2.3896,2.38961 -0.72965,-0.72965 1.41673,-1.41674 h -7.41203 v -1.03367 h 7.41203 l -1.41673,-1.41674 0.72965,-0.72965 z"
+ style="fill:#000000;fill-opacity:1;stroke-width:0.933951"
+ id="path5866" />
+ </g>
+ <path
+ id="rect1919"
+ style="fill:#206020;fill-opacity:0.483526;stroke:none;stroke-width:1.09086;stroke-linecap:round;stroke-miterlimit:10"
+ d="M 37.217079,157.30241 H 76.53093 v 17.13135 H 37.217079 Z" />
+ <g
+ aria-label="&gt;U5"
+ id="text1937"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:6.7452px;line-height:1.25;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';letter-spacing:0px;word-spacing:0px;stroke-width:0.505891">
+ <path
+ d="m 50.308698,75.776211 2.691162,1.663816 v 0.716029 l -2.670407,1.663816 -0.432385,-0.633011 2.317582,-1.38709 -2.317582,-1.359417 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path6038" />
+ <path
+ d="m 57.30986,75.184709 v 3.199646 q 0,0.48773 -0.197167,0.871688 -0.197167,0.380498 -0.581125,0.59842 -0.380498,0.217922 -0.93741,0.217922 -0.56037,0 -0.940869,-0.211004 -0.380498,-0.214462 -0.574207,-0.594961 -0.193708,-0.380498 -0.193708,-0.882065 v -3.199646 h 0.947787 v 2.933297 q 0,0.612257 0.166036,0.920115 0.166036,0.304399 0.594961,0.304399 0.432385,0 0.59842,-0.304399 0.166036,-0.307858 0.166036,-0.920115 v -2.933297 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path6040" />
+ <path
+ d="M 61.166722,75.184709 61.05949,75.85577 h -1.79872 v 1.196841 q 0.190249,-0.0934 0.380499,-0.131445 0.190249,-0.03805 0.366662,-0.03805 0.377039,0 0.677979,0.183331 0.30094,0.183331 0.477352,0.529239 0.176413,0.342448 0.176413,0.82326 0,0.480812 -0.22484,0.854392 -0.221381,0.373581 -0.622634,0.588043 -0.401252,0.211004 -0.940868,0.211004 -0.48773,0 -0.868229,-0.179872 -0.377039,-0.179872 -0.646847,-0.484271 l 0.532698,-0.494648 q 0.377039,0.446221 0.930491,0.446221 0.411631,0 0.653766,-0.249053 0.242135,-0.249054 0.242135,-0.688357 0,-0.48773 -0.204085,-0.688356 -0.204086,-0.200627 -0.518862,-0.200627 -0.311317,0 -0.643388,0.159118 h -0.639929 v -2.507831 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path6042" />
+ </g>
+ <g
+ aria-label="S8"
+ id="text1941"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:6.7452px;line-height:1.25;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';letter-spacing:0px;word-spacing:0px;stroke-width:0.505891">
+ <path
+ d="m 107.40067,79.03849 q 0,0.435843 -0.22484,0.771374 -0.22138,0.332071 -0.64339,0.518861 -0.41855,0.18679 -1.01005,0.18679 -0.62263,0 -1.06886,-0.183331 -0.44622,-0.18679 -0.74716,-0.477352 l 0.49811,-0.556912 q 0.25943,0.235218 0.58113,0.366663 0.32169,0.127985 0.72294,0.127985 0.38396,0 0.64339,-0.176413 0.26289,-0.176412 0.26289,-0.515402 0,-0.193708 -0.083,-0.328612 -0.083,-0.138363 -0.2871,-0.245595 -0.20063,-0.107231 -0.56037,-0.214463 -0.79213,-0.242135 -1.16917,-0.570747 -0.37704,-0.332072 -0.37704,-0.885524 0,-0.41163 0.2283,-0.709111 0.2283,-0.300939 0.61572,-0.460057 0.38741,-0.162577 0.87168,-0.162577 0.5327,0 0.93741,0.155659 0.40472,0.152199 0.71257,0.435844 l -0.47389,0.536156 q -0.24559,-0.211003 -0.5327,-0.311316 -0.28364,-0.100314 -0.57766,-0.100314 -0.34937,0 -0.57767,0.138363 -0.22484,0.138363 -0.22484,0.41509 0,0.169494 0.0934,0.290562 0.0968,0.117609 0.32515,0.221381 0.23176,0.103772 0.63993,0.228299 0.42546,0.127986 0.7437,0.307858 0.32169,0.179872 0.50157,0.466975 0.17987,0.283645 0.17987,0.729866 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path6129" />
+ <path
+ d="m 111.30942,76.772794 q 0,0.33899 -0.19371,0.584584 -0.19025,0.245595 -0.57767,0.463516 0.96162,0.456599 0.96162,1.297154 0,0.37704 -0.20062,0.695275 -0.20063,0.318235 -0.5915,0.511943 -0.38742,0.190249 -0.95125,0.190249 -0.56037,0 -0.94087,-0.18679 -0.3805,-0.190249 -0.57421,-0.501566 -0.1937,-0.311317 -0.1937,-0.684897 0,-0.422007 0.24559,-0.726406 0.24905,-0.304399 0.66414,-0.48773 -0.37358,-0.214463 -0.54653,-0.460057 -0.17295,-0.249054 -0.17295,-0.650307 0,-0.418548 0.21446,-0.705652 0.21792,-0.290562 0.56729,-0.439302 0.35282,-0.148741 0.75753,-0.148741 0.42547,0 0.77138,0.145282 0.34937,0.141822 0.55345,0.422007 0.20755,0.280185 0.20755,0.681438 z m -2.19652,0.04843 q 0,0.311317 0.20755,0.473894 0.211,0.159117 0.61571,0.304399 0.26981,-0.179872 0.38396,-0.356285 0.11415,-0.179872 0.11415,-0.422008 0,-0.294021 -0.1695,-0.473893 -0.16603,-0.183331 -0.48773,-0.183331 -0.31477,0 -0.49118,0.169494 -0.17296,0.169495 -0.17296,0.48773 z m 1.46319,2.296827 q 0,-0.266349 -0.12107,-0.428925 -0.11761,-0.162577 -0.34936,-0.276726 -0.23176,-0.11415 -0.57421,-0.235218 -0.23868,0.134904 -0.40125,0.356285 -0.15912,0.221381 -0.15912,0.567289 0,0.33553 0.20063,0.539616 0.20062,0.204086 0.60188,0.204086 0.40471,0 0.60187,-0.211004 0.20063,-0.214463 0.20063,-0.515403 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path6131" />
+ </g>
+ <g
+ aria-label="&gt;U5"
+ id="text1949"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:6.7452px;line-height:1.25;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';letter-spacing:0px;word-spacing:0px;stroke-width:0.505891">
+ <path
+ d="m 50.308698,116.61385 2.691162,1.66382 v 0.71603 l -2.670407,1.66381 -0.432385,-0.63301 2.317582,-1.38709 -2.317582,-1.35942 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path6218" />
+ <path
+ d="m 57.30986,116.02235 v 3.19964 q 0,0.48773 -0.197167,0.87169 -0.197167,0.3805 -0.581125,0.59842 -0.380498,0.21792 -0.93741,0.21792 -0.56037,0 -0.940869,-0.211 -0.380498,-0.21446 -0.574207,-0.59496 -0.193708,-0.3805 -0.193708,-0.88207 v -3.19964 h 0.947787 v 2.9333 q 0,0.61225 0.166036,0.92011 0.166036,0.3044 0.594961,0.3044 0.432385,0 0.59842,-0.3044 0.166036,-0.30786 0.166036,-0.92011 v -2.9333 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path6220" />
+ <path
+ d="m 61.166722,116.02235 -0.107232,0.67106 h -1.79872 v 1.19684 q 0.190249,-0.0934 0.380499,-0.13145 0.190249,-0.038 0.366662,-0.038 0.377039,0 0.677979,0.18334 0.30094,0.18333 0.477352,0.52923 0.176413,0.34245 0.176413,0.82327 0,0.48081 -0.22484,0.85439 -0.221381,0.37358 -0.622634,0.58804 -0.401252,0.211 -0.940868,0.211 -0.48773,0 -0.868229,-0.17987 -0.377039,-0.17987 -0.646847,-0.48427 l 0.532698,-0.49465 q 0.377039,0.44622 0.930491,0.44622 0.411631,0 0.653766,-0.24905 0.242135,-0.24905 0.242135,-0.68836 0,-0.48773 -0.204085,-0.68835 -0.204086,-0.20063 -0.518862,-0.20063 -0.311317,0 -0.643388,0.15912 h -0.639929 v -2.50783 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path6222" />
+ </g>
+ <g
+ aria-label="&lt;S8"
+ id="text1953"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:6.7452px;line-height:1.25;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';letter-spacing:0px;word-spacing:0px;stroke-width:0.505891">
+ <path
+ d="m 103.80675,117.05698 0.40817,0.64685 -2.31412,1.37671 2.31412,1.36634 -0.43238,0.65376 -2.67041,-1.66381 v -0.71257 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path6309" />
+ <path
+ d="m 108.59064,119.87613 q 0,0.43584 -0.22484,0.77137 -0.22138,0.33207 -0.64338,0.51886 -0.41855,0.18679 -1.01005,0.18679 -0.62264,0 -1.06886,-0.18333 -0.44622,-0.18679 -0.74716,-0.47735 l 0.49811,-0.55691 q 0.25943,0.23522 0.58112,0.36666 0.3217,0.12799 0.72295,0.12799 0.38396,0 0.64339,-0.17642 0.26289,-0.17641 0.26289,-0.5154 0,-0.19371 -0.083,-0.32861 -0.083,-0.13836 -0.2871,-0.24559 -0.20063,-0.10724 -0.56037,-0.21447 -0.79213,-0.24213 -1.16917,-0.57075 -0.37704,-0.33207 -0.37704,-0.88552 0,-0.41163 0.2283,-0.70911 0.2283,-0.30094 0.61571,-0.46006 0.38742,-0.16257 0.87169,-0.16257 0.5327,0 0.93741,0.15565 0.40471,0.1522 0.71257,0.43585 l -0.47389,0.53616 q -0.2456,-0.21101 -0.5327,-0.31132 -0.28365,-0.10031 -0.57767,-0.10031 -0.34936,0 -0.57766,0.13836 -0.22484,0.13836 -0.22484,0.41509 0,0.16949 0.0934,0.29056 0.0969,0.11761 0.32516,0.22138 0.23175,0.10377 0.63992,0.2283 0.42547,0.12799 0.74371,0.30786 0.32169,0.17987 0.50156,0.46697 0.17987,0.28365 0.17987,0.72987 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path6311" />
+ <path
+ d="m 112.49939,117.61043 q 0,0.33899 -0.19371,0.58459 -0.19025,0.24559 -0.57766,0.46351 0.96162,0.4566 0.96162,1.29716 0,0.37704 -0.20063,0.69527 -0.20062,0.31824 -0.5915,0.51195 -0.38741,0.19024 -0.95124,0.19024 -0.56037,0 -0.94087,-0.18679 -0.3805,-0.19025 -0.57421,-0.50156 -0.19371,-0.31132 -0.19371,-0.6849 0,-0.42201 0.2456,-0.72641 0.24905,-0.30439 0.66414,-0.48773 -0.37358,-0.21446 -0.54654,-0.46005 -0.17295,-0.24906 -0.17295,-0.65031 0,-0.41855 0.21446,-0.70565 0.21793,-0.29056 0.56729,-0.4393 0.35283,-0.14874 0.75754,-0.14874 0.42547,0 0.77137,0.14528 0.34937,0.14182 0.55346,0.422 0.20754,0.28019 0.20754,0.68144 z m -2.19651,0.0484 q 0,0.31132 0.20754,0.47389 0.21101,0.15912 0.61572,0.3044 0.26981,-0.17987 0.38396,-0.35628 0.11414,-0.17987 0.11414,-0.42201 0,-0.29402 -0.16949,-0.47389 -0.16604,-0.18333 -0.48773,-0.18333 -0.31478,0 -0.49119,0.16949 -0.17295,0.1695 -0.17295,0.48773 z m 1.46319,2.29683 q 0,-0.26635 -0.12107,-0.42893 -0.11761,-0.16257 -0.34937,-0.27672 -0.23176,-0.11415 -0.5742,-0.23522 -0.23868,0.1349 -0.40126,0.35628 -0.15911,0.22138 -0.15911,0.56729 0,0.33553 0.20062,0.53962 0.20063,0.20408 0.60188,0.20408 0.40471,0 0.60188,-0.211 0.20063,-0.21446 0.20063,-0.5154 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path6313" />
+ </g>
+ <g
+ aria-label="Unicode"
+ id="text1967"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:6.7452px;line-height:1.25;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';letter-spacing:0px;word-spacing:0px;stroke-width:0.505891">
+ <path
+ d="m 46.871582,163.59882 v 3.19964 q 0,0.48773 -0.197167,0.87169 -0.197168,0.3805 -0.581125,0.59842 -0.380499,0.21792 -0.93741,0.21792 -0.560371,0 -0.940869,-0.211 -0.380498,-0.21446 -0.574207,-0.59496 -0.193708,-0.3805 -0.193708,-0.88207 v -3.19964 h 0.947787 v 2.93329 q 0,0.61226 0.166036,0.92012 0.166035,0.3044 0.594961,0.3044 0.432385,0 0.59842,-0.3044 0.166036,-0.30786 0.166036,-0.92012 v -2.93329 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path6400" />
+ <path
+ d="m 47.791687,168.38272 v -3.66316 h 0.795588 l 0.06572,0.45314 q 0.473894,-0.55691 1.16225,-0.55691 0.491189,0 0.75062,0.2871 0.26289,0.28364 0.26289,0.79905 v 2.68078 H 49.91556 v -2.3245 q 0,-0.41509 -0.08648,-0.58804 -0.08302,-0.17296 -0.359744,-0.17296 -0.22484,0 -0.418548,0.14183 -0.193708,0.14182 -0.345908,0.3459 v 2.59777 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path6402" />
+ <path
+ d="m 53.457645,162.87241 q 0.249054,0 0.408171,0.15566 0.159118,0.15566 0.159118,0.38742 0,0.23175 -0.159118,0.39087 -0.159117,0.15566 -0.408171,0.15566 -0.252512,0 -0.41163,-0.15566 -0.159117,-0.15912 -0.159117,-0.39087 0,-0.23176 0.159117,-0.38742 0.159118,-0.15566 0.41163,-0.15566 z m 0.591503,1.84715 v 3.01631 h 0.965082 v 0.64685 h -2.950593 v -0.64685 h 1.072314 v -2.36946 h -1.037723 v -0.64685 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path6404" />
+ <path
+ d="m 57.93714,167.75317 q 0.242136,0 0.45314,-0.0899 0.211003,-0.0899 0.41163,-0.2283 l 0.415089,0.58459 q -0.242135,0.20408 -0.584584,0.33553 -0.342449,0.13144 -0.733324,0.13144 -0.577666,0 -0.989296,-0.23867 -0.408172,-0.23868 -0.626093,-0.67106 -0.217922,-0.43239 -0.217922,-1.00314 0,-0.56383 0.221381,-1.00659 0.22484,-0.44276 0.63647,-0.69527 0.415089,-0.25597 0.989296,-0.25597 0.394335,0 0.71257,0.11415 0.321694,0.11069 0.588043,0.33207 l -0.404712,0.56037 q -0.204086,-0.13837 -0.422008,-0.21447 -0.217921,-0.0761 -0.44622,-0.0761 -0.404713,0 -0.660684,0.29402 -0.252513,0.29056 -0.252513,0.94778 0,0.65031 0.259431,0.91666 0.259431,0.26289 0.650306,0.26289 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path6406" />
+ <path
+ d="m 61.766329,164.61579 q 0.546534,0 0.927033,0.23867 0.380498,0.23868 0.577665,0.67452 0.200627,0.43239 0.200627,1.01351 0,0.89244 -0.446221,1.41822 -0.446221,0.52578 -1.262563,0.52578 -0.816342,0 -1.262563,-0.5154 -0.446221,-0.51886 -0.446221,-1.42168 0,-0.57421 0.200626,-1.01005 0.200627,-0.43584 0.581125,-0.67798 0.383958,-0.24559 0.930492,-0.24559 z m 0,0.68835 q -0.383958,0 -0.574207,0.30094 -0.18679,0.30094 -0.18679,0.94433 0,0.65031 0.18679,0.95125 0.18679,0.29748 0.570748,0.29748 0.383957,0 0.570748,-0.29748 0.18679,-0.30094 0.18679,-0.95817 0,-0.63993 -0.18679,-0.93741 -0.186791,-0.30094 -0.567289,-0.30094 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path6408" />
+ <path
+ d="m 66.519091,163.15951 0.913196,0.0969 v 5.12635 h -0.809424 l -0.05534,-0.43238 q -0.169495,0.24213 -0.425466,0.39087 -0.255972,0.14528 -0.594962,0.14528 -0.463516,0 -0.767915,-0.24213 -0.300939,-0.24214 -0.44968,-0.67798 -0.145281,-0.4393 -0.145281,-1.02043 0,-0.55691 0.172954,-0.99275 0.176413,-0.43931 0.501566,-0.68836 0.325153,-0.24905 0.774833,-0.24905 0.536157,0 0.885524,0.37012 z m -0.639929,2.13771 q -0.345908,0 -0.546534,0.30094 -0.197168,0.29748 -0.197168,0.95125 0,0.69182 0.183331,0.972 0.183331,0.28019 0.494648,0.28019 0.228299,0 0.401253,-0.13491 0.172954,-0.13836 0.304399,-0.34245 v -1.66727 q -0.127986,-0.1695 -0.287103,-0.26289 -0.155659,-0.0969 -0.352826,-0.0969 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path6410" />
+ <path
+ d="m 69.324393,166.8296 q 0.04151,0.5154 0.304399,0.7437 0.262889,0.2283 0.639929,0.2283 0.26289,0 0.494648,-0.083 0.231758,-0.083 0.456598,-0.23176 l 0.380499,0.52232 q -0.255972,0.21446 -0.612257,0.34591 -0.352826,0.13144 -0.778292,0.13144 -0.594962,0 -1.003133,-0.24559 -0.404712,-0.2456 -0.612256,-0.68144 -0.207545,-0.43584 -0.207545,-1.00313 0,-0.54654 0.200626,-0.98584 0.204086,-0.4393 0.588044,-0.69527 0.387416,-0.25943 0.930491,-0.25943 0.754079,0 1.196841,0.49119 0.442762,0.49118 0.442762,1.35941 0,0.20063 -0.0173,0.36321 z m 0.78521,-1.57043 q -0.332071,0 -0.546534,0.23868 -0.211004,0.23868 -0.249053,0.74716 h 1.542748 q -0.0069,-0.46351 -0.190249,-0.72295 -0.183331,-0.26289 -0.556912,-0.26289 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path6412" />
+ </g>
+ <g
+ aria-label="Unicode"
+ id="text1971"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:6.7452px;line-height:1.25;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';letter-spacing:0px;word-spacing:0px;stroke-width:0.505891">
+ <path
+ d="m 97.823158,163.99748 v 3.19965 q 0,0.48773 -0.197167,0.87169 -0.197167,0.3805 -0.581125,0.59842 -0.380498,0.21792 -0.93741,0.21792 -0.56037,0 -0.940869,-0.211 -0.380498,-0.21447 -0.574207,-0.59497 -0.193708,-0.38049 -0.193708,-0.88206 v -3.19965 h 0.947787 v 2.9333 q 0,0.61226 0.166036,0.92012 0.166036,0.30439 0.594961,0.30439 0.432385,0 0.598421,-0.30439 0.166035,-0.30786 0.166035,-0.92012 v -2.9333 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path6499" />
+ <path
+ d="m 98.743263,168.78139 v -3.66317 h 0.795588 l 0.06572,0.45314 q 0.473897,-0.55691 1.162247,-0.55691 0.49119,0 0.75062,0.28711 0.26289,0.28364 0.26289,0.79904 v 2.68079 h -0.91319 v -2.3245 q 0,-0.41509 -0.0865,-0.58805 -0.083,-0.17295 -0.35974,-0.17295 -0.22484,0 -0.41855,0.14182 -0.193711,0.14182 -0.34591,0.34591 v 2.59777 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path6501" />
+ <path
+ d="m 104.40922,163.27108 q 0.24906,0 0.40817,0.15566 0.15912,0.15565 0.15912,0.38741 0,0.23176 -0.15912,0.39088 -0.15911,0.15566 -0.40817,0.15566 -0.25251,0 -0.41163,-0.15566 -0.15912,-0.15912 -0.15912,-0.39088 0,-0.23176 0.15912,-0.38741 0.15912,-0.15566 0.41163,-0.15566 z m 0.5915,1.84714 v 3.01632 h 0.96509 v 0.64685 h -2.9506 v -0.64685 h 1.07232 v -2.36947 h -1.03773 v -0.64685 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path6503" />
+ <path
+ d="m 108.88872,168.15184 q 0.24213,0 0.45314,-0.0899 0.211,-0.0899 0.41163,-0.2283 l 0.41509,0.58458 q -0.24214,0.20409 -0.58459,0.33553 -0.34245,0.13145 -0.73332,0.13145 -0.57767,0 -0.9893,-0.23868 -0.40817,-0.23867 -0.62609,-0.67106 -0.21792,-0.43238 -0.21792,-1.00313 0,-0.56383 0.22138,-1.00659 0.22484,-0.44276 0.63647,-0.69528 0.41509,-0.25597 0.98929,-0.25597 0.39434,0 0.71257,0.11415 0.3217,0.11069 0.58805,0.33207 l -0.40472,0.56037 q -0.20408,-0.13836 -0.422,-0.21446 -0.21793,-0.0761 -0.44622,-0.0761 -0.40472,0 -0.66069,0.29402 -0.25251,0.29057 -0.25251,0.94779 0,0.65031 0.25943,0.91666 0.25943,0.26289 0.65031,0.26289 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path6505" />
+ <path
+ d="m 112.71791,165.01445 q 0.54653,0 0.92703,0.23868 0.3805,0.23868 0.57766,0.67452 0.20063,0.43238 0.20063,1.01351 0,0.89244 -0.44622,1.41822 -0.44622,0.52578 -1.26256,0.52578 -0.81635,0 -1.26257,-0.5154 -0.44622,-0.51886 -0.44622,-1.42168 0,-0.57421 0.20063,-1.01005 0.20063,-0.43585 0.58112,-0.67798 0.38396,-0.2456 0.9305,-0.2456 z m 0,0.68836 q -0.38396,0 -0.57421,0.30094 -0.18679,0.30094 -0.18679,0.94433 0,0.6503 0.18679,0.95124 0.18679,0.29748 0.57075,0.29748 0.38395,0 0.57074,-0.29748 0.18679,-0.30094 0.18679,-0.95816 0,-0.63993 -0.18679,-0.93741 -0.18679,-0.30094 -0.56728,-0.30094 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path6507" />
+ <path
+ d="m 117.47067,163.55818 0.91319,0.0969 v 5.12635 h -0.80942 l -0.0553,-0.43239 q -0.16949,0.24214 -0.42546,0.39088 -0.25597,0.14528 -0.59496,0.14528 -0.46352,0 -0.76792,-0.24214 -0.30094,-0.24213 -0.44968,-0.67797 -0.14528,-0.43931 -0.14528,-1.02043 0,-0.55691 0.17295,-0.99276 0.17642,-0.4393 0.50157,-0.68835 0.32515,-0.24906 0.77483,-0.24906 0.53616,0 0.88553,0.37012 z m -0.63993,2.13771 q -0.34591,0 -0.54654,0.30094 -0.19716,0.29748 -0.19716,0.95125 0,0.69181 0.18333,0.972 0.18333,0.28018 0.49465,0.28018 0.22829,0 0.40125,-0.1349 0.17295,-0.13836 0.3044,-0.34245 v -1.66728 q -0.12799,-0.16949 -0.28711,-0.26289 -0.15565,-0.0969 -0.35282,-0.0969 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path6509" />
+ <path
+ d="m 120.27597,167.22826 q 0.0415,0.5154 0.3044,0.7437 0.26289,0.2283 0.63993,0.2283 0.26289,0 0.49465,-0.083 0.23175,-0.083 0.45659,-0.23175 l 0.3805,0.52232 q -0.25597,0.21446 -0.61225,0.3459 -0.35283,0.13145 -0.7783,0.13145 -0.59496,0 -1.00313,-0.24559 -0.40471,-0.2456 -0.61226,-0.68144 -0.20754,-0.43585 -0.20754,-1.00314 0,-0.54653 0.20063,-0.98583 0.20408,-0.43931 0.58804,-0.69528 0.38742,-0.25943 0.93049,-0.25943 0.75408,0 1.19684,0.49119 0.44276,0.49119 0.44276,1.35942 0,0.20063 -0.0173,0.3632 z m 0.78521,-1.57042 q -0.33207,0 -0.54653,0.23868 -0.21101,0.23867 -0.24906,0.74716 h 1.54275 q -0.007,-0.46352 -0.19025,-0.72295 -0.18333,-0.26289 -0.55691,-0.26289 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path6511" />
+ </g>
+ <g
+ aria-label="Unicode"
+ id="text1989"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:6.7452px;line-height:1.25;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';letter-spacing:0px;word-spacing:0px;stroke-width:0.505891">
+ <path
+ d="m 152.32117,163.85669 v 3.19965 q 0,0.48773 -0.19717,0.87168 -0.19717,0.3805 -0.58113,0.59842 -0.38049,0.21793 -0.93741,0.21793 -0.56037,0 -0.94086,-0.21101 -0.3805,-0.21446 -0.57421,-0.59496 -0.19371,-0.3805 -0.19371,-0.88206 v -3.19965 h 0.94779 v 2.9333 q 0,0.61225 0.16603,0.92011 0.16604,0.3044 0.59496,0.3044 0.43239,0 0.59843,-0.3044 0.16603,-0.30786 0.16603,-0.92011 v -2.9333 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path6598" />
+ <path
+ d="m 153.24127,168.64059 v -3.66316 h 0.79559 l 0.0657,0.45314 q 0.4739,-0.55691 1.16225,-0.55691 0.49119,0 0.75062,0.2871 0.26289,0.28365 0.26289,0.79905 v 2.68078 h -0.91319 v -2.3245 q 0,-0.41508 -0.0865,-0.58804 -0.083,-0.17295 -0.35975,-0.17295 -0.22484,0 -0.41854,0.14182 -0.19371,0.14182 -0.34591,0.34591 v 2.59776 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path6600" />
+ <path
+ d="m 158.90723,163.13028 q 0.24905,0 0.40817,0.15566 0.15912,0.15566 0.15912,0.38742 0,0.23176 -0.15912,0.39088 -0.15912,0.15565 -0.40817,0.15565 -0.25251,0 -0.41163,-0.15565 -0.15912,-0.15912 -0.15912,-0.39088 0,-0.23176 0.15912,-0.38742 0.15912,-0.15566 0.41163,-0.15566 z m 0.5915,1.84715 v 3.01632 h 0.96509 v 0.64684 h -2.9506 v -0.64684 h 1.07232 v -2.36947 h -1.03773 v -0.64685 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path6602" />
+ <path
+ d="m 163.38673,168.01104 q 0.24213,0 0.45313,-0.0899 0.21101,-0.0899 0.41163,-0.2283 l 0.41509,0.58458 q -0.24213,0.20409 -0.58458,0.33553 -0.34245,0.13145 -0.73332,0.13145 -0.57767,0 -0.9893,-0.23868 -0.40817,-0.23868 -0.62609,-0.67106 -0.21793,-0.43239 -0.21793,-1.00313 0,-0.56383 0.22139,-1.00659 0.22484,-0.44277 0.63647,-0.69528 0.41509,-0.25597 0.98929,-0.25597 0.39434,0 0.71257,0.11415 0.3217,0.11069 0.58804,0.33207 l -0.40471,0.56037 q -0.20408,-0.13836 -0.422,-0.21446 -0.21793,-0.0761 -0.44623,-0.0761 -0.40471,0 -0.66068,0.29402 -0.25251,0.29056 -0.25251,0.94779 0,0.6503 0.25943,0.91665 0.25943,0.26289 0.65031,0.26289 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path6604" />
+ <path
+ d="m 167.21591,164.87366 q 0.54654,0 0.92704,0.23868 0.3805,0.23867 0.57766,0.67452 0.20063,0.43238 0.20063,1.01351 0,0.89244 -0.44622,1.41822 -0.44622,0.52578 -1.26257,0.52578 -0.81634,0 -1.26256,-0.51541 -0.44622,-0.51886 -0.44622,-1.42168 0,-0.5742 0.20063,-1.01005 0.20062,-0.43584 0.58112,-0.67798 0.38396,-0.24559 0.93049,-0.24559 z m 0,0.68836 q -0.38395,0 -0.5742,0.30094 -0.18679,0.30094 -0.18679,0.94432 0,0.65031 0.18679,0.95125 0.18679,0.29748 0.57074,0.29748 0.38396,0 0.57075,-0.29748 0.18679,-0.30094 0.18679,-0.95816 0,-0.63993 -0.18679,-0.93741 -0.18679,-0.30094 -0.56729,-0.30094 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path6606" />
+ <path
+ d="m 171.96868,163.41739 0.91319,0.0968 v 5.12635 h -0.80942 l -0.0554,-0.43238 q -0.16949,0.24214 -0.42546,0.39088 -0.25598,0.14528 -0.59496,0.14528 -0.46352,0 -0.76792,-0.24214 -0.30094,-0.24213 -0.44968,-0.67798 -0.14528,-0.4393 -0.14528,-1.02043 0,-0.55691 0.17295,-0.99275 0.17642,-0.4393 0.50157,-0.68836 0.32515,-0.24905 0.77483,-0.24905 0.53616,0 0.88553,0.37012 z m -0.63993,2.13771 q -0.34591,0 -0.54654,0.30094 -0.19716,0.29748 -0.19716,0.95124 0,0.69182 0.18333,0.972 0.18333,0.28019 0.49464,0.28019 0.2283,0 0.40126,-0.1349 0.17295,-0.13837 0.3044,-0.34245 v -1.66728 q -0.12799,-0.16949 -0.28711,-0.26289 -0.15566,-0.0968 -0.35282,-0.0968 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path6608" />
+ <path
+ d="m 174.77398,167.08747 q 0.0415,0.5154 0.3044,0.7437 0.26289,0.2283 0.63993,0.2283 0.26289,0 0.49464,-0.083 0.23176,-0.083 0.4566,-0.23176 l 0.3805,0.52232 q -0.25597,0.21447 -0.61226,0.34591 -0.35282,0.13145 -0.77829,0.13145 -0.59496,0 -1.00313,-0.2456 -0.40471,-0.24559 -0.61226,-0.68144 -0.20754,-0.43584 -0.20754,-1.00313 0,-0.54653 0.20062,-0.98584 0.20409,-0.4393 0.58805,-0.69527 0.38741,-0.25943 0.93049,-0.25943 0.75408,0 1.19684,0.49119 0.44276,0.49119 0.44276,1.35942 0,0.20062 -0.0173,0.3632 z m 0.78521,-1.57042 q -0.33207,0 -0.54654,0.23867 -0.211,0.23868 -0.24905,0.74716 h 1.54275 q -0.007,-0.46351 -0.19025,-0.72294 -0.18333,-0.26289 -0.55691,-0.26289 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path6610" />
+ </g>
+ <g
+ aria-label="If not provided"
+ id="text2113"
+ style="font-size:5.3167px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#800000;fill-opacity:1;stroke-width:0.398751">
+ <path
+ d="m 164.81105,140.86939 h 0.5244 v 3.8759 h -0.5244 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path6697" />
+ <path
+ d="m 167.83025,140.70584 v 0.39719 h -0.4569 q -0.25701,0 -0.35826,0.10385 -0.0986,0.10384 -0.0986,0.37383 v 0.257 h 0.7866 v 0.37124 h -0.7866 v 2.53634 h -0.48027 v -2.53634 h -0.4569 v -0.37124 h 0.4569 v -0.20249 q 0,-0.48546 0.22586,-0.70612 0.22586,-0.22326 0.71651,-0.22326 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path6699" />
+ <path
+ d="m 172.33698,142.99036 v 1.75493 h -0.47767 v -1.73936 q 0,-0.41277 -0.16095,-0.61785 -0.16096,-0.20509 -0.48287,-0.20509 -0.38681,0 -0.61007,0.24662 -0.22326,0.24663 -0.22326,0.67238 v 1.6433 h -0.48027 v -2.90758 h 0.48027 v 0.45172 q 0.17134,-0.2622 0.40239,-0.39201 0.23364,-0.1298 0.53738,-0.1298 0.50104,0 0.75805,0.31153 0.257,0.30893 0.257,0.91121 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path6701" />
+ <path
+ d="m 174.41642,142.1726 q -0.38422,0 -0.60748,0.30115 -0.22326,0.29854 -0.22326,0.82035 0,0.5218 0.22067,0.82294 0.22326,0.29855 0.61007,0.29855 0.38162,0 0.60487,-0.30114 0.22326,-0.30115 0.22326,-0.82035 0,-0.51662 -0.22326,-0.81776 -0.22325,-0.30374 -0.60487,-0.30374 z m 0,-0.40498 q 0.62305,0 0.97871,0.40498 0.35565,0.40499 0.35565,1.1215 0,0.71391 -0.35565,1.12149 -0.35566,0.40498 -0.97871,0.40498 -0.62565,0 -0.98131,-0.40498 -0.35306,-0.40758 -0.35306,-1.12149 0,-0.71651 0.35306,-1.1215 0.35566,-0.40498 0.98131,-0.40498 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path6703" />
+ <path
+ d="m 177.01506,141.01217 v 0.82554 h 0.9839 v 0.37124 h -0.9839 v 1.57839 q 0,0.35566 0.096,0.45691 0.0986,0.10124 0.3972,0.10124 h 0.49065 v 0.3998 h -0.49065 q -0.55296,0 -0.76324,-0.20509 -0.21028,-0.20769 -0.21028,-0.75286 v -1.57839 h -0.35047 v -0.37124 h 0.35047 v -0.82554 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path6705" />
+ <path
+ d="m 180.77932,144.30915 v 1.54205 h -0.48026 v -4.01349 h 0.48026 v 0.44133 q 0.15057,-0.2596 0.37903,-0.38421 0.23104,-0.12721 0.55036,-0.12721 0.52959,0 0.85929,0.42056 0.33229,0.42056 0.33229,1.10592 0,0.68535 -0.33229,1.10591 -0.3297,0.42056 -0.85929,0.42056 -0.31932,0 -0.55036,-0.12461 -0.22846,-0.12721 -0.37903,-0.38681 z m 1.62513,-1.01505 q 0,-0.527 -0.21807,-0.82555 -0.21547,-0.30114 -0.59449,-0.30114 -0.37903,0 -0.59709,0.30114 -0.21548,0.29855 -0.21548,0.82555 0,0.52699 0.21548,0.82813 0.21806,0.29855 0.59709,0.29855 0.37902,0 0.59449,-0.29855 0.21807,-0.30114 0.21807,-0.82813 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path6707" />
+ <path
+ d="m 185.37692,142.28423 q -0.0805,-0.0467 -0.17653,-0.0675 -0.0935,-0.0234 -0.20769,-0.0234 -0.40498,0 -0.62305,0.2648 -0.21547,0.2622 -0.21547,0.75545 v 1.53167 h -0.48027 v -2.90758 h 0.48027 v 0.45172 q 0.15057,-0.2648 0.392,-0.39201 0.24144,-0.1298 0.58671,-0.1298 0.0493,0 0.10903,0.008 0.0597,0.005 0.1324,0.0182 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path6709" />
+ <path
+ d="m 186.88782,142.1726 q -0.38422,0 -0.60748,0.30115 -0.22326,0.29854 -0.22326,0.82035 0,0.5218 0.22067,0.82294 0.22326,0.29855 0.61007,0.29855 0.38162,0 0.60488,-0.30114 0.22326,-0.30115 0.22326,-0.82035 0,-0.51662 -0.22326,-0.81776 -0.22326,-0.30374 -0.60488,-0.30374 z m 0,-0.40498 q 0.62305,0 0.97871,0.40498 0.35565,0.40499 0.35565,1.1215 0,0.71391 -0.35565,1.12149 -0.35566,0.40498 -0.97871,0.40498 -0.62565,0 -0.98131,-0.40498 -0.35306,-0.40758 -0.35306,-1.12149 0,-0.71651 0.35306,-1.1215 0.35566,-0.40498 0.98131,-0.40498 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path6711" />
+ <path
+ d="m 188.6713,141.83771 h 0.50623 l 0.90861,2.44029 0.90862,-2.44029 h 0.50623 l -1.09034,2.90758 h -0.64901 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path6713" />
+ <path
+ d="m 192.16038,141.83771 h 0.47768 v 2.90758 h -0.47768 z m 0,-1.13187 h 0.47768 v 0.60488 h -0.47768 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path6715" />
+ <path
+ d="m 195.55082,142.27904 v -1.5732 h 0.47767 v 4.03945 h -0.47767 v -0.43614 q -0.15057,0.2596 -0.38162,0.38681 -0.22845,0.12461 -0.55036,0.12461 -0.527,0 -0.85929,-0.42056 -0.3297,-0.42056 -0.3297,-1.10591 0,-0.68536 0.3297,-1.10592 0.33229,-0.42056 0.85929,-0.42056 0.32191,0 0.55036,0.12721 0.23105,0.12461 0.38162,0.38421 z m -1.62772,1.01506 q 0,0.52699 0.21547,0.82813 0.21807,0.29855 0.59709,0.29855 0.37902,0 0.59709,-0.29855 0.21807,-0.30114 0.21807,-0.82813 0,-0.527 -0.21807,-0.82555 -0.21807,-0.30114 -0.59709,-0.30114 -0.37902,0 -0.59709,0.30114 -0.21547,0.29855 -0.21547,0.82555 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path6717" />
+ <path
+ d="m 199.4994,143.17208 v 0.23365 h -2.19625 q 0.0312,0.49324 0.29595,0.75285 0.26739,0.25701 0.74247,0.25701 0.27518,0 0.53219,-0.0675 0.2596,-0.0675 0.51401,-0.20249 v 0.45171 q -0.257,0.10903 -0.52699,0.16615 -0.26999,0.0571 -0.54777,0.0571 -0.69574,0 -1.10332,-0.40498 -0.40498,-0.40499 -0.40498,-1.09553 0,-0.71392 0.38421,-1.13188 0.38681,-0.42056 1.04102,-0.42056 0.5867,0 0.92679,0.37902 0.34267,0.37643 0.34267,1.02544 z m -0.47767,-0.14018 q -0.005,-0.39201 -0.22066,-0.62565 -0.21288,-0.23365 -0.56594,-0.23365 -0.39979,0 -0.64122,0.22586 -0.23884,0.22586 -0.27518,0.63603 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path6719" />
+ <path
+ d="m 202.19669,142.27904 v -1.5732 h 0.47768 v 4.03945 h -0.47768 v -0.43614 q -0.15057,0.2596 -0.38162,0.38681 -0.22845,0.12461 -0.55036,0.12461 -0.52699,0 -0.85929,-0.42056 -0.3297,-0.42056 -0.3297,-1.10591 0,-0.68536 0.3297,-1.10592 0.3323,-0.42056 0.85929,-0.42056 0.32191,0 0.55036,0.12721 0.23105,0.12461 0.38162,0.38421 z m -1.62772,1.01506 q 0,0.52699 0.21547,0.82813 0.21807,0.29855 0.5971,0.29855 0.37902,0 0.59709,-0.29855 0.21806,-0.30114 0.21806,-0.82813 0,-0.527 -0.21806,-0.82555 -0.21807,-0.30114 -0.59709,-0.30114 -0.37903,0 -0.5971,0.30114 -0.21547,0.29855 -0.21547,0.82555 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path6721" />
+ </g>
+ <g
+ aria-label="Cast descriptors
+to Loop DTypes"
+ id="text2441"
+ style="font-size:5.3167px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#800000;fill-opacity:1;stroke-width:0.398751">
+ <path
+ d="m 42.55534,183.75032 v 0.55295 q -0.264796,-0.24662 -0.565938,-0.36863 -0.298545,-0.12202 -0.636031,-0.12202 -0.664587,0 -1.017649,0.40758 -0.353062,0.40498 -0.353062,1.17341 0,0.76584 0.353062,1.17342 0.353062,0.40498 1.017649,0.40498 0.337486,0 0.636031,-0.12202 0.301142,-0.12201 0.565938,-0.36863 v 0.54776 q -0.275181,0.18692 -0.58411,0.28037 -0.306333,0.0935 -0.649011,0.0935 -0.880059,0 -1.386288,-0.53738 -0.506229,-0.53998 -0.506229,-1.47196 0,-0.93457 0.506229,-1.47195 0.506229,-0.53998 1.386288,-0.53998 0.34787,0 0.654203,0.0935 0.308929,0.0909 0.578918,0.27518 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path6808" />
+ <path
+ d="m 44.665925,185.86609 q -0.578918,0 -0.802178,0.1324 -0.22326,0.1324 -0.22326,0.45171 0,0.25442 0.166147,0.40499 0.168743,0.14797 0.456904,0.14797 0.397195,0 0.636031,-0.28037 0.241432,-0.28297 0.241432,-0.75026 v -0.10644 z m 0.952748,-0.1973 v 1.65888 h -0.477672 v -0.44133 q -0.163551,0.2648 -0.407579,0.392 -0.244028,0.12461 -0.597091,0.12461 -0.446519,0 -0.711316,-0.24922 -0.2622,-0.25181 -0.2622,-0.67237 0,-0.49066 0.327101,-0.73988 0.329698,-0.24922 0.981305,-0.24922 h 0.66978 v -0.0467 q 0,-0.32969 -0.218068,-0.50882 -0.215472,-0.18172 -0.607474,-0.18172 -0.249221,0 -0.485461,0.0597 -0.23624,0.0597 -0.454308,0.17912 v -0.44132 q 0.262201,-0.10125 0.508825,-0.15058 0.246624,-0.0519 0.480268,-0.0519 0.630839,0 0.942365,0.32711 0.311525,0.3271 0.311525,0.99168 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path6810" />
+ <path
+ d="m 48.45615,184.50577 v 0.45171 q -0.202491,-0.10384 -0.420559,-0.15576 -0.218068,-0.0519 -0.451712,-0.0519 -0.355658,0 -0.534785,0.10904 -0.176531,0.10903 -0.176531,0.3271 0,0.16615 0.127206,0.2622 0.127206,0.0935 0.511421,0.17913 l 0.163551,0.0363 q 0.508825,0.10904 0.7217,0.30893 0.215472,0.1973 0.215472,0.55296 0,0.40498 -0.321909,0.64122 -0.319314,0.23624 -0.88006,0.23624 -0.233644,0 -0.488056,-0.0467 -0.251816,-0.0441 -0.532189,-0.13499 v -0.49325 q 0.264796,0.13759 0.521805,0.20768 0.257008,0.0675 0.508825,0.0675 0.337485,0 0.519209,-0.11422 0.181723,-0.11683 0.181723,-0.32711 0,-0.1947 -0.132399,-0.29854 -0.129802,-0.10384 -0.573726,-0.1999 l -0.166146,-0.0389 q -0.443924,-0.0934 -0.641224,-0.28556 -0.197299,-0.19471 -0.197299,-0.53219 0,-0.41018 0.290757,-0.63344 0.290757,-0.22326 0.825542,-0.22326 0.264797,0 0.498441,0.0389 0.233644,0.0389 0.430943,0.11683 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path6812" />
+ <path
+ d="m 49.845034,183.59455 v 0.82555 h 0.983901 v 0.37123 h -0.983901 v 1.5784 q 0,0.35565 0.09605,0.4569 0.09865,0.10125 0.397195,0.10125 h 0.490652 v 0.39979 h -0.490652 q -0.552958,0 -0.763238,-0.20509 -0.210279,-0.20768 -0.210279,-0.75285 v -1.5784 H 49.0143 v -0.37123 h 0.350466 v -0.82555 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path6814" />
+ <path
+ d="m 55.060489,184.86142 v -1.5732 h 0.477672 v 4.03945 h -0.477672 v -0.43614 q -0.150571,0.25961 -0.381619,0.38681 -0.228452,0.12461 -0.550362,0.12461 -0.526997,0 -0.85929,-0.42056 -0.329698,-0.42056 -0.329698,-1.10591 0,-0.68536 0.329698,-1.10592 0.332293,-0.42056 0.85929,-0.42056 0.32191,0 0.550362,0.12721 0.231048,0.12461 0.381619,0.38421 z m -1.627721,1.01506 q 0,0.527 0.215472,0.82814 0.218068,0.29854 0.59709,0.29854 0.379023,0 0.597091,-0.29854 0.218068,-0.30114 0.218068,-0.82814 0,-0.527 -0.218068,-0.82554 -0.218068,-0.30115 -0.597091,-0.30115 -0.379022,0 -0.59709,0.30115 -0.215472,0.29854 -0.215472,0.82554 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path6816" />
+ <path
+ d="m 59.009072,185.75446 v 0.23365 h -2.196254 q 0.03115,0.49325 0.29595,0.75285 0.267392,0.25701 0.742468,0.25701 0.275181,0 0.53219,-0.0675 0.259604,-0.0675 0.514016,-0.20249 v 0.45171 q -0.257008,0.10904 -0.526997,0.16615 -0.269988,0.0571 -0.547765,0.0571 -0.69574,0 -1.103319,-0.40498 -0.404983,-0.40498 -0.404983,-1.09553 0,-0.71391 0.384214,-1.13188 0.386811,-0.42056 1.041014,-0.42056 0.586707,0 0.926788,0.37903 0.342678,0.37642 0.342678,1.02543 z M 58.5314,185.61428 q -0.0052,-0.39201 -0.220664,-0.62565 -0.212875,-0.23364 -0.565937,-0.23364 -0.399791,0 -0.641224,0.22585 -0.238836,0.22586 -0.27518,0.63603 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path6818" />
+ <path
+ d="m 61.646655,184.50577 v 0.45171 q -0.202492,-0.10384 -0.42056,-0.15576 -0.218068,-0.0519 -0.451712,-0.0519 -0.355658,0 -0.534785,0.10904 -0.176531,0.10903 -0.176531,0.3271 0,0.16615 0.127206,0.2622 0.127207,0.0935 0.511421,0.17913 l 0.163551,0.0363 q 0.508825,0.10904 0.7217,0.30893 0.215472,0.1973 0.215472,0.55296 0,0.40498 -0.321909,0.64122 -0.319314,0.23624 -0.88006,0.23624 -0.233644,0 -0.488056,-0.0467 -0.251816,-0.0441 -0.532189,-0.13499 v -0.49325 q 0.264796,0.13759 0.521805,0.20768 0.257008,0.0675 0.508825,0.0675 0.337485,0 0.519209,-0.11422 0.181723,-0.11683 0.181723,-0.32711 0,-0.1947 -0.132399,-0.29854 -0.129802,-0.10384 -0.573725,-0.1999 l -0.166147,-0.0389 q -0.443924,-0.0934 -0.641223,-0.28556 -0.1973,-0.19471 -0.1973,-0.53219 0,-0.41018 0.290757,-0.63344 0.290757,-0.22326 0.825542,-0.22326 0.264797,0 0.498441,0.0389 0.233644,0.0389 0.430944,0.11683 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path6820" />
+ <path
+ d="m 64.65547,184.53173 v 0.44652 q -0.202491,-0.11163 -0.407579,-0.16615 -0.202491,-0.0571 -0.410175,-0.0571 -0.464692,0 -0.721701,0.29595 -0.257008,0.29335 -0.257008,0.82554 0,0.53219 0.257008,0.82814 0.257009,0.29335 0.721701,0.29335 0.207684,0 0.410175,-0.0545 0.205088,-0.0571 0.407579,-0.16874 v 0.44133 q -0.199895,0.0935 -0.415367,0.14018 -0.212876,0.0467 -0.454308,0.0467 -0.656799,0 -1.04361,-0.41277 -0.386811,-0.41277 -0.386811,-1.1137 0,-0.71132 0.389407,-1.1189 0.392003,-0.40758 1.072167,-0.40758 0.220663,0 0.430943,0.0467 0.21028,0.0441 0.407579,0.135 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path6822" />
+ <path
+ d="m 67.171038,184.86662 q -0.08048,-0.0467 -0.176531,-0.0675 -0.09346,-0.0234 -0.207683,-0.0234 -0.404983,0 -0.623051,0.26479 -0.215472,0.2622 -0.215472,0.75545 v 1.53167 h -0.480268 v -2.90757 h 0.480268 v 0.45171 q 0.150571,-0.2648 0.392003,-0.392 0.241432,-0.12981 0.586706,-0.12981 0.04933,0 0.109034,0.008 0.05971,0.005 0.132398,0.0182 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path6824" />
+ <path
+ d="m 67.672074,184.4201 h 0.477673 v 2.90757 h -0.477673 z m 0,-1.13188 h 0.477673 v 0.60488 h -0.477673 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path6826" />
+ <path
+ d="m 69.61132,186.89153 v 1.54205 h -0.480268 v -4.01348 h 0.480268 v 0.44132 q 0.150571,-0.2596 0.379023,-0.38421 0.231048,-0.12721 0.550361,-0.12721 0.529594,0 0.859291,0.42056 0.332294,0.42056 0.332294,1.10592 0,0.68535 -0.332294,1.10591 -0.329697,0.42056 -0.859291,0.42056 -0.319313,0 -0.550361,-0.12461 -0.228452,-0.1272 -0.379023,-0.38681 z m 1.625124,-1.01505 q 0,-0.527 -0.218067,-0.82554 -0.215472,-0.30115 -0.594495,-0.30115 -0.379022,0 -0.59709,0.30115 -0.215472,0.29854 -0.215472,0.82554 0,0.527 0.215472,0.82814 0.218068,0.29854 0.59709,0.29854 0.379023,0 0.594495,-0.29854 0.218067,-0.30114 0.218067,-0.82814 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path6828" />
+ <path
+ d="m 72.996561,183.59455 v 0.82555 h 0.983901 v 0.37123 h -0.983901 v 1.5784 q 0,0.35565 0.09605,0.4569 0.09865,0.10125 0.397195,0.10125 h 0.490652 v 0.39979 H 73.48981 q -0.552958,0 -0.763237,-0.20509 -0.21028,-0.20768 -0.21028,-0.75285 v -1.5784 h -0.350466 v -0.37123 h 0.350466 v -0.82555 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path6830" />
+ <path
+ d="m 75.73539,184.75499 q -0.384215,0 -0.607475,0.30114 -0.223259,0.29854 -0.223259,0.82035 0,0.5218 0.220663,0.82294 0.22326,0.29855 0.610071,0.29855 0.381619,0 0.604878,-0.30114 0.22326,-0.30114 0.22326,-0.82035 0,-0.51661 -0.22326,-0.81776 -0.223259,-0.30373 -0.604878,-0.30373 z m 0,-0.40499 q 0.623051,0 0.978709,0.40499 0.355658,0.40498 0.355658,1.12149 0,0.71391 -0.355658,1.12149 -0.355658,0.40498 -0.978709,0.40498 -0.625647,0 -0.981305,-0.40498 -0.353062,-0.40758 -0.353062,-1.12149 0,-0.71651 0.353062,-1.12149 Q 75.109743,184.35 75.73539,184.35 Z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path6832" />
+ <path
+ d="m 79.546385,184.86662 q -0.08048,-0.0467 -0.176531,-0.0675 -0.09346,-0.0234 -0.207683,-0.0234 -0.404983,0 -0.623051,0.26479 -0.215472,0.2622 -0.215472,0.75545 v 1.53167 H 77.84338 v -2.90757 h 0.480268 v 0.45171 q 0.150571,-0.2648 0.392003,-0.392 0.241432,-0.12981 0.586706,-0.12981 0.04932,0 0.109034,0.008 0.05971,0.005 0.132398,0.0182 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path6834" />
+ <path
+ d="m 81.900996,184.50577 v 0.45171 q -0.202492,-0.10384 -0.42056,-0.15576 -0.218067,-0.0519 -0.451711,-0.0519 -0.355659,0 -0.534786,0.10904 -0.176531,0.10903 -0.176531,0.3271 0,0.16615 0.127206,0.2622 0.127207,0.0935 0.511421,0.17913 l 0.163551,0.0363 q 0.508825,0.10904 0.721701,0.30893 0.215471,0.1973 0.215471,0.55296 0,0.40498 -0.321909,0.64122 -0.319314,0.23624 -0.880059,0.23624 -0.233645,0 -0.488057,-0.0467 -0.251816,-0.0441 -0.532189,-0.13499 v -0.49325 q 0.264796,0.13759 0.521805,0.20768 0.257008,0.0675 0.508825,0.0675 0.337486,0 0.519209,-0.11422 0.181723,-0.11683 0.181723,-0.32711 0,-0.1947 -0.132398,-0.29854 -0.129803,-0.10384 -0.573726,-0.1999 l -0.166147,-0.0389 q -0.443924,-0.0934 -0.641223,-0.28556 -0.1973,-0.19471 -0.1973,-0.53219 0,-0.41018 0.290757,-0.63344 0.290757,-0.22326 0.825543,-0.22326 0.264796,0 0.49844,0.0389 0.233644,0.0389 0.430944,0.11683 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path6836" />
+ <path
+ d="m 40.104674,190.24043 v 0.82554 h 0.983901 v 0.37124 h -0.983901 v 1.57839 q 0,0.35566 0.09605,0.45691 0.09865,0.10124 0.397195,0.10124 h 0.490653 v 0.39979 h -0.490653 q -0.552957,0 -0.763237,-0.20509 -0.21028,-0.20768 -0.21028,-0.75285 v -1.57839 h -0.350466 v -0.37124 h 0.350466 v -0.82554 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path6838" />
+ <path
+ d="m 42.843501,191.40086 q -0.384215,0 -0.607474,0.30114 -0.22326,0.29855 -0.22326,0.82035 0,0.52181 0.220664,0.82295 0.223259,0.29854 0.61007,0.29854 0.381619,0 0.604879,-0.30114 0.223259,-0.30114 0.223259,-0.82035 0,-0.51661 -0.223259,-0.81775 -0.22326,-0.30374 -0.604879,-0.30374 z m 0,-0.40498 q 0.623051,0 0.978709,0.40498 0.355658,0.40498 0.355658,1.12149 0,0.71392 -0.355658,1.12149 -0.355658,0.40499 -0.978709,0.40499 -0.625647,0 -0.981305,-0.40499 -0.353062,-0.40757 -0.353062,-1.12149 0,-0.71651 0.353062,-1.12149 0.355658,-0.40498 0.981305,-0.40498 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path6840" />
+ <path
+ d="m 46.680455,190.09765 h 0.524401 v 3.43456 h 1.887325 v 0.44133 h -2.411726 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path6842" />
+ <path
+ d="m 50.655,191.40086 q -0.384215,0 -0.607474,0.30114 -0.22326,0.29855 -0.22326,0.82035 0,0.52181 0.220663,0.82295 0.22326,0.29854 0.610071,0.29854 0.381619,0 0.604878,-0.30114 0.22326,-0.30114 0.22326,-0.82035 0,-0.51661 -0.22326,-0.81775 -0.223259,-0.30374 -0.604878,-0.30374 z m 0,-0.40498 q 0.623051,0 0.978709,0.40498 0.355658,0.40498 0.355658,1.12149 0,0.71392 -0.355658,1.12149 -0.355658,0.40499 -0.978709,0.40499 -0.625647,0 -0.981305,-0.40499 -0.353062,-0.40757 -0.353062,-1.12149 0,-0.71651 0.353062,-1.12149 0.355658,-0.40498 0.981305,-0.40498 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path6844" />
+ <path
+ d="m 53.907845,191.40086 q -0.384215,0 -0.607475,0.30114 -0.22326,0.29855 -0.22326,0.82035 0,0.52181 0.220664,0.82295 0.22326,0.29854 0.610071,0.29854 0.381618,0 0.604878,-0.30114 0.22326,-0.30114 0.22326,-0.82035 0,-0.51661 -0.22326,-0.81775 -0.22326,-0.30374 -0.604878,-0.30374 z m 0,-0.40498 q 0.623051,0 0.978709,0.40498 0.355658,0.40498 0.355658,1.12149 0,0.71392 -0.355658,1.12149 -0.355658,0.40499 -0.978709,0.40499 -0.625647,0 -0.981305,-0.40499 -0.353062,-0.40757 -0.353062,-1.12149 0,-0.71651 0.353062,-1.12149 0.355658,-0.40498 0.981305,-0.40498 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path6846" />
+ <path
+ d="m 56.496101,193.53741 v 1.54205 h -0.480268 v -4.01349 h 0.480268 v 0.44133 q 0.150571,-0.2596 0.379023,-0.38422 0.231048,-0.1272 0.550361,-0.1272 0.529593,0 0.859291,0.42056 0.332294,0.42056 0.332294,1.10591 0,0.68536 -0.332294,1.10592 -0.329698,0.42056 -0.859291,0.42056 -0.319313,0 -0.550361,-0.12461 -0.228452,-0.12721 -0.379023,-0.38681 z m 1.625124,-1.01506 q 0,-0.52699 -0.218067,-0.82554 -0.215472,-0.30114 -0.594495,-0.30114 -0.379022,0 -0.59709,0.30114 -0.215472,0.29855 -0.215472,0.82554 0,0.527 0.215472,0.82814 0.218068,0.29855 0.59709,0.29855 0.379023,0 0.594495,-0.29855 0.218067,-0.30114 0.218067,-0.82814 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path6848" />
+ <path
+ d="m 61.644059,190.52859 v 3.01401 h 0.633435 q 0.802178,0 1.173412,-0.36345 0.373831,-0.36344 0.373831,-1.14745 0,-0.77881 -0.373831,-1.13966 -0.371234,-0.36345 -1.173412,-0.36345 z m -0.524401,-0.43094 h 1.077358 q 1.126684,0 1.653681,0.46988 0.526997,0.46729 0.526997,1.46417 0,1.00207 -0.529593,1.47196 -0.529593,0.46988 -1.651085,0.46988 h -1.077358 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path6850" />
+ <path
+ d="m 64.676238,190.09765 h 3.278805 v 0.44132 h -1.375904 v 3.43457 h -0.526997 v -3.43457 h -1.375904 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path6852" />
+ <path
+ d="m 68.822124,194.24353 q -0.202492,0.51921 -0.394599,0.67757 -0.192108,0.15836 -0.514017,0.15836 h -0.381619 v -0.39979 h 0.280373 q 0.1973,0 0.306333,-0.0935 0.109034,-0.0935 0.241433,-0.44133 l 0.08567,-0.21807 -1.176008,-2.86084 h 0.506229 l 0.908615,2.27414 0.908616,-2.27414 h 0.506229 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path6854" />
+ <path
+ d="m 71.220869,193.53741 v 1.54205 h -0.480268 v -4.01349 h 0.480268 v 0.44133 q 0.15057,-0.2596 0.379022,-0.38422 0.231048,-0.1272 0.550362,-0.1272 0.529593,0 0.859291,0.42056 0.332294,0.42056 0.332294,1.10591 0,0.68536 -0.332294,1.10592 -0.329698,0.42056 -0.859291,0.42056 -0.319314,0 -0.550362,-0.12461 -0.228452,-0.12721 -0.379022,-0.38681 z m 1.625124,-1.01506 q 0,-0.52699 -0.218068,-0.82554 -0.215472,-0.30114 -0.594494,-0.30114 -0.379023,0 -0.59709,0.30114 -0.215472,0.29855 -0.215472,0.82554 0,0.527 0.215472,0.82814 0.218067,0.29855 0.59709,0.29855 0.379022,0 0.594494,-0.29855 0.218068,-0.30114 0.218068,-0.82814 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path6856" />
+ <path
+ d="m 76.620643,192.40034 v 0.23364 h -2.196254 q 0.03115,0.49325 0.295949,0.75286 0.267393,0.257 0.742469,0.257 0.27518,0 0.532189,-0.0675 0.259604,-0.0675 0.514017,-0.20249 v 0.45171 q -0.257009,0.10903 -0.526997,0.16614 -0.269989,0.0571 -0.547766,0.0571 -0.69574,0 -1.103319,-0.40499 -0.404983,-0.40498 -0.404983,-1.09553 0,-0.71391 0.384215,-1.13187 0.38681,-0.42056 1.041014,-0.42056 0.586706,0 0.926788,0.37902 0.342678,0.37643 0.342678,1.02544 z m -0.477673,-0.14019 q -0.0052,-0.392 -0.220663,-0.62564 -0.212876,-0.23365 -0.565938,-0.23365 -0.399791,0 -0.641223,0.22586 -0.238836,0.22585 -0.275181,0.63603 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path6858" />
+ <path
+ d="m 79.258223,191.15164 v 0.45171 q -0.202492,-0.10384 -0.420559,-0.15576 -0.218068,-0.0519 -0.451712,-0.0519 -0.355658,0 -0.534785,0.10903 -0.176531,0.10904 -0.176531,0.32711 0,0.16614 0.127206,0.2622 0.127206,0.0934 0.511421,0.17912 l 0.16355,0.0363 q 0.508825,0.10903 0.721701,0.30893 0.215472,0.1973 0.215472,0.55295 0,0.40499 -0.32191,0.64123 -0.319313,0.23624 -0.880059,0.23624 -0.233644,0 -0.488057,-0.0467 -0.251816,-0.0441 -0.532189,-0.135 v -0.49324 q 0.264797,0.13759 0.521805,0.20768 0.257009,0.0675 0.508825,0.0675 0.337486,0 0.519209,-0.11423 0.181723,-0.11682 0.181723,-0.3271 0,-0.1947 -0.132398,-0.29855 -0.129802,-0.10384 -0.573726,-0.19989 l -0.166147,-0.0389 q -0.443924,-0.0935 -0.641223,-0.28557 -0.197299,-0.1947 -0.197299,-0.53219 0,-0.41017 0.290757,-0.63343 0.290757,-0.22326 0.825542,-0.22326 0.264796,0 0.498441,0.0389 0.233644,0.0389 0.430943,0.11682 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path6860" />
+ </g>
+ <g
+ aria-label="&lt;U13"
+ id="text3113"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:6.7452px;line-height:1.25;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';letter-spacing:0px;word-spacing:0px;opacity:0.5;stroke-width:0.505891">
+ <path
+ d="m 155.87082,116.91618 0.40817,0.64685 -2.31412,1.37671 2.31412,1.36634 -0.43238,0.65376 -2.67041,-1.66381 v -0.71257 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path6947" />
+ <path
+ d="m 160.58899,116.32468 v 3.19964 q 0,0.48773 -0.19716,0.87169 -0.19717,0.3805 -0.58113,0.59842 -0.3805,0.21792 -0.93741,0.21792 -0.56037,0 -0.94087,-0.211 -0.3805,-0.21446 -0.5742,-0.59496 -0.19371,-0.3805 -0.19371,-0.88207 v -3.19964 h 0.94778 v 2.9333 q 0,0.61225 0.16604,0.92011 0.16604,0.3044 0.59496,0.3044 0.43239,0 0.59842,-0.3044 0.16604,-0.30786 0.16604,-0.92011 v -2.9333 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path6949" />
+ <path
+ d="m 164.68107,120.40639 v 0.70219 h -2.98518 v -0.70219 h 1.15879 v -3.1616 l -1.02043,0.63301 -0.39087,-0.63301 1.50123,-0.92011 h 0.80597 v 4.08171 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path6951" />
+ <path
+ d="m 166.97789,116.22091 q 0.49119,0 0.84401,0.16603 0.35283,0.16258 0.53962,0.4393 0.18679,0.27673 0.18679,0.6088 0,0.44968 -0.26981,0.74024 -0.26981,0.28711 -0.69181,0.39434 0.31477,0.038 0.56383,0.17295 0.25251,0.13145 0.40125,0.3805 0.14874,0.24905 0.14874,0.62955 0,0.40472 -0.21792,0.73679 -0.21792,0.33207 -0.61918,0.52924 -0.39779,0.1937 -0.94433,0.1937 -0.49118,0 -0.90627,-0.17295 -0.41163,-0.17641 -0.7022,-0.5154 l 0.53616,-0.48427 q 0.20409,0.23867 0.46698,0.34936 0.26635,0.11069 0.55345,0.11069 0.40471,0 0.64685,-0.20754 0.24559,-0.211 0.24559,-0.5915 0,-0.42547 -0.23868,-0.60188 -0.23521,-0.17987 -0.63301,-0.17987 h -0.42546 l 0.10723,-0.65031 h 0.30094 q 0.32515,0 0.55345,-0.1695 0.23176,-0.17295 0.23176,-0.52923 0,-0.31132 -0.21792,-0.48428 -0.21793,-0.17641 -0.54654,-0.17641 -0.29748,0 -0.52924,0.11069 -0.23175,0.11069 -0.44968,0.31478 l -0.47389,-0.50157 q 0.63647,-0.61225 1.53929,-0.61225 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';stroke-width:0.505891"
+ id="path6953" />
+ </g>
+ <g
+ transform="translate(232.48255,-0.55871913)"
+ id="g4067">
+ <g
+ transform="translate(-7.4083337)"
+ id="g4102">
+ <path
+ id="path3217"
+ style="fill:none;fill-opacity:0.483526;stroke:#800000;stroke-width:1.2;stroke-linecap:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow1Sstart);marker-end:url(#marker3453)"
+ d="m -33.43701,119.33194 h 18.789774 v 41.58775 93.14908 H -33.43701"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ </g>
+ </g>
+ <g
+ id="g4988"
+ transform="rotate(180,-31.440594,176.71768)">
+ <path
+ id="path4980"
+ style="fill:none;fill-opacity:0.483526;stroke:#000081;stroke-width:1.2;stroke-linecap:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5002)"
+ d="M -21.573873,211.51421 H -87.252914"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <g
+ aria-label="Registered"
+ transform="scale(-1)"
+ id="text4984"
+ style="font-size:10.5833px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000080;fill-opacity:1;stroke-width:0.398751">
+ <path
+ d="m 25.487476,-295.55361 q 0.625283,0 0.893999,-0.23254 0.273884,-0.23254 0.273884,-0.76481 0,-0.5271 -0.273884,-0.75447 -0.268716,-0.22738 -0.893999,-0.22738 H 24.65032 v 1.9792 z m -0.837156,1.37459 v 2.91971 h -1.989536 v -7.71526 h 3.038564 q 1.52445,0 2.232415,0.51159 0.713133,0.5116 0.713133,1.61747 0,0.76481 -0.372069,1.25573 -0.366902,0.49093 -1.11104,0.72347 0.408242,0.093 0.728635,0.42374 0.325561,0.32556 0.656289,0.99219 l 1.080034,2.19107 h -2.118727 l -0.940508,-1.91719 q -0.28422,-0.57877 -0.578775,-0.79064 -0.289387,-0.21188 -0.775144,-0.21188 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7040" />
+ <path
+ d="m 36.504856,-294.16868 v 0.5271 h -4.325304 q 0.06718,0.65112 0.470254,0.97668 0.403075,0.32556 1.126543,0.32556 0.583942,0 1.193722,-0.17053 0.614947,-0.1757 1.260901,-0.5271 v 1.42626 q -0.656289,0.24805 -1.312578,0.37207 -0.656288,0.12919 -1.312577,0.12919 -1.570958,0 -2.444287,-0.79581 -0.868162,-0.80098 -0.868162,-2.24275 0,-1.41593 0.852659,-2.22725 0.857826,-0.81132 2.356438,-0.81132 1.364253,0 2.180738,0.82166 0.821653,0.82165 0.821653,2.19624 z m -1.901687,-0.61495 q 0,-0.5271 -0.310057,-0.84749 -0.30489,-0.32556 -0.800983,-0.32556 -0.537433,0 -0.873328,0.30489 -0.335896,0.29972 -0.418578,0.86816 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7042" />
+ <path
+ d="m 41.843014,-292.24116 q -0.382404,0.50643 -0.842323,0.74414 -0.459919,0.23771 -1.064531,0.23771 -1.059363,0 -1.751825,-0.83199 -0.692462,-0.83715 -0.692462,-2.12906 0,-1.29707 0.692462,-2.12389 0.692462,-0.83199 1.751825,-0.83199 0.604612,0 1.064531,0.23771 0.459919,0.23771 0.842323,0.74931 v -0.85783 h 1.860346 v 5.2038 q 0,1.39526 -0.883664,2.12906 -0.878497,0.73897 -2.552808,0.73897 -0.542601,0 -1.049028,-0.0827 -0.506428,-0.0827 -1.018023,-0.25321 v -1.44177 q 0.485757,0.27905 0.950844,0.41341 0.465086,0.13953 0.93534,0.13953 0.909502,0 1.333248,-0.39791 0.423745,-0.39791 0.423745,-1.2454 z m -1.21956,-3.60183 q -0.573606,0 -0.893999,0.42374 -0.320393,0.42375 -0.320393,1.19889 0,0.79582 0.310058,1.20923 0.310057,0.40824 0.904334,0.40824 0.578775,0 0.899167,-0.42375 0.320393,-0.42374 0.320393,-1.19372 0,-0.77514 -0.320393,-1.19889 -0.320392,-0.42374 -0.899167,-0.42374 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7044" />
+ <path
+ d="m 45.481024,-297.04705 h 1.85001 v 5.78774 h -1.85001 z m 0,-2.25309 h 1.85001 v 1.50895 h -1.85001 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7046" />
+ <path
+ d="m 53.630371,-296.86618 v 1.40559 q -0.594277,-0.24804 -1.147213,-0.37207 -0.552936,-0.12402 -1.043861,-0.12402 -0.527098,0 -0.785479,0.13436 -0.253214,0.12919 -0.253214,0.40307 0,0.22221 0.191202,0.34107 0.19637,0.11885 0.69763,0.1757 l 0.325561,0.0465 q 1.421097,0.18087 1.912021,0.59428 0.490925,0.41341 0.490925,1.29708 0,0.925 -0.682127,1.39009 -0.682126,0.46508 -2.036045,0.46508 -0.573606,0 -1.188554,-0.093 -0.60978,-0.0879 -1.255733,-0.26872 v -1.4056 q 0.552936,0.26872 1.13171,0.40308 0.583942,0.13436 1.183387,0.13436 0.5426,0 0.816485,-0.14986 0.273884,-0.14986 0.273884,-0.44442 0,-0.24805 -0.191202,-0.3669 -0.186035,-0.12402 -0.749306,-0.1912 l -0.325561,-0.0413 q -1.235062,-0.15503 -1.731155,-0.57361 -0.496092,-0.41858 -0.496092,-1.27124 0,-0.91983 0.630451,-1.36425 0.63045,-0.44442 1.932692,-0.44442 0.511595,0 1.074866,0.0775 0.563272,0.0775 1.224728,0.24288 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7048" />
+ <path
+ d="m 57.428577,-298.69036 v 1.64331 h 1.906854 v 1.32291 h -1.906854 v 2.45463 q 0,0.40307 0.160196,0.54776 0.160197,0.13953 0.635619,0.13953 h 0.950843 v 1.32291 h -1.586462 q -1.095536,0 -1.555455,-0.45475 -0.454751,-0.45992 -0.454751,-1.55545 v -2.45463 h -0.919838 v -1.32291 h 0.919838 v -1.64331 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7050" />
+ <path
+ d="m 66.244547,-294.16868 v 0.5271 h -4.325304 q 0.06718,0.65112 0.470254,0.97668 0.403075,0.32556 1.126543,0.32556 0.583942,0 1.193721,-0.17053 0.614948,-0.1757 1.260901,-0.5271 v 1.42626 q -0.656288,0.24805 -1.312577,0.37207 -0.656288,0.12919 -1.312577,0.12919 -1.570959,0 -2.444287,-0.79581 -0.868162,-0.80098 -0.868162,-2.24275 0,-1.41593 0.852659,-2.22725 0.857826,-0.81132 2.356437,-0.81132 1.364254,0 2.180739,0.82166 0.821653,0.82165 0.821653,2.19624 z m -1.901687,-0.61495 q 0,-0.5271 -0.310058,-0.84749 -0.30489,-0.32556 -0.800982,-0.32556 -0.537433,0 -0.873329,0.30489 -0.335895,0.29972 -0.418577,0.86816 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7052" />
+ <path
+ d="m 71.944439,-295.47092 q -0.242879,-0.11369 -0.485757,-0.16537 -0.237711,-0.0568 -0.480589,-0.0568 -0.713133,0 -1.100705,0.45992 -0.382404,0.45475 -0.382404,1.30741 v 2.66649 h -1.850011 v -5.78774 h 1.850011 v 0.95084 q 0.356566,-0.56844 0.816485,-0.82682 0.465086,-0.26355 1.11104,-0.26355 0.09302,0 0.201537,0.0103 0.10852,0.005 0.315225,0.031 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7054" />
+ <path
+ d="m 78.641683,-294.16868 v 0.5271 H 74.31638 q 0.06718,0.65112 0.470254,0.97668 0.403075,0.32556 1.126542,0.32556 0.583942,0 1.193722,-0.17053 0.614948,-0.1757 1.260901,-0.5271 v 1.42626 q -0.656288,0.24805 -1.312577,0.37207 -0.656289,0.12919 -1.312577,0.12919 -1.570959,0 -2.444288,-0.79581 -0.868161,-0.80098 -0.868161,-2.24275 0,-1.41593 0.852658,-2.22725 0.857826,-0.81132 2.356438,-0.81132 1.364254,0 2.180739,0.82166 0.821652,0.82165 0.821652,2.19624 z m -1.901686,-0.61495 q 0,-0.5271 -0.310058,-0.84749 -0.30489,-0.32556 -0.800982,-0.32556 -0.537433,0 -0.873329,0.30489 -0.335896,0.29972 -0.418578,0.86816 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7056" />
+ <path
+ d="m 83.979842,-296.19956 v -3.10058 h 1.860345 v 8.04083 h -1.860345 v -0.83715 q -0.382405,0.51159 -0.842323,0.7493 -0.459919,0.23771 -1.064532,0.23771 -1.069698,0 -1.756993,-0.84749 -0.687294,-0.85266 -0.687294,-2.19107 0,-1.33842 0.687294,-2.18591 0.687295,-0.85266 1.756993,-0.85266 0.599445,0 1.059364,0.24288 0.465086,0.23771 0.847491,0.74414 z m -1.21956,3.74653 q 0.594277,0 0.904335,-0.43408 0.315225,-0.43408 0.315225,-1.2609 0,-0.82682 -0.315225,-1.2609 -0.310058,-0.43408 -0.904335,-0.43408 -0.58911,0 -0.904335,0.43408 -0.310057,0.43408 -0.310057,1.2609 0,0.82682 0.310057,1.2609 0.315225,0.43408 0.904335,0.43408 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7058" />
+ </g>
+ <path
+ sodipodi:nodetypes="ccc"
+ inkscape:connector-curvature="0"
+ d="m -94.24417,121.2914 64.203629,-0.52916 V 83.191271"
+ style="fill:none;fill-opacity:0.483526;stroke:#000081;stroke-width:1.2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker5618)"
+ id="path6082" />
+ <g
+ aria-label="resolve_descriptors"
+ transform="scale(-1)"
+ id="text6086"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.3167px;line-height:1.25;font-family:fira;-inkscape-font-specification:fira;letter-spacing:0px;word-spacing:0px;fill:#000080;fill-opacity:1;stroke-width:0.398751">
+ <path
+ d="m 29.440542,-123.67085 v -0.49895 h 0.40625 v -1.8922 h -0.40625 v -0.49623 h 0.954279 l 0.133599,0.66254 q 0.158138,-0.36535 0.398071,-0.55348 0.239933,-0.18813 0.60256,-0.18813 0.139052,0 0.245386,0.0218 0.106334,0.0218 0.207215,0.0573 l -0.128146,1.12605 h -0.479867 v -0.56439 q -0.280831,0.0245 -0.485319,0.25629 -0.204488,0.22903 -0.321729,0.60529 v 0.96519 h 0.575295 v 0.49895 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7145" />
+ <path
+ d="m 33.29855,-124.89506 q 0.03272,0.40625 0.239933,0.5862 0.207215,0.17995 0.504405,0.17995 0.207215,0 0.389891,-0.0654 0.182676,-0.0654 0.3599,-0.18268 l 0.299916,0.4117 q -0.201762,0.16905 -0.482593,0.27266 -0.278104,0.1036 -0.613465,0.1036 -0.46896,0 -0.790689,-0.19358 -0.319002,-0.19358 -0.482593,-0.53712 -0.16359,-0.34354 -0.16359,-0.79069 0,-0.43079 0.158137,-0.77706 0.160865,-0.34626 0.463508,-0.54803 0.305369,-0.20449 0.733432,-0.20449 0.594379,0 0.943373,0.38717 0.348994,0.38716 0.348994,1.07152 0,0.15814 -0.01363,0.28628 z m 0.618918,-1.23783 q -0.261745,0 -0.430789,0.18813 -0.166317,0.18813 -0.196309,0.58892 h 1.216025 q -0.0055,-0.36535 -0.149958,-0.56984 -0.144506,-0.20721 -0.438969,-0.20721 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7147" />
+ <path
+ d="m 37.055677,-124.12073 q 0.253565,0 0.40625,-0.0873 0.155411,-0.0872 0.155411,-0.25083 0,-0.10361 -0.0518,-0.17723 -0.04908,-0.0763 -0.196308,-0.13905 -0.147232,-0.0654 -0.441696,-0.14451 -0.278104,-0.0709 -0.488045,-0.17449 -0.207215,-0.10634 -0.324455,-0.27265 -0.114514,-0.16632 -0.114514,-0.41989 0,-0.37626 0.316276,-0.61346 0.316275,-0.23994 0.88339,-0.23994 0.370806,0 0.64891,0.0982 0.278104,0.0954 0.47714,0.23993 l -0.294464,0.43897 q -0.174497,-0.11179 -0.378985,-0.17995 -0.201762,-0.0709 -0.436242,-0.0709 -0.253566,0 -0.370806,0.0736 -0.114513,0.0736 -0.114513,0.20449 0,0.0927 0.05726,0.15813 0.05998,0.0627 0.212668,0.1227 0.155412,0.0572 0.441695,0.13905 0.280831,0.0791 0.488046,0.18268 0.209942,0.1036 0.324455,0.27537 0.114514,0.16905 0.114514,0.44715 0,0.31355 -0.182677,0.51804 -0.182676,0.20449 -0.482592,0.30537 -0.299917,0.0981 -0.646184,0.0981 -0.408977,0 -0.714346,-0.11724 -0.30537,-0.11724 -0.518038,-0.30264 l 0.373533,-0.41988 q 0.169043,0.1336 0.384438,0.22084 0.218121,0.0873 0.471687,0.0873 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7149" />
+ <path
+ d="m 40.428365,-126.64003 q 0.430789,0 0.730706,0.18813 0.299916,0.18813 0.455327,0.53167 0.158138,0.34082 0.158138,0.79887 0,0.70344 -0.35172,1.11787 -0.35172,0.41443 -0.995177,0.41443 -0.643457,0 -0.995177,-0.40625 -0.351721,-0.40897 -0.351721,-1.12059 0,-0.45261 0.158138,-0.79615 0.158138,-0.34354 0.458054,-0.53439 0.302643,-0.19359 0.733432,-0.19359 z m 0,0.54258 q -0.302643,0 -0.452601,0.23721 -0.147232,0.2372 -0.147232,0.74434 0,0.51258 0.147232,0.74979 0.147232,0.23448 0.449875,0.23448 0.302643,0 0.449874,-0.23448 0.147232,-0.23721 0.147232,-0.75525 0,-0.5044 -0.147232,-0.73888 -0.147231,-0.23721 -0.447148,-0.23721 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7151" />
+ <path
+ d="m 43.87467,-127.71154 v 3.20092 q 0,0.18813 0.111787,0.2672 0.111787,0.0791 0.29719,0.0791 0.11724,0 0.2263,-0.0245 0.109061,-0.0273 0.207215,-0.0654 l 0.177224,0.49078 q -0.136326,0.0709 -0.332635,0.12269 -0.193582,0.0518 -0.449875,0.0518 -0.471686,0 -0.714346,-0.26992 -0.24266,-0.26993 -0.24266,-0.72798 v -2.61473 h -0.864304 v -0.50985 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7153" />
+ <path
+ d="m 48.387042,-126.55823 -0.992451,2.88738 h -0.845219 l -0.997904,-2.88738 h 0.77433 l 0.65709,2.31208 0.670722,-2.31208 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7155" />
+ <path
+ d="m 49.657588,-124.89506 q 0.03272,0.40625 0.239933,0.5862 0.207215,0.17995 0.504405,0.17995 0.207215,0 0.389891,-0.0654 0.182677,-0.0654 0.3599,-0.18268 l 0.299916,0.4117 q -0.201762,0.16905 -0.482592,0.27266 -0.278105,0.1036 -0.613466,0.1036 -0.46896,0 -0.790688,-0.19358 -0.319002,-0.19358 -0.482593,-0.53712 -0.163591,-0.34354 -0.163591,-0.79069 0,-0.43079 0.158138,-0.77706 0.160864,-0.34626 0.463507,-0.54803 0.305369,-0.20449 0.733432,-0.20449 0.59438,0 0.943373,0.38717 0.348994,0.38716 0.348994,1.07152 0,0.15814 -0.01363,0.28628 z m 0.618918,-1.23783 q -0.261745,0 -0.430789,0.18813 -0.166317,0.18813 -0.196309,0.58892 h 1.216025 q -0.0055,-0.36535 -0.149958,-0.56984 -0.144505,-0.20721 -0.438969,-0.20721 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7157" />
+ <path
+ d="m 52.149612,-122.66477 v -0.58075 h 2.726513 v 0.58075 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7159" />
+ <path
+ d="m 57.261817,-127.78789 0.719799,0.0764 v 4.04069 h -0.638004 l -0.04362,-0.34082 q -0.133599,0.19086 -0.335361,0.3081 -0.201762,0.11451 -0.46896,0.11451 -0.365353,0 -0.605286,-0.19085 -0.237207,-0.19086 -0.354447,-0.5344 -0.114513,-0.34627 -0.114513,-0.80432 0,-0.43897 0.136325,-0.78251 0.139052,-0.34627 0.395345,-0.54258 0.256292,-0.19631 0.610739,-0.19631 0.422609,0 0.697987,0.29174 z m -0.504405,1.68499 q -0.272651,0 -0.430789,0.2372 -0.155411,0.23448 -0.155411,0.7498 0,0.5453 0.144505,0.76615 0.144505,0.22084 0.389891,0.22084 0.17995,0 0.316276,-0.10633 0.136325,-0.10906 0.239933,-0.26993 v -1.31417 q -0.100881,-0.1336 -0.226301,-0.20722 -0.122693,-0.0763 -0.278104,-0.0763 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7161" />
+ <path
+ d="m 59.473012,-124.89506 q 0.03272,0.40625 0.239933,0.5862 0.207215,0.17995 0.504405,0.17995 0.207215,0 0.389891,-0.0654 0.182677,-0.0654 0.3599,-0.18268 l 0.299916,0.4117 q -0.201762,0.16905 -0.482592,0.27266 -0.278105,0.1036 -0.613466,0.1036 -0.46896,0 -0.790688,-0.19358 -0.319002,-0.19358 -0.482593,-0.53712 -0.163591,-0.34354 -0.163591,-0.79069 0,-0.43079 0.158138,-0.77706 0.160864,-0.34626 0.463507,-0.54803 0.305369,-0.20449 0.733432,-0.20449 0.59438,0 0.943373,0.38717 0.348994,0.38716 0.348994,1.07152 0,0.15814 -0.01363,0.28628 z m 0.618918,-1.23783 q -0.261745,0 -0.430789,0.18813 -0.166317,0.18813 -0.196309,0.58892 h 1.216025 q -0.0055,-0.36535 -0.149958,-0.56984 -0.144505,-0.20721 -0.438969,-0.20721 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7163" />
+ <path
+ d="m 63.23014,-124.12073 q 0.253566,0 0.40625,-0.0873 0.155411,-0.0872 0.155411,-0.25083 0,-0.10361 -0.0518,-0.17723 -0.04908,-0.0763 -0.196309,-0.13905 -0.147232,-0.0654 -0.441695,-0.14451 -0.278105,-0.0709 -0.488046,-0.17449 -0.207215,-0.10634 -0.324455,-0.27265 -0.114514,-0.16632 -0.114514,-0.41989 0,-0.37626 0.316276,-0.61346 0.316275,-0.23994 0.88339,-0.23994 0.370806,0 0.64891,0.0982 0.278104,0.0954 0.47714,0.23993 l -0.294464,0.43897 q -0.174496,-0.11179 -0.378985,-0.17995 -0.201762,-0.0709 -0.436242,-0.0709 -0.253566,0 -0.370806,0.0736 -0.114513,0.0736 -0.114513,0.20449 0,0.0927 0.05726,0.15813 0.05998,0.0627 0.212668,0.1227 0.155411,0.0572 0.441695,0.13905 0.28083,0.0791 0.488045,0.18268 0.209942,0.1036 0.324455,0.27537 0.114514,0.16905 0.114514,0.44715 0,0.31355 -0.182676,0.51804 -0.182677,0.20449 -0.482593,0.30537 -0.299917,0.0981 -0.646184,0.0981 -0.408977,0 -0.714346,-0.11724 -0.305369,-0.11724 -0.518037,-0.30264 l 0.373532,-0.41988 q 0.169044,0.1336 0.384438,0.22084 0.218121,0.0873 0.471687,0.0873 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7165" />
+ <path
+ d="m 66.856391,-124.16708 q 0.190856,0 0.357174,-0.0709 0.166317,-0.0709 0.324455,-0.17995 l 0.327181,0.46078 q -0.190856,0.16087 -0.460781,0.26448 -0.269924,0.1036 -0.57802,0.1036 -0.455328,0 -0.779783,-0.18813 -0.321728,-0.18813 -0.493499,-0.52894 -0.17177,-0.34081 -0.17177,-0.79069 0,-0.44442 0.174497,-0.79341 0.177223,-0.349 0.501678,-0.54803 0.327182,-0.20177 0.779783,-0.20177 0.310822,0 0.561661,0.09 0.253566,0.0872 0.463508,0.26175 l -0.319002,0.44169 q -0.160865,-0.10906 -0.332635,-0.16904 -0.17177,-0.06 -0.35172,-0.06 -0.319002,0 -0.520764,0.23176 -0.199036,0.22902 -0.199036,0.74706 0,0.51259 0.204489,0.72253 0.204488,0.20721 0.512584,0.20721 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7167" />
+ <path
+ d="m 68.702234,-123.67085 v -0.49895 h 0.40625 v -1.8922 h -0.40625 v -0.49623 h 0.954279 l 0.133599,0.66254 q 0.158138,-0.36535 0.398071,-0.55348 0.239933,-0.18813 0.60256,-0.18813 0.139052,0 0.245386,0.0218 0.106334,0.0218 0.207215,0.0573 l -0.128146,1.12605 h -0.479867 v -0.56439 q -0.28083,0.0245 -0.485319,0.25629 -0.204488,0.22903 -0.321728,0.60529 v 0.96519 h 0.575294 v 0.49895 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7169" />
+ <path
+ d="m 73.14099,-128.01419 q 0.196309,0 0.321728,0.1227 0.12542,0.12269 0.12542,0.30536 0,0.18268 -0.12542,0.3081 -0.125419,0.12269 -0.321728,0.12269 -0.199036,0 -0.324455,-0.12269 -0.12542,-0.12542 -0.12542,-0.3081 0,-0.18267 0.12542,-0.30536 0.125419,-0.1227 0.324455,-0.1227 z m 0.466234,1.45596 v 2.37752 h 0.760697 v 0.50986 h -2.325716 v -0.50986 h 0.845219 v -1.86766 H 72.06947 v -0.50986 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7171" />
+ <path
+ d="m 76.709985,-126.64003 q 0.378985,0 0.610738,0.18813 0.231754,0.18541 0.335362,0.52895 0.106334,0.34081 0.106334,0.80159 0,0.44442 -0.128147,0.79069 -0.128146,0.34627 -0.376258,0.5453 -0.245387,0.19631 -0.605286,0.19631 -0.441695,0 -0.714347,-0.31355 v 1.34417 l -0.719799,0.0764 v -4.07614 h 0.632551 l 0.03817,0.35172 q 0.169044,-0.22357 0.381712,-0.32718 0.215395,-0.10634 0.438969,-0.10634 z m -0.209942,0.53985 q -0.182676,0 -0.321728,0.10906 -0.136326,0.10907 -0.239934,0.26993 v 1.29237 q 0.199036,0.29446 0.507132,0.29446 0.275378,0 0.419883,-0.22903 0.147231,-0.23175 0.147231,-0.74979 0,-0.54803 -0.130872,-0.76615 -0.130873,-0.22085 -0.381712,-0.22085 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7173" />
+ <path
+ d="m 80.982423,-123.83172 q -0.160864,0.10634 -0.389891,0.1745 -0.229027,0.0682 -0.496225,0.0682 -0.528944,0 -0.796142,-0.27265 -0.267198,-0.27538 -0.267198,-0.7307 v -1.45596 h -0.627098 v -0.50986 h 0.627098 v -0.63528 l 0.719799,-0.0872 v 0.72253 h 0.95428 l -0.07362,0.50986 h -0.880664 v 1.45323 q 0,0.22357 0.109061,0.32718 0.10906,0.10361 0.35172,0.10361 0.155411,0 0.283557,-0.0354 0.130873,-0.0382 0.237207,-0.0954 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7175" />
+ <path
+ d="m 82.961865,-126.64003 q 0.430789,0 0.730705,0.18813 0.299917,0.18813 0.455328,0.53167 0.158138,0.34082 0.158138,0.79887 0,0.70344 -0.35172,1.11787 -0.351721,0.41443 -0.995178,0.41443 -0.643457,0 -0.995177,-0.40625 -0.35172,-0.40897 -0.35172,-1.12059 0,-0.45261 0.158138,-0.79615 0.158138,-0.34354 0.458054,-0.53439 0.302643,-0.19359 0.733432,-0.19359 z m 0,0.54258 q -0.302643,0 -0.452601,0.23721 -0.147232,0.2372 -0.147232,0.74434 0,0.51258 0.147232,0.74979 0.147232,0.23448 0.449874,0.23448 0.302643,0 0.449875,-0.23448 0.147232,-0.23721 0.147232,-0.75525 0,-0.5044 -0.147232,-0.73888 -0.147232,-0.23721 -0.447148,-0.23721 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7177" />
+ <path
+ d="m 85.061273,-123.67085 v -0.49895 h 0.40625 v -1.8922 h -0.40625 v -0.49623 h 0.95428 l 0.133599,0.66254 q 0.158137,-0.36535 0.398071,-0.55348 0.239933,-0.18813 0.602559,-0.18813 0.139052,0 0.245386,0.0218 0.106334,0.0218 0.207215,0.0573 l -0.128146,1.12605 h -0.479866 v -0.56439 q -0.280831,0.0245 -0.48532,0.25629 -0.204488,0.22903 -0.321728,0.60529 v 0.96519 h 0.575294 v 0.49895 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7179" />
+ <path
+ d="m 89.404601,-124.12073 q 0.253566,0 0.406251,-0.0873 0.155411,-0.0872 0.155411,-0.25083 0,-0.10361 -0.0518,-0.17723 -0.04908,-0.0763 -0.196309,-0.13905 -0.147232,-0.0654 -0.441695,-0.14451 -0.278104,-0.0709 -0.488046,-0.17449 -0.207215,-0.10634 -0.324455,-0.27265 -0.114513,-0.16632 -0.114513,-0.41989 0,-0.37626 0.316275,-0.61346 0.316276,-0.23994 0.88339,-0.23994 0.370806,0 0.64891,0.0982 0.278105,0.0954 0.47714,0.23993 l -0.294463,0.43897 q -0.174497,-0.11179 -0.378985,-0.17995 -0.201762,-0.0709 -0.436243,-0.0709 -0.253565,0 -0.370805,0.0736 -0.114514,0.0736 -0.114514,0.20449 0,0.0927 0.05726,0.15813 0.05998,0.0627 0.212668,0.1227 0.155411,0.0572 0.441695,0.13905 0.280831,0.0791 0.488046,0.18268 0.209941,0.1036 0.324455,0.27537 0.114513,0.16905 0.114513,0.44715 0,0.31355 -0.182676,0.51804 -0.182676,0.20449 -0.482593,0.30537 -0.299916,0.0981 -0.646183,0.0981 -0.408977,0 -0.714347,-0.11724 -0.305369,-0.11724 -0.518037,-0.30264 l 0.373532,-0.41988 q 0.169044,0.1336 0.384439,0.22084 0.218121,0.0873 0.471686,0.0873 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7181" />
+ </g>
+ <path
+ id="path6252"
+ style="fill:none;fill-opacity:0.483526;stroke:#000081;stroke-width:1.2;stroke-linecap:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker6260)"
+ d="M -30.040541,83.191271 H -85.328359"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-size:5.3167px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ x="91.053413"
+ y="-80.689705"
+ id="text6256"
+ transform="scale(-1)"><tspan
+ sodipodi:role="line"
+ x="91.053413"
+ y="-80.689705"
+ style="fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="tspan6254" /><tspan
+ sodipodi:role="line"
+ x="91.053413"
+ y="-74.043831"
+ style="fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="tspan7420" /></text>
+ <g
+ aria-label="Perform operation with these descriptors
+(setup, inner-loop function, teardown)
+"
+ transform="scale(-1)"
+ id="text7434"
+ style="font-size:5.3167px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000080;fill-opacity:1;stroke-width:0.398751">
+ <path
+ d="m 90.279721,-84.738261 h 1.658872 q 0.739873,0 1.134472,0.329698 0.397195,0.327102 0.397195,0.934576 0,0.610071 -0.397195,0.939768 -0.394599,0.327102 -1.134472,0.327102 h -0.659395 v 1.344751 h -0.999477 z m 0.999477,0.724297 v 1.08255 h 0.552957 q 0.290757,0 0.449116,-0.140186 0.158359,-0.142782 0.158359,-0.402387 0,-0.259604 -0.158359,-0.399791 -0.158359,-0.140186 -0.449116,-0.140186 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7268" />
+ <path
+ d="m 97.037225,-82.323939 v 0.264797 h -2.172889 q 0.03375,0.327101 0.23624,0.490652 0.202491,0.163551 0.565938,0.163551 0.293353,0 0.599686,-0.08567 0.308929,-0.08826 0.633435,-0.264796 v 0.716508 q -0.329698,0.12461 -0.659395,0.186915 -0.329698,0.0649 -0.659396,0.0649 -0.789197,0 -1.227929,-0.399791 -0.436135,-0.402387 -0.436135,-1.126684 0,-0.711316 0.428347,-1.118895 0.430943,-0.407579 1.183796,-0.407579 0.685356,0 1.095531,0.412771 0.412771,0.412771 0.412771,1.103319 z m -0.955344,-0.308929 q 0,-0.264797 -0.155763,-0.425752 -0.153166,-0.163551 -0.402387,-0.163551 -0.269988,0 -0.438731,0.153167 -0.168743,0.150571 -0.21028,0.436136 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7270" />
+ <path
+ d="m 99.900663,-82.978142 q -0.122014,-0.05711 -0.244028,-0.08307 -0.119418,-0.02856 -0.241432,-0.02856 -0.358254,0 -0.552958,0.231048 -0.192107,0.228452 -0.192107,0.656799 v 1.339559 h -0.929384 v -2.90757 h 0.929384 v 0.477672 q 0.179127,-0.285565 0.410175,-0.415367 0.233644,-0.132398 0.55815,-0.132398 0.04673,0 0.101246,0.0052 0.05452,0.0026 0.158358,0.01558 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7272" />
+ <path
+ d="m 102.27604,-84.901812 v 0.610071 h -0.51401 q -0.1973,0 -0.27518,0.07269 -0.0779,0.07009 -0.0779,0.246624 v 0.202492 h 0.79439 v 0.664587 h -0.79439 v 2.242983 h -0.92939 v -2.242983 h -0.46209 v -0.664587 h 0.46209 v -0.202492 q 0,-0.475076 0.2648,-0.700932 0.26479,-0.228452 0.82035,-0.228452 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7274" />
+ <path
+ d="m 104.05953,-83.175442 q -0.30893,0 -0.47248,0.22326 -0.16096,0.220664 -0.16096,0.638627 0,0.417963 0.16096,0.641223 0.16355,0.220664 0.47248,0.220664 0.30373,0 0.46469,-0.220664 0.16095,-0.22326 0.16095,-0.641223 0,-0.417963 -0.16095,-0.638627 -0.16096,-0.22326 -0.46469,-0.22326 z m 0,-0.664587 q 0.75025,0 1.17081,0.404983 0.42316,0.404983 0.42316,1.121491 0,0.716509 -0.42316,1.121492 -0.42056,0.404983 -1.17081,0.404983 -0.75286,0 -1.17861,-0.404983 -0.42315,-0.404983 -0.42315,-1.121492 0,-0.716508 0.42315,-1.121491 0.42575,-0.404983 1.17861,-0.404983 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7276" />
+ <path
+ d="m 108.48838,-82.978142 q -0.12201,-0.05711 -0.24403,-0.08307 -0.11942,-0.02856 -0.24143,-0.02856 -0.35826,0 -0.55296,0.231048 -0.19211,0.228452 -0.19211,0.656799 v 1.339559 h -0.92938 v -2.90757 h 0.92938 v 0.477672 q 0.17913,-0.285565 0.41018,-0.415367 0.23364,-0.132398 0.55815,-0.132398 0.0467,0 0.10124,0.0052 0.0545,0.0026 0.15836,0.01558 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7278" />
+ <path
+ d="m 111.64517,-83.287072 q 0.17653,-0.269988 0.41796,-0.410175 0.24403,-0.142782 0.53479,-0.142782 0.50104,0 0.76324,0.308929 0.2622,0.308929 0.2622,0.898232 v 1.770502 h -0.93458 v -1.51609 q 0.003,-0.03375 0.003,-0.07009 0.003,-0.03634 0.003,-0.103842 0,-0.308929 -0.0909,-0.44652 -0.0909,-0.140186 -0.29335,-0.140186 -0.2648,0 -0.41018,0.218068 -0.14278,0.218067 -0.14797,0.630839 v 1.427824 h -0.93458 v -1.51609 q 0,-0.482864 -0.0831,-0.620455 -0.0831,-0.140186 -0.29595,-0.140186 -0.26739,0 -0.41277,0.220664 -0.14538,0.218067 -0.14538,0.625647 v 1.43042 h -0.93458 v -2.90757 h 0.93458 v 0.425751 q 0.17134,-0.246624 0.392,-0.371234 0.22326,-0.12461 0.49065,-0.12461 0.30115,0 0.53219,0.145378 0.23105,0.145379 0.35047,0.407579 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7280" />
+ <path
+ d="m 117.72511,-83.175442 q -0.30893,0 -0.47248,0.22326 -0.16096,0.220664 -0.16096,0.638627 0,0.417963 0.16096,0.641223 0.16355,0.220664 0.47248,0.220664 0.30373,0 0.46469,-0.220664 0.16095,-0.22326 0.16095,-0.641223 0,-0.417963 -0.16095,-0.638627 -0.16096,-0.22326 -0.46469,-0.22326 z m 0,-0.664587 q 0.75025,0 1.17081,0.404983 0.42316,0.404983 0.42316,1.121491 0,0.716509 -0.42316,1.121492 -0.42056,0.404983 -1.17081,0.404983 -0.75286,0 -1.17861,-0.404983 -0.42315,-0.404983 -0.42315,-1.121492 0,-0.716508 0.42315,-1.121491 0.42575,-0.404983 1.17861,-0.404983 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7282" />
+ <path
+ d="m 120.92343,-81.282925 v 1.526474 h -0.92938 v -4.013485 h 0.92938 v 0.425751 q 0.19211,-0.254412 0.42576,-0.37383 0.23364,-0.122014 0.53738,-0.122014 0.53738,0 0.88265,0.428347 0.34528,0.425752 0.34528,1.098127 0,0.672376 -0.34528,1.100723 -0.34527,0.425752 -0.88265,0.425752 -0.30374,0 -0.53738,-0.119418 -0.23365,-0.122015 -0.42576,-0.376427 z m 0.61786,-1.882133 q -0.29854,0 -0.4595,0.220664 -0.15836,0.218068 -0.15836,0.630839 0,0.412771 0.15836,0.633435 0.16096,0.218068 0.4595,0.218068 0.29855,0 0.45431,-0.218068 0.15836,-0.218068 0.15836,-0.633435 0,-0.415367 -0.15836,-0.633435 -0.15576,-0.218068 -0.45431,-0.218068 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7284" />
+ <path
+ d="m 126.70223,-82.323939 v 0.264797 h -2.17289 q 0.0337,0.327101 0.23624,0.490652 0.20249,0.163551 0.56594,0.163551 0.29335,0 0.59969,-0.08567 0.30892,-0.08826 0.63343,-0.264796 v 0.716508 q -0.3297,0.12461 -0.6594,0.186915 -0.32969,0.0649 -0.65939,0.0649 -0.7892,0 -1.22793,-0.399791 -0.43614,-0.402387 -0.43614,-1.126684 0,-0.711316 0.42835,-1.118895 0.43095,-0.407579 1.1838,-0.407579 0.68535,0 1.09553,0.412771 0.41277,0.412771 0.41277,1.103319 z m -0.95534,-0.308929 q 0,-0.264797 -0.15577,-0.425752 -0.15316,-0.163551 -0.40238,-0.163551 -0.26999,0 -0.43874,0.153167 -0.16874,0.150571 -0.21027,0.436136 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7286" />
+ <path
+ d="m 129.56567,-82.978142 q -0.12202,-0.05711 -0.24403,-0.08307 -0.11942,-0.02856 -0.24143,-0.02856 -0.35826,0 -0.55296,0.231048 -0.19211,0.228452 -0.19211,0.656799 v 1.339559 h -0.92938 v -2.90757 h 0.92938 v 0.477672 q 0.17913,-0.285565 0.41018,-0.415367 0.23364,-0.132398 0.55815,-0.132398 0.0467,0 0.10124,0.0052 0.0545,0.0026 0.15836,0.01558 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7288" />
+ <path
+ d="m 131.33098,-82.170772 q -0.29076,0 -0.43873,0.09865 -0.14538,0.09865 -0.14538,0.290757 0,0.176531 0.11682,0.277777 0.11942,0.09865 0.3297,0.09865 0.2622,0 0.44133,-0.186915 0.17912,-0.189512 0.17912,-0.472481 v -0.106437 z m 1.42004,-0.350466 v 1.658872 h -0.93718 v -0.430943 q -0.18691,0.264796 -0.42056,0.386811 -0.23364,0.119418 -0.56853,0.119418 -0.45171,0 -0.73468,-0.262201 -0.28037,-0.264797 -0.28037,-0.685356 0,-0.511421 0.35046,-0.750257 0.35307,-0.238836 1.10592,-0.238836 h 0.54776 v -0.07269 q 0,-0.220664 -0.17393,-0.32191 -0.17394,-0.103842 -0.54257,-0.103842 -0.29855,0 -0.55556,0.05971 -0.25701,0.05971 -0.47767,0.179128 v -0.708721 q 0.29854,-0.07269 0.59969,-0.109034 0.30114,-0.03894 0.60228,-0.03894 0.7866,0 1.13447,0.311525 0.35047,0.308929 0.35047,1.007266 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7290" />
+ <path
+ d="m 134.63055,-84.595478 v 0.825542 h 0.95794 v 0.664587 h -0.95794 v 1.233122 q 0,0.202491 0.0805,0.275181 0.0805,0.07009 0.31931,0.07009 h 0.47768 v 0.664587 h -0.79699 q -0.55036,0 -0.78141,-0.228452 -0.22845,-0.231048 -0.22845,-0.781409 v -1.233122 h -0.4621 v -0.664587 h 0.4621 v -0.825542 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7292" />
+ <path
+ d="m 136.15703,-83.769936 h 0.92938 v 2.90757 h -0.92938 z m 0,-1.131876 h 0.92938 v 0.758046 h -0.92938 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7294" />
+ <path
+ d="m 139.36314,-83.175442 q -0.30893,0 -0.47248,0.22326 -0.16095,0.220664 -0.16095,0.638627 0,0.417963 0.16095,0.641223 0.16355,0.220664 0.47248,0.220664 0.30374,0 0.4647,-0.220664 0.16095,-0.22326 0.16095,-0.641223 0,-0.417963 -0.16095,-0.638627 -0.16096,-0.22326 -0.4647,-0.22326 z m 0,-0.664587 q 0.75026,0 1.17082,0.404983 0.42316,0.404983 0.42316,1.121491 0,0.716509 -0.42316,1.121492 -0.42056,0.404983 -1.17082,0.404983 -0.75285,0 -1.1786,-0.404983 -0.42316,-0.404983 -0.42316,-1.121492 0,-0.716508 0.42316,-1.121491 0.42575,-0.404983 1.1786,-0.404983 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7296" />
+ <path
+ d="m 144.55523,-82.632868 v 1.770502 h -0.93457 v -0.288161 -1.066974 q 0,-0.376427 -0.0182,-0.519209 -0.0156,-0.142783 -0.0571,-0.21028 -0.0545,-0.09086 -0.14797,-0.140186 -0.0935,-0.05192 -0.21288,-0.05192 -0.29076,0 -0.4569,0.225856 -0.16615,0.22326 -0.16615,0.620455 v 1.43042 h -0.92938 v -2.90757 h 0.92938 v 0.425751 q 0.21028,-0.254412 0.44652,-0.37383 0.23624,-0.122014 0.5218,-0.122014 0.50364,0 0.76324,0.308929 0.2622,0.308929 0.2622,0.898232 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7298" />
+ <path
+ d="m 147.00849,-83.769936 h 0.90343 l 0.48805,2.004147 0.49066,-2.004147 h 0.77621 l 0.48806,1.983378 0.49065,-1.983378 h 0.90343 l -0.76584,2.90757 h -1.01505 l -0.49065,-1.998954 -0.48806,1.998954 h -1.01505 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7300" />
+ <path
+ d="m 152.17982,-83.769936 h 0.92938 v 2.90757 h -0.92938 z m 0,-1.131876 h 0.92938 v 0.758046 h -0.92938 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7302" />
+ <path
+ d="m 155.01729,-84.595478 v 0.825542 h 0.95795 v 0.664587 h -0.95795 v 1.233122 q 0,0.202491 0.0805,0.275181 0.0805,0.07009 0.31932,0.07009 h 0.47767 v 0.664587 h -0.79699 q -0.55036,0 -0.78141,-0.228452 -0.22845,-0.231048 -0.22845,-0.781409 v -1.233122 h -0.4621 v -0.664587 h 0.4621 v -0.825542 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7304" />
+ <path
+ d="m 159.46691,-82.632868 v 1.770502 h -0.93458 v -0.288161 -1.061782 q 0,-0.381619 -0.0182,-0.524401 -0.0156,-0.142783 -0.0571,-0.21028 -0.0545,-0.09086 -0.14798,-0.140186 -0.0934,-0.05192 -0.21287,-0.05192 -0.29076,0 -0.45691,0.225856 -0.16614,0.22326 -0.16614,0.620455 v 1.43042 h -0.92939 v -4.039446 h 0.92939 v 1.557627 q 0.21028,-0.254412 0.44652,-0.37383 0.23624,-0.122014 0.5218,-0.122014 0.50364,0 0.76324,0.308929 0.2622,0.308929 0.2622,0.898232 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7306" />
+ <path
+ d="m 163.19483,-84.595478 v 0.825542 h 0.95794 v 0.664587 h -0.95794 v 1.233122 q 0,0.202491 0.0805,0.275181 0.0805,0.07009 0.31932,0.07009 h 0.47767 v 0.664587 h -0.79699 q -0.55036,0 -0.78141,-0.228452 -0.22845,-0.231048 -0.22845,-0.781409 v -1.233122 h -0.4621 v -0.664587 h 0.4621 v -0.825542 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7308" />
+ <path
+ d="m 167.64445,-82.632868 v 1.770502 h -0.93457 v -0.288161 -1.061782 q 0,-0.381619 -0.0182,-0.524401 -0.0156,-0.142783 -0.0571,-0.21028 -0.0545,-0.09086 -0.14797,-0.140186 -0.0935,-0.05192 -0.21288,-0.05192 -0.29075,0 -0.4569,0.225856 -0.16615,0.22326 -0.16615,0.620455 v 1.43042 h -0.92938 v -4.039446 h 0.92938 v 1.557627 q 0.21028,-0.254412 0.44652,-0.37383 0.23624,-0.122014 0.52181,-0.122014 0.50363,0 0.76323,0.308929 0.2622,0.308929 0.2622,0.898232 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7310" />
+ <path
+ d="m 171.40872,-82.323939 v 0.264797 h -2.17289 q 0.0337,0.327101 0.23624,0.490652 0.20249,0.163551 0.56594,0.163551 0.29335,0 0.59968,-0.08567 0.30893,-0.08826 0.63344,-0.264796 v 0.716508 q -0.3297,0.12461 -0.6594,0.186915 -0.32969,0.0649 -0.65939,0.0649 -0.7892,0 -1.22793,-0.399791 -0.43614,-0.402387 -0.43614,-1.126684 0,-0.711316 0.42835,-1.118895 0.43094,-0.407579 1.1838,-0.407579 0.68535,0 1.09553,0.412771 0.41277,0.412771 0.41277,1.103319 z m -0.95534,-0.308929 q 0,-0.264797 -0.15577,-0.425752 -0.15316,-0.163551 -0.40238,-0.163551 -0.26999,0 -0.43874,0.153167 -0.16874,0.150571 -0.21028,0.436136 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7312" />
+ <path
+ d="m 174.38378,-83.679074 v 0.706124 q -0.29854,-0.12461 -0.57632,-0.186915 -0.27777,-0.06231 -0.5244,-0.06231 -0.26479,0 -0.3946,0.0675 -0.1272,0.0649 -0.1272,0.202491 0,0.11163 0.0961,0.171339 0.0986,0.05971 0.35047,0.08827 l 0.16355,0.02336 q 0.71391,0.09086 0.96053,0.298545 0.24663,0.207684 0.24663,0.651607 0,0.464692 -0.34268,0.698337 -0.34268,0.233644 -1.02284,0.233644 -0.28816,0 -0.59709,-0.04673 -0.30634,-0.04413 -0.63084,-0.134995 v -0.706124 q 0.27778,0.134995 0.56853,0.202492 0.29336,0.0675 0.5945,0.0675 0.27258,0 0.41017,-0.07529 0.13759,-0.07529 0.13759,-0.22326 0,-0.12461 -0.096,-0.184319 -0.0935,-0.06231 -0.37643,-0.09605 l -0.16355,-0.02077 q -0.62045,-0.07788 -0.86967,-0.288161 -0.24922,-0.21028 -0.24922,-0.638628 0,-0.462096 0.31671,-0.685355 0.31672,-0.22326 0.97092,-0.22326 0.25701,0 0.53998,0.03894 0.28297,0.03894 0.61526,0.122015 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7314" />
+ <path
+ d="m 178.1792,-82.323939 v 0.264797 h -2.17288 q 0.0337,0.327101 0.23624,0.490652 0.20249,0.163551 0.56593,0.163551 0.29336,0 0.59969,-0.08567 0.30893,-0.08826 0.63343,-0.264796 v 0.716508 q -0.32969,0.12461 -0.65939,0.186915 -0.3297,0.0649 -0.6594,0.0649 -0.78919,0 -1.22793,-0.399791 -0.43613,-0.402387 -0.43613,-1.126684 0,-0.711316 0.42835,-1.118895 0.43094,-0.407579 1.18379,-0.407579 0.68536,0 1.09553,0.412771 0.41277,0.412771 0.41277,1.103319 z m -0.95534,-0.308929 q 0,-0.264797 -0.15576,-0.425752 -0.15317,-0.163551 -0.40239,-0.163551 -0.26999,0 -0.43873,0.153167 -0.16874,0.150571 -0.21028,0.436136 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7316" />
+ <path
+ d="m 182.7119,-83.344185 v -1.557627 h 0.93458 v 4.039446 h -0.93458 v -0.420559 q -0.19211,0.257008 -0.42316,0.376427 -0.23104,0.119418 -0.53478,0.119418 -0.53738,0 -0.88266,-0.425752 -0.34527,-0.428347 -0.34527,-1.100723 0,-0.672375 0.34527,-1.098127 0.34528,-0.428347 0.88266,-0.428347 0.30114,0 0.53219,0.122014 0.23364,0.119418 0.42575,0.37383 z m -0.61267,1.882133 q 0.29855,0 0.45431,-0.218068 0.15836,-0.218068 0.15836,-0.633435 0,-0.415367 -0.15836,-0.633435 -0.15576,-0.218068 -0.45431,-0.218068 -0.29595,0 -0.45431,0.218068 -0.15576,0.218068 -0.15576,0.633435 0,0.415367 0.15576,0.633435 0.15836,0.218068 0.45431,0.218068 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7318" />
+ <path
+ d="m 187.44189,-82.323939 v 0.264797 H 185.269 q 0.0337,0.327101 0.23624,0.490652 0.20249,0.163551 0.56594,0.163551 0.29335,0 0.59969,-0.08567 0.30893,-0.08826 0.63343,-0.264796 v 0.716508 q -0.3297,0.12461 -0.65939,0.186915 -0.3297,0.0649 -0.6594,0.0649 -0.7892,0 -1.22793,-0.399791 -0.43613,-0.402387 -0.43613,-1.126684 0,-0.711316 0.42834,-1.118895 0.43095,-0.407579 1.1838,-0.407579 0.68536,0 1.09553,0.412771 0.41277,0.412771 0.41277,1.103319 z m -0.95534,-0.308929 q 0,-0.264797 -0.15576,-0.425752 -0.15317,-0.163551 -0.40239,-0.163551 -0.26999,0 -0.43873,0.153167 -0.16875,0.150571 -0.21028,0.436136 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7320" />
+ <path
+ d="m 190.41696,-83.679074 v 0.706124 q -0.29854,-0.12461 -0.57632,-0.186915 -0.27777,-0.06231 -0.5244,-0.06231 -0.26479,0 -0.3946,0.0675 -0.1272,0.0649 -0.1272,0.202491 0,0.11163 0.096,0.171339 0.0986,0.05971 0.35047,0.08827 l 0.16355,0.02336 q 0.71391,0.09086 0.96053,0.298545 0.24663,0.207684 0.24663,0.651607 0,0.464692 -0.34268,0.698337 -0.34268,0.233644 -1.02284,0.233644 -0.28816,0 -0.59709,-0.04673 -0.30633,-0.04413 -0.63084,-0.134995 v -0.706124 q 0.27778,0.134995 0.56853,0.202492 0.29336,0.0675 0.5945,0.0675 0.27258,0 0.41017,-0.07529 0.13759,-0.07529 0.13759,-0.22326 0,-0.12461 -0.096,-0.184319 -0.0935,-0.06231 -0.37643,-0.09605 l -0.16355,-0.02077 q -0.62045,-0.07788 -0.86967,-0.288161 -0.24922,-0.21028 -0.24922,-0.638628 0,-0.462096 0.31671,-0.685355 0.31672,-0.22326 0.97092,-0.22326 0.25701,0 0.53998,0.03894 0.28297,0.03894 0.61526,0.122015 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7322" />
+ <path
+ d="m 193.65942,-83.679074 v 0.758045 q -0.18951,-0.129803 -0.38162,-0.192108 -0.18951,-0.06231 -0.3946,-0.06231 -0.3894,0 -0.60747,0.228452 -0.21547,0.225856 -0.21547,0.633435 0,0.407579 0.21547,0.636031 0.21807,0.225856 0.60747,0.225856 0.21807,0 0.41277,-0.0649 0.1973,-0.0649 0.36345,-0.192107 v 0.760641 q -0.21807,0.08048 -0.44392,0.119418 -0.22326,0.04154 -0.44912,0.04154 -0.7866,0 -1.23052,-0.402387 -0.44393,-0.404983 -0.44393,-1.124088 0,-0.719104 0.44393,-1.121491 0.44392,-0.404983 1.23052,-0.404983 0.22845,0 0.44912,0.04154 0.22326,0.03894 0.44392,0.119419 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7324" />
+ <path
+ d="m 196.62151,-82.978142 q -0.12201,-0.05711 -0.24403,-0.08307 -0.11941,-0.02856 -0.24143,-0.02856 -0.35825,0 -0.55296,0.231048 -0.1921,0.228452 -0.1921,0.656799 v 1.339559 h -0.92939 v -2.90757 h 0.92939 v 0.477672 q 0.17912,-0.285565 0.41017,-0.415367 0.23365,-0.132398 0.55815,-0.132398 0.0467,0 0.10125,0.0052 0.0545,0.0026 0.15836,0.01558 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7326" />
+ <path
+ d="m 197.0836,-83.769936 h 0.92939 v 2.90757 h -0.92939 z m 0,-1.131876 h 0.92939 v 0.758046 h -0.92939 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7328" />
+ <path
+ d="m 199.83541,-81.282925 v 1.526474 h -0.92938 v -4.013485 h 0.92938 v 0.425751 q 0.19211,-0.254412 0.42576,-0.37383 0.23364,-0.122014 0.53738,-0.122014 0.53738,0 0.88265,0.428347 0.34528,0.425752 0.34528,1.098127 0,0.672376 -0.34528,1.100723 -0.34527,0.425752 -0.88265,0.425752 -0.30374,0 -0.53738,-0.119418 -0.23365,-0.122015 -0.42576,-0.376427 z m 0.61786,-1.882133 q -0.29854,0 -0.4595,0.220664 -0.15836,0.218068 -0.15836,0.630839 0,0.412771 0.15836,0.633435 0.16096,0.218068 0.4595,0.218068 0.29855,0 0.45431,-0.218068 0.15836,-0.218068 0.15836,-0.633435 0,-0.415367 -0.15836,-0.633435 -0.15576,-0.218068 -0.45431,-0.218068 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7330" />
+ <path
+ d="m 203.72689,-84.595478 v 0.825542 h 0.95794 v 0.664587 h -0.95794 v 1.233122 q 0,0.202491 0.0805,0.275181 0.0805,0.07009 0.31932,0.07009 h 0.47767 v 0.664587 h -0.79699 q -0.55036,0 -0.78141,-0.228452 -0.22845,-0.231048 -0.22845,-0.781409 v -1.233122 h -0.46209 v -0.664587 h 0.46209 v -0.825542 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7332" />
+ <path
+ d="m 206.63705,-83.175442 q -0.30893,0 -0.47248,0.22326 -0.16095,0.220664 -0.16095,0.638627 0,0.417963 0.16095,0.641223 0.16355,0.220664 0.47248,0.220664 0.30374,0 0.46469,-0.220664 0.16096,-0.22326 0.16096,-0.641223 0,-0.417963 -0.16096,-0.638627 -0.16095,-0.22326 -0.46469,-0.22326 z m 0,-0.664587 q 0.75026,0 1.17082,0.404983 0.42315,0.404983 0.42315,1.121491 0,0.716509 -0.42315,1.121492 -0.42056,0.404983 -1.17082,0.404983 -0.75285,0 -1.1786,-0.404983 -0.42316,-0.404983 -0.42316,-1.121492 0,-0.716508 0.42316,-1.121491 0.42575,-0.404983 1.1786,-0.404983 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7334" />
+ <path
+ d="m 211.0659,-82.978142 q -0.12201,-0.05711 -0.24403,-0.08307 -0.11941,-0.02856 -0.24143,-0.02856 -0.35825,0 -0.55296,0.231048 -0.1921,0.228452 -0.1921,0.656799 v 1.339559 h -0.92939 v -2.90757 h 0.92939 v 0.477672 q 0.17912,-0.285565 0.41017,-0.415367 0.23365,-0.132398 0.55815,-0.132398 0.0467,0 0.10125,0.0052 0.0545,0.0026 0.15836,0.01558 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7336" />
+ <path
+ d="m 213.79954,-83.679074 v 0.706124 q -0.29854,-0.12461 -0.57632,-0.186915 -0.27778,-0.06231 -0.5244,-0.06231 -0.2648,0 -0.3946,0.0675 -0.12721,0.0649 -0.12721,0.202491 0,0.11163 0.0961,0.171339 0.0987,0.05971 0.35046,0.08827 l 0.16355,0.02336 q 0.71392,0.09086 0.96054,0.298545 0.24662,0.207684 0.24662,0.651607 0,0.464692 -0.34267,0.698337 -0.34268,0.233644 -1.02285,0.233644 -0.28816,0 -0.59709,-0.04673 -0.30633,-0.04413 -0.63083,-0.134995 v -0.706124 q 0.27777,0.134995 0.56853,0.202492 0.29335,0.0675 0.59449,0.0675 0.27259,0 0.41018,-0.07529 0.13759,-0.07529 0.13759,-0.22326 0,-0.12461 -0.0961,-0.184319 -0.0935,-0.06231 -0.37643,-0.09605 l -0.16355,-0.02077 q -0.62046,-0.07788 -0.86968,-0.288161 -0.24922,-0.21028 -0.24922,-0.638628 0,-0.462096 0.31672,-0.685355 0.31672,-0.22326 0.97092,-0.22326 0.25701,0 0.53998,0.03894 0.28297,0.03894 0.61526,0.122015 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7338" />
+ <path
+ d="m 91.795811,-73.515559 h -0.771026 q -0.397194,-0.641223 -0.586706,-1.217545 -0.189511,-0.578918 -0.189511,-1.147452 0,-0.568533 0.189511,-1.150047 0.192108,-0.584111 0.586706,-1.220142 h 0.771026 q -0.332294,0.615263 -0.498441,1.204565 -0.166147,0.586706 -0.166147,1.160432 0,0.573726 0.163551,1.163028 0.166147,0.589303 0.501037,1.207161 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7340" />
+ <path
+ d="m 94.939621,-77.033199 v 0.706124 q -0.298545,-0.12461 -0.576322,-0.186915 -0.277777,-0.06231 -0.524401,-0.06231 -0.264796,0 -0.394599,0.0675 -0.127206,0.0649 -0.127206,0.202491 0,0.11163 0.09605,0.171339 0.09865,0.05971 0.350466,0.08827 l 0.163551,0.02336 q 0.713912,0.09086 0.960536,0.298545 0.246625,0.207684 0.246625,0.651607 0,0.464692 -0.342678,0.698337 -0.342678,0.233644 -1.022842,0.233644 -0.288161,0 -0.59709,-0.04673 -0.306334,-0.04413 -0.630839,-0.134995 v -0.706124 q 0.277776,0.134995 0.568534,0.202492 0.293353,0.0675 0.594494,0.0675 0.272585,0 0.410175,-0.07529 0.13759,-0.07529 0.13759,-0.22326 0,-0.12461 -0.09605,-0.184319 -0.09346,-0.06231 -0.376427,-0.09605 l -0.163551,-0.02077 q -0.620454,-0.07788 -0.869675,-0.28816 -0.24922,-0.21028 -0.24922,-0.638628 0,-0.462096 0.316717,-0.685355 0.316718,-0.22326 0.970921,-0.22326 0.257009,0 0.539978,0.03894 0.282968,0.03894 0.615262,0.122015 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7342" />
+ <path
+ d="m 98.735039,-75.678064 v 0.264797 h -2.17289 q 0.03375,0.327101 0.23624,0.490652 0.202492,0.163551 0.565938,0.163551 0.293353,0 0.599686,-0.08567 0.30893,-0.08826 0.633435,-0.264796 v 0.716508 q -0.329697,0.12461 -0.659395,0.186915 -0.329698,0.0649 -0.659395,0.0649 -0.789198,0 -1.22793,-0.399791 -0.436135,-0.402387 -0.436135,-1.126684 0,-0.711316 0.428347,-1.118895 0.430944,-0.407579 1.183797,-0.407579 0.685356,0 1.095531,0.412771 0.412771,0.412771 0.412771,1.103319 z m -0.955345,-0.308929 q 0,-0.264797 -0.155762,-0.425752 -0.153167,-0.163551 -0.402387,-0.163551 -0.269989,0 -0.438732,0.153167 -0.168743,0.150571 -0.21028,0.436136 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7344" />
+ <path
+ d="m 100.45362,-77.949603 v 0.825542 h 0.95794 v 0.664587 h -0.95794 v 1.233122 q 0,0.202491 0.0805,0.275181 0.0805,0.07009 0.31931,0.07009 h 0.47767 v 0.664587 h -0.79698 q -0.550364,0 -0.781412,-0.228452 -0.228451,-0.231048 -0.228451,-0.781409 v -1.233122 h -0.462096 v -0.664587 h 0.462096 v -0.825542 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7346" />
+ <path
+ d="m 101.94894,-75.348366 v -1.775695 h 0.93458 v 0.290757 q 0,0.23624 -0.003,0.594494 -0.003,0.355658 -0.003,0.475076 0,0.350467 0.0182,0.506229 0.0182,0.153167 0.0623,0.22326 0.0571,0.09086 0.14798,0.140187 0.0935,0.04932 0.21287,0.04932 0.29076,0 0.45691,-0.223259 0.16614,-0.22326 0.16614,-0.620455 v -1.435613 h 0.92939 v 2.90757 h -0.92939 v -0.420559 q -0.21027,0.254412 -0.44651,0.376426 -0.23365,0.119419 -0.51662,0.119419 -0.50363,0 -0.76843,-0.30893 -0.2622,-0.308929 -0.2622,-0.898231 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7348" />
+ <path
+ d="m 106.69451,-74.63705 v 1.526474 h -0.92938 v -4.013485 h 0.92938 v 0.425751 q 0.19211,-0.254412 0.42575,-0.37383 0.23365,-0.122014 0.53739,-0.122014 0.53738,0 0.88265,0.428347 0.34527,0.425752 0.34527,1.098127 0,0.672376 -0.34527,1.100723 -0.34527,0.425752 -0.88265,0.425752 -0.30374,0 -0.53739,-0.119419 -0.23364,-0.122014 -0.42575,-0.376426 z m 0.61786,-1.882133 q -0.29854,0 -0.4595,0.220664 -0.15836,0.218068 -0.15836,0.630839 0,0.412771 0.15836,0.633435 0.16096,0.218068 0.4595,0.218068 0.29855,0 0.45431,-0.218068 0.15836,-0.218068 0.15836,-0.633435 0,-0.415367 -0.15836,-0.633435 -0.15576,-0.218068 -0.45431,-0.218068 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7350" />
+ <path
+ d="m 109.66698,-75.22116 h 0.93458 v 0.791794 l -0.64122,0.968324 h -0.55296 l 0.2596,-0.968324 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7352" />
+ <path
+ d="m 113.44163,-77.124061 h 0.92939 v 2.90757 h -0.92939 z m 0,-1.131876 h 0.92939 v 0.758045 h -0.92939 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7354" />
+ <path
+ d="m 118.1872,-75.986993 v 1.770502 h -0.93457 v -0.288161 -1.066974 q 0,-0.376427 -0.0182,-0.519209 -0.0156,-0.142783 -0.0571,-0.21028 -0.0545,-0.09086 -0.14797,-0.140186 -0.0935,-0.05192 -0.21288,-0.05192 -0.29076,0 -0.4569,0.225856 -0.16615,0.22326 -0.16615,0.620455 v 1.43042 h -0.92938 v -2.90757 h 0.92938 v 0.425751 q 0.21028,-0.254412 0.44652,-0.37383 0.23624,-0.122014 0.52181,-0.122014 0.50363,0 0.76323,0.308929 0.2622,0.308929 0.2622,0.898232 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7356" />
+ <path
+ d="m 121.97224,-75.986993 v 1.770502 h -0.93458 v -0.288161 -1.066974 q 0,-0.376427 -0.0182,-0.519209 -0.0156,-0.142783 -0.0571,-0.21028 -0.0545,-0.09086 -0.14798,-0.140186 -0.0935,-0.05192 -0.21287,-0.05192 -0.29076,0 -0.45691,0.225856 -0.16614,0.22326 -0.16614,0.620455 v 1.43042 h -0.92939 v -2.90757 h 0.92939 v 0.425751 q 0.21027,-0.254412 0.44652,-0.37383 0.23624,-0.122014 0.5218,-0.122014 0.50363,0 0.76324,0.308929 0.2622,0.308929 0.2622,0.898232 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7358" />
+ <path
+ d="m 125.7365,-75.678064 v 0.264797 h -2.17289 q 0.0337,0.327101 0.23624,0.490652 0.20249,0.163551 0.56594,0.163551 0.29335,0 0.59969,-0.08567 0.30893,-0.08826 0.63343,-0.264796 v 0.716508 q -0.3297,0.12461 -0.65939,0.186915 -0.3297,0.0649 -0.6594,0.0649 -0.7892,0 -1.22793,-0.399791 -0.43613,-0.402387 -0.43613,-1.126684 0,-0.711316 0.42834,-1.118895 0.43095,-0.407579 1.1838,-0.407579 0.68536,0 1.09553,0.412771 0.41277,0.412771 0.41277,1.103319 z m -0.95534,-0.308929 q 0,-0.264797 -0.15577,-0.425752 -0.15316,-0.163551 -0.40238,-0.163551 -0.26999,0 -0.43873,0.153167 -0.16875,0.150571 -0.21028,0.436136 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7360" />
+ <path
+ d="m 128.59994,-76.332267 q -0.12201,-0.05711 -0.24403,-0.08307 -0.11942,-0.02856 -0.24143,-0.02856 -0.35825,0 -0.55296,0.231048 -0.1921,0.228452 -0.1921,0.656799 v 1.339559 h -0.92939 v -2.90757 h 0.92939 v 0.477672 q 0.17912,-0.285565 0.41017,-0.415367 0.23364,-0.132398 0.55815,-0.132398 0.0467,0 0.10125,0.0052 0.0545,0.0026 0.15835,0.01558 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7362" />
+ <path
+ d="m 128.90368,-76.124584 h 1.63031 v 0.755449 h -1.63031 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7364" />
+ <path
+ d="m 131.26867,-78.255937 h 0.92939 v 4.039446 h -0.92939 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7366" />
+ <path
+ d="m 134.47479,-76.529567 q -0.30893,0 -0.47248,0.22326 -0.16096,0.220664 -0.16096,0.638627 0,0.417963 0.16096,0.641223 0.16355,0.220664 0.47248,0.220664 0.30374,0 0.46469,-0.220664 0.16096,-0.22326 0.16096,-0.641223 0,-0.417963 -0.16096,-0.638627 -0.16095,-0.22326 -0.46469,-0.22326 z m 0,-0.664587 q 0.75026,0 1.17081,0.404983 0.42316,0.404983 0.42316,1.121491 0,0.716509 -0.42316,1.121492 -0.42055,0.404983 -1.17081,0.404983 -0.75285,0 -1.17861,-0.404983 -0.42315,-0.404983 -0.42315,-1.121492 0,-0.716508 0.42315,-1.121491 0.42576,-0.404983 1.17861,-0.404983 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7368" />
+ <path
+ d="m 138.12743,-76.529567 q -0.30893,0 -0.47248,0.22326 -0.16096,0.220664 -0.16096,0.638627 0,0.417963 0.16096,0.641223 0.16355,0.220664 0.47248,0.220664 0.30373,0 0.46469,-0.220664 0.16095,-0.22326 0.16095,-0.641223 0,-0.417963 -0.16095,-0.638627 -0.16096,-0.22326 -0.46469,-0.22326 z m 0,-0.664587 q 0.75025,0 1.17081,0.404983 0.42316,0.404983 0.42316,1.121491 0,0.716509 -0.42316,1.121492 -0.42056,0.404983 -1.17081,0.404983 -0.75286,0 -1.17861,-0.404983 -0.42315,-0.404983 -0.42315,-1.121492 0,-0.716508 0.42315,-1.121491 0.42575,-0.404983 1.17861,-0.404983 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7370" />
+ <path
+ d="m 141.32575,-74.63705 v 1.526474 h -0.92938 v -4.013485 h 0.92938 v 0.425751 q 0.19211,-0.254412 0.42575,-0.37383 0.23365,-0.122014 0.53738,-0.122014 0.53739,0 0.88266,0.428347 0.34527,0.425752 0.34527,1.098127 0,0.672376 -0.34527,1.100723 -0.34527,0.425752 -0.88266,0.425752 -0.30373,0 -0.53738,-0.119419 -0.23364,-0.122014 -0.42575,-0.376426 z m 0.61786,-1.882133 q -0.29854,0 -0.4595,0.220664 -0.15836,0.218068 -0.15836,0.630839 0,0.412771 0.15836,0.633435 0.16096,0.218068 0.4595,0.218068 0.29855,0 0.45431,-0.218068 0.15836,-0.218068 0.15836,-0.633435 0,-0.415367 -0.15836,-0.633435 -0.15576,-0.218068 -0.45431,-0.218068 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7372" />
+ <path
+ d="m 147.96643,-78.255937 v 0.610071 h -0.51401 q -0.1973,0 -0.27518,0.07269 -0.0779,0.07009 -0.0779,0.246624 v 0.202492 h 0.79439 v 0.664587 h -0.79439 v 2.242983 h -0.92938 v -2.242983 h -0.4621 v -0.664587 h 0.4621 v -0.202492 q 0,-0.475076 0.2648,-0.700932 0.26479,-0.228452 0.82035,-0.228452 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7374" />
+ <path
+ d="m 148.33507,-75.348366 v -1.775695 h 0.93458 v 0.290757 q 0,0.23624 -0.003,0.594494 -0.003,0.355658 -0.003,0.475076 0,0.350467 0.0182,0.506229 0.0182,0.153167 0.0623,0.22326 0.0571,0.09086 0.14798,0.140187 0.0935,0.04932 0.21287,0.04932 0.29076,0 0.45691,-0.223259 0.16614,-0.22326 0.16614,-0.620455 v -1.435613 h 0.92939 v 2.90757 h -0.92939 v -0.420559 q -0.21028,0.254412 -0.44652,0.376426 -0.23364,0.119419 -0.51661,0.119419 -0.50363,0 -0.76843,-0.30893 -0.2622,-0.308929 -0.2622,-0.898231 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7376" />
+ <path
+ d="m 155.0744,-75.986993 v 1.770502 h -0.93457 v -0.288161 -1.066974 q 0,-0.376427 -0.0182,-0.519209 -0.0156,-0.142783 -0.0571,-0.21028 -0.0545,-0.09086 -0.14797,-0.140186 -0.0935,-0.05192 -0.21288,-0.05192 -0.29075,0 -0.4569,0.225856 -0.16615,0.22326 -0.16615,0.620455 v 1.43042 h -0.92938 v -2.90757 h 0.92938 v 0.425751 q 0.21028,-0.254412 0.44652,-0.37383 0.23624,-0.122014 0.52181,-0.122014 0.50363,0 0.76323,0.308929 0.2622,0.308929 0.2622,0.898232 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7378" />
+ <path
+ d="m 158.28571,-77.033199 v 0.758045 q -0.18951,-0.129803 -0.38162,-0.192108 -0.18951,-0.0623 -0.3946,-0.0623 -0.3894,0 -0.60747,0.228452 -0.21547,0.225856 -0.21547,0.633435 0,0.407579 0.21547,0.636031 0.21807,0.225856 0.60747,0.225856 0.21807,0 0.41277,-0.0649 0.1973,-0.0649 0.36345,-0.192107 v 0.760641 q -0.21807,0.08048 -0.44392,0.119418 -0.22326,0.04154 -0.44912,0.04154 -0.7866,0 -1.23053,-0.402387 -0.44392,-0.404983 -0.44392,-1.124088 0,-0.719104 0.44392,-1.121491 0.44393,-0.404983 1.23053,-0.404983 0.22845,0 0.44912,0.04154 0.22326,0.03894 0.44392,0.119419 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7380" />
+ <path
+ d="m 160.10295,-77.949603 v 0.825542 h 0.95794 v 0.664587 h -0.95794 v 1.233122 q 0,0.202491 0.0805,0.275181 0.0805,0.07009 0.31932,0.07009 h 0.47767 v 0.664587 h -0.79699 q -0.55036,0 -0.78141,-0.228452 -0.22845,-0.231048 -0.22845,-0.781409 v -1.233122 h -0.46209 v -0.664587 h 0.46209 v -0.825542 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7382" />
+ <path
+ d="m 161.62942,-77.124061 h 0.92938 v 2.90757 h -0.92938 z m 0,-1.131876 h 0.92938 v 0.758045 h -0.92938 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7384" />
+ <path
+ d="m 164.83554,-76.529567 q -0.30893,0 -0.47248,0.22326 -0.16096,0.220664 -0.16096,0.638627 0,0.417963 0.16096,0.641223 0.16355,0.220664 0.47248,0.220664 0.30373,0 0.46469,-0.220664 0.16095,-0.22326 0.16095,-0.641223 0,-0.417963 -0.16095,-0.638627 -0.16096,-0.22326 -0.46469,-0.22326 z m 0,-0.664587 q 0.75025,0 1.17081,0.404983 0.42316,0.404983 0.42316,1.121491 0,0.716509 -0.42316,1.121492 -0.42056,0.404983 -1.17081,0.404983 -0.75286,0 -1.17861,-0.404983 -0.42315,-0.404983 -0.42315,-1.121492 0,-0.716508 0.42315,-1.121491 0.42575,-0.404983 1.17861,-0.404983 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7386" />
+ <path
+ d="m 170.02763,-75.986993 v 1.770502 h -0.93458 v -0.288161 -1.066974 q 0,-0.376427 -0.0182,-0.519209 -0.0156,-0.142783 -0.0571,-0.21028 -0.0545,-0.09086 -0.14797,-0.140186 -0.0935,-0.05192 -0.21288,-0.05192 -0.29075,0 -0.4569,0.225856 -0.16615,0.22326 -0.16615,0.620455 v 1.43042 h -0.92938 v -2.90757 h 0.92938 v 0.425751 q 0.21028,-0.254412 0.44652,-0.37383 0.23624,-0.122014 0.52181,-0.122014 0.50363,0 0.76323,0.308929 0.26221,0.308929 0.26221,0.898232 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7388" />
+ <path
+ d="m 170.98557,-75.22116 h 0.93457 v 0.791794 l -0.64122,0.968324 h -0.55296 l 0.25961,-0.968324 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7390" />
+ <path
+ d="m 175.77527,-77.949603 v 0.825542 h 0.95794 v 0.664587 h -0.95794 v 1.233122 q 0,0.202491 0.0805,0.275181 0.0805,0.07009 0.31931,0.07009 h 0.47767 v 0.664587 h -0.79698 q -0.55036,0 -0.78141,-0.228452 -0.22845,-0.231048 -0.22845,-0.781409 v -1.233122 h -0.4621 v -0.664587 h 0.4621 v -0.825542 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7392" />
+ <path
+ d="m 180.20412,-75.678064 v 0.264797 h -2.17289 q 0.0337,0.327101 0.23624,0.490652 0.20249,0.163551 0.56594,0.163551 0.29335,0 0.59969,-0.08567 0.30893,-0.08826 0.63343,-0.264796 v 0.716508 q -0.3297,0.12461 -0.65939,0.186915 -0.3297,0.0649 -0.6594,0.0649 -0.7892,0 -1.22793,-0.399791 -0.43613,-0.402387 -0.43613,-1.126684 0,-0.711316 0.42834,-1.118895 0.43095,-0.407579 1.1838,-0.407579 0.68536,0 1.09553,0.412771 0.41277,0.412771 0.41277,1.103319 z m -0.95534,-0.308929 q 0,-0.264797 -0.15576,-0.425752 -0.15317,-0.163551 -0.40239,-0.163551 -0.26999,0 -0.43873,0.153167 -0.16875,0.150571 -0.21028,0.436136 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7394" />
+ <path
+ d="m 182.21086,-75.524897 q -0.29075,0 -0.43873,0.09865 -0.14538,0.09865 -0.14538,0.290757 0,0.176531 0.11682,0.277777 0.11942,0.09865 0.3297,0.09865 0.2622,0 0.44133,-0.186915 0.17913,-0.189512 0.17913,-0.472481 v -0.106437 z m 1.42004,-0.350466 v 1.658872 h -0.93717 v -0.430943 q -0.18692,0.264796 -0.42056,0.38681 -0.23365,0.119419 -0.56854,0.119419 -0.45171,0 -0.73468,-0.262201 -0.28037,-0.264797 -0.28037,-0.685356 0,-0.511421 0.35047,-0.750257 0.35306,-0.238836 1.10591,-0.238836 h 0.54777 v -0.07269 q 0,-0.220664 -0.17394,-0.32191 -0.17393,-0.103842 -0.54257,-0.103842 -0.29855,0 -0.55556,0.05971 -0.257,0.05971 -0.47767,0.179128 v -0.708721 q 0.29855,-0.07269 0.59969,-0.109034 0.30114,-0.03894 0.60228,-0.03894 0.7866,0 1.13447,0.311525 0.35047,0.308929 0.35047,1.007266 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7396" />
+ <path
+ d="m 186.6553,-76.332267 q -0.12202,-0.05711 -0.24403,-0.08307 -0.11942,-0.02856 -0.24144,-0.02856 -0.35825,0 -0.55295,0.231048 -0.19211,0.228452 -0.19211,0.656799 v 1.339559 h -0.92938 v -2.90757 h 0.92938 v 0.477672 q 0.17913,-0.285565 0.41018,-0.415367 0.23364,-0.132398 0.55814,-0.132398 0.0467,0 0.10125,0.0052 0.0545,0.0026 0.15836,0.01558 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7398" />
+ <path
+ d="m 189.09557,-76.69831 v -1.557627 h 0.93458 v 4.039446 h -0.93458 v -0.420559 q -0.1921,0.257008 -0.42315,0.376426 -0.23105,0.119419 -0.53479,0.119419 -0.53738,0 -0.88265,-0.425752 -0.34528,-0.428347 -0.34528,-1.100723 0,-0.672375 0.34528,-1.098127 0.34527,-0.428347 0.88265,-0.428347 0.30114,0 0.53219,0.122014 0.23365,0.119418 0.42575,0.37383 z m -0.61266,1.882133 q 0.29854,0 0.45431,-0.218068 0.15835,-0.218068 0.15835,-0.633435 0,-0.415367 -0.15835,-0.633435 -0.15577,-0.218068 -0.45431,-0.218068 -0.29595,0 -0.45431,0.218068 -0.15576,0.218068 -0.15576,0.633435 0,0.415367 0.15576,0.633435 0.15836,0.218068 0.45431,0.218068 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7400" />
+ <path
+ d="m 192.30688,-76.529567 q -0.30893,0 -0.47248,0.22326 -0.16095,0.220664 -0.16095,0.638627 0,0.417963 0.16095,0.641223 0.16355,0.220664 0.47248,0.220664 0.30374,0 0.46469,-0.220664 0.16096,-0.22326 0.16096,-0.641223 0,-0.417963 -0.16096,-0.638627 -0.16095,-0.22326 -0.46469,-0.22326 z m 0,-0.664587 q 0.75026,0 1.17082,0.404983 0.42315,0.404983 0.42315,1.121491 0,0.716509 -0.42315,1.121492 -0.42056,0.404983 -1.17082,0.404983 -0.75285,0 -1.1786,-0.404983 -0.42316,-0.404983 -0.42316,-1.121492 0,-0.716508 0.42316,-1.121491 0.42575,-0.404983 1.1786,-0.404983 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7402" />
+ <path
+ d="m 194.31622,-77.124061 h 0.90342 l 0.48806,2.004147 0.49065,-2.004147 h 0.77622 l 0.48805,1.983378 0.49066,-1.983378 h 0.90342 l -0.76583,2.90757 h -1.01506 l -0.49065,-1.998954 -0.48805,1.998954 h -1.01506 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7404" />
+ <path
+ d="m 202.41069,-75.986993 v 1.770502 h -0.93458 v -0.288161 -1.066974 q 0,-0.376427 -0.0182,-0.519209 -0.0156,-0.142783 -0.0571,-0.21028 -0.0545,-0.09086 -0.14798,-0.140186 -0.0934,-0.05192 -0.21287,-0.05192 -0.29076,0 -0.45691,0.225856 -0.16614,0.22326 -0.16614,0.620455 v 1.43042 h -0.92939 v -2.90757 h 0.92939 v 0.425751 q 0.21028,-0.254412 0.44652,-0.37383 0.23624,-0.122014 0.5218,-0.122014 0.50363,0 0.76324,0.308929 0.2622,0.308929 0.2622,0.898232 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7406" />
+ <path
+ d="m 203.25181,-73.515559 q 0.33229,-0.617858 0.49844,-1.207161 0.16615,-0.589302 0.16615,-1.163028 0,-0.573726 -0.16615,-1.160432 -0.16615,-0.589302 -0.49844,-1.204565 h 0.77102 q 0.3946,0.636031 0.58411,1.220142 0.19211,0.581514 0.19211,1.150047 0,0.568534 -0.18951,1.147452 -0.18951,0.576322 -0.58671,1.217545 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7408" />
+ </g>
+ <g
+ aria-label="NumPy"
+ transform="scale(-1)"
+ id="text7580"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#800000;fill-opacity:1;stroke-width:0.398751">
+ <path
+ d="m 256.86208,-298.97457 h 2.22208 l 2.80602,5.29165 v -5.29165 h 1.88618 v 7.71526 h -2.22208 l -2.80602,-5.29165 v 5.29165 h -1.88618 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7495" />
+ <path
+ d="m 265.5747,-293.51239 v -3.53466 h 1.86034 v 0.57877 q 0,0.47026 -0.005,1.18339 -0.005,0.70797 -0.005,0.94568 0,0.69763 0.0362,1.00768 0.0362,0.30489 0.12402,0.44442 0.11369,0.18087 0.29456,0.27905 0.18603,0.0982 0.42374,0.0982 0.57878,0 0.90951,-0.44442 0.33072,-0.44442 0.33072,-1.23506 v -2.8577 h 1.85001 v 5.78774 h -1.85001 v -0.83715 q -0.41857,0.50642 -0.88883,0.7493 -0.46508,0.23771 -1.02836,0.23771 -1.00252,0 -1.52961,-0.61494 -0.52193,-0.61495 -0.52193,-1.788 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7497" />
+ <path
+ d="m 278.5351,-296.08587 q 0.3514,-0.53743 0.83199,-0.81649 0.48576,-0.28422 1.06453,-0.28422 0.99736,0 1.51929,0.61495 0.52193,0.61495 0.52193,1.788 v 3.52432 h -1.86035 v -3.01789 q 0.005,-0.0672 0.005,-0.13953 0.005,-0.0723 0.005,-0.2067 0,-0.61495 -0.18087,-0.88883 -0.18087,-0.27906 -0.58394,-0.27906 -0.5271,0 -0.81649,0.43408 -0.28422,0.43408 -0.29455,1.25574 v 2.84219 h -1.86035 v -3.01789 q 0,-0.96118 -0.16536,-1.23506 -0.16537,-0.27906 -0.58911,-0.27906 -0.53227,0 -0.82165,0.43925 -0.28939,0.43408 -0.28939,1.2454 v 2.84736 h -1.86035 v -5.78774 h 1.86035 v 0.84749 q 0.34106,-0.49092 0.78031,-0.73897 0.44442,-0.24805 0.97668,-0.24805 0.59945,0 1.05936,0.28939 0.45992,0.28939 0.69763,0.81132 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7499" />
+ <path
+ d="m 284.28151,-298.97457 h 3.30211 q 1.47277,0 2.25825,0.65628 0.79065,0.65112 0.79065,1.86035 0,1.21439 -0.79065,1.87068 -0.78548,0.65112 -2.25825,0.65112 h -1.31258 v 2.67683 h -1.98953 z m 1.98953,1.44176 v 2.1549 h 1.10071 q 0.57877,0 0.894,-0.27905 0.31522,-0.28422 0.31522,-0.80098 0,-0.51676 -0.31522,-0.79581 -0.31523,-0.27906 -0.894,-0.27906 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7501" />
+ <path
+ d="m 291.39216,-297.04705 h 1.85001 l 1.55546,3.9274 1.32291,-3.9274 h 1.85001 l -2.43395,6.33551 q -0.3669,0.96635 -0.85783,1.34875 -0.48576,0.38757 -1.28674,0.38757 h -1.0697 v -1.21439 h 0.57878 q 0.47025,0 0.68212,-0.14986 0.21704,-0.14986 0.3359,-0.53743 l 0.0517,-0.1602 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7503" />
+ </g>
+ <g
+ aria-label="Registered or default"
+ transform="scale(-1)"
+ id="text1141"
+ style="font-size:5.3167px;line-height:1.65;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000080;fill-opacity:1;stroke-width:0.398751">
+ <path
+ d="m 22.811873,-215.97443 q 0.168743,0.0571 0.327102,0.24403 0.160955,0.18692 0.321909,0.51402 l 0.53219,1.05918 h -0.563342 l -0.495845,-0.99428 q -0.192107,-0.38941 -0.37383,-0.51661 -0.179127,-0.12721 -0.490653,-0.12721 h -0.57113 v 1.6381 h -0.524401 v -3.87589 h 1.183797 q 0.664587,0 0.991689,0.27778 0.327102,0.27777 0.327102,0.83852 0,0.36604 -0.171339,0.60747 -0.168743,0.24143 -0.493249,0.33489 z m -1.313599,-1.62772 v 1.37591 h 0.659396 q 0.379022,0 0.57113,-0.17394 0.194703,-0.17653 0.194703,-0.51661 0,-0.34008 -0.194703,-0.51142 -0.192108,-0.17394 -0.57113,-0.17394 z"
+ style="fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7590" />
+ <path
+ d="m 26.895452,-215.7304 v 0.23364 h -2.196254 q 0.03115,0.49325 0.295949,0.75286 0.267392,0.25701 0.742469,0.25701 0.27518,0 0.532189,-0.0675 0.259604,-0.0675 0.514017,-0.20249 v 0.45171 q -0.257009,0.10903 -0.526997,0.16615 -0.269989,0.0571 -0.547766,0.0571 -0.69574,0 -1.103319,-0.40498 -0.404983,-0.40499 -0.404983,-1.09553 0,-0.71392 0.384215,-1.13188 0.38681,-0.42056 1.041014,-0.42056 0.586706,0 0.926788,0.37902 0.342678,0.37643 0.342678,1.02544 z m -0.477673,-0.14019 q -0.0052,-0.392 -0.220663,-0.62564 -0.212876,-0.23365 -0.565938,-0.23365 -0.399791,0 -0.641223,0.22586 -0.238836,0.22586 -0.275181,0.63603 z"
+ style="fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7592" />
+ <path
+ d="m 29.592742,-215.64473 q 0,-0.51921 -0.215471,-0.80477 -0.212876,-0.28557 -0.599687,-0.28557 -0.384214,0 -0.599686,0.28557 -0.212876,0.28556 -0.212876,0.80477 0,0.51661 0.212876,0.80218 0.215472,0.28556 0.599686,0.28556 0.386811,0 0.599687,-0.28556 0.215471,-0.28557 0.215471,-0.80218 z m 0.477673,1.12668 q 0,0.74247 -0.329698,1.10332 -0.329698,0.36345 -1.009862,0.36345 -0.251816,0 -0.475076,-0.0389 -0.22326,-0.0363 -0.433539,-0.11423 v -0.46469 q 0.210279,0.11423 0.415367,0.16874 0.205087,0.0545 0.417963,0.0545 0.469884,0 0.703528,-0.24662 0.233644,-0.24403 0.233644,-0.73988 v -0.23624 q -0.147974,0.25701 -0.379022,0.38422 -0.231048,0.1272 -0.552958,0.1272 -0.534785,0 -0.861887,-0.40758 -0.327101,-0.40757 -0.327101,-1.07995 0,-0.67497 0.327101,-1.08255 0.327102,-0.40758 0.861887,-0.40758 0.32191,0 0.552958,0.12721 0.231048,0.1272 0.379022,0.38421 v -0.44133 h 0.477673 z"
+ style="fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7594" />
+ <path
+ d="m 31.054316,-217.06477 h 0.477672 v 2.90757 h -0.477672 z m 0,-1.13187 h 0.477672 v 0.60488 h -0.477672 z"
+ style="fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7596" />
+ <path
+ d="m 34.385042,-216.9791 v 0.45171 q -0.202492,-0.10384 -0.42056,-0.15576 -0.218067,-0.0519 -0.451711,-0.0519 -0.355659,0 -0.534786,0.10904 -0.176531,0.10903 -0.176531,0.3271 0,0.16614 0.127206,0.2622 0.127207,0.0935 0.511421,0.17912 l 0.163551,0.0363 q 0.508825,0.10903 0.721701,0.30893 0.215471,0.1973 0.215471,0.55296 0,0.40498 -0.321909,0.64122 -0.319314,0.23624 -0.880059,0.23624 -0.233645,0 -0.488057,-0.0467 -0.251816,-0.0441 -0.532189,-0.13499 v -0.49325 q 0.264796,0.13759 0.521805,0.20768 0.257008,0.0675 0.508825,0.0675 0.337486,0 0.519209,-0.11423 0.181723,-0.11682 0.181723,-0.3271 0,-0.1947 -0.132398,-0.29854 -0.129803,-0.10385 -0.573726,-0.1999 l -0.166147,-0.0389 q -0.443924,-0.0935 -0.641223,-0.28557 -0.1973,-0.1947 -0.1973,-0.53218 0,-0.41018 0.290757,-0.63344 0.290757,-0.22326 0.825543,-0.22326 0.264796,0 0.49844,0.0389 0.233644,0.0389 0.430944,0.11682 z"
+ style="fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7598" />
+ <path
+ d="m 35.773925,-217.89031 v 0.82554 h 0.983901 v 0.37124 h -0.983901 v 1.57839 q 0,0.35566 0.09605,0.45691 0.09865,0.10124 0.397195,0.10124 h 0.490652 v 0.39979 h -0.490652 q -0.552958,0 -0.763237,-0.20508 -0.21028,-0.20769 -0.21028,-0.75286 v -1.57839 h -0.350466 v -0.37124 h 0.350466 v -0.82554 z"
+ style="fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7600" />
+ <path
+ d="m 39.87308,-215.7304 v 0.23364 h -2.196254 q 0.03115,0.49325 0.295949,0.75286 0.267393,0.25701 0.742469,0.25701 0.275181,0 0.53219,-0.0675 0.259604,-0.0675 0.514016,-0.20249 v 0.45171 q -0.257008,0.10903 -0.526997,0.16615 -0.269988,0.0571 -0.547765,0.0571 -0.69574,0 -1.103319,-0.40498 -0.404983,-0.40499 -0.404983,-1.09553 0,-0.71392 0.384214,-1.13188 0.386811,-0.42056 1.041014,-0.42056 0.586707,0 0.926788,0.37902 0.342678,0.37643 0.342678,1.02544 z m -0.477672,-0.14019 q -0.0052,-0.392 -0.220664,-0.62564 -0.212875,-0.23365 -0.565938,-0.23365 -0.39979,0 -0.641223,0.22586 -0.238836,0.22586 -0.27518,0.63603 z"
+ style="fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7602" />
+ <path
+ d="m 42.34192,-216.61825 q -0.08048,-0.0467 -0.176532,-0.0675 -0.09346,-0.0234 -0.207683,-0.0234 -0.404983,0 -0.623051,0.2648 -0.215472,0.2622 -0.215472,0.75545 v 1.53166 h -0.480268 v -2.90757 h 0.480268 v 0.45172 q 0.150571,-0.2648 0.392003,-0.39201 0.241432,-0.1298 0.586706,-0.1298 0.04933,0 0.109034,0.008 0.05971,0.005 0.132399,0.0182 z"
+ style="fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7604" />
+ <path
+ d="m 45.213145,-215.7304 v 0.23364 h -2.196254 q 0.03115,0.49325 0.295949,0.75286 0.267393,0.25701 0.742469,0.25701 0.275181,0 0.53219,-0.0675 0.259604,-0.0675 0.514016,-0.20249 v 0.45171 q -0.257008,0.10903 -0.526997,0.16615 -0.269988,0.0571 -0.547765,0.0571 -0.69574,0 -1.103319,-0.40498 -0.404983,-0.40499 -0.404983,-1.09553 0,-0.71392 0.384214,-1.13188 0.386811,-0.42056 1.041014,-0.42056 0.586707,0 0.926788,0.37902 0.342678,0.37643 0.342678,1.02544 z m -0.477672,-0.14019 q -0.0052,-0.392 -0.220664,-0.62564 -0.212875,-0.23365 -0.565938,-0.23365 -0.39979,0 -0.641223,0.22586 -0.238836,0.22586 -0.27518,0.63603 z"
+ style="fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7606" />
+ <path
+ d="m 47.910435,-216.62344 v -1.5732 h 0.477672 v 4.03944 h -0.477672 v -0.43613 q -0.150571,0.2596 -0.381619,0.38681 -0.228452,0.12461 -0.550362,0.12461 -0.526997,0 -0.85929,-0.42056 -0.329698,-0.42056 -0.329698,-1.10592 0,-0.68535 0.329698,-1.10591 0.332293,-0.42056 0.85929,-0.42056 0.32191,0 0.550362,0.12721 0.231048,0.12461 0.381619,0.38421 z m -1.627721,1.01505 q 0,0.527 0.215472,0.82814 0.218068,0.29855 0.59709,0.29855 0.379023,0 0.597091,-0.29855 0.218068,-0.30114 0.218068,-0.82814 0,-0.52699 -0.218068,-0.82554 -0.218068,-0.30114 -0.597091,-0.30114 -0.379022,0 -0.59709,0.30114 -0.215472,0.29855 -0.215472,0.82554 z"
+ style="fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7608" />
+ <path
+ d="m 52.188717,-216.72988 q -0.384214,0 -0.607474,0.30114 -0.22326,0.29855 -0.22326,0.82035 0,0.52181 0.220664,0.82295 0.223259,0.29855 0.61007,0.29855 0.381619,0 0.604879,-0.30114 0.223259,-0.30115 0.223259,-0.82036 0,-0.51661 -0.223259,-0.81775 -0.22326,-0.30374 -0.604879,-0.30374 z m 0,-0.40498 q 0.623051,0 0.978709,0.40498 0.355658,0.40499 0.355658,1.12149 0,0.71392 -0.355658,1.1215 -0.355658,0.40498 -0.978709,0.40498 -0.625647,0 -0.981305,-0.40498 -0.353062,-0.40758 -0.353062,-1.1215 0,-0.7165 0.353062,-1.12149 0.355658,-0.40498 0.981305,-0.40498 z"
+ style="fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7610" />
+ <path
+ d="m 55.999713,-216.61825 q -0.08048,-0.0467 -0.176531,-0.0675 -0.09346,-0.0234 -0.207684,-0.0234 -0.404983,0 -0.623051,0.2648 -0.215472,0.2622 -0.215472,0.75545 v 1.53166 h -0.480268 v -2.90757 h 0.480268 v 0.45172 q 0.150571,-0.2648 0.392003,-0.39201 0.241432,-0.1298 0.586706,-0.1298 0.04932,0 0.109034,0.008 0.05971,0.005 0.132399,0.0182 z"
+ style="fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7612" />
+ <path
+ d="m 60.104057,-216.62344 v -1.5732 h 0.477672 v 4.03944 h -0.477672 v -0.43613 q -0.15057,0.2596 -0.381618,0.38681 -0.228452,0.12461 -0.550362,0.12461 -0.526997,0 -0.859291,-0.42056 -0.329698,-0.42056 -0.329698,-1.10592 0,-0.68535 0.329698,-1.10591 0.332294,-0.42056 0.859291,-0.42056 0.32191,0 0.550362,0.12721 0.231048,0.12461 0.381618,0.38421 z m -1.62772,1.01505 q 0,0.527 0.215472,0.82814 0.218068,0.29855 0.59709,0.29855 0.379023,0 0.59709,-0.29855 0.218068,-0.30114 0.218068,-0.82814 0,-0.52699 -0.218068,-0.82554 -0.218067,-0.30114 -0.59709,-0.30114 -0.379022,0 -0.59709,0.30114 -0.215472,0.29855 -0.215472,0.82554 z"
+ style="fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7614" />
+ <path
+ d="m 64.052642,-215.7304 v 0.23364 h -2.196254 q 0.03115,0.49325 0.295949,0.75286 0.267393,0.25701 0.742469,0.25701 0.275181,0 0.532189,-0.0675 0.259605,-0.0675 0.514017,-0.20249 v 0.45171 q -0.257008,0.10903 -0.526997,0.16615 -0.269989,0.0571 -0.547766,0.0571 -0.69574,0 -1.103319,-0.40498 -0.404983,-0.40499 -0.404983,-1.09553 0,-0.71392 0.384215,-1.13188 0.386811,-0.42056 1.041014,-0.42056 0.586706,0 0.926788,0.37902 0.342678,0.37643 0.342678,1.02544 z m -0.477672,-0.14019 q -0.0052,-0.392 -0.220664,-0.62564 -0.212876,-0.23365 -0.565938,-0.23365 -0.399791,0 -0.641223,0.22586 -0.238836,0.22586 -0.275181,0.63603 z"
+ style="fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7616" />
+ <path
+ d="m 66.308607,-218.19664 v 0.39719 h -0.456904 q -0.257008,0 -0.358254,0.10384 -0.09865,0.10385 -0.09865,0.37384 v 0.257 h 0.786601 v 0.37124 H 65.3948 v 2.53633 h -0.480269 v -2.53633 h -0.456904 v -0.37124 h 0.456904 v -0.20249 q 0,-0.48546 0.225856,-0.70612 0.225856,-0.22326 0.716509,-0.22326 z"
+ style="fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7618" />
+ <path
+ d="m 68.029783,-215.61877 q -0.578918,0 -0.802178,0.1324 -0.22326,0.1324 -0.22326,0.45171 0,0.25441 0.166147,0.40498 0.168743,0.14798 0.456904,0.14798 0.397195,0 0.636031,-0.28037 0.241432,-0.28297 0.241432,-0.75026 v -0.10644 z m 0.952748,-0.1973 v 1.65887 h -0.477672 v -0.44132 q -0.163551,0.26479 -0.407579,0.392 -0.244028,0.12461 -0.59709,0.12461 -0.44652,0 -0.711317,-0.24922 -0.2622,-0.25182 -0.2622,-0.67238 0,-0.49065 0.327101,-0.73987 0.329698,-0.24922 0.981305,-0.24922 h 0.66978 v -0.0467 q 0,-0.3297 -0.218068,-0.50882 -0.215471,-0.18173 -0.607474,-0.18173 -0.249221,0 -0.485461,0.0597 -0.23624,0.0597 -0.454307,0.17913 v -0.44133 q 0.2622,-0.10124 0.508824,-0.15057 0.246625,-0.0519 0.480269,-0.0519 0.630839,0 0.942364,0.3271 0.311525,0.3271 0.311525,0.99169 z"
+ style="fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7620" />
+ <path
+ d="m 69.917109,-215.30465 v -1.76012 h 0.477672 v 1.74195 q 0,0.41277 0.160955,0.62045 0.160955,0.20509 0.482864,0.20509 0.386811,0 0.610071,-0.24662 0.225856,-0.24663 0.225856,-0.67238 v -1.64849 h 0.477672 v 2.90757 h -0.477672 v -0.44652 q -0.173935,0.2648 -0.404983,0.3946 -0.228452,0.12721 -0.53219,0.12721 -0.501036,0 -0.760641,-0.31153 -0.259604,-0.31152 -0.259604,-0.91121 z"
+ style="fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7622" />
+ <path
+ d="m 73.336101,-218.19664 h 0.477672 v 4.03944 h -0.477672 z"
+ style="fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7624" />
+ <path
+ d="m 75.285731,-217.89031 v 0.82554 h 0.983901 v 0.37124 h -0.983901 v 1.57839 q 0,0.35566 0.09605,0.45691 0.09865,0.10124 0.397195,0.10124 h 0.490653 v 0.39979 h -0.490653 q -0.552957,0 -0.763237,-0.20508 -0.21028,-0.20769 -0.21028,-0.75286 v -1.57839 h -0.350466 v -0.37124 h 0.350466 v -0.82554 z"
+ style="fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7626" />
+ </g>
+ <g
+ aria-label="ArrayMethod"
+ transform="rotate(90)"
+ id="text4678"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.45542px;line-height:1.25;font-family:fira;-inkscape-font-specification:fira;letter-spacing:0px;word-spacing:0px;fill:#000080;fill-opacity:1;stroke-width:0.398751">
+ <path
+ d="m 116.73407,24.293717 h -1.97293 l -0.37291,1.374547 h -1.22712 l 1.87754,-5.996843 h 1.45693 l 1.8732,5.996843 h -1.26181 z m -1.76047,-0.888903 h 1.53932 l -0.76749,-2.84449 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7713" />
+ <path
+ d="m 119.10591,25.668264 v -0.793508 h 0.64608 v -3.009262 h -0.64608 v -0.789173 h 1.51764 l 0.21247,1.053676 q 0.25149,-0.58104 0.63307,-0.880231 0.38158,-0.299192 0.95828,-0.299192 0.22114,0 0.39025,0.03469 0.16911,0.03469 0.32954,0.09106 l -0.20379,1.790815 h -0.76316 V 21.96956 q -0.44662,0.03902 -0.77183,0.407595 -0.3252,0.364233 -0.51166,0.962617 v 1.534984 h 0.91492 v 0.793508 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7715" />
+ <path
+ d="m 124.30923,25.668264 v -0.793508 h 0.64608 v -3.009262 h -0.64608 v -0.789173 h 1.51764 l 0.21247,1.053676 q 0.25149,-0.58104 0.63307,-0.880231 0.38158,-0.299192 0.95828,-0.299192 0.22114,0 0.39025,0.03469 0.16911,0.03469 0.32955,0.09106 l -0.2038,1.790815 h -0.76316 V 21.96956 q -0.44661,0.03902 -0.77182,0.407595 -0.32521,0.364233 -0.51166,0.962617 v 1.534984 h 0.91492 v 0.793508 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7717" />
+ <path
+ d="m 133.13321,24.458489 q 0,0.264503 0.0781,0.385914 0.078,0.121411 0.25149,0.177781 l -0.24716,0.767492 q -0.36423,-0.03902 -0.6244,-0.182117 -0.26016,-0.147428 -0.39892,-0.437948 -0.26017,0.316537 -0.65909,0.472637 -0.39458,0.1561 -0.8282,0.1561 -0.70245,0 -1.11438,-0.398923 -0.41193,-0.398922 -0.41193,-1.03633 0,-0.732804 0.57237,-1.12739 0.5767,-0.398922 1.63038,-0.398922 h 0.64174 v -0.247159 q 0,-0.407594 -0.25583,-0.589711 -0.25149,-0.186453 -0.71979,-0.186453 -0.22114,0 -0.55503,0.06071 -0.33388,0.05637 -0.68076,0.17778 l -0.27318,-0.784836 q 0.43795,-0.164772 0.88023,-0.242822 0.44662,-0.07805 0.81085,-0.07805 0.96696,0 1.43526,0.41193 0.4683,0.407595 0.4683,1.157743 z m -2.05532,0.511661 q 0.26017,0 0.52467,-0.143091 0.2645,-0.147428 0.4206,-0.416267 v -0.893239 h -0.45095 q -0.63741,0 -0.9236,0.203797 -0.28184,0.203797 -0.28184,0.576703 0,0.672097 0.71112,0.672097 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7719" />
+ <path
+ d="m 138.83085,21.076321 -1.55667,4.600616 q -0.28184,0.841205 -0.83687,1.32685 -0.55502,0.489981 -1.55232,0.559359 l -0.1431,-0.828198 q 0.45963,-0.06504 0.73714,-0.195125 0.28185,-0.130083 0.44662,-0.342553 0.16911,-0.212469 0.29052,-0.529006 h -0.39025 l -1.50463,-4.591943 h 1.20978 l 1.04066,3.828788 1.08403,-3.828788 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7721" />
+ <path
+ d="m 143.85205,19.671421 0.33822,5.996843 h -1.05801 l -0.11274,-2.762103 q -0.026,-0.685106 -0.013,-1.20544 0.013,-0.520333 0.0434,-1.001642 l -0.79351,3.928518 h -0.96261 l -0.84988,-3.928518 q 0.0347,0.455292 0.0477,1.005978 0.0173,0.546351 0,1.209776 l -0.0824,2.753431 h -1.04067 l 0.33822,-5.996843 h 1.31818 l 0.77183,3.95887 0.73714,-3.95887 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7723" />
+ <path
+ d="m 146.05479,23.72135 q 0.052,0.646081 0.38157,0.932264 0.32955,0.286183 0.80218,0.286183 0.32955,0 0.62007,-0.104066 0.29052,-0.104067 0.57237,-0.29052 l 0.47697,0.654753 q -0.32087,0.268839 -0.76749,0.433611 -0.44229,0.164773 -0.97563,0.164773 -0.74581,0 -1.25747,-0.307864 -0.50733,-0.307864 -0.76749,-0.854214 -0.26017,-0.546351 -0.26017,-1.257473 0,-0.685106 0.25149,-1.235792 0.25583,-0.550686 0.73714,-0.871559 0.48565,-0.325208 1.16642,-0.325208 0.94527,0 1.50029,0.615728 0.55502,0.615728 0.55502,1.704092 0,0.251495 -0.0217,0.455292 z m 0.98429,-1.968595 q -0.41626,0 -0.6851,0.299191 -0.26451,0.299192 -0.3122,0.936601 h 1.9339 q -0.009,-0.581039 -0.23848,-0.906248 -0.22982,-0.329544 -0.69812,-0.329544 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7725" />
+ <path
+ d="m 154.24569,25.412434 q -0.25583,0.169108 -0.62006,0.277511 -0.36424,0.108403 -0.78918,0.108403 -0.8412,0 -1.26614,-0.433611 -0.42494,-0.437948 -0.42494,-1.162079 v -2.315484 h -0.99731 v -0.810853 h 0.99731 v -1.010314 l 1.14473,-0.138756 v 1.14907 h 1.51764 l -0.11707,0.810853 h -1.40057 v 2.311148 q 0,0.355561 0.17345,0.520334 0.17344,0.164772 0.55936,0.164772 0.24716,0 0.45095,-0.05637 0.20814,-0.06071 0.37724,-0.151764 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7727" />
+ <path
+ d="m 156.63054,19.133743 v 2.458576 q 0.28618,-0.325209 0.64175,-0.485645 0.35989,-0.160436 0.75014,-0.160436 0.63308,0 0.94961,0.359897 0.32087,0.355561 0.32087,1.001642 v 3.360487 h -1.14473 v -3.104656 q 0,-0.416267 -0.13008,-0.589712 -0.12575,-0.173444 -0.43361,-0.173444 -0.27752,0 -0.52034,0.186453 -0.24282,0.182117 -0.43361,0.446619 v 3.23474 h -1.14473 v -6.421782 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7729" />
+ <path
+ d="m 162.59702,20.946238 q 0.68511,0 1.16208,0.299192 0.47697,0.299191 0.72413,0.845542 0.25149,0.542014 0.25149,1.27048 0,1.118718 -0.55935,1.777807 -0.55936,0.659089 -1.58269,0.659089 -1.02332,0 -1.58268,-0.646081 -0.55936,-0.650417 -0.55936,-1.782142 0,-0.719795 0.2515,-1.266145 0.25149,-0.54635 0.72847,-0.849878 0.4813,-0.307864 1.16641,-0.307864 z m 0,0.862886 q -0.48131,0 -0.71979,0.377242 -0.23415,0.377242 -0.23415,1.183759 0,0.815189 0.23415,1.192431 0.23415,0.372905 0.71545,0.372905 0.48131,0 0.71546,-0.372905 0.23415,-0.377242 0.23415,-1.201104 0,-0.80218 -0.23415,-1.175086 -0.23415,-0.377242 -0.71112,-0.377242 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7731" />
+ <path
+ d="m 168.55483,19.120734 1.14473,0.121412 v 6.426118 h -1.01465 l -0.0694,-0.542014 q -0.21247,0.303528 -0.53334,0.489981 -0.32087,0.182117 -0.74581,0.182117 -0.58104,0 -0.96262,-0.303528 -0.37724,-0.303528 -0.56369,-0.849878 -0.18212,-0.550686 -0.18212,-1.279153 0,-0.698115 0.21681,-1.244465 0.22114,-0.550686 0.62873,-0.862886 0.4076,-0.3122 0.97129,-0.3122 0.6721,0 1.11005,0.463964 z m -0.80218,2.679718 q -0.43362,0 -0.68511,0.377242 -0.24716,0.372905 -0.24716,1.192431 0,0.867222 0.22982,1.218447 0.22981,0.351225 0.62006,0.351225 0.28618,0 0.50299,-0.169108 0.2168,-0.173444 0.38158,-0.429275 v -2.090006 q -0.16044,-0.21247 -0.3599,-0.329545 -0.19513,-0.121411 -0.44228,-0.121411 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path7733" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:3.52777px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
+ x="92.373795"
+ y="-75.619186"
+ id="text4844"
+ transform="scale(-1)"><tspan
+ sodipodi:role="line"
+ id="tspan4842"
+ x="92.373795"
+ y="-75.619186"
+ style="stroke-width:0.264583" /></text>
+ <g
+ aria-label="Casting, Result Allocation and Outer Iteration
+done by UFunc Machinery (within ArrayMethod)
+"
+ transform="rotate(-90)"
+ id="text4856"
+ style="font-size:5.3167px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#800000;fill-opacity:1;stroke-width:0.398751">
+ <path
+ d="m -231.92408,-282.92647 q -0.27518,0.14278 -0.57373,0.21547 -0.29854,0.0727 -0.62305,0.0727 -0.96832,0 -1.53426,-0.53997 -0.56594,-0.54258 -0.56594,-1.46937 0,-0.92938 0.56594,-1.46936 0.56594,-0.54257 1.53426,-0.54257 0.32451,0 0.62305,0.0727 0.29855,0.0727 0.57373,0.21547 v 0.80218 q -0.27778,-0.18951 -0.54777,-0.27778 -0.26999,-0.0883 -0.56853,-0.0883 -0.53479,0 -0.84112,0.34267 -0.30633,0.34268 -0.30633,0.94496 0,0.59969 0.30633,0.94237 0.30633,0.34268 0.84112,0.34268 0.29854,0 0.56853,-0.0883 0.26999,-0.0883 0.54777,-0.27778 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7820" />
+ <path
+ d="m -229.83427,-284.022 q -0.29075,0 -0.43873,0.0986 -0.14538,0.0987 -0.14538,0.29076 0,0.17653 0.11683,0.27777 0.11941,0.0987 0.32969,0.0987 0.2622,0 0.44133,-0.18691 0.17913,-0.18951 0.17913,-0.47248 v -0.10644 z m 1.42004,-0.35047 v 1.65888 h -0.93717 v -0.43095 q -0.18692,0.2648 -0.42056,0.38681 -0.23364,0.11942 -0.56853,0.11942 -0.45172,0 -0.73468,-0.2622 -0.28038,-0.26479 -0.28038,-0.68535 0,-0.51142 0.35047,-0.75026 0.35306,-0.23884 1.10591,-0.23884 h 0.54777 v -0.0727 q 0,-0.22066 -0.17394,-0.32191 -0.17393,-0.10384 -0.54257,-0.10384 -0.29854,0 -0.55555,0.0597 -0.25701,0.0597 -0.47768,0.17913 v -0.70872 q 0.29855,-0.0727 0.59969,-0.10904 0.30114,-0.0389 0.60228,-0.0389 0.78661,0 1.13448,0.31153 0.35046,0.30893 0.35046,1.00726 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7822" />
+ <path
+ d="m -225.27821,-285.5303 v 0.70612 q -0.29854,-0.12461 -0.57632,-0.18691 -0.27778,-0.0623 -0.5244,-0.0623 -0.2648,0 -0.3946,0.0675 -0.1272,0.0649 -0.1272,0.20249 0,0.11163 0.0961,0.17134 0.0986,0.0597 0.35047,0.0883 l 0.16355,0.0234 q 0.71391,0.0909 0.96053,0.29855 0.24663,0.20768 0.24663,0.6516 0,0.46469 -0.34268,0.69834 -0.34268,0.23364 -1.02284,0.23364 -0.28816,0 -0.59709,-0.0467 -0.30634,-0.0441 -0.63084,-0.13499 v -0.70612 q 0.27777,0.13499 0.56853,0.20249 0.29336,0.0675 0.5945,0.0675 0.27258,0 0.41017,-0.0753 0.13759,-0.0753 0.13759,-0.22326 0,-0.12461 -0.096,-0.18432 -0.0935,-0.0623 -0.37643,-0.096 l -0.16355,-0.0208 q -0.62045,-0.0779 -0.86967,-0.28816 -0.24922,-0.21028 -0.24922,-0.63863 0,-0.4621 0.31671,-0.68536 0.31672,-0.22326 0.97092,-0.22326 0.25701,0 0.53998,0.0389 0.28297,0.0389 0.61526,0.12202 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7824" />
+ <path
+ d="m -223.37011,-286.44671 v 0.82555 h 0.95794 v 0.66458 h -0.95794 v 1.23313 q 0,0.20249 0.0805,0.27518 0.0805,0.0701 0.31932,0.0701 h 0.47767 v 0.66459 h -0.79699 q -0.55036,0 -0.78141,-0.22845 -0.22845,-0.23105 -0.22845,-0.78141 v -1.23313 h -0.46209 v -0.66458 h 0.46209 v -0.82555 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7826" />
+ <path
+ d="m -221.84364,-285.62116 h 0.92938 v 2.90757 h -0.92938 z m 0,-1.13188 h 0.92938 v 0.75805 h -0.92938 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7828" />
+ <path
+ d="m -217.09807,-284.4841 v 1.77051 h -0.93458 v -0.28816 -1.06698 q 0,-0.37642 -0.0182,-0.51921 -0.0156,-0.14278 -0.0571,-0.21028 -0.0545,-0.0909 -0.14798,-0.14018 -0.0934,-0.0519 -0.21287,-0.0519 -0.29076,0 -0.4569,0.22585 -0.16615,0.22326 -0.16615,0.62046 v 1.43042 h -0.92939 v -2.90757 h 0.92939 v 0.42575 q 0.21028,-0.25441 0.44652,-0.37383 0.23624,-0.12202 0.5218,-0.12202 0.50364,0 0.76324,0.30893 0.2622,0.30893 0.2622,0.89823 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7830" />
+ <path
+ d="m -214.258,-283.20684 q -0.1921,0.25441 -0.42315,0.37383 -0.23105,0.11942 -0.53479,0.11942 -0.53218,0 -0.88005,-0.41797 -0.34787,-0.42056 -0.34787,-1.06957 0,-0.6516 0.34787,-1.06697 0.34787,-0.41796 0.88005,-0.41796 0.30374,0 0.53479,0.11941 0.23105,0.11942 0.42315,0.37643 v -0.43094 h 0.93458 v 2.61421 q 0,0.70094 -0.44392,1.06957 -0.44133,0.37124 -1.28245,0.37124 -0.27258,0 -0.527,-0.0415 -0.25441,-0.0415 -0.51142,-0.1272 v -0.7243 q 0.24403,0.14019 0.47768,0.20768 0.23364,0.0701 0.46988,0.0701 0.4569,0 0.66978,-0.1999 0.21287,-0.19989 0.21287,-0.62565 z m -0.61266,-1.80944 q -0.28816,0 -0.44912,0.21287 -0.16095,0.21288 -0.16095,0.60228 0,0.39979 0.15576,0.60748 0.15576,0.20509 0.45431,0.20509 0.29076,0 0.45171,-0.21288 0.16095,-0.21288 0.16095,-0.59969 0,-0.3894 -0.16095,-0.60228 -0.16095,-0.21287 -0.45171,-0.21287 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7832" />
+ <path
+ d="m -212.33433,-283.71826 h 0.93458 v 0.79179 l -0.64122,0.96833 h -0.55296 l 0.2596,-0.96833 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7834" />
+ <path
+ d="m -207.0981,-284.87091 q 0.31412,0 0.44911,-0.11682 0.13759,-0.11682 0.13759,-0.38421 0,-0.2648 -0.13759,-0.37903 -0.13499,-0.11422 -0.44911,-0.11422 h -0.42056 v 0.99428 z m -0.42056,0.69055 v 1.46677 h -0.99948 v -3.8759 h 1.52647 q 0.76584,0 1.1215,0.25701 0.35825,0.25701 0.35825,0.81256 0,0.38422 -0.18692,0.63084 -0.18431,0.24663 -0.55815,0.36345 0.20509,0.0467 0.36605,0.21287 0.16355,0.16355 0.32969,0.49844 l 0.54258,1.10073 h -1.06438 l -0.47248,-0.96314 q -0.14278,-0.29075 -0.29076,-0.39719 -0.14538,-0.10644 -0.3894,-0.10644 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7836" />
+ <path
+ d="m -201.56334,-284.17517 v 0.2648 h -2.17289 q 0.0337,0.3271 0.23624,0.49065 0.20249,0.16355 0.56594,0.16355 0.29335,0 0.59969,-0.0857 0.30893,-0.0883 0.63343,-0.26479 v 0.71651 q -0.3297,0.12461 -0.65939,0.18691 -0.3297,0.0649 -0.6594,0.0649 -0.7892,0 -1.22793,-0.39979 -0.43613,-0.40239 -0.43613,-1.12668 0,-0.71132 0.42834,-1.1189 0.43095,-0.40758 1.1838,-0.40758 0.68536,0 1.09553,0.41278 0.41277,0.41277 0.41277,1.10331 z m -0.95534,-0.30893 q 0,-0.26479 -0.15576,-0.42575 -0.15317,-0.16355 -0.40239,-0.16355 -0.26999,0 -0.43873,0.15317 -0.16875,0.15057 -0.21028,0.43613 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7838" />
+ <path
+ d="m -198.58827,-285.5303 v 0.70612 q -0.29854,-0.12461 -0.57632,-0.18691 -0.27778,-0.0623 -0.5244,-0.0623 -0.2648,0 -0.3946,0.0675 -0.12721,0.0649 -0.12721,0.20249 0,0.11163 0.0961,0.17134 0.0987,0.0597 0.35046,0.0883 l 0.16355,0.0234 q 0.71392,0.0909 0.96054,0.29855 0.24662,0.20768 0.24662,0.6516 0,0.46469 -0.34267,0.69834 -0.34268,0.23364 -1.02285,0.23364 -0.28816,0 -0.59709,-0.0467 -0.30633,-0.0441 -0.63083,-0.13499 v -0.70612 q 0.27777,0.13499 0.56853,0.20249 0.29335,0.0675 0.59449,0.0675 0.27259,0 0.41018,-0.0753 0.13759,-0.0753 0.13759,-0.22326 0,-0.12461 -0.096,-0.18432 -0.0935,-0.0623 -0.37643,-0.096 l -0.16355,-0.0208 q -0.62046,-0.0779 -0.86968,-0.28816 -0.24922,-0.21028 -0.24922,-0.63863 0,-0.4621 0.31672,-0.68536 0.31672,-0.22326 0.97092,-0.22326 0.25701,0 0.53998,0.0389 0.28297,0.0389 0.61526,0.12202 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7840" />
+ <path
+ d="m -197.72638,-283.84547 v -1.77569 h 0.93457 v 0.29075 q 0,0.23624 -0.003,0.5945 -0.003,0.35566 -0.003,0.47507 0,0.35047 0.0182,0.50623 0.0182,0.15317 0.0623,0.22326 0.0571,0.0909 0.14797,0.14019 0.0935,0.0493 0.21288,0.0493 0.29076,0 0.4569,-0.22326 0.16615,-0.22326 0.16615,-0.62045 v -1.43561 h 0.92938 v 2.90757 h -0.92938 v -0.42056 q -0.21028,0.25441 -0.44652,0.37642 -0.23364,0.11942 -0.51661,0.11942 -0.50364,0 -0.76843,-0.30893 -0.2622,-0.30893 -0.2622,-0.89823 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7842" />
+ <path
+ d="m -193.9102,-286.75304 h 0.92939 v 4.03945 h -0.92939 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7844" />
+ <path
+ d="m -191.07272,-286.44671 v 0.82555 h 0.95794 v 0.66458 h -0.95794 v 1.23313 q 0,0.20249 0.0805,0.27518 0.0805,0.0701 0.31931,0.0701 h 0.47767 v 0.66459 h -0.79698 q -0.55036,0 -0.78141,-0.22845 -0.22845,-0.23105 -0.22845,-0.78141 v -1.23313 h -0.4621 v -0.66458 h 0.4621 v -0.82555 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7846" />
+ <path
+ d="m -185.30171,-283.41972 h -1.56282 l -0.24662,0.70613 h -1.00467 l 1.43561,-3.8759 h 1.19158 l 1.43562,3.8759 h -1.00467 z m -1.3136,-0.7191 h 1.06178 l -0.52959,-1.54205 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7848" />
+ <path
+ d="m -183.58053,-286.75304 h 0.92938 v 4.03945 h -0.92938 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7850" />
+ <path
+ d="m -181.75811,-286.75304 h 0.92939 v 4.03945 h -0.92939 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7852" />
+ <path
+ d="m -178.55199,-285.02667 q -0.30893,0 -0.47248,0.22326 -0.16096,0.22067 -0.16096,0.63863 0,0.41796 0.16096,0.64122 0.16355,0.22067 0.47248,0.22067 0.30373,0 0.46469,-0.22067 0.16095,-0.22326 0.16095,-0.64122 0,-0.41796 -0.16095,-0.63863 -0.16096,-0.22326 -0.46469,-0.22326 z m 0,-0.66459 q 0.75025,0 1.17081,0.40499 0.42316,0.40498 0.42316,1.12149 0,0.71651 -0.42316,1.12149 -0.42056,0.40498 -1.17081,0.40498 -0.75286,0 -1.17861,-0.40498 -0.42315,-0.40498 -0.42315,-1.12149 0,-0.71651 0.42315,-1.12149 0.42575,-0.40499 1.17861,-0.40499 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7854" />
+ <path
+ d="m -173.93363,-285.5303 v 0.75804 q -0.18951,-0.1298 -0.38162,-0.1921 -0.18951,-0.0623 -0.3946,-0.0623 -0.38941,0 -0.60747,0.22845 -0.21548,0.22586 -0.21548,0.63344 0,0.40758 0.21548,0.63603 0.21806,0.22586 0.60747,0.22586 0.21807,0 0.41277,-0.0649 0.1973,-0.0649 0.36345,-0.1921 v 0.76064 q -0.21807,0.0805 -0.44393,0.11942 -0.22326,0.0415 -0.44911,0.0415 -0.7866,0 -1.23053,-0.40238 -0.44392,-0.40499 -0.44392,-1.12409 0,-0.71911 0.44392,-1.12149 0.44393,-0.40499 1.23053,-0.40499 0.22845,0 0.44911,0.0415 0.22326,0.0389 0.44393,0.11942 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7856" />
+ <path
+ d="m -171.82824,-284.022 q -0.29076,0 -0.43873,0.0986 -0.14538,0.0987 -0.14538,0.29076 0,0.17653 0.11682,0.27777 0.11942,0.0987 0.3297,0.0987 0.2622,0 0.44133,-0.18691 0.17913,-0.18951 0.17913,-0.47248 v -0.10644 z m 1.42004,-0.35047 v 1.65888 h -0.93717 v -0.43095 q -0.18692,0.2648 -0.42056,0.38681 -0.23365,0.11942 -0.56854,0.11942 -0.45171,0 -0.73468,-0.2622 -0.28037,-0.26479 -0.28037,-0.68535 0,-0.51142 0.35047,-0.75026 0.35306,-0.23884 1.10591,-0.23884 h 0.54777 v -0.0727 q 0,-0.22066 -0.17394,-0.32191 -0.17393,-0.10384 -0.54257,-0.10384 -0.29855,0 -0.55556,0.0597 -0.257,0.0597 -0.47767,0.17913 v -0.70872 q 0.29855,-0.0727 0.59969,-0.10904 0.30114,-0.0389 0.60228,-0.0389 0.7866,0 1.13447,0.31153 0.35047,0.30893 0.35047,1.00726 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7858" />
+ <path
+ d="m -168.52866,-286.44671 v 0.82555 h 0.95794 v 0.66458 h -0.95794 v 1.23313 q 0,0.20249 0.0805,0.27518 0.0805,0.0701 0.31931,0.0701 h 0.47767 v 0.66459 h -0.79698 q -0.55037,0 -0.78141,-0.22845 -0.22846,-0.23105 -0.22846,-0.78141 v -1.23313 h -0.46209 v -0.66458 h 0.46209 v -0.82555 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7860" />
+ <path
+ d="m -167.00219,-285.62116 h 0.92939 v 2.90757 h -0.92939 z m 0,-1.13188 h 0.92939 v 0.75805 h -0.92939 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7862" />
+ <path
+ d="m -163.79608,-285.02667 q -0.30893,0 -0.47248,0.22326 -0.16095,0.22067 -0.16095,0.63863 0,0.41796 0.16095,0.64122 0.16355,0.22067 0.47248,0.22067 0.30374,0 0.46469,-0.22067 0.16096,-0.22326 0.16096,-0.64122 0,-0.41796 -0.16096,-0.63863 -0.16095,-0.22326 -0.46469,-0.22326 z m 0,-0.66459 q 0.75026,0 1.17082,0.40499 0.42315,0.40498 0.42315,1.12149 0,0.71651 -0.42315,1.12149 -0.42056,0.40498 -1.17082,0.40498 -0.75285,0 -1.1786,-0.40498 -0.42316,-0.40498 -0.42316,-1.12149 0,-0.71651 0.42316,-1.12149 0.42575,-0.40499 1.1786,-0.40499 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7864" />
+ <path
+ d="m -158.60398,-284.4841 v 1.77051 h -0.93458 v -0.28816 -1.06698 q 0,-0.37642 -0.0182,-0.51921 -0.0156,-0.14278 -0.0571,-0.21028 -0.0545,-0.0909 -0.14798,-0.14018 -0.0935,-0.0519 -0.21287,-0.0519 -0.29076,0 -0.45691,0.22585 -0.16614,0.22326 -0.16614,0.62046 v 1.43042 h -0.92939 v -2.90757 h 0.92939 v 0.42575 q 0.21028,-0.25441 0.44652,-0.37383 0.23624,-0.12202 0.5218,-0.12202 0.50363,0 0.76324,0.30893 0.2622,0.30893 0.2622,0.89823 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7866" />
+ <path
+ d="m -154.5879,-284.022 q -0.29076,0 -0.43874,0.0986 -0.14537,0.0987 -0.14537,0.29076 0,0.17653 0.11682,0.27777 0.11942,0.0987 0.3297,0.0987 0.2622,0 0.44132,-0.18691 0.17913,-0.18951 0.17913,-0.47248 v -0.10644 z m 1.42003,-0.35047 v 1.65888 h -0.93717 v -0.43095 q -0.18692,0.2648 -0.42056,0.38681 -0.23364,0.11942 -0.56853,0.11942 -0.45172,0 -0.73468,-0.2622 -0.28038,-0.26479 -0.28038,-0.68535 0,-0.51142 0.35047,-0.75026 0.35306,-0.23884 1.10591,-0.23884 h 0.54777 v -0.0727 q 0,-0.22066 -0.17394,-0.32191 -0.17393,-0.10384 -0.54257,-0.10384 -0.29854,0 -0.55555,0.0597 -0.25701,0.0597 -0.47767,0.17913 v -0.70872 q 0.29854,-0.0727 0.59968,-0.10904 0.30114,-0.0389 0.60228,-0.0389 0.78661,0 1.13448,0.31153 0.35046,0.30893 0.35046,1.00726 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7868" />
+ <path
+ d="m -149.38023,-284.4841 v 1.77051 h -0.93458 v -0.28816 -1.06698 q 0,-0.37642 -0.0182,-0.51921 -0.0156,-0.14278 -0.0571,-0.21028 -0.0545,-0.0909 -0.14797,-0.14018 -0.0935,-0.0519 -0.21288,-0.0519 -0.29075,0 -0.4569,0.22585 -0.16615,0.22326 -0.16615,0.62046 v 1.43042 h -0.92938 v -2.90757 h 0.92938 v 0.42575 q 0.21028,-0.25441 0.44652,-0.37383 0.23624,-0.12202 0.52181,-0.12202 0.50363,0 0.76323,0.30893 0.26221,0.30893 0.26221,0.89823 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7870" />
+ <path
+ d="m -146.54017,-285.19541 v -1.55763 h 0.93458 v 4.03945 h -0.93458 v -0.42056 q -0.19211,0.25701 -0.42315,0.37642 -0.23105,0.11942 -0.53479,0.11942 -0.53738,0 -0.88265,-0.42575 -0.34528,-0.42835 -0.34528,-1.10072 0,-0.67238 0.34528,-1.09813 0.34527,-0.42835 0.88265,-0.42835 0.30114,0 0.53219,0.12202 0.23364,0.11942 0.42575,0.37383 z m -0.61266,1.88213 q 0.29854,0 0.4543,-0.21807 0.15836,-0.21806 0.15836,-0.63343 0,-0.41537 -0.15836,-0.63344 -0.15576,-0.21806 -0.4543,-0.21806 -0.29595,0 -0.45431,0.21806 -0.15577,0.21807 -0.15577,0.63344 0,0.41537 0.15577,0.63343 0.15836,0.21807 0.45431,0.21807 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7872" />
+ <path
+ d="m -141.04953,-285.93528 q -0.45691,0 -0.70872,0.33748 -0.25182,0.33749 -0.25182,0.95015 0,0.61007 0.25182,0.94756 0.25181,0.33749 0.70872,0.33749 0.4595,0 0.71132,-0.33749 0.25181,-0.33749 0.25181,-0.94756 0,-0.61266 -0.25181,-0.95015 -0.25182,-0.33748 -0.71132,-0.33748 z m 0,-0.7243 q 0.93458,0 1.46417,0.53478 0.52959,0.53479 0.52959,1.47715 0,0.93977 -0.52959,1.47456 -0.52959,0.53478 -1.46417,0.53478 -0.93198,0 -1.46417,-0.53478 -0.52959,-0.53479 -0.52959,-1.47456 0,-0.94236 0.52959,-1.47715 0.53219,-0.53478 1.46417,-0.53478 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7874" />
+ <path
+ d="m -138.37301,-283.84547 v -1.77569 h 0.93458 v 0.29075 q 0,0.23624 -0.003,0.5945 -0.003,0.35566 -0.003,0.47507 0,0.35047 0.0182,0.50623 0.0182,0.15317 0.0623,0.22326 0.0571,0.0909 0.14798,0.14019 0.0934,0.0493 0.21287,0.0493 0.29076,0 0.45691,-0.22326 0.16614,-0.22326 0.16614,-0.62045 v -1.43561 h 0.92939 v 2.90757 h -0.92939 v -0.42056 q -0.21028,0.25441 -0.44652,0.37642 -0.23364,0.11942 -0.51661,0.11942 -0.50363,0 -0.76843,-0.30893 -0.2622,-0.30893 -0.2622,-0.89823 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7876" />
+ <path
+ d="m -133.54177,-286.44671 v 0.82555 h 0.95794 v 0.66458 h -0.95794 v 1.23313 q 0,0.20249 0.0805,0.27518 0.0805,0.0701 0.31931,0.0701 h 0.47767 v 0.66459 h -0.79698 q -0.55036,0 -0.78141,-0.22845 -0.22845,-0.23105 -0.22845,-0.78141 v -1.23313 h -0.4621 v -0.66458 h 0.4621 v -0.82555 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7878" />
+ <path
+ d="m -129.11292,-284.17517 v 0.2648 h -2.17289 q 0.0337,0.3271 0.23624,0.49065 0.2025,0.16355 0.56594,0.16355 0.29335,0 0.59969,-0.0857 0.30893,-0.0883 0.63343,-0.26479 v 0.71651 q -0.3297,0.12461 -0.65939,0.18691 -0.3297,0.0649 -0.6594,0.0649 -0.7892,0 -1.22793,-0.39979 -0.43613,-0.40239 -0.43613,-1.12668 0,-0.71132 0.42834,-1.1189 0.43095,-0.40758 1.1838,-0.40758 0.68536,0 1.09553,0.41278 0.41277,0.41277 0.41277,1.10331 z m -0.95534,-0.30893 q 0,-0.26479 -0.15576,-0.42575 -0.15317,-0.16355 -0.40239,-0.16355 -0.26999,0 -0.43873,0.15317 -0.16875,0.15057 -0.21028,0.43613 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7880" />
+ <path
+ d="m -126.24947,-284.82937 q -0.12202,-0.0571 -0.24403,-0.0831 -0.11942,-0.0286 -0.24143,-0.0286 -0.35826,0 -0.55296,0.23105 -0.19211,0.22845 -0.19211,0.6568 v 1.33956 h -0.92938 v -2.90757 h 0.92938 v 0.47767 q 0.17913,-0.28557 0.41018,-0.41537 0.23364,-0.1324 0.55814,-0.1324 0.0467,0 0.10125,0.005 0.0545,0.003 0.15836,0.0156 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7882" />
+ <path
+ d="m -123.89486,-286.58949 h 0.99947 v 3.8759 h -0.99947 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7884" />
+ <path
+ d="m -120.94316,-286.44671 v 0.82555 h 0.95794 v 0.66458 h -0.95794 v 1.23313 q 0,0.20249 0.0805,0.27518 0.0805,0.0701 0.31931,0.0701 h 0.47767 v 0.66459 h -0.79698 q -0.55036,0 -0.78141,-0.22845 -0.22845,-0.23105 -0.22845,-0.78141 v -1.23313 h -0.4621 v -0.66458 h 0.4621 v -0.82555 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7886" />
+ <path
+ d="m -116.51431,-284.17517 v 0.2648 h -2.17289 q 0.0337,0.3271 0.23624,0.49065 0.20249,0.16355 0.56594,0.16355 0.29335,0 0.59969,-0.0857 0.30893,-0.0883 0.63343,-0.26479 v 0.71651 q -0.3297,0.12461 -0.65939,0.18691 -0.3297,0.0649 -0.6594,0.0649 -0.7892,0 -1.22793,-0.39979 -0.43613,-0.40239 -0.43613,-1.12668 0,-0.71132 0.42834,-1.1189 0.43095,-0.40758 1.1838,-0.40758 0.68536,0 1.09553,0.41278 0.41277,0.41277 0.41277,1.10331 z m -0.95534,-0.30893 q 0,-0.26479 -0.15576,-0.42575 -0.15317,-0.16355 -0.40239,-0.16355 -0.26999,0 -0.43873,0.15317 -0.16875,0.15057 -0.21028,0.43613 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7888" />
+ <path
+ d="m -113.65087,-284.82937 q -0.12202,-0.0571 -0.24403,-0.0831 -0.11942,-0.0286 -0.24143,-0.0286 -0.35826,0 -0.55296,0.23105 -0.19211,0.22845 -0.19211,0.6568 v 1.33956 h -0.92938 v -2.90757 h 0.92938 v 0.47767 q 0.17913,-0.28557 0.41018,-0.41537 0.23364,-0.1324 0.55815,-0.1324 0.0467,0 0.10124,0.005 0.0545,0.003 0.15836,0.0156 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7890" />
+ <path
+ d="m -111.88556,-284.022 q -0.29075,0 -0.43873,0.0986 -0.14538,0.0987 -0.14538,0.29076 0,0.17653 0.11682,0.27777 0.11942,0.0987 0.3297,0.0987 0.2622,0 0.44133,-0.18691 0.17913,-0.18951 0.17913,-0.47248 v -0.10644 z m 1.42004,-0.35047 v 1.65888 h -0.93717 v -0.43095 q -0.18692,0.2648 -0.42056,0.38681 -0.23365,0.11942 -0.56854,0.11942 -0.45171,0 -0.73468,-0.2622 -0.28037,-0.26479 -0.28037,-0.68535 0,-0.51142 0.35047,-0.75026 0.35306,-0.23884 1.10591,-0.23884 h 0.54777 v -0.0727 q 0,-0.22066 -0.17394,-0.32191 -0.17393,-0.10384 -0.54257,-0.10384 -0.29855,0 -0.55556,0.0597 -0.257,0.0597 -0.47767,0.17913 v -0.70872 q 0.29855,-0.0727 0.59969,-0.10904 0.30114,-0.0389 0.60228,-0.0389 0.7866,0 1.13447,0.31153 0.35047,0.30893 0.35047,1.00726 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7892" />
+ <path
+ d="m -108.58599,-286.44671 v 0.82555 h 0.95794 v 0.66458 h -0.95794 v 1.23313 q 0,0.20249 0.0805,0.27518 0.0805,0.0701 0.31931,0.0701 h 0.47767 v 0.66459 h -0.79698 q -0.55036,0 -0.78141,-0.22845 -0.22845,-0.23105 -0.22845,-0.78141 v -1.23313 h -0.4621 v -0.66458 h 0.4621 v -0.82555 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7894" />
+ <path
+ d="m -107.05952,-285.62116 h 0.92939 v 2.90757 h -0.92939 z m 0,-1.13188 h 0.92939 v 0.75805 h -0.92939 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7896" />
+ <path
+ d="m -103.8534,-285.02667 q -0.30893,0 -0.47248,0.22326 -0.16095,0.22067 -0.16095,0.63863 0,0.41796 0.16095,0.64122 0.16355,0.22067 0.47248,0.22067 0.30374,0 0.46469,-0.22067 0.16096,-0.22326 0.16096,-0.64122 0,-0.41796 -0.16096,-0.63863 -0.16095,-0.22326 -0.46469,-0.22326 z m 0,-0.66459 q 0.75026,0 1.17082,0.40499 0.42315,0.40498 0.42315,1.12149 0,0.71651 -0.42315,1.12149 -0.42056,0.40498 -1.17082,0.40498 -0.75285,0 -1.1786,-0.40498 -0.42316,-0.40498 -0.42316,-1.12149 0,-0.71651 0.42316,-1.12149 0.42575,-0.40499 1.1786,-0.40499 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7898" />
+ <path
+ d="m -98.661309,-284.4841 v 1.77051 h -0.934576 v -0.28816 -1.06698 q 0,-0.37642 -0.01817,-0.51921 -0.01558,-0.14278 -0.05711,-0.21028 -0.05452,-0.0909 -0.147974,-0.14018 -0.09346,-0.0519 -0.212875,-0.0519 -0.29076,0 -0.4569,0.22585 -0.16615,0.22326 -0.16615,0.62046 v 1.43042 h -0.92939 v -2.90757 h 0.92939 v 0.42575 q 0.21028,-0.25441 0.44652,-0.37383 0.236238,-0.12202 0.521803,-0.12202 0.503633,0 0.763237,0.30893 0.262201,0.30893 0.262201,0.89823 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7900" />
+ <path
+ d="m -233.06115,-278.54954 v -1.55762 h 0.93458 v 4.03944 h -0.93458 v -0.42056 q -0.19211,0.25701 -0.42315,0.37643 -0.23105,0.11942 -0.53479,0.11942 -0.53738,0 -0.88265,-0.42575 -0.34528,-0.42835 -0.34528,-1.10073 0,-0.67237 0.34528,-1.09812 0.34527,-0.42835 0.88265,-0.42835 0.30114,0 0.53219,0.12201 0.23364,0.11942 0.42575,0.37383 z m -0.61267,1.88214 q 0.29855,0 0.45431,-0.21807 0.15836,-0.21807 0.15836,-0.63344 0,-0.41536 -0.15836,-0.63343 -0.15576,-0.21807 -0.45431,-0.21807 -0.29594,0 -0.4543,0.21807 -0.15577,0.21807 -0.15577,0.63343 0,0.41537 0.15577,0.63344 0.15836,0.21807 0.4543,0.21807 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7902" />
+ <path
+ d="m -229.84984,-278.38079 q -0.30893,0 -0.47248,0.22326 -0.16096,0.22066 -0.16096,0.63862 0,0.41797 0.16096,0.64123 0.16355,0.22066 0.47248,0.22066 0.30374,0 0.46469,-0.22066 0.16096,-0.22326 0.16096,-0.64123 0,-0.41796 -0.16096,-0.63862 -0.16095,-0.22326 -0.46469,-0.22326 z m 0,-0.66459 q 0.75026,0 1.17081,0.40498 0.42316,0.40498 0.42316,1.12149 0,0.71651 -0.42316,1.12149 -0.42055,0.40499 -1.17081,0.40499 -0.75285,0 -1.17861,-0.40499 -0.42315,-0.40498 -0.42315,-1.12149 0,-0.71651 0.42315,-1.12149 0.42576,-0.40498 1.17861,-0.40498 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7904" />
+ <path
+ d="m -224.65775,-277.83822 v 1.7705 h -0.93458 v -0.28816 -1.06697 q 0,-0.37643 -0.0182,-0.51921 -0.0156,-0.14278 -0.0571,-0.21028 -0.0545,-0.0909 -0.14798,-0.14019 -0.0935,-0.0519 -0.21287,-0.0519 -0.29076,0 -0.45691,0.22586 -0.16614,0.22326 -0.16614,0.62045 v 1.43042 h -0.92939 v -2.90757 h 0.92939 v 0.42575 q 0.21028,-0.25441 0.44652,-0.37383 0.23624,-0.12201 0.5218,-0.12201 0.50363,0 0.76324,0.30893 0.2622,0.30893 0.2622,0.89823 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7906" />
+ <path
+ d="m -220.89349,-277.52929 v 0.2648 h -2.17289 q 0.0337,0.3271 0.23624,0.49065 0.2025,0.16355 0.56594,0.16355 0.29335,0 0.59969,-0.0857 0.30893,-0.0883 0.63343,-0.2648 v 0.71651 q -0.3297,0.12461 -0.65939,0.18692 -0.3297,0.0649 -0.6594,0.0649 -0.7892,0 -1.22793,-0.39979 -0.43613,-0.40239 -0.43613,-1.12669 0,-0.71131 0.42834,-1.11889 0.43095,-0.40758 1.1838,-0.40758 0.68536,0 1.09553,0.41277 0.41277,0.41277 0.41277,1.10332 z m -0.95534,-0.30893 q 0,-0.2648 -0.15576,-0.42575 -0.15317,-0.16355 -0.40239,-0.16355 -0.26999,0 -0.43873,0.15316 -0.16875,0.15057 -0.21028,0.43614 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7908" />
+ <path
+ d="m -216.79174,-276.6674 q 0.29855,0 0.45431,-0.21807 0.15836,-0.21807 0.15836,-0.63344 0,-0.41536 -0.15836,-0.63343 -0.15576,-0.21807 -0.45431,-0.21807 -0.29854,0 -0.4595,0.22066 -0.15835,0.21807 -0.15835,0.63084 0,0.41277 0.15835,0.63344 0.16096,0.21807 0.4595,0.21807 z m -0.61785,-1.88214 q 0.1921,-0.25441 0.42575,-0.37383 0.23364,-0.12201 0.53738,-0.12201 0.53738,0 0.88265,0.42835 0.34528,0.42575 0.34528,1.09812 0,0.67238 -0.34528,1.10073 -0.34527,0.42575 -0.88265,0.42575 -0.30374,0 -0.53738,-0.11942 -0.23365,-0.12201 -0.42575,-0.37643 v 0.42056 h -0.92939 v -4.03944 h 0.92939 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7910" />
+ <path
+ d="m -214.9148,-278.97529 h 0.92939 l 0.78141,1.973 0.66459,-1.973 h 0.92938 l -1.22274,3.18275 q -0.18432,0.48546 -0.43094,0.67757 -0.24403,0.1947 -0.64642,0.1947 h -0.53738 v -0.61007 h 0.29076 q 0.23624,0 0.34268,-0.0753 0.10903,-0.0753 0.16874,-0.26999 l 0.026,-0.0805 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7912" />
+ <path
+ d="m -209.17494,-279.94361 h 0.99948 v 2.32346 q 0,0.48027 0.15576,0.68795 0.15836,0.20509 0.51402,0.20509 0.35825,0 0.51401,-0.20509 0.15836,-0.20768 0.15836,-0.68795 v -2.32346 h 0.99948 v 2.32346 q 0,0.82294 -0.41277,1.22533 -0.41277,0.40239 -1.25908,0.40239 -0.84372,0 -1.25649,-0.40239 -0.41277,-0.40239 -0.41277,-1.22533 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7914" />
+ <path
+ d="m -204.85772,-279.94361 h 2.69729 v 0.75545 h -1.69781 v 0.7217 h 1.59657 v 0.75545 h -1.59657 v 1.64329 h -0.99948 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7916" />
+ <path
+ d="m -201.56334,-277.19959 v -1.7757 h 0.93458 v 0.29076 q 0,0.23624 -0.003,0.59449 -0.003,0.35566 -0.003,0.47508 0,0.35047 0.0182,0.50623 0.0182,0.15317 0.0623,0.22326 0.0571,0.0909 0.14797,0.14018 0.0935,0.0493 0.21288,0.0493 0.29075,0 0.4569,-0.22326 0.16615,-0.22326 0.16615,-0.62046 v -1.43561 h 0.92938 v 2.90757 h -0.92938 v -0.42056 q -0.21028,0.25442 -0.44652,0.37643 -0.23365,0.11942 -0.51662,0.11942 -0.50363,0 -0.76842,-0.30893 -0.26221,-0.30893 -0.26221,-0.89823 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7918" />
+ <path
+ d="m -194.824,-277.83822 v 1.7705 h -0.93458 v -0.28816 -1.06697 q 0,-0.37643 -0.0182,-0.51921 -0.0156,-0.14278 -0.0571,-0.21028 -0.0545,-0.0909 -0.14798,-0.14019 -0.0935,-0.0519 -0.21287,-0.0519 -0.29076,0 -0.45691,0.22586 -0.16614,0.22326 -0.16614,0.62045 v 1.43042 h -0.92939 v -2.90757 h 0.92939 v 0.42575 q 0.21028,-0.25441 0.44652,-0.37383 0.23624,-0.12201 0.5218,-0.12201 0.50363,0 0.76324,0.30893 0.2622,0.30893 0.2622,0.89823 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7920" />
+ <path
+ d="m -191.6127,-278.88443 v 0.75805 q -0.18951,-0.1298 -0.38162,-0.19211 -0.18951,-0.0623 -0.3946,-0.0623 -0.3894,0 -0.60747,0.22845 -0.21547,0.22585 -0.21547,0.63343 0,0.40758 0.21547,0.63603 0.21807,0.22586 0.60747,0.22586 0.21807,0 0.41278,-0.0649 0.1973,-0.0649 0.36344,-0.19211 v 0.76064 q -0.21807,0.0805 -0.44392,0.11942 -0.22326,0.0415 -0.44912,0.0415 -0.7866,0 -1.23052,-0.40239 -0.44393,-0.40498 -0.44393,-1.12409 0,-0.7191 0.44393,-1.12149 0.44392,-0.40498 1.23052,-0.40498 0.22845,0 0.44912,0.0415 0.22326,0.0389 0.44392,0.11941 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7922" />
+ <path
+ d="m -188.918,-279.94361 h 1.27206 l 0.88265,2.07424 0.88785,-2.07424 h 1.26947 v 3.87589 h -0.94496 v -2.83488 l -0.89304,2.08982 h -0.63344 l -0.89304,-2.08982 v 2.83488 h -0.94755 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7924" />
+ <path
+ d="m -182.36558,-277.37612 q -0.29076,0 -0.43874,0.0987 -0.14537,0.0987 -0.14537,0.29075 0,0.17653 0.11682,0.27778 0.11942,0.0986 0.3297,0.0986 0.2622,0 0.44132,-0.18692 0.17913,-0.18951 0.17913,-0.47248 v -0.10643 z m 1.42003,-0.35047 v 1.65887 h -0.93717 v -0.43094 q -0.18691,0.2648 -0.42056,0.38681 -0.23364,0.11942 -0.56853,0.11942 -0.45171,0 -0.73468,-0.2622 -0.28038,-0.2648 -0.28038,-0.68536 0,-0.51142 0.35047,-0.75026 0.35306,-0.23883 1.10591,-0.23883 h 0.54777 v -0.0727 q 0,-0.22066 -0.17393,-0.32191 -0.17394,-0.10384 -0.54258,-0.10384 -0.29854,0 -0.55555,0.0597 -0.25701,0.0597 -0.47767,0.17912 v -0.70872 q 0.29854,-0.0727 0.59968,-0.10903 0.30114,-0.0389 0.60228,-0.0389 0.78661,0 1.13448,0.31152 0.35046,0.30893 0.35046,1.00727 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7926" />
+ <path
+ d="m -177.73164,-278.88443 v 0.75805 q -0.18951,-0.1298 -0.38162,-0.19211 -0.18951,-0.0623 -0.3946,-0.0623 -0.38941,0 -0.60748,0.22845 -0.21547,0.22585 -0.21547,0.63343 0,0.40758 0.21547,0.63603 0.21807,0.22586 0.60748,0.22586 0.21807,0 0.41277,-0.0649 0.1973,-0.0649 0.36345,-0.19211 v 0.76064 q -0.21807,0.0805 -0.44393,0.11942 -0.22326,0.0415 -0.44911,0.0415 -0.7866,0 -1.23053,-0.40239 -0.44392,-0.40498 -0.44392,-1.12409 0,-0.7191 0.44392,-1.12149 0.44393,-0.40498 1.23053,-0.40498 0.22845,0 0.44911,0.0415 0.22326,0.0389 0.44393,0.11941 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7928" />
+ <path
+ d="m -174.00632,-277.83822 v 1.7705 h -0.93457 v -0.28816 -1.06178 q 0,-0.38162 -0.0182,-0.5244 -0.0156,-0.14278 -0.0571,-0.21028 -0.0545,-0.0909 -0.14797,-0.14019 -0.0935,-0.0519 -0.21288,-0.0519 -0.29076,0 -0.4569,0.22586 -0.16615,0.22326 -0.16615,0.62045 v 1.43042 h -0.92938 v -4.03944 h 0.92938 v 1.55762 q 0.21028,-0.25441 0.44652,-0.37383 0.23624,-0.12201 0.5218,-0.12201 0.50364,0 0.76324,0.30893 0.2622,0.30893 0.2622,0.89823 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7930" />
+ <path
+ d="m -173.14443,-278.97529 h 0.92938 v 2.90757 h -0.92938 z m 0,-1.13187 h 0.92938 v 0.75804 h -0.92938 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7932" />
+ <path
+ d="m -168.39886,-277.83822 v 1.7705 h -0.93458 v -0.28816 -1.06697 q 0,-0.37643 -0.0182,-0.51921 -0.0156,-0.14278 -0.0571,-0.21028 -0.0545,-0.0909 -0.14798,-0.14019 -0.0935,-0.0519 -0.21287,-0.0519 -0.29076,0 -0.45691,0.22586 -0.16614,0.22326 -0.16614,0.62045 v 1.43042 h -0.92939 v -2.90757 h 0.92939 v 0.42575 q 0.21028,-0.25441 0.44652,-0.37383 0.23624,-0.12201 0.5218,-0.12201 0.50363,0 0.76324,0.30893 0.2622,0.30893 0.2622,0.89823 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7934" />
+ <path
+ d="m -164.6346,-277.52929 v 0.2648 h -2.17289 q 0.0337,0.3271 0.23624,0.49065 0.20249,0.16355 0.56594,0.16355 0.29335,0 0.59968,-0.0857 0.30893,-0.0883 0.63344,-0.2648 v 0.71651 q -0.3297,0.12461 -0.6594,0.18692 -0.32969,0.0649 -0.65939,0.0649 -0.7892,0 -1.22793,-0.39979 -0.43614,-0.40239 -0.43614,-1.12669 0,-0.71131 0.42835,-1.11889 0.43095,-0.40758 1.1838,-0.40758 0.68535,0 1.09553,0.41277 0.41277,0.41277 0.41277,1.10332 z m -0.95534,-0.30893 q 0,-0.2648 -0.15577,-0.42575 -0.15316,-0.16355 -0.40238,-0.16355 -0.26999,0 -0.43874,0.15316 -0.16874,0.15057 -0.21028,0.43614 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7936" />
+ <path
+ d="m -161.77116,-278.18349 q -0.12201,-0.0571 -0.24403,-0.0831 -0.11941,-0.0285 -0.24143,-0.0285 -0.35825,0 -0.55296,0.23104 -0.1921,0.22846 -0.1921,0.6568 v 1.33956 h -0.92939 v -2.90757 h 0.92939 v 0.47767 q 0.17912,-0.28556 0.41017,-0.41536 0.23365,-0.1324 0.55815,-0.1324 0.0467,0 0.10125,0.005 0.0545,0.003 0.15836,0.0156 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7938" />
+ <path
+ d="m -161.69068,-278.97529 h 0.92938 l 0.78141,1.973 0.66459,-1.973 h 0.92938 l -1.22274,3.18275 q -0.18431,0.48546 -0.43094,0.67757 -0.24403,0.1947 -0.64641,0.1947 h -0.53739 v -0.61007 h 0.29076 q 0.23624,0 0.34268,-0.0753 0.10903,-0.0753 0.16874,-0.26999 l 0.026,-0.0805 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7940" />
+ <path
+ d="m -154.43473,-275.36679 h -0.77103 q -0.39719,-0.64122 -0.58671,-1.21754 -0.18951,-0.57892 -0.18951,-1.14745 0,-0.56854 0.18951,-1.15005 0.19211,-0.58411 0.58671,-1.22014 h 0.77103 q -0.3323,0.61526 -0.49844,1.20456 -0.16615,0.58671 -0.16615,1.16044 0,0.57372 0.16355,1.16302 0.16615,0.58931 0.50104,1.20716 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7942" />
+ <path
+ d="m -153.82207,-278.97529 h 0.90342 l 0.48806,2.00415 0.49065,-2.00415 h 0.77622 l 0.48805,1.98338 0.49066,-1.98338 h 0.90342 l -0.76583,2.90757 h -1.01506 l -0.49065,-1.99895 -0.48806,1.99895 h -1.01505 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7944" />
+ <path
+ d="m -148.65075,-278.97529 h 0.92939 v 2.90757 h -0.92939 z m 0,-1.13187 h 0.92939 v 0.75804 h -0.92939 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7946" />
+ <path
+ d="m -145.81327,-279.80083 v 0.82554 h 0.95794 v 0.66459 h -0.95794 v 1.23312 q 0,0.20249 0.0805,0.27518 0.0805,0.0701 0.31931,0.0701 h 0.47768 v 0.66459 h -0.79699 q -0.55036,0 -0.78141,-0.22845 -0.22845,-0.23105 -0.22845,-0.78141 v -1.23312 h -0.4621 v -0.66459 h 0.4621 v -0.82554 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7948" />
+ <path
+ d="m -141.36365,-277.83822 v 1.7705 h -0.93457 v -0.28816 -1.06178 q 0,-0.38162 -0.0182,-0.5244 -0.0156,-0.14278 -0.0571,-0.21028 -0.0545,-0.0909 -0.14797,-0.14019 -0.0935,-0.0519 -0.21288,-0.0519 -0.29076,0 -0.4569,0.22586 -0.16615,0.22326 -0.16615,0.62045 v 1.43042 h -0.92938 v -4.03944 h 0.92938 v 1.55762 q 0.21028,-0.25441 0.44652,-0.37383 0.23624,-0.12201 0.5218,-0.12201 0.50364,0 0.76324,0.30893 0.2622,0.30893 0.2622,0.89823 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7950" />
+ <path
+ d="m -140.50176,-278.97529 h 0.92938 v 2.90757 h -0.92938 z m 0,-1.13187 h 0.92938 v 0.75804 h -0.92938 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7952" />
+ <path
+ d="m -135.7562,-277.83822 v 1.7705 h -0.93457 v -0.28816 -1.06697 q 0,-0.37643 -0.0182,-0.51921 -0.0156,-0.14278 -0.0571,-0.21028 -0.0545,-0.0909 -0.14797,-0.14019 -0.0935,-0.0519 -0.21288,-0.0519 -0.29075,0 -0.4569,0.22586 -0.16615,0.22326 -0.16615,0.62045 v 1.43042 h -0.92938 v -2.90757 h 0.92938 v 0.42575 q 0.21028,-0.25441 0.44652,-0.37383 0.23624,-0.12201 0.52181,-0.12201 0.50363,0 0.76323,0.30893 0.2622,0.30893 0.2622,0.89823 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path7954" />
+ <path
+ d="m -131.30864,-276.88294 h -1.10696 l -0.19903,0.81522 h -0.9352 l 1.15604,-3.77894 h 1.08515 l 1.15605,3.77894 h -0.95701 z m -0.96518,-0.64891 h 0.81795 l -0.40897,-1.67136 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Bold'"
+ id="path7956" />
+ <path
+ d="m -129.80906,-276.06772 v -0.57802 h 0.38171 v -1.74497 h -0.38171 v -0.57256 h 1.0388 l 0.15814,0.65163 q 0.15541,-0.37353 0.39534,-0.55621 0.24266,-0.18267 0.59165,-0.18267 0.14723,0 0.26175,0.0245 0.11451,0.0218 0.21539,0.0627 l -0.16086,1.21057 h -0.53985 v -0.5344 q -0.24539,0.0436 -0.43079,0.2672 -0.1854,0.22085 -0.28628,0.5453 v 0.82886 h 0.57256 v 0.57802 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Bold'"
+ id="path7958" />
+ <path
+ d="m -126.53725,-276.06772 v -0.57802 h 0.38171 v -1.74497 h -0.38171 v -0.57256 h 1.0388 l 0.15814,0.65163 q 0.15541,-0.37353 0.39534,-0.55621 0.24266,-0.18267 0.59166,-0.18267 0.14723,0 0.26174,0.0245 0.11451,0.0218 0.2154,0.0627 l -0.16087,1.21057 h -0.53985 v -0.5344 q -0.24538,0.0436 -0.43079,0.2672 -0.1854,0.22085 -0.28628,0.5453 v 0.82886 h 0.57257 v 0.57802 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Bold'"
+ id="path7960" />
+ <path
+ d="m -120.85521,-276.90203 q 0,0.16359 0.0436,0.23721 0.0464,0.0736 0.14723,0.11178 l -0.17723,0.56712 q -0.25629,-0.0245 -0.43351,-0.11179 -0.1745,-0.09 -0.27538,-0.26992 -0.16632,0.19903 -0.42534,0.29719 -0.25901,0.0954 -0.52894,0.0954 -0.44715,0 -0.71435,-0.25356 -0.26447,-0.25629 -0.26447,-0.65709 0,-0.47169 0.36808,-0.72798 0.37081,-0.25629 1.04153,-0.25629 h 0.38989 v -0.10906 q 0,-0.44442 -0.57257,-0.44442 -0.13905,0 -0.35717,0.0409 -0.21812,0.0382 -0.43624,0.11179 l -0.19904,-0.57257 q 0.28083,-0.10633 0.58348,-0.16086 0.30537,-0.0545 0.5453,-0.0545 0.64618,0 0.95428,0.26447 0.31082,0.26174 0.31082,0.75797 z m -1.35235,0.31082 q 0.13905,0 0.29174,-0.0818 0.15268,-0.0845 0.23175,-0.23721 v -0.46896 h -0.21267 q -0.3599,0 -0.52894,0.11179 -0.16904,0.10906 -0.16904,0.32173 0,0.16631 0.10088,0.26174 0.1036,0.0927 0.28628,0.0927 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Bold'"
+ id="path7962" />
+ <path
+ d="m -117.28349,-278.96327 -0.96518,2.89555 q -0.19086,0.5753 -0.57802,0.87521 -0.38444,0.29992 -1.04426,0.33809 l -0.0982,-0.60801 q 0.28628,-0.0355 0.46078,-0.10634 0.17722,-0.0709 0.28356,-0.19358 0.10906,-0.11996 0.18812,-0.30537 h -0.29446 l -0.91883,-2.89555 h 0.91065 l 0.56166,2.3448 0.61074,-2.3448 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Bold'"
+ id="path7964" />
+ <path
+ d="m -114.16709,-279.84666 0.21267,3.77894 h -0.77978 l -0.0464,-1.61682 q -0.008,-0.29992 -0.005,-0.52076 0.005,-0.22085 0.0191,-0.42261 0.0136,-0.20449 0.0327,-0.45806 l -0.42534,2.3748 h -0.67617 l -0.45806,-2.3748 q 0.0218,0.23721 0.0354,0.44715 0.0136,0.20722 0.0164,0.43624 0.005,0.22903 0,0.53167 l -0.0273,1.60319 h -0.76615 l 0.21267,-3.77894 h 0.91883 l 0.41989,2.44295 0.39807,-2.44295 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Bold'"
+ id="path7966" />
+ <path
+ d="m -112.73022,-277.26466 q 0.0436,0.35445 0.23175,0.50986 0.18813,0.15269 0.46351,0.15269 0.19903,0 0.38443,-0.0654 0.18541,-0.0654 0.35718,-0.1745 l 0.34626,0.46896 q -0.20448,0.1745 -0.49622,0.28629 -0.28901,0.11178 -0.65982,0.11178 -0.49622,0 -0.83158,-0.19631 -0.33536,-0.19903 -0.50441,-0.5453 -0.16904,-0.34626 -0.16904,-0.79614 0,-0.42806 0.16359,-0.77706 0.16359,-0.35172 0.47714,-0.55893 0.31627,-0.20994 0.7716,-0.20994 0.41443,0 0.71707,0.17722 0.30537,0.17722 0.47169,0.50986 0.16905,0.33263 0.16905,0.79887 0,0.0736 -0.005,0.15814 -0.003,0.0845 -0.0109,0.14995 z m 0.53439,-1.21602 q -0.23175,0 -0.37353,0.16632 -0.14178,0.16631 -0.17177,0.53167 h 1.06334 q -0.003,-0.31628 -0.12269,-0.50714 -0.11997,-0.19085 -0.39535,-0.19085 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Bold'"
+ id="path7968" />
+ <path
+ d="m -107.59894,-276.23676 q -0.16904,0.10906 -0.40898,0.1854 -0.23993,0.0763 -0.53984,0.0763 -0.56712,0 -0.8425,-0.28901 -0.27538,-0.29173 -0.27538,-0.79069 v -1.31417 h -0.60801 v -0.59438 h 0.60801 v -0.6271 l 0.86158,-0.10361 v 0.73071 h 0.93247 l -0.0845,0.59438 h -0.84795 v 1.31417 q 0,0.2154 0.0982,0.3081 0.0982,0.0927 0.31355,0.0927 0.15268,0 0.2781,-0.0354 0.12815,-0.0382 0.22903,-0.0954 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Bold'"
+ id="path7970" />
+ <path
+ d="m -106.07209,-280.19838 v 1.52139 q 0.36262,-0.38171 0.85067,-0.38171 0.38716,0 0.59165,0.2263 0.20449,0.2263 0.20449,0.638 v 2.12668 h -0.86158 v -1.88674 q 0,-0.26175 -0.06,-0.36536 -0.0573,-0.1036 -0.21812,-0.1036 -0.13633,0 -0.26175,0.0954 -0.12269,0.0927 -0.24538,0.2563 v 2.00398 h -0.86158 v -4.04614 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Bold'"
+ id="path7972" />
+ <path
+ d="m -102.40767,-279.0587 q 0.44715,0 0.7607,0.19085 0.31354,0.19086 0.47986,0.53713 0.16632,0.34354 0.16632,0.80704 0,0.72526 -0.37081,1.13696 -0.3708,0.4117 -1.03607,0.4117 -0.66527,0 -1.03608,-0.40625 -0.3708,-0.40625 -0.3708,-1.13695 0,-0.46078 0.16632,-0.80705 0.16904,-0.34627 0.48259,-0.53985 0.31627,-0.19358 0.75797,-0.19358 z m 0,0.63528 q -0.26447,0 -0.39262,0.21812 -0.12542,0.21539 -0.12542,0.68708 0,0.47986 0.12542,0.69526 0.12815,0.21539 0.39262,0.21539 0.26447,0 0.38989,-0.21539 0.12815,-0.2154 0.12815,-0.70072 0,-0.46896 -0.12815,-0.68435 -0.12542,-0.21539 -0.38989,-0.21539 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Bold'"
+ id="path7974" />
+ <path
+ d="m -98.743249,-280.20384 0.861578,0.09 v 4.04614 h -0.763423 l -0.04363,-0.319 q -0.119966,0.16904 -0.319002,0.29174 -0.199035,0.11996 -0.482592,0.11996 -0.3599,0 -0.597107,-0.19358 -0.23448,-0.19358 -0.35172,-0.53985 -0.11451,-0.34899 -0.11451,-0.81523 0,-0.44714 0.13905,-0.79341 0.13905,-0.34627 0.39807,-0.54258 0.259018,-0.19903 0.616192,-0.19903 0.389891,0 0.657089,0.2672 z m -0.425336,1.77496 q -0.223574,0 -0.359899,0.21267 -0.136326,0.20994 -0.136326,0.69799 0,0.35717 0.05726,0.55621 0.05726,0.19631 0.158137,0.27537 0.100881,0.0791 0.231754,0.0791 0.144505,0 0.261745,-0.09 0.119967,-0.09 0.212668,-0.24539 v -1.24874 q -0.08997,-0.11179 -0.190856,-0.1745 -0.100881,-0.0627 -0.23448,-0.0627 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Bold'"
+ id="path7976" />
+ <path
+ d="m -95.648667,-277.97628 q 0,-0.44987 -0.106334,-0.8234 -0.106334,-0.37626 -0.335361,-0.73344 -0.226301,-0.3599 -0.59438,-0.75797 l 0.501678,-0.4526 q 0.430789,0.37081 0.747065,0.78251 0.316275,0.41171 0.488046,0.89975 0.17177,0.48805 0.17177,1.08515 0,0.59711 -0.17177,1.08516 -0.171771,0.48804 -0.488046,0.89974 -0.316276,0.41171 -0.747065,0.78251 l -0.501678,-0.4526 q 0.294463,-0.319 0.493499,-0.59438 0.199035,-0.2781 0.319002,-0.5453 0.119966,-0.2672 0.17177,-0.55076 0.0518,-0.28628 0.0518,-0.62437 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Bold'"
+ id="path7978" />
+ </g>
+ <g
+ aria-label="Promoter"
+ transform="scale(-1)"
+ id="text5366"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.3167px;line-height:1.25;font-family:fira;-inkscape-font-specification:fira;letter-spacing:0px;word-spacing:0px;fill:#000080;fill-opacity:1;stroke-width:0.398751">
+ <path
+ d="m 23.637677,-208.1394 q 0,0.43896 -0.188129,0.71979 -0.18813,0.27811 -0.523491,0.41171 -0.332634,0.13087 -0.771603,0.13087 h -0.433516 v 1.306 h -0.747064 v -3.77077 h 1.109691 q 0.733432,0 1.142409,0.29719 0.411703,0.29719 0.411703,0.90521 z m -0.77433,0.005 q 0,-0.349 -0.199035,-0.50441 -0.199036,-0.15813 -0.553482,-0.15813 h -0.389892 v 1.36598 h 0.411704 q 0.332634,0 0.53167,-0.15814 0.199035,-0.16086 0.199035,-0.5453 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path8065" />
+ <path
+ d="m 24.27022,-205.57103 v -0.49895 h 0.406251 v -1.8922 H 24.27022 v -0.49623 h 0.95428 l 0.133599,0.66255 q 0.158138,-0.36536 0.398071,-0.55349 0.239933,-0.18813 0.602559,-0.18813 0.139052,0 0.245386,0.0218 0.106334,0.0218 0.207215,0.0573 l -0.128146,1.12605 h -0.479866 v -0.56439 q -0.280831,0.0245 -0.485319,0.2563 -0.204489,0.22902 -0.321729,0.60528 v 0.96519 h 0.575294 v 0.49895 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path8067" />
+ <path
+ d="m 28.714428,-208.5402 q 0.430789,0 0.730706,0.18813 0.299916,0.18813 0.455327,0.53167 0.158138,0.34081 0.158138,0.79887 0,0.70344 -0.35172,1.11787 -0.35172,0.41443 -0.995177,0.41443 -0.643457,0 -0.995177,-0.40625 -0.35172,-0.40898 -0.35172,-1.1206 0,-0.4526 0.158137,-0.79614 0.158138,-0.34354 0.458054,-0.5344 0.302643,-0.19358 0.733432,-0.19358 z m 0,0.54257 q -0.302643,0 -0.452601,0.23721 -0.147231,0.23721 -0.147231,0.74434 0,0.51258 0.147231,0.74979 0.147232,0.23448 0.449875,0.23448 0.302643,0 0.449875,-0.23448 0.147231,-0.23721 0.147231,-0.75524 0,-0.50441 -0.147231,-0.73889 -0.147232,-0.23721 -0.447149,-0.23721 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path8069" />
+ <path
+ d="m 32.839635,-208.5402 q 0.272651,0 0.430789,0.18267 0.158137,0.17995 0.158137,0.64619 v 2.14031 h -0.627098 v -2.05034 q 0,-0.19358 -0.02999,-0.27538 -0.02999,-0.0845 -0.141779,-0.0845 -0.08998,0 -0.182676,0.0545 -0.0927,0.0518 -0.18813,0.18813 v 2.16758 h -0.542576 v -2.05034 q 0,-0.19358 -0.02999,-0.27538 -0.02999,-0.0845 -0.141779,-0.0845 -0.08997,0 -0.182676,0.0545 -0.0927,0.0518 -0.18813,0.18813 v 2.16758 h -0.635277 v -2.88738 h 0.537123 l 0.04635,0.29992 q 0.128146,-0.17722 0.269924,-0.2781 0.141779,-0.10361 0.340814,-0.10361 0.163591,0 0.289011,0.0818 0.128146,0.0791 0.182676,0.27265 0.12542,-0.15813 0.278104,-0.25629 0.155412,-0.0982 0.357174,-0.0982 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path8071" />
+ <path
+ d="m 35.258044,-208.5402 q 0.430789,0 0.730705,0.18813 0.299917,0.18813 0.455328,0.53167 0.158138,0.34081 0.158138,0.79887 0,0.70344 -0.351721,1.11787 -0.35172,0.41443 -0.995177,0.41443 -0.643457,0 -0.995177,-0.40625 -0.35172,-0.40898 -0.35172,-1.1206 0,-0.4526 0.158138,-0.79614 0.158137,-0.34354 0.458054,-0.5344 0.302643,-0.19358 0.733432,-0.19358 z m 0,0.54257 q -0.302643,0 -0.452601,0.23721 -0.147232,0.23721 -0.147232,0.74434 0,0.51258 0.147232,0.74979 0.147231,0.23448 0.449874,0.23448 0.302643,0 0.449875,-0.23448 0.147232,-0.23721 0.147232,-0.75524 0,-0.50441 -0.147232,-0.73889 -0.147232,-0.23721 -0.447148,-0.23721 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path8073" />
+ <path
+ d="m 39.822219,-205.73189 q -0.160864,0.10633 -0.389891,0.17449 -0.229027,0.0682 -0.496225,0.0682 -0.528944,0 -0.796142,-0.27266 -0.267198,-0.27537 -0.267198,-0.7307 v -1.45596 h -0.627098 v -0.50986 h 0.627098 v -0.63527 l 0.719799,-0.0872 v 0.72252 h 0.95428 l -0.07362,0.50986 h -0.880664 v 1.45323 q 0,0.22358 0.109061,0.32718 0.10906,0.10361 0.35172,0.10361 0.155411,0 0.283557,-0.0354 0.130873,-0.0382 0.237207,-0.0954 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path8075" />
+ <path
+ d="m 41.215459,-206.79523 q 0.03272,0.40625 0.239933,0.5862 0.207215,0.17995 0.504405,0.17995 0.207215,0 0.389891,-0.0654 0.182677,-0.0654 0.3599,-0.18268 l 0.299916,0.41171 q -0.201762,0.16904 -0.482592,0.27265 -0.278105,0.10361 -0.613466,0.10361 -0.46896,0 -0.790689,-0.19359 -0.319002,-0.19358 -0.482592,-0.53712 -0.163591,-0.34354 -0.163591,-0.79069 0,-0.43079 0.158138,-0.77705 0.160864,-0.34627 0.463507,-0.54803 0.305369,-0.20449 0.733432,-0.20449 0.59438,0 0.943373,0.38716 0.348994,0.38717 0.348994,1.07152 0,0.15814 -0.01363,0.28629 z m 0.618918,-1.23784 q -0.261745,0 -0.430789,0.18813 -0.166317,0.18813 -0.196309,0.58893 h 1.216025 q -0.0055,-0.36536 -0.149958,-0.56985 -0.144505,-0.20721 -0.438969,-0.20721 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path8077" />
+ <path
+ d="m 43.901065,-205.57103 v -0.49895 h 0.406251 v -1.8922 h -0.406251 v -0.49623 h 0.95428 l 0.133599,0.66255 q 0.158138,-0.36536 0.398071,-0.55349 0.239933,-0.18813 0.602559,-0.18813 0.139052,0 0.245386,0.0218 0.106334,0.0218 0.207215,0.0573 l -0.128146,1.12605 h -0.479866 v -0.56439 q -0.280831,0.0245 -0.485319,0.2563 -0.204489,0.22902 -0.321729,0.60528 v 0.96519 h 0.575294 v 0.49895 z"
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Semi-Bold';fill:#000080;fill-opacity:1;stroke-width:0.398751"
+ id="path8079" />
+ </g>
+ </g>
+ <g
+ aria-label="Inputs"
+ id="text1097"
+ style="font-size:6.7452px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#008100;fill-opacity:1;stroke-width:0.505891">
+ <path
+ d="m 72.923006,56.52514 h 0.665298 v 4.917277 h -0.665298 z"
+ style="fill:#008100;fill-opacity:1;stroke-width:0.505891"
+ id="path8166" />
+ <path
+ d="m 77.952264,59.215974 v 2.226443 H 77.34625 v -2.206682 q 0,-0.523675 -0.2042,-0.783866 -0.204201,-0.26019 -0.612601,-0.26019 -0.49074,0 -0.773986,0.312887 -0.283246,0.312888 -0.283246,0.853031 v 2.08482 H 74.86291 v -3.688781 h 0.609307 v 0.573078 q 0.217375,-0.332649 0.510501,-0.497326 0.29642,-0.164678 0.681766,-0.164678 0.635656,0 0.961718,0.395226 0.326062,0.391933 0.326062,1.156038 z"
+ style="fill:#008100;fill-opacity:1;stroke-width:0.505891"
+ id="path8168" />
+ <path
+ d="m 79.747251,60.8891 v 1.956371 h -0.609307 v -5.091835 h 0.609307 v 0.559904 q 0.191026,-0.329355 0.480859,-0.487446 0.293127,-0.161384 0.698234,-0.161384 0.671885,0 1.090167,0.533556 0.421575,0.533556 0.421575,1.403054 0,0.869498 -0.421575,1.403054 -0.418282,0.533556 -1.090167,0.533556 -0.405107,0 -0.698234,-0.15809 -0.289833,-0.161385 -0.480859,-0.49074 z m 2.061766,-1.28778 q 0,-0.668592 -0.276659,-1.04735 -0.273365,-0.382053 -0.754224,-0.382053 -0.480859,0 -0.757518,0.382053 -0.273365,0.378758 -0.273365,1.04735 0,0.668592 0.273365,1.050644 0.276659,0.378759 0.757518,0.378759 0.480859,0 0.754224,-0.378759 0.276659,-0.382052 0.276659,-1.050644 z"
+ style="fill:#008100;fill-opacity:1;stroke-width:0.505891"
+ id="path8170" />
+ <path
+ d="m 83.380042,59.986666 v -2.23303 h 0.606015 v 2.209975 q 0,0.523675 0.2042,0.78716 0.2042,0.26019 0.612601,0.26019 0.49074,0 0.773985,-0.312887 0.28654,-0.312888 0.28654,-0.853031 v -2.091407 h 0.606014 v 3.688781 h -0.606014 v -0.566491 q -0.220668,0.335942 -0.513795,0.50062 -0.289833,0.161384 -0.675179,0.161384 -0.635656,0 -0.965011,-0.395226 -0.329356,-0.395227 -0.329356,-1.156038 z"
+ style="fill:#008100;fill-opacity:1;stroke-width:0.505891"
+ id="path8172" />
+ <path
+ d="m 88.317081,56.706285 v 1.047351 h 1.248257 v 0.470978 h -1.248257 v 2.002481 q 0,0.451217 0.121861,0.579666 0.125156,0.128449 0.503914,0.128449 h 0.622482 v 0.507207 h -0.622482 q -0.701527,0 -0.968305,-0.260191 -0.266778,-0.263484 -0.266778,-0.955131 v -2.002481 h -0.44463 v -0.470978 h 0.44463 v -1.047351 z"
+ style="fill:#008100;fill-opacity:1;stroke-width:0.505891"
+ id="path8174" />
+ <path
+ d="m 92.713977,57.862323 v 0.573079 q -0.256897,-0.131743 -0.533556,-0.197614 -0.276659,-0.06587 -0.573079,-0.06587 -0.451217,0 -0.678472,0.13833 -0.223962,0.138329 -0.223962,0.414987 0,0.210788 0.161385,0.332649 0.161384,0.118568 0.64883,0.227256 l 0.207494,0.04611 q 0.645537,0.138329 0.915608,0.391933 0.273365,0.25031 0.273365,0.701527 0,0.513794 -0.408401,0.813508 -0.405107,0.299713 -1.116515,0.299713 -0.29642,0 -0.619188,-0.05928 -0.319475,-0.05599 -0.675179,-0.171265 v -0.625775 q 0.335943,0.174558 0.662005,0.263484 0.326062,0.08563 0.645537,0.08563 0.428162,0 0.65871,-0.144917 0.230549,-0.14821 0.230549,-0.414988 0,-0.247016 -0.167971,-0.378758 -0.164678,-0.131742 -0.727876,-0.253604 l -0.210787,-0.0494 q -0.563198,-0.118568 -0.813508,-0.362291 -0.25031,-0.247017 -0.25031,-0.675179 0,-0.520382 0.368878,-0.803627 0.368878,-0.283246 1.04735,-0.283246 0.335943,0 0.632363,0.0494 0.29642,0.0494 0.54673,0.14821 z"
+ style="fill:#008100;fill-opacity:1;stroke-width:0.505891"
+ id="path8176" />
+ </g>
+ <g
+ aria-label="Output"
+ id="text1101"
+ style="font-size:6.7452px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#d99b00;fill-opacity:1;stroke-width:0.505891">
+ <path
+ d="m 153.15762,56.976357 q -0.72458,0 -1.15274,0.540143 -0.42487,0.540143 -0.42487,1.472219 0,0.928782 0.42487,1.468925 0.42816,0.540143 1.15274,0.540143 0.72459,0 1.14616,-0.540143 0.42487,-0.540143 0.42487,-1.468925 0,-0.932076 -0.42487,-1.472219 -0.42157,-0.540143 -1.14616,-0.540143 z m 0,-0.540143 q 1.03418,0 1.65337,0.69494 0.61919,0.691646 0.61919,1.857565 0,1.162625 -0.61919,1.857565 -0.61919,0.691646 -1.65337,0.691646 -1.03747,0 -1.65995,-0.691646 -0.61919,-0.691647 -0.61919,-1.857565 0,-1.165919 0.61919,-1.857565 0.62248,-0.69494 1.65995,-0.69494 z"
+ style="fill:#d99b00;fill-opacity:1;stroke-width:0.505891"
+ id="path8263" />
+ <path
+ d="m 156.38201,59.986666 v -2.23303 h 0.60602 v 2.209975 q 0,0.523675 0.2042,0.78716 0.2042,0.26019 0.6126,0.26019 0.49074,0 0.77399,-0.312887 0.28653,-0.312888 0.28653,-0.853031 v -2.091407 h 0.60602 v 3.688781 h -0.60602 v -0.566491 q -0.22066,0.335942 -0.51379,0.50062 -0.28983,0.161384 -0.67518,0.161384 -0.63565,0 -0.96501,-0.395226 -0.32936,-0.395227 -0.32936,-1.156038 z"
+ style="fill:#d99b00;fill-opacity:1;stroke-width:0.505891"
+ id="path8265" />
+ <path
+ d="m 161.31905,56.706285 v 1.047351 h 1.24826 v 0.470978 h -1.24826 v 2.002481 q 0,0.451217 0.12186,0.579666 0.12516,0.128449 0.50392,0.128449 h 0.62248 v 0.507207 h -0.62248 q -0.70153,0 -0.96831,-0.260191 -0.26678,-0.263484 -0.26678,-0.955131 v -2.002481 h -0.44463 v -0.470978 h 0.44463 v -1.047351 z"
+ style="fill:#d99b00;fill-opacity:1;stroke-width:0.505891"
+ id="path8267" />
+ <path
+ d="m 163.9506,60.8891 v 1.956371 h -0.6093 v -5.091835 h 0.6093 v 0.559904 q 0.19103,-0.329355 0.48086,-0.487446 0.29313,-0.161384 0.69824,-0.161384 0.67188,0 1.09016,0.533556 0.42158,0.533556 0.42158,1.403054 0,0.869498 -0.42158,1.403054 -0.41828,0.533556 -1.09016,0.533556 -0.40511,0 -0.69824,-0.15809 -0.28983,-0.161385 -0.48086,-0.49074 z m 2.06177,-1.28778 q 0,-0.668592 -0.27666,-1.04735 -0.27337,-0.382053 -0.75422,-0.382053 -0.48086,0 -0.75752,0.382053 -0.27337,0.378758 -0.27337,1.04735 0,0.668592 0.27337,1.050644 0.27666,0.378759 0.75752,0.378759 0.48085,0 0.75422,-0.378759 0.27666,-0.382052 0.27666,-1.050644 z"
+ style="fill:#d99b00;fill-opacity:1;stroke-width:0.505891"
+ id="path8269" />
+ <path
+ d="m 167.58339,59.986666 v -2.23303 h 0.60602 v 2.209975 q 0,0.523675 0.2042,0.78716 0.2042,0.26019 0.6126,0.26019 0.49074,0 0.77398,-0.312887 0.28654,-0.312888 0.28654,-0.853031 v -2.091407 h 0.60602 v 3.688781 h -0.60602 v -0.566491 q -0.22066,0.335942 -0.51379,0.50062 -0.28983,0.161384 -0.67518,0.161384 -0.63566,0 -0.96501,-0.395226 -0.32936,-0.395227 -0.32936,-1.156038 z"
+ style="fill:#d99b00;fill-opacity:1;stroke-width:0.505891"
+ id="path8271" />
+ <path
+ d="m 172.52043,56.706285 v 1.047351 h 1.24826 v 0.470978 h -1.24826 v 2.002481 q 0,0.451217 0.12186,0.579666 0.12516,0.128449 0.50392,0.128449 h 0.62248 v 0.507207 h -0.62248 q -0.70153,0 -0.96831,-0.260191 -0.26678,-0.263484 -0.26678,-0.955131 v -2.002481 h -0.44463 v -0.470978 h 0.44463 v -1.047351 z"
+ style="fill:#d99b00;fill-opacity:1;stroke-width:0.505891"
+ id="path8273" />
+ </g>
+ <g
+ aria-label="… including correct
+output descriptor"
+ id="text1791"
+ style="font-size:5.3167px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000080;stroke-width:0.398751">
+ <path
+ d="m 95.177533,230.17717 h 0.550362 v 0.65939 h -0.550362 z m 1.767907,0 h 0.552957 v 0.65939 H 96.94544 Z m -3.538409,0 h 0.552957 v 0.65939 h -0.552957 z"
+ style="text-align:end;text-anchor:end;fill:#000080;stroke-width:0.398751"
+ id="path8360" />
+ <path
+ d="m 100.30213,227.92899 h 0.47767 v 2.90757 h -0.47767 z m 0,-1.13187 h 0.47767 v 0.60488 h -0.47767 z"
+ style="text-align:end;text-anchor:end;fill:#000080;stroke-width:0.398751"
+ id="path8362" />
+ <path
+ d="m 104.19619,229.08164 v 1.75492 h -0.47767 v -1.73935 q 0,-0.41277 -0.16095,-0.61786 -0.16096,-0.20508 -0.48287,-0.20508 -0.38681,0 -0.61007,0.24662 -0.22326,0.24663 -0.22326,0.67238 v 1.64329 h -0.48027 v -2.90757 h 0.48027 v 0.45171 q 0.17134,-0.2622 0.40239,-0.392 0.23364,-0.1298 0.53738,-0.1298 0.50104,0 0.75805,0.31152 0.257,0.30893 0.257,0.91122 z"
+ style="text-align:end;text-anchor:end;fill:#000080;stroke-width:0.398751"
+ id="path8364" />
+ <path
+ d="m 107.24135,228.04062 v 0.44652 q -0.20249,-0.11163 -0.40757,-0.16614 -0.2025,-0.0571 -0.41018,-0.0571 -0.46469,0 -0.7217,0.29595 -0.25701,0.29335 -0.25701,0.82554 0,0.53219 0.25701,0.82814 0.25701,0.29336 0.7217,0.29336 0.20768,0 0.41018,-0.0545 0.20508,-0.0571 0.40757,-0.16874 v 0.44132 q -0.19989,0.0935 -0.41536,0.14019 -0.21288,0.0467 -0.45431,0.0467 -0.6568,0 -1.04361,-0.41277 -0.38681,-0.41277 -0.38681,-1.11371 0,-0.71131 0.38941,-1.11889 0.392,-0.40758 1.07216,-0.40758 0.22067,0 0.43095,0.0467 0.21027,0.0441 0.40757,0.13499 z"
+ style="text-align:end;text-anchor:end;fill:#000080;stroke-width:0.398751"
+ id="path8366" />
+ <path
+ d="m 108.07209,226.79712 h 0.47767 v 4.03944 h -0.47767 z"
+ style="text-align:end;text-anchor:end;fill:#000080;stroke-width:0.398751"
+ id="path8368" />
+ <path
+ d="m 109.49991,229.68911 v -1.76012 h 0.47768 v 1.74195 q 0,0.41277 0.16095,0.62045 0.16096,0.20509 0.48286,0.20509 0.38682,0 0.61008,-0.24662 0.22585,-0.24663 0.22585,-0.67238 v -1.64849 h 0.47767 v 2.90757 h -0.47767 v -0.44652 q -0.17393,0.2648 -0.40498,0.3946 -0.22845,0.12721 -0.53219,0.12721 -0.50104,0 -0.76064,-0.31153 -0.25961,-0.31152 -0.25961,-0.91121 z"
+ style="text-align:end;text-anchor:end;fill:#000080;stroke-width:0.398751"
+ id="path8370" />
+ <path
+ d="m 114.83219,228.37032 v -1.5732 h 0.47767 v 4.03944 h -0.47767 v -0.43613 q -0.15057,0.2596 -0.38162,0.38681 -0.22845,0.12461 -0.55036,0.12461 -0.527,0 -0.85929,-0.42056 -0.3297,-0.42056 -0.3297,-1.10592 0,-0.68535 0.3297,-1.10591 0.33229,-0.42056 0.85929,-0.42056 0.32191,0 0.55036,0.12721 0.23105,0.12461 0.38162,0.38421 z m -1.62772,1.01505 q 0,0.527 0.21547,0.82814 0.21807,0.29855 0.59709,0.29855 0.37902,0 0.59709,-0.29855 0.21807,-0.30114 0.21807,-0.82814 0,-0.52699 -0.21807,-0.82554 -0.21807,-0.30114 -0.59709,-0.30114 -0.37902,0 -0.59709,0.30114 -0.21547,0.29855 -0.21547,0.82554 z"
+ style="text-align:end;text-anchor:end;fill:#000080;stroke-width:0.398751"
+ id="path8372" />
+ <path
+ d="m 116.29376,227.92899 h 0.47767 v 2.90757 h -0.47767 z m 0,-1.13187 h 0.47767 v 0.60488 h -0.47767 z"
+ style="text-align:end;text-anchor:end;fill:#000080;stroke-width:0.398751"
+ id="path8374" />
+ <path
+ d="m 120.18783,229.08164 v 1.75492 h -0.47767 v -1.73935 q 0,-0.41277 -0.16096,-0.61786 -0.16095,-0.20508 -0.48286,-0.20508 -0.38681,0 -0.61007,0.24662 -0.22326,0.24663 -0.22326,0.67238 v 1.64329 h -0.48027 v -2.90757 h 0.48027 v 0.45171 q 0.17134,-0.2622 0.40239,-0.392 0.23364,-0.1298 0.53738,-0.1298 0.50103,0 0.75804,0.31152 0.25701,0.30893 0.25701,0.91122 z"
+ style="text-align:end;text-anchor:end;fill:#000080;stroke-width:0.398751"
+ id="path8376" />
+ <path
+ d="m 123.05386,229.34903 q 0,-0.51921 -0.21547,-0.80477 -0.21287,-0.28557 -0.59968,-0.28557 -0.38422,0 -0.59969,0.28557 -0.21288,0.28556 -0.21288,0.80477 0,0.51661 0.21288,0.80218 0.21547,0.28556 0.59969,0.28556 0.38681,0 0.59968,-0.28556 0.21547,-0.28557 0.21547,-0.80218 z m 0.47768,1.12668 q 0,0.74247 -0.3297,1.10332 -0.3297,0.36345 -1.00986,0.36345 -0.25182,0 -0.47508,-0.0389 -0.22326,-0.0363 -0.43354,-0.11423 v -0.46469 q 0.21028,0.11423 0.41537,0.16874 0.20509,0.0545 0.41796,0.0545 0.46989,0 0.70353,-0.24662 0.23364,-0.24403 0.23364,-0.73988 v -0.23624 q -0.14797,0.25701 -0.37902,0.38422 -0.23105,0.1272 -0.55296,0.1272 -0.53478,0 -0.86188,-0.40758 -0.3271,-0.40757 -0.3271,-1.07995 0,-0.67497 0.3271,-1.08255 0.3271,-0.40758 0.86188,-0.40758 0.32191,0 0.55296,0.12721 0.23105,0.1272 0.37902,0.38421 v -0.44133 h 0.47768 z"
+ style="text-align:end;text-anchor:end;fill:#000080;stroke-width:0.398751"
+ id="path8378" />
+ <path
+ d="m 128.29787,228.04062 v 0.44652 q -0.20249,-0.11163 -0.40758,-0.16614 -0.20249,-0.0571 -0.41017,-0.0571 -0.46469,0 -0.7217,0.29595 -0.25701,0.29335 -0.25701,0.82554 0,0.53219 0.25701,0.82814 0.25701,0.29336 0.7217,0.29336 0.20768,0 0.41017,-0.0545 0.20509,-0.0571 0.40758,-0.16874 v 0.44132 q -0.19989,0.0935 -0.41536,0.14019 -0.21288,0.0467 -0.45431,0.0467 -0.6568,0 -1.04361,-0.41277 -0.38681,-0.41277 -0.38681,-1.11371 0,-0.71131 0.3894,-1.11889 0.39201,-0.40758 1.07217,-0.40758 0.22067,0 0.43094,0.0467 0.21028,0.0441 0.40758,0.13499 z"
+ style="text-align:end;text-anchor:end;fill:#000080;stroke-width:0.398751"
+ id="path8380" />
+ <path
+ d="m 130.25529,228.26388 q -0.38421,0 -0.60747,0.30114 -0.22326,0.29855 -0.22326,0.82035 0,0.52181 0.22066,0.82295 0.22326,0.29855 0.61007,0.29855 0.38162,0 0.60488,-0.30115 0.22326,-0.30114 0.22326,-0.82035 0,-0.51661 -0.22326,-0.81775 -0.22326,-0.30374 -0.60488,-0.30374 z m 0,-0.40498 q 0.62305,0 0.97871,0.40498 0.35566,0.40499 0.35566,1.12149 0,0.71392 -0.35566,1.1215 -0.35566,0.40498 -0.97871,0.40498 -0.62565,0 -0.9813,-0.40498 -0.35307,-0.40758 -0.35307,-1.1215 0,-0.7165 0.35307,-1.12149 0.35565,-0.40498 0.9813,-0.40498 z"
+ style="text-align:end;text-anchor:end;fill:#000080;stroke-width:0.398751"
+ id="path8382" />
+ <path
+ d="m 134.06629,228.37551 q -0.0805,-0.0467 -0.17654,-0.0675 -0.0934,-0.0234 -0.20768,-0.0234 -0.40498,0 -0.62305,0.2648 -0.21547,0.2622 -0.21547,0.75545 v 1.53166 h -0.48027 v -2.90757 h 0.48027 v 0.45171 q 0.15057,-0.26479 0.392,-0.392 0.24143,-0.1298 0.58671,-0.1298 0.0493,0 0.10903,0.008 0.0597,0.005 0.1324,0.0182 z"
+ style="text-align:end;text-anchor:end;fill:#000080;stroke-width:0.398751"
+ id="path8384" />
+ <path
+ d="m 136.1587,228.37551 q -0.0805,-0.0467 -0.17653,-0.0675 -0.0935,-0.0234 -0.20769,-0.0234 -0.40498,0 -0.62305,0.2648 -0.21547,0.2622 -0.21547,0.75545 v 1.53166 h -0.48027 v -2.90757 h 0.48027 v 0.45171 q 0.15057,-0.26479 0.392,-0.392 0.24143,-0.1298 0.58671,-0.1298 0.0493,0 0.10903,0.008 0.0597,0.005 0.1324,0.0182 z"
+ style="text-align:end;text-anchor:end;fill:#000080;stroke-width:0.398751"
+ id="path8386" />
+ <path
+ d="m 139.02992,229.26336 v 0.23364 h -2.19625 q 0.0311,0.49325 0.29595,0.75286 0.26739,0.25701 0.74247,0.25701 0.27518,0 0.53219,-0.0675 0.2596,-0.0675 0.51401,-0.20249 v 0.45171 q -0.257,0.10903 -0.52699,0.16615 -0.26999,0.0571 -0.54777,0.0571 -0.69574,0 -1.10332,-0.40498 -0.40498,-0.40499 -0.40498,-1.09554 0,-0.71391 0.38421,-1.13187 0.38682,-0.42056 1.04102,-0.42056 0.5867,0 0.92679,0.37902 0.34267,0.37643 0.34267,1.02544 z m -0.47767,-0.14019 q -0.005,-0.392 -0.22066,-0.62564 -0.21288,-0.23365 -0.56594,-0.23365 -0.39979,0 -0.64122,0.22586 -0.23884,0.22585 -0.27518,0.63603 z"
+ style="text-align:end;text-anchor:end;fill:#000080;stroke-width:0.398751"
+ id="path8388" />
+ <path
+ d="m 141.90634,228.04062 v 0.44652 q -0.20249,-0.11163 -0.40758,-0.16614 -0.20249,-0.0571 -0.41017,-0.0571 -0.4647,0 -0.7217,0.29595 -0.25701,0.29335 -0.25701,0.82554 0,0.53219 0.25701,0.82814 0.257,0.29336 0.7217,0.29336 0.20768,0 0.41017,-0.0545 0.20509,-0.0571 0.40758,-0.16874 v 0.44132 q -0.19989,0.0935 -0.41537,0.14019 -0.21287,0.0467 -0.4543,0.0467 -0.6568,0 -1.04361,-0.41277 -0.38681,-0.41277 -0.38681,-1.11371 0,-0.71131 0.3894,-1.11889 0.392,-0.40758 1.07217,-0.40758 0.22066,0 0.43094,0.0467 0.21028,0.0441 0.40758,0.13499 z"
+ style="text-align:end;text-anchor:end;fill:#000080;stroke-width:0.398751"
+ id="path8390" />
+ <path
+ d="m 143.20956,227.10345 v 0.82554 h 0.9839 v 0.37124 h -0.9839 v 1.57839 q 0,0.35566 0.096,0.45691 0.0986,0.10124 0.3972,0.10124 h 0.49065 v 0.39979 h -0.49065 q -0.55296,0 -0.76324,-0.20508 -0.21028,-0.20769 -0.21028,-0.75286 v -1.57839 h -0.35047 v -0.37124 h 0.35047 v -0.82554 z"
+ style="text-align:end;text-anchor:end;fill:#000080;stroke-width:0.398751"
+ id="path8392" />
+ <path
+ d="m 99.821858,234.90976 q -0.384215,0 -0.607475,0.30114 -0.22326,0.29854 -0.22326,0.82035 0,0.5218 0.220664,0.82295 0.22326,0.29854 0.610071,0.29854 0.381622,0 0.604882,-0.30114 0.22326,-0.30114 0.22326,-0.82035 0,-0.51661 -0.22326,-0.81776 -0.22326,-0.30373 -0.604882,-0.30373 z m 0,-0.40499 q 0.623052,0 0.978712,0.40499 0.35565,0.40498 0.35565,1.12149 0,0.71391 -0.35565,1.12149 -0.35566,0.40498 -0.978712,0.40498 -0.625647,0 -0.981305,-0.40498 -0.353062,-0.40758 -0.353062,-1.12149 0,-0.71651 0.353062,-1.12149 0.355658,-0.40499 0.981305,-0.40499 z"
+ style="text-align:end;text-anchor:end;fill:#000080;stroke-width:0.398751"
+ id="path8394" />
+ <path
+ d="m 101.89869,236.33499 v -1.76012 h 0.47768 v 1.74194 q 0,0.41278 0.16095,0.62046 0.16096,0.20509 0.48286,0.20509 0.38682,0 0.61008,-0.24663 0.22585,-0.24662 0.22585,-0.67237 v -1.64849 h 0.47767 v 2.90757 h -0.47767 v -0.44652 q -0.17393,0.26479 -0.40498,0.3946 -0.22845,0.1272 -0.53219,0.1272 -0.50104,0 -0.76064,-0.31152 -0.25961,-0.31153 -0.25961,-0.91121 z"
+ style="text-align:end;text-anchor:end;fill:#000080;stroke-width:0.398751"
+ id="path8396" />
+ <path
+ d="m 105.79017,233.74933 v 0.82554 h 0.9839 v 0.37123 h -0.9839 v 1.5784 q 0,0.35566 0.096,0.4569 0.0987,0.10125 0.39719,0.10125 h 0.49066 v 0.39979 h -0.49066 q -0.55295,0 -0.76323,-0.20509 -0.21028,-0.20768 -0.21028,-0.75285 v -1.5784 h -0.35047 v -0.37123 h 0.35047 v -0.82554 z"
+ style="text-align:end;text-anchor:end;fill:#000080;stroke-width:0.398751"
+ id="path8398" />
+ <path
+ d="m 107.8644,237.0463 v 1.54205 h -0.48026 v -4.01348 h 0.48026 v 0.44133 q 0.15057,-0.25961 0.37903,-0.38422 0.23104,-0.12721 0.55036,-0.12721 0.52959,0 0.85929,0.42056 0.33229,0.42056 0.33229,1.10592 0,0.68535 -0.33229,1.10591 -0.3297,0.42056 -0.85929,0.42056 -0.31932,0 -0.55036,-0.12461 -0.22846,-0.1272 -0.37903,-0.38681 z m 1.62513,-1.01505 q 0,-0.527 -0.21807,-0.82554 -0.21547,-0.30114 -0.59449,-0.30114 -0.37903,0 -0.59709,0.30114 -0.21548,0.29854 -0.21548,0.82554 0,0.527 0.21548,0.82814 0.21806,0.29854 0.59709,0.29854 0.37902,0 0.59449,-0.29854 0.21807,-0.30114 0.21807,-0.82814 z"
+ style="text-align:end;text-anchor:end;fill:#000080;stroke-width:0.398751"
+ id="path8400" />
+ <path
+ d="m 110.72784,236.33499 v -1.76012 h 0.47767 v 1.74194 q 0,0.41278 0.16096,0.62046 0.16095,0.20509 0.48286,0.20509 0.38681,0 0.61007,-0.24663 0.22586,-0.24662 0.22586,-0.67237 v -1.64849 h 0.47767 v 2.90757 h -0.47767 v -0.44652 q -0.17393,0.26479 -0.40498,0.3946 -0.22845,0.1272 -0.53219,0.1272 -0.50104,0 -0.76064,-0.31152 -0.25961,-0.31153 -0.25961,-0.91121 z"
+ style="text-align:end;text-anchor:end;fill:#000080;stroke-width:0.398751"
+ id="path8402" />
+ <path
+ d="m 114.61931,233.74933 v 0.82554 h 0.9839 v 0.37123 h -0.9839 v 1.5784 q 0,0.35566 0.0961,0.4569 0.0987,0.10125 0.39719,0.10125 h 0.49065 v 0.39979 h -0.49065 q -0.55296,0 -0.76324,-0.20509 -0.21027,-0.20768 -0.21027,-0.75285 v -1.5784 h -0.35047 v -0.37123 h 0.35047 v -0.82554 z"
+ style="text-align:end;text-anchor:end;fill:#000080;stroke-width:0.398751"
+ id="path8404" />
+ <path
+ d="m 119.83477,235.0162 v -1.57321 h 0.47767 v 4.03945 h -0.47767 v -0.43614 q -0.15057,0.25961 -0.38162,0.38681 -0.22845,0.12461 -0.55036,0.12461 -0.527,0 -0.85929,-0.42056 -0.3297,-0.42056 -0.3297,-1.10591 0,-0.68536 0.3297,-1.10592 0.33229,-0.42056 0.85929,-0.42056 0.32191,0 0.55036,0.12721 0.23105,0.12461 0.38162,0.38422 z m -1.62772,1.01505 q 0,0.527 0.21547,0.82814 0.21807,0.29854 0.59709,0.29854 0.37902,0 0.59709,-0.29854 0.21807,-0.30114 0.21807,-0.82814 0,-0.527 -0.21807,-0.82554 -0.21807,-0.30114 -0.59709,-0.30114 -0.37902,0 -0.59709,0.30114 -0.21547,0.29854 -0.21547,0.82554 z"
+ style="text-align:end;text-anchor:end;fill:#000080;stroke-width:0.398751"
+ id="path8406" />
+ <path
+ d="m 123.78335,235.90923 v 0.23365 h -2.19625 q 0.0311,0.49325 0.29595,0.75285 0.26739,0.25701 0.74247,0.25701 0.27518,0 0.53219,-0.0675 0.2596,-0.0675 0.51401,-0.20249 v 0.45171 q -0.25701,0.10904 -0.52699,0.16615 -0.26999,0.0571 -0.54777,0.0571 -0.69574,0 -1.10332,-0.40498 -0.40498,-0.40498 -0.40498,-1.09553 0,-0.71391 0.38421,-1.13188 0.38681,-0.42056 1.04102,-0.42056 0.5867,0 0.92678,0.37903 0.34268,0.37642 0.34268,1.02543 z m -0.47767,-0.14018 q -0.005,-0.392 -0.22066,-0.62565 -0.21288,-0.23364 -0.56594,-0.23364 -0.39979,0 -0.64122,0.22585 -0.23884,0.22586 -0.27518,0.63603 z"
+ style="text-align:end;text-anchor:end;fill:#000080;stroke-width:0.398751"
+ id="path8408" />
+ <path
+ d="m 126.42093,234.66054 v 0.45171 q -0.20249,-0.10384 -0.42056,-0.15576 -0.21806,-0.0519 -0.45171,-0.0519 -0.35566,0 -0.53478,0.10903 -0.17653,0.10903 -0.17653,0.3271 0,0.16615 0.1272,0.2622 0.12721,0.0935 0.51142,0.17913 l 0.16355,0.0363 q 0.50883,0.10904 0.7217,0.30893 0.21548,0.1973 0.21548,0.55296 0,0.40498 -0.32191,0.64122 -0.31932,0.23624 -0.88006,0.23624 -0.23365,0 -0.48806,-0.0467 -0.25182,-0.0441 -0.53219,-0.13499 v -0.49325 q 0.2648,0.13759 0.52181,0.20769 0.257,0.0675 0.50882,0.0675 0.33749,0 0.51921,-0.11422 0.18172,-0.11683 0.18172,-0.32711 0,-0.1947 -0.1324,-0.29854 -0.1298,-0.10384 -0.57372,-0.1999 l -0.16615,-0.0389 q -0.44392,-0.0934 -0.64122,-0.28556 -0.1973,-0.1947 -0.1973,-0.53219 0,-0.41018 0.29076,-0.63344 0.29075,-0.22326 0.82554,-0.22326 0.2648,0 0.49844,0.0389 0.23364,0.0389 0.43094,0.11682 z"
+ style="text-align:end;text-anchor:end;fill:#000080;stroke-width:0.398751"
+ id="path8410" />
+ <path
+ d="m 129.42975,234.6865 v 0.44652 q -0.20249,-0.11163 -0.40758,-0.16615 -0.20249,-0.0571 -0.41017,-0.0571 -0.4647,0 -0.7217,0.29595 -0.25701,0.29335 -0.25701,0.82554 0,0.53219 0.25701,0.82814 0.257,0.29335 0.7217,0.29335 0.20768,0 0.41017,-0.0545 0.20509,-0.0571 0.40758,-0.16874 v 0.44133 q -0.19989,0.0935 -0.41537,0.14018 -0.21287,0.0467 -0.4543,0.0467 -0.6568,0 -1.04361,-0.41277 -0.38682,-0.41277 -0.38682,-1.1137 0,-0.71132 0.38941,-1.1189 0.392,-0.40758 1.07217,-0.40758 0.22066,0 0.43094,0.0467 0.21028,0.0441 0.40758,0.135 z"
+ style="text-align:end;text-anchor:end;fill:#000080;stroke-width:0.398751"
+ id="path8412" />
+ <path
+ d="m 131.94532,235.02139 q -0.0805,-0.0467 -0.17653,-0.0675 -0.0935,-0.0234 -0.20769,-0.0234 -0.40498,0 -0.62305,0.26479 -0.21547,0.2622 -0.21547,0.75545 v 1.53167 h -0.48027 v -2.90757 h 0.48027 v 0.45171 q 0.15057,-0.2648 0.392,-0.392 0.24143,-0.12981 0.58671,-0.12981 0.0493,0 0.10903,0.008 0.0597,0.005 0.1324,0.0182 z"
+ style="text-align:end;text-anchor:end;fill:#000080;stroke-width:0.398751"
+ id="path8414" />
+ <path
+ d="m 132.44635,234.57487 h 0.47768 v 2.90757 h -0.47768 z m 0,-1.13188 h 0.47768 v 0.60488 h -0.47768 z"
+ style="text-align:end;text-anchor:end;fill:#000080;stroke-width:0.398751"
+ id="path8416" />
+ <path
+ d="m 134.3856,237.0463 v 1.54205 h -0.48027 v -4.01348 h 0.48027 v 0.44133 q 0.15057,-0.25961 0.37902,-0.38422 0.23105,-0.12721 0.55036,-0.12721 0.5296,0 0.85929,0.42056 0.3323,0.42056 0.3323,1.10592 0,0.68535 -0.3323,1.10591 -0.32969,0.42056 -0.85929,0.42056 -0.31931,0 -0.55036,-0.12461 -0.22845,-0.1272 -0.37902,-0.38681 z m 1.62512,-1.01505 q 0,-0.527 -0.21806,-0.82554 -0.21548,-0.30114 -0.5945,-0.30114 -0.37902,0 -0.59709,0.30114 -0.21547,0.29854 -0.21547,0.82554 0,0.527 0.21547,0.82814 0.21807,0.29854 0.59709,0.29854 0.37902,0 0.5945,-0.29854 0.21806,-0.30114 0.21806,-0.82814 z"
+ style="text-align:end;text-anchor:end;fill:#000080;stroke-width:0.398751"
+ id="path8418" />
+ <path
+ d="m 137.77084,233.74933 v 0.82554 h 0.9839 v 0.37123 h -0.9839 v 1.5784 q 0,0.35566 0.0961,0.4569 0.0987,0.10125 0.39719,0.10125 h 0.49065 v 0.39979 h -0.49065 q -0.55296,0 -0.76324,-0.20509 -0.21028,-0.20768 -0.21028,-0.75285 v -1.5784 h -0.35046 v -0.37123 h 0.35046 v -0.82554 z"
+ style="text-align:end;text-anchor:end;fill:#000080;stroke-width:0.398751"
+ id="path8420" />
+ <path
+ d="m 140.50967,234.90976 q -0.38421,0 -0.60747,0.30114 -0.22326,0.29854 -0.22326,0.82035 0,0.5218 0.22066,0.82295 0.22326,0.29854 0.61007,0.29854 0.38162,0 0.60488,-0.30114 0.22326,-0.30114 0.22326,-0.82035 0,-0.51661 -0.22326,-0.81776 -0.22326,-0.30373 -0.60488,-0.30373 z m 0,-0.40499 q 0.62305,0 0.97871,0.40499 0.35566,0.40498 0.35566,1.12149 0,0.71391 -0.35566,1.12149 -0.35566,0.40498 -0.97871,0.40498 -0.62565,0 -0.9813,-0.40498 -0.35307,-0.40758 -0.35307,-1.12149 0,-0.71651 0.35307,-1.12149 0.35565,-0.40499 0.9813,-0.40499 z"
+ style="text-align:end;text-anchor:end;fill:#000080;stroke-width:0.398751"
+ id="path8422" />
+ <path
+ d="m 144.32066,235.02139 q -0.0805,-0.0467 -0.17653,-0.0675 -0.0935,-0.0234 -0.20768,-0.0234 -0.40499,0 -0.62305,0.26479 -0.21548,0.2622 -0.21548,0.75545 v 1.53167 h -0.48026 v -2.90757 h 0.48026 v 0.45171 q 0.15058,-0.2648 0.39201,-0.392 0.24143,-0.12981 0.5867,-0.12981 0.0493,0 0.10904,0.008 0.0597,0.005 0.1324,0.0182 z"
+ style="text-align:end;text-anchor:end;fill:#000080;stroke-width:0.398751"
+ id="path8424" />
+ </g>
+ <path
+ id="rect5208"
+ style="opacity:0.25;fill:#830000;fill-opacity:0.64;stroke:none;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.2, 2.4;stroke-dashoffset:0;stroke-opacity:0.497957"
+ d="m 103.27132,134.54594 h 42.29433 c 1.14406,0 2.06509,0.92103 2.06509,2.06509 v 15.54342 c 0,1.14406 -0.92103,2.06509 -2.06509,2.06509 h -42.29433 c -1.14406,0 -2.06509,-0.92103 -2.06509,-2.06509 v -15.54342 c 0,-1.14406 0.92103,-2.06509 2.06509,-2.06509 z" />
+ <g
+ aria-label="+ ArrayMethod
+ lookup"
+ id="text5218"
+ style="font-size:5.3167px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#800000;fill-opacity:1;stroke-width:0.398751">
+ <path
+ d="m 106.10878,139.41425 v 1.446 h 1.446 v 0.44133 h -1.446 v 1.44599 h -0.43613 v -1.44599 h -1.446 v -0.44133 h 1.446 v -1.446 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path8596" />
+ <path
+ d="m 112.17203,141.79057 h -1.48595 l -0.29991,0.957 h -0.46624 l 1.22148,-3.7544 h 0.60529 l 1.22147,3.7544 h -0.49622 z m -1.36325,-0.39262 h 1.24056 l -0.61619,-2.00671 z"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code'"
+ id="path8598" />
+ <path
+ d="m 113.65525,142.74757 v -0.35172 h 0.44715 v -2.16757 h -0.44715 v -0.35172 h 0.79614 l 0.0845,0.6789 q 0.16632,-0.35445 0.40352,-0.54803 0.23721,-0.19358 0.6271,-0.19358 0.11997,0 0.21267,0.0191 0.0954,0.0164 0.19358,0.0436 l -0.0654,0.97063 h -0.37626 v -0.61073 q -0.0109,0 -0.0245,0 -0.65982,0 -0.9461,0.94337 v 1.21602 h 0.58347 v 0.35172 z"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code'"
+ id="path8600" />
+ <path
+ d="m 116.92706,142.74757 v -0.35172 h 0.44714 v -2.16757 h -0.44714 v -0.35172 h 0.79614 l 0.0845,0.6789 q 0.16632,-0.35445 0.40352,-0.54803 0.23721,-0.19358 0.6271,-0.19358 0.11997,0 0.21267,0.0191 0.0954,0.0164 0.19358,0.0436 l -0.0654,0.97063 h -0.37625 v -0.61073 q -0.0109,0 -0.0245,0 -0.65982,0 -0.9461,0.94337 v 1.21602 h 0.58347 v 0.35172 z"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code'"
+ id="path8602" />
+ <path
+ d="m 122.22739,142.12048 q 0,0.17449 0.0573,0.25356 0.0572,0.0791 0.17722,0.11452 l -0.11179,0.32172 q -0.1854,-0.0245 -0.32445,-0.11724 -0.13906,-0.0954 -0.20177,-0.28628 -0.15541,0.19904 -0.38989,0.30264 -0.23175,0.10088 -0.50985,0.10088 -0.43079,0 -0.67891,-0.24266 -0.24811,-0.24266 -0.24811,-0.64345 0,-0.44442 0.34627,-0.68163 0.34627,-0.23721 1.00063,-0.23721 h 0.42261 v -0.23993 q 0,-0.31082 -0.18268,-0.43897 -0.17995,-0.13087 -0.50168,-0.13087 -0.14178,0 -0.33263,0.0354 -0.19086,0.0327 -0.41443,0.11179 l -0.11997,-0.34627 q 0.26175,-0.0982 0.4935,-0.13905 0.23448,-0.0409 0.44442,-0.0409 0.5344,0 0.80432,0.25084 0.26993,0.25084 0.26993,0.67618 z m -1.18603,0.34081 q 0.21266,0 0.40352,-0.10633 0.19358,-0.10906 0.32173,-0.29992 v -0.73889 h -0.41443 q -0.47442,0 -0.67072,0.1636 -0.19359,0.16359 -0.19359,0.43896 0,0.54258 0.55349,0.54258 z"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code'"
+ id="path8604" />
+ <path
+ d="m 125.83183,139.87656 -1.00881,2.8901 q -0.10088,0.29174 -0.25629,0.5344 -0.15269,0.24266 -0.4008,0.40079 -0.24538,0.16087 -0.62437,0.19904 l -0.0709,-0.36535 q 0.29719,-0.0491 0.46896,-0.14996 0.17177,-0.10088 0.26993,-0.25902 0.10088,-0.15541 0.17722,-0.37899 h -0.15269 l -1.00335,-2.87101 h 0.49077 l 0.82341,2.52202 0.8125,-2.52202 z"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code'"
+ id="path8606" />
+ <path
+ d="m 129.06001,138.99317 0.21267,3.7544 h -0.45533 l -0.11724,-1.96036 q -0.0136,-0.26174 -0.0218,-0.5344 -0.005,-0.27265 -0.008,-0.49349 -0.003,-0.22358 0,-0.33264 l -0.63255,2.64745 h -0.47441 l -0.6789,-2.64745 q 0.005,0.10634 0.008,0.33809 0.003,0.23175 0,0.50713 -0.003,0.27538 -0.0136,0.50986 l -0.10088,1.96581 h -0.44442 l 0.21267,-3.7544 h 0.65981 l 0.60802,2.5711 0.58074,-2.5711 z"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code'"
+ id="path8608" />
+ <path
+ d="m 130.34692,141.47429 q 0.0191,0.49895 0.26175,0.72798 0.24538,0.2263 0.57802,0.2263 0.22084,0 0.39807,-0.0654 0.17722,-0.0654 0.36808,-0.19359 l 0.21539,0.30265 q -0.19903,0.15813 -0.45805,0.24811 -0.25902,0.09 -0.52895,0.09 -0.41988,0 -0.71434,-0.18813 -0.29174,-0.18813 -0.44715,-0.52349 -0.15269,-0.33808 -0.15269,-0.78251 0,-0.43624 0.15269,-0.77433 0.15541,-0.33808 0.43624,-0.53167 0.28356,-0.19358 0.66527,-0.19358 0.54258,0 0.8534,0.37626 0.31355,0.37626 0.31355,1.03062 0,0.0736 -0.005,0.13906 -0.003,0.0654 -0.005,0.11178 z m 0.77978,-1.28146 q -0.319,0 -0.53439,0.2263 -0.2154,0.2263 -0.24266,0.70072 h 1.49685 q -0.008,-0.46078 -0.20176,-0.69254 -0.19358,-0.23448 -0.51804,-0.23448 z"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code'"
+ id="path8610" />
+ <path
+ d="m 135.53819,142.60307 q -0.14723,0.0982 -0.35717,0.15268 -0.20994,0.0545 -0.4117,0.0545 -0.46351,0 -0.71435,-0.24266 -0.25084,-0.24266 -0.25084,-0.62437 V 140.231 h -0.65982 v -0.35444 h 0.65982 v -0.65164 l 0.45805,-0.0545 v 0.70617 h 0.99245 l -0.0545,0.35444 h -0.93792 v 1.7068 q 0,0.23993 0.12542,0.36535 0.12815,0.12542 0.42261,0.12542 0.16087,0 0.29719,-0.0382 0.13633,-0.0382 0.25357,-0.0982 z"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code'"
+ id="path8612" />
+ <path
+ d="m 136.98869,138.67689 v 1.59228 q 0.16904,-0.22357 0.41443,-0.33808 0.24811,-0.11452 0.50168,-0.11452 0.41988,0 0.61346,0.22358 0.19358,0.22357 0.19358,0.62164 v 2.08578 h -0.45805 v -2.07487 q 0,-0.25902 -0.11997,-0.37626 -0.11996,-0.11997 -0.37626,-0.11997 -0.16359,0 -0.31082,0.0736 -0.14723,0.0736 -0.26447,0.18267 -0.11724,0.10906 -0.19358,0.22358 v 2.09123 h -0.45806 v -4.0216 z"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code'"
+ id="path8614" />
+ <path
+ d="m 140.89577,139.81657 q 0.60802,0 0.91884,0.40625 0.31082,0.40625 0.31082,1.08788 0,0.43897 -0.14178,0.77706 -0.14178,0.33809 -0.41715,0.53167 -0.27538,0.19085 -0.67618,0.19085 -0.60801,0 -0.92156,-0.40897 -0.31355,-0.40898 -0.31355,-1.08516 0,-0.44169 0.14178,-0.77978 0.14178,-0.34081 0.41716,-0.52894 0.2781,-0.19086 0.68162,-0.19086 z m 0,0.37353 q -0.3708,0 -0.56166,0.27538 -0.18813,0.27538 -0.18813,0.85067 0,0.56985 0.18541,0.84522 0.18813,0.27265 0.55893,0.27265 0.37081,0 0.55621,-0.27537 0.18813,-0.27538 0.18813,-0.84795 0,-0.57257 -0.1854,-0.84522 -0.18541,-0.27538 -0.55349,-0.27538 z"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code'"
+ id="path8616" />
+ <path
+ d="m 144.79195,138.66326 0.45806,0.0572 v 4.02706 h -0.4008 l -0.0436,-0.37898 q -0.16087,0.22903 -0.37081,0.33536 -0.20721,0.10633 -0.44442,0.10633 -0.37353,0 -0.61619,-0.18813 -0.24266,-0.18813 -0.3599,-0.52349 -0.11724,-0.33808 -0.11724,-0.78251 0,-0.43078 0.1336,-0.76887 0.1336,-0.34082 0.38444,-0.5344 0.25356,-0.19631 0.60801,-0.19631 0.47714,0 0.76887,0.33809 z m -0.64891,1.52139 q -0.3599,0 -0.55348,0.28083 -0.19358,0.28083 -0.19358,0.85067 0,1.12333 0.68981,1.12333 0.24266,0 0.41715,-0.13633 0.1745,-0.13905 0.28901,-0.31627 v -1.43415 q -0.11724,-0.1745 -0.28355,-0.26992 -0.16632,-0.0982 -0.36536,-0.0982 z"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code'"
+ id="path8618" />
+ <path
+ d="m 110.92444,145.40592 h 0.47768 v 4.03945 h -0.47768 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path8620" />
+ <path
+ d="m 113.52828,146.87269 q -0.38422,0 -0.60748,0.30114 -0.22326,0.29855 -0.22326,0.82035 0,0.52181 0.22067,0.82295 0.22326,0.29854 0.61007,0.29854 0.38162,0 0.60488,-0.30114 0.22326,-0.30114 0.22326,-0.82035 0,-0.51661 -0.22326,-0.81775 -0.22326,-0.30374 -0.60488,-0.30374 z m 0,-0.40498 q 0.62305,0 0.97871,0.40498 0.35565,0.40498 0.35565,1.12149 0,0.71391 -0.35565,1.12149 -0.35566,0.40499 -0.97871,0.40499 -0.62565,0 -0.98131,-0.40499 -0.35306,-0.40758 -0.35306,-1.12149 0,-0.71651 0.35306,-1.12149 0.35566,-0.40498 0.98131,-0.40498 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path8622" />
+ <path
+ d="m 116.78112,146.87269 q -0.38421,0 -0.60747,0.30114 -0.22326,0.29855 -0.22326,0.82035 0,0.52181 0.22066,0.82295 0.22326,0.29854 0.61007,0.29854 0.38162,0 0.60488,-0.30114 0.22326,-0.30114 0.22326,-0.82035 0,-0.51661 -0.22326,-0.81775 -0.22326,-0.30374 -0.60488,-0.30374 z m 0,-0.40498 q 0.62305,0 0.97871,0.40498 0.35566,0.40498 0.35566,1.12149 0,0.71391 -0.35566,1.12149 -0.35566,0.40499 -0.97871,0.40499 -0.62564,0 -0.9813,-0.40499 -0.35306,-0.40758 -0.35306,-1.12149 0,-0.71651 0.35306,-1.12149 0.35566,-0.40498 0.9813,-0.40498 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path8624" />
+ <path
+ d="m 118.88911,145.40592 h 0.48027 v 2.38577 l 1.42523,-1.25389 h 0.61007 l -1.54205,1.36033 1.60695,1.54724 h -0.62305 l -1.47715,-1.42004 v 1.42004 h -0.48027 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path8626" />
+ <path
+ d="m 121.77332,148.29792 v -1.76012 h 0.47767 v 1.74195 q 0,0.41277 0.16095,0.62045 0.16096,0.20509 0.48287,0.20509 0.38681,0 0.61007,-0.24663 0.22585,-0.24662 0.22585,-0.67237 v -1.64849 h 0.47768 v 2.90757 h -0.47768 v -0.44652 q -0.17393,0.2648 -0.40498,0.3946 -0.22845,0.12721 -0.53219,0.12721 -0.50104,0 -0.76064,-0.31153 -0.2596,-0.31153 -0.2596,-0.91121 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path8628" />
+ <path
+ d="m 125.6544,149.00923 v 1.54205 h -0.48026 v -4.01348 h 0.48026 v 0.44133 q 0.15057,-0.25961 0.37903,-0.38422 0.23104,-0.1272 0.55036,-0.1272 0.52959,0 0.85929,0.42056 0.33229,0.42055 0.33229,1.10591 0,0.68536 -0.33229,1.10592 -0.3297,0.42056 -0.85929,0.42056 -0.31932,0 -0.55036,-0.12462 -0.22846,-0.1272 -0.37903,-0.38681 z m 1.62513,-1.01505 q 0,-0.527 -0.21807,-0.82554 -0.21547,-0.30114 -0.59449,-0.30114 -0.37903,0 -0.59709,0.30114 -0.21548,0.29854 -0.21548,0.82554 0,0.527 0.21548,0.82814 0.21806,0.29854 0.59709,0.29854 0.37902,0 0.59449,-0.29854 0.21807,-0.30114 0.21807,-0.82814 z"
+ style="fill:#800000;fill-opacity:1;stroke-width:0.398751"
+ id="path8630" />
+ </g>
+ </g>
+</svg>
diff --git a/doc/neps/conf.py b/doc/neps/conf.py
index 6837b12bd..f01ee8a51 100644
--- a/doc/neps/conf.py
+++ b/doc/neps/conf.py
@@ -45,7 +45,7 @@ templates_path = ['../source/_templates/']
source_suffix = '.rst'
# The master toctree document.
-master_doc = 'index'
+master_doc = 'content'
# General information about the project.
project = u'NumPy Enhancement Proposals'
@@ -82,69 +82,21 @@ todo_include_todos = False
## -- Options for HTML output ----------------------------------------------
#
-## The theme to use for HTML and HTML Help pages. See the documentation for
-## a list of builtin themes.
-##
-#html_theme = 'alabaster'
-#
-## Theme options are theme-specific and customize the look and feel of a theme
-## further. For a list of options available for each theme, see the
-## documentation.
-##
-## html_theme_options = {}
-#
-## Add any paths that contain custom static files (such as style sheets) here,
-## relative to this directory. They are copied after the builtin static files,
-## so a file named "default.css" will overwrite the builtin "default.css".
-#html_static_path = ['_static']
-#
-## Custom sidebar templates, must be a dictionary that maps document names
-## to template names.
-##
-## This is required for the alabaster theme
-## refs: https://alabaster.readthedocs.io/en/latest/installation.html#sidebars
-#html_sidebars = {
-# '**': [
-# 'relations.html', # needs 'show_related': True theme option to display
-# 'searchbox.html',
-# ]
-#}
-
-## -----------------------------------------------------------------------------
-# HTML output
-# -----------------------------------------------------------------------------
-themedir = os.path.join(os.pardir, 'scipy-sphinx-theme', '_theme')
-if not os.path.isdir(themedir):
- raise RuntimeError("Get the scipy-sphinx-theme first, "
- "via git submodule init && git submodule update")
-
-html_theme = 'scipy'
-html_theme_path = [themedir]
-
-#if 'scipyorg' in tags:
-if True:
- # Build for the scipy.org website
- html_theme_options = {
- "edit_link": True,
- "sidebar": "right",
- "scipy_org_logo": True,
- "rootlinks": [("https://scipy.org/", "Scipy.org"),
- ("https://docs.scipy.org/", "Docs")]
- }
-else:
- # Default build
- html_theme_options = {
- "edit_link": False,
- "sidebar": "left",
- "scipy_org_logo": False,
- "rootlinks": []
- }
- html_sidebars = {'index': 'indexsidebar.html'}
-
-#html_additional_pages = {
-# 'index': 'indexcontent.html',
-#}
+html_theme = 'pydata_sphinx_theme'
+
+html_logo = '../source/_static/numpylogo.svg'
+
+html_theme_options = {
+ "github_url": "https://github.com/numpy/numpy",
+ "twitter_url": "https://twitter.com/numpy_team",
+ "external_links": [
+ {"name": "Wishlist",
+ "url": "https://github.com/numpy/numpy/issues?q=is%3Aopen+is%3Aissue+label%3A%2223+-+Wish+List%22",
+ },
+ ],
+ "show_prev_next": False,
+}
html_title = "%s" % (project)
html_static_path = ['../source/_static']
diff --git a/doc/neps/content.rst b/doc/neps/content.rst
new file mode 100644
index 000000000..f5d8347c4
--- /dev/null
+++ b/doc/neps/content.rst
@@ -0,0 +1,25 @@
+=====================================
+Roadmap & NumPy Enhancement Proposals
+=====================================
+
+This page provides an overview of development priorities for NumPy.
+Specifically, it contains a roadmap with a higher-level overview, as
+well as NumPy Enhancement Proposals (NEPs)—suggested changes
+to the library—in various stages of discussion or completion (see `NEP
+0 <nep-0000>`__).
+
+Roadmap
+-------
+.. toctree::
+ :maxdepth: 1
+
+ Index <index>
+ The Scope of NumPy <scope>
+ Current roadmap <roadmap>
+ Wishlist (opens new window) |wishlist_link|
+
+.. |wishlist_link| raw:: html
+
+ <a href="https://github.com/numpy/numpy/issues?q=is%3Aopen+is%3Aissue+label%3A%2223+-+Wish+List%22" target=" blank">WishList</a>
+
+
diff --git a/doc/neps/nep-0000.rst b/doc/neps/nep-0000.rst
index dcc7f4cf8..590976081 100644
--- a/doc/neps/nep-0000.rst
+++ b/doc/neps/nep-0000.rst
@@ -234,7 +234,9 @@ Header Preamble
Each NEP must begin with a header preamble. The headers
must appear in the following order. Headers marked with ``*`` are
-optional. All other headers are required. ::
+optional. All other headers are required.
+
+.. code-block:: rst
:Author: <list of authors' real names and optionally, email addresses>
:Status: <Draft | Active | Accepted | Deferred | Rejected |
@@ -251,10 +253,14 @@ The Author header lists the names, and optionally the email addresses
of all the authors of the NEP. The format of the Author header
value must be
+.. code-block:: rst
+
Random J. User <address@dom.ain>
if the email address is included, and just
+.. code-block:: rst
+
Random J. User
if the address is not given. If there are multiple authors, each should be on
diff --git a/doc/neps/nep-0002-warnfix.rst b/doc/neps/nep-0002-warnfix.rst
index dfccd5ab8..a1138b2f1 100644
--- a/doc/neps/nep-0002-warnfix.rst
+++ b/doc/neps/nep-0002-warnfix.rst
@@ -9,6 +9,8 @@ NEP 2 — A proposal to build numpy without warning with a big set of warning fl
:Date: 2008-09-04
:Status: Deferred
+.. highlight:: c
+
Executive summary
=================
@@ -23,7 +25,9 @@ Warning flags
=============
Each compiler detects a different set of potential errors. The baseline will
-be gcc -Wall -W -Wextra. Ideally, a complete set would be nice::
+be gcc -Wall -W -Wextra. Ideally, a complete set would be nice:
+
+.. code-block:: bash
-W -Wall -Wextra -Wstrict-prototypes -Wmissing-prototypes -Waggregate-return
-Wcast-align -Wcast-qual -Wnested-externs -Wshadow -Wbad-function-cast
@@ -67,9 +71,7 @@ When applied to a variable, one would get::
int foo(int * NPY_UNUSED(dummy))
-expanded to
-
-::
+expanded to::
int foo(int * __NPY_UNUSED_TAGGEDdummy __COMP_NPY_UNUSED)
diff --git a/doc/neps/nep-0010-new-iterator-ufunc.rst b/doc/neps/nep-0010-new-iterator-ufunc.rst
index 87617f414..358018c46 100644
--- a/doc/neps/nep-0010-new-iterator-ufunc.rst
+++ b/doc/neps/nep-0010-new-iterator-ufunc.rst
@@ -393,7 +393,9 @@ The proposed ‘order=’ flags become as follows:
‘K’ a layout equivalent to ‘C’ followed by some permutation of the axes, as close to the layout of the input(s) as possible (“Keep Layout”)
=== =====================================================================================
-Or as an enum::
+Or as an enum:
+
+.. code-block:: c
/* For specifying array memory layout or iteration order */
typedef enum {
@@ -416,7 +418,9 @@ parameter to control the layout of their output(s).
The iterator can do automatic casting, and I have created a sequence
of progressively more permissive casting rules. Perhaps for 2.0, NumPy
-could adopt this enum as its preferred way of dealing with casting.::
+could adopt this enum as its preferred way of dealing with casting.
+
+.. code-block:: c
/* For specifying allowed casting in operations which support it */
typedef enum {
@@ -496,7 +500,9 @@ Proposed Iterator Memory Layout
The following struct describes the iterator memory. All items
are packed together, which means that different values of the flags,
-ndim, and niter will produce slightly different layouts. ::
+ndim, and niter will produce slightly different layouts.
+
+.. code-block:: c
struct {
/* Flags indicate what optimizations have been applied, and
@@ -710,13 +716,17 @@ Construction and Destruction
Returns NULL if there is an error, otherwise returns the allocated
iterator.
- To make an iterator similar to the old iterator, this should work.::
+ To make an iterator similar to the old iterator, this should work.
+
+ .. code-block:: c
iter = NpyIter_New(op, NPY_ITER_READWRITE,
NPY_CORDER, NPY_NO_CASTING, NULL, 0, NULL);
If you want to edit an array with aligned ``double`` code,
- but the order doesn't matter, you would use this.::
+ but the order doesn't matter, you would use this.
+
+ .. code-block:: c
dtype = PyArray_DescrFromType(NPY_DOUBLE);
iter = NpyIter_New(op, NPY_ITER_READWRITE |
@@ -764,7 +774,9 @@ Construction and Destruction
In ``op_axes[j][i]`` is stored either a valid axis of ``op[j]``, or
-1 which means ``newaxis``. Within each ``op_axes[j]`` array, axes
may not be repeated. The following example is how normal broadcasting
- applies to a 3-D array, a 2-D array, a 1-D array and a scalar.::
+ applies to a 3-D array, a 2-D array, a 1-D array and a scalar.
+
+ .. code-block:: c
npy_intp oa_ndim = 3; /* # iteration axes */
npy_intp op0_axes[] = {0, 1, 2}; /* 3-D operand */
@@ -1139,7 +1151,9 @@ Construction and Destruction
If you want to reset both the ``iterindex`` range and the base
pointers at the same time, you can do the following to avoid
extra buffer copying (be sure to add the return code error checks
- when you copy this code).::
+ when you copy this code).
+
+ .. code-block:: c
/* Set to a trivial empty range */
NpyIter_ResetToIterIndexRange(iter, 0, 0);
@@ -1190,7 +1204,9 @@ Construction and Destruction
is used as the source for ``baseptrs``, it will point into a small buffer
instead of the array and the inner iteration will be invalid.
- The pattern for using nested iterators is as follows.::
+ The pattern for using nested iterators is as follows:
+
+ .. code-block:: c
NpyIter *iter1, *iter1;
NpyIter_IterNext_Fn iternext1, iternext2;
@@ -1412,7 +1428,9 @@ Functions For Iteration
non-NULL, the function may be safely called without holding
the Python GIL.
- The typical looping construct is as follows.::
+ The typical looping construct is as follows:
+
+ .. code-block:: c
NpyIter_IterNext_Fn iternext = NpyIter_GetIterNext(iter, NULL);
char **dataptr = NpyIter_GetDataPtrArray(iter);
@@ -1422,7 +1440,9 @@ Functions For Iteration
} while(iternext(iter));
When ``NPY_ITER_NO_INNER_ITERATION`` is specified, the typical
- inner loop construct is as follows.::
+ inner loop construct is as follows:
+
+ .. code-block:: c
NpyIter_IterNext_Fn iternext = NpyIter_GetIterNext(iter, NULL);
char **dataptr = NpyIter_GetDataPtrArray(iter);
@@ -1451,7 +1471,9 @@ Functions For Iteration
to become zero when ``iternext()`` returns false, enabling the
following loop construct. Note that if you use this construct,
you should not pass ``NPY_ITER_GROWINNER`` as a flag, because it
- will cause larger sizes under some circumstances.::
+ will cause larger sizes under some circumstances:
+
+ .. code-block:: c
/* The constructor should have buffersize passed as this value */
#define FIXED_BUFFER_SIZE 1024
@@ -1571,7 +1593,9 @@ result.
If the input is a reference type, this function will fail.
To fix this, the code must be changed to specially handle writeable
-references, and add ``NPY_ITER_WRITEABLE_REFERENCES`` to the flags.::
+references, and add ``NPY_ITER_WRITEABLE_REFERENCES`` to the flags:
+
+.. code-block:: c
/* NOTE: This code has not been compiled/tested */
PyObject *CopyArray(PyObject *arr, NPY_ORDER order)
diff --git a/doc/neps/nep-0011-deferred-ufunc-evaluation.rst b/doc/neps/nep-0011-deferred-ufunc-evaluation.rst
index c40ca56d7..866a774d1 100644
--- a/doc/neps/nep-0011-deferred-ufunc-evaluation.rst
+++ b/doc/neps/nep-0011-deferred-ufunc-evaluation.rst
@@ -41,11 +41,15 @@ For an idea of how to get this kind of behavior in NumPy without
changing the Python code, consider the C++ technique of
expression templates. These can be used to quite arbitrarily
rearrange expressions using
-vectors or other data structures, example,::
+vectors or other data structures, example:
+
+.. code-block:: cpp
A = B + C + D;
-can be transformed into something equivalent to::
+can be transformed into something equivalent to:
+
+.. code-block:: cpp
for(i = 0; i < A.size; ++i) {
A[i] = B[i] + C[i] + D[i];
diff --git a/doc/neps/nep-0012-missing-data.rst b/doc/neps/nep-0012-missing-data.rst
index 0adcea69a..f47feadbd 100644
--- a/doc/neps/nep-0012-missing-data.rst
+++ b/doc/neps/nep-0012-missing-data.rst
@@ -957,6 +957,8 @@ so the later code will raise exceptions as desired.
C Implementation Details
************************
+.. highlight:: c
+
The first version to implement is the array masks, because it is
the more general approach. The mask itself is an array, but since
it is intended to never be directly accessible from Python, it won't
@@ -1159,32 +1161,32 @@ Acknowledgments
In addition to feedback from Travis Oliphant and others at Enthought,
this NEP has been revised based on a great deal of feedback from
the NumPy-Discussion mailing list. The people participating in
-the discussion are::
-
- Nathaniel Smith
- Robert Kern
- Charles Harris
- Gael Varoquaux
- Eric Firing
- Keith Goodman
- Pierre GM
- Christopher Barker
- Josef Perktold
- Ben Root
- Laurent Gautier
- Neal Becker
- Bruce Southey
- Matthew Brett
- Wes McKinney
- Lluís
- Olivier Delalleau
- Alan G Isaac
- E. Antero Tammi
- Jason Grout
- Dag Sverre Seljebotn
- Joe Harrington
- Gary Strangman
- Chris Jordan-Squire
- Peter
+the discussion are:
+
+- Nathaniel Smith
+- Robert Kern
+- Charles Harris
+- Gael Varoquaux
+- Eric Firing
+- Keith Goodman
+- Pierre GM
+- Christopher Barker
+- Josef Perktold
+- Ben Root
+- Laurent Gautier
+- Neal Becker
+- Bruce Southey
+- Matthew Brett
+- Wes McKinney
+- Lluís
+- Olivier Delalleau
+- Alan G Isaac
+- E. Antero Tammi
+- Jason Grout
+- Dag Sverre Seljebotn
+- Joe Harrington
+- Gary Strangman
+- Chris Jordan-Squire
+- Peter
I apologize if I missed anyone.
diff --git a/doc/neps/nep-0013-ufunc-overrides.rst b/doc/neps/nep-0013-ufunc-overrides.rst
index 5c28e9446..698e45738 100644
--- a/doc/neps/nep-0013-ufunc-overrides.rst
+++ b/doc/neps/nep-0013-ufunc-overrides.rst
@@ -102,7 +102,7 @@ Take this example of ufuncs interoperability with sparse matrices.::
[ 4, 1, 4]], dtype=int64)
In [5]: np.multiply(a, bsp) # Returns NotImplemented to user, bad!
- Out[5]: NotImplemted
+ Out[5]: NotImplemented
Returning :obj:`NotImplemented` to user should not happen. Moreover::
diff --git a/doc/neps/nep-0016-benchmark.py b/doc/neps/nep-0016-benchmark.py
index af6059114..ec8e44726 100644
--- a/doc/neps/nep-0016-benchmark.py
+++ b/doc/neps/nep-0016-benchmark.py
@@ -1,5 +1,3 @@
-.. _NEP16:
-
import perf
import abc
import numpy as np
diff --git a/doc/neps/nep-0025-missing-data-3.rst b/doc/neps/nep-0025-missing-data-3.rst
index 19be3cf1e..ffe208c98 100644
--- a/doc/neps/nep-0025-missing-data-3.rst
+++ b/doc/neps/nep-0025-missing-data-3.rst
@@ -132,6 +132,8 @@ Some example use cases:
dtype C-level API extensions
============================
+.. highlight:: c
+
The `PyArray_Descr`_ struct gains the following new fields::
void * NA_value;
@@ -357,6 +359,8 @@ so convenient as that for NaN values now, but then, NaN values don't have their
own global singleton.) So for now we stick to scalar indexing just returning
``np.NA``, but this can be revisited if anyone objects.
+.. highlight:: python
+
Python API for generic NA support
=================================
diff --git a/doc/neps/nep-0029-deprecation_policy.rst b/doc/neps/nep-0029-deprecation_policy.rst
index 9b6022a81..957674ee6 100644
--- a/doc/neps/nep-0029-deprecation_policy.rst
+++ b/doc/neps/nep-0029-deprecation_policy.rst
@@ -1,4 +1,4 @@
-.. _NEP0029:
+.. _NEP29:
==================================================================================
NEP 29 — Recommend Python and Numpy version support as a community policy standard
@@ -77,7 +77,7 @@ release in November 2020 should support Python 3.7 and newer.
The current Python release cadence is 18 months so a 42 month window
ensures that there will always be at least two minor versions of Python
in the window. The window is extended 6 months beyond the anticipated two-release
-interval for Python to provides resilience against small fluctuations /
+interval for Python to provide resilience against small fluctuations /
delays in its release schedule.
Because Python minor version support is based only on historical
@@ -111,8 +111,10 @@ Jun 23, 2020 3.7+ 1.15+
Jul 23, 2020 3.7+ 1.16+
Jan 13, 2021 3.7+ 1.17+
Jul 26, 2021 3.7+ 1.18+
-Dec 26, 2021 3.8+ 1.18+
-Apr 14, 2023 3.9+ 1.18+
+Dec 22, 2021 3.7+ 1.19+
+Dec 26, 2021 3.8+ 1.19+
+Jun 21, 2022 3.8+ 1.20+
+Apr 14, 2023 3.9+ 1.20+
============ ====== =====
@@ -127,7 +129,9 @@ Drop Schedule
On Jul 23, 2020 drop support for Numpy 1.15 (initially released on Jul 23, 2018)
On Jan 13, 2021 drop support for Numpy 1.16 (initially released on Jan 13, 2019)
On Jul 26, 2021 drop support for Numpy 1.17 (initially released on Jul 26, 2019)
+ On Dec 22, 2021 drop support for Numpy 1.18 (initially released on Dec 22, 2019)
On Dec 26, 2021 drop support for Python 3.7 (initially released on Jun 27, 2018)
+ On Jun 21, 2022 drop support for Numpy 1.19 (initially released on Jun 20, 2020)
On Apr 14, 2023 drop support for Python 3.8 (initially released on Oct 14, 2019)
@@ -255,6 +259,8 @@ Code to generate support and drop schedule tables ::
Jan 13, 2019: Numpy 1.16
Jul 26, 2019: Numpy 1.17
Oct 14, 2019: Python 3.8
+ Dec 22, 2019: Numpy 1.18
+ Jun 20, 2020: Numpy 1.19
"""
releases = []
@@ -274,8 +280,12 @@ Code to generate support and drop schedule tables ::
releases = sorted(releases, key=lambda x: x[0])
- minpy = '3.9+'
- minnum = '1.18+'
+
+ py_major,py_minor = sorted([int(x) for x in r[2].split('.')] for r in releases if r[1] == 'Python')[-1]
+ minpy = f"{py_major}.{py_minor+1}+"
+
+ num_major,num_minor = sorted([int(x) for x in r[2].split('.')] for r in releases if r[1] == 'Numpy')[-1]
+ minnum = f"{num_major}.{num_minor+1}+"
toprint_drop_dates = ['']
toprint_support_table = []
@@ -289,14 +299,14 @@ Code to generate support and drop schedule tables ::
minnum = v+'+'
else:
minpy = v+'+'
-
- for e in toprint_drop_dates[::-1]:
+ print("On next release, drop support for Python 3.5 (initially released on Sep 13, 2015)")
+ for e in toprint_drop_dates[-4::-1]:
print(e)
print('============ ====== =====')
print('Date Python NumPy')
print('------------ ------ -----')
- for e in toprint_support_table[::-1]:
+ for e in toprint_support_table[-4::-1]:
print(e)
print('============ ====== =====')
diff --git a/doc/neps/nep-0035-array-creation-dispatch-with-array-function.rst b/doc/neps/nep-0035-array-creation-dispatch-with-array-function.rst
index 2d7539952..5ec01081a 100644
--- a/doc/neps/nep-0035-array-creation-dispatch-with-array-function.rst
+++ b/doc/neps/nep-0035-array-creation-dispatch-with-array-function.rst
@@ -8,16 +8,196 @@ NEP 35 — Array Creation Dispatching With __array_function__
:Status: Draft
:Type: Standards Track
:Created: 2019-10-15
-:Updated: 2019-10-15
+:Updated: 2020-11-06
:Resolution:
Abstract
--------
We propose the introduction of a new keyword argument ``like=`` to all array
-creation functions to permit dispatching of such functions by the
-``__array_function__`` protocol, addressing one of the protocol shortcomings,
-as described by NEP-18 [1]_.
+creation functions to address one of the shortcomings of ``__array_function__``,
+as described by NEP 18 [1]_. The ``like=`` keyword argument will create an
+instance of the argument's type, enabling direct creation of non-NumPy arrays.
+The target array type must implement the ``__array_function__`` protocol.
+
+Motivation and Scope
+--------------------
+
+Many libraries implement the NumPy API, such as Dask for graph
+computing, CuPy for GPGPU computing, xarray for N-D labeled arrays, etc. Underneath,
+they have adopted the ``__array_function__`` protocol which allows NumPy to understand
+and treat downstream objects as if they are the native ``numpy.ndarray`` object.
+Hence the community while using various libraries still benefits from a unified
+NumPy API. This not only brings great convenience for standardization but also
+removes the burden of learning a new API and rewriting code for every new
+object. In more technical terms, this mechanism of the protocol is called a
+"dispatcher", which is the terminology we use from here onwards when referring
+to that.
+
+
+.. code:: python
+
+ x = dask.array.arange(5) # Creates dask.array
+ np.diff(x) # Returns dask.array
+
+Note above how we called Dask's implementation of ``diff`` via the NumPy
+namespace by calling ``np.diff``, and the same would apply if we had a CuPy
+array or any other array from a library that adopts ``__array_function__``.
+This allows writing code that is agnostic to the implementation library, thus
+users can write their code once and still be able to use different array
+implementations according to their needs.
+
+Obviously, having a protocol in-place is useful if the arrays are created
+elsewhere and let NumPy handle them. But still these arrays have to be started
+in their native library and brought back. Instead if it was possible to create
+these objects through NumPy API then there would be an almost complete
+experience, all using NumPy syntax. For example, say we have some CuPy array
+``cp_arr``, and want a similar CuPy array with identity matrix. We could still
+write the following:
+
+.. code:: python
+
+ x = cupy.identity(3)
+
+Instead, the better way would be using to only use the NumPy API, this could now
+be achieved with:
+
+.. code:: python
+
+ x = np.identity(3, like=cp_arr)
+
+As if by magic, ``x`` will also be a CuPy array, as NumPy was capable to infer
+that from the type of ``cp_arr``. Note that this last step would not be possible
+without ``like=``, as it would be impossible for the NumPy to know the user
+expects a CuPy array based only on the integer input.
+
+The new ``like=`` keyword proposed is solely intended to identify the downstream
+library where to dispatch and the object is used only as reference, meaning that
+no modifications, copies or processing will be performed on that object.
+
+We expect that this functionality will be mostly useful to library developers,
+allowing them to create new arrays for internal usage based on arrays passed
+by the user, preventing unnecessary creation of NumPy arrays that will
+ultimately lead to an additional conversion into a downstream array type.
+
+Support for Python 2.7 has been dropped since NumPy 1.17, therefore we make use
+of the keyword-only argument standard described in PEP-3102 [2]_ to implement
+``like=``, thus preventing it from being passed by position.
+
+.. _neps.like-kwarg.usage-and-impact:
+
+Usage and Impact
+----------------
+
+NumPy users who don't use other arrays from downstream libraries can continue
+to use array creation routines without a ``like=`` argument. Using
+``like=np.ndarray`` will work as if no array was passed via that argument.
+However, this will incur additional checks that will negatively impact
+performance.
+
+To understand the intended use for ``like=``, and before we move to more complex
+cases, consider the following illustrative example consisting only of NumPy and
+CuPy arrays:
+
+.. code:: python
+
+ import numpy as np
+ import cupy
+
+ def my_pad(arr, padding):
+ padding = np.array(padding, like=arr)
+ return np.concatenate((padding, arr, padding))
+
+ my_pad(np.arange(5), [-1, -1]) # Returns np.ndarray
+ my_pad(cupy.arange(5), [-1, -1]) # Returns cupy.core.core.ndarray
+
+Note in the ``my_pad`` function above how ``arr`` is used as a reference to
+dictate what array type padding should have, before concatenating the arrays to
+produce the result. On the other hand, if ``like=`` wasn't used, the NumPy case
+would still work, but CuPy wouldn't allow this kind of automatic
+conversion, ultimately raising a
+``TypeError: Only cupy arrays can be concatenated`` exception.
+
+Now we should look at how a library like Dask could benefit from ``like=``.
+Before we understand that, it's important to understand a bit about Dask basics
+and how it ensures correctness with ``__array_function__``. Note that Dask can
+perform computations on different sorts of objects, like dataframes, bags and
+arrays, here we will focus strictly on arrays, which are the objects we can use
+``__array_function__`` with.
+
+Dask uses a graph computing model, meaning it breaks down a large problem in
+many smaller problems and merges their results to reach the final result. To
+break the problem down into smaller ones, Dask also breaks arrays into smaller
+arrays that it calls "chunks". A Dask array can thus consist of one or more
+chunks and they may be of different types. However, in the context of
+``__array_function__``, Dask only allows chunks of the same type; for example,
+a Dask array can be formed of several NumPy arrays or several CuPy arrays, but
+not a mix of both.
+
+To avoid mismatched types during computation, Dask keeps an attribute ``_meta`` as
+part of its array throughout computation: this attribute is used to both predict
+the output type at graph creation time, and to create any intermediary arrays
+that are necessary within some function's computation. Going back to our
+previous example, we can use ``_meta`` information to identify what kind of
+array we would use for padding, as seen below:
+
+.. code:: python
+
+ import numpy as np
+ import cupy
+ import dask.array as da
+ from dask.array.utils import meta_from_array
+
+ def my_dask_pad(arr, padding):
+ padding = np.array(padding, like=meta_from_array(arr))
+ return np.concatenate((padding, arr, padding))
+
+ # Returns dask.array<concatenate, shape=(9,), dtype=int64, chunksize=(5,), chunktype=numpy.ndarray>
+ my_dask_pad(da.arange(5), [-1, -1])
+
+ # Returns dask.array<concatenate, shape=(9,), dtype=int64, chunksize=(5,), chunktype=cupy.ndarray>
+ my_dask_pad(da.from_array(cupy.arange(5)), [-1, -1])
+
+Note how ``chunktype`` in the return value above changes from
+``numpy.ndarray`` in the first ``my_dask_pad`` call to ``cupy.ndarray`` in the
+second. We have also renamed the function to ``my_dask_pad`` in this example
+with the intent to make it clear that this is how Dask would implement such
+functionality, should it need to do so, as it requires Dask's internal tools
+that are not of much use elsewhere.
+
+To enable proper identification of the array type we use Dask's utility function
+``meta_from_array``, which was introduced as part of the work to support
+``__array_function__``, allowing Dask to handle ``_meta`` appropriately. Readers
+can think of ``meta_from_array`` as a special function that just returns the
+type of the underlying Dask array, for example:
+
+.. code:: python
+
+ np_arr = da.arange(5)
+ cp_arr = da.from_array(cupy.arange(5))
+
+ meta_from_array(np_arr) # Returns a numpy.ndarray
+ meta_from_array(cp_arr) # Returns a cupy.ndarray
+
+Since the value returned by ``meta_from_array`` is a NumPy-like array, we can
+just pass that directly into the ``like=`` argument.
+
+The ``meta_from_array`` function is primarily targeted at the library's internal
+usage to ensure chunks are created with correct types. Without the ``like=``
+argument, it would be impossible to ensure ``my_pad`` creates a padding array
+with a type matching that of the input array, which would cause a ``TypeError``
+exception to be raised by CuPy, as discussed above would happen to the CuPy case
+alone. Combining Dask's internal handling of meta arrays and the proposed
+``like=`` argument, it now becomes possible to handle cases involving creation
+of non-NumPy arrays, which is likely the heaviest limitation Dask currently
+faces from the ``__array_function__`` protocol.
+
+Backward Compatibility
+----------------------
+
+This proposal does not raise any backward compatibility issues within NumPy,
+given that it only introduces a new keyword argument to existing array creation
+functions with a default ``None`` value, thus not changing current behavior.
Detailed description
--------------------
@@ -28,10 +208,6 @@ did not -- and did not intend to -- address the creation of arrays by downstream
libraries, preventing those libraries from using such important functionality in
that context.
-Other NEPs have been written to address parts of that limitation, such as the
-introduction of the ``__duckarray__`` protocol in NEP-30 [2]_, and the
-introduction of an overriding mechanism called ``uarray`` by NEP-31 [3]_.
-
The purpose of this NEP is to address that shortcoming in a simple and
straighforward way: introduce a new ``like=`` keyword argument, similar to how
the ``empty_like`` family of functions work. When array creation functions
@@ -39,21 +215,30 @@ receive such an argument, they will trigger the ``__array_function__`` protocol,
and call the downstream library's own array creation function implementation.
The ``like=`` argument, as its own name suggests, shall be used solely for the
purpose of identifying where to dispatch. In contrast to the way
-``__array_function__`` has been used so far (the first argument identifies where
-to dispatch), and to avoid breaking NumPy's API with regards to array creation,
-the new ``like=`` keyword shall be used for the purpose of dispatching.
-
-Usage Guidance
-~~~~~~~~~~~~~~
-
-The new ``like=`` keyword is solely intended to identify the downstream library
-where to dispatch and the object is used only as reference, meaning that no
-modifications, copies or processing will be performed on that object.
-
-We expect that this functionality will be mostly useful to library developers,
-allowing them to create new arrays for internal usage based on arrays passed
-by the user, preventing unnecessary creation of NumPy arrays that will
-ultimately lead to an additional conversion into a downstream array type.
+``__array_function__`` has been used so far (the first argument identifies the
+target downstream library), and to avoid breaking NumPy's API with regards to
+array creation, the new ``like=`` keyword shall be used for the purpose of
+dispatching.
+
+Downstream libraries will benefit from the ``like=`` argument without any
+changes to their API, given the argument only needs to be implemented by NumPy.
+It's still allowed that downstream libraries include the ``like=`` argument,
+as it can be useful in some cases, please refer to
+:ref:`neps.like-kwarg.implementation` for details on those cases. It will still
+be required that downstream libraries implement the ``__array_function__``
+protocol, as described by NEP 18 [1]_, and appropriately introduce the argument
+to their calls to NumPy array creation functions, as exemplified in
+:ref:`neps.like-kwarg.usage-and-impact`.
+
+Related work
+------------
+
+Other NEPs have been written to address parts of ``__array_function__``
+protocol's limitation, such as the introduction of the ``__duckarray__``
+protocol in NEP 30 [3]_, and the introduction of an overriding mechanism called
+``uarray`` by NEP 31 [4]_.
+
+.. _neps.like-kwarg.implementation:
Implementation
--------------
@@ -62,23 +247,30 @@ The implementation requires introducing a new ``like=`` keyword to all existing
array creation functions of NumPy. As examples of functions that would add this
new argument (but not limited to) we can cite those taking array-like objects
such as ``array`` and ``asarray``, functions that create arrays based on
-numerical ranges such as ``range`` and ``linspace``, as well as the ``empty``
-family of functions, even though that may be redundant, since there exists
-already specializations for those with the naming format ``empty_like``. As of
-the writing of this NEP, a complete list of array creation functions can be
-found in [4]_.
+numerical inputs such as ``range`` and ``identity``, as well as the ``empty``
+family of functions, even though that may be redundant, since specializations
+for those already exist with the naming format ``empty_like``. As of the
+writing of this NEP, a complete list of array creation functions can be
+found in [5]_.
This newly proposed keyword shall be removed by the ``__array_function__``
mechanism from the keyword dictionary before dispatching. The purpose for this
is twofold:
-1. The object will have no use in the downstream library's implementation; and
-2. Simplifies adoption of array creation by those libraries already opting-in
+1. Simplifies adoption of array creation by those libraries already opting-in
to implement the ``__array_function__`` protocol, thus removing the
- requirement to explicitly opt-in for all array creation functions.
-
-Downstream libraries thus shall _NOT_ include the ``like=`` keyword to their
-array creation APIs, which is a NumPy-exclusive keyword.
+ requirement to explicitly opt-in for all array creation functions; and
+2. Most downstream libraries will have no use for the keyword argument, and
+ those that do may accomplish so by capturing ``self`` from
+ ``__array_function__``.
+
+Downstream libraries thus do not require to include the ``like=`` keyword to
+their array creation APIs. In some cases (e.g., Dask), having the ``like=``
+keyword can be useful, as it would allow the implementation to identify
+array internals. As an example, Dask could benefit from the reference array
+to identify its chunk type (e.g., NumPy, CuPy, Sparse), and thus create a new
+Dask array backed by the same chunk type, something that's not possible unless
+Dask can read the reference array's attributes.
Function Dispatching
~~~~~~~~~~~~~~~~~~~~
@@ -93,12 +285,12 @@ with ``overrides.array_function_dispatch``:
.. code:: python
- def _asarray_decorator(a, dtype=None, order=None, like=None):
+ def _asarray_decorator(a, dtype=None, order=None, *, like=None):
return (like,)
@set_module('numpy')
@array_function_dispatch(_asarray_decorator)
- def asarray(a, dtype=None, order=None, like=None):
+ def asarray(a, dtype=None, order=None, *, like=None):
return array(a, dtype, copy=False, order=order)
Note in the example above that the implementation remains unchanged, the only
@@ -121,7 +313,8 @@ the module too.
module='numpy', docs_from_dispatcher=False, verify=False)
@array_function_nodocs_from_c_func_and_dispatcher(_multiarray_umath.array)
- def array(a, dtype=None, copy=True, order='K', subok=False, ndmin=0, like=None):
+ def array(a, dtype=None, *, copy=True, order='K', subok=False, ndmin=0,
+ like=None):
return (like,)
There are two downsides to the implementation above for C functions:
@@ -130,57 +323,119 @@ There are two downsides to the implementation above for C functions:
2. To follow current implementation standards, documentation should be attached
directly to the Python source code.
-Alternatively for C functions, the implementation of ``like=`` could be moved
-into the C implementation itself. This is not the primary suggestion here due
-to its inherent complexity which would be difficult too long to describe in its
-entirety here, and too tedious for the reader. However, we leave that as an
-option open for discussion.
+The first version of this proposal suggested the implementation above as one
+viable solution for NumPy functions implemented in C. However, due to the
+downsides pointed out above we have decided to discard any changes on the Python
+side and resolve those issues with a pure-C implementation. Please refer to
+[implementation]_ for details.
+
+Reading the Reference Array Downstream
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-Usage
------
+As stated in the beginning of :ref:`neps.like-kwarg.implementation` section,
+``like=`` is not propagated to the downstream library, nevertheless, it's still
+possible to access it. This requires some changes in the downstream library's
+``__array_function__`` definition, where the ``self`` attribute is in practice
+that passed via ``like=``. This is the case because we use ``like=`` as the
+dispatching array, unlike other compute functions covered by NEP-18 that usually
+dispatch on the first positional argument.
-The purpose of this NEP is to keep things simple. Similarly, we can exemplify
-the usage of ``like=`` in a simple way. Imagine you have an array of ones
-created by a downstream library, such as CuPy. What you need now is a new array
-that can be created using the NumPy API, but that will in fact be created by
-the downstream library, a simple way to achieve that is shown below.
+An example of such use is to create a new Dask array while preserving its
+backend type:
.. code:: python
+ # Returns dask.array<array, shape=(3,), dtype=int64, chunksize=(3,), chunktype=cupy.ndarray>
+ np.asarray([1, 2, 3], like=da.array(cp.array(())))
- x = cupy.ones(2)
- np.array([1, 3, 5], like=x) # Returns cupy.ndarray
+ # Returns a cupy.ndarray
+ type(np.asarray([1, 2, 3], like=da.array(cp.array(()))).compute())
-As a second example, we could also create an array of evenly spaced numbers
-using a Dask identity matrix as reference:
+Note how above the array is backed by ``chunktype=cupy.ndarray``, and the
+resulting array after computing it is also a ``cupy.ndarray``. If Dask did
+not use the ``like=`` argument via the ``self`` attribute from
+``__array_function__``, the example above would be backed by ``numpy.ndarray``
+instead:
.. code:: python
+ # Returns dask.array<array, shape=(3,), dtype=int64, chunksize=(3,), chunktype=numpy.ndarray>
+ np.asarray([1, 2, 3], like=da.array(cp.array(())))
- x = dask.array.eye(3)
- np.linspace(0, 2, like=x) # Returns dask.array
+ # Returns a numpy.ndarray
+ type(np.asarray([1, 2, 3], like=da.array(cp.array(()))).compute())
+Given the library would need to rely on ``self`` attribute from
+``__array_function__`` to dispatch the function with the correct reference
+array, we suggest one of two alternatives:
-Compatibility
--------------
+1. Introduce a list of functions in the downstream library that do support the
+ ``like=`` argument and pass ``like=self`` when calling the function; or
+2. Inspect whether the function's signature and verify whether it includes the
+ ``like=`` argument. Note that this may incur in a higher performance penalty
+ and assumes introspection is possible, which may not be if the function is
+ a C function.
-This proposal does not raise any backward compatibility issues within NumPy,
-given that it only introduces a new keyword argument to existing array creation
-functions.
+To make things clearer, let's take a look at how suggestion 2 could be
+implemented in Dask. The current relevant part of ``__array_function__``
+definition in Dask is seen below:
+
+.. code:: python
+ def __array_function__(self, func, types, args, kwargs):
+ # Code not relevant for this example here
+
+ # Dispatch ``da_func`` (da.asarray, for example) with *args and **kwargs
+ da_func(*args, **kwargs)
+
+And this is how the updated code would look like:
+
+.. code:: python
+ def __array_function__(self, func, types, args, kwargs):
+ # Code not relevant for this example here
+
+ # Inspect ``da_func``'s signature and store keyword-only arguments
+ import inspect
+ kwonlyargs = inspect.getfullargspec(da_func).kwonlyargs
+
+ # If ``like`` is contained in ``da_func``'s signature, add ``like=self``
+ # to the kwargs dictionary.
+ if 'like' in kwonlyargs:
+ kwargs['like'] = self
+
+ # Dispatch ``da_func`` (da.asarray, for example) with args and kwargs.
+ # Here, kwargs contain ``like=self`` if the function's signature does too.
+ da_func(*args, **kwargs)
+
+Alternatives
+------------
+
+Recently a new protocol to replace ``__array_function__`` entirely was proposed
+by NEP 37 [6]_, which would require considerable rework by downstream libraries
+that adopt ``__array_function__`` already, because of that we still believe the
+``like=`` argument is beneficial for NumPy and downstream libraries. However,
+that proposal wouldn't necessarily be considered a direct alternative to the
+present NEP, as it would replace NEP 18 entirely, upon which this builds.
+Discussion on details about this new proposal and why that would require rework
+by downstream libraries is beyond the scope of the present proposal.
+
+Discussion
+----------
+
+.. [implementation] `Implementation's pull request on GitHub <https://github.com/numpy/numpy/pull/16935>`_
+.. [discussion] `Further discussion on implementation and the NEP's content <https://mail.python.org/pipermail/numpy-discussion/2020-August/080919.html>`_
+
+References
+----------
-Downstream libraries will benefit from the ``like=`` argument automatically,
-that is, without any explicit changes in their codebase. The only requirement
-is that they already implement the ``__array_function__`` protocol, as
-described by NEP-18 [2]_.
+.. [1] `NEP 18 - A dispatch mechanism for NumPy's high level array functions <https://numpy.org/neps/nep-0018-array-function-protocol.html>`_.
-References and Footnotes
-------------------------
+.. [2] `PEP 3102 — Keyword-Only Arguments <https://www.python.org/dev/peps/pep-3102/>`_.
-.. [1] `NEP-18 - A dispatch mechanism for NumPy's high level array functions <https://numpy.org/neps/nep-0018-array-function-protocol.html>`_.
+.. [3] `NEP 30 — Duck Typing for NumPy Arrays - Implementation <https://numpy.org/neps/nep-0030-duck-array-protocol.html>`_.
-.. [2] `NEP 30 — Duck Typing for NumPy Arrays - Implementation <https://numpy.org/neps/nep-0030-duck-array-protocol.html>`_.
+.. [4] `NEP 31 — Context-local and global overrides of the NumPy API <https://github.com/numpy/numpy/pull/14389>`_.
-.. [3] `NEP 31 — Context-local and global overrides of the NumPy API <https://github.com/numpy/numpy/pull/14389>`_.
+.. [5] `Array creation routines <https://docs.scipy.org/doc/numpy-1.17.0/reference/routines.array-creation.html>`_.
-.. [4] `Array creation routines <https://docs.scipy.org/doc/numpy-1.17.0/reference/routines.array-creation.html>`_.
+.. [6] `NEP 37 — A dispatch protocol for NumPy-like modules <https://numpy.org/neps/nep-0037-array-module.html>`_.
Copyright
---------
diff --git a/doc/neps/nep-0036-fair-play.rst b/doc/neps/nep-0036-fair-play.rst
new file mode 100644
index 000000000..32e5e1e75
--- /dev/null
+++ b/doc/neps/nep-0036-fair-play.rst
@@ -0,0 +1,177 @@
+==================
+NEP 36 — Fair play
+==================
+
+:Author: Stéfan van der Walt <stefanv@berkeley.edu>
+:Status: Draft
+:Type: Informational
+:Created: 2019-10-24
+:Resolution: Draft
+
+
+Abstract
+--------
+
+This document sets out Rules of Play for companies and outside
+developers that engage with the NumPy project. It covers:
+
+- Restrictions on use of the NumPy name
+- How and whether to publish a modified distribution
+- How to make us aware of patched versions
+
+Companies and developers will know after reading this NEP what kinds
+of behavior the community would like to see, and which we consider
+troublesome, bothersome, and unacceptable.
+
+Motivation
+----------
+
+We sometimes learn of NumPy versions modified and circulated by outsiders.
+These patched versions can cause problems for the NumPy community.
+
+- In December 2018, a `bug report
+ <https://github.com/numpy/numpy/issues/12515>`__ was filed against
+ `np.erf` -- a function that didn't exist in the NumPy distribution.
+ It came to light that a company had published a NumPy version with
+ an extended API footprint. After several months of discussion, the
+ company agreed to make its patches public, and we added a label to
+ the NumPy issue tracker to identify issues pertaining to that
+ distribution.
+
+- In another case, after a security issue (CVE-2019-6446) was filed
+ against NumPy, distributions put in their own fixes, most often by
+ changing a default keyword value. As a result the NumPy API was
+ inconsistent across distributions.
+
+When issues arise in cases like these, our developers waste time
+identifying the problematic release, locating alterations,
+and determining an appropriate course of action.
+
+During a community call on `October 16th, 2019
+<https://github.com/numpy/archive/blob/master/status_meetings/status-2019-10-16.md>`__
+the community resolved to draft guidelines on the distribution of
+modified NumPy versions.
+
+Scope
+-----
+
+This document aims to define a minimal set of rules that, when
+followed, will be considered good-faith efforts in line with the
+expectations of the NumPy developers.
+
+Our hope is that developers who feel they need to modify NumPy will
+first consider contributing to the project, or use one of several existing
+mechanisms for extending our APIs and for operating on
+externally defined array objects.
+
+When in doubt, please `talk to us first
+<https://numpy.org/community/>`__. We may suggest an alternative; at
+minimum, we'll be prepared.
+
+Fair play rules
+---------------
+
+1. Do not reuse the NumPy name for projects not developed by the NumPy
+ community.
+
+ At time of writing, there are only a handful of ``numpy``-named
+ packages developed by the community, including ``numpy``,
+ ``numpy-financial``, and ``unumpy``. We ask that external packages not
+ include the phrase ``numpy``, i.e., avoid names such as
+ ``mycompany_numpy``.
+
+ To be clear, this rule only applies to modules (package names); it
+ is perfectly acceptable to have a *submodule* of your own library
+ named ``mylibrary.numpy``.
+
+ NumPy is a trademark owned by NumFOCUS.
+
+2. Do not republish modified versions of NumPy.
+
+ Modified versions of NumPy make it very difficult for the
+ developers to address bug reports, since we typically do not know
+ which parts of NumPy have been modified.
+
+ If you have to break this rule (and we implore you not
+ to!), then make it clear in the ``__version__`` tag that
+ you have modified NumPy, e.g.::
+
+ >>> print(np.__version__)
+ '1.17.2+mycompany.15`
+
+ We understand that minor patches are often required to make a
+ library work under a certain distribution. E.g., Debian may patch
+ NumPy so that it searches for optimized BLAS libraries in the
+ correct locations. But we ask that no substantive changes are
+ made.
+
+3. Do not extend NumPy's API footprint.
+
+ If you absolutely have to break rule two, please do not add
+ additional functions to the namespace. NumPy's API is already
+ quite large, and we are working hard to reduce it where feasible.
+ Having additional functions exposed in distributed versions is
+ confusing for users and developers alike.
+
+4. *DO* use official mechanism to engage with the API.
+
+ Protocols such as `__array_ufunc__
+ <https://numpy.org/neps/nep-0013-ufunc-overrides.html>`__ and
+ `__array_function__
+ <https://numpy.org/neps/nep-0018-array-function-protocol.html>`__
+ were designed to help external packages interact more easily with
+ NumPy. E.g., the latter allows objects from foreign libraries to
+ pass through NumPy unharmed. We actively encourage using any of
+ these "officialy sanctioned" mechanisms for overriding or
+ interacting with NumPy.
+
+ If these mechanisms are deemed insufficient, please start a
+ discussion on the mailing list before monkeypatching NumPy.
+
+Questions and answers
+-------------------
+
+**Q:** We would like to distribute an optimized version of NumPy that
+utilizes special instructions for our company's CPU. You recommend
+against that, so what are we to do?
+
+**A:** Please consider including the patches required in the official
+NumPy repository. Not only do we encourage such contributions, but we
+already have optimized loops for some platforms available.
+
+**Q:** We would like to ship a much faster version of FFT than NumPy
+provides, but NumPy has no mechanism for overriding its FFT routines.
+How do we proceed?
+
+**A:** There are two solutions that we approve of: let the users
+install your optimizations using a piece of code, such as::
+
+ from my_company_accel import patch_numpy_fft
+ patch_numpy_fft()
+
+or have your distribution automatically perform the above, but print a
+message to the terminal clearly stating what is happening::
+
+ We are now patching NumPy for optimal performance under MyComp
+ Special Platform. Please direct all bug reports to
+ https://mycomp.com/numpy-bugs
+
+If you require additional mechanisms for overriding code, please
+discuss this with the development team on the mailing list.
+
+**Q:** We would like to distribute NumPy with faster linear algebra
+routines. Are we allowed to do this?
+
+**A:** Yes, this is explicitly supported by linking to a different
+version of BLAS.
+
+Discussion
+----------
+
+References and footnotes
+------------------------
+
+Copyright
+---------
+
+This document has been placed in the public domain.
diff --git a/doc/neps/nep-0040-legacy-datatype-impl.rst b/doc/neps/nep-0040-legacy-datatype-impl.rst
index c247e3d62..39889109d 100644
--- a/doc/neps/nep-0040-legacy-datatype-impl.rst
+++ b/doc/neps/nep-0040-legacy-datatype-impl.rst
@@ -13,15 +13,15 @@ NEP 40 — Legacy Datatype Implementation in NumPy
.. note::
- This NEP is part of a series of NEPs encompassing first information
- about the previous dtype implementation and issues with it in NEP 40
- (this document).
- :ref:`NEP 41 <NEP41>` then provides an overview and generic design choices
- for the refactor.
- Further NEPs 42 and 43 go into the technical details of the datatype
- and universal function related internal and external API changes.
- In some cases it may be necessary to consult the other NEPs for a full
- picture of the desired changes and why these changes are necessary.
+ This NEP is first in a series:
+
+ - NEP 40 (this document) explains the shortcomings of NumPy's dtype implementation.
+
+ - :ref:`NEP 41 <NEP41>` gives an overview of our proposed replacement.
+
+ - :ref:`NEP 42 <NEP42>` describes the new design's datatype-related APIs.
+
+ - NEP 43 describes the new design's API for universal functions.
@@ -44,6 +44,8 @@ of the current implementation of dtypes as well as a discussion.
In many cases subsections will be split roughly to first describe the
current implementation and then follow with an "Issues and Discussion" section.
+.. _parametric-datatype-discussion:
+
Parametric Datatypes
^^^^^^^^^^^^^^^^^^^^
@@ -253,6 +255,8 @@ types such as ``np.inexact`` (see figure below).
In fact, some control flow within NumPy currently uses
``issubclass(a.dtype.type, np.inexact)``.
+.. _nep-0040_dtype-hierarchy:
+
.. figure:: _static/nep-0040_dtype-hierarchy.png
**Figure:** Hierarchy of NumPy scalar types reproduced from the reference
@@ -335,7 +339,7 @@ Each of these signatures is associated with a single inner-loop function defined
in C, which does the actual calculation, and may be called multiple times.
The main step in finding the correct inner-loop function is to call a
-:c:type:`PyUFunc_TypeResolutionFunc` which retrieves the input dtypes from
+:c:type:`PyUFunc_TypeResolutionFunc` which retrieves the input dtypes from
the provided input arrays
and will determine the full type signature (including output dtype) to be executed.
@@ -366,7 +370,7 @@ It is currently only possible for user defined functions to be found/resolved
if any of the inputs (or the outputs) has the user datatype, since it uses the
`OO->O` signature.
For example, given that a ufunc loop to implement ``fraction_divide(int, int)
--> Fraction`` has been implemented,
+-> Fraction`` has been implemented,
the call ``fraction_divide(4, 5)`` (with no specific output dtype) will fail
because the loop that
includes the user datatype ``Fraction`` (as output) can only be found if any of
@@ -572,7 +576,7 @@ Related Work
------------
* Julia types are an interesting blueprint for a type hierarchy, and define
- abstract and concrete types [julia-types]_.
+ abstract and concrete types [julia-types]_.
* In Julia promotion can occur based on abstract types. If a promoter is
defined, it will cast the inputs and then Julia can then retry to find
@@ -607,7 +611,7 @@ the following provides a subset for more recent ones:
* https://hackmd.io/ok21UoAQQmOtSVk6keaJhw and https://hackmd.io/s/ryTFaOPHE
(2019-04-30) Proposals for subclassing implementation approach.
-
+
* Discussion about the calling convention of ufuncs and need for more
powerful UFuncs: https://github.com/numpy/numpy/issues/12518
diff --git a/doc/neps/nep-0041-improved-dtype-support.rst b/doc/neps/nep-0041-improved-dtype-support.rst
index 56ff5eac6..d7a08562d 100644
--- a/doc/neps/nep-0041-improved-dtype-support.rst
+++ b/doc/neps/nep-0041-improved-dtype-support.rst
@@ -15,15 +15,15 @@ NEP 41 — First step towards a new Datatype System
.. note::
- This NEP is part of a series of NEPs encompassing first information
- about the previous dtype implementation and issues with it in
- :ref:`NEP 40 <NEP40>`.
- NEP 41 (this document) then provides an overview and generic design
- choices for the refactor.
- Further NEPs 42 and 43 go into the technical details of the datatype
- and universal function related internal and external API changes.
- In some cases it may be necessary to consult the other NEPs for a full
- picture of the desired changes and why these changes are necessary.
+ This NEP is second in a series:
+
+ - :ref:`NEP 40 <NEP40>` explains the shortcomings of NumPy's dtype implementation.
+
+ - NEP 41 (this document) gives an overview of our proposed replacement.
+
+ - :ref:`NEP 42 <NEP42>` describes the new design's datatype-related APIs.
+
+ - NEP 43 describes the new design's API for universal functions.
Abstract
@@ -412,27 +412,28 @@ multiple development stages are required:
* Phase II: Incrementally define or rework API
- * Create a new and easily extensible API for defining new datatypes
- and related functionality. (NEP 42)
-
- * Incrementally define all necessary functionality through the new API (NEP 42):
-
- * Defining operations such as ``np.common_type``.
- * Allowing to define casting between datatypes.
- * Add functionality necessary to create a numpy array from Python scalars
- (i.e. ``np.array(...)``).
- * …
-
- * Restructure how universal functions work (NEP 43), in order to:
-
- * make it possible to allow a `~numpy.ufunc` such as ``np.add`` to be
- extended by user-defined datatypes such as Units.
-
- * allow efficient lookup for the correct implementation for user-defined
- datatypes.
-
- * enable reuse of existing code. Units should be able to use the
- normal math loops and add additional logic to determine output type.
+ * Incrementally define all necessary functionality through methods and
+ properties on the DType (NEP 42):
+
+ * The properties of the class hierarchy and DType class itself,
+ including methods not covered by the following, most central, points.
+ * The functionality that will support dtype casting using ``arr.astype()``
+ and casting related operations such as ``np.common_type``.
+ * The implementation of item access and storage, and the way shape and
+ dtype are determined when creating an array with ``np.array()``
+ * Create a public C-API to define new DTypes.
+
+ * Restructure how universal functions work (NEP 43), to allow extending
+ a `~numpy.ufunc` such as ``np.add`` for user-defined datatypes
+ such as Units:
+
+ * Refactor how the low-level C functions are organized to make it
+ extensible and flexible enough for complicated DTypes such as Units.
+ * Implement registration and efficient lookup for these low-level C
+ functions as defined by the user.
+ * Define how promotion will be used to implement behaviour when casting
+ is required. For example ``np.float64(3) + np.int32(3)`` promotes the
+ ``int32`` to a ``float64``.
* Phase III: Growth of NumPy and Scientific Python Ecosystem capabilities:
@@ -514,22 +515,22 @@ are not yet fully clear, we anticipate, and accept the following changes:
* **C-API**:
- * In old versions of NumPy ``PyArray_DescrCheck`` is a macro which uses
- ``type(dtype) is np.dtype``. When compiling against an old NumPy version,
- the macro may have to be replaced with the corresponding
- ``PyObject_IsInstance`` call. (If this is a problem, we could backport
- fixing the macro)
+ * In old versions of NumPy ``PyArray_DescrCheck`` is a macro which uses
+ ``type(dtype) is np.dtype``. When compiling against an old NumPy version,
+ the macro may have to be replaced with the corresponding
+ ``PyObject_IsInstance`` call. (If this is a problem, we could backport
+ fixing the macro)
- * The UFunc machinery changes will break *limited* parts of the current
- implementation. Replacing e.g. the default ``TypeResolver`` is expected
- to remain supported for a time, although optimized masked inner loop iteration
- (which is not even used *within* NumPy) will no longer be supported.
+ * The UFunc machinery changes will break *limited* parts of the current
+ implementation. Replacing e.g. the default ``TypeResolver`` is expected
+ to remain supported for a time, although optimized masked inner loop iteration
+ (which is not even used *within* NumPy) will no longer be supported.
- * All functions currently defined on the dtypes, such as
- ``PyArray_Descr->f->nonzero``, will be defined and accessed differently.
- This means that in the long run lowlevel access code will
- have to be changed to use the new API. Such changes are expected to be
- necessary in very few project.
+ * All functions currently defined on the dtypes, such as
+ ``PyArray_Descr->f->nonzero``, will be defined and accessed differently.
+ This means that in the long run lowlevel access code will
+ have to be changed to use the new API. Such changes are expected to be
+ necessary in very few project.
* **dtype implementors (C-API)**:
@@ -541,16 +542,16 @@ are not yet fully clear, we anticipate, and accept the following changes:
At least in some code paths, a similar mechanism is already used.
* The ``scalarkind`` slot and registration of scalar casting will be
- removed/ignored without replacement.
- It currently allows partial value-based casting.
- The ``PyArray_ScalarKind`` function will continue to work for builtin types,
- but will not be used internally and be deprecated.
+ removed/ignored without replacement.
+ It currently allows partial value-based casting.
+ The ``PyArray_ScalarKind`` function will continue to work for builtin types,
+ but will not be used internally and be deprecated.
- * Currently user dtypes are defined as instances of ``np.dtype``.
- The creation works by the user providing a prototype instance.
- NumPy will need to modify at least the type during registration.
- This has no effect for either ``rational`` or ``quaternion`` and mutation
- of the structure seems unlikely after registration.
+ * Currently user dtypes are defined as instances of ``np.dtype``.
+ The creation works by the user providing a prototype instance.
+ NumPy will need to modify at least the type during registration.
+ This has no effect for either ``rational`` or ``quaternion`` and mutation
+ of the structure seems unlikely after registration.
Since there is a fairly large API surface concerning datatypes, further changes
or the limitation certain function to currently existing datatypes is
@@ -583,7 +584,7 @@ special methods move from the dtype instances to methods on the new DType class.
This is the typical design pattern used in Python.
Organizing these methods and information in a more Pythonic way provides a
solid foundation for refining and extending the API in the future.
-The current API cannot be extended due to how it is exposed publically.
+The current API cannot be extended due to how it is exposed publicly.
This means for example that the methods currently stored in ``PyArray_ArrFuncs``
on each datatype (see :ref:`NEP 40 <NEP40>`)
will be defined differently in the future and
@@ -620,6 +621,49 @@ While DType and Scalar describe the same concept/type (e.g. an `int64`),
it seems practical to split out the information and functionality necessary
for numpy into the DType class.
+The dtype instances provide parameters and storage options
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+
+From a computer science point of view a type defines the *value space*
+(all possible values its instances can take) and their *behaviour*.
+As proposed in this NEP, the DType class defines value space and behaviour.
+The ``dtype`` instance can be seen as part of the value, so that the typical
+Python ``instance`` corresponds to ``dtype + element`` (where *element* is the
+data stored in the array).
+An alternative view would be to define value space and behaviour on the
+``dtype`` instances directly.
+These two options are presented in the following figure and compared to
+similar Python implementation patterns:
+
+.. image:: _static/nep-0041-type-sketch-no-fonts.svg
+
+The difference is in how parameters, such as string length or the datetime
+units (``ms``, ``ns``, ...), and storage options, such as byte-order, are handled.
+When implementing a Python (scalar) ``type`` parameters, for example the datetimes
+unit, will be stored in the instance.
+This is the design NEP 42 tries to mimic, however, the parameters are now part
+of the dtype instance, meaning that part of the data stored in the instance
+is shared by all array elements.
+As mentioned previously, this means that the Python ``instance`` corresponds
+to the ``dtype + element`` stored in a NumPy array.
+
+An more advanced approach in Python is to use a class factory and an abstract
+base class (ABC).
+This allows moving the parameter into the dynamically created ``type`` and
+behaviour implementation may be specific to those parameters.
+An alternative approach might use this model and implemented behaviour
+directly on the ``dtype`` instance.
+
+We believe that the version as proposed here is easier to work with and understand.
+Python class factories are not commonly used and NumPy does not use code
+specialized for dtype parameters or byte-orders.
+Making such specialization easier to implement such specialization does not
+seem to be a priority.
+One result of this choice is that some DTypes may only have a singleton instance
+if they have no parameters or storage variation.
+However, all of the NumPy dtypes require dynamically created instances due
+to allowing metadata to be attached.
+
Scalars should not be instances of the datatypes (2)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/doc/neps/nep-0042-new-dtypes.rst b/doc/neps/nep-0042-new-dtypes.rst
new file mode 100644
index 000000000..d1ddb7101
--- /dev/null
+++ b/doc/neps/nep-0042-new-dtypes.rst
@@ -0,0 +1,1417 @@
+.. _NEP42:
+
+==============================================================================
+NEP 42 — New and extensible DTypes
+==============================================================================
+
+:title: New and extensible DTypes
+:Author: Sebastian Berg
+:Author: Ben Nathanson
+:Author: Marten van Kerkwijk
+:Status: Draft
+:Type: Standard
+:Created: 2019-07-17
+
+
+.. note::
+
+ This NEP is third in a series:
+
+ - :ref:`NEP40` explains the shortcomings of NumPy's dtype implementation.
+
+ - :ref:`NEP41` gives an overview of our proposed replacement.
+
+ - NEP 42 (this document) describes the new design's datatype-related APIs.
+
+ - :ref:`NEP43` describes the new design's API for universal functions.
+
+
+******************************************************************************
+Abstract
+******************************************************************************
+
+NumPy's dtype architecture is monolithic -- each dtype is an instance of a
+single class. There's no principled way to expand it for new dtypes, and the
+code is difficult to read and maintain.
+
+As :ref:`NEP 41 <NEP41>` explains, we are proposing a new architecture that is
+modular and open to user additions. dtypes will derive from a new ``DType``
+class serving as the extension point for new types. ``np.dtype("float64")``
+will return an instance of a ``Float64`` class, a subclass of root class
+``np.dtype``.
+
+This NEP is one of two that lay out the design and API of this new
+architecture. This NEP addresses dtype implementation; :ref:`NEP 43 <NEP43>` addresses
+universal functions.
+
+.. note::
+
+ Details of the private and external APIs may change to reflect user
+ comments and implementation constraints. The underlying principles and
+ choices should not change significantly.
+
+
+******************************************************************************
+Motivation and scope
+******************************************************************************
+
+Our goal is to allow user code to create fully featured dtypes for a broad
+variety of uses, from physical units (such as meters) to domain-specific
+representations of geometric objects. :ref:`NEP 41 <NEP41>` describes a number
+of these new dtypes and their benefits.
+
+Any design supporting dtypes must consider:
+
+- How shape and dtype are determined when an array is created
+- How array elements are stored and accessed
+- The rules for casting dtypes to other dtypes
+
+In addition:
+
+- We want dtypes to comprise a class hierarchy open to new types and to
+ subhierarchies, as motivated in :ref:`NEP 41 <NEP41>`.
+
+And to provide this,
+
+- We need to define a user API.
+
+All these are the subjects of this NEP.
+
+- The class hierarchy, its relation to the Python scalar types, and its
+ important attributes are described in `nep42_DType class`_.
+
+- The functionality that will support dtype casting is described in `Casting`_.
+
+- The implementation of item access and storage, and the way shape and dtype
+ are determined when creating an array, are described in :ref:`nep42_array_coercion`.
+
+- The functionality for users to define their own DTypes is described in
+ `Public C-API`_.
+
+The API here and in :ref:`NEP 43 <NEP43>` is entirely on the C side. A Python-side version
+will be proposed in a future NEP. A future Python API is expected to be
+similar, but provide a more convenient API to reuse the functionality of
+existing DTypes. It could also provide shorthands to create structured DTypes
+similar to Python's
+`dataclasses <https://docs.python.org/3.8/library/dataclasses.html>`_.
+
+
+******************************************************************************
+Backward compatibility
+******************************************************************************
+
+The disruption is expected to be no greater than that of a typical NumPy
+release.
+
+- The main issues are noted in :ref:`NEP 41 <NEP41>` and will mostly affect
+ heavy users of the NumPy C-API.
+
+- Eventually we will want to deprecate the API currently used for creating
+ user-defined dtypes.
+
+- Small, rarely noticed inconsistencies are likely to change. Examples:
+
+ - ``np.array(np.nan, dtype=np.int64)`` behaves differently from
+ ``np.array([np.nan], dtype=np.int64)`` with the latter raising an error.
+ This may require identical results (either both error or both succeed).
+ - ``np.array([array_like])`` sometimes behaves differently from
+ ``np.array([np.array(array_like)])``
+ - array operations may or may not preserve dtype metadata
+
+- Documentation that describes the internal structure of dtypes will need
+ to be updated.
+
+The new code must pass NumPy's regular test suite, giving some assurance that
+the changes are compatible with existing code.
+
+******************************************************************************
+Usage and impact
+******************************************************************************
+
+We believe the few structures in this section are sufficient to consolidate
+NumPy's present functionality and also to support complex user-defined DTypes.
+
+The rest of the NEP fills in details and provides support for the claim.
+
+Again, though Python is used for illustration, the implementation is a C API only; a
+future NEP will tackle the Python API.
+
+After implementing this NEP, creating a DType will be possible by implementing
+the following outlined DType base class,
+that is further described in `nep42_DType class`_:
+
+.. code-block:: python
+ :dedent: 0
+
+ class DType(np.dtype):
+ type : type # Python scalar type
+ parametric : bool # (may be indicated by superclass)
+
+ @property
+ def canonical(self) -> bool:
+ raise NotImplementedError
+
+ def ensure_canonical(self : DType) -> DType:
+ raise NotImplementedError
+
+For casting, a large part of the functionality is provided by the "methods" stored
+in ``_castingimpl``
+
+.. code-block:: python
+ :dedent: 0
+
+ @classmethod
+ def common_dtype(cls : DTypeMeta, other : DTypeMeta) -> DTypeMeta:
+ raise NotImplementedError
+
+ def common_instance(self : DType, other : DType) -> DType:
+ raise NotImplementedError
+
+ # A mapping of "methods" each detailing how to cast to another DType
+ # (further specified at the end of the section)
+ _castingimpl = {}
+
+For array-coercion, also part of casting:
+
+.. code-block:: python
+ :dedent: 0
+
+ def __dtype_setitem__(self, item_pointer, value):
+ raise NotImplementedError
+
+ def __dtype_getitem__(self, item_pointer, base_obj) -> object:
+ raise NotImplementedError
+
+ @classmethod
+ def __discover_descr_from_pyobject__(cls, obj : object) -> DType:
+ raise NotImplementedError
+
+ # initially private:
+ @classmethod
+ def _known_scalar_type(cls, obj : object) -> bool:
+ raise NotImplementedError
+
+
+Other elements of the casting implementation is the ``CastingImpl``:
+
+.. code-block:: python
+ :dedent: 0
+
+ casting = Union["safe", "same_kind", "unsafe"]
+
+ class CastingImpl:
+ # Object describing and performing the cast
+ casting : casting
+
+ def resolve_descriptors(self, Tuple[DType] : input) -> (casting, Tuple[DType]):
+ raise NotImplementedError
+
+ # initially private:
+ def _get_loop(...) -> lowlevel_C_loop:
+ raise NotImplementedError
+
+which describes the casting from one DType to another. In
+:ref:`NEP 43 <NEP43>` this ``CastingImpl`` object is used unchanged to
+support universal functions.
+
+
+******************************************************************************
+Definitions
+******************************************************************************
+.. glossary::
+
+ dtype
+ The dtype *instance*; this is the object attached to a numpy array.
+
+ DType
+ Any subclass of the base type ``np.dtype``.
+
+ coercion
+ Conversion of Python types to NumPy arrays and values stored in a NumPy
+ array.
+
+ cast
+ Conversion of an array to a different dtype.
+
+ parametric type
+ A dtype whose representation can change based on a parameter value,
+ like a string dtype with a length parameter. All members of the current
+ ``flexible`` dtype class are parametric. See
+ :ref:`NEP 40 <parametric-datatype-discussion>`.
+
+ promotion
+ Finding a dtype that can perform an operation on a mix of dtypes without
+ loss of information.
+
+ safe cast
+ A cast is safe if no information is lost when changing type.
+
+On the C level we use ``descriptor`` or ``descr`` to mean
+*dtype instance*. In the proposed C-API, these terms will distinguish
+dtype instances from DType classes.
+
+.. note::
+ NumPy has an existing class hierarchy for scalar types, as
+ seen :ref:`in the figure <nep-0040_dtype-hierarchy>` of
+ :ref:`NEP 40 <NEP40>`, and the new DType hierarchy will resemble it. The
+ types are used as an attribute of the single dtype class in the current
+ NumPy; they're not dtype classes. They neither harm nor help this work.
+
+.. _nep42_DType class:
+
+******************************************************************************
+The DType class
+******************************************************************************
+
+This section reviews the structure underlying the proposed DType class,
+including the type hierarchy and the use of abstract DTypes.
+
+Class getter
+==============================================================================
+
+To create a DType instance from a scalar type users now call
+``np.dtype`` (for instance, ``np.dtype(np.int64)``). Sometimes it is
+also necessary to access the underlying DType class; this comes up in
+particular with type hinting because the "type" of a DType instance is
+the DType class. Taking inspiration from type hinting, we propose the
+following getter syntax::
+
+ np.dtype[np.int64]
+
+to get the DType class corresponding to a scalar type. The notation
+works equally well with built-in and user-defined DTypes.
+
+This getter eliminates the need to create an explicit name for every
+DType, crowding the ``np`` namespace; the getter itself signifies the
+type. It also opens the possibility of making ``np.ndarray`` generic
+over DType class using annotations like::
+
+ np.ndarray[np.dtype[np.float64]]
+
+The above is fairly verbose, so it is possible that we will include
+aliases like::
+
+ Float64 = np.dtype[np.float64]
+
+in ``numpy.typing``, thus keeping annotations concise but still
+avoiding crowding the ``np`` namespace as discussed above. For a
+user-defined DType::
+
+ class UserDtype(dtype): ...
+
+one can do ``np.ndarray[UserDtype]``, keeping annotations concise in
+that case without introducing boilerplate in NumPy itself. For a user
+user-defined scalar type::
+
+ class UserScalar(generic): ...
+
+we would need to add a typing overload to ``dtype``::
+
+ @overload
+ __new__(cls, dtype: Type[UserScalar], ...) -> UserDtype
+
+to allow ``np.dtype[UserScalar]``.
+
+The initial implementation probably will return only concrete (not abstract)
+DTypes.
+
+*This item is still under review.*
+
+
+Hierarchy and abstract classes
+==============================================================================
+
+We will use abstract classes as building blocks of our extensible DType class
+hierarchy.
+
+1. Abstract classes are inherited cleanly, in principle allowing checks like
+ ``isinstance(np.dtype("float64"), np.inexact)``.
+
+2. Abstract classes allow a single piece of code to handle a multiplicity of
+ input types. Code written to accept Complex objects can work with numbers
+ of any precision; the precision of the results is determined by the
+ precision of the arguments.
+
+3. There's room for user-created families of DTypes. We can envision an
+ abstract ``Unit`` class for physical units, with a concrete subclass like
+ ``Float64Unit``. Calling ``Unit(np.float64, "m")`` (``m`` for meters) would
+ be equivalent to ``Float64Unit("m")``.
+
+4. The implementation of universal functions in :ref:`NEP 43 <NEP43>` may require
+ a class hierarchy.
+
+**Example:** A NumPy ``Categorical`` class would be a match for pandas
+``Categorical`` objects, which can contain integers or general Python objects.
+NumPy needs a DType that it can assign a Categorical to, but it also needs
+DTypes like ``CategoricalInt64`` and ``CategoricalObject`` such that
+``common_dtype(CategoricalInt64, String)`` raises an error, but
+``common_dtype(CategoricalObject, String)`` returns an ``object`` DType. In
+our scheme, ``Categorical`` is an abstract type with ``CategoricalInt64`` and
+``CategoricalObject`` subclasses.
+
+
+Rules for the class structure, illustrated :ref:`below <nep42_hierarchy_figure>`:
+
+1. Abstract DTypes cannot be instantiated. Instantiating an abstract DType
+ raises an error, or perhaps returns an instance of a concrete subclass.
+ Raising an error will be the default behavior and may be required initially.
+
+2. While abstract DTypes may be superclasses, they may also act like Python's
+ abstract base classes (ABC) allowing registration instead of subclassing.
+ It may be possible to simply use or inherit from Python ABCs.
+
+3. Concrete DTypes may not be subclassed. In the future this might be relaxed
+ to allow specialized implementations such as a GPU float64 subclassing a
+ NumPy float64.
+
+The
+`Julia language <https://docs.julialang.org/en/v1/manual/types/#man-abstract-types-1>`_
+has a similar prohibition against subclassing concrete types.
+For example methods such as the later ``__common_instance__`` or
+``__common_dtype__`` cannot work for a subclass unless they were designed
+very carefully.
+It helps avoid unintended vulnerabilities to implementation changes that
+result from subclassing types that were not written to be subclassed.
+We believe that the DType API should rather be extended to simplify wrapping
+of existing functionality.
+
+The DType class requires C-side storage of methods and additional information,
+to be implemented by a ``DTypeMeta`` class. Each ``DType`` class is an
+instance of ``DTypeMeta`` with a well-defined and extensible interface;
+end users ignore it.
+
+.. _nep42_hierarchy_figure:
+.. figure:: _static/dtype_hierarchy.svg
+ :figclass: align-center
+
+
+Miscellaneous methods and attributes
+==============================================================================
+
+This section collects definitions in the DType class that are not used in
+casting and array coercion, which are described in detail below.
+
+* Existing dtype methods (:class:`numpy.dtype`) and C-side fields are preserved.
+
+* ``DType.type`` replaces ``dtype.type``. Unless a use case arises,
+ ``dtype.type`` will be deprecated.
+ This indicates a Python scalar type which represents the same values as
+ the DType. This is the same type as used in the proposed `Class getter`_
+ and for `DType discovery during array coercion`_.
+ (This can may also be set for abstract DTypes, this is necessary
+ for array coercion.)
+
+* A new ``self.canonical`` property generalizes the notion of byte order to
+ indicate whether data has been stored in a default/canonical way. For
+ existing code, "canonical" will just signify native byte order, but it can
+ take on new meanings in new DTypes -- for instance, to distinguish a
+ complex-conjugated instance of Complex which stores ``real - imag`` instead
+ of ``real + imag``. The ISNBO ("is
+ native byte order") flag might be repurposed as the canonical flag.
+
+* Support is included for parametric DTypes. A DType will be deemed parametric
+ if it inherits from ParametricDType.
+
+* DType methods may resemble or even reuse existing Python slots. Thus Python
+ special slots are off-limits for user-defined DTypes (for instance, defining
+ ``Unit("m") > Unit("cm")``), since we may want to develop a meaning for these
+ operators that is common to all DTypes.
+
+* Sorting functions are moved to the DType class. They may be implemented by
+ defining a method ``dtype_get_sort_function(self, sortkind="stable") ->
+ sortfunction`` that must return ``NotImplemented`` if the given ``sortkind``
+ is not known.
+
+* Functions that cannot be removed are implemented as special methods.
+ Many of these were previously defined part of the :c:type:`PyArray_ArrFuncs`
+ slot of the dtype instance (``PyArray_Descr *``) and include functions
+ such as ``nonzero``, ``fill`` (used for ``np.arange``), and
+ ``fromstr`` (used to parse text files).
+ These old methods will be deprecated and replacements
+ following the new design principles added.
+ The API is not defined here. Since these methods can be deprecated and renamed
+ replacements added, it is acceptable if these new methods have to be modified.
+
+* Use of ``kind`` for non-built-in types is discouraged in favor of
+ ``isinstance`` checks. ``kind`` will return the ``__qualname__`` of the
+ object to ensure uniqueness for all DTypes. On the C side, ``kind`` and
+ ``char`` are set to ``\0`` (NULL character).
+ While ``kind`` will be discouraged, the current ``np.issubdtype``
+ may remain the preferred method for this type of check.
+
+* A method ``ensure_canonical(self) -> dtype`` returns a new dtype (or
+ ``self``) with the ``canonical`` flag set.
+
+* Since NumPy's approach is to provide functionality through unfuncs,
+ functions like sorting that will be implemented in DTypes might eventually be
+ reimplemented as generalized ufuncs.
+
+.. _nep_42_casting:
+
+******************************************************************************
+Casting
+******************************************************************************
+
+We review here the operations related to casting arrays:
+
+- Finding the "common dtype," returned by :func:`numpy.promote_types` and
+ :func:`numpy.result_type`
+
+- The result of calling :func:`numpy.can_cast`
+
+We show how casting arrays with ``astype(new_dtype)`` will be implemented.
+
+`Common DType` operations
+==============================================================================
+
+When input types are mixed, a first step is to find a DType that can hold
+the result without loss of information -- a "common DType."
+
+Array coercion and concatenation both return a common dtype instance. Most
+universal functions use the common DType for dispatching, though they might
+not use it for a result (for instance, the result of a comparison is always
+bool).
+
+We propose the following implementation:
+
+- For two DType classes::
+
+ __common_dtype__(cls, other : DTypeMeta) -> DTypeMeta
+
+ Returns a new DType, often one of the inputs, which can represent values
+ of both input DTypes. This should usually be minimal:
+ the common DType of ``Int16`` and ``Uint16`` is ``Int32`` and not ``Int64``.
+ ``__common_dtype__`` may return NotImplemented to defer to other and,
+ like Python operators, subclasses take precedence (their
+ ``__common_dtype__`` method is tried first).
+
+- For two instances of the same DType::
+
+ __common_instance__(self: SelfT, other : SelfT) -> SelfT
+
+ For nonparametric built-in dtypes, this returns a canonicalized copy of
+ ``self``, preserving metadata. For nonparametric user types, this provides
+ a default implementation.
+
+- For instances of different DTypes, for example ``>float64`` and ``S8``,
+ the operation is done in three steps:
+
+ 1. ``Float64.__common_dtype__(type(>float64), type(S8))``
+ returns ``String`` (or defers to ``String.__common_dtype__``).
+
+ 2. The casting machinery (explained in detail below) provides the
+ information that ``">float64"`` casts to ``"S32"``
+
+ 3. ``String.__common_instance__("S8", "S32")`` returns the final ``"S32"``.
+
+The benefit of this handoff is to reduce duplicated code and keep concerns
+separate. DType implementations don't need to know how to cast, and the
+results of casting can be extended to new types, such as a new string encoding.
+
+This means the implementation will work like this::
+
+ def common_dtype(DType1, DType2):
+ common_dtype = type(dtype1).__common_dtype__(type(dtype2))
+ if common_dtype is NotImplemented:
+ common_dtype = type(dtype2).__common_dtype__(type(dtype1))
+ if common_dtype is NotImplemented:
+ raise TypeError("no common dtype")
+ return common_dtype
+
+ def promote_types(dtype1, dtype2):
+ common = common_dtype(type(dtype1), type(dtype2))
+
+ if type(dtype1) is not common:
+ # Find what dtype1 is cast to when cast to the common DType
+ # by using the CastingImpl as described below:
+ castingimpl = get_castingimpl(type(dtype1), common)
+ safety, (_, dtype1) = castingimpl.resolve_descriptors((dtype1, None))
+ assert safety == "safe" # promotion should normally be a safe cast
+
+ if type(dtype2) is not common:
+ # Same as above branch for dtype1.
+
+ if dtype1 is not dtype2:
+ return common.__common_instance__(dtype1, dtype2)
+
+Some of these steps may be optimized for nonparametric DTypes.
+
+Since the type returned by ``__common_dtype__`` is not necessarily one of the
+two arguments, it's not equivalent to NumPy's "safe" casting.
+Safe casting works for ``np.promote_types(int16, int64)``, which returns
+``int64``, but fails for::
+
+ np.promote_types("int64", "float32") -> np.dtype("float64")
+
+It is the responsibility of the DType author to ensure that the inputs
+can be safely cast to the ``__common_dtype__``.
+
+Exceptions may apply. For example, casting ``int32`` to
+a (long enough) string is at least at this time considered "safe".
+However ``np.promote_types(int32, String)`` will *not* be defined.
+
+**Example:**
+
+``object`` always chooses ``object`` as the common DType. For
+``datetime64`` type promotion is defined with no other datatype, but if
+someone were to implement a new higher precision datetime, then::
+
+ HighPrecisionDatetime.__common_dtype__(np.dtype[np.datetime64])
+
+would return ``HighPrecisionDatetime``, and the casting implementation,
+as described below, may need to decide how to handle the datetime unit.
+
+
+**Alternatives:**
+
+- We're pushing the decision on common DTypes to the DType classes. Suppose
+ instead we could turn to a universal algorithm based on safe casting,
+ imposing a total order on DTypes and returning the first type that both
+ arguments could cast to safely.
+
+ It would be difficult to devise a reasonable total order, and it would have
+ to accept new entries. Beyond that, the approach is flawed because
+ importing a type can change the behavior of a program. For example, a
+ program requiring the common DType of ``int16`` and ``uint16`` would
+ ordinarily get the built-in type ``int32`` as the first match; if the
+ program adds ``import int24``, the first match becomes ``int24`` and the
+ smaller type might make the program overflow for the first time. [1]_
+
+- A more flexible common DType could be implemented in the future where
+ ``__common_dtype__`` relies on information from the casting logic.
+ Since ``__commond_dtype__`` is a method a such a default implementation
+ could be added at a later time.
+
+- The three-step handling of differing dtypes could, of course, be coalesced.
+ It would lose the value of splitting in return for a possibly faster
+ execution. But few cases would benefit. Most cases, such as array coercion,
+ involve a single Python type (and thus dtype).
+
+
+The cast operation
+==============================================================================
+
+Casting is perhaps the most complex and interesting DType operation. It
+is much like a typical universal function on arrays, converting one input to a
+new output, with two distinctions:
+
+- Casting always requires an explicit output datatype.
+- The NumPy iterator API requires access to functions that are lower-level
+ than what universal functions currently need.
+
+Casting can be complex and may not implement all details of each input
+datatype (such as non-native byte order or unaligned access). So a complex
+type conversion might entail 3 steps:
+
+1. The input datatype is normalized and prepared for the cast.
+2. The cast is performed.
+3. The result, which is in a normalized form, is cast to the requested
+ form (non-native byte order).
+
+Further, NumPy provides different casting kinds or safety specifiers:
+
+* ``equivalent``, allowing only byte-order changes
+* ``safe``, requiring a type large enough to preserve value
+* ``same_kind``, requiring a safe cast or one within a kind, like float64 to float32
+* ``unsafe``, allowing any data conversion
+
+and in some cases a cast may be just a view.
+
+We need to support the two current signatures of ``arr.astype``:
+
+- For DTypes: ``arr.astype(np.String)``
+
+ - current spelling ``arr.astype("S")``
+ - ``np.String`` can be an abstract DType
+
+- For dtypes: ``arr.astype(np.dtype("S8"))``
+
+
+We also have two signatures of ``np.can_cast``:
+
+- Instance to class: ``np.can_cast(dtype, DType, "safe")``
+- Instance to instance: ``np.can_cast(dtype, other_dtype, "safe")``
+
+On the Python level ``dtype`` is overloaded to mean class or instance.
+
+A third ``can_cast`` signature, ``np.can_cast(DType, OtherDType, "safe")``,may be used
+internally but need not be exposed to Python.
+
+During DType creation, DTypes will be able to pass a list of ``CastingImpl``
+objects, which can define casting to and from the DType.
+
+One of them should define the cast between instances of that DType. It can be
+omitted if the DType has only a single implementation and is nonparametric.
+
+Each ``CastingImpl`` has a distinct DType signature:
+
+ ``CastingImpl[InputDtype, RequestedDtype]``
+
+and implements the following methods and attributes:
+
+
+* To report safeness,
+
+ ``resolve_descriptors(self, Tuple[DType] : input) -> casting, Tuple[DType]``.
+
+ The ``casting`` output reports safeness (safe, unsafe, or same-kind), and
+ the tuple is used for more multistep casting, as in the example below.
+
+* To get a casting function,
+
+ ``get_loop(...) -> function_to_handle_cast (signature to be decided)``
+
+ returns a low-level implementation of a strided casting function
+ ("transfer function") capable of performing the
+ cast.
+
+ Initially the implementation will be *private*, and users will only be
+ able to provide strided loops with the signature.
+
+* For performance, a ``casting`` attribute taking a value of ``equivalent``, ``safe``,
+ ``unsafe``, or ``same-kind``.
+
+
+**Performing a cast**
+
+.. _nep42_cast_figure:
+
+.. figure:: _static/casting_flow.svg
+ :figclass: align-center
+
+The above figure illustrates a multistep
+cast of an ``int24`` with a value of ``42`` to a string of length 20
+(``"S20"``).
+
+We've picked an example where the implementer has only provided limited
+functionality: a function to cast an ``int24`` to an ``S8`` string (which can
+hold all 24-bit integers). This means multiple conversions are needed.
+
+The full process is:
+
+1. Call
+
+ ``CastingImpl[Int24, String].resolve_descriptors((int24, "S20"))``.
+
+ This provides the information that ``CastingImpl[Int24, String]`` only
+ implements the cast of ``int24`` to ``"S8"``.
+
+2. Since ``"S8"`` does not match ``"S20"``, use
+
+ ``CastingImpl[String, String].get_loop()``
+
+ to find the transfer (casting) function to convert an ``"S8"`` into an ``"S20"``
+
+3. Fetch the transfer function to convert an ``int24`` to an ``"S8"`` using
+
+ ``CastingImpl[Int24, String].get_loop()``
+
+4. Perform the actual cast using the two transfer functions:
+
+ ``int24(42) -> S8("42") -> S20("42")``.
+
+ ``resolve_descriptors`` allows the implementation for
+
+ ``np.array(42, dtype=int24).astype(String)``
+
+ to call
+
+ ``CastingImpl[Int24, String].resolve_descriptors((int24, None))``.
+
+ In this case the result of ``(int24, "S8")`` defines the correct cast:
+
+ ``np.array(42, dtype=int24).astype(String) == np.array("42", dtype="S8")``.
+
+**Casting safety**
+
+To compute ``np.can_cast(int24, "S20", casting="safe")``, only the
+``resolve_descriptors`` function is required and
+is called in the same way as in :ref:`the figure describing a cast <nep42_cast_figure>`.
+
+In this case, the calls to ``resolve_descriptors``, will also provide the
+information that ``int24 -> "S8"`` as well as ``"S8" -> "S20"`` are safe
+casts, and thus also the ``int24 -> "S20"`` is a safe cast.
+
+In some cases, no cast is necessary. For example, on most Linux systems
+``np.dtype("long")`` and ``np.dtype("longlong")`` are different dtypes but are
+both 64-bit integers. In this case, the cast can be performed using
+``long_arr.view("longlong")``. The information that a cast is a view will be
+handled by an additional flag. Thus the ``casting`` can have the 8 values in
+total: the original 4 of ``equivalent``, ``safe``, ``unsafe``, and ``same-kind``,
+plus ``equivalent+view``, ``safe+view``, ``unsafe+view``, and
+``same-kind+view``. NumPy currently defines ``dtype1 == dtype2`` to be True
+only if byte order matches. This functionality can be replaced with the
+combination of "equivalent" casting and the "view" flag.
+
+(For more information on the ``resolve_descriptors`` signature see the
+:ref:`nep42_C-API` section below and :ref:`NEP 43 <NEP43>`.)
+
+
+**Casting between instances of the same DType**
+
+To keep down the number of casting
+steps, CastingImpl must be capable of any conversion between all instances
+of this DType.
+
+In general the DType implementer must include ``CastingImpl[DType, DType]``
+unless there is only a singleton instance.
+
+**General multistep casting**
+
+We could implement certain casts, such as ``int8`` to ``int24``,
+even if the user provides only an ``int16 -> int24`` cast. This proposal does
+not provide that, but future work might find such casts dynamically, or at least
+allow ``resolve_descriptors`` to return arbitrary ``dtypes``.
+
+If ``CastingImpl[Int8, Int24].resolve_descriptors((int8, int24))`` returns
+``(int16, int24)``, the actual casting process could be extended to include
+the ``int8 -> int16`` cast. This adds a step.
+
+
+**Example:**
+
+The implementation for casting integers to datetime would generally
+say that this cast is unsafe (because it is always an unsafe cast).
+Its ``resolve_descriptors`` function may look like::
+
+ def resolve_descriptors(self, given_dtypes):
+ from_dtype, to_dtype = given_dtypes
+ from_dtype = from_dtype.ensure_canonical() # ensure not byte-swapped
+ if to_dtype is None:
+ raise TypeError("Cannot convert to a NumPy datetime without a unit")
+ to_dtype = to_dtype.ensure_canonical() # ensure not byte-swapped
+
+ # This is always an "unsafe" cast, but for int64, we can represent
+ # it by a simple view (if the dtypes are both canonical).
+ # (represented as C-side flags here).
+ safety_and_view = NPY_UNSAFE_CASTING | _NPY_CAST_IS_VIEW
+ return safety_and_view, (from_dtype, to_dtype)
+
+.. note::
+
+ While NumPy currently defines integer-to-datetime casts, with the possible
+ exception of the unit-less ``timedelta64`` it may be better to not define
+ these casts at all. In general we expect that user defined DTypes will be
+ using custom methods such as ``unit.drop_unit(arr)`` or ``arr *
+ unit.seconds``.
+
+
+**Alternatives:**
+
+- Our design objectives are:
+ - Minimize the number of DType methods and avoid code duplication.
+ - Mirror the implementation of universal functions.
+
+- The decision to use only the DType classes in the first step of finding the
+ correct ``CastingImpl`` in addition to defining ``CastingImpl.casting``,
+ allows to retain the current default implementation of
+ ``__common_dtype__`` for existing user defined dtypes, which could be
+ expanded in the future.
+
+- The split into multiple steps may seem to add complexity rather than reduce
+ it, but it consolidates the signatures of ``np.can_cast(dtype, DTypeClass)``
+ and ``np.can_cast(dtype, other_dtype)``.
+
+ Further, the API guarantees separation of concerns for user DTypes. The user
+ ``Int24`` dtype does not have to handle all string lengths if it does not
+ wish to do so. Further, an encoding added to the ``String`` DType would
+ not affect the overall cast. The ``resolve_descriptors`` function
+ can keep returning the default encoding and the ``CastingImpl[String,
+ String]`` can take care of any necessary encoding changes.
+
+- The main alternative is moving most of the information that is here pushed
+ into the ``CastingImpl`` directly into methods on the DTypes. But this
+ obscures the similarity between casting and universal functions. It does
+ reduce indirection, as noted below.
+
+- An earlier proposal defined two methods ``__can_cast_to__(self, other)`` to
+ dynamically return ``CastingImpl``. This
+ removes the requirement to define all possible casts at DType creation
+ (of one of the involved DTypes).
+
+ Such an API could be added later. It resembles Python's ``__getattr__`` in
+ providing additional control over attribute lookup.
+
+
+**Notes:**
+
+The proposed ``CastingImpl`` is designed to be identical to the
+``PyArrayMethod`` proposed in NEP43 as part of restructuring ufuncs to handle
+new DTypes.
+
+The way dispatching works for ``CastingImpl`` is planned to be limited
+initially and fully opaque. In the future, it may or may not be moved into a
+special UFunc, or behave more like a universal function.
+
+
+.. _nep42_array_coercion:
+
+
+Coercion to and from Python objects
+==============================================================================
+
+When storing a single value in an array or taking it out, it is necessary to
+coerce it -- that is, convert it -- to and from the low-level representation
+inside the array.
+
+Coercion is slightly more complex than typical casts. One reason is that a
+Python object could itself be a 0-dimensional array or scalar with an
+associated DType.
+
+Coercing to and from Python scalars requires two to three
+methods that largely correspond to the current definitions:
+
+1. ``__dtype_setitem__(self, item_pointer, value)``
+
+2. ``__dtype_getitem__(self, item_pointer, base_obj) -> object``;
+ ``base_obj`` is for memory management and usually ignored; it points to
+ an object owning the data. Its only role is to support structured datatypes
+ with subarrays within NumPy, which currently return views into the array.
+ The function returns an equivalent Python scalar (i.e. typically a NumPy
+ scalar).
+
+3. ``__dtype_get_pyitem__(self, item_pointer, base_obj) -> object`` (initially
+ hidden for new-style user-defined datatypes, may be exposed on user
+ request). This corresponds to the ``arr.item()`` method also used by
+ ``arr.tolist()`` and returns Python floats, for example, instead of NumPy
+ floats.
+
+(The above is meant for C-API. A Python-side API would have to use byte
+buffers or similar to implement this, which may be useful for prototyping.)
+
+When a certain scalar
+has a known (different) dtype, NumPy may in the future use casting instead of
+``__dtype_setitem__``.
+
+A user datatype is (initially) expected to implement
+``__dtype_setitem__`` for its own ``DType.type`` and all basic Python scalars
+it wishes to support (e.g. ``int`` and ``float``). In the future a
+function ``known_scalar_type`` may be made public to allow a user dtype to signal
+which Python scalars it can store directly.
+
+
+**Implementation:** The pseudocode implementation for setting a single item in
+an array from an arbitrary Python object ``value`` is (some
+functions here are defined later)::
+
+ def PyArray_Pack(dtype, item_pointer, value):
+ DType = type(dtype)
+ if DType.type is type(value) or DType.known_scalartype(type(value)):
+ return dtype.__dtype_setitem__(item_pointer, value)
+
+ # The dtype cannot handle the value, so try casting:
+ arr = np.array(value)
+ if arr.dtype is object or arr.ndim != 0:
+ # not a numpy or user scalar; try using the dtype after all:
+ return dtype.__dtype_setitem__(item_pointer, value)
+
+ arr.astype(dtype)
+ item_pointer.write(arr[()])
+
+where the call to ``np.array()`` represents the dtype discovery and is
+not actually performed.
+
+**Example:** Current ``datetime64`` returns ``np.datetime64`` scalars and can
+be assigned from ``np.datetime64``. However, the datetime
+``__dtype_setitem__`` also allows assignment from date strings ("2016-05-01")
+or Python integers. Additionally the datetime ``__dtype_get_pyitem__``
+function actually returns a Python ``datetime.datetime`` object (most of the
+time).
+
+
+**Alternatives:** This functionality could also be implemented as a cast to and
+from the ``object`` dtype.
+However, coercion is slightly more complex than typical casts.
+One reason is that in general a Python object could itself be a
+zero-dimensional array or scalar with an associated DType.
+Such an object has a DType, and the correct cast to another DType is already
+defined::
+
+ np.array(np.float32(4), dtype=object).astype(np.float64)
+
+is identical to::
+
+ np.array(4, dtype=np.float32).astype(np.float64)
+
+Implementing the first ``object`` to ``np.float64`` cast explicitly,
+would require the user to take to duplicate or fall back to existing
+casting functionality.
+
+It is certainly possible to describe the coercion to and from Python objects
+using the general casting machinery, but the ``object`` dtype is special and
+important enough to be handled by NumPy using the presented methods.
+
+**Further issues and discussion:**
+
+- The ``__dtype_setitem__`` function duplicates some code, such as coercion
+ from a string.
+
+ ``datetime64`` allows assignment from string, but the same conversion also
+ occurs for casting from the string dtype to ``datetime64``.
+
+ We may in the future expose the ``known_scalartype`` function to allow the
+ user to implement such duplication.
+
+ For example, NumPy would normally use
+
+ ``np.array(np.string_("2019")).astype(datetime64)``
+
+ but ``datetime64`` could choose to use its ``__dtype_setitem__`` instead
+ for performance reasons.
+
+- There is an issue about how subclasses of scalars should be handled. We
+ anticipate to stop automatically detecting the dtype for
+ ``np.array(float64_subclass)`` to be float64. The user can still provide
+ ``dtype=np.float64``. However, the above automatic casting using
+ ``np.array(scalar_subclass).astype(requested_dtype)`` will fail. In many
+ cases, this is not an issue, since the Python ``__float__`` protocol can be
+ used instead. But in some cases, this will mean that subclasses of Python
+ scalars will behave differently.
+
+.. note::
+
+ *Example:* ``np.complex256`` should not use ``__float__`` in its
+ ``__dtype_setitem__`` method in the future unless it is a known floating
+ point type. If the scalar is a subclass of a different high precision
+ floating point type (e.g. ``np.float128``) then this currently loses
+ precision without notifying the user.
+ In that case ``np.array(float128_subclass(3), dtype=np.complex256)``
+ may fail unless the ``float128_subclass`` is first converted to the
+ ``np.float128`` base class.
+
+
+DType discovery during array coercion
+==============================================================================
+
+An important step in the use of NumPy arrays is creation of the array from
+collections of generic Python objects.
+
+**Motivation:** Although the distinction is not clear currently, there are two main needs::
+
+ np.array([1, 2, 3, 4.])
+
+needs to guess the correct dtype based on the Python objects inside.
+Such an array may include a mix of datatypes, as long as they can be
+promoted.
+A second use case is when users provide the output DType class, but not the
+specific DType instance::
+
+ np.array([object(), None], dtype=np.dtype[np.string_]) # (or `dtype="S"`)
+
+In this case the user indicates that ``object()`` and ``None`` should be
+interpreted as strings.
+The need to consider the user provided DType also arises for a future
+``Categorical``::
+
+ np.array([1, 2, 1, 1, 2], dtype=Categorical)
+
+which must interpret the numbers as unique categorical values rather than
+integers.
+
+There are three further issues to consider:
+
+1. It may be desirable to create datatypes associated
+ with normal Python scalars (such as ``datetime.datetime``) that do not
+ have a ``dtype`` attribute already.
+
+2. In general, a datatype could represent a sequence, however, NumPy currently
+ assumes that sequences are always collections of elements
+ (the sequence cannot be an element itself).
+ An example would be a ``vector`` DType.
+
+3. An array may itself contain arrays with a specific dtype (even
+ general Python objects). For example:
+ ``np.array([np.array(None, dtype=object)], dtype=np.String)``
+ poses the issue of how to handle the included array.
+
+Some of these difficulties arise because finding the correct shape
+of the output array and finding the correct datatype are closely related.
+
+**Implementation:** There are two distinct cases above:
+
+1. The user has provided no dtype information.
+
+2. The user provided a DType class -- as represented, for example, by ``"S"``
+ representing a string of any length.
+
+In the first case, it is necessary to establish a mapping from the Python type(s)
+of the constituent elements to the DType class.
+Once the DType class is known, the correct dtype instance needs to be found.
+In the case of strings, this requires to find the string length.
+
+These two cases shall be implemented by leveraging two pieces of information:
+
+1. ``DType.type``: The current type attribute to indicate which Python scalar
+ type is associated with the DType class (this is a *class* attribute that always
+ exists for any datatype and is not limited to array coercion).
+
+2. ``__discover_descr_from_pyobject__(cls, obj) -> dtype``: A classmethod that
+ returns the correct descriptor given the input object.
+ Note that only parametric DTypes have to implement this.
+ For nonparametric DTypes using the default instance will always be acceptable.
+
+The Python scalar type which is already associated with a DType through the
+``DType.type`` attribute maps from the DType to the Python scalar type.
+At registration time, a DType may choose to allow automatically discover for
+this Python scalar type.
+This requires a lookup in the opposite direction, which will be implemented
+using global a mapping (dictionary-like) of::
+
+ known_python_types[type] = DType
+
+Correct garbage collection requires additional care.
+If both the Python scalar type (``pytype``) and ``DType`` are created dynamically,
+they will potentially be deleted again.
+To allow this, it must be possible to make the above mapping weak.
+This requires that the ``pytype`` holds a reference of ``DType`` explicitly.
+Thus, in addition to building the global mapping, NumPy will store the ``DType`` as
+``pytype.__associated_array_dtype__`` in the Python type.
+This does *not* define the mapping and should *not* be accessed directly.
+In particular potential inheritance of the attribute does not mean that NumPy will use the
+superclasses ``DType`` automatically. A new ``DType`` must be created for the
+subclass.
+
+.. note::
+
+ Python integers do not have a clear/concrete NumPy type associated right
+ now. This is because during array coercion NumPy currently finds the first
+ type capable of representing their value in the list of `long`, `unsigned
+ long`, `int64`, `unsigned int64`, and `object` (on many machines `long` is
+ 64 bit).
+
+ Instead they will need to be implemented using an ``AbstractPyInt``. This
+ DType class can then provide ``__discover_descr_from_pyobject__`` and
+ return the actual dtype which is e.g. ``np.dtype("int64")``. For
+ dispatching/promotion in ufuncs, it will also be necessary to dynamically
+ create ``AbstractPyInt[value]`` classes (creation can be cached), so that
+ they can provide the current value based promotion functionality provided
+ by ``np.result_type(python_integer, array)`` [2]_ .
+
+To allow for a DType to accept inputs as scalars that are not basic Python
+types or instances of ``DType.type``, we use ``known_scalar_type`` method.
+This can allow discovery of a ``vector`` as a scalar (element) instead of a sequence
+(for the command ``np.array(vector, dtype=VectorDType)``) even when ``vector`` is itself a
+sequence or even an array subclass. This will *not* be public API initially,
+but may be made public at a later time.
+
+**Example:** The current datetime DType requires a
+``__discover_descr_from_pyobject__`` which returns the correct unit for string
+inputs. This allows it to support::
+
+ np.array(["2020-01-02", "2020-01-02 11:24"], dtype="M8")
+
+By inspecting the date strings. Together with the common dtype
+operation, this allows it to automatically find that the datetime64 unit
+should be "minutes".
+
+
+**NumPy internal implementation:** The implementation to find the correct dtype
+will work similar to the following pseudocode::
+
+ def find_dtype(array_like):
+ common_dtype = None
+ for element in array_like:
+ # default to object dtype, if unknown
+ DType = known_python_types.get(type(element), np.dtype[object])
+ dtype = DType.__discover_descr_from_pyobject__(element)
+
+ if common_dtype is None:
+ common_dtype = dtype
+ else:
+ common_dtype = np.promote_types(common_dtype, dtype)
+
+In practice, the input to ``np.array()`` is a mix of sequences and array-like
+objects, so that deciding what is an element requires to check whether it
+is a sequence.
+The full algorithm (without user provided dtypes) thus looks more like::
+
+ def find_dtype_recursive(array_like, dtype=None):
+ """
+ Recursively find the dtype for a nested sequences (arrays are not
+ supported here).
+ """
+ DType = known_python_types.get(type(element), None)
+
+ if DType is None and is_array_like(array_like):
+ # Code for a sequence, an array_like may have a DType we
+ # can use directly:
+ for element in array_like:
+ dtype = find_dtype_recursive(element, dtype=dtype)
+ return dtype
+
+ elif DType is None:
+ DType = np.dtype[object]
+
+ # dtype discovery and promotion as in `find_dtype` above
+
+If the user provides ``DType``, then this DType will be tried first, and the
+``dtype`` may need to be cast before the promotion is performed.
+
+**Limitations:** The motivational point 3. of a nested array
+``np.array([np.array(None, dtype=object)], dtype=np.String)`` is currently
+(sometimes) supported by inspecting all elements of the nested array.
+User DTypes will implicitly handle these correctly if the nested array
+is of ``object`` dtype.
+In some other cases NumPy will retain backward compatibility for existing
+functionality only.
+NumPy uses such functionality to allow code such as::
+
+ >>> np.array([np.array(["2020-05-05"], dtype="S")], dtype=np.datetime64)
+ array([['2020-05-05']], dtype='datetime64[D]')
+
+which discovers the datetime unit ``D`` (days).
+This possibility will not be accessible to user DTypes without an
+intermediate cast to ``object`` or a custom function.
+
+The use of a global type map means that an error or warning has to be given if
+two DTypes wish to map to the same Python type. In most cases user DTypes
+should only be implemented for types defined within the same library to avoid
+the potential for conflicts. It will be the DType implementor's responsibility
+to be careful about this and use avoid registration when in doubt.
+
+**Alternatives:**
+
+- Instead of a global mapping, we could rely on the scalar attribute
+ ``scalar.__associated_array_dtype__``. This only creates a difference in
+ behavior for subclasses, and the exact implementation can be undefined
+ initially. Scalars will be expected to derive from a NumPy scalar. In
+ principle NumPy could, for a time, still choose to rely on the attribute.
+
+- An earlier proposal for the ``dtype`` discovery algorithm used a two-pass
+ approach, first finding the correct ``DType`` class and only then
+ discovering the parametric ``dtype`` instance. It was rejected as
+ needlessly complex. But it would have enabled value-based promotion
+ in universal functions, allowing::
+
+ np.add(np.array([8], dtype="uint8"), [4])
+
+ to return a ``uint8`` result (instead of ``int16``), which currently happens for::
+
+ np.add(np.array([8], dtype="uint8"), 4)
+
+ (note the list ``[4]`` instead of scalar ``4``).
+ This is not a feature NumPy currently has or desires to support.
+
+**Further issues and discussion:** It is possible to create a DType
+such as Categorical, array, or vector which can only be used if ``dtype=DType``
+is provided. Such DTypes cannot roundtrip correctly. For example::
+
+ np.array(np.array(1, dtype=Categorical)[()])
+
+will result in an integer array. To get the original ``Categorical`` array
+``dtype=Categorical`` will need to be passed explicitly.
+This is a general limitation, but round-tripping is always possible if
+``dtype=original_arr.dtype`` is passed.
+
+
+.. _nep42_c-api:
+
+******************************************************************************
+Public C-API
+******************************************************************************
+
+DType creation
+==============================================================================
+
+To create a new DType the user will need to define the methods and attributes
+outlined in the `Usage and impact`_ section and detailed throughout this
+proposal.
+
+In addition, some methods similar to those in :c:type:`PyArray_ArrFuncs` will
+be needed for the slots struct below.
+
+As mentioned in :ref:`NEP 41 <NEP41>`, the interface to define this DType
+class in C is modeled after :PEP:`384`: Slots and some additional information
+will be passed in a slots struct and identified by ``ssize_t`` integers::
+
+ static struct PyArrayMethodDef slots[] = {
+ {NPY_dt_method, method_implementation},
+ ...,
+ {0, NULL}
+ }
+
+ typedef struct{
+ PyTypeObject *typeobj; /* type of python scalar or NULL */
+ int flags /* flags, including parametric and abstract */
+ /* NULL terminated CastingImpl; is copied and references are stolen */
+ CastingImpl *castingimpls[];
+ PyType_Slot *slots;
+ PyTypeObject *baseclass; /* Baseclass or NULL */
+ } PyArrayDTypeMeta_Spec;
+
+ PyObject* PyArray_InitDTypeMetaFromSpec(PyArrayDTypeMeta_Spec *dtype_spec);
+
+All of this is passed by copying.
+
+**TODO:** The DType author should be able to define new methods for the
+DType, up to defining a full object, and, in the future, possibly even
+extending the ``PyArrayDTypeMeta_Type`` struct. We have to decide what to make
+available initially. A solution may be to allow inheriting only from an
+existing class: ``class MyDType(np.dtype, MyBaseclass)``. If ``np.dtype`` is
+first in the method resolution order, this also prevents an undesirable
+override of slots like ``==``.
+
+The ``slots`` will be identified by names which are prefixed with ``NPY_dt_``
+and are:
+
+* ``is_canonical(self) -> {0, 1}``
+* ``ensure_canonical(self) -> dtype``
+* ``default_descr(self) -> dtype`` (return must be native and should normally be a singleton)
+* ``setitem(self, char *item_ptr, PyObject *value) -> {-1, 0}``
+* ``getitem(self, char *item_ptr, PyObject (base_obj) -> object or NULL``
+* ``discover_descr_from_pyobject(cls, PyObject) -> dtype or NULL``
+* ``common_dtype(cls, other) -> DType, NotImplemented, or NULL``
+* ``common_instance(self, other) -> dtype or NULL``
+
+Where possible, a default implementation will be provided if the slot is
+omitted or set to ``NULL``. Nonparametric dtypes do not have to implement:
+
+* ``discover_descr_from_pyobject`` (uses ``default_descr`` instead)
+* ``common_instance`` (uses ``default_descr`` instead)
+* ``ensure_canonical`` (uses ``default_descr`` instead).
+
+Sorting is expected to be implemented using:
+
+* ``get_sort_function(self, NPY_SORTKIND sort_kind) -> {out_sortfunction, NotImplemented, NULL}``.
+
+For convenience, it will be sufficient if the user implements only:
+
+* ``compare(self, char *item_ptr1, char *item_ptr2, int *res) -> {-1, 0, 1}``
+
+
+**Limitations:** The ``PyArrayDTypeMeta_Spec`` struct is clumsy to extend (for
+instance, by adding a version tag to the ``slots`` to indicate a new, longer
+version). We could use a function to provide the struct; it would require
+memory management but would allow ABI-compatible extension (the struct is
+freed again when the DType is created).
+
+
+CastingImpl
+==============================================================================
+
+The external API for ``CastingImpl`` will be limited initially to defining:
+
+* ``casting`` attribute, which can be one of the supported casting kinds.
+ This is the safest cast possible. For example, casting between two NumPy
+ strings is of course "safe" in general, but may be "same kind" in a specific
+ instance if the second string is shorter. If neither type is parametric the
+ ``resolve_descriptors`` must use it.
+
+* ``resolve_descriptors(dtypes_in[2], dtypes_out[2], casting_out) -> int {0,
+ -1}`` The out
+ dtypes must be set correctly to dtypes which the strided loop
+ (transfer function) can handle. Initially the result must have instances
+ of the same DType class as the ``CastingImpl`` is defined for. The
+ ``casting`` will be set to ``NPY_EQUIV_CASTING``, ``NPY_SAFE_CASTING``,
+ ``NPY_UNSAFE_CASTING``, or ``NPY_SAME_KIND_CASTING``.
+ A new, additional flag,
+ ``_NPY_CAST_IS_VIEW``, can be set to indicate that no cast is necessary and a
+ view is sufficient to perform the cast. The cast should return
+ ``-1`` when a custom error is set and ``NPY_NO_CASTING`` to indicate
+ that a generic casting error should be set (this is in most cases
+ preferable).
+
+* ``strided_loop(char **args, npy_intp *dimensions, npy_intp *strides,
+ ...) -> int {0, -1}`` (signature will be fully defined in :ref:`NEP 43 <NEP43>`)
+
+This is identical to the proposed API for ufuncs. The additional ``...``
+part of the signature will include information such as the two ``dtype``\s.
+More optimized loops are in use internally, and
+will be made available to users in the future (see notes).
+
+Although verbose, the API will mimic the one for creating a new DType:
+
+.. code-block:: C
+
+ typedef struct{
+ int flags; /* e.g. whether the cast requires the API */
+ int nin, nout; /* Number of Input and outputs (always 1) */
+ NPY_CASTING casting; /* The default casting level */
+ PyArray_DTypeMeta *dtypes; /* input and output DType class */
+ /* NULL terminated slots defining the methods */
+ PyType_Slot *slots;
+ } PyArrayMethod_Spec;
+
+The focus differs between casting and general ufuncs. For example, for casts
+``nin == nout == 1`` is always correct, while for ufuncs ``casting`` is
+expected to be usually `"safe"`.
+
+**Notes:** We may initially allow users to define only a single loop.
+Internally NumPy optimizes far more, and this should be made public
+incrementally in one of two ways:
+
+* Allow multiple versions, such as:
+
+ * contiguous inner loop
+ * strided inner loop
+ * scalar inner loop
+
+* Or, more likely, expose the ``get_loop`` function which is passed additional
+ information, such as the fixed strides (similar to our internal API).
+
+The example does not yet include setup and error handling. Since these are
+similar to the UFunc machinery, they will be defined in :ref:`NEP 43 <NEP43>` and then
+incorporated identically into casting.
+
+The slots/methods used will be prefixed with ``NPY_meth_``.
+
+
+**Alternatives:**
+
+- Aside from name changes and signature tweaks, there seem to be few
+ alternatives to the above structure. The proposed API using ``*_FromSpec``
+ function is a good way to achieve a stable and extensible API. The slots
+ design is extensible and can be changed without breaking binary
+ compatibility. Convenience functions can still be provided to allow creation
+ with less code.
+
+- One downside is that compilers cannot warn about function-pointer
+ incompatibilities.
+
+
+******************************************************************************
+Implementation
+******************************************************************************
+
+Steps for implementation are outlined in the Implementation section of
+:ref:`NEP 41 <NEP41>`. In brief, we first will rewrite the internals of
+casting and array coercion. After that, the new public API will be added
+incrementally. We plan to expose it in a preliminary state initially to gain
+experience. All functionality currently implemented on the dtypes will be
+replaced systematically as new features are added.
+
+
+******************************************************************************
+Alternatives
+******************************************************************************
+
+The space of possible implementations is large, so there have been many
+discussions, conceptions, and design documents. These are listed in
+:ref:`NEP 40 <NEP40>`. Alternatives were also been discussed in the
+relevant sections above.
+
+
+******************************************************************************
+References
+******************************************************************************
+
+.. [1] To be clear, the program is broken: It should not have stored a value
+ in the common DType that was below the lowest int16 or above the highest
+ uint16. It avoided overflow earlier by an accident of implementation.
+ Nonetheless, we insist that program behavior not be altered just by
+ importing a type.
+
+.. [2] NumPy currently inspects the value to allow the operations::
+
+ np.array([1], dtype=np.uint8) + 1
+ np.array([1.2], dtype=np.float32) + 1.
+
+ to return a ``uint8`` or ``float32`` array respectively. This is
+ further described in the documentation for :func:`numpy.result_type`.
+
+
+******************************************************************************
+Copyright
+******************************************************************************
+
+This document has been placed in the public domain.
diff --git a/doc/neps/nep-0043-extensible-ufuncs.rst b/doc/neps/nep-0043-extensible-ufuncs.rst
new file mode 100644
index 000000000..96d4794f3
--- /dev/null
+++ b/doc/neps/nep-0043-extensible-ufuncs.rst
@@ -0,0 +1,1309 @@
+.. _NEP43:
+
+==============================================================================
+NEP 43 — Enhancing the Extensibility of UFuncs
+==============================================================================
+
+:title: Enhancing the Extensibility of UFuncs
+:Author: Sebastian Berg
+:Status: Draft
+:Type: Standard
+:Created: 2020-06-20
+
+
+.. note::
+
+ This NEP is fourth in a series:
+
+ - :ref:`NEP 40 <NEP40>` explains the shortcomings of NumPy's dtype implementation.
+
+ - :ref:`NEP 41 <NEP41>` gives an overview of our proposed replacement.
+
+ - :ref:`NEP 42 <NEP42>` describes the new design's datatype-related APIs.
+
+ - NEP 43 (this document) describes the new design's API for universal functions.
+
+
+******************************************************************************
+Abstract
+******************************************************************************
+
+The previous NEP 42 proposes the creation of new DTypes which can
+be defined by users outside of NumPy itself.
+The implementation of NEP 42 will enable users to create arrays with a custom dtype
+and stored values.
+This NEP outlines how NumPy will operate on arrays with custom dtypes in the future.
+The most important functions operating on NumPy arrays are the so called
+"universal functions" (ufunc) which include all math functions, such as
+``np.add``, ``np.multiply``, and even ``np.matmul``.
+These ufuncs must operate efficiently on multiple arrays with
+different datatypes.
+
+This NEP proposes to expand the design of ufuncs.
+It makes a new distinction between the ufunc which can operate
+on many different dtypes such as floats or integers,
+and a new ``ArrayMethod`` which defines the efficient operation for
+specific dtypes.
+
+.. note::
+
+ Details of the private and external APIs may change to reflect user
+ comments and implementation constraints. The underlying principles and
+ choices should not change significantly.
+
+
+******************************************************************************
+Motivation and scope
+******************************************************************************
+
+The goal of this NEP is to extend universal
+functions support the new DType system detailed in NEPs 41 and 42.
+While the main motivation is enabling new user-defined DTypes, this will
+also significantly simplify defining universal functions for NumPy strings or
+structured DTypes.
+Until now, these DTypes are not supported by any of NumPy's functions
+(such as ``np.add`` or ``np.equal``), due to difficulties arising from
+their parametric nature (compare NEP 41 and 42), e.g. the string length.
+
+Functions on arrays must handle a number of distinct steps which are
+described in more detail in section "`Steps involved in a UFunc call`_".
+The most important ones are:
+
+- Organizing all functionality required to define a ufunc call for specific
+ DTypes. This is often called the "inner-loop".
+- Deal with input for which no exact matching implementation is found.
+ For example when ``int32`` and ``float64`` are added, the ``int32``
+ is cast to ``float64``. This requires a distinct "promotion" step.
+
+After organizing and defining these, we need to:
+
+- Define the user API for customizing both of the above points.
+- Allow convenient reuse of existing functionality.
+ For example a DType representing physical units, such as meters,
+ should be able to fall back to NumPy's existing math implementations.
+
+This NEP details how these requirements will be achieved in NumPy:
+
+- All DTyper-specific functionality currently part of the ufunc
+ definition will be defined as part of a new `ArrayMethod`_ object.
+ This ``ArrayMethod`` object will be the new, preferred, way to describe any
+ function operating on arrays.
+
+- Ufuncs will dispatch to the ``ArrayMethod`` and potentially use promotion
+ to find the correct ``ArrayMethod`` to use.
+ This will be described in the `Promotion and dispatching`_ section.
+
+A new C-API will be outlined in each section. A future Python API is
+expected to be very similar and the C-API is presented in terms of Python
+code for readability.
+
+The NEP proposes a large, but necessary, refactor of the NumPy ufunc internals.
+This modernization will not affect end users directly and is not only a necessary
+step for new DTypes, but in itself a maintenance effort which is expected to
+help with future improvements to the ufunc machinery.
+
+While the most important restructure proposed is the new ``ArrayMethod``
+object, the largest long-term consideration is the API choice for
+promotion and dispatching.
+
+
+***********************
+Backwards Compatibility
+***********************
+
+The general backwards compatibility issues have also been listed
+previously in NEP 41.
+
+The vast majority of users should not see any changes beyond those typical
+for NumPy releases.
+There are three main users or use-cases impacted by the proposed changes:
+
+1. The Numba package uses direct access to the NumPy C-loops and modifies
+ the NumPy ufunc struct directly for its own purposes.
+2. Astropy uses its own "type resolver", meaning that a default switch over
+ from the existing type resolution to a new default Promoter requires care.
+3. It is currently possible to register loops for dtype *instances*.
+ This is theoretically useful for structured dtypes and is a resolution
+ step happening *after* the DType resolution step proposed here.
+
+This NEP will try hard to maintain backward compatibility as much as
+possible. However, both of these projects have signaled willingness to adapt
+to breaking changes.
+
+The main reason why NumPy will be able to provide backward compatibility
+is that:
+
+* Existing inner-loops can be wrapped, adding an indirection to the call but
+ maintaining full backwards compatibility.
+ The ``get_loop`` function can, in this case, search the existing
+ inner-loop functions (which are stored on the ufunc directly) in order
+ to maintain full compatibility even with potential direct structure access.
+* Legacy type resolvers can be called as a fallback (potentially caching
+ the result). The resolver may need to be called twice (once for the DType
+ resolution and once for the ``resolve_descriptor`` implementation).
+* The fallback to the legacy type resolver should in most cases handle loops
+ defined for such structured dtype instances. This is because if there is no
+ other ``np.Void`` implementation, the legacy fallback will retain the old
+ behaviour at least initially.
+
+The masked type resolvers specifically will *not* remain supported, but
+has no known users (including NumPy itself, which only uses the default
+version).
+
+While the above changes potentially break some workflows,
+we believe that the long-term improvements vastly outweigh this.
+Further, packages such as astropy and Numba are capable of adapting so that
+end-users may need to update their libraries but not their code.
+
+
+******************************************************************************
+Usage and impact
+******************************************************************************
+
+This NEP restructures how operations on NumPy arrays are defined both
+within NumPy and for external implementers.
+The NEP mainly concerns those who either extend ufuncs for custom DTypes
+or create custom ufuncs. It does not aim to finalize all
+potential use-cases, but rather restructure NumPy to be extensible and allow
+addressing new issues or feature requests as they arise.
+
+
+Overview and end user API
+=========================
+
+To give an overview of how this NEP proposes to structure ufuncs,
+the following describes the potential exposure of the proposed restructure
+to the end user.
+
+Universal functions are much like a Python method defined on the DType of
+the array when considering a ufunc with only a single input::
+
+ res = np.positive(arr)
+
+could be implemented (conceptually) as::
+
+ positive_impl = arr.dtype.positive
+ res = positive_impl(arr)
+
+However, unlike methods, ``positive_impl`` is not stored on the dtype itself.
+It is rather the implementation of ``np.positive`` for a specific DType.
+Current NumPy partially exposes this "choice of implementation" using
+the ``dtype`` (or more exact ``signature``) attribute in universal functions,
+although these are rarely used::
+
+ np.positive(arr, dtype=np.float64)
+
+forces NumPy to use the ``positive_impl`` written specifically for the Float64
+DType.
+
+This NEP makes the distinction more explicit, by creating a new object to
+represent ``positive_impl``::
+
+ positive_impl = np.positive.resolve_impl((type(arr.dtype), None))
+ # The `None` represents the output DType which is automatically chosen.
+
+While the creation of a ``positive_impl`` object and the ``resolve_impl``
+method is part of this NEP, the following code::
+
+ res = positive_impl(arr)
+
+may not be implemented initially and is not central to the redesign.
+
+In general NumPy universal functions can take many inputs.
+This requires looking up the implementation by considering all of them
+and makes ufuncs "multi-methods" with respect to the input DTypes::
+
+ add_impl = np.add.resolve_impl((type(arr1.dtype), type(arr2.dtype), None))
+
+This NEP defines how ``positive_impl`` and ``add_impl`` will be represented
+as a new ``ArrayMethod`` which can be implemented outside of NumPy.
+Further, it defines how ``resolve_impl`` will implement and solve dispatching
+and promotion.
+
+The reasons for this split may be more clear after reviewing the
+`Steps involved in a UFunc call`_ section.
+
+
+Defining a new ufunc implementation
+===================================
+
+The following is a mock-up of how a new implementation, in this case
+to define string equality, will be added to a ufunc.
+
+.. code-block:: python
+
+ class StringEquality(BoundArrayMethod):
+ nin = 1
+ nout = 1
+ DTypes = (String, String, Bool)
+
+ def resolve_descriptors(context, given_descrs):
+ """The strided loop supports all input string dtype instances
+ and always returns a boolean. (String is always native byte order.)
+
+ Defining this function is not necessary, since NumPy can provide
+ it by default.
+ """
+ assert isinstance(given_descrs[0], context.DTypes[0])
+ assert isinstance(given_descrs[1], context.DTypes[1])
+
+ # The operation is always "safe" casting (most ufuncs are)
+ return (given_descrs[0], given_descrs[1], context.DTypes[2]()), "safe"
+
+ def strided_loop(context, dimensions, data, strides, innerloop_data):
+ """The 1-D strided loop, similar to those used in current ufuncs"""
+ # dimensions: Number of loop items and core dimensions
+ # data: Pointers to the array data.
+ # strides: strides to iterate all elements
+ n = dimensions[0] # number of items to loop over
+ num_chars1 = context.descriptors[0].itemsize
+ num_chars2 = context.descriptors[1].itemsize
+
+ # C code using the above information to compare the strings in
+ # both arrays. In particular, this loop requires the `num_chars1`
+ # and `num_chars2`. Information which is currently not easily
+ # available.
+
+ np.equal.register_impl(StringEquality)
+ del StringEquality # may be deleted.
+
+
+This definition will be sufficient to create a new loop, and the
+structure allows for expansion in the future; something that is already
+required to implement casting within NumPy itself.
+We use ``BoundArrayMethod`` and a ``context`` structure here. These
+are described and motivated in details later. Briefly:
+
+* ``context`` is a generalization of the ``self`` that Python passes to its
+ methods.
+* ``BoundArrayMethod`` is equivalent to the Python distinction that
+ ``class.method`` is a method, while ``class().method`` returns a "bound" method.
+
+
+Customizing Dispatching and Promotion
+=====================================
+
+Finding the correct implementation when ``np.positive.resolve_impl()`` is
+called is largely an implementation detail.
+But, in some cases it may be necessary to influence this process when no
+implementation matches the requested DTypes exactly:
+
+.. code-block:: python
+
+ np.multiple.resolve_impl((Timedelta64, Int8, None))
+
+will not have an exact match, because NumPy only has an implementation for
+multiplying ``Timedelta64`` with ``Int64``.
+In simple cases, NumPy will use a default promotion step to attempt to find
+the correct implementation, but to implement the above step, we will allow
+the following:
+
+.. code-block:: python
+
+ def promote_timedelta_integer(ufunc, dtypes):
+ new_dtypes = (Timdelta64, Int64, dtypes[-1])
+ # Resolve again, using Int64:
+ return ufunc.resolve_impl(new_dtypes)
+
+ np.multiple.register_promoter(
+ (Timedelta64, Integer, None), promote_timedelta_integer)
+
+Where ``Integer`` is an abstract DType (compare NEP 42).
+
+
+.. _steps_of_a_ufunc_call:
+
+****************************************************************************
+Steps involved in a UFunc call
+****************************************************************************
+
+Before going into more detailed API choices, it is helpful to review the
+steps involved in a call to a universal function in NumPy.
+
+A UFunc call is split into the following steps:
+
+1. *Handle ``__array_ufunc__`` protocol:*
+
+ * For array-likes such as a Dask arrays, NumPy can defer the operation.
+ This step is performed first, and unaffected by this NEP (compare :ref:`NEP18`).
+
+2. *Promotion and dispatching*
+
+ * Given the DTypes of all inputs, find the correct implementation.
+ E.g. an implementation for ``float64``, ``int64`` or a user-defined DType.
+
+ * When no exact implementation exists, *promotion* has to be performed.
+ For example, adding a ``float32`` and a ``float64`` is implemented by
+ first casting the ``float32`` to ``float64``.
+
+3. *Parametric ``dtype`` resolution:*
+
+ * In general, whenever an output DType is parametric the parameters have
+ to be found (resolved).
+ * For example, if a loop adds two strings, it is necessary to define the
+ correct output (and possibly input) dtypes. ``S5 + S4 -> S9``, while
+ an ``upper`` function has the signature ``S5 -> S5``.
+ * When they are not parametric, a default implementation is provided
+ which fills in the default dtype instances (ensuring for example native
+ byte order).
+
+4. *Preparing the iteration:*
+
+ * This step is largely handled by ``NpyIter`` internally (the iterator).
+ * Allocate all outputs and temporary buffers necessary to perform casts.
+ * Find the best iteration order, which includes information to efficiently
+ implement broadcasting. For example, adding a single value to an array
+ repeats the same value.
+
+5. *Setup and fetch the C-level function:*
+
+ * If necessary, allocate temporary working space.
+ * Find the C-implemented, light weight, inner-loop function.
+ Finding the inner-loop function can allow specialized implementations
+ in the future.
+ For example casting currently optimizes contiguous casts and
+ reductions have optimizations that are currently handled
+ inside the inner-loop function itself.
+ * Signal whether the inner-loop requires the Python API or whether
+ the GIL may be released (to allow threading).
+ * Clear floating point exception flags.
+
+6. *Perform the actual calculation:*
+
+ * Run the DType specific inner-loop function.
+ * The inner-loop may require access to additional data, such as dtypes or
+ additional data set in the previous step.
+ * The inner-loop function may be called an undefined number of times.
+
+7. *Finalize:*
+
+ * Free any temporary working space allocated in 5.
+ * Check for floating point exception flags.
+ * Return the result.
+
+The ``ArrayMethod`` provides a concept to group steps 3 to 6 and partially 7.
+However, implementers of a new ufunc or ``ArrayMethod`` do not need to
+customize the behaviour in steps 4 or 6, aside from the inner-loop function.
+For the ``ArrayMethod`` implementer, the central steps to have control over
+are step 3 and step 5 to provide the custom inner-loop function.
+Further customization is a potential future extension.
+
+Step 2. is promotion and dispatching which will also be restructured
+with new API which allows influencing the process where necessary.
+
+Step 1 is listed for completeness and is unaffected by this NEP.
+
+The following sketch provides an overview of step 2 to 6 with an emphasize
+of how dtypes are handled:
+
+.. figure:: _static/nep43-sketch.svg
+ :figclass: align-center
+
+
+*****************************************************************************
+ArrayMethod
+*****************************************************************************
+
+A central proposal of this NEP is the creation of the ``ArrayMethod`` as an object
+describing each implementation specific to a given set of DTypes.
+We use the ``class`` syntax to describe the information required to create
+a new ``ArrayMethod`` object:
+
+.. code-block:: python
+ :dedent: 0
+
+ class ArrayMethod:
+ name: str # Name, mainly useful for debugging
+
+ # Casting safety information (almost always "safe", necessary to
+ # unify casting and universal functions)
+ casting: Casting = "safe"
+
+ # More general flags:
+ flags: int
+
+ @staticmethod
+ def resolve_descriptors(
+ Context: context, Tuple[DType]: given_descrs)-> Casting, Tuple[DType]:
+ """Returns the safety of the operation (casting safety) and the
+ """
+ # A default implementation can be provided for non-parametric
+ # output dtypes.
+ raise NotImplementedError
+
+ @staticmethod
+ def get_loop(Context : context, strides, ...) -> strided_loop_function, flags:
+ """Returns the low-level C (strided inner-loop) function which
+ performs the actual operation.
+
+ This method may initially private, users will be able to provide
+ a set of optimized inner-loop functions instead:
+
+ * `strided_inner_loop`
+ * `contiguous_inner_loop`
+ * `unaligned_strided_loop`
+ * ...
+ """
+ raise NotImplementedError
+
+ @staticmethod
+ def strided_inner_loop(
+ Context : context, data, dimensions, strides, innerloop_data):
+ """The inner-loop (equivalent to the current ufunc loop)
+ which is returned by the default `get_loop()` implementation."""
+ raise NotImplementedError
+
+With ``Context`` providing mostly static information about the function call:
+
+.. code-block:: python
+ :dedent: 0
+
+ class Context:
+ # The ArrayMethod object itself:
+ ArrayMethod : method
+
+ # Information about the caller, e.g. the ufunc, such as `np.add`:
+ callable : caller = None
+ # The number of input arguments:
+ int : nin = 1
+ # The number of output arguments:
+ int : nout = 1
+ # The DTypes this Method operates on/is defined for:
+ Tuple[DTypeMeta] : dtypes
+ # The actual dtypes instances the inner-loop operates on:
+ Tuple[DType] : descriptors
+
+ # Any additional information required. In the future, this will
+ # generalize or duplicate things currently stored on the ufunc:
+ # - The ufunc signature of generalized ufuncs
+ # - The identity used for reductions
+
+And ``flags`` stored properties, for whether:
+
+* the ``ArrayMethod`` supports unaligned input and output arrays
+* the inner-loop function requires the Python API (GIL)
+* NumPy has to check the floating point error CPU flags.
+
+*Note: More information is expected to be added as necessary.*
+
+
+The call ``Context``
+====================
+
+The "context" object is analogous to Python's ``self`` that is
+passed to all methods.
+To understand why the "context" object is necessary and its
+internal structure, it is helpful to remember
+that a Python method can be written in the following way
+(see also the `documentation of __get__
+<https://docs.python.org/3.8/reference/datamodel.html#object.__get__>`_):
+
+.. code-block:: python
+
+ class BoundMethod:
+ def __init__(self, instance, method):
+ self.instance = instance
+ self.method = method
+
+ def __call__(self, *args, **kwargs):
+ return self.method.function(self.instance, *args, **kwargs)
+
+
+ class Method:
+ def __init__(self, function):
+ self.function = function
+
+ def __get__(self, instance, owner=None):
+ assert instance is not None # unsupported here
+ return BoundMethod(instance, self)
+
+
+With which the following ``method1`` and ``method2`` below, behave identically:
+
+.. code-block:: python
+
+ def function(self):
+ print(self)
+
+ class MyClass:
+ def method1(self):
+ print(self)
+
+ method2 = Method(function)
+
+And both will print the same result:
+
+.. code-block:: python
+
+ >>> myinstance = MyClass()
+ >>> myinstance.method1()
+ <__main__.MyClass object at 0x7eff65436d00>
+ >>> myinstance.method2()
+ <__main__.MyClass object at 0x7eff65436d00>
+
+Here ``self.instance`` would be all information passed on by ``Context``.
+The ``Context`` is a generalization and has to pass additional information:
+
+* Unlike a method which operates on a single class instance, the ``ArrayMethod``
+ operates on many input arrays and thus multiple dtypes.
+* The ``__call__`` of the ``BoundMethod`` above contains only a single call
+ to a function. But an ``ArrayMethod`` has to call ``resolve_descriptors``
+ and later pass on that information to the inner-loop function.
+* A Python function has no state except that defined by its outer scope.
+ Within C, ``Context`` is able to provide additional state if necessary.
+
+Just as Python requires the distinction of a method and a bound method,
+NumPy will have a ``BoundArrayMethod``.
+This stores all of the constant information that is part of the ``Context``,
+such as:
+
+* the ``DTypes``
+* the number of input and ouput arguments
+* the ufunc signature (specific to generalized ufuncs, compare :ref:`NEP20`).
+
+Fortunately, most users and even ufunc implementers will not have to worry
+about these internal details; just like few Python users need to know
+about the ``__get__`` dunder method.
+The ``Context`` object or C-structure provides all necessary data to the
+fast C-functions and NumPy API creates the new ``ArrayMethod`` or
+``BoundArrayMethod`` as required.
+
+
+.. _ArrayMethod_specs:
+
+ArrayMethod Specifications
+==========================
+
+.. highlight:: c
+
+These specifications provide a minimal initial C-API, which shall be expanded
+in the future, for example to allow specialized inner-loops.
+
+Briefly, NumPy currently relies on strided inner-loops and this
+will be the only allowed method of defining a ufunc initially.
+We expect the addition of a ``setup`` function or exposure of ``get_loop``
+in the future.
+
+UFuncs require the same information as casting, giving the following
+definitions (see also :ref:`NEP 42 <NEP42>` ``CastingImpl``):
+
+* A new structure to be passed to the resolve function and inner-loop::
+
+ typedef struct {
+ PyObject *caller; /* The ufunc object */
+ PyArrayMethodObject *method;
+
+ int nin, nout;
+
+ PyArray_DTypeMeta **dtypes;
+ /* Operand descriptors, filled in by resolve_desciptors */
+ PyArray_Descr **descriptors;
+
+ void *reserved; // For Potential in threading (Interpreter state)
+ } PyArrayMethod_Context
+
+ This structure may be appended to include additional information in future
+ versions of NumPy and includes all constant loop metadata.
+
+ We could version this structure, although it may be simpler to version
+ the ``ArrayMethod`` itself.
+
+* Similar to casting, ufuncs may need to find the correct loop dtype
+ or indicate that a loop is only capable of handling certain instances of
+ the involved DTypes (e.g. only native byteorder). This is handled by
+ a ``resolve_descriptors`` function (identical to the ``resolve_descriptors``
+ of ``CastingImpl``)::
+
+ NPY_CASTING
+ resolve_descriptors(
+ PyArrayMethod_Context *context,
+ PyArray_Descr *given_dtypes[nin+nout],
+ PyArray_Descr *loop_dtypes[nin+nout]);
+
+ The function fills ``loop_dtypes`` based on the given ``given_dtypes``.
+ This requires filling in the descriptor of the output(s).
+ Often also the input descriptor(s) have to be found, e.g. to ensure native
+ byteorder when needed by the inner-loop.
+
+ In most cases an ``ArrayMethod`` will have non-parametric output DTypes
+ so that a default implementation can be provided.
+
+* An additional ``void *user_data`` will usually be typed to extend
+ the existing ``NpyAuxData *`` struct::
+
+ struct {
+ NpyAuxData_FreeFunc *free;
+ NpyAuxData_CloneFunc *clone;
+ /* To allow for a bit of expansion without breaking the ABI */
+ void *reserved[2];
+ } NpyAuxData;
+
+ This struct is currently mainly used for the NumPy internal casting
+ machinery and as of now both ``free`` and ``clone`` must be provided,
+ although this could be relaxed.
+
+ Unlike NumPy casts, the vast majority of ufuncs currently do not require
+ this additional scratch-space, but may need simple flagging capability
+ for example for implementing warnings (see Error and Warning Handling below).
+ To simplify this NumPy will pass a single zero initialized ``npy_intp *``
+ when ``user_data`` is not set.
+ *NOTE that it would be possible to pass this as part of ``Context``.*
+
+* The optional ``get_loop`` function will not be public initially, to avoid
+ finalizing the API which requires design choices also with casting:
+
+ .. code-block::
+
+ innerloop *
+ get_loop(
+ PyArrayMethod_Context *context,
+ /* (move_references is currently used internally for casting) */
+ int aligned, int move_references,
+ npy_intp *strides,
+ PyArray_StridedUnaryOp **out_loop,
+ NpyAuxData **innerloop_data,
+ NPY_ARRAYMETHOD_FLAGS *flags);
+
+ The ``NPY_ARRAYMETHOD_FLAGS`` can indicate whether the Python API is required
+ and floating point errors must be checked.
+
+* The inner-loop function::
+
+ int inner_loop(PyArrayMethod_Context *context, ..., void *innerloop_data);
+
+ Will have the identical signature to current inner-loops with the following
+ changes:
+
+ * A return value to indicate an error when returning ``-1`` instead of ``0``.
+ When returning ``-1`` a Python error must be set.
+ * The new first argument ``PyArrayMethod_Context *`` is used to pass in
+ potentially required information about the ufunc or descriptors in a
+ convenient way.
+ * The ``void *innerloop_data`` will be the ``NpyAuxData **innerloop_data`` as set by
+ ``get_loop``. If ``get_loop`` does not set ``innerloop_data`` an ``npy_intp *``
+ is passed instead (see `Error Handling`_ below for the motivation).
+
+ *Note:* Since ``get_loop`` is expected to be private, the exact implementation
+ of ``innerloop_data`` can be modified until final exposure.
+
+Creation of a new ``BoundArrayMethod`` will use a ``PyArrayMethod_FromSpec()``
+function. A shorthand will allow direct registration to a ufunc using
+``PyUFunc_AddImplementationFromSpec()``. The specification is expected
+to contain the following (this may extend in the future)::
+
+ typedef struct {
+ const char *name; /* Generic name, mainly for debugging */
+ int nin, nout;
+ NPY_CASTING casting;
+ NPY_ARRAYMETHOD_FLAGS flags;
+ PyArray_DTypeMeta **dtypes;
+ PyType_Slot *slots;
+ } PyArrayMethod_Spec;
+
+.. highlight:: python
+
+Discussion and alternatives
+===========================
+
+The above split into an ``ArrayMethod`` and ``Context`` and the additional
+requirement of a ``BoundArrayMethod`` is a necessary split mirroring the
+implementation of methods and bound methods in Python.
+
+One reason for this requirement is that it allows storing the ``ArrayMethod``
+object in many cases without holding references to the ``DTypes`` which may
+be important if DTypes are created (and deleted) dynamically.
+(This is a complex topic, which does not have a complete solution in current
+Python, but the approach solves the issue with respect to casting.)
+
+There seem to be no alternatives to this structure. Separating the
+DType-specific steps from the general ufunc dispatching and promotion is
+absolutely necessary to allow future extension and flexibility.
+Furthermore, it allows unifying casting and ufuncs.
+
+Since the structure of ``ArrayMethod`` and ``BoundArrayMethod`` will be
+opaque and can be extended, there are few long-term design implications aside
+from the choice of making them Python objects.
+
+
+``resolve_descriptors``
+-----------------------
+
+The ``resolve_descriptors`` method is possibly the main innovation of this
+NEP and it is central also in the implementation of casting in NEP 42.
+
+By ensuring that every ``ArrayMethod`` provides ``resolve_descriptors`` we
+define a unified, clear API for step 3 in `Steps involved in a UFunc call`_.
+This step is required to allocate output arrays and has to happen before
+casting can be prepared.
+
+While the returned casting-safety (``NPY_CASTING``) will almost always be
+"safe" for universal functions, including it has two big advantages:
+
+* Returning the casting safety is central to NEP 42 for casting and
+ allows the unmodified use of ``ArrayMethod`` there.
+* There may be a future desire to implement fast but unsafe implementations.
+ For example for ``int64 + int64 -> int32`` which is unsafe from a casting
+ perspective. Currently, this would use ``int64 + int64 -> int64`` and then
+ cast to ``int32``. An implementation that skips the cast would
+ have to signal that it effectively includes the "same-kind" cast and is
+ thus not considered "safe".
+
+
+``get_loop`` method
+-------------------
+
+Currently, NumPy ufuncs typically only provide a single strided loop, so that
+the ``get_loop`` method may seem unnecessary.
+For this reason we plan for ``get_loop`` to be a private function initially.
+
+However, ``get_loop`` is required for casting where specialized loops are
+used even beyond strided and contiguous loops.
+Thus, the ``get_loop`` function must be a full replacement for
+the internal ``PyArray_GetDTypeTransferFunction``.
+
+In the future, ``get_loop`` may be made public or a new ``setup`` function
+be exposed to allow more control, for example to allow allocating
+working memory.
+Further, we could expand ``get_loop`` and allow the ``ArrayMethod`` implementer
+to also control the outer iteration and not only the 1-D inner-loop.
+
+
+Extending the inner-loop signature
+----------------------------------
+
+Extending the inner-loop signature is another central and necessary part of
+the NEP.
+
+**Passing in the ``Context``:**
+
+Passing in the ``Context`` potentially allows for the future extension of
+the signature by adding new fields to the context struct.
+Furthermore it provides direct access to the dtype instances which
+the inner-loop operates on.
+This is necessary information for parametric dtypes since for example comparing
+two strings requires knowing the length of both strings.
+The ``Context`` can also hold potentially useful information such as the
+the original ``ufunc``, which can be helpful when reporting errors.
+
+In principle passing in Context is not necessary, as all information could be
+included in ``innerloop_data`` and set up in the ``get_loop`` function.
+In this NEP we propose passing the struct to simplify creation of loops for
+parametric DTypes.
+
+**Passing in user data:**
+
+The current casting implementation uses the existing ``NpyAuxData *`` to pass
+in additional data as defined by ``get_loop``.
+There are certainly alternatives to the use of this structure, but it
+provides a simple solution, which is already used in NumPy and public API.
+
+``NpyAyxData *`` is a light weight, allocated structure and since it already
+exists in NumPy for this purpose, it seems a natural choice.
+To simplify some use-cases (see "Error Handling" below), we will pass a
+``npy_intp *innerloop_data = 0`` instead when ``innerloop_data`` is not provided.
+
+*Note: Since ``get_loop`` is expected to be private initially we can gain
+experience with ``innerloop_data`` before exposing it as public API.*
+
+**Return value:**
+
+The return value to indicate an error is an important, but currently missing
+feature in NumPy. The error handling is further complicated by the way
+CPUs signal floating point errors.
+Both are discussed in the next section.
+
+Error Handling
+""""""""""""""
+
+.. highlight:: c
+
+We expect that future inner-loops will generally set Python errors as soon
+as an error is found. This is complicated when the inner-loop is run without
+locking the GIL. In this case the function will have to lock the GIL,
+set the Python error and return ``-1`` to indicate an error occurred:::
+
+ int
+ inner_loop(PyArrayMethod_Context *context, ..., void *innerloop_data)
+ {
+ NPY_ALLOW_C_API_DEF
+
+ for (npy_intp i = 0; i < N; i++) {
+ /* calculation */
+
+ if (error_occurred) {
+ NPY_ALLOW_C_API;
+ PyErr_SetString(PyExc_ValueError,
+ "Error occurred inside inner_loop.");
+ NPY_DISABLE_C_API
+ return -1;
+ }
+ }
+ return 0;
+ }
+
+Floating point errors are special, since they require checking the hardware
+state which is too expensive if done within the inner-loop function itself.
+Thus, NumPy will handle these if flagged by the ``ArrayMethod``.
+An ``ArrayMethod`` should never cause floating point error flags to be set
+if it flags that these should not be checked. This could interfere when
+calling multiple functions; in particular when casting is necessary.
+
+An alternative solution would be to allow setting the error only at the later
+finalization step when NumPy will also check the floating point error flags.
+
+We decided against this pattern at this time. It seems more complex and
+generally unnecessary.
+While safely grabbing the GIL in the loop may require passing in an additional
+``PyThreadState`` or ``PyInterpreterState`` in the future (for subinterpreter
+support), this is acceptable and can be anticipated.
+Setting the error at a later point would add complexity: for instance
+if an operation is paused (which can currently happen for casting in particular),
+the error check needs to run explicitly ever time this happens.
+
+We expect that setting errors immediately is the easiest and most convenient
+solution and more complex solution may be possible future extensions.
+
+Handling *warnings* is slightly more complex: A warning should be
+given exactly once for each function call (i.e. for the whole array) even
+if naively it would be given many times.
+To simplify such a use case, we will pass in ``npy_intp *innerloop_data = 0``
+by default which can be used to store flags (or other simple persistent data).
+For instance, we could imagine an integer multiplication loop which warns
+when an overflow occurred::
+
+ int
+ integer_multiply(PyArrayMethod_Context *context, ..., npy_intp *innerloop_data)
+ {
+ int overflow;
+ NPY_ALLOW_C_API_DEF
+
+ for (npy_intp i = 0; i < N; i++) {
+ *out = multiply_integers(*in1, *in2, &overflow);
+
+ if (overflow && !*innerloop_data) {
+ NPY_ALLOW_C_API;
+ if (PyErr_Warn(PyExc_UserWarning,
+ "Integer overflow detected.") < 0) {
+ NPY_DISABLE_C_API
+ return -1;
+ }
+ *innerloop_data = 1;
+ NPY_DISABLE_C_API
+ }
+ return 0;
+ }
+
+*TODO:* The idea of passing an ``npy_intp`` scratch space when ``innerloop_data``
+is not set seems convenient, but I am uncertain about it, since I am not
+aware of any similar prior art. This "scratch space" could also be part of
+the ``context`` in principle.
+
+.. highlight:: python
+
+Reusing existing Loops/Implementations
+======================================
+
+For many DTypes the above definition for adding additional C-level loops will be
+sufficient and require no more than a single strided loop implementation
+and if the loop works with parametric DTypes, the
+``resolve_descriptors`` function *must* additionally be provided.
+
+However, in some use-cases it is desirable to call back to an existing implementation.
+In Python, this could be achieved by simply calling into the original ufunc.
+
+For better performance in C, and for large arrays, it is desirable to reuse
+an existing ``ArrayMethod`` as directly as possible, so that its inner-loop function
+can be used directly without additional overhead.
+We will thus allow to create a new, wrapping, ``ArrayMethod`` from an existing
+``ArrayMethod``.
+
+This wrapped ``ArrayMethod`` will have two additional methods:
+
+* ``view_inputs(Tuple[DType]: input_descr) -> Tuple[DType]`` replacing the
+ user input descriptors with descriptors matching the wrapped loop.
+ It must be possible to *view* the inputs as the output.
+ For example for ``Unit[Float64]("m") + Unit[Float32]("km")`` this will
+ return ``float64 + int32``. The original ``resolve_descriptors`` will
+ convert this to ``float64 + float64``.
+
+* ``wrap_outputs(Tuple[DType]: input_descr) -> Tuple[DType]`` replacing the
+ resolved descriptors with with the desired actual loop descriptors.
+ The original ``resolve_descriptors`` function will be called between these
+ two calls, so that the output descriptors may not be set in the first call.
+ In the above example it will use the ``float64`` as returned (which might
+ have changed the byte-order), and further resolve the physical unit making
+ the final signature::
+
+ ``Unit[Float64]("m") + Unit[Float64]("m") -> Unit[Float64]("m")``
+
+ the UFunc machinery will take care of casting the "km" input to "m".
+
+
+The ``view_inputs`` method allows passing the correct inputs into the
+original ``resolve_descriptors`` function, while ``wrap_outputs`` ensures
+the correct descriptors are used for output allocation and input buffering casts.
+
+An important use-case for this is that of an abstract Unit DType
+with subclasses for each numeric dtype (which could be dynamically created)::
+
+ Unit[Float64]("m")
+ # with Unit[Float64] being the concrete DType:
+ isinstance(Unit[Float64], Unit) # is True
+
+Such a ``Unit[Float64]("m")`` instance has a well-defined signature with
+respect to type promotion.
+The author of the ``Unit`` DType can implement most necessary logic by
+wrapping the existing math functions and using the two additional methods
+above.
+Using the *promotion* step, this will allow to create a register a single
+promoter for the abstract ``Unit`` DType with the ``ufunc``.
+The promoter can then add the wrapped concrete ``ArrayMethod`` dynamically
+at promotion time, and NumPy can cache (or store it) after the first call.
+
+**Alternative use-case:**
+
+A different use-case is that of a ``Unit(float64, "m")`` DType, where
+the numerical type is part of the DType parameter.
+This approach is possible, but will require a custom ``ArrayMethod``
+which wraps existing loops.
+It must also always require require two steps of dispatching
+(one to the ``Unit`` DType and a second one for the numerical type).
+
+Furthermore, the efficient implementation will require the ability to
+fetch and reuse the inner-loop function from another ``ArrayMethod``.
+(Which is probably necessary for users like Numba, but it is uncertain
+whether it should be a common pattern and it cannot be accessible from
+Python itself.)
+
+
+.. _promotion_and_dispatching:
+
+*************************
+Promotion and dispatching
+*************************
+
+NumPy ufuncs are multi-methods in the sense that they operate on (or with)
+multiple DTypes at once.
+While the input (and output) dtypes are attached to NumPy arrays,
+the ``ndarray`` type itself does not carry the information of which
+function to apply to the data.
+
+For example, given the input::
+
+ int_arr = np.array([1, 2, 3], dtype=np.int64)
+ float_arr = np.array([1, 2, 3], dtype=np.float64)
+ np.add(int_arr, float_arr)
+
+has to find the correct ``ArrayMethod`` to perform the operation.
+Ideally, there is an exact match defined, e.g. for ``np.add(int_arr, int_arr)``
+the ``ArrayMethod[Int64, Int64, out=Int64]`` matches exactly and can be used.
+However, for ``np.add(int_arr, float_arr)`` there is no direct match,
+requiring a promotion step.
+
+Promotion and dispatching process
+=================================
+
+In general the ``ArrayMethod`` is found by searching for an exact match of
+all input DTypes.
+The output dtypes should *not* affect calculation, but if multiple registered
+``ArrayMethod``\ s match exactly, the output DType will be used to find the
+better match.
+This will allow the current distinction for ``np.equal`` loops which define
+both ``Object, Object -> Bool`` (default) and ``Object, Object -> Object``.
+
+Initially, an ``ArrayMethod`` will be defined for *concrete* DTypes only
+and since these cannot be subclassed an exact match is guaranteed.
+In the future we expect that ``ArrayMethod``\ s can also be defined for
+*abstract* DTypes. In which case the best match is found as detailed below.
+
+**Promotion:**
+
+If a matching ``ArrayMethod`` exists, dispatching is straight forward.
+However, when it does not, require additional definitions to implement
+promotion:
+
+* By default any UFunc has a promotion which uses the common DType of all
+ inputs and dispatches a second time. This is well-defined for most
+ mathematical functions, but can be disabled or customized if necessary.
+ For instances ``int32 + float64`` tries again using ``float64 + float64``
+ which is the common DType.
+
+* Users can *register* new Promoters just as they can register a
+ new ``ArrayMethod``. These will use abstract DTypes to allow matching
+ a large variety of signatures.
+ The return value of a promotion function shall be a new ``ArrayMethod``
+ or ``NotImplemented``. It must be consistent over multiple calls with
+ the same input to allow caching of the result.
+
+The signature of a promotion function would be::
+
+ promoter(np.ufunc: ufunc, Tuple[DTypeMeta]: DTypes): -> Union[ArrayMethod, NotImplemented]
+
+Note that DTypes may include the output's DType, however, normally the
+output DType will *not* affect which ``ArrayMethod`` is chosen.
+
+In most cases, it should not be necessary to add a custom promotion function.
+An example which requires this is multiplication with a unit:
+in NumPy ``timedelta64`` can be multiplied with most integers,
+but NumPy only defines a loop (``ArrayMethod``) for ``timedelta64 * int64``
+so that multiplying with ``int32`` would fail.
+
+To allow this, the following promoter can be registered for
+``(Timedelta64, Integral, None)``::
+
+ def promote(ufunc, DTypes):
+ res = list(DTypes)
+ try:
+ res[1] = np.common_dtype(DTypes[1], Int64)
+ except TypeError:
+ return NotImplemented
+
+ # Could check that res[1] is actually Int64
+ return ufunc.resolve_impl(tuple(res))
+
+In this case, just as a ``Timedelta64 * int64`` and ``int64 * timedelta64``
+``ArrayMethod`` is necessary, a second promoter will have to be registered to
+handle the case where the integer is passed first.
+
+**Dispatching rules for ``ArrayMethod`` and Promoters:**
+
+Promoter and ``ArrayMethod`` are discovered by finding the best match as
+defined by the DType class hierarchy.
+The best match is defined if:
+
+* The signature matches for all input DTypes, so that
+ ``issubclass(input_DType, registered_DType)`` returns true.
+* No other promoter or ``ArrayMethod`` is more precise in any input:
+ ``issubclass(other_DType, this_DType)`` is true (this may include if both
+ are identical).
+* This promoter or ``ArrayMethod`` is more precise in at least one input or
+ output DType.
+
+It will be an error if ``NotImplemented`` is returned or if two
+promoters match the input equally well.
+When an existing promoter is not precise enough for new functionality, a
+new promoter has to be added.
+To ensure that this promoter takes precedence it may be necessary to define
+new abstract DTypes as more precise subclasses of existing ones.
+
+The above rules enable specialization if an output is supplied
+or the full loop is specified. This should not typically be necessary,
+but allows resolving ``np.logic_or``, etc. which have both
+``Object, Object -> Bool`` and ``Object, Object -> Object`` loops (using the
+first by default).
+
+
+Discussion and alternatives
+===========================
+
+Instead of resolving and returning a new implementation, we could also
+return a new set of DTypes to use for dispatching. This works, however,
+it has the disadvantage that it is impossible to dispatch to a loop
+defined on a different ufunc or to dynamically create a new ``ArrayMethod``.
+
+
+**Rejected Alternatives:**
+
+In the above the promoters use a multiple dispatching style type resolution
+while the current UFunc machinery uses the first
+"safe" loop (see also :ref:`NEP 40 <NEP40>`) in an ordered hierarchy.
+
+While the "safe" casting rule is not restrictive enough, we could imagine
+using a new "promote" casting rule, or the common-DType logic to find the
+best matching loop by upcasting the inputs as necessary.
+
+One downside to this approach is that upcasting alone allows upcasting the
+result beyond what is expected by users:
+Currently (which will remain supported as a fallback) any ufunc which defines
+only a float64 loop will also work for float16 and float32 by *upcasting*::
+
+ >>> from scipy.special import erf
+ >>> erf(np.array([4.], dtype=np.float16)) # float16
+ array([1.], dtype=float32)
+
+with a float32 result. It is impossible to change the ``erf`` function to
+return a float16 result without changing the result of following code.
+In general, we argue that automatic upcasting should not occur in cases
+where a less precise loop can be defined, *unless* the ufunc
+author does this intentionally using a promotion.
+
+This consideration means that upcasting has to be limited by some additional
+method.
+
+*Alternative 1:*
+
+Assuming general upcasting is not intended, a rule must be defined to
+limit upcasting the input from ``float16 -> float32`` either using generic
+logic on the DTypes or the UFunc itself (or a combination of both).
+The UFunc cannot do this easily on its own, since it cannot know all possible
+DTypes which register loops.
+Consider the two examples:
+
+First (should be rejected):
+
+* Input: ``float16 * float16``
+* Existing loop: ``float32 * float32``
+
+Second (should be accepted):
+
+* Input: ``timedelta64 * int32``
+* Existing loop: ``timedelta64 * int16``
+
+
+This requires either:
+
+1. The ``timedelta64`` to somehow signal that the ``int64`` upcast is
+ always supported if it is involved in the operation.
+2. The ``float32 * float32`` loop to reject upcasting.
+
+Implementing the first approach requires signaling that upcasts are
+acceptable in the specific context. This would require additional hooks
+and may not be simple for complex DTypes.
+
+For the second approach in most cases a simple ``np.common_dtype`` rule will
+work for initial dispatching, however, even this is only clearly the case
+for homogeneous loops.
+This option will require adding a function to check whether the input
+is a valid upcast to each loop individually, which seems problematic.
+In many cases a default could be provided (homogeneous signature).
+
+*Alternative 2:*
+
+An alternative "promotion" step is to ensure that the *output* DType matches
+with the loop after first finding the correct output DType.
+If the output DTypes are known, finding a safe loop becomes easy.
+In the majority of cases this works, the correct output dtype is just::
+
+ np.common_dtype(*input_DTypes)
+
+or some fixed DType (e.g. Bool for logical functions).
+
+However, it fails for example in the ``timedelta64 * int32`` case above since
+there is a-priori no way to know that the "expected" result type of this
+output is indeed ``timedelta64`` (``np.common_dtype(Datetime64, Int32)`` fails).
+This requires some additional knowledge of the timedelta64 precision being
+int64. Since a ufunc can have an arbitrary number of (relevant) inputs
+it would thus at least require an additional ``__promoted_dtypes__`` method
+on ``Datetime64`` (and all DTypes).
+
+A further limitation is shown by masked DTypes. Logical functions do not
+have a boolean result when masked are involved, which would thus require the
+original ufunc author to anticipate masked DTypes in this scheme.
+Similarly, some functions defined for complex values will return real numbers
+while others return complex numbers. If the original author did not anticipate
+complex numbers, the promotion may be incorrect for a later added complex loop.
+
+
+We believe that promoters, while allowing for an huge theoretical complexity,
+are the best solution:
+
+1. Promotion allows for dynamically adding new loops. E.g. it is possible
+ to define an abstract Unit DType, which dynamically creates classes to
+ wrap other existing DTypes. Using a single promoter, this DType can
+ dynamically wrap existing ``ArrayMethod`` enabling it to find the correct
+ loop in a single lookup instead of two.
+2. The promotion logic will usually err on the safe side: A newly-added
+ loop cannot be misused unless a promoter is added as well.
+3. They put the burden of carefully thinking of whether the logic is correct
+ on the programmer adding new loops to a UFunc. (Compared to Alternative 2)
+4. In case of incorrect existing promotion, writing a promoter to restrict
+ or refine a generic rule is possible. In general a promotion rule should
+ never return an *incorrect* promotion, but if it the existing promotion
+ logic fails or is incorrect for a newly-added loop, the loop can add a
+ new promoter to refine the logic.
+
+The option of having each loop verify that no upcast occured is probably
+the best alternative, but does not include the ability to dynamically
+adding new loops.
+
+The main downsides of general promoters is that they allow a possible
+very large complexity.
+A third-party library *could* add incorrect promotions to NumPy, however,
+this is already possible by adding new incorrect loops.
+In general we believe we can rely on downstream projects to use this
+power and complexity carefully and responsibly.
+
+
+***************
+User Guidelines
+***************
+
+In general adding a promoter to a UFunc must be done very carefully.
+A promoter should never affect loops which can be reasonably defined
+by other datatypes. Defining a hypothetical ``erf(UnitFloat16)`` loop
+must not lead to ``erf(float16)``.
+In general a promoter should fulfill the following requirements:
+
+* Be conservative when defining a new promotion rule. An incorrect result
+ is a much more dangerous error than an unexpected error.
+* One of the (abstract) DTypes added should typically match specifically with a
+ DType (or family of DTypes) defined by your project.
+ Never add promotion rules which go beyond normal common DType rules!
+ It is *not* reasonable to add a loop for ``int16 + uint16 -> int24`` if
+ you write an ``int24`` dtype. The result of this operation was already
+ defined previously as ``int32`` and will be used with this assumption.
+* A promoter (or loop) should never affect existing loop results.
+ This includes adding faster but less precise loops/promoters to replace
+ existing ones.
+* Try to stay within a clear, linear hierarchy for all promotion (and casting)
+ related logic. NumPy itself breaks this logic for integers and floats
+ (they are not strictly linear, since int64 cannot promote to float32).
+* Loops and promoters can be added by any project, which could be:
+
+ * The project defining the ufunc
+ * The project defining the DType
+ * A third-party project
+
+ Try to find out which is the best project to add the loop. If neither
+ the project defining the ufunc nor the project defining the DType add the
+ loop, issues with multiple definitions (which are rejected) may arise
+ and care should be taken that the loop behaviour is always more desirable
+ than an error.
+
+In some cases exceptions to these rules may make sense, however, in general
+we ask you to use extreme caution and when in doubt create a new UFunc
+instead. This clearly notifies the users of differing rules.
+When in doubt, ask on the NumPy mailing list or issue tracker!
+
+
+**************
+Implementation
+**************
+
+Implementation of this NEP will entail a large refactor and restructuring
+of the current ufunc machinery (as well as casting).
+
+The implementation unfortunately will require large maintenance of the
+UFunc machinery, since both the actual UFunc loop calls, as well as the
+the initial dispatching steps have to be modified.
+
+In general, the correct ``ArrayMethod``, also those returned by a promoter,
+will be cached (or stored) inside a hashtable for efficient lookup.
+
+
+**********
+Discussion
+**********
+
+There is a large space of possible implementations with many discussions
+in various places, as well as initial thoughts and design documents.
+These are listed in the discussion of :ref:`NEP 40 <NEP40>` and not repeated here for
+brevity.
+
+A long discussion which touches many of these points and points towards
+similar solutions can be found in
+`the github issue 12518 "What should be the calling convention for ufunc inner loop signatures?" <https://github.com/numpy/numpy/issues/12518>`_
+
+
+**********
+References
+**********
+
+Please see NEP 40 and 41 for more discussion and references.
+
+
+*********
+Copyright
+*********
+
+This document has been placed in the public domain.
diff --git a/doc/neps/nep-0045-c_style_guide.rst b/doc/neps/nep-0045-c_style_guide.rst
index 3c21e404f..5a2fcf946 100644
--- a/doc/neps/nep-0045-c_style_guide.rst
+++ b/doc/neps/nep-0045-c_style_guide.rst
@@ -1,3 +1,5 @@
+.. _NEP45:
+
=================================
NEP 45 — C Style Guide
=================================
@@ -8,6 +10,8 @@ NEP 45 — C Style Guide
:Created: 2012-02-26
:Resolution: https://github.com/numpy/numpy/issues/11911
+.. highlight:: c
+
Abstract
--------
@@ -71,8 +75,8 @@ C dialect
* No compiler warnings with major compilers (gcc, VC++, a few others).
-.. Note::
- NumPy still produces compiler warnings that need to be addressed.
+.. note::
+ NumPy still produces compiler warnings that need to be addressed.
Code layout
============
@@ -226,7 +230,8 @@ Naming conventions
``array_real_get``. Single leading underscores should not be used, but
some current function names violate that rule due to historical accident.
-.. Note::
+.. note::
+
Functions whose names begin with a single underscore should be renamed at
some point.
@@ -244,7 +249,7 @@ C functions, see the files in ``doc/cdoc/``.
Related Work
------------
-Based on Van Rossum and Warsaw, `PEP 7 -- Style Guide for C Code <https://www.python.org/dev/peps/pep-0007>`_
+Based on Van Rossum and Warsaw, :pep:`7`
Discussion
diff --git a/doc/neps/roadmap.rst b/doc/neps/roadmap.rst
index 3780499a0..40fcbd325 100644
--- a/doc/neps/roadmap.rst
+++ b/doc/neps/roadmap.rst
@@ -6,6 +6,7 @@ This is a live snapshot of tasks and features we will be investing resources
in. It may be used to encourage and inspire developers and to search for
funding.
+
Interoperability
----------------
@@ -16,11 +17,21 @@ facilitate interoperability with all such packages, and the code that uses them,
may include (among other things) interoperability protocols, better duck typing
support and ndarray subclass handling.
-- The ``__array_function__`` protocol is currently experimental and needs to be
- matured. See :ref`NEP18` for details.
-- New protocols for overriding other functionality in NumPy may be needed.
-- Array duck typing, or handling "duck arrays", needs improvements. See
- :ref:`NEP22` for details.
+The ``__array_ufunc__`` and ``__array_function__`` protocols are stable, but
+do not cover the whole API. New protocols for overriding other functionality
+in NumPy are needed. Work in this area aims to bring to completion one or more
+of the following proposals:
+
+- :ref:`NEP30`
+- :ref:`NEP31`
+- :ref:`NEP35`
+- :ref:`NEP37`
+
+In addition we aim to provide ways to make it easier for other libraries to
+implement a NumPy-compatible API. This may include defining consistent subsets
+of the API, as discussed in `this section of NEP 37
+<https://numpy.org/neps/nep-0037-array-module.html#requesting-restricted-subsets-of-numpy-s-api>`__.
+
Extensibility
-------------
@@ -42,56 +53,59 @@ improve the dtype system.
- One of these should probably be the default for text data. The current
behavior on Python 3 is neither efficient nor user friendly.
-- ``np.dtype(int)`` should not be platform dependent
-- Better coercion for string + number
Performance
-----------
-We want to further improve NumPy's performance, through:
+Improvements to NumPy's performance are important to many users. The primary
+topic at the moment is better use of SIMD instructions, also on platforms other
+than x86 - see :ref:`NEP38`.
+
+Other performance improvement ideas include:
-- Better use of SIMD instructions, also on platforms other than x86.
-- Reducing ufunc overhead.
+- Reducing ufunc and ``__array_function__`` overhead.
- Optimizations in individual functions.
+- A better story around parallel execution.
Furthermore we would like to improve the benchmarking system, in terms of coverage,
easy of use, and publication of the results (now
`here <https://pv.github.io/numpy-bench>`__) as part of the docs or website.
+
Website and documentation
-------------------------
-Our website (https://numpy.org) is in very poor shape and needs to be rewritten
-completely.
-
-The NumPy `documentation <https://www.numpy.org/devdocs/user/index.html>`__ is
-of varying quality - in particular the User Guide needs major improvements.
+The NumPy `documentation <https://www.numpy.org/devdocs>`__ is of varying
+quality. The API documentation is in good shape; tutorials and high-level
+documentation on many topics are missing or outdated. See :ref:`NEP44` for
+planned improvements.
-Random number generation policy & rewrite
------------------------------------------
+Our website (https://numpy.org) was completely redesigned recently. We aim to
+further improve it by adding translations, better Hugo-Sphinx integration via a
+new Sphinx theme, and more (see `this tracking issue <https://github.com/numpy/numpy.org/issues/266>`__).
-A new random number generation framework with higher performance generators is
-close to completion, see :ref:`NEP19` and `PR 13163`_.
-Indexing
---------
+User experience
+---------------
-We intend to add new indexing modes for "vectorized indexing" and "outer indexing",
-see :ref:`NEP21`.
+Type annotations
+````````````````
+We aim to add type annotations for all NumPy functionality, so users can use
+tools like `mypy`_ to type check their code and IDEs can improve their support
+for NumPy. The existing type stubs in the `numpy-stubs`_ repository are being
+improved and will be moved into the NumPy code base.
-Continuous Integration
-----------------------
+Platform support
+````````````````
+We aim to increase our support for different hardware architectures. This
+includes adding CI coverage when CI services are available, providing wheels on
+PyPI for ARM64 (``aarch64``) and POWER8/9 (``ppc64le``), providing better
+build and install documentation, and resolving build issues on other platforms
+like AIX.
-We depend on CI to discover problems as we continue to develop NumPy before the
-code reaches downstream users.
-- CI for more exotic platforms (if available as a service).
-- Multi-package testing
-- Add an official channel for numpy dev builds for CI usage by other projects so
- they may confirm new builds do not break their package.
-
-Other functionality
--------------------
+Maintenance
+-----------
- ``MaskedArray`` needs to be improved, ideas include:
@@ -99,12 +113,17 @@ Other functionality
- MaskedArray as a duck-array type, and/or
- dtypes that support missing values
-- A backend system for ``numpy.fft`` (so that e.g. ``fft-mkl`` doesn't need to monkeypatch numpy)
-- Write a strategy on how to deal with overlap between NumPy and SciPy for ``linalg``
- and ``fft`` (and implement it).
-- Deprecate ``np.matrix`` (very slowly)
+- Fortran integration via ``numpy.f2py`` requires a number of improvements, see
+ `this tracking issue <https://github.com/numpy/numpy/issues/14938>`__.
+- A backend system for ``numpy.fft`` (so that e.g. ``fft-mkl`` doesn't need to monkeypatch numpy).
+- Write a strategy on how to deal with overlap between NumPy and SciPy for ``linalg``.
+- Deprecate ``np.matrix`` (very slowly).
+- Add new indexing modes for "vectorized indexing" and "outer indexing" (see :ref:`NEP21`).
+- Make the polynomial API easier to use.
+- Integrate an improved text file loader.
+- Ufunc and gufunc improvements, see `gh-8892 <https://github.com/numpy/numpy/issues/8892>`__
+ and `gh-11492 <https://github.com/numpy/numpy/issues/11492>`__.
-.. _implementation: https://gist.github.com/shoyer/1f0a308a06cd96df20879a1ddb8f0006
-.. _`reference implementation`: https://github.com/bashtage/randomgen
-.. _`PR 13163`: https://github.com/numpy/numpy/pull/13163
+.. _`mypy`: https://mypy.readthedocs.io
+.. _`numpy-stubs`: https://github.com/numpy/numpy-stubs
diff --git a/doc/release/upcoming_changes/13516.performance.rst b/doc/release/upcoming_changes/13516.performance.rst
new file mode 100644
index 000000000..1b32b61d7
--- /dev/null
+++ b/doc/release/upcoming_changes/13516.performance.rst
@@ -0,0 +1,47 @@
+Enable multi-platform SIMD compiler optimizations
+-------------------------------------------------
+
+A series of improvements for NumPy infrastructure to pave the way to
+**NEP-38**, that can be summarized as follow:
+
+- **New Build Arguments** :
+
+ - ``--cpu-baseline`` to specify the minimal set of required
+ optimizations, default value is ``min`` which provides the minimum
+ CPU features that can safely run on a wide range of users
+ platforms.
+
+ - ``--cpu-dispatch`` to specify the dispatched set of additional
+ optimizations, default value is ``max -xop -fma4`` which enables
+ all CPU features, except for AMD legacy features.
+
+ - ``--disable-optimization`` to explicitly disable the whole new
+ improvements, It also adds a new **C** compiler #definition
+ called ``NPY_DISABLE_OPTIMIZATION`` which it can be used as
+ guard for any SIMD code.
+
+- **Advanced CPU dispatcher**: A flexible cross-architecture CPU dispatcher built
+ on the top of Python/Numpy distutils, support all common compilers with a wide range of CPU features.
+
+ The new dispatcher requires a special file extension ``*.dispatch.c`` to mark the dispatch-able
+ **C** sources. These sources have the ability to be compiled multiple times so that each compilation process
+ represents certain CPU features and provides different #definitions and flags that affect the code paths.
+
+- **New auto-generated C header ``core/src/common/_cpu_dispatch.h``**
+ This header is generated by the distutils module 'ccompiler_opt', and contains all the #definitions
+ and headers of instruction sets, that had been configured through command arguments '--cpu-baseline' and '--cpu-dispatch'.
+
+- **New C header ``core/src/common/npy_cpu_dispatch.h``**
+
+ This header contains all utilities that required for the whole CPU dispatching process,
+ it also can be considered as a bridge linking the new infrastructure work with NumPy CPU runtime detection.
+
+- **Add new attributes to NumPy umath module(Python level)**
+
+ - ``__cpu_baseline__`` a list contains the minimal set of required optimizations that supported
+ by the compiler and platform according to the specified values to command argument '--cpu-baseline'.
+
+ - ``__cpu_dispatch__`` a list contains the dispatched set of additional optimizations that supported by the compiler
+ and platform according to the specified values to command argument '--cpu-dispatch'.
+
+- **Print the supported CPU features during the run of PytestTester**
diff --git a/doc/release/upcoming_changes/14882.deprecation.rst b/doc/release/upcoming_changes/14882.deprecation.rst
new file mode 100644
index 000000000..db3b39d4c
--- /dev/null
+++ b/doc/release/upcoming_changes/14882.deprecation.rst
@@ -0,0 +1,30 @@
+Using the aliases of builtin types like ``np.int`` is deprecated
+----------------------------------------------------------------
+
+For a long time, ``np.int`` has been an alias of the builtin ``int``. This is
+repeatedly a cause of confusion for newcomers, and is also simply not useful.
+
+These aliases have been deprecated. The table below shows the full list of
+deprecated aliases, along with their exact meaning. Replacing uses of items in
+the first column with the contents of the second column will work identically
+and silence the deprecation warning.
+
+In many cases, it may have been intended to use the types from the third column.
+Be aware that use of these types may result in subtle but desirable behavior
+changes.
+
+================== ================================= ==================================================================
+Deprecated name Identical to Possibly intended numpy type
+================== ================================= ==================================================================
+``numpy.bool`` ``bool`` `numpy.bool_`
+``numpy.int`` ``int`` `numpy.int_` (default int dtype), `numpy.cint` (C ``int``)
+``numpy.float`` ``float`` `numpy.float_`, `numpy.double` (equivalent)
+``numpy.complex`` ``complex`` `numpy.complex_`, `numpy.cdouble` (equivalent)
+``numpy.object`` ``object`` `numpy.object_`
+``numpy.str`` ``str`` `numpy.str_`
+``numpy.long`` ``int`` (``long`` on Python 2) `numpy.int_` (C ``long``), `numpy.longlong` (largest integer type)
+``numpy.unicode`` ``str`` (``unicode`` on Python 2) `numpy.unicode_`
+================== ================================= ==================================================================
+
+Note that for technical reasons these deprecation warnings will only be emitted
+on Python 3.7 and above.
diff --git a/doc/release/upcoming_changes/15121.new_function.rst b/doc/release/upcoming_changes/15121.new_function.rst
new file mode 100644
index 000000000..004fec1b0
--- /dev/null
+++ b/doc/release/upcoming_changes/15121.new_function.rst
@@ -0,0 +1,6 @@
+The random.Generator class has a new ``permuted`` function.
+-----------------------------------------------------------
+The new function differs from ``shuffle`` and ``permutation`` in that the
+subarrays indexed by an axis are permuted rather than the axis being treated as
+a separate 1-D array for every combination of the other indexes. For example,
+it is now possible to permute the rows or columns of a 2-D array.
diff --git a/doc/release/upcoming_changes/15852.new_feature.rst b/doc/release/upcoming_changes/15852.new_feature.rst
new file mode 100644
index 000000000..12965e57b
--- /dev/null
+++ b/doc/release/upcoming_changes/15852.new_feature.rst
@@ -0,0 +1,24 @@
+``where`` keyword argument for ``numpy.all`` and ``numpy.any`` functions
+------------------------------------------------------------------------
+The keyword argument ``where`` is added and allows to only consider specified
+elements or subaxes from an array in the Boolean evaluation of ``all`` and
+``any``. This new keyword is available to the functions ``all`` and ``any``
+both via ``numpy`` directly or in the methods of ``numpy.ndarray``.
+
+Any broadcastable Boolean array or a scalar can be set as ``where``. It
+defaults to ``True`` to evaluate the functions for all elements in an array if
+``where`` is not set by the user. Examples are given in the documentation of
+the functions.
+
+
+``where`` keyword argument for ``numpy`` functions ``mean``, ``std``, ``var``
+-----------------------------------------------------------------------------
+The keyword argument ``where`` is added and allows to limit the scope in the
+caluclation of ``mean``, ``std`` and ``var`` to only a subset of elements. It
+is available both via ``numpy`` directly or in the methods of
+``numpy.ndarray``.
+
+Any broadcastable Boolean array or a scalar can be set as ``where``. It
+defaults to ``True`` to evaluate the functions for all elements in an array if
+``where`` is not set by the user. Examples are given in the documentation of
+the functions.
diff --git a/doc/release/upcoming_changes/16056.deprecation.rst b/doc/release/upcoming_changes/16056.deprecation.rst
new file mode 100644
index 000000000..bd57cd226
--- /dev/null
+++ b/doc/release/upcoming_changes/16056.deprecation.rst
@@ -0,0 +1,13 @@
+Inexact matches for mode and searchside are deprecated
+------------------------------------------------------
+Inexact and case insensitive matches for mode and searchside were
+valid inputs earlier and will give a DeprecationWarning now.
+For example, below are some example usages which are now deprecated and will
+give a DeprecationWarning::
+
+ import numpy as np
+ arr = np.array([[3, 6, 6], [4, 5, 1]])
+ # mode: inexact match
+ np.ravel_multi_index(arr, (7, 6), mode="clap") # should be "clip"
+ # searchside: inexact match
+ np.searchsorted(arr[0], 4, side='random') # should be "right"
diff --git a/doc/release/upcoming_changes/16134.compatibility.rst b/doc/release/upcoming_changes/16134.compatibility.rst
new file mode 100644
index 000000000..6ef1c8992
--- /dev/null
+++ b/doc/release/upcoming_changes/16134.compatibility.rst
@@ -0,0 +1,8 @@
+Same kind casting in concatenate with ``axis=None``
+---------------------------------------------------
+When `~numpy.concatenate` is called with ``axis=None``,
+the flattened arrays were cast with ``unsafe``. Any other axis
+choice uses "same kind". That different default
+has been deprecated and "same kind" casting will be used
+instead. The new ``casting`` keyword argument
+can be used to retain the old behaviour.
diff --git a/doc/release/upcoming_changes/16134.improvement.rst b/doc/release/upcoming_changes/16134.improvement.rst
new file mode 100644
index 000000000..0699f44bd
--- /dev/null
+++ b/doc/release/upcoming_changes/16134.improvement.rst
@@ -0,0 +1,6 @@
+Concatenate supports providing an output dtype
+----------------------------------------------
+Support was added to `~numpy.concatenate` to provide
+an output ``dtype`` and ``casting`` using keyword
+arguments. The ``dtype`` argument cannot be provided
+in conjunction with the ``out`` one.
diff --git a/doc/release/upcoming_changes/16200.compatibility.rst b/doc/release/upcoming_changes/16200.compatibility.rst
new file mode 100644
index 000000000..42c423eef
--- /dev/null
+++ b/doc/release/upcoming_changes/16200.compatibility.rst
@@ -0,0 +1,76 @@
+NumPy Scalars are cast when assigned to arrays
+----------------------------------------------
+
+When creating or assigning to arrays, in all relevant cases NumPy
+scalars will now be cast identically to NumPy arrays. In particular
+this changes the behaviour in some cases which previously raised an
+error::
+
+ np.array([np.float64(np.nan)], dtype=np.int64)
+
+will succeed and return an undefined result (usually the smallest possible
+integer). This also affects assignments::
+
+ arr[0] = np.float64(np.nan)
+
+At this time, NumPy retains the behaviour for::
+
+ np.array(np.float64(np.nan), dtype=np.int64)
+
+The above changes do not affect Python scalars::
+
+ np.array([float("NaN")], dtype=np.int64)
+
+remains unaffected (``np.nan`` is a Python ``float``, not a NumPy one).
+Unlike signed integers, unsigned integers do not retain this special case,
+since they always behaved more like casting.
+The following code stops raising an error::
+
+ np.array([np.float64(np.nan)], dtype=np.uint64)
+
+To avoid backward compatibility issues, at this time assignment from
+``datetime64`` scalar to strings of too short length remains supported.
+This means that ``np.asarray(np.datetime64("2020-10-10"), dtype="S5")``
+succeeds now, when it failed before. In the long term this may be
+deprecated or the unsafe cast may be allowed generally to make assignment
+of arrays and scalars behave consistently.
+
+
+Array coercion changes when Strings and other types are mixed
+-------------------------------------------------------------
+
+When stringss and other types are mixed, such as::
+
+ np.array(["string", np.float64(3.)], dtype="S")
+
+The results will change, which may lead to string dtypes with longer strings
+in some cases. In particularly, if ``dtype="S"`` is not provided any numerical
+value will lead to a string results long enough to hold all possible numerical
+values. (e.g. "S32" for floats). Note that you should always provide
+``dtype="S"`` when converting non-strings to strings.
+
+If ``dtype="S"`` is provided the results will be largely identical to before,
+but NumPy scalars (not a Python float like ``1.0``), will still enforce
+a uniform string length::
+
+ np.array([np.float64(3.)], dtype="S") # gives "S32"
+ np.array([3.0], dtype="S") # gives "S3"
+
+while previously the first version gave the same result as the second.
+
+
+Array coercion restructure
+--------------------------
+
+Array coercion has been restructured. In general, this should not affect
+users. In extremely rare corner cases where array-likes are nested::
+
+ np.array([array_like1])
+
+things will now be more consistent with::
+
+ np.array([np.array(array_like1)])
+
+which could potentially change output subtly for badly defined array-likes.
+We are not aware of any such case where the results were not clearly
+incorrect previously.
diff --git a/doc/release/upcoming_changes/16232.deprecation.rst b/doc/release/upcoming_changes/16232.deprecation.rst
new file mode 100644
index 000000000..d1ac7f044
--- /dev/null
+++ b/doc/release/upcoming_changes/16232.deprecation.rst
@@ -0,0 +1,6 @@
+``outer`` and ``ufunc.outer`` deprecated for matrix
+---------------------------------------------------
+``np.matrix`` use with `~numpy.outer` or generic ufunc outer
+calls such as ``numpy.add.outer``. Previously, matrix was
+converted to an array here. This will not be done in the future
+requiring a manual conversion to arrays.
diff --git a/doc/release/upcoming_changes/16350.compatibility.rst b/doc/release/upcoming_changes/16350.compatibility.rst
new file mode 100644
index 000000000..67673a6b1
--- /dev/null
+++ b/doc/release/upcoming_changes/16350.compatibility.rst
@@ -0,0 +1,8 @@
+Writing to the result of `numpy.broadcast_arrays` will export readonly buffers
+------------------------------------------------------------------------------
+
+In NumPy 1.17 `numpy.broadcast_arrays` started warning when the resulting array
+was written to. This warning was skipped when the array was used through the
+buffer interface (e.g. ``memoryview(arr)``). The same thing will now occur for the
+two protocols ``__array_interface__``, and ``__array_struct__`` returning read-only
+buffers instead of giving a warning. \ No newline at end of file
diff --git a/doc/release/upcoming_changes/16476.new_feature.rst b/doc/release/upcoming_changes/16476.new_feature.rst
new file mode 100644
index 000000000..acfe0bd72
--- /dev/null
+++ b/doc/release/upcoming_changes/16476.new_feature.rst
@@ -0,0 +1,9 @@
+``norm=backward``, ``forward`` keyword options for ``numpy.fft`` functions
+--------------------------------------------------------------------------
+The keyword argument option ``norm=backward`` is added as an alias for ``None``
+and acts as the default option; using it has the direct transforms unscaled
+and the inverse transforms scaled by ``1/n``.
+
+Using the new keyword argument option ``norm=forward`` has the direct
+transforms scaled by ``1/n`` and the inverse transforms unscaled (i.e. exactly
+opposite to the default option ``norm=backward``).
diff --git a/doc/release/upcoming_changes/16515.new_feature.rst b/doc/release/upcoming_changes/16515.new_feature.rst
new file mode 100644
index 000000000..5b3803429
--- /dev/null
+++ b/doc/release/upcoming_changes/16515.new_feature.rst
@@ -0,0 +1,8 @@
+NumPy is now typed
+------------------
+Type annotations have been added for large parts of NumPy. There is
+also a new `numpy.typing` module that contains useful types for
+end-users. The currently available types are
+
+- ``ArrayLike``: for objects that can be coerced to an array
+- ``DtypeLike``: for objects that can be coerced to a dtype
diff --git a/doc/release/upcoming_changes/16519.improvement.rst b/doc/release/upcoming_changes/16519.improvement.rst
new file mode 100644
index 000000000..50c4305e5
--- /dev/null
+++ b/doc/release/upcoming_changes/16519.improvement.rst
@@ -0,0 +1,4 @@
+Thread-safe f2py callback functions
+-----------------------------------
+
+Callback functions in f2py are now threadsafe.
diff --git a/doc/release/upcoming_changes/16554.compatibility.rst b/doc/release/upcoming_changes/16554.compatibility.rst
new file mode 100644
index 000000000..a9f3f07e0
--- /dev/null
+++ b/doc/release/upcoming_changes/16554.compatibility.rst
@@ -0,0 +1,10 @@
+Numeric-style type names have been removed from type dictionaries
+-----------------------------------------------------------------
+
+To stay in sync with the deprecation for ``np.dtype("Complex64")``
+and other numeric-style (capital case) types. These were removed
+from ``np.sctypeDict`` and ``np.typeDict``. You should use
+the lower case versions instead. Note that ``"Complex64"``
+corresponds to ``"complex128"`` and ``"Complex32"`` corresponds
+to ``"complex64"``. The numpy style (new) versions, denote the full
+size and not the size of the real/imaginary part.
diff --git a/doc/release/upcoming_changes/16554.deprecation.rst b/doc/release/upcoming_changes/16554.deprecation.rst
new file mode 100644
index 000000000..5602d2d53
--- /dev/null
+++ b/doc/release/upcoming_changes/16554.deprecation.rst
@@ -0,0 +1,8 @@
+Further Numeric Style types Deprecated
+--------------------------------------
+
+The remaining numeric-style type codes ``Bytes0``, ``Str0``,
+``Uint32``, ``Uint64``, and ``Datetime64``
+have been deprecated. The lower-case variants should be used
+instead. For bytes and string ``"S"`` and ``"U"``
+are further alternatives.
diff --git a/doc/release/upcoming_changes/16554.expired.rst b/doc/release/upcoming_changes/16554.expired.rst
new file mode 100644
index 000000000..9b5718f8a
--- /dev/null
+++ b/doc/release/upcoming_changes/16554.expired.rst
@@ -0,0 +1,5 @@
+* The deprecation of numeric style type-codes ``np.dtype("Complex64")``
+ (with upper case spelling), is expired. ``"Complex64"`` corresponded to
+ ``"complex128"`` and ``"Complex32"`` corresponded to ``"complex64"``.
+* The deprecation of ``np.sctypeNA`` and ``np.typeNA`` is expired. Both
+ have been removed from the public API. Use ``np.typeDict`` instead.
diff --git a/doc/release/upcoming_changes/16558.new_feature.rst b/doc/release/upcoming_changes/16558.new_feature.rst
new file mode 100644
index 000000000..9bd508e83
--- /dev/null
+++ b/doc/release/upcoming_changes/16558.new_feature.rst
@@ -0,0 +1,9 @@
+``numpy.typing`` is accessible at runtime
+-----------------------------------------
+The types in ``numpy.typing`` can now be imported at runtime. Code
+like the following will now work:
+
+.. code:: python
+
+ from numpy.typing import ArrayLike
+ x: ArrayLike = [1, 2, 3, 4]
diff --git a/doc/release/upcoming_changes/16570.compatibility.rst b/doc/release/upcoming_changes/16570.compatibility.rst
new file mode 100644
index 000000000..5efd1218b
--- /dev/null
+++ b/doc/release/upcoming_changes/16570.compatibility.rst
@@ -0,0 +1,4 @@
+The ``operator.concat`` function now raises TypeError for array arguments
+-------------------------------------------------------------------------
+The previous behavior was to fall back to addition and add the two arrays,
+which was thought to be unexpected behavior for a concatenation function.
diff --git a/doc/release/upcoming_changes/16589.compatibility.rst b/doc/release/upcoming_changes/16589.compatibility.rst
new file mode 100644
index 000000000..d65fb43f6
--- /dev/null
+++ b/doc/release/upcoming_changes/16589.compatibility.rst
@@ -0,0 +1,8 @@
+``nickname`` attribute removed from ABCPolyBase
+-----------------------------------------------
+
+An abstract property ``nickname`` has been removed from ``ABCPolyBase`` as it
+was no longer used in the derived convenience classes.
+This may affect users who have derived classes from ``ABCPolyBase`` and
+overridden the methods for representation and display, e.g. ``__str__``,
+``__repr__``, ``_repr_latex``, etc.
diff --git a/doc/release/upcoming_changes/16592.compatibility.rst b/doc/release/upcoming_changes/16592.compatibility.rst
new file mode 100644
index 000000000..289e768fc
--- /dev/null
+++ b/doc/release/upcoming_changes/16592.compatibility.rst
@@ -0,0 +1,13 @@
+float->timedelta and uint64->timedelta promotion will raise a TypeError
+-----------------------------------------------------------------------
+Float and timedelta promotion consistently raises a TypeError.
+``np.promote_types("float32", "m8")`` aligns with
+``np.promote_types("m8", "float32")`` now and both raise a TypeError.
+Previously, ``np.promote_types("float32", "m8")`` returned ``"m8"`` which
+was considered a bug.
+
+Uint64 and timedelta promotion consistently raises a TypeError.
+``np.promote_types("uint64", "m8")`` aligns with
+``np.promote_types("m8", "uint64")`` now and both raise a TypeError.
+Previously, ``np.promote_types("uint64", "m8")`` returned ``"m8"`` which
+was considered a bug.
diff --git a/doc/release/upcoming_changes/16594.new_feature.rst b/doc/release/upcoming_changes/16594.new_feature.rst
new file mode 100644
index 000000000..5d67bfad7
--- /dev/null
+++ b/doc/release/upcoming_changes/16594.new_feature.rst
@@ -0,0 +1,4 @@
+New``__f2py_numpy_version__`` attribute for f2py generated modules.
+-------------------------------------------------------------------
+Because f2py is released together with NumPy, ``__f2py_numpy_version__``
+provides a way to track the version f2py used to generate the module.
diff --git a/doc/release/upcoming_changes/16650.compatibility.rst b/doc/release/upcoming_changes/16650.compatibility.rst
new file mode 100644
index 000000000..653232355
--- /dev/null
+++ b/doc/release/upcoming_changes/16650.compatibility.rst
@@ -0,0 +1,16 @@
+`numpy.genfromtxt` now correctly unpacks structured arrays
+----------------------------------------------------------
+Previously, `numpy.genfromtxt` failed to unpack if it was called with
+``unpack=True`` and a structured datatype was passed to the ``dtype`` argument
+(or ``dtype=None`` was passed and a structured datatype was inferred).
+For example::
+
+ >>> data = StringIO("21 58.0\n35 72.0")
+ >>> np.genfromtxt(data, dtype=None, unpack=True)
+ array([(21, 58.), (35, 72.)], dtype=[('f0', '<i8'), ('f1', '<f8')])
+
+Structured arrays will now correctly unpack into a list of arrays,
+one for each column::
+
+ >>> np.genfromtxt(data, dtype=None, unpack=True)
+ [array([21, 35]), array([58., 72.])]
diff --git a/doc/release/upcoming_changes/16675.improvement.rst b/doc/release/upcoming_changes/16675.improvement.rst
new file mode 100644
index 000000000..bc70d7e0f
--- /dev/null
+++ b/doc/release/upcoming_changes/16675.improvement.rst
@@ -0,0 +1,4 @@
+`numpy.core.records.fromfile` now supports file-like objects
+------------------------------------------------------------
+`numpy.rec.fromfile` can now use file-like objects, for instance
+:py:class:`io.BytesIO`
diff --git a/doc/release/upcoming_changes/16710.improvement.rst b/doc/release/upcoming_changes/16710.improvement.rst
new file mode 100644
index 000000000..4194c36a8
--- /dev/null
+++ b/doc/release/upcoming_changes/16710.improvement.rst
@@ -0,0 +1,3 @@
+RPATH support on AIX added to distutils
+---------------------------------------
+This allows SciPy to be built on AIX.
diff --git a/doc/release/upcoming_changes/16730.improvement.rst b/doc/release/upcoming_changes/16730.improvement.rst
new file mode 100644
index 000000000..44ec03caf
--- /dev/null
+++ b/doc/release/upcoming_changes/16730.improvement.rst
@@ -0,0 +1,9 @@
+Use f90 compiler specified in command line args
+--------------------------------------------------------
+
+The compiler command selection for Fortran Portland Group Compiler is changed in `numpy.distutils.fcompiler`.
+This only affects the linking command.
+This forces the use of the executable provided by the command line option (if provided)
+instead of the pgfortran executable.
+If no executable is provided to the command line option it defaults to the pgf90 executable,
+wich is an alias for pgfortran according to the PGI documentation.
diff --git a/doc/release/upcoming_changes/16815.compatibility.rst b/doc/release/upcoming_changes/16815.compatibility.rst
new file mode 100644
index 000000000..ceaf12a57
--- /dev/null
+++ b/doc/release/upcoming_changes/16815.compatibility.rst
@@ -0,0 +1,8 @@
+``mgrid``, ``r_``, etc. consistently return correct outputs for non-default precision input
+-------------------------------------------------------------------------------------------
+Previously, ``np.mgrid[np.float32(0.1):np.float32(0.35):np.float32(0.1),]``
+and ``np.r_[0:10:np.complex64(3j)]`` failed to return meaningful output.
+This bug potentially affects `~numpy.mgrid`, `~numpy.ogrid`, `~numpy.r_`,
+and `~numpy.c_` when an input with dtype other than the default
+``float64`` and ``complex128`` and equivalent Python types were used.
+The methods have been fixed to handle varying precision correctly.
diff --git a/doc/release/upcoming_changes/16841.change.rst b/doc/release/upcoming_changes/16841.change.rst
new file mode 100644
index 000000000..3ddd24078
--- /dev/null
+++ b/doc/release/upcoming_changes/16841.change.rst
@@ -0,0 +1,19 @@
+``np.linspace`` on integers now use floor
+-----------------------------------------
+When using a `int` dtype in `numpy.linspace`, previously float values would
+be rounded towards zero. Now `numpy.floor` is used instead, which rounds toward
+``-inf``. This changes the results for negative values. For example, the
+following would previously give::
+
+ >>> np.linspace(-3, 1, 8, dtype=int)
+ array([-3, -2, -1, -1, 0, 0, 0, 1])
+
+and now results in::
+
+ >>> np.linspace(-3, 1, 8, dtype=int)
+ array([-3, -3, -2, -2, -1, -1, 0, 1])
+
+The former result can still be obtained with::
+
+ >>> np.linspace(-3, 1, 8).astype(int)
+ array([-3, -2, -1, -1, 0, 0, 0, 1])
diff --git a/doc/release/upcoming_changes/16986.improvement.rst b/doc/release/upcoming_changes/16986.improvement.rst
new file mode 100644
index 000000000..391322d9d
--- /dev/null
+++ b/doc/release/upcoming_changes/16986.improvement.rst
@@ -0,0 +1,7 @@
+Add NumPy declarations for Cython 3.0 and later
+-----------------------------------------------
+
+The pxd declarations for Cython 3.0 were improved to avoid using deprecated
+NumPy C-API features. Extension modules built with Cython 3.0+ that use NumPy
+can now set the C macro ``NPY_NO_DEPRECATED_API=NPY_1_7_API_VERSION`` to avoid
+C compiler warnings about deprecated API usage.
diff --git a/doc/release/upcoming_changes/17010.compatibility.rst b/doc/release/upcoming_changes/17010.compatibility.rst
new file mode 100644
index 000000000..72ca0a963
--- /dev/null
+++ b/doc/release/upcoming_changes/17010.compatibility.rst
@@ -0,0 +1,24 @@
+Boolean array indices with mismatching shapes now properly give ``IndexError``
+------------------------------------------------------------------------------
+
+Previously, if a boolean array index matched the size of the indexed array but
+not the shape, it was incorrectly allowed in some cases. In other cases, it
+gave an error, but the error was incorrectly a ``ValueError`` with a message
+about broadcasting instead of the correct ``IndexError``.
+
+For example, the following used to incorrectly give ``ValueError: operands
+could not be broadcast together with shapes (2,2) (1,4)``:
+
+.. code:: python
+
+ np.empty((2, 2))[np.array([[True, False, False, False]])]
+
+And the following used to incorrectly return ``array([], dtype=float64)``:
+
+.. code:: python
+
+ np.empty((2, 2))[np.array([[False, False, False, False]])]
+
+Both now correctly give ``IndexError: boolean index did not match indexed
+array along dimension 0; dimension is 2 but corresponding boolean dimension is
+1``.
diff --git a/doc/release/upcoming_changes/17029.compatibility.rst b/doc/release/upcoming_changes/17029.compatibility.rst
new file mode 100644
index 000000000..69069ce18
--- /dev/null
+++ b/doc/release/upcoming_changes/17029.compatibility.rst
@@ -0,0 +1,14 @@
+Casting errors interrupt Iteration
+----------------------------------
+When iterating while casting values, an error may stop the iteration
+earlier than before. In any case, a failed casting operation always
+returned undefined, partial results. Those may now be even more
+undefined and partial.
+For users of the ``NpyIter`` C-API such cast errors will now
+cause the `iternext()` function to return 0 and thus abort
+iteration.
+Currently, there is no API to detect such an error directly.
+It is necessary to check ``PyErr_Occurred()``, which
+may be problematic in combination with ``NpyIter_Reset``.
+These issues always existed, but new API could be added
+if required by users.
diff --git a/doc/release/upcoming_changes/17067.expired.rst b/doc/release/upcoming_changes/17067.expired.rst
new file mode 100644
index 000000000..a1065d2c3
--- /dev/null
+++ b/doc/release/upcoming_changes/17067.expired.rst
@@ -0,0 +1,8 @@
+Financial functions removed
+---------------------------
+In accordance with NEP 32, the financial functions are removed
+from NumPy 1.20. The functions that have been removed are ``fv``,
+``ipmt``, ``irr``, ``mirr``, ``nper``, ``npv``, ``pmt``, ``ppmt``,
+``pv``, and ``rate``. These functions are available in the
+`numpy_financial <https://pypi.org/project/numpy-financial>`_
+library.
diff --git a/doc/release/upcoming_changes/17068.compatibility.rst b/doc/release/upcoming_changes/17068.compatibility.rst
new file mode 100644
index 000000000..7aa4e58ae
--- /dev/null
+++ b/doc/release/upcoming_changes/17068.compatibility.rst
@@ -0,0 +1,4 @@
+f2py generated code may return unicode instead of byte strings
+--------------------------------------------------------------
+Some byte strings previously returned by f2py generated code may now be unicode
+strings. This results from the ongoing Python2 -> Python3 cleanup.
diff --git a/doc/release/upcoming_changes/17116.expired.rst b/doc/release/upcoming_changes/17116.expired.rst
new file mode 100644
index 000000000..d8a3a43d5
--- /dev/null
+++ b/doc/release/upcoming_changes/17116.expired.rst
@@ -0,0 +1,2 @@
+* The 14-year deprecation of ``np.ctypeslib.ctypes_load_library`` is expired.
+ Use :func:`~numpy.ctypeslib.load_library` instead, which is identical.
diff --git a/doc/release/upcoming_changes/17123.new_feature.rst b/doc/release/upcoming_changes/17123.new_feature.rst
new file mode 100644
index 000000000..e2aca3c55
--- /dev/null
+++ b/doc/release/upcoming_changes/17123.new_feature.rst
@@ -0,0 +1,12 @@
+``mypy`` tests can be run via runtests.py
+-----------------------------------------
+Currently running mypy with the NumPy stubs configured requires
+either:
+
+* Installing NumPy
+* Adding the source directory to MYPYPATH and linking to the mypy.ini
+
+Both options are somewhat inconvenient, so add a ``--mypy`` option to runtests
+that handles setting things up for you. This will also be useful in the future
+for any typing codegen since it will ensure the project is built before type
+checking.
diff --git a/doc/release/upcoming_changes/17195.improvement.rst b/doc/release/upcoming_changes/17195.improvement.rst
new file mode 100644
index 000000000..d5f31dd3f
--- /dev/null
+++ b/doc/release/upcoming_changes/17195.improvement.rst
@@ -0,0 +1,5 @@
+Make the window functions exactly symmetric
+-------------------------------------------
+Make sure the window functions provided by NumPy are symmetric. There were
+previously small deviations from symmetry due to numerical precision that are
+now avoided by better arrangement of the computation.
diff --git a/doc/release/upcoming_changes/17219.new_feature.rst b/doc/release/upcoming_changes/17219.new_feature.rst
new file mode 100644
index 000000000..23f0296ae
--- /dev/null
+++ b/doc/release/upcoming_changes/17219.new_feature.rst
@@ -0,0 +1,12 @@
+Negation of user-defined BLAS/LAPACK detection order
+----------------------------------------------------
+`~numpy.distutils` allows negation of libraries when determining BLAS/LAPACK
+libraries.
+This may be used to remove an item from the library resolution phase, i.e.
+to disallow NetLIB libraries one could do:
+
+.. code:: bash
+
+ NPY_BLAS_ORDER='^blas' NPY_LAPACK_ORDER='^lapack' python setup.py build
+
+which will use any of the accelerated libraries instead.
diff --git a/doc/release/upcoming_changes/17233.deprecation.rst b/doc/release/upcoming_changes/17233.deprecation.rst
new file mode 100644
index 000000000..7615b85c4
--- /dev/null
+++ b/doc/release/upcoming_changes/17233.deprecation.rst
@@ -0,0 +1,4 @@
+The ``ndincr`` method of ``ndindex`` is deprecated
+--------------------------------------------------
+The documentation has warned against using this function since NumPy 1.8.
+Use ``next(it)`` instead of ``it.ndincr()``.
diff --git a/doc/release/upcoming_changes/17241.compatibility.rst b/doc/release/upcoming_changes/17241.compatibility.rst
new file mode 100644
index 000000000..671f73d1e
--- /dev/null
+++ b/doc/release/upcoming_changes/17241.compatibility.rst
@@ -0,0 +1,6 @@
+The first element of the ``__array_interface__["data"]`` tuple must be an integer
+----------------------------------------------------------------------------------
+This has been the documented interface for many years, but there was still
+code that would accept a byte string representation of the pointer address.
+That code has been removed, passing the address as a byte string will now
+raise an error.
diff --git a/doc/release/upcoming_changes/17284.new_feature.rst b/doc/release/upcoming_changes/17284.new_feature.rst
new file mode 100644
index 000000000..9fb59e942
--- /dev/null
+++ b/doc/release/upcoming_changes/17284.new_feature.rst
@@ -0,0 +1,6 @@
+Allow passing optimizations arguments to asv build
+--------------------------------------------------
+It is now possible to pass ``-j``, ``--cpu-baseline``, ``--cpu-dispatch`` and
+``--disable-optimization`` flags to ASV build when the ``--bench-compare``
+argument is used.
+
diff --git a/doc/release/upcoming_changes/17344.new_feature.rst b/doc/release/upcoming_changes/17344.new_feature.rst
new file mode 100644
index 000000000..225bb0d5a
--- /dev/null
+++ b/doc/release/upcoming_changes/17344.new_feature.rst
@@ -0,0 +1,3 @@
+The NVIDIA HPC SDK nvfortran compiler is now supported
+------------------------------------------------------
+Support for the nvfortran compiler, a version of pgfortran, has been added.
diff --git a/doc/release/upcoming_changes/17394.new_function.rst b/doc/release/upcoming_changes/17394.new_function.rst
new file mode 100644
index 000000000..25e1ab220
--- /dev/null
+++ b/doc/release/upcoming_changes/17394.new_function.rst
@@ -0,0 +1,6 @@
+``sliding_window_view`` provides a sliding window view for numpy arrays
+-----------------------------------------------------------------------
+`numpy.lib.stride_tricks.sliding_window_view` constructs views on numpy
+arrays that offer a sliding or moving window access to the array. This allows
+for the simple implementation of certain algorithms, such as running means.
+
diff --git a/doc/release/upcoming_changes/17456.new_feature.rst b/doc/release/upcoming_changes/17456.new_feature.rst
new file mode 100644
index 000000000..7ab014e77
--- /dev/null
+++ b/doc/release/upcoming_changes/17456.new_feature.rst
@@ -0,0 +1,5 @@
+``dtype`` option for `cov` and `corrcoef`
+----------------------------------------------------
+The ``dtype`` option is now available for `numpy.cov` and `numpy.corrcoef`.
+It specifies which data-type the returned result should have.
+By default the functions still return a `numpy.float64` result.
diff --git a/doc/release/upcoming_changes/17535.new_function.rst b/doc/release/upcoming_changes/17535.new_function.rst
new file mode 100644
index 000000000..5be5c4c51
--- /dev/null
+++ b/doc/release/upcoming_changes/17535.new_function.rst
@@ -0,0 +1,15 @@
+`numpy.broadcast_shapes` is a new user-facing function
+------------------------------------------------------
+`~numpy.broadcast_shapes` gets the resulting shape from
+broadcasting the given shape tuples against each other.
+
+.. code:: python
+
+ >>> np.broadcast_shapes((1, 2), (3, 1))
+ (3, 2)
+
+ >>> np.broadcast_shapes(2, (3, 1))
+ (3, 2)
+
+ >>> np.broadcast_shapes((6, 7), (5, 6, 1), (7,), (5, 1, 7))
+ (5, 6, 7)
diff --git a/doc/release/upcoming_changes/17577.compatibility.rst b/doc/release/upcoming_changes/17577.compatibility.rst
new file mode 100644
index 000000000..d08805607
--- /dev/null
+++ b/doc/release/upcoming_changes/17577.compatibility.rst
@@ -0,0 +1,6 @@
+poly1d respects the dtype of all-zero argument
+----------------------------------------------
+Previously, constructing an instance of ``poly1d`` with all-zero
+coefficients would cast the coefficients to ``np.float64``.
+This affected the output dtype of methods which construct
+``poly1d`` instances internally, such as ``np.polymul``. \ No newline at end of file
diff --git a/doc/release/upcoming_changes/17580.compatibility.rst b/doc/release/upcoming_changes/17580.compatibility.rst
new file mode 100644
index 000000000..b8e1849af
--- /dev/null
+++ b/doc/release/upcoming_changes/17580.compatibility.rst
@@ -0,0 +1,4 @@
+The numpy.i file for swig is Python 3 only.
+-------------------------------------------
+Uses of Python 2.7 C-API functions have been updated to Python 3 only. Users
+who need the old version should take it from an older version of NumPy.
diff --git a/doc/release/upcoming_changes/17596.future.rst b/doc/release/upcoming_changes/17596.future.rst
new file mode 100644
index 000000000..168556891
--- /dev/null
+++ b/doc/release/upcoming_changes/17596.future.rst
@@ -0,0 +1,30 @@
+Arrays cannot be using subarray dtypes
+--------------------------------------
+Array creation and casting using ``np.array(arr, dtype)``
+and ``arr.astype(dtype)`` will use different logic when ``dtype``
+is a subarray dtype such as ``np.dtype("(2)i,")``.
+
+For such a ``dtype`` the following behaviour is true::
+
+ res = np.array(arr, dtype)
+
+ res.dtype is not dtype
+ res.dtype is dtype.base
+ res.shape == arr.shape + dtype.shape
+
+But ``res`` is filled using the logic::
+
+ res = np.empty(arr.shape + dtype.shape, dtype=dtype.base)
+ res[...] = arr
+
+which uses incorrect broadcasting (and often leads to an error).
+In the future, this will instead cast each element individually,
+leading to the same result as::
+
+ res = np.array(arr, dtype=np.dtype(["f", dtype]))["f"]
+
+Which can normally be used to opt-in to the new behaviour.
+
+This change does not affect ``np.array(list, dtype="(2)i,")`` unless the
+``list`` itself includes at least one array. In particular, the behaviour
+is unchanged for a list of tuples.
diff --git a/doc/release/upcoming_changes/17706.compatibility.rst b/doc/release/upcoming_changes/17706.compatibility.rst
new file mode 100644
index 000000000..41239dd3c
--- /dev/null
+++ b/doc/release/upcoming_changes/17706.compatibility.rst
@@ -0,0 +1,10 @@
+Void dtype discovery in ``np.array``
+------------------------------------
+In calls using ``np.array(..., dtype="V")``, ``arr.astype("V")``,
+and similar a TypeError will now be correctly raised unless all
+elements have the identical void length. An example for this is::
+
+ np.array([b"1", b"12"], dtype="V")
+
+Which previously returned an array with dtype ``"V2"`` which
+cannot represent ``b"1"`` faithfully.
diff --git a/doc/release/upcoming_changes/README.rst b/doc/release/upcoming_changes/README.rst
index 7f6476bda..ff5ca514c 100644
--- a/doc/release/upcoming_changes/README.rst
+++ b/doc/release/upcoming_changes/README.rst
@@ -21,11 +21,17 @@ Each file should be named like ``<PULL REQUEST>.<TYPE>.rst``, where
backwards compatible. (Not to be used for removal of deprecated features.)
* ``c_api``: Changes in the Numpy C-API exported functions
* ``new_feature``: New user facing features like ``kwargs``.
-* ``improvement``: Performance and edge-case changes
+* ``improvement``: General improvements and edge-case changes which are
+ not new features or compatibility related.
+* ``performance``: Performance changes that should not affect other behaviour.
* ``change``: Other changes
* ``highlight``: Adds a highlight bullet point to use as a possibly highlight
of the release.
+It is possible to add two files with different categories (and text) if both
+are relevant. For example a change may improve performance but have some
+compatibility concerns.
+
Most categories should be formatted as paragraphs with a heading.
So for example: ``123.new_feature.rst`` would have the content::
diff --git a/doc/scipy-sphinx-theme b/doc/scipy-sphinx-theme
deleted file mode 160000
-Subproject f0d96ae2bf3b010ce53adadde1e38997497a513
diff --git a/doc/source/_static/numpy.css b/doc/source/_static/numpy.css
new file mode 100644
index 000000000..22d08cc0d
--- /dev/null
+++ b/doc/source/_static/numpy.css
@@ -0,0 +1,40 @@
+@import url('https://fonts.googleapis.com/css2?family=Lato:ital,wght@0,400;0,700;0,900;1,400;1,700;1,900&family=Open+Sans:ital,wght@0,400;0,600;1,400;1,600&display=swap');
+
+.navbar-brand img {
+ height: 75px;
+}
+.navbar-brand {
+ height: 75px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+ color:#4A4A4A; /* numpy.org body color */
+}
+
+pre, code {
+ font-size: 100%;
+ line-height: 155%;
+}
+
+h1 {
+ font-style: "Lato", sans-serif;
+ color: #013243; /* warm black */
+ font-weight: 700;
+ letter-spacing: -.04em;
+ text-align: right;
+ margin-top: 3rem;
+ margin-bottom: 4rem;
+ font-size: 3rem;
+}
+
+
+h2 {
+ color: #4d77cf; /* han blue */
+ letter-spacing: -.03em;
+}
+
+h3 {
+ color: #013243; /* warm black */
+ letter-spacing: -.03em;
+}
diff --git a/doc/source/_static/numpy_logo.png b/doc/source/_static/numpy_logo.png
deleted file mode 100644
index af8cbe323..000000000
--- a/doc/source/_static/numpy_logo.png
+++ /dev/null
Binary files differ
diff --git a/doc/source/_static/numpylogo.svg b/doc/source/_static/numpylogo.svg
new file mode 100644
index 000000000..5f0dac700
--- /dev/null
+++ b/doc/source/_static/numpylogo.svg
@@ -0,0 +1,23 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!--Generator: Xara Designer (www.xara.com), SVG filter version: 6.4.0.3-->
+<svg fill="none" fill-rule="evenodd" stroke="black" stroke-width="0.501" stroke-linejoin="bevel" stroke-miterlimit="10" font-family="Times New Roman" font-size="16" style="font-variant-ligatures:none" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" version="1.1" overflow="visible" width="255.845pt" height="123.322pt" viewBox="0 -123.322 255.845 123.322">
+ <defs>
+ </defs>
+ <g id="Layer 1" transform="scale(1 -1)">
+ <path d="M 107.188,79.018 C 107.386,78.994 107.58,78.94 107.762,78.859 C 107.941,78.774 108.106,78.663 108.252,78.529 C 108.44,78.349 108.616,78.158 108.78,77.955 L 123.492,59.358 C 123.432,59.95 123.393,60.531 123.364,61.088 C 123.336,61.644 123.322,62.176 123.322,62.672 L 123.322,79.079 L 129.655,79.079 L 129.655,48.109 L 125.913,48.109 C 125.433,48.095 124.956,48.182 124.513,48.364 C 124.073,48.581 123.693,48.902 123.407,49.3 L 108.801,67.73 C 108.847,67.195 108.879,66.667 108.907,66.149 C 108.936,65.632 108.953,65.146 108.953,64.692 L 108.953,48.091 L 102.616,48.091 L 102.616,79.079 L 106.398,79.079 C 106.662,79.076 106.926,79.056 107.188,79.018 Z" fill="#013243" stroke="none" stroke-width="0.354" fill-rule="nonzero" stroke-linejoin="miter" marker-start="none" marker-end="none"/>
+ <path d="M 138.934,70.158 L 138.934,56.172 C 138.934,55.08 139.182,54.237 139.679,53.641 C 140.233,53.023 141.04,52.693 141.869,52.748 C 142.571,52.744 143.265,52.896 143.9,53.195 C 144.571,53.52 145.191,53.943 145.739,54.45 L 145.739,70.158 L 152.328,70.158 L 152.328,48.116 L 148.249,48.116 C 147.515,48.055 146.839,48.516 146.629,49.222 L 146.228,50.498 C 145.814,50.096 145.373,49.722 144.91,49.378 C 144.455,49.046 143.966,48.763 143.453,48.531 C 142.913,48.287 142.349,48.099 141.77,47.971 C 141.128,47.831 140.473,47.763 139.817,47.769 C 138.721,47.749 137.634,47.962 136.627,48.396 C 135.723,48.797 134.92,49.395 134.277,50.147 C 133.624,50.928 133.132,51.832 132.831,52.805 C 132.495,53.893 132.33,55.026 132.342,56.165 L 132.342,70.158 Z" fill="#013243" stroke="none" stroke-width="0.354" fill-rule="nonzero" stroke-linejoin="miter" marker-start="none" marker-end="none"/>
+ <path d="M 156.578,48.109 L 156.578,70.158 L 160.661,70.158 C 161.024,70.171 161.384,70.075 161.692,69.881 C 161.978,69.682 162.185,69.388 162.277,69.052 L 162.631,67.861 C 162.989,68.24 163.371,68.596 163.776,68.924 C 164.175,69.245 164.606,69.522 165.063,69.754 C 166.067,70.263 167.18,70.522 168.306,70.509 C 169.494,70.555 170.661,70.191 171.612,69.477 C 172.508,68.755 173.194,67.805 173.597,66.727 C 173.947,67.379 174.403,67.969 174.948,68.471 C 175.463,68.94 176.043,69.333 176.67,69.637 C 177.291,69.936 177.947,70.157 178.623,70.296 C 179.299,70.437 179.988,70.508 180.679,70.509 C 181.822,70.528 182.96,70.337 184.035,69.945 C 184.97,69.598 185.811,69.037 186.491,68.308 C 187.174,67.546 187.685,66.647 187.99,65.671 C 188.347,64.524 188.519,63.327 188.501,62.126 L 188.501,48.119 L 181.908,48.119 L 181.908,62.116 C 181.908,64.398 180.931,65.538 178.977,65.536 C 178.146,65.563 177.341,65.243 176.755,64.653 C 176.167,64.07 175.873,63.224 175.873,62.116 L 175.873,48.109 L 169.291,48.109 L 169.291,62.116 C 169.291,63.378 169.043,64.264 168.547,64.774 C 168.05,65.284 167.32,65.536 166.356,65.536 C 165.769,65.537 165.19,65.4 164.666,65.135 C 164.115,64.85 163.61,64.484 163.166,64.051 L 163.166,48.102 Z" fill="#013243" stroke="none" stroke-width="0.354" fill-rule="nonzero" stroke-linejoin="miter" marker-start="none" marker-end="none"/>
+ <path d="M 199.516,58.462 L 199.516,48.109 L 192.332,48.109 L 192.332,79.079 L 203.255,79.079 C 205.159,79.121 207.058,78.861 208.88,78.309 C 210.302,77.874 211.618,77.15 212.747,76.183 C 213.741,75.307 214.51,74.206 214.991,72.972 C 215.476,71.697 215.716,70.342 215.699,68.977 C 215.716,67.526 215.464,66.084 214.955,64.724 C 214.472,63.453 213.692,62.316 212.68,61.407 C 211.553,60.424 210.232,59.69 208.802,59.252 C 207.007,58.695 205.135,58.429 203.255,58.462 Z M 199.516,63.881 L 203.255,63.881 C 205.127,63.881 206.474,64.324 207.296,65.221 C 208.118,66.117 208.529,67.347 208.529,68.96 C 208.538,69.619 208.43,70.274 208.21,70.895 C 208.007,71.462 207.676,71.975 207.243,72.394 C 206.774,72.832 206.215,73.162 205.605,73.362 C 204.847,73.607 204.053,73.726 203.255,73.716 L 199.516,73.716 Z" fill="#013243" stroke="none" stroke-width="0.354" fill-rule="nonzero" stroke-linejoin="miter" marker-start="none" marker-end="none"/>
+ <path d="M 228.466,42.388 C 228.316,42.012 228.072,41.68 227.757,41.424 C 227.345,41.186 226.87,41.078 226.396,41.116 L 221.452,41.116 L 225.705,50.04 L 216.908,70.158 L 222.731,70.158 C 223.157,70.179 223.577,70.054 223.922,69.803 C 224.192,69.595 224.398,69.315 224.517,68.995 L 228.129,59.493 C 228.463,58.637 228.74,57.759 228.958,56.867 C 229.1,57.32 229.256,57.767 229.426,58.203 C 229.596,58.639 229.759,59.089 229.915,59.543 L 233.19,69.002 C 233.314,69.343 233.55,69.632 233.86,69.821 C 234.174,70.034 234.544,70.148 234.923,70.151 L 240.24,70.151 Z" fill="#013243" stroke="none" stroke-width="0.354" fill-rule="nonzero" stroke-linejoin="miter" marker-start="none" marker-end="none"/>
+ <path d="M 46.918,89.155 L 33.759,95.797 L 19.312,88.588 L 32.83,81.801 L 46.918,89.155 Z" fill="#4dabcf" stroke="none" stroke-width="0.354" fill-rule="nonzero" stroke-linejoin="miter" marker-start="none" marker-end="none"/>
+ <path d="M 52.954,86.11 L 66.752,79.142 L 52.437,71.955 L 38.898,78.752 L 52.954,86.11 Z" fill="#4dabcf" stroke="none" stroke-width="0.354" fill-rule="nonzero" stroke-linejoin="miter" marker-start="none" marker-end="none"/>
+ <path d="M 71.384,95.698 L 85.561,88.588 L 72.88,82.222 L 59.054,89.197 L 71.384,95.698 Z" fill="#4dabcf" stroke="none" stroke-width="0.354" fill-rule="nonzero" stroke-linejoin="miter" marker-start="none" marker-end="none"/>
+ <path d="M 65.281,98.76 L 52.518,105.161 L 39.894,98.859 L 53.046,92.228 L 65.281,98.76 Z" fill="#4dabcf" stroke="none" stroke-width="0.354" fill-rule="nonzero" stroke-linejoin="miter" marker-start="none" marker-end="none"/>
+ <path d="M 55.304,43.803 L 55.304,26.386 L 70.764,34.102 L 70.75,51.526 L 55.304,43.803 Z" fill="#4dabcf" stroke="none" stroke-width="0.354" fill-rule="nonzero" stroke-linejoin="miter" marker-start="none" marker-end="none"/>
+ <path d="M 70.743,57.607 L 70.725,74.847 L 55.304,67.18 L 55.304,49.934 L 70.743,57.607 Z" fill="#4dabcf" stroke="none" stroke-width="0.354" fill-rule="nonzero" stroke-linejoin="miter" marker-start="none" marker-end="none"/>
+ <path d="M 89.304,60.836 L 89.304,43.352 L 76.116,36.774 L 76.105,54.177 L 89.304,60.836 Z" fill="#4dabcf" stroke="none" stroke-width="0.354" fill-rule="nonzero" stroke-linejoin="miter" marker-start="none" marker-end="none"/>
+ <path d="M 89.304,66.95 L 89.304,84.083 L 76.091,77.516 L 76.102,60.241 L 89.304,66.95 Z" fill="#4dabcf" stroke="none" stroke-width="0.354" fill-rule="nonzero" stroke-linejoin="miter" marker-start="none" marker-end="none"/>
+ <path d="M 49.846,67.18 L 39.433,72.419 L 39.433,49.792 C 39.433,49.792 26.695,76.892 25.518,79.327 C 25.366,79.642 24.742,79.986 24.582,80.071 C 22.286,81.269 15.594,84.657 15.594,84.657 L 15.594,44.667 L 24.852,39.705 L 24.852,60.617 C 24.852,60.617 37.452,36.402 37.583,36.136 C 37.714,35.871 38.972,33.322 40.326,32.426 C 42.123,31.231 49.839,26.592 49.839,26.592 Z" fill="#4d77cf" stroke="none" stroke-width="0.354" fill-rule="nonzero" stroke-linejoin="miter" marker-start="none" marker-end="none"/>
+ </g>
+</svg>
diff --git a/doc/source/_templates/autosummary/attribute.rst b/doc/source/_templates/autosummary/attribute.rst
index a6ed600ef..9e0eaa25f 100644
--- a/doc/source/_templates/autosummary/attribute.rst
+++ b/doc/source/_templates/autosummary/attribute.rst
@@ -6,5 +6,8 @@
attribute
-.. auto{{ objtype }}:: {{ objname }}
+.. auto{{ objtype }}:: {{ fullname | replace("numpy.", "numpy::") }}
+{# In the fullname (e.g. `numpy.ma.MaskedArray.methodname`), the module name
+is ambiguous. Using a `::` separator (e.g. `numpy::ma.MaskedArray.methodname`)
+specifies `numpy` as the module name. #}
diff --git a/doc/source/_templates/autosummary/base.rst b/doc/source/_templates/autosummary/base.rst
index 0331154a7..91bfff9ba 100644
--- a/doc/source/_templates/autosummary/base.rst
+++ b/doc/source/_templates/autosummary/base.rst
@@ -10,5 +10,8 @@
property
{% endif %}
-.. auto{{ objtype }}:: {{ objname }}
+.. auto{{ objtype }}:: {{ fullname | replace("numpy.", "numpy::") }}
+{# In the fullname (e.g. `numpy.ma.MaskedArray.methodname`), the module name
+is ambiguous. Using a `::` separator (e.g. `numpy::ma.MaskedArray.methodname`)
+specifies `numpy` as the module name. #}
diff --git a/doc/source/_templates/autosummary/member.rst b/doc/source/_templates/autosummary/member.rst
index f1f30e123..c0dcd5ed2 100644
--- a/doc/source/_templates/autosummary/member.rst
+++ b/doc/source/_templates/autosummary/member.rst
@@ -6,6 +6,8 @@
member
-.. auto{{ objtype }}:: {{ objname }}
-
+.. auto{{ objtype }}:: {{ fullname | replace("numpy.", "numpy::") }}
+{# In the fullname (e.g. `numpy.ma.MaskedArray.methodname`), the module name
+is ambiguous. Using a `::` separator (e.g. `numpy::ma.MaskedArray.methodname`)
+specifies `numpy` as the module name. #}
diff --git a/doc/source/_templates/autosummary/method.rst b/doc/source/_templates/autosummary/method.rst
index 8abda8677..0dd226393 100644
--- a/doc/source/_templates/autosummary/method.rst
+++ b/doc/source/_templates/autosummary/method.rst
@@ -6,5 +6,8 @@
method
-.. auto{{ objtype }}:: {{ objname }}
+.. auto{{ objtype }}:: {{ fullname | replace("numpy.", "numpy::") }}
+{# In the fullname (e.g. `numpy.ma.MaskedArray.methodname`), the module name
+is ambiguous. Using a `::` separator (e.g. `numpy::ma.MaskedArray.methodname`)
+specifies `numpy` as the module name. #}
diff --git a/doc/source/_templates/defindex.html b/doc/source/_templates/defindex.html
deleted file mode 100644
index 8eaadecb9..000000000
--- a/doc/source/_templates/defindex.html
+++ /dev/null
@@ -1,35 +0,0 @@
-{#
- basic/defindex.html
- ~~~~~~~~~~~~~~~~~~~
-
- Default template for the "index" page.
-
- :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS.
- :license: BSD, see LICENSE for details.
-#}
-{%- extends "layout.html" %}
-{% set title = _('Overview') %}
-{% block body %}
- <h1>{{ docstitle|e }}</h1>
- <p>
- {{ _('Welcome! This is') }}
- {% block description %}{{ _('the documentation for') }} {{ project|e }}
- {{ release|e }}{% if last_updated %}, {{ _('last updated') }} {{ last_updated|e }}{% endif %}{% endblock %}.
- </p>
- {% block tables %}
- <p><strong>{{ _('Indices and tables:') }}</strong></p>
- <table class="contentstable"><tr>
- <td style="width: 50%">
- <p class="biglink"><a class="biglink" href="{{ pathto("contents") }}">{{ _('Complete Table of Contents') }}</a><br>
- <span class="linkdescr">{{ _('lists all sections and subsections') }}</span></p>
- <p class="biglink"><a class="biglink" href="{{ pathto("search") }}">{{ _('Search Page') }}</a><br>
- <span class="linkdescr">{{ _('search this documentation') }}</span></p>
- </td><td style="width: 50%">
- <p class="biglink"><a class="biglink" href="{{ pathto("modindex") }}">{{ _('Global Module Index') }}</a><br>
- <span class="linkdescr">{{ _('quick access to all modules') }}</span></p>
- <p class="biglink"><a class="biglink" href="{{ pathto("genindex") }}">{{ _('General Index') }}</a><br>
- <span class="linkdescr">{{ _('all functions, classes, terms') }}</span></p>
- </td></tr>
- </table>
- {% endblock %}
-{% endblock %}
diff --git a/doc/source/_templates/indexcontent.html b/doc/source/_templates/indexcontent.html
index d77c5a85e..6dd6bf9b0 100644
--- a/doc/source/_templates/indexcontent.html
+++ b/doc/source/_templates/indexcontent.html
@@ -1,23 +1,33 @@
-{% extends "defindex.html" %}
-{% block tables %}
+{#
+ Loosely inspired by the deprecated sphinx/themes/basic/defindex.html
+#}
+{%- extends "layout.html" %}
+{% set title = _('Overview') %}
+{% block body %}
+<h1>{{ docstitle|e }}</h1>
+<p>
+ Welcome! This is the documentation for NumPy {{ release|e }}
+ {% if last_updated %}, last updated {{ last_updated|e }}{% endif %}.
+</p>
<p><strong>For users:</strong></p>
<table class="contentstable" align="center"><tr>
<td width="50%">
- <p class="biglink"><a class="biglink" href="{{ pathto("user/setting-up") }}">Setting Up</a><br/>
- <span class="linkdescr">Learn about what NumPy is and how to install it</span></p>
- <p class="biglink"><a class="biglink" href="{{ pathto("user/quickstart") }}">Quickstart Tutorial</a><br/>
+ <p class="biglink"><a class="biglink" href="{{ pathto("user/whatisnumpy") }}">What is NumPy?</a><br/>
+ <span class="linkdescr">Who uses it and why</span></p>
+ <p class="biglink"><a class="biglink" href="https://numpy.org/install/">Installation</a><br/>
+ <p class="biglink"><a class="biglink" href="{{ pathto("user/quickstart") }}">Quickstart</a><br/>
<span class="linkdescr">Aimed at domain experts or people migrating to NumPy</span></p>
- <p class="biglink"><a class="biglink" href="{{ pathto("user/absolute_beginners") }}">Absolute Beginners Tutorial</a><br/>
+ <p class="biglink"><a class="biglink" href="{{ pathto("user/absolute_beginners") }}">Absolute beginner's guide</a><br/>
<span class="linkdescr">Start here for an overview of NumPy features and syntax</span></p>
<p class="biglink"><a class="biglink" href="{{ pathto("user/tutorials_index") }}">Tutorials</a><br/>
<span class="linkdescr">Learn about concepts and submodules</span></p>
- <p class="biglink"><a class="biglink" href="{{ pathto("user/howtos_index") }}">How Tos</a><br/>
+ <p class="biglink"><a class="biglink" href="{{ pathto("user/howtos_index") }}">How-tos</a><br/>
<span class="linkdescr">How to do common tasks with NumPy</span></p>
- <p class="biglink"><a class="biglink" href="{{ pathto("reference/index") }}">NumPy API Reference</a><br/>
+ <p class="biglink"><a class="biglink" href="{{ pathto("reference/index") }}">NumPy API reference</a><br/>
<span class="linkdescr">Automatically generated reference documentation</span></p>
<p class="biglink"><a class="biglink" href="{{ pathto("user/explanations_index") }}">Explanations</a><br/>
<span class="linkdescr">In depth explanation of concepts, best practices and techniques</span></p>
- <p class="biglink"><a class="biglink" href="{{ pathto("f2py/index") }}">F2Py Guide</a><br/>
+ <p class="biglink"><a class="biglink" href="{{ pathto("f2py/index") }}">F2Py guide</a><br/>
<span class="linkdescr">Documentation for the f2py module (Fortran extensions for Python)</span></p>
<p class="biglink"><a class="biglink" href="{{ pathto("glossary") }}">Glossary</a><br/>
<span class="linkdescr">List of the most important terms</span></p>
@@ -27,11 +37,11 @@
<p><strong>For developers/contributors:</strong></p>
<table class="contentstable" align="center"><tr>
<td width="50%">
- <p class="biglink"><a class="biglink" href="{{ pathto("dev/index") }}">NumPy Contributor Guide</a><br/>
+ <p class="biglink"><a class="biglink" href="{{ pathto("dev/index") }}">NumPy contributor guide</a><br/>
<span class="linkdescr">Contributing to NumPy</span></p>
<p class="biglink"><a class="biglink" href="{{ pathto("dev/underthehood") }}">Under-the-hood docs</a><br/>
<span class="linkdescr">Specialized, in-depth documentation</span></p>
- <p class="biglink"><a class="biglink" href="{{ pathto("docs/index") }}">Building and Extending the Documentation</a><br/>
+ <p class="biglink"><a class="biglink" href="{{ pathto("docs/index") }}">Building and extending the documentation</a><br/>
<span class="linkdescr">How to contribute to this documentation (user and API)</span></p>
<p class="biglink"><a class="biglink" href="{{ pathto("docs/howto_document") }}">The numpydoc docstring guide</a><br/>
<span class="linkdescr">How to write docstrings in the numpydoc format</span></p>
@@ -45,9 +55,9 @@
<table class="contentstable" align="center"><tr>
<td width="50%">
<p class="biglink"><a class="biglink" href="{{ pathto("bugs") }}">Reporting bugs</a></p>
- <p class="biglink"><a class="biglink" href="{{ pathto("release") }}">Release Notes</a></p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("release") }}">Release notes</a></p>
</td><td width="50%">
- <p class="biglink"><a class="biglink" href="{{ pathto("about") }}">About NumPy</a></p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("doc_conventions") }}">Document conventions</a></p>
<p class="biglink"><a class="biglink" href="{{ pathto("license") }}">License of NumPy</a></p>
</td></tr>
</table>
@@ -56,13 +66,13 @@
<p>
Large parts of this manual originate from Travis E. Oliphant's book
<a href="https://archive.org/details/NumPyBook">"Guide to NumPy"</a>
- (which generously entered Public Domain in August 2008). The reference
+ (which generously entered public domain in August 2008). The reference
documentation for many of the functions are written by numerous
contributors and developers of NumPy.
</p>
<p>
The preferred way to update the documentation is by submitting a pull
- request on Github (see the <a href="{{ pathto("docs/index") }}">Documentation Index</a>).
+ request on GitHub (see the <a href="{{ pathto("docs/index") }}">Documentation index</a>).
Please help us to further improve the NumPy documentation!
</p>
{% endblock %}
diff --git a/doc/source/_templates/layout.html b/doc/source/_templates/layout.html
index beaa297db..e2812fdd5 100644
--- a/doc/source/_templates/layout.html
+++ b/doc/source/_templates/layout.html
@@ -1,30 +1,10 @@
{% extends "!layout.html" %}
-{%- block header %}
-<div class="container">
- <div class="top-scipy-org-logo-header" style="background-color: #a2bae8;">
- <a href="{{ pathto('index') }}">
- <img border=0 alt="NumPy" src="{{ pathto('_static/numpy_logo.png', 1) }}"></a>
- </div>
- </div>
-</div>
+{%- block extrahead %}
+{{ super() }}
+<link rel="stylesheet" href="{{ pathto('_static/numpy.css', 1) }}" type="text/css" />
-{% endblock %}
-{% block rootrellink %}
- {% if pagename != 'index' %}
- <li class="active"><a href="{{ pathto('index') }}">{{ shorttitle|e }}</a></li>
- {% endif %}
-{% endblock %}
+ <!-- PR #17220: This is added via javascript in versionwarning.js -->
+ <!-- link rel="canonical" href="http://numpy.org/doc/stable/{{ pagename }}{{ file_suffix }}" / -->
-{% block sidebarsearch %}
-{%- if sourcename %}
-<ul class="this-page-menu">
-{%- if 'reference/generated' in sourcename %}
- <li><a href="/numpy/docs/{{ sourcename.replace('reference/generated/', '').replace('.txt', '') |e }}">{{_('Edit page')}}</a></li>
-{%- else %}
- <li><a href="/numpy/docs/numpy-docs/{{ sourcename.replace('.txt', '.rst') |e }}">{{_('Edit page')}}</a></li>
-{%- endif %}
-</ul>
-{%- endif %}
-{{ super() }}
{% endblock %}
diff --git a/doc/source/about.rst b/doc/source/about.rst
deleted file mode 100644
index 3e83833d1..000000000
--- a/doc/source/about.rst
+++ /dev/null
@@ -1,62 +0,0 @@
-About NumPy
-===========
-
-NumPy is the fundamental package
-needed for scientific computing with Python. This package contains:
-
-- a powerful N-dimensional :ref:`array object <arrays>`
-- sophisticated :ref:`(broadcasting) functions <ufuncs>`
-- basic :ref:`linear algebra functions <routines.linalg>`
-- basic :ref:`Fourier transforms <routines.fft>`
-- sophisticated :ref:`random number capabilities <numpyrandom>`
-- tools for integrating Fortran code
-- tools for integrating C/C++ code
-
-Besides its obvious scientific uses, *NumPy* can also be used as an
-efficient multi-dimensional container of generic data. Arbitrary
-data types can be defined. This allows *NumPy* to seamlessly and
-speedily integrate with a wide variety of databases.
-
-NumPy is a successor for two earlier scientific Python libraries:
-Numeric and Numarray.
-
-NumPy community
----------------
-
-NumPy is a distributed, volunteer, open-source project. *You* can help
-us make it better; if you believe something should be improved either
-in functionality or in documentation, don't hesitate to contact us --- or
-even better, contact us and participate in fixing the problem.
-
-Our main means of communication are:
-
-- `scipy.org website <https://scipy.org/>`__
-
-- `Mailing lists <https://scipy.org/scipylib/mailing-lists.html>`__
-
-- `NumPy Issues <https://github.com/numpy/numpy/issues>`__ (bug reports go here)
-
-- `Old NumPy Trac <http://projects.scipy.org/numpy>`__ (dead link)
-
-More information about the development of NumPy can be found at our `Developer Zone <https://scipy.scipy.org/scipylib/dev-zone.html>`__.
-
-The project management structure can be found at our :doc:`governance page <dev/governance/index>`
-
-
-About this documentation
-========================
-
-Conventions
------------
-
-Names of classes, objects, constants, etc. are given in **boldface** font.
-Often they are also links to a more detailed documentation of the
-referred object.
-
-This manual contains many examples of use, usually prefixed with the
-Python prompt ``>>>`` (which is not a part of the example code). The
-examples assume that you have first entered::
-
->>> import numpy as np
-
-before running the examples.
diff --git a/doc/source/conf.py b/doc/source/conf.py
index d6a0f8bf3..381a01612 100644
--- a/doc/source/conf.py
+++ b/doc/source/conf.py
@@ -6,6 +6,62 @@ import sys
# Minimum version, enforced by sphinx
needs_sphinx = '2.2.0'
+
+# This is a nasty hack to use platform-agnostic names for types in the
+# documentation.
+
+# must be kept alive to hold the patched names
+_name_cache = {}
+
+def replace_scalar_type_names():
+ """ Rename numpy types to use the canonical names to make sphinx behave """
+ import ctypes
+
+ Py_ssize_t = ctypes.c_int64 if ctypes.sizeof(ctypes.c_void_p) == 8 else ctypes.c_int32
+
+ class PyObject(ctypes.Structure):
+ pass
+
+ class PyTypeObject(ctypes.Structure):
+ pass
+
+ PyObject._fields_ = [
+ ('ob_refcnt', Py_ssize_t),
+ ('ob_type', ctypes.POINTER(PyTypeObject)),
+ ]
+
+
+ PyTypeObject._fields_ = [
+ # varhead
+ ('ob_base', PyObject),
+ ('ob_size', Py_ssize_t),
+ # declaration
+ ('tp_name', ctypes.c_char_p),
+ ]
+
+ # prevent numpy attaching docstrings to the scalar types
+ assert 'numpy.core._add_newdocs_scalars' not in sys.modules
+ sys.modules['numpy.core._add_newdocs_scalars'] = object()
+
+ import numpy
+
+ # change the __name__ of the scalar types
+ for name in [
+ 'byte', 'short', 'intc', 'int_', 'longlong',
+ 'ubyte', 'ushort', 'uintc', 'uint', 'ulonglong',
+ 'half', 'single', 'double', 'longdouble',
+ 'half', 'csingle', 'cdouble', 'clongdouble',
+ ]:
+ typ = getattr(numpy, name)
+ c_typ = PyTypeObject.from_address(id(typ))
+ c_typ.tp_name = _name_cache[typ] = b"numpy." + name.encode('utf8')
+
+ # now generate the docstrings as usual
+ del sys.modules['numpy.core._add_newdocs_scalars']
+ import numpy.core._add_newdocs_scalars
+
+replace_scalar_type_names()
+
# -----------------------------------------------------------------------------
# General configuration
# -----------------------------------------------------------------------------
@@ -88,40 +144,21 @@ pygments_style = 'sphinx'
def setup(app):
# add a config value for `ifconfig` directives
app.add_config_value('python_version_major', str(sys.version_info.major), 'env')
- app.add_lexer('NumPyC', NumPyLexer(stripnl=False))
+ app.add_lexer('NumPyC', NumPyLexer)
# -----------------------------------------------------------------------------
# HTML output
# -----------------------------------------------------------------------------
-themedir = os.path.join(os.pardir, 'scipy-sphinx-theme', '_theme')
-if not os.path.isdir(themedir):
- raise RuntimeError("Get the scipy-sphinx-theme first, "
- "via git submodule init && git submodule update")
-
-html_theme = 'scipy'
-html_theme_path = [themedir]
-
-if 'scipyorg' in tags:
- # Build for the scipy.org website
- html_theme_options = {
- "edit_link": True,
- "sidebar": "right",
- "scipy_org_logo": True,
- "rootlinks": [("https://scipy.org/", "Scipy.org"),
- ("https://docs.scipy.org/", "Docs")]
- }
-else:
- # Default build
- html_theme_options = {
- "edit_link": False,
- "sidebar": "left",
- "scipy_org_logo": False,
- "rootlinks": [("https://numpy.org/", "NumPy.org"),
- ("https://numpy.org/doc", "Docs"),
- ]
- }
- html_sidebars = {'index': ['indexsidebar.html', 'searchbox.html']}
+html_theme = 'pydata_sphinx_theme'
+
+html_logo = '_static/numpylogo.svg'
+
+html_theme_options = {
+ "github_url": "https://github.com/numpy/numpy",
+ "twitter_url": "https://twitter.com/numpy_team",
+}
+
html_additional_pages = {
'index': 'indexcontent.html',
@@ -240,11 +277,14 @@ texinfo_documents = [
# Intersphinx configuration
# -----------------------------------------------------------------------------
intersphinx_mapping = {
+ 'neps': ('https://numpy.org/neps', None),
'python': ('https://docs.python.org/dev', None),
'scipy': ('https://docs.scipy.org/doc/scipy/reference', None),
'matplotlib': ('https://matplotlib.org', None),
'imageio': ('https://imageio.readthedocs.io/en/stable', None),
- 'skimage': ('https://scikit-image.org/docs/stable', None)
+ 'skimage': ('https://scikit-image.org/docs/stable', None),
+ 'pandas': ('https://pandas.pydata.org/pandas-docs/stable', None),
+ 'scipy-lecture-notes': ('https://scipy-lectures.org', None),
}
@@ -328,6 +368,17 @@ for name in ['sphinx.ext.linkcode', 'numpydoc.linkcode']:
else:
print("NOTE: linkcode extension not found -- no links to source generated")
+
+def _get_c_source_file(obj):
+ if issubclass(obj, numpy.generic):
+ return r"core/src/multiarray/scalartypes.c.src"
+ elif obj is numpy.ndarray:
+ return r"core/src/multiarray/arrayobject.c"
+ else:
+ # todo: come up with a better way to generate these
+ return None
+
+
def linkcode_resolve(domain, info):
"""
Determine the URL corresponding to Python object
@@ -358,25 +409,33 @@ def linkcode_resolve(domain, info):
else:
obj = unwrap(obj)
- try:
- fn = inspect.getsourcefile(obj)
- except Exception:
- fn = None
- if not fn:
- return None
+ fn = None
+ lineno = None
- try:
- source, lineno = inspect.getsourcelines(obj)
- except Exception:
- lineno = None
+ # Make a poor effort at linking C extension types
+ if isinstance(obj, type) and obj.__module__ == 'numpy':
+ fn = _get_c_source_file(obj)
+
+ if fn is None:
+ try:
+ fn = inspect.getsourcefile(obj)
+ except Exception:
+ fn = None
+ if not fn:
+ return None
+
+ try:
+ source, lineno = inspect.getsourcelines(obj)
+ except Exception:
+ lineno = None
+
+ fn = relpath(fn, start=dirname(numpy.__file__))
if lineno:
linespec = "#L%d-L%d" % (lineno, lineno + len(source) - 1)
else:
linespec = ""
- fn = relpath(fn, start=dirname(numpy.__file__))
-
if 'dev' in numpy.__version__:
return "https://github.com/numpy/numpy/blob/master/numpy/%s%s" % (
fn, linespec)
@@ -385,15 +444,15 @@ def linkcode_resolve(domain, info):
numpy.__version__, fn, linespec)
from pygments.lexers import CLexer
-import copy
+from pygments.lexer import inherit, bygroups
+from pygments.token import Comment
class NumPyLexer(CLexer):
name = 'NUMPYLEXER'
- tokens = copy.deepcopy(CLexer.tokens)
- # Extend the regex for valid identifiers with @
- for k, val in tokens.items():
- for i, v in enumerate(val):
- if isinstance(v, tuple):
- if isinstance(v[0], str):
- val[i] = (v[0].replace('a-zA-Z', 'a-zA-Z@'),) + v[1:]
+ tokens = {
+ 'statements': [
+ (r'@[a-zA-Z_]*@', Comment.Preproc, 'macro'),
+ inherit,
+ ],
+ }
diff --git a/doc/source/contents.rst b/doc/source/contents.rst
index baea7784c..5d4e12097 100644
--- a/doc/source/contents.rst
+++ b/doc/source/contents.rst
@@ -5,23 +5,12 @@ NumPy Documentation
###################
.. toctree::
+ :maxdepth: 1
- user/setting-up
- user/quickstart
- user/absolute_beginners
- user/tutorials_index
- user/howtos_index
- reference/index
- user/explanations_index
- f2py/index
- glossary
- dev/index
- dev/underthehood
- docs/index
- docs/howto_document
- benchmarking
- bugs
- release
- about
- license
+ User Guide <user/index>
+ API reference <reference/index>
+ Development <dev/index>
+.. This is not really the index page, that is found in
+ _templates/indexcontent.html The toctree content here will be added to the
+ top of the template header
diff --git a/doc/source/dev/conduct/code_of_conduct.rst b/doc/source/dev/conduct/code_of_conduct.rst
deleted file mode 100644
index f2f0a536d..000000000
--- a/doc/source/dev/conduct/code_of_conduct.rst
+++ /dev/null
@@ -1,163 +0,0 @@
-NumPy Code of Conduct
-=====================
-
-
-Introduction
-------------
-
-This code of conduct applies to all spaces managed by the NumPy project,
-including all public and private mailing lists, issue trackers, wikis, blogs,
-Twitter, and any other communication channel used by our community. The NumPy
-project does not organise in-person events, however events related to our
-community should have a code of conduct similar in spirit to this one.
-
-This code of conduct should be honored by everyone who participates in
-the NumPy community formally or informally, or claims any affiliation with the
-project, in any project-related activities and especially when representing the
-project, in any role.
-
-This code is not exhaustive or complete. It serves to distill our common
-understanding of a collaborative, shared environment and goals. Please try to
-follow this code in spirit as much as in letter, to create a friendly and
-productive environment that enriches the surrounding community.
-
-
-Specific Guidelines
--------------------
-
-We strive to:
-
-1. Be open. We invite anyone to participate in our community. We prefer to use
- public methods of communication for project-related messages, unless
- discussing something sensitive. This applies to messages for help or
- project-related support, too; not only is a public support request much more
- likely to result in an answer to a question, it also ensures that any
- inadvertent mistakes in answering are more easily detected and corrected.
-
-2. Be empathetic, welcoming, friendly, and patient. We work together to resolve
- conflict, and assume good intentions. We may all experience some frustration
- from time to time, but we do not allow frustration to turn into a personal
- attack. A community where people feel uncomfortable or threatened is not a
- productive one.
-
-3. Be collaborative. Our work will be used by other people, and in turn we will
- depend on the work of others. When we make something for the benefit of the
- project, we are willing to explain to others how it works, so that they can
- build on the work to make it even better. Any decision we make will affect
- users and colleagues, and we take those consequences seriously when making
- decisions.
-
-4. Be inquisitive. Nobody knows everything! Asking questions early avoids many
- problems later, so we encourage questions, although we may direct them to
- the appropriate forum. We will try hard to be responsive and helpful.
-
-5. Be careful in the words that we choose. We are careful and respectful in
- our communication and we take responsibility for our own speech. Be kind to
- others. Do not insult or put down other participants. We will not accept
- harassment or other exclusionary behaviour, such as:
-
- - Violent threats or language directed against another person.
- - Sexist, racist, or otherwise discriminatory jokes and language.
- - Posting sexually explicit or violent material.
- - Posting (or threatening to post) other people's personally identifying information ("doxing").
- - Sharing private content, such as emails sent privately or non-publicly,
- or unlogged forums such as IRC channel history, without the sender's consent.
- - Personal insults, especially those using racist or sexist terms.
- - Unwelcome sexual attention.
- - Excessive profanity. Please avoid swearwords; people differ greatly in their sensitivity to swearing.
- - Repeated harassment of others. In general, if someone asks you to stop, then stop.
- - Advocating for, or encouraging, any of the above behaviour.
-
-
-Diversity Statement
--------------------
-
-The NumPy project welcomes and encourages participation by everyone. We are
-committed to being a community that everyone enjoys being part of. Although
-we may not always be able to accommodate each individual's preferences, we try
-our best to treat everyone kindly.
-
-No matter how you identify yourself or how others perceive you: we welcome you.
-Though no list can hope to be comprehensive, we explicitly honour diversity in:
-age, culture, ethnicity, genotype, gender identity or expression, language,
-national origin, neurotype, phenotype, political beliefs, profession, race,
-religion, sexual orientation, socioeconomic status, subculture and technical
-ability, to the extent that these do not conflict with this code of conduct.
-
-
-Though we welcome people fluent in all languages, NumPy development is
-conducted in English.
-
-Standards for behaviour in the NumPy community are detailed in the Code of
-Conduct above. Participants in our community should uphold these standards
-in all their interactions and help others to do so as well (see next section).
-
-
-Reporting Guidelines
---------------------
-
-We know that it is painfully common for internet communication to start at or
-devolve into obvious and flagrant abuse. We also recognize that sometimes
-people may have a bad day, or be unaware of some of the guidelines in this Code
-of Conduct. Please keep this in mind when deciding on how to respond to a
-breach of this Code.
-
-For clearly intentional breaches, report those to the Code of Conduct committee
-(see below). For possibly unintentional breaches, you may reply to the person
-and point out this code of conduct (either in public or in private, whatever is
-most appropriate). If you would prefer not to do that, please feel free to
-report to the Code of Conduct Committee directly, or ask the Committee for
-advice, in confidence.
-
-You can report issues to the NumPy Code of Conduct committee, at
-numpy-conduct@googlegroups.com. Currently, the committee consists of:
-
-- Stefan van der Walt
-- Melissa Weber Mendonça
-- Anirudh Subramanian
-
-If your report involves any members of the committee, or if they feel they have
-a conflict of interest in handling it, then they will recuse themselves from
-considering your report. Alternatively, if for any reason you feel
-uncomfortable making a report to the committee, then you can also contact:
-
-- Senior `NumFOCUS staff <https://numfocus.org/code-of-conduct#persons-responsible>`__: conduct@numfocus.org
-
-
-Incident reporting resolution & Code of Conduct enforcement
------------------------------------------------------------
-
-*This section summarizes the most important points, more details can be found
-in* :ref:`CoC_reporting_manual`.
-
-We will investigate and respond to all complaints. The NumPy Code of Conduct
-Committee and the NumPy Steering Committee (if involved) will protect the
-identity of the reporter, and treat the content of complaints as confidential
-(unless the reporter agrees otherwise).
-
-In case of severe and obvious breaches, e.g. personal threat or violent, sexist
-or racist language, we will immediately disconnect the originator from NumPy
-communication channels; please see the manual for details.
-
-In cases not involving clear severe and obvious breaches of this code of
-conduct, the process for acting on any received code of conduct violation
-report will be:
-
-1. acknowledge report is received
-2. reasonable discussion/feedback
-3. mediation (if feedback didn't help, and only if both reporter and reportee agree to this)
-4. enforcement via transparent decision (see :ref:`CoC_resolutions`) by the
- Code of Conduct Committee
-
-The committee will respond to any report as soon as possible, and at most
-within 72 hours.
-
-
-Endnotes
---------
-
-We are thankful to the groups behind the following documents, from which we
-drew content and inspiration:
-
-- `The SciPy Code of Conduct <https://docs.scipy.org/doc/scipy/reference/dev/conduct/code_of_conduct.html>`_
-
diff --git a/doc/source/dev/conduct/report_handling_manual.rst b/doc/source/dev/conduct/report_handling_manual.rst
deleted file mode 100644
index d39b615bb..000000000
--- a/doc/source/dev/conduct/report_handling_manual.rst
+++ /dev/null
@@ -1,220 +0,0 @@
-:orphan:
-
-.. _CoC_reporting_manual:
-
-NumPy Code of Conduct - How to follow up on a report
-----------------------------------------------------
-
-This is the manual followed by NumPy's Code of Conduct Committee. It's used
-when we respond to an issue to make sure we're consistent and fair.
-
-Enforcing the Code of Conduct impacts our community today and for the future.
-It's an action that we do not take lightly. When reviewing enforcement
-measures, the Code of Conduct Committee will keep the following values and
-guidelines in mind:
-
-* Act in a personal manner rather than impersonal. The Committee can engage
- the parties to understand the situation, while respecting the privacy and any
- necessary confidentiality of reporters. However, sometimes it is necessary
- to communicate with one or more individuals directly: the Committee's goal is
- to improve the health of our community rather than only produce a formal
- decision.
-
-* Emphasize empathy for individuals rather than judging behavior, avoiding
- binary labels of "good" and "bad/evil". Overt, clear-cut aggression and
- harassment exists and we will be address that firmly. But many scenarios
- that can prove challenging to resolve are those where normal disagreements
- devolve into unhelpful or harmful behavior from multiple parties.
- Understanding the full context and finding a path that re-engages all is
- hard, but ultimately the most productive for our community.
-
-* We understand that email is a difficult medium and can be isolating.
- Receiving criticism over email, without personal contact, can be
- particularly painful. This makes it especially important to keep an
- atmosphere of open-minded respect of the views of others. It also means
- that we must be transparent in our actions, and that we will do everything
- in our power to make sure that all our members are treated fairly and with
- sympathy.
-
-* Discrimination can be subtle and it can be unconscious. It can show itself
- as unfairness and hostility in otherwise ordinary interactions. We know
- that this does occur, and we will take care to look out for it. We would
- very much like to hear from you if you feel you have been treated unfairly,
- and we will use these procedures to make sure that your complaint is heard
- and addressed.
-
-* Help increase engagement in good discussion practice: try to identify where
- discussion may have broken down and provide actionable information, pointers
- and resources that can lead to positive change on these points.
-
-* Be mindful of the needs of new members: provide them with explicit support
- and consideration, with the aim of increasing participation from
- underrepresented groups in particular.
-
-* Individuals come from different cultural backgrounds and native languages.
- Try to identify any honest misunderstandings caused by a non-native speaker
- and help them understand the issue and what they can change to avoid causing
- offence. Complex discussion in a foreign language can be very intimidating,
- and we want to grow our diversity also across nationalities and cultures.
-
-*Mediation*: voluntary, informal mediation is a tool at our disposal. In
-contexts such as when two or more parties have all escalated to the point of
-inappropriate behavior (something sadly common in human conflict), it may be
-useful to facilitate a mediation process. This is only an example: the
-Committee can consider mediation in any case, mindful that the process is meant
-to be strictly voluntary and no party can be pressured to participate. If the
-Committee suggests mediation, it should:
-
-* Find a candidate who can serve as a mediator.
-* Obtain the agreement of the reporter(s). The reporter(s) have complete
- freedom to decline the mediation idea, or to propose an alternate mediator.
-* Obtain the agreement of the reported person(s).
-* Settle on the mediator: while parties can propose a different mediator than
- the suggested candidate, only if common agreement is reached on all terms can
- the process move forward.
-* Establish a timeline for mediation to complete, ideally within two weeks.
-
-The mediator will engage with all the parties and seek a resolution that is
-satisfactory to all. Upon completion, the mediator will provide a report
-(vetted by all parties to the process) to the Committee, with recommendations
-on further steps. The Committee will then evaluate these results (whether
-satisfactory resolution was achieved or not) and decide on any additional
-action deemed necessary.
-
-
-How the committee will respond to reports
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-When the committee (or a committee member) receives a report, they will first
-determine whether the report is about a clear and severe breach (as defined
-below). If so, immediate action needs to be taken in addition to the regular
-report handling process.
-
-Clear and severe breach actions
-+++++++++++++++++++++++++++++++
-
-We know that it is painfully common for internet communication to start at or
-devolve into obvious and flagrant abuse. We will deal quickly with clear and
-severe breaches like personal threats, violent, sexist or racist language.
-
-When a member of the Code of Conduct committee becomes aware of a clear and
-severe breach, they will do the following:
-
-* Immediately disconnect the originator from all NumPy communication channels.
-* Reply to the reporter that their report has been received and that the
- originator has been disconnected.
-* In every case, the moderator should make a reasonable effort to contact the
- originator, and tell them specifically how their language or actions
- qualify as a "clear and severe breach". The moderator should also say
- that, if the originator believes this is unfair or they want to be
- reconnected to NumPy, they have the right to ask for a review, as below, by
- the Code of Conduct Committee.
- The moderator should copy this explanation to the Code of Conduct Committee.
-* The Code of Conduct Committee will formally review and sign off on all cases
- where this mechanism has been applied to make sure it is not being used to
- control ordinary heated disagreement.
-
-Report handling
-+++++++++++++++
-
-When a report is sent to the committee they will immediately reply to the
-reporter to confirm receipt. This reply must be sent within 72 hours, and the
-group should strive to respond much quicker than that.
-
-If a report doesn't contain enough information, the committee will obtain all
-relevant data before acting. The committee is empowered to act on the Steering
-Council’s behalf in contacting any individuals involved to get a more complete
-account of events.
-
-The committee will then review the incident and determine, to the best of their
-ability:
-
-* What happened.
-* Whether this event constitutes a Code of Conduct violation.
-* Who are the responsible party(ies).
-* Whether this is an ongoing situation, and there is a threat to anyone's
- physical safety.
-
-This information will be collected in writing, and whenever possible the
-group's deliberations will be recorded and retained (i.e. chat transcripts,
-email discussions, recorded conference calls, summaries of voice conversations,
-etc).
-
-It is important to retain an archive of all activities of this committee to
-ensure consistency in behavior and provide institutional memory for the
-project. To assist in this, the default channel of discussion for this
-committee will be a private mailing list accessible to current and future
-members of the committee as well as members of the Steering Council upon
-justified request. If the Committee finds the need to use off-list
-communications (e.g. phone calls for early/rapid response), it should in all
-cases summarize these back to the list so there's a good record of the process.
-
-The Code of Conduct Committee should aim to have a resolution agreed upon within
-two weeks. In the event that a resolution can't be determined in that time, the
-committee will respond to the reporter(s) with an update and projected timeline
-for resolution.
-
-
-.. _CoC_resolutions:
-
-Resolutions
-~~~~~~~~~~~
-
-The committee must agree on a resolution by consensus. If the group cannot reach
-consensus and deadlocks for over a week, the group will turn the matter over to
-the Steering Council for resolution.
-
-
-Possible responses may include:
-
-* Taking no further action
-
- - if we determine no violations have occurred.
- - if the matter has been resolved publicly while the committee was considering responses.
-
-* Coordinating voluntary mediation: if all involved parties agree, the
- Committee may facilitate a mediation process as detailed above.
-* Remind publicly, and point out that some behavior/actions/language have been
- judged inappropriate and why in the current context, or can but hurtful to
- some people, requesting the community to self-adjust.
-* A private reprimand from the committee to the individual(s) involved. In this
- case, the group chair will deliver that reprimand to the individual(s) over
- email, cc'ing the group.
-* A public reprimand. In this case, the committee chair will deliver that
- reprimand in the same venue that the violation occurred, within the limits of
- practicality. E.g., the original mailing list for an email violation, but
- for a chat room discussion where the person/context may be gone, they can be
- reached by other means. The group may choose to publish this message
- elsewhere for documentation purposes.
-* A request for a public or private apology, assuming the reporter agrees to
- this idea: they may at their discretion refuse further contact with the
- violator. The chair will deliver this request. The committee may, if it
- chooses, attach "strings" to this request: for example, the group may ask a
- violator to apologize in order to retain one’s membership on a mailing list.
-* A "mutually agreed upon hiatus" where the committee asks the individual to
- temporarily refrain from community participation. If the individual chooses
- not to take a temporary break voluntarily, the committee may issue a
- "mandatory cooling off period".
-* A permanent or temporary ban from some or all NumPy spaces (mailing lists,
- gitter.im, etc.). The group will maintain records of all such bans so that
- they may be reviewed in the future or otherwise maintained.
-
-Once a resolution is agreed upon, but before it is enacted, the committee will
-contact the original reporter and any other affected parties and explain the
-proposed resolution. The committee will ask if this resolution is acceptable,
-and must note feedback for the record.
-
-Finally, the committee will make a report to the NumPy Steering Council (as
-well as the NumPy core team in the event of an ongoing resolution, such as a
-ban).
-
-The committee will never publicly discuss the issue; all public statements will
-be made by the chair of the Code of Conduct Committee or the NumPy Steering
-Council.
-
-
-Conflicts of Interest
-~~~~~~~~~~~~~~~~~~~~~
-
-In the event of any conflict of interest, a committee member must immediately
-notify the other members, and recuse themselves if necessary.
diff --git a/doc/source/dev/development_environment.rst b/doc/source/dev/development_environment.rst
index ff78cecc5..cb027c662 100644
--- a/doc/source/dev/development_environment.rst
+++ b/doc/source/dev/development_environment.rst
@@ -273,7 +273,7 @@ pull requests aren't perfect, the community is always happy to help. As a
volunteer project, things do sometimes get dropped and it's totally fine to
ping us if something has sat without a response for about two to four weeks.
-So go ahead and pick something that annoys or confuses you about numpy,
+So go ahead and pick something that annoys or confuses you about NumPy,
experiment with the code, hang around for discussions or go through the
reference documents to try to fix it. Things will fall in place and soon
you'll have a pretty good understanding of the project as a whole. Good Luck!
diff --git a/doc/source/dev/development_workflow.rst b/doc/source/dev/development_workflow.rst
index d5a49a9f9..34535b2f5 100644
--- a/doc/source/dev/development_workflow.rst
+++ b/doc/source/dev/development_workflow.rst
@@ -188,6 +188,16 @@ Standard acronyms to start the commit message with are::
REL: related to releasing numpy
+.. _workflow_mailing_list:
+
+Get the mailing list's opinion
+=======================================================
+
+If you plan a new feature or API change, it's wisest to first email the
+NumPy `mailing list <https://mail.python.org/mailman/listinfo/numpy-discussion>`_
+asking for comment. If you haven't heard back in a week, it's
+OK to ping the list again.
+
.. _asking-for-merging:
Asking for your changes to be merged with the main repo
@@ -197,15 +207,24 @@ When you feel your work is finished, you can create a pull request (PR). Github
has a nice help page that outlines the process for `filing pull requests`_.
If your changes involve modifications to the API or addition/modification of a
-function, you should
+function, add a release note to the ``doc/release/upcoming_changes/``
+directory, following the instructions and format in the
+``doc/release/upcoming_changes/README.rst`` file.
+
+
+.. _workflow_PR_timeline:
+
+Getting your PR reviewed
+========================
+
+We review pull requests as soon as we can, typically within a week. If you get
+no review comments within two weeks, feel free to ask for feedback by
+adding a comment on your PR (this will notify maintainers).
+
+If your PR is large or complicated, asking for input on the numpy-discussion
+mailing list may also be useful.
+
-- send an email to the `NumPy mailing list`_ with a link to your PR along with
- a description of and a motivation for your changes. This may generate
- changes and feedback. It might be prudent to start with this step if your
- change may be controversial.
-- add a release note to the ``doc/release/upcoming_changes/`` directory,
- following the instructions and format in the
- ``doc/release/upcoming_changes/README.rst`` file.
.. _rebasing-on-master:
@@ -290,7 +309,7 @@ Rewriting commit history
Do this only for your own feature branches.
-There's an embarrassing typo in a commit you made? Or perhaps the you
+There's an embarrassing typo in a commit you made? Or perhaps you
made several false starts you would like the posterity not to see.
This can be done via *interactive rebasing*.
diff --git a/doc/source/dev/gitwash/development_setup.rst b/doc/source/dev/gitwash/development_setup.rst
index 9027dda64..a7e9c28b9 100644
--- a/doc/source/dev/gitwash/development_setup.rst
+++ b/doc/source/dev/gitwash/development_setup.rst
@@ -1,145 +1,178 @@
-====================================
-Getting started with Git development
-====================================
+.. _development-setup:
-This section and the next describe in detail how to set up git for working
-with the NumPy source code. If you have git already set up, skip to
-:ref:`development-workflow`.
+##############################################################################
+Setting up git for NumPy development
+##############################################################################
-Basic Git setup
-###############
+To contribute code or documentation, you first need
-* :ref:`install-git`.
-* Introduce yourself to Git::
+#. git installed on your machine
+#. a GitHub account
+#. a fork of NumPy
- git config --global user.email you@yourdomain.example.com
- git config --global user.name "Your Name Comes Here"
-.. _forking:
+******************************************************************************
+Install git
+******************************************************************************
+
+You may already have git; check by typing ``git --version``. If it's
+installed you'll see some variation of ``git version 2.11.0``.
+If instead you see ``command is not recognized``, ``command not
+found``, etc.,
+`install git <https://git-scm.com/book/en/v2/Getting-Started-Installing-Git>`_.
-Making your own copy (fork) of NumPy
-####################################
+Then set your name and email: ::
-You need to do this only once. The instructions here are very similar
-to the instructions at http://help.github.com/forking/ - please see that
-page for more detail. We're repeating some of it here just to give the
-specifics for the NumPy_ project, and to suggest some default names.
+ git config --global user.email you@yourdomain.example.com
+ git config --global user.name "Your Name"
.. _set-up-and-configure-a-github-account:
-Set up and configure a github_ account
-======================================
+******************************************************************************
+Create a GitHub account
+******************************************************************************
-If you don't have a github_ account, go to the github_ page, and make one.
+If you don't have a GitHub account, visit https://github.com/join to create
+one.
-You then need to configure your account to allow write access - see the
-``Generating SSH keys`` help on `github help`_.
+.. _forking:
-Create your own forked copy of NumPy_
-=========================================
+******************************************************************************
+Create a NumPy fork
+******************************************************************************
-#. Log into your github_ account.
-#. Go to the NumPy_ github home at `NumPy github`_.
-#. Click on the *fork* button:
+``Forking`` has two steps -- visit GitHub to create a fork repo in your
+account, then make a copy of it on your own machine.
- .. image:: forking_button.png
+Create the fork repo
+==============================================================================
- After a short pause, you should find yourself at the home page for
- your own forked copy of NumPy_.
+#. Log into your GitHub account.
+#. Go to the `NumPy GitHub home <https://github.com/numpy/numpy>`_.
+#. At the upper right of the page, click ``Fork``:
-.. include:: git_links.inc
+ .. image:: forking_button.png
+ You'll see
-.. _set-up-fork:
+ .. image:: forking_message.png
-Set up your fork
-################
+ and then you'll be taken to the home page of your forked copy:
-First you follow the instructions for :ref:`forking`.
+ .. image:: forked_page.png
-Overview
-========
-::
+.. _set-up-fork:
- git clone https://github.com/your-user-name/numpy.git
- cd numpy
- git remote add upstream https://github.com/numpy/numpy.git
+Make the local copy
+==============================================================================
-In detail
-=========
+#. In the directory where you want the copy created, run ::
-Clone your fork
----------------
+ git clone https://github.com/your-user-name/numpy.git
-#. Clone your fork to the local computer with ``git clone
- https://github.com/your-user-name/numpy.git``
-#. Investigate. Change directory to your new repo: ``cd numpy``. Then
- ``git branch -a`` to show you all branches. You'll get something
- like::
+ You'll see something like: ::
- * master
- remotes/origin/master
+ $ git clone https://github.com/your-user-name/numpy.git
+ Cloning into 'numpy'...
+ remote: Enumerating objects: 12, done.
+ remote: Counting objects: 100% (12/12), done.
+ remote: Compressing objects: 100% (12/12), done.
+ remote: Total 175837 (delta 0), reused 0 (delta 0), pack-reused 175825
+ Receiving objects: 100% (175837/175837), 78.16 MiB | 9.87 MiB/s, done.
+ Resolving deltas: 100% (139317/139317), done.
- This tells you that you are currently on the ``master`` branch, and
- that you also have a ``remote`` connection to ``origin/master``.
- What remote repository is ``remote/origin``? Try ``git remote -v`` to
- see the URLs for the remote. They will point to your github_ fork.
+ A directory ``numpy`` is created on your machine. (If you already have
+ a numpy directory, GitHub will choose a different name like ``numpy-1``.)
+ ::
- Now you want to connect to the upstream `NumPy github`_ repository, so
- you can merge in changes from trunk.
+ $ ls -l
+ total 0
+ drwxrwxrwx 1 bjn bjn 4096 Jun 20 07:20 numpy
.. _linking-to-upstream:
-Linking your repository to the upstream repo
---------------------------------------------
+#. Give the name ``upstream`` to the main NumPy repo: ::
+
+ cd numpy
+ git remote add upstream https://github.com/numpy/numpy.git
+
+#. Set up your repository so ``git pull`` pulls from ``upstream`` by
+ default: ::
+
+ git config branch.master.remote upstream
+ git config branch.master.merge refs/heads/master
-::
+******************************************************************************
+Look it over
+******************************************************************************
- cd numpy
- git remote add upstream https://github.com/numpy/numpy.git
+#. The branches shown by ``git branch -a`` will include
-``upstream`` here is just the arbitrary name we're using to refer to the
-main NumPy_ repository at `NumPy github`_.
+ - the ``master`` branch you just cloned on your own machine
+ - the ``master`` branch from your fork on GitHub, which git named
+ ``origin`` by default
+ - the ``master`` branch on the the main NumPy repo, which you named
+ ``upstream``.
-Just for your own satisfaction, show yourself that you now have a new
-'remote', with ``git remote -v show``, giving you something like::
+ ::
- upstream https://github.com/numpy/numpy.git (fetch)
- upstream https://github.com/numpy/numpy.git (push)
- origin https://github.com/your-user-name/numpy.git (fetch)
- origin https://github.com/your-user-name/numpy.git (push)
+ master
+ remotes/origin/master
+ remotes/upstream/master
-To keep in sync with changes in NumPy, you want to set up your repository
-so it pulls from ``upstream`` by default. This can be done with::
+ If ``upstream`` isn't there, it will be added after you access the
+ NumPy repo with a command like ``git fetch`` or ``git pull``.
- git config branch.master.remote upstream
- git config branch.master.merge refs/heads/master
-You may also want to have easy access to all pull requests sent to the
-NumPy repository::
+#. The repos shown by ``git remote -v show`` will include your fork on GitHub
+ and the main repo: ::
- git config --add remote.upstream.fetch '+refs/pull/*/head:refs/remotes/upstream/pr/*'
+ upstream https://github.com/numpy/numpy.git (fetch)
+ upstream https://github.com/numpy/numpy.git (push)
+ origin https://github.com/your-user-name/numpy.git (fetch)
+ origin https://github.com/your-user-name/numpy.git (push)
-Your config file should now look something like (from
-``$ cat .git/config``)::
+#. ``git config --list`` will include ::
- [core]
- repositoryformatversion = 0
- filemode = true
- bare = false
- logallrefupdates = true
- ignorecase = true
- precomposeunicode = false
- [remote "origin"]
- url = https://github.com/your-user-name/numpy.git
- fetch = +refs/heads/*:refs/remotes/origin/*
- [remote "upstream"]
- url = https://github.com/numpy/numpy.git
- fetch = +refs/heads/*:refs/remotes/upstream/*
- fetch = +refs/pull/*/head:refs/remotes/upstream/pr/*
- [branch "master"]
- remote = upstream
- merge = refs/heads/master
+ user.email=your_email@example.com
+ user.name=Your Name
+ remote.origin.url=git@github.com:your-github-id/numpy.git
+ remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
+ branch.master.remote=upstream
+ branch.master.merge=refs/heads/master
+ remote.upstream.url=https://github.com/numpy/numpy.git
+ remote.upstream.fetch=+refs/heads/*:refs/remotes/upstream/*
.. include:: git_links.inc
+
+
+******************************************************************************
+Optional: set up SSH keys to avoid passwords
+******************************************************************************
+
+Cloning your NumPy fork repo required no password, because it read the remote
+repo without changing it. Later, though, submitting your pull requests will
+write to it, and GitHub will ask for your username and password -- even though
+it's your own repo. You can eliminate this authentication without compromising
+security by `setting up SSH keys \
+<https://help.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh>`_.
+
+**If you set up the keys before cloning**, the instructions above change
+slightly. Instead of ::
+
+ git clone https://github.com/your-user-name/numpy.git
+
+run ::
+
+ git clone git@github.com:numpy/numpy.git
+
+and instead of showing an ``https`` URL, ``git remote -v`` will show ::
+
+ origin git@github.com:your-user-name/numpy.git (fetch)
+ origin git@github.com:your-user-name/numpy.git (push)
+
+
+**If you have cloned already** and want to start using SSH, see
+`Switching remote URLs from HTTPS to SSH \
+<https://help.github.com/en/github/using-git/changing-a-remotes-url#switching-remote-urls-from-https-to-ssh>`_.
diff --git a/doc/source/dev/gitwash/forked_page.png b/doc/source/dev/gitwash/forked_page.png
new file mode 100644
index 000000000..f369cab3a
--- /dev/null
+++ b/doc/source/dev/gitwash/forked_page.png
Binary files differ
diff --git a/doc/source/dev/gitwash/forking_button.png b/doc/source/dev/gitwash/forking_button.png
index d0e04134d..9750c0947 100644..100755
--- a/doc/source/dev/gitwash/forking_button.png
+++ b/doc/source/dev/gitwash/forking_button.png
Binary files differ
diff --git a/doc/source/dev/gitwash/forking_message.png b/doc/source/dev/gitwash/forking_message.png
new file mode 100644
index 000000000..631296017
--- /dev/null
+++ b/doc/source/dev/gitwash/forking_message.png
Binary files differ
diff --git a/doc/source/dev/gitwash/git_links.inc b/doc/source/dev/gitwash/git_links.inc
index 82e6c75e5..8032dca41 100644
--- a/doc/source/dev/gitwash/git_links.inc
+++ b/doc/source/dev/gitwash/git_links.inc
@@ -16,7 +16,7 @@
.. _subversion: http://subversion.tigris.org/
.. _git cheat sheet: http://cheat.errtheblog.com/s/git
.. _pro git book: https://git-scm.com/book/
-.. _git svn crash course: https://git-scm.com/course/svn.html
+.. _git svn crash course: https://git.wiki.kernel.org/index.php/GitSvnCrashCourse
.. _learn.github: https://learn.github.com/
.. _network graph visualizer: https://github.blog/2008-04-10-say-hello-to-the-network-graph-visualizer/
.. _git user manual: https://www.kernel.org/pub/software/scm/git/docs/user-manual.html
@@ -42,7 +42,7 @@
.. _why the -a flag?: http://www.gitready.com/beginner/2009/01/18/the-staging-area.html
.. _git staging area: http://www.gitready.com/beginner/2009/01/18/the-staging-area.html
.. _tangled working copy problem: https://tomayko.com/writings/the-thing-about-git
-.. _git management: http://kerneltrap.org/Linux/Git_Management
+.. _git management: https://web.archive.org/web/20090328043540/http://kerneltrap.org/Linux/Git_Management
.. _linux git workflow: https://www.mail-archive.com/dri-devel@lists.sourceforge.net/msg39091.html
.. _ipython git workflow: https://mail.python.org/pipermail/ipython-dev/2010-October/005632.html
.. _git parable: http://tom.preston-werner.com/2009/05/19/the-git-parable.html
diff --git a/doc/source/dev/governance/governance.rst b/doc/source/dev/governance/governance.rst
index d8719700f..9209f26b7 100644
--- a/doc/source/dev/governance/governance.rst
+++ b/doc/source/dev/governance/governance.rst
@@ -387,8 +387,7 @@ Acknowledgements
================
Substantial portions of this document were adapted from the
-`Jupyter/IPython project's governance document
-<https://github.com/jupyter/governance/blob/master/governance.md>`_.
+`Jupyter/IPython project's governance document <https://github.com/jupyter/governance>`_
License
=======
diff --git a/doc/source/dev/governance/people.rst b/doc/source/dev/governance/people.rst
index db2704d09..18366402e 100644
--- a/doc/source/dev/governance/people.rst
+++ b/doc/source/dev/governance/people.rst
@@ -12,31 +12,34 @@ Steering council
* Ralf Gommers
+* Allan Haldane
+
* Charles Harris
+* Stephan Hoyer
+
+* Matti Picus
+
* Nathaniel Smith
* Julian Taylor
* Pauli Virtanen
-* Eric Wieser
-
-* Marten van Kerkwijk
-
-* Stephan Hoyer
+* Stéfan van der Walt
-* Allan Haldane
+* Eric Wieser
-* Stefan van der Walt
Emeritus members
----------------
-* Travis Oliphant - Project Founder / Emeritus Leader (served: 2005-2012)
+* Travis Oliphant -- project founder / emeritus leader (2005-2012)
+
+* Alex Griffing (2015-2017)
-* Alex Griffing (served: 2015-2017)
+* Marten van Kerkwijk (2017-2019)
NumFOCUS Subcommittee
@@ -56,7 +59,7 @@ NumFOCUS Subcommittee
Institutional Partners
----------------------
-* UC Berkeley (Stefan van der Walt, Sebastian Berg, Warren Weckesser, Ross Barnowski)
+* UC Berkeley (Stéfan van der Walt, Sebastian Berg, Warren Weckesser, Ross Barnowski)
* Quansight (Ralf Gommers, Hameer Abbasi, Melissa Weber Mendonça, Mars Lee, Matti Picus)
diff --git a/doc/source/dev/howto-docs.rst b/doc/source/dev/howto-docs.rst
index 0e2e03e0b..17194bd58 100644
--- a/doc/source/dev/howto-docs.rst
+++ b/doc/source/dev/howto-docs.rst
@@ -4,146 +4,153 @@
How to contribute to the NumPy documentation
############################################
-The *Documentation* for a software project is the set of reference,
-instructional, educational, informative material generated by the project
-developers and contributors, as well as discussions, presentations, videos and
-other user-generated content. It may include learning-oriented content (such as
-tutorials and how-tos), use-cases or in-depth explanations and reference for
-developers.
-
-If you're reading this page, you probably want to help. This guide is meant to
-help you decide which kind of content you'll write, as well as give you some
-tips and instructions for submitting it to the official NumPy documentation
-(that is, the documentation that ships with NumPy and lives on the
-:ref:`official project pages <numpy_docs_mainpage>`). Keep in mind that if you
-don't want to do this, writing a tutorial on your own blog, creating a YouTube
-video or answering questions on social media or Stack Overflow are also great
-contributions!
-
-NumPy has a Documentation Team. We have open meetings on Zoom every three weeks
-and invite everyone to join. Don't hesitate to reach out if you have questions
-or just need someone to guide you through your first steps - we're always happy
-to help. Meetings are usually announced on the `numpy-discussion mailing list
-<https://mail.python.org/mailman/listinfo/numpy-discussion>`__. Meeting minutes
-are taken `on hackmd.io <https://hackmd.io/oB_boakvRqKR-_2jRV-Qjg>`__ and stored
-in the `NumPy Archive repository <https://github.com/numpy/archive>`__.
-
-You can find larger planned and in-progress documentation improvement ideas `at
+This guide will help you decide what to contribute and how to submit it to the
+official NumPy documentation.
+
+******************************************************************************
+Documentation team meetings
+******************************************************************************
+
+The NumPy community has set a firm goal of improving its documentation. We
+hold regular documentation meetings on Zoom (dates are announced on the
+`numpy-discussion mailing list
+<https://mail.python.org/mailman/listinfo/numpy-discussion>`__), and everyone
+is welcome. Reach out if you have questions or need
+someone to guide you through your first steps -- we're happy to help.
+Minutes are taken `on hackmd.io <https://hackmd.io/oB_boakvRqKR-_2jRV-Qjg>`__
+and stored in the `NumPy Archive repository
+<https://github.com/numpy/archive>`__.
+
+*************************
+What's needed
+*************************
+NumPy docs have the details covered. API reference
+documentation is generated directly from
+`docstrings <https://www.python.org/dev/peps/pep-0257/>`_ in the code
+when the documentation is :ref:`built<howto-build-docs>`.
+
+What we lack are docs with broader scope -- tutorials, how-tos, and explanations.
+Reporting defects is another way to contribute. We discuss both.
+
+*************************
+Contributing fixes
+*************************
+
+We're eager to hear about and fix doc defects. But to attack the biggest
+problems we end up having to defer or overlook some bug reports. Here are the
+best defects to go after.
+
+Top priority goes to **technical inaccuracies** -- a docstring missing a
+parameter, a faulty description of a function/parameter/method, and so on.
+Other "structural" defects like broken links also get priority. All these fixes
+are easy to confirm and put in place. You can submit
+a `pull request (PR) <https://numpy.org/devdocs/dev/index.html#devindex>`__
+with the fix, if you know how to do that; otherwise please `open an issue
+<https://github.com/numpy/numpy/issues>`__.
+
+**Typos and misspellings** fall on a lower rung; we welcome hearing about them but
+may not be able to fix them promptly. These too can be handled as pull
+requests or issues.
+
+Obvious **wording** mistakes (like leaving out a "not") fall into the typo
+category, but other rewordings -- even for grammar -- require a judgment call,
+which raises the bar. Test the waters by first presenting the fix as an issue.
+
+******************************************************************************
+Contributing new pages
+******************************************************************************
+
+Your frustrations using our documents are our best guide to what needs fixing.
+
+If you write a missing doc you join the front line of open source, but it's
+a meaningful contribution just to let us know what's missing. If you want to
+compose a doc, run your thoughts by the `mailing list
+<https://mail.python.org/mailman/listinfo/numpy-discussion>`__ for futher
+ideas and feedback. If you want to alert us to a gap,
+`open an issue <https://github.com/numpy/numpy/issues>`__. See
+`this issue <https://github.com/numpy/numpy/issues/15760>`__ for an example.
+
+If you're looking for subjects, our formal roadmap for documentation is a
+*NumPy Enhancement Proposal (NEP)*,
+`NEP 44 - Restructuring the NumPy Documentation <https://www.numpy.org/neps/nep-0044-restructuring-numpy-docs>`__.
+It identifies areas where our docs need help and lists several
+additions we'd like to see, including Jupyter notebooks.
+
+You can find larger planned and in-progress ideas `at
our GitHub project <https://github.com/orgs/numpy/projects/2>`__.
-Current vision for the documentation: NEP 44
---------------------------------------------
+.. _tutorials_howtos_explanations:
-Recently, the NumPy community approved a *NumPy Enhancement Proposal (NEP)*
-about documentation, `NEP 44 - Restructuring the NumPy Documentation
-<https://www.numpy.org/neps/nep-0044-restructuring-numpy-docs>`__.
-**Where is the documentation?**
+Formula writing
+==============================================================================
+There are formulas for writing useful documents, and four formulas
+cover nearly everything. There are four formulas because there are four
+categories of document -- ``tutorial``, ``how-to guide``, ``explanation``,
+and ``reference``. The insight that docs divide up this way belongs to
+Daniele Procida, who goes on
+`in this short article <https://documentation.divio.com/>`__ to explain
+the differences and reveal the formulas. When you begin a document or
+propose one, have in mind which of these types it will be.
-The main page for the :ref:`NumPy Documentation <numpy_docs_mainpage>` lists
-several categories. The documents mentioned there live in different places.
-- **Tutorials, How-Tos, Explanations:** These documents are stored in the NumPy
- source code tree, which means that in order to add them to the official
- documentation, you have to download the NumPy source code,
- :ref:`build it <howto-build-docs>` and submit your changes via a
- :ref:`GitHub pull request <devindex>`.
+.. _contributing:
-- **API Reference:** These are mainly the result of rendering the NumPy code
- `docstrings <https://www.python.org/dev/peps/pep-0257/>`__ into formatted
- documents. They are automatically generated when the NumPy documentation is
- :ref:`built from source<howto-build-docs>`.
-**Datasets**
+More on contributing
+==============================================================================
-If you are writing a tutorial or how-to, we encourage you to use real images and
-data (provided they are appropriately licensed and available). This makes the
-material more engaging for readers, and choosing the right data can add
-pedagogical value to your content.
+Don't worry if English is not your first language, or if you can only come up
+with a rough draft. Open source is a community effort. Do your best -- we'll
+help fix issues.
-*Note: currently we cannot easily use data in other packages (except, e.g., from
-SciPy or Matplotlib). We plan to create a dedicated datasets package, but that's
-not ready yet - please discuss with us if you have data sources in mind.*
+Images and real-life data make text more engaging and powerful, but be sure
+what you use is appropriately licensed and available. Here again, even a rough
+idea for artwork can be polished by others.
-Creating new content
---------------------
+For now, the only data formats accepted by NumPy are those also used by other
+Python scientific libraries like pandas, SciPy, or Matplotlib. We're
+developing a package to accept more formats; contact us for details.
-The documentation is written in restructuredText, which is the format required
-by Sphinx, the tool most Python projects use to automatically build and link the
-documentation within the project. You can read the
-`Quick reStructuredText Guide
+NumPy documentation is kept in the source code tree. To get your document
+into the docbase you must download the tree, :ref:`build it
+<howto-build-docs>`, and submit a pull request. If GitHub and pull requests
+are new to you, check our :ref:`Contributor Guide <devindex>`.
+
+Our markup language is reStructuredText (rST), which is more elaborate than
+Markdown. Sphinx, the tool many Python projects use to build and link project
+documentation, converts the rST into HTML and other formats. For more on
+rST, see the `Quick reStructuredText Guide
<https://docutils.sourceforge.io/docs/user/rst/quickref.html>`__ or the
`reStructuredText Primer
-<http://www.sphinx-doc.org/en/stable/usage/restructuredtext/basics.html>`__ for
-more information.
-
-If you have already decided which type of document you want to write, you can
-check out the following specific guides:
-
-- Guide to writing Tutorials (TODO)
-- :ref:`Guide to writing reference (API) documentation: the numpydoc docstring
- guide <howto-document>`
-
-Major additions to the documentation (e.g. new tutorials) should be proposed to
-the `mailing list
-<https://mail.python.org/mailman/listinfo/numpy-discussion>`__.
-
-Other ways to contribute
-------------------------
-
-Correcting technical inaccuracies in the documentation are high priority. For
-example, if a docstring is missing a parameter or the description of a
-fuction/parameter/method etc. is incorrect. Other "structural" defects like
-broken links are also high priority.
-
-Proposals for changes that improve the clarity of the documentation are welcome.
-However, "clarity" is a bit subjective, so such proposals are best made by
-raising issues that describe what could be improved in the current
-documentation. Proposals that include specific suggestions for the improvement
-are encouraged as the proposed changes helps frame the discussion.
-
-Based on the above characterization, "high-priority" changes (i.e. fixing
-technical inaccuracies, broken links, etc.) can be proposed via pull requests
-directly as they are straightforward to review. Other changes should be raised
-as issues first so that the discussion can happen before you make major
-modifications, which in principle saves you from wasting your time on
-undesired changes.
-
-If you see a good tutorial, how-to or explanation that is not included in the
-official documentation, you can suggest it to be added by `opening an issue on
-GitHub <https://github.com/numpy/numpy/issues>`__. Similarly, opening issues to
-suggest a tutorial, how-to or explanation that you can't find anywhere is a
-great way to help the documentation team direct efforts towards what users are
-looking for. `See this issue <https://github.com/numpy/numpy/issues/15760>`__
-for an example of how to do this.
-
-Finally, if you detect a typo or an error in the documentation, or would like to
-suggest a different approach, you can also open an issue or submit a pull
-request with your suggestion. Keep in mind that changes fixing
-grammatical/spelling errors are welcome but not necessarily the highest
-priority. "Grammatical correctness" often gets confused with "style" which can
-result in unfruitful discussions that don't necessarily improve anything.
-Changes that modify wording or rearrange phrasing without changing the technical
-content are discouraged. If you think that a different wording improves clarity,
-you should open an issue as noted above, but again, changes along these lines
-very often tend to be highly subjective and not necessarily do much to improve
-the quality of the documentation.
-
-**Final tips**
-
-- Don't worry if English is not your first language. Do your best - we'll revise
- your content and make sure we fix any issues with the code or text.
-- If you are unsure whether your tutorial is useful to the community, consider
- submitting an issue on GitHub suggesting it, or asking on the mailing
- list or Stack Overflow.
-- If you are unfamiliar with git/GitHub or the process of submitting a pull
- request (PR), check our :ref:`Contributor Guide <devindex>`.
-
-**Other interesting material**
-
-- `writethedocs.org <https://www.writethedocs.org/>`__ has a lot of interesting
- resources for technical writing.
-- Google offers two free `Technical Writing Courses
- <https://developers.google.com/tech-writing>`__
-- `Software Carpentry <https://software-carpentry.org/software>`__ has a lot of
- nice recommendations for creating educational material.
+<http://www.sphinx-doc.org/en/stable/usage/restructuredtext/basics.html>`__
+
+
+************************************************************
+Contributing indirectly
+************************************************************
+
+If you run across outside material that would be a useful addition to the
+NumPy docs, let us know by `opening an issue <https://github.com/numpy/numpy/issues>`__.
+
+You don't have to contribute here to contribute to NumPy. You've contributed
+if you write a tutorial on your blog, create a YouTube video, or answer questions
+on Stack Overflow and other sites.
+
+
+************************************************************
+Documentation reading
+************************************************************
+
+- The leading organization of technical writers,
+ `Write the Docs <https://www.writethedocs.org/>`__,
+ holds conferences, hosts learning resources, and runs a Slack channel.
+
+- "Every engineer is also a writer," says Google's
+ `collection of technical writing resources <https://developers.google.com/tech-writing>`__,
+ which includes free online courses for developers in planning and writing
+ documents.
+
+- `Software Carpentry's <https://software-carpentry.org/lessons>`__ mission is
+ teaching software to researchers. In addition to hosting the curriculum, the
+ website explains how to present ideas effectively.
diff --git a/doc/source/dev/index.rst b/doc/source/dev/index.rst
index 5270bfb77..4641a7e2f 100644
--- a/doc/source/dev/index.rst
+++ b/doc/source/dev/index.rst
@@ -4,6 +4,21 @@
Contributing to NumPy
#####################
+.. TODO: this is hidden because there's a bug in the pydata theme that won't render TOC items under headers
+
+.. toctree::
+ :hidden:
+
+ Git Basics <gitwash/index>
+ development_environment
+ development_workflow
+ ../benchmarking
+ NumPy C style guide <https://numpy.org/neps/nep-0045-c_style_guide.html>
+ releasing
+ governance/index
+ howto-docs
+
+
Not a coder? Not a problem! NumPy is multi-faceted, and we can use a lot of help.
These are all activities we'd like to get help with (they're all important, so
we list them in alphabetical order):
@@ -107,7 +122,8 @@ Here's the short summary, complete TOC links are below:
overall code quality benefits. Therefore, please don't let the review
discourage you from contributing: its only aim is to improve the quality
of project, not to criticize (we are, after all, very grateful for the
- time you're donating!).
+ time you're donating!). See our :ref:`Reviewer Guidelines
+ <reviewer-guidelines>` for more information.
* To update your PR, make your changes on your local repository, commit,
**run tests, and only if they succeed** push to your fork. As soon as
@@ -140,8 +156,7 @@ Here's the short summary, complete TOC links are below:
If your change introduces a deprecation, make sure to discuss this first on
GitHub or the mailing list first. If agreement on the deprecation is
- reached, follow `NEP 23 deprecation policy <http://www.numpy.org/neps/
- nep-0023-backwards-compatibility.html>`_ to add the deprecation.
+ reached, follow :ref:`NEP 23 deprecation policy <NEP23>` to add the deprecation.
6. Cross referencing issues
@@ -165,6 +180,8 @@ be merged automatically, you have to incorporate changes that have been made
since you started into your branch. Our recommended way to do this is to
:ref:`rebase on master<rebasing-on-master>`.
+.. _guidelines:
+
Guidelines
----------
@@ -172,9 +189,11 @@ Guidelines
* All code should be `documented <https://numpydoc.readthedocs.io/
en/latest/format.html#docstring-standard>`_.
* No changes are ever committed without review and approval by a core
- team member.Please ask politely on the PR or on the `mailing list`_ if you
+ team member. Please ask politely on the PR or on the `mailing list`_ if you
get no response to your pull request within a week.
+.. _stylistic-guidelines:
+
Stylistic Guidelines
--------------------
@@ -189,7 +208,7 @@ Stylistic Guidelines
import numpy as np
-* For C code, see the :ref:`numpy-c-style-guide<style_guide>`
+* For C code, see :ref:`NEP 45 <NEP45>`.
Test coverage
@@ -219,6 +238,8 @@ This will create a report in ``build/coverage``, which can be viewed with::
$ firefox build/coverage/index.html
+.. _building-docs:
+
Building docs
-------------
@@ -256,7 +277,7 @@ From the ``doc/`` directory:
git submodule update --init
The documentation includes mathematical formulae with LaTeX formatting.
-A working LaTeX document production system
+A working LaTeX document production system
(e.g. `texlive <https://www.tug.org/texlive/>`__) is required for the
proper rendering of the LaTeX math in the documentation.
@@ -278,12 +299,12 @@ The rest of the story
.. toctree::
:maxdepth: 2
- conduct/code_of_conduct
Git Basics <gitwash/index>
development_environment
development_workflow
+ reviewer_guidelines
../benchmarking
- style_guide
+ NumPy C style guide <https://numpy.org/neps/nep-0045-c_style_guide.html>
releasing
governance/index
howto-docs
@@ -291,4 +312,4 @@ The rest of the story
NumPy-specific workflow is in :ref:`numpy-development-workflow
<development-workflow>`.
-.. _`mailing list`: https://mail.python.org/mailman/listinfo/numpy-devel
+.. _`mailing list`: https://mail.python.org/mailman/listinfo/numpy-discussion
diff --git a/doc/source/dev/reviewer_guidelines.rst b/doc/source/dev/reviewer_guidelines.rst
new file mode 100644
index 000000000..0b225b9b6
--- /dev/null
+++ b/doc/source/dev/reviewer_guidelines.rst
@@ -0,0 +1,119 @@
+.. _reviewer-guidelines:
+
+===================
+Reviewer Guidelines
+===================
+
+Reviewing open pull requests (PRs) helps move the project forward. We encourage
+people outside the project to get involved as well; it's a great way to get
+familiar with the codebase.
+
+Who can be a reviewer?
+======================
+
+Reviews can come from outside the NumPy team -- we welcome contributions from
+domain experts (for instance, `linalg` or `fft`) or maintainers of other
+projects. You do not need to be a NumPy maintainer (a NumPy team member with
+permission to merge a PR) to review.
+
+If we do not know you yet, consider introducing yourself in `the mailing list or
+Slack <https://numpy.org/community/>`_ before you start reviewing pull requests.
+
+Communication Guidelines
+========================
+
+- Every PR, good or bad, is an act of generosity. Opening with a positive
+ comment will help the author feel rewarded, and your subsequent remarks may be
+ heard more clearly. You may feel good also.
+- Begin if possible with the large issues, so the author knows they've been
+ understood. Resist the temptation to immediately go line by line, or to open
+ with small pervasive issues.
+- You are the face of the project, and NumPy some time ago decided `the kind of
+ project it will be <https://numpy.org/code-of-conduct/>`_: open, empathetic,
+ welcoming, friendly and patient. Be `kind
+ <https://youtu.be/tzFWz5fiVKU?t=49m30s>`_ to contributors.
+- Do not let perfect be the enemy of the good, particularly for documentation.
+ If you find yourself making many small suggestions, or being too nitpicky on
+ style or grammar, consider merging the current PR when all important concerns
+ are addressed. Then, either push a commit directly (if you are a maintainer)
+ or open a follow-up PR yourself.
+- If you need help writing replies in reviews, check out some `Standard replies
+ for reviewing
+ <https://scikit-learn.org/stable/developers/tips.html#saved-replies>`_.
+
+Reviewer Checklist
+==================
+
+- Is the intended behavior clear under all conditions? Some things to watch:
+ - What happens with unexpected inputs like empty arrays or nan/inf values?
+ - Are axis or shape arguments tested to be `int` or `tuples`?
+ - Are unusual `dtypes` tested if a function supports those?
+- Should variable names be improved for clarity or consistency?
+- Should comments be added, or rather removed as unhelpful or extraneous?
+- Does the documentation follow the :ref:`NumPy guidelines<howto-document>`? Are
+ the docstrings properly formatted?
+- Does the code follow NumPy's :ref:`Stylistic Guidelines<stylistic-guidelines>`?
+- If you are a maintainer, and it is not obvious from the PR description, add a
+ short explanation of what a branch did to the merge message and, if closing an
+ issue, also add "Closes gh-123" where 123 is the issue number.
+- For code changes, at least one maintainer (i.e. someone with commit rights)
+ should review and approve a pull request. If you are the first to review a
+ PR and approve of the changes use the GitHub `approve review
+ <https://help.github.com/articles/reviewing-changes-in-pull-requests/>`_ tool
+ to mark it as such. If a PR is straightforward, for example it's a clearly
+ correct bug fix, it can be merged straight away. If it's more complex or
+ changes public API, please leave it open for at least a couple of days so
+ other maintainers get a chance to review.
+- If you are a subsequent reviewer on an already approved PR, please use the
+ same review method as for a new PR (focus on the larger issues, resist the
+ temptation to add only a few nitpicks). If you have commit rights and think
+ no more review is needed, merge the PR.
+
+For maintainers
+---------------
+
+- Make sure all automated CI tests pass before merging a PR, and that the
+ :ref:`documentation builds <building-docs>` without any errors.
+- In case of merge conflicts, ask the PR submitter to :ref:`rebase on master
+ <rebasing-on-master>`.
+- For PRs that add new features or are in some way complex, wait at least a day
+ or two before merging it. That way, others get a chance to comment before the
+ code goes in. Consider adding it to the release notes.
+- When merging contributions, a committer is responsible for ensuring that those
+ meet the requirements outlined in the :ref:`Development process guidelines
+ <guidelines>` for NumPy. Also, check that new features and backwards
+ compatibility breaks were discussed on the `numpy-discussion mailing list
+ <https://mail.python.org/mailman/listinfo/numpy-discussion>`_.
+- Squashing commits or cleaning up commit messages of a PR that you consider too
+ messy is OK. Remember to retain the original author's name when doing this.
+ Make sure commit messages follow the :ref:`rules for NumPy
+ <writing-the-commit-message>`.
+- When you want to reject a PR: if it's very obvious, you can just close it and
+ explain why. If it's not, then it's a good idea to first explain why you
+ think the PR is not suitable for inclusion in NumPy and then let a second
+ committer comment or close.
+
+GitHub Workflow
+---------------
+
+When reviewing pull requests, please use workflow tracking features on GitHub as
+appropriate:
+
+- After you have finished reviewing, if you want to ask for the submitter to
+ make changes, change your review status to "Changes requested." This can be
+ done on GitHub, PR page, Files changed tab, Review changes (button on the top
+ right).
+- If you're happy about the current status, mark the pull request as Approved
+ (same way as Changes requested). Alternatively (for maintainers): merge
+ the pull request, if you think it is ready to be merged.
+
+It may be helpful to have a copy of the pull request code checked out on your
+own machine so that you can play with it locally. You can use the `GitHub CLI
+<https://docs.github.com/en/github/getting-started-with-github/github-cli>`_ to
+do this by clicking the ``Open with`` button in the upper right-hand corner of
+the PR page.
+
+Assuming you have your :ref:`development environment<development-environment>`
+set up, you can now build the code and test it.
+
+.. include:: gitwash/git_links.inc
diff --git a/doc/source/dev/style_guide.rst b/doc/source/dev/style_guide.rst
deleted file mode 100644
index bede3424d..000000000
--- a/doc/source/dev/style_guide.rst
+++ /dev/null
@@ -1,8 +0,0 @@
-.. _style_guide:
-
-===================
-NumPy C Style Guide
-===================
-
-.. include:: ../../C_STYLE_GUIDE.rst.txt
- :start-line: 4
diff --git a/doc/source/doc_conventions.rst b/doc/source/doc_conventions.rst
new file mode 100644
index 000000000..e2bc419d1
--- /dev/null
+++ b/doc/source/doc_conventions.rst
@@ -0,0 +1,23 @@
+.. _documentation_conventions:
+
+##############################################################################
+Documentation conventions
+##############################################################################
+
+- Names that look like :func:`numpy.array` are links to detailed
+ documentation.
+
+- Examples often include the Python prompt ``>>>``. This is not part of the
+ code and will cause an error if typed or pasted into the Python
+ shell. It can be safely typed or pasted into the IPython shell; the ``>>>``
+ is ignored.
+
+- Examples often use ``np`` as an alias for ``numpy``; that is, they assume
+ you've run::
+
+ >>> import numpy as np
+
+- If you're a code contributor writing a docstring, see :ref:`docstring_intro`.
+
+- If you're a writer contributing ordinary (non-docstring) documentation, see
+ :ref:`userdoc_guide`.
diff --git a/doc/source/docs/howto_document.rst b/doc/source/docs/howto_document.rst
index cf86b7e99..ff726c67c 100644
--- a/doc/source/docs/howto_document.rst
+++ b/doc/source/docs/howto_document.rst
@@ -1,12 +1,41 @@
.. _howto-document:
-A Guide to NumPy/SciPy Documentation
-====================================
+A Guide to NumPy Documentation
+==============================
+
+.. _userdoc_guide:
User documentation
-*******************
-NumPy text documents should follow the `Google developer documentation style guide <https://developers.google.com/style>`_.
+******************
+- In general, we follow the
+ `Google developer documentation style guide <https://developers.google.com/style>`_.
+
+- NumPy style governs cases where:
+
+ - Google has no guidance, or
+ - We prefer not to use the Google style
+
+ Our current rules:
+
+ - We pluralize *index* as *indices* rather than
+ `indexes <https://developers.google.com/style/word-list#letter-i>`_,
+ following the precedent of :func:`numpy.indices`.
+
+ - For consistency we also pluralize *matrix* as *matrices*.
+
+- Grammatical issues inadequately addressed by the NumPy or Google rules are
+ decided by the section on "Grammar and Usage" in the most recent edition of
+ the `Chicago Manual of Style
+ <https://en.wikipedia.org/wiki/The_Chicago_Manual_of_Style>`_.
+
+- We welcome being
+ `alerted <https://github.com/numpy/numpy/issues>`_ to cases
+ we should add to the NumPy style rules.
+
+
+
+.. _docstring_intro:
Docstrings
**********
@@ -40,29 +69,7 @@ after which you may use it::
np.fft.fft2(...)
-.. rubric::
- **For convenience the** `formatting standard`_ **is included below with an
- example**
-
-.. include:: ../../sphinxext/doc/format.rst
-
-.. _example:
-
-Example Source
-==============
-
-.. literalinclude:: ../../sphinxext/doc/example.py
-
-
-
-Example Rendered
-================
-
-.. ifconfig:: python_version_major < '3'
-
- The example is rendered only when sphinx is run with python3 and above
-
-.. automodule:: doc.example
- :members:
+Please use the numpydoc `formatting standard`_ as shown in their example_
.. _`formatting standard`: https://numpydoc.readthedocs.io/en/latest/format.html
+.. _example: https://numpydoc.readthedocs.io/en/latest/example.html
diff --git a/doc/source/f2py/allocarr_session.dat b/doc/source/f2py/allocarr_session.dat
index 754d9cb8b..ba168c22a 100644
--- a/doc/source/f2py/allocarr_session.dat
+++ b/doc/source/f2py/allocarr_session.dat
@@ -1,8 +1,11 @@
>>> import allocarr
>>> print(allocarr.mod.__doc__)
-b - 'f'-array(-1,-1), not allocated
-foo - Function signature:
- foo()
+b : 'f'-array(-1,-1), not allocated
+foo()
+
+Wrapper for ``foo``.
+
+
>>> allocarr.mod.foo()
b is not allocated
diff --git a/doc/source/f2py/common_session.dat b/doc/source/f2py/common_session.dat
index 0a38bec27..2595bfbd5 100644
--- a/doc/source/f2py/common_session.dat
+++ b/doc/source/f2py/common_session.dat
@@ -1,8 +1,8 @@
>>> import common
>>> print(common.data.__doc__)
-i - 'i'-scalar
-x - 'i'-array(4)
-a - 'f'-array(2,3)
+i : 'i'-scalar
+x : 'i'-array(4)
+a : 'f'-array(2,3)
>>> common.data.i = 5
>>> common.data.x[1] = 2
diff --git a/doc/source/f2py/distutils.rst b/doc/source/f2py/distutils.rst
index 71f6eab5a..4cf30045e 100644
--- a/doc/source/f2py/distutils.rst
+++ b/doc/source/f2py/distutils.rst
@@ -2,6 +2,8 @@
Using via `numpy.distutils`
=============================
+.. currentmodule:: numpy.distutils.core
+
:mod:`numpy.distutils` is part of NumPy extending standard Python ``distutils``
to deal with Fortran sources and F2PY signature files, e.g. compile Fortran
sources, call F2PY to construct extension modules, etc.
diff --git a/doc/source/f2py/moddata_session.dat b/doc/source/f2py/moddata_session.dat
index e3c758041..824bd86fc 100644
--- a/doc/source/f2py/moddata_session.dat
+++ b/doc/source/f2py/moddata_session.dat
@@ -1,10 +1,14 @@
>>> import moddata
>>> print(moddata.mod.__doc__)
-i - 'i'-scalar
-x - 'i'-array(4)
-a - 'f'-array(2,3)
-foo - Function signature:
- foo()
+i : 'i'-scalar
+x : 'i'-array(4)
+a : 'f'-array(2,3)
+b : 'f'-array(-1,-1), not allocated
+foo()
+
+Wrapper for ``foo``.
+
+
>>> moddata.mod.i = 5
>>> moddata.mod.x[:2] = [1,2]
diff --git a/doc/source/f2py/python-usage.rst b/doc/source/f2py/python-usage.rst
index a7f2b3d86..65c0cec64 100644
--- a/doc/source/f2py/python-usage.rst
+++ b/doc/source/f2py/python-usage.rst
@@ -71,7 +71,7 @@ Exceptions are NumPy arrays that must have type code ``'c'`` or
A string can have arbitrary length when using it as a string argument
to F2PY generated wrapper function. If the length is greater than
-expected, the string is truncated. If the length is smaller that
+expected, the string is truncated. If the length is smaller than
expected, additional memory is allocated and filled with ``\0``.
Because Python strings are immutable, an ``intent(inout)`` argument
diff --git a/doc/source/glossary.rst b/doc/source/glossary.rst
index b6ea42909..17071c8f1 100644
--- a/doc/source/glossary.rst
+++ b/doc/source/glossary.rst
@@ -2,6 +2,520 @@
Glossary
********
-.. toctree::
+.. glossary::
+
+
+ (`n`,)
+ A parenthesized number followed by a comma denotes a tuple with one
+ element. The trailing comma distinguishes a one-element tuple from a
+ parenthesized ``n``.
+
+
+ -1
+ - **In a dimension entry**, instructs NumPy to choose the length
+ that will keep the total number of array elements the same.
+
+ >>> np.arange(12).reshape(4, -1).shape
+ (4, 3)
+
+ - **In an index**, any negative value
+ `denotes <https://docs.python.org/dev/faq/programming.html#what-s-a-negative-index>`_
+ indexing from the right.
+
+ . . .
+ An :py:data:`Ellipsis`.
+
+ - **When indexing an array**, shorthand that the missing axes, if they
+ exist, are full slices.
+
+ >>> a = np.arange(24).reshape(2,3,4)
+
+ >>> a[...].shape
+ (2, 3, 4)
+
+ >>> a[...,0].shape
+ (2, 3)
+
+ >>> a[0,...].shape
+ (3, 4)
+
+ >>> a[0,...,0].shape
+ (3,)
+
+ It can be used at most once; ``a[...,0,...]`` raises an :exc:`IndexError`.
+
+ - **In printouts**, NumPy substitutes ``...`` for the middle elements of
+ large arrays. To see the entire array, use `numpy.printoptions`
+
+
+ :
+ The Python :term:`python:slice`
+ operator. In ndarrays, slicing can be applied to every
+ axis:
+
+ >>> a = np.arange(24).reshape(2,3,4)
+ >>> a
+ array([[[ 0, 1, 2, 3],
+ [ 4, 5, 6, 7],
+ [ 8, 9, 10, 11]],
+ <BLANKLINE>
+ [[12, 13, 14, 15],
+ [16, 17, 18, 19],
+ [20, 21, 22, 23]]])
+ <BLANKLINE>
+ >>> a[1:,-2:,:-1]
+ array([[[16, 17, 18],
+ [20, 21, 22]]])
+
+ Trailing slices can be omitted: ::
+
+ >>> a[1] == a[1,:,:]
+ array([[ True, True, True, True],
+ [ True, True, True, True],
+ [ True, True, True, True]])
+
+ In contrast to Python, where slicing creates a copy, in NumPy slicing
+ creates a :term:`view`.
+
+ For details, see :ref:`combining-advanced-and-basic-indexing`.
+
+
+ <
+ In a dtype declaration, indicates that the data is
+ :term:`little-endian` (the bracket is big on the right). ::
+
+ >>> dt = np.dtype('<f') # little-endian single-precision float
+
+
+ >
+ In a dtype declaration, indicates that the data is
+ :term:`big-endian` (the bracket is big on the left). ::
+
+ >>> dt = np.dtype('>H') # big-endian unsigned short
+
+
+ advanced indexing
+ Rather than using a :doc:`scalar <reference/arrays.scalars>` or slice as
+ an index, an axis can be indexed with an array, providing fine-grained
+ selection. This is known as :ref:`advanced indexing<advanced-indexing>`
+ or "fancy indexing".
+
+
+ along an axis
+ An operation `along axis n` of array ``a`` behaves as if its argument
+ were an array of slices of ``a`` where each slice has a successive
+ index of axis `n`.
+
+ For example, if ``a`` is a 3 x `N` array, an operation along axis 0
+ behaves as if its argument were an array containing slices of each row:
+
+ >>> np.array((a[0,:], a[1,:], a[2,:])) #doctest: +SKIP
+
+ To make it concrete, we can pick the operation to be the array-reversal
+ function :func:`numpy.flip`, which accepts an ``axis`` argument. We
+ construct a 3 x 4 array ``a``:
+
+ >>> a = np.arange(12).reshape(3,4)
+ >>> a
+ array([[ 0, 1, 2, 3],
+ [ 4, 5, 6, 7],
+ [ 8, 9, 10, 11]])
+
+ Reversing along axis 0 (the row axis) yields
+
+ >>> np.flip(a,axis=0)
+ array([[ 8, 9, 10, 11],
+ [ 4, 5, 6, 7],
+ [ 0, 1, 2, 3]])
+
+ Recalling the definition of `along an axis`, ``flip`` along axis 0 is
+ treating its argument as if it were
+
+ >>> np.array((a[0,:], a[1,:], a[2,:]))
+ array([[ 0, 1, 2, 3],
+ [ 4, 5, 6, 7],
+ [ 8, 9, 10, 11]])
+
+ and the result of ``np.flip(a,axis=0)`` is to reverse the slices:
+
+ >>> np.array((a[2,:],a[1,:],a[0,:]))
+ array([[ 8, 9, 10, 11],
+ [ 4, 5, 6, 7],
+ [ 0, 1, 2, 3]])
+
+
+ array
+ Used synonymously in the NumPy docs with :term:`ndarray`.
+
+
+ array_like
+ Any :doc:`scalar <reference/arrays.scalars>` or
+ :term:`python:sequence`
+ that can be interpreted as an ndarray. In addition to ndarrays
+ and scalars this category includes lists (possibly nested and with
+ different element types) and tuples. Any argument accepted by
+ :doc:`numpy.array <reference/generated/numpy.array>`
+ is array_like. ::
+
+ >>> a = np.array([[1, 2.0], [0, 0], (1+1j, 3.)])
+
+ >>> a
+ array([[1.+0.j, 2.+0.j],
+ [0.+0.j, 0.+0.j],
+ [1.+1.j, 3.+0.j]])
+
+
+ array scalar
+ For uniformity in handling operands, NumPy treats
+ a :doc:`scalar <reference/arrays.scalars>` as an array of zero
+ dimension.
+
+
+ axis
+ Another term for an array dimension. Axes are numbered left to right;
+ axis 0 is the first element in the shape tuple.
+
+ In a two-dimensional vector, the elements of axis 0 are rows and the
+ elements of axis 1 are columns.
+
+ In higher dimensions, the picture changes. NumPy prints
+ higher-dimensional vectors as replications of row-by-column building
+ blocks, as in this three-dimensional vector:
+
+ >>> a = np.arange(12).reshape(2,2,3)
+ >>> a
+ array([[[ 0, 1, 2],
+ [ 3, 4, 5]],
+ [[ 6, 7, 8],
+ [ 9, 10, 11]]])
+
+ ``a`` is depicted as a two-element array whose elements are 2x3 vectors.
+ From this point of view, rows and columns are the final two axes,
+ respectively, in any shape.
+
+ This rule helps you anticipate how a vector will be printed, and
+ conversely how to find the index of any of the printed elements. For
+ instance, in the example, the last two values of 8's index must be 0 and
+ 2. Since 8 appears in the second of the two 2x3's, the first index must
+ be 1:
+
+ >>> a[1,0,2]
+ 8
+
+ A convenient way to count dimensions in a printed vector is to
+ count ``[`` symbols after the open-parenthesis. This is
+ useful in distinguishing, say, a (1,2,3) shape from a (2,3) shape:
+
+ >>> a = np.arange(6).reshape(2,3)
+ >>> a.ndim
+ 2
+ >>> a
+ array([[0, 1, 2],
+ [3, 4, 5]])
+
+ >>> a = np.arange(6).reshape(1,2,3)
+ >>> a.ndim
+ 3
+ >>> a
+ array([[[0, 1, 2],
+ [3, 4, 5]]])
+
+
+ .base
+
+ If an array does not own its memory, then its
+ :doc:`base <reference/generated/numpy.ndarray.base>` attribute returns
+ the object whose memory the array is referencing. That object may be
+ referencing the memory from still another object, so the owning object
+ may be ``a.base.base.base...``. Some writers erroneously claim that
+ testing ``base`` determines if arrays are :term:`view`\ s. For the
+ correct way, see :func:`numpy.shares_memory`.
+
+
+ big-endian
+ See `Endianness <https://en.wikipedia.org/wiki/Endianness>`_.
+
+
+ BLAS
+ `Basic Linear Algebra Subprograms <https://en.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms>`_
+
+
+ broadcast
+ *broadcasting* is NumPy's ability to process ndarrays of
+ different sizes as if all were the same size.
+
+ It permits an elegant do-what-I-mean behavior where, for instance,
+ adding a scalar to a vector adds the scalar value to every element.
+
+ >>> a = np.arange(3)
+ >>> a
+ array([0, 1, 2])
+
+ >>> a + [3, 3, 3]
+ array([3, 4, 5])
+
+ >>> a + 3
+ array([3, 4, 5])
+
+ Ordinarly, vector operands must all be the same size, because NumPy
+ works element by element -- for instance, ``c = a * b`` is ::
+
+ c[0,0,0] = a[0,0,0] * b[0,0,0]
+ c[0,0,1] = a[0,0,1] * b[0,0,1]
+ ...
+
+ But in certain useful cases, NumPy can duplicate data along "missing"
+ axes or "too-short" dimensions so shapes will match. The duplication
+ costs no memory or time. For details, see
+ :doc:`Broadcasting. <user/basics.broadcasting>`
+
+
+ C order
+ Same as :term:`row-major`.
+
+
+ column-major
+ See `Row- and column-major order <https://en.wikipedia.org/wiki/Row-_and_column-major_order>`_.
+
+
+ contiguous
+ An array is contiguous if
+ * it occupies an unbroken block of memory, and
+ * array elements with higher indexes occupy higher addresses (that
+ is, no :term:`stride` is negative).
+
+
+ copy
+ See :term:`view`.
+
+
+ dimension
+ See :term:`axis`.
+
+
+ dtype
+ The datatype describing the (identically typed) elements in an ndarray.
+ It can be changed to reinterpret the array contents. For details, see
+ :doc:`Data type objects (dtype). <reference/arrays.dtypes>`
+
+
+ fancy indexing
+ Another term for :term:`advanced indexing`.
+
+
+ field
+ In a :term:`structured data type`, each subtype is called a `field`.
+ The `field` has a name (a string), a type (any valid dtype), and
+ an optional `title`. See :ref:`arrays.dtypes`.
+
+
+ Fortran order
+ Same as :term:`column-major`.
+
+
+ flattened
+ See :term:`ravel`.
+
+
+ homogeneous
+ All elements of a homogeneous array have the same type. ndarrays, in
+ contrast to Python lists, are homogeneous. The type can be complicated,
+ as in a :term:`structured array`, but all elements have that type.
+
+ NumPy `object arrays <#term-object-array>`_, which contain references to
+ Python objects, fill the role of heterogeneous arrays.
+
+
+ itemsize
+ The size of the dtype element in bytes.
+
+
+ little-endian
+ See `Endianness <https://en.wikipedia.org/wiki/Endianness>`_.
+
+
+ mask
+ A boolean array used to select only certain elements for an operation:
+
+ >>> x = np.arange(5)
+ >>> x
+ array([0, 1, 2, 3, 4])
+
+ >>> mask = (x > 2)
+ >>> mask
+ array([False, False, False, True, True])
+
+ >>> x[mask] = -1
+ >>> x
+ array([ 0, 1, 2, -1, -1])
+
+
+ masked array
+ Bad or missing data can be cleanly ignored by putting it in a masked
+ array, which has an internal boolean array indicating invalid
+ entries. Operations with masked arrays ignore these entries. ::
+
+ >>> a = np.ma.masked_array([np.nan, 2, np.nan], [True, False, True])
+ >>> a
+ masked_array(data=[--, 2.0, --],
+ mask=[ True, False, True],
+ fill_value=1e+20)
+
+ >>> a + [1, 2, 3]
+ masked_array(data=[--, 4.0, --],
+ mask=[ True, False, True],
+ fill_value=1e+20)
+
+ For details, see :doc:`Masked arrays. <reference/maskedarray>`
+
+
+ matrix
+ NumPy's two-dimensional
+ :doc:`matrix class <reference/generated/numpy.matrix>`
+ should no longer be used; use regular ndarrays.
+
+
+ ndarray
+ :doc:`NumPy's basic structure <reference/arrays>`.
+
+
+ object array
+ An array whose dtype is ``object``; that is, it contains references to
+ Python objects. Indexing the array dereferences the Python objects, so
+ unlike other ndarrays, an object array has the ability to hold
+ heterogeneous objects.
+
+
+ ravel
+ :doc:`numpy.ravel \
+ <reference/generated/numpy.ravel>`
+ and :doc:`numpy.flatten \
+ <reference/generated/numpy.ndarray.flatten>`
+ both flatten an ndarray. ``ravel`` will return a view if possible;
+ ``flatten`` always returns a copy.
+
+ Flattening collapses a multimdimensional array to a single dimension;
+ details of how this is done (for instance, whether ``a[n+1]`` should be
+ the next row or next column) are parameters.
+
+
+ record array
+ A :term:`structured array` with allowing access in an attribute style
+ (``a.field``) in addition to ``a['field']``. For details, see
+ :doc:`numpy.recarray. <reference/generated/numpy.recarray>`
+
+
+ row-major
+ See `Row- and column-major order <https://en.wikipedia.org/wiki/Row-_and_column-major_order>`_.
+ NumPy creates arrays in row-major order by default.
+
+
+ scalar
+ In NumPy, usually a synonym for :term:`array scalar`.
+
+
+ shape
+ A tuple showing the length of each dimension of an ndarray. The
+ length of the tuple itself is the number of dimensions
+ (:doc:`numpy.ndim <reference/generated/numpy.ndarray.ndim>`).
+ The product of the tuple elements is the number of elements in the
+ array. For details, see
+ :doc:`numpy.ndarray.shape <reference/generated/numpy.ndarray.shape>`.
+
+
+ stride
+ Physical memory is one-dimensional; strides provide a mechanism to map
+ a given index to an address in memory. For an N-dimensional array, its
+ ``strides`` attribute is an N-element tuple; advancing from index
+ ``i`` to index ``i+1`` on axis ``n`` means adding ``a.strides[n]`` bytes
+ to the address.
+
+ Strides are computed automatically from an array's dtype and
+ shape, but can be directly specified using
+ :doc:`as_strided. <reference/generated/numpy.lib.stride_tricks.as_strided>`
+
+ For details, see
+ :doc:`numpy.ndarray.strides <reference/generated/numpy.ndarray.strides>`.
+
+ To see how striding underlies the power of NumPy views, see
+ `The NumPy array: a structure for efficient numerical computation. \
+ <https://arxiv.org/pdf/1102.1523.pdf>`_
+
+
+ structured array
+ Array whose :term:`dtype` is a :term:`structured data type`.
+
+
+ structured data type
+ Users can create arbitrarily complex :term:`dtypes <dtype>`
+ that can include other arrays and dtypes. These composite dtypes are called
+ :doc:`structured data types. <user/basics.rec>`
+
+
+ subarray
+ An array nested in a :term:`structured data type`, as ``b`` is here:
+
+ >>> dt = np.dtype([('a', np.int32), ('b', np.float32, (3,))])
+ >>> np.zeros(3, dtype=dt)
+ array([(0, [0., 0., 0.]), (0, [0., 0., 0.]), (0, [0., 0., 0.])],
+ dtype=[('a', '<i4'), ('b', '<f4', (3,))])
+
+
+ subarray data type
+ An element of a structured datatype that behaves like an ndarray.
+
+
+ title
+ An alias for a field name in a structured datatype.
+
+
+ type
+ In NumPy, usually a synonym for :term:`dtype`. For the more general
+ Python meaning, :term:`see here. <python:type>`
+
+
+ ufunc
+ NumPy's fast element-by-element computation (:term:`vectorization`)
+ gives a choice which function gets applied. The general term for the
+ function is ``ufunc``, short for ``universal function``. NumPy routines
+ have built-in ufuncs, but users can also
+ :doc:`write their own. <reference/ufuncs>`
+
+
+ vectorization
+ NumPy hands off array processing to C, where looping and computation are
+ much faster than in Python. To exploit this, programmers using NumPy
+ eliminate Python loops in favor of array-to-array operations.
+ :term:`vectorization` can refer both to the C offloading and to
+ structuring NumPy code to leverage it.
+
+ view
+ Without touching underlying data, NumPy can make one array appear
+ to change its datatype and shape.
+
+ An array created this way is a `view`, and NumPy often exploits the
+ performance gain of using a view versus making a new array.
+
+ A potential drawback is that writing to a view can alter the original
+ as well. If this is a problem, NumPy instead needs to create a
+ physically distinct array -- a `copy`.
+
+ Some NumPy routines always return views, some always return copies, some
+ may return one or the other, and for some the choice can be specified.
+ Responsiblity for managing views and copies falls to the programmer.
+ :func:`numpy.shares_memory` will check whether ``b`` is a view of
+ ``a``, but an exact answer isn't always feasible, as the documentation
+ page explains.
+
+ >>> x = np.arange(5)
+ >>> x
+ array([0, 1, 2, 3, 4])
+
+ >>> y = x[::2]
+ >>> y
+ array([0, 2, 4])
+
+ >>> x[0] = 3 # changing x changes y as well, since y is a view on x
+ >>> y
+ array([3, 2, 4])
-.. automodule:: numpy.doc.glossary
diff --git a/doc/source/license.rst b/doc/source/license.rst
index 8f360af88..beea023ce 100644
--- a/doc/source/license.rst
+++ b/doc/source/license.rst
@@ -1,35 +1,6 @@
*************
-NumPy License
+NumPy license
*************
-Copyright (c) 2005, NumPy Developers
-
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-* Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
-* Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials provided
- with the distribution.
-
-* Neither the name of the NumPy Developers nor the names of any
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.. include:: ../../LICENSE.txt
+ :literal:
diff --git a/doc/source/reference/arrays.classes.rst b/doc/source/reference/arrays.classes.rst
index 6c8793342..3a4ed2168 100644
--- a/doc/source/reference/arrays.classes.rst
+++ b/doc/source/reference/arrays.classes.rst
@@ -173,7 +173,7 @@ NumPy provides several hooks that classes can customize:
- ``func`` is an arbitrary callable exposed by NumPy's public API,
which was called in the form ``func(*args, **kwargs)``.
- - ``types`` is a `collection <collections.abc.Collection>`_
+ - ``types`` is a collection :py:class:`collections.abc.Collection`
of unique argument types from the original NumPy function call that
implement ``__array_function__``.
- The tuple ``args`` and dict ``kwargs`` are directly passed on from the
@@ -480,16 +480,16 @@ Character arrays (:mod:`numpy.char`)
The `chararray` class exists for backwards compatibility with
Numarray, it is not recommended for new development. Starting from numpy
1.4, if one needs arrays of strings, it is recommended to use arrays of
- `dtype` `object_`, `string_` or `unicode_`, and use the free functions
+ `dtype` `object_`, `bytes_` or `str_`, and use the free functions
in the `numpy.char` module for fast vectorized string operations.
-These are enhanced arrays of either :class:`string_` type or
-:class:`unicode_` type. These arrays inherit from the
+These are enhanced arrays of either :class:`str_` type or
+:class:`bytes_` type. These arrays inherit from the
:class:`ndarray`, but specially-define the operations ``+``, ``*``,
and ``%`` on a (broadcasting) element-by-element basis. These
operations are not available on the standard :class:`ndarray` of
character type. In addition, the :class:`chararray` has all of the
-standard :class:`string <str>` (and :class:`unicode`) methods,
+standard :class:`str` (and :class:`bytes`) methods,
executing them on an element-by-element basis. Perhaps the easiest
way to create a chararray is to use :meth:`self.view(chararray)
<ndarray.view>` where *self* is an ndarray of str or unicode
diff --git a/doc/source/reference/arrays.datetime.rst b/doc/source/reference/arrays.datetime.rst
index 9ce77424a..c5947620e 100644
--- a/doc/source/reference/arrays.datetime.rst
+++ b/doc/source/reference/arrays.datetime.rst
@@ -218,7 +218,7 @@ And here are the time units:
m minute +/- 1.7e13 years [1.7e13 BC, 1.7e13 AD]
s second +/- 2.9e11 years [2.9e11 BC, 2.9e11 AD]
ms millisecond +/- 2.9e8 years [ 2.9e8 BC, 2.9e8 AD]
- us microsecond +/- 2.9e5 years [290301 BC, 294241 AD]
+us / μs microsecond +/- 2.9e5 years [290301 BC, 294241 AD]
ns nanosecond +/- 292 years [ 1678 AD, 2262 AD]
ps picosecond +/- 106 days [ 1969 AD, 1970 AD]
fs femtosecond +/- 2.6 hours [ 1969 AD, 1970 AD]
diff --git a/doc/source/reference/arrays.dtypes.rst b/doc/source/reference/arrays.dtypes.rst
index f8d40b13c..b5ffa1a8b 100644
--- a/doc/source/reference/arrays.dtypes.rst
+++ b/doc/source/reference/arrays.dtypes.rst
@@ -122,14 +122,12 @@ constructor:
What can be converted to a data-type object is described below:
:class:`dtype` object
-
.. index::
triple: dtype; construction; from dtype
Used as-is.
None
-
.. index::
triple: dtype; construction; from None
@@ -139,7 +137,6 @@ None
triple: dtype; construction; from type
Array-scalar types
-
The 24 built-in :ref:`array scalar type objects
<arrays.scalars.built-in>` all convert to an associated data-type object.
This is true for their sub-classes as well.
@@ -155,15 +152,6 @@ Array-scalar types
>>> dt = np.dtype(np.complex128) # 128-bit complex floating-point number
Generic types
-
- .. deprecated NumPy 1.19::
-
- The use of generic types is deprecated. This is because it can be
- unexpected in a context such as ``arr.astype(dtype=np.floating)``.
- ``arr.astype(dtype=np.floating)`` which casts an array of ``float32``
- to an array of ``float64``, even though ``float32`` is a subdtype of
- ``np.floating``.
-
The generic hierarchical type objects convert to corresponding
type objects according to the associations:
@@ -176,8 +164,16 @@ Generic types
:class:`generic`, :class:`flexible` :class:`void`
===================================================== ===============
-Built-in Python types
+ .. deprecated:: 1.19
+
+ This conversion of generic scalar types is deprecated.
+ This is because it can be unexpected in a context such as
+ ``arr.astype(dtype=np.floating)``, which casts an array of ``float32``
+ to an array of ``float64``, even though ``float32`` is a subdtype of
+ ``np.floating``.
+
+Built-in Python types
Several python types are equivalent to a corresponding
array scalar when used to generate a :class:`dtype` object:
@@ -206,10 +202,9 @@ Built-in Python types
.. note::
All other types map to ``object_`` for convenience. Code should expect
- that such types may map to a specific (new) dtype in future the future.
+ that such types may map to a specific (new) dtype in the future.
Types with ``.dtype``
-
Any type object with a ``dtype`` attribute: The attribute will be
accessed and used directly. The attribute must return something
that is convertible into a dtype object.
@@ -223,7 +218,6 @@ prepended with ``'>'`` (:term:`big-endian`), ``'<'``
specify the byte order.
One-character strings
-
Each built-in data-type has a character code
(the updated Numeric typecodes), that uniquely identifies it.
@@ -235,7 +229,6 @@ One-character strings
>>> dt = np.dtype('d') # double-precision floating-point number
Array-protocol type strings (see :ref:`arrays.interface`)
-
The first character specifies the kind of data and the remaining
characters specify the number of bytes per item, except for Unicode,
where it is interpreted as the number of characters. The item size
@@ -271,14 +264,12 @@ Array-protocol type strings (see :ref:`arrays.interface`)
.. admonition:: Note on string types
For backward compatibility with Python 2 the ``S`` and ``a`` typestrings
- remain zero-terminated bytes and ``np.string_`` continues to map to
- ``np.bytes_``.
- To use actual strings in Python 3 use ``U`` or ``np.unicode_``.
+ remain zero-terminated bytes and `numpy.string_` continues to alias
+ `numpy.bytes_`. To use actual strings in Python 3 use ``U`` or `numpy.str_`.
For signed bytes that do not need zero-termination ``b`` or ``i1`` can be
used.
String with comma-separated fields
-
A short-hand notation for specifying the format of a structured data type is
a comma-separated string of basic formats.
@@ -310,7 +301,6 @@ String with comma-separated fields
>>> dt = np.dtype("a3, 3u8, (3,4)a10")
Type strings
-
Any string in :obj:`numpy.sctypeDict`.keys():
.. admonition:: Example
@@ -322,7 +312,6 @@ Type strings
triple: dtype; construction; from tuple
``(flexible_dtype, itemsize)``
-
The first argument must be an object that is converted to a
zero-sized flexible data-type object, the second argument is
an integer providing the desired itemsize.
@@ -333,7 +322,6 @@ Type strings
>>> dt = np.dtype(('U', 10)) # 10-character unicode string
``(fixed_dtype, shape)``
-
.. index::
pair: dtype; sub-array
@@ -354,10 +342,9 @@ Type strings
triple: dtype; construction; from list
``[(field_name, field_dtype, field_shape), ...]``
-
*obj* should be a list of fields where each field is described by a
tuple of length 2 or 3. (Equivalent to the ``descr`` item in the
- :obj:`__array_interface__` attribute.)
+ :obj:`~object.__array_interface__` attribute.)
The first element, *field_name*, is the field name (if this is
``''`` then a standard field name, ``'f#'``, is assigned). The
@@ -394,7 +381,6 @@ Type strings
triple: dtype; construction; from dict
``{'names': ..., 'formats': ..., 'offsets': ..., 'titles': ..., 'itemsize': ...}``
-
This style has two required and three optional keys. The *names*
and *formats* keys are required. Their respective values are
equal-length lists with the field names and the field formats.
@@ -405,9 +391,9 @@ Type strings
their values must each be lists of the same length as the *names*
and *formats* lists. The *offsets* value is a list of byte offsets
(limited to `ctypes.c_int`) for each field, while the *titles* value is a
- list of titles for each field (None can be used if no title is
- desired for that field). The *titles* can be any :class:`string`
- or :class:`unicode` object and will add another entry to the
+ list of titles for each field (``None`` can be used if no title is
+ desired for that field). The *titles* can be any object, but when a
+ :class:`str` object will add another entry to the
fields dictionary keyed by the title and referencing the same
field tuple which will contain the title as an additional tuple
member.
@@ -436,7 +422,6 @@ Type strings
``{'field1': ..., 'field2': ..., ...}``
-
This usage is discouraged, because it is ambiguous with the
other dict-based construction method. If you have a field
called 'names' and a field called 'formats' there will be
@@ -458,7 +443,6 @@ Type strings
... 'col3': (int, 14)})
``(base_dtype, new_dtype)``
-
In NumPy 1.7 and later, this form allows `base_dtype` to be interpreted as
a structured dtype. Arrays created with this dtype will have underlying
dtype `base_dtype` but will have fields and flags taken from `new_dtype`.
@@ -553,6 +537,13 @@ Attributes providing additional information:
dtype.alignment
dtype.base
+Metadata attached by the user:
+
+.. autosummary::
+ :toctree: generated/
+
+ dtype.metadata
+
Methods
-------
diff --git a/doc/source/reference/arrays.indexing.rst b/doc/source/reference/arrays.indexing.rst
index 56b99f272..9f82875ea 100644
--- a/doc/source/reference/arrays.indexing.rst
+++ b/doc/source/reference/arrays.indexing.rst
@@ -34,7 +34,7 @@ Basic Slicing and Indexing
Basic slicing extends Python's basic concept of slicing to N
dimensions. Basic slicing occurs when *obj* is a :class:`slice` object
(constructed by ``start:stop:step`` notation inside of brackets), an
-integer, or a tuple of slice objects and integers. :const:`Ellipsis`
+integer, or a tuple of slice objects and integers. :py:data:`Ellipsis`
and :const:`newaxis` objects can be interspersed with these as
well.
@@ -43,7 +43,7 @@ well.
In order to remain backward compatible with a common usage in
Numeric, basic slicing is also initiated if the selection object is
any non-ndarray and non-tuple sequence (such as a :class:`list`) containing
- :class:`slice` objects, the :const:`Ellipsis` object, or the :const:`newaxis`
+ :class:`slice` objects, the :py:data:`Ellipsis` object, or the :const:`newaxis`
object, but not for integer arrays or other embedded sequences.
.. index::
@@ -129,7 +129,7 @@ concepts to remember include:
[5],
[6]]])
-- :const:`Ellipsis` expands to the number of ``:`` objects needed for the
+- :py:data:`Ellipsis` expands to the number of ``:`` objects needed for the
selection tuple to index all dimensions. In most cases, this means that
length of the expanded selection tuple is ``x.ndim``. There may only be a
single ellipsis present.
@@ -198,6 +198,7 @@ concepts to remember include:
create an axis of length one. :const:`newaxis` is an alias for
'None', and 'None' can be used in place of this with the same result.
+.. _advanced-indexing:
Advanced Indexing
-----------------
@@ -304,6 +305,8 @@ understood with an example.
most important thing to remember about indexing with multiple advanced
indexes.
+.. _combining-advanced-and-basic-indexing:
+
Combining advanced and basic indexing
"""""""""""""""""""""""""""""""""""""
@@ -330,7 +333,7 @@ the subspace defined by the basic indexing (excluding integers) and the
subspace from the advanced indexing part. Two cases of index combination
need to be distinguished:
-* The advanced indexes are separated by a slice, :const:`Ellipsis` or :const:`newaxis`.
+* The advanced indexes are separated by a slice, :py:data:`Ellipsis` or :const:`newaxis`.
For example ``x[arr1, :, arr2]``.
* The advanced indexes are all next to each other.
For example ``x[..., arr1, arr2, :]`` but *not* ``x[arr1, :, 1]``
@@ -377,15 +380,15 @@ type, such as may be returned from comparison operators. A single
boolean index array is practically identical to ``x[obj.nonzero()]`` where,
as described above, :meth:`obj.nonzero() <ndarray.nonzero>` returns a
tuple (of length :attr:`obj.ndim <ndarray.ndim>`) of integer index
-arrays showing the :const:`True` elements of *obj*. However, it is
+arrays showing the :py:data:`True` elements of *obj*. However, it is
faster when ``obj.shape == x.shape``.
If ``obj.ndim == x.ndim``, ``x[obj]`` returns a 1-dimensional array
-filled with the elements of *x* corresponding to the :const:`True`
+filled with the elements of *x* corresponding to the :py:data:`True`
values of *obj*. The search order will be :term:`row-major`,
-C-style. If *obj* has :const:`True` values at entries that are outside
+C-style. If *obj* has :py:data:`True` values at entries that are outside
of the bounds of *x*, then an index error will be raised. If *obj* is
-smaller than *x* it is identical to filling it with :const:`False`.
+smaller than *x* it is identical to filling it with :py:data:`False`.
.. admonition:: Example
@@ -450,7 +453,7 @@ also supports boolean arrays and will work without any surprises.
array([[ 3, 5],
[ 9, 11]])
- Without the ``np.ix_`` call or only the diagonal elements would be
+ Without the ``np.ix_`` call, only the diagonal elements would be
selected.
Or without ``np.ix_`` (compare the integer array examples):
diff --git a/doc/source/reference/arrays.interface.rst b/doc/source/reference/arrays.interface.rst
index 4e95535c0..6a8c5f9c4 100644
--- a/doc/source/reference/arrays.interface.rst
+++ b/doc/source/reference/arrays.interface.rst
@@ -49,9 +49,9 @@ Python side
===========
This approach to the interface consists of the object having an
-:data:`__array_interface__` attribute.
+:data:`~object.__array_interface__` attribute.
-.. data:: __array_interface__
+.. data:: object.__array_interface__
A dictionary of items (3 required and 5 optional). The optional
keys in the dictionary have implied defaults if they are not
@@ -60,17 +60,15 @@ This approach to the interface consists of the object having an
The keys are:
**shape** (required)
-
Tuple whose elements are the array size in each dimension. Each
- entry is an integer (a Python int or long). Note that these
- integers could be larger than the platform "int" or "long"
- could hold (a Python int is a C long). It is up to the code
+ entry is an integer (a Python :py:class:`int`). Note that these
+ integers could be larger than the platform ``int`` or ``long``
+ could hold (a Python :py:class:`int` is a C ``long``). It is up to the code
using this attribute to handle this appropriately; either by
raising an error when overflow is possible, or by using
- :c:data:`Py_LONG_LONG` as the C type for the shapes.
+ ``long long`` as the C type for the shapes.
**typestr** (required)
-
A string providing the basic type of the homogeneous array The
basic string format consists of 3 parts: a character describing
the byteorder of the data (``<``: little-endian, ``>``:
@@ -97,7 +95,6 @@ This approach to the interface consists of the object having an
===== ================================================================
**descr** (optional)
-
A list of tuples providing a more detailed description of the
memory layout for each item in the homogeneous array. Each
tuple in the list has two or three elements. Normally, this
@@ -127,7 +124,6 @@ This approach to the interface consists of the object having an
**Default**: ``[('', typestr)]``
**data** (optional)
-
A 2-tuple whose first argument is an integer (a long integer
if necessary) that points to the data-area storing the array
contents. This pointer must point to the first element of
@@ -136,7 +132,7 @@ This approach to the interface consists of the object having an
means the data area is read-only).
This attribute can also be an object exposing the
- :c:func:`buffer interface <PyObject_AsCharBuffer>` which
+ :ref:`buffer interface <bufferobjects>` which
will be used to share the data. If this key is not present (or
returns None), then memory sharing will be done
through the buffer interface of the object itself. In this
@@ -148,25 +144,23 @@ This approach to the interface consists of the object having an
**Default**: None
**strides** (optional)
-
- Either None to indicate a C-style contiguous array or
+ Either ``None`` to indicate a C-style contiguous array or
a Tuple of strides which provides the number of bytes needed
to jump to the next array element in the corresponding
dimension. Each entry must be an integer (a Python
- :const:`int` or :const:`long`). As with shape, the values may
- be larger than can be represented by a C "int" or "long"; the
+ :py:class:`int`). As with shape, the values may
+ be larger than can be represented by a C ``int`` or ``long``; the
calling code should handle this appropriately, either by
- raising an error, or by using :c:type:`Py_LONG_LONG` in C. The
- default is None which implies a C-style contiguous
- memory buffer. In this model, the last dimension of the array
+ raising an error, or by using ``long long`` in C. The
+ default is ``None`` which implies a C-style contiguous
+ memory buffer. In this model, the last dimension of the array
varies the fastest. For example, the default strides tuple
for an object whose array entries are 8 bytes long and whose
- shape is (10,20,30) would be (4800, 240, 8)
+ shape is ``(10, 20, 30)`` would be ``(4800, 240, 8)``
- **Default**: None (C-style contiguous)
+ **Default**: ``None`` (C-style contiguous)
**mask** (optional)
-
None or an object exposing the array interface. All
elements of the mask array should be interpreted only as true
or not true indicating which elements of this array are valid.
@@ -177,15 +171,13 @@ This approach to the interface consists of the object having an
**Default**: None (All array values are valid)
**offset** (optional)
-
An integer offset into the array data region. This can only be
- used when data is None or returns a :class:`buffer`
+ used when data is ``None`` or returns a :class:`buffer`
object.
**Default**: 0.
**version** (required)
-
An integer showing the version of the interface (i.e. 3 for
this version). Be careful not to use this to invalidate
objects exposing future versions of the interface.
@@ -197,11 +189,11 @@ C-struct access
This approach to the array interface allows for faster access to an
array using only one attribute lookup and a well-defined C-structure.
-.. c:var:: __array_struct__
+.. data:: object.__array_struct__
- A :c:type: `PyCObject` whose :c:data:`voidptr` member contains a
+ A :c:type:`PyCapsule` whose ``pointer`` member contains a
pointer to a filled :c:type:`PyArrayInterface` structure. Memory
- for the structure is dynamically created and the :c:type:`PyCObject`
+ for the structure is dynamically created and the :c:type:`PyCapsule`
is also created with an appropriate destructor so the retriever of
this attribute simply has to apply :c:func:`Py_DECREF()` to the
object returned by this attribute when it is finished. Also,
@@ -211,7 +203,7 @@ array using only one attribute lookup and a well-defined C-structure.
must also not reallocate their memory if other objects are
referencing them.
-The PyArrayInterface structure is defined in ``numpy/ndarrayobject.h``
+The :c:type:`PyArrayInterface` structure is defined in ``numpy/ndarrayobject.h``
as::
typedef struct {
@@ -231,29 +223,32 @@ as::
The flags member may consist of 5 bits showing how the data should be
interpreted and one bit showing how the Interface should be
-interpreted. The data-bits are :const:`CONTIGUOUS` (0x1),
-:const:`FORTRAN` (0x2), :const:`ALIGNED` (0x100), :const:`NOTSWAPPED`
-(0x200), and :const:`WRITEABLE` (0x400). A final flag
-:const:`ARR_HAS_DESCR` (0x800) indicates whether or not this structure
+interpreted. The data-bits are :c:macro:`NPY_ARRAY_C_CONTIGUOUS` (0x1),
+:c:macro:`NPY_ARRAY_F_CONTIGUOUS` (0x2), :c:macro:`NPY_ARRAY_ALIGNED` (0x100),
+:c:macro:`NPY_ARRAY_NOTSWAPPED` (0x200), and :c:macro:`NPY_ARRAY_WRITEABLE` (0x400). A final flag
+:c:macro:`NPY_ARR_HAS_DESCR` (0x800) indicates whether or not this structure
has the arrdescr field. The field should not be accessed unless this
flag is present.
+ .. c:macro:: NPY_ARR_HAS_DESCR
+
.. admonition:: New since June 16, 2006:
- In the past most implementations used the "desc" member of the
- :c:type:`PyCObject` itself (do not confuse this with the "descr" member of
+ In the past most implementations used the ``desc`` member of the ``PyCObject``
+ (now :c:type:`PyCapsule`) itself (do not confuse this with the "descr" member of
the :c:type:`PyArrayInterface` structure above --- they are two separate
things) to hold the pointer to the object exposing the interface.
- This is now an explicit part of the interface. Be sure to own a
- reference to the object when the :c:type:`PyCObject` is created using
- :c:type:`PyCObject_FromVoidPtrAndDesc`.
+ This is now an explicit part of the interface. Be sure to take a
+ reference to the object and call :c:func:`PyCapsule_SetContext` before
+ returning the :c:type:`PyCapsule`, and configure a destructor to decref this
+ reference.
Type description examples
=========================
For clarity it is useful to provide some examples of the type
-description and corresponding :data:`__array_interface__` 'descr'
+description and corresponding :data:`~object.__array_interface__` 'descr'
entries. Thanks to Scott Gilbert for these examples:
In every case, the 'descr' key is optional, but of course provides
@@ -315,25 +310,39 @@ largely aesthetic. In particular:
1. The PyArrayInterface structure had no descr member at the end
(and therefore no flag ARR_HAS_DESCR)
-2. The desc member of the PyCObject returned from __array_struct__ was
+2. The ``context`` member of the :c:type:`PyCapsule` (formally the ``desc``
+ member of the ``PyCObject``) returned from ``__array_struct__`` was
not specified. Usually, it was the object exposing the array (so
that a reference to it could be kept and destroyed when the
- C-object was destroyed). Now it must be a tuple whose first
- element is a string with "PyArrayInterface Version #" and whose
- second element is the object exposing the array.
+ C-object was destroyed). It is now an explicit requirement that this field
+ be used in some way to hold a reference to the owning object.
+
+ .. note::
+
+ Until August 2020, this said:
+
+ Now it must be a tuple whose first element is a string with
+ "PyArrayInterface Version #" and whose second element is the object
+ exposing the array.
+
+ This design was retracted almost immediately after it was proposed, in
+ <https://mail.python.org/pipermail/numpy-discussion/2006-June/020995.html>.
+ Despite 14 years of documentation to the contrary, at no point was it
+ valid to assume that ``__array_interface__`` capsules held this tuple
+ content.
-3. The tuple returned from __array_interface__['data'] used to be a
+3. The tuple returned from ``__array_interface__['data']`` used to be a
hex-string (now it is an integer or a long integer).
-4. There was no __array_interface__ attribute instead all of the keys
- (except for version) in the __array_interface__ dictionary were
+4. There was no ``__array_interface__`` attribute instead all of the keys
+ (except for version) in the ``__array_interface__`` dictionary were
their own attribute: Thus to obtain the Python-side information you
had to access separately the attributes:
- * __array_data__
- * __array_shape__
- * __array_strides__
- * __array_typestr__
- * __array_descr__
- * __array_offset__
- * __array_mask__
+ * ``__array_data__``
+ * ``__array_shape__``
+ * ``__array_strides__``
+ * ``__array_typestr__``
+ * ``__array_descr__``
+ * ``__array_offset__``
+ * ``__array_mask__``
diff --git a/doc/source/reference/arrays.ndarray.rst b/doc/source/reference/arrays.ndarray.rst
index 689240c7d..191367058 100644
--- a/doc/source/reference/arrays.ndarray.rst
+++ b/doc/source/reference/arrays.ndarray.rst
@@ -1,11 +1,11 @@
+.. currentmodule:: numpy
+
.. _arrays.ndarray:
******************************************
The N-dimensional array (:class:`ndarray`)
******************************************
-.. currentmodule:: numpy
-
An :class:`ndarray` is a (usually fixed-size) multidimensional
container of items of the same type and size. The number of dimensions
and items in an array is defined by its :attr:`shape <ndarray.shape>`,
@@ -259,10 +259,10 @@ Array interface
.. seealso:: :ref:`arrays.interface`.
-========================== ===================================
-:obj:`__array_interface__` Python-side of the array interface
-:obj:`__array_struct__` C-side of the array interface
-========================== ===================================
+================================== ===================================
+:obj:`~object.__array_interface__` Python-side of the array interface
+:obj:`~object.__array_struct__` C-side of the array interface
+================================== ===================================
:mod:`ctypes` foreign function interface
----------------------------------------
@@ -469,7 +469,7 @@ Comparison operators:
ndarray.__eq__
ndarray.__ne__
-Truth value of an array (:func:`bool()`):
+Truth value of an array (:class:`bool() <bool>`):
.. autosummary::
:toctree: generated/
@@ -604,9 +604,9 @@ Container customization: (see :ref:`Indexing <arrays.indexing>`)
ndarray.__setitem__
ndarray.__contains__
-Conversion; the operations :func:`int()`, :func:`float()` and
-:func:`complex()`.
-. They work only on arrays that have one element in them
+Conversion; the operations :class:`int() <int>`,
+:class:`float() <float>` and :class:`complex() <complex>`.
+They work only on arrays that have one element in them
and return the appropriate scalar.
.. autosummary::
diff --git a/doc/source/reference/arrays.nditer.cython.rst b/doc/source/reference/arrays.nditer.cython.rst
index 2cc7763ed..43aad9927 100644
--- a/doc/source/reference/arrays.nditer.cython.rst
+++ b/doc/source/reference/arrays.nditer.cython.rst
@@ -5,7 +5,7 @@ Those who want really good performance out of their low level operations
should strongly consider directly using the iteration API provided
in C, but for those who are not comfortable with C or C++, Cython
is a good middle ground with reasonable performance tradeoffs. For
-the :class:`nditer` object, this means letting the iterator take care
+the :class:`~numpy.nditer` object, this means letting the iterator take care
of broadcasting, dtype conversion, and buffering, while giving the inner
loop to Cython.
diff --git a/doc/source/reference/arrays.nditer.rst b/doc/source/reference/arrays.nditer.rst
index 2db12a408..72a04f73e 100644
--- a/doc/source/reference/arrays.nditer.rst
+++ b/doc/source/reference/arrays.nditer.rst
@@ -10,6 +10,14 @@
Iterating Over Arrays
*********************
+.. note::
+
+ Arrays support the iterator protocol and can be iterated over like Python
+ lists. See the :ref:`quickstart.indexing-slicing-and-iterating` section in
+ the Quickstart guide for basic usage and examples. The remainder of
+ this document presents the :class:`nditer` object and covers more
+ advanced usage.
+
The iterator object :class:`nditer`, introduced in NumPy 1.6, provides
many flexible ways to visit all the elements of one or more arrays in
a systematic fashion. This page introduces some basic ways to use the
diff --git a/doc/source/reference/arrays.scalars.rst b/doc/source/reference/arrays.scalars.rst
index d27d61e2c..4b5da2e13 100644
--- a/doc/source/reference/arrays.scalars.rst
+++ b/doc/source/reference/arrays.scalars.rst
@@ -24,14 +24,14 @@ mixing scalar and array operations.
Array scalars live in a hierarchy (see the Figure below) of data
types. They can be detected using the hierarchy: For example,
-``isinstance(val, np.generic)`` will return :const:`True` if *val* is
+``isinstance(val, np.generic)`` will return :py:data:`True` if *val* is
an array scalar object. Alternatively, what kind of array scalar is
present can be determined using other members of the data type
hierarchy. Thus, for example ``isinstance(val, np.complexfloating)``
-will return :const:`True` if *val* is a complex valued type, while
-:const:`isinstance(val, np.flexible)` will return true if *val* is one
-of the flexible itemsize array types (:class:`string`,
-:class:`unicode`, :class:`void`).
+will return :py:data:`True` if *val* is a complex valued type, while
+``isinstance(val, np.flexible)`` will return true if *val* is one
+of the flexible itemsize array types (:class:`str_`,
+:class:`bytes_`, :class:`void`).
.. figure:: figures/dtype-hierarchy.png
@@ -41,6 +41,13 @@ of the flexible itemsize array types (:class:`string`,
pointer for the platform. All the number types can be obtained
using bit-width names as well.
+
+.. TODO - use something like this instead of the diagram above, as it generates
+ links to the classes and is a vector graphic. Unfortunately it looks worse
+ and the html <map> element providing the linked regions is misaligned.
+
+ .. inheritance-diagram:: byte short intc int_ longlong ubyte ushort uintc uint ulonglong half single double longdouble csingle cdouble clongdouble bool_ datetime64 timedelta64 object_ bytes_ str_ void
+
.. [#] However, array scalars are immutable, so none of the array
scalar attributes are settable.
@@ -51,129 +58,148 @@ of the flexible itemsize array types (:class:`string`,
Built-in scalar types
=====================
-The built-in scalar types are shown below. Along with their (mostly)
-C-derived names, the integer, float, and complex data-types are also
-available using a bit-width convention so that an array of the right
-size can always be ensured (e.g. :class:`int8`, :class:`float64`,
-:class:`complex128`). Two aliases (:class:`intp` and :class:`uintp`)
-pointing to the integer type that is sufficiently large to hold a C pointer
-are also provided. The C-like names are associated with character codes,
-which are shown in the table. Use of the character codes, however,
+The built-in scalar types are shown below. The C-like names are associated with character codes,
+which are shown in their descriptions. Use of the character codes, however,
is discouraged.
Some of the scalar types are essentially equivalent to fundamental
Python types and therefore inherit from them as well as from the
generic array scalar type:
-==================== ================================
-Array scalar type Related Python type
-==================== ================================
-:class:`int_` :class:`IntType` (Python 2 only)
-:class:`float_` :class:`FloatType`
-:class:`complex_` :class:`ComplexType`
-:class:`bytes_` :class:`BytesType`
-:class:`unicode_` :class:`UnicodeType`
-==================== ================================
+==================== =========================== =============
+Array scalar type Related Python type Inherits?
+==================== =========================== =============
+:class:`int_` :class:`int` Python 2 only
+:class:`float_` :class:`float` yes
+:class:`complex_` :class:`complex` yes
+:class:`bytes_` :class:`bytes` yes
+:class:`str_` :class:`str` yes
+:class:`bool_` :class:`bool` no
+:class:`datetime64` :class:`datetime.datetime` no
+:class:`timedelta64` :class:`datetime.timedelta` no
+==================== =========================== =============
The :class:`bool_` data type is very similar to the Python
-:class:`BooleanType` but does not inherit from it because Python's
-:class:`BooleanType` does not allow itself to be inherited from, and
+:class:`bool` but does not inherit from it because Python's
+:class:`bool` does not allow itself to be inherited from, and
on the C-level the size of the actual bool data is not the same as a
Python Boolean scalar.
.. warning::
- The :class:`bool_` type is not a subclass of the :class:`int_` type
- (the :class:`bool_` is not even a number type). This is different
- than Python's default implementation of :class:`bool` as a
- sub-class of int.
-
-.. warning::
-
The :class:`int_` type does **not** inherit from the
:class:`int` built-in under Python 3, because type :class:`int` is no
longer a fixed-width integer type.
.. tip:: The default data type in NumPy is :class:`float_`.
-In the tables below, ``platform?`` means that the type may not be
-available on all platforms. Compatibility with different C or Python
-types is indicated: two types are compatible if their data is of the
-same size and interpreted in the same way.
-
-Booleans:
-
-=================== ============================= ===============
-Type Remarks Character code
-=================== ============================= ===============
-:class:`bool_` compatible: Python bool ``'?'``
-:class:`bool8` 8 bits
-=================== ============================= ===============
-
-Integers:
-
-=================== ============================= ===============
-:class:`byte` compatible: C char ``'b'``
-:class:`short` compatible: C short ``'h'``
-:class:`intc` compatible: C int ``'i'``
-:class:`int_` compatible: Python int ``'l'``
-:class:`longlong` compatible: C long long ``'q'``
-:class:`intp` large enough to fit a pointer ``'p'``
-:class:`int8` 8 bits
-:class:`int16` 16 bits
-:class:`int32` 32 bits
-:class:`int64` 64 bits
-=================== ============================= ===============
-
-Unsigned integers:
-
-=================== ============================= ===============
-:class:`ubyte` compatible: C unsigned char ``'B'``
-:class:`ushort` compatible: C unsigned short ``'H'``
-:class:`uintc` compatible: C unsigned int ``'I'``
-:class:`uint` compatible: Python int ``'L'``
-:class:`ulonglong` compatible: C long long ``'Q'``
-:class:`uintp` large enough to fit a pointer ``'P'``
-:class:`uint8` 8 bits
-:class:`uint16` 16 bits
-:class:`uint32` 32 bits
-:class:`uint64` 64 bits
-=================== ============================= ===============
-
-Floating-point numbers:
-
-=================== ============================= ===============
-:class:`half` ``'e'``
-:class:`single` compatible: C float ``'f'``
-:class:`double` compatible: C double
-:class:`float_` compatible: Python float ``'d'``
-:class:`longfloat` compatible: C long float ``'g'``
-:class:`float16` 16 bits
-:class:`float32` 32 bits
-:class:`float64` 64 bits
-:class:`float96` 96 bits, platform?
-:class:`float128` 128 bits, platform?
-=================== ============================= ===============
-
-Complex floating-point numbers:
-
-=================== ============================= ===============
-:class:`csingle` ``'F'``
-:class:`complex_` compatible: Python complex ``'D'``
-:class:`clongfloat` ``'G'``
-:class:`complex64` two 32-bit floats
-:class:`complex128` two 64-bit floats
-:class:`complex192` two 96-bit floats,
- platform?
-:class:`complex256` two 128-bit floats,
- platform?
-=================== ============================= ===============
-
-Any Python object:
-
-=================== ============================= ===============
-:class:`object_` any Python object ``'O'``
-=================== ============================= ===============
+.. autoclass:: numpy.generic
+ :exclude-members:
+
+.. autoclass:: numpy.number
+ :exclude-members:
+
+Integer types
+~~~~~~~~~~~~~
+
+.. autoclass:: numpy.integer
+ :exclude-members:
+
+Signed integer types
+++++++++++++++++++++
+
+.. autoclass:: numpy.signedinteger
+ :exclude-members:
+
+.. autoclass:: numpy.byte
+ :exclude-members:
+
+.. autoclass:: numpy.short
+ :exclude-members:
+
+.. autoclass:: numpy.intc
+ :exclude-members:
+
+.. autoclass:: numpy.int_
+ :exclude-members:
+
+.. autoclass:: numpy.longlong
+ :exclude-members:
+
+Unsigned integer types
+++++++++++++++++++++++
+
+.. autoclass:: numpy.unsignedinteger
+ :exclude-members:
+
+.. autoclass:: numpy.ubyte
+ :exclude-members:
+
+.. autoclass:: numpy.ushort
+ :exclude-members:
+
+.. autoclass:: numpy.uintc
+ :exclude-members:
+
+.. autoclass:: numpy.uint
+ :exclude-members:
+
+.. autoclass:: numpy.ulonglong
+ :exclude-members:
+
+Inexact types
+~~~~~~~~~~~~~
+
+.. autoclass:: numpy.inexact
+ :exclude-members:
+
+Floating-point types
+++++++++++++++++++++
+
+.. autoclass:: numpy.floating
+ :exclude-members:
+
+.. autoclass:: numpy.half
+ :exclude-members:
+
+.. autoclass:: numpy.single
+ :exclude-members:
+
+.. autoclass:: numpy.double
+ :exclude-members:
+
+.. autoclass:: numpy.longdouble
+ :exclude-members:
+
+Complex floating-point types
+++++++++++++++++++++++++++++
+
+.. autoclass:: numpy.complexfloating
+ :exclude-members:
+
+.. autoclass:: numpy.csingle
+ :exclude-members:
+
+.. autoclass:: numpy.cdouble
+ :exclude-members:
+
+.. autoclass:: numpy.clongdouble
+ :exclude-members:
+
+Other types
+~~~~~~~~~~~
+
+.. autoclass:: numpy.bool_
+ :exclude-members:
+
+.. autoclass:: numpy.datetime64
+ :exclude-members:
+
+.. autoclass:: numpy.timedelta64
+ :exclude-members:
+
+.. autoclass:: numpy.object_
+ :exclude-members:
.. note::
@@ -195,11 +221,17 @@ size and the data they describe can be of different length in different
arrays. (In the character codes ``#`` is an integer denoting how many
elements the data type consists of.)
-=================== ============================== ========
-:class:`bytes_` compatible: Python bytes ``'S#'``
-:class:`unicode_` compatible: Python unicode/str ``'U#'``
-:class:`void` ``'V#'``
-=================== ============================== ========
+.. autoclass:: numpy.flexible
+ :exclude-members:
+
+.. autoclass:: numpy.bytes_
+ :exclude-members:
+
+.. autoclass:: numpy.str_
+ :exclude-members:
+
+.. autoclass:: numpy.void
+ :exclude-members:
.. warning::
@@ -214,12 +246,123 @@ elements the data type consists of.)
convention more consistent with other Python modules such as the
:mod:`struct` module.
+Sized aliases
+~~~~~~~~~~~~~
+
+Along with their (mostly)
+C-derived names, the integer, float, and complex data-types are also
+available using a bit-width convention so that an array of the right
+size can always be ensured. Two aliases (:class:`numpy.intp` and :class:`numpy.uintp`)
+pointing to the integer type that is sufficiently large to hold a C pointer
+are also provided.
+
+.. note that these are documented with ..attribute because that is what
+ autoclass does for aliases under the hood.
+
+.. autoclass:: numpy.bool8
+
+.. attribute:: int8
+ int16
+ int32
+ int64
+
+ Aliases for the signed integer types (one of `numpy.byte`, `numpy.short`,
+ `numpy.intc`, `numpy.int_` and `numpy.longlong`) with the specified number
+ of bits.
+
+ Compatible with the C99 ``int8_t``, ``int16_t``, ``int32_t``, and
+ ``int64_t``, respectively.
+
+.. attribute:: uint8
+ uint16
+ uint32
+ uint64
+
+ Alias for the unsigned integer types (one of `numpy.byte`, `numpy.short`,
+ `numpy.intc`, `numpy.int_` and `numpy.longlong`) with the specified number
+ of bits.
+
+ Compatible with the C99 ``uint8_t``, ``uint16_t``, ``uint32_t``, and
+ ``uint64_t``, respectively.
+
+.. attribute:: intp
+
+ Alias for the signed integer type (one of `numpy.byte`, `numpy.short`,
+ `numpy.intc`, `numpy.int_` and `np.longlong`) that is the same size as a
+ pointer.
+
+ Compatible with the C ``intptr_t``.
+
+ :Character code: ``'p'``
+
+.. attribute:: uintp
+
+ Alias for the unsigned integer type (one of `numpy.byte`, `numpy.short`,
+ `numpy.intc`, `numpy.int_` and `np.longlong`) that is the same size as a
+ pointer.
+
+ Compatible with the C ``uintptr_t``.
+
+ :Character code: ``'P'``
+
+.. autoclass:: numpy.float16
+
+.. autoclass:: numpy.float32
+
+.. autoclass:: numpy.float64
+
+.. attribute:: float96
+ float128
+
+ Alias for `numpy.longdouble`, named after its size in bits.
+ The existence of these aliases depends on the platform.
+
+.. autoclass:: numpy.complex64
+
+.. autoclass:: numpy.complex128
+
+.. attribute:: complex192
+ complex256
+
+ Alias for `numpy.clongdouble`, named after its size in bits.
+ The existance of these aliases depends on the platform.
+
+Other aliases
+~~~~~~~~~~~~~
+
+The first two of these are conveniences which resemble the names of the
+builtin types, in the same style as `bool_`, `int_`, `str_`, `bytes_`, and
+`object_`:
+
+.. autoclass:: numpy.float_
+
+.. autoclass:: numpy.complex_
+
+Some more use alternate naming conventions for extended-precision floats and
+complex numbers:
+
+.. autoclass:: numpy.longfloat
+
+.. autoclass:: numpy.singlecomplex
+
+.. autoclass:: numpy.cfloat
+
+.. autoclass:: numpy.longcomplex
+
+.. autoclass:: numpy.clongfloat
+
+The following aliases originate from Python 2, and it is recommended that they
+not be used in new code.
+
+.. autoclass:: numpy.string_
+
+.. autoclass:: numpy.unicode_
Attributes
==========
The array scalar objects have an :obj:`array priority
-<__array_priority__>` of :c:data:`NPY_SCALAR_PRIORITY`
+<class.__array_priority__>` of :c:data:`NPY_SCALAR_PRIORITY`
(-1,000,000.0). They also do not (yet) have a :attr:`ctypes <ndarray.ctypes>`
attribute. Otherwise, they share the same attributes as arrays:
@@ -273,7 +416,6 @@ The exceptions to the above rules are given below:
.. autosummary::
:toctree: generated/
- generic
generic.__array__
generic.__array_wrap__
generic.squeeze
diff --git a/doc/source/reference/c-api/array.rst b/doc/source/reference/c-api/array.rst
index 10c1704c2..3aa541b79 100644
--- a/doc/source/reference/c-api/array.rst
+++ b/doc/source/reference/c-api/array.rst
@@ -24,7 +24,7 @@ These macros access the :c:type:`PyArrayObject` structure members and are
defined in ``ndarraytypes.h``. The input argument, *arr*, can be any
:c:type:`PyObject *<PyObject>` that is directly interpretable as a
:c:type:`PyArrayObject *` (any instance of the :c:data:`PyArray_Type`
-and itssub-types).
+and its sub-types).
.. c:function:: int PyArray_NDIM(PyArrayObject *arr)
@@ -326,7 +326,7 @@ From scratch
Create a new array with the provided data-type descriptor, *descr*,
of the shape determined by *nd* and *dims*.
-.. c:function:: PyArray_FILLWBYTE(PyObject* obj, int val)
+.. c:function:: void PyArray_FILLWBYTE(PyObject* obj, int val)
Fill the array pointed to by *obj* ---which must be a (subclass
of) ndarray---with the contents of *val* (evaluated as a byte).
@@ -428,44 +428,44 @@ From other objects
have :c:data:`NPY_ARRAY_DEFAULT` as its flags member. The *context*
argument is unused.
- .. c:var:: NPY_ARRAY_C_CONTIGUOUS
+ .. c:macro:: NPY_ARRAY_C_CONTIGUOUS
Make sure the returned array is C-style contiguous
- .. c:var:: NPY_ARRAY_F_CONTIGUOUS
+ .. c:macro:: NPY_ARRAY_F_CONTIGUOUS
Make sure the returned array is Fortran-style contiguous.
- .. c:var:: NPY_ARRAY_ALIGNED
+ .. c:macro:: NPY_ARRAY_ALIGNED
Make sure the returned array is aligned on proper boundaries for its
data type. An aligned array has the data pointer and every strides
factor as a multiple of the alignment factor for the data-type-
descriptor.
- .. c:var:: NPY_ARRAY_WRITEABLE
+ .. c:macro:: NPY_ARRAY_WRITEABLE
Make sure the returned array can be written to.
- .. c:var:: NPY_ARRAY_ENSURECOPY
+ .. c:macro:: NPY_ARRAY_ENSURECOPY
Make sure a copy is made of *op*. If this flag is not
present, data is not copied if it can be avoided.
- .. c:var:: NPY_ARRAY_ENSUREARRAY
+ .. c:macro:: NPY_ARRAY_ENSUREARRAY
Make sure the result is a base-class ndarray. By
default, if *op* is an instance of a subclass of
ndarray, an instance of that same subclass is returned. If
this flag is set, an ndarray object will be returned instead.
- .. c:var:: NPY_ARRAY_FORCECAST
+ .. c:macro:: NPY_ARRAY_FORCECAST
Force a cast to the output type even if it cannot be done
safely. Without this flag, a data cast will occur only if it
can be done safely, otherwise an error is raised.
- .. c:var:: NPY_ARRAY_WRITEBACKIFCOPY
+ .. c:macro:: NPY_ARRAY_WRITEBACKIFCOPY
If *op* is already an array, but does not satisfy the
requirements, then a copy is made (which will satisfy the
@@ -478,67 +478,67 @@ From other objects
will be made writeable again. If *op* is not writeable to begin
with, or if it is not already an array, then an error is raised.
- .. c:var:: NPY_ARRAY_UPDATEIFCOPY
+ .. c:macro:: NPY_ARRAY_UPDATEIFCOPY
Deprecated. Use :c:data:`NPY_ARRAY_WRITEBACKIFCOPY`, which is similar.
This flag "automatically" copies the data back when the returned
array is deallocated, which is not supported in all python
implementations.
- .. c:var:: NPY_ARRAY_BEHAVED
+ .. c:macro:: NPY_ARRAY_BEHAVED
:c:data:`NPY_ARRAY_ALIGNED` \| :c:data:`NPY_ARRAY_WRITEABLE`
- .. c:var:: NPY_ARRAY_CARRAY
+ .. c:macro:: NPY_ARRAY_CARRAY
:c:data:`NPY_ARRAY_C_CONTIGUOUS` \| :c:data:`NPY_ARRAY_BEHAVED`
- .. c:var:: NPY_ARRAY_CARRAY_RO
+ .. c:macro:: NPY_ARRAY_CARRAY_RO
:c:data:`NPY_ARRAY_C_CONTIGUOUS` \| :c:data:`NPY_ARRAY_ALIGNED`
- .. c:var:: NPY_ARRAY_FARRAY
+ .. c:macro:: NPY_ARRAY_FARRAY
:c:data:`NPY_ARRAY_F_CONTIGUOUS` \| :c:data:`NPY_ARRAY_BEHAVED`
- .. c:var:: NPY_ARRAY_FARRAY_RO
+ .. c:macro:: NPY_ARRAY_FARRAY_RO
:c:data:`NPY_ARRAY_F_CONTIGUOUS` \| :c:data:`NPY_ARRAY_ALIGNED`
- .. c:var:: NPY_ARRAY_DEFAULT
+ .. c:macro:: NPY_ARRAY_DEFAULT
:c:data:`NPY_ARRAY_CARRAY`
- .. c:var:: NPY_ARRAY_IN_ARRAY
+ .. c:macro:: NPY_ARRAY_IN_ARRAY
:c:data:`NPY_ARRAY_C_CONTIGUOUS` \| :c:data:`NPY_ARRAY_ALIGNED`
- .. c:var:: NPY_ARRAY_IN_FARRAY
+ .. c:macro:: NPY_ARRAY_IN_FARRAY
:c:data:`NPY_ARRAY_F_CONTIGUOUS` \| :c:data:`NPY_ARRAY_ALIGNED`
- .. c:var:: NPY_OUT_ARRAY
+ .. c:macro:: NPY_OUT_ARRAY
:c:data:`NPY_ARRAY_C_CONTIGUOUS` \| :c:data:`NPY_ARRAY_WRITEABLE` \|
:c:data:`NPY_ARRAY_ALIGNED`
- .. c:var:: NPY_ARRAY_OUT_ARRAY
+ .. c:macro:: NPY_ARRAY_OUT_ARRAY
:c:data:`NPY_ARRAY_C_CONTIGUOUS` \| :c:data:`NPY_ARRAY_ALIGNED` \|
:c:data:`NPY_ARRAY_WRITEABLE`
- .. c:var:: NPY_ARRAY_OUT_FARRAY
+ .. c:macro:: NPY_ARRAY_OUT_FARRAY
:c:data:`NPY_ARRAY_F_CONTIGUOUS` \| :c:data:`NPY_ARRAY_WRITEABLE` \|
:c:data:`NPY_ARRAY_ALIGNED`
- .. c:var:: NPY_ARRAY_INOUT_ARRAY
+ .. c:macro:: NPY_ARRAY_INOUT_ARRAY
:c:data:`NPY_ARRAY_C_CONTIGUOUS` \| :c:data:`NPY_ARRAY_WRITEABLE` \|
:c:data:`NPY_ARRAY_ALIGNED` \| :c:data:`NPY_ARRAY_WRITEBACKIFCOPY` \|
:c:data:`NPY_ARRAY_UPDATEIFCOPY`
- .. c:var:: NPY_ARRAY_INOUT_FARRAY
+ .. c:macro:: NPY_ARRAY_INOUT_FARRAY
:c:data:`NPY_ARRAY_F_CONTIGUOUS` \| :c:data:`NPY_ARRAY_WRITEABLE` \|
:c:data:`NPY_ARRAY_ALIGNED` \| :c:data:`NPY_ARRAY_WRITEBACKIFCOPY` \|
@@ -574,7 +574,7 @@ From other objects
did not have the _ARRAY_ macro namespace in them. That form
of the constant names is deprecated in 1.7.
-.. c:var:: NPY_ARRAY_NOTSWAPPED
+.. c:macro:: NPY_ARRAY_NOTSWAPPED
Make sure the returned array has a data-type descriptor that is in
machine byte-order, over-riding any specification in the *dtype*
@@ -585,11 +585,11 @@ From other objects
not in machine byte- order), then a new data-type descriptor is
created and used with its byte-order field set to native.
-.. c:var:: NPY_ARRAY_BEHAVED_NS
+.. c:macro:: NPY_ARRAY_BEHAVED_NS
:c:data:`NPY_ARRAY_ALIGNED` \| :c:data:`NPY_ARRAY_WRITEABLE` \| :c:data:`NPY_ARRAY_NOTSWAPPED`
-.. c:var:: NPY_ARRAY_ELEMENTSTRIDES
+.. c:macro:: NPY_ARRAY_ELEMENTSTRIDES
Make sure the returned array has strides that are multiples of the
element size.
@@ -604,14 +604,14 @@ From other objects
.. c:function:: PyObject* PyArray_FromStructInterface(PyObject* op)
Returns an ndarray object from a Python object that exposes the
- :obj:`__array_struct__` attribute and follows the array interface
+ :obj:`~object.__array_struct__` attribute and follows the array interface
protocol. If the object does not contain this attribute then a
borrowed reference to :c:data:`Py_NotImplemented` is returned.
.. c:function:: PyObject* PyArray_FromInterface(PyObject* op)
Returns an ndarray object from a Python object that exposes the
- :obj:`__array_interface__` attribute following the array interface
+ :obj:`~object.__array_interface__` attribute following the array interface
protocol. If the object does not contain this attribute then a
borrowed reference to :c:data:`Py_NotImplemented` is returned.
@@ -790,17 +790,17 @@ Dealing with types
General check of Python Type
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-.. c:function:: PyArray_Check(PyObject *op)
+.. c:function:: int PyArray_Check(PyObject *op)
Evaluates true if *op* is a Python object whose type is a sub-type
of :c:data:`PyArray_Type`.
-.. c:function:: PyArray_CheckExact(PyObject *op)
+.. c:function:: int PyArray_CheckExact(PyObject *op)
Evaluates true if *op* is a Python object with type
:c:data:`PyArray_Type`.
-.. c:function:: PyArray_HasArrayInterface(PyObject *op, PyObject *out)
+.. c:function:: int PyArray_HasArrayInterface(PyObject *op, PyObject *out)
If ``op`` implements any part of the array interface, then ``out``
will contain a new reference to the newly created ndarray using
@@ -808,7 +808,8 @@ General check of Python Type
conversion occurs. Otherwise, out will contain a borrowed
reference to :c:data:`Py_NotImplemented` and no error condition is set.
-.. c:function:: PyArray_HasArrayInterfaceType(op, dtype, context, out)
+.. c:function:: int PyArray_HasArrayInterfaceType(\
+ PyObject *op, PyArray_Descr *dtype, PyObject *context, PyObject *out)
If ``op`` implements any part of the array interface, then ``out``
will contain a new reference to the newly created ndarray using
@@ -819,38 +820,38 @@ General check of Python Type
that looks for the :obj:`~numpy.class.__array__` attribute. `context` is
unused.
-.. c:function:: PyArray_IsZeroDim(op)
+.. c:function:: int PyArray_IsZeroDim(PyObject *op)
Evaluates true if *op* is an instance of (a subclass of)
:c:data:`PyArray_Type` and has 0 dimensions.
.. c:function:: PyArray_IsScalar(op, cls)
- Evaluates true if *op* is an instance of :c:data:`Py{cls}ArrType_Type`.
+ Evaluates true if *op* is an instance of ``Py{cls}ArrType_Type``.
-.. c:function:: PyArray_CheckScalar(op)
+.. c:function:: int PyArray_CheckScalar(PyObject *op)
Evaluates true if *op* is either an array scalar (an instance of a
sub-type of :c:data:`PyGenericArr_Type` ), or an instance of (a
sub-class of) :c:data:`PyArray_Type` whose dimensionality is 0.
-.. c:function:: PyArray_IsPythonNumber(op)
+.. c:function:: int PyArray_IsPythonNumber(PyObject *op)
Evaluates true if *op* is an instance of a builtin numeric type (int,
float, complex, long, bool)
-.. c:function:: PyArray_IsPythonScalar(op)
+.. c:function:: int PyArray_IsPythonScalar(PyObject *op)
Evaluates true if *op* is a builtin Python scalar object (int,
float, complex, bytes, str, long, bool).
-.. c:function:: PyArray_IsAnyScalar(op)
+.. c:function:: int PyArray_IsAnyScalar(PyObject *op)
Evaluates true if *op* is either a Python scalar object (see
:c:func:`PyArray_IsPythonScalar`) or an array scalar (an instance of a sub-
type of :c:data:`PyGenericArr_Type` ).
-.. c:function:: PyArray_CheckAnyScalar(op)
+.. c:function:: int PyArray_CheckAnyScalar(PyObject *op)
Evaluates true if *op* is a Python scalar object (see
:c:func:`PyArray_IsPythonScalar`), an array scalar (an instance of a
@@ -866,82 +867,82 @@ enumerated array data type. For the array type checking macros the
argument must be a :c:type:`PyObject *<PyObject>` that can be directly interpreted as a
:c:type:`PyArrayObject *`.
-.. c:function:: PyTypeNum_ISUNSIGNED(int num)
+.. c:function:: int PyTypeNum_ISUNSIGNED(int num)
-.. c:function:: PyDataType_ISUNSIGNED(PyArray_Descr *descr)
+.. c:function:: int PyDataType_ISUNSIGNED(PyArray_Descr *descr)
-.. c:function:: PyArray_ISUNSIGNED(PyArrayObject *obj)
+.. c:function:: int PyArray_ISUNSIGNED(PyArrayObject *obj)
Type represents an unsigned integer.
-.. c:function:: PyTypeNum_ISSIGNED(int num)
+.. c:function:: int PyTypeNum_ISSIGNED(int num)
-.. c:function:: PyDataType_ISSIGNED(PyArray_Descr *descr)
+.. c:function:: int PyDataType_ISSIGNED(PyArray_Descr *descr)
-.. c:function:: PyArray_ISSIGNED(PyArrayObject *obj)
+.. c:function:: int PyArray_ISSIGNED(PyArrayObject *obj)
Type represents a signed integer.
-.. c:function:: PyTypeNum_ISINTEGER(int num)
+.. c:function:: int PyTypeNum_ISINTEGER(int num)
-.. c:function:: PyDataType_ISINTEGER(PyArray_Descr* descr)
+.. c:function:: int PyDataType_ISINTEGER(PyArray_Descr* descr)
-.. c:function:: PyArray_ISINTEGER(PyArrayObject *obj)
+.. c:function:: int PyArray_ISINTEGER(PyArrayObject *obj)
Type represents any integer.
-.. c:function:: PyTypeNum_ISFLOAT(int num)
+.. c:function:: int PyTypeNum_ISFLOAT(int num)
-.. c:function:: PyDataType_ISFLOAT(PyArray_Descr* descr)
+.. c:function:: int PyDataType_ISFLOAT(PyArray_Descr* descr)
-.. c:function:: PyArray_ISFLOAT(PyArrayObject *obj)
+.. c:function:: int PyArray_ISFLOAT(PyArrayObject *obj)
Type represents any floating point number.
-.. c:function:: PyTypeNum_ISCOMPLEX(int num)
+.. c:function:: int PyTypeNum_ISCOMPLEX(int num)
-.. c:function:: PyDataType_ISCOMPLEX(PyArray_Descr* descr)
+.. c:function:: int PyDataType_ISCOMPLEX(PyArray_Descr* descr)
-.. c:function:: PyArray_ISCOMPLEX(PyArrayObject *obj)
+.. c:function:: int PyArray_ISCOMPLEX(PyArrayObject *obj)
Type represents any complex floating point number.
-.. c:function:: PyTypeNum_ISNUMBER(int num)
+.. c:function:: int PyTypeNum_ISNUMBER(int num)
-.. c:function:: PyDataType_ISNUMBER(PyArray_Descr* descr)
+.. c:function:: int PyDataType_ISNUMBER(PyArray_Descr* descr)
-.. c:function:: PyArray_ISNUMBER(PyArrayObject *obj)
+.. c:function:: int PyArray_ISNUMBER(PyArrayObject *obj)
Type represents any integer, floating point, or complex floating point
number.
-.. c:function:: PyTypeNum_ISSTRING(int num)
+.. c:function:: int PyTypeNum_ISSTRING(int num)
-.. c:function:: PyDataType_ISSTRING(PyArray_Descr* descr)
+.. c:function:: int PyDataType_ISSTRING(PyArray_Descr* descr)
-.. c:function:: PyArray_ISSTRING(PyArrayObject *obj)
+.. c:function:: int PyArray_ISSTRING(PyArrayObject *obj)
Type represents a string data type.
-.. c:function:: PyTypeNum_ISPYTHON(int num)
+.. c:function:: int PyTypeNum_ISPYTHON(int num)
-.. c:function:: PyDataType_ISPYTHON(PyArray_Descr* descr)
+.. c:function:: int PyDataType_ISPYTHON(PyArray_Descr* descr)
-.. c:function:: PyArray_ISPYTHON(PyArrayObject *obj)
+.. c:function:: int PyArray_ISPYTHON(PyArrayObject *obj)
Type represents an enumerated type corresponding to one of the
standard Python scalar (bool, int, float, or complex).
-.. c:function:: PyTypeNum_ISFLEXIBLE(int num)
+.. c:function:: int PyTypeNum_ISFLEXIBLE(int num)
-.. c:function:: PyDataType_ISFLEXIBLE(PyArray_Descr* descr)
+.. c:function:: int PyDataType_ISFLEXIBLE(PyArray_Descr* descr)
-.. c:function:: PyArray_ISFLEXIBLE(PyArrayObject *obj)
+.. c:function:: int PyArray_ISFLEXIBLE(PyArrayObject *obj)
Type represents one of the flexible array types ( :c:data:`NPY_STRING`,
:c:data:`NPY_UNICODE`, or :c:data:`NPY_VOID` ).
-.. c:function:: PyDataType_ISUNSIZED(PyArray_Descr* descr):
+.. c:function:: int PyDataType_ISUNSIZED(PyArray_Descr* descr)
Type has no size information attached, and can be resized. Should only be
called on flexible dtypes. Types that are attached to an array will always
@@ -951,55 +952,55 @@ argument must be a :c:type:`PyObject *<PyObject>` that can be directly interpret
For structured datatypes with no fields this function now returns False.
-.. c:function:: PyTypeNum_ISUSERDEF(int num)
+.. c:function:: int PyTypeNum_ISUSERDEF(int num)
-.. c:function:: PyDataType_ISUSERDEF(PyArray_Descr* descr)
+.. c:function:: int PyDataType_ISUSERDEF(PyArray_Descr* descr)
-.. c:function:: PyArray_ISUSERDEF(PyArrayObject *obj)
+.. c:function:: int PyArray_ISUSERDEF(PyArrayObject *obj)
Type represents a user-defined type.
-.. c:function:: PyTypeNum_ISEXTENDED(int num)
+.. c:function:: int PyTypeNum_ISEXTENDED(int num)
-.. c:function:: PyDataType_ISEXTENDED(PyArray_Descr* descr)
+.. c:function:: int PyDataType_ISEXTENDED(PyArray_Descr* descr)
-.. c:function:: PyArray_ISEXTENDED(PyArrayObject *obj)
+.. c:function:: int PyArray_ISEXTENDED(PyArrayObject *obj)
Type is either flexible or user-defined.
-.. c:function:: PyTypeNum_ISOBJECT(int num)
+.. c:function:: int PyTypeNum_ISOBJECT(int num)
-.. c:function:: PyDataType_ISOBJECT(PyArray_Descr* descr)
+.. c:function:: int PyDataType_ISOBJECT(PyArray_Descr* descr)
-.. c:function:: PyArray_ISOBJECT(PyArrayObject *obj)
+.. c:function:: int PyArray_ISOBJECT(PyArrayObject *obj)
Type represents object data type.
-.. c:function:: PyTypeNum_ISBOOL(int num)
+.. c:function:: int PyTypeNum_ISBOOL(int num)
-.. c:function:: PyDataType_ISBOOL(PyArray_Descr* descr)
+.. c:function:: int PyDataType_ISBOOL(PyArray_Descr* descr)
-.. c:function:: PyArray_ISBOOL(PyArrayObject *obj)
+.. c:function:: int PyArray_ISBOOL(PyArrayObject *obj)
Type represents Boolean data type.
-.. c:function:: PyDataType_HASFIELDS(PyArray_Descr* descr)
+.. c:function:: int PyDataType_HASFIELDS(PyArray_Descr* descr)
-.. c:function:: PyArray_HASFIELDS(PyArrayObject *obj)
+.. c:function:: int PyArray_HASFIELDS(PyArrayObject *obj)
Type has fields associated with it.
-.. c:function:: PyArray_ISNOTSWAPPED(m)
+.. c:function:: int PyArray_ISNOTSWAPPED(PyArrayObject *m)
Evaluates true if the data area of the ndarray *m* is in machine
byte-order according to the array's data-type descriptor.
-.. c:function:: PyArray_ISBYTESWAPPED(m)
+.. c:function:: int PyArray_ISBYTESWAPPED(PyArrayObject *m)
Evaluates true if the data area of the ndarray *m* is **not** in
machine byte-order according to the array's data-type descriptor.
-.. c:function:: Bool PyArray_EquivTypes( \
+.. c:function:: npy_bool PyArray_EquivTypes( \
PyArray_Descr* type1, PyArray_Descr* type2)
Return :c:data:`NPY_TRUE` if *type1* and *type2* actually represent
@@ -1008,18 +1009,18 @@ argument must be a :c:type:`PyObject *<PyObject>` that can be directly interpret
:c:data:`NPY_LONG` and :c:data:`NPY_INT` are equivalent. Otherwise
return :c:data:`NPY_FALSE`.
-.. c:function:: Bool PyArray_EquivArrTypes( \
+.. c:function:: npy_bool PyArray_EquivArrTypes( \
PyArrayObject* a1, PyArrayObject * a2)
Return :c:data:`NPY_TRUE` if *a1* and *a2* are arrays with equivalent
types for this platform.
-.. c:function:: Bool PyArray_EquivTypenums(int typenum1, int typenum2)
+.. c:function:: npy_bool PyArray_EquivTypenums(int typenum1, int typenum2)
Special case of :c:func:`PyArray_EquivTypes` (...) that does not accept
flexible data types but may be easier to call.
-.. c:function:: int PyArray_EquivByteorders({byteorder} b1, {byteorder} b2)
+.. c:function:: int PyArray_EquivByteorders(int b1, int b2)
True if byteorder characters ( :c:data:`NPY_LITTLE`,
:c:data:`NPY_BIG`, :c:data:`NPY_NATIVE`, :c:data:`NPY_IGNORE` ) are
@@ -1142,8 +1143,8 @@ Converting data types
storing the max value of the input types converted to a string or unicode.
.. c:function:: PyArray_Descr* PyArray_ResultType( \
- npy_intp narrs, PyArrayObject**arrs, npy_intp ndtypes, \
- PyArray_Descr**dtypes)
+ npy_intp narrs, PyArrayObject **arrs, npy_intp ndtypes, \
+ PyArray_Descr **dtypes)
.. versionadded:: 1.6
@@ -1334,7 +1335,7 @@ Special functions for NPY_OBJECT
locations in the structure with object data-types. No checking is
performed but *arr* must be of data-type :c:type:`NPY_OBJECT` and be
single-segment and uninitialized (no previous objects in
- position). Use :c:func:`PyArray_DECREF` (*arr*) if you need to
+ position). Use :c:func:`PyArray_XDECREF` (*arr*) if you need to
decrement all the items in the object array prior to calling this
function.
@@ -1343,7 +1344,7 @@ Special functions for NPY_OBJECT
Precondition: ``arr`` is a copy of ``base`` (though possibly with different
strides, ordering, etc.) Set the UPDATEIFCOPY flag and ``arr->base`` so
that when ``arr`` is destructed, it will copy any changes back to ``base``.
- DEPRECATED, use :c:func:`PyArray_SetWritebackIfCopyBase``.
+ DEPRECATED, use :c:func:`PyArray_SetWritebackIfCopyBase`.
Returns 0 for success, -1 for failure.
@@ -1353,7 +1354,7 @@ Special functions for NPY_OBJECT
strides, ordering, etc.) Sets the :c:data:`NPY_ARRAY_WRITEBACKIFCOPY` flag
and ``arr->base``, and set ``base`` to READONLY. Call
:c:func:`PyArray_ResolveWritebackIfCopy` before calling
- `Py_DECREF`` in order copy any changes back to ``base`` and
+ `Py_DECREF` in order copy any changes back to ``base`` and
reset the READONLY flag.
Returns 0 for success, -1 for failure.
@@ -1397,12 +1398,12 @@ In versions 1.6 and earlier of NumPy, the following flags
did not have the _ARRAY_ macro namespace in them. That form
of the constant names is deprecated in 1.7.
-.. c:var:: NPY_ARRAY_C_CONTIGUOUS
+.. c:macro:: NPY_ARRAY_C_CONTIGUOUS
The data area is in C-style contiguous order (last index varies the
fastest).
-.. c:var:: NPY_ARRAY_F_CONTIGUOUS
+.. c:macro:: NPY_ARRAY_F_CONTIGUOUS
The data area is in Fortran-style contiguous order (first index varies
the fastest).
@@ -1423,22 +1424,22 @@ of the constant names is deprecated in 1.7.
.. seealso:: :ref:`Internal memory layout of an ndarray <arrays.ndarray>`
-.. c:var:: NPY_ARRAY_OWNDATA
+.. c:macro:: NPY_ARRAY_OWNDATA
The data area is owned by this array.
-.. c:var:: NPY_ARRAY_ALIGNED
+.. c:macro:: NPY_ARRAY_ALIGNED
The data area and all array elements are aligned appropriately.
-.. c:var:: NPY_ARRAY_WRITEABLE
+.. c:macro:: NPY_ARRAY_WRITEABLE
The data area can be written to.
Notice that the above 3 flags are defined so that a new, well-
behaved array has these flags defined as true.
-.. c:var:: NPY_ARRAY_WRITEBACKIFCOPY
+.. c:macro:: NPY_ARRAY_WRITEBACKIFCOPY
The data area represents a (well-behaved) copy whose information
should be transferred back to the original when
@@ -1457,7 +1458,7 @@ of the constant names is deprecated in 1.7.
would have returned an error because :c:data:`NPY_ARRAY_WRITEBACKIFCOPY`
would not have been possible.
-.. c:var:: NPY_ARRAY_UPDATEIFCOPY
+.. c:macro:: NPY_ARRAY_UPDATEIFCOPY
A deprecated version of :c:data:`NPY_ARRAY_WRITEBACKIFCOPY` which
depends upon ``dealloc`` to trigger the writeback. For backwards
@@ -1474,31 +1475,31 @@ for ``flags`` which can be any of :c:data:`NPY_ARRAY_C_CONTIGUOUS`,
Combinations of array flags
^^^^^^^^^^^^^^^^^^^^^^^^^^^
-.. c:var:: NPY_ARRAY_BEHAVED
+.. c:macro:: NPY_ARRAY_BEHAVED
:c:data:`NPY_ARRAY_ALIGNED` \| :c:data:`NPY_ARRAY_WRITEABLE`
-.. c:var:: NPY_ARRAY_CARRAY
+.. c:macro:: NPY_ARRAY_CARRAY
:c:data:`NPY_ARRAY_C_CONTIGUOUS` \| :c:data:`NPY_ARRAY_BEHAVED`
-.. c:var:: NPY_ARRAY_CARRAY_RO
+.. c:macro:: NPY_ARRAY_CARRAY_RO
:c:data:`NPY_ARRAY_C_CONTIGUOUS` \| :c:data:`NPY_ARRAY_ALIGNED`
-.. c:var:: NPY_ARRAY_FARRAY
+.. c:macro:: NPY_ARRAY_FARRAY
:c:data:`NPY_ARRAY_F_CONTIGUOUS` \| :c:data:`NPY_ARRAY_BEHAVED`
-.. c:var:: NPY_ARRAY_FARRAY_RO
+.. c:macro:: NPY_ARRAY_FARRAY_RO
:c:data:`NPY_ARRAY_F_CONTIGUOUS` \| :c:data:`NPY_ARRAY_ALIGNED`
-.. c:var:: NPY_ARRAY_DEFAULT
+.. c:macro:: NPY_ARRAY_DEFAULT
:c:data:`NPY_ARRAY_CARRAY`
-.. c:var:: NPY_ARRAY_UPDATE_ALL
+.. c:macro:: NPY_ARRAY_UPDATE_ALL
:c:data:`NPY_ARRAY_C_CONTIGUOUS` \| :c:data:`NPY_ARRAY_F_CONTIGUOUS` \| :c:data:`NPY_ARRAY_ALIGNED`
@@ -1509,28 +1510,19 @@ Flag-like constants
These constants are used in :c:func:`PyArray_FromAny` (and its macro forms) to
specify desired properties of the new array.
-.. c:var:: NPY_ARRAY_FORCECAST
+.. c:macro:: NPY_ARRAY_FORCECAST
Cast to the desired type, even if it can't be done without losing
information.
-.. c:var:: NPY_ARRAY_ENSURECOPY
+.. c:macro:: NPY_ARRAY_ENSURECOPY
Make sure the resulting array is a copy of the original.
-.. c:var:: NPY_ARRAY_ENSUREARRAY
+.. c:macro:: NPY_ARRAY_ENSUREARRAY
Make sure the resulting object is an actual ndarray, and not a sub-class.
-.. c:var:: NPY_ARRAY_NOTSWAPPED
-
- Only used in :c:func:`PyArray_CheckFromAny` to over-ride the byteorder
- of the data-type object passed in.
-
-.. c:var:: NPY_ARRAY_BEHAVED_NS
-
- :c:data:`NPY_ARRAY_ALIGNED` \| :c:data:`NPY_ARRAY_WRITEABLE` \| :c:data:`NPY_ARRAY_NOTSWAPPED`
-
Flag checking
^^^^^^^^^^^^^
@@ -1538,7 +1530,7 @@ Flag checking
For all of these macros *arr* must be an instance of a (subclass of)
:c:data:`PyArray_Type`.
-.. c:function:: PyArray_CHKFLAGS(PyObject *arr, flags)
+.. c:function:: int PyArray_CHKFLAGS(PyObject *arr, int flags)
The first parameter, arr, must be an ndarray or subclass. The
parameter, *flags*, should be an integer consisting of bitwise
@@ -1548,60 +1540,60 @@ For all of these macros *arr* must be an instance of a (subclass of)
:c:data:`NPY_ARRAY_WRITEABLE`, :c:data:`NPY_ARRAY_WRITEBACKIFCOPY`,
:c:data:`NPY_ARRAY_UPDATEIFCOPY`.
-.. c:function:: PyArray_IS_C_CONTIGUOUS(PyObject *arr)
+.. c:function:: int PyArray_IS_C_CONTIGUOUS(PyObject *arr)
Evaluates true if *arr* is C-style contiguous.
-.. c:function:: PyArray_IS_F_CONTIGUOUS(PyObject *arr)
+.. c:function:: int PyArray_IS_F_CONTIGUOUS(PyObject *arr)
Evaluates true if *arr* is Fortran-style contiguous.
-.. c:function:: PyArray_ISFORTRAN(PyObject *arr)
+.. c:function:: int PyArray_ISFORTRAN(PyObject *arr)
Evaluates true if *arr* is Fortran-style contiguous and *not*
C-style contiguous. :c:func:`PyArray_IS_F_CONTIGUOUS`
is the correct way to test for Fortran-style contiguity.
-.. c:function:: PyArray_ISWRITEABLE(PyObject *arr)
+.. c:function:: int PyArray_ISWRITEABLE(PyObject *arr)
Evaluates true if the data area of *arr* can be written to
-.. c:function:: PyArray_ISALIGNED(PyObject *arr)
+.. c:function:: int PyArray_ISALIGNED(PyObject *arr)
Evaluates true if the data area of *arr* is properly aligned on
the machine.
-.. c:function:: PyArray_ISBEHAVED(PyObject *arr)
+.. c:function:: int PyArray_ISBEHAVED(PyObject *arr)
Evaluates true if the data area of *arr* is aligned and writeable
and in machine byte-order according to its descriptor.
-.. c:function:: PyArray_ISBEHAVED_RO(PyObject *arr)
+.. c:function:: int PyArray_ISBEHAVED_RO(PyObject *arr)
Evaluates true if the data area of *arr* is aligned and in machine
byte-order.
-.. c:function:: PyArray_ISCARRAY(PyObject *arr)
+.. c:function:: int PyArray_ISCARRAY(PyObject *arr)
Evaluates true if the data area of *arr* is C-style contiguous,
and :c:func:`PyArray_ISBEHAVED` (*arr*) is true.
-.. c:function:: PyArray_ISFARRAY(PyObject *arr)
+.. c:function:: int PyArray_ISFARRAY(PyObject *arr)
Evaluates true if the data area of *arr* is Fortran-style
contiguous and :c:func:`PyArray_ISBEHAVED` (*arr*) is true.
-.. c:function:: PyArray_ISCARRAY_RO(PyObject *arr)
+.. c:function:: int PyArray_ISCARRAY_RO(PyObject *arr)
Evaluates true if the data area of *arr* is C-style contiguous,
aligned, and in machine byte-order.
-.. c:function:: PyArray_ISFARRAY_RO(PyObject *arr)
+.. c:function:: int PyArray_ISFARRAY_RO(PyObject *arr)
Evaluates true if the data area of *arr* is Fortran-style
contiguous, aligned, and in machine byte-order **.**
-.. c:function:: PyArray_ISONESEGMENT(PyObject *arr)
+.. c:function:: int PyArray_ISONESEGMENT(PyObject *arr)
Evaluates true if the data area of *arr* consists of a single
(C-style or Fortran-style) contiguous segment.
@@ -1659,7 +1651,7 @@ Conversion
destination must be an integer multiple of the number of elements
in *val*.
-.. c:function:: PyObject* PyArray_Byteswap(PyArrayObject* self, Bool inplace)
+.. c:function:: PyObject* PyArray_Byteswap(PyArrayObject* self, npy_bool inplace)
Equivalent to :meth:`ndarray.byteswap<numpy.ndarray.byteswap>` (*self*, *inplace*). Return an array
whose data area is byteswapped. If *inplace* is non-zero, then do
@@ -1876,16 +1868,16 @@ Item selection and manipulation
created. The *clipmode* argument determines behavior for when
entries in *self* are not between 0 and len(*op*).
- .. c:var:: NPY_RAISE
+ .. c:macro:: NPY_RAISE
raise a ValueError;
- .. c:var:: NPY_WRAP
+ .. c:macro:: NPY_WRAP
wrap values < 0 by adding len(*op*) and values >=len(*op*)
by subtracting len(*op*) until they are in range;
- .. c:var:: NPY_CLIP
+ .. c:macro:: NPY_CLIP
all values are clipped to the region [0, len(*op*) ).
@@ -2263,7 +2255,7 @@ Array Functions
See the :func:`~numpy.einsum` function for more details.
-.. c:function:: PyObject* PyArray_CopyAndTranspose(PyObject \* op)
+.. c:function:: PyObject* PyArray_CopyAndTranspose(PyObject * op)
A specialized copy and transpose function that works only for 2-d
arrays. The returned array is a transposed copy of *op*.
@@ -2318,7 +2310,7 @@ Array Functions
Other functions
^^^^^^^^^^^^^^^
-.. c:function:: Bool PyArray_CheckStrides( \
+.. c:function:: npy_bool PyArray_CheckStrides( \
int elsize, int nd, npy_intp numbytes, npy_intp const* dims, \
npy_intp const* newstrides)
@@ -2361,7 +2353,9 @@ it is possible to do this.
Defining an :c:type:`NpyAuxData` is similar to defining a class in C++,
but the object semantics have to be tracked manually since the API is in C.
Here's an example for a function which doubles up an element using
-an element copier function as a primitive.::
+an element copier function as a primitive.
+
+.. code-block:: c
typedef struct {
NpyAuxData base;
@@ -2425,12 +2419,12 @@ an element copier function as a primitive.::
functions should never set the Python exception on error, because
they may be called from a multi-threaded context.
-.. c:function:: NPY_AUXDATA_FREE(auxdata)
+.. c:function:: void NPY_AUXDATA_FREE(NpyAuxData *auxdata)
A macro which calls the auxdata's free function appropriately,
does nothing if auxdata is NULL.
-.. c:function:: NPY_AUXDATA_CLONE(auxdata)
+.. c:function:: NpyAuxData *NPY_AUXDATA_CLONE(NpyAuxData *auxdata)
A macro which calls the auxdata's clone function appropriately,
returning a deep copy of the auxiliary data.
@@ -2453,7 +2447,7 @@ this useful approach to looping over an array.
it easy to loop over an N-dimensional non-contiguous array in
C-style contiguous fashion.
-.. c:function:: PyObject* PyArray_IterAllButAxis(PyObject* arr, int \*axis)
+.. c:function:: PyObject* PyArray_IterAllButAxis(PyObject* arr, int* axis)
Return an array iterator that will iterate over all axes but the
one provided in *\*axis*. The returned iterator cannot be used
@@ -2497,7 +2491,7 @@ this useful approach to looping over an array.
*destination*, which must have size at least *iterator*
->nd_m1+1.
-.. c:function:: PyArray_ITER_GOTO1D(PyObject* iterator, npy_intp index)
+.. c:function:: void PyArray_ITER_GOTO1D(PyObject* iterator, npy_intp index)
Set the *iterator* index and dataptr to the location in the array
indicated by the integer *index* which points to an element in the
@@ -2818,11 +2812,21 @@ Data-type descriptors
Create a new data-type object with the byteorder set according to
*newendian*. All referenced data-type objects (in subdescr and
fields members of the data-type object) are also changed
- (recursively). If a byteorder of :c:data:`NPY_IGNORE` is encountered it
+ (recursively).
+
+ The value of *newendian* is one of these macros:
+
+ .. c:macro:: NPY_IGNORE
+ NPY_SWAP
+ NPY_NATIVE
+ NPY_LITTLE
+ NPY_BIG
+
+ If a byteorder of :c:data:`NPY_IGNORE` is encountered it
is left alone. If newendian is :c:data:`NPY_SWAP`, then all byte-orders
are swapped. Other valid newendian values are :c:data:`NPY_NATIVE`,
- :c:data:`NPY_LITTLE`, and :c:data:`NPY_BIG` which all cause the returned
- data-typed descriptor (and all it's
+ :c:data:`NPY_LITTLE`, and :c:data:`NPY_BIG` which all cause
+ the returned data-typed descriptor (and all it's
referenced data-type descriptors) to have the corresponding byte-
order.
@@ -2956,11 +2960,11 @@ to.
already a buffer object pointing to another object). If you need
to hold on to the memory be sure to INCREF the base member. The
chunk of memory is pointed to by *buf* ->ptr member and has length
- *buf* ->len. The flags member of *buf* is :c:data:`NPY_BEHAVED_RO` with
- the :c:data:`NPY_ARRAY_WRITEABLE` flag set if *obj* has a writeable buffer
- interface.
+ *buf* ->len. The flags member of *buf* is :c:data:`NPY_ARRAY_ALIGNED`
+ with the :c:data:`NPY_ARRAY_WRITEABLE` flag set if *obj* has
+ a writeable buffer interface.
-.. c:function:: int PyArray_AxisConverter(PyObject \* obj, int* axis)
+.. c:function:: int PyArray_AxisConverter(PyObject* obj, int* axis)
Convert a Python object, *obj*, representing an axis argument to
the proper value for passing to the functions that take an integer
@@ -2968,7 +2972,7 @@ to.
:c:data:`NPY_MAXDIMS` which is interpreted correctly by the C-API
functions that take axis arguments.
-.. c:function:: int PyArray_BoolConverter(PyObject* obj, Bool* value)
+.. c:function:: int PyArray_BoolConverter(PyObject* obj, npy_bool* value)
Convert any Python object, *obj*, to :c:data:`NPY_TRUE` or
:c:data:`NPY_FALSE`, and place the result in *value*.
@@ -3120,19 +3124,19 @@ the C-API is needed then some additional steps must be taken.
Internally, these #defines work as follows:
* If neither is defined, the C-API is declared to be
- :c:type:`static void**`, so it is only visible within the
+ ``static void**``, so it is only visible within the
compilation unit that #includes numpy/arrayobject.h.
* If :c:macro:`PY_ARRAY_UNIQUE_SYMBOL` is #defined, but
:c:macro:`NO_IMPORT_ARRAY` is not, the C-API is declared to
- be :c:type:`void**`, so that it will also be visible to other
+ be ``void**``, so that it will also be visible to other
compilation units.
* If :c:macro:`NO_IMPORT_ARRAY` is #defined, regardless of
whether :c:macro:`PY_ARRAY_UNIQUE_SYMBOL` is, the C-API is
- declared to be :c:type:`extern void**`, so it is expected to
+ declared to be ``extern void**``, so it is expected to
be defined in another compilation unit.
* Whenever :c:macro:`PY_ARRAY_UNIQUE_SYMBOL` is #defined, it
also changes the name of the variable holding the C-API, which
- defaults to :c:data:`PyArray_API`, to whatever the macro is
+ defaults to ``PyArray_API``, to whatever the macro is
#defined to.
Checking the API Version
@@ -3147,21 +3151,31 @@ calling the function). That's why several functions are provided to check for
numpy versions. The macros :c:data:`NPY_VERSION` and
:c:data:`NPY_FEATURE_VERSION` corresponds to the numpy version used to build the
extension, whereas the versions returned by the functions
-PyArray_GetNDArrayCVersion and PyArray_GetNDArrayCFeatureVersion corresponds to
-the runtime numpy's version.
+:c:func:`PyArray_GetNDArrayCVersion` and :c:func:`PyArray_GetNDArrayCFeatureVersion`
+corresponds to the runtime numpy's version.
The rules for ABI and API compatibilities can be summarized as follows:
- * Whenever :c:data:`NPY_VERSION` != PyArray_GetNDArrayCVersion, the
+ * Whenever :c:data:`NPY_VERSION` != ``PyArray_GetNDArrayCVersion()``, the
extension has to be recompiled (ABI incompatibility).
- * :c:data:`NPY_VERSION` == PyArray_GetNDArrayCVersion and
- :c:data:`NPY_FEATURE_VERSION` <= PyArray_GetNDArrayCFeatureVersion means
+ * :c:data:`NPY_VERSION` == ``PyArray_GetNDArrayCVersion()`` and
+ :c:data:`NPY_FEATURE_VERSION` <= ``PyArray_GetNDArrayCFeatureVersion()`` means
backward compatible changes.
ABI incompatibility is automatically detected in every numpy's version. API
incompatibility detection was added in numpy 1.4.0. If you want to supported
many different numpy versions with one extension binary, you have to build your
-extension with the lowest NPY_FEATURE_VERSION as possible.
+extension with the lowest :c:data:`NPY_FEATURE_VERSION` as possible.
+
+.. c:macro:: NPY_VERSION
+
+ The current version of the ndarray object (check to see if this
+ variable is defined to guarantee the ``numpy/arrayobject.h`` header is
+ being used).
+
+.. c:macro:: NPY_FEATURE_VERSION
+
+ The current version of the C-API.
.. c:function:: unsigned int PyArray_GetNDArrayCVersion(void)
@@ -3242,7 +3256,7 @@ Memory management
.. c:function:: char* PyDataMem_NEW(size_t nbytes)
-.. c:function:: PyDataMem_FREE(char* ptr)
+.. c:function:: void PyDataMem_FREE(char* ptr)
.. c:function:: char* PyDataMem_RENEW(void * ptr, size_t newbytes)
@@ -3251,7 +3265,7 @@ Memory management
.. c:function:: npy_intp* PyDimMem_NEW(int nd)
-.. c:function:: PyDimMem_FREE(char* ptr)
+.. c:function:: void PyDimMem_FREE(char* ptr)
.. c:function:: npy_intp* PyDimMem_RENEW(void* ptr, size_t newnd)
@@ -3259,7 +3273,7 @@ Memory management
.. c:function:: void* PyArray_malloc(size_t nbytes)
-.. c:function:: PyArray_free(void* ptr)
+.. c:function:: void PyArray_free(void* ptr)
.. c:function:: void* PyArray_realloc(npy_intp* ptr, size_t nbytes)
@@ -3268,6 +3282,8 @@ Memory management
:c:data:`NPY_USE_PYMEM` is 0, if :c:data:`NPY_USE_PYMEM` is 1, then
the Python memory allocator is used.
+ .. c:macro:: NPY_USE_PYMEM
+
.. c:function:: int PyArray_ResolveWritebackIfCopy(PyArrayObject* obj)
If ``obj.flags`` has :c:data:`NPY_ARRAY_WRITEBACKIFCOPY` or (deprecated)
@@ -3298,9 +3314,13 @@ be accomplished using two groups of macros. Typically, if one macro in
a group is used in a code block, all of them must be used in the same
code block. Currently, :c:data:`NPY_ALLOW_THREADS` is defined to the
python-defined :c:data:`WITH_THREADS` constant unless the environment
-variable :c:data:`NPY_NOSMP` is set in which case
+variable ``NPY_NOSMP`` is set in which case
:c:data:`NPY_ALLOW_THREADS` is defined to be 0.
+.. c:macro:: NPY_ALLOW_THREADS
+
+.. c:macro:: WITH_THREADS
+
Group 1
"""""""
@@ -3337,18 +3357,18 @@ Group 1
interpreter. This macro acquires the GIL and restores the
Python state from the saved variable.
- .. c:function:: NPY_BEGIN_THREADS_DESCR(PyArray_Descr *dtype)
+ .. c:function:: void NPY_BEGIN_THREADS_DESCR(PyArray_Descr *dtype)
Useful to release the GIL only if *dtype* does not contain
arbitrary Python objects which may need the Python interpreter
during execution of the loop.
- .. c:function:: NPY_END_THREADS_DESCR(PyArray_Descr *dtype)
+ .. c:function:: void NPY_END_THREADS_DESCR(PyArray_Descr *dtype)
Useful to regain the GIL in situations where it was released
using the BEGIN form of this macro.
- .. c:function:: NPY_BEGIN_THREADS_THRESHOLDED(int loop_size)
+ .. c:function:: void NPY_BEGIN_THREADS_THRESHOLDED(int loop_size)
Useful to release the GIL only if *loop_size* exceeds a
minimum threshold, currently set to 500. Should be matched
@@ -3388,15 +3408,15 @@ Group 2
Priority
^^^^^^^^
-.. c:var:: NPY_PRIORITY
+.. c:macro:: NPY_PRIORITY
Default priority for arrays.
-.. c:var:: NPY_SUBTYPE_PRIORITY
+.. c:macro:: NPY_SUBTYPE_PRIORITY
Default subtype priority.
-.. c:var:: NPY_SCALAR_PRIORITY
+.. c:macro:: NPY_SCALAR_PRIORITY
Default scalar priority (very small)
@@ -3411,15 +3431,15 @@ Priority
Default buffers
^^^^^^^^^^^^^^^
-.. c:var:: NPY_BUFSIZE
+.. c:macro:: NPY_BUFSIZE
Default size of the user-settable internal buffers.
-.. c:var:: NPY_MIN_BUFSIZE
+.. c:macro:: NPY_MIN_BUFSIZE
Smallest size of user-settable internal buffers.
-.. c:var:: NPY_MAX_BUFSIZE
+.. c:macro:: NPY_MAX_BUFSIZE
Largest size allowed for the user-settable buffers.
@@ -3427,38 +3447,32 @@ Default buffers
Other constants
^^^^^^^^^^^^^^^
-.. c:var:: NPY_NUM_FLOATTYPE
+.. c:macro:: NPY_NUM_FLOATTYPE
The number of floating-point types
-.. c:var:: NPY_MAXDIMS
+.. c:macro:: NPY_MAXDIMS
The maximum number of dimensions allowed in arrays.
-.. c:var:: NPY_MAXARGS
+.. c:macro:: NPY_MAXARGS
The maximum number of array arguments that can be used in functions.
-.. c:var:: NPY_VERSION
-
- The current version of the ndarray object (check to see if this
- variable is defined to guarantee the numpy/arrayobject.h header is
- being used).
-
-.. c:var:: NPY_FALSE
+.. c:macro:: NPY_FALSE
Defined as 0 for use with Bool.
-.. c:var:: NPY_TRUE
+.. c:macro:: NPY_TRUE
Defined as 1 for use with Bool.
-.. c:var:: NPY_FAIL
+.. c:macro:: NPY_FAIL
The return value of failed converter functions which are called using
the "O&" syntax in :c:func:`PyArg_ParseTuple`-like functions.
-.. c:var:: NPY_SUCCEED
+.. c:macro:: NPY_SUCCEED
The return value of successful converter functions which are called
using the "O&" syntax in :c:func:`PyArg_ParseTuple`-like functions.
@@ -3467,7 +3481,7 @@ Other constants
Miscellaneous Macros
^^^^^^^^^^^^^^^^^^^^
-.. c:function:: PyArray_SAMESHAPE(PyArrayObject *a1, PyArrayObject *a2)
+.. c:function:: int PyArray_SAMESHAPE(PyArrayObject *a1, PyArrayObject *a2)
Evaluates as True if arrays *a1* and *a2* have the same shape.
@@ -3502,11 +3516,11 @@ Miscellaneous Macros
of the ordering which is lexicographic: comparing the real parts
first and then the complex parts if the real parts are equal.
-.. c:function:: PyArray_REFCOUNT(PyObject* op)
+.. c:function:: npy_intp PyArray_REFCOUNT(PyObject* op)
Returns the reference count of any Python object.
-.. c:function:: PyArray_DiscardWritebackIfCopy(PyObject* obj)
+.. c:function:: void PyArray_DiscardWritebackIfCopy(PyObject* obj)
If ``obj.flags`` has :c:data:`NPY_ARRAY_WRITEBACKIFCOPY` or (deprecated)
:c:data:`NPY_ARRAY_UPDATEIFCOPY`, this function clears the flags, `DECREF` s
@@ -3517,7 +3531,7 @@ Miscellaneous Macros
error when you are finished with ``obj``, just before ``Py_DECREF(obj)``.
It may be called multiple times, or with ``NULL`` input.
-.. c:function:: PyArray_XDECREF_ERR(PyObject* obj)
+.. c:function:: void PyArray_XDECREF_ERR(PyObject* obj)
Deprecated in 1.14, use :c:func:`PyArray_DiscardWritebackIfCopy`
followed by ``Py_XDECREF``
@@ -3623,6 +3637,22 @@ Enumerated Types
Wraps an index to the valid range if it is out of bounds.
+.. c:type:: NPY_SEARCHSIDE
+
+ A variable type indicating whether the index returned should be that of
+ the first suitable location (if :c:data:`NPY_SEARCHLEFT`) or of the last
+ (if :c:data:`NPY_SEARCHRIGHT`).
+
+ .. c:var:: NPY_SEARCHLEFT
+
+ .. c:var:: NPY_SEARCHRIGHT
+
+.. c:type:: NPY_SELECTKIND
+
+ A variable type indicating the selection algorithm being used.
+
+ .. c:var:: NPY_INTROSELECT
+
.. c:type:: NPY_CASTING
.. versionadded:: 1.6
diff --git a/doc/source/reference/c-api/config.rst b/doc/source/reference/c-api/config.rst
index 05e6fe44d..87130699b 100644
--- a/doc/source/reference/c-api/config.rst
+++ b/doc/source/reference/c-api/config.rst
@@ -19,59 +19,62 @@ avoid namespace pollution.
Data type sizes
---------------
-The :c:data:`NPY_SIZEOF_{CTYPE}` constants are defined so that sizeof
+The ``NPY_SIZEOF_{CTYPE}`` constants are defined so that sizeof
information is available to the pre-processor.
-.. c:var:: NPY_SIZEOF_SHORT
+.. c:macro:: NPY_SIZEOF_SHORT
sizeof(short)
-.. c:var:: NPY_SIZEOF_INT
+.. c:macro:: NPY_SIZEOF_INT
sizeof(int)
-.. c:var:: NPY_SIZEOF_LONG
+.. c:macro:: NPY_SIZEOF_LONG
sizeof(long)
-.. c:var:: NPY_SIZEOF_LONGLONG
+.. c:macro:: NPY_SIZEOF_LONGLONG
sizeof(longlong) where longlong is defined appropriately on the
platform.
-.. c:var:: NPY_SIZEOF_PY_LONG_LONG
+.. c:macro:: NPY_SIZEOF_PY_LONG_LONG
-.. c:var:: NPY_SIZEOF_FLOAT
+.. c:macro:: NPY_SIZEOF_FLOAT
sizeof(float)
-.. c:var:: NPY_SIZEOF_DOUBLE
+.. c:macro:: NPY_SIZEOF_DOUBLE
sizeof(double)
-.. c:var:: NPY_SIZEOF_LONG_DOUBLE
+.. c:macro:: NPY_SIZEOF_LONG_DOUBLE
- sizeof(longdouble) (A macro defines **NPY_SIZEOF_LONGDOUBLE** as well.)
+.. c:macro:: NPY_SIZEOF_LONGDOUBLE
-.. c:var:: NPY_SIZEOF_PY_INTPTR_T
+ sizeof(longdouble)
- Size of a pointer on this platform (sizeof(void \*)) (A macro defines
- NPY_SIZEOF_INTP as well.)
+.. c:macro:: NPY_SIZEOF_PY_INTPTR_T
+
+.. c:macro:: NPY_SIZEOF_INTP
+
+ Size of a pointer on this platform (sizeof(void \*))
Platform information
--------------------
-.. c:var:: NPY_CPU_X86
-.. c:var:: NPY_CPU_AMD64
-.. c:var:: NPY_CPU_IA64
-.. c:var:: NPY_CPU_PPC
-.. c:var:: NPY_CPU_PPC64
-.. c:var:: NPY_CPU_SPARC
-.. c:var:: NPY_CPU_SPARC64
-.. c:var:: NPY_CPU_S390
-.. c:var:: NPY_CPU_PARISC
+.. c:macro:: NPY_CPU_X86
+.. c:macro:: NPY_CPU_AMD64
+.. c:macro:: NPY_CPU_IA64
+.. c:macro:: NPY_CPU_PPC
+.. c:macro:: NPY_CPU_PPC64
+.. c:macro:: NPY_CPU_SPARC
+.. c:macro:: NPY_CPU_SPARC64
+.. c:macro:: NPY_CPU_S390
+.. c:macro:: NPY_CPU_PARISC
.. versionadded:: 1.3.0
@@ -80,11 +83,11 @@ Platform information
Defined in ``numpy/npy_cpu.h``
-.. c:var:: NPY_LITTLE_ENDIAN
+.. c:macro:: NPY_LITTLE_ENDIAN
-.. c:var:: NPY_BIG_ENDIAN
+.. c:macro:: NPY_BIG_ENDIAN
-.. c:var:: NPY_BYTE_ORDER
+.. c:macro:: NPY_BYTE_ORDER
.. versionadded:: 1.3.0
@@ -94,7 +97,7 @@ Platform information
Defined in ``numpy/npy_endian.h``.
-.. c:function:: PyArray_GetEndianness()
+.. c:function:: int PyArray_GetEndianness()
.. versionadded:: 1.3.0
@@ -102,21 +105,27 @@ Platform information
One of :c:data:`NPY_CPU_BIG`, :c:data:`NPY_CPU_LITTLE`,
or :c:data:`NPY_CPU_UNKNOWN_ENDIAN`.
+ .. c:macro:: NPY_CPU_BIG
+
+ .. c:macro:: NPY_CPU_LITTLE
+
+ .. c:macro:: NPY_CPU_UNKNOWN_ENDIAN
+
Compiler directives
-------------------
-.. c:var:: NPY_LIKELY
-.. c:var:: NPY_UNLIKELY
-.. c:var:: NPY_UNUSED
+.. c:macro:: NPY_LIKELY
+.. c:macro:: NPY_UNLIKELY
+.. c:macro:: NPY_UNUSED
Interrupt Handling
------------------
-.. c:var:: NPY_INTERRUPT_H
-.. c:var:: NPY_SIGSETJMP
-.. c:var:: NPY_SIGLONGJMP
-.. c:var:: NPY_SIGJMP_BUF
-.. c:var:: NPY_SIGINT_ON
-.. c:var:: NPY_SIGINT_OFF
+.. c:macro:: NPY_INTERRUPT_H
+.. c:macro:: NPY_SIGSETJMP
+.. c:macro:: NPY_SIGLONGJMP
+.. c:macro:: NPY_SIGJMP_BUF
+.. c:macro:: NPY_SIGINT_ON
+.. c:macro:: NPY_SIGINT_OFF
diff --git a/doc/source/reference/c-api/coremath.rst b/doc/source/reference/c-api/coremath.rst
index 0c46475cf..338c584a1 100644
--- a/doc/source/reference/c-api/coremath.rst
+++ b/doc/source/reference/c-api/coremath.rst
@@ -24,23 +24,23 @@ in doubt.
Floating point classification
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-.. c:var:: NPY_NAN
+.. c:macro:: NPY_NAN
This macro is defined to a NaN (Not a Number), and is guaranteed to have
the signbit unset ('positive' NaN). The corresponding single and extension
precision macro are available with the suffix F and L.
-.. c:var:: NPY_INFINITY
+.. c:macro:: NPY_INFINITY
This macro is defined to a positive inf. The corresponding single and
extension precision macro are available with the suffix F and L.
-.. c:var:: NPY_PZERO
+.. c:macro:: NPY_PZERO
This macro is defined to positive zero. The corresponding single and
extension precision macro are available with the suffix F and L.
-.. c:var:: NPY_NZERO
+.. c:macro:: NPY_NZERO
This macro is defined to negative zero (that is with the sign bit set). The
corresponding single and extension precision macro are available with the
@@ -84,47 +84,47 @@ The following math constants are available in ``npy_math.h``. Single
and extended precision are also available by adding the ``f`` and
``l`` suffixes respectively.
-.. c:var:: NPY_E
+.. c:macro:: NPY_E
Base of natural logarithm (:math:`e`)
-.. c:var:: NPY_LOG2E
+.. c:macro:: NPY_LOG2E
Logarithm to base 2 of the Euler constant (:math:`\frac{\ln(e)}{\ln(2)}`)
-.. c:var:: NPY_LOG10E
+.. c:macro:: NPY_LOG10E
Logarithm to base 10 of the Euler constant (:math:`\frac{\ln(e)}{\ln(10)}`)
-.. c:var:: NPY_LOGE2
+.. c:macro:: NPY_LOGE2
Natural logarithm of 2 (:math:`\ln(2)`)
-.. c:var:: NPY_LOGE10
+.. c:macro:: NPY_LOGE10
Natural logarithm of 10 (:math:`\ln(10)`)
-.. c:var:: NPY_PI
+.. c:macro:: NPY_PI
Pi (:math:`\pi`)
-.. c:var:: NPY_PI_2
+.. c:macro:: NPY_PI_2
Pi divided by 2 (:math:`\frac{\pi}{2}`)
-.. c:var:: NPY_PI_4
+.. c:macro:: NPY_PI_4
Pi divided by 4 (:math:`\frac{\pi}{4}`)
-.. c:var:: NPY_1_PI
+.. c:macro:: NPY_1_PI
Reciprocal of pi (:math:`\frac{1}{\pi}`)
-.. c:var:: NPY_2_PI
+.. c:macro:: NPY_2_PI
Two times the reciprocal of pi (:math:`\frac{2}{\pi}`)
-.. c:var:: NPY_EULER
+.. c:macro:: NPY_EULER
The Euler constant
:math:`\lim_{n\rightarrow\infty}({\sum_{k=1}^n{\frac{1}{k}}-\ln n})`
@@ -308,35 +308,35 @@ __ https://en.wikipedia.org/wiki/Half-precision_floating-point_format
__ https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_half_float_pixel.txt
__ https://www.openexr.com/about.html
-.. c:var:: NPY_HALF_ZERO
+.. c:macro:: NPY_HALF_ZERO
This macro is defined to positive zero.
-.. c:var:: NPY_HALF_PZERO
+.. c:macro:: NPY_HALF_PZERO
This macro is defined to positive zero.
-.. c:var:: NPY_HALF_NZERO
+.. c:macro:: NPY_HALF_NZERO
This macro is defined to negative zero.
-.. c:var:: NPY_HALF_ONE
+.. c:macro:: NPY_HALF_ONE
This macro is defined to 1.0.
-.. c:var:: NPY_HALF_NEGONE
+.. c:macro:: NPY_HALF_NEGONE
This macro is defined to -1.0.
-.. c:var:: NPY_HALF_PINF
+.. c:macro:: NPY_HALF_PINF
This macro is defined to +inf.
-.. c:var:: NPY_HALF_NINF
+.. c:macro:: NPY_HALF_NINF
This macro is defined to -inf.
-.. c:var:: NPY_HALF_NAN
+.. c:macro:: NPY_HALF_NAN
This macro is defined to a NaN value, guaranteed to have its sign bit unset.
diff --git a/doc/source/reference/c-api/deprecations.rst b/doc/source/reference/c-api/deprecations.rst
index a382017a2..5b1abc6f2 100644
--- a/doc/source/reference/c-api/deprecations.rst
+++ b/doc/source/reference/c-api/deprecations.rst
@@ -48,7 +48,9 @@ warnings).
To use the NPY_NO_DEPRECATED_API mechanism, you need to #define it to
the target API version of NumPy before #including any NumPy headers.
-If you want to confirm that your code is clean against 1.7, use::
+If you want to confirm that your code is clean against 1.7, use:
+
+.. code-block:: c
#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
diff --git a/doc/source/reference/c-api/dtype.rst b/doc/source/reference/c-api/dtype.rst
index 72e908861..a1a53cdb6 100644
--- a/doc/source/reference/c-api/dtype.rst
+++ b/doc/source/reference/c-api/dtype.rst
@@ -30,7 +30,7 @@ Enumerated Types
There is a list of enumerated types defined providing the basic 24
data types plus some useful generic names. Whenever the code requires
a type number, one of these enumerated types is requested. The types
-are all called :c:data:`NPY_{NAME}`:
+are all called ``NPY_{NAME}``:
.. c:var:: NPY_BOOL
@@ -183,23 +183,23 @@ Some useful aliases of the above types are
Other useful related constants are
-.. c:var:: NPY_NTYPES
+.. c:macro:: NPY_NTYPES
The total number of built-in NumPy types. The enumeration covers
the range from 0 to NPY_NTYPES-1.
-.. c:var:: NPY_NOTYPE
+.. c:macro:: NPY_NOTYPE
A signal value guaranteed not to be a valid type enumeration number.
-.. c:var:: NPY_USERDEF
+.. c:macro:: NPY_USERDEF
The start of type numbers used for Custom Data types.
The various character codes indicating certain types are also part of
an enumerated list. References to type characters (should they be
needed at all) should always use these enumerations. The form of them
-is :c:data:`NPY_{NAME}LTR` where ``{NAME}`` can be
+is ``NPY_{NAME}LTR`` where ``{NAME}`` can be
**BOOL**, **BYTE**, **UBYTE**, **SHORT**, **USHORT**, **INT**,
**UINT**, **LONG**, **ULONG**, **LONGLONG**, **ULONGLONG**,
@@ -221,24 +221,17 @@ Defines
Max and min values for integers
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-.. c:var:: NPY_MAX_INT{bits}
-
-.. c:var:: NPY_MAX_UINT{bits}
-
-.. c:var:: NPY_MIN_INT{bits}
-
+``NPY_MAX_INT{bits}``, ``NPY_MAX_UINT{bits}``, ``NPY_MIN_INT{bits}``
These are defined for ``{bits}`` = 8, 16, 32, 64, 128, and 256 and provide
the maximum (minimum) value of the corresponding (unsigned) integer
type. Note: the actual integer type may not be available on all
platforms (i.e. 128-bit and 256-bit integers are rare).
-.. c:var:: NPY_MIN_{type}
-
+``NPY_MIN_{type}``
This is defined for ``{type}`` = **BYTE**, **SHORT**, **INT**,
**LONG**, **LONGLONG**, **INTP**
-.. c:var:: NPY_MAX_{type}
-
+``NPY_MAX_{type}``
This is defined for all defined for ``{type}`` = **BYTE**, **UBYTE**,
**SHORT**, **USHORT**, **INT**, **UINT**, **LONG**, **ULONG**,
**LONGLONG**, **ULONGLONG**, **INTP**, **UINTP**
@@ -247,8 +240,8 @@ Max and min values for integers
Number of bits in data types
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-All :c:data:`NPY_SIZEOF_{CTYPE}` constants have corresponding
-:c:data:`NPY_BITSOF_{CTYPE}` constants defined. The :c:data:`NPY_BITSOF_{CTYPE}`
+All ``NPY_SIZEOF_{CTYPE}`` constants have corresponding
+``NPY_BITSOF_{CTYPE}`` constants defined. The ``NPY_BITSOF_{CTYPE}``
constants provide the number of bits in the data type. Specifically,
the available ``{CTYPE}s`` are
@@ -263,7 +256,7 @@ All of the numeric data types (integer, floating point, and complex)
have constants that are defined to be a specific enumerated type
number. Exactly which enumerated type a bit-width type refers to is
platform dependent. In particular, the constants available are
-:c:data:`PyArray_{NAME}{BITS}` where ``{NAME}`` is **INT**, **UINT**,
+``PyArray_{NAME}{BITS}`` where ``{NAME}`` is **INT**, **UINT**,
**FLOAT**, **COMPLEX** and ``{BITS}`` can be 8, 16, 32, 64, 80, 96, 128,
160, 192, 256, and 512. Obviously not all bit-widths are available on
all platforms for all the kinds of numeric types. Commonly 8-, 16-,
@@ -397,8 +390,8 @@ There are also typedefs for signed integers, unsigned integers,
floating point, and complex floating point types of specific bit-
widths. The available type names are
- :c:type:`npy_int{bits}`, :c:type:`npy_uint{bits}`, :c:type:`npy_float{bits}`,
- and :c:type:`npy_complex{bits}`
+ ``npy_int{bits}``, ``npy_uint{bits}``, ``npy_float{bits}``,
+ and ``npy_complex{bits}``
where ``{bits}`` is the number of bits in the type and can be **8**,
**16**, **32**, **64**, 128, and 256 for integer types; 16, **32**
@@ -414,6 +407,12 @@ Printf Formatting
For help in printing, the following strings are defined as the correct
format specifier in printf and related commands.
- :c:data:`NPY_LONGLONG_FMT`, :c:data:`NPY_ULONGLONG_FMT`,
- :c:data:`NPY_INTP_FMT`, :c:data:`NPY_UINTP_FMT`,
- :c:data:`NPY_LONGDOUBLE_FMT`
+.. c:macro:: NPY_LONGLONG_FMT
+
+.. c:macro:: NPY_ULONGLONG_FMT
+
+.. c:macro:: NPY_INTP_FMT
+
+.. c:macro:: NPY_UINTP_FMT
+
+.. c:macro:: NPY_LONGDOUBLE_FMT
diff --git a/doc/source/reference/c-api/iterator.rst b/doc/source/reference/c-api/iterator.rst
index b77d029cc..ae96bb3fb 100644
--- a/doc/source/reference/c-api/iterator.rst
+++ b/doc/source/reference/c-api/iterator.rst
@@ -313,17 +313,17 @@ Construction and Destruction
Flags that may be passed in ``flags``, applying to the whole
iterator, are:
- .. c:var:: NPY_ITER_C_INDEX
+ .. c:macro:: NPY_ITER_C_INDEX
Causes the iterator to track a raveled flat index matching C
order. This option cannot be used with :c:data:`NPY_ITER_F_INDEX`.
- .. c:var:: NPY_ITER_F_INDEX
+ .. c:macro:: NPY_ITER_F_INDEX
Causes the iterator to track a raveled flat index matching Fortran
order. This option cannot be used with :c:data:`NPY_ITER_C_INDEX`.
- .. c:var:: NPY_ITER_MULTI_INDEX
+ .. c:macro:: NPY_ITER_MULTI_INDEX
Causes the iterator to track a multi-index.
This prevents the iterator from coalescing axes to
@@ -336,7 +336,7 @@ Construction and Destruction
However, it is possible to remove axes again and use the iterator
normally if the size is small enough after removal.
- .. c:var:: NPY_ITER_EXTERNAL_LOOP
+ .. c:macro:: NPY_ITER_EXTERNAL_LOOP
Causes the iterator to skip iteration of the innermost
loop, requiring the user of the iterator to handle it.
@@ -344,7 +344,7 @@ Construction and Destruction
This flag is incompatible with :c:data:`NPY_ITER_C_INDEX`,
:c:data:`NPY_ITER_F_INDEX`, and :c:data:`NPY_ITER_MULTI_INDEX`.
- .. c:var:: NPY_ITER_DONT_NEGATE_STRIDES
+ .. c:macro:: NPY_ITER_DONT_NEGATE_STRIDES
This only affects the iterator when :c:type:`NPY_KEEPORDER` is
specified for the order parameter. By default with
@@ -355,7 +355,7 @@ Construction and Destruction
but don't want an axis reversed. This is the behavior of
``numpy.ravel(a, order='K')``, for instance.
- .. c:var:: NPY_ITER_COMMON_DTYPE
+ .. c:macro:: NPY_ITER_COMMON_DTYPE
Causes the iterator to convert all the operands to a common
data type, calculated based on the ufunc type promotion rules.
@@ -364,7 +364,7 @@ Construction and Destruction
If the common data type is known ahead of time, don't use this
flag. Instead, set the requested dtype for all the operands.
- .. c:var:: NPY_ITER_REFS_OK
+ .. c:macro:: NPY_ITER_REFS_OK
Indicates that arrays with reference types (object
arrays or structured arrays containing an object type)
@@ -373,7 +373,7 @@ Construction and Destruction
:c:func:`NpyIter_IterationNeedsAPI(iter)` is true, in which case
it may not release the GIL during iteration.
- .. c:var:: NPY_ITER_ZEROSIZE_OK
+ .. c:macro:: NPY_ITER_ZEROSIZE_OK
Indicates that arrays with a size of zero should be permitted.
Since the typical iteration loop does not naturally work with
@@ -381,7 +381,7 @@ Construction and Destruction
than zero before entering the iteration loop.
Currently only the operands are checked, not a forced shape.
- .. c:var:: NPY_ITER_REDUCE_OK
+ .. c:macro:: NPY_ITER_REDUCE_OK
Permits writeable operands with a dimension with zero
stride and size greater than one. Note that such operands
@@ -400,7 +400,7 @@ Construction and Destruction
after initializing the allocated operand to prepare the
buffers.
- .. c:var:: NPY_ITER_RANGED
+ .. c:macro:: NPY_ITER_RANGED
Enables support for iteration of sub-ranges of the full
``iterindex`` range ``[0, NpyIter_IterSize(iter))``. Use
@@ -414,7 +414,7 @@ Construction and Destruction
would require special handling, effectively making it more
like the buffered version.
- .. c:var:: NPY_ITER_BUFFERED
+ .. c:macro:: NPY_ITER_BUFFERED
Causes the iterator to store buffering data, and use buffering
to satisfy data type, alignment, and byte-order requirements.
@@ -441,7 +441,7 @@ Construction and Destruction
the inner loops may become smaller depending
on the structure of the reduction.
- .. c:var:: NPY_ITER_GROWINNER
+ .. c:macro:: NPY_ITER_GROWINNER
When buffering is enabled, this allows the size of the inner
loop to grow when buffering isn't necessary. This option
@@ -449,7 +449,7 @@ Construction and Destruction
data, rather than anything with small cache-friendly arrays
of temporary values for each inner loop.
- .. c:var:: NPY_ITER_DELAY_BUFALLOC
+ .. c:macro:: NPY_ITER_DELAY_BUFALLOC
When buffering is enabled, this delays allocation of the
buffers until :c:func:`NpyIter_Reset` or another reset function is
@@ -465,7 +465,7 @@ Construction and Destruction
Then, call :c:func:`NpyIter_Reset` to allocate and fill the buffers
with their initial values.
- .. c:var:: NPY_ITER_COPY_IF_OVERLAP
+ .. c:macro:: NPY_ITER_COPY_IF_OVERLAP
If any write operand has overlap with any read operand, eliminate all
overlap by making temporary copies (enabling UPDATEIFCOPY for write
@@ -484,9 +484,9 @@ Construction and Destruction
Flags that may be passed in ``op_flags[i]``, where ``0 <= i < nop``:
- .. c:var:: NPY_ITER_READWRITE
- .. c:var:: NPY_ITER_READONLY
- .. c:var:: NPY_ITER_WRITEONLY
+ .. c:macro:: NPY_ITER_READWRITE
+ .. c:macro:: NPY_ITER_READONLY
+ .. c:macro:: NPY_ITER_WRITEONLY
Indicate how the user of the iterator will read or write
to ``op[i]``. Exactly one of these flags must be specified
@@ -495,13 +495,13 @@ Construction and Destruction
semantics. The data will be written back to the original array
when ``NpyIter_Deallocate`` is called.
- .. c:var:: NPY_ITER_COPY
+ .. c:macro:: NPY_ITER_COPY
Allow a copy of ``op[i]`` to be made if it does not
meet the data type or alignment requirements as specified
by the constructor flags and parameters.
- .. c:var:: NPY_ITER_UPDATEIFCOPY
+ .. c:macro:: NPY_ITER_UPDATEIFCOPY
Triggers :c:data:`NPY_ITER_COPY`, and when an array operand
is flagged for writing and is copied, causes the data
@@ -513,9 +513,9 @@ Construction and Destruction
to back to ``op[i]`` on calling ``NpyIter_Deallocate``, instead of
doing the unnecessary copy operation.
- .. c:var:: NPY_ITER_NBO
- .. c:var:: NPY_ITER_ALIGNED
- .. c:var:: NPY_ITER_CONTIG
+ .. c:macro:: NPY_ITER_NBO
+ .. c:macro:: NPY_ITER_ALIGNED
+ .. c:macro:: NPY_ITER_CONTIG
Causes the iterator to provide data for ``op[i]``
that is in native byte order, aligned according to
@@ -534,7 +534,7 @@ Construction and Destruction
the NBO flag overrides it and the requested data type is
converted to be in native byte order.
- .. c:var:: NPY_ITER_ALLOCATE
+ .. c:macro:: NPY_ITER_ALLOCATE
This is for output arrays, and requires that the flag
:c:data:`NPY_ITER_WRITEONLY` or :c:data:`NPY_ITER_READWRITE`
@@ -557,7 +557,7 @@ Construction and Destruction
getting the i-th object in the returned C array. The caller
must call Py_INCREF on it to claim a reference to the array.
- .. c:var:: NPY_ITER_NO_SUBTYPE
+ .. c:macro:: NPY_ITER_NO_SUBTYPE
For use with :c:data:`NPY_ITER_ALLOCATE`, this flag disables
allocating an array subtype for the output, forcing
@@ -566,12 +566,12 @@ Construction and Destruction
TODO: Maybe it would be better to introduce a function
``NpyIter_GetWrappedOutput`` and remove this flag?
- .. c:var:: NPY_ITER_NO_BROADCAST
+ .. c:macro:: NPY_ITER_NO_BROADCAST
Ensures that the input or output matches the iteration
dimensions exactly.
- .. c:var:: NPY_ITER_ARRAYMASK
+ .. c:macro:: NPY_ITER_ARRAYMASK
.. versionadded:: 1.7
@@ -595,7 +595,7 @@ Construction and Destruction
modified. This is useful when the mask should be a combination
of input masks.
- .. c:var:: NPY_ITER_WRITEMASKED
+ .. c:macro:: NPY_ITER_WRITEMASKED
.. versionadded:: 1.7
@@ -613,7 +613,7 @@ Construction and Destruction
returns true from the corresponding element in the ARRAYMASK
operand.
- .. c:var:: NPY_ITER_OVERLAP_ASSUME_ELEMENTWISE
+ .. c:macro:: NPY_ITER_OVERLAP_ASSUME_ELEMENTWISE
In memory overlap checks, assume that operands with
``NPY_ITER_OVERLAP_ASSUME_ELEMENTWISE`` enabled are accessed only
@@ -707,7 +707,7 @@ Construction and Destruction
:c:func:`NpyIter_Deallocate` must be called for each copy.
-.. c:function:: int NpyIter_RemoveAxis(NpyIter* iter, int axis)``
+.. c:function:: int NpyIter_RemoveAxis(NpyIter* iter, int axis)
Removes an axis from iteration. This requires that
:c:data:`NPY_ITER_MULTI_INDEX` was set for iterator creation, and does
@@ -1264,7 +1264,7 @@ functions provide that information.
NPY_MAX_INTP is placed in the stride.
Once the iterator is prepared for iteration (after a reset if
- :c:data:`NPY_DELAY_BUFALLOC` was used), call this to get the strides
+ :c:data:`NPY_ITER_DELAY_BUFALLOC` was used), call this to get the strides
which may be used to select a fast inner loop function. For example,
if the stride is 0, that means the inner loop can always load its
value into a variable once, then use the variable throughout the loop,
diff --git a/doc/source/reference/c-api/types-and-structures.rst b/doc/source/reference/c-api/types-and-structures.rst
index 60d8e420b..6a9c4a9cf 100644
--- a/doc/source/reference/c-api/types-and-structures.rst
+++ b/doc/source/reference/c-api/types-and-structures.rst
@@ -26,7 +26,7 @@ By constructing a new Python type you make available a new object for
Python. The ndarray object is an example of a new type defined in C.
New types are defined in C by two basic steps:
-1. creating a C-structure (usually named :c:type:`Py{Name}Object`) that is
+1. creating a C-structure (usually named ``Py{Name}Object``) that is
binary- compatible with the :c:type:`PyObject` structure itself but holds
the additional information needed for that particular object;
@@ -69,6 +69,7 @@ PyArray_Type and PyArrayObject
typeobject.
.. c:type:: PyArrayObject
+ NPY_AO
The :c:type:`PyArrayObject` C-structure contains all of the required
information for an array. All instances of an ndarray (and its
@@ -77,7 +78,7 @@ PyArray_Type and PyArrayObject
provided macros. If you need a shorter name, then you can make use
of :c:type:`NPY_AO` (deprecated) which is defined to be equivalent to
:c:type:`PyArrayObject`. Direct access to the struct fields are
- deprecated. Use the `PyArray_*(arr)` form instead.
+ deprecated. Use the ``PyArray_*(arr)`` form instead.
.. code-block:: c
@@ -93,84 +94,84 @@ PyArray_Type and PyArrayObject
PyObject *weakreflist;
} PyArrayObject;
-.. c:macro:: PyArrayObject.PyObject_HEAD
+ .. c:macro:: PyObject_HEAD
- This is needed by all Python objects. It consists of (at least)
- a reference count member ( ``ob_refcnt`` ) and a pointer to the
- typeobject ( ``ob_type`` ). (Other elements may also be present
- if Python was compiled with special options see
- Include/object.h in the Python source tree for more
- information). The ob_type member points to a Python type
- object.
+ This is needed by all Python objects. It consists of (at least)
+ a reference count member ( ``ob_refcnt`` ) and a pointer to the
+ typeobject ( ``ob_type`` ). (Other elements may also be present
+ if Python was compiled with special options see
+ Include/object.h in the Python source tree for more
+ information). The ob_type member points to a Python type
+ object.
-.. c:member:: char *PyArrayObject.data
+ .. c:member:: char *data
- Accessible via :c:data:`PyArray_DATA`, this data member is a
- pointer to the first element of the array. This pointer can
- (and normally should) be recast to the data type of the array.
+ Accessible via :c:data:`PyArray_DATA`, this data member is a
+ pointer to the first element of the array. This pointer can
+ (and normally should) be recast to the data type of the array.
-.. c:member:: int PyArrayObject.nd
+ .. c:member:: int nd
- An integer providing the number of dimensions for this
- array. When nd is 0, the array is sometimes called a rank-0
- array. Such arrays have undefined dimensions and strides and
- cannot be accessed. Macro :c:data:`PyArray_NDIM` defined in
- ``ndarraytypes.h`` points to this data member. :c:data:`NPY_MAXDIMS`
- is the largest number of dimensions for any array.
+ An integer providing the number of dimensions for this
+ array. When nd is 0, the array is sometimes called a rank-0
+ array. Such arrays have undefined dimensions and strides and
+ cannot be accessed. Macro :c:data:`PyArray_NDIM` defined in
+ ``ndarraytypes.h`` points to this data member. :c:data:`NPY_MAXDIMS`
+ is the largest number of dimensions for any array.
-.. c:member:: npy_intp PyArrayObject.dimensions
+ .. c:member:: npy_intp dimensions
- An array of integers providing the shape in each dimension as
- long as nd :math:`\geq` 1. The integer is always large enough
- to hold a pointer on the platform, so the dimension size is
- only limited by memory. :c:data:`PyArray_DIMS` is the macro
- associated with this data member.
+ An array of integers providing the shape in each dimension as
+ long as nd :math:`\geq` 1. The integer is always large enough
+ to hold a pointer on the platform, so the dimension size is
+ only limited by memory. :c:data:`PyArray_DIMS` is the macro
+ associated with this data member.
-.. c:member:: npy_intp *PyArrayObject.strides
+ .. c:member:: npy_intp *strides
- An array of integers providing for each dimension the number of
- bytes that must be skipped to get to the next element in that
- dimension. Associated with macro :c:data:`PyArray_STRIDES`.
+ An array of integers providing for each dimension the number of
+ bytes that must be skipped to get to the next element in that
+ dimension. Associated with macro :c:data:`PyArray_STRIDES`.
-.. c:member:: PyObject *PyArrayObject.base
+ .. c:member:: PyObject *base
- Pointed to by :c:data:`PyArray_BASE`, this member is used to hold a
- pointer to another Python object that is related to this array.
- There are two use cases:
+ Pointed to by :c:data:`PyArray_BASE`, this member is used to hold a
+ pointer to another Python object that is related to this array.
+ There are two use cases:
- - If this array does not own its own memory, then base points to the
- Python object that owns it (perhaps another array object)
- - If this array has the (deprecated) :c:data:`NPY_ARRAY_UPDATEIFCOPY` or
- :c:data:`NPY_ARRAY_WRITEBACKIFCOPY` flag set, then this array is a working
- copy of a "misbehaved" array.
+ - If this array does not own its own memory, then base points to the
+ Python object that owns it (perhaps another array object)
+ - If this array has the (deprecated) :c:data:`NPY_ARRAY_UPDATEIFCOPY` or
+ :c:data:`NPY_ARRAY_WRITEBACKIFCOPY` flag set, then this array is a working
+ copy of a "misbehaved" array.
- When ``PyArray_ResolveWritebackIfCopy`` is called, the array pointed to
- by base will be updated with the contents of this array.
+ When ``PyArray_ResolveWritebackIfCopy`` is called, the array pointed to
+ by base will be updated with the contents of this array.
-.. c:member:: PyArray_Descr *PyArrayObject.descr
+ .. c:member:: PyArray_Descr *descr
- A pointer to a data-type descriptor object (see below). The
- data-type descriptor object is an instance of a new built-in
- type which allows a generic description of memory. There is a
- descriptor structure for each data type supported. This
- descriptor structure contains useful information about the type
- as well as a pointer to a table of function pointers to
- implement specific functionality. As the name suggests, it is
- associated with the macro :c:data:`PyArray_DESCR`.
+ A pointer to a data-type descriptor object (see below). The
+ data-type descriptor object is an instance of a new built-in
+ type which allows a generic description of memory. There is a
+ descriptor structure for each data type supported. This
+ descriptor structure contains useful information about the type
+ as well as a pointer to a table of function pointers to
+ implement specific functionality. As the name suggests, it is
+ associated with the macro :c:data:`PyArray_DESCR`.
-.. c:member:: int PyArrayObject.flags
+ .. c:member:: int flags
- Pointed to by the macro :c:data:`PyArray_FLAGS`, this data member represents
- the flags indicating how the memory pointed to by data is to be
- interpreted. Possible flags are :c:data:`NPY_ARRAY_C_CONTIGUOUS`,
- :c:data:`NPY_ARRAY_F_CONTIGUOUS`, :c:data:`NPY_ARRAY_OWNDATA`,
- :c:data:`NPY_ARRAY_ALIGNED`, :c:data:`NPY_ARRAY_WRITEABLE`,
- :c:data:`NPY_ARRAY_WRITEBACKIFCOPY`, and :c:data:`NPY_ARRAY_UPDATEIFCOPY`.
+ Pointed to by the macro :c:data:`PyArray_FLAGS`, this data member represents
+ the flags indicating how the memory pointed to by data is to be
+ interpreted. Possible flags are :c:data:`NPY_ARRAY_C_CONTIGUOUS`,
+ :c:data:`NPY_ARRAY_F_CONTIGUOUS`, :c:data:`NPY_ARRAY_OWNDATA`,
+ :c:data:`NPY_ARRAY_ALIGNED`, :c:data:`NPY_ARRAY_WRITEABLE`,
+ :c:data:`NPY_ARRAY_WRITEBACKIFCOPY`, and :c:data:`NPY_ARRAY_UPDATEIFCOPY`.
-.. c:member:: PyObject *PyArrayObject.weakreflist
+ .. c:member:: PyObject *weakreflist
- This member allows array objects to have weak references (using the
- weakref module).
+ This member allows array objects to have weak references (using the
+ weakref module).
PyArrayDescr_Type and PyArray_Descr
@@ -226,197 +227,196 @@ PyArrayDescr_Type and PyArray_Descr
npy_hash_t hash;
} PyArray_Descr;
-.. c:member:: PyTypeObject *PyArray_Descr.typeobj
+ .. c:member:: PyTypeObject *typeobj
- Pointer to a typeobject that is the corresponding Python type for
- the elements of this array. For the builtin types, this points to
- the corresponding array scalar. For user-defined types, this
- should point to a user-defined typeobject. This typeobject can
- either inherit from array scalars or not. If it does not inherit
- from array scalars, then the :c:data:`NPY_USE_GETITEM` and
- :c:data:`NPY_USE_SETITEM` flags should be set in the ``flags`` member.
+ Pointer to a typeobject that is the corresponding Python type for
+ the elements of this array. For the builtin types, this points to
+ the corresponding array scalar. For user-defined types, this
+ should point to a user-defined typeobject. This typeobject can
+ either inherit from array scalars or not. If it does not inherit
+ from array scalars, then the :c:data:`NPY_USE_GETITEM` and
+ :c:data:`NPY_USE_SETITEM` flags should be set in the ``flags`` member.
-.. c:member:: char PyArray_Descr.kind
+ .. c:member:: char kind
- A character code indicating the kind of array (using the array
- interface typestring notation). A 'b' represents Boolean, a 'i'
- represents signed integer, a 'u' represents unsigned integer, 'f'
- represents floating point, 'c' represents complex floating point, 'S'
- represents 8-bit zero-terminated bytes, 'U' represents 32-bit/character
- unicode string, and 'V' represents arbitrary.
+ A character code indicating the kind of array (using the array
+ interface typestring notation). A 'b' represents Boolean, a 'i'
+ represents signed integer, a 'u' represents unsigned integer, 'f'
+ represents floating point, 'c' represents complex floating point, 'S'
+ represents 8-bit zero-terminated bytes, 'U' represents 32-bit/character
+ unicode string, and 'V' represents arbitrary.
-.. c:member:: char PyArray_Descr.type
+ .. c:member:: char type
- A traditional character code indicating the data type.
+ A traditional character code indicating the data type.
-.. c:member:: char PyArray_Descr.byteorder
+ .. c:member:: char byteorder
- A character indicating the byte-order: '>' (big-endian), '<' (little-
- endian), '=' (native), '\|' (irrelevant, ignore). All builtin data-
- types have byteorder '='.
+ A character indicating the byte-order: '>' (big-endian), '<' (little-
+ endian), '=' (native), '\|' (irrelevant, ignore). All builtin data-
+ types have byteorder '='.
-.. c:member:: char PyArray_Descr.flags
+ .. c:member:: char flags
- A data-type bit-flag that determines if the data-type exhibits object-
- array like behavior. Each bit in this member is a flag which are named
- as:
+ A data-type bit-flag that determines if the data-type exhibits object-
+ array like behavior. Each bit in this member is a flag which are named
+ as:
- .. c:var:: NPY_ITEM_REFCOUNT
+ .. c:macro:: NPY_ITEM_REFCOUNT
- Indicates that items of this data-type must be reference
- counted (using :c:func:`Py_INCREF` and :c:func:`Py_DECREF` ).
+ Indicates that items of this data-type must be reference
+ counted (using :c:func:`Py_INCREF` and :c:func:`Py_DECREF` ).
- .. c:var:: NPY_ITEM_HASOBJECT
+ .. c:macro:: NPY_ITEM_HASOBJECT
- Same as :c:data:`NPY_ITEM_REFCOUNT`.
+ Same as :c:data:`NPY_ITEM_REFCOUNT`.
- .. c:var:: NPY_LIST_PICKLE
+ .. c:macro:: NPY_LIST_PICKLE
- Indicates arrays of this data-type must be converted to a list
- before pickling.
+ Indicates arrays of this data-type must be converted to a list
+ before pickling.
- .. c:var:: NPY_ITEM_IS_POINTER
+ .. c:macro:: NPY_ITEM_IS_POINTER
- Indicates the item is a pointer to some other data-type
+ Indicates the item is a pointer to some other data-type
- .. c:var:: NPY_NEEDS_INIT
+ .. c:macro:: NPY_NEEDS_INIT
- Indicates memory for this data-type must be initialized (set
- to 0) on creation.
+ Indicates memory for this data-type must be initialized (set
+ to 0) on creation.
- .. c:var:: NPY_NEEDS_PYAPI
+ .. c:macro:: NPY_NEEDS_PYAPI
- Indicates this data-type requires the Python C-API during
- access (so don't give up the GIL if array access is going to
- be needed).
+ Indicates this data-type requires the Python C-API during
+ access (so don't give up the GIL if array access is going to
+ be needed).
- .. c:var:: NPY_USE_GETITEM
+ .. c:macro:: NPY_USE_GETITEM
- On array access use the ``f->getitem`` function pointer
- instead of the standard conversion to an array scalar. Must
- use if you don't define an array scalar to go along with
- the data-type.
+ On array access use the ``f->getitem`` function pointer
+ instead of the standard conversion to an array scalar. Must
+ use if you don't define an array scalar to go along with
+ the data-type.
- .. c:var:: NPY_USE_SETITEM
+ .. c:macro:: NPY_USE_SETITEM
- When creating a 0-d array from an array scalar use
- ``f->setitem`` instead of the standard copy from an array
- scalar. Must use if you don't define an array scalar to go
- along with the data-type.
+ When creating a 0-d array from an array scalar use
+ ``f->setitem`` instead of the standard copy from an array
+ scalar. Must use if you don't define an array scalar to go
+ along with the data-type.
- .. c:var:: NPY_FROM_FIELDS
+ .. c:macro:: NPY_FROM_FIELDS
- The bits that are inherited for the parent data-type if these
- bits are set in any field of the data-type. Currently (
- :c:data:`NPY_NEEDS_INIT` \| :c:data:`NPY_LIST_PICKLE` \|
- :c:data:`NPY_ITEM_REFCOUNT` \| :c:data:`NPY_NEEDS_PYAPI` ).
+ The bits that are inherited for the parent data-type if these
+ bits are set in any field of the data-type. Currently (
+ :c:data:`NPY_NEEDS_INIT` \| :c:data:`NPY_LIST_PICKLE` \|
+ :c:data:`NPY_ITEM_REFCOUNT` \| :c:data:`NPY_NEEDS_PYAPI` ).
- .. c:var:: NPY_OBJECT_DTYPE_FLAGS
+ .. c:macro:: NPY_OBJECT_DTYPE_FLAGS
- Bits set for the object data-type: ( :c:data:`NPY_LIST_PICKLE`
- \| :c:data:`NPY_USE_GETITEM` \| :c:data:`NPY_ITEM_IS_POINTER` \|
- :c:data:`NPY_REFCOUNT` \| :c:data:`NPY_NEEDS_INIT` \|
- :c:data:`NPY_NEEDS_PYAPI`).
+ Bits set for the object data-type: ( :c:data:`NPY_LIST_PICKLE`
+ \| :c:data:`NPY_USE_GETITEM` \| :c:data:`NPY_ITEM_IS_POINTER` \|
+ :c:data:`NPY_ITEM_REFCOUNT` \| :c:data:`NPY_NEEDS_INIT` \|
+ :c:data:`NPY_NEEDS_PYAPI`).
- .. c:function:: PyDataType_FLAGCHK(PyArray_Descr *dtype, int flags)
+ .. c:function:: int PyDataType_FLAGCHK(PyArray_Descr *dtype, int flags)
- Return true if all the given flags are set for the data-type
- object.
+ Return true if all the given flags are set for the data-type
+ object.
- .. c:function:: PyDataType_REFCHK(PyArray_Descr *dtype)
+ .. c:function:: int PyDataType_REFCHK(PyArray_Descr *dtype)
- Equivalent to :c:func:`PyDataType_FLAGCHK` (*dtype*,
- :c:data:`NPY_ITEM_REFCOUNT`).
+ Equivalent to :c:func:`PyDataType_FLAGCHK` (*dtype*,
+ :c:data:`NPY_ITEM_REFCOUNT`).
-.. c:member:: int PyArray_Descr.type_num
+ .. c:member:: int type_num
- A number that uniquely identifies the data type. For new data-types,
- this number is assigned when the data-type is registered.
+ A number that uniquely identifies the data type. For new data-types,
+ this number is assigned when the data-type is registered.
-.. c:member:: int PyArray_Descr.elsize
+ .. c:member:: int elsize
- For data types that are always the same size (such as long), this
- holds the size of the data type. For flexible data types where
- different arrays can have a different elementsize, this should be
- 0.
+ For data types that are always the same size (such as long), this
+ holds the size of the data type. For flexible data types where
+ different arrays can have a different elementsize, this should be
+ 0.
-.. c:member:: int PyArray_Descr.alignment
+ .. c:member:: int alignment
- A number providing alignment information for this data type.
- Specifically, it shows how far from the start of a 2-element
- structure (whose first element is a ``char`` ), the compiler
- places an item of this type: ``offsetof(struct {char c; type v;},
- v)``
+ A number providing alignment information for this data type.
+ Specifically, it shows how far from the start of a 2-element
+ structure (whose first element is a ``char`` ), the compiler
+ places an item of this type: ``offsetof(struct {char c; type v;},
+ v)``
-.. c:member:: PyArray_ArrayDescr *PyArray_Descr.subarray
+ .. c:member:: PyArray_ArrayDescr *subarray
- If this is non- ``NULL``, then this data-type descriptor is a
- C-style contiguous array of another data-type descriptor. In
- other-words, each element that this descriptor describes is
- actually an array of some other base descriptor. This is most
- useful as the data-type descriptor for a field in another
- data-type descriptor. The fields member should be ``NULL`` if this
- is non- ``NULL`` (the fields member of the base descriptor can be
- non- ``NULL`` however). The :c:type:`PyArray_ArrayDescr` structure is
- defined using
+ If this is non- ``NULL``, then this data-type descriptor is a
+ C-style contiguous array of another data-type descriptor. In
+ other-words, each element that this descriptor describes is
+ actually an array of some other base descriptor. This is most
+ useful as the data-type descriptor for a field in another
+ data-type descriptor. The fields member should be ``NULL`` if this
+ is non- ``NULL`` (the fields member of the base descriptor can be
+ non- ``NULL`` however).
- .. code-block:: c
-
- typedef struct {
- PyArray_Descr *base;
- PyObject *shape;
- } PyArray_ArrayDescr;
+ .. c:type:: PyArray_ArrayDescr
- The elements of this structure are:
+ .. code-block:: c
- .. c:member:: PyArray_Descr *PyArray_ArrayDescr.base
+ typedef struct {
+ PyArray_Descr *base;
+ PyObject *shape;
+ } PyArray_ArrayDescr;
- The data-type-descriptor object of the base-type.
+ .. c:member:: PyArray_Descr *base
- .. c:member:: PyObject *PyArray_ArrayDescr.shape
+ The data-type-descriptor object of the base-type.
- The shape (always C-style contiguous) of the sub-array as a Python
- tuple.
+ .. c:member:: PyObject *shape
+ The shape (always C-style contiguous) of the sub-array as a Python
+ tuple.
-.. c:member:: PyObject *PyArray_Descr.fields
+ .. c:member:: PyObject *fields
- If this is non-NULL, then this data-type-descriptor has fields
- described by a Python dictionary whose keys are names (and also
- titles if given) and whose values are tuples that describe the
- fields. Recall that a data-type-descriptor always describes a
- fixed-length set of bytes. A field is a named sub-region of that
- total, fixed-length collection. A field is described by a tuple
- composed of another data- type-descriptor and a byte
- offset. Optionally, the tuple may contain a title which is
- normally a Python string. These tuples are placed in this
- dictionary keyed by name (and also title if given).
+ If this is non-NULL, then this data-type-descriptor has fields
+ described by a Python dictionary whose keys are names (and also
+ titles if given) and whose values are tuples that describe the
+ fields. Recall that a data-type-descriptor always describes a
+ fixed-length set of bytes. A field is a named sub-region of that
+ total, fixed-length collection. A field is described by a tuple
+ composed of another data- type-descriptor and a byte
+ offset. Optionally, the tuple may contain a title which is
+ normally a Python string. These tuples are placed in this
+ dictionary keyed by name (and also title if given).
-.. c:member:: PyObject *PyArray_Descr.names
+ .. c:member:: PyObject *names
- An ordered tuple of field names. It is NULL if no field is
- defined.
+ An ordered tuple of field names. It is NULL if no field is
+ defined.
-.. c:member:: PyArray_ArrFuncs *PyArray_Descr.f
+ .. c:member:: PyArray_ArrFuncs *f
- A pointer to a structure containing functions that the type needs
- to implement internal features. These functions are not the same
- thing as the universal functions (ufuncs) described later. Their
- signatures can vary arbitrarily.
+ A pointer to a structure containing functions that the type needs
+ to implement internal features. These functions are not the same
+ thing as the universal functions (ufuncs) described later. Their
+ signatures can vary arbitrarily.
-.. c:member:: PyObject *PyArray_Descr.metadata
+ .. c:member:: PyObject *metadata
- Metadata about this dtype.
+ Metadata about this dtype.
-.. c:member:: NpyAuxData *PyArray_Descr.c_metadata
+ .. c:member:: NpyAuxData *c_metadata
- Metadata specific to the C implementation
- of the particular dtype. Added for NumPy 1.7.0.
+ Metadata specific to the C implementation
+ of the particular dtype. Added for NumPy 1.7.0.
-.. c:member:: Npy_hash_t *PyArray_Descr.hash
+ .. c:type:: npy_hash_t
+ .. c:member:: npy_hash_t *hash
- Currently unused. Reserved for future use in caching
- hash values.
+ Currently unused. Reserved for future use in caching
+ hash values.
.. c:type:: PyArray_ArrFuncs
@@ -568,7 +568,7 @@ PyArrayDescr_Type and PyArray_Descr
This function should be called without holding the Python GIL, and
has to grab it for error reporting.
- .. c:member:: Bool nonzero(void* data, void* arr)
+ .. c:member:: npy_bool nonzero(void* data, void* arr)
A pointer to a function that returns TRUE if the item of
``arr`` pointed to by ``data`` is nonzero. This function can
@@ -612,7 +612,8 @@ PyArrayDescr_Type and PyArray_Descr
Either ``NULL`` or a dictionary containing low-level casting
functions for user- defined data-types. Each function is
- wrapped in a :c:type:`PyCObject *` and keyed by the data-type number.
+ wrapped in a :c:type:`PyCapsule *<PyCapsule>` and keyed by
+ the data-type number.
.. c:member:: NPY_SCALARKIND scalarkind(PyArrayObject* arr)
@@ -791,35 +792,37 @@ PyUFunc_Type and PyUFuncObject
npy_uint32 *iter_flags;
/* new in API version 0x0000000D */
npy_intp *core_dim_sizes;
- npy_intp *core_dim_flags;
-
+ npy_uint32 *core_dim_flags;
+ PyObject *identity_value;
} PyUFuncObject;
- .. c:macro: PyUFuncObject.PyObject_HEAD
+ .. c:macro: PyObject_HEAD
required for all Python objects.
- .. c:member:: int PyUFuncObject.nin
+ .. c:member:: int nin
The number of input arguments.
- .. c:member:: int PyUFuncObject.nout
+ .. c:member:: int nout
The number of output arguments.
- .. c:member:: int PyUFuncObject.nargs
+ .. c:member:: int nargs
The total number of arguments (*nin* + *nout*). This must be
less than :c:data:`NPY_MAXARGS`.
- .. c:member:: int PyUFuncObject.identity
+ .. c:member:: int identity
Either :c:data:`PyUFunc_One`, :c:data:`PyUFunc_Zero`,
- :c:data:`PyUFunc_None` or :c:data:`PyUFunc_AllOnes` to indicate
+ :c:data:`PyUFunc_MinusOne`, :c:data:`PyUFunc_None`,
+ :c:data:`PyUFunc_ReorderableNone`, or
+ :c:data:`PyUFunc_IdentityValue` to indicate
the identity for this operation. It is only used for a
reduce-like call on an empty array.
- .. c:member:: void PyUFuncObject.functions( \
+ .. c:member:: void functions( \
char** args, npy_intp* dims, npy_intp* steps, void* extradata)
An array of function pointers --- one for each data type
@@ -837,7 +840,7 @@ PyUFunc_Type and PyUFuncObject
passed in as *extradata*. The size of this function pointer
array is ntypes.
- .. c:member:: void **PyUFuncObject.data
+ .. c:member:: void **data
Extra data to be passed to the 1-d vector loops or ``NULL`` if
no extra-data is needed. This C-array must be the same size (
@@ -846,22 +849,22 @@ PyUFunc_Type and PyUFuncObject
just 1-d vector loops that make use of this extra data to
receive a pointer to the actual function to call.
- .. c:member:: int PyUFuncObject.ntypes
+ .. c:member:: int ntypes
The number of supported data types for the ufunc. This number
specifies how many different 1-d loops (of the builtin data
types) are available.
- .. c:member:: int PyUFuncObject.reserved1
+ .. c:member:: int reserved1
Unused.
- .. c:member:: char *PyUFuncObject.name
+ .. c:member:: char *name
A string name for the ufunc. This is used dynamically to build
the __doc\__ attribute of ufuncs.
- .. c:member:: char *PyUFuncObject.types
+ .. c:member:: char *types
An array of :math:`nargs \times ntypes` 8-bit type_numbers
which contains the type signature for the function for each of
@@ -871,24 +874,24 @@ PyUFunc_Type and PyUFuncObject
vector loop. These type numbers do not have to be the same type
and mixed-type ufuncs are supported.
- .. c:member:: char *PyUFuncObject.doc
+ .. c:member:: char *doc
Documentation for the ufunc. Should not contain the function
signature as this is generated dynamically when __doc\__ is
retrieved.
- .. c:member:: void *PyUFuncObject.ptr
+ .. c:member:: void *ptr
Any dynamically allocated memory. Currently, this is used for
dynamic ufuncs created from a python function to store room for
the types, data, and name members.
- .. c:member:: PyObject *PyUFuncObject.obj
+ .. c:member:: PyObject *obj
For ufuncs dynamically created from python functions, this member
holds a reference to the underlying Python function.
- .. c:member:: PyObject *PyUFuncObject.userloops
+ .. c:member:: PyObject *userloops
A dictionary of user-defined 1-d vector loops (stored as CObject
ptrs) for user-defined types. A loop may be registered by the
@@ -896,74 +899,85 @@ PyUFunc_Type and PyUFuncObject
User defined type numbers are always larger than
:c:data:`NPY_USERDEF`.
- .. c:member:: int PyUFuncObject.core_enabled
+ .. c:member:: int core_enabled
0 for scalar ufuncs; 1 for generalized ufuncs
- .. c:member:: int PyUFuncObject.core_num_dim_ix
+ .. c:member:: int core_num_dim_ix
Number of distinct core dimension names in the signature
- .. c:member:: int *PyUFuncObject.core_num_dims
+ .. c:member:: int *core_num_dims
Number of core dimensions of each argument
- .. c:member:: int *PyUFuncObject.core_dim_ixs
+ .. c:member:: int *core_dim_ixs
Dimension indices in a flattened form; indices of argument ``k`` are
stored in ``core_dim_ixs[core_offsets[k] : core_offsets[k] +
core_numdims[k]]``
- .. c:member:: int *PyUFuncObject.core_offsets
+ .. c:member:: int *core_offsets
Position of 1st core dimension of each argument in ``core_dim_ixs``,
equivalent to cumsum(``core_num_dims``)
- .. c:member:: char *PyUFuncObject.core_signature
+ .. c:member:: char *core_signature
Core signature string
- .. c:member:: PyUFunc_TypeResolutionFunc *PyUFuncObject.type_resolver
+ .. c:member:: PyUFunc_TypeResolutionFunc *type_resolver
A function which resolves the types and fills an array with the dtypes
for the inputs and outputs
- .. c:member:: PyUFunc_LegacyInnerLoopSelectionFunc *PyUFuncObject.legacy_inner_loop_selector
+ .. c:member:: PyUFunc_LegacyInnerLoopSelectionFunc *legacy_inner_loop_selector
A function which returns an inner loop. The ``legacy`` in the name arises
because for NumPy 1.6 a better variant had been planned. This variant
has not yet come about.
- .. c:member:: void *PyUFuncObject.reserved2
+ .. c:member:: void *reserved2
For a possible future loop selector with a different signature.
- .. c:member:: PyUFunc_MaskedInnerLoopSelectionFunc *PyUFuncObject.masked_inner_loop_selector
+ .. c:member:: PyUFunc_MaskedInnerLoopSelectionFunc *masked_inner_loop_selector
Function which returns a masked inner loop for the ufunc
- .. c:member:: npy_uint32 PyUFuncObject.op_flags
+ .. c:member:: npy_uint32 op_flags
Override the default operand flags for each ufunc operand.
- .. c:member:: npy_uint32 PyUFuncObject.iter_flags
+ .. c:member:: npy_uint32 iter_flags
Override the default nditer flags for the ufunc.
Added in API version 0x0000000D
- .. c:member:: npy_intp *PyUFuncObject.core_dim_sizes
+ .. c:member:: npy_intp *core_dim_sizes
For each distinct core dimension, the possible
- :ref:`frozen <frozen>` size if :c:data:`UFUNC_CORE_DIM_SIZE_INFERRED` is 0
+ :ref:`frozen <frozen>` size if
+ :c:data:`UFUNC_CORE_DIM_SIZE_INFERRED` is ``0``
- .. c:member:: npy_uint32 *PyUFuncObject.core_dim_flags
+ .. c:member:: npy_uint32 *core_dim_flags
For each distinct core dimension, a set of ``UFUNC_CORE_DIM*`` flags
- - :c:data:`UFUNC_CORE_DIM_CAN_IGNORE` if the dim name ends in ``?``
- - :c:data:`UFUNC_CORE_DIM_SIZE_INFERRED` if the dim size will be
- determined from the operands and not from a :ref:`frozen <frozen>` signature
+ .. c:macro:: UFUNC_CORE_DIM_CAN_IGNORE
+
+ if the dim name ends in ``?``
+
+ .. c:macro:: UFUNC_CORE_DIM_SIZE_INFERRED
+
+ if the dim size will be determined from the operands
+ and not from a :ref:`frozen <frozen>` signature
+
+ .. c:member:: PyObject *identity_value
+
+ Identity for reduction, when :c:member:`PyUFuncObject.identity`
+ is equal to :c:data:`PyUFunc_IdentityValue`.
PyArrayIter_Type and PyArrayIterObject
--------------------------------------
@@ -1009,57 +1023,57 @@ PyArrayIter_Type and PyArrayIterObject
npy_intp factors[NPY_MAXDIMS];
PyArrayObject *ao;
char *dataptr;
- Bool contiguous;
+ npy_bool contiguous;
} PyArrayIterObject;
- .. c:member:: int PyArrayIterObject.nd_m1
+ .. c:member:: int nd_m1
:math:`N-1` where :math:`N` is the number of dimensions in the
underlying array.
- .. c:member:: npy_intp PyArrayIterObject.index
+ .. c:member:: npy_intp index
The current 1-d index into the array.
- .. c:member:: npy_intp PyArrayIterObject.size
+ .. c:member:: npy_intp size
The total size of the underlying array.
- .. c:member:: npy_intp *PyArrayIterObject.coordinates
+ .. c:member:: npy_intp *coordinates
An :math:`N` -dimensional index into the array.
- .. c:member:: npy_intp *PyArrayIterObject.dims_m1
+ .. c:member:: npy_intp *dims_m1
The size of the array minus 1 in each dimension.
- .. c:member:: npy_intp *PyArrayIterObject.strides
+ .. c:member:: npy_intp *strides
The strides of the array. How many bytes needed to jump to the next
element in each dimension.
- .. c:member:: npy_intp *PyArrayIterObject.backstrides
+ .. c:member:: npy_intp *backstrides
How many bytes needed to jump from the end of a dimension back
to its beginning. Note that ``backstrides[k] == strides[k] *
dims_m1[k]``, but it is stored here as an optimization.
- .. c:member:: npy_intp *PyArrayIterObject.factors
+ .. c:member:: npy_intp *factors
This array is used in computing an N-d index from a 1-d index. It
contains needed products of the dimensions.
- .. c:member:: PyArrayObject *PyArrayIterObject.ao
+ .. c:member:: PyArrayObject *ao
A pointer to the underlying ndarray this iterator was created to
represent.
- .. c:member:: char *PyArrayIterObject.dataptr
+ .. c:member:: char *dataptr
This member points to an element in the ndarray indicated by the
index.
- .. c:member:: Bool PyArrayIterObject.contiguous
+ .. c:member:: npy_bool contiguous
This flag is true if the underlying array is
:c:data:`NPY_ARRAY_C_CONTIGUOUS`. It is used to simplify
@@ -1106,32 +1120,32 @@ PyArrayMultiIter_Type and PyArrayMultiIterObject
PyArrayIterObject *iters[NPY_MAXDIMS];
} PyArrayMultiIterObject;
- .. c:macro: PyArrayMultiIterObject.PyObject_HEAD
+ .. c:macro: PyObject_HEAD
Needed at the start of every Python object (holds reference count
and type identification).
- .. c:member:: int PyArrayMultiIterObject.numiter
+ .. c:member:: int numiter
The number of arrays that need to be broadcast to the same shape.
- .. c:member:: npy_intp PyArrayMultiIterObject.size
+ .. c:member:: npy_intp size
The total broadcasted size.
- .. c:member:: npy_intp PyArrayMultiIterObject.index
+ .. c:member:: npy_intp index
The current (1-d) index into the broadcasted result.
- .. c:member:: int PyArrayMultiIterObject.nd
+ .. c:member:: int nd
The number of dimensions in the broadcasted result.
- .. c:member:: npy_intp *PyArrayMultiIterObject.dimensions
+ .. c:member:: npy_intp *dimensions
The shape of the broadcasted result (only ``nd`` slots are used).
- .. c:member:: PyArrayIterObject **PyArrayMultiIterObject.iters
+ .. c:member:: PyArrayIterObject **iters
An array of iterator objects that holds the iterators for the
arrays to be broadcast together. On return, the iterators are
@@ -1204,7 +1218,7 @@ ScalarArrayTypes
There is a Python type for each of the different built-in data types
that can be present in the array Most of these are simple wrappers
around the corresponding data type in C. The C-names for these types
-are :c:data:`Py{TYPE}ArrType_Type` where ``{TYPE}`` can be
+are ``Py{TYPE}ArrType_Type`` where ``{TYPE}`` can be
**Bool**, **Byte**, **Short**, **Int**, **Long**, **LongLong**,
**UByte**, **UShort**, **UInt**, **ULong**, **ULongLong**,
@@ -1213,8 +1227,8 @@ are :c:data:`Py{TYPE}ArrType_Type` where ``{TYPE}`` can be
**Object**.
These type names are part of the C-API and can therefore be created in
-extension C-code. There is also a :c:data:`PyIntpArrType_Type` and a
-:c:data:`PyUIntpArrType_Type` that are simple substitutes for one of the
+extension C-code. There is also a ``PyIntpArrType_Type`` and a
+``PyUIntpArrType_Type`` that are simple substitutes for one of the
integer types that can hold a pointer on the platform. The structure
of these scalar objects is not exposed to C-code. The function
:c:func:`PyArray_ScalarAsCtype` (..) can be used to extract the C-type
@@ -1249,12 +1263,12 @@ PyArray_Dims
The members of this structure are
- .. c:member:: npy_intp *PyArray_Dims.ptr
+ .. c:member:: npy_intp *ptr
A pointer to a list of (:c:type:`npy_intp`) integers which
usually represent array shape or array strides.
- .. c:member:: int PyArray_Dims.len
+ .. c:member:: int len
The length of the list of integers. It is assumed safe to
access *ptr* [0] to *ptr* [len-1].
@@ -1283,26 +1297,26 @@ PyArray_Chunk
The members are
- .. c:macro: PyArray_Chunk.PyObject_HEAD
+ .. c:macro: PyObject_HEAD
Necessary for all Python objects. Included here so that the
:c:type:`PyArray_Chunk` structure matches that of the buffer object
(at least to the len member).
- .. c:member:: PyObject *PyArray_Chunk.base
+ .. c:member:: PyObject *base
The Python object this chunk of memory comes from. Needed so that
memory can be accounted for properly.
- .. c:member:: void *PyArray_Chunk.ptr
+ .. c:member:: void *ptr
A pointer to the start of the single-segment chunk of memory.
- .. c:member:: npy_intp PyArray_Chunk.len
+ .. c:member:: npy_intp len
The length of the segment in bytes.
- .. c:member:: int PyArray_Chunk.flags
+ .. c:member:: int flags
Any data flags (*e.g.* :c:data:`NPY_ARRAY_WRITEABLE` ) that should
be used to interpret the memory.
@@ -1317,13 +1331,13 @@ PyArrayInterface
The :c:type:`PyArrayInterface` structure is defined so that NumPy and
other extension modules can use the rapid array interface
- protocol. The :obj:`__array_struct__` method of an object that
+ protocol. The :obj:`~object.__array_struct__` method of an object that
supports the rapid array interface protocol should return a
- :c:type:`PyCObject` that contains a pointer to a :c:type:`PyArrayInterface`
+ :c:type:`PyCapsule` that contains a pointer to a :c:type:`PyArrayInterface`
structure with the relevant details of the array. After the new
array is created, the attribute should be ``DECREF``'d which will
free the :c:type:`PyArrayInterface` structure. Remember to ``INCREF`` the
- object (whose :obj:`__array_struct__` attribute was retrieved) and
+ object (whose :obj:`~object.__array_struct__` attribute was retrieved) and
point the base member of the new :c:type:`PyArrayObject` to this same
object. In this way the memory for the array will be managed
correctly.
@@ -1342,15 +1356,15 @@ PyArrayInterface
PyObject *descr;
} PyArrayInterface;
- .. c:member:: int PyArrayInterface.two
+ .. c:member:: int two
the integer 2 as a sanity check.
- .. c:member:: int PyArrayInterface.nd
+ .. c:member:: int nd
the number of dimensions in the array.
- .. c:member:: char PyArrayInterface.typekind
+ .. c:member:: char typekind
A character indicating what kind of array is present according to the
typestring convention with 't' -> bitfield, 'b' -> Boolean, 'i' ->
@@ -1358,11 +1372,11 @@ PyArrayInterface
complex floating point, 'O' -> object, 'S' -> (byte-)string, 'U' ->
unicode, 'V' -> void.
- .. c:member:: int PyArrayInterface.itemsize
+ .. c:member:: int itemsize
The number of bytes each item in the array requires.
- .. c:member:: int PyArrayInterface.flags
+ .. c:member:: int flags
Any of the bits :c:data:`NPY_ARRAY_C_CONTIGUOUS` (1),
:c:data:`NPY_ARRAY_F_CONTIGUOUS` (2), :c:data:`NPY_ARRAY_ALIGNED` (0x100),
@@ -1376,26 +1390,26 @@ PyArrayInterface
structure is present (it will be ignored by objects consuming
version 2 of the array interface).
- .. c:member:: npy_intp *PyArrayInterface.shape
+ .. c:member:: npy_intp *shape
An array containing the size of the array in each dimension.
- .. c:member:: npy_intp *PyArrayInterface.strides
+ .. c:member:: npy_intp *strides
An array containing the number of bytes to jump to get to the next
element in each dimension.
- .. c:member:: void *PyArrayInterface.data
+ .. c:member:: void *data
A pointer *to* the first element of the array.
- .. c:member:: PyObject *PyArrayInterface.descr
+ .. c:member:: PyObject *descr
A Python object describing the data-type in more detail (same
- as the *descr* key in :obj:`__array_interface__`). This can be
+ as the *descr* key in :obj:`~object.__array_interface__`). This can be
``NULL`` if *typekind* and *itemsize* provide enough
information. This field is also ignored unless
- :c:data:`ARR_HAS_DESCR` flag is on in *flags*.
+ :c:data:`NPY_ARR_HAS_DESCR` flag is on in *flags*.
Internally used structures
@@ -1433,7 +1447,7 @@ for completeness and assistance in understanding the code.
Advanced indexing is handled with this Python type. It is simply a
loose wrapper around the C-structure containing the variables
needed for advanced array indexing. The associated C-structure,
- :c:type:`PyArrayMapIterObject`, is useful if you are trying to
+ ``PyArrayMapIterObject``, is useful if you are trying to
understand the advanced-index mapping code. It is defined in the
``arrayobject.h`` header. This type is not exposed to Python and
could be replaced with a C-structure. As a Python type it takes
diff --git a/doc/source/reference/c-api/ufunc.rst b/doc/source/reference/c-api/ufunc.rst
index 16ddde58c..9eb70c3fb 100644
--- a/doc/source/reference/c-api/ufunc.rst
+++ b/doc/source/reference/c-api/ufunc.rst
@@ -10,28 +10,52 @@ UFunc API
Constants
---------
-.. c:var:: UFUNC_ERR_{HANDLER}
+``UFUNC_ERR_{HANDLER}``
+ .. c:macro:: UFUNC_ERR_IGNORE
- ``{HANDLER}`` can be **IGNORE**, **WARN**, **RAISE**, or **CALL**
+ .. c:macro:: UFUNC_ERR_WARN
-.. c:var:: UFUNC_{THING}_{ERR}
+ .. c:macro:: UFUNC_ERR_RAISE
- ``{THING}`` can be **MASK**, **SHIFT**, or **FPE**, and ``{ERR}`` can
- be **DIVIDEBYZERO**, **OVERFLOW**, **UNDERFLOW**, and **INVALID**.
+ .. c:macro:: UFUNC_ERR_CALL
-.. c:var:: PyUFunc_{VALUE}
+``UFUNC_{THING}_{ERR}``
+ .. c:macro:: UFUNC_MASK_DIVIDEBYZERO
- .. c:var:: PyUFunc_One
+ .. c:macro:: UFUNC_MASK_OVERFLOW
- .. c:var:: PyUFunc_Zero
+ .. c:macro:: UFUNC_MASK_UNDERFLOW
- .. c:var:: PyUFunc_MinusOne
+ .. c:macro:: UFUNC_MASK_INVALID
- .. c:var:: PyUFunc_ReorderableNone
+ .. c:macro:: UFUNC_SHIFT_DIVIDEBYZERO
- .. c:var:: PyUFunc_None
+ .. c:macro:: UFUNC_SHIFT_OVERFLOW
- .. c:var:: PyUFunc_IdentityValue
+ .. c:macro:: UFUNC_SHIFT_UNDERFLOW
+
+ .. c:macro:: UFUNC_SHIFT_INVALID
+
+ .. c:macro:: UFUNC_FPE_DIVIDEBYZERO
+
+ .. c:macro:: UFUNC_FPE_OVERFLOW
+
+ .. c:macro:: UFUNC_FPE_UNDERFLOW
+
+ .. c:macro:: UFUNC_FPE_INVALID
+
+``PyUFunc_{VALUE}``
+ .. c:macro:: PyUFunc_One
+
+ .. c:macro:: PyUFunc_Zero
+
+ .. c:macro:: PyUFunc_MinusOne
+
+ .. c:macro:: PyUFunc_ReorderableNone
+
+ .. c:macro:: PyUFunc_None
+
+ .. c:macro:: PyUFunc_IdentityValue
Macros
@@ -50,6 +74,66 @@ Macros
was released (because loop->obj was not true).
+Types
+-----
+
+.. c:type:: PyUFuncGenericFunction
+
+ pointers to functions that actually implement the underlying
+ (element-by-element) function :math:`N` times with the following
+ signature:
+
+ .. c:function:: void loopfunc(\
+ char** args, npy_intp const *dimensions, npy_intp const *steps, void* data)
+
+ *args*
+
+ An array of pointers to the actual data for the input and output
+ arrays. The input arguments are given first followed by the output
+ arguments.
+
+ *dimensions*
+
+ A pointer to the size of the dimension over which this function is
+ looping.
+
+ *steps*
+
+ A pointer to the number of bytes to jump to get to the
+ next element in this dimension for each of the input and
+ output arguments.
+
+ *data*
+
+ Arbitrary data (extra arguments, function names, *etc.* )
+ that can be stored with the ufunc and will be passed in
+ when it is called.
+
+ This is an example of a func specialized for addition of doubles
+ returning doubles.
+
+ .. code-block:: c
+
+ static void
+ double_add(char **args,
+ npy_intp const *dimensions,
+ npy_intp const *steps,
+ void *extra)
+ {
+ npy_intp i;
+ npy_intp is1 = steps[0], is2 = steps[1];
+ npy_intp os = steps[2], n = dimensions[0];
+ char *i1 = args[0], *i2 = args[1], *op = args[2];
+ for (i = 0; i < n; i++) {
+ *((double *)op) = *((double *)i1) +
+ *((double *)i2);
+ i1 += is1;
+ i2 += is2;
+ op += os;
+ }
+ }
+
+
Functions
---------
@@ -71,60 +155,7 @@ Functions
:param func:
Must to an array of length *ntypes* containing
- :c:type:`PyUFuncGenericFunction` items. These items are pointers to
- functions that actually implement the underlying
- (element-by-element) function :math:`N` times with the following
- signature:
-
- .. c:function:: void loopfunc(
- char** args, npy_intp const *dimensions, npy_intp const *steps, void* data)
-
- *args*
-
- An array of pointers to the actual data for the input and output
- arrays. The input arguments are given first followed by the output
- arguments.
-
- *dimensions*
-
- A pointer to the size of the dimension over which this function is
- looping.
-
- *steps*
-
- A pointer to the number of bytes to jump to get to the
- next element in this dimension for each of the input and
- output arguments.
-
- *data*
-
- Arbitrary data (extra arguments, function names, *etc.* )
- that can be stored with the ufunc and will be passed in
- when it is called.
-
- This is an example of a func specialized for addition of doubles
- returning doubles.
-
- .. code-block:: c
-
- static void
- double_add(char **args,
- npy_intp const *dimensions,
- npy_intp const *steps,
- void *extra)
- {
- npy_intp i;
- npy_intp is1 = steps[0], is2 = steps[1];
- npy_intp os = steps[2], n = dimensions[0];
- char *i1 = args[0], *i2 = args[1], *op = args[2];
- for (i = 0; i < n; i++) {
- *((double *)op) = *((double *)i1) +
- *((double *)i2);
- i1 += is1;
- i2 += is2;
- op += os;
- }
- }
+ :c:type:`PyUFuncGenericFunction` items.
:param data:
Should be ``NULL`` or a pointer to an array of size *ntypes*
@@ -269,7 +300,7 @@ Functions
.. c:function:: int PyUFunc_checkfperr(int errmask, PyObject* errobj)
A simple interface to the IEEE error-flag checking support. The
- *errmask* argument is a mask of :c:data:`UFUNC_MASK_{ERR}` bitmasks
+ *errmask* argument is a mask of ``UFUNC_MASK_{ERR}`` bitmasks
indicating which errors to check for (and how to check for
them). The *errobj* must be a Python tuple with two elements: a
string containing the name which will be used in any communication
@@ -459,9 +490,9 @@ structure.
Importing the API
-----------------
-.. c:var:: PY_UFUNC_UNIQUE_SYMBOL
+.. c:macro:: PY_UFUNC_UNIQUE_SYMBOL
-.. c:var:: NO_IMPORT_UFUNC
+.. c:macro:: NO_IMPORT_UFUNC
.. c:function:: void import_ufunc(void)
diff --git a/doc/source/reference/distutils.rst b/doc/source/reference/distutils.rst
index 6057c7ed0..f201ba668 100644
--- a/doc/source/reference/distutils.rst
+++ b/doc/source/reference/distutils.rst
@@ -39,6 +39,7 @@ Modules in :mod:`numpy.distutils`
:toctree: generated/
ccompiler
+ ccompiler_opt
cpuinfo.cpu
core.Extension
exec_command
diff --git a/doc/source/reference/figures/opt-infra.odg b/doc/source/reference/figures/opt-infra.odg
new file mode 100644
index 000000000..a7b36f407
--- /dev/null
+++ b/doc/source/reference/figures/opt-infra.odg
Binary files differ
diff --git a/doc/source/reference/figures/opt-infra.png b/doc/source/reference/figures/opt-infra.png
new file mode 100644
index 000000000..e0b6f2316
--- /dev/null
+++ b/doc/source/reference/figures/opt-infra.png
Binary files differ
diff --git a/doc/source/reference/global_state.rst b/doc/source/reference/global_state.rst
index 2a163390e..b59467210 100644
--- a/doc/source/reference/global_state.rst
+++ b/doc/source/reference/global_state.rst
@@ -81,5 +81,20 @@ This setting should always be enabled. Setting the
debug option can be interesting for testing code written
in C which iterates through arrays that may or may not be
contiguous in memory.
-Most users will have no reason to change these, for details
-please see the `memory layout <memory-layout>`_ documentation.
+Most users will have no reason to change these; for details
+see the :ref:`memory layout <memory-layout>` documentation.
+
+Using the new casting implementation
+------------------------------------
+
+Within NumPy 1.20 it is possible to enable the new experimental casting
+implementation for testing purposes. To do this set::
+
+ NPY_USE_NEW_CASTINGIMPL=1
+
+Setting the flag is only useful to aid with NumPy developement to ensure the
+new version is bug free and should be avoided for production code.
+It is a helpful test for projects that either create custom datatypes or
+use for example complicated structured dtypes. The flag is expected to be
+removed in 1.21 with the new version being always in use.
+
diff --git a/doc/source/reference/index.rst b/doc/source/reference/index.rst
index 2e1dcafa2..6eb74cd77 100644
--- a/doc/source/reference/index.rst
+++ b/doc/source/reference/index.rst
@@ -22,11 +22,13 @@ For learning how to use NumPy, see the :ref:`complete documentation <numpy_docs_
constants
ufuncs
routines
+ typing
global_state
distutils
distutils_guide
c-api/index
internals
+ simd/simd-optimizations
swig
diff --git a/doc/source/reference/internals.code-explanations.rst b/doc/source/reference/internals.code-explanations.rst
index 65553e07e..e8e428f2e 100644
--- a/doc/source/reference/internals.code-explanations.rst
+++ b/doc/source/reference/internals.code-explanations.rst
@@ -147,7 +147,8 @@ an iterator for each of the arrays being broadcast.
The :c:func:`PyArray_Broadcast` function takes the iterators that have already
been defined and uses them to determine the broadcast shape in each
dimension (to create the iterators at the same time that broadcasting
-occurs then use the :c:func:`PyMultiIter_New` function). Then, the iterators are
+occurs then use the :c:func:`PyArray_MultiIterNew` function).
+Then, the iterators are
adjusted so that each iterator thinks it is iterating over an array
with the broadcast size. This is done by adjusting the iterators
number of dimensions, and the shape in each dimension. This works
@@ -162,7 +163,7 @@ for the extended dimensions. It is done in exactly the same way in
NumPy. The big difference is that now the array of strides is kept
track of in a :c:type:`PyArrayIterObject`, the iterators involved in a
broadcast result are kept track of in a :c:type:`PyArrayMultiIterObject`,
-and the :c:func:`PyArray_BroadCast` call implements the broad-casting rules.
+and the :c:func:`PyArray_Broadcast` call implements the broad-casting rules.
Array Scalars
@@ -368,7 +369,7 @@ The output arguments (if any) are then processed and any missing
return arrays are constructed. If any provided output array doesn't
have the correct type (or is mis-aligned) and is smaller than the
buffer size, then a new output array is constructed with the special
-:c:data:`WRITEBACKIFCOPY` flag set. At the end of the function,
+:c:data:`NPY_ARRAY_WRITEBACKIFCOPY` flag set. At the end of the function,
:c:func:`PyArray_ResolveWritebackIfCopy` is called so that
its contents will be copied back into the output array.
Iterators for the output arguments are then processed.
diff --git a/doc/source/reference/internals.rst b/doc/source/reference/internals.rst
index aacfabcd3..ed8042c08 100644
--- a/doc/source/reference/internals.rst
+++ b/doc/source/reference/internals.rst
@@ -9,4 +9,160 @@ NumPy internals
internals.code-explanations
alignment
-.. automodule:: numpy.doc.internals
+Internal organization of numpy arrays
+=====================================
+
+It helps to understand a bit about how numpy arrays are handled under the covers to help understand numpy better. This section will not go into great detail. Those wishing to understand the full details are referred to Travis Oliphant's book "Guide to NumPy".
+
+NumPy arrays consist of two major components, the raw array data (from now on,
+referred to as the data buffer), and the information about the raw array data.
+The data buffer is typically what people think of as arrays in C or Fortran,
+a contiguous (and fixed) block of memory containing fixed sized data items.
+NumPy also contains a significant set of data that describes how to interpret
+the data in the data buffer. This extra information contains (among other things):
+
+ 1) The basic data element's size in bytes
+ 2) The start of the data within the data buffer (an offset relative to the
+ beginning of the data buffer).
+ 3) The number of dimensions and the size of each dimension
+ 4) The separation between elements for each dimension (the 'stride'). This
+ does not have to be a multiple of the element size
+ 5) The byte order of the data (which may not be the native byte order)
+ 6) Whether the buffer is read-only
+ 7) Information (via the dtype object) about the interpretation of the basic
+ data element. The basic data element may be as simple as a int or a float,
+ or it may be a compound object (e.g., struct-like), a fixed character field,
+ or Python object pointers.
+ 8) Whether the array is to interpreted as C-order or Fortran-order.
+
+This arrangement allow for very flexible use of arrays. One thing that it allows
+is simple changes of the metadata to change the interpretation of the array buffer.
+Changing the byteorder of the array is a simple change involving no rearrangement
+of the data. The shape of the array can be changed very easily without changing
+anything in the data buffer or any data copying at all
+
+Among other things that are made possible is one can create a new array metadata
+object that uses the same data buffer
+to create a new view of that data buffer that has a different interpretation
+of the buffer (e.g., different shape, offset, byte order, strides, etc) but
+shares the same data bytes. Many operations in numpy do just this such as
+slices. Other operations, such as transpose, don't move data elements
+around in the array, but rather change the information about the shape and strides so that the indexing of the array changes, but the data in the doesn't move.
+
+Typically these new versions of the array metadata but the same data buffer are
+new 'views' into the data buffer. There is a different ndarray object, but it
+uses the same data buffer. This is why it is necessary to force copies through
+use of the .copy() method if one really wants to make a new and independent
+copy of the data buffer.
+
+New views into arrays mean the object reference counts for the data buffer
+increase. Simply doing away with the original array object will not remove the
+data buffer if other views of it still exist.
+
+Multidimensional Array Indexing Order Issues
+============================================
+
+What is the right way to index
+multi-dimensional arrays? Before you jump to conclusions about the one and
+true way to index multi-dimensional arrays, it pays to understand why this is
+a confusing issue. This section will try to explain in detail how numpy
+indexing works and why we adopt the convention we do for images, and when it
+may be appropriate to adopt other conventions.
+
+The first thing to understand is
+that there are two conflicting conventions for indexing 2-dimensional arrays.
+Matrix notation uses the first index to indicate which row is being selected and
+the second index to indicate which column is selected. This is opposite the
+geometrically oriented-convention for images where people generally think the
+first index represents x position (i.e., column) and the second represents y
+position (i.e., row). This alone is the source of much confusion;
+matrix-oriented users and image-oriented users expect two different things with
+regard to indexing.
+
+The second issue to understand is how indices correspond
+to the order the array is stored in memory. In Fortran the first index is the
+most rapidly varying index when moving through the elements of a two
+dimensional array as it is stored in memory. If you adopt the matrix
+convention for indexing, then this means the matrix is stored one column at a
+time (since the first index moves to the next row as it changes). Thus Fortran
+is considered a Column-major language. C has just the opposite convention. In
+C, the last index changes most rapidly as one moves through the array as
+stored in memory. Thus C is a Row-major language. The matrix is stored by
+rows. Note that in both cases it presumes that the matrix convention for
+indexing is being used, i.e., for both Fortran and C, the first index is the
+row. Note this convention implies that the indexing convention is invariant
+and that the data order changes to keep that so.
+
+But that's not the only way
+to look at it. Suppose one has large two-dimensional arrays (images or
+matrices) stored in data files. Suppose the data are stored by rows rather than
+by columns. If we are to preserve our index convention (whether matrix or
+image) that means that depending on the language we use, we may be forced to
+reorder the data if it is read into memory to preserve our indexing
+convention. For example if we read row-ordered data into memory without
+reordering, it will match the matrix indexing convention for C, but not for
+Fortran. Conversely, it will match the image indexing convention for Fortran,
+but not for C. For C, if one is using data stored in row order, and one wants
+to preserve the image index convention, the data must be reordered when
+reading into memory.
+
+In the end, which you do for Fortran or C depends on
+which is more important, not reordering data or preserving the indexing
+convention. For large images, reordering data is potentially expensive, and
+often the indexing convention is inverted to avoid that.
+
+The situation with
+numpy makes this issue yet more complicated. The internal machinery of numpy
+arrays is flexible enough to accept any ordering of indices. One can simply
+reorder indices by manipulating the internal stride information for arrays
+without reordering the data at all. NumPy will know how to map the new index
+order to the data without moving the data.
+
+So if this is true, why not choose
+the index order that matches what you most expect? In particular, why not define
+row-ordered images to use the image convention? (This is sometimes referred
+to as the Fortran convention vs the C convention, thus the 'C' and 'FORTRAN'
+order options for array ordering in numpy.) The drawback of doing this is
+potential performance penalties. It's common to access the data sequentially,
+either implicitly in array operations or explicitly by looping over rows of an
+image. When that is done, then the data will be accessed in non-optimal order.
+As the first index is incremented, what is actually happening is that elements
+spaced far apart in memory are being sequentially accessed, with usually poor
+memory access speeds. For example, for a two dimensional image 'im' defined so
+that im[0, 10] represents the value at x=0, y=10. To be consistent with usual
+Python behavior then im[0] would represent a column at x=0. Yet that data
+would be spread over the whole array since the data are stored in row order.
+Despite the flexibility of numpy's indexing, it can't really paper over the fact
+basic operations are rendered inefficient because of data order or that getting
+contiguous subarrays is still awkward (e.g., im[:,0] for the first row, vs
+im[0]), thus one can't use an idiom such as for row in im; for col in im does
+work, but doesn't yield contiguous column data.
+
+As it turns out, numpy is
+smart enough when dealing with ufuncs to determine which index is the most
+rapidly varying one in memory and uses that for the innermost loop. Thus for
+ufuncs there is no large intrinsic advantage to either approach in most cases.
+On the other hand, use of .flat with an FORTRAN ordered array will lead to
+non-optimal memory access as adjacent elements in the flattened array (iterator,
+actually) are not contiguous in memory.
+
+Indeed, the fact is that Python
+indexing on lists and other sequences naturally leads to an outside-to inside
+ordering (the first index gets the largest grouping, the next the next largest,
+and the last gets the smallest element). Since image data are normally stored
+by rows, this corresponds to position within rows being the last item indexed.
+
+If you do want to use Fortran ordering realize that
+there are two approaches to consider: 1) accept that the first index is just not
+the most rapidly changing in memory and have all your I/O routines reorder
+your data when going from memory to disk or visa versa, or use numpy's
+mechanism for mapping the first index to the most rapidly varying data. We
+recommend the former if possible. The disadvantage of the latter is that many
+of numpy's functions will yield arrays without Fortran ordering unless you are
+careful to use the 'order' keyword. Doing this would be highly inconvenient.
+
+Otherwise we recommend simply learning to reverse the usual order of indices
+when accessing elements of an array. Granted, it goes against the grain, but
+it is more in line with Python semantics and the natural order of the data.
+
+
diff --git a/doc/source/reference/maskedarray.baseclass.rst b/doc/source/reference/maskedarray.baseclass.rst
index 5c1bdda23..5a0f99651 100644
--- a/doc/source/reference/maskedarray.baseclass.rst
+++ b/doc/source/reference/maskedarray.baseclass.rst
@@ -242,8 +242,8 @@ Comparison operators:
MaskedArray.__eq__
MaskedArray.__ne__
-Truth value of an array (:func:`bool()`):
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Truth value of an array (:class:`bool() <bool>`):
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. autosummary::
:toctree: generated/
diff --git a/doc/source/reference/maskedarray.generic.rst b/doc/source/reference/maskedarray.generic.rst
index 41c3ee564..d3849c50d 100644
--- a/doc/source/reference/maskedarray.generic.rst
+++ b/doc/source/reference/maskedarray.generic.rst
@@ -177,8 +177,8 @@ attribute. We must keep in mind that a ``True`` entry in the mask indicates an
*invalid* data.
Another possibility is to use the :func:`getmask` and :func:`getmaskarray`
-functions. :func:`getmask(x)` outputs the mask of ``x`` if ``x`` is a masked
-array, and the special value :data:`nomask` otherwise. :func:`getmaskarray(x)`
+functions. ``getmask(x)`` outputs the mask of ``x`` if ``x`` is a masked
+array, and the special value :data:`nomask` otherwise. ``getmaskarray(x)``
outputs the mask of ``x`` if ``x`` is a masked array. If ``x`` has no invalid
entry or is not a masked array, the function outputs a boolean array of
``False`` with as many elements as ``x``.
@@ -296,11 +296,11 @@ new valid values to them::
.. note::
Unmasking an entry by direct assignment will silently fail if the masked
- array has a *hard* mask, as shown by the :attr:`hardmask` attribute. This
- feature was introduced to prevent overwriting the mask. To force the
- unmasking of an entry where the array has a hard mask, the mask must first
- to be softened using the :meth:`soften_mask` method before the allocation.
- It can be re-hardened with :meth:`harden_mask`::
+ array has a *hard* mask, as shown by the :attr:`~MaskedArray.hardmask`
+ attribute. This feature was introduced to prevent overwriting the mask.
+ To force the unmasking of an entry where the array has a hard mask,
+ the mask must first to be softened using the :meth:`soften_mask` method
+ before the allocation. It can be re-hardened with :meth:`harden_mask`::
>>> x = ma.array([1, 2, 3], mask=[0, 0, 1], hard_mask=True)
>>> x
@@ -406,8 +406,8 @@ Operations on masked arrays
Arithmetic and comparison operations are supported by masked arrays.
As much as possible, invalid entries of a masked array are not processed,
-meaning that the corresponding :attr:`data` entries *should* be the same
-before and after the operation.
+meaning that the corresponding :attr:`~MaskedArray.data` entries
+*should* be the same before and after the operation.
.. warning::
We need to stress that this behavior may not be systematic, that masked
diff --git a/doc/source/reference/random/c-api.rst b/doc/source/reference/random/c-api.rst
index 0d60f4d9e..a79da7a49 100644
--- a/doc/source/reference/random/c-api.rst
+++ b/doc/source/reference/random/c-api.rst
@@ -1,20 +1,14 @@
-Cython API for random
----------------------
+C API for random
+----------------
.. currentmodule:: numpy.random
-Typed versions of many of the `Generator` and `BitGenerator` methods as well as
-the classes themselves can be accessed directly from Cython via
-
-.. code-block:: cython
-
- cimport numpy.random
+Access to various distributions below is available via Cython or C-wrapper
+libraries like CFFI. All the functions accept a :c:type:`bitgen_t` as their
+first argument. To access these from Cython or C, you must link with the
+``npyrandom`` library which is part of the NumPy distribution, located in
+``numpy/random/lib``.
-C API for random
-----------------
-
-Access to various distributions is available via Cython or C-wrapper libraries
-like CFFI. All the functions accept a :c:type:`bitgen_t` as their first argument.
.. c:type:: bitgen_t
@@ -187,6 +181,5 @@ Generate a single integer
Generate random uint64 numbers in closed interval [off, off + rng].
-.. c:function:: npy_uint64 random_bounded_uint64(bitgen_t *bitgen_state, npy_uint64 off, npy_uint64 rng, npy_uint64 mask, bint use_masked)
-
+.. c:function:: npy_uint64 random_bounded_uint64(bitgen_t *bitgen_state, npy_uint64 off, npy_uint64 rng, npy_uint64 mask, bool use_masked)
diff --git a/doc/source/reference/random/generator.rst b/doc/source/reference/random/generator.rst
index a2cbb493a..8706e1de2 100644
--- a/doc/source/reference/random/generator.rst
+++ b/doc/source/reference/random/generator.rst
@@ -36,11 +36,105 @@ Simple random data
Permutations
============
+The methods for randomly permuting a sequence are
+
.. autosummary::
:toctree: generated/
~numpy.random.Generator.shuffle
~numpy.random.Generator.permutation
+ ~numpy.random.Generator.permuted
+
+The following table summarizes the behaviors of the methods.
+
++--------------+-------------------+------------------+
+| method | copy/in-place | axis handling |
++==============+===================+==================+
+| shuffle | in-place | as if 1d |
++--------------+-------------------+------------------+
+| permutation | copy | as if 1d |
++--------------+-------------------+------------------+
+| permuted | either (use 'out' | axis independent |
+| | for in-place) | |
++--------------+-------------------+------------------+
+
+The following subsections provide more details about the differences.
+
+In-place vs. copy
+~~~~~~~~~~~~~~~~~
+The main difference between `Generator.shuffle` and `Generator.permutation`
+is that `Generator.shuffle` operates in-place, while `Generator.permutation`
+returns a copy.
+
+By default, `Generator.permuted` returns a copy. To operate in-place with
+`Generator.permuted`, pass the same array as the first argument *and* as
+the value of the ``out`` parameter. For example,
+
+ >>> rg = np.random.default_rng()
+ >>> x = np.arange(0, 15).reshape(3, 5)
+ >>> x
+ array([[ 0, 1, 2, 3, 4],
+ [ 5, 6, 7, 8, 9],
+ [10, 11, 12, 13, 14]])
+ >>> y = rg.permuted(x, axis=1, out=x)
+ >>> x
+ array([[ 1, 0, 2, 4, 3], # random
+ [ 6, 7, 8, 9, 5],
+ [10, 14, 11, 13, 12]])
+
+Note that when ``out`` is given, the return value is ``out``:
+
+ >>> y is x
+ True
+
+Handling the ``axis`` parameter
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+An important distinction for these methods is how they handle the ``axis``
+parameter. Both `Generator.shuffle` and `Generator.permutation` treat the
+input as a one-dimensional sequence, and the ``axis`` parameter determines
+which dimension of the input array to use as the sequence. In the case of a
+two-dimensional array, ``axis=0`` will, in effect, rearrange the rows of the
+array, and ``axis=1`` will rearrange the columns. For example
+
+ >>> rg = np.random.default_rng()
+ >>> x = np.arange(0, 15).reshape(3, 5)
+ >>> x
+ array([[ 0, 1, 2, 3, 4],
+ [ 5, 6, 7, 8, 9],
+ [10, 11, 12, 13, 14]])
+ >>> rg.permutation(x, axis=1)
+ array([[ 1, 3, 2, 0, 4], # random
+ [ 6, 8, 7, 5, 9],
+ [11, 13, 12, 10, 14]])
+
+Note that the columns have been rearranged "in bulk": the values within
+each column have not changed.
+
+The method `Generator.permuted` treats the ``axis`` parameter similar to
+how `numpy.sort` treats it. Each slice along the given axis is shuffled
+independently of the others. Compare the following example of the use of
+`Generator.permuted` to the above example of `Generator.permutation`:
+
+ >>> rg.permuted(x, axis=1)
+ array([[ 1, 0, 2, 4, 3], # random
+ [ 5, 7, 6, 9, 8],
+ [10, 14, 12, 13, 11]])
+
+In this example, the values within each row (i.e. the values along
+``axis=1``) have been shuffled independently. This is not a "bulk"
+shuffle of the columns.
+
+Shuffling non-NumPy sequences
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+`Generator.shuffle` works on non-NumPy sequences. That is, if it is given
+a sequence that is not a NumPy array, it shuffles that sequence in-place.
+For example,
+
+ >>> rg = np.random.default_rng()
+ >>> a = ['A', 'B', 'C', 'D', 'E']
+ >>> rg.shuffle(a) # shuffle the list in-place
+ >>> a
+ ['B', 'D', 'A', 'E', 'C'] # random
Distributions
=============
diff --git a/doc/source/reference/random/index.rst b/doc/source/reference/random/index.rst
index d559f2327..13ce7c40c 100644
--- a/doc/source/reference/random/index.rst
+++ b/doc/source/reference/random/index.rst
@@ -23,7 +23,9 @@ number of different BitGenerators. It exposes many different probability
distributions. See `NEP 19 <https://www.numpy.org/neps/
nep-0019-rng-policy.html>`_ for context on the updated random Numpy number
routines. The legacy `RandomState` random number routines are still
-available, but limited to a single BitGenerator.
+available, but limited to a single BitGenerator. See :ref:`new-or-different`
+for a complete list of improvements and differences from the legacy
+``Randomstate``.
For convenience and backward compatibility, a single `RandomState`
instance's methods are imported into the numpy.random namespace, see
@@ -41,13 +43,13 @@ properties than the legacy `MT19937` used in `RandomState`.
.. code-block:: python
- # Do this
+ # Do this (new version)
from numpy.random import default_rng
rng = default_rng()
vals = rng.standard_normal(10)
more_vals = rng.standard_normal(10)
- # instead of this
+ # instead of this (legacy version)
from numpy import random
vals = random.standard_normal(10)
more_vals = random.standard_normal(10)
@@ -73,7 +75,7 @@ cleanup means that legacy and compatibility methods have been removed from
``seed`` removed Use `SeedSequence.spawn`
=================== ============== ============
-See :ref:`new-or-different` for more information
+See :ref:`new-or-different` for more information.
Something like the following code can be used to support both ``RandomState``
and ``Generator``, with the understanding that the interfaces are slightly
@@ -97,6 +99,30 @@ is wrapped with a `Generator`.
from numpy.random import Generator, PCG64
rg = Generator(PCG64(12345))
rg.standard_normal()
+
+Here we use `default_rng` to create an instance of `Generator` to generate a
+random float:
+
+>>> import numpy as np
+>>> rng = np.random.default_rng(12345)
+>>> print(rng)
+Generator(PCG64)
+>>> rfloat = rng.random()
+>>> rfloat
+0.22733602246716966
+>>> type(rfloat)
+<class 'float'>
+
+Here we use `default_rng` to create an instance of `Generator` to generate 3
+random integers between 0 (inclusive) and 10 (exclusive):
+
+>>> import numpy as np
+>>> rng = np.random.default_rng(12345)
+>>> rints = rng.integers(low=0, high=10, size=3)
+>>> rints
+array([6, 2, 7])
+>>> type(rints[0])
+<class 'numpy.int64'>
Introduction
------------
@@ -113,25 +139,36 @@ bit generator-provided stream and transforms them into more useful
distributions, e.g., simulated normal random values. This structure allows
alternative bit generators to be used with little code duplication.
-The `Generator` is the user-facing object that is nearly identical to
-`RandomState`. The canonical method to initialize a generator passes a
-`PCG64` bit generator as the sole argument.
+The `Generator` is the user-facing object that is nearly identical to the
+legacy `RandomState`. It accepts a bit generator instance as an argument.
+The default is currently `PCG64` but this may change in future versions.
+As a convenience NumPy provides the `default_rng` function to hide these
+details:
+
+>>> from numpy.random import default_rng
+>>> rg = default_rng(12345)
+>>> print(rg)
+Generator(PCG64)
+>>> print(rg.random())
+0.22733602246716966
+
+One can also instantiate `Generator` directly with a `BitGenerator` instance.
-.. code-block:: python
+To use the default `PCG64` bit generator, one can instantiate it directly and
+pass it to `Generator`:
- from numpy.random import default_rng
- rg = default_rng(12345)
- rg.random()
+>>> from numpy.random import Generator, PCG64
+>>> rg = Generator(PCG64(12345))
+>>> print(rg)
+Generator(PCG64)
-One can also instantiate `Generator` directly with a `BitGenerator` instance.
-To use the older `MT19937` algorithm, one can instantiate it directly
-and pass it to `Generator`.
+Similarly to use the older `MT19937` bit generator (not recommended), one can
+instantiate it directly and pass it to `Generator`:
-.. code-block:: python
-
- from numpy.random import Generator, MT19937
- rg = Generator(MT19937(12345))
- rg.random()
+>>> from numpy.random import Generator, MT19937
+>>> rg = Generator(MT19937(12345))
+>>> print(rg)
+Generator(MT19937)
What's New or Different
~~~~~~~~~~~~~~~~~~~~~~~
@@ -211,4 +248,3 @@ Original Source of the Generator and BitGenerators
This package was developed independently of NumPy and was integrated in version
1.17.0. The original repo is at https://github.com/bashtage/randomgen.
-
diff --git a/doc/source/reference/random/legacy.rst b/doc/source/reference/random/legacy.rst
index 91b91dac8..6cf4775b8 100644
--- a/doc/source/reference/random/legacy.rst
+++ b/doc/source/reference/random/legacy.rst
@@ -133,7 +133,7 @@ Many of the RandomState methods above are exported as functions in
- It uses a `RandomState` rather than the more modern `Generator`.
For backward compatible legacy reasons, we cannot change this. See
-`random-quick-start`.
+:ref:`random-quick-start`.
.. autosummary::
:toctree: generated/
diff --git a/doc/source/reference/random/new-or-different.rst b/doc/source/reference/random/new-or-different.rst
index 03e7775a0..6cab0f729 100644
--- a/doc/source/reference/random/new-or-different.rst
+++ b/doc/source/reference/random/new-or-different.rst
@@ -15,7 +15,7 @@ What's New or Different
streams, use `RandomState`, i.e., `RandomState.gamma` or
`RandomState.standard_t`.
-Quick comparison of legacy `mtrand <legacy>`_ to the new `Generator`
+Quick comparison of legacy :ref:`mtrand <legacy>` to the new `Generator`
================== ==================== =============
Feature Older Equivalent Notes
@@ -52,7 +52,7 @@ And in more detail:
methods which are 2-10 times faster than NumPy's default implementation in
`~.Generator.standard_normal`, `~.Generator.standard_exponential` or
`~.Generator.standard_gamma`.
-
+
.. ipython:: python
diff --git a/doc/source/reference/routines.array-manipulation.rst b/doc/source/reference/routines.array-manipulation.rst
index 8d13a1800..1c96495d9 100644
--- a/doc/source/reference/routines.array-manipulation.rst
+++ b/doc/source/reference/routines.array-manipulation.rst
@@ -74,6 +74,7 @@ Joining arrays
hstack
dstack
column_stack
+ row_stack
Splitting arrays
================
diff --git a/doc/source/reference/routines.char.rst b/doc/source/reference/routines.char.rst
index ed8393855..90df14125 100644
--- a/doc/source/reference/routines.char.rst
+++ b/doc/source/reference/routines.char.rst
@@ -6,7 +6,7 @@ String operations
.. module:: numpy.char
The `numpy.char` module provides a set of vectorized string
-operations for arrays of type `numpy.string_` or `numpy.unicode_`.
+operations for arrays of type `numpy.str_` or `numpy.bytes_`.
All of them are based on the string methods in the Python standard library.
String operations
diff --git a/doc/source/reference/routines.ctypeslib.rst b/doc/source/reference/routines.ctypeslib.rst
index 562638e9c..3a059f5d9 100644
--- a/doc/source/reference/routines.ctypeslib.rst
+++ b/doc/source/reference/routines.ctypeslib.rst
@@ -9,6 +9,5 @@ C-Types Foreign Function Interface (:mod:`numpy.ctypeslib`)
.. autofunction:: as_array
.. autofunction:: as_ctypes
.. autofunction:: as_ctypes_type
-.. autofunction:: ctypes_load_library
.. autofunction:: load_library
.. autofunction:: ndpointer
diff --git a/doc/source/reference/routines.financial.rst b/doc/source/reference/routines.financial.rst
deleted file mode 100644
index 5f426d7ab..000000000
--- a/doc/source/reference/routines.financial.rst
+++ /dev/null
@@ -1,21 +0,0 @@
-Financial functions
-*******************
-
-.. currentmodule:: numpy
-
-Simple financial functions
---------------------------
-
-.. autosummary::
- :toctree: generated/
-
- fv
- pv
- npv
- pmt
- ppmt
- ipmt
- irr
- mirr
- nper
- rate
diff --git a/doc/source/reference/routines.indexing.rst b/doc/source/reference/routines.indexing.rst
index aeec1a1bb..eebbf4989 100644
--- a/doc/source/reference/routines.indexing.rst
+++ b/doc/source/reference/routines.indexing.rst
@@ -42,6 +42,7 @@ Indexing-like operations
diag
diagonal
select
+ lib.stride_tricks.sliding_window_view
lib.stride_tricks.as_strided
Inserting data into arrays
diff --git a/doc/source/reference/routines.io.rst b/doc/source/reference/routines.io.rst
index cf66eab49..3052ee1fb 100644
--- a/doc/source/reference/routines.io.rst
+++ b/doc/source/reference/routines.io.rst
@@ -56,6 +56,7 @@ Memory mapping files
:toctree: generated/
memmap
+ lib.format.open_memmap
Text formatting options
-----------------------
@@ -85,7 +86,6 @@ Data sources
Binary Format Description
-------------------------
.. autosummary::
- :template: autosummary/minimal_module.rst
:toctree: generated/
- lib.format
+ lib.format
diff --git a/doc/source/reference/routines.ma.rst b/doc/source/reference/routines.ma.rst
index 97859ac67..d961cbf02 100644
--- a/doc/source/reference/routines.ma.rst
+++ b/doc/source/reference/routines.ma.rst
@@ -67,6 +67,9 @@ Inspecting the array
ma.size
ma.is_masked
ma.is_mask
+ ma.isMaskedArray
+ ma.isMA
+ ma.isarray
ma.MaskedArray.all
@@ -272,7 +275,7 @@ Filling a masked array
ma.common_fill_value
ma.default_fill_value
ma.maximum_fill_value
- ma.maximum_fill_value
+ ma.minimum_fill_value
ma.set_fill_value
ma.MaskedArray.get_fill_value
diff --git a/doc/source/reference/routines.other.rst b/doc/source/reference/routines.other.rst
index def5b3e3c..aefd680bb 100644
--- a/doc/source/reference/routines.other.rst
+++ b/doc/source/reference/routines.other.rst
@@ -47,6 +47,7 @@ Utility
show_config
deprecate
deprecate_with_doc
+ broadcast_shapes
Matlab-like Functions
---------------------
diff --git a/doc/source/reference/routines.rst b/doc/source/reference/routines.rst
index 7a9b97d77..5d6a823b7 100644
--- a/doc/source/reference/routines.rst
+++ b/doc/source/reference/routines.rst
@@ -28,7 +28,6 @@ indentation.
routines.emath
routines.err
routines.fft
- routines.financial
routines.functional
routines.help
routines.indexing
diff --git a/doc/source/reference/routines.set.rst b/doc/source/reference/routines.set.rst
index b12d3d5f5..149c33a8b 100644
--- a/doc/source/reference/routines.set.rst
+++ b/doc/source/reference/routines.set.rst
@@ -3,6 +3,11 @@ Set routines
.. currentmodule:: numpy
+.. autosummary::
+ :toctree: generated/
+
+ lib.arraysetops
+
Making proper sets
------------------
.. autosummary::
diff --git a/doc/source/reference/simd/simd-optimizations-tables-diff.inc b/doc/source/reference/simd/simd-optimizations-tables-diff.inc
new file mode 100644
index 000000000..41fa96703
--- /dev/null
+++ b/doc/source/reference/simd/simd-optimizations-tables-diff.inc
@@ -0,0 +1,37 @@
+.. generated via source/reference/simd/simd-optimizations.py
+
+x86::Intel Compiler - CPU feature names
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+.. table::
+ :align: left
+
+ =========== ==================================================================================================================
+ Name Implies
+ =========== ==================================================================================================================
+ ``FMA3`` ``SSE`` ``SSE2`` ``SSE3`` ``SSSE3`` ``SSE41`` ``POPCNT`` ``SSE42`` ``AVX`` ``F16C`` **AVX2**
+ ``AVX2`` ``SSE`` ``SSE2`` ``SSE3`` ``SSSE3`` ``SSE41`` ``POPCNT`` ``SSE42`` ``AVX`` ``F16C`` **FMA3**
+ ``AVX512F`` ``SSE`` ``SSE2`` ``SSE3`` ``SSSE3`` ``SSE41`` ``POPCNT`` ``SSE42`` ``AVX`` ``F16C`` ``FMA3`` ``AVX2`` **AVX512CD**
+ =========== ==================================================================================================================
+
+.. note::
+ The following features aren't supported by x86::Intel Compiler:
+ **XOP FMA4**
+
+x86::Microsoft Visual C/C++ - CPU feature names
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+.. table::
+ :align: left
+
+ ============ =================================================================================================================================
+ Name Implies
+ ============ =================================================================================================================================
+ ``FMA3`` ``SSE`` ``SSE2`` ``SSE3`` ``SSSE3`` ``SSE41`` ``POPCNT`` ``SSE42`` ``AVX`` ``F16C`` **AVX2**
+ ``AVX2`` ``SSE`` ``SSE2`` ``SSE3`` ``SSSE3`` ``SSE41`` ``POPCNT`` ``SSE42`` ``AVX`` ``F16C`` **FMA3**
+ ``AVX512F`` ``SSE`` ``SSE2`` ``SSE3`` ``SSSE3`` ``SSE41`` ``POPCNT`` ``SSE42`` ``AVX`` ``F16C`` ``FMA3`` ``AVX2`` **AVX512CD** **AVX512_SKX**
+ ``AVX512CD`` ``SSE`` ``SSE2`` ``SSE3`` ``SSSE3`` ``SSE41`` ``POPCNT`` ``SSE42`` ``AVX`` ``F16C`` ``FMA3`` ``AVX2`` ``AVX512F`` **AVX512_SKX**
+ ============ =================================================================================================================================
+
+.. note::
+ The following features aren't supported by x86::Microsoft Visual C/C++:
+ **AVX512_KNL AVX512_KNM**
+
diff --git a/doc/source/reference/simd/simd-optimizations-tables.inc b/doc/source/reference/simd/simd-optimizations-tables.inc
new file mode 100644
index 000000000..f038a91e1
--- /dev/null
+++ b/doc/source/reference/simd/simd-optimizations-tables.inc
@@ -0,0 +1,103 @@
+.. generated via source/reference/simd/simd-optimizations.py
+
+x86 - CPU feature names
+~~~~~~~~~~~~~~~~~~~~~~~
+.. table::
+ :align: left
+
+ ============ =================================================================================================================
+ Name Implies
+ ============ =================================================================================================================
+ ``SSE`` ``SSE2``
+ ``SSE2`` ``SSE``
+ ``SSE3`` ``SSE`` ``SSE2``
+ ``SSSE3`` ``SSE`` ``SSE2`` ``SSE3``
+ ``SSE41`` ``SSE`` ``SSE2`` ``SSE3`` ``SSSE3``
+ ``POPCNT`` ``SSE`` ``SSE2`` ``SSE3`` ``SSSE3`` ``SSE41``
+ ``SSE42`` ``SSE`` ``SSE2`` ``SSE3`` ``SSSE3`` ``SSE41`` ``POPCNT``
+ ``AVX`` ``SSE`` ``SSE2`` ``SSE3`` ``SSSE3`` ``SSE41`` ``POPCNT`` ``SSE42``
+ ``XOP`` ``SSE`` ``SSE2`` ``SSE3`` ``SSSE3`` ``SSE41`` ``POPCNT`` ``SSE42`` ``AVX``
+ ``FMA4`` ``SSE`` ``SSE2`` ``SSE3`` ``SSSE3`` ``SSE41`` ``POPCNT`` ``SSE42`` ``AVX``
+ ``F16C`` ``SSE`` ``SSE2`` ``SSE3`` ``SSSE3`` ``SSE41`` ``POPCNT`` ``SSE42`` ``AVX``
+ ``FMA3`` ``SSE`` ``SSE2`` ``SSE3`` ``SSSE3`` ``SSE41`` ``POPCNT`` ``SSE42`` ``AVX`` ``F16C``
+ ``AVX2`` ``SSE`` ``SSE2`` ``SSE3`` ``SSSE3`` ``SSE41`` ``POPCNT`` ``SSE42`` ``AVX`` ``F16C``
+ ``AVX512F`` ``SSE`` ``SSE2`` ``SSE3`` ``SSSE3`` ``SSE41`` ``POPCNT`` ``SSE42`` ``AVX`` ``F16C`` ``FMA3`` ``AVX2``
+ ``AVX512CD`` ``SSE`` ``SSE2`` ``SSE3`` ``SSSE3`` ``SSE41`` ``POPCNT`` ``SSE42`` ``AVX`` ``F16C`` ``FMA3`` ``AVX2`` ``AVX512F``
+ ============ =================================================================================================================
+
+x86 - Group names
+~~~~~~~~~~~~~~~~~
+.. table::
+ :align: left
+
+ ============== ===================================================== ===========================================================================================================================================================================
+ Name Gather Implies
+ ============== ===================================================== ===========================================================================================================================================================================
+ ``AVX512_KNL`` ``AVX512ER`` ``AVX512PF`` ``SSE`` ``SSE2`` ``SSE3`` ``SSSE3`` ``SSE41`` ``POPCNT`` ``SSE42`` ``AVX`` ``F16C`` ``FMA3`` ``AVX2`` ``AVX512F`` ``AVX512CD``
+ ``AVX512_KNM`` ``AVX5124FMAPS`` ``AVX5124VNNIW`` ``AVX512VPOPCNTDQ`` ``SSE`` ``SSE2`` ``SSE3`` ``SSSE3`` ``SSE41`` ``POPCNT`` ``SSE42`` ``AVX`` ``F16C`` ``FMA3`` ``AVX2`` ``AVX512F`` ``AVX512CD`` ``AVX512_KNL``
+ ``AVX512_SKX`` ``AVX512VL`` ``AVX512BW`` ``AVX512DQ`` ``SSE`` ``SSE2`` ``SSE3`` ``SSSE3`` ``SSE41`` ``POPCNT`` ``SSE42`` ``AVX`` ``F16C`` ``FMA3`` ``AVX2`` ``AVX512F`` ``AVX512CD``
+ ``AVX512_CLX`` ``AVX512VNNI`` ``SSE`` ``SSE2`` ``SSE3`` ``SSSE3`` ``SSE41`` ``POPCNT`` ``SSE42`` ``AVX`` ``F16C`` ``FMA3`` ``AVX2`` ``AVX512F`` ``AVX512CD`` ``AVX512_SKX``
+ ``AVX512_CNL`` ``AVX512IFMA`` ``AVX512VBMI`` ``SSE`` ``SSE2`` ``SSE3`` ``SSSE3`` ``SSE41`` ``POPCNT`` ``SSE42`` ``AVX`` ``F16C`` ``FMA3`` ``AVX2`` ``AVX512F`` ``AVX512CD`` ``AVX512_SKX``
+ ``AVX512_ICL`` ``AVX512VBMI2`` ``AVX512BITALG`` ``AVX512VPOPCNTDQ`` ``SSE`` ``SSE2`` ``SSE3`` ``SSSE3`` ``SSE41`` ``POPCNT`` ``SSE42`` ``AVX`` ``F16C`` ``FMA3`` ``AVX2`` ``AVX512F`` ``AVX512CD`` ``AVX512_SKX`` ``AVX512_CLX`` ``AVX512_CNL``
+ ============== ===================================================== ===========================================================================================================================================================================
+
+IBM/POWER big-endian - CPU feature names
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+.. table::
+ :align: left
+
+ ======== ================
+ Name Implies
+ ======== ================
+ ``VSX``
+ ``VSX2`` ``VSX``
+ ``VSX3`` ``VSX`` ``VSX2``
+ ======== ================
+
+IBM/POWER little-endian - CPU feature names
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+.. table::
+ :align: left
+
+ ======== ================
+ Name Implies
+ ======== ================
+ ``VSX`` ``VSX2``
+ ``VSX2`` ``VSX``
+ ``VSX3`` ``VSX`` ``VSX2``
+ ======== ================
+
+ARMv7/A32 - CPU feature names
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+.. table::
+ :align: left
+
+ ============== ===========================================================
+ Name Implies
+ ============== ===========================================================
+ ``NEON``
+ ``NEON_FP16`` ``NEON``
+ ``NEON_VFPV4`` ``NEON`` ``NEON_FP16``
+ ``ASIMD`` ``NEON`` ``NEON_FP16`` ``NEON_VFPV4``
+ ``ASIMDHP`` ``NEON`` ``NEON_FP16`` ``NEON_VFPV4`` ``ASIMD``
+ ``ASIMDDP`` ``NEON`` ``NEON_FP16`` ``NEON_VFPV4`` ``ASIMD``
+ ``ASIMDFHM`` ``NEON`` ``NEON_FP16`` ``NEON_VFPV4`` ``ASIMD`` ``ASIMDHP``
+ ============== ===========================================================
+
+ARMv8/A64 - CPU feature names
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+.. table::
+ :align: left
+
+ ============== ===========================================================
+ Name Implies
+ ============== ===========================================================
+ ``NEON`` ``NEON_FP16`` ``NEON_VFPV4`` ``ASIMD``
+ ``NEON_FP16`` ``NEON`` ``NEON_VFPV4`` ``ASIMD``
+ ``NEON_VFPV4`` ``NEON`` ``NEON_FP16`` ``ASIMD``
+ ``ASIMD`` ``NEON`` ``NEON_FP16`` ``NEON_VFPV4``
+ ``ASIMDHP`` ``NEON`` ``NEON_FP16`` ``NEON_VFPV4`` ``ASIMD``
+ ``ASIMDDP`` ``NEON`` ``NEON_FP16`` ``NEON_VFPV4`` ``ASIMD``
+ ``ASIMDFHM`` ``NEON`` ``NEON_FP16`` ``NEON_VFPV4`` ``ASIMD`` ``ASIMDHP``
+ ============== ===========================================================
+
diff --git a/doc/source/reference/simd/simd-optimizations.py b/doc/source/reference/simd/simd-optimizations.py
new file mode 100644
index 000000000..5d6da50e3
--- /dev/null
+++ b/doc/source/reference/simd/simd-optimizations.py
@@ -0,0 +1,190 @@
+"""
+Generate CPU features tables from CCompilerOpt
+"""
+from os import sys, path
+gen_path = path.dirname(path.realpath(__file__))
+#sys.path.append(path.abspath(path.join(gen_path, *([".."]*4), "numpy", "distutils")))
+#from ccompiler_opt import CCompilerOpt
+from numpy.distutils.ccompiler_opt import CCompilerOpt
+
+class FakeCCompilerOpt(CCompilerOpt):
+ fake_info = ""
+ # disable caching no need for it
+ conf_nocache = True
+ def __init__(self, *args, **kwargs):
+ no_cc = None
+ CCompilerOpt.__init__(self, no_cc, **kwargs)
+ def dist_compile(self, sources, flags, **kwargs):
+ return sources
+ def dist_info(self):
+ return FakeCCompilerOpt.fake_info
+ @staticmethod
+ def dist_log(*args, stderr=False):
+ # avoid printing
+ pass
+ def feature_test(self, name, force_flags=None):
+ # To speed up
+ return True
+
+ def gen_features_table(self, features, ignore_groups=True,
+ field_names=["Name", "Implies"],
+ fstyle=None, fstyle_implies=None, **kwargs):
+ rows = []
+ if fstyle is None:
+ fstyle = lambda ft: f'``{ft}``'
+ if fstyle_implies is None:
+ fstyle_implies = lambda origin, ft: fstyle(ft)
+ for f in self.feature_sorted(features):
+ is_group = "group" in self.feature_supported.get(f, {})
+ if ignore_groups and is_group:
+ continue
+ implies = self.feature_sorted(self.feature_implies(f))
+ implies = ' '.join([fstyle_implies(f, i) for i in implies])
+ rows.append([fstyle(f), implies])
+ if rows:
+ return self.gen_rst_table(field_names, rows, **kwargs)
+
+ def gen_gfeatures_table(self, features,
+ field_names=["Name", "Gather", "Implies"],
+ fstyle=None, fstyle_implies=None, **kwargs):
+ rows = []
+ if fstyle is None:
+ fstyle = lambda ft: f'``{ft}``'
+ if fstyle_implies is None:
+ fstyle_implies = lambda origin, ft: fstyle(ft)
+ for f in self.feature_sorted(features):
+ gather = self.feature_supported.get(f, {}).get("group", None)
+ if not gather:
+ continue
+ implies = self.feature_sorted(self.feature_implies(f))
+ implies = ' '.join([fstyle_implies(f, i) for i in implies])
+ gather = ' '.join([fstyle_implies(f, i) for i in gather])
+ rows.append([fstyle(f), gather, implies])
+ if rows:
+ return self.gen_rst_table(field_names, rows, **kwargs)
+
+ def gen_rst_table(self, field_names, rows, tab_size=4):
+ assert(not rows or len(field_names) == len(rows[0]))
+ rows.append(field_names)
+ fld_len = len(field_names)
+ cls_len = [max(len(c[i]) for c in rows) for i in range(fld_len)]
+ del rows[-1]
+ cformat = ' '.join('{:<%d}' % i for i in cls_len)
+ border = cformat.format(*['='*i for i in cls_len])
+
+ rows = [cformat.format(*row) for row in rows]
+ # header
+ rows = [border, cformat.format(*field_names), border] + rows
+ # footer
+ rows += [border]
+ # add left margin
+ rows = [(' ' * tab_size) + r for r in rows]
+ return '\n'.join(rows)
+
+def features_table_sections(name, ftable=None, gtable=None, tab_size=4):
+ tab = ' '*tab_size
+ content = ''
+ if ftable:
+ title = f"{name} - CPU feature names"
+ content = (
+ f"{title}\n{'~'*len(title)}"
+ f"\n.. table::\n{tab}:align: left\n\n"
+ f"{ftable}\n\n"
+ )
+ if gtable:
+ title = f"{name} - Group names"
+ content += (
+ f"{title}\n{'~'*len(title)}"
+ f"\n.. table::\n{tab}:align: left\n\n"
+ f"{gtable}\n\n"
+ )
+ return content
+
+def features_table(arch, cc="gcc", pretty_name=None, **kwargs):
+ FakeCCompilerOpt.fake_info = arch + cc
+ ccopt = FakeCCompilerOpt(cpu_baseline="max")
+ features = ccopt.cpu_baseline_names()
+ ftable = ccopt.gen_features_table(features, **kwargs)
+ gtable = ccopt.gen_gfeatures_table(features, **kwargs)
+
+ if not pretty_name:
+ pretty_name = arch + '/' + cc
+ return features_table_sections(pretty_name, ftable, gtable, **kwargs)
+
+def features_table_diff(arch, cc, cc_vs="gcc", pretty_name=None, **kwargs):
+ FakeCCompilerOpt.fake_info = arch + cc
+ ccopt = FakeCCompilerOpt(cpu_baseline="max")
+ fnames = ccopt.cpu_baseline_names()
+ features = {f:ccopt.feature_implies(f) for f in fnames}
+
+ FakeCCompilerOpt.fake_info = arch + cc_vs
+ ccopt_vs = FakeCCompilerOpt(cpu_baseline="max")
+ fnames_vs = ccopt_vs.cpu_baseline_names()
+ features_vs = {f:ccopt_vs.feature_implies(f) for f in fnames_vs}
+
+ common = set(fnames).intersection(fnames_vs)
+ extra_avl = set(fnames).difference(fnames_vs)
+ not_avl = set(fnames_vs).difference(fnames)
+ diff_impl_f = {f:features[f].difference(features_vs[f]) for f in common}
+ diff_impl = {k for k, v in diff_impl_f.items() if v}
+
+ fbold = lambda ft: f'**{ft}**' if ft in extra_avl else f'``{ft}``'
+ fbold_implies = lambda origin, ft: (
+ f'**{ft}**' if ft in diff_impl_f.get(origin, {}) else f'``{ft}``'
+ )
+ diff_all = diff_impl.union(extra_avl)
+ ftable = ccopt.gen_features_table(
+ diff_all, fstyle=fbold, fstyle_implies=fbold_implies, **kwargs
+ )
+ gtable = ccopt.gen_gfeatures_table(
+ diff_all, fstyle=fbold, fstyle_implies=fbold_implies, **kwargs
+ )
+ if not pretty_name:
+ pretty_name = arch + '/' + cc
+ content = features_table_sections(pretty_name, ftable, gtable, **kwargs)
+
+ if not_avl:
+ not_avl = ccopt_vs.feature_sorted(not_avl)
+ not_avl = ' '.join(not_avl)
+ content += (
+ ".. note::\n"
+ f" The following features aren't supported by {pretty_name}:\n"
+ f" **{not_avl}**\n\n"
+ )
+ return content
+
+if __name__ == '__main__':
+ pretty_names = {
+ "PPC64": "IBM/POWER big-endian",
+ "PPC64LE": "IBM/POWER little-endian",
+ "ARMHF": "ARMv7/A32",
+ "AARCH64": "ARMv8/A64",
+ "ICC": "Intel Compiler",
+ # "ICCW": "Intel Compiler msvc-like",
+ "MSVC": "Microsoft Visual C/C++"
+ }
+ with open(path.join(gen_path, 'simd-optimizations-tables.inc'), 'wt') as fd:
+ fd.write(f'.. generated via {__file__}\n\n')
+ for arch in (
+ ("x86", "PPC64", "PPC64LE", "ARMHF", "AARCH64")
+ ):
+ pretty_name = pretty_names.get(arch, arch)
+ table = features_table(arch=arch, pretty_name=pretty_name)
+ assert(table)
+ fd.write(table)
+
+ with open(path.join(gen_path, 'simd-optimizations-tables-diff.inc'), 'wt') as fd:
+ fd.write(f'.. generated via {__file__}\n\n')
+ for arch, cc_names in (
+ ("x86", ("clang", "ICC", "MSVC")),
+ ("PPC64", ("clang",)),
+ ("PPC64LE", ("clang",)),
+ ("ARMHF", ("clang",)),
+ ("AARCH64", ("clang",))
+ ):
+ arch_pname = pretty_names.get(arch, arch)
+ for cc in cc_names:
+ pretty_name = f"{arch_pname}::{pretty_names.get(cc, cc)}"
+ table = features_table_diff(arch=arch, cc=cc, pretty_name=pretty_name)
+ if table:
+ fd.write(table)
diff --git a/doc/source/reference/simd/simd-optimizations.rst b/doc/source/reference/simd/simd-optimizations.rst
new file mode 100644
index 000000000..59a4892b2
--- /dev/null
+++ b/doc/source/reference/simd/simd-optimizations.rst
@@ -0,0 +1,527 @@
+******************
+SIMD Optimizations
+******************
+
+NumPy provides a set of macros that define `Universal Intrinsics`_ to
+abstract out typical platform-specific intrinsics so SIMD code needs to be
+written only once. There are three layers:
+
+- Code is *written* using the universal intrinsic macros, with guards that
+ will enable use of the macros only when the compiler recognizes them.
+ In NumPy, these are used to construct multiple ufunc loops. Current policy is
+ to create three loops: One loop is the default and uses no intrinsics. One
+ uses the minimum intrinsics required on the architecture. And the third is
+ written using the maximum set of intrinsics possible.
+- At *compile* time, a distutils command is used to define the minimum and
+ maximum features to support, based on user choice and compiler support. The
+ appropriate macros are overlayed with the platform / architecture intrinsics,
+ and the three loops are compiled.
+- At *runtime import*, the CPU is probed for the set of supported intrinsic
+ features. A mechanism is used to grab the pointer to the most appropriate
+ function, and this will be the one called for the function.
+
+
+Build options for compilation
+=============================
+
+- ``--cpu-baseline``: minimal set of required optimizations. Default
+ value is ``min`` which provides the minimum CPU features that can
+ safely run on a wide range of platforms within the processor family.
+
+- ``--cpu-dispatch``: dispatched set of additional optimizations.
+ The default value is ``max -xop -fma4`` which enables all CPU
+ features, except for AMD legacy features(in case of X86).
+
+The command arguments are available in ``build``, ``build_clib``, and
+``build_ext``.
+if ``build_clib`` or ``build_ext`` are not specified by the user, the arguments of
+``build`` will be used instead, which also holds the default values.
+
+Optimization names can be CPU features or groups of features that gather
+several features or :ref:`special options <special-options>` to perform a series of procedures.
+
+
+The following tables show the current supported optimizations sorted from the lowest to the highest interest.
+
+.. include:: simd-optimizations-tables.inc
+
+----
+
+.. _tables-diff:
+
+While the above tables are based on the GCC Compiler, the following tables showing the differences in the
+other compilers:
+
+.. include:: simd-optimizations-tables-diff.inc
+
+.. _special-options:
+
+Special options
+~~~~~~~~~~~~~~~
+
+- ``NONE``: enable no features
+
+- ``NATIVE``: Enables all CPU features that supported by the current
+ machine, this operation is based on the compiler flags (``-march=native, -xHost, /QxHost``)
+
+- ``MIN``: Enables the minimum CPU features that can safely run on a wide range of platforms:
+
+ .. table::
+ :align: left
+
+ ====================================== =======================================
+ For Arch Returns
+ ====================================== =======================================
+ ``x86`` ``SSE`` ``SSE2``
+ ``x86`` ``64-bit mode`` ``SSE`` ``SSE2`` ``SSE3``
+ ``IBM/POWER`` ``big-endian mode`` ``NONE``
+ ``IBM/POWER`` ``little-endian mode`` ``VSX`` ``VSX2``
+ ``ARMHF`` ``NONE``
+ ``ARM64`` ``AARCH64`` ``NEON`` ``NEON_FP16`` ``NEON_VFPV4``
+ ``ASIMD``
+ ====================================== =======================================
+
+- ``MAX``: Enables all supported CPU features by the Compiler and platform.
+
+- ``Operators-/+``: remove or add features, useful with options ``MAX``, ``MIN`` and ``NATIVE``.
+
+NOTES
+~~~~~~~~~~~~~
+- CPU features and other options are case-insensitive.
+
+- The order of the requsted optimizations doesn't matter.
+
+- Either commas or spaces can be used as a separator, e.g. ``--cpu-dispatch``\ =
+ "avx2 avx512f" or ``--cpu-dispatch``\ = "avx2, avx512f" both work, but the
+ arguments must be enclosed in quotes.
+
+- The operand ``+`` is only added for nominal reasons, For example:
+ ``--cpu-basline= "min avx2"`` is equivalent to ``--cpu-basline="min + avx2"``.
+ ``--cpu-basline="min,avx2"`` is equivalent to ``--cpu-basline`="min,+avx2"``
+
+- If the CPU feature is not supported by the user platform or
+ compiler, it will be skipped rather than raising a fatal error.
+
+- Any specified CPU feature to ``--cpu-dispatch`` will be skipped if
+ it's part of CPU baseline features
+
+- The ``--cpu-baseline`` argument force-enables implied features,
+ e.g. ``--cpu-baseline``\ ="sse42" is equivalent to
+ ``--cpu-baseline``\ ="sse sse2 sse3 ssse3 sse41 popcnt sse42"
+
+- The value of ``--cpu-baseline`` will be treated as "native" if
+ compiler native flag ``-march=native`` or ``-xHost`` or ``QxHost`` is
+ enabled through environment variable ``CFLAGS``
+
+- The validation process for the requsted optimizations when it comes to
+ ``--cpu-baseline`` isn't strict. For example, if the user requested
+ ``AVX2`` but the compiler doesn't support it then we just skip it and return
+ the maximum optimization that the compiler can handle depending on the
+ implied features of ``AVX2``, let us assume ``AVX``.
+
+- The user should always check the final report through the build log
+ to verify the enabled features.
+
+Special cases
+~~~~~~~~~~~~~
+
+**Interrelated CPU features**: Some exceptional conditions force us to link some features together when it come to certain compilers or architectures, resulting in the impossibility of building them separately.
+These conditions can be divided into two parts, as follows:
+
+- **Architectural compatibility**: The need to align certain CPU features that are assured
+ to be supported by successive generations of the same architecture, for example:
+
+ - On ppc64le `VSX(ISA 2.06)` and `VSX2(ISA 2.07)` both imply one another since the
+ first generation that supports little-endian mode is Power-8`(ISA 2.07)`
+ - On AArch64 `NEON` `FP16` `VFPV4` `ASIMD` implies each other since they are part of the
+ hardware baseline.
+
+- **Compilation compatibility**: Not all **C/C++** compilers provide independent support for all CPU
+ features. For example, **Intel**'s compiler doesn't provide separated flags for `AVX2` and `FMA3`,
+ it makes sense since all Intel CPUs that comes with `AVX2` also support `FMA3` and vice versa,
+ but this approach is incompatible with other **x86** CPUs from **AMD** or **VIA**.
+ Therefore, there are differences in the depiction of CPU features between the C/C++ compilers,
+ as shown in the :ref:`tables above <tables-diff>`.
+
+
+Behaviors and Errors
+~~~~~~~~~~~~~~~~~~~~
+
+
+
+Usage and Examples
+~~~~~~~~~~~~~~~~~~
+
+Report and Trace
+~~~~~~~~~~~~~~~~
+
+Understanding CPU Dispatching, How the NumPy dispatcher works?
+==============================================================
+
+NumPy dispatcher is based on multi-source compiling, which means taking
+a certain source and compiling it multiple times with different compiler
+flags and also with different **C** definitions that affect the code
+paths to enable certain instruction-sets for each compiled object
+depending on the required optimizations, then combining the returned
+objects together.
+
+.. figure:: ../figures/opt-infra.png
+
+This mechanism should support all compilers and it doesn't require any
+compiler-specific extension, but at the same time it is adds a few steps to
+normal compilation that are explained as follows:
+
+1- Configuration
+~~~~~~~~~~~~~~~~
+
+Configuring the required optimization by the user before starting to build the
+source files via the two command arguments as explained above:
+
+- ``--cpu-baseline``: minimal set of required optimizations.
+
+- ``--cpu-dispatch``: dispatched set of additional optimizations.
+
+
+2- Discovering the environment
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+In this part, we check the compiler and platform architecture
+and cache some of the intermediary results to speed up rebuilding.
+
+3- Validating the requested optimizations
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+By testing them against the compiler, and seeing what the compiler can
+support according to the requested optimizations.
+
+4- Generating the main configuration header
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The generated header ``_cpu_dispatch.h`` contains all the definitions and
+headers of instruction-sets for the required optimizations that have been
+validated during the previous step.
+
+It also contains extra C definitions that are used for defining NumPy's
+Python-level module attributes ``__cpu_baseline__`` and ``__cpu_dispaٍtch__``.
+
+**What is in this header?**
+
+The example header was dynamically generated by gcc on an X86 machine.
+The compiler supports ``--cpu-baseline="sse sse2 sse3"`` and
+``--cpu-dispatch="ssse3 sse41"``, and the result is below.
+
+.. code:: c
+
+ // The header should be located at numpy/numpy/core/src/common/_cpu_dispatch.h
+ /**NOTE
+ ** C definitions prefixed with "NPY_HAVE_" represent
+ ** the required optimzations.
+ **
+ ** C definitions prefixed with 'NPY__CPU_TARGET_' are protected and
+ ** shouldn't be used by any NumPy C sources.
+ */
+ /******* baseline features *******/
+ /** SSE **/
+ #define NPY_HAVE_SSE 1
+ #include <xmmintrin.h>
+ /** SSE2 **/
+ #define NPY_HAVE_SSE2 1
+ #include <emmintrin.h>
+ /** SSE3 **/
+ #define NPY_HAVE_SSE3 1
+ #include <pmmintrin.h>
+
+ /******* dispatch-able features *******/
+ #ifdef NPY__CPU_TARGET_SSSE3
+ /** SSSE3 **/
+ #define NPY_HAVE_SSSE3 1
+ #include <tmmintrin.h>
+ #endif
+ #ifdef NPY__CPU_TARGET_SSE41
+ /** SSE41 **/
+ #define NPY_HAVE_SSE41 1
+ #include <smmintrin.h>
+ #endif
+
+**Baseline features** are the minimal set of required optimizations configured
+via ``--cpu-baseline``. They have no preprocessor guards and they're
+always on, which means they can be used in any source.
+
+Does this mean NumPy's infrastructure passes the compiler's flags of
+baseline features to all sources?
+
+Definitely, yes. But the :ref:`dispatch-able sources <dispatchable-sources>` are
+treated differently.
+
+What if the user specifies certain **baseline features** during the
+build but at runtime the machine doesn't support even these
+features? Will the compiled code be called via one of these definitions, or
+maybe the compiler itself auto-generated/vectorized certain piece of code
+based on the provided command line compiler flags?
+
+During the loading of the NumPy module, there's a validation step
+which detects this behavior. It will raise a Python runtime error to inform the
+user. This is to prevent the CPU reaching an illegal instruction error causing
+a segfault.
+
+**Dispatch-able features** are our dispatched set of additional optimizations
+that were configured via ``--cpu-dispatch``. They are not activated by
+default and are always guarded by other C definitions prefixed with
+``NPY__CPU_TARGET_``. C definitions ``NPY__CPU_TARGET_`` are only
+enabled within **dispatch-able sources**.
+
+.. _dispatchable-sources:
+
+5- Dispatch-able sources and configuration statements
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Dispatch-able sources are special **C** files that can be compiled multiple
+times with different compiler flags and also with different **C**
+definitions. These affect code paths to enable certain
+instruction-sets for each compiled object according to "**the
+configuration statements**" that must be declared between a **C**
+comment\ ``(/**/)`` and start with a special mark **@targets** at the
+top of each dispatch-able source. At the same time, dispatch-able
+sources will be treated as normal **C** sources if the optimization was
+disabled by the command argument ``--disable-optimization`` .
+
+**What are configuration statements?**
+
+Configuration statements are sort of keywords combined together to
+determine the required optimization for the dispatch-able source.
+
+Example:
+
+.. code:: c
+
+ /*@targets avx2 avx512f vsx2 vsx3 asimd asimdhp */
+ // C code
+
+The keywords mainly represent the additional optimizations configured
+through ``--cpu-dispatch``, but it can also represent other options such as:
+
+- Target groups: pre-configured configuration statements used for
+ managing the required optimizations from outside the dispatch-able source.
+
+- Policies: collections of options used for changing the default
+ behaviors or forcing the compilers to perform certain things.
+
+- "baseline": a unique keyword represents the minimal optimizations
+ that configured through ``--cpu-baseline``
+
+**Numpy's infrastructure handles dispatch-able sources in four steps**:
+
+- **(A) Recognition**: Just like source templates and F2PY, the
+ dispatch-able sources requires a special extension ``*.dispatch.c``
+ to mark C dispatch-able source files, and for C++
+ ``*.dispatch.cpp`` or ``*.dispatch.cxx``
+ **NOTE**: C++ not supported yet.
+
+- **(B) Parsing and validating**: In this step, the
+ dispatch-able sources that had been filtered by the previous step
+ are parsed and validated by the configuration statements for each one
+ of them one by one in order to determine the required optimizations.
+
+- **(C) Wrapping**: This is the approach taken by NumPy's
+ infrastructure, which has proved to be sufficiently flexible in order
+ to compile a single source multiple times with different **C**
+ definitions and flags that affect the code paths. The process is
+ achieved by creating a temporary **C** source for each required
+ optimization that related to the additional optimization, which
+ contains the declarations of the **C** definitions and includes the
+ involved source via the **C** directive **#include**. For more
+ clarification take a look at the following code for AVX512F :
+
+ .. code:: c
+
+ /*
+ * this definition is used by NumPy utilities as suffixes for the
+ * exported symbols
+ */
+ #define NPY__CPU_TARGET_CURRENT AVX512F
+ /*
+ * The following definitions enable
+ * definitions of the dispatch-able features that are defined within the main
+ * configuration header. These are definitions for the implied features.
+ */
+ #define NPY__CPU_TARGET_SSE
+ #define NPY__CPU_TARGET_SSE2
+ #define NPY__CPU_TARGET_SSE3
+ #define NPY__CPU_TARGET_SSSE3
+ #define NPY__CPU_TARGET_SSE41
+ #define NPY__CPU_TARGET_POPCNT
+ #define NPY__CPU_TARGET_SSE42
+ #define NPY__CPU_TARGET_AVX
+ #define NPY__CPU_TARGET_F16C
+ #define NPY__CPU_TARGET_FMA3
+ #define NPY__CPU_TARGET_AVX2
+ #define NPY__CPU_TARGET_AVX512F
+ // our dispatch-able source
+ #include "/the/absuolate/path/of/hello.dispatch.c"
+
+- **(D) Dispatch-able configuration header**: The infrastructure
+ generates a config header for each dispatch-able source, this header
+ mainly contains two abstract **C** macros used for identifying the
+ generated objects, so they can be used for runtime dispatching
+ certain symbols from the generated objects by any **C** source. It is
+ also used for forward declarations.
+
+ The generated header takes the name of the dispatch-able source after
+ excluding the extension and replace it with '**.h**', for example
+ assume we have a dispatch-able source called **hello.dispatch.c** and
+ contains the following:
+
+ .. code:: c
+
+ // hello.dispatch.c
+ /*@targets baseline sse42 avx512f */
+ #include <stdio.h>
+ #include "numpy/utils.h" // NPY_CAT, NPY_TOSTR
+
+ #ifndef NPY__CPU_TARGET_CURRENT
+ // wrapping the dispatch-able source only happens to the addtional optimizations
+ // but if the keyword 'baseline' provided within the configuration statments,
+ // the infrastructure will add extra compiling for the dispatch-able source by
+ // passing it as-is to the compiler without any changes.
+ #define CURRENT_TARGET(X) X
+ #define NPY__CPU_TARGET_CURRENT baseline // for printing only
+ #else
+ // since we reach to this point, that's mean we're dealing with
+ // the addtional optimizations, so it could be SSE42 or AVX512F
+ #define CURRENT_TARGET(X) NPY_CAT(NPY_CAT(X, _), NPY__CPU_TARGET_CURRENT)
+ #endif
+ // Macro 'CURRENT_TARGET' adding the current target as suffux to the exported symbols,
+ // to avoid linking duplications, NumPy already has a macro called
+ // 'NPY_CPU_DISPATCH_CURFX' similar to it, located at
+ // numpy/numpy/core/src/common/npy_cpu_dispatch.h
+ // NOTE: we tend to not adding suffixes to the baseline exported symbols
+ void CURRENT_TARGET(simd_whoami)(const char *extra_info)
+ {
+ printf("I'm " NPY_TOSTR(NPY__CPU_TARGET_CURRENT) ", %s\n", extra_info);
+ }
+
+ Now assume you attached **hello.dispatch.c** to the source tree, then
+ the infrastructure should generate a temporary config header called
+ **hello.dispatch.h** that can be reached by any source in the source
+ tree, and it should contain the following code :
+
+ .. code:: c
+
+ #ifndef NPY__CPU_DISPATCH_EXPAND_
+ // To expand the macro calls in this header
+ #define NPY__CPU_DISPATCH_EXPAND_(X) X
+ #endif
+ // Undefining the following macros, due to the possibility of including config headers
+ // multiple times within the same source and since each config header represents
+ // different required optimizations according to the specified configuration
+ // statements in the dispatch-able source that derived from it.
+ #undef NPY__CPU_DISPATCH_BASELINE_CALL
+ #undef NPY__CPU_DISPATCH_CALL
+ // nothing strange here, just a normal preprocessor callback
+ // enabled only if 'baseline' spesfied withiin the configration statments
+ #define NPY__CPU_DISPATCH_BASELINE_CALL(CB, ...) \
+ NPY__CPU_DISPATCH_EXPAND_(CB(__VA_ARGS__))
+ // 'NPY__CPU_DISPATCH_CALL' is an abstract macro is used for dispatching
+ // the required optimizations that specified within the configuration statements.
+ //
+ // @param CHK, Expected a macro that can be used to detect CPU features
+ // in runtime, which takes a CPU feature name without string quotes and
+ // returns the testing result in a shape of boolean value.
+ // NumPy already has macro called "NPY_CPU_HAVE", which fit this requirment.
+ //
+ // @param CB, a callback macro that expected to be called multiple times depending
+ // on the required optimizations, the callback should receive the following arguments:
+ // 1- The pending calls of @param CHK filled up with the required CPU features,
+ // that need to be tested first in runtime before executing call belong to
+ // the compiled object.
+ // 2- The required optimization name, same as in 'NPY__CPU_TARGET_CURRENT'
+ // 3- Extra arguments in the macro itself
+ //
+ // By default the callback calls are sorted depending on the highest interest
+ // unless the policy "$keep_sort" was in place within the configuration statements
+ // see "Dive into the CPU dispatcher" for more clarification.
+ #define NPY__CPU_DISPATCH_CALL(CHK, CB, ...) \
+ NPY__CPU_DISPATCH_EXPAND_(CB((CHK(AVX512F)), AVX512F, __VA_ARGS__)) \
+ NPY__CPU_DISPATCH_EXPAND_(CB((CHK(SSE)&&CHK(SSE2)&&CHK(SSE3)&&CHK(SSSE3)&&CHK(SSE41)), SSE41, __VA_ARGS__))
+
+ An example of using the config header in light of the above:
+
+ .. code:: c
+
+ // NOTE: The following macros are only defined for demonstration purposes only.
+ // NumPy already has a collections of macros located at
+ // numpy/numpy/core/src/common/npy_cpu_dispatch.h, that covers all dispatching
+ // and declarations scenarios.
+
+ #include "numpy/npy_cpu_features.h" // NPY_CPU_HAVE
+ #include "numpy/utils.h" // NPY_CAT, NPY_EXPAND
+
+ // An example for setting a macro that calls all the exported symbols at once
+ // after checking if they're supported by the running machine.
+ #define DISPATCH_CALL_ALL(FN, ARGS) \
+ NPY__CPU_DISPATCH_CALL(NPY_CPU_HAVE, DISPATCH_CALL_ALL_CB, FN, ARGS) \
+ NPY__CPU_DISPATCH_BASELINE_CALL(DISPATCH_CALL_BASELINE_ALL_CB, FN, ARGS)
+ // The preprocessor callbacks.
+ // The same suffixes as we define it in the dispatch-able source.
+ #define DISPATCH_CALL_ALL_CB(CHECK, TARGET_NAME, FN, ARGS) \
+ if (CHECK) { NPY_CAT(NPY_CAT(FN, _), TARGET_NAME) ARGS; }
+ #define DISPATCH_CALL_BASELINE_ALL_CB(FN, ARGS) \
+ FN NPY_EXPAND(ARGS);
+
+ // An example for setting a macro that calls the exported symbols of highest
+ // interest optimization, after checking if they're supported by the running machine.
+ #define DISPATCH_CALL_HIGH(FN, ARGS) \
+ if (0) {} \
+ NPY__CPU_DISPATCH_CALL(NPY_CPU_HAVE, DISPATCH_CALL_HIGH_CB, FN, ARGS) \
+ NPY__CPU_DISPATCH_BASELINE_CALL(DISPATCH_CALL_BASELINE_HIGH_CB, FN, ARGS)
+ // The preprocessor callbacks
+ // The same suffixes as we define it in the dispatch-able source.
+ #define DISPATCH_CALL_HIGH_CB(CHECK, TARGET_NAME, FN, ARGS) \
+ else if (CHECK) { NPY_CAT(NPY_CAT(FN, _), TARGET_NAME) ARGS; }
+ #define DISPATCH_CALL_BASELINE_HIGH_CB(FN, ARGS) \
+ else { FN NPY_EXPAND(ARGS); }
+
+ // NumPy has a macro called 'NPY_CPU_DISPATCH_DECLARE' can be used
+ // for forward declrations any kind of prototypes based on
+ // 'NPY__CPU_DISPATCH_CALL' and 'NPY__CPU_DISPATCH_BASELINE_CALL'.
+ // However in this example, we just handle it manually.
+ void simd_whoami(const char *extra_info);
+ void simd_whoami_AVX512F(const char *extra_info);
+ void simd_whoami_SSE41(const char *extra_info);
+
+ void trigger_me(void)
+ {
+ // bring the auto-gernreated config header
+ // which contains config macros 'NPY__CPU_DISPATCH_CALL' and
+ // 'NPY__CPU_DISPATCH_BASELINE_CALL'.
+ // it highely recomaned to include the config header before exectuing
+ // the dispatching macros in case if there's another header in the scope.
+ #include "hello.dispatch.h"
+ DISPATCH_CALL_ALL(simd_whoami, ("all"))
+ DISPATCH_CALL_HIGH(simd_whoami, ("the highest interest"))
+ // An example of including multiple config headers in the same source
+ // #include "hello2.dispatch.h"
+ // DISPATCH_CALL_HIGH(another_function, ("the highest interest"))
+ }
+
+
+Dive into the CPU dispatcher
+============================
+
+The baseline
+~~~~~~~~~~~~
+
+Dispatcher
+~~~~~~~~~~
+
+Groups and Policies
+~~~~~~~~~~~~~~~~~~~
+
+Examples
+~~~~~~~~
+
+Report and Trace
+~~~~~~~~~~~~~~~~
+
+
+.. _`Universal Intrinsics`: https://numpy.org/neps/nep-0038-SIMD-optimizations.html
diff --git a/doc/source/reference/typing.rst b/doc/source/reference/typing.rst
new file mode 100644
index 000000000..c948bc4be
--- /dev/null
+++ b/doc/source/reference/typing.rst
@@ -0,0 +1,2 @@
+.. _typing:
+.. automodule:: numpy.typing
diff --git a/doc/source/reference/ufuncs.rst b/doc/source/reference/ufuncs.rst
index 6d58d1a6d..06fbe28dd 100644
--- a/doc/source/reference/ufuncs.rst
+++ b/doc/source/reference/ufuncs.rst
@@ -1,5 +1,7 @@
.. sectionauthor:: adapted from "Guide to NumPy" by Travis E. Oliphant
+.. currentmodule:: numpy
+
.. _ufuncs:
************************************
@@ -8,8 +10,6 @@ Universal functions (:class:`ufunc`)
.. note: XXX: section might need to be made more reference-guideish...
-.. currentmodule:: numpy
-
.. index: ufunc, universal function, arithmetic, operation
A universal function (or :term:`ufunc` for short) is a function that
@@ -109,7 +109,7 @@ The output of the ufunc (and its methods) is not necessarily an
:class:`ndarray`, if all input arguments are not :class:`ndarrays <ndarray>`.
Indeed, if any input defines an :obj:`~class.__array_ufunc__` method,
control will be passed completely to that function, i.e., the ufunc is
-`overridden <ufuncs.overrides>`_.
+:ref:`overridden <ufuncs.overrides>`.
If none of the inputs overrides the ufunc, then
all output arrays will be passed to the :obj:`~class.__array_prepare__` and
@@ -298,6 +298,11 @@ them by defining certain special methods. For details, see
:class:`ufunc`
==============
+.. autosummary::
+ :toctree: generated/
+
+ numpy.ufunc
+
.. _ufuncs.kwargs:
Optional keyword arguments
@@ -335,6 +340,19 @@ advanced usage and will not typically be used.
Note that outputs not explicitly filled are left with their
uninitialized values.
+ .. versionadded:: 1.13
+
+ Operations where ufunc input and output operands have memory overlap are
+ defined to be the same as for equivalent operations where there
+ is no memory overlap. Operations affected make temporary copies
+ as needed to eliminate data dependency. As detecting these cases
+ is computationally expensive, a heuristic is used, which may in rare
+ cases result in needless temporary copies. For operations where the
+ data dependency is simple enough for the heuristic to analyze,
+ temporary copies will not be made even if the arrays overlap, if it
+ can be deduced copies are not necessary. As an example,
+ ``np.add(a, b, out=a)`` will not involve copies.
+
*where*
.. versionadded:: 1.7
diff --git a/doc/source/release.rst b/doc/source/release.rst
index 5a890178c..3ef1b06bd 100644
--- a/doc/source/release.rst
+++ b/doc/source/release.rst
@@ -6,6 +6,10 @@ Release Notes
:maxdepth: 3
1.20.0 <release/1.20.0-notes>
+ 1.19.4 <release/1.19.4-notes>
+ 1.19.3 <release/1.19.3-notes>
+ 1.19.2 <release/1.19.2-notes>
+ 1.19.1 <release/1.19.1-notes>
1.19.0 <release/1.19.0-notes>
1.18.4 <release/1.18.4-notes>
1.18.3 <release/1.18.3-notes>
diff --git a/doc/source/release/1.16.0-notes.rst b/doc/source/release/1.16.0-notes.rst
index e78e270f4..17d24160a 100644
--- a/doc/source/release/1.16.0-notes.rst
+++ b/doc/source/release/1.16.0-notes.rst
@@ -170,8 +170,8 @@ See the "accessing multiple fields" section of the
C API changes
=============
-The :c:data:`NPY_API_VERSION` was incremented to 0x0000D, due to the addition
-of:
+The :c:data:`NPY_FEATURE_VERSION` was incremented to 0x0000D, due to
+the addition of:
* :c:member:`PyUFuncObject.core_dim_flags`
* :c:member:`PyUFuncObject.core_dim_sizes`
diff --git a/doc/source/release/1.17.0-notes.rst b/doc/source/release/1.17.0-notes.rst
index a93eb2186..4bdc6105f 100644
--- a/doc/source/release/1.17.0-notes.rst
+++ b/doc/source/release/1.17.0-notes.rst
@@ -171,15 +171,15 @@ The functions `load`, and ``lib.format.read_array`` take an
`CVE-2019-6446 <https://nvd.nist.gov/vuln/detail/CVE-2019-6446>`_.
-.. currentmodule:: numpy.random.mtrand
+.. currentmodule:: numpy.random
Potential changes to the random stream in old random module
-----------------------------------------------------------
Due to bugs in the application of ``log`` to random floating point numbers,
the stream may change when sampling from `~RandomState.beta`, `~RandomState.binomial`,
`~RandomState.laplace`, `~RandomState.logistic`, `~RandomState.logseries` or
-`~RandomState.multinomial` if a ``0`` is generated in the underlying `MT19937
-<~numpy.random.mt11937.MT19937>` random stream. There is a ``1`` in
+`~RandomState.multinomial` if a ``0`` is generated in the underlying `MT19937`
+random stream. There is a ``1`` in
:math:`10^{53}` chance of this occurring, so the probability that the stream
changes for any given seed is extremely small. If a ``0`` is encountered in the
underlying generator, then the incorrect value produced (either `numpy.inf` or
@@ -559,4 +559,3 @@ Structured arrays indexed with non-existent fields raise ``KeyError`` not ``Valu
----------------------------------------------------------------------------------------
``arr['bad_field']`` on a structured type raises ``KeyError``, for consistency
with ``dict['bad_field']``.
-
diff --git a/doc/source/release/1.19.0-notes.rst b/doc/source/release/1.19.0-notes.rst
index ea0ac6193..8f5c2c0ce 100644
--- a/doc/source/release/1.19.0-notes.rst
+++ b/doc/source/release/1.19.0-notes.rst
@@ -1,113 +1,47 @@
+.. currentmodule:: numpy
+
==========================
NumPy 1.19.0 Release Notes
==========================
+This NumPy release is marked by the removal of much technical debt: support for
+Python 2 has been removed, many deprecations have been expired, and
+documentation has been improved. The polishing of the random module continues
+apace with bug fixes and better usability from Cython.
+
+The Python versions supported for this release are 3.6-3.8. Downstream
+developers should use Cython >= 0.29.16 for Python 3.8 support and
+OpenBLAS >= 3.7 to avoid problems on the Skylake architecture.
Highlights
==========
-* Code compatibility with Python versions < 3.5 (including Python 2) was
- dropped from both the python and C code. The shims in numpy.compat will
+* Code compatibility with Python versions < 3.6 (including Python 2) was
+ dropped from both the python and C code. The shims in ``numpy.compat`` will
remain to support third-party packages, but they may be deprecated in a
- future release.
+ future release. Note that 1.19.x will *not* compile with earlier versions of
+ Python due to the use of f-strings.
(`gh-15233 <https://github.com/numpy/numpy/pull/15233>`__)
-Deprecations
-============
-
-
-Deprecate automatic ``dtype=object`` for ragged input
------------------------------------------------------
-Calling ``np.array([[1, [1, 2, 3]])`` will issue a ``DeprecationWarning`` as
-per `NEP 34`_. Users should explicitly use ``dtype=object`` to avoid the
-warning.
-
-.. _`NEP 34`: https://numpy.org/neps/nep-0034.html
-
-(`gh-15119 <https://github.com/numpy/numpy/pull/15119>`__)
-
-Passing ``shape=0`` to factory functions in ``numpy.rec`` is deprecated
------------------------------------------------------------------------
-
-``0`` is treated as a special case and is aliased to ``None`` in the functions:
-
-* `numpy.core.records.fromarrays`
-* `numpy.core.records.fromrecords`
-* `numpy.core.records.fromstring`
-* `numpy.core.records.fromfile`
-
-In future, ``0`` will not be special cased, and will be treated as an array
-length like any other integer.
-
-(`gh-15217 <https://github.com/numpy/numpy/pull/15217>`__)
-
-Deprecation of probably unused C-API functions
-----------------------------------------------
-The following C-API functions are probably unused and have been
-deprecated:
-
-* ``PyArray_GetArrayParamsFromObject``
-* ``PyUFunc_GenericFunction``
-* ``PyUFunc_SetUsesArraysAsData``
-
-In most cases ``PyArray_GetArrayParamsFromObject`` should be replaced
-by converting to an array, while ``PyUFunc_GenericFunction`` can be
-replaced with ``PyObject_Call`` (see documentation for details).
-
-(`gh-15427 <https://github.com/numpy/numpy/pull/15427>`__)
-
-Converting certain types to dtypes is Deprecated
-------------------------------------------------
-The super classes of scalar types, such as ``np.integer``, ``np.generic``,
-or ``np.inexact`` will now give a deprecation warning when converted
-to a dtype (or used in a dtype keyword argument).
-The reason for this is that `np.integer` is converted to ``np.int_``,
-while it would be expected to represent *any* integer (e.g. also
-``int8``, ``int16``, etc.
-For example, ``dtype=np.floating`` is currently identical to
-``dtype=np.float64``, even though also ``np.float32`` is a subclass of
-``np.floating``.
-
-(`gh-15534 <https://github.com/numpy/numpy/pull/15534>`__)
-
-Deprecation of `round` for ``np.complexfloating`` scalars
------------------------------------------------------------
-
-Output of the ``__round__`` dunder method and consequently the Python built-in
-`round` has been deprecated on complex scalars. This does not affect
-`np.round`.
-
-(`gh-15840 <https://github.com/numpy/numpy/pull/15840>`__)
-
-``numpy.ndarray.tostring()`` is deprecated in favor of ``tobytes()``
---------------------------------------------------------------------
-`~numpy.ndarray.tobytes` has existed since the 1.9 release, but until this
-release `~numpy.ndarray.tostring` emitted no warning. The change to emit a
-warning brings NumPy in line with the builtin `array.array` methods of the
-same name.
-
-(`gh-15867 <https://github.com/numpy/numpy/pull/15867>`__)
-
-
Expired deprecations
====================
-`numpy.insert` and `numpy.delete` can no longer be passed an axis on 0d arrays
-------------------------------------------------------------------------------
+``numpy.insert`` and ``numpy.delete`` can no longer be passed an axis on 0d arrays
+----------------------------------------------------------------------------------
This concludes a deprecation from 1.9, where when an ``axis`` argument was
-passed to a call to `~numpy.insert` and `~numpy.delete` on a 0d array, the
+passed to a call to ``~numpy.insert`` and ``~numpy.delete`` on a 0d array, the
``axis`` and ``obj`` argument and indices would be completely ignored.
In these cases, ``insert(arr, "nonsense", 42, axis=0)`` would actually overwrite the
entire array, while ``delete(arr, "nonsense", axis=0)`` would be ``arr.copy()``
-Now passing ``axis`` on a 0d array raises `~numpy.AxisError`.
+Now passing ``axis`` on a 0d array raises ``~numpy.AxisError``.
(`gh-15802 <https://github.com/numpy/numpy/pull/15802>`__)
-`numpy.delete` no longer ignores out-of-bounds indices
-------------------------------------------------------
+``numpy.delete`` no longer ignores out-of-bounds indices
+--------------------------------------------------------
This concludes deprecations from 1.8 and 1.9, where ``np.delete`` would ignore
both negative and out-of-bounds items in a sequence of indices. This was at
odds with its behavior when passed a single index.
@@ -117,8 +51,8 @@ end.
(`gh-15804 <https://github.com/numpy/numpy/pull/15804>`__)
-`numpy.insert` and `numpy.delete` no longer accept non-integral indices
------------------------------------------------------------------------
+``numpy.insert`` and ``numpy.delete`` no longer accept non-integral indices
+---------------------------------------------------------------------------
This concludes a deprecation from 1.9, where sequences of non-integers indices
were allowed and cast to integers. Now passing sequences of non-integral
indices raises ``IndexError``, just like it does when passing a single
@@ -126,8 +60,8 @@ non-integral scalar.
(`gh-15805 <https://github.com/numpy/numpy/pull/15805>`__)
-`numpy.delete` no longer casts boolean indices to integers
-----------------------------------------------------------
+``numpy.delete`` no longer casts boolean indices to integers
+------------------------------------------------------------
This concludes a deprecation from 1.8, where ``np.delete`` would cast boolean
arrays and scalars passed as an index argument into integer indices. The
behavior now is to treat boolean arrays as a mask, and to raise an error
@@ -139,19 +73,18 @@ on boolean scalars.
Compatibility notes
===================
-Changed random variate stream from `numpy.random.Generator.dirichlet`
----------------------------------------------------------------------
+Changed random variate stream from ``numpy.random.Generator.dirichlet``
+-----------------------------------------------------------------------
A bug in the generation of random variates for the Dirichlet distribution
-with small `alpha` values was fixed by using a different algorithm when
+with small 'alpha' values was fixed by using a different algorithm when
``max(alpha) < 0.1``. Because of the change, the stream of variates
-generated by `dirichlet` in this case will be different from previous
+generated by ``dirichlet`` in this case will be different from previous
releases.
(`gh-14924 <https://github.com/numpy/numpy/pull/14924>`__)
Scalar promotion in ``PyArray_ConvertToCommonType``
---------------------------------------------------
-
The promotion of mixed scalars and arrays in ``PyArray_ConvertToCommonType``
has been changed to adhere to those used by ``np.result_type``.
This means that input such as ``(1000, np.array([1], dtype=np.uint8)))``
@@ -171,10 +104,9 @@ will be given.
(`gh-14942 <https://github.com/numpy/numpy/pull/14942>`__)
-`np.ediff1d` casting behaviour with ``to_end`` and ``to_begin``
----------------------------------------------------------------
-
-`np.ediff1d` now uses the ``"same_kind"`` casting rule for
+``np.ediff1d`` casting behaviour with ``to_end`` and ``to_begin``
+-----------------------------------------------------------------
+``np.ediff1d`` now uses the ``"same_kind"`` casting rule for
its additional ``to_end`` and ``to_begin`` arguments. This
ensures type safety except when the input array has a smaller
integer type than ``to_begin`` or ``to_end``.
@@ -199,7 +131,6 @@ after the first 0).
Removed ``multiarray.int_asbuffer``
-----------------------------------
-
As part of the continued removal of Python 2 compatibility,
``multiarray.int_asbuffer`` was removed. On Python 3, it threw a
``NotImplementedError`` and was unused internally. It is expected that there
@@ -224,8 +155,7 @@ necessary for codebases supporting Python 2.5 and older.
``issubdtype`` no longer interprets ``float`` as ``np.floating``
----------------------------------------------------------------
-
-`numpy.issubdtype` had a FutureWarning since NumPy 1.14 which
+``numpy.issubdtype`` had a FutureWarning since NumPy 1.14 which
has expired now. This means that certain input where the second
argument was neither a datatype nor a NumPy scalar type
(such as a string or a python type like ``int`` or ``float``)
@@ -239,16 +169,16 @@ Change output of ``round`` on scalars to be consistent with Python
------------------------------------------------------------------
Output of the ``__round__`` dunder method and consequently the Python
-built-in `round` has been changed to be a Python `int` to be consistent
+built-in ``round`` has been changed to be a Python ``int`` to be consistent
with calling it on Python ``float`` objects when called with no arguments.
-Previously, it would return a scalar of the `np.dtype` that was passed in.
+Previously, it would return a scalar of the ``np.dtype`` that was passed in.
(`gh-15840 <https://github.com/numpy/numpy/pull/15840>`__)
The ``numpy.ndarray`` constructor no longer interprets ``strides=()`` as ``strides=None``
-----------------------------------------------------------------------------------------
The former has changed to have the expected meaning of setting
-`numpy.ndarray.strides` to ``()``, while the latter continues to result in
+``numpy.ndarray.strides`` to ``()``, while the latter continues to result in
strides being chosen automatically.
(`gh-15882 <https://github.com/numpy/numpy/pull/15882>`__)
@@ -267,6 +197,93 @@ of users.
(`gh-16068 <https://github.com/numpy/numpy/pull/16068>`__)
+``SeedSequence`` with small seeds no longer conflicts with spawning
+-------------------------------------------------------------------
+Small seeds (less than ``2**96``) were previously implicitly 0-padded out to
+128 bits, the size of the internal entropy pool. When spawned, the spawn key
+was concatenated before the 0-padding. Since the first spawn key is ``(0,)``,
+small seeds before the spawn created the same states as the first spawned
+``SeedSequence``. Now, the seed is explicitly 0-padded out to the internal
+pool size before concatenating the spawn key. Spawned ``SeedSequences`` will
+produce different results than in the previous release. Unspawned
+``SeedSequences`` will still produce the same results.
+
+(`gh-16551 <https://github.com/numpy/numpy/pull/16551>`__)
+
+
+Deprecations
+============
+
+Deprecate automatic ``dtype=object`` for ragged input
+-----------------------------------------------------
+Calling ``np.array([[1, [1, 2, 3]])`` will issue a ``DeprecationWarning`` as
+per `NEP 34`_. Users should explicitly use ``dtype=object`` to avoid the
+warning.
+
+.. _`NEP 34`: https://numpy.org/neps/nep-0034.html
+
+(`gh-15119 <https://github.com/numpy/numpy/pull/15119>`__)
+
+Passing ``shape=0`` to factory functions in ``numpy.rec`` is deprecated
+-----------------------------------------------------------------------
+``0`` is treated as a special case and is aliased to ``None`` in the functions:
+
+* ``numpy.core.records.fromarrays``
+* ``numpy.core.records.fromrecords``
+* ``numpy.core.records.fromstring``
+* ``numpy.core.records.fromfile``
+
+In future, ``0`` will not be special cased, and will be treated as an array
+length like any other integer.
+
+(`gh-15217 <https://github.com/numpy/numpy/pull/15217>`__)
+
+Deprecation of probably unused C-API functions
+----------------------------------------------
+The following C-API functions are probably unused and have been
+deprecated:
+
+* ``PyArray_GetArrayParamsFromObject``
+* ``PyUFunc_GenericFunction``
+* ``PyUFunc_SetUsesArraysAsData``
+
+In most cases ``PyArray_GetArrayParamsFromObject`` should be replaced
+by converting to an array, while ``PyUFunc_GenericFunction`` can be
+replaced with ``PyObject_Call`` (see documentation for details).
+
+(`gh-15427 <https://github.com/numpy/numpy/pull/15427>`__)
+
+Converting certain types to dtypes is Deprecated
+------------------------------------------------
+The super classes of scalar types, such as ``np.integer``, ``np.generic``,
+or ``np.inexact`` will now give a deprecation warning when converted
+to a dtype (or used in a dtype keyword argument).
+The reason for this is that ``np.integer`` is converted to ``np.int_``,
+while it would be expected to represent *any* integer (e.g. also
+``int8``, ``int16``, etc.
+For example, ``dtype=np.floating`` is currently identical to
+``dtype=np.float64``, even though also ``np.float32`` is a subclass of
+``np.floating``.
+
+(`gh-15534 <https://github.com/numpy/numpy/pull/15534>`__)
+
+Deprecation of ``round`` for ``np.complexfloating`` scalars
+-----------------------------------------------------------
+Output of the ``__round__`` dunder method and consequently the Python built-in
+``round`` has been deprecated on complex scalars. This does not affect
+``np.round``.
+
+(`gh-15840 <https://github.com/numpy/numpy/pull/15840>`__)
+
+``numpy.ndarray.tostring()`` is deprecated in favor of ``tobytes()``
+--------------------------------------------------------------------
+``~numpy.ndarray.tobytes`` has existed since the 1.9 release, but until this
+release ``~numpy.ndarray.tostring`` emitted no warning. The change to emit a
+warning brings NumPy in line with the builtin ``array.array`` methods of the
+same name.
+
+(`gh-15867 <https://github.com/numpy/numpy/pull/15867>`__)
+
C API changes
=============
@@ -275,21 +292,21 @@ Better support for ``const`` dimensions in API functions
--------------------------------------------------------
The following functions now accept a constant array of ``npy_intp``:
-* `PyArray_BroadcastToShape`
-* `PyArray_IntTupleFromIntp`
-* `PyArray_OverflowMultiplyList`
+* ``PyArray_BroadcastToShape``
+* ``PyArray_IntTupleFromIntp``
+* ``PyArray_OverflowMultiplyList``
Previously the caller would have to cast away the const-ness to call these
functions.
(`gh-15251 <https://github.com/numpy/numpy/pull/15251>`__)
-Const qualify UFunc inner loops
--------------------------------
-``UFuncGenericFunction`` now expects pointers to const ``dimension`` and
-``strides`` as arguments. This means inner loops may no longer modify
-either ``dimension`` or ``strides``. This change leads to an
-``incompatible-pointer-types`` warning forcing users to either ignore
+Const qualify UFunc inner loops
+-------------------------------
+``UFuncGenericFunction`` now expects pointers to const ``dimension`` and
+``strides`` as arguments. This means inner loops may no longer modify
+either ``dimension`` or ``strides``. This change leads to an
+``incompatible-pointer-types`` warning forcing users to either ignore
the compiler warnings or to const qualify their own loop signatures.
(`gh-15355 <https://github.com/numpy/numpy/pull/15355>`__)
@@ -298,11 +315,11 @@ the compiler warnings or to const qualify their own loop signatures.
New Features
============
-`numpy.frompyfunc` now accepts an identity argument
----------------------------------------------------
-This allows the :attr:`numpy.ufunc.identity` attribute to be set on the
+``numpy.frompyfunc`` now accepts an identity argument
+-----------------------------------------------------
+This allows the :attr:``numpy.ufunc.identity`` attribute to be set on the
resulting ufunc, meaning it can be used for empty and multi-dimensional
-calls to :meth:`numpy.ufunc.reduce`.
+calls to :meth:``numpy.ufunc.reduce``.
(`gh-8255 <https://github.com/numpy/numpy/pull/8255>`__)
@@ -314,40 +331,40 @@ now expose this through the buffer interface, meaning
(`gh-15385 <https://github.com/numpy/numpy/pull/15385>`__)
-``subok`` option for `numpy.copy`
----------------------------------
-A new kwarg, ``subok``, was added to `numpy.copy` to allow users to toggle the
-behavior of `numpy.copy` with respect to array subclasses. The default value
-is ``False`` which is consistent with the behavior of `numpy.copy` for
+``subok`` option for ``numpy.copy``
+-----------------------------------
+A new kwarg, ``subok``, was added to ``numpy.copy`` to allow users to toggle
+the behavior of ``numpy.copy`` with respect to array subclasses. The default
+value is ``False`` which is consistent with the behavior of ``numpy.copy`` for
previous numpy versions. To create a copy that preserves an array subclass with
-`numpy.copy`, call ``np.copy(arr, subok=True)``. This addition better documents
-that the default behavior of `numpy.copy` differs from the
-`numpy.ndarray.copy` method which respects array subclasses by default.
+``numpy.copy``, call ``np.copy(arr, subok=True)``. This addition better
+documents that the default behavior of ``numpy.copy`` differs from the
+``numpy.ndarray.copy`` method which respects array subclasses by default.
(`gh-15685 <https://github.com/numpy/numpy/pull/15685>`__)
-`numpy.linalg.multi_dot` now accepts an ``out`` argument
---------------------------------------------------------
+``numpy.linalg.multi_dot`` now accepts an ``out`` argument
+----------------------------------------------------------
``out`` can be used to avoid creating unnecessary copies of the final product
-computed by `numpy.linalg.multidot`.
+computed by ``numpy.linalg.multidot``.
(`gh-15715 <https://github.com/numpy/numpy/pull/15715>`__)
-``keepdims`` parameter for `numpy.count_nonzero`
-------------------------------------------------
-The parameter ``keepdims`` was added to `numpy.count_nonzero`. The
+``keepdims`` parameter for ``numpy.count_nonzero``
+--------------------------------------------------
+The parameter ``keepdims`` was added to ``numpy.count_nonzero``. The
parameter has the same meaning as it does in reduction functions such
-as `numpy.sum` or `numpy.mean`.
+as ``numpy.sum`` or ``numpy.mean``.
(`gh-15870 <https://github.com/numpy/numpy/pull/15870>`__)
-``equal_nan`` parameter for `numpy.array_equal`
-------------------------------------------------
-The keyword argument ``equal_nan`` was added to `numpy.array_equal`.
-``equal_nan`` is a boolean value that toggles whether or not ``nan`` values
-are considered equal in comparison (default is ``False``). This matches API
-used in related functions such as `numpy.isclose` and `numpy.allclose`.
+``equal_nan`` parameter for ``numpy.array_equal``
+-------------------------------------------------
+The keyword argument ``equal_nan`` was added to ``numpy.array_equal``.
+``equal_nan`` is a boolean value that toggles whether or not ``nan`` values are
+considered equal in comparison (default is ``False``). This matches API used in
+related functions such as ``numpy.isclose`` and ``numpy.allclose``.
(`gh-16128 <https://github.com/numpy/numpy/pull/16128>`__)
@@ -357,9 +374,8 @@ Improvements
Improve detection of CPU features
=================================
-
-Replace ``npy_cpu_supports`` which was a gcc-specific mechanism to test support
-of avx with more general functions ``npy_cpu_init`` and ``npy_cpu_have``, and
+Replace ``npy_cpu_supports`` which was a gcc specific mechanism to test support
+of AVX with more general functions ``npy_cpu_init`` and ``npy_cpu_have``, and
expose the results via a ``NPY_CPU_HAVE`` c-macro as well as a python-level
``__cpu_features__`` dictionary.
@@ -367,7 +383,6 @@ expose the results via a ``NPY_CPU_HAVE`` c-macro as well as a python-level
Use 64-bit integer size on 64-bit platforms in fallback lapack_lite
-------------------------------------------------------------------
-
Use 64-bit integer size on 64-bit platforms in the fallback LAPACK library,
which is used when the system has no LAPACK installed, allowing it to deal with
linear algebra for large arrays.
@@ -375,22 +390,20 @@ linear algebra for large arrays.
(`gh-15218 <https://github.com/numpy/numpy/pull/15218>`__)
Use AVX512 intrinsic to implement ``np.exp`` when input is ``np.float64``
---------------------------------------------------------------------------
-Use AVX512 intrinsic to implement ``np.exp`` when input is ``np.float64``,
+-------------------------------------------------------------------------
+Use AVX512 intrinsic to implement ``np.exp`` when input is ``np.float64``,
which can improve the performance of ``np.exp`` with ``np.float64`` input 5-7x
-faster than before. The _multiarray_umath.so module has grown about 63 KB on
-linux64.
+faster than before. The ``_multiarray_umath.so`` module has grown about 63 KB
+on linux64.
(`gh-15648 <https://github.com/numpy/numpy/pull/15648>`__)
Ability to disable madvise hugepages
------------------------------------
-
-On Linux NumPy has previously added support for madavise
-hugepages which can improve performance for very large arrays.
-Unfortunately, on older Kernel versions this led to peformance
-regressions, thus by default the support has been disabled on
-kernels before version 4.6. To override the default, you can
+On Linux NumPy has previously added support for madavise hugepages which can
+improve performance for very large arrays. Unfortunately, on older Kernel
+versions this led to peformance regressions, thus by default the support has
+been disabled on kernels before version 4.6. To override the default, you can
use the environment variable::
NUMPY_MADVISE_HUGEPAGE=0
@@ -401,17 +414,17 @@ transparent hugepage.
(`gh-15769 <https://github.com/numpy/numpy/pull/15769>`__)
-`numpy.einsum` accepts NumPy ``int64`` type in subscript list
--------------------------------------------------------------
-There is no longer a type error thrown when `numpy.einsum` is passed
+``numpy.einsum`` accepts NumPy ``int64`` type in subscript list
+---------------------------------------------------------------
+There is no longer a type error thrown when ``numpy.einsum`` is passed
a NumPy ``int64`` array as its subscript list.
(`gh-16080 <https://github.com/numpy/numpy/pull/16080>`__)
``np.logaddexp2.identity`` changed to ``-inf``
----------------------------------------------
-The ufunc `~numpy.logaddexp2` now has an identity of ``-inf``, allowing it to
-be called on empty sequences. This matches the identity of `~numpy.logaddexp`.
+The ufunc ``~numpy.logaddexp2`` now has an identity of ``-inf``, allowing it to
+be called on empty sequences. This matches the identity of ``~numpy.logaddexp``.
(`gh-16102 <https://github.com/numpy/numpy/pull/16102>`__)
@@ -431,31 +444,27 @@ was for its use. It has been removed.
``numpy.random._bit_generator`` moved to ``numpy.random.bit_generator``
-----------------------------------------------------------------------
+In order to expose ``numpy.random.BitGenerator`` and
+``numpy.random.SeedSequence`` to Cython, the ``_bitgenerator`` module is now
+public as ``numpy.random.bit_generator``
-In order to expose `numpy.random.BitGenerator` and `numpy.random.SeedSequence`
-to cython, the ``_bitgenerator`` module is now public as
-`numpy.random.bit_generator`
-
-Cython access to the random distributions is provided via a `pxd` file
-----------------------------------------------------------------------
-
+Cython access to the random distributions is provided via a ``pxd`` file
+------------------------------------------------------------------------
``c_distributions.pxd`` provides access to the c functions behind many of the
random distributions from Cython, making it convenient to use and extend them.
(`gh-15463 <https://github.com/numpy/numpy/pull/15463>`__)
-`Fixed `eigh` and `cholesky` methods in `numpy.random.multivariate_normal``
----------------------------------------------------------------------------
-
-Previously, when passing `method='eigh'` or `method='cholesky'`,
-`numpy.random.multivariate_normal` produced samples from the wrong
+Fixed ``eigh`` and ``cholesky`` methods in ``numpy.random.multivariate_normal``
+-------------------------------------------------------------------------------
+Previously, when passing ``method='eigh'`` or ``method='cholesky'``,
+``numpy.random.multivariate_normal`` produced samples from the wrong
distribution. This is now fixed.
(`gh-15872 <https://github.com/numpy/numpy/pull/15872>`__)
Fixed the jumping implementation in ``MT19937.jumped``
------------------------------------------------------
-
This fix changes the stream produced from jumped MT19937 generators. It does
not affect the stream produced using ``RandomState`` or ``MT19937`` that
are directly seeded.
@@ -466,10 +475,3 @@ implementation of the Horner and Sliding Window jump methods.
(`gh-16153 <https://github.com/numpy/numpy/pull/16153>`__)
-
-.. currentmodule:: numpy
-
-==========================
-NumPy 1.19.0 Release Notes
-==========================
-
diff --git a/doc/source/release/1.19.1-notes.rst b/doc/source/release/1.19.1-notes.rst
new file mode 100644
index 000000000..4fc5528f5
--- /dev/null
+++ b/doc/source/release/1.19.1-notes.rst
@@ -0,0 +1,68 @@
+.. currentmodule:: numpy
+
+==========================
+NumPy 1.19.1 Release Notes
+==========================
+
+NumPy 1.19.1 fixes several bugs found in the 1.19.0 release, replaces several
+functions deprecated in the upcoming Python-3.9 release, has improved support
+for AIX, and has a number of development related updates to keep CI working
+with recent upstream changes.
+
+This release supports Python 3.6-3.8. Cython >= 0.29.21 needs to be used when
+building with Python 3.9 for testing purposes.
+
+
+Contributors
+============
+
+A total of 15 people contributed to this release. People with a "+" by their
+names contributed a patch for the first time.
+
+* Abhinav Reddy +
+* Anirudh Subramanian
+* Antonio Larrosa +
+* Charles Harris
+* Chunlin Fang
+* Eric Wieser
+* Etienne Guesnet +
+* Kevin Sheppard
+* Matti Picus
+* Raghuveer Devulapalli
+* Roman Yurchak
+* Ross Barnowski
+* Sayed Adel
+* Sebastian Berg
+* Tyler Reddy
+
+
+Pull requests merged
+====================
+
+A total of 25 pull requests were merged for this release.
+
+* `#16649 <https://github.com/numpy/numpy/pull/16649>`__: MAINT, CI: disable Shippable cache
+* `#16652 <https://github.com/numpy/numpy/pull/16652>`__: MAINT: Replace `PyUString_GET_SIZE` with `PyUnicode_GetLength`.
+* `#16654 <https://github.com/numpy/numpy/pull/16654>`__: REL: Fix outdated docs link
+* `#16656 <https://github.com/numpy/numpy/pull/16656>`__: BUG: raise IEEE exception on AIX
+* `#16672 <https://github.com/numpy/numpy/pull/16672>`__: BUG: Fix bug in AVX complex absolute while processing array of...
+* `#16693 <https://github.com/numpy/numpy/pull/16693>`__: TST: Add extra debugging information to CPU features detection
+* `#16703 <https://github.com/numpy/numpy/pull/16703>`__: BLD: Add CPU entry for Emscripten / WebAssembly
+* `#16705 <https://github.com/numpy/numpy/pull/16705>`__: TST: Disable Python 3.9-dev testing.
+* `#16714 <https://github.com/numpy/numpy/pull/16714>`__: MAINT: Disable use_hugepages in case of ValueError
+* `#16724 <https://github.com/numpy/numpy/pull/16724>`__: BUG: Fix PyArray_SearchSorted signature.
+* `#16768 <https://github.com/numpy/numpy/pull/16768>`__: MAINT: Fixes for deprecated functions in scalartypes.c.src
+* `#16772 <https://github.com/numpy/numpy/pull/16772>`__: MAINT: Remove unneeded call to PyUnicode_READY
+* `#16776 <https://github.com/numpy/numpy/pull/16776>`__: MAINT: Fix deprecated functions in scalarapi.c
+* `#16779 <https://github.com/numpy/numpy/pull/16779>`__: BLD, ENH: Add RPATH support for AIX
+* `#16780 <https://github.com/numpy/numpy/pull/16780>`__: BUG: Fix default fallback in genfromtxt
+* `#16784 <https://github.com/numpy/numpy/pull/16784>`__: BUG: Added missing return after raising error in methods.c
+* `#16795 <https://github.com/numpy/numpy/pull/16795>`__: BLD: update cython to 0.29.21
+* `#16832 <https://github.com/numpy/numpy/pull/16832>`__: MAINT: setuptools 49.2.0 emits a warning, avoid it
+* `#16872 <https://github.com/numpy/numpy/pull/16872>`__: BUG: Validate output size in bin- and multinomial
+* `#16875 <https://github.com/numpy/numpy/pull/16875>`__: BLD, MAINT: Pin setuptools
+* `#16904 <https://github.com/numpy/numpy/pull/16904>`__: DOC: Reconstruct Testing Guideline.
+* `#16905 <https://github.com/numpy/numpy/pull/16905>`__: TST, BUG: Re-raise MemoryError exception in test_large_zip's...
+* `#16906 <https://github.com/numpy/numpy/pull/16906>`__: BUG,DOC: Fix bad MPL kwarg.
+* `#16916 <https://github.com/numpy/numpy/pull/16916>`__: BUG: Fix string/bytes to complex assignment
+* `#16922 <https://github.com/numpy/numpy/pull/16922>`__: REL: Prepare for NumPy 1.19.1 release
diff --git a/doc/source/release/1.19.2-notes.rst b/doc/source/release/1.19.2-notes.rst
new file mode 100644
index 000000000..1267d5eb1
--- /dev/null
+++ b/doc/source/release/1.19.2-notes.rst
@@ -0,0 +1,57 @@
+.. currentmodule:: numpy
+
+==========================
+NumPy 1.19.2 Release Notes
+==========================
+
+NumPy 1.19.2 fixes several bugs, prepares for the upcoming Cython 3.x release.
+and pins setuptools to keep distutils working while upstream modifications are
+ongoing. The aarch64 wheels are built with the latest manylinux2014 release
+that fixes the problem of differing page sizes used by different linux distros.
+
+This release supports Python 3.6-3.8. Cython >= 0.29.21 needs to be used when
+building with Python 3.9 for testing purposes.
+
+There is a known problem with Windows 10 version=2004 and OpenBLAS svd that we
+are trying to debug. If you are running that Windows version you should use a
+NumPy version that links to the MKL library, earlier Windows versions are fine.
+
+Improvements
+============
+
+Add NumPy declarations for Cython 3.0 and later
+-----------------------------------------------
+The pxd declarations for Cython 3.0 were improved to avoid using deprecated
+NumPy C-API features. Extension modules built with Cython 3.0+ that use NumPy
+can now set the C macro ``NPY_NO_DEPRECATED_API=NPY_1_7_API_VERSION`` to avoid
+C compiler warnings about deprecated API usage.
+
+Contributors
+============
+
+A total of 8 people contributed to this release. People with a "+" by their
+names contributed a patch for the first time.
+
+* Charles Harris
+* Matti Picus
+* Pauli Virtanen
+* Philippe Ombredanne +
+* Sebastian Berg
+* Stefan Behnel +
+* Stephan Loyd +
+* Zac Hatfield-Dodds
+
+Pull requests merged
+====================
+
+A total of 9 pull requests were merged for this release.
+
+* `#16959 <https://github.com/numpy/numpy/pull/16959>`__: TST: Change aarch64 to arm64 in travis.yml.
+* `#16998 <https://github.com/numpy/numpy/pull/16998>`__: MAINT: Configure hypothesis in ``np.test()`` for determinism,...
+* `#17000 <https://github.com/numpy/numpy/pull/17000>`__: BLD: pin setuptools < 49.2.0
+* `#17015 <https://github.com/numpy/numpy/pull/17015>`__: ENH: Add NumPy declarations to be used by Cython 3.0+
+* `#17125 <https://github.com/numpy/numpy/pull/17125>`__: BUG: Remove non-threadsafe sigint handling from fft calculation
+* `#17243 <https://github.com/numpy/numpy/pull/17243>`__: BUG: core: fix ilp64 blas dot/vdot/... for strides > int32 max
+* `#17244 <https://github.com/numpy/numpy/pull/17244>`__: DOC: Use SPDX license expressions with correct license
+* `#17245 <https://github.com/numpy/numpy/pull/17245>`__: DOC: Fix the link to the quick-start in the old API functions
+* `#17272 <https://github.com/numpy/numpy/pull/17272>`__: BUG: fix pickling of arrays larger than 2GiB
diff --git a/doc/source/release/1.19.3-notes.rst b/doc/source/release/1.19.3-notes.rst
new file mode 100644
index 000000000..f1f1fd2b3
--- /dev/null
+++ b/doc/source/release/1.19.3-notes.rst
@@ -0,0 +1,46 @@
+.. currentmodule:: numpy
+
+==========================
+NumPy 1.19.3 Release Notes
+==========================
+
+NumPy 1.19.3 is a small maintenance release with two major improvements:
+
+- Python 3.9 binary wheels on all supported platforms.
+- OpenBLAS fixes for Windows 10 version 2004 fmod bug.
+
+This release supports Python 3.6-3.9 and is linked with OpenBLAS 0.3.12 to avoid
+some of the fmod problems on Windows 10 version 2004. Microsoft is aware of the
+problem and users should upgrade when the fix becomes available, the fix here
+is limited in scope.
+
+Contributors
+============
+
+A total of 8 people contributed to this release. People with a "+" by their
+names contributed a patch for the first time.
+
+* Charles Harris
+* Chris Brown +
+* Daniel Vanzo +
+* E. Madison Bray +
+* Hugo van Kemenade +
+* Ralf Gommers
+* Sebastian Berg
+* @danbeibei +
+
+Pull requests merged
+====================
+
+A total of 10 pull requests were merged for this release.
+
+* `#17298 <https://github.com/numpy/numpy/pull/17298>`__: BLD: set upper versions for build dependencies
+* `#17336 <https://github.com/numpy/numpy/pull/17336>`__: BUG: Set deprecated fields to null in PyArray_InitArrFuncs
+* `#17446 <https://github.com/numpy/numpy/pull/17446>`__: ENH: Warn on unsupported Python 3.10+
+* `#17450 <https://github.com/numpy/numpy/pull/17450>`__: MAINT: Update test_requirements.txt.
+* `#17522 <https://github.com/numpy/numpy/pull/17522>`__: ENH: Support for the NVIDIA HPC SDK nvfortran compiler
+* `#17568 <https://github.com/numpy/numpy/pull/17568>`__: BUG: Cygwin Workaround for #14787 on affected platforms
+* `#17647 <https://github.com/numpy/numpy/pull/17647>`__: BUG: Fix memory leak of buffer-info cache due to relaxed strides
+* `#17652 <https://github.com/numpy/numpy/pull/17652>`__: MAINT: Backport openblas_support from master.
+* `#17653 <https://github.com/numpy/numpy/pull/17653>`__: TST: Add Python 3.9 to the CI testing on Windows, Mac.
+* `#17660 <https://github.com/numpy/numpy/pull/17660>`__: TST: Simplify source path names in test_extending.
diff --git a/doc/source/release/1.19.4-notes.rst b/doc/source/release/1.19.4-notes.rst
new file mode 100644
index 000000000..e7c0863f4
--- /dev/null
+++ b/doc/source/release/1.19.4-notes.rst
@@ -0,0 +1,30 @@
+.. currentmodule:: numpy
+
+==========================
+NumPy 1.19.4 Release Notes
+==========================
+
+NumPy 1.19.4 is a quick release to revert the OpenBLAS library version. It was
+hoped that the 0.3.12 OpenBLAS version used in 1.19.3 would work around the
+Microsoft fmod bug, but problems in some docker environments turned up. Instead,
+1.19.4 will use the older library and run a sanity check on import, raising an
+error if the problem is detected. Microsoft is aware of the problem and has
+promised a fix, users should upgrade when it becomes available.
+
+This release supports Python 3.6-3.9
+
+Contributors
+============
+
+A total of 1 people contributed to this release. People with a "+" by their
+names contributed a patch for the first time.
+
+* Charles Harris
+
+Pull requests merged
+====================
+
+A total of 2 pull requests were merged for this release.
+
+* `#17679 <https://github.com/numpy/numpy/pull/17679>`__: MAINT: Add check for Windows 10 version 2004 bug.
+* `#17680 <https://github.com/numpy/numpy/pull/17680>`__: REV: Revert OpenBLAS to 1.19.2 version for 1.19.4
diff --git a/doc/source/release/1.5.0-notes.rst b/doc/source/release/1.5.0-notes.rst
index a2184ab13..2b0c32f3e 100644
--- a/doc/source/release/1.5.0-notes.rst
+++ b/doc/source/release/1.5.0-notes.rst
@@ -12,11 +12,11 @@ Python 3 compatibility
This is the first NumPy release which is compatible with Python 3. Support for
Python 3 and Python 2 is done from a single code base. Extensive notes on
changes can be found at
-`<http://projects.scipy.org/numpy/browser/trunk/doc/Py3K.txt>`_.
+`<https://web.archive.org/web/20100814160313/http://projects.scipy.org/numpy/browser/trunk/doc/Py3K.txt>`_.
Note that the Numpy testing framework relies on nose, which does not have a
Python 3 compatible release yet. A working Python 3 branch of nose can be found
-at `<http://bitbucket.org/jpellerin/nose3/>`_ however.
+at `<https://web.archive.org/web/20100817112505/http://bitbucket.org/jpellerin/nose3/>`_ however.
Porting of SciPy to Python 3 is expected to be completed soon.
diff --git a/doc/source/user/absolute_beginners.rst b/doc/source/user/absolute_beginners.rst
index bd44b70da..126f5f2a3 100644
--- a/doc/source/user/absolute_beginners.rst
+++ b/doc/source/user/absolute_beginners.rst
@@ -1090,7 +1090,7 @@ To learn more about finding the unique elements in an array, see `unique`.
Transposing and reshaping a matrix
----------------------------------
-*This section covers* ``arr.reshape()``, ``arr.transpose()``, ``arr.T()``
+*This section covers* ``arr.reshape()``, ``arr.transpose()``, ``arr.T``
-----
@@ -1114,7 +1114,7 @@ You simply need to pass in the new dimensions that you want for the matrix. ::
.. image:: images/np_reshape.png
-You can also use ``.transpose`` to reverse or change the axes of an array
+You can also use ``.transpose()`` to reverse or change the axes of an array
according to the values you specify.
If you start with this array::
@@ -1131,6 +1131,13 @@ You can transpose your array with ``arr.transpose()``. ::
[1, 4],
[2, 5]])
+You can also use ``arr.T``::
+
+ >>> arr.T
+ array([[0, 3],
+ [1, 4],
+ [2, 5]])
+
To learn more about transposing and reshaping arrays, see `transpose` and
`reshape`.
@@ -1138,12 +1145,12 @@ To learn more about transposing and reshaping arrays, see `transpose` and
How to reverse an array
-----------------------
-*This section covers* ``np.flip``
+*This section covers* ``np.flip()``
-----
NumPy's ``np.flip()`` function allows you to flip, or reverse, the contents of
-an array along an axis. When using ``np.flip``, specify the array you would like
+an array along an axis. When using ``np.flip()``, specify the array you would like
to reverse and the axis. If you don't specify the axis, NumPy will reverse the
contents along all of the axes of your input array.
@@ -1531,19 +1538,19 @@ Importing and exporting a CSV
-----------------------------
.. save a csv
-
+
>>> with open('music.csv', 'w') as fid:
... n = fid.write('Artist,Genre,Listeners,Plays\n')
... n = fid.write('Billie Holiday,Jazz,1300000,27000000\n')
... n = fid.write('Jimmie Hendrix,Rock,2700000,70000000\n')
... n = fid.write('Miles Davis,Jazz,1500000,48000000\n')
... n = fid.write('SIA,Pop,2000000,74000000\n')
-
+
It's simple to read in a CSV that contains existing information. The best and
easiest way to do this is to use
-`Pandas <https://pandas.pydata.org/getpandas.html>`_. ::
+`Pandas <https://pandas.pydata.org>`_. ::
>>> import pandas as pd
diff --git a/doc/source/user/basics.broadcasting.rst b/doc/source/user/basics.broadcasting.rst
index 00bf17a41..5eae3eb32 100644
--- a/doc/source/user/basics.broadcasting.rst
+++ b/doc/source/user/basics.broadcasting.rst
@@ -10,4 +10,178 @@ Broadcasting
:ref:`array-broadcasting-in-numpy`
An introduction to the concepts discussed here
-.. automodule:: numpy.doc.broadcasting
+.. note::
+ See `this article
+ <https://numpy.org/devdocs/user/theory.broadcasting.html>`_
+ for illustrations of broadcasting concepts.
+
+
+The term broadcasting describes how numpy treats arrays with different
+shapes during arithmetic operations. Subject to certain constraints,
+the smaller array is "broadcast" across the larger array so that they
+have compatible shapes. Broadcasting provides a means of vectorizing
+array operations so that looping occurs in C instead of Python. It does
+this without making needless copies of data and usually leads to
+efficient algorithm implementations. There are, however, cases where
+broadcasting is a bad idea because it leads to inefficient use of memory
+that slows computation.
+
+NumPy operations are usually done on pairs of arrays on an
+element-by-element basis. In the simplest case, the two arrays must
+have exactly the same shape, as in the following example:
+
+ >>> a = np.array([1.0, 2.0, 3.0])
+ >>> b = np.array([2.0, 2.0, 2.0])
+ >>> a * b
+ array([ 2., 4., 6.])
+
+NumPy's broadcasting rule relaxes this constraint when the arrays'
+shapes meet certain constraints. The simplest broadcasting example occurs
+when an array and a scalar value are combined in an operation:
+
+>>> a = np.array([1.0, 2.0, 3.0])
+>>> b = 2.0
+>>> a * b
+array([ 2., 4., 6.])
+
+The result is equivalent to the previous example where ``b`` was an array.
+We can think of the scalar ``b`` being *stretched* during the arithmetic
+operation into an array with the same shape as ``a``. The new elements in
+``b`` are simply copies of the original scalar. The stretching analogy is
+only conceptual. NumPy is smart enough to use the original scalar value
+without actually making copies so that broadcasting operations are as
+memory and computationally efficient as possible.
+
+The code in the second example is more efficient than that in the first
+because broadcasting moves less memory around during the multiplication
+(``b`` is a scalar rather than an array).
+
+General Broadcasting Rules
+==========================
+When operating on two arrays, NumPy compares their shapes element-wise.
+It starts with the trailing (i.e. rightmost) dimensions and works its
+way left. Two dimensions are compatible when
+
+1) they are equal, or
+2) one of them is 1
+
+If these conditions are not met, a
+``ValueError: operands could not be broadcast together`` exception is
+thrown, indicating that the arrays have incompatible shapes. The size of
+the resulting array is the size that is not 1 along each axis of the inputs.
+
+Arrays do not need to have the same *number* of dimensions. For example,
+if you have a ``256x256x3`` array of RGB values, and you want to scale
+each color in the image by a different value, you can multiply the image
+by a one-dimensional array with 3 values. Lining up the sizes of the
+trailing axes of these arrays according to the broadcast rules, shows that
+they are compatible::
+
+ Image (3d array): 256 x 256 x 3
+ Scale (1d array): 3
+ Result (3d array): 256 x 256 x 3
+
+When either of the dimensions compared is one, the other is
+used. In other words, dimensions with size 1 are stretched or "copied"
+to match the other.
+
+In the following example, both the ``A`` and ``B`` arrays have axes with
+length one that are expanded to a larger size during the broadcast
+operation::
+
+ A (4d array): 8 x 1 x 6 x 1
+ B (3d array): 7 x 1 x 5
+ Result (4d array): 8 x 7 x 6 x 5
+
+Here are some more examples::
+
+ A (2d array): 5 x 4
+ B (1d array): 1
+ Result (2d array): 5 x 4
+
+ A (2d array): 5 x 4
+ B (1d array): 4
+ Result (2d array): 5 x 4
+
+ A (3d array): 15 x 3 x 5
+ B (3d array): 15 x 1 x 5
+ Result (3d array): 15 x 3 x 5
+
+ A (3d array): 15 x 3 x 5
+ B (2d array): 3 x 5
+ Result (3d array): 15 x 3 x 5
+
+ A (3d array): 15 x 3 x 5
+ B (2d array): 3 x 1
+ Result (3d array): 15 x 3 x 5
+
+Here are examples of shapes that do not broadcast::
+
+ A (1d array): 3
+ B (1d array): 4 # trailing dimensions do not match
+
+ A (2d array): 2 x 1
+ B (3d array): 8 x 4 x 3 # second from last dimensions mismatched
+
+An example of broadcasting in practice::
+
+ >>> x = np.arange(4)
+ >>> xx = x.reshape(4,1)
+ >>> y = np.ones(5)
+ >>> z = np.ones((3,4))
+
+ >>> x.shape
+ (4,)
+
+ >>> y.shape
+ (5,)
+
+ >>> x + y
+ ValueError: operands could not be broadcast together with shapes (4,) (5,)
+
+ >>> xx.shape
+ (4, 1)
+
+ >>> y.shape
+ (5,)
+
+ >>> (xx + y).shape
+ (4, 5)
+
+ >>> xx + y
+ array([[ 1., 1., 1., 1., 1.],
+ [ 2., 2., 2., 2., 2.],
+ [ 3., 3., 3., 3., 3.],
+ [ 4., 4., 4., 4., 4.]])
+
+ >>> x.shape
+ (4,)
+
+ >>> z.shape
+ (3, 4)
+
+ >>> (x + z).shape
+ (3, 4)
+
+ >>> x + z
+ array([[ 1., 2., 3., 4.],
+ [ 1., 2., 3., 4.],
+ [ 1., 2., 3., 4.]])
+
+Broadcasting provides a convenient way of taking the outer product (or
+any other outer operation) of two arrays. The following example shows an
+outer addition operation of two 1-d arrays::
+
+ >>> a = np.array([0.0, 10.0, 20.0, 30.0])
+ >>> b = np.array([1.0, 2.0, 3.0])
+ >>> a[:, np.newaxis] + b
+ array([[ 1., 2., 3.],
+ [ 11., 12., 13.],
+ [ 21., 22., 23.],
+ [ 31., 32., 33.]])
+
+Here the ``newaxis`` index operator inserts a new axis into ``a``,
+making it a two-dimensional ``4x1`` array. Combining the ``4x1`` array
+with ``b``, which has shape ``(3,)``, yields a ``4x3`` array.
+
+
diff --git a/doc/source/user/basics.byteswapping.rst b/doc/source/user/basics.byteswapping.rst
index 4b1008df3..fecdb9ee8 100644
--- a/doc/source/user/basics.byteswapping.rst
+++ b/doc/source/user/basics.byteswapping.rst
@@ -2,4 +2,152 @@
Byte-swapping
*************
-.. automodule:: numpy.doc.byteswapping
+Introduction to byte ordering and ndarrays
+==========================================
+
+The ``ndarray`` is an object that provide a python array interface to data
+in memory.
+
+It often happens that the memory that you want to view with an array is
+not of the same byte ordering as the computer on which you are running
+Python.
+
+For example, I might be working on a computer with a little-endian CPU -
+such as an Intel Pentium, but I have loaded some data from a file
+written by a computer that is big-endian. Let's say I have loaded 4
+bytes from a file written by a Sun (big-endian) computer. I know that
+these 4 bytes represent two 16-bit integers. On a big-endian machine, a
+two-byte integer is stored with the Most Significant Byte (MSB) first,
+and then the Least Significant Byte (LSB). Thus the bytes are, in memory order:
+
+#. MSB integer 1
+#. LSB integer 1
+#. MSB integer 2
+#. LSB integer 2
+
+Let's say the two integers were in fact 1 and 770. Because 770 = 256 *
+3 + 2, the 4 bytes in memory would contain respectively: 0, 1, 3, 2.
+The bytes I have loaded from the file would have these contents:
+
+>>> big_end_buffer = bytearray([0,1,3,2])
+>>> big_end_buffer
+bytearray(b'\\x00\\x01\\x03\\x02')
+
+We might want to use an ``ndarray`` to access these integers. In that
+case, we can create an array around this memory, and tell numpy that
+there are two integers, and that they are 16 bit and big-endian:
+
+>>> import numpy as np
+>>> big_end_arr = np.ndarray(shape=(2,),dtype='>i2', buffer=big_end_buffer)
+>>> big_end_arr[0]
+1
+>>> big_end_arr[1]
+770
+
+Note the array ``dtype`` above of ``>i2``. The ``>`` means 'big-endian'
+(``<`` is little-endian) and ``i2`` means 'signed 2-byte integer'. For
+example, if our data represented a single unsigned 4-byte little-endian
+integer, the dtype string would be ``<u4``.
+
+In fact, why don't we try that?
+
+>>> little_end_u4 = np.ndarray(shape=(1,),dtype='<u4', buffer=big_end_buffer)
+>>> little_end_u4[0] == 1 * 256**1 + 3 * 256**2 + 2 * 256**3
+True
+
+Returning to our ``big_end_arr`` - in this case our underlying data is
+big-endian (data endianness) and we've set the dtype to match (the dtype
+is also big-endian). However, sometimes you need to flip these around.
+
+.. warning::
+
+ Scalars currently do not include byte order information, so extracting
+ a scalar from an array will return an integer in native byte order.
+ Hence:
+
+ >>> big_end_arr[0].dtype.byteorder == little_end_u4[0].dtype.byteorder
+ True
+
+Changing byte ordering
+======================
+
+As you can imagine from the introduction, there are two ways you can
+affect the relationship between the byte ordering of the array and the
+underlying memory it is looking at:
+
+* Change the byte-ordering information in the array dtype so that it
+ interprets the underlying data as being in a different byte order.
+ This is the role of ``arr.newbyteorder()``
+* Change the byte-ordering of the underlying data, leaving the dtype
+ interpretation as it was. This is what ``arr.byteswap()`` does.
+
+The common situations in which you need to change byte ordering are:
+
+#. Your data and dtype endianness don't match, and you want to change
+ the dtype so that it matches the data.
+#. Your data and dtype endianness don't match, and you want to swap the
+ data so that they match the dtype
+#. Your data and dtype endianness match, but you want the data swapped
+ and the dtype to reflect this
+
+Data and dtype endianness don't match, change dtype to match data
+-----------------------------------------------------------------
+
+We make something where they don't match:
+
+>>> wrong_end_dtype_arr = np.ndarray(shape=(2,),dtype='<i2', buffer=big_end_buffer)
+>>> wrong_end_dtype_arr[0]
+256
+
+The obvious fix for this situation is to change the dtype so it gives
+the correct endianness:
+
+>>> fixed_end_dtype_arr = wrong_end_dtype_arr.newbyteorder()
+>>> fixed_end_dtype_arr[0]
+1
+
+Note the array has not changed in memory:
+
+>>> fixed_end_dtype_arr.tobytes() == big_end_buffer
+True
+
+Data and type endianness don't match, change data to match dtype
+----------------------------------------------------------------
+
+You might want to do this if you need the data in memory to be a certain
+ordering. For example you might be writing the memory out to a file
+that needs a certain byte ordering.
+
+>>> fixed_end_mem_arr = wrong_end_dtype_arr.byteswap()
+>>> fixed_end_mem_arr[0]
+1
+
+Now the array *has* changed in memory:
+
+>>> fixed_end_mem_arr.tobytes() == big_end_buffer
+False
+
+Data and dtype endianness match, swap data and dtype
+----------------------------------------------------
+
+You may have a correctly specified array dtype, but you need the array
+to have the opposite byte order in memory, and you want the dtype to
+match so the array values make sense. In this case you just do both of
+the previous operations:
+
+>>> swapped_end_arr = big_end_arr.byteswap().newbyteorder()
+>>> swapped_end_arr[0]
+1
+>>> swapped_end_arr.tobytes() == big_end_buffer
+False
+
+An easier way of casting the data to a specific dtype and byte ordering
+can be achieved with the ndarray astype method:
+
+>>> swapped_end_arr = big_end_arr.astype('<i2')
+>>> swapped_end_arr[0]
+1
+>>> swapped_end_arr.tobytes() == big_end_buffer
+False
+
+
diff --git a/doc/source/user/basics.creation.rst b/doc/source/user/basics.creation.rst
index b3fa81017..671a8ec59 100644
--- a/doc/source/user/basics.creation.rst
+++ b/doc/source/user/basics.creation.rst
@@ -6,4 +6,141 @@ Array creation
.. seealso:: :ref:`Array creation routines <routines.array-creation>`
-.. automodule:: numpy.doc.creation
+Introduction
+============
+
+There are 5 general mechanisms for creating arrays:
+
+1) Conversion from other Python structures (e.g., lists, tuples)
+2) Intrinsic numpy array creation objects (e.g., arange, ones, zeros,
+ etc.)
+3) Reading arrays from disk, either from standard or custom formats
+4) Creating arrays from raw bytes through the use of strings or buffers
+5) Use of special library functions (e.g., random)
+
+This section will not cover means of replicating, joining, or otherwise
+expanding or mutating existing arrays. Nor will it cover creating object
+arrays or structured arrays. Both of those are covered in their own sections.
+
+Converting Python array_like Objects to NumPy Arrays
+====================================================
+
+In general, numerical data arranged in an array-like structure in Python can
+be converted to arrays through the use of the array() function. The most
+obvious examples are lists and tuples. See the documentation for array() for
+details for its use. Some objects may support the array-protocol and allow
+conversion to arrays this way. A simple way to find out if the object can be
+converted to a numpy array using array() is simply to try it interactively and
+see if it works! (The Python Way).
+
+Examples: ::
+
+ >>> x = np.array([2,3,1,0])
+ >>> x = np.array([2, 3, 1, 0])
+ >>> x = np.array([[1,2.0],[0,0],(1+1j,3.)]) # note mix of tuple and lists,
+ and types
+ >>> x = np.array([[ 1.+0.j, 2.+0.j], [ 0.+0.j, 0.+0.j], [ 1.+1.j, 3.+0.j]])
+
+Intrinsic NumPy Array Creation
+==============================
+
+NumPy has built-in functions for creating arrays from scratch:
+
+zeros(shape) will create an array filled with 0 values with the specified
+shape. The default dtype is float64. ::
+
+ >>> np.zeros((2, 3))
+ array([[ 0., 0., 0.], [ 0., 0., 0.]])
+
+ones(shape) will create an array filled with 1 values. It is identical to
+zeros in all other respects.
+
+arange() will create arrays with regularly incrementing values. Check the
+docstring for complete information on the various ways it can be used. A few
+examples will be given here: ::
+
+ >>> np.arange(10)
+ array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
+ >>> np.arange(2, 10, dtype=float)
+ array([ 2., 3., 4., 5., 6., 7., 8., 9.])
+ >>> np.arange(2, 3, 0.1)
+ array([ 2. , 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9])
+
+Note that there are some subtleties regarding the last usage that the user
+should be aware of that are described in the arange docstring.
+
+linspace() will create arrays with a specified number of elements, and
+spaced equally between the specified beginning and end values. For
+example: ::
+
+ >>> np.linspace(1., 4., 6)
+ array([ 1. , 1.6, 2.2, 2.8, 3.4, 4. ])
+
+The advantage of this creation function is that one can guarantee the
+number of elements and the starting and end point, which arange()
+generally will not do for arbitrary start, stop, and step values.
+
+indices() will create a set of arrays (stacked as a one-higher dimensioned
+array), one per dimension with each representing variation in that dimension.
+An example illustrates much better than a verbal description: ::
+
+ >>> np.indices((3,3))
+ array([[[0, 0, 0], [1, 1, 1], [2, 2, 2]], [[0, 1, 2], [0, 1, 2], [0, 1, 2]]])
+
+This is particularly useful for evaluating functions of multiple dimensions on
+a regular grid.
+
+Reading Arrays From Disk
+========================
+
+This is presumably the most common case of large array creation. The details,
+of course, depend greatly on the format of data on disk and so this section
+can only give general pointers on how to handle various formats.
+
+Standard Binary Formats
+-----------------------
+
+Various fields have standard formats for array data. The following lists the
+ones with known python libraries to read them and return numpy arrays (there
+may be others for which it is possible to read and convert to numpy arrays so
+check the last section as well)
+::
+
+ HDF5: h5py
+ FITS: Astropy
+
+Examples of formats that cannot be read directly but for which it is not hard to
+convert are those formats supported by libraries like PIL (able to read and
+write many image formats such as jpg, png, etc).
+
+Common ASCII Formats
+------------------------
+
+Comma Separated Value files (CSV) are widely used (and an export and import
+option for programs like Excel). There are a number of ways of reading these
+files in Python. There are CSV functions in Python and functions in pylab
+(part of matplotlib).
+
+More generic ascii files can be read using the io package in scipy.
+
+Custom Binary Formats
+---------------------
+
+There are a variety of approaches one can use. If the file has a relatively
+simple format then one can write a simple I/O library and use the numpy
+fromfile() function and .tofile() method to read and write numpy arrays
+directly (mind your byteorder though!) If a good C or C++ library exists that
+read the data, one can wrap that library with a variety of techniques though
+that certainly is much more work and requires significantly more advanced
+knowledge to interface with C or C++.
+
+Use of Special Libraries
+------------------------
+
+There are libraries that can be used to generate arrays for special purposes
+and it isn't possible to enumerate all of them. The most common uses are use
+of the many array generation functions in random that can generate arrays of
+random values, and some utility functions to generate special matrices (e.g.
+diagonal).
+
+
diff --git a/doc/source/user/basics.dispatch.rst b/doc/source/user/basics.dispatch.rst
index f7b8da262..c0e1cf9ba 100644
--- a/doc/source/user/basics.dispatch.rst
+++ b/doc/source/user/basics.dispatch.rst
@@ -4,5 +4,269 @@
Writing custom array containers
*******************************
-.. automodule:: numpy.doc.dispatch
+Numpy's dispatch mechanism, introduced in numpy version v1.16 is the
+recommended approach for writing custom N-dimensional array containers that are
+compatible with the numpy API and provide custom implementations of numpy
+functionality. Applications include `dask <http://dask.pydata.org>`_ arrays, an
+N-dimensional array distributed across multiple nodes, and `cupy
+<https://docs-cupy.chainer.org/en/stable/>`_ arrays, an N-dimensional array on
+a GPU.
+
+To get a feel for writing custom array containers, we'll begin with a simple
+example that has rather narrow utility but illustrates the concepts involved.
+
+>>> import numpy as np
+>>> class DiagonalArray:
+... def __init__(self, N, value):
+... self._N = N
+... self._i = value
+... def __repr__(self):
+... return f"{self.__class__.__name__}(N={self._N}, value={self._i})"
+... def __array__(self):
+... return self._i * np.eye(self._N)
+
+Our custom array can be instantiated like:
+
+>>> arr = DiagonalArray(5, 1)
+>>> arr
+DiagonalArray(N=5, value=1)
+
+We can convert to a numpy array using :func:`numpy.array` or
+:func:`numpy.asarray`, which will call its ``__array__`` method to obtain a
+standard ``numpy.ndarray``.
+
+>>> np.asarray(arr)
+array([[1., 0., 0., 0., 0.],
+ [0., 1., 0., 0., 0.],
+ [0., 0., 1., 0., 0.],
+ [0., 0., 0., 1., 0.],
+ [0., 0., 0., 0., 1.]])
+
+If we operate on ``arr`` with a numpy function, numpy will again use the
+``__array__`` interface to convert it to an array and then apply the function
+in the usual way.
+
+>>> np.multiply(arr, 2)
+array([[2., 0., 0., 0., 0.],
+ [0., 2., 0., 0., 0.],
+ [0., 0., 2., 0., 0.],
+ [0., 0., 0., 2., 0.],
+ [0., 0., 0., 0., 2.]])
+
+
+Notice that the return type is a standard ``numpy.ndarray``.
+
+>>> type(arr)
+numpy.ndarray
+
+How can we pass our custom array type through this function? Numpy allows a
+class to indicate that it would like to handle computations in a custom-defined
+way through the interfaces ``__array_ufunc__`` and ``__array_function__``. Let's
+take one at a time, starting with ``_array_ufunc__``. This method covers
+:ref:`ufuncs`, a class of functions that includes, for example,
+:func:`numpy.multiply` and :func:`numpy.sin`.
+
+The ``__array_ufunc__`` receives:
+
+- ``ufunc``, a function like ``numpy.multiply``
+- ``method``, a string, differentiating between ``numpy.multiply(...)`` and
+ variants like ``numpy.multiply.outer``, ``numpy.multiply.accumulate``, and so
+ on. For the common case, ``numpy.multiply(...)``, ``method == '__call__'``.
+- ``inputs``, which could be a mixture of different types
+- ``kwargs``, keyword arguments passed to the function
+
+For this example we will only handle the method ``__call__``
+
+>>> from numbers import Number
+>>> class DiagonalArray:
+... def __init__(self, N, value):
+... self._N = N
+... self._i = value
+... def __repr__(self):
+... return f"{self.__class__.__name__}(N={self._N}, value={self._i})"
+... def __array__(self):
+... return self._i * np.eye(self._N)
+... def __array_ufunc__(self, ufunc, method, *inputs, **kwargs):
+... if method == '__call__':
+... N = None
+... scalars = []
+... for input in inputs:
+... if isinstance(input, Number):
+... scalars.append(input)
+... elif isinstance(input, self.__class__):
+... scalars.append(input._i)
+... if N is not None:
+... if N != self._N:
+... raise TypeError("inconsistent sizes")
+... else:
+... N = self._N
+... else:
+... return NotImplemented
+... return self.__class__(N, ufunc(*scalars, **kwargs))
+... else:
+... return NotImplemented
+
+Now our custom array type passes through numpy functions.
+
+>>> arr = DiagonalArray(5, 1)
+>>> np.multiply(arr, 3)
+DiagonalArray(N=5, value=3)
+>>> np.add(arr, 3)
+DiagonalArray(N=5, value=4)
+>>> np.sin(arr)
+DiagonalArray(N=5, value=0.8414709848078965)
+
+At this point ``arr + 3`` does not work.
+
+>>> arr + 3
+TypeError: unsupported operand type(s) for *: 'DiagonalArray' and 'int'
+
+To support it, we need to define the Python interfaces ``__add__``, ``__lt__``,
+and so on to dispatch to the corresponding ufunc. We can achieve this
+conveniently by inheriting from the mixin
+:class:`~numpy.lib.mixins.NDArrayOperatorsMixin`.
+
+>>> import numpy.lib.mixins
+>>> class DiagonalArray(numpy.lib.mixins.NDArrayOperatorsMixin):
+... def __init__(self, N, value):
+... self._N = N
+... self._i = value
+... def __repr__(self):
+... return f"{self.__class__.__name__}(N={self._N}, value={self._i})"
+... def __array__(self):
+... return self._i * np.eye(self._N)
+... def __array_ufunc__(self, ufunc, method, *inputs, **kwargs):
+... if method == '__call__':
+... N = None
+... scalars = []
+... for input in inputs:
+... if isinstance(input, Number):
+... scalars.append(input)
+... elif isinstance(input, self.__class__):
+... scalars.append(input._i)
+... if N is not None:
+... if N != self._N:
+... raise TypeError("inconsistent sizes")
+... else:
+... N = self._N
+... else:
+... return NotImplemented
+... return self.__class__(N, ufunc(*scalars, **kwargs))
+... else:
+... return NotImplemented
+
+>>> arr = DiagonalArray(5, 1)
+>>> arr + 3
+DiagonalArray(N=5, value=4)
+>>> arr > 0
+DiagonalArray(N=5, value=True)
+
+Now let's tackle ``__array_function__``. We'll create dict that maps numpy
+functions to our custom variants.
+
+>>> HANDLED_FUNCTIONS = {}
+>>> class DiagonalArray(numpy.lib.mixins.NDArrayOperatorsMixin):
+... def __init__(self, N, value):
+... self._N = N
+... self._i = value
+... def __repr__(self):
+... return f"{self.__class__.__name__}(N={self._N}, value={self._i})"
+... def __array__(self):
+... return self._i * np.eye(self._N)
+... def __array_ufunc__(self, ufunc, method, *inputs, **kwargs):
+... if method == '__call__':
+... N = None
+... scalars = []
+... for input in inputs:
+... # In this case we accept only scalar numbers or DiagonalArrays.
+... if isinstance(input, Number):
+... scalars.append(input)
+... elif isinstance(input, self.__class__):
+... scalars.append(input._i)
+... if N is not None:
+... if N != self._N:
+... raise TypeError("inconsistent sizes")
+... else:
+... N = self._N
+... else:
+... return NotImplemented
+... return self.__class__(N, ufunc(*scalars, **kwargs))
+... else:
+... return NotImplemented
+... def __array_function__(self, func, types, args, kwargs):
+... if func not in HANDLED_FUNCTIONS:
+... return NotImplemented
+... # Note: this allows subclasses that don't override
+... # __array_function__ to handle DiagonalArray objects.
+... if not all(issubclass(t, self.__class__) for t in types):
+... return NotImplemented
+... return HANDLED_FUNCTIONS[func](*args, **kwargs)
+...
+
+A convenient pattern is to define a decorator ``implements`` that can be used
+to add functions to ``HANDLED_FUNCTIONS``.
+
+>>> def implements(np_function):
+... "Register an __array_function__ implementation for DiagonalArray objects."
+... def decorator(func):
+... HANDLED_FUNCTIONS[np_function] = func
+... return func
+... return decorator
+...
+
+Now we write implementations of numpy functions for ``DiagonalArray``.
+For completeness, to support the usage ``arr.sum()`` add a method ``sum`` that
+calls ``numpy.sum(self)``, and the same for ``mean``.
+
+>>> @implements(np.sum)
+... def sum(arr):
+... "Implementation of np.sum for DiagonalArray objects"
+... return arr._i * arr._N
+...
+>>> @implements(np.mean)
+... def mean(arr):
+... "Implementation of np.mean for DiagonalArray objects"
+... return arr._i / arr._N
+...
+>>> arr = DiagonalArray(5, 1)
+>>> np.sum(arr)
+5
+>>> np.mean(arr)
+0.2
+
+If the user tries to use any numpy functions not included in
+``HANDLED_FUNCTIONS``, a ``TypeError`` will be raised by numpy, indicating that
+this operation is not supported. For example, concatenating two
+``DiagonalArrays`` does not produce another diagonal array, so it is not
+supported.
+
+>>> np.concatenate([arr, arr])
+TypeError: no implementation found for 'numpy.concatenate' on types that implement __array_function__: [<class '__main__.DiagonalArray'>]
+
+Additionally, our implementations of ``sum`` and ``mean`` do not accept the
+optional arguments that numpy's implementation does.
+
+>>> np.sum(arr, axis=0)
+TypeError: sum() got an unexpected keyword argument 'axis'
+
+The user always has the option of converting to a normal ``numpy.ndarray`` with
+:func:`numpy.asarray` and using standard numpy from there.
+
+>>> np.concatenate([np.asarray(arr), np.asarray(arr)])
+array([[1., 0., 0., 0., 0.],
+ [0., 1., 0., 0., 0.],
+ [0., 0., 1., 0., 0.],
+ [0., 0., 0., 1., 0.],
+ [0., 0., 0., 0., 1.],
+ [1., 0., 0., 0., 0.],
+ [0., 1., 0., 0., 0.],
+ [0., 0., 1., 0., 0.],
+ [0., 0., 0., 1., 0.],
+ [0., 0., 0., 0., 1.]])
+
+Refer to the `dask source code <https://github.com/dask/dask>`_ and
+`cupy source code <https://github.com/cupy/cupy>`_ for more fully-worked
+examples of custom array containers.
+
+See also :doc:`NEP 18<neps:nep-0018-array-function-protocol>`.
diff --git a/doc/source/user/basics.indexing.rst b/doc/source/user/basics.indexing.rst
index 0dca4b884..9545bb78c 100644
--- a/doc/source/user/basics.indexing.rst
+++ b/doc/source/user/basics.indexing.rst
@@ -10,4 +10,454 @@ Indexing
:ref:`Indexing routines <routines.indexing>`
-.. automodule:: numpy.doc.indexing
+Array indexing refers to any use of the square brackets ([]) to index
+array values. There are many options to indexing, which give numpy
+indexing great power, but with power comes some complexity and the
+potential for confusion. This section is just an overview of the
+various options and issues related to indexing. Aside from single
+element indexing, the details on most of these options are to be
+found in related sections.
+
+Assignment vs referencing
+=========================
+
+Most of the following examples show the use of indexing when
+referencing data in an array. The examples work just as well
+when assigning to an array. See the section at the end for
+specific examples and explanations on how assignments work.
+
+Single element indexing
+=======================
+
+Single element indexing for a 1-D array is what one expects. It work
+exactly like that for other standard Python sequences. It is 0-based,
+and accepts negative indices for indexing from the end of the array. ::
+
+ >>> x = np.arange(10)
+ >>> x[2]
+ 2
+ >>> x[-2]
+ 8
+
+Unlike lists and tuples, numpy arrays support multidimensional indexing
+for multidimensional arrays. That means that it is not necessary to
+separate each dimension's index into its own set of square brackets. ::
+
+ >>> x.shape = (2,5) # now x is 2-dimensional
+ >>> x[1,3]
+ 8
+ >>> x[1,-1]
+ 9
+
+Note that if one indexes a multidimensional array with fewer indices
+than dimensions, one gets a subdimensional array. For example: ::
+
+ >>> x[0]
+ array([0, 1, 2, 3, 4])
+
+That is, each index specified selects the array corresponding to the
+rest of the dimensions selected. In the above example, choosing 0
+means that the remaining dimension of length 5 is being left unspecified,
+and that what is returned is an array of that dimensionality and size.
+It must be noted that the returned array is not a copy of the original,
+but points to the same values in memory as does the original array.
+In this case, the 1-D array at the first position (0) is returned.
+So using a single index on the returned array, results in a single
+element being returned. That is: ::
+
+ >>> x[0][2]
+ 2
+
+So note that ``x[0,2] = x[0][2]`` though the second case is more
+inefficient as a new temporary array is created after the first index
+that is subsequently indexed by 2.
+
+Note to those used to IDL or Fortran memory order as it relates to
+indexing. NumPy uses C-order indexing. That means that the last
+index usually represents the most rapidly changing memory location,
+unlike Fortran or IDL, where the first index represents the most
+rapidly changing location in memory. This difference represents a
+great potential for confusion.
+
+Other indexing options
+======================
+
+It is possible to slice and stride arrays to extract arrays of the
+same number of dimensions, but of different sizes than the original.
+The slicing and striding works exactly the same way it does for lists
+and tuples except that they can be applied to multiple dimensions as
+well. A few examples illustrates best: ::
+
+ >>> x = np.arange(10)
+ >>> x[2:5]
+ array([2, 3, 4])
+ >>> x[:-7]
+ array([0, 1, 2])
+ >>> x[1:7:2]
+ array([1, 3, 5])
+ >>> y = np.arange(35).reshape(5,7)
+ >>> y[1:5:2,::3]
+ array([[ 7, 10, 13],
+ [21, 24, 27]])
+
+Note that slices of arrays do not copy the internal array data but
+only produce new views of the original data. This is different from
+list or tuple slicing and an explicit ``copy()`` is recommended if
+the original data is not required anymore.
+
+It is possible to index arrays with other arrays for the purposes of
+selecting lists of values out of arrays into new arrays. There are
+two different ways of accomplishing this. One uses one or more arrays
+of index values. The other involves giving a boolean array of the proper
+shape to indicate the values to be selected. Index arrays are a very
+powerful tool that allow one to avoid looping over individual elements in
+arrays and thus greatly improve performance.
+
+It is possible to use special features to effectively increase the
+number of dimensions in an array through indexing so the resulting
+array acquires the shape needed for use in an expression or with a
+specific function.
+
+Index arrays
+============
+
+NumPy arrays may be indexed with other arrays (or any other sequence-
+like object that can be converted to an array, such as lists, with the
+exception of tuples; see the end of this document for why this is). The
+use of index arrays ranges from simple, straightforward cases to
+complex, hard-to-understand cases. For all cases of index arrays, what
+is returned is a copy of the original data, not a view as one gets for
+slices.
+
+Index arrays must be of integer type. Each value in the array indicates
+which value in the array to use in place of the index. To illustrate: ::
+
+ >>> x = np.arange(10,1,-1)
+ >>> x
+ array([10, 9, 8, 7, 6, 5, 4, 3, 2])
+ >>> x[np.array([3, 3, 1, 8])]
+ array([7, 7, 9, 2])
+
+
+The index array consisting of the values 3, 3, 1 and 8 correspondingly
+create an array of length 4 (same as the index array) where each index
+is replaced by the value the index array has in the array being indexed.
+
+Negative values are permitted and work as they do with single indices
+or slices: ::
+
+ >>> x[np.array([3,3,-3,8])]
+ array([7, 7, 4, 2])
+
+It is an error to have index values out of bounds: ::
+
+ >>> x[np.array([3, 3, 20, 8])]
+ <type 'exceptions.IndexError'>: index 20 out of bounds 0<=index<9
+
+Generally speaking, what is returned when index arrays are used is
+an array with the same shape as the index array, but with the type
+and values of the array being indexed. As an example, we can use a
+multidimensional index array instead: ::
+
+ >>> x[np.array([[1,1],[2,3]])]
+ array([[9, 9],
+ [8, 7]])
+
+Indexing Multi-dimensional arrays
+=================================
+
+Things become more complex when multidimensional arrays are indexed,
+particularly with multidimensional index arrays. These tend to be
+more unusual uses, but they are permitted, and they are useful for some
+problems. We'll start with the simplest multidimensional case (using
+the array y from the previous examples): ::
+
+ >>> y[np.array([0,2,4]), np.array([0,1,2])]
+ array([ 0, 15, 30])
+
+In this case, if the index arrays have a matching shape, and there is
+an index array for each dimension of the array being indexed, the
+resultant array has the same shape as the index arrays, and the values
+correspond to the index set for each position in the index arrays. In
+this example, the first index value is 0 for both index arrays, and
+thus the first value of the resultant array is y[0,0]. The next value
+is y[2,1], and the last is y[4,2].
+
+If the index arrays do not have the same shape, there is an attempt to
+broadcast them to the same shape. If they cannot be broadcast to the
+same shape, an exception is raised: ::
+
+ >>> y[np.array([0,2,4]), np.array([0,1])]
+ <type 'exceptions.ValueError'>: shape mismatch: objects cannot be
+ broadcast to a single shape
+
+The broadcasting mechanism permits index arrays to be combined with
+scalars for other indices. The effect is that the scalar value is used
+for all the corresponding values of the index arrays: ::
+
+ >>> y[np.array([0,2,4]), 1]
+ array([ 1, 15, 29])
+
+Jumping to the next level of complexity, it is possible to only
+partially index an array with index arrays. It takes a bit of thought
+to understand what happens in such cases. For example if we just use
+one index array with y: ::
+
+ >>> y[np.array([0,2,4])]
+ array([[ 0, 1, 2, 3, 4, 5, 6],
+ [14, 15, 16, 17, 18, 19, 20],
+ [28, 29, 30, 31, 32, 33, 34]])
+
+What results is the construction of a new array where each value of
+the index array selects one row from the array being indexed and the
+resultant array has the resulting shape (number of index elements,
+size of row).
+
+An example of where this may be useful is for a color lookup table
+where we want to map the values of an image into RGB triples for
+display. The lookup table could have a shape (nlookup, 3). Indexing
+such an array with an image with shape (ny, nx) with dtype=np.uint8
+(or any integer type so long as values are with the bounds of the
+lookup table) will result in an array of shape (ny, nx, 3) where a
+triple of RGB values is associated with each pixel location.
+
+In general, the shape of the resultant array will be the concatenation
+of the shape of the index array (or the shape that all the index arrays
+were broadcast to) with the shape of any unused dimensions (those not
+indexed) in the array being indexed.
+
+Boolean or "mask" index arrays
+==============================
+
+Boolean arrays used as indices are treated in a different manner
+entirely than index arrays. Boolean arrays must be of the same shape
+as the initial dimensions of the array being indexed. In the
+most straightforward case, the boolean array has the same shape: ::
+
+ >>> b = y>20
+ >>> y[b]
+ array([21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34])
+
+Unlike in the case of integer index arrays, in the boolean case, the
+result is a 1-D array containing all the elements in the indexed array
+corresponding to all the true elements in the boolean array. The
+elements in the indexed array are always iterated and returned in
+:term:`row-major` (C-style) order. The result is also identical to
+``y[np.nonzero(b)]``. As with index arrays, what is returned is a copy
+of the data, not a view as one gets with slices.
+
+The result will be multidimensional if y has more dimensions than b.
+For example: ::
+
+ >>> b[:,5] # use a 1-D boolean whose first dim agrees with the first dim of y
+ array([False, False, False, True, True])
+ >>> y[b[:,5]]
+ array([[21, 22, 23, 24, 25, 26, 27],
+ [28, 29, 30, 31, 32, 33, 34]])
+
+Here the 4th and 5th rows are selected from the indexed array and
+combined to make a 2-D array.
+
+In general, when the boolean array has fewer dimensions than the array
+being indexed, this is equivalent to y[b, ...], which means
+y is indexed by b followed by as many : as are needed to fill
+out the rank of y.
+Thus the shape of the result is one dimension containing the number
+of True elements of the boolean array, followed by the remaining
+dimensions of the array being indexed.
+
+For example, using a 2-D boolean array of shape (2,3)
+with four True elements to select rows from a 3-D array of shape
+(2,3,5) results in a 2-D result of shape (4,5): ::
+
+ >>> x = np.arange(30).reshape(2,3,5)
+ >>> x
+ array([[[ 0, 1, 2, 3, 4],
+ [ 5, 6, 7, 8, 9],
+ [10, 11, 12, 13, 14]],
+ [[15, 16, 17, 18, 19],
+ [20, 21, 22, 23, 24],
+ [25, 26, 27, 28, 29]]])
+ >>> b = np.array([[True, True, False], [False, True, True]])
+ >>> x[b]
+ array([[ 0, 1, 2, 3, 4],
+ [ 5, 6, 7, 8, 9],
+ [20, 21, 22, 23, 24],
+ [25, 26, 27, 28, 29]])
+
+For further details, consult the numpy reference documentation on array indexing.
+
+Combining index arrays with slices
+==================================
+
+Index arrays may be combined with slices. For example: ::
+
+ >>> y[np.array([0, 2, 4]), 1:3]
+ array([[ 1, 2],
+ [15, 16],
+ [29, 30]])
+
+In effect, the slice and index array operation are independent.
+The slice operation extracts columns with index 1 and 2,
+(i.e. the 2nd and 3rd columns),
+followed by the index array operation which extracts rows with
+index 0, 2 and 4 (i.e the first, third and fifth rows).
+
+This is equivalent to::
+
+ >>> y[:, 1:3][np.array([0, 2, 4]), :]
+ array([[ 1, 2],
+ [15, 16],
+ [29, 30]])
+
+Likewise, slicing can be combined with broadcasted boolean indices: ::
+
+ >>> b = y > 20
+ >>> b
+ array([[False, False, False, False, False, False, False],
+ [False, False, False, False, False, False, False],
+ [False, False, False, False, False, False, False],
+ [ True, True, True, True, True, True, True],
+ [ True, True, True, True, True, True, True]])
+ >>> y[b[:,5],1:3]
+ array([[22, 23],
+ [29, 30]])
+
+Structural indexing tools
+=========================
+
+To facilitate easy matching of array shapes with expressions and in
+assignments, the np.newaxis object can be used within array indices
+to add new dimensions with a size of 1. For example: ::
+
+ >>> y.shape
+ (5, 7)
+ >>> y[:,np.newaxis,:].shape
+ (5, 1, 7)
+
+Note that there are no new elements in the array, just that the
+dimensionality is increased. This can be handy to combine two
+arrays in a way that otherwise would require explicitly reshaping
+operations. For example: ::
+
+ >>> x = np.arange(5)
+ >>> x[:,np.newaxis] + x[np.newaxis,:]
+ array([[0, 1, 2, 3, 4],
+ [1, 2, 3, 4, 5],
+ [2, 3, 4, 5, 6],
+ [3, 4, 5, 6, 7],
+ [4, 5, 6, 7, 8]])
+
+The ellipsis syntax maybe used to indicate selecting in full any
+remaining unspecified dimensions. For example: ::
+
+ >>> z = np.arange(81).reshape(3,3,3,3)
+ >>> z[1,...,2]
+ array([[29, 32, 35],
+ [38, 41, 44],
+ [47, 50, 53]])
+
+This is equivalent to: ::
+
+ >>> z[1,:,:,2]
+ array([[29, 32, 35],
+ [38, 41, 44],
+ [47, 50, 53]])
+
+Assigning values to indexed arrays
+==================================
+
+As mentioned, one can select a subset of an array to assign to using
+a single index, slices, and index and mask arrays. The value being
+assigned to the indexed array must be shape consistent (the same shape
+or broadcastable to the shape the index produces). For example, it is
+permitted to assign a constant to a slice: ::
+
+ >>> x = np.arange(10)
+ >>> x[2:7] = 1
+
+or an array of the right size: ::
+
+ >>> x[2:7] = np.arange(5)
+
+Note that assignments may result in changes if assigning
+higher types to lower types (like floats to ints) or even
+exceptions (assigning complex to floats or ints): ::
+
+ >>> x[1] = 1.2
+ >>> x[1]
+ 1
+ >>> x[1] = 1.2j
+ TypeError: can't convert complex to int
+
+
+Unlike some of the references (such as array and mask indices)
+assignments are always made to the original data in the array
+(indeed, nothing else would make sense!). Note though, that some
+actions may not work as one may naively expect. This particular
+example is often surprising to people: ::
+
+ >>> x = np.arange(0, 50, 10)
+ >>> x
+ array([ 0, 10, 20, 30, 40])
+ >>> x[np.array([1, 1, 3, 1])] += 1
+ >>> x
+ array([ 0, 11, 20, 31, 40])
+
+Where people expect that the 1st location will be incremented by 3.
+In fact, it will only be incremented by 1. The reason is because
+a new array is extracted from the original (as a temporary) containing
+the values at 1, 1, 3, 1, then the value 1 is added to the temporary,
+and then the temporary is assigned back to the original array. Thus
+the value of the array at x[1]+1 is assigned to x[1] three times,
+rather than being incremented 3 times.
+
+Dealing with variable numbers of indices within programs
+========================================================
+
+The index syntax is very powerful but limiting when dealing with
+a variable number of indices. For example, if you want to write
+a function that can handle arguments with various numbers of
+dimensions without having to write special case code for each
+number of possible dimensions, how can that be done? If one
+supplies to the index a tuple, the tuple will be interpreted
+as a list of indices. For example (using the previous definition
+for the array z): ::
+
+ >>> indices = (1,1,1,1)
+ >>> z[indices]
+ 40
+
+So one can use code to construct tuples of any number of indices
+and then use these within an index.
+
+Slices can be specified within programs by using the slice() function
+in Python. For example: ::
+
+ >>> indices = (1,1,1,slice(0,2)) # same as [1,1,1,0:2]
+ >>> z[indices]
+ array([39, 40])
+
+Likewise, ellipsis can be specified by code by using the Ellipsis
+object: ::
+
+ >>> indices = (1, Ellipsis, 1) # same as [1,...,1]
+ >>> z[indices]
+ array([[28, 31, 34],
+ [37, 40, 43],
+ [46, 49, 52]])
+
+For this reason it is possible to use the output from the np.nonzero()
+function directly as an index since it always returns a tuple of index
+arrays.
+
+Because the special treatment of tuples, they are not automatically
+converted to an array as a list would be. As an example: ::
+
+ >>> z[[1,1,1,1]] # produces a large array
+ array([[[[27, 28, 29],
+ [30, 31, 32], ...
+ >>> z[(1,1,1,1)] # returns a single value
+ 40
+
+
diff --git a/doc/source/user/basics.io.genfromtxt.rst b/doc/source/user/basics.io.genfromtxt.rst
index 3fce6a8aa..5364acbe9 100644
--- a/doc/source/user/basics.io.genfromtxt.rst
+++ b/doc/source/user/basics.io.genfromtxt.rst
@@ -28,7 +28,7 @@ Defining the input
The only mandatory argument of :func:`~numpy.genfromtxt` is the source of
the data. It can be a string, a list of strings, a generator or an open
-file-like object with a :meth:`read` method, for example, a file or
+file-like object with a ``read`` method, for example, a file or
:class:`io.StringIO` object. If a single string is provided, it is assumed
to be the name of a local or remote file. If a list of strings or a generator
returning strings is provided, each string is treated as one line in a file.
@@ -36,10 +36,10 @@ When the URL of a remote file is passed, the file is automatically downloaded
to the current directory and opened.
Recognized file types are text files and archives. Currently, the function
-recognizes :class:`gzip` and :class:`bz2` (`bzip2`) archives. The type of
+recognizes ``gzip`` and ``bz2`` (``bzip2``) archives. The type of
the archive is determined from the extension of the file: if the filename
-ends with ``'.gz'``, a :class:`gzip` archive is expected; if it ends with
-``'bz2'``, a :class:`bzip2` archive is assumed.
+ends with ``'.gz'``, a ``gzip`` archive is expected; if it ends with
+``'bz2'``, a ``bzip2`` archive is assumed.
@@ -360,9 +360,9 @@ The ``converters`` argument
Usually, defining a dtype is sufficient to define how the sequence of
strings must be converted. However, some additional control may sometimes
be required. For example, we may want to make sure that a date in a format
-``YYYY/MM/DD`` is converted to a :class:`datetime` object, or that a string
-like ``xx%`` is properly converted to a float between 0 and 1. In such
-cases, we should define conversion functions with the ``converters``
+``YYYY/MM/DD`` is converted to a :class:`~datetime.datetime` object, or that
+a string like ``xx%`` is properly converted to a float between 0 and 1. In
+such cases, we should define conversion functions with the ``converters``
arguments.
The value of this argument is typically a dictionary with column indices or
@@ -427,7 +427,7 @@ previous example, we used a converter to transform an empty string into a
float. However, user-defined converters may rapidly become cumbersome to
manage.
-The :func:`~nummpy.genfromtxt` function provides two other complementary
+The :func:`~numpy.genfromtxt` function provides two other complementary
mechanisms: the ``missing_values`` argument is used to recognize
missing data and a second argument, ``filling_values``, is used to
process these missing data.
@@ -514,15 +514,15 @@ output array will then be a :class:`~numpy.ma.MaskedArray`.
Shortcut functions
==================
-In addition to :func:`~numpy.genfromtxt`, the :mod:`numpy.lib.io` module
+In addition to :func:`~numpy.genfromtxt`, the :mod:`numpy.lib.npyio` module
provides several convenience functions derived from
:func:`~numpy.genfromtxt`. These functions work the same way as the
original, but they have different default values.
-:func:`~numpy.recfromtxt`
+:func:`~numpy.npyio.recfromtxt`
Returns a standard :class:`numpy.recarray` (if ``usemask=False``) or a
- :class:`~numpy.ma.MaskedRecords` array (if ``usemaske=True``). The
+ :class:`~numpy.ma.mrecords.MaskedRecords` array (if ``usemaske=True``). The
default dtype is ``dtype=None``, meaning that the types of each column
will be automatically determined.
-:func:`~numpy.recfromcsv`
- Like :func:`~numpy.recfromtxt`, but with a default ``delimiter=","``.
+:func:`~numpy.npyio.recfromcsv`
+ Like :func:`~numpy.npyio.recfromtxt`, but with a default ``delimiter=","``.
diff --git a/doc/source/user/basics.rec.rst b/doc/source/user/basics.rec.rst
index b885c9e77..0524fde8e 100644
--- a/doc/source/user/basics.rec.rst
+++ b/doc/source/user/basics.rec.rst
@@ -4,10 +4,652 @@
Structured arrays
*****************
-.. automodule:: numpy.doc.structured_arrays
+Introduction
+============
+
+Structured arrays are ndarrays whose datatype is a composition of simpler
+datatypes organized as a sequence of named :term:`fields <field>`. For example,
+::
+
+ >>> x = np.array([('Rex', 9, 81.0), ('Fido', 3, 27.0)],
+ ... dtype=[('name', 'U10'), ('age', 'i4'), ('weight', 'f4')])
+ >>> x
+ array([('Rex', 9, 81.), ('Fido', 3, 27.)],
+ dtype=[('name', 'U10'), ('age', '<i4'), ('weight', '<f4')])
+
+Here ``x`` is a one-dimensional array of length two whose datatype is a
+structure with three fields: 1. A string of length 10 or less named 'name', 2.
+a 32-bit integer named 'age', and 3. a 32-bit float named 'weight'.
+
+If you index ``x`` at position 1 you get a structure::
+
+ >>> x[1]
+ ('Fido', 3, 27.0)
+
+You can access and modify individual fields of a structured array by indexing
+with the field name::
+
+ >>> x['age']
+ array([9, 3], dtype=int32)
+ >>> x['age'] = 5
+ >>> x
+ array([('Rex', 5, 81.), ('Fido', 5, 27.)],
+ dtype=[('name', 'U10'), ('age', '<i4'), ('weight', '<f4')])
+
+Structured datatypes are designed to be able to mimic 'structs' in the C
+language, and share a similar memory layout. They are meant for interfacing with
+C code and for low-level manipulation of structured buffers, for example for
+interpreting binary blobs. For these purposes they support specialized features
+such as subarrays, nested datatypes, and unions, and allow control over the
+memory layout of the structure.
+
+Users looking to manipulate tabular data, such as stored in csv files, may find
+other pydata projects more suitable, such as xarray, pandas, or DataArray.
+These provide a high-level interface for tabular data analysis and are better
+optimized for that use. For instance, the C-struct-like memory layout of
+structured arrays in numpy can lead to poor cache behavior in comparison.
+
+.. _defining-structured-types:
+
+Structured Datatypes
+====================
+
+A structured datatype can be thought of as a sequence of bytes of a certain
+length (the structure's :term:`itemsize`) which is interpreted as a collection
+of fields. Each field has a name, a datatype, and a byte offset within the
+structure. The datatype of a field may be any numpy datatype including other
+structured datatypes, and it may also be a :term:`subarray data type` which
+behaves like an ndarray of a specified shape. The offsets of the fields are
+arbitrary, and fields may even overlap. These offsets are usually determined
+automatically by numpy, but can also be specified.
+
+Structured Datatype Creation
+----------------------------
+
+Structured datatypes may be created using the function :func:`numpy.dtype`.
+There are 4 alternative forms of specification which vary in flexibility and
+conciseness. These are further documented in the
+:ref:`Data Type Objects <arrays.dtypes.constructing>` reference page, and in
+summary they are:
+
+1. A list of tuples, one tuple per field
+
+ Each tuple has the form ``(fieldname, datatype, shape)`` where shape is
+ optional. ``fieldname`` is a string (or tuple if titles are used, see
+ :ref:`Field Titles <titles>` below), ``datatype`` may be any object
+ convertible to a datatype, and ``shape`` is a tuple of integers specifying
+ subarray shape.
+
+ >>> np.dtype([('x', 'f4'), ('y', np.float32), ('z', 'f4', (2, 2))])
+ dtype([('x', '<f4'), ('y', '<f4'), ('z', '<f4', (2, 2))])
+
+ If ``fieldname`` is the empty string ``''``, the field will be given a
+ default name of the form ``f#``, where ``#`` is the integer index of the
+ field, counting from 0 from the left::
+
+ >>> np.dtype([('x', 'f4'), ('', 'i4'), ('z', 'i8')])
+ dtype([('x', '<f4'), ('f1', '<i4'), ('z', '<i8')])
+
+ The byte offsets of the fields within the structure and the total
+ structure itemsize are determined automatically.
+
+2. A string of comma-separated dtype specifications
+
+ In this shorthand notation any of the :ref:`string dtype specifications
+ <arrays.dtypes.constructing>` may be used in a string and separated by
+ commas. The itemsize and byte offsets of the fields are determined
+ automatically, and the field names are given the default names ``f0``,
+ ``f1``, etc. ::
+
+ >>> np.dtype('i8, f4, S3')
+ dtype([('f0', '<i8'), ('f1', '<f4'), ('f2', 'S3')])
+ >>> np.dtype('3int8, float32, (2, 3)float64')
+ dtype([('f0', 'i1', (3,)), ('f1', '<f4'), ('f2', '<f8', (2, 3))])
+
+3. A dictionary of field parameter arrays
+
+ This is the most flexible form of specification since it allows control
+ over the byte-offsets of the fields and the itemsize of the structure.
+
+ The dictionary has two required keys, 'names' and 'formats', and four
+ optional keys, 'offsets', 'itemsize', 'aligned' and 'titles'. The values
+ for 'names' and 'formats' should respectively be a list of field names and
+ a list of dtype specifications, of the same length. The optional 'offsets'
+ value should be a list of integer byte-offsets, one for each field within
+ the structure. If 'offsets' is not given the offsets are determined
+ automatically. The optional 'itemsize' value should be an integer
+ describing the total size in bytes of the dtype, which must be large
+ enough to contain all the fields.
+ ::
+
+ >>> np.dtype({'names': ['col1', 'col2'], 'formats': ['i4', 'f4']})
+ dtype([('col1', '<i4'), ('col2', '<f4')])
+ >>> np.dtype({'names': ['col1', 'col2'],
+ ... 'formats': ['i4', 'f4'],
+ ... 'offsets': [0, 4],
+ ... 'itemsize': 12})
+ dtype({'names':['col1','col2'], 'formats':['<i4','<f4'], 'offsets':[0,4], 'itemsize':12})
+
+ Offsets may be chosen such that the fields overlap, though this will mean
+ that assigning to one field may clobber any overlapping field's data. As
+ an exception, fields of :class:`numpy.object_` type cannot overlap with
+ other fields, because of the risk of clobbering the internal object
+ pointer and then dereferencing it.
+
+ The optional 'aligned' value can be set to ``True`` to make the automatic
+ offset computation use aligned offsets (see :ref:`offsets-and-alignment`),
+ as if the 'align' keyword argument of :func:`numpy.dtype` had been set to
+ True.
+
+ The optional 'titles' value should be a list of titles of the same length
+ as 'names', see :ref:`Field Titles <titles>` below.
+
+4. A dictionary of field names
+
+ The use of this form of specification is discouraged, but documented here
+ because older numpy code may use it. The keys of the dictionary are the
+ field names and the values are tuples specifying type and offset::
+
+ >>> np.dtype({'col1': ('i1', 0), 'col2': ('f4', 1)})
+ dtype([('col1', 'i1'), ('col2', '<f4')])
+
+ This form is discouraged because Python dictionaries do not preserve order
+ in Python versions before Python 3.6, and the order of the fields in a
+ structured dtype has meaning. :ref:`Field Titles <titles>` may be
+ specified by using a 3-tuple, see below.
+
+Manipulating and Displaying Structured Datatypes
+------------------------------------------------
+
+The list of field names of a structured datatype can be found in the ``names``
+attribute of the dtype object::
+
+ >>> d = np.dtype([('x', 'i8'), ('y', 'f4')])
+ >>> d.names
+ ('x', 'y')
+
+The field names may be modified by assigning to the ``names`` attribute using a
+sequence of strings of the same length.
+
+The dtype object also has a dictionary-like attribute, ``fields``, whose keys
+are the field names (and :ref:`Field Titles <titles>`, see below) and whose
+values are tuples containing the dtype and byte offset of each field. ::
+
+ >>> d.fields
+ mappingproxy({'x': (dtype('int64'), 0), 'y': (dtype('float32'), 8)})
+
+Both the ``names`` and ``fields`` attributes will equal ``None`` for
+unstructured arrays. The recommended way to test if a dtype is structured is
+with `if dt.names is not None` rather than `if dt.names`, to account for dtypes
+with 0 fields.
+
+The string representation of a structured datatype is shown in the "list of
+tuples" form if possible, otherwise numpy falls back to using the more general
+dictionary form.
+
+.. _offsets-and-alignment:
+
+Automatic Byte Offsets and Alignment
+------------------------------------
+
+Numpy uses one of two methods to automatically determine the field byte offsets
+and the overall itemsize of a structured datatype, depending on whether
+``align=True`` was specified as a keyword argument to :func:`numpy.dtype`.
+
+By default (``align=False``), numpy will pack the fields together such that
+each field starts at the byte offset the previous field ended, and the fields
+are contiguous in memory. ::
+
+ >>> def print_offsets(d):
+ ... print("offsets:", [d.fields[name][1] for name in d.names])
+ ... print("itemsize:", d.itemsize)
+ >>> print_offsets(np.dtype('u1, u1, i4, u1, i8, u2'))
+ offsets: [0, 1, 2, 6, 7, 15]
+ itemsize: 17
+
+If ``align=True`` is set, numpy will pad the structure in the same way many C
+compilers would pad a C-struct. Aligned structures can give a performance
+improvement in some cases, at the cost of increased datatype size. Padding
+bytes are inserted between fields such that each field's byte offset will be a
+multiple of that field's alignment, which is usually equal to the field's size
+in bytes for simple datatypes, see :c:member:`PyArray_Descr.alignment`. The
+structure will also have trailing padding added so that its itemsize is a
+multiple of the largest field's alignment. ::
+
+ >>> print_offsets(np.dtype('u1, u1, i4, u1, i8, u2', align=True))
+ offsets: [0, 1, 4, 8, 16, 24]
+ itemsize: 32
+
+Note that although almost all modern C compilers pad in this way by default,
+padding in C structs is C-implementation-dependent so this memory layout is not
+guaranteed to exactly match that of a corresponding struct in a C program. Some
+work may be needed, either on the numpy side or the C side, to obtain exact
+correspondence.
+
+If offsets were specified using the optional ``offsets`` key in the
+dictionary-based dtype specification, setting ``align=True`` will check that
+each field's offset is a multiple of its size and that the itemsize is a
+multiple of the largest field size, and raise an exception if not.
+
+If the offsets of the fields and itemsize of a structured array satisfy the
+alignment conditions, the array will have the ``ALIGNED`` :attr:`flag
+<numpy.ndarray.flags>` set.
+
+A convenience function :func:`numpy.lib.recfunctions.repack_fields` converts an
+aligned dtype or array to a packed one and vice versa. It takes either a dtype
+or structured ndarray as an argument, and returns a copy with fields re-packed,
+with or without padding bytes.
+
+.. _titles:
+
+Field Titles
+------------
+
+In addition to field names, fields may also have an associated :term:`title`,
+an alternate name, which is sometimes used as an additional description or
+alias for the field. The title may be used to index an array, just like a
+field name.
+
+To add titles when using the list-of-tuples form of dtype specification, the
+field name may be specified as a tuple of two strings instead of a single
+string, which will be the field's title and field name respectively. For
+example::
+
+ >>> np.dtype([(('my title', 'name'), 'f4')])
+ dtype([(('my title', 'name'), '<f4')])
+
+When using the first form of dictionary-based specification, the titles may be
+supplied as an extra ``'titles'`` key as described above. When using the second
+(discouraged) dictionary-based specification, the title can be supplied by
+providing a 3-element tuple ``(datatype, offset, title)`` instead of the usual
+2-element tuple::
+
+ >>> np.dtype({'name': ('i4', 0, 'my title')})
+ dtype([(('my title', 'name'), '<i4')])
+
+The ``dtype.fields`` dictionary will contain titles as keys, if any
+titles are used. This means effectively that a field with a title will be
+represented twice in the fields dictionary. The tuple values for these fields
+will also have a third element, the field title. Because of this, and because
+the ``names`` attribute preserves the field order while the ``fields``
+attribute may not, it is recommended to iterate through the fields of a dtype
+using the ``names`` attribute of the dtype, which will not list titles, as
+in::
+
+ >>> for name in d.names:
+ ... print(d.fields[name][:2])
+ (dtype('int64'), 0)
+ (dtype('float32'), 8)
+
+Union types
+-----------
+
+Structured datatypes are implemented in numpy to have base type
+:class:`numpy.void` by default, but it is possible to interpret other numpy
+types as structured types using the ``(base_dtype, dtype)`` form of dtype
+specification described in
+:ref:`Data Type Objects <arrays.dtypes.constructing>`. Here, ``base_dtype`` is
+the desired underlying dtype, and fields and flags will be copied from
+``dtype``. This dtype is similar to a 'union' in C.
+
+Indexing and Assignment to Structured arrays
+============================================
+
+Assigning data to a Structured Array
+------------------------------------
+
+There are a number of ways to assign values to a structured array: Using python
+tuples, using scalar values, or using other structured arrays.
+
+Assignment from Python Native Types (Tuples)
+````````````````````````````````````````````
+
+The simplest way to assign values to a structured array is using python tuples.
+Each assigned value should be a tuple of length equal to the number of fields
+in the array, and not a list or array as these will trigger numpy's
+broadcasting rules. The tuple's elements are assigned to the successive fields
+of the array, from left to right::
+
+ >>> x = np.array([(1, 2, 3), (4, 5, 6)], dtype='i8, f4, f8')
+ >>> x[1] = (7, 8, 9)
+ >>> x
+ array([(1, 2., 3.), (7, 8., 9.)],
+ dtype=[('f0', '<i8'), ('f1', '<f4'), ('f2', '<f8')])
+
+Assignment from Scalars
+```````````````````````
+
+A scalar assigned to a structured element will be assigned to all fields. This
+happens when a scalar is assigned to a structured array, or when an
+unstructured array is assigned to a structured array::
+
+ >>> x = np.zeros(2, dtype='i8, f4, ?, S1')
+ >>> x[:] = 3
+ >>> x
+ array([(3, 3., True, b'3'), (3, 3., True, b'3')],
+ dtype=[('f0', '<i8'), ('f1', '<f4'), ('f2', '?'), ('f3', 'S1')])
+ >>> x[:] = np.arange(2)
+ >>> x
+ array([(0, 0., False, b'0'), (1, 1., True, b'1')],
+ dtype=[('f0', '<i8'), ('f1', '<f4'), ('f2', '?'), ('f3', 'S1')])
+
+Structured arrays can also be assigned to unstructured arrays, but only if the
+structured datatype has just a single field::
+
+ >>> twofield = np.zeros(2, dtype=[('A', 'i4'), ('B', 'i4')])
+ >>> onefield = np.zeros(2, dtype=[('A', 'i4')])
+ >>> nostruct = np.zeros(2, dtype='i4')
+ >>> nostruct[:] = twofield
+ Traceback (most recent call last):
+ ...
+ TypeError: Cannot cast array data from dtype([('A', '<i4'), ('B', '<i4')]) to dtype('int32') according to the rule 'unsafe'
+
+Assignment from other Structured Arrays
+```````````````````````````````````````
+
+Assignment between two structured arrays occurs as if the source elements had
+been converted to tuples and then assigned to the destination elements. That
+is, the first field of the source array is assigned to the first field of the
+destination array, and the second field likewise, and so on, regardless of
+field names. Structured arrays with a different number of fields cannot be
+assigned to each other. Bytes of the destination structure which are not
+included in any of the fields are unaffected. ::
+
+ >>> a = np.zeros(3, dtype=[('a', 'i8'), ('b', 'f4'), ('c', 'S3')])
+ >>> b = np.ones(3, dtype=[('x', 'f4'), ('y', 'S3'), ('z', 'O')])
+ >>> b[:] = a
+ >>> b
+ array([(0., b'0.0', b''), (0., b'0.0', b''), (0., b'0.0', b'')],
+ dtype=[('x', '<f4'), ('y', 'S3'), ('z', 'O')])
+
+
+Assignment involving subarrays
+``````````````````````````````
+
+When assigning to fields which are subarrays, the assigned value will first be
+broadcast to the shape of the subarray.
+
+Indexing Structured Arrays
+--------------------------
+
+Accessing Individual Fields
+```````````````````````````
+
+Individual fields of a structured array may be accessed and modified by indexing
+the array with the field name. ::
+
+ >>> x = np.array([(1, 2), (3, 4)], dtype=[('foo', 'i8'), ('bar', 'f4')])
+ >>> x['foo']
+ array([1, 3])
+ >>> x['foo'] = 10
+ >>> x
+ array([(10, 2.), (10, 4.)],
+ dtype=[('foo', '<i8'), ('bar', '<f4')])
+
+The resulting array is a view into the original array. It shares the same
+memory locations and writing to the view will modify the original array. ::
+
+ >>> y = x['bar']
+ >>> y[:] = 11
+ >>> x
+ array([(10, 11.), (10, 11.)],
+ dtype=[('foo', '<i8'), ('bar', '<f4')])
+
+This view has the same dtype and itemsize as the indexed field, so it is
+typically a non-structured array, except in the case of nested structures.
+
+ >>> y.dtype, y.shape, y.strides
+ (dtype('float32'), (2,), (12,))
+
+If the accessed field is a subarray, the dimensions of the subarray
+are appended to the shape of the result::
+
+ >>> x = np.zeros((2, 2), dtype=[('a', np.int32), ('b', np.float64, (3, 3))])
+ >>> x['a'].shape
+ (2, 2)
+ >>> x['b'].shape
+ (2, 2, 3, 3)
+
+Accessing Multiple Fields
+```````````````````````````
+
+One can index and assign to a structured array with a multi-field index, where
+the index is a list of field names.
+
+.. warning::
+ The behavior of multi-field indexes changed from Numpy 1.15 to Numpy 1.16.
+
+The result of indexing with a multi-field index is a view into the original
+array, as follows::
+
+ >>> a = np.zeros(3, dtype=[('a', 'i4'), ('b', 'i4'), ('c', 'f4')])
+ >>> a[['a', 'c']]
+ array([(0, 0.), (0, 0.), (0, 0.)],
+ dtype={'names':['a','c'], 'formats':['<i4','<f4'], 'offsets':[0,8], 'itemsize':12})
+
+Assignment to the view modifies the original array. The view's fields will be
+in the order they were indexed. Note that unlike for single-field indexing, the
+dtype of the view has the same itemsize as the original array, and has fields
+at the same offsets as in the original array, and unindexed fields are merely
+missing.
+
+.. warning::
+ In Numpy 1.15, indexing an array with a multi-field index returned a copy of
+ the result above, but with fields packed together in memory as if
+ passed through :func:`numpy.lib.recfunctions.repack_fields`.
+
+ The new behavior as of Numpy 1.16 leads to extra "padding" bytes at the
+ location of unindexed fields compared to 1.15. You will need to update any
+ code which depends on the data having a "packed" layout. For instance code
+ such as::
+
+ >>> a[['a', 'c']].view('i8') # Fails in Numpy 1.16
+ Traceback (most recent call last):
+ File "<stdin>", line 1, in <module>
+ ValueError: When changing to a smaller dtype, its size must be a divisor of the size of original dtype
+
+ will need to be changed. This code has raised a ``FutureWarning`` since
+ Numpy 1.12, and similar code has raised ``FutureWarning`` since 1.7.
+
+ In 1.16 a number of functions have been introduced in the
+ :mod:`numpy.lib.recfunctions` module to help users account for this
+ change. These are
+ :func:`numpy.lib.recfunctions.repack_fields`.
+ :func:`numpy.lib.recfunctions.structured_to_unstructured`,
+ :func:`numpy.lib.recfunctions.unstructured_to_structured`,
+ :func:`numpy.lib.recfunctions.apply_along_fields`,
+ :func:`numpy.lib.recfunctions.assign_fields_by_name`, and
+ :func:`numpy.lib.recfunctions.require_fields`.
+
+ The function :func:`numpy.lib.recfunctions.repack_fields` can always be
+ used to reproduce the old behavior, as it will return a packed copy of the
+ structured array. The code above, for example, can be replaced with:
+
+ >>> from numpy.lib.recfunctions import repack_fields
+ >>> repack_fields(a[['a', 'c']]).view('i8') # supported in 1.16
+ array([0, 0, 0])
+
+ Furthermore, numpy now provides a new function
+ :func:`numpy.lib.recfunctions.structured_to_unstructured` which is a safer
+ and more efficient alternative for users who wish to convert structured
+ arrays to unstructured arrays, as the view above is often indeded to do.
+ This function allows safe conversion to an unstructured type taking into
+ account padding, often avoids a copy, and also casts the datatypes
+ as needed, unlike the view. Code such as:
+
+ >>> b = np.zeros(3, dtype=[('x', 'f4'), ('y', 'f4'), ('z', 'f4')])
+ >>> b[['x', 'z']].view('f4')
+ array([0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32)
+
+ can be made safer by replacing with:
+
+ >>> from numpy.lib.recfunctions import structured_to_unstructured
+ >>> structured_to_unstructured(b[['x', 'z']])
+ array([0, 0, 0])
+
+
+Assignment to an array with a multi-field index modifies the original array::
+
+ >>> a[['a', 'c']] = (2, 3)
+ >>> a
+ array([(2, 0, 3.), (2, 0, 3.), (2, 0, 3.)],
+ dtype=[('a', '<i4'), ('b', '<i4'), ('c', '<f4')])
+
+This obeys the structured array assignment rules described above. For example,
+this means that one can swap the values of two fields using appropriate
+multi-field indexes::
+
+ >>> a[['a', 'c']] = a[['c', 'a']]
+
+Indexing with an Integer to get a Structured Scalar
+```````````````````````````````````````````````````
+
+Indexing a single element of a structured array (with an integer index) returns
+a structured scalar::
+
+ >>> x = np.array([(1, 2., 3.)], dtype='i, f, f')
+ >>> scalar = x[0]
+ >>> scalar
+ (1, 2., 3.)
+ >>> type(scalar)
+ <class 'numpy.void'>
+
+Unlike other numpy scalars, structured scalars are mutable and act like views
+into the original array, such that modifying the scalar will modify the
+original array. Structured scalars also support access and assignment by field
+name::
+
+ >>> x = np.array([(1, 2), (3, 4)], dtype=[('foo', 'i8'), ('bar', 'f4')])
+ >>> s = x[0]
+ >>> s['bar'] = 100
+ >>> x
+ array([(1, 100.), (3, 4.)],
+ dtype=[('foo', '<i8'), ('bar', '<f4')])
+
+Similarly to tuples, structured scalars can also be indexed with an integer::
+
+ >>> scalar = np.array([(1, 2., 3.)], dtype='i, f, f')[0]
+ >>> scalar[0]
+ 1
+ >>> scalar[1] = 4
+
+Thus, tuples might be thought of as the native Python equivalent to numpy's
+structured types, much like native python integers are the equivalent to
+numpy's integer types. Structured scalars may be converted to a tuple by
+calling `numpy.ndarray.item`::
+
+ >>> scalar.item(), type(scalar.item())
+ ((1, 4.0, 3.0), <class 'tuple'>)
+
+Viewing Structured Arrays Containing Objects
+--------------------------------------------
+
+In order to prevent clobbering object pointers in fields of
+:class:`object` type, numpy currently does not allow views of structured
+arrays containing objects.
+
+Structure Comparison
+--------------------
+
+If the dtypes of two void structured arrays are equal, testing the equality of
+the arrays will result in a boolean array with the dimensions of the original
+arrays, with elements set to ``True`` where all fields of the corresponding
+structures are equal. Structured dtypes are equal if the field names,
+dtypes and titles are the same, ignoring endianness, and the fields are in
+the same order::
+
+ >>> a = np.zeros(2, dtype=[('a', 'i4'), ('b', 'i4')])
+ >>> b = np.ones(2, dtype=[('a', 'i4'), ('b', 'i4')])
+ >>> a == b
+ array([False, False])
+
+Currently, if the dtypes of two void structured arrays are not equivalent the
+comparison fails, returning the scalar value ``False``. This behavior is
+deprecated as of numpy 1.10 and will raise an error or perform elementwise
+comparison in the future.
+
+The ``<`` and ``>`` operators always return ``False`` when comparing void
+structured arrays, and arithmetic and bitwise operations are not supported.
+
+Record Arrays
+=============
+
+As an optional convenience numpy provides an ndarray subclass,
+:class:`numpy.recarray` that allows access to fields of structured arrays by
+attribute instead of only by index.
+Record arrays use a special datatype, :class:`numpy.record`, that allows
+field access by attribute on the structured scalars obtained from the array.
+The :mod:`numpy.rec` module provides functions for creating recarrays from
+various objects.
+Additional helper functions for creating and manipulating structured arrays
+can be found in :mod:`numpy.lib.recfunctions`.
+
+The simplest way to create a record array is with ``numpy.rec.array``::
+
+ >>> recordarr = np.rec.array([(1, 2., 'Hello'), (2, 3., "World")],
+ ... dtype=[('foo', 'i4'),('bar', 'f4'), ('baz', 'S10')])
+ >>> recordarr.bar
+ array([ 2., 3.], dtype=float32)
+ >>> recordarr[1:2]
+ rec.array([(2, 3., b'World')],
+ dtype=[('foo', '<i4'), ('bar', '<f4'), ('baz', 'S10')])
+ >>> recordarr[1:2].foo
+ array([2], dtype=int32)
+ >>> recordarr.foo[1:2]
+ array([2], dtype=int32)
+ >>> recordarr[1].baz
+ b'World'
+
+:func:`numpy.rec.array` can convert a wide variety of arguments into record
+arrays, including structured arrays::
+
+ >>> arr = np.array([(1, 2., 'Hello'), (2, 3., "World")],
+ ... dtype=[('foo', 'i4'), ('bar', 'f4'), ('baz', 'S10')])
+ >>> recordarr = np.rec.array(arr)
+
+The :mod:`numpy.rec` module provides a number of other convenience functions for
+creating record arrays, see :ref:`record array creation routines
+<routines.array-creation.rec>`.
+
+A record array representation of a structured array can be obtained using the
+appropriate `view <numpy-ndarray-view>`_::
+
+ >>> arr = np.array([(1, 2., 'Hello'), (2, 3., "World")],
+ ... dtype=[('foo', 'i4'),('bar', 'f4'), ('baz', 'a10')])
+ >>> recordarr = arr.view(dtype=np.dtype((np.record, arr.dtype)),
+ ... type=np.recarray)
+
+For convenience, viewing an ndarray as type :class:`numpy.recarray` will
+automatically convert to :class:`numpy.record` datatype, so the dtype can be left
+out of the view::
+
+ >>> recordarr = arr.view(np.recarray)
+ >>> recordarr.dtype
+ dtype((numpy.record, [('foo', '<i4'), ('bar', '<f4'), ('baz', 'S10')]))
+
+To get back to a plain ndarray both the dtype and type must be reset. The
+following view does so, taking into account the unusual case that the
+recordarr was not a structured type::
+
+ >>> arr2 = recordarr.view(recordarr.dtype.fields or recordarr.dtype, np.ndarray)
+
+Record array fields accessed by index or by attribute are returned as a record
+array if the field has a structured type but as a plain ndarray otherwise. ::
+
+ >>> recordarr = np.rec.array([('Hello', (1, 2)), ("World", (3, 4))],
+ ... dtype=[('foo', 'S6'),('bar', [('A', int), ('B', int)])])
+ >>> type(recordarr.foo)
+ <class 'numpy.ndarray'>
+ >>> type(recordarr.bar)
+ <class 'numpy.recarray'>
+
+Note that if a field has the same name as an ndarray attribute, the ndarray
+attribute takes precedence. Such fields will be inaccessible by attribute but
+will still be accessible by index.
+
Recarray Helper Functions
-*************************
+-------------------------
.. automodule:: numpy.lib.recfunctions
:members:
diff --git a/doc/source/user/basics.subclassing.rst b/doc/source/user/basics.subclassing.rst
index 43315521c..8ffa31688 100644
--- a/doc/source/user/basics.subclassing.rst
+++ b/doc/source/user/basics.subclassing.rst
@@ -4,4 +4,751 @@
Subclassing ndarray
*******************
-.. automodule:: numpy.doc.subclassing
+Introduction
+------------
+
+Subclassing ndarray is relatively simple, but it has some complications
+compared to other Python objects. On this page we explain the machinery
+that allows you to subclass ndarray, and the implications for
+implementing a subclass.
+
+ndarrays and object creation
+============================
+
+Subclassing ndarray is complicated by the fact that new instances of
+ndarray classes can come about in three different ways. These are:
+
+#. Explicit constructor call - as in ``MySubClass(params)``. This is
+ the usual route to Python instance creation.
+#. View casting - casting an existing ndarray as a given subclass
+#. New from template - creating a new instance from a template
+ instance. Examples include returning slices from a subclassed array,
+ creating return types from ufuncs, and copying arrays. See
+ :ref:`new-from-template` for more details
+
+The last two are characteristics of ndarrays - in order to support
+things like array slicing. The complications of subclassing ndarray are
+due to the mechanisms numpy has to support these latter two routes of
+instance creation.
+
+.. _view-casting:
+
+View casting
+------------
+
+*View casting* is the standard ndarray mechanism by which you take an
+ndarray of any subclass, and return a view of the array as another
+(specified) subclass:
+
+>>> import numpy as np
+>>> # create a completely useless ndarray subclass
+>>> class C(np.ndarray): pass
+>>> # create a standard ndarray
+>>> arr = np.zeros((3,))
+>>> # take a view of it, as our useless subclass
+>>> c_arr = arr.view(C)
+>>> type(c_arr)
+<class 'C'>
+
+.. _new-from-template:
+
+Creating new from template
+--------------------------
+
+New instances of an ndarray subclass can also come about by a very
+similar mechanism to :ref:`view-casting`, when numpy finds it needs to
+create a new instance from a template instance. The most obvious place
+this has to happen is when you are taking slices of subclassed arrays.
+For example:
+
+>>> v = c_arr[1:]
+>>> type(v) # the view is of type 'C'
+<class 'C'>
+>>> v is c_arr # but it's a new instance
+False
+
+The slice is a *view* onto the original ``c_arr`` data. So, when we
+take a view from the ndarray, we return a new ndarray, of the same
+class, that points to the data in the original.
+
+There are other points in the use of ndarrays where we need such views,
+such as copying arrays (``c_arr.copy()``), creating ufunc output arrays
+(see also :ref:`array-wrap`), and reducing methods (like
+``c_arr.mean()``).
+
+Relationship of view casting and new-from-template
+--------------------------------------------------
+
+These paths both use the same machinery. We make the distinction here,
+because they result in different input to your methods. Specifically,
+:ref:`view-casting` means you have created a new instance of your array
+type from any potential subclass of ndarray. :ref:`new-from-template`
+means you have created a new instance of your class from a pre-existing
+instance, allowing you - for example - to copy across attributes that
+are particular to your subclass.
+
+Implications for subclassing
+----------------------------
+
+If we subclass ndarray, we need to deal not only with explicit
+construction of our array type, but also :ref:`view-casting` or
+:ref:`new-from-template`. NumPy has the machinery to do this, and it is
+this machinery that makes subclassing slightly non-standard.
+
+There are two aspects to the machinery that ndarray uses to support
+views and new-from-template in subclasses.
+
+The first is the use of the ``ndarray.__new__`` method for the main work
+of object initialization, rather then the more usual ``__init__``
+method. The second is the use of the ``__array_finalize__`` method to
+allow subclasses to clean up after the creation of views and new
+instances from templates.
+
+A brief Python primer on ``__new__`` and ``__init__``
+=====================================================
+
+``__new__`` is a standard Python method, and, if present, is called
+before ``__init__`` when we create a class instance. See the `python
+__new__ documentation
+<https://docs.python.org/reference/datamodel.html#object.__new__>`_ for more detail.
+
+For example, consider the following Python code:
+
+.. testcode::
+
+ class C:
+ def __new__(cls, *args):
+ print('Cls in __new__:', cls)
+ print('Args in __new__:', args)
+ # The `object` type __new__ method takes a single argument.
+ return object.__new__(cls)
+
+ def __init__(self, *args):
+ print('type(self) in __init__:', type(self))
+ print('Args in __init__:', args)
+
+meaning that we get:
+
+>>> c = C('hello')
+Cls in __new__: <class 'C'>
+Args in __new__: ('hello',)
+type(self) in __init__: <class 'C'>
+Args in __init__: ('hello',)
+
+When we call ``C('hello')``, the ``__new__`` method gets its own class
+as first argument, and the passed argument, which is the string
+``'hello'``. After python calls ``__new__``, it usually (see below)
+calls our ``__init__`` method, with the output of ``__new__`` as the
+first argument (now a class instance), and the passed arguments
+following.
+
+As you can see, the object can be initialized in the ``__new__``
+method or the ``__init__`` method, or both, and in fact ndarray does
+not have an ``__init__`` method, because all the initialization is
+done in the ``__new__`` method.
+
+Why use ``__new__`` rather than just the usual ``__init__``? Because
+in some cases, as for ndarray, we want to be able to return an object
+of some other class. Consider the following:
+
+.. testcode::
+
+ class D(C):
+ def __new__(cls, *args):
+ print('D cls is:', cls)
+ print('D args in __new__:', args)
+ return C.__new__(C, *args)
+
+ def __init__(self, *args):
+ # we never get here
+ print('In D __init__')
+
+meaning that:
+
+>>> obj = D('hello')
+D cls is: <class 'D'>
+D args in __new__: ('hello',)
+Cls in __new__: <class 'C'>
+Args in __new__: ('hello',)
+>>> type(obj)
+<class 'C'>
+
+The definition of ``C`` is the same as before, but for ``D``, the
+``__new__`` method returns an instance of class ``C`` rather than
+``D``. Note that the ``__init__`` method of ``D`` does not get
+called. In general, when the ``__new__`` method returns an object of
+class other than the class in which it is defined, the ``__init__``
+method of that class is not called.
+
+This is how subclasses of the ndarray class are able to return views
+that preserve the class type. When taking a view, the standard
+ndarray machinery creates the new ndarray object with something
+like::
+
+ obj = ndarray.__new__(subtype, shape, ...
+
+where ``subdtype`` is the subclass. Thus the returned view is of the
+same class as the subclass, rather than being of class ``ndarray``.
+
+That solves the problem of returning views of the same type, but now
+we have a new problem. The machinery of ndarray can set the class
+this way, in its standard methods for taking views, but the ndarray
+``__new__`` method knows nothing of what we have done in our own
+``__new__`` method in order to set attributes, and so on. (Aside -
+why not call ``obj = subdtype.__new__(...`` then? Because we may not
+have a ``__new__`` method with the same call signature).
+
+The role of ``__array_finalize__``
+==================================
+
+``__array_finalize__`` is the mechanism that numpy provides to allow
+subclasses to handle the various ways that new instances get created.
+
+Remember that subclass instances can come about in these three ways:
+
+#. explicit constructor call (``obj = MySubClass(params)``). This will
+ call the usual sequence of ``MySubClass.__new__`` then (if it exists)
+ ``MySubClass.__init__``.
+#. :ref:`view-casting`
+#. :ref:`new-from-template`
+
+Our ``MySubClass.__new__`` method only gets called in the case of the
+explicit constructor call, so we can't rely on ``MySubClass.__new__`` or
+``MySubClass.__init__`` to deal with the view casting and
+new-from-template. It turns out that ``MySubClass.__array_finalize__``
+*does* get called for all three methods of object creation, so this is
+where our object creation housekeeping usually goes.
+
+* For the explicit constructor call, our subclass will need to create a
+ new ndarray instance of its own class. In practice this means that
+ we, the authors of the code, will need to make a call to
+ ``ndarray.__new__(MySubClass,...)``, a class-hierarchy prepared call to
+ ``super(MySubClass, cls).__new__(cls, ...)``, or do view casting of an
+ existing array (see below)
+* For view casting and new-from-template, the equivalent of
+ ``ndarray.__new__(MySubClass,...`` is called, at the C level.
+
+The arguments that ``__array_finalize__`` receives differ for the three
+methods of instance creation above.
+
+The following code allows us to look at the call sequences and arguments:
+
+.. testcode::
+
+ import numpy as np
+
+ class C(np.ndarray):
+ def __new__(cls, *args, **kwargs):
+ print('In __new__ with class %s' % cls)
+ return super(C, cls).__new__(cls, *args, **kwargs)
+
+ def __init__(self, *args, **kwargs):
+ # in practice you probably will not need or want an __init__
+ # method for your subclass
+ print('In __init__ with class %s' % self.__class__)
+
+ def __array_finalize__(self, obj):
+ print('In array_finalize:')
+ print(' self type is %s' % type(self))
+ print(' obj type is %s' % type(obj))
+
+
+Now:
+
+>>> # Explicit constructor
+>>> c = C((10,))
+In __new__ with class <class 'C'>
+In array_finalize:
+ self type is <class 'C'>
+ obj type is <type 'NoneType'>
+In __init__ with class <class 'C'>
+>>> # View casting
+>>> a = np.arange(10)
+>>> cast_a = a.view(C)
+In array_finalize:
+ self type is <class 'C'>
+ obj type is <type 'numpy.ndarray'>
+>>> # Slicing (example of new-from-template)
+>>> cv = c[:1]
+In array_finalize:
+ self type is <class 'C'>
+ obj type is <class 'C'>
+
+The signature of ``__array_finalize__`` is::
+
+ def __array_finalize__(self, obj):
+
+One sees that the ``super`` call, which goes to
+``ndarray.__new__``, passes ``__array_finalize__`` the new object, of our
+own class (``self``) as well as the object from which the view has been
+taken (``obj``). As you can see from the output above, the ``self`` is
+always a newly created instance of our subclass, and the type of ``obj``
+differs for the three instance creation methods:
+
+* When called from the explicit constructor, ``obj`` is ``None``
+* When called from view casting, ``obj`` can be an instance of any
+ subclass of ndarray, including our own.
+* When called in new-from-template, ``obj`` is another instance of our
+ own subclass, that we might use to update the new ``self`` instance.
+
+Because ``__array_finalize__`` is the only method that always sees new
+instances being created, it is the sensible place to fill in instance
+defaults for new object attributes, among other tasks.
+
+This may be clearer with an example.
+
+Simple example - adding an extra attribute to ndarray
+-----------------------------------------------------
+
+.. testcode::
+
+ import numpy as np
+
+ class InfoArray(np.ndarray):
+
+ def __new__(subtype, shape, dtype=float, buffer=None, offset=0,
+ strides=None, order=None, info=None):
+ # Create the ndarray instance of our type, given the usual
+ # ndarray input arguments. This will call the standard
+ # ndarray constructor, but return an object of our type.
+ # It also triggers a call to InfoArray.__array_finalize__
+ obj = super(InfoArray, subtype).__new__(subtype, shape, dtype,
+ buffer, offset, strides,
+ order)
+ # set the new 'info' attribute to the value passed
+ obj.info = info
+ # Finally, we must return the newly created object:
+ return obj
+
+ def __array_finalize__(self, obj):
+ # ``self`` is a new object resulting from
+ # ndarray.__new__(InfoArray, ...), therefore it only has
+ # attributes that the ndarray.__new__ constructor gave it -
+ # i.e. those of a standard ndarray.
+ #
+ # We could have got to the ndarray.__new__ call in 3 ways:
+ # From an explicit constructor - e.g. InfoArray():
+ # obj is None
+ # (we're in the middle of the InfoArray.__new__
+ # constructor, and self.info will be set when we return to
+ # InfoArray.__new__)
+ if obj is None: return
+ # From view casting - e.g arr.view(InfoArray):
+ # obj is arr
+ # (type(obj) can be InfoArray)
+ # From new-from-template - e.g infoarr[:3]
+ # type(obj) is InfoArray
+ #
+ # Note that it is here, rather than in the __new__ method,
+ # that we set the default value for 'info', because this
+ # method sees all creation of default objects - with the
+ # InfoArray.__new__ constructor, but also with
+ # arr.view(InfoArray).
+ self.info = getattr(obj, 'info', None)
+ # We do not need to return anything
+
+
+Using the object looks like this:
+
+ >>> obj = InfoArray(shape=(3,)) # explicit constructor
+ >>> type(obj)
+ <class 'InfoArray'>
+ >>> obj.info is None
+ True
+ >>> obj = InfoArray(shape=(3,), info='information')
+ >>> obj.info
+ 'information'
+ >>> v = obj[1:] # new-from-template - here - slicing
+ >>> type(v)
+ <class 'InfoArray'>
+ >>> v.info
+ 'information'
+ >>> arr = np.arange(10)
+ >>> cast_arr = arr.view(InfoArray) # view casting
+ >>> type(cast_arr)
+ <class 'InfoArray'>
+ >>> cast_arr.info is None
+ True
+
+This class isn't very useful, because it has the same constructor as the
+bare ndarray object, including passing in buffers and shapes and so on.
+We would probably prefer the constructor to be able to take an already
+formed ndarray from the usual numpy calls to ``np.array`` and return an
+object.
+
+Slightly more realistic example - attribute added to existing array
+-------------------------------------------------------------------
+
+Here is a class that takes a standard ndarray that already exists, casts
+as our type, and adds an extra attribute.
+
+.. testcode::
+
+ import numpy as np
+
+ class RealisticInfoArray(np.ndarray):
+
+ def __new__(cls, input_array, info=None):
+ # Input array is an already formed ndarray instance
+ # We first cast to be our class type
+ obj = np.asarray(input_array).view(cls)
+ # add the new attribute to the created instance
+ obj.info = info
+ # Finally, we must return the newly created object:
+ return obj
+
+ def __array_finalize__(self, obj):
+ # see InfoArray.__array_finalize__ for comments
+ if obj is None: return
+ self.info = getattr(obj, 'info', None)
+
+
+So:
+
+ >>> arr = np.arange(5)
+ >>> obj = RealisticInfoArray(arr, info='information')
+ >>> type(obj)
+ <class 'RealisticInfoArray'>
+ >>> obj.info
+ 'information'
+ >>> v = obj[1:]
+ >>> type(v)
+ <class 'RealisticInfoArray'>
+ >>> v.info
+ 'information'
+
+.. _array-ufunc:
+
+``__array_ufunc__`` for ufuncs
+------------------------------
+
+ .. versionadded:: 1.13
+
+A subclass can override what happens when executing numpy ufuncs on it by
+overriding the default ``ndarray.__array_ufunc__`` method. This method is
+executed *instead* of the ufunc and should return either the result of the
+operation, or :obj:`NotImplemented` if the operation requested is not
+implemented.
+
+The signature of ``__array_ufunc__`` is::
+
+ def __array_ufunc__(ufunc, method, *inputs, **kwargs):
+
+ - *ufunc* is the ufunc object that was called.
+ - *method* is a string indicating how the Ufunc was called, either
+ ``"__call__"`` to indicate it was called directly, or one of its
+ :ref:`methods<ufuncs.methods>`: ``"reduce"``, ``"accumulate"``,
+ ``"reduceat"``, ``"outer"``, or ``"at"``.
+ - *inputs* is a tuple of the input arguments to the ``ufunc``
+ - *kwargs* contains any optional or keyword arguments passed to the
+ function. This includes any ``out`` arguments, which are always
+ contained in a tuple.
+
+A typical implementation would convert any inputs or outputs that are
+instances of one's own class, pass everything on to a superclass using
+``super()``, and finally return the results after possible
+back-conversion. An example, taken from the test case
+``test_ufunc_override_with_super`` in ``core/tests/test_umath.py``, is the
+following.
+
+.. testcode::
+
+ input numpy as np
+
+ class A(np.ndarray):
+ def __array_ufunc__(self, ufunc, method, *inputs, out=None, **kwargs):
+ args = []
+ in_no = []
+ for i, input_ in enumerate(inputs):
+ if isinstance(input_, A):
+ in_no.append(i)
+ args.append(input_.view(np.ndarray))
+ else:
+ args.append(input_)
+
+ outputs = out
+ out_no = []
+ if outputs:
+ out_args = []
+ for j, output in enumerate(outputs):
+ if isinstance(output, A):
+ out_no.append(j)
+ out_args.append(output.view(np.ndarray))
+ else:
+ out_args.append(output)
+ kwargs['out'] = tuple(out_args)
+ else:
+ outputs = (None,) * ufunc.nout
+
+ info = {}
+ if in_no:
+ info['inputs'] = in_no
+ if out_no:
+ info['outputs'] = out_no
+
+ results = super(A, self).__array_ufunc__(ufunc, method,
+ *args, **kwargs)
+ if results is NotImplemented:
+ return NotImplemented
+
+ if method == 'at':
+ if isinstance(inputs[0], A):
+ inputs[0].info = info
+ return
+
+ if ufunc.nout == 1:
+ results = (results,)
+
+ results = tuple((np.asarray(result).view(A)
+ if output is None else output)
+ for result, output in zip(results, outputs))
+ if results and isinstance(results[0], A):
+ results[0].info = info
+
+ return results[0] if len(results) == 1 else results
+
+So, this class does not actually do anything interesting: it just
+converts any instances of its own to regular ndarray (otherwise, we'd
+get infinite recursion!), and adds an ``info`` dictionary that tells
+which inputs and outputs it converted. Hence, e.g.,
+
+>>> a = np.arange(5.).view(A)
+>>> b = np.sin(a)
+>>> b.info
+{'inputs': [0]}
+>>> b = np.sin(np.arange(5.), out=(a,))
+>>> b.info
+{'outputs': [0]}
+>>> a = np.arange(5.).view(A)
+>>> b = np.ones(1).view(A)
+>>> c = a + b
+>>> c.info
+{'inputs': [0, 1]}
+>>> a += b
+>>> a.info
+{'inputs': [0, 1], 'outputs': [0]}
+
+Note that another approach would be to to use ``getattr(ufunc,
+methods)(*inputs, **kwargs)`` instead of the ``super`` call. For this example,
+the result would be identical, but there is a difference if another operand
+also defines ``__array_ufunc__``. E.g., lets assume that we evalulate
+``np.add(a, b)``, where ``b`` is an instance of another class ``B`` that has
+an override. If you use ``super`` as in the example,
+``ndarray.__array_ufunc__`` will notice that ``b`` has an override, which
+means it cannot evaluate the result itself. Thus, it will return
+`NotImplemented` and so will our class ``A``. Then, control will be passed
+over to ``b``, which either knows how to deal with us and produces a result,
+or does not and returns `NotImplemented`, raising a ``TypeError``.
+
+If instead, we replace our ``super`` call with ``getattr(ufunc, method)``, we
+effectively do ``np.add(a.view(np.ndarray), b)``. Again, ``B.__array_ufunc__``
+will be called, but now it sees an ``ndarray`` as the other argument. Likely,
+it will know how to handle this, and return a new instance of the ``B`` class
+to us. Our example class is not set up to handle this, but it might well be
+the best approach if, e.g., one were to re-implement ``MaskedArray`` using
+``__array_ufunc__``.
+
+As a final note: if the ``super`` route is suited to a given class, an
+advantage of using it is that it helps in constructing class hierarchies.
+E.g., suppose that our other class ``B`` also used the ``super`` in its
+``__array_ufunc__`` implementation, and we created a class ``C`` that depended
+on both, i.e., ``class C(A, B)`` (with, for simplicity, not another
+``__array_ufunc__`` override). Then any ufunc on an instance of ``C`` would
+pass on to ``A.__array_ufunc__``, the ``super`` call in ``A`` would go to
+``B.__array_ufunc__``, and the ``super`` call in ``B`` would go to
+``ndarray.__array_ufunc__``, thus allowing ``A`` and ``B`` to collaborate.
+
+.. _array-wrap:
+
+``__array_wrap__`` for ufuncs and other functions
+-------------------------------------------------
+
+Prior to numpy 1.13, the behaviour of ufuncs could only be tuned using
+``__array_wrap__`` and ``__array_prepare__``. These two allowed one to
+change the output type of a ufunc, but, in contrast to
+``__array_ufunc__``, did not allow one to make any changes to the inputs.
+It is hoped to eventually deprecate these, but ``__array_wrap__`` is also
+used by other numpy functions and methods, such as ``squeeze``, so at the
+present time is still needed for full functionality.
+
+Conceptually, ``__array_wrap__`` "wraps up the action" in the sense of
+allowing a subclass to set the type of the return value and update
+attributes and metadata. Let's show how this works with an example. First
+we return to the simpler example subclass, but with a different name and
+some print statements:
+
+.. testcode::
+
+ import numpy as np
+
+ class MySubClass(np.ndarray):
+
+ def __new__(cls, input_array, info=None):
+ obj = np.asarray(input_array).view(cls)
+ obj.info = info
+ return obj
+
+ def __array_finalize__(self, obj):
+ print('In __array_finalize__:')
+ print(' self is %s' % repr(self))
+ print(' obj is %s' % repr(obj))
+ if obj is None: return
+ self.info = getattr(obj, 'info', None)
+
+ def __array_wrap__(self, out_arr, context=None):
+ print('In __array_wrap__:')
+ print(' self is %s' % repr(self))
+ print(' arr is %s' % repr(out_arr))
+ # then just call the parent
+ return super(MySubClass, self).__array_wrap__(self, out_arr, context)
+
+We run a ufunc on an instance of our new array:
+
+>>> obj = MySubClass(np.arange(5), info='spam')
+In __array_finalize__:
+ self is MySubClass([0, 1, 2, 3, 4])
+ obj is array([0, 1, 2, 3, 4])
+>>> arr2 = np.arange(5)+1
+>>> ret = np.add(arr2, obj)
+In __array_wrap__:
+ self is MySubClass([0, 1, 2, 3, 4])
+ arr is array([1, 3, 5, 7, 9])
+In __array_finalize__:
+ self is MySubClass([1, 3, 5, 7, 9])
+ obj is MySubClass([0, 1, 2, 3, 4])
+>>> ret
+MySubClass([1, 3, 5, 7, 9])
+>>> ret.info
+'spam'
+
+Note that the ufunc (``np.add``) has called the ``__array_wrap__`` method
+with arguments ``self`` as ``obj``, and ``out_arr`` as the (ndarray) result
+of the addition. In turn, the default ``__array_wrap__``
+(``ndarray.__array_wrap__``) has cast the result to class ``MySubClass``,
+and called ``__array_finalize__`` - hence the copying of the ``info``
+attribute. This has all happened at the C level.
+
+But, we could do anything we wanted:
+
+.. testcode::
+
+ class SillySubClass(np.ndarray):
+
+ def __array_wrap__(self, arr, context=None):
+ return 'I lost your data'
+
+>>> arr1 = np.arange(5)
+>>> obj = arr1.view(SillySubClass)
+>>> arr2 = np.arange(5)
+>>> ret = np.multiply(obj, arr2)
+>>> ret
+'I lost your data'
+
+So, by defining a specific ``__array_wrap__`` method for our subclass,
+we can tweak the output from ufuncs. The ``__array_wrap__`` method
+requires ``self``, then an argument - which is the result of the ufunc -
+and an optional parameter *context*. This parameter is returned by
+ufuncs as a 3-element tuple: (name of the ufunc, arguments of the ufunc,
+domain of the ufunc), but is not set by other numpy functions. Though,
+as seen above, it is possible to do otherwise, ``__array_wrap__`` should
+return an instance of its containing class. See the masked array
+subclass for an implementation.
+
+In addition to ``__array_wrap__``, which is called on the way out of the
+ufunc, there is also an ``__array_prepare__`` method which is called on
+the way into the ufunc, after the output arrays are created but before any
+computation has been performed. The default implementation does nothing
+but pass through the array. ``__array_prepare__`` should not attempt to
+access the array data or resize the array, it is intended for setting the
+output array type, updating attributes and metadata, and performing any
+checks based on the input that may be desired before computation begins.
+Like ``__array_wrap__``, ``__array_prepare__`` must return an ndarray or
+subclass thereof or raise an error.
+
+Extra gotchas - custom ``__del__`` methods and ndarray.base
+-----------------------------------------------------------
+
+One of the problems that ndarray solves is keeping track of memory
+ownership of ndarrays and their views. Consider the case where we have
+created an ndarray, ``arr`` and have taken a slice with ``v = arr[1:]``.
+The two objects are looking at the same memory. NumPy keeps track of
+where the data came from for a particular array or view, with the
+``base`` attribute:
+
+>>> # A normal ndarray, that owns its own data
+>>> arr = np.zeros((4,))
+>>> # In this case, base is None
+>>> arr.base is None
+True
+>>> # We take a view
+>>> v1 = arr[1:]
+>>> # base now points to the array that it derived from
+>>> v1.base is arr
+True
+>>> # Take a view of a view
+>>> v2 = v1[1:]
+>>> # base points to the original array that it was derived from
+>>> v2.base is arr
+True
+
+In general, if the array owns its own memory, as for ``arr`` in this
+case, then ``arr.base`` will be None - there are some exceptions to this
+- see the numpy book for more details.
+
+The ``base`` attribute is useful in being able to tell whether we have
+a view or the original array. This in turn can be useful if we need
+to know whether or not to do some specific cleanup when the subclassed
+array is deleted. For example, we may only want to do the cleanup if
+the original array is deleted, but not the views. For an example of
+how this can work, have a look at the ``memmap`` class in
+``numpy.core``.
+
+Subclassing and Downstream Compatibility
+----------------------------------------
+
+When sub-classing ``ndarray`` or creating duck-types that mimic the ``ndarray``
+interface, it is your responsibility to decide how aligned your APIs will be
+with those of numpy. For convenience, many numpy functions that have a corresponding
+``ndarray`` method (e.g., ``sum``, ``mean``, ``take``, ``reshape``) work by checking
+if the first argument to a function has a method of the same name. If it exists, the
+method is called instead of coercing the arguments to a numpy array.
+
+For example, if you want your sub-class or duck-type to be compatible with
+numpy's ``sum`` function, the method signature for this object's ``sum`` method
+should be the following:
+
+.. testcode::
+
+ def sum(self, axis=None, dtype=None, out=None, keepdims=False):
+ ...
+
+This is the exact same method signature for ``np.sum``, so now if a user calls
+``np.sum`` on this object, numpy will call the object's own ``sum`` method and
+pass in these arguments enumerated above in the signature, and no errors will
+be raised because the signatures are completely compatible with each other.
+
+If, however, you decide to deviate from this signature and do something like this:
+
+.. testcode::
+
+ def sum(self, axis=None, dtype=None):
+ ...
+
+This object is no longer compatible with ``np.sum`` because if you call ``np.sum``,
+it will pass in unexpected arguments ``out`` and ``keepdims``, causing a TypeError
+to be raised.
+
+If you wish to maintain compatibility with numpy and its subsequent versions (which
+might add new keyword arguments) but do not want to surface all of numpy's arguments,
+your function's signature should accept ``**kwargs``. For example:
+
+.. testcode::
+
+ def sum(self, axis=None, dtype=None, **unused_kwargs):
+ ...
+
+This object is now compatible with ``np.sum`` again because any extraneous arguments
+(i.e. keywords that are not ``axis`` or ``dtype``) will be hidden away in the
+``**unused_kwargs`` parameter.
+
+
diff --git a/doc/source/user/basics.types.rst b/doc/source/user/basics.types.rst
index 5ce5af15a..ec2af409a 100644
--- a/doc/source/user/basics.types.rst
+++ b/doc/source/user/basics.types.rst
@@ -4,4 +4,339 @@ Data types
.. seealso:: :ref:`Data type objects <arrays.dtypes>`
-.. automodule:: numpy.doc.basics
+Array types and conversions between types
+=========================================
+
+NumPy supports a much greater variety of numerical types than Python does.
+This section shows which are available, and how to modify an array's data-type.
+
+The primitive types supported are tied closely to those in C:
+
+.. list-table::
+ :header-rows: 1
+
+ * - Numpy type
+ - C type
+ - Description
+
+ * - `numpy.bool_`
+ - ``bool``
+ - Boolean (True or False) stored as a byte
+
+ * - `numpy.byte`
+ - ``signed char``
+ - Platform-defined
+
+ * - `numpy.ubyte`
+ - ``unsigned char``
+ - Platform-defined
+
+ * - `numpy.short`
+ - ``short``
+ - Platform-defined
+
+ * - `numpy.ushort`
+ - ``unsigned short``
+ - Platform-defined
+
+ * - `numpy.intc`
+ - ``int``
+ - Platform-defined
+
+ * - `numpy.uintc`
+ - ``unsigned int``
+ - Platform-defined
+
+ * - `numpy.int_`
+ - ``long``
+ - Platform-defined
+
+ * - `numpy.uint`
+ - ``unsigned long``
+ - Platform-defined
+
+ * - `numpy.longlong`
+ - ``long long``
+ - Platform-defined
+
+ * - `numpy.ulonglong`
+ - ``unsigned long long``
+ - Platform-defined
+
+ * - `numpy.half` / `numpy.float16`
+ -
+ - Half precision float:
+ sign bit, 5 bits exponent, 10 bits mantissa
+
+ * - `numpy.single`
+ - ``float``
+ - Platform-defined single precision float:
+ typically sign bit, 8 bits exponent, 23 bits mantissa
+
+ * - `numpy.double`
+ - ``double``
+ - Platform-defined double precision float:
+ typically sign bit, 11 bits exponent, 52 bits mantissa.
+
+ * - `numpy.longdouble`
+ - ``long double``
+ - Platform-defined extended-precision float
+
+ * - `numpy.csingle`
+ - ``float complex``
+ - Complex number, represented by two single-precision floats (real and imaginary components)
+
+ * - `numpy.cdouble`
+ - ``double complex``
+ - Complex number, represented by two double-precision floats (real and imaginary components).
+
+ * - `numpy.clongdouble`
+ - ``long double complex``
+ - Complex number, represented by two extended-precision floats (real and imaginary components).
+
+
+Since many of these have platform-dependent definitions, a set of fixed-size
+aliases are provided:
+
+.. list-table::
+ :header-rows: 1
+
+ * - Numpy type
+ - C type
+ - Description
+
+ * - `numpy.int8`
+ - ``int8_t``
+ - Byte (-128 to 127)
+
+ * - `numpy.int16`
+ - ``int16_t``
+ - Integer (-32768 to 32767)
+
+ * - `numpy.int32`
+ - ``int32_t``
+ - Integer (-2147483648 to 2147483647)
+
+ * - `numpy.int64`
+ - ``int64_t``
+ - Integer (-9223372036854775808 to 9223372036854775807)
+
+ * - `numpy.uint8`
+ - ``uint8_t``
+ - Unsigned integer (0 to 255)
+
+ * - `numpy.uint16`
+ - ``uint16_t``
+ - Unsigned integer (0 to 65535)
+
+ * - `numpy.uint32`
+ - ``uint32_t``
+ - Unsigned integer (0 to 4294967295)
+
+ * - `numpy.uint64`
+ - ``uint64_t``
+ - Unsigned integer (0 to 18446744073709551615)
+
+ * - `numpy.intp`
+ - ``intptr_t``
+ - Integer used for indexing, typically the same as ``ssize_t``
+
+ * - `numpy.uintp`
+ - ``uintptr_t``
+ - Integer large enough to hold a pointer
+
+ * - `numpy.float32`
+ - ``float``
+ -
+
+ * - `numpy.float64` / `numpy.float_`
+ - ``double``
+ - Note that this matches the precision of the builtin python `float`.
+
+ * - `numpy.complex64`
+ - ``float complex``
+ - Complex number, represented by two 32-bit floats (real and imaginary components)
+
+ * - `numpy.complex128` / `numpy.complex_`
+ - ``double complex``
+ - Note that this matches the precision of the builtin python `complex`.
+
+
+NumPy numerical types are instances of ``dtype`` (data-type) objects, each
+having unique characteristics. Once you have imported NumPy using
+
+ ::
+
+ >>> import numpy as np
+
+the dtypes are available as ``np.bool_``, ``np.float32``, etc.
+
+Advanced types, not listed in the table above, are explored in
+section :ref:`structured_arrays`.
+
+There are 5 basic numerical types representing booleans (bool), integers (int),
+unsigned integers (uint) floating point (float) and complex. Those with numbers
+in their name indicate the bitsize of the type (i.e. how many bits are needed
+to represent a single value in memory). Some types, such as ``int`` and
+``intp``, have differing bitsizes, dependent on the platforms (e.g. 32-bit
+vs. 64-bit machines). This should be taken into account when interfacing
+with low-level code (such as C or Fortran) where the raw memory is addressed.
+
+Data-types can be used as functions to convert python numbers to array scalars
+(see the array scalar section for an explanation), python sequences of numbers
+to arrays of that type, or as arguments to the dtype keyword that many numpy
+functions or methods accept. Some examples::
+
+ >>> import numpy as np
+ >>> x = np.float32(1.0)
+ >>> x
+ 1.0
+ >>> y = np.int_([1,2,4])
+ >>> y
+ array([1, 2, 4])
+ >>> z = np.arange(3, dtype=np.uint8)
+ >>> z
+ array([0, 1, 2], dtype=uint8)
+
+Array types can also be referred to by character codes, mostly to retain
+backward compatibility with older packages such as Numeric. Some
+documentation may still refer to these, for example::
+
+ >>> np.array([1, 2, 3], dtype='f')
+ array([ 1., 2., 3.], dtype=float32)
+
+We recommend using dtype objects instead.
+
+To convert the type of an array, use the .astype() method (preferred) or
+the type itself as a function. For example: ::
+
+ >>> z.astype(float) #doctest: +NORMALIZE_WHITESPACE
+ array([ 0., 1., 2.])
+ >>> np.int8(z)
+ array([0, 1, 2], dtype=int8)
+
+Note that, above, we use the *Python* float object as a dtype. NumPy knows
+that ``int`` refers to ``np.int_``, ``bool`` means ``np.bool_``,
+that ``float`` is ``np.float_`` and ``complex`` is ``np.complex_``.
+The other data-types do not have Python equivalents.
+
+To determine the type of an array, look at the dtype attribute::
+
+ >>> z.dtype
+ dtype('uint8')
+
+dtype objects also contain information about the type, such as its bit-width
+and its byte-order. The data type can also be used indirectly to query
+properties of the type, such as whether it is an integer::
+
+ >>> d = np.dtype(int)
+ >>> d
+ dtype('int32')
+
+ >>> np.issubdtype(d, np.integer)
+ True
+
+ >>> np.issubdtype(d, np.floating)
+ False
+
+
+Array Scalars
+=============
+
+NumPy generally returns elements of arrays as array scalars (a scalar
+with an associated dtype). Array scalars differ from Python scalars, but
+for the most part they can be used interchangeably (the primary
+exception is for versions of Python older than v2.x, where integer array
+scalars cannot act as indices for lists and tuples). There are some
+exceptions, such as when code requires very specific attributes of a scalar
+or when it checks specifically whether a value is a Python scalar. Generally,
+problems are easily fixed by explicitly converting array scalars
+to Python scalars, using the corresponding Python type function
+(e.g., ``int``, ``float``, ``complex``, ``str``, ``unicode``).
+
+The primary advantage of using array scalars is that
+they preserve the array type (Python may not have a matching scalar type
+available, e.g. ``int16``). Therefore, the use of array scalars ensures
+identical behaviour between arrays and scalars, irrespective of whether the
+value is inside an array or not. NumPy scalars also have many of the same
+methods arrays do.
+
+Overflow Errors
+===============
+
+The fixed size of NumPy numeric types may cause overflow errors when a value
+requires more memory than available in the data type. For example,
+`numpy.power` evaluates ``100 * 10 ** 8`` correctly for 64-bit integers,
+but gives 1874919424 (incorrect) for a 32-bit integer.
+
+ >>> np.power(100, 8, dtype=np.int64)
+ 10000000000000000
+ >>> np.power(100, 8, dtype=np.int32)
+ 1874919424
+
+The behaviour of NumPy and Python integer types differs significantly for
+integer overflows and may confuse users expecting NumPy integers to behave
+similar to Python's ``int``. Unlike NumPy, the size of Python's ``int`` is
+flexible. This means Python integers may expand to accommodate any integer and
+will not overflow.
+
+NumPy provides `numpy.iinfo` and `numpy.finfo` to verify the
+minimum or maximum values of NumPy integer and floating point values
+respectively ::
+
+ >>> np.iinfo(int) # Bounds of the default integer on this system.
+ iinfo(min=-9223372036854775808, max=9223372036854775807, dtype=int64)
+ >>> np.iinfo(np.int32) # Bounds of a 32-bit integer
+ iinfo(min=-2147483648, max=2147483647, dtype=int32)
+ >>> np.iinfo(np.int64) # Bounds of a 64-bit integer
+ iinfo(min=-9223372036854775808, max=9223372036854775807, dtype=int64)
+
+If 64-bit integers are still too small the result may be cast to a
+floating point number. Floating point numbers offer a larger, but inexact,
+range of possible values.
+
+ >>> np.power(100, 100, dtype=np.int64) # Incorrect even with 64-bit int
+ 0
+ >>> np.power(100, 100, dtype=np.float64)
+ 1e+200
+
+Extended Precision
+==================
+
+Python's floating-point numbers are usually 64-bit floating-point numbers,
+nearly equivalent to ``np.float64``. In some unusual situations it may be
+useful to use floating-point numbers with more precision. Whether this
+is possible in numpy depends on the hardware and on the development
+environment: specifically, x86 machines provide hardware floating-point
+with 80-bit precision, and while most C compilers provide this as their
+``long double`` type, MSVC (standard for Windows builds) makes
+``long double`` identical to ``double`` (64 bits). NumPy makes the
+compiler's ``long double`` available as ``np.longdouble`` (and
+``np.clongdouble`` for the complex numbers). You can find out what your
+numpy provides with ``np.finfo(np.longdouble)``.
+
+NumPy does not provide a dtype with more precision than C's
+``long double``\\; in particular, the 128-bit IEEE quad precision
+data type (FORTRAN's ``REAL*16``\\) is not available.
+
+For efficient memory alignment, ``np.longdouble`` is usually stored
+padded with zero bits, either to 96 or 128 bits. Which is more efficient
+depends on hardware and development environment; typically on 32-bit
+systems they are padded to 96 bits, while on 64-bit systems they are
+typically padded to 128 bits. ``np.longdouble`` is padded to the system
+default; ``np.float96`` and ``np.float128`` are provided for users who
+want specific padding. In spite of the names, ``np.float96`` and
+``np.float128`` provide only as much precision as ``np.longdouble``,
+that is, 80 bits on most x86 machines and 64 bits in standard
+Windows builds.
+
+Be warned that even if ``np.longdouble`` offers more precision than
+python ``float``, it is easy to lose that extra precision, since
+python often forces values to pass through ``float``. For example,
+the ``%`` formatting operator requires its arguments to be converted
+to standard python types, and it is therefore impossible to preserve
+extended precision even if many decimal places are requested. It can
+be useful to test your code with the value
+``1 + np.finfo(np.longdouble).eps``.
+
+
diff --git a/doc/source/user/building.rst b/doc/source/user/building.rst
index 47a0a03c9..47399139e 100644
--- a/doc/source/user/building.rst
+++ b/doc/source/user/building.rst
@@ -6,6 +6,10 @@ Building from source
A general overview of building NumPy from source is given here, with detailed
instructions for specific platforms given separately.
+..
+ This page is referenced from numpy/numpy/__init__.py. Please keep its
+ location in sync with the link there.
+
Prerequisites
-------------
@@ -27,7 +31,7 @@ Building NumPy requires the following software installed:
MSVC and Clang compilers. Compilers from other vendors such as Intel,
Absoft, Sun, NAG, Compaq, Vast, Portland, Lahey, HP, IBM are only supported
in the form of community feedback, and may not work out of the box.
- GCC 4.x (and later) compilers are recommended.
+ GCC 4.x (and later) compilers are recommended. On ARM64 (aarch64) GCC 8.x (and later) are recommended.
3) Linear Algebra libraries
@@ -107,6 +111,8 @@ means that g77 has been used (note: g77 is no longer supported for building NumP
If libgfortran.so is a dependency, gfortran has been used. If both are dependencies,
this means both have been used, which is almost always a very bad idea.
+.. _accelerated-blas-lapack-libraries:
+
Accelerated BLAS/LAPACK libraries
---------------------------------
@@ -136,6 +142,16 @@ will prefer to use ATLAS, then BLIS, then OpenBLAS and as a last resort MKL.
If neither of these exists the build will fail (names are compared
lower case).
+Alternatively one may use ``!`` or ``^`` to negate all items::
+
+ NPY_BLAS_ORDER='^blas,atlas' python setup.py build
+
+will allow using anything **but** NetLIB BLAS and ATLAS libraries, the order of the above
+list is retained.
+
+One cannot mix negation and positives, nor have multiple negations, such cases will
+raise an error.
+
LAPACK
~~~~~~
@@ -159,6 +175,25 @@ will prefer to use ATLAS, then OpenBLAS and as a last resort MKL.
If neither of these exists the build will fail (names are compared
lower case).
+Alternatively one may use ``!`` or ``^`` to negate all items::
+
+ NPY_LAPACK_ORDER='^lapack' python setup.py build
+
+will allow using anything **but** the NetLIB LAPACK library, the order of the above
+list is retained.
+
+One cannot mix negation and positives, nor have multiple negations, such cases will
+raise an error.
+
+
+.. deprecated:: 1.20
+ The native libraries on macOS, provided by Accelerate, are not fit for use
+ in NumPy since they have bugs that cause wrong output under easily reproducible
+ conditions. If the vendor fixes those bugs, the library could be reinstated,
+ but until then users compiling for themselves should use another linear
+ algebra library or use the built-in (but slower) default, see the next
+ section.
+
Disabling ATLAS and other accelerated libraries
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/doc/source/user/c-info.beyond-basics.rst b/doc/source/user/c-info.beyond-basics.rst
index 9e9cd3067..124162d6c 100644
--- a/doc/source/user/c-info.beyond-basics.rst
+++ b/doc/source/user/c-info.beyond-basics.rst
@@ -115,7 +115,7 @@ processors that use pipelining to enhance fundamental operations.
The :c:func:`PyArray_IterAllButAxis` ( ``array``, ``&dim`` ) constructs an
iterator object that is modified so that it will not iterate over the
dimension indicated by dim. The only restriction on this iterator
-object, is that the :c:func:`PyArray_Iter_GOTO1D` ( ``it``, ``ind`` ) macro
+object, is that the :c:func:`PyArray_ITER_GOTO1D` ( ``it``, ``ind`` ) macro
cannot be used (thus flat indexing won't work either if you pass this
object back to Python --- so you shouldn't do this). Note that the
returned object from this routine is still usually cast to
diff --git a/doc/source/user/c-info.how-to-extend.rst b/doc/source/user/c-info.how-to-extend.rst
index d75242092..845ce0a74 100644
--- a/doc/source/user/c-info.how-to-extend.rst
+++ b/doc/source/user/c-info.how-to-extend.rst
@@ -363,7 +363,6 @@ particular set of requirements ( *e.g.* contiguous, aligned, and
writeable). The syntax is
:c:func:`PyArray_FROM_OTF`
-
Return an ndarray from any Python object, *obj*, that can be
converted to an array. The number of dimensions in the returned
array is determined by the object. The desired data-type of the
@@ -375,7 +374,6 @@ writeable). The syntax is
exception is set.
*obj*
-
The object can be any Python object convertible to an ndarray.
If the object is already (a subclass of) the ndarray that
satisfies the requirements then a new reference is returned.
@@ -394,7 +392,6 @@ writeable). The syntax is
to the requirements flag.
*typenum*
-
One of the enumerated types or :c:data:`NPY_NOTYPE` if the data-type
should be determined from the object itself. The C-based names
can be used:
@@ -422,7 +419,6 @@ writeable). The syntax is
requirements flag to override this behavior.
*requirements*
-
The memory model for an ndarray admits arbitrary strides in
each dimension to advance to the next element of the array.
Often, however, you need to interface with code that expects a
@@ -446,13 +442,11 @@ writeable). The syntax is
:c:data:`NPY_OUT_ARRAY`, and :c:data:`NPY_ARRAY_INOUT_ARRAY`:
:c:data:`NPY_ARRAY_IN_ARRAY`
-
This flag is useful for arrays that must be in C-contiguous
order and aligned. These kinds of arrays are usually input
arrays for some algorithm.
:c:data:`NPY_ARRAY_OUT_ARRAY`
-
This flag is useful to specify an array that is
in C-contiguous order, is aligned, and can be written to
as well. Such an array is usually returned as output
@@ -460,7 +454,6 @@ writeable). The syntax is
scratch).
:c:data:`NPY_ARRAY_INOUT_ARRAY`
-
This flag is useful to specify an array that will be used for both
input and output. :c:func:`PyArray_ResolveWritebackIfCopy`
must be called before :c:func:`Py_DECREF` at
@@ -479,16 +472,13 @@ writeable). The syntax is
Other useful flags that can be OR'd as additional requirements are:
:c:data:`NPY_ARRAY_FORCECAST`
-
Cast to the desired type, even if it can't be done without losing
information.
:c:data:`NPY_ARRAY_ENSURECOPY`
-
Make sure the resulting array is a copy of the original.
:c:data:`NPY_ARRAY_ENSUREARRAY`
-
Make sure the resulting object is an actual ndarray and not a sub-
class.
diff --git a/doc/source/user/how-to-how-to.rst b/doc/source/user/how-to-how-to.rst
new file mode 100644
index 000000000..de8afc28a
--- /dev/null
+++ b/doc/source/user/how-to-how-to.rst
@@ -0,0 +1,118 @@
+.. _how-to-how-to:
+
+##############################################################################
+How to write a NumPy how-to
+##############################################################################
+
+How-tos get straight to the point -- they
+
+ - answer a focused question, or
+ - narrow a broad question into focused questions that the user can
+ choose among.
+
+******************************************************************************
+A stranger has asked for directions...
+******************************************************************************
+
+**"I need to refuel my car."**
+
+******************************************************************************
+Give a brief but explicit answer
+******************************************************************************
+
+ - `"Three kilometers/miles, take a right at Hayseed Road, it's on your left."`
+
+Add helpful details for newcomers ("Hayseed Road", even though it's the only
+turnoff at three km/mi). But not irrelevant ones:
+
+ - Don't also give directions from Route 7.
+ - Don't explain why the town has only one filling station.
+
+If there's related background (tutorial, explanation, reference, alternative
+approach), bring it to the user's attention with a link ("Directions from Route 7,"
+"Why so few filling stations?").
+
+
+******************************************************************************
+Delegate
+******************************************************************************
+
+ - `"Three km/mi, take a right at Hayseed Road, follow the signs."`
+
+If the information is already documented and succinct enough for a how-to,
+just link to it, possibly after an introduction ("Three km/mi, take a right").
+
+******************************************************************************
+If the question is broad, narrow and redirect it
+******************************************************************************
+
+ **"I want to see the sights."**
+
+The `See the sights` how-to should link to a set of narrower how-tos:
+
+- Find historic buildings
+- Find scenic lookouts
+- Find the town center
+
+and these might in turn link to still narrower how-tos -- so the town center
+page might link to
+
+ - Find the court house
+ - Find city hall
+
+By organizing how-tos this way, you not only display the options for people
+who need to narrow their question, you also have provided answers for users
+who start with narrower questions ("I want to see historic buildings," "Which
+way to city hall?").
+
+******************************************************************************
+If there are many steps, break them up
+******************************************************************************
+
+If a how-to has many steps:
+
+ - Consider breaking a step out into an individual how-to and linking to it.
+ - Include subheadings. They help readers grasp what's coming and return
+ where they left off.
+
+******************************************************************************
+Why write how-tos when there's Stack Overflow, Reddit, Gitter...?
+******************************************************************************
+
+ - We have authoritative answers.
+ - How-tos make the site less forbidding to non-experts.
+ - How-tos bring people into the site and help them discover other information
+ that's here .
+ - Creating how-tos helps us see NumPy usability through new eyes.
+
+******************************************************************************
+Aren't how-tos and tutorials the same thing?
+******************************************************************************
+
+People use the terms "how-to" and "tutorial" interchangeably, but we draw a
+distinction, following Daniele Procida's `taxonomy of documentation`_.
+
+ .. _`taxonomy of documentation`: https://documentation.divio.com/
+
+Documentation needs to meet users where they are. `How-tos` offer get-it-done
+information; the user wants steps to copy and doesn't necessarily want to
+understand NumPy. `Tutorials` are warm-fuzzy information; the user wants a
+feel for some aspect of NumPy (and again, may or may not care about deeper
+knowledge).
+
+We distinguish both tutorials and how-tos from `Explanations`, which are
+deep dives intended to give understanding rather than immediate assistance,
+and `References`, which give complete, autoritative data on some concrete
+part of NumPy (like its API) but aren't obligated to paint a broader picture.
+
+For more on tutorials, see the `tutorial how-to`_.
+
+.. _`tutorial how-to`: https://github.com/numpy/numpy-tutorials/blob/master/tutorial_style.ipynb
+
+
+******************************************************************************
+Is this page an example of a how-to?
+******************************************************************************
+
+Yes -- until the sections with question-mark headings; they explain rather
+than giving directions. In a how-to, those would be links. \ No newline at end of file
diff --git a/doc/source/user/how-to-io.rst b/doc/source/user/how-to-io.rst
new file mode 100644
index 000000000..ca9fc41f0
--- /dev/null
+++ b/doc/source/user/how-to-io.rst
@@ -0,0 +1,328 @@
+.. _how-to-io:
+
+##############################################################################
+Reading and writing files
+##############################################################################
+
+This page tackles common applications; for the full collection of I/O
+routines, see :ref:`routines.io`.
+
+
+******************************************************************************
+Reading text and CSV_ files
+******************************************************************************
+
+.. _CSV: https://en.wikipedia.org/wiki/Comma-separated_values
+
+With no missing values
+==============================================================================
+
+Use :func:`numpy.loadtxt`.
+
+With missing values
+==============================================================================
+
+Use :func:`numpy.genfromtxt`.
+
+:func:`numpy.genfromtxt` will either
+
+ - return a :ref:`masked array<maskedarray.generic>`
+ **masking out missing values** (if ``usemask=True``), or
+
+ - **fill in the missing value** with the value specified in
+ ``filling_values`` (default is ``np.nan`` for float, -1 for int).
+
+With non-whitespace delimiters
+------------------------------------------------------------------------------
+::
+
+ >>> print(open("csv.txt").read()) # doctest: +SKIP
+ 1, 2, 3
+ 4,, 6
+ 7, 8, 9
+
+
+Masked-array output
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+::
+
+ >>> np.genfromtxt("csv.txt", delimiter=",", usemask=True) # doctest: +SKIP
+ masked_array(
+ data=[[1.0, 2.0, 3.0],
+ [4.0, --, 6.0],
+ [7.0, 8.0, 9.0]],
+ mask=[[False, False, False],
+ [False, True, False],
+ [False, False, False]],
+ fill_value=1e+20)
+
+Array output
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+::
+
+ >>> np.genfromtxt("csv.txt", delimiter=",") # doctest: +SKIP
+ array([[ 1., 2., 3.],
+ [ 4., nan, 6.],
+ [ 7., 8., 9.]])
+
+Array output, specified fill-in value
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+::
+
+ >>> np.genfromtxt("csv.txt", delimiter=",", dtype=np.int8, filling_values=99) # doctest: +SKIP
+ array([[ 1, 2, 3],
+ [ 4, 99, 6],
+ [ 7, 8, 9]], dtype=int8)
+
+Whitespace-delimited
+-------------------------------------------------------------------------------
+
+:func:`numpy.genfromtxt` can also parse whitespace-delimited data files
+that have missing values if
+
+* **Each field has a fixed width**: Use the width as the `delimiter` argument.
+ ::
+
+ # File with width=4. The data does not have to be justified (for example,
+ # the 2 in row 1), the last column can be less than width (for example, the 6
+ # in row 2), and no delimiting character is required (for instance 8888 and 9
+ # in row 3)
+
+ >>> f = open("fixedwidth.txt").read() # doctest: +SKIP
+ >>> print(f) # doctest: +SKIP
+ 1 2 3
+ 44 6
+ 7 88889
+
+ # Showing spaces as ^
+ >>> print(f.replace(" ","^")) # doctest: +SKIP
+ 1^^^2^^^^^^3
+ 44^^^^^^6
+ 7^^^88889
+
+ >>> np.genfromtxt("fixedwidth.txt", delimiter=4) # doctest: +SKIP
+ array([[1.000e+00, 2.000e+00, 3.000e+00],
+ [4.400e+01, nan, 6.000e+00],
+ [7.000e+00, 8.888e+03, 9.000e+00]])
+
+* **A special value (e.g. "x") indicates a missing field**: Use it as the
+ `missing_values` argument.
+ ::
+
+ >>> print(open("nan.txt").read()) # doctest: +SKIP
+ 1 2 3
+ 44 x 6
+ 7 8888 9
+
+ >>> np.genfromtxt("nan.txt", missing_values="x") # doctest: +SKIP
+ array([[1.000e+00, 2.000e+00, 3.000e+00],
+ [4.400e+01, nan, 6.000e+00],
+ [7.000e+00, 8.888e+03, 9.000e+00]])
+
+* **You want to skip the rows with missing values**: Set
+ `invalid_raise=False`.
+ ::
+
+ >>> print(open("skip.txt").read()) # doctest: +SKIP
+ 1 2 3
+ 44 6
+ 7 888 9
+
+ >>> np.genfromtxt("skip.txt", invalid_raise=False) # doctest: +SKIP
+ __main__:1: ConversionWarning: Some errors were detected !
+ Line #2 (got 2 columns instead of 3)
+ array([[ 1., 2., 3.],
+ [ 7., 888., 9.]])
+
+
+* **The delimiter whitespace character is different from the whitespace that
+ indicates missing data**. For instance, if columns are delimited by ``\t``,
+ then missing data will be recognized if it consists of one
+ or more spaces.
+ ::
+
+ >>> f = open("tabs.txt").read() # doctest: +SKIP
+ >>> print(f) # doctest: +SKIP
+ 1 2 3
+ 44 6
+ 7 888 9
+
+ # Tabs vs. spaces
+ >>> print(f.replace("\t","^")) # doctest: +SKIP
+ 1^2^3
+ 44^ ^6
+ 7^888^9
+
+ >>> np.genfromtxt("tabs.txt", delimiter="\t", missing_values=" +") # doctest: +SKIP
+ array([[ 1., 2., 3.],
+ [ 44., nan, 6.],
+ [ 7., 888., 9.]])
+
+******************************************************************************
+Read a file in .npy or .npz format
+******************************************************************************
+
+Choices:
+
+ - Use :func:`numpy.load`. It can read files generated by any of
+ :func:`numpy.save`, :func:`numpy.savez`, or :func:`numpy.savez_compressed`.
+
+ - Use memory mapping. See `numpy.lib.format.open_memmap`.
+
+******************************************************************************
+Write to a file to be read back by NumPy
+******************************************************************************
+
+Binary
+===============================================================================
+
+Use
+:func:`numpy.save`, or to store multiple arrays :func:`numpy.savez`
+or :func:`numpy.savez_compressed`.
+
+For :ref:`security and portability <how-to-io-pickle-file>`, set
+``allow_pickle=False`` unless the dtype contains Python objects, which
+requires pickling.
+
+Masked arrays :any:`can't currently be saved <MaskedArray.tofile>`,
+nor can other arbitrary array subclasses.
+
+Human-readable
+==============================================================================
+
+:func:`numpy.save` and :func:`numpy.savez` create binary files. To **write a
+human-readable file**, use :func:`numpy.savetxt`. The array can only be 1- or
+2-dimensional, and there's no ` savetxtz` for multiple files.
+
+Large arrays
+==============================================================================
+
+See :ref:`how-to-io-large-arrays`.
+
+******************************************************************************
+Read an arbitrarily formatted binary file ("binary blob")
+******************************************************************************
+
+Use a :doc:`structured array <basics.rec>`.
+
+**Example:**
+
+The ``.wav`` file header is a 44-byte block preceding ``data_size`` bytes of the
+actual sound data::
+
+ chunk_id "RIFF"
+ chunk_size 4-byte unsigned little-endian integer
+ format "WAVE"
+ fmt_id "fmt "
+ fmt_size 4-byte unsigned little-endian integer
+ audio_fmt 2-byte unsigned little-endian integer
+ num_channels 2-byte unsigned little-endian integer
+ sample_rate 4-byte unsigned little-endian integer
+ byte_rate 4-byte unsigned little-endian integer
+ block_align 2-byte unsigned little-endian integer
+ bits_per_sample 2-byte unsigned little-endian integer
+ data_id "data"
+ data_size 4-byte unsigned little-endian integer
+
+The ``.wav`` file header as a NumPy structured dtype::
+
+ wav_header_dtype = np.dtype([
+ ("chunk_id", (bytes, 4)), # flexible-sized scalar type, item size 4
+ ("chunk_size", "<u4"), # little-endian unsigned 32-bit integer
+ ("format", "S4"), # 4-byte string, alternate spelling of (bytes, 4)
+ ("fmt_id", "S4"),
+ ("fmt_size", "<u4"),
+ ("audio_fmt", "<u2"), #
+ ("num_channels", "<u2"), # .. more of the same ...
+ ("sample_rate", "<u4"), #
+ ("byte_rate", "<u4"),
+ ("block_align", "<u2"),
+ ("bits_per_sample", "<u2"),
+ ("data_id", "S4"),
+ ("data_size", "<u4"),
+ #
+ # the sound data itself cannot be represented here:
+ # it does not have a fixed size
+ ])
+
+ header = np.fromfile(f, dtype=wave_header_dtype, count=1)[0]
+
+This ``.wav`` example is for illustration; to read a ``.wav`` file in real
+life, use Python's built-in module :mod:`wave`.
+
+(Adapted from Pauli Virtanen, :ref:`advanced_numpy`, licensed
+under `CC BY 4.0 <https://creativecommons.org/licenses/by/4.0/>`_.)
+
+.. _how-to-io-large-arrays:
+
+******************************************************************************
+Write or read large arrays
+******************************************************************************
+
+**Arrays too large to fit in memory** can be treated like ordinary in-memory
+arrays using memory mapping.
+
+- Raw array data written with :func:`numpy.ndarray.tofile` or
+ :func:`numpy.ndarray.tobytes` can be read with :func:`numpy.memmap`::
+
+ array = numpy.memmap("mydata/myarray.arr", mode="r", dtype=np.int16, shape=(1024, 1024))
+
+- Files output by :func:`numpy.save` (that is, using the numpy format) can be read
+ using :func:`numpy.load` with the ``mmap_mode`` keyword argument::
+
+ large_array[some_slice] = np.load("path/to/small_array", mmap_mode="r")
+
+Memory mapping lacks features like data chunking and compression; more
+full-featured formats and libraries usable with NumPy include:
+
+* **HDF5**: `h5py <https://www.h5py.org/>`_ or `PyTables <https://www.pytables.org/>`_.
+* **Zarr**: `here <https://zarr.readthedocs.io/en/stable/tutorial.html#reading-and-writing-data>`_.
+* **NetCDF**: :class:`scipy.io.netcdf_file`.
+
+For tradeoffs among memmap, Zarr, and HDF5, see
+`pythonspeed.com <https://pythonspeed.com/articles/mmap-vs-zarr-hdf5/>`_.
+
+******************************************************************************
+Write files for reading by other (non-NumPy) tools
+******************************************************************************
+
+Formats for **exchanging data** with other tools include HDF5, Zarr, and
+NetCDF (see :ref:`how-to-io-large-arrays`).
+
+******************************************************************************
+Write or read a JSON file
+******************************************************************************
+
+NumPy arrays are **not** directly
+`JSON serializable <https://github.com/numpy/numpy/issues/12481>`_.
+
+
+.. _how-to-io-pickle-file:
+
+******************************************************************************
+Save/restore using a pickle file
+******************************************************************************
+
+Avoid when possible; :doc:`pickles <python:library/pickle>` are not secure
+against erroneous or maliciously constructed data.
+
+Use :func:`numpy.save` and :func:`numpy.load`. Set ``allow_pickle=False``,
+unless the array dtype includes Python objects, in which case pickling is
+required.
+
+******************************************************************************
+Convert from a pandas DataFrame to a NumPy array
+******************************************************************************
+
+See :meth:`pandas.DataFrame.to_numpy`.
+
+******************************************************************************
+ Save/restore using `~numpy.ndarray.tofile` and `~numpy.fromfile`
+******************************************************************************
+
+In general, prefer :func:`numpy.save` and :func:`numpy.load`.
+
+:func:`numpy.ndarray.tofile` and :func:`numpy.fromfile` lose information on
+endianness and precision and so are unsuitable for anything but scratch
+storage.
+
diff --git a/doc/source/user/howtos_index.rst b/doc/source/user/howtos_index.rst
index c052286b9..89a6f54e7 100644
--- a/doc/source/user/howtos_index.rst
+++ b/doc/source/user/howtos_index.rst
@@ -11,4 +11,5 @@ the package, see the :ref:`API reference <reference>`.
.. toctree::
:maxdepth: 1
- ionumpy
+ how-to-how-to
+ how-to-io
diff --git a/doc/source/user/index.rst b/doc/source/user/index.rst
index 4e6a29d9f..28297d9ea 100644
--- a/doc/source/user/index.rst
+++ b/doc/source/user/index.rst
@@ -3,18 +3,17 @@
.. _user:
################
-NumPy User Guide
+NumPy user guide
################
-This guide is intended as an introductory overview of NumPy and
-explains how to install and make use of the most important features of
-NumPy. For detailed reference documentation of the functions and
-classes contained in the package, see the :ref:`reference`.
+This guide is an overview and explains the important features;
+details are found in :ref:`reference`.
.. toctree::
:maxdepth: 1
- setting-up
+ whatisnumpy
+ Installation <https://numpy.org/install/>
quickstart
absolute_beginners
basics
@@ -24,3 +23,23 @@ classes contained in the package, see the :ref:`reference`.
c-info
tutorials_index
howtos_index
+
+
+.. Links to these files are placed directly in the top-level html
+ (doc/source/_templates/indexcontent.html, which appears for the URLs
+ numpy.org/devdocs and numpy.org/doc/XX) and are not in any toctree, so
+ we include them here to avoid a "WARNING: document isn't included in any
+ toctree" message
+
+.. toctree::
+ :hidden:
+
+ explanations_index
+ ../f2py/index
+ ../glossary
+ ../dev/underthehood
+ ../docs/index
+ ../bugs
+ ../release
+ ../doc_conventions
+ ../license
diff --git a/doc/source/user/install.rst b/doc/source/user/install.rst
index 52586f3d7..e05cee2f1 100644
--- a/doc/source/user/install.rst
+++ b/doc/source/user/install.rst
@@ -1,10 +1,7 @@
-****************
-Installing NumPy
-****************
-
-In most use cases the best way to install NumPy on your system is by using a
-pre-built package for your operating system. Please see
-https://scipy.org/install.html for links to available options.
-
-For instructions on building for source package, see
-:doc:`building`. This information is useful mainly for advanced users.
+:orphan:
+
+****************
+Installing NumPy
+****************
+
+See `Installing NumPy <https://numpy.org/install/>`_. \ No newline at end of file
diff --git a/doc/source/user/ionumpy.rst b/doc/source/user/ionumpy.rst
deleted file mode 100644
index a31720322..000000000
--- a/doc/source/user/ionumpy.rst
+++ /dev/null
@@ -1,20 +0,0 @@
-================================================
-How to read and write data using NumPy
-================================================
-
-.. currentmodule:: numpy
-
-.. testsetup::
-
- import numpy as np
- np.random.seed(1)
-
-**Objectives**
-
-- Writing NumPy arrays to files
-- Reading NumPy arrays from files
-- Dealing with encoding and dtype issues
-
-**Content**
-
-To be completed.
diff --git a/doc/source/user/misc.rst b/doc/source/user/misc.rst
index c10aea486..031ce4efa 100644
--- a/doc/source/user/misc.rst
+++ b/doc/source/user/misc.rst
@@ -2,4 +2,224 @@
Miscellaneous
*************
-.. automodule:: numpy.doc.misc
+IEEE 754 Floating Point Special Values
+--------------------------------------
+
+Special values defined in numpy: nan, inf,
+
+NaNs can be used as a poor-man's mask (if you don't care what the
+original value was)
+
+Note: cannot use equality to test NaNs. E.g.: ::
+
+ >>> myarr = np.array([1., 0., np.nan, 3.])
+ >>> np.nonzero(myarr == np.nan)
+ (array([], dtype=int64),)
+ >>> np.nan == np.nan # is always False! Use special numpy functions instead.
+ False
+ >>> myarr[myarr == np.nan] = 0. # doesn't work
+ >>> myarr
+ array([ 1., 0., NaN, 3.])
+ >>> myarr[np.isnan(myarr)] = 0. # use this instead find
+ >>> myarr
+ array([ 1., 0., 0., 3.])
+
+Other related special value functions: ::
+
+ isinf(): True if value is inf
+ isfinite(): True if not nan or inf
+ nan_to_num(): Map nan to 0, inf to max float, -inf to min float
+
+The following corresponds to the usual functions except that nans are excluded
+from the results: ::
+
+ nansum()
+ nanmax()
+ nanmin()
+ nanargmax()
+ nanargmin()
+
+ >>> x = np.arange(10.)
+ >>> x[3] = np.nan
+ >>> x.sum()
+ nan
+ >>> np.nansum(x)
+ 42.0
+
+How numpy handles numerical exceptions
+--------------------------------------
+
+The default is to ``'warn'`` for ``invalid``, ``divide``, and ``overflow``
+and ``'ignore'`` for ``underflow``. But this can be changed, and it can be
+set individually for different kinds of exceptions. The different behaviors
+are:
+
+ - 'ignore' : Take no action when the exception occurs.
+ - 'warn' : Print a `RuntimeWarning` (via the Python `warnings` module).
+ - 'raise' : Raise a `FloatingPointError`.
+ - 'call' : Call a function specified using the `seterrcall` function.
+ - 'print' : Print a warning directly to ``stdout``.
+ - 'log' : Record error in a Log object specified by `seterrcall`.
+
+These behaviors can be set for all kinds of errors or specific ones:
+
+ - all : apply to all numeric exceptions
+ - invalid : when NaNs are generated
+ - divide : divide by zero (for integers as well!)
+ - overflow : floating point overflows
+ - underflow : floating point underflows
+
+Note that integer divide-by-zero is handled by the same machinery.
+These behaviors are set on a per-thread basis.
+
+Examples
+--------
+
+::
+
+ >>> oldsettings = np.seterr(all='warn')
+ >>> np.zeros(5,dtype=np.float32)/0.
+ invalid value encountered in divide
+ >>> j = np.seterr(under='ignore')
+ >>> np.array([1.e-100])**10
+ >>> j = np.seterr(invalid='raise')
+ >>> np.sqrt(np.array([-1.]))
+ FloatingPointError: invalid value encountered in sqrt
+ >>> def errorhandler(errstr, errflag):
+ ... print("saw stupid error!")
+ >>> np.seterrcall(errorhandler)
+ <function err_handler at 0x...>
+ >>> j = np.seterr(all='call')
+ >>> np.zeros(5, dtype=np.int32)/0
+ FloatingPointError: invalid value encountered in divide
+ saw stupid error!
+ >>> j = np.seterr(**oldsettings) # restore previous
+ ... # error-handling settings
+
+Interfacing to C
+----------------
+Only a survey of the choices. Little detail on how each works.
+
+1) Bare metal, wrap your own C-code manually.
+
+ - Plusses:
+
+ - Efficient
+ - No dependencies on other tools
+
+ - Minuses:
+
+ - Lots of learning overhead:
+
+ - need to learn basics of Python C API
+ - need to learn basics of numpy C API
+ - need to learn how to handle reference counting and love it.
+
+ - Reference counting often difficult to get right.
+
+ - getting it wrong leads to memory leaks, and worse, segfaults
+
+ - API will change for Python 3.0!
+
+2) Cython
+
+ - Plusses:
+
+ - avoid learning C API's
+ - no dealing with reference counting
+ - can code in pseudo python and generate C code
+ - can also interface to existing C code
+ - should shield you from changes to Python C api
+ - has become the de-facto standard within the scientific Python community
+ - fast indexing support for arrays
+
+ - Minuses:
+
+ - Can write code in non-standard form which may become obsolete
+ - Not as flexible as manual wrapping
+
+3) ctypes
+
+ - Plusses:
+
+ - part of Python standard library
+ - good for interfacing to existing sharable libraries, particularly
+ Windows DLLs
+ - avoids API/reference counting issues
+ - good numpy support: arrays have all these in their ctypes
+ attribute: ::
+
+ a.ctypes.data a.ctypes.get_strides
+ a.ctypes.data_as a.ctypes.shape
+ a.ctypes.get_as_parameter a.ctypes.shape_as
+ a.ctypes.get_data a.ctypes.strides
+ a.ctypes.get_shape a.ctypes.strides_as
+
+ - Minuses:
+
+ - can't use for writing code to be turned into C extensions, only a wrapper
+ tool.
+
+4) SWIG (automatic wrapper generator)
+
+ - Plusses:
+
+ - around a long time
+ - multiple scripting language support
+ - C++ support
+ - Good for wrapping large (many functions) existing C libraries
+
+ - Minuses:
+
+ - generates lots of code between Python and the C code
+ - can cause performance problems that are nearly impossible to optimize
+ out
+ - interface files can be hard to write
+ - doesn't necessarily avoid reference counting issues or needing to know
+ API's
+
+5) scipy.weave
+
+ - Plusses:
+
+ - can turn many numpy expressions into C code
+ - dynamic compiling and loading of generated C code
+ - can embed pure C code in Python module and have weave extract, generate
+ interfaces and compile, etc.
+
+ - Minuses:
+
+ - Future very uncertain: it's the only part of Scipy not ported to Python 3
+ and is effectively deprecated in favor of Cython.
+
+6) Psyco
+
+ - Plusses:
+
+ - Turns pure python into efficient machine code through jit-like
+ optimizations
+ - very fast when it optimizes well
+
+ - Minuses:
+
+ - Only on intel (windows?)
+ - Doesn't do much for numpy?
+
+Interfacing to Fortran:
+-----------------------
+The clear choice to wrap Fortran code is
+`f2py <https://docs.scipy.org/doc/numpy/f2py/>`_.
+
+Pyfort is an older alternative, but not supported any longer.
+Fwrap is a newer project that looked promising but isn't being developed any
+longer.
+
+Interfacing to C++:
+-------------------
+ 1) Cython
+ 2) CXX
+ 3) Boost.python
+ 4) SWIG
+ 5) SIP (used mainly in PyQT)
+
+
diff --git a/doc/source/user/numpy-for-matlab-users.rst b/doc/source/user/numpy-for-matlab-users.rst
index 602192ecd..ed0be82a0 100644
--- a/doc/source/user/numpy-for-matlab-users.rst
+++ b/doc/source/user/numpy-for-matlab-users.rst
@@ -1,18 +1,15 @@
.. _numpy-for-matlab-users:
======================
-NumPy for Matlab users
+NumPy for MATLAB users
======================
Introduction
============
-MATLAB® and NumPy/SciPy have a lot in common. But there are many
-differences. NumPy and SciPy were created to do numerical and scientific
-computing in the most natural way with Python, not to be MATLAB® clones.
-This page is intended to be a place to collect wisdom about the
-differences, mostly for the purpose of helping proficient MATLAB® users
-become proficient NumPy and SciPy users.
+MATLAB® and NumPy have a lot in common, but NumPy was created to work with
+Python, not to be a MATLAB clone. This guide will help MATLAB users get started
+with NumPy.
.. raw:: html
@@ -20,234 +17,184 @@ become proficient NumPy and SciPy users.
table.docutils td { border: solid 1px #ccc; }
</style>
-Some Key Differences
+Some key differences
====================
.. list-table::
-
- * - In MATLAB®, the basic data type is a multidimensional array of
- double precision floating point numbers. Most expressions take such
- arrays and return such arrays. Operations on the 2-D instances of
- these arrays are designed to act more or less like matrix operations
- in linear algebra.
- - In NumPy the basic type is a multidimensional ``array``. Operations
- on these arrays in all dimensionalities including 2D are element-wise
- operations. One needs to use specific functions for linear algebra
- (though for matrix multiplication, one can use the ``@`` operator
- in python 3.5 and above).
-
- * - MATLAB® uses 1 (one) based indexing. The initial element of a
- sequence is found using a(1).
+ :class: docutils
+
+ * - In MATLAB, the basic type, even for scalars, is a
+ multidimensional array. Array assignments in MATLAB are stored as
+ 2D arrays of double precision floating point numbers, unless you
+ specify the number of dimensions and type. Operations on the 2D
+ instances of these arrays are modeled on matrix operations in
+ linear algebra.
+
+ - In NumPy, the basic type is a multidimensional ``array``. Array
+ assignments in NumPy are usually stored as :ref:`n-dimensional arrays<arrays>` with the
+ minimum type required to hold the objects in sequence, unless you
+ specify the number of dimensions and type. NumPy performs
+ operations element-by-element, so multiplying 2D arrays with
+ ``*`` is not a matrix multiplication -- it's an
+ element-by-element multiplication. (The ``@`` operator, available
+ since Python 3.5, can be used for conventional matrix
+ multiplication.)
+
+ * - MATLAB numbers indices from 1; ``a(1)`` is the first element.
:ref:`See note INDEXING <numpy-for-matlab-users.notes>`
- - Python uses 0 (zero) based indexing. The initial element of a
- sequence is found using a[0].
-
- * - MATLAB®'s scripting language was created for doing linear algebra.
- The syntax for basic matrix operations is nice and clean, but the API
- for adding GUIs and making full-fledged applications is more or less
- an afterthought.
- - NumPy is based on Python, which was designed from the outset to be
- an excellent general-purpose programming language. While Matlab's
- syntax for some array manipulations is more compact than
- NumPy's, NumPy (by virtue of being an add-on to Python) can do many
- things that Matlab just cannot, for instance dealing properly with
- stacks of matrices.
-
- * - In MATLAB®, arrays have pass-by-value semantics, with a lazy
- copy-on-write scheme to prevent actually creating copies until they
- are actually needed. Slice operations copy parts of the array.
- - In NumPy arrays have pass-by-reference semantics. Slice operations
- are views into an array.
-
-
-'array' or 'matrix'? Which should I use?
-========================================
-
-Historically, NumPy has provided a special matrix type, `np.matrix`, which
-is a subclass of ndarray which makes binary operations linear algebra
-operations. You may see it used in some existing code instead of `np.array`.
-So, which one to use?
-
-Short answer
-------------
-
-**Use arrays**.
-
-- They are the standard vector/matrix/tensor type of numpy. Many numpy
- functions return arrays, not matrices.
-- There is a clear distinction between element-wise operations and
- linear algebra operations.
-- You can have standard vectors or row/column vectors if you like.
-
-Until Python 3.5 the only disadvantage of using the array type was that you
-had to use ``dot`` instead of ``*`` to multiply (reduce) two tensors
-(scalar product, matrix vector multiplication etc.). Since Python 3.5 you
-can use the matrix multiplication ``@`` operator.
-
-Given the above, we intend to deprecate ``matrix`` eventually.
-
-Long answer
------------
-
-NumPy contains both an ``array`` class and a ``matrix`` class. The
-``array`` class is intended to be a general-purpose n-dimensional array
-for many kinds of numerical computing, while ``matrix`` is intended to
-facilitate linear algebra computations specifically. In practice there
-are only a handful of key differences between the two.
-
-- Operators ``*`` and ``@``, functions ``dot()``, and ``multiply()``:
-
- - For ``array``, **``*`` means element-wise multiplication**, while
- **``@`` means matrix multiplication**; they have associated functions
- ``multiply()`` and ``dot()``. (Before python 3.5, ``@`` did not exist
- and one had to use ``dot()`` for matrix multiplication).
- - For ``matrix``, **``*`` means matrix multiplication**, and for
- element-wise multiplication one has to use the ``multiply()`` function.
-
-- Handling of vectors (one-dimensional arrays)
-
- - For ``array``, the **vector shapes 1xN, Nx1, and N are all different
- things**. Operations like ``A[:,1]`` return a one-dimensional array of
- shape N, not a two-dimensional array of shape Nx1. Transpose on a
- one-dimensional ``array`` does nothing.
- - For ``matrix``, **one-dimensional arrays are always upconverted to 1xN
- or Nx1 matrices** (row or column vectors). ``A[:,1]`` returns a
- two-dimensional matrix of shape Nx1.
-
-- Handling of higher-dimensional arrays (ndim > 2)
-
- - ``array`` objects **can have number of dimensions > 2**;
- - ``matrix`` objects **always have exactly two dimensions**.
-
-- Convenience attributes
-
- - ``array`` **has a .T attribute**, which returns the transpose of
- the data.
- - ``matrix`` **also has .H, .I, and .A attributes**, which return
- the conjugate transpose, inverse, and ``asarray()`` of the matrix,
- respectively.
-
-- Convenience constructor
-
- - The ``array`` constructor **takes (nested) Python sequences as
- initializers**. As in, ``array([[1,2,3],[4,5,6]])``.
- - The ``matrix`` constructor additionally **takes a convenient
- string initializer**. As in ``matrix("[1 2 3; 4 5 6]")``.
-
-There are pros and cons to using both:
-
-- ``array``
-
- - ``:)`` Element-wise multiplication is easy: ``A*B``.
- - ``:(`` You have to remember that matrix multiplication has its own
- operator, ``@``.
- - ``:)`` You can treat one-dimensional arrays as *either* row or column
- vectors. ``A @ v`` treats ``v`` as a column vector, while
- ``v @ A`` treats ``v`` as a row vector. This can save you having to
- type a lot of transposes.
- - ``:)`` ``array`` is the "default" NumPy type, so it gets the most
- testing, and is the type most likely to be returned by 3rd party
- code that uses NumPy.
- - ``:)`` Is quite at home handling data of any number of dimensions.
- - ``:)`` Closer in semantics to tensor algebra, if you are familiar
- with that.
- - ``:)`` *All* operations (``*``, ``/``, ``+``, ``-`` etc.) are
- element-wise.
- - ``:(`` Sparse matrices from ``scipy.sparse`` do not interact as well
- with arrays.
-
-- ``matrix``
-
- - ``:\\`` Behavior is more like that of MATLAB® matrices.
- - ``<:(`` Maximum of two-dimensional. To hold three-dimensional data you
- need ``array`` or perhaps a Python list of ``matrix``.
- - ``<:(`` Minimum of two-dimensional. You cannot have vectors. They must be
- cast as single-column or single-row matrices.
- - ``<:(`` Since ``array`` is the default in NumPy, some functions may
- return an ``array`` even if you give them a ``matrix`` as an
- argument. This shouldn't happen with NumPy functions (if it does
- it's a bug), but 3rd party code based on NumPy may not honor type
- preservation like NumPy does.
- - ``:)`` ``A*B`` is matrix multiplication, so it looks just like you write
- it in linear algebra (For Python >= 3.5 plain arrays have the same
- convenience with the ``@`` operator).
- - ``<:(`` Element-wise multiplication requires calling a function,
- ``multiply(A,B)``.
- - ``<:(`` The use of operator overloading is a bit illogical: ``*``
- does not work element-wise but ``/`` does.
- - Interaction with ``scipy.sparse`` is a bit cleaner.
+ - NumPy, like Python, numbers indices from 0; ``a[0]`` is the first
+ element.
-The ``array`` is thus much more advisable to use. Indeed, we intend to
-deprecate ``matrix`` eventually.
-
-Table of Rough MATLAB-NumPy Equivalents
+ * - MATLAB's scripting language was created for linear algebra so the
+ syntax for some array manipulations is more compact than
+ NumPy's. On the other hand, the API for adding GUIs and creating
+ full-fledged applications is more or less an afterthought.
+ - NumPy is based on Python, a
+ general-purpose language. The advantage to NumPy
+ is access to Python libraries including: `SciPy
+ <https://www.scipy.org/>`_, `Matplotlib <https://matplotlib.org/>`_,
+ `Pandas <https://pandas.pydata.org/>`_, `OpenCV <https://opencv.org/>`_,
+ and more. In addition, Python is often `embedded as a scripting language
+ <https://en.wikipedia.org/wiki/List_of_Python_software#Embedded_as_a_scripting_language>`_
+ in other software, allowing NumPy to be used there too.
+
+ * - MATLAB array slicing uses pass-by-value semantics, with a lazy
+ copy-on-write scheme to prevent creating copies until they are
+ needed. Slicing operations copy parts of the array.
+ - NumPy array slicing uses pass-by-reference, that does not copy
+ the arguments. Slicing operations are views into an array.
+
+
+Rough equivalents
=======================================
-The table below gives rough equivalents for some common MATLAB®
-expressions. **These are not exact equivalents**, but rather should be
-taken as hints to get you going in the right direction. For more detail
-read the built-in documentation on the NumPy functions.
+The table below gives rough equivalents for some common MATLAB
+expressions. These are similar expressions, not equivalents. For
+details, see the :ref:`documentation<reference>`.
In the table below, it is assumed that you have executed the following
commands in Python:
::
- from numpy import *
- import scipy.linalg
+ import numpy as np
+ from scipy import io, integrate, linalg, signal
+ from scipy.sparse.linalg import eigs
Also assume below that if the Notes talk about "matrix" that the
arguments are two-dimensional entities.
-General Purpose Equivalents
+General purpose equivalents
---------------------------
.. list-table::
:header-rows: 1
- * - **MATLAB**
- - **numpy**
- - **Notes**
+ * - MATLAB
+ - NumPy
+ - Notes
* - ``help func``
- - ``info(func)`` or ``help(func)`` or ``func?`` (in Ipython)
+ - ``info(func)`` or ``help(func)`` or ``func?`` (in IPython)
- get help on the function *func*
* - ``which func``
- - `see note HELP <numpy-for-matlab-users.notes>`__
+ - :ref:`see note HELP <numpy-for-matlab-users.notes>`
- find out where *func* is defined
* - ``type func``
- - ``source(func)`` or ``func??`` (in Ipython)
+ - ``np.source(func)`` or ``func??`` (in IPython)
- print source for *func* (if not a native function)
+ * - ``% comment``
+ - ``# comment``
+ - comment a line of code with the text ``comment``
+
+ * - ::
+
+ for i=1:3
+ fprintf('%i\n',i)
+ end
+
+ - ::
+
+ for i in range(1, 4):
+ print(i)
+
+ - use a for-loop to print the numbers 1, 2, and 3 using :py:class:`range <range>`
+
* - ``a && b``
- ``a and b``
- - short-circuiting logical AND operator (Python native operator);
+ - short-circuiting logical AND operator (:ref:`Python native operator <python:boolean>`);
scalar arguments only
* - ``a || b``
- ``a or b``
- - short-circuiting logical OR operator (Python native operator);
+ - short-circuiting logical OR operator (:ref:`Python native operator <python:boolean>`);
scalar arguments only
+ * - .. code:: matlab
+
+ >> 4 == 4
+ ans = 1
+ >> 4 == 5
+ ans = 0
+
+ - ::
+
+ >>> 4 == 4
+ True
+ >>> 4 == 5
+ False
+
+ - The :ref:`boolean objects <python:bltin-boolean-values>`
+ in Python are ``True`` and ``False``, as opposed to MATLAB
+ logical types of ``1`` and ``0``.
+
+ * - .. code:: matlab
+
+ a=4
+ if a==4
+ fprintf('a = 4\n')
+ elseif a==5
+ fprintf('a = 5\n')
+ end
+
+ - ::
+
+ a = 4
+ if a == 4:
+ print('a = 4')
+ elif a == 5:
+ print('a = 5')
+
+ - create an if-else statement to check if ``a`` is 4 or 5 and print result
+
* - ``1*i``, ``1*j``, ``1i``, ``1j``
- ``1j``
- complex numbers
* - ``eps``
- - ``np.spacing(1)``
- - Distance between 1 and the nearest floating point number.
+ - ``np.finfo(float).eps`` or ``np.spacing(1)``
+ - Upper bound to relative error due to rounding in 64-bit floating point
+ arithmetic.
+
+ * - ``load data.mat``
+ - ``io.loadmat('data.mat')``
+ - Load MATLAB variables saved to the file ``data.mat``. (Note: When saving arrays to
+ ``data.mat`` in MATLAB/Octave, use a recent binary format. :func:`scipy.io.loadmat`
+ will create a dictionary with the saved arrays and further information.)
* - ``ode45``
- - ``scipy.integrate.solve_ivp(f)``
+ - ``integrate.solve_ivp(f)``
- integrate an ODE with Runge-Kutta 4,5
* - ``ode15s``
- - ``scipy.integrate.solve_ivp(f, method='BDF')``
+ - ``integrate.solve_ivp(f, method='BDF')``
- integrate an ODE with BDF method
-Linear Algebra Equivalents
+
+Linear algebra equivalents
--------------------------
.. list-table::
@@ -258,63 +205,63 @@ Linear Algebra Equivalents
- Notes
* - ``ndims(a)``
- - ``ndim(a)`` or ``a.ndim``
- - get the number of dimensions of an array
+ - ``np.ndim(a)`` or ``a.ndim``
+ - number of dimensions of array ``a``
* - ``numel(a)``
- - ``size(a)`` or ``a.size``
- - get the number of elements of an array
+ - ``np.size(a)`` or ``a.size``
+ - number of elements of array ``a``
* - ``size(a)``
- - ``shape(a)`` or ``a.shape``
- - get the "size" of the matrix
+ - ``np.shape(a)`` or ``a.shape``
+ - "size" of array ``a``
* - ``size(a,n)``
- ``a.shape[n-1]``
- get the number of elements of the n-th dimension of array ``a``. (Note
- that MATLAB® uses 1 based indexing while Python uses 0 based indexing,
+ that MATLAB uses 1 based indexing while Python uses 0 based indexing,
See note :ref:`INDEXING <numpy-for-matlab-users.notes>`)
* - ``[ 1 2 3; 4 5 6 ]``
- - ``array([[1.,2.,3.], [4.,5.,6.]])``
- - 2x3 matrix literal
+ - ``np.array([[1. ,2. ,3.], [4. ,5. ,6.]])``
+ - define a 2x3 2D array
* - ``[ a b; c d ]``
- - ``block([[a,b], [c,d]])``
+ - ``np.block([[a, b], [c, d]])``
- construct a matrix from blocks ``a``, ``b``, ``c``, and ``d``
* - ``a(end)``
- ``a[-1]``
- - access last element in the 1xn matrix ``a``
+ - access last element in MATLAB vector (1xn or nx1) or 1D NumPy array
+ ``a`` (length n)
* - ``a(2,5)``
- - ``a[1,4]``
- - access element in second row, fifth column
+ - ``a[1, 4]``
+ - access element in second row, fifth column in 2D array ``a``
* - ``a(2,:)``
- - ``a[1]`` or ``a[1,:]``
- - entire second row of ``a``
+ - ``a[1]`` or ``a[1, :]``
+ - entire second row of 2D array ``a``
* - ``a(1:5,:)``
- - ``a[0:5]`` or ``a[:5]`` or ``a[0:5,:]``
- - the first five rows of ``a``
+ - ``a[0:5]`` or ``a[:5]`` or ``a[0:5, :]``
+ - first 5 rows of 2D array ``a``
* - ``a(end-4:end,:)``
- ``a[-5:]``
- - the last five rows of ``a``
+ - last 5 rows of 2D array ``a``
* - ``a(1:3,5:9)``
- - ``a[0:3][:,4:9]``
- - rows one to three and columns five to nine of ``a``. This gives
- read-only access.
+ - ``a[0:3, 4:9]``
+ - The first through third rows and fifth through ninth columns of a 2D array, ``a``.
* - ``a([2,4,5],[1,3])``
- - ``a[ix_([1,3,4],[0,2])]``
+ - ``a[np.ix_([1, 3, 4], [0, 2])]``
- rows 2,4 and 5 and columns 1 and 3. This allows the matrix to be
modified, and doesn't require a regular slice.
* - ``a(3:2:21,:)``
- - ``a[ 2:21:2,:]``
+ - ``a[2:21:2,:]``
- every other row of ``a``, starting with the third and going to the
twenty-first
@@ -323,11 +270,11 @@ Linear Algebra Equivalents
- every other row of ``a``, starting with the first
* - ``a(end:-1:1,:)`` or ``flipud(a)``
- - ``a[ ::-1,:]``
+ - ``a[::-1,:]``
- ``a`` with rows in reverse order
* - ``a([1:end 1],:)``
- - ``a[r_[:len(a),0]]``
+ - ``a[np.r_[:len(a),0]]``
- ``a`` with copy of the first row appended to the end
* - ``a.'``
@@ -354,30 +301,30 @@ Linear Algebra Equivalents
- ``a**3``
- element-wise exponentiation
- * - ``(a>0.5)``
- - ``(a>0.5)``
- - matrix whose i,jth element is (a_ij > 0.5). The Matlab result is an
- array of 0s and 1s. The NumPy result is an array of the boolean
+ * - ``(a > 0.5)``
+ - ``(a > 0.5)``
+ - matrix whose i,jth element is (a_ij > 0.5). The MATLAB result is an
+ array of logical values 0 and 1. The NumPy result is an array of the boolean
values ``False`` and ``True``.
- * - ``find(a>0.5)``
- - ``nonzero(a>0.5)``
+ * - ``find(a > 0.5)``
+ - ``np.nonzero(a > 0.5)``
- find the indices where (``a`` > 0.5)
- * - ``a(:,find(v>0.5))``
- - ``a[:,nonzero(v>0.5)[0]]``
+ * - ``a(:,find(v > 0.5))``
+ - ``a[:,np.nonzero(v > 0.5)[0]]``
- extract the columms of ``a`` where vector v > 0.5
* - ``a(:,find(v>0.5))``
- - ``a[:,v.T>0.5]``
+ - ``a[:, v.T > 0.5]``
- extract the columms of ``a`` where column vector v > 0.5
* - ``a(a<0.5)=0``
- - ``a[a<0.5]=0``
+ - ``a[a < 0.5]=0``
- ``a`` with elements less than 0.5 zeroed out
* - ``a .* (a>0.5)``
- - ``a * (a>0.5)``
+ - ``a * (a > 0.5)``
- ``a`` with elements less than 0.5 zeroed out
* - ``a(:) = 3``
@@ -386,74 +333,86 @@ Linear Algebra Equivalents
* - ``y=x``
- ``y = x.copy()``
- - numpy assigns by reference
+ - NumPy assigns by reference
* - ``y=x(2,:)``
- - ``y = x[1,:].copy()``
- - numpy slices are by reference
+ - ``y = x[1, :].copy()``
+ - NumPy slices are by reference
* - ``y=x(:)``
- ``y = x.flatten()``
- turn array into vector (note that this forces a copy). To obtain the
- same data ordering as in Matlab, use ``x.flatten('F')``.
+ same data ordering as in MATLAB, use ``x.flatten('F')``.
* - ``1:10``
- - ``arange(1.,11.)`` or ``r_[1.:11.]`` or ``r_[1:10:10j]``
+ - ``np.arange(1., 11.)`` or ``np.r_[1.:11.]`` or ``np.r_[1:10:10j]``
- create an increasing vector (see note :ref:`RANGES
<numpy-for-matlab-users.notes>`)
* - ``0:9``
- - ``arange(10.)`` or ``r_[:10.]`` or ``r_[:9:10j]``
+ - ``np.arange(10.)`` or ``np.r_[:10.]`` or ``np.r_[:9:10j]``
- create an increasing vector (see note :ref:`RANGES
<numpy-for-matlab-users.notes>`)
* - ``[1:10]'``
- - ``arange(1.,11.)[:, newaxis]``
+ - ``np.arange(1.,11.)[:, np.newaxis]``
- create a column vector
* - ``zeros(3,4)``
- - ``zeros((3,4))``
+ - ``np.zeros((3, 4))``
- 3x4 two-dimensional array full of 64-bit floating point zeros
* - ``zeros(3,4,5)``
- - ``zeros((3,4,5))``
+ - ``np.zeros((3, 4, 5))``
- 3x4x5 three-dimensional array full of 64-bit floating point zeros
* - ``ones(3,4)``
- - ``ones((3,4))``
+ - ``np.ones((3, 4))``
- 3x4 two-dimensional array full of 64-bit floating point ones
* - ``eye(3)``
- - ``eye(3)``
+ - ``np.eye(3)``
- 3x3 identity matrix
* - ``diag(a)``
- - ``diag(a)``
- - vector of diagonal elements of ``a``
+ - ``np.diag(a)``
+ - returns a vector of the diagonal elements of 2D array, ``a``
+
+ * - ``diag(v,0)``
+ - ``np.diag(v, 0)``
+ - returns a square diagonal matrix whose nonzero values are the elements of
+ vector, ``v``
- * - ``diag(a,0)``
- - ``diag(a,0)``
- - square diagonal matrix whose nonzero values are the elements of
- ``a``
+ * - .. code:: matlab
+
+ rng(42,'twister')
+ rand(3,4)
- * - ``rand(3,4)``
- - ``random.rand(3,4)`` or ``random.random_sample((3, 4))``
- - random 3x4 matrix
+ - ::
+
+ from numpy.random import default_rng
+ rng = default_rng(42)
+ rng.random(3, 4)
+
+ or older version: ``random.rand((3, 4))``
+
+ - generate a random 3x4 array with default random number generator and
+ seed = 42
* - ``linspace(1,3,4)``
- - ``linspace(1,3,4)``
+ - ``np.linspace(1,3,4)``
- 4 equally spaced samples between 1 and 3, inclusive
* - ``[x,y]=meshgrid(0:8,0:5)``
- - ``mgrid[0:9.,0:6.]`` or ``meshgrid(r_[0:9.],r_[0:6.]``
+ - ``np.mgrid[0:9.,0:6.]`` or ``np.meshgrid(r_[0:9.],r_[0:6.]``
- two 2D arrays: one of x values, the other of y values
* -
- - ``ogrid[0:9.,0:6.]`` or ``ix_(r_[0:9.],r_[0:6.]``
+ - ``ogrid[0:9.,0:6.]`` or ``np.ix_(np.r_[0:9.],np.r_[0:6.]``
- the best way to eval functions on a grid
* - ``[x,y]=meshgrid([1,2,4],[2,4,5])``
- - ``meshgrid([1,2,4],[2,4,5])``
+ - ``np.meshgrid([1,2,4],[2,4,5])``
-
* -
@@ -461,37 +420,38 @@ Linear Algebra Equivalents
- the best way to eval functions on a grid
* - ``repmat(a, m, n)``
- - ``tile(a, (m, n))``
+ - ``np.tile(a, (m, n))``
- create m by n copies of ``a``
* - ``[a b]``
- - ``concatenate((a,b),1)`` or ``hstack((a,b))`` or
- ``column_stack((a,b))`` or ``c_[a,b]``
+ - ``np.concatenate((a,b),1)`` or ``np.hstack((a,b))`` or
+ ``np.column_stack((a,b))`` or ``np.c_[a,b]``
- concatenate columns of ``a`` and ``b``
* - ``[a; b]``
- - ``concatenate((a,b))`` or ``vstack((a,b))`` or ``r_[a,b]``
+ - ``np.concatenate((a,b))`` or ``np.vstack((a,b))`` or ``np.r_[a,b]``
- concatenate rows of ``a`` and ``b``
* - ``max(max(a))``
- - ``a.max()``
- - maximum element of ``a`` (with ndims(a)<=2 for matlab)
+ - ``a.max()`` or ``np.nanmax(a)``
+ - maximum element of ``a`` (with ndims(a)<=2 for MATLAB, if there are
+ NaN's, ``nanmax`` will ignore these and return largest value)
* - ``max(a)``
- ``a.max(0)``
- - maximum element of each column of matrix ``a``
+ - maximum element of each column of array ``a``
* - ``max(a,[],2)``
- ``a.max(1)``
- - maximum element of each row of matrix ``a``
+ - maximum element of each row of array ``a``
* - ``max(a,b)``
- - ``maximum(a, b)``
+ - ``np.maximum(a, b)``
- compares ``a`` and ``b`` element-wise, and returns the maximum value
from each pair
* - ``norm(v)``
- - ``sqrt(v @ v)`` or ``np.linalg.norm(v)``
+ - ``np.sqrt(v @ v)`` or ``np.linalg.norm(v)``
- L2 norm of vector ``v``
* - ``a & b``
@@ -500,7 +460,7 @@ Linear Algebra Equivalents
LOGICOPS <numpy-for-matlab-users.notes>`
* - ``a | b``
- - ``logical_or(a,b)``
+ - ``np.logical_or(a,b)``
- element-by-element OR operator (NumPy ufunc) :ref:`See note LOGICOPS
<numpy-for-matlab-users.notes>`
@@ -514,90 +474,99 @@ Linear Algebra Equivalents
* - ``inv(a)``
- ``linalg.inv(a)``
- - inverse of square matrix ``a``
+ - inverse of square 2D array ``a``
* - ``pinv(a)``
- ``linalg.pinv(a)``
- - pseudo-inverse of matrix ``a``
+ - pseudo-inverse of 2D array ``a``
* - ``rank(a)``
- ``linalg.matrix_rank(a)``
- - matrix rank of a 2D array / matrix ``a``
+ - matrix rank of a 2D array ``a``
* - ``a\b``
- - ``linalg.solve(a,b)`` if ``a`` is square; ``linalg.lstsq(a,b)``
+ - ``linalg.solve(a, b)`` if ``a`` is square; ``linalg.lstsq(a, b)``
otherwise
- solution of a x = b for x
* - ``b/a``
- - Solve a.T x.T = b.T instead
+ - Solve ``a.T x.T = b.T`` instead
- solution of x a = b for x
* - ``[U,S,V]=svd(a)``
- ``U, S, Vh = linalg.svd(a), V = Vh.T``
- singular value decomposition of ``a``
- * - ``chol(a)``
- - ``linalg.cholesky(a).T``
- - cholesky factorization of a matrix (``chol(a)`` in matlab returns an
- upper triangular matrix, but ``linalg.cholesky(a)`` returns a lower
- triangular matrix)
+ * - ``c=chol(a)`` where ``a==c'*c``
+ - ``c = linalg.cholesky(a)`` where ``a == c@c.T``
+ - Cholesky factorization of a 2D array (``chol(a)`` in MATLAB returns an
+ upper triangular 2D array, but :func:`~scipy.linalg.cholesky` returns a lower
+ triangular 2D array)
* - ``[V,D]=eig(a)``
- ``D,V = linalg.eig(a)``
- - eigenvalues and eigenvectors of ``a``
+ - eigenvalues :math:`\lambda` and eigenvectors :math:`\bar{v}` of ``a``,
+ where :math:`\lambda\bar{v}=\mathbf{a}\bar{v}`
* - ``[V,D]=eig(a,b)``
- - ``D,V = scipy.linalg.eig(a,b)``
- - eigenvalues and eigenvectors of ``a``, ``b``
+ - ``D,V = linalg.eig(a, b)``
+ - eigenvalues :math:`\lambda` and eigenvectors :math:`\bar{v}` of
+ ``a``, ``b``
+ where :math:`\lambda\mathbf{b}\bar{v}=\mathbf{a}\bar{v}`
- * - ``[V,D]=eigs(a,k)``
- -
- - find the ``k`` largest eigenvalues and eigenvectors of ``a``
+ * - ``[V,D]=eigs(a,3)``
+ - ``D,V = eigs(a, k = 3)``
+ - find the ``k=3`` largest eigenvalues and eigenvectors of 2D array, ``a``
* - ``[Q,R,P]=qr(a,0)``
- - ``Q,R = scipy.linalg.qr(a)``
+ - ``Q,R = linalg.qr(a)``
- QR decomposition
- * - ``[L,U,P]=lu(a)``
- - ``L,U = scipy.linalg.lu(a)`` or ``LU,P=scipy.linalg.lu_factor(a)``
- - LU decomposition (note: P(Matlab) == transpose(P(numpy)) )
+ * - ``[L,U,P]=lu(a)`` where ``a==P'*L*U``
+ - ``P,L,U = linalg.lu(a)`` where ``a == P@L@U``
+ - LU decomposition (note: P(MATLAB) == transpose(P(NumPy)))
* - ``conjgrad``
- - ``scipy.sparse.linalg.cg``
+ - ``cg``
- Conjugate gradients solver
* - ``fft(a)``
- - ``fft(a)``
+ - ``np.fft(a)``
- Fourier transform of ``a``
* - ``ifft(a)``
- - ``ifft(a)``
+ - ``np.ifft(a)``
- inverse Fourier transform of ``a``
* - ``sort(a)``
- - ``sort(a)`` or ``a.sort()``
- - sort the matrix
+ - ``np.sort(a)`` or ``a.sort(axis=0)``
+ - sort each column of a 2D array, ``a``
- * - ``[b,I] = sortrows(a,i)``
- - ``I = argsort(a[:,i]), b=a[I,:]``
- - sort the rows of the matrix
+ * - ``sort(a, 2)``
+ - ``np.sort(a, axis = 1)`` or ``a.sort(axis = 1)``
+ - sort the each row of 2D array, ``a``
- * - ``regress(y,X)``
- - ``linalg.lstsq(X,y)``
- - multilinear regression
+ * - ``[b,I]=sortrows(a,1)``
+ - ``I = np.argsort(a[:, 0]); b = a[I,:]``
+ - save the array ``a`` as array ``b`` with rows sorted by the first column
+
+ * - ``x = Z\y``
+ - ``x = linalg.lstsq(Z, y)``
+ - perform a linear regression of the form :math:`\mathbf{Zx}=\mathbf{y}`
* - ``decimate(x, q)``
- - ``scipy.signal.resample(x, len(x)/q)``
+ - ``signal.resample(x, np.ceil(len(x)/q))``
- downsample with low-pass filtering
* - ``unique(a)``
- - ``unique(a)``
- -
+ - ``np.unique(a)``
+ - a vector of unique values in array ``a``
* - ``squeeze(a)``
- ``a.squeeze()``
- -
+ - remove singleton dimensions of array ``a``. Note that MATLAB will always
+ return arrays of 2D or higher while NumPy will return arrays of 0D or
+ higher
.. _numpy-for-matlab-users.notes:
@@ -605,15 +574,15 @@ Notes
=====
\ **Submatrix**: Assignment to a submatrix can be done with lists of
-indexes using the ``ix_`` command. E.g., for 2d array ``a``, one might
-do: ``ind=[1,3]; a[np.ix_(ind,ind)]+=100``.
+indices using the ``ix_`` command. E.g., for 2D array ``a``, one might
+do: ``ind=[1, 3]; a[np.ix_(ind, ind)] += 100``.
\ **HELP**: There is no direct equivalent of MATLAB's ``which`` command,
-but the commands ``help`` and ``source`` will usually list the filename
+but the commands :func:`help` and :func:`numpy.source` will usually list the filename
where the function is located. Python also has an ``inspect`` module (do
``import inspect``) which provides a ``getfile`` that often works.
-\ **INDEXING**: MATLAB® uses one based indexing, so the initial element
+\ **INDEXING**: MATLAB uses one based indexing, so the initial element
of a sequence has index 1. Python uses zero based indexing, so the
initial element of a sequence has index 0. Confusion and flamewars arise
because each has advantages and disadvantages. One based indexing is
@@ -623,55 +592,176 @@ indexing <https://groups.google.com/group/comp.lang.python/msg/1bf4d925dfbf368?q
See also `a text by prof.dr. Edsger W.
Dijkstra <https://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html>`__.
-\ **RANGES**: In MATLAB®, ``0:5`` can be used as both a range literal
+\ **RANGES**: In MATLAB, ``0:5`` can be used as both a range literal
and a 'slice' index (inside parentheses); however, in Python, constructs
like ``0:5`` can *only* be used as a slice index (inside square
brackets). Thus the somewhat quirky ``r_`` object was created to allow
-numpy to have a similarly terse range construction mechanism. Note that
+NumPy to have a similarly terse range construction mechanism. Note that
``r_`` is not called like a function or a constructor, but rather
*indexed* using square brackets, which allows the use of Python's slice
syntax in the arguments.
-\ **LOGICOPS**: & or \| in NumPy is bitwise AND/OR, while in Matlab &
-and \| are logical AND/OR. The difference should be clear to anyone with
-significant programming experience. The two can appear to work the same,
-but there are important differences. If you would have used Matlab's &
-or \| operators, you should use the NumPy ufuncs
-logical\_and/logical\_or. The notable differences between Matlab's and
-NumPy's & and \| operators are:
+\ **LOGICOPS**: ``&`` or ``|`` in NumPy is bitwise AND/OR, while in MATLAB &
+and ``|`` are logical AND/OR. The two can appear to work the same,
+but there are important differences. If you would have used MATLAB's ``&``
+or ``|`` operators, you should use the NumPy ufuncs
+``logical_and``/``logical_or``. The notable differences between MATLAB's and
+NumPy's ``&`` and ``|`` operators are:
- Non-logical {0,1} inputs: NumPy's output is the bitwise AND of the
- inputs. Matlab treats any non-zero value as 1 and returns the logical
- AND. For example (3 & 4) in NumPy is 0, while in Matlab both 3 and 4
- are considered logical true and (3 & 4) returns 1.
+ inputs. MATLAB treats any non-zero value as 1 and returns the logical
+ AND. For example ``(3 & 4)`` in NumPy is ``0``, while in MATLAB both ``3``
+ and ``4``
+ are considered logical true and ``(3 & 4)`` returns ``1``.
- Precedence: NumPy's & operator is higher precedence than logical
- operators like < and >; Matlab's is the reverse.
+ operators like ``<`` and ``>``; MATLAB's is the reverse.
If you know you have boolean arguments, you can get away with using
-NumPy's bitwise operators, but be careful with parentheses, like this: z
-= (x > 1) & (x < 2). The absence of NumPy operator forms of logical\_and
-and logical\_or is an unfortunate consequence of Python's design.
+NumPy's bitwise operators, but be careful with parentheses, like this: ``z
+= (x > 1) & (x < 2)``. The absence of NumPy operator forms of ``logical_and``
+and ``logical_or`` is an unfortunate consequence of Python's design.
-**RESHAPE and LINEAR INDEXING**: Matlab always allows multi-dimensional
+**RESHAPE and LINEAR INDEXING**: MATLAB always allows multi-dimensional
arrays to be accessed using scalar or linear indices, NumPy does not.
-Linear indices are common in Matlab programs, e.g. find() on a matrix
+Linear indices are common in MATLAB programs, e.g. ``find()`` on a matrix
returns them, whereas NumPy's find behaves differently. When converting
-Matlab code it might be necessary to first reshape a matrix to a linear
+MATLAB code it might be necessary to first reshape a matrix to a linear
sequence, perform some indexing operations and then reshape back. As
reshape (usually) produces views onto the same storage, it should be
possible to do this fairly efficiently. Note that the scan order used by
-reshape in NumPy defaults to the 'C' order, whereas Matlab uses the
+reshape in NumPy defaults to the 'C' order, whereas MATLAB uses the
Fortran order. If you are simply converting to a linear sequence and
-back this doesn't matter. But if you are converting reshapes from Matlab
-code which relies on the scan order, then this Matlab code: z =
-reshape(x,3,4); should become z = x.reshape(3,4,order='F').copy() in
+back this doesn't matter. But if you are converting reshapes from MATLAB
+code which relies on the scan order, then this MATLAB code: ``z =
+reshape(x,3,4);`` should become ``z = x.reshape(3,4,order='F').copy()`` in
NumPy.
-Customizing Your Environment
+'array' or 'matrix'? Which should I use?
+========================================
+
+Historically, NumPy has provided a special matrix type, `np.matrix`, which
+is a subclass of ndarray which makes binary operations linear algebra
+operations. You may see it used in some existing code instead of `np.array`.
+So, which one to use?
+
+Short answer
+------------
+
+**Use arrays**.
+
+- They support multidimensional array algebra that is supported in MATLAB
+- They are the standard vector/matrix/tensor type of NumPy. Many NumPy
+ functions return arrays, not matrices.
+- There is a clear distinction between element-wise operations and
+ linear algebra operations.
+- You can have standard vectors or row/column vectors if you like.
+
+Until Python 3.5 the only disadvantage of using the array type was that you
+had to use ``dot`` instead of ``*`` to multiply (reduce) two tensors
+(scalar product, matrix vector multiplication etc.). Since Python 3.5 you
+can use the matrix multiplication ``@`` operator.
+
+Given the above, we intend to deprecate ``matrix`` eventually.
+
+Long answer
+-----------
+
+NumPy contains both an ``array`` class and a ``matrix`` class. The
+``array`` class is intended to be a general-purpose n-dimensional array
+for many kinds of numerical computing, while ``matrix`` is intended to
+facilitate linear algebra computations specifically. In practice there
+are only a handful of key differences between the two.
+
+- Operators ``*`` and ``@``, functions ``dot()``, and ``multiply()``:
+
+ - For ``array``, **``*`` means element-wise multiplication**, while
+ **``@`` means matrix multiplication**; they have associated functions
+ ``multiply()`` and ``dot()``. (Before Python 3.5, ``@`` did not exist
+ and one had to use ``dot()`` for matrix multiplication).
+ - For ``matrix``, **``*`` means matrix multiplication**, and for
+ element-wise multiplication one has to use the ``multiply()`` function.
+
+- Handling of vectors (one-dimensional arrays)
+
+ - For ``array``, the **vector shapes 1xN, Nx1, and N are all different
+ things**. Operations like ``A[:,1]`` return a one-dimensional array of
+ shape N, not a two-dimensional array of shape Nx1. Transpose on a
+ one-dimensional ``array`` does nothing.
+ - For ``matrix``, **one-dimensional arrays are always upconverted to 1xN
+ or Nx1 matrices** (row or column vectors). ``A[:,1]`` returns a
+ two-dimensional matrix of shape Nx1.
+
+- Handling of higher-dimensional arrays (ndim > 2)
+
+ - ``array`` objects **can have number of dimensions > 2**;
+ - ``matrix`` objects **always have exactly two dimensions**.
+
+- Convenience attributes
+
+ - ``array`` **has a .T attribute**, which returns the transpose of
+ the data.
+ - ``matrix`` **also has .H, .I, and .A attributes**, which return
+ the conjugate transpose, inverse, and ``asarray()`` of the matrix,
+ respectively.
+
+- Convenience constructor
+
+ - The ``array`` constructor **takes (nested) Python sequences as
+ initializers**. As in, ``array([[1,2,3],[4,5,6]])``.
+ - The ``matrix`` constructor additionally **takes a convenient
+ string initializer**. As in ``matrix("[1 2 3; 4 5 6]")``.
+
+There are pros and cons to using both:
+
+- ``array``
+
+ - ``:)`` Element-wise multiplication is easy: ``A*B``.
+ - ``:(`` You have to remember that matrix multiplication has its own
+ operator, ``@``.
+ - ``:)`` You can treat one-dimensional arrays as *either* row or column
+ vectors. ``A @ v`` treats ``v`` as a column vector, while
+ ``v @ A`` treats ``v`` as a row vector. This can save you having to
+ type a lot of transposes.
+ - ``:)`` ``array`` is the "default" NumPy type, so it gets the most
+ testing, and is the type most likely to be returned by 3rd party
+ code that uses NumPy.
+ - ``:)`` Is quite at home handling data of any number of dimensions.
+ - ``:)`` Closer in semantics to tensor algebra, if you are familiar
+ with that.
+ - ``:)`` *All* operations (``*``, ``/``, ``+``, ``-`` etc.) are
+ element-wise.
+ - ``:(`` Sparse matrices from ``scipy.sparse`` do not interact as well
+ with arrays.
+
+- ``matrix``
+
+ - ``:\\`` Behavior is more like that of MATLAB matrices.
+ - ``<:(`` Maximum of two-dimensional. To hold three-dimensional data you
+ need ``array`` or perhaps a Python list of ``matrix``.
+ - ``<:(`` Minimum of two-dimensional. You cannot have vectors. They must be
+ cast as single-column or single-row matrices.
+ - ``<:(`` Since ``array`` is the default in NumPy, some functions may
+ return an ``array`` even if you give them a ``matrix`` as an
+ argument. This shouldn't happen with NumPy functions (if it does
+ it's a bug), but 3rd party code based on NumPy may not honor type
+ preservation like NumPy does.
+ - ``:)`` ``A*B`` is matrix multiplication, so it looks just like you write
+ it in linear algebra (For Python >= 3.5 plain arrays have the same
+ convenience with the ``@`` operator).
+ - ``<:(`` Element-wise multiplication requires calling a function,
+ ``multiply(A,B)``.
+ - ``<:(`` The use of operator overloading is a bit illogical: ``*``
+ does not work element-wise but ``/`` does.
+ - Interaction with ``scipy.sparse`` is a bit cleaner.
+
+The ``array`` is thus much more advisable to use. Indeed, we intend to
+deprecate ``matrix`` eventually.
+
+Customizing your environment
============================
-In MATLAB® the main tool available to you for customizing the
+In MATLAB the main tool available to you for customizing the
environment is to modify the search path with the locations of your
favorite functions. You can put such customizations into a startup
script that MATLAB will run on startup.
@@ -685,7 +775,7 @@ NumPy, or rather Python, has similar facilities.
interpreter is started, define the ``PYTHONSTARTUP`` environment
variable to contain the name of your startup script.
-Unlike MATLAB®, where anything on your path can be called immediately,
+Unlike MATLAB, where anything on your path can be called immediately,
with Python you need to first do an 'import' statement to make functions
in a particular file accessible.
@@ -696,26 +786,39 @@ this is just an example, not a statement of "best practices"):
# Make all numpy available via shorter 'np' prefix
import numpy as np
- # Make all matlib functions accessible at the top level via M.func()
- import numpy.matlib as M
- # Make some matlib functions accessible directly at the top level via, e.g. rand(3,3)
- from numpy.matlib import rand,zeros,ones,empty,eye
+ #
+ # Make the SciPy linear algebra functions available as linalg.func()
+ # e.g. linalg.lu, linalg.eig (for general l*B@u==A@u solution)
+ from scipy import linalg
+ #
# Define a Hermitian function
def hermitian(A, **kwargs):
- return np.transpose(A,**kwargs).conj()
- # Make some shortcuts for transpose,hermitian:
- # np.transpose(A) --> T(A)
+ return np.conj(A,**kwargs).T
+ # Make a shortcut for hermitian:
# hermitian(A) --> H(A)
- T = np.transpose
H = hermitian
+To use the deprecated `matrix` and other `matlib` functions:
+
+::
+
+ # Make all matlib functions accessible at the top level via M.func()
+ import numpy.matlib as M
+ # Make some matlib functions accessible directly at the top level via, e.g. rand(3,3)
+ from numpy.matlib import matrix,rand,zeros,ones,empty,eye
+
Links
=====
-See http://mathesaurus.sf.net/ for another MATLAB®/NumPy
-cross-reference.
+Another somewhat outdated MATLAB/NumPy cross-reference can be found at
+http://mathesaurus.sf.net/
-An extensive list of tools for scientific work with python can be
+An extensive list of tools for scientific work with Python can be
found in the `topical software page <https://scipy.org/topical-software.html>`__.
-MATLAB® and SimuLink® are registered trademarks of The MathWorks.
+See
+`List of Python software: scripting
+<https://en.wikipedia.org/wiki/List_of_Python_software#Embedded_as_a_scripting_language>`_
+for a list of softwares that use Python as a scripting language
+
+MATLAB® and SimuLink® are registered trademarks of The MathWorks, Inc.
diff --git a/doc/source/user/quickstart.rst b/doc/source/user/quickstart.rst
index 29a4d80ca..8fdc6ec36 100644
--- a/doc/source/user/quickstart.rst
+++ b/doc/source/user/quickstart.rst
@@ -1,5 +1,5 @@
===================
-Quickstart tutorial
+NumPy quickstart
===================
.. currentmodule:: numpy
@@ -12,26 +12,24 @@ Quickstart tutorial
Prerequisites
=============
-Before reading this tutorial you should know a bit of Python. If you
-would like to refresh your memory, take a look at the `Python
+You'll need to know a bit of Python. For a refresher, see the `Python
tutorial <https://docs.python.org/tutorial/>`__.
-If you wish to work the examples in this tutorial, you must also have
-some software installed on your computer. Please see
-https://scipy.org/install.html for instructions.
+To work the examples, you'll need ``matplotlib`` installed
+in addition to NumPy.
**Learner profile**
-This tutorial is intended as a quick overview of
-algebra and arrays in NumPy and want to understand how n-dimensional
+This is a quick overview of
+algebra and arrays in NumPy. It demonstrates how n-dimensional
(:math:`n>=2`) arrays are represented and can be manipulated. In particular, if
you don't know how to apply common functions to n-dimensional arrays (without
using for-loops), or if you want to understand axis and shape properties for
-n-dimensional arrays, this tutorial might be of help.
+n-dimensional arrays, this article might be of help.
**Learning Objectives**
-After this tutorial, you should be able to:
+After reading, you should be able to:
- Understand the difference between one-, two- and n-dimensional arrays in
NumPy;
@@ -361,7 +359,7 @@ existing array rather than create a new one.
>>> a += b # b is not automatically converted to integer type
Traceback (most recent call last):
...
- numpy.core._exceptions.UFuncTypeError: Cannot cast ufunc 'add' output from dtype('float64') to dtype('int64') with casting rule 'same_kind'
+ numpy.core._exceptions._UFuncOutputCastingError: Cannot cast ufunc 'add' output from dtype('float64') to dtype('int64') with casting rule 'same_kind'
When operating with arrays of different types, the type of the resulting
array corresponds to the more general or precise one (a behavior known
@@ -1036,6 +1034,8 @@ Basic Linear Algebra
Less Basic
==========
+.. _broadcasting-rules:
+
Broadcasting rules
------------------
@@ -1054,7 +1054,7 @@ element is assumed to be the same along that dimension for the
"broadcast" array.
After application of the broadcasting rules, the sizes of all arrays
-must match. More details can be found in :doc:`basics.broadcasting`.
+must match. More details can be found in :ref:`basics.broadcasting`.
Advanced indexing and index tricks
==================================
@@ -1390,8 +1390,8 @@ and then use it as::
[14, 13, 15, 17, 12]]])
The advantage of this version of reduce compared to the normal
-ufunc.reduce is that it makes use of the `Broadcasting
-Rules <Tentative_NumPy_Tutorial.html#head-c43f3f81719d84f09ae2b33a22eaf50b26333db8>`__
+ufunc.reduce is that it makes use of the
+:ref:`broadcasting rules <broadcasting-rules>`
in order to avoid creating an argument array the size of the output
times the number of vectors.
diff --git a/doc/source/user/setting-up.rst b/doc/source/user/setting-up.rst
deleted file mode 100644
index 7ca3a365c..000000000
--- a/doc/source/user/setting-up.rst
+++ /dev/null
@@ -1,10 +0,0 @@
-**********
-Setting up
-**********
-
-.. toctree::
- :maxdepth: 1
-
- whatisnumpy
- install
- troubleshooting-importerror
diff --git a/doc/source/user/troubleshooting-importerror.rst b/doc/source/user/troubleshooting-importerror.rst
index 7d4846f77..1f99491a1 100644
--- a/doc/source/user/troubleshooting-importerror.rst
+++ b/doc/source/user/troubleshooting-importerror.rst
@@ -1,3 +1,11 @@
+:orphan:
+
+.. Reason for orphan: This page is referenced by the installation
+ instructions, which have moved from Sphinx to https://numpy.org/install.
+ All install links in Sphinx now point there, leaving no Sphinx references
+ to this page.
+
+
***************************
Troubleshooting ImportError
***************************
@@ -69,7 +77,7 @@ or conda.
Using Eclipse/PyDev with Anaconda/conda Python (or environments)
----------------------------------------------------------------
-Please see the
+Please see the
`Anaconda Documentation <https://docs.anaconda.com/anaconda/user-guide/tasks/integration/eclipse-pydev/>`_
on how to properly configure Eclipse/PyDev to use Anaconda Python with specific
conda environments.
diff --git a/doc/source/user/tutorial-ma.rst b/doc/source/user/tutorial-ma.rst
new file mode 100644
index 000000000..88bad3cbe
--- /dev/null
+++ b/doc/source/user/tutorial-ma.rst
@@ -0,0 +1,386 @@
+=======================
+Tutorial: Masked Arrays
+=======================
+
+.. currentmodule:: numpy
+
+.. testsetup::
+
+ import numpy as np
+ np.random.seed(1)
+
+Prerequisites
+-------------
+
+Before reading this tutorial, you should know a bit of Python. If you
+would like to refresh your memory, take a look at the
+:doc:`Python tutorial <python:tutorial/index>`.
+
+If you want to be able to run the examples in this tutorial, you should also
+have `matplotlib <https://matplotlib.org/>`_ installed on your computer.
+
+Learner profile
+---------------
+
+This tutorial is for people who have a basic understanding of NumPy and want to
+understand how masked arrays and the :mod:`numpy.ma` module can be used in
+practice.
+
+Learning Objectives
+-------------------
+
+After this tutorial, you should be able to:
+
+- Understand what are masked arrays and how they can be created
+- Understand how to access and modify data for masked arrays
+- Decide when the use of masked arrays is appropriate in some of your
+ applications
+
+What are masked arrays?
+-----------------------
+
+Consider the following problem. You have a dataset with missing or invalid
+entries. If you're doing any kind of processing on this data, and want to
+`skip` or flag these unwanted entries without just deleting them, you may have
+to use conditionals or filter your data somehow. The :mod:`numpy.ma` module
+provides some of the same funcionality of
+:class:`NumPy ndarrays <numpy.ndarray>` with added structure to ensure
+invalid entries are not used in computation.
+
+From the :mod:`Reference Guide <numpy.ma>`:
+
+ A masked array is the combination of a standard :class:`numpy.ndarray` and
+ a **mask**. A mask is either ``nomask``, indicating that no value of the
+ associated array is invalid, or an array of booleans that determines for
+ each element of the associated array whether the value is valid or not.
+ When an element of the mask is ``False``, the corresponding element of the
+ associated array is valid and is said to be unmasked. When an element of
+ the mask is ``True``, the corresponding element of the associated array is
+ said to be masked (invalid).
+
+
+We can think of a :class:`MaskedArray <numpy.ma.MaskedArray>` as a
+combination of:
+
+- Data, as a regular :class:`numpy.ndarray` of any shape or datatype;
+- A boolean mask with the same shape as the data;
+- A ``fill_value``, a value that may be used to replace the invalid entries
+ in order to return a standard :class:`numpy.ndarray`.
+
+When can they be useful?
+------------------------
+
+There are a few situations where masked arrays can be more useful than just
+eliminating the invalid entries of an array:
+
+- When you want to preserve the values you masked for later processing, without
+ copying the array;
+- When you have to handle many arrays, each with their own mask. If the mask is
+ part of the array, you avoid bugs and the code is possibly more compact;
+- When you have different flags for missing or invalid values, and wish to
+ preserve these flags without replacing them in the original dataset, but
+ exclude them from computations;
+- If you can't avoid or eliminate missing values, but don't want to deal with
+ :class:`NaN <numpy.nan>` (Not A Number) values in your operations.
+
+Masked arrays are also a good idea since the :mod:`numpy.ma` module also
+comes with a specific implementation of most :term:`NumPy universal functions
+(ufuncs) <ufunc>`, which means that you can still apply fast vectorized
+functions and operations on masked data. The output is then a masked array.
+We'll see some examples of how this works in practice below.
+
+Using masked arrays to see COVID-19 data
+----------------------------------------
+
+From `Kaggle <https://www.kaggle.com/atilamadai/covid19>`_ it is possible to
+download a dataset with initial data about the COVID-19 outbreak in the
+beginning of 2020. We are going to look at a small subset of this data,
+contained in the file ``who_covid_19_sit_rep_time_series.csv``.
+
+.. ipython:: python
+
+ import numpy as np
+ import os
+ # The os.getcwd() function returns the current folder; you can change
+ # the filepath variable to point to the folder where you saved the .csv file
+ filepath = os.getcwd()
+ @suppress
+ filepath = os.path.join(filepath, "source", "user")
+ filename = os.path.join(filepath, "who_covid_19_sit_rep_time_series.csv")
+
+The data file contains data of different types and is organized as follows:
+
+- The first row is a header line that (mostly) describes the data in each column
+ that follow in the rows below, and beginning in the fourth column, the header
+ is the date of the observation.
+- The second through seventh row contain summary data that is of a different
+ type than that which we are going to examine, so we will need to exclude that
+ from the data with which we will work.
+- The numerical data we wish to work with begins at column 4, row 8, and extends
+ from there to the rightmost column and the lowermost row.
+
+Let's explore the data inside this file for the first 14 days of records. To
+gather data from the ``.csv`` file, we will use the :func:`numpy.genfromtxt`
+function, making sure we select only the columns with actual numbers instead of
+the first three columns which contain location data. We also skip the first 7
+rows of this file, since they contain other data we are not interested in.
+Separately, we will extract the information about dates and location for this
+data.
+
+.. ipython:: python
+
+ # Note we are using skip_header and usecols to read only portions of the
+ # data file into each variable.
+ # Read just the dates for columns 3-7 from the first row
+ dates = np.genfromtxt(filename, dtype=np.unicode_, delimiter=",",
+ max_rows=1, usecols=range(3, 17),
+ encoding="utf-8-sig")
+ # Read the names of the geographic locations from the first two
+ # columns, skipping the first seven rows
+ locations = np.genfromtxt(filename, dtype=np.unicode_, delimiter=",",
+ skip_header=7, usecols=(0, 1),
+ encoding="utf-8-sig")
+ # Read the numeric data from just the first 14 days
+ nbcases = np.genfromtxt(filename, dtype=np.int_, delimiter=",",
+ skip_header=7, usecols=range(3, 17),
+ encoding="utf-8-sig")
+
+Included in the :func:`numpy.genfromtxt` function call, we have selected the
+:class:`numpy.dtype` for each subset of the data (either an integer -
+:class:`numpy.int_` - or a string of characters - :class:`numpy.unicode_`). We
+have also used the ``encoding`` argument to select ``utf-8-sig`` as the encoding
+for the file (read more about encoding in the `official Python documentation
+<https://docs.python.org/3/library/codecs.html#encodings-and-unicode>`__). You
+can read more about the :func:`numpy.genfromtxt` function from
+the :func:`Reference Documentation <numpy.genfromtxt>` or from the
+:doc:`Basic IO tutorial <basics.io.genfromtxt>`.
+
+Exploring the data
+------------------
+
+First of all, we can plot the whole set of data we have and see what it looks
+like. In order to get a readable plot, we select only a few of the dates to
+show in our :func:`x-axis ticks <matplotlib.pyplot.xticks>`. Note also that in
+our plot command, we use ``nbcases.T`` (the transpose of the ``nbcases`` array)
+since this means we will plot each row of the file as a separate line. We choose
+to plot a dashed line (using the ``'--'`` line style). See the
+`matplotlib <https://matplotlib.org/>`_ documentation for more info on this.
+
+.. ipython:: python
+
+ import matplotlib.pyplot as plt
+ selected_dates = [0, 3, 11, 13]
+ plt.plot(dates, nbcases.T, '--');
+ plt.xticks(selected_dates, dates[selected_dates]);
+ @savefig plot_covid_1.png
+ plt.title("COVID-19 cumulative cases from Jan 21 to Feb 3 2020");
+
+.. note::
+
+ If you are executing the commands above in the IPython shell, it might be
+ necessary to use the command ``plt.show()`` to show the image window. Note
+ also that we use a semicolon at the end of a line to suppress its output, but
+ this is optional.
+
+The graph has a strange shape from January 24th to February 1st. It would be
+interesing to know where this data comes from. If we look at the ``locations``
+array we extracted from the ``.csv`` file, we can see that we have two columns,
+where the first would contain regions and the second would contain the name of
+the country. However, only the first few rows contain data for the the first
+column (province names in China). Following that, we only have country names. So
+it would make sense to group all the data from China into a single row. For
+this, we'll select from the ``nbcases`` array only the rows for which the
+second entry of the ``locations`` array corresponds to China. Next, we'll use
+the :func:`numpy.sum` function to sum all the selected rows (``axis=0``):
+
+.. ipython:: python
+
+ china_total = nbcases[locations[:, 1] == 'China'].sum(axis=0)
+ china_total
+
+Something's wrong with this data - we are not supposed to have negative values
+in a cumulative data set. What's going on?
+
+Missing data
+------------
+
+Looking at the data, here's what we find: there is a period with
+**missing data**:
+
+.. ipython:: python
+
+ nbcases
+
+All the ``-1`` values we are seeing come from :func:`numpy.genfromtxt`
+attempting to read missing data from the original ``.csv`` file. Obviously, we
+don't want to compute missing data as ``-1`` - we just want to skip this value
+so it doesn't interfere in our analysis. After importing the :mod:`numpy.ma`
+module, we'll create a new array, this time masking the invalid values:
+
+.. ipython:: python
+
+ from numpy import ma
+ nbcases_ma = ma.masked_values(nbcases, -1)
+
+If we look at the ``nbcases_ma`` masked array, this is what we have:
+
+.. ipython:: python
+
+ nbcases_ma
+
+We can see that this is a different kind of array. As mentioned in the
+introduction, it has three attributes (``data``, ``mask`` and ``fill_value``).
+Keep in mind that the ``mask`` attribute has a ``True`` value for elements
+corresponding to **invalid** data (represented by two dashes in the ``data``
+attribute).
+
+.. note::
+
+ Adding ``-1`` to missing data is not a problem with :func:`numpy.genfromtxt`;
+ in this particular case, substituting the missing value with ``0`` might have
+ been fine, but we'll see later that this is far from a general solution.
+ Also, it is possible to call the :func:`numpy.genfromtxt` function using the
+ ``usemask`` parameter. If ``usemask=True``, :func:`numpy.genfromtxt`
+ automatically returns a masked array.
+
+Let's try and see what the data looks like excluding the first row
+(data from the Hubei province in China) so we can look at the missing data more
+closely:
+
+.. ipython:: python
+
+ plt.plot(dates, nbcases_ma[1:].T, '--');
+ plt.xticks(selected_dates, dates[selected_dates]);
+ @savefig plot_covid_2.png
+ plt.title("COVID-19 cumulative cases from Jan 21 to Feb 3 2020");
+
+Now that our data has been masked, let's try summing up all the cases in China:
+
+.. ipython:: python
+
+ china_masked = nbcases_ma[locations[:, 1] == 'China'].sum(axis=0)
+ china_masked
+
+Note that ``china_masked`` is a masked array, so it has a different data
+structure than a regular NumPy array. Now, we can access its data directly by
+using the ``.data`` attribute:
+
+.. ipython:: python
+
+ china_total = china_masked.data
+ china_total
+
+That is better: no more negative values. However, we can still see that for some
+days, the cumulative number of cases seems to go down (from 835 to 10, for
+example), which does not agree with the definition of "cumulative data". If we
+look more closely at the data, we can see that in the period where there was
+missing data in mainland China, there was valid data for Hong Kong, Taiwan,
+Macau and "Unspecified" regions of China. Maybe we can remove those from the
+total sum of cases in China, to get a better understanding of the data.
+
+First, we'll identify the indices of locations in mainland China:
+
+.. ipython:: python
+
+ china_mask = ((locations[:, 1] == 'China') &
+ (locations[:, 0] != 'Hong Kong') &
+ (locations[:, 0] != 'Taiwan') &
+ (locations[:, 0] != 'Macau') &
+ (locations[:, 0] != 'Unspecified*'))
+
+Now, ``china_mask`` is an array of boolean values (``True`` or ``False``); we
+can check that the indices are what we wanted with the :func:`ma.nonzero` method
+for masked arrays:
+
+.. ipython:: python
+
+ china_mask.nonzero()
+
+Now we can correctly sum entries for mainland China:
+
+.. ipython:: python
+
+ china_total = nbcases_ma[china_mask].sum(axis=0)
+ china_total
+
+We can replace the data with this information and plot a new graph, focusing on
+Mainland China:
+
+.. ipython:: python
+
+ plt.plot(dates, china_total.T, '--');
+ plt.xticks(selected_dates, dates[selected_dates]);
+ @savefig plot_covid_3.png
+ plt.title("COVID-19 cumulative cases from Jan 21 to Feb 3 2020 - Mainland China");
+
+It's clear that masked arrays are the right solution here. We cannot represent
+the missing data without mischaracterizing the evolution of the curve.
+
+Fitting Data
+------------
+
+One possibility we can think of is to interpolate the missing data to estimate
+the number of cases in late January. Observe that we can select the masked
+elements using the ``.mask`` attribute:
+
+.. ipython:: python
+
+ china_total.mask
+ invalid = china_total[china_total.mask]
+ invalid
+
+We can also access the valid entries by using the logical negation for this
+mask:
+
+.. ipython:: python
+
+ valid = china_total[~china_total.mask]
+ valid
+
+Now, if we want to create a very simple approximation for this data, we should
+take into account the valid entries around the invalid ones. So first let's
+select the dates for which the data is valid. Note that we can use the mask
+from the ``china_total`` masked array to index the dates array:
+
+.. ipython:: python
+
+ dates[~china_total.mask]
+
+Finally, we can use the :func:`numpy.polyfit` and :func:`numpy.polyval`
+functions to create a cubic polynomial that fits the data as best as possible:
+
+.. ipython:: python
+
+ t = np.arange(len(china_total))
+ params = np.polyfit(t[~china_total.mask], valid, 3)
+ cubic_fit = np.polyval(params, t)
+ plt.plot(t, china_total);
+ @savefig plot_covid_4.png
+ plt.plot(t, cubic_fit, '--');
+
+This plot is not so readable since the lines seem to be over each other, so
+let's summarize in a more elaborate plot. We'll plot the real data when
+available, and show the cubic fit for unavailable data, using this fit to
+compute an estimate to the observed number of cases on January 28th 2020, 7 days
+after the beginning of the records:
+
+.. ipython:: python
+
+ plt.plot(t, china_total);
+ plt.plot(t[china_total.mask], cubic_fit[china_total.mask], '--', color='orange');
+ plt.plot(7, np.polyval(params, 7), 'r*');
+ plt.xticks([0, 7, 13], dates[[0, 7, 13]]);
+ plt.yticks([0, np.polyval(params, 7), 10000, 17500]);
+ plt.legend(['Mainland China', 'Cubic estimate', '7 days after start']);
+ @savefig plot_covid_5.png
+ plt.title("COVID-19 cumulative cases from Jan 21 to Feb 3 2020 - Mainland China\n"
+ "Cubic estimate for 7 days after start");
+
+More reading
+------------
+
+Topics not covered in this tutorial can be found in the documentation:
+
+- :func:`Hardmasks <numpy.ma.harden_mask>` vs. :func:`softmasks
+ <numpy.ma.soften_mask>`
+- :ref:`The numpy.ma module <maskedarray.generic>`
diff --git a/doc/source/user/tutorial-svd.rst b/doc/source/user/tutorial-svd.rst
index 086e0a6de..fd9e366e0 100644
--- a/doc/source/user/tutorial-svd.rst
+++ b/doc/source/user/tutorial-svd.rst
@@ -9,7 +9,8 @@ Tutorial: Linear algebra on n-dimensional arrays
import numpy as np
np.random.seed(1)
-**Prerequisites**
+Prerequisites
+-------------
Before reading this tutorial, you should know a bit of Python. If you
would like to refresh your memory, take a look at the
@@ -19,7 +20,8 @@ If you want to be able to run the examples in this tutorial, you should also
have `matplotlib <https://matplotlib.org/>`_ and `SciPy <https://scipy.org>`_
installed on your computer.
-**Learner profile**
+Learner profile
+---------------
This tutorial is for people who have a basic understanding of linear
algebra and arrays in NumPy and want to understand how n-dimensional
@@ -28,7 +30,8 @@ you don't know how to apply common functions to n-dimensional arrays (without
using for-loops), or if you want to understand axis and shape properties for
n-dimensional arrays, this tutorial might be of help.
-**Learning Objectives**
+Learning Objectives
+-------------------
After this tutorial, you should be able to:
@@ -38,7 +41,8 @@ After this tutorial, you should be able to:
arrays without using for-loops;
- Understand axis and shape properties for n-dimensional arrays.
-**Content**
+Content
+-------
In this tutorial, we will use a `matrix decomposition
<https://en.wikipedia.org/wiki/Matrix_decomposition>`_ from linear algebra, the
@@ -78,7 +82,8 @@ We can see the image using the `matplotlib.pyplot.imshow` function::
If you are executing the commands above in the IPython shell, it might be
necessary to use the command ``plt.show()`` to show the image window.
-**Shape, axis and array properties**
+Shape, axis and array properties
+--------------------------------
Note that, in linear algebra, the dimension of a vector refers to the number of
entries in an array. In NumPy, it instead defines the number of axes. For
@@ -162,7 +167,8 @@ syntax::
>>> green_array = img_array[:, :, 1]
>>> blue_array = img_array[:, :, 2]
-**Operations on an axis**
+Operations on an axis
+---------------------
It is possible to use methods from linear algebra to approximate an existing set
of data. Here, we will use the `SVD (Singular Value Decomposition)
@@ -290,7 +296,8 @@ diagonal and with the appropriate dimensions for multiplying: in our case,
Now, we want to check if the reconstructed ``U @ Sigma @ Vt`` is
close to the original ``img_gray`` matrix.
-**Approximation**
+Approximation
+-------------
The `linalg` module includes a ``norm`` function, which
computes the norm of a vector or matrix represented in a NumPy array. For
@@ -360,7 +367,8 @@ Now, you can go ahead and repeat this experiment with other values of `k`, and
each of your experiments should give you a slightly better (or worse) image
depending on the value you choose.
-**Applying to all colors**
+Applying to all colors
+----------------------
Now we want to do the same kind of operation, but to all three colors. Our
first instinct might be to repeat the same operation we did above to each color
@@ -411,7 +419,8 @@ matrices into the approximation. Now, note that
To build the final approximation matrix, we must understand how multiplication
across different axes works.
-**Products with n-dimensional arrays**
+Products with n-dimensional arrays
+----------------------------------
If you have worked before with only one- or two-dimensional arrays in NumPy,
you might use `numpy.dot` and `numpy.matmul` (or the ``@`` operator)
@@ -495,7 +504,8 @@ Even though the image is not as sharp, using a small number of ``k`` singular
values (compared to the original set of 768 values), we can recover many of the
distinguishing features from this image.
-**Final words**
+Final words
+-----------
Of course, this is not the best method to *approximate* an image.
However, there is, in fact, a result in linear algebra that says that the
@@ -504,7 +514,8 @@ terms of the norm of the difference. For more information, see *G. H. Golub and
C. F. Van Loan, Matrix Computations, Baltimore, MD, Johns Hopkins University
Press, 1985*.
-**Further reading**
+Further reading
+---------------
- :doc:`Python tutorial <python:tutorial/index>`
- :ref:`reference`
diff --git a/doc/source/user/tutorials_index.rst b/doc/source/user/tutorials_index.rst
index c5e859fad..20e2c256c 100644
--- a/doc/source/user/tutorials_index.rst
+++ b/doc/source/user/tutorials_index.rst
@@ -11,9 +11,6 @@ classes contained in the package, see the :ref:`API reference <reference>`.
.. toctree::
:maxdepth: 1
- basics
- misc
- numpy-for-matlab-users
tutorial-svd
- building
- c-info
+ tutorial-ma
+
diff --git a/doc/source/user/whatisnumpy.rst b/doc/source/user/whatisnumpy.rst
index 8478a77c4..154f91c84 100644
--- a/doc/source/user/whatisnumpy.rst
+++ b/doc/source/user/whatisnumpy.rst
@@ -125,7 +125,7 @@ same shape, or a scalar and an array, or even two arrays of with
different shapes, provided that the smaller array is "expandable" to
the shape of the larger in such a way that the resulting broadcast is
unambiguous. For detailed "rules" of broadcasting see
-`numpy.doc.broadcasting`.
+`basics.broadcasting`.
Who Else Uses NumPy?
--------------------
diff --git a/doc/source/user/who_covid_19_sit_rep_time_series.csv b/doc/source/user/who_covid_19_sit_rep_time_series.csv
new file mode 100644
index 000000000..ebf670b8c
--- /dev/null
+++ b/doc/source/user/who_covid_19_sit_rep_time_series.csv
@@ -0,0 +1,115 @@
+Province/States,Country/Region,WHO region,1/21/20,1/22/20,1/23/20,1/24/20,1/25/20,1/26/20,1/27/20,1/28/20,1/29/20,1/30/20,1/31/20,2/1/20,2/2/20,2/3/20,2/4/20,2/5/20,2/6/20,2/7/20,2/8/20,2/9/20,2/10/20,2/11/20,2/12/20,2/13/20,2/14/20,2/15/20,2/16/20,2/17/20,2/18/20,2/19/20,2/20/20,2/21/20,2/22/20,2/23/20,2/24/20,2/25/20,2/26/20,2/27/20,2/28/20,2/29/20,3/1/20,3/2/20,3/3/20
+Confirmed,Globally,,282,314,581,846,1320,2014,2798,4593,6065,7818,9826,11953,14557,17391,20630,24554,28276,31481,34886,37558,40554,43103,45171,46997,49053,50580,51857,71429,73332,75204,75748,76769,77794,78811,79331,80239,81109,82294,83652,85403,87137,88948,90870
+Confirmed,Mainland China,Western Pacific Region,278,309,571,830,1297,1985,2741,4537,5997,7736,9720,11821,14411,17238,20471,24363,28060,31211,34598,37251,40235,42708,44730,46550,48548,50054,51174,70635,72528,74280,74675,75569,76392,77042,77262,77780,78191,78630,78961,79394,79968,80174,80304
+Confirmed,Outside of China,,4,5,10,16,23,29,57,56,68,82,106,132,146,153,159,191,216,270,288,307,319,395,441,447,505,526,683,794,804,924,1073,1200,1402,1769,2069,2459,2918,3664,4691,6009,7169,8774,10566
+Suspected,Mainland China,Western Pacific Region,,,,,,,5794,6973,9239,12167,15238,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+Severe,Mainland China,Western Pacific Region,,,,,,,461,976,1239,1370,1527,1795,2110,2296,2788,3219,3859,4821,6101,6188,6484,7333,8204,,,,,,,,,,,,,,,,,,,,
+Deaths,Mainland China,Western Pacific Region,,,,,,,80,106,132,170,213,259,304,361,425,491,564,637,723,812,909,1017,1114,1260,1381,1524,1666,1772,1870,2006,2121,2239,2348,2445,2595,2666,2718,2747,2791,2838,2873,2915,2946
+Hubei ,China,Western Pacific Region,258,270,375,375,,,,,,,,7153,9074,11177,13522,16678,19665,22112,24953,27100,29631,31728,33366,34874,51968,54406,56249,58182,59989,61682,62031,62662,63454,64084,64287,64786,65187,65596,65914,66337,66907,67103,67217
+Guangdong,China,Western Pacific Region,14,17,26,32,,,,,,,,520,604,683,797,870,944,1018,1075,1120,1151,1177,1219,1241,1261,1295,1316,1322,1328,1331,1332,1333,1339,1342,1345,1347,1347,1347,1348,1349,1349,1350,1350
+Henan,China,Western Pacific Region,,1,1,1,,,,,,,,422,493,566,675,764,851,914,981,1033,1073,1105,1135,1169,1184,1212,1231,1246,1257,1262,1265,1267,1270,1271,1271,1271,1271,1272,1272,1272,1272,1272,1272
+Zhejiang,China,Western Pacific Region,,5,5,5,,,,,,,,599,661,724,829,895,954,1006,1048,1075,1104,1117,1131,1145,1155,1162,1167,1171,1172,1173,1175,1203,1205,1205,1205,1205,1205,1205,1205,1205,1205,1206,1213
+Hunan,China,Western Pacific Region,,1,1,1,,,,,,,,389,463,521,593,661,711,772,803,838,879,912,946,968,988,1001,1004,1006,1007,1008,1010,1011,1013,1016,1016,1016,1016,1017,1017,1018,1018,1018,1018
+Anhui,China,Western Pacific Region,,,,,,,,,,,,297,340,408,480,530,591,665,733,779,830,860,889,910,934,950,962,973,982,986,987,988,989,989,989,989,989,989,990,990,990,990,990
+Jiangxi,China,Western Pacific Region,,1,2,2,,,,,,,,286,333,391,476,548,600,661,698,740,771,804,844,872,900,913,925,930,933,934,934,934,934,934,934,934,934,934,935,935,935,935,935
+Shandong,China,Western Pacific Region,,1,1,1,,,,,,,,202,225,246,270,298,343,379,407,435,459,486,497,506,519,530,537,541,543,544,546,748,750,754,755,755,756,756,756,756,756,758,758
+Jiangsu,China,Western Pacific Region,,,,,,,,,,,,202,231,271,308,341,373,408,439,468,492,515,543,570,593,604,617,626,629,631,631,631,631,631,631,631,631,631,631,631,631,631,631
+Chongqing,China,Western Pacific Region,,1,5,5,,,,,,,,238,262,300,337,366,389,411,426,446,468,486,505,518,529,537,544,551,553,555,560,567,572,573,575,576,576,576,576,576,576,576,576
+Sichuan,China,Western Pacific Region,,1,2,2,,,,,,,,207,236,254,282,301,321,344,363,386,405,417,436,451,463,470,481,495,508,514,520,525,526,526,527,529,531,534,538,538,538,538,538
+Heilongjiang,China,Western Pacific Region,,,,,,,,,,,,80,95,118,155,190,227,277,282,307,331,360,378,395,418,425,445,457,464,470,476,479,479,480,480,480,480,480,480,480,480,480,480
+Beijing,China,Western Pacific Region,5,5,10,10,,,,,,,,156,183,212,228,253,274,297,315,326,337,342,352,366,372,375,380,381,387,393,395,396,399,399,399,400,400,410,410,411,413,414,414
+Shanghai,China,Western Pacific Region,1,2,9,9,,,,,,,,153,177,193,208,233,254,269,281,292,295,302,306,313,318,326,328,331,333,333,333,334,334,335,335,335,336,337,337,337,337,337,338
+Hebei,China,Western Pacific Region,,,,,,,,,,,,96,104,113,126,135,157,171,195,206,218,239,251,265,283,291,300,301,302,306,307,308,309,311,311,311,312,317,318,318,318,318,318
+Fujian,China,Western Pacific Region,,,,,,,,,,,,144,159,179,194,205,215,224,239,250,261,267,272,279,281,285,287,290,292,293,293,293,293,293,293,294,294,296,296,296,296,296,296
+Guangxi,China,Western Pacific Region,,,,,,,,,,,,100,111,127,139,150,168,172,183,195,210,215,222,222,226,235,237,238,242,244,245,246,249,249,251,252,252,252,252,252,252,252,252
+Shaanxi,China,Western Pacific Region,,,,,,,,,,,,101,116,128,142,165,173,184,195,208,213,219,225,229,230,232,236,240,240,242,245,245,245,245,245,245,245,245,245,245,245,245,245
+Yunnan,China,Western Pacific Region,,1,1,1,,,,,,,,91,99,109,117,122,128,135,138,140,141,149,154,155,162,168,169,171,172,172,172,174,174,174,174,174,174,174,174,174,174,174,174
+Hainan,China,Western Pacific Region,,,,,,,,,,,,57,63,70,79,89,100,111,123,128,136,142,145,157,157,162,162,162,163,163,168,168,168,168,168,168,168,168,168,168,168,168,168
+Guizhou,China,Western Pacific Region,,,,,,,,,,,,29,38,46,56,64,69,77,89,96,109,118,131,135,140,143,144,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146
+Tianjin,China,Western Pacific Region,,2,2,2,,,,,,,,34,40,49,63,67,70,94,81,88,91,96,106,112,119,120,122,124,125,128,130,131,133,135,135,135,135,135,136,136,136,136,136
+Shanxi,China,Western Pacific Region,,,,,,,,,,,,47,56,66,74,81,90,96,104,115,119,122,124,126,126,127,128,129,130,131,131,132,132,132,132,133,133,133,133,133,133,133,133
+Liaoning,China,Western Pacific Region,,,,,,,,,,,,60,64,70,74,81,89,94,99,105,107,108,111,116,117,119,120,121,121,121,121,121,121,121,121,121,121,121,121,121,122,122,125
+Hong Kong,China,Western Pacific Region,,,1,2,5,5,8,8,8,10,12,13,14,15,15,18,21,24,26,26,36,42,49,50,53,56,56,57,60,62,65,68,68,70,74,81,85,91,93,94,95,98,101
+Jilin,China,Western Pacific Region,,,,,,,,,,,,17,21,31,42,54,59,65,69,78,80,81,83,84,86,88,88,89,89,90,91,91,91,91,93,93,93,93,93,93,93,93,93
+Gansu,China,Western Pacific Region,,,,,,,,,,,,35,45,51,56,57,62,70,71,81,85,86,86,87,90,90,90,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91
+Xinjiang,China,Western Pacific Region,,,,,,,,,,,,18,23,24,29,32,36,39,42,45,49,55,59,63,65,70,71,73,76,76,76,76,76,75,76,76,76,76,76,76,76,76,76
+Inner Mongolia,China,Western Pacific Region,,,,,,,,,,,,23,26,33,37,42,46,49,50,54,58,58,60,61,63,68,70,72,73,75,75,75,75,75,75,75,75,75,75,75,75,75,75
+Ningxia,China,Western Pacific Region,,,,,,,,,,,,26,28,31,34,34,40,43,45,45,49,53,58,64,67,70,70,70,70,71,71,71,71,71,71,71,71,72,72,73,73,74,74
+Taiwan,China,Western Pacific Region,,1,1,1,3,3,4,7,8,8,9,10,10,10,10,11,11,16,16,17,18,18,18,18,18,18,18,20,22,23,24,26,26,23,28,31,32,32,34,39,39,40,42
+Qinghai,China,Western Pacific Region,,,,,,,,,,,,8,9,13,15,17,18,18,18,18,18,18,18,18,18,18,18,18,18,12,18,18,18,18,18,18,18,18,18,18,18,18,18
+Macau,China,Western Pacific Region,,,1,2,2,2,5,7,7,7,7,7,7,8,8,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10
+Xizang,China,Western Pacific Region,,,,,,,,,,,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+Unspecified*,China,Western Pacific Region,,,131,384,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+,Japan,Western Pacific Region,1,1,1,1,3,3,4,6,7,11,14,17,20,20,20,33,25,25,25,26,26,26,28,29,33,41,53,59,65,73,85,93,105,132,144,157,164,186,210,230,239,254,268
+,Republic of Korea,Western Pacific Region,1,1,1,2,2,2,4,4,4,4,11,12,15,15,16,18,23,24,24,27,27,28,28,28,28,28,29,30,31,51,104,204,346,602,763,977,1261,1766,2337,3150,3736,4212,4812
+,Thailand,South-East Asia Region,2,2,2,4,4,5,5,14,14,14,14,19,19,19,19,25,25,25,32,32,32,33,33,33,33,34,34,35,35,35,35,35,35,35,35,37,40,40,40,42,42,42,43
+,United States of America,Region of the Americas,,,1,1,2,2,5,5,5,5,6,7,8,11,11,11,12,12,12,12,12,13,13,14,15,15,15,15,15,15,15,15,35,35,35,53,53,59,59,62,62,62,64
+,Vietnam,Western Pacific Region,,,,2,2,2,2,2,2,2,5,6,7,8,9,10,10,12,13,14,14,15,15,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+,Singapore,Western Pacific Region,,,,1,3,3,4,7,7,10,13,16,18,18,18,24,28,30,33,40,43,45,47,50,58,67,72,75,77,81,84,85,86,89,89,90,91,93,96,98,102,106,108
+,Italy,European Region,,,,,,,,,,,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,9,76,124,229,322,400,650,888,1128,1689,2036
+,Nepal,South-East Asia Region,,,,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+,Australia,Western Pacific Region,,,,,3,3,4,5,7,7,9,12,12,12,12,13,14,15,15,15,15,15,15,15,15,15,15,15,15,15,15,17,21,21,21,22,23,23,23,24,25,27,33
+,Malaysia,Western Pacific Region,,,,,,3,4,4,4,7,8,8,8,8,10,10,12,14,15,17,18,18,18,18,19,21,22,22,22,22,22,22,22,22,22,22,22,22,24,24,24,24,29
+,Canada,Region of the Americas,,,,,,,1,2,3,3,3,4,4,4,4,5,5,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,9,9,10,10,11,11,14,19,19,27
+,Cambodia,Western Pacific Region,,,,,,,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+,France,European Region,,,,,3,3,3,3,4,5,6,6,6,6,6,6,6,6,6,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,18,38,57,100,100,191
+,Sri Lanka,South-East Asia Region,,,,,,,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+,Iran,Eastern Mediterranean Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,5,18,28,43,61,95,141,245,388,593,978,1501
+,India,South-East Asia Region,,,,,,,,,,1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5
+,Germany,European Region,,,,,,,,1,4,4,5,7,8,10,12,12,12,13,14,14,14,14,16,16,16,16,16,16,16,16,16,16,16,16,16,16,18,21,26,57,57,129,157
+,Philippines,Western Pacific Region,,,,,,,,,,1,1,1,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3
+,Spain,European Region,,,,,,,,,,,,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,12,25,32,45,45,114
+,United Kingdom,European Region,,,,,,,,,,,,2,2,2,2,2,2,3,3,3,4,8,8,9,9,9,9,9,9,9,9,9,9,9,9,13,13,13,16,20,23,36,39
+,Sweden,European Region,,,,,,,,,,,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,7,12,13,14,15
+,Switzerland,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,6,10,18,26,30
+,Austria,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,2,4,5,10,10,18
+,Norway,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,4,6,15,19,25
+,Kuwait,Eastern Mediterranean Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,8,12,43,43,45,45,56,56
+,Bahrain,Eastern Mediterranean Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,8,26,33,33,38,40,47,49
+,United Arab Emirates,Eastern Mediterranean Region,,,,,,,,,4,4,4,4,5,5,5,5,5,5,7,7,7,8,8,8,8,8,8,9,9,9,9,9,11,13,13,13,13,13,19,19,19,21,21
+,Israel,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,1,2,2,2,3,5,7,7,10
+,Iraq,Eastern Mediterranean Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,5,6,7,8,13,19,26
+,Oman,Eastern Mediterranean Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,4,4,6,6,6,6,6
+,Lebanon,Eastern Mediterranean Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,1,1,1,2,2,2,2,10,13
+,Pakistan,Eastern Mediterranean Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,2,2,4,4,5
+,Egypt,Eastern Mediterranean Region,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2
+,Croatia,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,3,3,5,7,7,9
+,Greece,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,3,3,3,7,7
+,Finland,European Region,,,,,,,,,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,6,7
+,Algeria,African Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,1,1,1,1,5
+,Brazil,Region of the Americas,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,1,2,2,2
+,Russian,European Region,,,,,,,,,,,,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3
+,Belgium,European Region,,,,,,,,,,,,,,,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8
+,Denmark,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,2,3,4,5
+,Estonia,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,1,1,1,1
+,Georgia,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,2,3,3,3
+,North Macedonia,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,1,1,1,1
+,Romania,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,3,3,3,3
+,Afghanistan,Eastern Mediterranean Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,1,1,1,1,1,1
+,New Zealand,Western Pacific Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,1,1,2
+,Belarus,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,1,1,1
+,Lithuania,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,1,1,1
+,Netherlands,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,2,7,13,18
+,Nigeria,African Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,1,1,1
+,Mexico,Region of the Americas,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,2,5,5
+,San Marino,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,1,8
+,Azerbaijan,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,3,3
+,Ireland,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,1
+,Monaco,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,1
+,Qatar,Eastern Mediterranean Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,3,7
+,Ecuador,Region of the Americas,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,6
+,Czechia,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,3
+,Iceland,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,9
+,Armenia,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1
+,Luxembourg,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1
+,Indonesia,South-East Asia Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,2
+,Dominican Republic,Region of the Americas,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1
+,Portugal,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2
+,Andorra,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1
+,Latvia,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1
+,Jordan,Eastern Mediterranean Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1
+,Morocco,Eastern Mediterranean Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1
+,Saudi Arabia,Eastern Mediterranean Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1
+,Tunisia,Eastern Mediterranean Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1
+,Senegal,African Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1
+Case on an international conveyance,Other,Other,,,,,,,,,,,,,,,,,20,61,64,64,70,135,175,174,218,218,355,454,454,542,621,634,634,634,695,691,691,705,705,705,706,706,706 \ No newline at end of file
diff --git a/doc/sphinxext b/doc/sphinxext
deleted file mode 160000
-Subproject b4c5fd17e2b85c2416a5e586933eee353b58bf7