From dcc91016e8e5c26187d780a61965d03f8be8e0c7 Mon Sep 17 00:00:00 2001 From: Ethan Ho Date: Thu, 30 Sep 2021 12:15:29 -0500 Subject: [PATCH 01/12] Deprecate unused modules --- src/reactors/logglytoken.py | 21 --------- src/reactors/logtypes/logstash_asyncio.py | 7 --- src/reactors/process.py | 56 ----------------------- 3 files changed, 84 deletions(-) delete mode 100644 src/reactors/logglytoken.py delete mode 100644 src/reactors/logtypes/logstash_asyncio.py delete mode 100644 src/reactors/process.py diff --git a/src/reactors/logglytoken.py b/src/reactors/logglytoken.py deleted file mode 100644 index cf02570..0000000 --- a/src/reactors/logglytoken.py +++ /dev/null @@ -1,21 +0,0 @@ -"""Get LOGGLY CUSTOMER_TOKEN from Github Secrets and pass it to config.yml""" - -import os -import agavepy -import validators -import yaml - -def parse_token(): - customer_token = os.environ.get("CUSTOMER_TOKEN_LOGGLY") - - with open('src/reactors/config.yml', 'r') as yamlfile: - cur_yaml = yaml.safe_load(yamlfile) - cur_yaml['loggly']['customer_token'] = customer_token - - if cur_yaml: - with open('src/reactors/config.yml', 'w') as yamlfile: - yaml.safe_dump(cur_yaml, yamlfile) - - print("parsed") - -parse_token() diff --git a/src/reactors/logtypes/logstash_asyncio.py b/src/reactors/logtypes/logstash_asyncio.py deleted file mode 100644 index 64c53ea..0000000 --- a/src/reactors/logtypes/logstash_asyncio.py +++ /dev/null @@ -1,7 +0,0 @@ -import json -import requests -import logging -import logging.handlers -import traceback -import asyncio -import aiohttp diff --git a/src/reactors/process.py b/src/reactors/process.py deleted file mode 100644 index 8db45d5..0000000 --- a/src/reactors/process.py +++ /dev/null @@ -1,56 +0,0 @@ -"""Run subprocesses from within Python""" -import subprocess -import warnings -from datetime import datetime - -from attrdict import AttrDict - -DEFAULT_TIMEOUT = 60 # 1 minute - - -def run(command_list=[], permissive=False, shell=False, timeout=None): - """ - Run a child or subshell process. - - Parameters: - exec_params - list - Parameters in exec form - permissive - bool - Ignore errors - shell - bool - Execute command by way of a shell - - Usage: - # List system logs directory - params=['ls', '-alth', '/var/log'] - process.run(params) - - Returns an AttrDict of response attributes. - - """ - - # timeout remains unimplemented pending Py3-nativity - if timeout is not None: - warnings.warn('timeout parameter for run is not implemented') - - response = AttrDict( - {'cmdline': None, - 'return_code': None, - 'output': None, - 'elapsed_msec': None}) - - t1 = datetime.now() - try: - response.cmdline = subprocess.list2cmdline(command_list) - out_bytes = subprocess.check_output( - command_list, shell=shell, stderr=subprocess.STDOUT) - response.output = out_bytes.decode() - response.return_code = 0 - t2 = datetime.now() - delta = t2 - t1 - response.elapsed_msec = int(delta.total_seconds() * 1000) - except subprocess.CalledProcessError as e: - if permissive is True: - response.output = e.output - response.return_code = e.returncode - else: - raise OSError(e) - - return response From 7762f8b3bb3521d267fb6c6338c1c3ef496058e5 Mon Sep 17 00:00:00 2001 From: Ethan Ho Date: Thu, 30 Sep 2021 12:24:12 -0500 Subject: [PATCH 02/12] Version tick to 1.0.0 --- docsrc/conf.py | 4 ++-- pyproject.toml | 4 ++-- src/reactors/version.py | 3 +-- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/docsrc/conf.py b/docsrc/conf.py index 67c0b99..fa14cfc 100644 --- a/docsrc/conf.py +++ b/docsrc/conf.py @@ -20,11 +20,11 @@ # -- Project information ----------------------------------------------------- project = 'reactors_sdk' -copyright = '2020, Matthew Vaughn, Ethan Ho, Shweta Gopaulakrishnan' +copyright = '2021, Matthew Vaughn, Ethan Ho, Shweta Gopaulakrishnan' author = 'Matthew Vaughn, Ethan Ho, Shweta Gopaulakrishnan' # The full version, including alpha/beta/rc tags -release = '0.7.0' +release = '1.0.0' # -- General configuration --------------------------------------------------- diff --git a/pyproject.toml b/pyproject.toml index f5deb29..8e976d6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [tool.poetry] name = "reactors" -version = "0.8.0" -description = "Software development kit for Tapis actors" +version = "1.0.0" +description = "Software development kit for Tapis Actors" authors = ["Matthew W Vaughn", "Shweta Gopaulakrishnan", "Ethan Ho "] license = "bsd-2-clause" include = ["src/**/*.yml", "src/**/*.jsonschema", "src/**/*.j2"] diff --git a/src/reactors/version.py b/src/reactors/version.py index 81e3dc5..1e83699 100644 --- a/src/reactors/version.py +++ b/src/reactors/version.py @@ -1,2 +1 @@ -# THIS FILE IS GENERATED FROM SETUP.PY -version = '0.8.0' \ No newline at end of file +version = '1.0.0' \ No newline at end of file From f35c6cbaddf06e1f93f250ada2c26d80d4f9518e Mon Sep 17 00:00:00 2001 From: Ethan Ho Date: Thu, 30 Sep 2021 12:24:31 -0500 Subject: [PATCH 03/12] Fresh make docs --- docs/.buildinfo | 2 +- .../api-ref/reactors.aliases.agavedb.rst.txt | 37 - .../reactors.aliases.agavedb.tests.rst.txt | 37 - .../_sources/api-ref/reactors.aliases.rst.txt | 29 - docs/_sources/api-ref/reactors.cli.rst.txt | 29 + .../api-ref/reactors.logtypes.rst.txt | 20 +- docs/_sources/api-ref/reactors.rst.txt | 42 +- .../_sources/api-ref/reactors.runtime.rst.txt | 69 + .../api-ref/reactors.validation.rst.txt | 45 + docs/_static/basic.css | 111 +- docs/_static/classic.css | 2 +- docs/_static/doctools.js | 16 +- docs/_static/documentation_options.js | 2 +- docs/_static/graphviz.css | 2 +- docs/_static/language_data.js | 6 +- docs/_static/pygments.css | 7 +- docs/_static/searchtools.js | 46 +- docs/_static/sidebar.js | 2 +- docs/_static/underscore-1.13.1.js | 2042 +++++++++++++++++ docs/_static/underscore-1.3.1.js | 999 -------- docs/_static/underscore.js | 37 +- docs/api-ref/modules.html | 66 +- docs/api-ref/reactors.agaveutils.html | 172 +- docs/api-ref/reactors.aliases.agavedb.html | 470 ---- .../reactors.aliases.agavedb.tests.html | 289 --- docs/api-ref/reactors.aliases.html | 223 -- docs/api-ref/reactors.cli.html | 159 ++ docs/api-ref/reactors.html | 379 +-- docs/api-ref/reactors.logtypes.html | 226 +- docs/api-ref/reactors.runtime.html | 520 +++++ docs/api-ref/reactors.validation.html | 324 +++ docs/genindex.html | 532 ++--- docs/index.html | 32 +- docs/objects.inv | Bin 1823 -> 1759 bytes docs/py-modindex.html | 84 +- docs/search.html | 33 +- docs/searchindex.js | 2 +- .../_build/doctrees/api-ref/modules.doctree | Bin 2636 -> 2678 bytes .../api-ref/reactors.agaveutils.doctree | Bin 84398 -> 87560 bytes .../api-ref/reactors.aliases.agavedb.doctree | Bin 93803 -> 0 bytes .../reactors.aliases.agavedb.tests.doctree | Bin 50057 -> 0 bytes .../doctrees/api-ref/reactors.aliases.doctree | Bin 23528 -> 0 bytes .../doctrees/api-ref/reactors.cli.doctree | Bin 0 -> 12088 bytes .../_build/doctrees/api-ref/reactors.doctree | Bin 79126 -> 17872 bytes .../api-ref/reactors.logtypes.doctree | Bin 47750 -> 68209 bytes .../doctrees/api-ref/reactors.runtime.doctree | Bin 0 -> 120381 bytes .../api-ref/reactors.validation.doctree | Bin 0 -> 73599 bytes docsrc/_build/doctrees/environment.pickle | Bin 75763 -> 71607 bytes docsrc/_build/doctrees/index.doctree | Bin 4898 -> 4970 bytes docsrc/_build/html/.buildinfo | 2 +- .../api-ref/reactors.aliases.agavedb.rst.txt | 37 - .../reactors.aliases.agavedb.tests.rst.txt | 37 - .../_sources/api-ref/reactors.aliases.rst.txt | 29 - .../_sources/api-ref/reactors.cli.rst.txt | 29 + .../api-ref/reactors.logtypes.rst.txt | 20 +- .../html/_sources/api-ref/reactors.rst.txt | 42 +- .../_sources/api-ref/reactors.runtime.rst.txt | 69 + .../api-ref/reactors.validation.rst.txt | 45 + docsrc/_build/html/_static/basic.css | 111 +- docsrc/_build/html/_static/classic.css | 2 +- docsrc/_build/html/_static/doctools.js | 16 +- .../html/_static/documentation_options.js | 2 +- docsrc/_build/html/_static/graphviz.css | 2 +- docsrc/_build/html/_static/language_data.js | 6 +- docsrc/_build/html/_static/pygments.css | 7 +- docsrc/_build/html/_static/searchtools.js | 46 +- docsrc/_build/html/_static/sidebar.js | 2 +- .../_build/html/_static/underscore-1.13.1.js | 2042 +++++++++++++++++ .../_build/html/_static/underscore-1.3.1.js | 999 -------- docsrc/_build/html/_static/underscore.js | 37 +- docsrc/_build/html/api-ref/modules.html | 66 +- .../html/api-ref/reactors.agaveutils.html | 172 +- .../api-ref/reactors.aliases.agavedb.html | 470 ---- .../reactors.aliases.agavedb.tests.html | 289 --- .../_build/html/api-ref/reactors.aliases.html | 223 -- docsrc/_build/html/api-ref/reactors.cli.html | 159 ++ docsrc/_build/html/api-ref/reactors.html | 379 +-- .../html/api-ref/reactors.logtypes.html | 226 +- .../_build/html/api-ref/reactors.runtime.html | 520 +++++ .../html/api-ref/reactors.validation.html | 324 +++ docsrc/_build/html/genindex.html | 532 ++--- docsrc/_build/html/index.html | 32 +- docsrc/_build/html/objects.inv | Bin 1823 -> 1759 bytes docsrc/_build/html/py-modindex.html | 84 +- docsrc/_build/html/search.html | 33 +- docsrc/_build/html/searchindex.js | 2 +- docsrc/api-ref/reactors.aliases.agavedb.rst | 37 - .../reactors.aliases.agavedb.tests.rst | 37 - docsrc/api-ref/reactors.aliases.rst | 29 - docsrc/api-ref/reactors.cli.rst | 29 + docsrc/api-ref/reactors.logtypes.rst | 20 +- docsrc/api-ref/reactors.rst | 42 +- docsrc/api-ref/reactors.runtime.rst | 69 + docsrc/api-ref/reactors.validation.rst | 45 + 94 files changed, 8249 insertions(+), 6245 deletions(-) delete mode 100644 docs/_sources/api-ref/reactors.aliases.agavedb.rst.txt delete mode 100644 docs/_sources/api-ref/reactors.aliases.agavedb.tests.rst.txt delete mode 100644 docs/_sources/api-ref/reactors.aliases.rst.txt create mode 100644 docs/_sources/api-ref/reactors.cli.rst.txt create mode 100644 docs/_sources/api-ref/reactors.runtime.rst.txt create mode 100644 docs/_sources/api-ref/reactors.validation.rst.txt create mode 100644 docs/_static/underscore-1.13.1.js delete mode 100644 docs/_static/underscore-1.3.1.js delete mode 100644 docs/api-ref/reactors.aliases.agavedb.html delete mode 100644 docs/api-ref/reactors.aliases.agavedb.tests.html delete mode 100644 docs/api-ref/reactors.aliases.html create mode 100644 docs/api-ref/reactors.cli.html create mode 100644 docs/api-ref/reactors.runtime.html create mode 100644 docs/api-ref/reactors.validation.html delete mode 100644 docsrc/_build/doctrees/api-ref/reactors.aliases.agavedb.doctree delete mode 100644 docsrc/_build/doctrees/api-ref/reactors.aliases.agavedb.tests.doctree delete mode 100644 docsrc/_build/doctrees/api-ref/reactors.aliases.doctree create mode 100644 docsrc/_build/doctrees/api-ref/reactors.cli.doctree create mode 100644 docsrc/_build/doctrees/api-ref/reactors.runtime.doctree create mode 100644 docsrc/_build/doctrees/api-ref/reactors.validation.doctree delete mode 100644 docsrc/_build/html/_sources/api-ref/reactors.aliases.agavedb.rst.txt delete mode 100644 docsrc/_build/html/_sources/api-ref/reactors.aliases.agavedb.tests.rst.txt delete mode 100644 docsrc/_build/html/_sources/api-ref/reactors.aliases.rst.txt create mode 100644 docsrc/_build/html/_sources/api-ref/reactors.cli.rst.txt create mode 100644 docsrc/_build/html/_sources/api-ref/reactors.runtime.rst.txt create mode 100644 docsrc/_build/html/_sources/api-ref/reactors.validation.rst.txt create mode 100644 docsrc/_build/html/_static/underscore-1.13.1.js delete mode 100644 docsrc/_build/html/_static/underscore-1.3.1.js delete mode 100644 docsrc/_build/html/api-ref/reactors.aliases.agavedb.html delete mode 100644 docsrc/_build/html/api-ref/reactors.aliases.agavedb.tests.html delete mode 100644 docsrc/_build/html/api-ref/reactors.aliases.html create mode 100644 docsrc/_build/html/api-ref/reactors.cli.html create mode 100644 docsrc/_build/html/api-ref/reactors.runtime.html create mode 100644 docsrc/_build/html/api-ref/reactors.validation.html delete mode 100644 docsrc/api-ref/reactors.aliases.agavedb.rst delete mode 100644 docsrc/api-ref/reactors.aliases.agavedb.tests.rst delete mode 100644 docsrc/api-ref/reactors.aliases.rst create mode 100644 docsrc/api-ref/reactors.cli.rst create mode 100644 docsrc/api-ref/reactors.runtime.rst create mode 100644 docsrc/api-ref/reactors.validation.rst diff --git a/docs/.buildinfo b/docs/.buildinfo index 78a79ba..c986cd1 100644 --- a/docs/.buildinfo +++ b/docs/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 69e3b12298528aa9ff69b6802fed3003 +config: 89fa977d8fb08abff4f29c77925d06ff tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/_sources/api-ref/reactors.aliases.agavedb.rst.txt b/docs/_sources/api-ref/reactors.aliases.agavedb.rst.txt deleted file mode 100644 index 71f303d..0000000 --- a/docs/_sources/api-ref/reactors.aliases.agavedb.rst.txt +++ /dev/null @@ -1,37 +0,0 @@ -reactors.aliases.agavedb package -================================ - -Subpackages ------------ - -.. toctree:: - :maxdepth: 4 - - reactors.aliases.agavedb.tests - -Submodules ----------- - -reactors.aliases.agavedb.keyval module --------------------------------------- - -.. automodule:: reactors.aliases.agavedb.keyval - :members: - :undoc-members: - :show-inheritance: - -reactors.aliases.agavedb.uniqueid module ----------------------------------------- - -.. automodule:: reactors.aliases.agavedb.uniqueid - :members: - :undoc-members: - :show-inheritance: - -Module contents ---------------- - -.. automodule:: reactors.aliases.agavedb - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/_sources/api-ref/reactors.aliases.agavedb.tests.rst.txt b/docs/_sources/api-ref/reactors.aliases.agavedb.tests.rst.txt deleted file mode 100644 index 6bf5367..0000000 --- a/docs/_sources/api-ref/reactors.aliases.agavedb.tests.rst.txt +++ /dev/null @@ -1,37 +0,0 @@ -reactors.aliases.agavedb.tests package -====================================== - -Submodules ----------- - -reactors.aliases.agavedb.tests.agavefixtures module ---------------------------------------------------- - -.. automodule:: reactors.aliases.agavedb.tests.agavefixtures - :members: - :undoc-members: - :show-inheritance: - -reactors.aliases.agavedb.tests.test\_keyval module --------------------------------------------------- - -.. automodule:: reactors.aliases.agavedb.tests.test_keyval - :members: - :undoc-members: - :show-inheritance: - -reactors.aliases.agavedb.tests.testdata module ----------------------------------------------- - -.. automodule:: reactors.aliases.agavedb.tests.testdata - :members: - :undoc-members: - :show-inheritance: - -Module contents ---------------- - -.. automodule:: reactors.aliases.agavedb.tests - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/_sources/api-ref/reactors.aliases.rst.txt b/docs/_sources/api-ref/reactors.aliases.rst.txt deleted file mode 100644 index db80925..0000000 --- a/docs/_sources/api-ref/reactors.aliases.rst.txt +++ /dev/null @@ -1,29 +0,0 @@ -reactors.aliases package -======================== - -Subpackages ------------ - -.. toctree:: - :maxdepth: 4 - - reactors.aliases.agavedb - -Submodules ----------- - -reactors.aliases.store module ------------------------------ - -.. automodule:: reactors.aliases.store - :members: - :undoc-members: - :show-inheritance: - -Module contents ---------------- - -.. automodule:: reactors.aliases - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/_sources/api-ref/reactors.cli.rst.txt b/docs/_sources/api-ref/reactors.cli.rst.txt new file mode 100644 index 0000000..b669b8c --- /dev/null +++ b/docs/_sources/api-ref/reactors.cli.rst.txt @@ -0,0 +1,29 @@ +reactors.cli package +==================== + +Submodules +---------- + +reactors.cli.run module +----------------------- + +.. automodule:: reactors.cli.run + :members: + :undoc-members: + :show-inheritance: + +reactors.cli.usage module +------------------------- + +.. automodule:: reactors.cli.usage + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: reactors.cli + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/api-ref/reactors.logtypes.rst.txt b/docs/_sources/api-ref/reactors.logtypes.rst.txt index e9aaf9f..d00a94f 100644 --- a/docs/_sources/api-ref/reactors.logtypes.rst.txt +++ b/docs/_sources/api-ref/reactors.logtypes.rst.txt @@ -4,18 +4,26 @@ reactors.logtypes package Submodules ---------- -reactors.logtypes.logstash module ---------------------------------- +reactors.logtypes.loggly module +------------------------------- -.. automodule:: reactors.logtypes.logstash +.. automodule:: reactors.logtypes.loggly :members: :undoc-members: :show-inheritance: -reactors.logtypes.logstash\_asyncio module ------------------------------------------- +reactors.logtypes.loggly\_futures\_session module +------------------------------------------------- -.. automodule:: reactors.logtypes.logstash_asyncio +.. automodule:: reactors.logtypes.loggly_futures_session + :members: + :undoc-members: + :show-inheritance: + +reactors.logtypes.logstash module +--------------------------------- + +.. automodule:: reactors.logtypes.logstash :members: :undoc-members: :show-inheritance: diff --git a/docs/_sources/api-ref/reactors.rst.txt b/docs/_sources/api-ref/reactors.rst.txt index aba558d..f5c0b2e 100644 --- a/docs/_sources/api-ref/reactors.rst.txt +++ b/docs/_sources/api-ref/reactors.rst.txt @@ -8,48 +8,18 @@ Subpackages :maxdepth: 4 reactors.agaveutils - reactors.aliases + reactors.cli reactors.logtypes + reactors.runtime + reactors.validation Submodules ---------- -reactors.jsonmessages module ----------------------------- +reactors.config module +---------------------- -.. automodule:: reactors.jsonmessages - :members: - :undoc-members: - :show-inheritance: - -reactors.process module ------------------------ - -.. automodule:: reactors.process - :members: - :undoc-members: - :show-inheritance: - -reactors.runtime module ------------------------ - -.. automodule:: reactors.runtime - :members: - :undoc-members: - :show-inheritance: - -reactors.storage module ------------------------ - -.. automodule:: reactors.storage - :members: - :undoc-members: - :show-inheritance: - -reactors.uniqueid module ------------------------- - -.. automodule:: reactors.uniqueid +.. automodule:: reactors.config :members: :undoc-members: :show-inheritance: diff --git a/docs/_sources/api-ref/reactors.runtime.rst.txt b/docs/_sources/api-ref/reactors.runtime.rst.txt new file mode 100644 index 0000000..853efa1 --- /dev/null +++ b/docs/_sources/api-ref/reactors.runtime.rst.txt @@ -0,0 +1,69 @@ +reactors.runtime package +======================== + +Submodules +---------- + +reactors.runtime.abaco module +----------------------------- + +.. automodule:: reactors.runtime.abaco + :members: + :undoc-members: + :show-inheritance: + +reactors.runtime.base module +---------------------------- + +.. automodule:: reactors.runtime.base + :members: + :undoc-members: + :show-inheritance: + +reactors.runtime.messaging module +--------------------------------- + +.. automodule:: reactors.runtime.messaging + :members: + :undoc-members: + :show-inheritance: + +reactors.runtime.reactor module +------------------------------- + +.. automodule:: reactors.runtime.reactor + :members: + :undoc-members: + :show-inheritance: + +reactors.runtime.sessions module +-------------------------------- + +.. automodule:: reactors.runtime.sessions + :members: + :undoc-members: + :show-inheritance: + +reactors.runtime.validating module +---------------------------------- + +.. automodule:: reactors.runtime.validating + :members: + :undoc-members: + :show-inheritance: + +reactors.runtime.webhooks module +-------------------------------- + +.. automodule:: reactors.runtime.webhooks + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: reactors.runtime + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/api-ref/reactors.validation.rst.txt b/docs/_sources/api-ref/reactors.validation.rst.txt new file mode 100644 index 0000000..0225729 --- /dev/null +++ b/docs/_sources/api-ref/reactors.validation.rst.txt @@ -0,0 +1,45 @@ +reactors.validation package +=========================== + +Submodules +---------- + +reactors.validation.binary module +--------------------------------- + +.. automodule:: reactors.validation.binary + :members: + :undoc-members: + :show-inheritance: + +reactors.validation.context module +---------------------------------- + +.. automodule:: reactors.validation.context + :members: + :undoc-members: + :show-inheritance: + +reactors.validation.jsondoc module +---------------------------------- + +.. automodule:: reactors.validation.jsondoc + :members: + :undoc-members: + :show-inheritance: + +reactors.validation.message module +---------------------------------- + +.. automodule:: reactors.validation.message + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: reactors.validation + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_static/basic.css b/docs/_static/basic.css index 24bc73e..912859b 100644 --- a/docs/_static/basic.css +++ b/docs/_static/basic.css @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- basic theme. * - * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -130,7 +130,7 @@ ul.search li a { font-weight: bold; } -ul.search li div.context { +ul.search li p.context { color: #888; margin: 2px 0 0 30px; text-align: left; @@ -277,25 +277,25 @@ p.rubric { font-weight: bold; } -img.align-left, .figure.align-left, object.align-left { +img.align-left, figure.align-left, .figure.align-left, object.align-left { clear: left; float: left; margin-right: 1em; } -img.align-right, .figure.align-right, object.align-right { +img.align-right, figure.align-right, .figure.align-right, object.align-right { clear: right; float: right; margin-left: 1em; } -img.align-center, .figure.align-center, object.align-center { +img.align-center, figure.align-center, .figure.align-center, object.align-center { display: block; margin-left: auto; margin-right: auto; } -img.align-default, .figure.align-default { +img.align-default, figure.align-default, .figure.align-default { display: block; margin-left: auto; margin-right: auto; @@ -319,7 +319,8 @@ img.align-default, .figure.align-default { /* -- sidebars -------------------------------------------------------------- */ -div.sidebar { +div.sidebar, +aside.sidebar { margin: 0 0 0.5em 1em; border: 1px solid #ddb; padding: 7px; @@ -377,12 +378,14 @@ div.body p.centered { /* -- content of sidebars/topics/admonitions -------------------------------- */ div.sidebar > :last-child, +aside.sidebar > :last-child, div.topic > :last-child, div.admonition > :last-child { margin-bottom: 0; } div.sidebar::after, +aside.sidebar::after, div.topic::after, div.admonition::after, blockquote::after { @@ -455,20 +458,22 @@ td > :last-child { /* -- figures --------------------------------------------------------------- */ -div.figure { +div.figure, figure { margin: 0.5em; padding: 0.5em; } -div.figure p.caption { +div.figure p.caption, figcaption { padding: 0.3em; } -div.figure p.caption span.caption-number { +div.figure p.caption span.caption-number, +figcaption span.caption-number { font-style: italic; } -div.figure p.caption span.caption-text { +div.figure p.caption span.caption-text, +figcaption span.caption-text { } /* -- field list styles ----------------------------------------------------- */ @@ -503,6 +508,63 @@ table.hlist td { vertical-align: top; } +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + /* -- other body styles ----------------------------------------------------- */ @@ -629,14 +691,6 @@ dl.glossary dt { font-size: 1.1em; } -.optional { - font-size: 1.3em; -} - -.sig-paren { - font-size: larger; -} - .versionmodified { font-style: italic; } @@ -764,8 +818,13 @@ div.code-block-caption code { } table.highlighttable td.linenos, -div.doctest > div.highlight span.gp { /* gp: Generic.Prompt */ - user-select: none; +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ } div.code-block-caption span.caption-number { @@ -780,16 +839,6 @@ div.literal-block-wrapper { margin: 1em 0; } -code.descname { - background-color: transparent; - font-weight: bold; - font-size: 1.2em; -} - -code.descclassname { - background-color: transparent; -} - code.xref, a code { background-color: transparent; font-weight: bold; diff --git a/docs/_static/classic.css b/docs/_static/classic.css index cceb67a..dcae946 100644 --- a/docs/_static/classic.css +++ b/docs/_static/classic.css @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- classic theme. * - * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ diff --git a/docs/_static/doctools.js b/docs/_static/doctools.js index daccd20..8cbf1b1 100644 --- a/docs/_static/doctools.js +++ b/docs/_static/doctools.js @@ -4,7 +4,7 @@ * * Sphinx JavaScript utilities for all documentation. * - * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -29,9 +29,14 @@ if (!window.console || !console.firebug) { /** * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL */ jQuery.urldecode = function(x) { - return decodeURIComponent(x).replace(/\+/g, ' '); + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); }; /** @@ -285,9 +290,10 @@ var Documentation = { initOnKeyListeners: function() { $(document).keydown(function(event) { var activeElementType = document.activeElement.tagName; - // don't navigate when in search box or textarea + // don't navigate when in search box, textarea, dropdown or button if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT' - && !event.altKey && !event.ctrlKey && !event.metaKey && !event.shiftKey) { + && activeElementType !== 'BUTTON' && !event.altKey && !event.ctrlKey && !event.metaKey + && !event.shiftKey) { switch (event.keyCode) { case 37: // left var prevHref = $('link[rel="prev"]').prop('href'); @@ -295,12 +301,14 @@ var Documentation = { window.location.href = prevHref; return false; } + break; case 39: // right var nextHref = $('link[rel="next"]').prop('href'); if (nextHref) { window.location.href = nextHref; return false; } + break; } } }); diff --git a/docs/_static/documentation_options.js b/docs/_static/documentation_options.js index 9bdd13b..2f08d25 100644 --- a/docs/_static/documentation_options.js +++ b/docs/_static/documentation_options.js @@ -1,6 +1,6 @@ var DOCUMENTATION_OPTIONS = { URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: '0.7.0', + VERSION: '1.0.0', LANGUAGE: 'None', COLLAPSE_INDEX: false, BUILDER: 'html', diff --git a/docs/_static/graphviz.css b/docs/_static/graphviz.css index 8ab69e0..b340734 100644 --- a/docs/_static/graphviz.css +++ b/docs/_static/graphviz.css @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- graphviz extension. * - * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ diff --git a/docs/_static/language_data.js b/docs/_static/language_data.js index d2b4ee9..863704b 100644 --- a/docs/_static/language_data.js +++ b/docs/_static/language_data.js @@ -5,7 +5,7 @@ * This script contains the language-specific data used by searchtools.js, * namely the list of stopwords, stemmer, scorer and splitter. * - * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -13,7 +13,8 @@ var stopwords = ["a","and","are","as","at","be","but","by","for","if","in","into","is","it","near","no","not","of","on","or","such","that","the","their","then","there","these","they","this","to","was","will","with"]; -/* Non-minified version JS is _stemmer.js if file is provided */ +/* Non-minified version is copied as a separate JS file, is available */ + /** * Porter Stemmer */ @@ -199,7 +200,6 @@ var Stemmer = function() { - var splitChars = (function() { var result = {}; var singles = [96, 180, 187, 191, 215, 247, 749, 885, 903, 907, 909, 930, 1014, 1648, diff --git a/docs/_static/pygments.css b/docs/_static/pygments.css index 20c4814..691aeb8 100644 --- a/docs/_static/pygments.css +++ b/docs/_static/pygments.css @@ -1,5 +1,10 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } .highlight .hll { background-color: #ffffcc } -.highlight { background: #eeffcc; } +.highlight { background: #eeffcc; } .highlight .c { color: #408090; font-style: italic } /* Comment */ .highlight .err { border: 1px solid #FF0000 } /* Error */ .highlight .k { color: #007020; font-weight: bold } /* Keyword */ diff --git a/docs/_static/searchtools.js b/docs/_static/searchtools.js index 970d0d9..58ff35c 100644 --- a/docs/_static/searchtools.js +++ b/docs/_static/searchtools.js @@ -4,7 +4,7 @@ * * Sphinx JavaScript utilities for the full-text search. * - * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -59,10 +59,10 @@ var Search = { _pulse_status : -1, htmlToText : function(htmlString) { - var htmlElement = document.createElement('span'); - htmlElement.innerHTML = htmlString; - $(htmlElement).find('.headerlink').remove(); - docContent = $(htmlElement).find('[role=main]')[0]; + var virtualDocument = document.implementation.createHTMLDocument('virtual'); + var htmlElement = $(htmlString, virtualDocument); + htmlElement.find('.headerlink').remove(); + docContent = htmlElement.find('[role=main]')[0]; if(docContent === undefined) { console.warn("Content block not found. Sphinx search tries to obtain it " + "via '[role=main]'. Could you check your theme or template."); @@ -248,7 +248,7 @@ var Search = { // results left, load the summary and display it if (results.length) { var item = results.pop(); - var listItem = $('
  • '); + var listItem = $('
  • '); var requestUrl = ""; var linkUrl = ""; if (DOCUMENTATION_OPTIONS.BUILDER === 'dirhtml') { @@ -273,28 +273,31 @@ var Search = { if (item[3]) { listItem.append($(' (' + item[3] + ')')); Search.output.append(listItem); - listItem.slideDown(5, function() { + setTimeout(function() { displayNextItem(); - }); + }, 5); } else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) { $.ajax({url: requestUrl, dataType: "text", complete: function(jqxhr, textstatus) { var data = jqxhr.responseText; if (data !== '' && data !== undefined) { - listItem.append(Search.makeSearchSummary(data, searchterms, hlterms)); + var summary = Search.makeSearchSummary(data, searchterms, hlterms); + if (summary) { + listItem.append(summary); + } } Search.output.append(listItem); - listItem.slideDown(5, function() { + setTimeout(function() { displayNextItem(); - }); + }, 5); }}); } else { // no source available, just display title Search.output.append(listItem); - listItem.slideDown(5, function() { + setTimeout(function() { displayNextItem(); - }); + }, 5); } } // search finished, update title and status message @@ -379,6 +382,13 @@ var Search = { return results; }, + /** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions + */ + escapeRegExp : function(string) { + return string.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string + }, + /** * search for full-text terms in the index */ @@ -402,13 +412,14 @@ var Search = { ]; // add support for partial matches if (word.length > 2) { + var word_regex = this.escapeRegExp(word); for (var w in terms) { - if (w.match(word) && !terms[word]) { + if (w.match(word_regex) && !terms[word]) { _o.push({files: terms[w], score: Scorer.partialTerm}) } } for (var w in titleterms) { - if (w.match(word) && !titleterms[word]) { + if (w.match(word_regex) && !titleterms[word]) { _o.push({files: titleterms[w], score: Scorer.partialTitle}) } } @@ -490,6 +501,9 @@ var Search = { */ makeSearchSummary : function(htmlText, keywords, hlwords) { var text = Search.htmlToText(htmlText); + if (text == "") { + return null; + } var textLower = text.toLowerCase(); var start = 0; $.each(keywords, function() { @@ -501,7 +515,7 @@ var Search = { var excerpt = ((start > 0) ? '...' : '') + $.trim(text.substr(start, 240)) + ((start + 240 - text.length) ? '...' : ''); - var rv = $('
    ').text(excerpt); + var rv = $('

    ').text(excerpt); $.each(hlwords, function() { rv = rv.highlightText(this, 'highlighted'); }); diff --git a/docs/_static/sidebar.js b/docs/_static/sidebar.js index 657f8be..599639f 100644 --- a/docs/_static/sidebar.js +++ b/docs/_static/sidebar.js @@ -16,7 +16,7 @@ * Once the browser is closed the cookie is deleted and the position * reset to the default (expanded). * - * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ diff --git a/docs/_static/underscore-1.13.1.js b/docs/_static/underscore-1.13.1.js new file mode 100644 index 0000000..ffd77af --- /dev/null +++ b/docs/_static/underscore-1.13.1.js @@ -0,0 +1,2042 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define('underscore', factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, (function () { + var current = global._; + var exports = global._ = factory(); + exports.noConflict = function () { global._ = current; return exports; }; + }())); +}(this, (function () { + // Underscore.js 1.13.1 + // https://underscorejs.org + // (c) 2009-2021 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors + // Underscore may be freely distributed under the MIT license. + + // Current version. + var VERSION = '1.13.1'; + + // Establish the root object, `window` (`self`) in the browser, `global` + // on the server, or `this` in some virtual machines. We use `self` + // instead of `window` for `WebWorker` support. + var root = typeof self == 'object' && self.self === self && self || + typeof global == 'object' && global.global === global && global || + Function('return this')() || + {}; + + // Save bytes in the minified (but not gzipped) version: + var ArrayProto = Array.prototype, ObjProto = Object.prototype; + var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null; + + // Create quick reference variables for speed access to core prototypes. + var push = ArrayProto.push, + slice = ArrayProto.slice, + toString = ObjProto.toString, + hasOwnProperty = ObjProto.hasOwnProperty; + + // Modern feature detection. + var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined', + supportsDataView = typeof DataView !== 'undefined'; + + // All **ECMAScript 5+** native function implementations that we hope to use + // are declared here. + var nativeIsArray = Array.isArray, + nativeKeys = Object.keys, + nativeCreate = Object.create, + nativeIsView = supportsArrayBuffer && ArrayBuffer.isView; + + // Create references to these builtin functions because we override them. + var _isNaN = isNaN, + _isFinite = isFinite; + + // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed. + var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString'); + var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString', + 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; + + // The largest integer that can be represented exactly. + var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1; + + // Some functions take a variable number of arguments, or a few expected + // arguments at the beginning and then a variable number of values to operate + // on. This helper accumulates all remaining arguments past the function’s + // argument length (or an explicit `startIndex`), into an array that becomes + // the last argument. Similar to ES6’s "rest parameter". + function restArguments(func, startIndex) { + startIndex = startIndex == null ? func.length - 1 : +startIndex; + return function() { + var length = Math.max(arguments.length - startIndex, 0), + rest = Array(length), + index = 0; + for (; index < length; index++) { + rest[index] = arguments[index + startIndex]; + } + switch (startIndex) { + case 0: return func.call(this, rest); + case 1: return func.call(this, arguments[0], rest); + case 2: return func.call(this, arguments[0], arguments[1], rest); + } + var args = Array(startIndex + 1); + for (index = 0; index < startIndex; index++) { + args[index] = arguments[index]; + } + args[startIndex] = rest; + return func.apply(this, args); + }; + } + + // Is a given variable an object? + function isObject(obj) { + var type = typeof obj; + return type === 'function' || type === 'object' && !!obj; + } + + // Is a given value equal to null? + function isNull(obj) { + return obj === null; + } + + // Is a given variable undefined? + function isUndefined(obj) { + return obj === void 0; + } + + // Is a given value a boolean? + function isBoolean(obj) { + return obj === true || obj === false || toString.call(obj) === '[object Boolean]'; + } + + // Is a given value a DOM element? + function isElement(obj) { + return !!(obj && obj.nodeType === 1); + } + + // Internal function for creating a `toString`-based type tester. + function tagTester(name) { + var tag = '[object ' + name + ']'; + return function(obj) { + return toString.call(obj) === tag; + }; + } + + var isString = tagTester('String'); + + var isNumber = tagTester('Number'); + + var isDate = tagTester('Date'); + + var isRegExp = tagTester('RegExp'); + + var isError = tagTester('Error'); + + var isSymbol = tagTester('Symbol'); + + var isArrayBuffer = tagTester('ArrayBuffer'); + + var isFunction = tagTester('Function'); + + // Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old + // v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236). + var nodelist = root.document && root.document.childNodes; + if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') { + isFunction = function(obj) { + return typeof obj == 'function' || false; + }; + } + + var isFunction$1 = isFunction; + + var hasObjectTag = tagTester('Object'); + + // In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`. + // In IE 11, the most common among them, this problem also applies to + // `Map`, `WeakMap` and `Set`. + var hasStringTagBug = ( + supportsDataView && hasObjectTag(new DataView(new ArrayBuffer(8))) + ), + isIE11 = (typeof Map !== 'undefined' && hasObjectTag(new Map)); + + var isDataView = tagTester('DataView'); + + // In IE 10 - Edge 13, we need a different heuristic + // to determine whether an object is a `DataView`. + function ie10IsDataView(obj) { + return obj != null && isFunction$1(obj.getInt8) && isArrayBuffer(obj.buffer); + } + + var isDataView$1 = (hasStringTagBug ? ie10IsDataView : isDataView); + + // Is a given value an array? + // Delegates to ECMA5's native `Array.isArray`. + var isArray = nativeIsArray || tagTester('Array'); + + // Internal function to check whether `key` is an own property name of `obj`. + function has$1(obj, key) { + return obj != null && hasOwnProperty.call(obj, key); + } + + var isArguments = tagTester('Arguments'); + + // Define a fallback version of the method in browsers (ahem, IE < 9), where + // there isn't any inspectable "Arguments" type. + (function() { + if (!isArguments(arguments)) { + isArguments = function(obj) { + return has$1(obj, 'callee'); + }; + } + }()); + + var isArguments$1 = isArguments; + + // Is a given object a finite number? + function isFinite$1(obj) { + return !isSymbol(obj) && _isFinite(obj) && !isNaN(parseFloat(obj)); + } + + // Is the given value `NaN`? + function isNaN$1(obj) { + return isNumber(obj) && _isNaN(obj); + } + + // Predicate-generating function. Often useful outside of Underscore. + function constant(value) { + return function() { + return value; + }; + } + + // Common internal logic for `isArrayLike` and `isBufferLike`. + function createSizePropertyCheck(getSizeProperty) { + return function(collection) { + var sizeProperty = getSizeProperty(collection); + return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= MAX_ARRAY_INDEX; + } + } + + // Internal helper to generate a function to obtain property `key` from `obj`. + function shallowProperty(key) { + return function(obj) { + return obj == null ? void 0 : obj[key]; + }; + } + + // Internal helper to obtain the `byteLength` property of an object. + var getByteLength = shallowProperty('byteLength'); + + // Internal helper to determine whether we should spend extensive checks against + // `ArrayBuffer` et al. + var isBufferLike = createSizePropertyCheck(getByteLength); + + // Is a given value a typed array? + var typedArrayPattern = /\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/; + function isTypedArray(obj) { + // `ArrayBuffer.isView` is the most future-proof, so use it when available. + // Otherwise, fall back on the above regular expression. + return nativeIsView ? (nativeIsView(obj) && !isDataView$1(obj)) : + isBufferLike(obj) && typedArrayPattern.test(toString.call(obj)); + } + + var isTypedArray$1 = supportsArrayBuffer ? isTypedArray : constant(false); + + // Internal helper to obtain the `length` property of an object. + var getLength = shallowProperty('length'); + + // Internal helper to create a simple lookup structure. + // `collectNonEnumProps` used to depend on `_.contains`, but this led to + // circular imports. `emulatedSet` is a one-off solution that only works for + // arrays of strings. + function emulatedSet(keys) { + var hash = {}; + for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true; + return { + contains: function(key) { return hash[key]; }, + push: function(key) { + hash[key] = true; + return keys.push(key); + } + }; + } + + // Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't + // be iterated by `for key in ...` and thus missed. Extends `keys` in place if + // needed. + function collectNonEnumProps(obj, keys) { + keys = emulatedSet(keys); + var nonEnumIdx = nonEnumerableProps.length; + var constructor = obj.constructor; + var proto = isFunction$1(constructor) && constructor.prototype || ObjProto; + + // Constructor is a special case. + var prop = 'constructor'; + if (has$1(obj, prop) && !keys.contains(prop)) keys.push(prop); + + while (nonEnumIdx--) { + prop = nonEnumerableProps[nonEnumIdx]; + if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) { + keys.push(prop); + } + } + } + + // Retrieve the names of an object's own properties. + // Delegates to **ECMAScript 5**'s native `Object.keys`. + function keys(obj) { + if (!isObject(obj)) return []; + if (nativeKeys) return nativeKeys(obj); + var keys = []; + for (var key in obj) if (has$1(obj, key)) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; + } + + // Is a given array, string, or object empty? + // An "empty" object has no enumerable own-properties. + function isEmpty(obj) { + if (obj == null) return true; + // Skip the more expensive `toString`-based type checks if `obj` has no + // `.length`. + var length = getLength(obj); + if (typeof length == 'number' && ( + isArray(obj) || isString(obj) || isArguments$1(obj) + )) return length === 0; + return getLength(keys(obj)) === 0; + } + + // Returns whether an object has a given set of `key:value` pairs. + function isMatch(object, attrs) { + var _keys = keys(attrs), length = _keys.length; + if (object == null) return !length; + var obj = Object(object); + for (var i = 0; i < length; i++) { + var key = _keys[i]; + if (attrs[key] !== obj[key] || !(key in obj)) return false; + } + return true; + } + + // If Underscore is called as a function, it returns a wrapped object that can + // be used OO-style. This wrapper holds altered versions of all functions added + // through `_.mixin`. Wrapped objects may be chained. + function _$1(obj) { + if (obj instanceof _$1) return obj; + if (!(this instanceof _$1)) return new _$1(obj); + this._wrapped = obj; + } + + _$1.VERSION = VERSION; + + // Extracts the result from a wrapped and chained object. + _$1.prototype.value = function() { + return this._wrapped; + }; + + // Provide unwrapping proxies for some methods used in engine operations + // such as arithmetic and JSON stringification. + _$1.prototype.valueOf = _$1.prototype.toJSON = _$1.prototype.value; + + _$1.prototype.toString = function() { + return String(this._wrapped); + }; + + // Internal function to wrap or shallow-copy an ArrayBuffer, + // typed array or DataView to a new view, reusing the buffer. + function toBufferView(bufferSource) { + return new Uint8Array( + bufferSource.buffer || bufferSource, + bufferSource.byteOffset || 0, + getByteLength(bufferSource) + ); + } + + // We use this string twice, so give it a name for minification. + var tagDataView = '[object DataView]'; + + // Internal recursive comparison function for `_.isEqual`. + function eq(a, b, aStack, bStack) { + // Identical objects are equal. `0 === -0`, but they aren't identical. + // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal). + if (a === b) return a !== 0 || 1 / a === 1 / b; + // `null` or `undefined` only equal to itself (strict comparison). + if (a == null || b == null) return false; + // `NaN`s are equivalent, but non-reflexive. + if (a !== a) return b !== b; + // Exhaust primitive checks + var type = typeof a; + if (type !== 'function' && type !== 'object' && typeof b != 'object') return false; + return deepEq(a, b, aStack, bStack); + } + + // Internal recursive comparison function for `_.isEqual`. + function deepEq(a, b, aStack, bStack) { + // Unwrap any wrapped objects. + if (a instanceof _$1) a = a._wrapped; + if (b instanceof _$1) b = b._wrapped; + // Compare `[[Class]]` names. + var className = toString.call(a); + if (className !== toString.call(b)) return false; + // Work around a bug in IE 10 - Edge 13. + if (hasStringTagBug && className == '[object Object]' && isDataView$1(a)) { + if (!isDataView$1(b)) return false; + className = tagDataView; + } + switch (className) { + // These types are compared by value. + case '[object RegExp]': + // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i') + case '[object String]': + // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is + // equivalent to `new String("5")`. + return '' + a === '' + b; + case '[object Number]': + // `NaN`s are equivalent, but non-reflexive. + // Object(NaN) is equivalent to NaN. + if (+a !== +a) return +b !== +b; + // An `egal` comparison is performed for other numeric values. + return +a === 0 ? 1 / +a === 1 / b : +a === +b; + case '[object Date]': + case '[object Boolean]': + // Coerce dates and booleans to numeric primitive values. Dates are compared by their + // millisecond representations. Note that invalid dates with millisecond representations + // of `NaN` are not equivalent. + return +a === +b; + case '[object Symbol]': + return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b); + case '[object ArrayBuffer]': + case tagDataView: + // Coerce to typed array so we can fall through. + return deepEq(toBufferView(a), toBufferView(b), aStack, bStack); + } + + var areArrays = className === '[object Array]'; + if (!areArrays && isTypedArray$1(a)) { + var byteLength = getByteLength(a); + if (byteLength !== getByteLength(b)) return false; + if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true; + areArrays = true; + } + if (!areArrays) { + if (typeof a != 'object' || typeof b != 'object') return false; + + // Objects with different constructors are not equivalent, but `Object`s or `Array`s + // from different frames are. + var aCtor = a.constructor, bCtor = b.constructor; + if (aCtor !== bCtor && !(isFunction$1(aCtor) && aCtor instanceof aCtor && + isFunction$1(bCtor) && bCtor instanceof bCtor) + && ('constructor' in a && 'constructor' in b)) { + return false; + } + } + // Assume equality for cyclic structures. The algorithm for detecting cyclic + // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. + + // Initializing stack of traversed objects. + // It's done here since we only need them for objects and arrays comparison. + aStack = aStack || []; + bStack = bStack || []; + var length = aStack.length; + while (length--) { + // Linear search. Performance is inversely proportional to the number of + // unique nested structures. + if (aStack[length] === a) return bStack[length] === b; + } + + // Add the first object to the stack of traversed objects. + aStack.push(a); + bStack.push(b); + + // Recursively compare objects and arrays. + if (areArrays) { + // Compare array lengths to determine if a deep comparison is necessary. + length = a.length; + if (length !== b.length) return false; + // Deep compare the contents, ignoring non-numeric properties. + while (length--) { + if (!eq(a[length], b[length], aStack, bStack)) return false; + } + } else { + // Deep compare objects. + var _keys = keys(a), key; + length = _keys.length; + // Ensure that both objects contain the same number of properties before comparing deep equality. + if (keys(b).length !== length) return false; + while (length--) { + // Deep compare each member + key = _keys[length]; + if (!(has$1(b, key) && eq(a[key], b[key], aStack, bStack))) return false; + } + } + // Remove the first object from the stack of traversed objects. + aStack.pop(); + bStack.pop(); + return true; + } + + // Perform a deep comparison to check if two objects are equal. + function isEqual(a, b) { + return eq(a, b); + } + + // Retrieve all the enumerable property names of an object. + function allKeys(obj) { + if (!isObject(obj)) return []; + var keys = []; + for (var key in obj) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; + } + + // Since the regular `Object.prototype.toString` type tests don't work for + // some types in IE 11, we use a fingerprinting heuristic instead, based + // on the methods. It's not great, but it's the best we got. + // The fingerprint method lists are defined below. + function ie11fingerprint(methods) { + var length = getLength(methods); + return function(obj) { + if (obj == null) return false; + // `Map`, `WeakMap` and `Set` have no enumerable keys. + var keys = allKeys(obj); + if (getLength(keys)) return false; + for (var i = 0; i < length; i++) { + if (!isFunction$1(obj[methods[i]])) return false; + } + // If we are testing against `WeakMap`, we need to ensure that + // `obj` doesn't have a `forEach` method in order to distinguish + // it from a regular `Map`. + return methods !== weakMapMethods || !isFunction$1(obj[forEachName]); + }; + } + + // In the interest of compact minification, we write + // each string in the fingerprints only once. + var forEachName = 'forEach', + hasName = 'has', + commonInit = ['clear', 'delete'], + mapTail = ['get', hasName, 'set']; + + // `Map`, `WeakMap` and `Set` each have slightly different + // combinations of the above sublists. + var mapMethods = commonInit.concat(forEachName, mapTail), + weakMapMethods = commonInit.concat(mapTail), + setMethods = ['add'].concat(commonInit, forEachName, hasName); + + var isMap = isIE11 ? ie11fingerprint(mapMethods) : tagTester('Map'); + + var isWeakMap = isIE11 ? ie11fingerprint(weakMapMethods) : tagTester('WeakMap'); + + var isSet = isIE11 ? ie11fingerprint(setMethods) : tagTester('Set'); + + var isWeakSet = tagTester('WeakSet'); + + // Retrieve the values of an object's properties. + function values(obj) { + var _keys = keys(obj); + var length = _keys.length; + var values = Array(length); + for (var i = 0; i < length; i++) { + values[i] = obj[_keys[i]]; + } + return values; + } + + // Convert an object into a list of `[key, value]` pairs. + // The opposite of `_.object` with one argument. + function pairs(obj) { + var _keys = keys(obj); + var length = _keys.length; + var pairs = Array(length); + for (var i = 0; i < length; i++) { + pairs[i] = [_keys[i], obj[_keys[i]]]; + } + return pairs; + } + + // Invert the keys and values of an object. The values must be serializable. + function invert(obj) { + var result = {}; + var _keys = keys(obj); + for (var i = 0, length = _keys.length; i < length; i++) { + result[obj[_keys[i]]] = _keys[i]; + } + return result; + } + + // Return a sorted list of the function names available on the object. + function functions(obj) { + var names = []; + for (var key in obj) { + if (isFunction$1(obj[key])) names.push(key); + } + return names.sort(); + } + + // An internal function for creating assigner functions. + function createAssigner(keysFunc, defaults) { + return function(obj) { + var length = arguments.length; + if (defaults) obj = Object(obj); + if (length < 2 || obj == null) return obj; + for (var index = 1; index < length; index++) { + var source = arguments[index], + keys = keysFunc(source), + l = keys.length; + for (var i = 0; i < l; i++) { + var key = keys[i]; + if (!defaults || obj[key] === void 0) obj[key] = source[key]; + } + } + return obj; + }; + } + + // Extend a given object with all the properties in passed-in object(s). + var extend = createAssigner(allKeys); + + // Assigns a given object with all the own properties in the passed-in + // object(s). + // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) + var extendOwn = createAssigner(keys); + + // Fill in a given object with default properties. + var defaults = createAssigner(allKeys, true); + + // Create a naked function reference for surrogate-prototype-swapping. + function ctor() { + return function(){}; + } + + // An internal function for creating a new object that inherits from another. + function baseCreate(prototype) { + if (!isObject(prototype)) return {}; + if (nativeCreate) return nativeCreate(prototype); + var Ctor = ctor(); + Ctor.prototype = prototype; + var result = new Ctor; + Ctor.prototype = null; + return result; + } + + // Creates an object that inherits from the given prototype object. + // If additional properties are provided then they will be added to the + // created object. + function create(prototype, props) { + var result = baseCreate(prototype); + if (props) extendOwn(result, props); + return result; + } + + // Create a (shallow-cloned) duplicate of an object. + function clone(obj) { + if (!isObject(obj)) return obj; + return isArray(obj) ? obj.slice() : extend({}, obj); + } + + // Invokes `interceptor` with the `obj` and then returns `obj`. + // The primary purpose of this method is to "tap into" a method chain, in + // order to perform operations on intermediate results within the chain. + function tap(obj, interceptor) { + interceptor(obj); + return obj; + } + + // Normalize a (deep) property `path` to array. + // Like `_.iteratee`, this function can be customized. + function toPath$1(path) { + return isArray(path) ? path : [path]; + } + _$1.toPath = toPath$1; + + // Internal wrapper for `_.toPath` to enable minification. + // Similar to `cb` for `_.iteratee`. + function toPath(path) { + return _$1.toPath(path); + } + + // Internal function to obtain a nested property in `obj` along `path`. + function deepGet(obj, path) { + var length = path.length; + for (var i = 0; i < length; i++) { + if (obj == null) return void 0; + obj = obj[path[i]]; + } + return length ? obj : void 0; + } + + // Get the value of the (deep) property on `path` from `object`. + // If any property in `path` does not exist or if the value is + // `undefined`, return `defaultValue` instead. + // The `path` is normalized through `_.toPath`. + function get(object, path, defaultValue) { + var value = deepGet(object, toPath(path)); + return isUndefined(value) ? defaultValue : value; + } + + // Shortcut function for checking if an object has a given property directly on + // itself (in other words, not on a prototype). Unlike the internal `has` + // function, this public version can also traverse nested properties. + function has(obj, path) { + path = toPath(path); + var length = path.length; + for (var i = 0; i < length; i++) { + var key = path[i]; + if (!has$1(obj, key)) return false; + obj = obj[key]; + } + return !!length; + } + + // Keep the identity function around for default iteratees. + function identity(value) { + return value; + } + + // Returns a predicate for checking whether an object has a given set of + // `key:value` pairs. + function matcher(attrs) { + attrs = extendOwn({}, attrs); + return function(obj) { + return isMatch(obj, attrs); + }; + } + + // Creates a function that, when passed an object, will traverse that object’s + // properties down the given `path`, specified as an array of keys or indices. + function property(path) { + path = toPath(path); + return function(obj) { + return deepGet(obj, path); + }; + } + + // Internal function that returns an efficient (for current engines) version + // of the passed-in callback, to be repeatedly applied in other Underscore + // functions. + function optimizeCb(func, context, argCount) { + if (context === void 0) return func; + switch (argCount == null ? 3 : argCount) { + case 1: return function(value) { + return func.call(context, value); + }; + // The 2-argument case is omitted because we’re not using it. + case 3: return function(value, index, collection) { + return func.call(context, value, index, collection); + }; + case 4: return function(accumulator, value, index, collection) { + return func.call(context, accumulator, value, index, collection); + }; + } + return function() { + return func.apply(context, arguments); + }; + } + + // An internal function to generate callbacks that can be applied to each + // element in a collection, returning the desired result — either `_.identity`, + // an arbitrary callback, a property matcher, or a property accessor. + function baseIteratee(value, context, argCount) { + if (value == null) return identity; + if (isFunction$1(value)) return optimizeCb(value, context, argCount); + if (isObject(value) && !isArray(value)) return matcher(value); + return property(value); + } + + // External wrapper for our callback generator. Users may customize + // `_.iteratee` if they want additional predicate/iteratee shorthand styles. + // This abstraction hides the internal-only `argCount` argument. + function iteratee(value, context) { + return baseIteratee(value, context, Infinity); + } + _$1.iteratee = iteratee; + + // The function we call internally to generate a callback. It invokes + // `_.iteratee` if overridden, otherwise `baseIteratee`. + function cb(value, context, argCount) { + if (_$1.iteratee !== iteratee) return _$1.iteratee(value, context); + return baseIteratee(value, context, argCount); + } + + // Returns the results of applying the `iteratee` to each element of `obj`. + // In contrast to `_.map` it returns an object. + function mapObject(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var _keys = keys(obj), + length = _keys.length, + results = {}; + for (var index = 0; index < length; index++) { + var currentKey = _keys[index]; + results[currentKey] = iteratee(obj[currentKey], currentKey, obj); + } + return results; + } + + // Predicate-generating function. Often useful outside of Underscore. + function noop(){} + + // Generates a function for a given object that returns a given property. + function propertyOf(obj) { + if (obj == null) return noop; + return function(path) { + return get(obj, path); + }; + } + + // Run a function **n** times. + function times(n, iteratee, context) { + var accum = Array(Math.max(0, n)); + iteratee = optimizeCb(iteratee, context, 1); + for (var i = 0; i < n; i++) accum[i] = iteratee(i); + return accum; + } + + // Return a random integer between `min` and `max` (inclusive). + function random(min, max) { + if (max == null) { + max = min; + min = 0; + } + return min + Math.floor(Math.random() * (max - min + 1)); + } + + // A (possibly faster) way to get the current timestamp as an integer. + var now = Date.now || function() { + return new Date().getTime(); + }; + + // Internal helper to generate functions for escaping and unescaping strings + // to/from HTML interpolation. + function createEscaper(map) { + var escaper = function(match) { + return map[match]; + }; + // Regexes for identifying a key that needs to be escaped. + var source = '(?:' + keys(map).join('|') + ')'; + var testRegexp = RegExp(source); + var replaceRegexp = RegExp(source, 'g'); + return function(string) { + string = string == null ? '' : '' + string; + return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string; + }; + } + + // Internal list of HTML entities for escaping. + var escapeMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`' + }; + + // Function for escaping strings to HTML interpolation. + var _escape = createEscaper(escapeMap); + + // Internal list of HTML entities for unescaping. + var unescapeMap = invert(escapeMap); + + // Function for unescaping strings from HTML interpolation. + var _unescape = createEscaper(unescapeMap); + + // By default, Underscore uses ERB-style template delimiters. Change the + // following template settings to use alternative delimiters. + var templateSettings = _$1.templateSettings = { + evaluate: /<%([\s\S]+?)%>/g, + interpolate: /<%=([\s\S]+?)%>/g, + escape: /<%-([\s\S]+?)%>/g + }; + + // When customizing `_.templateSettings`, if you don't want to define an + // interpolation, evaluation or escaping regex, we need one that is + // guaranteed not to match. + var noMatch = /(.)^/; + + // Certain characters need to be escaped so that they can be put into a + // string literal. + var escapes = { + "'": "'", + '\\': '\\', + '\r': 'r', + '\n': 'n', + '\u2028': 'u2028', + '\u2029': 'u2029' + }; + + var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g; + + function escapeChar(match) { + return '\\' + escapes[match]; + } + + // In order to prevent third-party code injection through + // `_.templateSettings.variable`, we test it against the following regular + // expression. It is intentionally a bit more liberal than just matching valid + // identifiers, but still prevents possible loopholes through defaults or + // destructuring assignment. + var bareIdentifier = /^\s*(\w|\$)+\s*$/; + + // JavaScript micro-templating, similar to John Resig's implementation. + // Underscore templating handles arbitrary delimiters, preserves whitespace, + // and correctly escapes quotes within interpolated code. + // NB: `oldSettings` only exists for backwards compatibility. + function template(text, settings, oldSettings) { + if (!settings && oldSettings) settings = oldSettings; + settings = defaults({}, settings, _$1.templateSettings); + + // Combine delimiters into one regular expression via alternation. + var matcher = RegExp([ + (settings.escape || noMatch).source, + (settings.interpolate || noMatch).source, + (settings.evaluate || noMatch).source + ].join('|') + '|$', 'g'); + + // Compile the template source, escaping string literals appropriately. + var index = 0; + var source = "__p+='"; + text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { + source += text.slice(index, offset).replace(escapeRegExp, escapeChar); + index = offset + match.length; + + if (escape) { + source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; + } else if (interpolate) { + source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; + } else if (evaluate) { + source += "';\n" + evaluate + "\n__p+='"; + } + + // Adobe VMs need the match returned to produce the correct offset. + return match; + }); + source += "';\n"; + + var argument = settings.variable; + if (argument) { + // Insure against third-party code injection. (CVE-2021-23358) + if (!bareIdentifier.test(argument)) throw new Error( + 'variable is not a bare identifier: ' + argument + ); + } else { + // If a variable is not specified, place data values in local scope. + source = 'with(obj||{}){\n' + source + '}\n'; + argument = 'obj'; + } + + source = "var __t,__p='',__j=Array.prototype.join," + + "print=function(){__p+=__j.call(arguments,'');};\n" + + source + 'return __p;\n'; + + var render; + try { + render = new Function(argument, '_', source); + } catch (e) { + e.source = source; + throw e; + } + + var template = function(data) { + return render.call(this, data, _$1); + }; + + // Provide the compiled source as a convenience for precompilation. + template.source = 'function(' + argument + '){\n' + source + '}'; + + return template; + } + + // Traverses the children of `obj` along `path`. If a child is a function, it + // is invoked with its parent as context. Returns the value of the final + // child, or `fallback` if any child is undefined. + function result(obj, path, fallback) { + path = toPath(path); + var length = path.length; + if (!length) { + return isFunction$1(fallback) ? fallback.call(obj) : fallback; + } + for (var i = 0; i < length; i++) { + var prop = obj == null ? void 0 : obj[path[i]]; + if (prop === void 0) { + prop = fallback; + i = length; // Ensure we don't continue iterating. + } + obj = isFunction$1(prop) ? prop.call(obj) : prop; + } + return obj; + } + + // Generate a unique integer id (unique within the entire client session). + // Useful for temporary DOM ids. + var idCounter = 0; + function uniqueId(prefix) { + var id = ++idCounter + ''; + return prefix ? prefix + id : id; + } + + // Start chaining a wrapped Underscore object. + function chain(obj) { + var instance = _$1(obj); + instance._chain = true; + return instance; + } + + // Internal function to execute `sourceFunc` bound to `context` with optional + // `args`. Determines whether to execute a function as a constructor or as a + // normal function. + function executeBound(sourceFunc, boundFunc, context, callingContext, args) { + if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args); + var self = baseCreate(sourceFunc.prototype); + var result = sourceFunc.apply(self, args); + if (isObject(result)) return result; + return self; + } + + // Partially apply a function by creating a version that has had some of its + // arguments pre-filled, without changing its dynamic `this` context. `_` acts + // as a placeholder by default, allowing any combination of arguments to be + // pre-filled. Set `_.partial.placeholder` for a custom placeholder argument. + var partial = restArguments(function(func, boundArgs) { + var placeholder = partial.placeholder; + var bound = function() { + var position = 0, length = boundArgs.length; + var args = Array(length); + for (var i = 0; i < length; i++) { + args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i]; + } + while (position < arguments.length) args.push(arguments[position++]); + return executeBound(func, bound, this, this, args); + }; + return bound; + }); + + partial.placeholder = _$1; + + // Create a function bound to a given object (assigning `this`, and arguments, + // optionally). + var bind = restArguments(function(func, context, args) { + if (!isFunction$1(func)) throw new TypeError('Bind must be called on a function'); + var bound = restArguments(function(callArgs) { + return executeBound(func, bound, context, this, args.concat(callArgs)); + }); + return bound; + }); + + // Internal helper for collection methods to determine whether a collection + // should be iterated as an array or as an object. + // Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength + // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094 + var isArrayLike = createSizePropertyCheck(getLength); + + // Internal implementation of a recursive `flatten` function. + function flatten$1(input, depth, strict, output) { + output = output || []; + if (!depth && depth !== 0) { + depth = Infinity; + } else if (depth <= 0) { + return output.concat(input); + } + var idx = output.length; + for (var i = 0, length = getLength(input); i < length; i++) { + var value = input[i]; + if (isArrayLike(value) && (isArray(value) || isArguments$1(value))) { + // Flatten current level of array or arguments object. + if (depth > 1) { + flatten$1(value, depth - 1, strict, output); + idx = output.length; + } else { + var j = 0, len = value.length; + while (j < len) output[idx++] = value[j++]; + } + } else if (!strict) { + output[idx++] = value; + } + } + return output; + } + + // Bind a number of an object's methods to that object. Remaining arguments + // are the method names to be bound. Useful for ensuring that all callbacks + // defined on an object belong to it. + var bindAll = restArguments(function(obj, keys) { + keys = flatten$1(keys, false, false); + var index = keys.length; + if (index < 1) throw new Error('bindAll must be passed function names'); + while (index--) { + var key = keys[index]; + obj[key] = bind(obj[key], obj); + } + return obj; + }); + + // Memoize an expensive function by storing its results. + function memoize(func, hasher) { + var memoize = function(key) { + var cache = memoize.cache; + var address = '' + (hasher ? hasher.apply(this, arguments) : key); + if (!has$1(cache, address)) cache[address] = func.apply(this, arguments); + return cache[address]; + }; + memoize.cache = {}; + return memoize; + } + + // Delays a function for the given number of milliseconds, and then calls + // it with the arguments supplied. + var delay = restArguments(function(func, wait, args) { + return setTimeout(function() { + return func.apply(null, args); + }, wait); + }); + + // Defers a function, scheduling it to run after the current call stack has + // cleared. + var defer = partial(delay, _$1, 1); + + // Returns a function, that, when invoked, will only be triggered at most once + // during a given window of time. Normally, the throttled function will run + // as much as it can, without ever going more than once per `wait` duration; + // but if you'd like to disable the execution on the leading edge, pass + // `{leading: false}`. To disable execution on the trailing edge, ditto. + function throttle(func, wait, options) { + var timeout, context, args, result; + var previous = 0; + if (!options) options = {}; + + var later = function() { + previous = options.leading === false ? 0 : now(); + timeout = null; + result = func.apply(context, args); + if (!timeout) context = args = null; + }; + + var throttled = function() { + var _now = now(); + if (!previous && options.leading === false) previous = _now; + var remaining = wait - (_now - previous); + context = this; + args = arguments; + if (remaining <= 0 || remaining > wait) { + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + previous = _now; + result = func.apply(context, args); + if (!timeout) context = args = null; + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining); + } + return result; + }; + + throttled.cancel = function() { + clearTimeout(timeout); + previous = 0; + timeout = context = args = null; + }; + + return throttled; + } + + // When a sequence of calls of the returned function ends, the argument + // function is triggered. The end of a sequence is defined by the `wait` + // parameter. If `immediate` is passed, the argument function will be + // triggered at the beginning of the sequence instead of at the end. + function debounce(func, wait, immediate) { + var timeout, previous, args, result, context; + + var later = function() { + var passed = now() - previous; + if (wait > passed) { + timeout = setTimeout(later, wait - passed); + } else { + timeout = null; + if (!immediate) result = func.apply(context, args); + // This check is needed because `func` can recursively invoke `debounced`. + if (!timeout) args = context = null; + } + }; + + var debounced = restArguments(function(_args) { + context = this; + args = _args; + previous = now(); + if (!timeout) { + timeout = setTimeout(later, wait); + if (immediate) result = func.apply(context, args); + } + return result; + }); + + debounced.cancel = function() { + clearTimeout(timeout); + timeout = args = context = null; + }; + + return debounced; + } + + // Returns the first function passed as an argument to the second, + // allowing you to adjust arguments, run code before and after, and + // conditionally execute the original function. + function wrap(func, wrapper) { + return partial(wrapper, func); + } + + // Returns a negated version of the passed-in predicate. + function negate(predicate) { + return function() { + return !predicate.apply(this, arguments); + }; + } + + // Returns a function that is the composition of a list of functions, each + // consuming the return value of the function that follows. + function compose() { + var args = arguments; + var start = args.length - 1; + return function() { + var i = start; + var result = args[start].apply(this, arguments); + while (i--) result = args[i].call(this, result); + return result; + }; + } + + // Returns a function that will only be executed on and after the Nth call. + function after(times, func) { + return function() { + if (--times < 1) { + return func.apply(this, arguments); + } + }; + } + + // Returns a function that will only be executed up to (but not including) the + // Nth call. + function before(times, func) { + var memo; + return function() { + if (--times > 0) { + memo = func.apply(this, arguments); + } + if (times <= 1) func = null; + return memo; + }; + } + + // Returns a function that will be executed at most one time, no matter how + // often you call it. Useful for lazy initialization. + var once = partial(before, 2); + + // Returns the first key on an object that passes a truth test. + function findKey(obj, predicate, context) { + predicate = cb(predicate, context); + var _keys = keys(obj), key; + for (var i = 0, length = _keys.length; i < length; i++) { + key = _keys[i]; + if (predicate(obj[key], key, obj)) return key; + } + } + + // Internal function to generate `_.findIndex` and `_.findLastIndex`. + function createPredicateIndexFinder(dir) { + return function(array, predicate, context) { + predicate = cb(predicate, context); + var length = getLength(array); + var index = dir > 0 ? 0 : length - 1; + for (; index >= 0 && index < length; index += dir) { + if (predicate(array[index], index, array)) return index; + } + return -1; + }; + } + + // Returns the first index on an array-like that passes a truth test. + var findIndex = createPredicateIndexFinder(1); + + // Returns the last index on an array-like that passes a truth test. + var findLastIndex = createPredicateIndexFinder(-1); + + // Use a comparator function to figure out the smallest index at which + // an object should be inserted so as to maintain order. Uses binary search. + function sortedIndex(array, obj, iteratee, context) { + iteratee = cb(iteratee, context, 1); + var value = iteratee(obj); + var low = 0, high = getLength(array); + while (low < high) { + var mid = Math.floor((low + high) / 2); + if (iteratee(array[mid]) < value) low = mid + 1; else high = mid; + } + return low; + } + + // Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions. + function createIndexFinder(dir, predicateFind, sortedIndex) { + return function(array, item, idx) { + var i = 0, length = getLength(array); + if (typeof idx == 'number') { + if (dir > 0) { + i = idx >= 0 ? idx : Math.max(idx + length, i); + } else { + length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1; + } + } else if (sortedIndex && idx && length) { + idx = sortedIndex(array, item); + return array[idx] === item ? idx : -1; + } + if (item !== item) { + idx = predicateFind(slice.call(array, i, length), isNaN$1); + return idx >= 0 ? idx + i : -1; + } + for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) { + if (array[idx] === item) return idx; + } + return -1; + }; + } + + // Return the position of the first occurrence of an item in an array, + // or -1 if the item is not included in the array. + // If the array is large and already in sort order, pass `true` + // for **isSorted** to use binary search. + var indexOf = createIndexFinder(1, findIndex, sortedIndex); + + // Return the position of the last occurrence of an item in an array, + // or -1 if the item is not included in the array. + var lastIndexOf = createIndexFinder(-1, findLastIndex); + + // Return the first value which passes a truth test. + function find(obj, predicate, context) { + var keyFinder = isArrayLike(obj) ? findIndex : findKey; + var key = keyFinder(obj, predicate, context); + if (key !== void 0 && key !== -1) return obj[key]; + } + + // Convenience version of a common use case of `_.find`: getting the first + // object containing specific `key:value` pairs. + function findWhere(obj, attrs) { + return find(obj, matcher(attrs)); + } + + // The cornerstone for collection functions, an `each` + // implementation, aka `forEach`. + // Handles raw objects in addition to array-likes. Treats all + // sparse array-likes as if they were dense. + function each(obj, iteratee, context) { + iteratee = optimizeCb(iteratee, context); + var i, length; + if (isArrayLike(obj)) { + for (i = 0, length = obj.length; i < length; i++) { + iteratee(obj[i], i, obj); + } + } else { + var _keys = keys(obj); + for (i = 0, length = _keys.length; i < length; i++) { + iteratee(obj[_keys[i]], _keys[i], obj); + } + } + return obj; + } + + // Return the results of applying the iteratee to each element. + function map(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length, + results = Array(length); + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + results[index] = iteratee(obj[currentKey], currentKey, obj); + } + return results; + } + + // Internal helper to create a reducing function, iterating left or right. + function createReduce(dir) { + // Wrap code that reassigns argument variables in a separate function than + // the one that accesses `arguments.length` to avoid a perf hit. (#1991) + var reducer = function(obj, iteratee, memo, initial) { + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length, + index = dir > 0 ? 0 : length - 1; + if (!initial) { + memo = obj[_keys ? _keys[index] : index]; + index += dir; + } + for (; index >= 0 && index < length; index += dir) { + var currentKey = _keys ? _keys[index] : index; + memo = iteratee(memo, obj[currentKey], currentKey, obj); + } + return memo; + }; + + return function(obj, iteratee, memo, context) { + var initial = arguments.length >= 3; + return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial); + }; + } + + // **Reduce** builds up a single result from a list of values, aka `inject`, + // or `foldl`. + var reduce = createReduce(1); + + // The right-associative version of reduce, also known as `foldr`. + var reduceRight = createReduce(-1); + + // Return all the elements that pass a truth test. + function filter(obj, predicate, context) { + var results = []; + predicate = cb(predicate, context); + each(obj, function(value, index, list) { + if (predicate(value, index, list)) results.push(value); + }); + return results; + } + + // Return all the elements for which a truth test fails. + function reject(obj, predicate, context) { + return filter(obj, negate(cb(predicate)), context); + } + + // Determine whether all of the elements pass a truth test. + function every(obj, predicate, context) { + predicate = cb(predicate, context); + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + if (!predicate(obj[currentKey], currentKey, obj)) return false; + } + return true; + } + + // Determine if at least one element in the object passes a truth test. + function some(obj, predicate, context) { + predicate = cb(predicate, context); + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + if (predicate(obj[currentKey], currentKey, obj)) return true; + } + return false; + } + + // Determine if the array or object contains a given item (using `===`). + function contains(obj, item, fromIndex, guard) { + if (!isArrayLike(obj)) obj = values(obj); + if (typeof fromIndex != 'number' || guard) fromIndex = 0; + return indexOf(obj, item, fromIndex) >= 0; + } + + // Invoke a method (with arguments) on every item in a collection. + var invoke = restArguments(function(obj, path, args) { + var contextPath, func; + if (isFunction$1(path)) { + func = path; + } else { + path = toPath(path); + contextPath = path.slice(0, -1); + path = path[path.length - 1]; + } + return map(obj, function(context) { + var method = func; + if (!method) { + if (contextPath && contextPath.length) { + context = deepGet(context, contextPath); + } + if (context == null) return void 0; + method = context[path]; + } + return method == null ? method : method.apply(context, args); + }); + }); + + // Convenience version of a common use case of `_.map`: fetching a property. + function pluck(obj, key) { + return map(obj, property(key)); + } + + // Convenience version of a common use case of `_.filter`: selecting only + // objects containing specific `key:value` pairs. + function where(obj, attrs) { + return filter(obj, matcher(attrs)); + } + + // Return the maximum element (or element-based computation). + function max(obj, iteratee, context) { + var result = -Infinity, lastComputed = -Infinity, + value, computed; + if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) { + obj = isArrayLike(obj) ? obj : values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value > result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed > lastComputed || computed === -Infinity && result === -Infinity) { + result = v; + lastComputed = computed; + } + }); + } + return result; + } + + // Return the minimum element (or element-based computation). + function min(obj, iteratee, context) { + var result = Infinity, lastComputed = Infinity, + value, computed; + if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) { + obj = isArrayLike(obj) ? obj : values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value < result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed < lastComputed || computed === Infinity && result === Infinity) { + result = v; + lastComputed = computed; + } + }); + } + return result; + } + + // Sample **n** random values from a collection using the modern version of the + // [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle). + // If **n** is not specified, returns a single random element. + // The internal `guard` argument allows it to work with `_.map`. + function sample(obj, n, guard) { + if (n == null || guard) { + if (!isArrayLike(obj)) obj = values(obj); + return obj[random(obj.length - 1)]; + } + var sample = isArrayLike(obj) ? clone(obj) : values(obj); + var length = getLength(sample); + n = Math.max(Math.min(n, length), 0); + var last = length - 1; + for (var index = 0; index < n; index++) { + var rand = random(index, last); + var temp = sample[index]; + sample[index] = sample[rand]; + sample[rand] = temp; + } + return sample.slice(0, n); + } + + // Shuffle a collection. + function shuffle(obj) { + return sample(obj, Infinity); + } + + // Sort the object's values by a criterion produced by an iteratee. + function sortBy(obj, iteratee, context) { + var index = 0; + iteratee = cb(iteratee, context); + return pluck(map(obj, function(value, key, list) { + return { + value: value, + index: index++, + criteria: iteratee(value, key, list) + }; + }).sort(function(left, right) { + var a = left.criteria; + var b = right.criteria; + if (a !== b) { + if (a > b || a === void 0) return 1; + if (a < b || b === void 0) return -1; + } + return left.index - right.index; + }), 'value'); + } + + // An internal function used for aggregate "group by" operations. + function group(behavior, partition) { + return function(obj, iteratee, context) { + var result = partition ? [[], []] : {}; + iteratee = cb(iteratee, context); + each(obj, function(value, index) { + var key = iteratee(value, index, obj); + behavior(result, value, key); + }); + return result; + }; + } + + // Groups the object's values by a criterion. Pass either a string attribute + // to group by, or a function that returns the criterion. + var groupBy = group(function(result, value, key) { + if (has$1(result, key)) result[key].push(value); else result[key] = [value]; + }); + + // Indexes the object's values by a criterion, similar to `_.groupBy`, but for + // when you know that your index values will be unique. + var indexBy = group(function(result, value, key) { + result[key] = value; + }); + + // Counts instances of an object that group by a certain criterion. Pass + // either a string attribute to count by, or a function that returns the + // criterion. + var countBy = group(function(result, value, key) { + if (has$1(result, key)) result[key]++; else result[key] = 1; + }); + + // Split a collection into two arrays: one whose elements all pass the given + // truth test, and one whose elements all do not pass the truth test. + var partition = group(function(result, value, pass) { + result[pass ? 0 : 1].push(value); + }, true); + + // Safely create a real, live array from anything iterable. + var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g; + function toArray(obj) { + if (!obj) return []; + if (isArray(obj)) return slice.call(obj); + if (isString(obj)) { + // Keep surrogate pair characters together. + return obj.match(reStrSymbol); + } + if (isArrayLike(obj)) return map(obj, identity); + return values(obj); + } + + // Return the number of elements in a collection. + function size(obj) { + if (obj == null) return 0; + return isArrayLike(obj) ? obj.length : keys(obj).length; + } + + // Internal `_.pick` helper function to determine whether `key` is an enumerable + // property name of `obj`. + function keyInObj(value, key, obj) { + return key in obj; + } + + // Return a copy of the object only containing the allowed properties. + var pick = restArguments(function(obj, keys) { + var result = {}, iteratee = keys[0]; + if (obj == null) return result; + if (isFunction$1(iteratee)) { + if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]); + keys = allKeys(obj); + } else { + iteratee = keyInObj; + keys = flatten$1(keys, false, false); + obj = Object(obj); + } + for (var i = 0, length = keys.length; i < length; i++) { + var key = keys[i]; + var value = obj[key]; + if (iteratee(value, key, obj)) result[key] = value; + } + return result; + }); + + // Return a copy of the object without the disallowed properties. + var omit = restArguments(function(obj, keys) { + var iteratee = keys[0], context; + if (isFunction$1(iteratee)) { + iteratee = negate(iteratee); + if (keys.length > 1) context = keys[1]; + } else { + keys = map(flatten$1(keys, false, false), String); + iteratee = function(value, key) { + return !contains(keys, key); + }; + } + return pick(obj, iteratee, context); + }); + + // Returns everything but the last entry of the array. Especially useful on + // the arguments object. Passing **n** will return all the values in + // the array, excluding the last N. + function initial(array, n, guard) { + return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n))); + } + + // Get the first element of an array. Passing **n** will return the first N + // values in the array. The **guard** check allows it to work with `_.map`. + function first(array, n, guard) { + if (array == null || array.length < 1) return n == null || guard ? void 0 : []; + if (n == null || guard) return array[0]; + return initial(array, array.length - n); + } + + // Returns everything but the first entry of the `array`. Especially useful on + // the `arguments` object. Passing an **n** will return the rest N values in the + // `array`. + function rest(array, n, guard) { + return slice.call(array, n == null || guard ? 1 : n); + } + + // Get the last element of an array. Passing **n** will return the last N + // values in the array. + function last(array, n, guard) { + if (array == null || array.length < 1) return n == null || guard ? void 0 : []; + if (n == null || guard) return array[array.length - 1]; + return rest(array, Math.max(0, array.length - n)); + } + + // Trim out all falsy values from an array. + function compact(array) { + return filter(array, Boolean); + } + + // Flatten out an array, either recursively (by default), or up to `depth`. + // Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively. + function flatten(array, depth) { + return flatten$1(array, depth, false); + } + + // Take the difference between one array and a number of other arrays. + // Only the elements present in just the first array will remain. + var difference = restArguments(function(array, rest) { + rest = flatten$1(rest, true, true); + return filter(array, function(value){ + return !contains(rest, value); + }); + }); + + // Return a version of the array that does not contain the specified value(s). + var without = restArguments(function(array, otherArrays) { + return difference(array, otherArrays); + }); + + // Produce a duplicate-free version of the array. If the array has already + // been sorted, you have the option of using a faster algorithm. + // The faster algorithm will not work with an iteratee if the iteratee + // is not a one-to-one function, so providing an iteratee will disable + // the faster algorithm. + function uniq(array, isSorted, iteratee, context) { + if (!isBoolean(isSorted)) { + context = iteratee; + iteratee = isSorted; + isSorted = false; + } + if (iteratee != null) iteratee = cb(iteratee, context); + var result = []; + var seen = []; + for (var i = 0, length = getLength(array); i < length; i++) { + var value = array[i], + computed = iteratee ? iteratee(value, i, array) : value; + if (isSorted && !iteratee) { + if (!i || seen !== computed) result.push(value); + seen = computed; + } else if (iteratee) { + if (!contains(seen, computed)) { + seen.push(computed); + result.push(value); + } + } else if (!contains(result, value)) { + result.push(value); + } + } + return result; + } + + // Produce an array that contains the union: each distinct element from all of + // the passed-in arrays. + var union = restArguments(function(arrays) { + return uniq(flatten$1(arrays, true, true)); + }); + + // Produce an array that contains every item shared between all the + // passed-in arrays. + function intersection(array) { + var result = []; + var argsLength = arguments.length; + for (var i = 0, length = getLength(array); i < length; i++) { + var item = array[i]; + if (contains(result, item)) continue; + var j; + for (j = 1; j < argsLength; j++) { + if (!contains(arguments[j], item)) break; + } + if (j === argsLength) result.push(item); + } + return result; + } + + // Complement of zip. Unzip accepts an array of arrays and groups + // each array's elements on shared indices. + function unzip(array) { + var length = array && max(array, getLength).length || 0; + var result = Array(length); + + for (var index = 0; index < length; index++) { + result[index] = pluck(array, index); + } + return result; + } + + // Zip together multiple lists into a single array -- elements that share + // an index go together. + var zip = restArguments(unzip); + + // Converts lists into objects. Pass either a single array of `[key, value]` + // pairs, or two parallel arrays of the same length -- one of keys, and one of + // the corresponding values. Passing by pairs is the reverse of `_.pairs`. + function object(list, values) { + var result = {}; + for (var i = 0, length = getLength(list); i < length; i++) { + if (values) { + result[list[i]] = values[i]; + } else { + result[list[i][0]] = list[i][1]; + } + } + return result; + } + + // Generate an integer Array containing an arithmetic progression. A port of + // the native Python `range()` function. See + // [the Python documentation](https://docs.python.org/library/functions.html#range). + function range(start, stop, step) { + if (stop == null) { + stop = start || 0; + start = 0; + } + if (!step) { + step = stop < start ? -1 : 1; + } + + var length = Math.max(Math.ceil((stop - start) / step), 0); + var range = Array(length); + + for (var idx = 0; idx < length; idx++, start += step) { + range[idx] = start; + } + + return range; + } + + // Chunk a single array into multiple arrays, each containing `count` or fewer + // items. + function chunk(array, count) { + if (count == null || count < 1) return []; + var result = []; + var i = 0, length = array.length; + while (i < length) { + result.push(slice.call(array, i, i += count)); + } + return result; + } + + // Helper function to continue chaining intermediate results. + function chainResult(instance, obj) { + return instance._chain ? _$1(obj).chain() : obj; + } + + // Add your own custom functions to the Underscore object. + function mixin(obj) { + each(functions(obj), function(name) { + var func = _$1[name] = obj[name]; + _$1.prototype[name] = function() { + var args = [this._wrapped]; + push.apply(args, arguments); + return chainResult(this, func.apply(_$1, args)); + }; + }); + return _$1; + } + + // Add all mutator `Array` functions to the wrapper. + each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { + var method = ArrayProto[name]; + _$1.prototype[name] = function() { + var obj = this._wrapped; + if (obj != null) { + method.apply(obj, arguments); + if ((name === 'shift' || name === 'splice') && obj.length === 0) { + delete obj[0]; + } + } + return chainResult(this, obj); + }; + }); + + // Add all accessor `Array` functions to the wrapper. + each(['concat', 'join', 'slice'], function(name) { + var method = ArrayProto[name]; + _$1.prototype[name] = function() { + var obj = this._wrapped; + if (obj != null) obj = method.apply(obj, arguments); + return chainResult(this, obj); + }; + }); + + // Named Exports + + var allExports = { + __proto__: null, + VERSION: VERSION, + restArguments: restArguments, + isObject: isObject, + isNull: isNull, + isUndefined: isUndefined, + isBoolean: isBoolean, + isElement: isElement, + isString: isString, + isNumber: isNumber, + isDate: isDate, + isRegExp: isRegExp, + isError: isError, + isSymbol: isSymbol, + isArrayBuffer: isArrayBuffer, + isDataView: isDataView$1, + isArray: isArray, + isFunction: isFunction$1, + isArguments: isArguments$1, + isFinite: isFinite$1, + isNaN: isNaN$1, + isTypedArray: isTypedArray$1, + isEmpty: isEmpty, + isMatch: isMatch, + isEqual: isEqual, + isMap: isMap, + isWeakMap: isWeakMap, + isSet: isSet, + isWeakSet: isWeakSet, + keys: keys, + allKeys: allKeys, + values: values, + pairs: pairs, + invert: invert, + functions: functions, + methods: functions, + extend: extend, + extendOwn: extendOwn, + assign: extendOwn, + defaults: defaults, + create: create, + clone: clone, + tap: tap, + get: get, + has: has, + mapObject: mapObject, + identity: identity, + constant: constant, + noop: noop, + toPath: toPath$1, + property: property, + propertyOf: propertyOf, + matcher: matcher, + matches: matcher, + times: times, + random: random, + now: now, + escape: _escape, + unescape: _unescape, + templateSettings: templateSettings, + template: template, + result: result, + uniqueId: uniqueId, + chain: chain, + iteratee: iteratee, + partial: partial, + bind: bind, + bindAll: bindAll, + memoize: memoize, + delay: delay, + defer: defer, + throttle: throttle, + debounce: debounce, + wrap: wrap, + negate: negate, + compose: compose, + after: after, + before: before, + once: once, + findKey: findKey, + findIndex: findIndex, + findLastIndex: findLastIndex, + sortedIndex: sortedIndex, + indexOf: indexOf, + lastIndexOf: lastIndexOf, + find: find, + detect: find, + findWhere: findWhere, + each: each, + forEach: each, + map: map, + collect: map, + reduce: reduce, + foldl: reduce, + inject: reduce, + reduceRight: reduceRight, + foldr: reduceRight, + filter: filter, + select: filter, + reject: reject, + every: every, + all: every, + some: some, + any: some, + contains: contains, + includes: contains, + include: contains, + invoke: invoke, + pluck: pluck, + where: where, + max: max, + min: min, + shuffle: shuffle, + sample: sample, + sortBy: sortBy, + groupBy: groupBy, + indexBy: indexBy, + countBy: countBy, + partition: partition, + toArray: toArray, + size: size, + pick: pick, + omit: omit, + first: first, + head: first, + take: first, + initial: initial, + last: last, + rest: rest, + tail: rest, + drop: rest, + compact: compact, + flatten: flatten, + without: without, + uniq: uniq, + unique: uniq, + union: union, + intersection: intersection, + difference: difference, + unzip: unzip, + transpose: unzip, + zip: zip, + object: object, + range: range, + chunk: chunk, + mixin: mixin, + 'default': _$1 + }; + + // Default Export + + // Add all of the Underscore functions to the wrapper object. + var _ = mixin(allExports); + // Legacy Node.js API. + _._ = _; + + return _; + +}))); +//# sourceMappingURL=underscore-umd.js.map diff --git a/docs/_static/underscore-1.3.1.js b/docs/_static/underscore-1.3.1.js deleted file mode 100644 index 208d4cd..0000000 --- a/docs/_static/underscore-1.3.1.js +++ /dev/null @@ -1,999 +0,0 @@ -// Underscore.js 1.3.1 -// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc. -// Underscore is freely distributable under the MIT license. -// Portions of Underscore are inspired or borrowed from Prototype, -// Oliver Steele's Functional, and John Resig's Micro-Templating. -// For all details and documentation: -// http://documentcloud.github.com/underscore - -(function() { - - // Baseline setup - // -------------- - - // Establish the root object, `window` in the browser, or `global` on the server. - var root = this; - - // Save the previous value of the `_` variable. - var previousUnderscore = root._; - - // Establish the object that gets returned to break out of a loop iteration. - var breaker = {}; - - // Save bytes in the minified (but not gzipped) version: - var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype; - - // Create quick reference variables for speed access to core prototypes. - var slice = ArrayProto.slice, - unshift = ArrayProto.unshift, - toString = ObjProto.toString, - hasOwnProperty = ObjProto.hasOwnProperty; - - // All **ECMAScript 5** native function implementations that we hope to use - // are declared here. - var - nativeForEach = ArrayProto.forEach, - nativeMap = ArrayProto.map, - nativeReduce = ArrayProto.reduce, - nativeReduceRight = ArrayProto.reduceRight, - nativeFilter = ArrayProto.filter, - nativeEvery = ArrayProto.every, - nativeSome = ArrayProto.some, - nativeIndexOf = ArrayProto.indexOf, - nativeLastIndexOf = ArrayProto.lastIndexOf, - nativeIsArray = Array.isArray, - nativeKeys = Object.keys, - nativeBind = FuncProto.bind; - - // Create a safe reference to the Underscore object for use below. - var _ = function(obj) { return new wrapper(obj); }; - - // Export the Underscore object for **Node.js**, with - // backwards-compatibility for the old `require()` API. If we're in - // the browser, add `_` as a global object via a string identifier, - // for Closure Compiler "advanced" mode. - if (typeof exports !== 'undefined') { - if (typeof module !== 'undefined' && module.exports) { - exports = module.exports = _; - } - exports._ = _; - } else { - root['_'] = _; - } - - // Current version. - _.VERSION = '1.3.1'; - - // Collection Functions - // -------------------- - - // The cornerstone, an `each` implementation, aka `forEach`. - // Handles objects with the built-in `forEach`, arrays, and raw objects. - // Delegates to **ECMAScript 5**'s native `forEach` if available. - var each = _.each = _.forEach = function(obj, iterator, context) { - if (obj == null) return; - if (nativeForEach && obj.forEach === nativeForEach) { - obj.forEach(iterator, context); - } else if (obj.length === +obj.length) { - for (var i = 0, l = obj.length; i < l; i++) { - if (i in obj && iterator.call(context, obj[i], i, obj) === breaker) return; - } - } else { - for (var key in obj) { - if (_.has(obj, key)) { - if (iterator.call(context, obj[key], key, obj) === breaker) return; - } - } - } - }; - - // Return the results of applying the iterator to each element. - // Delegates to **ECMAScript 5**'s native `map` if available. - _.map = _.collect = function(obj, iterator, context) { - var results = []; - if (obj == null) return results; - if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context); - each(obj, function(value, index, list) { - results[results.length] = iterator.call(context, value, index, list); - }); - if (obj.length === +obj.length) results.length = obj.length; - return results; - }; - - // **Reduce** builds up a single result from a list of values, aka `inject`, - // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available. - _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) { - var initial = arguments.length > 2; - if (obj == null) obj = []; - if (nativeReduce && obj.reduce === nativeReduce) { - if (context) iterator = _.bind(iterator, context); - return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator); - } - each(obj, function(value, index, list) { - if (!initial) { - memo = value; - initial = true; - } else { - memo = iterator.call(context, memo, value, index, list); - } - }); - if (!initial) throw new TypeError('Reduce of empty array with no initial value'); - return memo; - }; - - // The right-associative version of reduce, also known as `foldr`. - // Delegates to **ECMAScript 5**'s native `reduceRight` if available. - _.reduceRight = _.foldr = function(obj, iterator, memo, context) { - var initial = arguments.length > 2; - if (obj == null) obj = []; - if (nativeReduceRight && obj.reduceRight === nativeReduceRight) { - if (context) iterator = _.bind(iterator, context); - return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator); - } - var reversed = _.toArray(obj).reverse(); - if (context && !initial) iterator = _.bind(iterator, context); - return initial ? _.reduce(reversed, iterator, memo, context) : _.reduce(reversed, iterator); - }; - - // Return the first value which passes a truth test. Aliased as `detect`. - _.find = _.detect = function(obj, iterator, context) { - var result; - any(obj, function(value, index, list) { - if (iterator.call(context, value, index, list)) { - result = value; - return true; - } - }); - return result; - }; - - // Return all the elements that pass a truth test. - // Delegates to **ECMAScript 5**'s native `filter` if available. - // Aliased as `select`. - _.filter = _.select = function(obj, iterator, context) { - var results = []; - if (obj == null) return results; - if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context); - each(obj, function(value, index, list) { - if (iterator.call(context, value, index, list)) results[results.length] = value; - }); - return results; - }; - - // Return all the elements for which a truth test fails. - _.reject = function(obj, iterator, context) { - var results = []; - if (obj == null) return results; - each(obj, function(value, index, list) { - if (!iterator.call(context, value, index, list)) results[results.length] = value; - }); - return results; - }; - - // Determine whether all of the elements match a truth test. - // Delegates to **ECMAScript 5**'s native `every` if available. - // Aliased as `all`. - _.every = _.all = function(obj, iterator, context) { - var result = true; - if (obj == null) return result; - if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context); - each(obj, function(value, index, list) { - if (!(result = result && iterator.call(context, value, index, list))) return breaker; - }); - return result; - }; - - // Determine if at least one element in the object matches a truth test. - // Delegates to **ECMAScript 5**'s native `some` if available. - // Aliased as `any`. - var any = _.some = _.any = function(obj, iterator, context) { - iterator || (iterator = _.identity); - var result = false; - if (obj == null) return result; - if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context); - each(obj, function(value, index, list) { - if (result || (result = iterator.call(context, value, index, list))) return breaker; - }); - return !!result; - }; - - // Determine if a given value is included in the array or object using `===`. - // Aliased as `contains`. - _.include = _.contains = function(obj, target) { - var found = false; - if (obj == null) return found; - if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1; - found = any(obj, function(value) { - return value === target; - }); - return found; - }; - - // Invoke a method (with arguments) on every item in a collection. - _.invoke = function(obj, method) { - var args = slice.call(arguments, 2); - return _.map(obj, function(value) { - return (_.isFunction(method) ? method || value : value[method]).apply(value, args); - }); - }; - - // Convenience version of a common use case of `map`: fetching a property. - _.pluck = function(obj, key) { - return _.map(obj, function(value){ return value[key]; }); - }; - - // Return the maximum element or (element-based computation). - _.max = function(obj, iterator, context) { - if (!iterator && _.isArray(obj)) return Math.max.apply(Math, obj); - if (!iterator && _.isEmpty(obj)) return -Infinity; - var result = {computed : -Infinity}; - each(obj, function(value, index, list) { - var computed = iterator ? iterator.call(context, value, index, list) : value; - computed >= result.computed && (result = {value : value, computed : computed}); - }); - return result.value; - }; - - // Return the minimum element (or element-based computation). - _.min = function(obj, iterator, context) { - if (!iterator && _.isArray(obj)) return Math.min.apply(Math, obj); - if (!iterator && _.isEmpty(obj)) return Infinity; - var result = {computed : Infinity}; - each(obj, function(value, index, list) { - var computed = iterator ? iterator.call(context, value, index, list) : value; - computed < result.computed && (result = {value : value, computed : computed}); - }); - return result.value; - }; - - // Shuffle an array. - _.shuffle = function(obj) { - var shuffled = [], rand; - each(obj, function(value, index, list) { - if (index == 0) { - shuffled[0] = value; - } else { - rand = Math.floor(Math.random() * (index + 1)); - shuffled[index] = shuffled[rand]; - shuffled[rand] = value; - } - }); - return shuffled; - }; - - // Sort the object's values by a criterion produced by an iterator. - _.sortBy = function(obj, iterator, context) { - return _.pluck(_.map(obj, function(value, index, list) { - return { - value : value, - criteria : iterator.call(context, value, index, list) - }; - }).sort(function(left, right) { - var a = left.criteria, b = right.criteria; - return a < b ? -1 : a > b ? 1 : 0; - }), 'value'); - }; - - // Groups the object's values by a criterion. Pass either a string attribute - // to group by, or a function that returns the criterion. - _.groupBy = function(obj, val) { - var result = {}; - var iterator = _.isFunction(val) ? val : function(obj) { return obj[val]; }; - each(obj, function(value, index) { - var key = iterator(value, index); - (result[key] || (result[key] = [])).push(value); - }); - return result; - }; - - // Use a comparator function to figure out at what index an object should - // be inserted so as to maintain order. Uses binary search. - _.sortedIndex = function(array, obj, iterator) { - iterator || (iterator = _.identity); - var low = 0, high = array.length; - while (low < high) { - var mid = (low + high) >> 1; - iterator(array[mid]) < iterator(obj) ? low = mid + 1 : high = mid; - } - return low; - }; - - // Safely convert anything iterable into a real, live array. - _.toArray = function(iterable) { - if (!iterable) return []; - if (iterable.toArray) return iterable.toArray(); - if (_.isArray(iterable)) return slice.call(iterable); - if (_.isArguments(iterable)) return slice.call(iterable); - return _.values(iterable); - }; - - // Return the number of elements in an object. - _.size = function(obj) { - return _.toArray(obj).length; - }; - - // Array Functions - // --------------- - - // Get the first element of an array. Passing **n** will return the first N - // values in the array. Aliased as `head`. The **guard** check allows it to work - // with `_.map`. - _.first = _.head = function(array, n, guard) { - return (n != null) && !guard ? slice.call(array, 0, n) : array[0]; - }; - - // Returns everything but the last entry of the array. Especcialy useful on - // the arguments object. Passing **n** will return all the values in - // the array, excluding the last N. The **guard** check allows it to work with - // `_.map`. - _.initial = function(array, n, guard) { - return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n)); - }; - - // Get the last element of an array. Passing **n** will return the last N - // values in the array. The **guard** check allows it to work with `_.map`. - _.last = function(array, n, guard) { - if ((n != null) && !guard) { - return slice.call(array, Math.max(array.length - n, 0)); - } else { - return array[array.length - 1]; - } - }; - - // Returns everything but the first entry of the array. Aliased as `tail`. - // Especially useful on the arguments object. Passing an **index** will return - // the rest of the values in the array from that index onward. The **guard** - // check allows it to work with `_.map`. - _.rest = _.tail = function(array, index, guard) { - return slice.call(array, (index == null) || guard ? 1 : index); - }; - - // Trim out all falsy values from an array. - _.compact = function(array) { - return _.filter(array, function(value){ return !!value; }); - }; - - // Return a completely flattened version of an array. - _.flatten = function(array, shallow) { - return _.reduce(array, function(memo, value) { - if (_.isArray(value)) return memo.concat(shallow ? value : _.flatten(value)); - memo[memo.length] = value; - return memo; - }, []); - }; - - // Return a version of the array that does not contain the specified value(s). - _.without = function(array) { - return _.difference(array, slice.call(arguments, 1)); - }; - - // Produce a duplicate-free version of the array. If the array has already - // been sorted, you have the option of using a faster algorithm. - // Aliased as `unique`. - _.uniq = _.unique = function(array, isSorted, iterator) { - var initial = iterator ? _.map(array, iterator) : array; - var result = []; - _.reduce(initial, function(memo, el, i) { - if (0 == i || (isSorted === true ? _.last(memo) != el : !_.include(memo, el))) { - memo[memo.length] = el; - result[result.length] = array[i]; - } - return memo; - }, []); - return result; - }; - - // Produce an array that contains the union: each distinct element from all of - // the passed-in arrays. - _.union = function() { - return _.uniq(_.flatten(arguments, true)); - }; - - // Produce an array that contains every item shared between all the - // passed-in arrays. (Aliased as "intersect" for back-compat.) - _.intersection = _.intersect = function(array) { - var rest = slice.call(arguments, 1); - return _.filter(_.uniq(array), function(item) { - return _.every(rest, function(other) { - return _.indexOf(other, item) >= 0; - }); - }); - }; - - // Take the difference between one array and a number of other arrays. - // Only the elements present in just the first array will remain. - _.difference = function(array) { - var rest = _.flatten(slice.call(arguments, 1)); - return _.filter(array, function(value){ return !_.include(rest, value); }); - }; - - // Zip together multiple lists into a single array -- elements that share - // an index go together. - _.zip = function() { - var args = slice.call(arguments); - var length = _.max(_.pluck(args, 'length')); - var results = new Array(length); - for (var i = 0; i < length; i++) results[i] = _.pluck(args, "" + i); - return results; - }; - - // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**), - // we need this function. Return the position of the first occurrence of an - // item in an array, or -1 if the item is not included in the array. - // Delegates to **ECMAScript 5**'s native `indexOf` if available. - // If the array is large and already in sort order, pass `true` - // for **isSorted** to use binary search. - _.indexOf = function(array, item, isSorted) { - if (array == null) return -1; - var i, l; - if (isSorted) { - i = _.sortedIndex(array, item); - return array[i] === item ? i : -1; - } - if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item); - for (i = 0, l = array.length; i < l; i++) if (i in array && array[i] === item) return i; - return -1; - }; - - // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available. - _.lastIndexOf = function(array, item) { - if (array == null) return -1; - if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) return array.lastIndexOf(item); - var i = array.length; - while (i--) if (i in array && array[i] === item) return i; - return -1; - }; - - // Generate an integer Array containing an arithmetic progression. A port of - // the native Python `range()` function. See - // [the Python documentation](http://docs.python.org/library/functions.html#range). - _.range = function(start, stop, step) { - if (arguments.length <= 1) { - stop = start || 0; - start = 0; - } - step = arguments[2] || 1; - - var len = Math.max(Math.ceil((stop - start) / step), 0); - var idx = 0; - var range = new Array(len); - - while(idx < len) { - range[idx++] = start; - start += step; - } - - return range; - }; - - // Function (ahem) Functions - // ------------------ - - // Reusable constructor function for prototype setting. - var ctor = function(){}; - - // Create a function bound to a given object (assigning `this`, and arguments, - // optionally). Binding with arguments is also known as `curry`. - // Delegates to **ECMAScript 5**'s native `Function.bind` if available. - // We check for `func.bind` first, to fail fast when `func` is undefined. - _.bind = function bind(func, context) { - var bound, args; - if (func.bind === nativeBind && nativeBind) return nativeBind.apply(func, slice.call(arguments, 1)); - if (!_.isFunction(func)) throw new TypeError; - args = slice.call(arguments, 2); - return bound = function() { - if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments))); - ctor.prototype = func.prototype; - var self = new ctor; - var result = func.apply(self, args.concat(slice.call(arguments))); - if (Object(result) === result) return result; - return self; - }; - }; - - // Bind all of an object's methods to that object. Useful for ensuring that - // all callbacks defined on an object belong to it. - _.bindAll = function(obj) { - var funcs = slice.call(arguments, 1); - if (funcs.length == 0) funcs = _.functions(obj); - each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); }); - return obj; - }; - - // Memoize an expensive function by storing its results. - _.memoize = function(func, hasher) { - var memo = {}; - hasher || (hasher = _.identity); - return function() { - var key = hasher.apply(this, arguments); - return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments)); - }; - }; - - // Delays a function for the given number of milliseconds, and then calls - // it with the arguments supplied. - _.delay = function(func, wait) { - var args = slice.call(arguments, 2); - return setTimeout(function(){ return func.apply(func, args); }, wait); - }; - - // Defers a function, scheduling it to run after the current call stack has - // cleared. - _.defer = function(func) { - return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1))); - }; - - // Returns a function, that, when invoked, will only be triggered at most once - // during a given window of time. - _.throttle = function(func, wait) { - var context, args, timeout, throttling, more; - var whenDone = _.debounce(function(){ more = throttling = false; }, wait); - return function() { - context = this; args = arguments; - var later = function() { - timeout = null; - if (more) func.apply(context, args); - whenDone(); - }; - if (!timeout) timeout = setTimeout(later, wait); - if (throttling) { - more = true; - } else { - func.apply(context, args); - } - whenDone(); - throttling = true; - }; - }; - - // Returns a function, that, as long as it continues to be invoked, will not - // be triggered. The function will be called after it stops being called for - // N milliseconds. - _.debounce = function(func, wait) { - var timeout; - return function() { - var context = this, args = arguments; - var later = function() { - timeout = null; - func.apply(context, args); - }; - clearTimeout(timeout); - timeout = setTimeout(later, wait); - }; - }; - - // Returns a function that will be executed at most one time, no matter how - // often you call it. Useful for lazy initialization. - _.once = function(func) { - var ran = false, memo; - return function() { - if (ran) return memo; - ran = true; - return memo = func.apply(this, arguments); - }; - }; - - // Returns the first function passed as an argument to the second, - // allowing you to adjust arguments, run code before and after, and - // conditionally execute the original function. - _.wrap = function(func, wrapper) { - return function() { - var args = [func].concat(slice.call(arguments, 0)); - return wrapper.apply(this, args); - }; - }; - - // Returns a function that is the composition of a list of functions, each - // consuming the return value of the function that follows. - _.compose = function() { - var funcs = arguments; - return function() { - var args = arguments; - for (var i = funcs.length - 1; i >= 0; i--) { - args = [funcs[i].apply(this, args)]; - } - return args[0]; - }; - }; - - // Returns a function that will only be executed after being called N times. - _.after = function(times, func) { - if (times <= 0) return func(); - return function() { - if (--times < 1) { return func.apply(this, arguments); } - }; - }; - - // Object Functions - // ---------------- - - // Retrieve the names of an object's properties. - // Delegates to **ECMAScript 5**'s native `Object.keys` - _.keys = nativeKeys || function(obj) { - if (obj !== Object(obj)) throw new TypeError('Invalid object'); - var keys = []; - for (var key in obj) if (_.has(obj, key)) keys[keys.length] = key; - return keys; - }; - - // Retrieve the values of an object's properties. - _.values = function(obj) { - return _.map(obj, _.identity); - }; - - // Return a sorted list of the function names available on the object. - // Aliased as `methods` - _.functions = _.methods = function(obj) { - var names = []; - for (var key in obj) { - if (_.isFunction(obj[key])) names.push(key); - } - return names.sort(); - }; - - // Extend a given object with all the properties in passed-in object(s). - _.extend = function(obj) { - each(slice.call(arguments, 1), function(source) { - for (var prop in source) { - obj[prop] = source[prop]; - } - }); - return obj; - }; - - // Fill in a given object with default properties. - _.defaults = function(obj) { - each(slice.call(arguments, 1), function(source) { - for (var prop in source) { - if (obj[prop] == null) obj[prop] = source[prop]; - } - }); - return obj; - }; - - // Create a (shallow-cloned) duplicate of an object. - _.clone = function(obj) { - if (!_.isObject(obj)) return obj; - return _.isArray(obj) ? obj.slice() : _.extend({}, obj); - }; - - // Invokes interceptor with the obj, and then returns obj. - // The primary purpose of this method is to "tap into" a method chain, in - // order to perform operations on intermediate results within the chain. - _.tap = function(obj, interceptor) { - interceptor(obj); - return obj; - }; - - // Internal recursive comparison function. - function eq(a, b, stack) { - // Identical objects are equal. `0 === -0`, but they aren't identical. - // See the Harmony `egal` proposal: http://wiki.ecmascript.org/doku.php?id=harmony:egal. - if (a === b) return a !== 0 || 1 / a == 1 / b; - // A strict comparison is necessary because `null == undefined`. - if (a == null || b == null) return a === b; - // Unwrap any wrapped objects. - if (a._chain) a = a._wrapped; - if (b._chain) b = b._wrapped; - // Invoke a custom `isEqual` method if one is provided. - if (a.isEqual && _.isFunction(a.isEqual)) return a.isEqual(b); - if (b.isEqual && _.isFunction(b.isEqual)) return b.isEqual(a); - // Compare `[[Class]]` names. - var className = toString.call(a); - if (className != toString.call(b)) return false; - switch (className) { - // Strings, numbers, dates, and booleans are compared by value. - case '[object String]': - // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is - // equivalent to `new String("5")`. - return a == String(b); - case '[object Number]': - // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for - // other numeric values. - return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b); - case '[object Date]': - case '[object Boolean]': - // Coerce dates and booleans to numeric primitive values. Dates are compared by their - // millisecond representations. Note that invalid dates with millisecond representations - // of `NaN` are not equivalent. - return +a == +b; - // RegExps are compared by their source patterns and flags. - case '[object RegExp]': - return a.source == b.source && - a.global == b.global && - a.multiline == b.multiline && - a.ignoreCase == b.ignoreCase; - } - if (typeof a != 'object' || typeof b != 'object') return false; - // Assume equality for cyclic structures. The algorithm for detecting cyclic - // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. - var length = stack.length; - while (length--) { - // Linear search. Performance is inversely proportional to the number of - // unique nested structures. - if (stack[length] == a) return true; - } - // Add the first object to the stack of traversed objects. - stack.push(a); - var size = 0, result = true; - // Recursively compare objects and arrays. - if (className == '[object Array]') { - // Compare array lengths to determine if a deep comparison is necessary. - size = a.length; - result = size == b.length; - if (result) { - // Deep compare the contents, ignoring non-numeric properties. - while (size--) { - // Ensure commutative equality for sparse arrays. - if (!(result = size in a == size in b && eq(a[size], b[size], stack))) break; - } - } - } else { - // Objects with different constructors are not equivalent. - if ('constructor' in a != 'constructor' in b || a.constructor != b.constructor) return false; - // Deep compare objects. - for (var key in a) { - if (_.has(a, key)) { - // Count the expected number of properties. - size++; - // Deep compare each member. - if (!(result = _.has(b, key) && eq(a[key], b[key], stack))) break; - } - } - // Ensure that both objects contain the same number of properties. - if (result) { - for (key in b) { - if (_.has(b, key) && !(size--)) break; - } - result = !size; - } - } - // Remove the first object from the stack of traversed objects. - stack.pop(); - return result; - } - - // Perform a deep comparison to check if two objects are equal. - _.isEqual = function(a, b) { - return eq(a, b, []); - }; - - // Is a given array, string, or object empty? - // An "empty" object has no enumerable own-properties. - _.isEmpty = function(obj) { - if (_.isArray(obj) || _.isString(obj)) return obj.length === 0; - for (var key in obj) if (_.has(obj, key)) return false; - return true; - }; - - // Is a given value a DOM element? - _.isElement = function(obj) { - return !!(obj && obj.nodeType == 1); - }; - - // Is a given value an array? - // Delegates to ECMA5's native Array.isArray - _.isArray = nativeIsArray || function(obj) { - return toString.call(obj) == '[object Array]'; - }; - - // Is a given variable an object? - _.isObject = function(obj) { - return obj === Object(obj); - }; - - // Is a given variable an arguments object? - _.isArguments = function(obj) { - return toString.call(obj) == '[object Arguments]'; - }; - if (!_.isArguments(arguments)) { - _.isArguments = function(obj) { - return !!(obj && _.has(obj, 'callee')); - }; - } - - // Is a given value a function? - _.isFunction = function(obj) { - return toString.call(obj) == '[object Function]'; - }; - - // Is a given value a string? - _.isString = function(obj) { - return toString.call(obj) == '[object String]'; - }; - - // Is a given value a number? - _.isNumber = function(obj) { - return toString.call(obj) == '[object Number]'; - }; - - // Is the given value `NaN`? - _.isNaN = function(obj) { - // `NaN` is the only value for which `===` is not reflexive. - return obj !== obj; - }; - - // Is a given value a boolean? - _.isBoolean = function(obj) { - return obj === true || obj === false || toString.call(obj) == '[object Boolean]'; - }; - - // Is a given value a date? - _.isDate = function(obj) { - return toString.call(obj) == '[object Date]'; - }; - - // Is the given value a regular expression? - _.isRegExp = function(obj) { - return toString.call(obj) == '[object RegExp]'; - }; - - // Is a given value equal to null? - _.isNull = function(obj) { - return obj === null; - }; - - // Is a given variable undefined? - _.isUndefined = function(obj) { - return obj === void 0; - }; - - // Has own property? - _.has = function(obj, key) { - return hasOwnProperty.call(obj, key); - }; - - // Utility Functions - // ----------------- - - // Run Underscore.js in *noConflict* mode, returning the `_` variable to its - // previous owner. Returns a reference to the Underscore object. - _.noConflict = function() { - root._ = previousUnderscore; - return this; - }; - - // Keep the identity function around for default iterators. - _.identity = function(value) { - return value; - }; - - // Run a function **n** times. - _.times = function (n, iterator, context) { - for (var i = 0; i < n; i++) iterator.call(context, i); - }; - - // Escape a string for HTML interpolation. - _.escape = function(string) { - return (''+string).replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"').replace(/'/g, ''').replace(/\//g,'/'); - }; - - // Add your own custom functions to the Underscore object, ensuring that - // they're correctly added to the OOP wrapper as well. - _.mixin = function(obj) { - each(_.functions(obj), function(name){ - addToWrapper(name, _[name] = obj[name]); - }); - }; - - // Generate a unique integer id (unique within the entire client session). - // Useful for temporary DOM ids. - var idCounter = 0; - _.uniqueId = function(prefix) { - var id = idCounter++; - return prefix ? prefix + id : id; - }; - - // By default, Underscore uses ERB-style template delimiters, change the - // following template settings to use alternative delimiters. - _.templateSettings = { - evaluate : /<%([\s\S]+?)%>/g, - interpolate : /<%=([\s\S]+?)%>/g, - escape : /<%-([\s\S]+?)%>/g - }; - - // When customizing `templateSettings`, if you don't want to define an - // interpolation, evaluation or escaping regex, we need one that is - // guaranteed not to match. - var noMatch = /.^/; - - // Within an interpolation, evaluation, or escaping, remove HTML escaping - // that had been previously added. - var unescape = function(code) { - return code.replace(/\\\\/g, '\\').replace(/\\'/g, "'"); - }; - - // JavaScript micro-templating, similar to John Resig's implementation. - // Underscore templating handles arbitrary delimiters, preserves whitespace, - // and correctly escapes quotes within interpolated code. - _.template = function(str, data) { - var c = _.templateSettings; - var tmpl = 'var __p=[],print=function(){__p.push.apply(__p,arguments);};' + - 'with(obj||{}){__p.push(\'' + - str.replace(/\\/g, '\\\\') - .replace(/'/g, "\\'") - .replace(c.escape || noMatch, function(match, code) { - return "',_.escape(" + unescape(code) + "),'"; - }) - .replace(c.interpolate || noMatch, function(match, code) { - return "'," + unescape(code) + ",'"; - }) - .replace(c.evaluate || noMatch, function(match, code) { - return "');" + unescape(code).replace(/[\r\n\t]/g, ' ') + ";__p.push('"; - }) - .replace(/\r/g, '\\r') - .replace(/\n/g, '\\n') - .replace(/\t/g, '\\t') - + "');}return __p.join('');"; - var func = new Function('obj', '_', tmpl); - if (data) return func(data, _); - return function(data) { - return func.call(this, data, _); - }; - }; - - // Add a "chain" function, which will delegate to the wrapper. - _.chain = function(obj) { - return _(obj).chain(); - }; - - // The OOP Wrapper - // --------------- - - // If Underscore is called as a function, it returns a wrapped object that - // can be used OO-style. This wrapper holds altered versions of all the - // underscore functions. Wrapped objects may be chained. - var wrapper = function(obj) { this._wrapped = obj; }; - - // Expose `wrapper.prototype` as `_.prototype` - _.prototype = wrapper.prototype; - - // Helper function to continue chaining intermediate results. - var result = function(obj, chain) { - return chain ? _(obj).chain() : obj; - }; - - // A method to easily add functions to the OOP wrapper. - var addToWrapper = function(name, func) { - wrapper.prototype[name] = function() { - var args = slice.call(arguments); - unshift.call(args, this._wrapped); - return result(func.apply(_, args), this._chain); - }; - }; - - // Add all of the Underscore functions to the wrapper object. - _.mixin(_); - - // Add all mutator Array functions to the wrapper. - each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { - var method = ArrayProto[name]; - wrapper.prototype[name] = function() { - var wrapped = this._wrapped; - method.apply(wrapped, arguments); - var length = wrapped.length; - if ((name == 'shift' || name == 'splice') && length === 0) delete wrapped[0]; - return result(wrapped, this._chain); - }; - }); - - // Add all accessor Array functions to the wrapper. - each(['concat', 'join', 'slice'], function(name) { - var method = ArrayProto[name]; - wrapper.prototype[name] = function() { - return result(method.apply(this._wrapped, arguments), this._chain); - }; - }); - - // Start chaining a wrapped Underscore object. - wrapper.prototype.chain = function() { - this._chain = true; - return this; - }; - - // Extracts the result from a wrapped and chained object. - wrapper.prototype.value = function() { - return this._wrapped; - }; - -}).call(this); diff --git a/docs/_static/underscore.js b/docs/_static/underscore.js index 5b55f32..cf177d4 100644 --- a/docs/_static/underscore.js +++ b/docs/_static/underscore.js @@ -1,31 +1,6 @@ -// Underscore.js 1.3.1 -// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc. -// Underscore is freely distributable under the MIT license. -// Portions of Underscore are inspired or borrowed from Prototype, -// Oliver Steele's Functional, and John Resig's Micro-Templating. -// For all details and documentation: -// http://documentcloud.github.com/underscore -(function(){function q(a,c,d){if(a===c)return a!==0||1/a==1/c;if(a==null||c==null)return a===c;if(a._chain)a=a._wrapped;if(c._chain)c=c._wrapped;if(a.isEqual&&b.isFunction(a.isEqual))return a.isEqual(c);if(c.isEqual&&b.isFunction(c.isEqual))return c.isEqual(a);var e=l.call(a);if(e!=l.call(c))return false;switch(e){case "[object String]":return a==String(c);case "[object Number]":return a!=+a?c!=+c:a==0?1/a==1/c:a==+c;case "[object Date]":case "[object Boolean]":return+a==+c;case "[object RegExp]":return a.source== -c.source&&a.global==c.global&&a.multiline==c.multiline&&a.ignoreCase==c.ignoreCase}if(typeof a!="object"||typeof c!="object")return false;for(var f=d.length;f--;)if(d[f]==a)return true;d.push(a);var f=0,g=true;if(e=="[object Array]"){if(f=a.length,g=f==c.length)for(;f--;)if(!(g=f in a==f in c&&q(a[f],c[f],d)))break}else{if("constructor"in a!="constructor"in c||a.constructor!=c.constructor)return false;for(var h in a)if(b.has(a,h)&&(f++,!(g=b.has(c,h)&&q(a[h],c[h],d))))break;if(g){for(h in c)if(b.has(c, -h)&&!f--)break;g=!f}}d.pop();return g}var r=this,G=r._,n={},k=Array.prototype,o=Object.prototype,i=k.slice,H=k.unshift,l=o.toString,I=o.hasOwnProperty,w=k.forEach,x=k.map,y=k.reduce,z=k.reduceRight,A=k.filter,B=k.every,C=k.some,p=k.indexOf,D=k.lastIndexOf,o=Array.isArray,J=Object.keys,s=Function.prototype.bind,b=function(a){return new m(a)};if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports)exports=module.exports=b;exports._=b}else r._=b;b.VERSION="1.3.1";var j=b.each= -b.forEach=function(a,c,d){if(a!=null)if(w&&a.forEach===w)a.forEach(c,d);else if(a.length===+a.length)for(var e=0,f=a.length;e2;a== -null&&(a=[]);if(y&&a.reduce===y)return e&&(c=b.bind(c,e)),f?a.reduce(c,d):a.reduce(c);j(a,function(a,b,i){f?d=c.call(e,d,a,b,i):(d=a,f=true)});if(!f)throw new TypeError("Reduce of empty array with no initial value");return d};b.reduceRight=b.foldr=function(a,c,d,e){var f=arguments.length>2;a==null&&(a=[]);if(z&&a.reduceRight===z)return e&&(c=b.bind(c,e)),f?a.reduceRight(c,d):a.reduceRight(c);var g=b.toArray(a).reverse();e&&!f&&(c=b.bind(c,e));return f?b.reduce(g,c,d,e):b.reduce(g,c)};b.find=b.detect= -function(a,c,b){var e;E(a,function(a,g,h){if(c.call(b,a,g,h))return e=a,true});return e};b.filter=b.select=function(a,c,b){var e=[];if(a==null)return e;if(A&&a.filter===A)return a.filter(c,b);j(a,function(a,g,h){c.call(b,a,g,h)&&(e[e.length]=a)});return e};b.reject=function(a,c,b){var e=[];if(a==null)return e;j(a,function(a,g,h){c.call(b,a,g,h)||(e[e.length]=a)});return e};b.every=b.all=function(a,c,b){var e=true;if(a==null)return e;if(B&&a.every===B)return a.every(c,b);j(a,function(a,g,h){if(!(e= -e&&c.call(b,a,g,h)))return n});return e};var E=b.some=b.any=function(a,c,d){c||(c=b.identity);var e=false;if(a==null)return e;if(C&&a.some===C)return a.some(c,d);j(a,function(a,b,h){if(e||(e=c.call(d,a,b,h)))return n});return!!e};b.include=b.contains=function(a,c){var b=false;if(a==null)return b;return p&&a.indexOf===p?a.indexOf(c)!=-1:b=E(a,function(a){return a===c})};b.invoke=function(a,c){var d=i.call(arguments,2);return b.map(a,function(a){return(b.isFunction(c)?c||a:a[c]).apply(a,d)})};b.pluck= -function(a,c){return b.map(a,function(a){return a[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a))return Math.max.apply(Math,a);if(!c&&b.isEmpty(a))return-Infinity;var e={computed:-Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b>=e.computed&&(e={value:a,computed:b})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a))return Math.min.apply(Math,a);if(!c&&b.isEmpty(a))return Infinity;var e={computed:Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;bd?1:0}),"value")};b.groupBy=function(a,c){var d={},e=b.isFunction(c)?c:function(a){return a[c]};j(a,function(a,b){var c=e(a,b);(d[c]||(d[c]=[])).push(a)});return d};b.sortedIndex=function(a, -c,d){d||(d=b.identity);for(var e=0,f=a.length;e>1;d(a[g])=0})})};b.difference=function(a){var c=b.flatten(i.call(arguments,1));return b.filter(a,function(a){return!b.include(c,a)})};b.zip=function(){for(var a=i.call(arguments),c=b.max(b.pluck(a,"length")),d=Array(c),e=0;e=0;d--)b=[a[d].apply(this,b)];return b[0]}}; -b.after=function(a,b){return a<=0?b():function(){if(--a<1)return b.apply(this,arguments)}};b.keys=J||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var c=[],d;for(d in a)b.has(a,d)&&(c[c.length]=d);return c};b.values=function(a){return b.map(a,b.identity)};b.functions=b.methods=function(a){var c=[],d;for(d in a)b.isFunction(a[d])&&c.push(d);return c.sort()};b.extend=function(a){j(i.call(arguments,1),function(b){for(var d in b)a[d]=b[d]});return a};b.defaults=function(a){j(i.call(arguments, -1),function(b){for(var d in b)a[d]==null&&(a[d]=b[d])});return a};b.clone=function(a){return!b.isObject(a)?a:b.isArray(a)?a.slice():b.extend({},a)};b.tap=function(a,b){b(a);return a};b.isEqual=function(a,b){return q(a,b,[])};b.isEmpty=function(a){if(b.isArray(a)||b.isString(a))return a.length===0;for(var c in a)if(b.has(a,c))return false;return true};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=o||function(a){return l.call(a)=="[object Array]"};b.isObject=function(a){return a===Object(a)}; -b.isArguments=function(a){return l.call(a)=="[object Arguments]"};if(!b.isArguments(arguments))b.isArguments=function(a){return!(!a||!b.has(a,"callee"))};b.isFunction=function(a){return l.call(a)=="[object Function]"};b.isString=function(a){return l.call(a)=="[object String]"};b.isNumber=function(a){return l.call(a)=="[object Number]"};b.isNaN=function(a){return a!==a};b.isBoolean=function(a){return a===true||a===false||l.call(a)=="[object Boolean]"};b.isDate=function(a){return l.call(a)=="[object Date]"}; -b.isRegExp=function(a){return l.call(a)=="[object RegExp]"};b.isNull=function(a){return a===null};b.isUndefined=function(a){return a===void 0};b.has=function(a,b){return I.call(a,b)};b.noConflict=function(){r._=G;return this};b.identity=function(a){return a};b.times=function(a,b,d){for(var e=0;e/g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/")};b.mixin=function(a){j(b.functions(a), -function(c){K(c,b[c]=a[c])})};var L=0;b.uniqueId=function(a){var b=L++;return a?a+b:b};b.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var t=/.^/,u=function(a){return a.replace(/\\\\/g,"\\").replace(/\\'/g,"'")};b.template=function(a,c){var d=b.templateSettings,d="var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('"+a.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(d.escape||t,function(a,b){return"',_.escape("+ -u(b)+"),'"}).replace(d.interpolate||t,function(a,b){return"',"+u(b)+",'"}).replace(d.evaluate||t,function(a,b){return"');"+u(b).replace(/[\r\n\t]/g," ")+";__p.push('"}).replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\t/g,"\\t")+"');}return __p.join('');",e=new Function("obj","_",d);return c?e(c,b):function(a){return e.call(this,a,b)}};b.chain=function(a){return b(a).chain()};var m=function(a){this._wrapped=a};b.prototype=m.prototype;var v=function(a,c){return c?b(a).chain():a},K=function(a,c){m.prototype[a]= -function(){var a=i.call(arguments);H.call(a,this._wrapped);return v(c.apply(b,a),this._chain)}};b.mixin(b);j("pop,push,reverse,shift,sort,splice,unshift".split(","),function(a){var b=k[a];m.prototype[a]=function(){var d=this._wrapped;b.apply(d,arguments);var e=d.length;(a=="shift"||a=="splice")&&e===0&&delete d[0];return v(d,this._chain)}});j(["concat","join","slice"],function(a){var b=k[a];m.prototype[a]=function(){return v(b.apply(this._wrapped,arguments),this._chain)}});m.prototype.chain=function(){this._chain= -true;return this};m.prototype.value=function(){return this._wrapped}}).call(this); +!function(n,r){"object"==typeof exports&&"undefined"!=typeof module?module.exports=r():"function"==typeof define&&define.amd?define("underscore",r):(n="undefined"!=typeof globalThis?globalThis:n||self,function(){var t=n._,e=n._=r();e.noConflict=function(){return n._=t,e}}())}(this,(function(){ +// Underscore.js 1.13.1 +// https://underscorejs.org +// (c) 2009-2021 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors +// Underscore may be freely distributed under the MIT license. +var n="1.13.1",r="object"==typeof self&&self.self===self&&self||"object"==typeof global&&global.global===global&&global||Function("return this")()||{},t=Array.prototype,e=Object.prototype,u="undefined"!=typeof Symbol?Symbol.prototype:null,o=t.push,i=t.slice,a=e.toString,f=e.hasOwnProperty,c="undefined"!=typeof ArrayBuffer,l="undefined"!=typeof DataView,s=Array.isArray,p=Object.keys,v=Object.create,h=c&&ArrayBuffer.isView,y=isNaN,d=isFinite,g=!{toString:null}.propertyIsEnumerable("toString"),b=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],m=Math.pow(2,53)-1;function j(n,r){return r=null==r?n.length-1:+r,function(){for(var t=Math.max(arguments.length-r,0),e=Array(t),u=0;u=0&&t<=m}}function J(n){return function(r){return null==r?void 0:r[n]}}var G=J("byteLength"),H=K(G),Q=/\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;var X=c?function(n){return h?h(n)&&!q(n):H(n)&&Q.test(a.call(n))}:C(!1),Y=J("length");function Z(n,r){r=function(n){for(var r={},t=n.length,e=0;e":">",'"':""","'":"'","`":"`"},Cn=Ln($n),Kn=Ln(_n($n)),Jn=tn.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g},Gn=/(.)^/,Hn={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},Qn=/\\|'|\r|\n|\u2028|\u2029/g;function Xn(n){return"\\"+Hn[n]}var Yn=/^\s*(\w|\$)+\s*$/;var Zn=0;function nr(n,r,t,e,u){if(!(e instanceof r))return n.apply(t,u);var o=Mn(n.prototype),i=n.apply(o,u);return _(i)?i:o}var rr=j((function(n,r){var t=rr.placeholder,e=function(){for(var u=0,o=r.length,i=Array(o),a=0;a1)ur(a,r-1,t,e),u=e.length;else for(var f=0,c=a.length;f0&&(t=r.apply(this,arguments)),n<=1&&(r=null),t}}var lr=rr(cr,2);function sr(n,r,t){r=qn(r,t);for(var e,u=nn(n),o=0,i=u.length;o0?0:u-1;o>=0&&o0?a=o>=0?o:Math.max(o+f,a):f=o>=0?Math.min(o+1,f):o+f+1;else if(t&&o&&f)return e[o=t(e,u)]===u?o:-1;if(u!=u)return(o=r(i.call(e,a,f),$))>=0?o+a:-1;for(o=n>0?a:f-1;o>=0&&o0?0:i-1;for(u||(e=r[o?o[a]:a],a+=n);a>=0&&a=3;return r(n,Fn(t,u,4),e,o)}}var Ar=wr(1),xr=wr(-1);function Sr(n,r,t){var e=[];return r=qn(r,t),jr(n,(function(n,t,u){r(n,t,u)&&e.push(n)})),e}function Or(n,r,t){r=qn(r,t);for(var e=!er(n)&&nn(n),u=(e||n).length,o=0;o=0}var Br=j((function(n,r,t){var e,u;return D(r)?u=r:(r=Nn(r),e=r.slice(0,-1),r=r[r.length-1]),_r(n,(function(n){var o=u;if(!o){if(e&&e.length&&(n=In(n,e)),null==n)return;o=n[r]}return null==o?o:o.apply(n,t)}))}));function Nr(n,r){return _r(n,Rn(r))}function Ir(n,r,t){var e,u,o=-1/0,i=-1/0;if(null==r||"number"==typeof r&&"object"!=typeof n[0]&&null!=n)for(var a=0,f=(n=er(n)?n:jn(n)).length;ao&&(o=e);else r=qn(r,t),jr(n,(function(n,t,e){((u=r(n,t,e))>i||u===-1/0&&o===-1/0)&&(o=n,i=u)}));return o}function Tr(n,r,t){if(null==r||t)return er(n)||(n=jn(n)),n[Wn(n.length-1)];var e=er(n)?En(n):jn(n),u=Y(e);r=Math.max(Math.min(r,u),0);for(var o=u-1,i=0;i1&&(e=Fn(e,r[1])),r=an(n)):(e=qr,r=ur(r,!1,!1),n=Object(n));for(var u=0,o=r.length;u1&&(t=r[1])):(r=_r(ur(r,!1,!1),String),e=function(n,t){return!Er(r,t)}),Ur(n,e,t)}));function zr(n,r,t){return i.call(n,0,Math.max(0,n.length-(null==r||t?1:r)))}function Lr(n,r,t){return null==n||n.length<1?null==r||t?void 0:[]:null==r||t?n[0]:zr(n,n.length-r)}function $r(n,r,t){return i.call(n,null==r||t?1:r)}var Cr=j((function(n,r){return r=ur(r,!0,!0),Sr(n,(function(n){return!Er(r,n)}))})),Kr=j((function(n,r){return Cr(n,r)}));function Jr(n,r,t,e){A(r)||(e=t,t=r,r=!1),null!=t&&(t=qn(t,e));for(var u=[],o=[],i=0,a=Y(n);ir?(e&&(clearTimeout(e),e=null),a=c,i=n.apply(u,o),e||(u=o=null)):e||!1===t.trailing||(e=setTimeout(f,l)),i};return c.cancel=function(){clearTimeout(e),a=0,e=u=o=null},c},debounce:function(n,r,t){var e,u,o,i,a,f=function(){var c=zn()-u;r>c?e=setTimeout(f,r-c):(e=null,t||(i=n.apply(a,o)),e||(o=a=null))},c=j((function(c){return a=this,o=c,u=zn(),e||(e=setTimeout(f,r),t&&(i=n.apply(a,o))),i}));return c.cancel=function(){clearTimeout(e),e=o=a=null},c},wrap:function(n,r){return rr(r,n)},negate:fr,compose:function(){var n=arguments,r=n.length-1;return function(){for(var t=r,e=n[r].apply(this,arguments);t--;)e=n[t].call(this,e);return e}},after:function(n,r){return function(){if(--n<1)return r.apply(this,arguments)}},before:cr,once:lr,findKey:sr,findIndex:vr,findLastIndex:hr,sortedIndex:yr,indexOf:gr,lastIndexOf:br,find:mr,detect:mr,findWhere:function(n,r){return mr(n,Dn(r))},each:jr,forEach:jr,map:_r,collect:_r,reduce:Ar,foldl:Ar,inject:Ar,reduceRight:xr,foldr:xr,filter:Sr,select:Sr,reject:function(n,r,t){return Sr(n,fr(qn(r)),t)},every:Or,all:Or,some:Mr,any:Mr,contains:Er,includes:Er,include:Er,invoke:Br,pluck:Nr,where:function(n,r){return Sr(n,Dn(r))},max:Ir,min:function(n,r,t){var e,u,o=1/0,i=1/0;if(null==r||"number"==typeof r&&"object"!=typeof n[0]&&null!=n)for(var a=0,f=(n=er(n)?n:jn(n)).length;ae||void 0===t)return 1;if(t - - reactors — reactors_sdk 0.7.0 documentation - - + + + reactors — reactors_sdk 1.0.0 documentation + + - + - @@ -36,7 +36,7 @@

    Navigation

  • previous |
  • - + @@ -46,7 +46,7 @@

    Navigation

    -
    +

    reactors

    @@ -122,7 +140,7 @@

    This Page

    Quick search

    @@ -147,13 +165,13 @@

    Navigation

  • previous |
  • - +
    \ No newline at end of file diff --git a/docs/api-ref/reactors.agaveutils.html b/docs/api-ref/reactors.agaveutils.html index c5687a7..03d4aba 100644 --- a/docs/api-ref/reactors.agaveutils.html +++ b/docs/api-ref/reactors.agaveutils.html @@ -4,21 +4,21 @@ - - reactors.agaveutils package — reactors_sdk 0.7.0 documentation - - + + + reactors.agaveutils package — reactors_sdk 1.0.0 documentation + + - + - - +
    - -
    -
    - - - + + + + + \ No newline at end of file diff --git a/docsrc/_build/html/search.html b/docsrc/_build/html/search.html index b0ffb4a..b659b0d 100644 --- a/docsrc/_build/html/search.html +++ b/docsrc/_build/html/search.html @@ -1,105 +1,116 @@ - - - - - - - Search — reactors_sdk 1.0.0 documentation - - - - - - - - - + + + + + Search — reactors_sdk 1.0.0 documentation + + + + + + + + + + - - - + + - - + +
    + + +
    + +
    +
    +
    +
      +
    • »
    • +
    • Search
    • +
    • +
    • +
    +
    +
    +
    +
    +
    +
    + +
    + +
    +

    © Copyright 2021, Matthew Vaughn, Ethan Ho, Shweta Gopaulakrishnan.

    +
    + + Built with Sphinx using a + theme + provided by Read the Docs. + + +
    - -
    -
    - - - +
    +
    + + + + + + + + \ No newline at end of file diff --git a/docsrc/conf.py b/docsrc/conf.py index fa14cfc..04ffa20 100644 --- a/docsrc/conf.py +++ b/docsrc/conf.py @@ -46,7 +46,7 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. -html_theme = 'classic' +html_theme = 'sphinx_rtd_theme' # 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, From 97d071416c586d0333a49f5b949580d7f74ff37c Mon Sep 17 00:00:00 2001 From: Ethan Ho Date: Thu, 30 Sep 2021 15:13:46 -0500 Subject: [PATCH 09/12] Placeholders for getting started & logging docs --- docsrc/Makefile | 3 + docsrc/_build/html/.buildinfo | 2 +- .../html/.doctrees/api-ref/modules.doctree | Bin 0 -> 2678 bytes .../api-ref/reactors.agaveutils.doctree | Bin 0 -> 87560 bytes .../.doctrees/api-ref/reactors.cli.doctree | Bin 0 -> 12088 bytes .../html/.doctrees/api-ref/reactors.doctree | Bin 0 -> 17872 bytes .../api-ref/reactors.logtypes.doctree | Bin 0 -> 68209 bytes .../api-ref/reactors.runtime.doctree | Bin 0 -> 120381 bytes .../api-ref/reactors.validation.doctree | Bin 0 -> 73599 bytes .../_build/html/.doctrees/environment.pickle | Bin 0 -> 73988 bytes .../.doctrees/getting-started/index.doctree | Bin 0 -> 2783 bytes docsrc/_build/html/.doctrees/index.doctree | Bin 0 -> 5228 bytes .../html/.doctrees/logging/index.doctree | Bin 0 -> 2766 bytes .../_sources/getting-started/index.md.txt | 3 + docsrc/_build/html/_sources/index.rst.txt | 10 +- .../_build/html/_sources/logging/index.md.txt | 3 + docsrc/_build/html/api-ref/modules.html | 23 +++- .../html/api-ref/reactors.agaveutils.html | 9 +- docsrc/_build/html/api-ref/reactors.cli.html | 9 +- docsrc/_build/html/api-ref/reactors.html | 9 +- .../html/api-ref/reactors.logtypes.html | 9 +- .../_build/html/api-ref/reactors.runtime.html | 9 +- .../html/api-ref/reactors.validation.html | 9 +- docsrc/_build/html/genindex.html | 16 ++- docsrc/_build/html/getting-started/index.html | 114 ++++++++++++++++++ docsrc/_build/html/index.html | 29 +++-- docsrc/_build/html/logging/index.html | 114 ++++++++++++++++++ docsrc/_build/html/objects.inv | Bin 1759 -> 1812 bytes docsrc/_build/html/py-modindex.html | 16 ++- docsrc/_build/html/search.html | 16 ++- docsrc/_build/html/searchindex.js | 2 +- docsrc/conf.py | 18 ++- docsrc/getting-started/index.md | 3 + docsrc/index.rst | 10 +- docsrc/logging/index.md | 3 + 35 files changed, 391 insertions(+), 48 deletions(-) create mode 100644 docsrc/_build/html/.doctrees/api-ref/modules.doctree create mode 100644 docsrc/_build/html/.doctrees/api-ref/reactors.agaveutils.doctree create mode 100644 docsrc/_build/html/.doctrees/api-ref/reactors.cli.doctree create mode 100644 docsrc/_build/html/.doctrees/api-ref/reactors.doctree create mode 100644 docsrc/_build/html/.doctrees/api-ref/reactors.logtypes.doctree create mode 100644 docsrc/_build/html/.doctrees/api-ref/reactors.runtime.doctree create mode 100644 docsrc/_build/html/.doctrees/api-ref/reactors.validation.doctree create mode 100644 docsrc/_build/html/.doctrees/environment.pickle create mode 100644 docsrc/_build/html/.doctrees/getting-started/index.doctree create mode 100644 docsrc/_build/html/.doctrees/index.doctree create mode 100644 docsrc/_build/html/.doctrees/logging/index.doctree create mode 100644 docsrc/_build/html/_sources/getting-started/index.md.txt create mode 100644 docsrc/_build/html/_sources/logging/index.md.txt create mode 100644 docsrc/_build/html/getting-started/index.html create mode 100644 docsrc/_build/html/logging/index.html create mode 100644 docsrc/getting-started/index.md create mode 100644 docsrc/logging/index.md diff --git a/docsrc/Makefile b/docsrc/Makefile index 5b2b9d6..0bf1934 100644 --- a/docsrc/Makefile +++ b/docsrc/Makefile @@ -5,6 +5,7 @@ # from the environment for the first two. GRAPHVIZ_DOT_ARGS ?= -D graphviz_dot_args="-Gratio=compress" SPHINXOPTS ?= $(GRAPHVIZ_DOT_ARGS) +SPHINXAUTOBUILD ?= sphinx-autobuild SPHINXBUILD ?= sphinx-build PKGDIR ?= ../src/reactors SOURCEDIR = . @@ -30,3 +31,5 @@ api-ref: clean: rm -rf $(GITHUB_DIR)/* $(BUILDDIR)/* +livehtml: + @$(SPHINXAUTOBUILD) -b html $(SPHINXOPTS) "$(SOURCEDIR)" "$(BUILDDIR)/html" \ No newline at end of file diff --git a/docsrc/_build/html/.buildinfo b/docsrc/_build/html/.buildinfo index 8ce2d44..b1f188c 100644 --- a/docsrc/_build/html/.buildinfo +++ b/docsrc/_build/html/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: fb289cb2d8dadc13e7de412f7312a5d2 +config: 095d582e7e5fa0b1df167abd5045d911 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docsrc/_build/html/.doctrees/api-ref/modules.doctree b/docsrc/_build/html/.doctrees/api-ref/modules.doctree new file mode 100644 index 0000000000000000000000000000000000000000..103135a45c8804f6a0ee1ce0d0f5d8bbb75f540b GIT binary patch literal 2678 zcmZ8jO>Y}F5Or)zmSla{PSZ=`wm}gjL2auDdI)+dP@pJa)Q2JokV8OFOG;$TCATEk zmJdPOLy838E$sj8DdwyIy4xI#$1JfnJPrKL01akIzEi(raf*oADU7ppglwnB_XYi(#D9y;Sb3Ilt$4=B3f?anTW7vG*=M z6aCQf(ks5U6?&G_%p2=s(t*nEE51y=*LFU{Dh?RBAG!sFXCK93=#w^7u@kyYgco5~ zNzLO$Iiq1fy|;2!dSsR|*^$hpsP{5Oor4hX9ZmE4t;fpZb}^&brRDRaQ-(cH7ilYs ziFhc6;*r=9$KluMYsamda$%;PX4$l`<`1OrrjEVf)8fVpqfb{EP7$uN*_0L%viUSO ztW?~cS%-AKI^Qm5NWYhvyfCF^YarG5i7iB7GH>}hfX&|5$WA;4fZyVIg6Aoo=Xf55 z$sK>l9spWd<$MtiR@!dT2y5Q-V0@B z@l)su$rxDiDU6!at)QpNe8w$j@q8-`DiS!O)eUq9AlGd?rT9*~5Xa&Kfb0V4DXJ*e zlM9mugVSqEi-Oxo*Yi#1Pj4%f?0^WoHL=Djy25Hh*5H=x3}9!cu5=X-3bYx^y5p9A z;v}8D7sgp>6H`gc%i&5=^E31u_g?A+n(naeqPaENbCf@H-%wQo{8bx@$wlZdxaO9k zUm_Nag4dqr1s40Y8v@&xSPq(HX%$u@U`7(3(=Oa~65uy69LD;11o5Nr#U2jZ)wI;Qt@LLOI?(naGetB_W(xE{;gDPAW0;uIZ(8Y8R$@55vvbFU_$!QSqqhNcUcdU~ z^d+2cZrnK;4pIURC<)-BkWdUGMfIYj3l6v$*4t>QaNqLGSVqu)AP3x}_Pq$*%;-6C z1RRo)0#ijUqv(b)ExjSPqOdK&s1Ymkg0!pys+B;3a8^^53{ENupw%wb{#H~tUNS?L zdE(OnUlzu3vVO9nNao3vbh75>gfQvoOr=DcDEC&~AWp&%$vE(zHe+PesFBso316l+ zIKhlfIw)_l#!&Bl42^aPejcWl0&VmHEL1X=KK^#_G>i*g5P*Woqq7RIVUo-!Vo#kB zz7gIR?#Jo$`uh5;9@l5aE~boMO`++gF+4~osz7jpc%Gw79%bo4e){D5AAsxF&a*pi zlH}ISqm>(P3~oxv{k(D`e6HZ4@97K;#L{H#g=5e$Cv9i8;S*ORetZfC?nZmMBtkBP z!UO8=Dw9}0bU8(j{aK==9bmd&t?MOGCZqK*5679H=pK~4ZZ%+B0f^I=WdRrIRwU_}JJ|_~iVLvlU z0a)aKOJMKkM*bPee~7<>$N08FXW(ndVf@q%+flF~-fzWK$@ZK39voYwY7JPLR!w84 J8?>CA{SRVaDUtvH literal 0 HcmV?d00001 diff --git a/docsrc/_build/html/.doctrees/api-ref/reactors.agaveutils.doctree b/docsrc/_build/html/.doctrees/api-ref/reactors.agaveutils.doctree new file mode 100644 index 0000000000000000000000000000000000000000..2a46963fde438d7ec0e7931b5be021e27c7df229 GIT binary patch literal 87560 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 S+vIx|Y>K@qOv&5XjsF4R_yCIl literal 0 HcmV?d00001 diff --git a/docsrc/_build/html/.doctrees/api-ref/reactors.doctree b/docsrc/_build/html/.doctrees/api-ref/reactors.doctree new file mode 100644 index 0000000000000000000000000000000000000000..e4be4a87853f6b109d89f0b7028d02fd92298df8 GIT binary patch literal 17872 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 tga!$QTJ0%_t1-^ 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 S4`VDiSiu08$BN9ZkNiJaKpYAH literal 0 HcmV?d00001 diff --git a/docsrc/_build/html/.doctrees/api-ref/reactors.validation.doctree b/docsrc/_build/html/.doctrees/api-ref/reactors.validation.doctree new file mode 100644 index 0000000000000000000000000000000000000000..e74ecf699dbe6fbba35859324d8c668ba21dad54 GIT binary patch literal 73599 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 Ci1!Qt literal 0 HcmV?d00001 diff --git a/docsrc/_build/html/.doctrees/environment.pickle b/docsrc/_build/html/.doctrees/environment.pickle new file mode 100644 index 0000000000000000000000000000000000000000..5b4965f5ad16ed0ba1d78a666d3ab7389d58f224 GIT binary patch literal 73988 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 Pp>cvNn=NiMHyQp5-@HcK literal 0 HcmV?d00001 diff --git a/docsrc/_build/html/.doctrees/index.doctree b/docsrc/_build/html/.doctrees/index.doctree new file mode 100644 index 0000000000000000000000000000000000000000..810a0bc29c4116abd7210d53f3a17d9149bbbd92 GIT binary patch literal 5228 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 literal 0 HcmV?d00001 diff --git a/docsrc/_build/html/_sources/getting-started/index.md.txt b/docsrc/_build/html/_sources/getting-started/index.md.txt new file mode 100644 index 0000000..9b7c248 --- /dev/null +++ b/docsrc/_build/html/_sources/getting-started/index.md.txt @@ -0,0 +1,3 @@ +# Getting Started + +This tutorial will provide a quick tutorial for usage of the `python-reactors` package. \ No newline at end of file diff --git a/docsrc/_build/html/_sources/index.rst.txt b/docsrc/_build/html/_sources/index.rst.txt index 5e7fc37..ed81c70 100644 --- a/docsrc/_build/html/_sources/index.rst.txt +++ b/docsrc/_build/html/_sources/index.rst.txt @@ -8,7 +8,15 @@ Welcome to Reactors SDK documentation! .. toctree:: :maxdepth: 2 - :caption: API Reference: + :caption: Reactors SDK + + getting-started/index.md + logging/index.md + + +.. toctree:: + :maxdepth: 2 + :caption: API Reference api-ref/modules.rst diff --git a/docsrc/_build/html/_sources/logging/index.md.txt b/docsrc/_build/html/_sources/logging/index.md.txt new file mode 100644 index 0000000..9f0f036 --- /dev/null +++ b/docsrc/_build/html/_sources/logging/index.md.txt @@ -0,0 +1,3 @@ +# Logging with Reactors + +In this section, we will review logging with Reactors, including logging to 3rd party services such as Slack and Loggly. \ No newline at end of file diff --git a/docsrc/_build/html/api-ref/modules.html b/docsrc/_build/html/api-ref/modules.html index 1d331e8..cccb1ea 100644 --- a/docsrc/_build/html/api-ref/modules.html +++ b/docsrc/_build/html/api-ref/modules.html @@ -4,7 +4,7 @@ - reactors — reactors_sdk 1.0.0 documentation + reactors — python-reactors 1.0.0 documentation @@ -20,7 +20,7 @@ - + @@ -28,8 +28,11 @@