From 356264fa9f566e8edecbcbd4f7a7952e5a161c9d Mon Sep 17 00:00:00 2001 From: yonishelach Date: Wed, 8 Mar 2023 11:01:28 +0200 Subject: [PATCH 01/38] [Build] Fix html links, Add .html as source in documentation --- cli/marketplace/build.py | 116 ++++++++++++++++++++++++++------------- 1 file changed, 78 insertions(+), 38 deletions(-) diff --git a/cli/marketplace/build.py b/cli/marketplace/build.py index 1a6c56b76..bc6d91293 100644 --- a/cli/marketplace/build.py +++ b/cli/marketplace/build.py @@ -18,7 +18,7 @@ import subprocess import uuid from pathlib import Path -from typing import Union, Optional, Set, Dict, List +from typing import Dict, List, Optional, Set, Union import click import yaml @@ -26,13 +26,8 @@ from sphinx.cmd.build import main as sphinx_build_cmd from sphinx.ext.apidoc import main as sphinx_apidoc_cmd -from cli.helpers import ( - is_item_dir, - render_jinja, - PROJECT_ROOT, - get_item_yaml_values, - get_mock_requirements, -) +from cli.helpers import (PROJECT_ROOT, get_item_yaml_values, + get_mock_requirements, is_item_dir, render_jinja) from cli.marketplace.changelog import ChangeLog from cli.path_iterator import PathIterator @@ -68,6 +63,14 @@ default=False, help="When this flag is set, the process will output extra information", ) +@click.option( + "-f", + "--force-update", + "force_update_items", + is_flag=True, + default=False, + help="When this flag is set, item pages will be created even if the item did not changed", +) def build_marketplace_cli( source_dir: str, source_name: str, @@ -75,6 +78,7 @@ def build_marketplace_cli( temp_dir: str, channel: str, verbose: bool, + force_update_items: bool, ): build_marketplace( source_dir, @@ -83,6 +87,7 @@ def build_marketplace_cli( temp_dir, channel, verbose, + force_update_items, ) @@ -93,6 +98,7 @@ def build_marketplace( temp_dir: str = "/tmp", channel: str = "development", verbose: bool = False, + force_update_items: bool = False, ): """Main entry point to marketplace building @@ -103,6 +109,8 @@ def build_marketplace( if not provided '/tmp/' will be used :param channel: The name of the marketplace channel to write to :param verbose: When True, additional debug information will be written to stdout + :param force_update_items: If True, items will be updated unrelated if they are not changed. + The purpose of this flag is to fix existed broken pages (e.g. broken links) """ global _verbose _verbose = verbose @@ -152,9 +160,15 @@ def build_marketplace( render_html_files(temp_docs) change_log = ChangeLog() - copy_static_resources(marketplace_dir, temp_docs) + copy_resources(marketplace_dir, temp_docs) - update_or_create_items(source_dir, marketplace_dir, temp_docs, change_log) + update_or_create_items( + source_dir, + marketplace_dir, + temp_docs, + change_log, + force_update=force_update_items, + ) build_catalog_json( marketplace_dir=marketplace_dir, catalog_path=(marketplace_root / "catalog.json"), @@ -212,18 +226,22 @@ def write_index_html(marketplace_root: Union[str, Path]): shutil.copy(template_path, index_path) -def copy_static_resources(marketplace_dir, temp_docs): +def copy_resources(marketplace_dir, temp_docs): marketplace_static = marketplace_dir / "_static" - if not marketplace_static.exists(): - click.echo("Copying static resources...") - shutil.copytree(temp_docs / "_build/_static", marketplace_static) - shutil.copytree(temp_docs / "_build/_modules", marketplace_dir / "_modules") + click.echo("Copying static resources...") + shutil.copytree( + temp_docs / "_build/_static", marketplace_static, dirs_exist_ok=True + ) -def update_or_create_items(source_dir, marketplace_dir, temp_docs, change_log): +def update_or_create_items( + source_dir, marketplace_dir, temp_docs, change_log, force_update: bool = False +): click.echo("Creating items...") for item_dir in PathIterator(root=source_dir, rule=is_item_dir, as_path=True): - update_or_create_item(item_dir, marketplace_dir, temp_docs, change_log) + update_or_create_item( + item_dir, marketplace_dir, temp_docs, change_log, force_update + ) def build_catalog_json( @@ -329,17 +347,22 @@ def add_assets(item_yaml: dict): def update_or_create_item( - item_dir: Path, marketplace_dir: Path, temp_docs: Path, change_log: ChangeLog + item_dir: Path, + marketplace_dir: Path, + temp_docs: Path, + change_log: ChangeLog, + force_update: bool = False, ): # Copy source directories to target directories, if target already has the directory, archive previous version item_yaml = yaml.full_load(open(item_dir / "item.yaml", "r")) source_version = item_yaml["version"] + relative_path = "../../../" marketplace_item = marketplace_dir / item_dir.stem target_latest = marketplace_item / "latest" target_version = marketplace_item / source_version - if target_version.exists(): + if target_version.exists() and not force_update: latest_item_yaml = yaml.full_load( open(target_latest / "src" / "item.yaml", "r") ) @@ -351,16 +374,21 @@ def update_or_create_item( example_html_name = f"{item_dir.stem}_example.html" build_path = temp_docs / "_build" - source_html = marketplace_dir / "_modules" / item_dir.stem / f"{item_dir.stem}.html" - update_html_resource_paths(source_html, relative_path="../") + source_html = ( + temp_docs / "_build" / "_modules" / item_dir.stem / f"{item_dir.stem}.html" + ) + update_html_resource_paths(source_html, relative_path=relative_path) documentation_html = build_path / documentation_html_name update_html_resource_paths( - documentation_html, relative_path="../../../", with_download=False, item_name=item_dir.stem + documentation_html, + relative_path=relative_path, + with_download=False, + item_name=item_dir.stem, ) example_html = build_path / example_html_name - update_html_resource_paths(example_html, relative_path="../../../") + update_html_resource_paths(example_html, relative_path=relative_path) latest_src = target_latest / "src" version_src = target_version / "src" @@ -445,34 +473,38 @@ def update_or_create_item( def update_html_resource_paths( - html_path: Path, relative_path: str, with_download: bool = True, item_name: str = None + html_path: Path, + relative_path: str, + with_download: bool = True, + item_name: str = None, ): if html_path.exists(): with open(html_path, "r", encoding="utf8") as html: parsed = BeautifulSoup(html.read(), features="html.parser") # Update back to docs link (from source page) - back_to_docs_nodes = parsed.find_all(lambda node: "viewcode-back" in node.get("class", "")) - pattern = r"^.*?(?=.html)" + back_to_docs_nodes = parsed.find_all( + lambda node: "viewcode-back" in node.get("class", "") + ) + pattern = r"^.*?(?={})" for node in back_to_docs_nodes: - node["href"] = re.sub(pattern, "documentation", node["href"]) + node["href"] = re.sub( + pattern.format(".html"), "documentation", node["href"] + ) - # Remove _static from links and replace with src + # Fix links with relative paths: nodes = parsed.find_all( - lambda node: node.name == "link" and "_static" in node.get("href", "") + lambda node: "_static" in node.get("src", "") + or "_static" in node.get("href", "") ) for node in nodes: - node["href"] = f"{relative_path}{node['href']}" + key = "href" if "_static" in node.get("href", "") else "src" + node[key] = re.sub(pattern.format("_static"), relative_path, node[key]) - nodes = parsed.find_all( - lambda node: node.name == "script" - and node.get("src", "").startswith("_static") - ) - for node in nodes: - node["src"] = f"{relative_path}{node['src']}" if with_download: nodes = parsed.find_all(lambda node: "_sources" in node.get("href", "")) for node in nodes: + # fix path and remove example from name: node[ "href" ] = f'../{node["href"].replace("_sources", "src").replace("_example", "")}' @@ -487,7 +519,9 @@ def update_html_resource_paths( # Fix links in source page: if item_name: - nodes = parsed.find_all(lambda node: node.name == "a" and "_modules" in node.get("href", "")) + nodes = parsed.find_all( + lambda node: node.name == "a" and "_modules" in node.get("href", "") + ) for node in nodes: node["href"] = node["href"].replace(f"_modules/{item_name}/", "") @@ -653,4 +687,10 @@ def build_temp_docs(temp_root, temp_docs): if __name__ == "__main__": # build_marketplace_cli() - build_marketplace("../../", "../../../marketp", verbose=True) + build_marketplace( + source_dir="../../../functions", + marketplace_dir="../../../marketplace", + verbose=True, + channel="development", + force_update_items=True, + ) From 2202cafb5adb8fcc8cc93bb21627143a7df494fa Mon Sep 17 00:00:00 2001 From: yonishelach Date: Wed, 19 Apr 2023 09:36:25 +0300 Subject: [PATCH 02/38] Update CI temporarily and update index --- .github/workflows/test-all.yaml | 2 +- cli/marketplace/index.html | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test-all.yaml b/.github/workflows/test-all.yaml index e946b11b3..d0eb03579 100644 --- a/.github/workflows/test-all.yaml +++ b/.github/workflows/test-all.yaml @@ -167,7 +167,7 @@ jobs: pwd git pull origin cd .. - python functions/functions.py build-marketplace -s functions -m marketplace -c $CHANNEL -v + python functions/functions.py build-marketplace -s functions -m marketplace -c $CHANNEL -v -f - name: Publish marketplace release env: GITHUB_TOKEN: ${{ secrets.MARKETPLACE_ACCESS_TOKEN_V3 }} diff --git a/cli/marketplace/index.html b/cli/marketplace/index.html index b6e38cfa3..d1030e92f 100644 --- a/cli/marketplace/index.html +++ b/cli/marketplace/index.html @@ -115,6 +115,7 @@ item.example = item.example ? `${base_url}/static/example.html` : null; item.functionPath = `${base_url}/static/function.html`; item.itemPath = `${base_url}/static/item.html`; + item.code = `${base_url}/static/${item.rawName}.html`; table.addRow(item); } @@ -189,6 +190,18 @@ }, }, width: 150 + }, + { + title: "Source Code", + field: "code", + headerSort: false, + formatter: "link", + formatterParams: { + label: (cell) => { + return (cell._cell.value === undefined ? '': 'View'); + }, + }, + width: 150 }, { title: "Deployment", From 8b17c8f3dea43adcde9f9a389f16564eac082dca Mon Sep 17 00:00:00 2001 From: yonishelach Date: Wed, 19 Apr 2023 10:20:07 +0300 Subject: [PATCH 03/38] [XGB-Custom] Fix test artifact key name --- xgb_custom/test_xgb_custom.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xgb_custom/test_xgb_custom.py b/xgb_custom/test_xgb_custom.py index 6cdada74b..81b77a2e0 100644 --- a/xgb_custom/test_xgb_custom.py +++ b/xgb_custom/test_xgb_custom.py @@ -41,7 +41,7 @@ def test_local_xgb_custom(): "verbose_eval": False, "XGB_max_depth": 2, "XGB_subsample": 0.9, - "test_set_key": "./artifacts/inputs/test-set", + "test_set_key": "test-set", }, inputs={"dataset": run.artifact('xgb-outs').url}, handler="fit", From a469dcaebeea7cb8874fc05eb18b9728019cde84 Mon Sep 17 00:00:00 2001 From: yonishelach Date: Wed, 19 Apr 2023 13:43:33 +0300 Subject: [PATCH 04/38] [XGB-Serving][XGB-Test][XGB-Trainer] Fix tests - artifact key --- xgb_serving/test_xgb_serving.py | 3 +-- xgb_test/test_xgb_test.py | 2 -- xgb_trainer/test_xgb_trainer.py | 7 +++---- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/xgb_serving/test_xgb_serving.py b/xgb_serving/test_xgb_serving.py index 9f4dd8244..ce5e8aaa8 100644 --- a/xgb_serving/test_xgb_serving.py +++ b/xgb_serving/test_xgb_serving.py @@ -37,8 +37,7 @@ def test_local_xgb_serving(): "CLASS_objective": "binary:logistic", "CLASS_booster": "gbtree", "FIT_verbose": 0, - "label_column": "labels", - "test_set": "./"}, + "label_column": "labels"}, local=True, inputs={"dataset": gen_data_run.artifact('classifier-data').url}, artifact_path='./') diff --git a/xgb_test/test_xgb_test.py b/xgb_test/test_xgb_test.py index 71dfee3e2..e56b9db01 100644 --- a/xgb_test/test_xgb_test.py +++ b/xgb_test/test_xgb_test.py @@ -51,7 +51,6 @@ def xgb_trainer(): "CLASS_booster": "gbtree", "FIT_verbose": 0, "label_column": "labels", - "test_set": "./artifacts/test-set", }, local=True, inputs={"dataset": data}, @@ -111,7 +110,6 @@ def test_local_xgb_test_import_local_function(): "CLASS_booster": "gbtree", "FIT_verbose": 0, "label_column": "labels", - "test_set": "./artifacts/test-set", }, local=True, inputs={"dataset": data}, diff --git a/xgb_trainer/test_xgb_trainer.py b/xgb_trainer/test_xgb_trainer.py index 1356f72c7..52df8db48 100644 --- a/xgb_trainer/test_xgb_trainer.py +++ b/xgb_trainer/test_xgb_trainer.py @@ -29,6 +29,7 @@ def get_class_data(): 'file_ext': 'csv'}, local=True, artifact_path='./') return run + def test_xgb_trainer_code_to_function(): gen_data_run = get_class_data() fn = code_to_function(name='test_xgb_trainer', @@ -41,8 +42,7 @@ def test_xgb_trainer_code_to_function(): 'CLASS_objective': 'binary:logistic', 'CLASS_booster': 'gbtree', 'FIT_verbose': 0, - 'label_column': 'labels', - 'test_set': './'}, + 'label_column': 'labels'}, local=False, inputs={'dataset': gen_data_run.artifact('classifier-data').url}) @@ -59,8 +59,7 @@ def test_local_xgb_trainer_import_function(): 'CLASS_objective': 'binary:logistic', 'CLASS_booster': 'gbtree', 'FIT_verbose': 0, - 'label_column': 'labels', - 'test_set': './'}, + 'label_column': 'labels'}, local=True, inputs={'dataset': gen_data_run.artifact('classifier-data').url}) assert (run.artifact('model')) \ No newline at end of file From 3301415200e52326bade1e17f99cb6b6d3880860 Mon Sep 17 00:00:00 2001 From: Yoni Shelach <92271540+yonishelach@users.noreply.github.com> Date: Wed, 19 Apr 2023 19:05:40 +0300 Subject: [PATCH 05/38] [Build] Install python 3.9 when testing (#618) --- cli/helpers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/helpers.py b/cli/helpers.py index 64d5505c5..75661f345 100644 --- a/cli/helpers.py +++ b/cli/helpers.py @@ -65,7 +65,7 @@ def install_pipenv(): def install_python(directory: Union[str, Path]): print(f"Installing python for {directory}...") python_install: subprocess.CompletedProcess = subprocess.run( - f"pipenv --rm;pipenv --python 3.7", + f"pipenv --rm;pipenv --python 3.9.13", stdout=sys.stdout, stderr=subprocess.PIPE, cwd=directory, From 0cd1f1585a618c253f201b6f5a63502cdbddb591 Mon Sep 17 00:00:00 2001 From: Yoni Shelach <92271540+yonishelach@users.noreply.github.com> Date: Wed, 19 Apr 2023 19:41:19 +0300 Subject: [PATCH 06/38] [Build] Update python version in CI (#620) * [Build] Install python 3.9 when testing * [Build] Update python version in CI * . --- .github/workflows/ci.yaml | 2 +- .github/workflows/test-all.yaml | 6 +++--- cli/helpers.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 155634dfc..1ab67ffc7 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -107,7 +107,7 @@ jobs: - name: Install python uses: actions/setup-python@v2 with: - python-version: 3.7 + python-version: 3.9 # Install dependencies - uses: actions/cache@v1 id: cache diff --git a/.github/workflows/test-all.yaml b/.github/workflows/test-all.yaml index d0eb03579..fe7248bcd 100644 --- a/.github/workflows/test-all.yaml +++ b/.github/workflows/test-all.yaml @@ -70,7 +70,7 @@ jobs: - name: Install python uses: actions/setup-python@v2 with: - python-version: 3.7 + python-version: 3.9 # Install dependencies - uses: actions/cache@v1 id: cache @@ -106,7 +106,7 @@ jobs: # - name: Install python # uses: actions/setup-python@v2 # with: -# python-version: 3.7 +# python-version: 3.9 # # Install dependencies # - uses: actions/cache@v1 # id: cache @@ -153,7 +153,7 @@ jobs: - name: Install python uses: actions/setup-python@v2 with: - python-version: 3.7 + python-version: 3.9 - name: Install requirements run: | cd functions diff --git a/cli/helpers.py b/cli/helpers.py index 75661f345..b44ebc92e 100644 --- a/cli/helpers.py +++ b/cli/helpers.py @@ -65,7 +65,7 @@ def install_pipenv(): def install_python(directory: Union[str, Path]): print(f"Installing python for {directory}...") python_install: subprocess.CompletedProcess = subprocess.run( - f"pipenv --rm;pipenv --python 3.9.13", + f"pipenv --rm;pipenv --python 3.9", stdout=sys.stdout, stderr=subprocess.PIPE, cwd=directory, From 33e7ab8c43579b8609ed4f9654cc7b0d0f06671a Mon Sep 17 00:00:00 2001 From: Yoni Shelach <92271540+yonishelach@users.noreply.github.com> Date: Wed, 19 Apr 2023 19:47:50 +0300 Subject: [PATCH 07/38] Revert "[Build] Update python version in CI (#620)" (#621) This reverts commit 0cd1f1585a618c253f201b6f5a63502cdbddb591. --- .github/workflows/ci.yaml | 2 +- .github/workflows/test-all.yaml | 6 +++--- cli/helpers.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 1ab67ffc7..155634dfc 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -107,7 +107,7 @@ jobs: - name: Install python uses: actions/setup-python@v2 with: - python-version: 3.9 + python-version: 3.7 # Install dependencies - uses: actions/cache@v1 id: cache diff --git a/.github/workflows/test-all.yaml b/.github/workflows/test-all.yaml index fe7248bcd..d0eb03579 100644 --- a/.github/workflows/test-all.yaml +++ b/.github/workflows/test-all.yaml @@ -70,7 +70,7 @@ jobs: - name: Install python uses: actions/setup-python@v2 with: - python-version: 3.9 + python-version: 3.7 # Install dependencies - uses: actions/cache@v1 id: cache @@ -106,7 +106,7 @@ jobs: # - name: Install python # uses: actions/setup-python@v2 # with: -# python-version: 3.9 +# python-version: 3.7 # # Install dependencies # - uses: actions/cache@v1 # id: cache @@ -153,7 +153,7 @@ jobs: - name: Install python uses: actions/setup-python@v2 with: - python-version: 3.9 + python-version: 3.7 - name: Install requirements run: | cd functions diff --git a/cli/helpers.py b/cli/helpers.py index b44ebc92e..75661f345 100644 --- a/cli/helpers.py +++ b/cli/helpers.py @@ -65,7 +65,7 @@ def install_pipenv(): def install_python(directory: Union[str, Path]): print(f"Installing python for {directory}...") python_install: subprocess.CompletedProcess = subprocess.run( - f"pipenv --rm;pipenv --python 3.9", + f"pipenv --rm;pipenv --python 3.9.13", stdout=sys.stdout, stderr=subprocess.PIPE, cwd=directory, From 7a7473b8f41e80032f381d927214a9076a4a55b8 Mon Sep 17 00:00:00 2001 From: Yoni Shelach <92271540+yonishelach@users.noreply.github.com> Date: Wed, 19 Apr 2023 19:48:09 +0300 Subject: [PATCH 08/38] Revert "[Build] Install python 3.9 when testing (#618)" (#619) This reverts commit 3301415200e52326bade1e17f99cb6b6d3880860. --- cli/helpers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/helpers.py b/cli/helpers.py index 75661f345..64d5505c5 100644 --- a/cli/helpers.py +++ b/cli/helpers.py @@ -65,7 +65,7 @@ def install_pipenv(): def install_python(directory: Union[str, Path]): print(f"Installing python for {directory}...") python_install: subprocess.CompletedProcess = subprocess.run( - f"pipenv --rm;pipenv --python 3.9.13", + f"pipenv --rm;pipenv --python 3.7", stdout=sys.stdout, stderr=subprocess.PIPE, cwd=directory, From 81437da88e99ed48a9e1b0b0b367c4c02db80140 Mon Sep 17 00:00:00 2001 From: Yoni Shelach <92271540+yonishelach@users.noreply.github.com> Date: Wed, 19 Apr 2023 20:26:27 +0300 Subject: [PATCH 09/38] [Build] Build with python 3.9 (#622) * [Build] Build with python 3.9 * . --- .github/workflows/ci.yaml | 5 +++++ .github/workflows/test-all.yaml | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 155634dfc..5b4bfcd79 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -108,6 +108,11 @@ jobs: uses: actions/setup-python@v2 with: python-version: 3.7 + # Install python 3.9 + - name: Install python 3.9 + uses: actions/setup-python@v2 + with: + python-version: 3.9 # Install dependencies - uses: actions/cache@v1 id: cache diff --git a/.github/workflows/test-all.yaml b/.github/workflows/test-all.yaml index d0eb03579..5eff03b0f 100644 --- a/.github/workflows/test-all.yaml +++ b/.github/workflows/test-all.yaml @@ -150,10 +150,10 @@ jobs: with: repository: mlrun/marketplace path: marketplace - - name: Install python + - name: Install python 3.9 uses: actions/setup-python@v2 with: - python-version: 3.7 + python-version: 3.9 - name: Install requirements run: | cd functions From 88727986ffa91662593958023be8ac3ccef2cab0 Mon Sep 17 00:00:00 2001 From: Avi Asulin Date: Sun, 7 Apr 2024 21:10:55 +0300 Subject: [PATCH 10/38] [onnx utils] update onnx utils packages --- onnx_utils/function.yaml | 42 +++++++++++++++++------------------ onnx_utils/item.yaml | 16 ++++++------- onnx_utils/requirements.txt | 12 +++++----- onnx_utils/test_onnx_utils.py | 4 ++-- 4 files changed, 36 insertions(+), 38 deletions(-) diff --git a/onnx_utils/function.yaml b/onnx_utils/function.yaml index 7a0054c4d..88f810fb4 100644 --- a/onnx_utils/function.yaml +++ b/onnx_utils/function.yaml @@ -2,7 +2,7 @@ kind: job metadata: name: onnx-utils tag: '' - hash: 0c4a6491b976d5220d3ebfb83a3905dd47e86be2 + hash: fd6cd909ef6e055c348b44a0313e190513cd755b project: '' labels: author: guyl @@ -16,16 +16,16 @@ spec: functionSourceCode: IyBDb3B5cmlnaHQgMjAxOSBJZ3VhemlvCiMKIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiMKZnJvbSB0eXBpbmcgaW1wb3J0IEFueSwgQ2FsbGFibGUsIERpY3QsIExpc3QsIFR1cGxlCgppbXBvcnQgbWxydW4KCgpjbGFzcyBfVG9PTk5YQ29udmVyc2lvbnM6CiAgICAiIiIKICAgIEFuIE9OTlggY29udmVyc2lvbiBmdW5jdGlvbnMgbGlicmFyeSBjbGFzcy4KICAgICIiIgoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiB0Zl9rZXJhc190b19vbm54KAogICAgICAgIG1vZGVsX2hhbmRsZXIsCiAgICAgICAgb25ueF9tb2RlbF9uYW1lOiBzdHIgPSBOb25lLAogICAgICAgIG9wdGltaXplX21vZGVsOiBib29sID0gVHJ1ZSwKICAgICAgICBpbnB1dF9zaWduYXR1cmU6IExpc3RbVHVwbGVbVHVwbGVbaW50XSwgc3RyXV0gPSBOb25lLAogICAgKToKICAgICAgICAiIiIKICAgICAgICBDb252ZXJ0IGEgVEYuS2VyYXMgbW9kZWwgdG8gYW4gT05OWCBtb2RlbCBhbmQgbG9nIGl0IGJhY2sgdG8gTUxSdW4gYXMgYSBuZXcgbW9kZWwgb2JqZWN0LgoKICAgICAgICA6cGFyYW0gbW9kZWxfaGFuZGxlcjogICBBbiBpbml0aWFsaXplZCBURktlcmFzTW9kZWxIYW5kbGVyIHdpdGggYSBsb2FkZWQgbW9kZWwgdG8gY29udmVydCB0byBPTk5YLgogICAgICAgIDpwYXJhbSBvbm54X21vZGVsX25hbWU6IFRoZSBuYW1lIHRvIHVzZSB0byBsb2cgdGhlIGNvbnZlcnRlZCBPTk5YIG1vZGVsLiBJZiBub3QgZ2l2ZW4sIHRoZSBnaXZlbiBgbW9kZWxfbmFtZWAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHVzZWQgd2l0aCBhbiBhZGRpdGlvbmFsIHN1ZmZpeCBgX29ubnhgLiBEZWZhdWx0ZWQgdG8gTm9uZS4KICAgICAgICA6cGFyYW0gb3B0aW1pemVfbW9kZWw6ICBXaGV0aGVyIG9yIG5vdCB0byBvcHRpbWl6ZSB0aGUgT05OWCBtb2RlbCB1c2luZyAnb25ueG9wdGltaXplcicgYmVmb3JlIHNhdmluZyB0aGUgbW9kZWwuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdGVkIHRvIFRydWUuCiAgICAgICAgOnBhcmFtIGlucHV0X3NpZ25hdHVyZTogQSBsaXN0IG9mIHRoZSBpbnB1dCBsYXllcnMgc2hhcGUgYW5kIGRhdGEgdHlwZSBwcm9wZXJ0aWVzLiBFeHBlY3RlZCB0byByZWNlaXZlIGEgbGlzdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIGVhY2ggZWxlbWVudCBpcyBhbiBpbnB1dCBsYXllciB0dXBsZS4gQW4gaW5wdXQgbGF5ZXIgdHVwbGUgaXMgYSB0dXBsZSBvZjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMF0gPSBMYXllcidzIHNoYXBlLCBhIHR1cGxlIG9mIGludGVnZXJzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxXSA9IExheWVyJ3MgZGF0YSB0eXBlLCBhIG1scnVuLmRhdGFfdHlwZXMuVmFsdWVUeXBlIHN0cmluZy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBOb25lLCB0aGUgaW5wdXQgc2lnbmF0dXJlIHdpbGwgYmUgdHJpZWQgdG8gYmUgcmVhZCBmcm9tIHRoZSBtb2RlbCBhcnRpZmFjdC4gRGVmYXVsdGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gTm9uZS4KICAgICAgICAiIiIKICAgICAgICAjIEltcG9ydCB0aGUgZnJhbWV3b3JrIGFuZCBoYW5kbGVyOgogICAgICAgIGltcG9ydCB0ZW5zb3JmbG93IGFzIHRmCiAgICAgICAgZnJvbSBtbHJ1bi5mcmFtZXdvcmtzLnRmX2tlcmFzIGltcG9ydCBURktlcmFzVXRpbHMKCiAgICAgICAgIyBDaGVjayB0aGUgZ2l2ZW4gJ2lucHV0X3NpZ25hdHVyZScgcGFyYW1ldGVyOgogICAgICAgIGlmIGlucHV0X3NpZ25hdHVyZSBpcyBOb25lOgogICAgICAgICAgICAjIFJlYWQgdGhlIGlucHV0cyBmcm9tIHRoZSBtb2RlbDoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgbW9kZWxfaGFuZGxlci5yZWFkX2lucHV0c19mcm9tX21vZGVsKCkKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlcnJvcjoKICAgICAgICAgICAgICAgIHJhaXNlIG1scnVuLmVycm9ycy5NTFJ1blJ1bnRpbWVFcnJvcigKICAgICAgICAgICAgICAgICAgICBmIlBsZWFzZSBwcm92aWRlIHRoZSAnaW5wdXRfc2lnbmF0dXJlJyBwYXJhbWV0ZXIuIFRoZSBmdW5jdGlvbiB0cmllZCByZWFkaW5nIHRoZSBpbnB1dCBsYXllcnMgIgogICAgICAgICAgICAgICAgICAgIGYiaW5mb3JtYXRpb24gYXV0b21hdGljYWxseSBidXQgZmFpbGVkIHdpdGggdGhlIGZvbGxvd2luZyBlcnJvcjoge2Vycm9yfSIKICAgICAgICAgICAgICAgICkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIFBhcnNlIHRoZSAnaW5wdXRfc2lnbmF0dXJlJyBwYXJhbWV0ZXI6CiAgICAgICAgICAgIGlucHV0X3NpZ25hdHVyZSA9IFsKICAgICAgICAgICAgICAgIHRmLlRlbnNvclNwZWMoCiAgICAgICAgICAgICAgICAgICAgc2hhcGU9c2hhcGUsCiAgICAgICAgICAgICAgICAgICAgZHR5cGU9VEZLZXJhc1V0aWxzLmNvbnZlcnRfdmFsdWVfdHlwZV90b190Zl9kdHlwZSgKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZT12YWx1ZV90eXBlCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGZvciAoc2hhcGUsIHZhbHVlX3R5cGUpIGluIGlucHV0X3NpZ25hdHVyZQogICAgICAgICAgICBdCgogICAgICAgICMgQ29udmVydCB0byBPTk5YOgogICAgICAgIG1vZGVsX2hhbmRsZXIudG9fb25ueCgKICAgICAgICAgICAgbW9kZWxfbmFtZT1vbm54X21vZGVsX25hbWUsCiAgICAgICAgICAgIGlucHV0X3NpZ25hdHVyZT1pbnB1dF9zaWduYXR1cmUsCiAgICAgICAgICAgIG9wdGltaXplPW9wdGltaXplX21vZGVsLAogICAgICAgICkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgcHl0b3JjaF90b19vbm54KAogICAgICAgIG1vZGVsX2hhbmRsZXIsCiAgICAgICAgb25ueF9tb2RlbF9uYW1lOiBzdHIgPSBOb25lLAogICAgICAgIG9wdGltaXplX21vZGVsOiBib29sID0gVHJ1ZSwKICAgICAgICBpbnB1dF9zaWduYXR1cmU6IExpc3RbVHVwbGVbVHVwbGVbaW50LCAuLi5dLCBzdHJdXSA9IE5vbmUsCiAgICAgICAgaW5wdXRfbGF5ZXJzX25hbWVzOiBMaXN0W3N0cl0gPSBOb25lLAogICAgICAgIG91dHB1dF9sYXllcnNfbmFtZXM6IExpc3Rbc3RyXSA9IE5vbmUsCiAgICAgICAgZHluYW1pY19heGVzOiBEaWN0W3N0ciwgRGljdFtpbnQsIHN0cl1dID0gTm9uZSwKICAgICAgICBpc19iYXRjaGVkOiBib29sID0gVHJ1ZSwKICAgICk6CiAgICAgICAgIiIiCiAgICAgICAgQ29udmVydCBhIFB5VG9yY2ggbW9kZWwgdG8gYW4gT05OWCBtb2RlbCBhbmQgbG9nIGl0IGJhY2sgdG8gTUxSdW4gYXMgYSBuZXcgbW9kZWwgb2JqZWN0LgoKICAgICAgICA6cGFyYW0gbW9kZWxfaGFuZGxlcjogICAgICAgQW4gaW5pdGlhbGl6ZWQgUHlUb3JjaE1vZGVsSGFuZGxlciB3aXRoIGEgbG9hZGVkIG1vZGVsIHRvIGNvbnZlcnQgdG8gT05OWC4KICAgICAgICA6cGFyYW0gb25ueF9tb2RlbF9uYW1lOiAgICAgVGhlIG5hbWUgdG8gdXNlIHRvIGxvZyB0aGUgY29udmVydGVkIE9OTlggbW9kZWwuIElmIG5vdCBnaXZlbiwgdGhlIGdpdmVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBtb2RlbF9uYW1lYCB3aWxsIGJlIHVzZWQgd2l0aCBhbiBhZGRpdGlvbmFsIHN1ZmZpeCBgX29ubnhgLiBEZWZhdWx0ZWQgdG8gTm9uZS4KICAgICAgICA6cGFyYW0gb3B0aW1pemVfbW9kZWw6ICAgICAgV2hldGhlciBvciBub3QgdG8gb3B0aW1pemUgdGhlIE9OTlggbW9kZWwgdXNpbmcgJ29ubnhvcHRpbWl6ZXInIGJlZm9yZSBzYXZpbmcgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLiBEZWZhdWx0ZWQgdG8gVHJ1ZS4KICAgICAgICA6cGFyYW0gaW5wdXRfc2lnbmF0dXJlOiAgICAgQSBsaXN0IG9mIHRoZSBpbnB1dCBsYXllcnMgc2hhcGUgYW5kIGRhdGEgdHlwZSBwcm9wZXJ0aWVzLiBFeHBlY3RlZCB0byByZWNlaXZlIGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCB3aGVyZSBlYWNoIGVsZW1lbnQgaXMgYW4gaW5wdXQgbGF5ZXIgdHVwbGUuIEFuIGlucHV0IGxheWVyIHR1cGxlIGlzIGEgdHVwbGUgb2Y6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswXSA9IExheWVyJ3Mgc2hhcGUsIGEgdHVwbGUgb2YgaW50ZWdlcnMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxXSA9IExheWVyJ3MgZGF0YSB0eXBlLCBhIG1scnVuLmRhdGFfdHlwZXMuVmFsdWVUeXBlIHN0cmluZy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgTm9uZSwgdGhlIGlucHV0IHNpZ25hdHVyZSB3aWxsIGJlIHRyaWVkIHRvIGJlIHJlYWQgZnJvbSB0aGUgbW9kZWwgYXJ0aWZhY3QuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRlZCB0byBOb25lLgogICAgICAgIDpwYXJhbSBpbnB1dF9sYXllcnNfbmFtZXM6ICBMaXN0IG9mIG5hbWVzIHRvIGFzc2lnbiB0byB0aGUgaW5wdXQgbm9kZXMgb2YgdGhlIGdyYXBoIGluIG9yZGVyLiBBbGwgb2YgdGhlIG90aGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgKGlubmVyIGxheWVycykgY2FuIGJlIHNldCBhcyB3ZWxsIGJ5IHBhc3NpbmcgYWRkaXRpb25hbCBuYW1lcyBpbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC4gVGhlIG9yZGVyIGlzIGJ5IHRoZSBvcmRlciBvZiB0aGUgcGFyYW1ldGVycyBpbiB0aGUgbW9kZWwuIElmIE5vbmUsIHRoZSBpbnB1dHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSByZWFkIGZyb20gdGhlIGhhbmRsZXIncyBpbnB1dHMuIElmIGl0cyBhbHNvIE5vbmUsIGl0IGlzIGRlZmF1bHRlZCB0bzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlucHV0XzAiLCAiaW5wdXRfMSIsIC4uLgogICAgICAgIDpwYXJhbSBvdXRwdXRfbGF5ZXJzX25hbWVzOiBMaXN0IG9mIG5hbWVzIHRvIGFzc2lnbiB0byB0aGUgb3V0cHV0IG5vZGVzIG9mIHRoZSBncmFwaCBpbiBvcmRlci4gSWYgTm9uZSwgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dHMgd2lsbCBiZSByZWFkIGZyb20gdGhlIGhhbmRsZXIncyBvdXRwdXRzLiBJZiBpdHMgYWxzbyBOb25lLCBpdCBpcyBkZWZhdWx0ZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG86ICJvdXRwdXRfMCIgKGZvciBtdWx0aXBsZSBvdXRwdXRzLCB0aGlzIHBhcmFtZXRlciBtdXN0IGJlIHByb3ZpZGVkKS4KICAgICAgICA6cGFyYW0gZHluYW1pY19heGVzOiAgICAgICAgSWYgcGFydCBvZiB0aGUgaW5wdXQgLyBvdXRwdXQgc2hhcGUgaXMgZHluYW1pYywgbGlrZSAoYmF0Y2hfc2l6ZSwgMywgMzIsIDMyKSB5b3UgY2FuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZnkgaXQgYnkgZ2l2aW5nIGEgZHluYW1pYyBheGlzIHRvIHRoZSBpbnB1dCAvIG91dHB1dCBsYXllciBieSBpdHMgbmFtZSBhcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5wdXQgbGF5ZXIgbmFtZSI6IHswOiAiYmF0Y2hfc2l6ZSJ9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dHB1dCBsYXllciBuYW1lIjogezA6ICJiYXRjaF9zaXplIn0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgcHJvdmlkZWQsIHRoZSAnaXNfYmF0Y2hlZCcgZmxhZyB3aWxsIGJlIGlnbm9yZWQuIERlZmF1bHRlZCB0byBOb25lLgogICAgICAgIDpwYXJhbSBpc19iYXRjaGVkOiAgICAgICAgICBXaGV0aGVyIHRvIGluY2x1ZGUgYSBiYXRjaCBzaXplIGFzIHRoZSBmaXJzdCBheGlzIGluIGV2ZXJ5IGlucHV0IGFuZCBvdXRwdXQgbGF5ZXIuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRlZCB0byBUcnVlLiBXaWxsIGJlIGlnbm9yZWQgaWYgJ2R5bmFtaWNfYXhlcycgaXMgcHJvdmlkZWQuCiAgICAgICAgIiIiCiAgICAgICAgIyBJbXBvcnQgdGhlIGZyYW1ld29yayBhbmQgaGFuZGxlcjoKICAgICAgICBpbXBvcnQgdG9yY2gKICAgICAgICBmcm9tIG1scnVuLmZyYW1ld29ya3MucHl0b3JjaCBpbXBvcnQgUHlUb3JjaFV0aWxzCgogICAgICAgICMgUGFyc2UgdGhlICdpbnB1dF9zaWduYXR1cmUnIHBhcmFtZXRlcjoKICAgICAgICBpZiBpbnB1dF9zaWduYXR1cmUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlucHV0X3NpZ25hdHVyZSA9IHR1cGxlKAogICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgIHRvcmNoLnplcm9zKAogICAgICAgICAgICAgICAgICAgICAgICBzaXplPXNoYXBlLAogICAgICAgICAgICAgICAgICAgICAgICBkdHlwZT1QeVRvcmNoVXRpbHMuY29udmVydF92YWx1ZV90eXBlX3RvX3RvcmNoX2R0eXBlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZT12YWx1ZV90eXBlCiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIGZvciAoc2hhcGUsIHZhbHVlX3R5cGUpIGluIGlucHV0X3NpZ25hdHVyZQogICAgICAgICAgICAgICAgXQogICAgICAgICAgICApCgogICAgICAgICMgQ29udmVydCB0byBPTk5YOgogICAgICAgIG1vZGVsX2hhbmRsZXIudG9fb25ueCgKICAgICAgICAgICAgbW9kZWxfbmFtZT1vbm54X21vZGVsX25hbWUsCiAgICAgICAgICAgIGlucHV0X3NhbXBsZT1pbnB1dF9zaWduYXR1cmUsCiAgICAgICAgICAgIG9wdGltaXplPW9wdGltaXplX21vZGVsLAogICAgICAgICAgICBpbnB1dF9sYXllcnNfbmFtZXM9aW5wdXRfbGF5ZXJzX25hbWVzLAogICAgICAgICAgICBvdXRwdXRfbGF5ZXJzX25hbWVzPW91dHB1dF9sYXllcnNfbmFtZXMsCiAgICAgICAgICAgIGR5bmFtaWNfYXhlcz1keW5hbWljX2F4ZXMsCiAgICAgICAgICAgIGlzX2JhdGNoZWQ9aXNfYmF0Y2hlZAogICAgICAgICkKCgojIE1hcCBmb3IgZ2V0dGluZyB0aGUgY29udmVyc2lvbiBmdW5jdGlvbiBhY2NvcmRpbmcgdG8gdGhlIHByb3ZpZGVkIGZyYW1ld29yazoKX0NPTlZFUlNJT05fTUFQID0gewogICAgInRlbnNvcmZsb3cua2VyYXMiOiBfVG9PTk5YQ29udmVyc2lvbnMudGZfa2VyYXNfdG9fb25ueCwKICAgICJ0b3JjaCI6IF9Ub09OTlhDb252ZXJzaW9ucy5weXRvcmNoX3RvX29ubngsCn0gICMgdHlwZTogRGljdFtzdHIsIENhbGxhYmxlXQoKCmRlZiB0b19vbm54KAogICAgY29udGV4dDogbWxydW4uTUxDbGllbnRDdHgsCiAgICBtb2RlbF9wYXRoOiBzdHIsCiAgICBvbm54X21vZGVsX25hbWU6IHN0ciA9IE5vbmUsCiAgICBvcHRpbWl6ZV9tb2RlbDogYm9vbCA9IFRydWUsCiAgICBmcmFtZXdvcmtfa3dhcmdzOiBEaWN0W3N0ciwgQW55XSA9IE5vbmUsCik6CiAgICAiIiIKICAgIENvbnZlcnQgdGhlIGdpdmVuIG1vZGVsIHRvIGFuIE9OTlggbW9kZWwuCgogICAgOnBhcmFtIGNvbnRleHQ6ICAgICAgICAgIFRoZSBNTFJ1biBmdW5jdGlvbiBleGVjdXRpb24gY29udGV4dAogICAgOnBhcmFtIG1vZGVsX3BhdGg6ICAgICAgIFRoZSBtb2RlbCBwYXRoIHN0b3JlIG9iamVjdC4KICAgIDpwYXJhbSBvbm54X21vZGVsX25hbWU6ICBUaGUgbmFtZSB0byB1c2UgdG8gbG9nIHRoZSBjb252ZXJ0ZWQgT05OWCBtb2RlbC4gSWYgbm90IGdpdmVuLCB0aGUgZ2l2ZW4gYG1vZGVsX25hbWVgIHdpbGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSB1c2VkIHdpdGggYW4gYWRkaXRpb25hbCBzdWZmaXggYF9vbm54YC4gRGVmYXVsdGVkIHRvIE5vbmUuCiAgICA6cGFyYW0gb3B0aW1pemVfbW9kZWw6ICAgV2hldGhlciB0byBvcHRpbWl6ZSB0aGUgT05OWCBtb2RlbCB1c2luZyAnb25ueG9wdGltaXplcicgYmVmb3JlIHNhdmluZyB0aGUgbW9kZWwuIERlZmF1bHRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFRydWUuCiAgICA6cGFyYW0gZnJhbWV3b3JrX2t3YXJnczogQWRkaXRpb25hbCBhcmd1bWVudHMgZWFjaCBmcmFtZXdvcmsgbWF5IHJlcXVpcmUgaW4gb3JkZXIgdG8gY29udmVydCB0byBPTk5YLiBUbyBnZXQgdGhlIGRvYwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBvZiB0aGUgZGVzaXJlZCBmcmFtZXdvcmsgb25ueCBjb252ZXJzaW9uIGZ1bmN0aW9uLCBwYXNzICJoZWxwIi4KICAgICIiIgogICAgZnJvbSBtbHJ1bi5mcmFtZXdvcmtzLmF1dG9fbWxydW4uYXV0b19tbHJ1biBpbXBvcnQgQXV0b01MUnVuCgogICAgIyBHZXQgYSBtb2RlbCBoYW5kbGVyIG9mIHRoZSByZXF1aXJlZCBmcmFtZXdvcms6CiAgICBtb2RlbF9oYW5kbGVyID0gQXV0b01MUnVuLmxvYWRfbW9kZWwobW9kZWxfcGF0aD1tb2RlbF9wYXRoLCBjb250ZXh0PWNvbnRleHQpCgogICAgIyBHZXQgdGhlIG1vZGVsJ3MgZnJhbWV3b3JrOgogICAgZnJhbWV3b3JrID0gbW9kZWxfaGFuZGxlci5GUkFNRVdPUktfTkFNRQoKICAgICMgVXNlIHRoZSBjb252ZXJzaW9uIG1hcCB0byBnZXQgdGhlIHNwZWNpZmljIGZyYW1ld29yayB0byBvbm54IGNvbnZlcnNpb246CiAgICBpZiBmcmFtZXdvcmsgbm90IGluIF9DT05WRVJTSU9OX01BUDoKICAgICAgICByYWlzZSBtbHJ1bi5lcnJvcnMuTUxSdW5JbnZhbGlkQXJndW1lbnRFcnJvcigKICAgICAgICAgICAgZiJUaGUgZm9sbG93aW5nIGZyYW1ld29yazogJ3tmcmFtZXdvcmt9JywgaGFzIG5vIE9OTlggY29udmVyc2lvbi4iCiAgICAgICAgKQogICAgY29udmVyc2lvbl9mdW5jdGlvbiA9IF9DT05WRVJTSU9OX01BUFtmcmFtZXdvcmtdCgogICAgIyBDaGVjayBpZiBuZWVkZWQgdG8gcHJpbnQgdGhlIGZ1bmN0aW9uJ3MgZG9jIHN0cmluZyAoImhlbHAiIGlzIHBhc3NlZCk6CiAgICBpZiBmcmFtZXdvcmtfa3dhcmdzID09ICJoZWxwIjoKICAgICAgICBwcmludChjb252ZXJzaW9uX2Z1bmN0aW9uLl9fZG9jX18pCiAgICAgICAgcmV0dXJuCgogICAgIyBTZXQgdGhlIGRlZmF1bHQgZW1wdHkgZnJhbWV3b3JrIGt3YXJncyBpZiBuZWVkZWQ6CiAgICBpZiBmcmFtZXdvcmtfa3dhcmdzIGlzIE5vbmU6CiAgICAgICAgZnJhbWV3b3JrX2t3YXJncyA9IHt9CgogICAgIyBSdW4gdGhlIGNvbnZlcnNpb246CiAgICB0cnk6CiAgICAgICAgY29udmVyc2lvbl9mdW5jdGlvbigKICAgICAgICAgICAgbW9kZWxfaGFuZGxlcj1tb2RlbF9oYW5kbGVyLAogICAgICAgICAgICBvbm54X21vZGVsX25hbWU9b25ueF9tb2RlbF9uYW1lLAogICAgICAgICAgICBvcHRpbWl6ZV9tb2RlbD1vcHRpbWl6ZV9tb2RlbCwKICAgICAgICAgICAgKipmcmFtZXdvcmtfa3dhcmdzLAogICAgICAgICkKICAgIGV4Y2VwdCBUeXBlRXJyb3IgYXMgZXhjZXB0aW9uOgogICAgICAgIHJhaXNlIG1scnVuLmVycm9ycy5NTFJ1bkludmFsaWRBcmd1bWVudEVycm9yKAogICAgICAgICAgICBmIkVSUk9SOiBBIFR5cGVFcnJvciBleGNlcHRpb24gd2FzIHJhaXNlZCBkdXJpbmcgdGhlIGNvbnZlcnNpb246XG57ZXhjZXB0aW9ufS4gIgogICAgICAgICAgICBmIlBsZWFzZSByZWFkIHRoZSB7ZnJhbWV3b3JrfSBmcmFtZXdvcmsgY29udmVyc2lvbiBmdW5jdGlvbiBkb2Mgc3RyaW5nIGJ5IHBhc3NpbmcgJ2hlbHAnIGluIHRoZSAiCiAgICAgICAgICAgIGYiJ2ZyYW1ld29ya19rd2FyZ3MnIGRpY3Rpb25hcnkgcGFyYW1ldGVyLiIKICAgICAgICApCgoKZGVmIG9wdGltaXplKAogICAgY29udGV4dDogbWxydW4uTUxDbGllbnRDdHgsCiAgICBtb2RlbF9wYXRoOiBzdHIsCiAgICBvcHRpbWl6YXRpb25zOiBMaXN0W3N0cl0gPSBOb25lLAogICAgZml4ZWRfcG9pbnQ6IGJvb2wgPSBGYWxzZSwKICAgIG9wdGltaXplZF9tb2RlbF9uYW1lOiBzdHIgPSBOb25lLAopOgogICAgIiIiCiAgICBPcHRpbWl6ZSB0aGUgZ2l2ZW4gT05OWCBtb2RlbC4KCiAgICA6cGFyYW0gY29udGV4dDogICAgICAgICAgICAgIFRoZSBNTFJ1biBmdW5jdGlvbiBleGVjdXRpb24gY29udGV4dC4KICAgIDpwYXJhbSBtb2RlbF9wYXRoOiAgICAgICAgICAgUGF0aCB0byB0aGUgT05OWCBtb2RlbCBvYmplY3QuCiAgICA6cGFyYW0gb3B0aW1pemF0aW9uczogICAgICAgIExpc3Qgb2YgcG9zc2libGUgb3B0aW1pemF0aW9ucy4gVG8gc2VlIHdoYXQgb3B0aW1pemF0aW9ucyBhcmUgYXZhaWxhYmxlLCBwYXNzICJoZWxwIi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgTm9uZSwgYWxsIG9mIHRoZSBvcHRpbWl6YXRpb25zIHdpbGwgYmUgdXNlZC4gRGVmYXVsdGVkIHRvIE5vbmUuCiAgICA6cGFyYW0gZml4ZWRfcG9pbnQ6ICAgICAgICAgIE9wdGltaXplIHRoZSB3ZWlnaHRzIHVzaW5nIGZpeGVkIHBvaW50LiBEZWZhdWx0ZWQgdG8gRmFsc2UuCiAgICA6cGFyYW0gb3B0aW1pemVkX21vZGVsX25hbWU6IFRoZSBuYW1lIG9mIHRoZSBvcHRpbWl6ZWQgbW9kZWwuIElmIE5vbmUsIHRoZSBvcmlnaW5hbCBtb2RlbCB3aWxsIGJlIG92ZXJyaWRkZW4uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRlZCB0byBOb25lLgogICAgIiIiCiAgICAjIEltcG9ydCB0aGUgbW9kZWwgaGFuZGxlcjoKICAgIGltcG9ydCBvbm54b3B0aW1pemVyCiAgICBmcm9tIG1scnVuLmZyYW1ld29ya3Mub25ueCBpbXBvcnQgT05OWE1vZGVsSGFuZGxlcgoKICAgICMgQ2hlY2sgaWYgbmVlZGVkIHRvIHByaW50IHRoZSBhdmFpbGFibGUgb3B0aW1pemF0aW9ucyAoImhlbHAiIGlzIHBhc3NlZCk6CiAgICBpZiBvcHRpbWl6YXRpb25zID09ICJoZWxwIjoKICAgICAgICBhdmFpbGFibGVfcGFzc2VzID0gIlxuKiAiLmpvaW4ob25ueG9wdGltaXplci5nZXRfYXZhaWxhYmxlX3Bhc3NlcygpKQogICAgICAgIHByaW50KGYiVGhlIGF2YWlsYWJsZSBvcHRpbWl6YXRpb25zIGFyZTpcbioge2F2YWlsYWJsZV9wYXNzZXN9IikKICAgICAgICByZXR1cm4KCiAgICAjIENyZWF0ZSB0aGUgbW9kZWwgaGFuZGxlcjoKICAgIG1vZGVsX2hhbmRsZXIgPSBPTk5YTW9kZWxIYW5kbGVyKAogICAgICAgIG1vZGVsX3BhdGg9bW9kZWxfcGF0aCwgY29udGV4dD1jb250ZXh0CiAgICApCgogICAgIyBMb2FkIHRoZSBPTk5YIG1vZGVsOgogICAgbW9kZWxfaGFuZGxlci5sb2FkKCkKCiAgICAjIE9wdGltaXplIHRoZSBtb2RlbCB1c2luZyB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbnM6CiAgICBtb2RlbF9oYW5kbGVyLm9wdGltaXplKG9wdGltaXphdGlvbnM9b3B0aW1pemF0aW9ucywgZml4ZWRfcG9pbnQ9Zml4ZWRfcG9pbnQpCgogICAgIyBSZW5hbWUgaWYgbmVlZGVkOgogICAgaWYgb3B0aW1pemVkX21vZGVsX25hbWUgaXMgbm90IE5vbmU6CiAgICAgICAgbW9kZWxfaGFuZGxlci5zZXRfbW9kZWxfbmFtZShtb2RlbF9uYW1lPW9wdGltaXplZF9tb2RlbF9uYW1lKQoKICAgICMgTG9nIHRoZSBvcHRpbWl6ZWQgbW9kZWw6CiAgICBtb2RlbF9oYW5kbGVyLmxvZygpCg== base_image: mlrun/mlrun commands: [] - code_origin: https://github.com/yonishelach/functions.git#f84b9565a33d8159315992ebba5838d41f6cc112:/Users/Yonatan_Shelach/projects/functions/onnx_utils/onnx_utils.py - origin_filename: /Users/Yonatan_Shelach/projects/functions/onnx_utils/onnx_utils.py + code_origin: '' + origin_filename: '' with_mlrun: false auto_build: true requirements: - - onnx~=1.13.0 - - onnxruntime~=1.14.0 - - onnxoptimizer~=0.3.0 - - onnxmltools~=1.11.0 - - tf2onnx~=1.13.0 + - onnx~=1.15.0 + - onnxruntime~=1.8.1 + - onnxoptimizer~=0.2.0 + - onnxmltools~=1.9.0 + - tf2onnx~=1.16.0 entry_points: tf_keras_to_onnx: name: tf_keras_to_onnx @@ -35,7 +35,6 @@ spec: - name: model_handler doc: An initialized TFKerasModelHandler with a loaded model to convert to ONNX. - default: '' - name: onnx_model_name type: str doc: The name to use to log the converted ONNX model. If not given, the given @@ -55,9 +54,10 @@ spec: data type, a mlrun.data_types.ValueType string. If None, the input signature will be tried to be read from the model artifact. Defaulted to None.' default: null - outputs: - - default: '' + outputs: [] lineno: 26 + has_varargs: false + has_kwargs: false pytorch_to_onnx: name: pytorch_to_onnx doc: Convert a PyTorch model to an ONNX model and log it back to MLRun as a @@ -66,7 +66,6 @@ spec: - name: model_handler doc: An initialized PyTorchModelHandler with a loaded model to convert to ONNX. - default: '' - name: onnx_model_name type: str doc: The name to use to log the converted ONNX model. If not given, the given @@ -114,9 +113,10 @@ spec: doc: Whether to include a batch size as the first axis in every input and output layer. Defaulted to True. Will be ignored if 'dynamic_axes' is provided. default: true - outputs: - - default: '' + outputs: [] lineno: 81 + has_varargs: false + has_kwargs: false to_onnx: name: to_onnx doc: Convert the given model to an ONNX model. @@ -124,11 +124,9 @@ spec: - name: context type: MLClientCtx doc: The MLRun function execution context - default: '' - name: model_path type: str doc: The model path store object. - default: '' - name: onnx_model_name type: str doc: The name to use to log the converted ONNX model. If not given, the given @@ -146,9 +144,10 @@ spec: ONNX. To get the doc string of the desired framework onnx conversion function, pass "help". default: null - outputs: - - default: '' + outputs: [] lineno: 160 + has_varargs: false + has_kwargs: false optimize: name: optimize doc: Optimize the given ONNX model. @@ -156,11 +155,9 @@ spec: - name: context type: MLClientCtx doc: The MLRun function execution context. - default: '' - name: model_path type: str doc: Path to the ONNX model object. - default: '' - name: optimizations type: List[str] doc: List of possible optimizations. To see what optimizations are available, @@ -176,9 +173,10 @@ spec: doc: The name of the optimized model. If None, the original model will be overridden. Defaulted to None. default: null - outputs: - - default: '' + outputs: [] lineno: 219 + has_varargs: false + has_kwargs: false description: ONNX intigration in MLRun, some utils functions for the ONNX framework, optimizing and converting models from different framework to ONNX using MLRun. default_handler: to_onnx diff --git a/onnx_utils/item.yaml b/onnx_utils/item.yaml index 36335837a..84486d9f8 100644 --- a/onnx_utils/item.yaml +++ b/onnx_utils/item.yaml @@ -12,9 +12,9 @@ labels: author: guyl maintainers: [] marketplaceType: '' -mlrunVersion: 1.1.0 +mlrunVersion: 1.6.3 name: onnx_utils -platformVersion: 3.5.0 +platformVersion: 3.5.4 spec: extra_spec: allow_empty_resources: true @@ -26,10 +26,10 @@ spec: image: mlrun/mlrun kind: job requirements: - - onnx~=1.13.0 - - onnxruntime~=1.14.0 - - onnxoptimizer~=0.3.0 - - onnxmltools~=1.11.0 - - tf2onnx~=1.13.0 + - onnx~=1.15.0 + - onnxruntime~=1.8.1 + - onnxoptimizer~=0.2.0 + - onnxmltools~=1.9.0 + - tf2onnx~=1.16.0 url: '' -version: 1.2.0 +version: 1.3.0 diff --git a/onnx_utils/requirements.txt b/onnx_utils/requirements.txt index dc7ff1e7b..a9acd7371 100644 --- a/onnx_utils/requirements.txt +++ b/onnx_utils/requirements.txt @@ -1,11 +1,11 @@ tqdm~=4.62.3 -tensorflow~=2.7.0 +tensorflow~=2.13.0 torch~=1.10.0 torchvision~=0.11.1 -onnx~=1.10.1 -onnxruntime~=1.8.1 -onnxoptimizer~=0.2.0 +onnx~=1.15.0 +onnxruntime~=1.12.1 +onnxoptimizer~=0.3.0 onnxmltools~=1.9.0 -tf2onnx~=1.9.0 +tf2onnx~=1.16.0 plotly~=5.4.0 -wrapt<1.15.0 # wrapt==1.15.0 fails tensorflow 2.7 Todo: please remove when updating tensorflow \ No newline at end of file +#wrapt<1.15.0 # wrapt==1.15.0 fails tensorflow 2.7 Todo: please remove when updating tensorflow \ No newline at end of file diff --git a/onnx_utils/test_onnx_utils.py b/onnx_utils/test_onnx_utils.py index 35b224c4a..aaae96372 100644 --- a/onnx_utils/test_onnx_utils.py +++ b/onnx_utils/test_onnx_utils.py @@ -257,7 +257,7 @@ def test_pytorch_to_onnx(): filename="test_onnx_utils.py", name="log_model", kind="job", - image="mlrun/ml-models", + image="mlrun/mlrun", ) # Run the function to log the model: @@ -341,7 +341,7 @@ def test_optimize(): filename="test_onnx_utils.py", name="log_model", kind="job", - image="mlrun/ml-models", + image="mlrun/mlrun", ) # Run the function to log the model: From 3b34fef26127e5cd46b19c0d9b5085aff32700c1 Mon Sep 17 00:00:00 2001 From: Yonatan Shelach <92271540+yonishelach@users.noreply.github.com> Date: Wed, 5 Jun 2024 13:24:52 +0300 Subject: [PATCH 11/38] [Noise-reduction] Add new function to hub (#765) * [Noise-reduction] Add new function to hub * fix test * added multiprocessing and silence removal to function --- noise_reduction/data/test_data.mp3 | Bin 0 -> 27972 bytes noise_reduction/data/test_data.wav | Bin 0 -> 179672 bytes noise_reduction/function.yaml | 194 +++++ noise_reduction/item.yaml | 29 + noise_reduction/noise_reduction.ipynb | 942 ++++++++++++++++++++++++ noise_reduction/noise_reduction.py | 625 ++++++++++++++++ noise_reduction/requirements.txt | 5 + noise_reduction/test_noise_reduction.py | 75 ++ 8 files changed, 1870 insertions(+) create mode 100644 noise_reduction/data/test_data.mp3 create mode 100644 noise_reduction/data/test_data.wav create mode 100644 noise_reduction/function.yaml create mode 100644 noise_reduction/item.yaml create mode 100644 noise_reduction/noise_reduction.ipynb create mode 100644 noise_reduction/noise_reduction.py create mode 100644 noise_reduction/requirements.txt create mode 100644 noise_reduction/test_noise_reduction.py diff --git a/noise_reduction/data/test_data.mp3 b/noise_reduction/data/test_data.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..a330f9804f67205e2af72652151f4721ec16ff74 GIT binary patch literal 27972 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%0A^>F%daWyb@oIFn=mD;f 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 literal 0 HcmV?d00001 diff --git a/noise_reduction/data/test_data.wav b/noise_reduction/data/test_data.wav new file mode 100644 index 0000000000000000000000000000000000000000..a3a993c20c707b19bc4a38596e555ccb544390ea GIT binary patch literal 179672 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.1.2 + entry_points: + reduce_noise: + name: reduce_noise + doc: 'Reduce noise from audio file or directory containing audio files. + + The audio files must be in .wav format. + + The cleaned audio files will be saved in the target_directory. + + For information about the noise reduction algorithm see: + + https://github.com/timsainb/noisereduce + + Notice that the saved files are in wav format, even if the original files + are in other format.' + parameters: + - name: audio_source + type: str + doc: path to audio file or directory containing audio files + - name: target_directory + type: str + doc: path to directory to save the cleaned audio files. + - name: sample_rate + type: int + doc: Number of samples in one second in the audio file. Pass `None` to keep + the original sample rate. + default: 16000 + - name: duration + type: int + doc: Duration of the audio file to clean in seconds. Pass `None` to keep the + original duration. + default: null + - name: channel + type: int + doc: Channel to clean. Pass the number of the channel to clean. To clean all + channels pass None. + default: null + - name: silence_threshold + type: float + doc: The threshold to remove silence from the audio, in dB. If None, no silence + removal is performed. + default: null + - name: use_multiprocessing + type: int + doc: Number of processes to use for cleaning the audio files. If 0, no multiprocessing + is used. + default: 0 + - name: verbose + type: bool + doc: Verbosity level. If True, display progress bar. + default: true + outputs: [] + lineno: 388 + has_varargs: false + has_kwargs: false + clean_audio: + name: clean_audio + doc: '' + parameters: + - name: self + - name: data + type: Tensor + outputs: + - type: torch.Tensor + lineno: 276 + has_varargs: false + has_kwargs: false + save_audio: + name: save_audio + doc: '' + parameters: + - name: self + - name: audio + type: ndarray + - name: target_path + type: Path + outputs: [] + lineno: 256 + has_varargs: false + has_kwargs: false + load_audio: + name: load_audio + doc: '' + parameters: + - name: self + - name: file + type: str + outputs: + - type: torch.Tensor + lineno: 268 + has_varargs: false + has_kwargs: false + update_to_wav_suffix: + name: update_to_wav_suffix + doc: '' + parameters: + - name: self + - name: audio_file + type: Path + outputs: [] + lineno: 125 + has_varargs: false + has_kwargs: false + remove_silence: + name: remove_silence + doc: Remove silence sections from the audio. + parameters: + - name: self + - name: audio + type: ndarray + doc: The audio to remove silence from. + outputs: + - doc: The audio without silence. + lineno: 134 + has_varargs: false + has_kwargs: false + reduce_noise_dfn: + name: reduce_noise_dfn + doc: 'Reduce noise from audio files using DeepFilterNet. + + For more information about the noise reduction algorithm see: + + https://github.com/Rikorose/DeepFilterNet + + Notice that the saved files are in wav format, even if the original files + are in other format.' + parameters: + - name: audio_source + type: str + doc: path to audio file or directory of audio files + - name: target_directory + type: str + doc: path to target directory to save cleaned audio files + - name: pad + type: bool + doc: whether to pad the audio file with zeros before cleaning + default: true + - name: atten_lim_db + type: int + doc: maximum attenuation in dB + default: null + - name: silence_threshold + type: float + doc: the threshold to remove silence from the audio, in dB. If None, no silence + removal is performed. + default: null + - name: use_multiprocessing + type: int + doc: Number of processes to use for cleaning the audio files. If 0, no multiprocessing + is used. + default: 0 + - name: verbose + type: bool + doc: verbosity level. If True, display progress bar and logs. + default: true + outputs: [] + lineno: 322 + has_varargs: false + has_kwargs: true + description: Reduce noise from audio files + default_handler: reduce_noise + disable_auto_mount: false + clone_target_dir: '' + env: [] + priority_class_name: '' + preemption_mode: prevent + affinity: null + tolerations: null + security_context: {} +verbose: false diff --git a/noise_reduction/item.yaml b/noise_reduction/item.yaml new file mode 100644 index 000000000..8ddc63f4f --- /dev/null +++ b/noise_reduction/item.yaml @@ -0,0 +1,29 @@ +apiVersion: v1 +categories: + - data-preparation + - machine-learning +description: Reduce noise from audio files +doc: '' +example: noise_reduction.ipynb +generationDate: 2024-03-04:17-30 +hidden: false +icon: '' +labels: + author: yonatans +maintainers: [] +mlrunVersion: 1.5.2 +name: noise-reduction +platformVersion: 3.5.3 +spec: + filename: noise_reduction.py + handler: reduce_noise + image: mlrun/mlrun + kind: job + requirements: [ + librosa, + noisereduce, + deepfilternet, + torchaudio>=2.1.2, + ] +url: '' +version: 1.0.0 \ No newline at end of file diff --git a/noise_reduction/noise_reduction.ipynb b/noise_reduction/noise_reduction.ipynb new file mode 100644 index 000000000..e4fa0a534 --- /dev/null +++ b/noise_reduction/noise_reduction.ipynb @@ -0,0 +1,942 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "4e0abc60-b718-4f45-a82a-0b8759f19d3f", + "metadata": {}, + "source": [ + "# Noise Reduction\n", + "\n", + "## Table of Contents\n", + "\n", + "1. [Introduction](#Introduction)\n", + "2. [Project Setup](#Setting-up-a-project)\n", + "3. [Noise Reduction Techniques](#Noise-Reduction-Techniques)\n", + " 1. [DeepFilterNet](#DeepFilterNet)\n", + " 2. [Spectral Gating](#SpectralGating)" + ] + }, + { + "cell_type": "markdown", + "id": "9af33629-965f-4f73-9e4a-89cc4c3dacf1", + "metadata": {}, + "source": [ + "## Introduction\n", + "\n", + "Noise reduction is a crucial signal processing technique used to enhance the quality of signals by minimizing unwanted or irrelevant noise. This technique finds applications in various fields such as audio processing, image processing, telecommunications, and more. The goal is to extract the useful information from a signal while suppressing undesirable background noise." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "f9cd530d-36a7-47b1-96f8-498d338b3a1a", + "metadata": {}, + "outputs": [], + "source": [ + "import mlrun" + ] + }, + { + "cell_type": "markdown", + "id": "c659289f-01f2-4e02-b843-b39cfc0c1d63", + "metadata": {}, + "source": [ + "## Setting up a project\n", + "\n", + "First of all we need to create a project with the `noise-reduction` function" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "c4217272-85b8-4af7-afee-bc97c6c73bd9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> 2024-03-04 15:54:53,561 [info] Project loaded successfully: {'project_name': 'noise-reduction'}\n" + ] + } + ], + "source": [ + "# Creating a project\n", + "project = mlrun.get_or_create_project(\"noise-reduction\")\n", + "# Importing the function from hub\n", + "noise_reduction_function = project.set_function(\"hub://noise_reduction\")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "f7df4c3e-4e5b-47bd-a298-527d9c6fcb8f", + "metadata": {}, + "outputs": [], + "source": [ + "# Audio source can be either a single file or a directory of audio files\n", + "audio_source = \"data\"" + ] + }, + { + "cell_type": "markdown", + "id": "6c1c5109-6380-4364-b016-728523ed0ea1", + "metadata": {}, + "source": [ + "## Noise Reduction Techniques" + ] + }, + { + "attachments": { + "e48ce103-14f3-421d-82a4-823344895241.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "id": "5c81ecee-851c-4ee8-ad3a-4d372a1bfd97", + "metadata": {}, + "source": [ + "\n", + "### 1. DeepFilterNet\n", + "![image.png](attachment:e48ce103-14f3-421d-82a4-823344895241.png)\n", + "\n", + "In order to use this technique, you simply need to use the `reduce_noise_dfn` handler.\n", + "\n", + "Reduce noise from audio files using DeepFilterNet. For more information about the noise reduction algorithm, see [DeepFilterNet GitHub](https://github.com/Rikorose/DeepFilterNet). Notice that the saved files are in wav format, even if the original files are in other formats.\n", + "\n", + "### Parameters:\n", + "\n", + "- `audio_source`: path to the audio file or directory of audio files\n", + "- `target_directory`: path to the target directory to save cleaned audio files\n", + "- `pad`: whether to pad the audio file with zeros before cleaning\n", + "- `atten_lim_db`: maximum attenuation in dB\n", + "- `silence_threshold`: the threshold to remove silence from the audio, in dB. If None, no silence removal is performed.\n", + "- `use_multiprocessing`: Number of processes to use for cleaning the audio files. If 0, no multiprocessing is used.\n", + "- `verbose`: verbosity level. If True, display progress bar and logs.\n", + "- `kwargs`: additional arguments to pass to `torchaudio.load()`. For more information, see [torchaudio.load()](https://pytorch.org/audio/stable/generated/torchaudio.load.html).\n", + "\n", + "\n", + "In the examples below, the function is running locally, for running remotely, it is required to build the function's image first (need to execute only once):\n", + "```python\n", + "noise_reduction_function.apply(mlrun.auto_mount()) # required for local files\n", + "project.build_function(\"noise-reduction\")\n", + "```\n", + "\n", + "#### 1.1. Example" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "16113524-8597-48d4-8172-76b897fee3f2", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> 2024-03-04 15:54:56,999 [info] Storing function: {'name': 'noise-reduce-reduce-noise-dfn', 'uid': '9732dac831784a6a8b53acab5ff83a08', 'db': 'http://mlrun-api:8080'}\n", + "> 2024-03-04 15:55:07,525 [info] logging run results to: http://mlrun-api:8080\n", + "> 2024-03-04 15:55:07,702 [info] Reducing noise from audio files.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Noise-reduction: 0%| | 0/2 [00:00 2024-03-04 15:55:08,437 [info] Loading DeepFilterNet2 model.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "`torchaudio.backend.common.AudioMetaData` has been moved to `torchaudio.AudioMetaData`. Please update the import path.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2024-03-04 15:55:08 | INFO | DF | Running on torch 2.1.2+cu121\n", + "2024-03-04 15:55:08 | INFO | DF | Running on host jupyter-yoni-d56767c87-678n2\n", + "> 2024-03-04 15:55:08,464 [info] Loading DeepFilterNet2 model.\n", + "2024-03-04 15:55:08 | INFO | DF | Running on torch 2.1.2+cu121\n", + "2024-03-04 15:55:08 | INFO | DF | Running on host jupyter-yoni-d56767c87-678n2\n", + "2024-03-04 15:55:08 | INFO | DF | Loading model settings of DeepFilterNet3\n", + "2024-03-04 15:55:08 | INFO | DF | Using DeepFilterNet3 model at /igz/.cache/DeepFilterNet/DeepFilterNet3\n", + "2024-03-04 15:55:08 | INFO | DF | Initializing model `deepfilternet3`\n", + "2024-03-04 15:55:08 | INFO | DF | Loading model settings of DeepFilterNet3\n", + "2024-03-04 15:55:08 | INFO | DF | Using DeepFilterNet3 model at /igz/.cache/DeepFilterNet/DeepFilterNet3\n", + "2024-03-04 15:55:08 | INFO | DF | Initializing model `deepfilternet3`\n", + "2024-03-04 15:55:08 | INFO | DF | Found checkpoint /igz/.cache/DeepFilterNet/DeepFilterNet3/checkpoints/model_120.ckpt.best with epoch 120\n", + "2024-03-04 15:55:08 | INFO | DF | Found checkpoint /igz/.cache/DeepFilterNet/DeepFilterNet3/checkpoints/model_120.ckpt.best with epoch 120\n", + "2024-03-04 15:55:08 | INFO | DF | Running on device cpu\n", + "2024-03-04 15:55:08 | INFO | DF | Running on device cpu\n", + "2024-03-04 15:55:08 | INFO | DF | Model loaded\n", + "2024-03-04 15:55:08 | INFO | DF | Model loaded\n", + "> 2024-03-04 15:55:08,635 [info] Reducing noise from test_data.mp3.\n", + "> 2024-03-04 15:55:08,636 [info] Reducing noise from test_data.wav.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[32m2024-03-04 15:55:08\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mDF\u001b[0m | \u001b[33m\u001b[1mAudio sampling rate does not match model sampling rate (16000, 48000). Resampling...\u001b[0m\n", + "\"sinc_interpolation\" resampling method name is being deprecated and replaced by \"sinc_interp_hann\" in the next release. The default behavior remains unchanged.\n", + "The MPEG_LAYER_III subtype is unknown to TorchAudio. As a result, the bits_per_sample attribute will be set to 0. If you are seeing this warning, please report by opening an issue on github (after checking for existing/closed ones). You may otherwise ignore this warning.\n", + "\u001b[32m2024-03-04 15:55:08\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mDF\u001b[0m | \u001b[33m\u001b[1mAudio sampling rate does not match model sampling rate (16000, 48000). Resampling...\u001b[0m\n", + "\"sinc_interpolation\" resampling method name is being deprecated and replaced by \"sinc_interp_hann\" in the next release. The default behavior remains unchanged.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> 2024-03-04 15:55:16,701 [info] Saved cleaned audio file to clean_data/test_data.wav.\n", + "> 2024-03-04 15:55:16,706 [info] Saved cleaned audio file to clean_data/test_data_mp3.wav.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Noise-reduction: 100%|██████████| 2/2 [00:09<00:00, 4.51s/file]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> 2024-03-04 15:55:16,791 [info] Summarizing the results.\n", + "> 2024-03-04 15:55:16,792 [info] Done (2/2)\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
projectuiditerstartstatenamelabelsinputsparametersresultsartifacts
noise-reduction0Mar 04 15:54:57completednoise-reduce-reduce-noise-dfn
v3io_user=yonis
kind=local
owner=yonis
host=jupyter-yoni-d56767c87-678n2
audio_source
target_directory=./clean_data
use_multiprocessing=2
silence_threshold=50
atten_lim_db=10
successes
errors
\n", + "
\n", + "
\n", + "
\n", + " Title\n", + " ×\n", + "
\n", + " \n", + "
\n", + "
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "data": { + "text/html": [ + " > to track results use the .show() or .logs() methods or click here to open in UI" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> 2024-03-04 15:55:17,976 [info] Run execution finished: {'status': 'completed', 'name': 'noise-reduce-reduce-noise-dfn'}\n" + ] + } + ], + "source": [ + "dfn_run = noise_reduction_function.run(\n", + " handler=\"reduce_noise_dfn\",\n", + " inputs={\"audio_source\": audio_source},\n", + " params={\n", + " \"target_directory\": \"./clean_data\",\n", + " \"use_multiprocessing\": 2,\n", + " \"silence_threshold\": 50,\n", + " \"atten_lim_db\": 10,\n", + " },\n", + " returns=[\"successes: file\", \"errors: file\"],\n", + " local=True,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a71ba944-1fc2-48be-b789-d57c59201939", + "metadata": {}, + "source": [ + "### Looking at the result" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "19b04cf6-5a4d-4d74-b66e-193540a900a1", + "metadata": {}, + "outputs": [ + { + "data": { + "application/json": { + "test_data.mp3": "clean_data/test_data_mp3.wav", + "test_data.wav": "clean_data/test_data.wav" + }, + "text/plain": [ + "" + ] + }, + "metadata": { + "application/json": { + "expanded": false, + "root": "root" + } + }, + "output_type": "display_data" + }, + { + "data": { + "application/json": {}, + "text/plain": [ + "" + ] + }, + "metadata": { + "application/json": { + "expanded": false, + "root": "root" + } + }, + "output_type": "display_data" + } + ], + "source": [ + "dfn_run.artifact(\"successes\").show()\n", + "dfn_run.artifact(\"errors\").show()" + ] + }, + { + "attachments": { + "68c16acf-c28e-4bb8-a453-abbebc0137ce.png": { + "image/png": "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2rO6epfhrqU1aI20pmf3uN1te4L2NNQ61G7Zq7u3bB/YJ933fH/a/psHIg40HWQerD1keajyMP1waR1SN62urz6rvqMhpaH9SPiRpkafxsNHHY/uOGZ6rOK4zvGlJygn5p8YOFl0sv+U+FTv6czTT5omNt07M+bM9ebY5tazEWcvnAs5d+Y86/zJC74Xjl30vnjkEvNS/WWPy3Ut7i2Hf3f//XCrR2vdFc8rDW1ebY3to9pPXPW/evpa0LVz1znXL9+IutF+M/Hm7VvjbnXc5t/uvpN759Xdwruf7825T7hf+kDjQflDw4dVf9j+sbfDo+P4o6BHLY/jH997wnvy4mn+0y+d85/RnpV3mXRVd7t0H+sJ6Wl7PvZ55wvxi8+9JX9q/ln50ublob8C/mrpG9PX+UryauD14jf6b3a8dXvb1B/T//Bd3rvP70s/6H/Y+ZH58fyn5E9dn6d8IX1Z+9X2a+O3iG/3B/IGBsRcCVf+K4DBimZkAPB6BwC0FADo8HxGGas4/8kLojizyhH4T1hxRpQXDwBq4f97bC/8u7kFwL5t8PgF9dXHARBDAyDBC6CurkN18KwmP1fKChGeAzbHfk3PSwf/pijOnD/E/XMLZKpu4Of2X5JOfJCem+crAAAAOGVYSWZNTQAqAAAACAABh2kABAAAAAEAAAAaAAAAAAACoAIABAAAAAEAAAR6oAMABAAAAAEAAAIoAAAAAIFlXtUAAEAASURBVHgB7J0H3BS11odXBEVRERs2bFixImLFLnbFXrD3ig17ufbee78qdrFivfbesIANO6CgICpFRQTF79k33ny5yezs7O5s/7+/ezGTOTlJnpmdyZmcnEzz999/Z/QnAiIgAiIgAiIgAiIgAiIgAiKQNoFWaSuUPhEQAREQAREQAREQAREQAREQgSwBmVu6D0RABERABERABERABERABESgLARkbpUFq5SKgAiIgAiIgAiIgAiIgAiIgMwt3QMiIAIiIAIiIAIiIAIiIAIiUBYCMrfKglVKRUAEREAEREAEREAEREAEREDmlu4BERABERABERABERABERABESgLAZlbZcEqpSIgAiIgAiIgAiIgAiIgAiIgc0v3gAiIgAiIgAiIgAiIgAiIgAiUhYDMrbJglVIREAEREAEREAEREAEREAERkLmle0AEREAEREAEREAEREAEREAEykJA5lZZsEqpCIiACIiACIiACIiACIiACMjc0j0gAiIgAiIgAiIgAiIgAiIgAmUh0LosWqVUBERABESgsgSGDx/++++/e3V26tSpXbt2XqYOK0Bg6tSpn3/+uVfRNNNMs8QSS3iZOhQBERABEWhsAtP8/fffjd1D9U4EREAEmoHAQgsthMXl9fTLL7/s3Lmzl6nDChAYMmRIly5dvIoWW2yx0AbzZHQoAiIgAiLQYATkTNhgF1TdEQERaEYCY8aMCW2t2WabbZFFFmlGHDXQ54EDB4atWHnllcNM5YiACIiACDQ2AZlbjX191TsREIGmIBA5uO/evTvea03R/9rr5Ntvvx02iisSZipHBERABESgsQnI3Grs66veiYAINAWBXOZWU3S+JjsZaW5pdqsmr5UaJQIiIALlJSBzq7x8pV0EREAEKkBA5lYFICev4o8//hg8eLAn37p16xVWWMHL1KEIiIAIiEDDE5C51fCXWB0UARFocAJEPJK5VVPX+IMPPpg8ebLXpGWWWWaGGWbwMnUoAiIgAiLQ8AQUCL7hL7E6KAIi0OAEMLeeeuopr5Os2ppnnnm8TB1WhkCk9StPwsrAVy0iIAIiUGsEZG7V2hVRe0RABESgMAKtWrXq2rVrYWUkXU4CkQu3FCejnMilWwREQARql4CcCWv32qhlIiACIiAC9UhAs1v1eNXUZhEQAREoEwFtc1wmsFIrAiJQfwReeeWVCRMmuO2eaaaZ1l57bZODzx57W7377rvvvPMO/3799dcLL7zwUksttdlmm2200UZuqbzpKVOmvPbaa3gAshnuDz/8wK5Z008//ZJLLrnEEkuYf5dffvm2bdvm1WMEXn755V9++cUT7tGjR/v27b1Mezhp0iTWF3311Vfsg2z+Ro4cOcccc8w333zzzjvv/PPP36tXL9YaWfmEiT///PP5559/4oknRowY8d13340aNWr22WdHj/lbY4014JlXFbYKTFyxdu3arbPOOibnt99+u+6661566aVPP/10gQUWoJv8rb/++mHIe64XfXzwwQe/+OKL71v+kPlvW5ZZbbXV6KlbS5L0hx9+eMcdd3zyySfffvvtuHHjOnbs2KlTp0022WS77baztLmFZp11Vmp3FbJqi3yiZbiZ6Bk6dKibQ5obINfO1MZrdOrUqV6RjTfeeNppp/UyvcOJEyc+/PDDQOO+5Q8etJxtl/lbbrnl0MAcqVck/pB7+Nlnn+Uettd6rrnmsni51jPOOGO8Bp0VAREQgWYhwONbfyIgAiIgAn/99RejZO/Rv+mmmxoyn332GcN676w93H777Rm/JmH4448/Hn300TPPPLMtG5lg5HruuecyQM+rEwsnUtvYsWMjy9KA0047Df2R9bqZ66233iOPPAKWSD1eJpbVwQcfjMHmavDSCy20EMaYVzA8xIL1CtqrcNddd2HheGcxdz0lBAY8//zzsV09SfcQ++eKK65I2Dv0v/766yuttJKrwU1jG19yySVGG310T5k0N4/XSA6xaUPJ+++/P5Q0Odh4oTwr9DDAchUhn1LHH388e16HZW1Ot27dsGBjlLinsK/233//eIWLLrooHy/cUkqLgAiIQNMSyDRtz9VxERABEXAJYFDZ0adN/Otf/8KeufDCC/PONTEW53u/q9BLMya+/PLLZ5llFqs8b2LxxRf/6KOPPD3e4ccffxzqoaAnZg4ZATN/FcrH5GBExY/mOcuET/zg29V/yCGHMBcX2Twyx48fH85TnXrqqdRy3nnnuXps2hvWM/fIdI09G59g6pIpvlyNMfncAGeeeWbe6SMq2nLLLQlIiKUXVnrkkUeGtUTGMvnmm29CSZPzwAMPhJqpNJc8N+QRRxyRpOVGLV8NsFRzaSOfq/Dvf//bzuOFjXFzuI70mtnIGIU6JQIiIALNQEDmVjNcZfVRBEQgPwFsBnewaNIM8ZMHlLvoootyVcMofJ999gn1583Bjy7e4rr11ltDJbvuumvYEly/ko+8XZ0MmnNZXMzn7Lnnnq5wknSMhRA5NfT4448z1xepGac1t6e33HJLoX1kugwbz1XipQ877LDIqiMz+/Tps+2224anmJfz1DJHFIrRmFyoKX7ccceFRc466yxPszn86aef8LEM5eNzDj300EhtZGJ27rTTTvHFw7M77rhjLoXKFwEREIEmISBzq0kutLopAiKQh0BBo+pwWEkOS54i62CcijtcZJEkmaussgoaIjWTyexTqIRpNE8eH8KYpUqsHAuVuDkYPJ5CDjEMsMRcseTpSIXojJzCuvfee3OtLHr00Udtw3B9zCUW37DIqSejFpLxZcOz0003XZjJAjnbTpNgUVkotvnmm3ti7iHunWGR//znP66MSTNViztfKJwk58477wwVcq0PPPDA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gAg0MwGZW8189dV3ERABERABERABERABERCBMhKQuVVGuFItAiIgAiIgAiIgAiIgAiLQzARkbjXz1VffRUAEREAEREAEREAEREAEykhA5lYZ4Uq1CIiACIiACIiACIiACIhAMxOQudXMV199FwEREAEREAEREAEREAERKCMBmVtlhCvVIiACIiACIiACIiACIiACzUxA5lYzX331XQREQAREQAREQAREQAREoIwEZG6VEa5Ui4AIiIAIiIAIiIAIiIAINDMBmVvNfPXVdxEQAREQAREQAREQAREQgTISkLlVRrhSLQIiIAIiIAIiIAIiIAIi0MwEWjdz59V3ERABERCB8hH4+++/R40a9dVXXw0bNuznn38eN27c2LFj+dcmxo8fj8y0LX+tWrUyCfPvTDPN1LFjx7nmmot/3QTpGWecsXxtlmYREAEREAERSJeAzK10eUqbCIiACDQpgZ9++um999774osvsK/M39dffz1x4sTUccw333xLO39dunSZZZZZUq9FCkVABERABEQgFQLT8GUxFUVSIgIiIAIi0FQEfvvtN+yrt99+e+DAgfw7dOjQanW/U6dO2F/LLrtsjx491lxzzQ4dOlSrJapXBERABERABDwCMrc8IDoUAREQARHISWDSpEnPP//8Y4899sorr3zyySdTp07NKVqlE9NMM03Xrl3XWWedddddF9Orffv2VWqIqhUBERABERCBLAGZW7oPREAEREAE8hBgzdXjjz/+yCOPPPXUU7/++mse6Zo5zXowTC/sLv7WW2+9tm3b1kzT1BAREAEREIFmISBzq1mutPopAiIgAoUSGD58OCbWww8//PLLL//111+FFq8p+ZlnnrlXr1477LDDhhtuOP3009dU29QYERABERCBBiYgc6uBL666JgIiIAIFE2BB76BBg4yVNXjw4ILL13wB4mpstdVW2F09e/acbrrpar69aqAIiIAIiEB9E5C5Vd/XT60XAREQgVQIsAqLKawHHnhgwIAB33zzTSo6a1zJrLPOau2u1q0Vp7fGL5eaJwIiIAL1SkDmVr1eObVbBERABFIhQIDBfv36XX755Z999lkqCutOyfzzz3/QQQftt99+c845Z901Xg0WAREQARGocQIyt2r8Aql5IiACIlAuAiNGjLjqqqtuuOEGImGUq4760Ytj4U477dSnT5+VVlqpflqtloqACIiACNQ6AZlbtX6F1D4REAERSJ0A22Rddtll/fv3//PPP1NXXu8KV1llFYyu7bbbThE16v1Sqv0iIAIiUAsEZG7VwlVQG0RABESgEgQwrh566CEMrddff70S9dVzHR07dtx///1xMpxnnnnquR9quwiIgAiIQJUJyNyq8gVQ9SIgAiJQAQLjxo276aabrrzyyuqGwcBhr0OHDsSoMP+SIIcQ8wTq4F/7N3ny5DFjxvzwww+jR4+eMmVKBfjkqoKtug4++ODjjjturrnmyiWjfBEQAREQARGIISBzKwaOTomACIhA3RMYOXLkBRdccPPNNxMSo2KdwY7q/L9/iyyyCIEoZphhhoLaQFR6DEWMLmN6YSt+/N+/SnanXbt2hx9+eN++fWebbbaC2i9hERABERABEZC5pXtABERABBqTwK+//nphy9/vv/9e7h7iete95W/llVfu1q1buUP8MRvmml4DBw4cMmRIufvIhl1YXEcccQSJctcl/SIgAiIgAg1DQOZWw1xKdUQEREAE/iGAVx6x3U866aTvv/++fFAWWmihLbfccu2118bOIpb6NNNMU7668mpmBuyll156seWvrKYXE1zHHnvsoYceypRX3lbFC/zU8rf44ovHi+msCIiACIhAXROQuVXXl0+NFwEREAGfwAsvvHDUUUcNGjTIP5HS8YorrsjuwL169Vp22WWra2Ll6tCoUaOM6fXUU08NGzYsl1gp+SzlOvHEEwmkwdqz4vRMmjRpgw02WHrppa+//vriNKiUCIiACIhAXRCQuVUXl0mNFAEREIH8BD7//PNjjjlmwIAB+UULlGjduvU666yDlcV0VqdOnQosXTVxln69++6797X8DR8+PPV2LLXUUtdccw1kCtWMMyR7fBGInymy7777Tt6JhQKUvAiIgAjUEQGZW3V0sdRUERABEYgm8PPPP59xxhlXX311uvtozTzzzJtuuikTWZtssgnRL6Lrrodc7C7Wdxm769tvv023ybvssstFF10099xzJ1d79NFHX3zxxUaeq0bww+RlJSkCIiACIlBfBGRu1df1UmtFQARE4H8IEDOdCRZsrbFjx/7PiRIO2N63d+/eO+64I/M2DbbVL9NKbPF811133XbbbRMmTCgB0v8UZXrq7LPPxrdw2mmn/Z8TUQeE4z/ssMPsGXwyBw8eXJtumbaRSoiACIiACBRNQOZW0ehUUAREQASqTIBlWgcccMAXX3yRVjsIMHjIIYegs+G3mSJs4x133HHVVVcRWD4tel27dr322mtXWWWVGIUPP/zwNttsw2ybK/Pqq6+uscYabo7SIiACIiACDUNA5lbDXEp1RAREoIkITJw48YQTTrjiiivS6vMKK6xw5JFHMqPVYNNZ8Xwwe4hlyHTTI488wsRXvHCSs0xS7bfffueee27kDl1vvvnmuuuuS5AMT9Wuu+56++23e5k6FAEREAERaAwCMrca4zqqFyIgAk1E4I033thjjz1SmdTCPCD6BXtJEc+9mf3Z2MWLiakbb7yR2Oyl30lzzDEHS7N22203F+lXX3216qqr/vjjj6F+whuyGzWlwlPKEQEREAERqHcCreq9A2q/CIiACDQPgT/++INJrR49epRuaxETr0+fPgQzxL2NNVquYdA8PG1PF1hgAaakRowYwUxXQUEvrAY3gU2FPbz99ttb440cwo1E2loUZAHerbfe6mpQWgREQAREoGEIaHarYS6lOiICItDgBN5///3dd9/9o48+KrGfRHJnOmvvvfeu62CDJUKIKY6jJjNd5513Xi7rKKasd2reeeclJgfrstZff33mJL2z7mHnzp0xfVu10jdQl4rSIiACItAIBGRuNcJVVB9EQAQam8CUKVMY/RN+sMQ47wR2P/nkkwmL17Zt28YmVnrvfvnlF2a6LrzwwnHjxpWobdFFF/3yyy/zKnn66ad79uyZV0wCIiACIiAC9UVA5lZ9XS+1VgREoOkIfPLJJ3imvfPOO6X0nGmT/fff//TTT2/4kIOlUArLYmtdcskll156KZEMw7Pp5my99dYPPvhgujqlTQREQAREoOoEZG5V/RKoASIgAiIQTYC4eZdffvnxxx/Pkq1oiWS5G2+8MfvwLr300snEJeUTwKvw/PPP51owzeifS++YPbuGDx8+33zzpadSmkRABERABKpPQG7i1b8GaoEIiIAIhASYTiEsO8HZS7G1unTp8mTLn2ytkHDyHGIG4lX44YcfsgQrealCJf/666+bbrqp0FKSFwEREAERqHECmt2q8Quk5omACDQjAaIm4FqGG2HRnZ9zzjlZ67Xvvvu2bt26aCUq6BFgvvG+++7DBv7++++9U6kcMrU1bNgwXbJUYEqJCIiACNQIAc1u1ciFUDNEQARE4B8Cjz76aPfu3Yu2tdjE6bjjjiNS/IEHHqiBe7p3FeHymXL89NNPCe1YjiiC7L712GOPpdtmaRMBERABEaguAZlb1eWv2kVABETg/wlMnTr11FNPZd/hCRMm/H9uISk20v3ggw8IY9i+fftCykm2AAKzzDILwTPefffd1VZbrYBiyUSvu+66ZIKSEgEREAERqA8Cciasj+ukVoqACDQ8gbFjx+66665PPPFEcT1t06YN3oNHH320ZrSKA1hEKcxjtic+9thj7XbGRSgJixA1nm24wnzliIAIiIAI1CMBzW7V41VTm0VABBqNAGEYcCAs2tZafvnliRRPDEPZWpW8M/AnZLfoIUOG9OrVK8V6b7jhhhS1SZUIiIAIiEB1CWh2q7r8VbsIiIAIZO69915G7RMnTiyCBdHDTzjhhFNOOYUlW0UUV5FUCBBC48YbbzzkkENK3IfaNIZAiCNGjJh++ulTaZuUiIAIiIAIVJeAZreqy1+1i4AINDUBhunnnnvuTjvtVJytteSSS77++utnnnmmbK3q3kaE0CBwfyq2Fh1hm68HHniguj1S7SIgAiIgAmkRkLmVFknpEQEREIHCCLDPUp8+fU488cTCirVIM74/6qij3nvvvZVXXrmI4iqSLoH+/fv37ds3RZ3XXnttitqkSgREQAREoIoE5ExYRfiqWgREoHkJTJo0icAYxU1iLLDAAv369Vt77bWbF18t9fy1115j++NSdqOO7A3L+ZZZZpnIU8oUAREQARGoIwKa3aqji6WmioAINAiBcePGbbTRRsXZWhtssAEhyGVr1cit8NlnnxG4P3Vbi94pInyNXGI1QwREQARKJKDZrRIBqrgIiIAIFEaAKAibbLLJRx99VFixFmn2Lz777LMJj1FEWRVJncDo0aPZemvo0KGpa0bhzDPP/N13380000zlUC6dIiACIiACFSOg2a2KoVZFIiACIpD55JNPGKAXYWsx7L7//vvZv1i2Vo3cRr/99tsWW2xRJluLPv7yyy933313jXRWzRABERABESiagMytotGpoAiIgAgURoBFPj169GB2q7Bimcziiy/+1ltvbbvttoUWlHyZCBDmpHfv3gMHDiyTfqOWgBnErixrFVIuAiIgAiJQbgIyt8pNWPpFQAREIEuAiO2s1xo7dmyhONhC9+233+7SpUuhBSVfJgKYQIcddtiAAQPKpN+qff/998tt0dm6lBABERABESgTAZlbZQIrtSIgAiLw/wTeeecd1mvhfvb/WQlSRHs/66yzHnzwwfbt2ycQl0iFCDDT+NBDD1WmMgXMqAxn1SICIiAC5SOgUBnlYyvNIiACIpAl8MEHH6yzzjqFzmu1a9fuvvvu23TTTQWxBgkwwfXpp58+1/L3wgsvjB8/vkyNnGGGGUaOHNmhQ4cy6ZdaERABERCBchOQuVVuwtIvAiLQ1ASGDBlC0PYxY8YURGGuueZ64oknunXrVlApCVeFAOu42G/amF6vvvoqO6ql24zLLrvs8MMPT1entImACIiACFSMgMytiqFWRSIgAk1H4Msvv1xrrbW+//77gnq+6KKLPvXUU507dy6olIRrgQC21htvvGFML5ZdYYmV3qoll1ySgJZ4lpauShpEQAREQAQqT0DmVuWZq0YREIGmIDB8+HBsrW+++aag3nbv3v2xxx5jdqugUhKuQQITJkx46aWXjOlVROh/t0f4K+KP6uYoLQIiIAIiUC8EZG7Vy5VSO0VABOqJAOttsLW+/vrrghq98cYb9+/fXzvbFgStLoTZEPn55583ptewYcMKbfMOO+xw7733FlpK8iIgAiIgArVAQOZWLVwFtUEERKChCDC2Zr3WZ599VlCv9thjjxtvvLFNmzYFlZJw3RHACDd2FwZYwkV9rVu3Zru2jh071l1n1WAREAEREAGZW7oHREAERCBNAj/99NO666774YcfFqT0hBNOOPvss7U+pyBo9S48depUnAyN6YXb4a+//hrTI26PE088MUZAp0RABERABGqTgMyt2rwuapUIiEBdEhg3btz6669PnLqCWn/yySefeeaZBRWRcIMRmDJlCqE1jOlFsI3Jkyd7HVxwwQW/+uqraaed1svXoQiIgAiIQI0TkLlV4xdIzRMBEagbAsxO9OzZ88033yyoxX379r3wwgs1r1UQtMYWnjhxIgHljemF6c4eX6a/xFDZbLPNGrvv6p0IiIAINB4BmVuNd03VIxEQgSoQwDFsm222eeSRRwqq+5BDDrnyyitlaxUEramEf/755xdffNGYXostttijjz7aVN1XZ0VABESgAQjI3GqAi6guiIAIVJ8Ai6/OO++8gtqxzz773HDDDa1atSqolISblgAbuM0zzzxN2311XAREQATqlIDMrTq9cGq2CIhADRG4/fbbd99994Ia1Lt37379+mkpTkHQJCwCIiACIiACdUdA5lbdXTI1WAREoLYIvP7664QiDGMbxLRy2223veeee4juHSOjUyIgAiIgAiIgAg1AQOZWA1xEdUEERKBqBAhFuMQSS/zwww/JW7D55ps/8MAD0003XfIikhQBERABERABEahTAlozUKcXTs0WARGoCQIEuijI1iJ0Yf/+/WVr1cTFUyNEQAREQAREoPwENLtVfsaqQQREoEEJ4EBI6AJixyXs31prrfXkk0/OOOOMCeUlJgIiIAIiIAIiUO8ENLtV71dQ7RcBEagagZ9++im5rbXqqquyb5JsrapdLVUsAiIgAiIgAtUgIHOrGtRVpwiIQEMQYOFWwn4svvjiTzzxxMwzz5xQXmIiIAIiIAIiIAKNQUDmVmNcR/VCBESgCgQ6duyYJLrgrLPOyu60HTp0qEITVaUIiIAIiIAIiEBVCcjcqip+VS4CIlDPBGabbbaNNtoovgfsrEVsDGa34sV0VgREQAREQAREoCEJyNxqyMuqTomACFSIwOGHH96qVdyD9Iorrthggw0q1BpVIwIiIAIiIAIiUGME4kYJNdZUNUcEREAEao4Agd2JBR/ZrGmmmebSSy89+OCDI88qUwREQAREQAREoBkIyNxqhqusPoqACJSRAAbVvffeu/TSS7t1LLroovgQHnHEEW6m0iIgAiIgAiIgAs1GQPtuNdsVV39FQATKQmDq1KmvvPLK999/P2HChG7duq244orMbpWlJikVAREQAREQARGoHwLpm1sDBw5kUXj79u3rB4JaKgIiIAIiIAJlJ8C+2G+99VaPHj1kipedtSoQAREQgZohkLIz4Y8//rjyyiuvsMIKNdNBNUQEREAEREAEaoLAYYcdttZaa1188cXXXHPN6NGja6JNaoQIiIAIiECZCbROV//ff/+Nwl9//TVdtdImAiIgAiIgAvVO4Pfff6cLl1xyCU6n48ePP+GEE+q9R2q/CIiACIhAXgIpz27lrU8CIiACIiACItCcBMwXyebsu3otAiIgAk1LoCzmlt4oTXs/qeMiIAIiIALxBMzCrU8//TReTGdFQAREQAQag0BZzK3GQKNeiIAIiIAIiECZCPTr169MmqVWBERABESgpgiUxdzi0x1b0Jx55pnpdvW5554bNGhQujqlTQREQAREQASqQuDPP/+sSr2qVAREQAREoJIEymJu0YFPPvnkX//6V7o92WCDDbp27ZquTmkTAREQAREQgUoSsFHg27Rpw15tlaxadYmACIiACFSeQMrmlnmL2LVb8k2v/BVVjeUgwGztpptuWg7N0ikCItA8BMzL0b4i6fh7773XPN1XT0VABESgOQmkbG65bxGAvv/++82JVb1uMALM1j755JPffvttg/VL3REBEag8ATu7VfmqVaMIiIAIiEDlCaRsbpkO2HdJ7969t9pqq1R69fnnn6eiR0pEoGgCgwcPLrqsCoqACIiACIiACIiACDQhgbKYW+4c1+OPP85q4HHjxpUId9llly1Rg4qLQIkEtthii/vuu69EJVUszv7j+Pf+8ccfVWyDqhYBEXAJDB8+nLBS77zzjpuptAiIgAiIQCMRSNncsvNaLqP11ltv3nnnHTVqlJuptAiUSGDXXXfde++9S1SSt/jhhx/evn17K7bLLrvYdN0ljjnmmKWWWqpnz55113I1WAQalcCll15KWKnu3buX2EG+cvIxaPLkySXqUXEREAEREIHUCaRsboXtY2qLyEu///77lClTwrNF5CiOUxHQGrLInXfeecstt5S1a999990VV1wxYcIEW0tdB242jdcvyF5NJUSgkgT++uuvp59+mhojv0uW2JK77757xx13PPTQQ0vUo+IiIAIiIAKpE0jZ3HLdCFNp6/HHH9+6dWscLexHux9//DEVzVIiAnkJzDfffKHM2LFjw8z6ypl99tnrq8FqrQg0AAHeYj/88EOZOmI+aE6aNKlM+qW27giMHj06rc/cddd3NVgEao1AyuZWzEe74iwxvsTzRfDCCy+04IrTY4sr0RgEpk6dWq2O3HzzzdWqOq16f/7557RUSY8IiEChBEaMGFFokbzyuJDklZFA8xBgpe7cc8+9zjrrVKDLX3zxxR577FHXC5srQElVNDmBlM2t//znP+UAqp9xOajWtc7ddtutWu2v3++FMV9DqgVT9YpA8xB48cUXy9fZgw46qHzKpbnuCGBu0Wa2MKlAy/v379+vXz98Wav4GbQC3VQVIlAKgTTNLVaGEL2glNaorAgkJEDEy4SSqYudddZZqeusjELNDFeGs2oRgUgC5dgqHYexr7/+2lb34IMP2rQSzUxgmWWWofuVeebbWhZccMFmZq6+i0AMgTTNra5du8bUZH+QMTJJ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2Ai9S0ImyhEBERABERABCOgVqdtABERABJqEQH2EymiSi6FuioAIiIAIiIAIiIAIiIAINBIBmVuNdDXVFxEQAREQAREQAREQAREQgRoiIHOrhi6GmiICIiACIiACIiACIiACItBIBGRuNdLVVF9EQAREQAREQAREQAREQARqiEBqgeDDPj366KMTJ04M85UjAiIgAiIgAk1O4O6779bOKE1+D6j7IiACTUKgjJEJm4SguikCIiACIiACIiACIiACIiACkQTkTBiJRZkiIAIiIAIiIAIiIAIiIAIiUCoBmVulElR5ERABERABERABERABERABEYgkIHMrEosyRUAEREAEREAEREAEREAERKBUAjK3SiWo8iIgAiIgAiIgAiIgAiIgAiIQSUDmViQWZYqACIiACIiACIiACIiACIhAqQRkbpVKUOVFQAREQAREQAREQAREQAREIJKAzK1ILMoUAREQAREQAREQAREQAREQgVIJyNwqlaDKi4AIiIAIiIAIiIAIiIAIiEAkAZlbkViUKQIiIAIiIAIiIAIiIAIiIAKlEpC5VSpBlRcBERABERABERABERABERCBSAIytyKxKFMEREAEREAEREAEREAEREAESiUgc6tUgiovAiIgAiIgAiIgAiIgAiIgApEEWkfm5sp8Yrs1p5vun5M//pgZ9Xtm5pajFzKZvRbM/D4xezBkTKZtJmP0Tmg5O/90mVGTs6mpmcwcmYzRQM4CM2VaTZvNHzc+M12bzIgpGSM/byYzfSazSKfsqcHfZjq1y0w/febLn7OHs7fK/DE107FDNv3t2Gwtxl78K5OZsVWmw6yZ33/Pnhr9e6bjDJk2LU2db95M27aZv/7KTJqUPfXp55m/M5kuS2bTUyZn6MW0LW2gIA2baabMlCnZU/PPn+nQIfMXLc5kHn0xM1fbzNSW9IjJmU84m8ksmD2Tocc0daY22fSfUzKt22RemJL5IXuUGZ/JHNE+8+uv2fTff2d+mpr5OpvMUNvcmSw3CvJHUept1dKN3yZlaP4HLfkbzpRZaKFsd4yGEaMzY6i3palzd8y8+V3ms0ym73JZURr26WeZeVCK8haBWWbJpn/4ITNyVObDTKZFKtN2uszPk7MN5m/GTGaWaTPtW8QgA97RYzK3tpxaLJPZuF2mY8fswYgR2QsHZLrP36eTspdvzhmyaSoa+Wu2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IeAQcAg4BBwCDgGHgEPAIeDULUcDDgGHgEPAIeAQcAg4BBwCDgGHgENgUhBw6takwOoqdQg4BBwCDgGHgEPAIeAQcAg4BBwCTt1yNOAQcAg4BBwCDgGHgEPAIeAQcAg4BCYFAaduTQqsrlKHgEPAIeAQcAg4BBwCDgGHgEPAIeDULUcDDgGHgEPAIeAQcAg4BBwCDgGHgENgUhBw6takwOoqdQg4BBwCDgGHgEPAIeAQcAg4BBwCTt1yNOAQcAg4BBwCDgGHgEPAIeAQcAg4BCYFAaduTQqsrlKHgEPAIeAQcAg4BBwCDgGHgEPAIeDULUcDDgGHgEPAIeAQcAg4BBwCDgGHgENgUhBw6takwOoqdQg4BBwCDgGHgEPAIeAQcAg4BBwCTt1yNOAQcAg4BBwCDgGHgEPAIeAQcAg4BCYFAaduTQqsrlKHgEPAIeAQcAg4BBwCDgGHgEPAIeDULUcDDgGHgEPAIeAQcAg4BBwCDgGHgENgUhBw6takwOoqdQg4BBwCDgGHgEPAIeAQcAg4BBwCTt1yNOAQcAg4BBwCDgGHgEPAIeAQcAg4BCYFAaduTQqsrlKHgEPAIeAQcAg4BBwCDgGHgEPAIeDULUcDDgGHgEPAIeAQcAg4BBwCDgGHgENgUhBw6takwOoqdQg4BBwCDgGHgEPAIeAQcAg4BBwCTt1yNOAQcAg4BBwCDgGHgEPAIeAQcAg4BCYFAaduTQqsrlKHgEPAIeAQcAg4BBwCDgGHgEPAIeDULUcDDgGHgEPAIeAQcAg4BBwCDgGHgENgUhBw6takwOoqdQg4BBwCDgGHgEPAIeAQcAg4BBwCTt1yNOAQcAg4BBwCDgGHgEPAIeAQcAg4BCYFAaduTQqsrlKHgEPAIeAQcAg4BBwCDgGHgEPAIeDULUcDDgGHgEPAIeAQcAg4BBwCDgGHgENgUhBw6takwOoqdQg4BBwCDgGHgEPAIeAQcAg4BBwCTt1yNOAQcAg4BBwCDgGHgEPAIeAQcAg4BCYFAaduTQqsrlKHgEPAIeAQcAg4BBwCDgGHgEPAIeDULUcDDgGHgEPAIeAQcAg4BBwCDgGHgENgUhBw6takwOoqdQg4BBwCDgGHgEPAIeAQcAg4BBwCTt1yNOAQcAg4BBwCDgGHgEPAIeAQcAg4BCYFAaduTQqsrlKHgEPAIeAQcAg4BBwCDgGH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" + } + }, + "cell_type": "markdown", + "id": "4576b576-4ac0-433a-9d1d-f39225a6648d", + "metadata": {}, + "source": [ + "\n", + "### 2. Spectral Gating\n", + "![image.png](attachment:68c16acf-c28e-4bb8-a453-abbebc0137ce.png)\n", + "\n", + "In order to use this technique, you simply need to use the `reduce_noise` handler.\n", + "\n", + "Spectral gating selectively filters signal frequencies based on amplitude, offering targeted noise reduction or feature enhancement in signal processing applications.\n", + "\n", + "Reduce noise from an audio file or directory containing audio files. The audio files must be in .wav format. The cleaned audio files will be saved in the target directory. For information about the noise reduction algorithm, see [noisereduce GitHub](https://github.com/timsainb/noisereduce). Notice that the saved files are in .wav format, even if the original files are in another format.\n", + "\n", + "### Parameters:\n", + "\n", + "- `audio_source`: path to the audio file or directory containing audio files\n", + "- `target_directory`: path to the directory to save the cleaned audio files.\n", + "- `sample_rate`: Number of samples in one second in the audio file. Pass `None` to keep the original sample rate.\n", + "- `duration`: Duration of the audio file to clean in seconds. Pass `None` to keep the original duration.\n", + "- `channel`: Channel to clean. Pass the number of the channel to clean. To clean all channels, pass `None`.\n", + "- `silence_threshold`: The threshold to remove silence from the audio, in dB. If `None`, no silence removal is performed.\n", + "- `use_multiprocessing`: Number of processes to use for cleaning the audio files. If 0, no multiprocessing is used.\n", + "- `verbose`: Verbosity level. If True, display a progress bar.\n", + "\n", + "#### 2.1. Example" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "f10a5ecd-bf90-4650-a42e-d3fbfff78e52", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> 2024-03-04 16:07:39,378 [info] Storing function: {'name': 'noise-reduce-reduce-noise', 'uid': '6e6d6f7c3f8243b995dc1bbcf66f7544', 'db': 'http://mlrun-api:8080'}\n", + "> 2024-03-04 16:07:39,541 [info] Reducing noise from audio files.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Noise-reduction: 0%| | 0/2 [00:00 2024-03-04 16:07:39,565 [info] Reducing noise from test_data.mp3.\n", + "> 2024-03-04 16:07:39,566 [info] Reducing noise from test_data.wav.\n", + "> 2024-03-04 16:07:46,174 [info] Saved cleaned audio file to clean_data/test_data.wav.\n", + "> 2024-03-04 16:07:46,175 [info] Saved cleaned audio file to clean_data/test_data_mp3.wav.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Noise-reduction: 100%|██████████| 2/2 [00:06<00:00, 3.31s/file]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> 2024-03-04 16:07:46,211 [info] Summarizing the results.\n", + "> 2024-03-04 16:07:46,212 [info] Done (2/2)\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
projectuiditerstartstatenamelabelsinputsparametersresultsartifacts
noise-reduction0Mar 04 16:07:39completednoise-reduce-reduce-noise
v3io_user=yonis
kind=local
owner=yonis
host=jupyter-yoni-d56767c87-678n2
audio_source
target_directory=./clean_data
use_multiprocessing=2
silence_threshold=50
successes
errors
\n", + "
\n", + "
\n", + "
\n", + " Title\n", + " ×\n", + "
\n", + " \n", + "
\n", + "
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "data": { + "text/html": [ + " > to track results use the .show() or .logs() methods or click here to open in UI" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> 2024-03-04 16:07:46,389 [info] Run execution finished: {'status': 'completed', 'name': 'noise-reduce-reduce-noise'}\n" + ] + } + ], + "source": [ + "noise_reduction_run = noise_reduction_function.run(\n", + " handler=\"reduce_noise\",\n", + " inputs={\"audio_source\": audio_source},\n", + " params={\n", + " \"target_directory\": \"./clean_data\",\n", + " \"use_multiprocessing\": 2,\n", + " \"silence_threshold\": 50,\n", + " },\n", + " local=True,\n", + " returns=[\"successes: file\", \"errors: file\"],\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "699615d7-bba1-4147-ad3d-d295d794f866", + "metadata": {}, + "source": [ + "### Looking at the result" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "47c4f66a-d5d0-47e5-9842-abbe6653526b", + "metadata": {}, + "outputs": [ + { + "data": { + "application/json": { + "test_data.mp3": "clean_data/test_data_mp3.wav", + "test_data.wav": "clean_data/test_data.wav" + }, + "text/plain": [ + "" + ] + }, + "metadata": { + "application/json": { + "expanded": false, + "root": "root" + } + }, + "output_type": "display_data" + }, + { + "data": { + "application/json": {}, + "text/plain": [ + "" + ] + }, + "metadata": { + "application/json": { + "expanded": false, + "root": "root" + } + }, + "output_type": "display_data" + } + ], + "source": [ + "dfn_run.artifact(\"successes\").show()\n", + "dfn_run.artifact(\"errors\").show()" + ] + }, + { + "cell_type": "markdown", + "id": "6eeae1bb-c714-491b-91dd-f22148cd0970", + "metadata": {}, + "source": [ + "The output of this function is the same as the first one." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "mlrun-base", + "language": "python", + "name": "conda-env-mlrun-base-py" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.16" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/noise_reduction/noise_reduction.py b/noise_reduction/noise_reduction.py new file mode 100644 index 000000000..f0fff5504 --- /dev/null +++ b/noise_reduction/noise_reduction.py @@ -0,0 +1,625 @@ +import logging +from abc import ABCMeta, abstractmethod +from multiprocessing import Process, Queue +from pathlib import Path +from typing import List, Tuple, Type, Union + +import librosa +import numpy as np +import torch +from scipy.io import wavfile +from tqdm import tqdm + +#: The value to send into multiprocessing queues to stop the process: +_MULTIPROCESSING_STOP_MARK = "STOP" + +# Get the global logger: +try: + import mlrun + + _LOGGER = mlrun.get_or_create_ctx("noise_reduce").logger +except ModuleNotFoundError: + _LOGGER = logging.getLogger() + + +class ReduceNoiseBase(metaclass=ABCMeta): + """ + Base class for noise reduction. + This class is aimed to be inherited by specific noise reduction algorithms. + You must implement the following methods: + - clean_audio: The method to clean the audio, where the noise reduction algorithm is implemented. + - save_audio: The method to save the audio to a file. + - load_audio: The method to load the audio from a file. + + After implementing the above methods, you can use the reduce_noise method to reduce noise from audio files. + """ + def __init__( + self, + target_directory: Path, + verbose: bool = True, + silence_threshold: float = None, + ): + self.target_directory = Path(target_directory) + self.verbose = verbose + self.silence_threshold = silence_threshold + + def reduce_noise(self, audio_file: Path) -> Tuple[bool, Tuple[str, str]]: + """ + Reduce noise from the given audio file. + + :param audio_file: The audio file to reduce noise from. + + :returns: A tuple of: + - a boolean indicating whether an error occurred + - a tuple of: + - audio file name + - target path in case of success / error message in case of failure. + """ + try: + if self.verbose: + _LOGGER.info(f"Reducing noise from {audio_file.name}.") + + # Load audio data: + audio = self.load_audio(file=str(audio_file)) + + # Perform noise reduction: + reduced_noise = self.clean_audio(data=audio) + + # Remove silence from the audio if necessary: + reduced_noise = self.remove_silence(audio=reduced_noise) + + # Prepare target path: + target_path = self.update_to_wav_suffix(audio_file=audio_file) + + # Save file: + self.save_audio( + audio=reduced_noise, + target_path=target_path, + ) + + if self.verbose: + _LOGGER.info(f"Saved cleaned audio file to {target_path}.") + + return False, (audio_file.name, str(target_path)) + except Exception as exception: + if self.verbose: + _LOGGER.error(f"Failed to reduce noise from {audio_file.name}.") + _LOGGER.error(f"Error: {exception}") + # Collect the error: + return True, (audio_file.name, str(exception)) + + @abstractmethod + def clean_audio(self, data) -> Union[np.ndarray, torch.Tensor]: + """ + Clean the audio from noise. Here you should implement the noise reduction algorithm. + + :param data: The audio data to clean. + + :returns: The cleaned audio. + """ + pass + + @abstractmethod + def save_audio(self, audio: np.ndarray, target_path: Path): + """ + Save the audio to a file. + + :param audio: The audio to save. + :param target_path: The target path to save the audio to. + """ + pass + + @abstractmethod + def load_audio(self, file: str) -> Tuple[Union[np.ndarray, torch.Tensor], int]: + """ + Load the audio from a file. + + :param file: The file to load the audio from. + + :returns: A tuple of: + - the audio data + - the sample rate + """ + pass + + def update_to_wav_suffix(self, audio_file: Path): + target_path = self.target_directory / audio_file.name + if target_path.suffix != ".wav": + old_suffix = target_path.suffix[1:] + target_path = target_path.with_stem(target_path.stem + f"_{old_suffix}") + return target_path.with_suffix(".wav") + else: + return target_path + + def remove_silence( + self, + audio: np.ndarray, + ): + """ + Remove silence sections from the audio. + + :param audio: The audio to remove silence from. + + :returns: The audio without silence. + """ + if self.silence_threshold is None: + return audio + + # Get the indices of the non-silent frames: + non_silent_indices = librosa.effects.split( + y=audio, + top_db=self.silence_threshold, + frame_length=2048, + hop_length=256, + ) + + # Get the non-silent audio: + non_silent_audio = np.concatenate( + [audio[:, start:end] for start, end in non_silent_indices], axis=1 + ) + + return non_silent_audio + + +class ReduceNoise(ReduceNoiseBase): + def __init__( + self, + target_directory: Path, + verbose: bool = True, + silence_threshold: float = None, + sample_rate: int = 16000, + duration: int = None, + channel: int = None, + ): + super().__init__(target_directory, verbose, silence_threshold) + self.sample_rate = sample_rate + self.duration = duration + self.channel = channel + + def save_audio(self, audio: np.ndarray, target_path: Path): + # If the audio has more than one channel, transpose it in order to save it: + if len(audio) > 1: + audio = audio.T + + wavfile.write( + filename=target_path, + rate=self.sample_rate, + data=audio, + ) + + def load_audio(self, file: str) -> np.ndarray: + data, sr = librosa.load( + path=file, + sr=self.sample_rate, + mono=False, # keep channels separate + duration=self.duration, + ) + # set sample rate: + self.sample_rate = int(sr) + + # convert to int with scaling for 16-bit integer + data *= 32767 / np.max(np.abs(data)) # re-scaling + data = data.astype(np.int16) # change data type + + # select channel + data_to_reduce = data[self.channel] if self.channel is not None else data + return data_to_reduce + + def clean_audio(self, data: np.ndarray) -> np.ndarray: + try: + import noisereduce + except ImportError as e: + raise ImportError("Please install noisereduce package") from e + + reduced_noise = noisereduce.reduce_noise(y=data, sr=self.sample_rate) + + # add channel back after noise reduction + if self.channel is not None: + # putting the channel back in the data + data[self.channel] = reduced_noise + # updating the data to save + reduced_noise = data + + return reduced_noise + + +class DFN(ReduceNoiseBase): + def __init__( + self, + target_directory: Path, + verbose: bool = True, + silence_threshold: float = None, + pad: bool = True, + atten_lim_db: int = None, + **kwargs, + ): + super().__init__(target_directory, verbose, silence_threshold) + self.pad = pad + self.atten_lim_db = atten_lim_db + self.kwargs = kwargs + + # import required packages + try: + from df.enhance import init_df + except ImportError as e: + raise ImportError("Please install deepfilternet packages") from e + + if self.verbose: + _LOGGER.info("Loading DeepFilterNet2 model.") + + # Load the model: + model, df_state, _ = init_df() + self.model = model + self.df_state = df_state + self.sample_rate = self.df_state.sr() + + def save_audio(self, audio: np.ndarray, target_path: Path): + try: + from df.enhance import save_audio + except ImportError as e: + raise ImportError("Please install deepfilternet package") from e + save_audio( + file=target_path.name, + audio=audio, + sr=self.sample_rate, + output_dir=str(self.target_directory), + ) + + def load_audio(self, file: str) -> torch.Tensor: + try: + from df.enhance import load_audio + except ImportError as e: + raise ImportError("Please install deepfilternet package") from e + audio, _ = load_audio(file=file, sr=self.sample_rate, **self.kwargs) + return audio + + def clean_audio(self, data: torch.Tensor) -> torch.Tensor: + try: + from df.enhance import enhance + except ImportError as e: + raise ImportError("Please install deepfilternet package") from e + return enhance( + model=self.model, + df_state=self.df_state, + audio=data, + pad=self.pad, + atten_lim_db=self.atten_lim_db, + ) + + +def _multiprocessing_complete_tasks( + noise_reduce_type: Type[ReduceNoiseBase], + noise_reduce_arguments: dict, + tasks_queue: Queue, + results_queue: Queue, +): + """ + Complete the tasks in the given queue and put the results in the given results queue. The function will stop when + the given tasks queue will receive the stop mark. It is aimed to be used with multiprocessing as a process. + + :param noise_reduce_type: The noise reduce type to use. + :param noise_reduce_arguments: The noisereduce initialization kwargs. + :param tasks_queue: A queue to get the tasks from. + :param results_queue: A queue to put the results in. + """ + # Initialize the reduce noise object + noise_reducer = noise_reduce_type(**noise_reduce_arguments) + + # Start listening to the tasks queue: + while True: + # Get the audio_file: + audio_file = tasks_queue.get() + if audio_file == _MULTIPROCESSING_STOP_MARK: + break + audio_file = Path(audio_file) + # Apply noise reduction and collect the result: + results_queue.put(noise_reducer.reduce_noise(audio_file=audio_file)) + + # Mark the end of the tasks: + results_queue.put(_MULTIPROCESSING_STOP_MARK) + + +def reduce_noise_dfn( + audio_source: str, + target_directory: str, + pad: bool = True, + atten_lim_db: int = None, + silence_threshold: float = None, + use_multiprocessing: int = 0, + verbose: bool = True, + **kwargs, +): + """ + Reduce noise from audio files using DeepFilterNet. + For more information about the noise reduction algorithm see: + https://github.com/Rikorose/DeepFilterNet + Notice that the saved files are in wav format, even if the original files are in other format. + + :param audio_source: path to audio file or directory of audio files + :param target_directory: path to target directory to save cleaned audio files + :param pad: whether to pad the audio file with zeros before cleaning + :param atten_lim_db: maximum attenuation in dB + :param silence_threshold: the threshold to remove silence from the audio, in dB. If None, no silence removal is + performed. + :param use_multiprocessing: Number of processes to use for cleaning the audio files. + If 0, no multiprocessing is used. + :param verbose: verbosity level. If True, display progress bar and logs. + :param kwargs: additional arguments to pass to torchaudio.load(). For more information see: + https://pytorch.org/audio/stable/generated/torchaudio.load.html + """ + if verbose: + _LOGGER.info("Reducing noise from audio files.") + + # create target directory: + target_directory = _create_target_directory(target_directory) + + # get audio files: + audio_files = _get_audio_files(audio_source) + + noise_reduce_arguments = { + "target_directory": target_directory, + "pad": pad, + "atten_lim_db": atten_lim_db, + "silence_threshold": silence_threshold, + **kwargs, + } + + if use_multiprocessing: + results = _parallel_run( + noise_reduce_type=DFN, + noise_reduce_arguments=noise_reduce_arguments, + n_workers=use_multiprocessing, + audio_files=audio_files, + description="Noise-reduction", + verbose=verbose, + ) + else: + results = _run( + noise_reduce_type=DFN, + noise_reduce_arguments=noise_reduce_arguments, + audio_files=audio_files, + description="Noise-reduction", + verbose=verbose, + ) + + return _process_results(results, verbose) + + +def reduce_noise( + audio_source: str, + target_directory: str, + sample_rate: int = 16000, + duration: int = None, + channel: int = None, + silence_threshold: float = None, + use_multiprocessing: int = 0, + verbose: bool = True, +): + """ + Reduce noise from audio file or directory containing audio files. + The audio files must be in .wav format. + The cleaned audio files will be saved in the target_directory. + For information about the noise reduction algorithm see: + https://github.com/timsainb/noisereduce + Notice that the saved files are in wav format, even if the original files are in other format. + + :param audio_source: path to audio file or directory containing audio files + :param target_directory: path to directory to save the cleaned audio files. + :param sample_rate: Number of samples in one second in the audio file. + Pass `None` to keep the original sample rate. + :param duration: Duration of the audio file to clean in seconds. + Pass `None` to keep the original duration. + :param channel: Channel to clean. Pass the number of the channel to clean. + To clean all channels pass None. + :param silence_threshold: The threshold to remove silence from the audio, in dB. + If None, no silence removal is performed. + :param use_multiprocessing: Number of processes to use for cleaning the audio files. + If 0, no multiprocessing is used. + :param verbose: Verbosity level. If True, display progress bar. + """ + if verbose: + _LOGGER.info("Reducing noise from audio files.") + + # create target directory: + target_directory = _create_target_directory(target_directory) + + # get audio files: + audio_files = _get_audio_files(audio_source) + + # Create the reduce noise object: + noise_reduce_arguments = { + "target_directory": target_directory, + "sample_rate": sample_rate, + "duration": duration, + "channel": channel, + "silence_threshold": silence_threshold, + } + + if use_multiprocessing: + results = _parallel_run( + noise_reduce_type=ReduceNoise, + noise_reduce_arguments=noise_reduce_arguments, + n_workers=use_multiprocessing, + audio_files=audio_files, + description="Noise-reduction", + verbose=verbose, + ) + else: + results = _run( + noise_reduce_type=ReduceNoise, + noise_reduce_arguments=noise_reduce_arguments, + audio_files=audio_files, + description="Noise-reduction", + verbose=verbose, + ) + + return _process_results(results, verbose) + + +def _create_target_directory(target_directory: str) -> str: + target_directory = Path(target_directory) + if not target_directory.exists(): + target_directory.mkdir(parents=True, exist_ok=True) + return str(target_directory) + + +def _get_audio_files(audio_source: str): + audio_source = Path(audio_source) + audio_files = [] + if audio_source.is_dir(): + audio_files = list(audio_source.glob("*.*")) + elif audio_source.is_file(): + audio_files.append(audio_source) + else: + raise ValueError( + f"audio_source must be a file or a directory, got {audio_source}" + ) + return audio_files + + +def _parallel_run( + noise_reduce_type: Type[ReduceNoiseBase], + noise_reduce_arguments: dict, + n_workers: int, + audio_files: List[Path], + description: str, + verbose: bool, +) -> List[Tuple[bool, Tuple[str, str]]]: + """ + Run multiple noise reduce workers with multiprocessing to complete the tasks that will be created on the provided + files using the given task creator. + + :param noise_reduce_type: The noise reduce type to use. + :param n_workers: The number of workers to use. + :param audio_files: The audio files to use. + :param description: The description to use for the progress bar. + :param verbose: Verbosity. + + :returns: The collected results. + """ + # Check the number of workers: + if n_workers > len(audio_files): + _LOGGER.warning( + f"The number of workers ({n_workers}) is larger than the number of audio files ({len(audio_files)}). " + f"Setting the number of workers to {len(audio_files)}." + ) + n_workers = len(audio_files) + + # Initialize the multiprocessing queues: + tasks_queue = Queue() + results_queue = Queue() + + # Initialize the multiprocessing processes: + task_completion_processes = [ + Process( + target=_multiprocessing_complete_tasks, + kwargs={ + "noise_reduce_type": noise_reduce_type, + "noise_reduce_arguments": noise_reduce_arguments, + "tasks_queue": tasks_queue, + "results_queue": results_queue, + }, + ) + for _ in range(n_workers) + ] + + # Start the multiprocessing processes: + for p in task_completion_processes: + p.start() + + # Put the tasks in the queue: + for audio_file in audio_files: + # tasks_queue.put(task_creator.create_task(audio_file=audio_file).to_tuple()) + tasks_queue.put(audio_file) + + # Put the stop marks in the queue: + for _ in range(n_workers): + tasks_queue.put(_MULTIPROCESSING_STOP_MARK) + + # Collect the results: + results = [] + stop_marks_counter = 0 + with tqdm( + desc=description, + unit="file", + total=len(audio_files), + disable=not verbose, + ) as progressbar: + while True: + # Get a result from the queue: + result: Tuple[bool, Tuple[str, str]] = results_queue.get() + if result == _MULTIPROCESSING_STOP_MARK: + stop_marks_counter += 1 + if stop_marks_counter == n_workers: + break + else: + # Collect the result: + results.append(result) + progressbar.update(1) + + # Wait for the processes to finish: + for p in task_completion_processes: + p.join() + + return results + + +def _run( + noise_reduce_type: Type[ReduceNoiseBase], + noise_reduce_arguments: dict, + audio_files: List[Path], + description: str, + verbose: bool, +) -> List[Tuple[bool, Tuple[str, str]]]: + """ + Run the noise reduce algorithm on the given audio files and collect the results. + + :param noise_reduce_type: The noise reduce type to use. + :param noise_reduce_arguments: The noisereduce initialization kwargs. + :param audio_files: The audio files to use. + :param description: The description to use for the progress bar. + :param verbose: Verbosity. + + :returns: The collected results. + """ + # Create the reduce noise object: + noise_reducer = noise_reduce_type(**noise_reduce_arguments) + + # Run the noise reduce algorithm on the audio files and collect the results: + results = [] + for audio_file in tqdm( + audio_files, + desc=description, + unit="file", + total=len(audio_files), + disable=not verbose, + ): + results.append(noise_reducer.reduce_noise(audio_file=audio_file)) + + return results + + +def _process_results( + results: List[Tuple[bool, Tuple[str, str]]], verbose: bool +) -> Tuple[dict, dict]: + """ + Process the results of the tasks. + + :param results: The results to process. + :param verbose: Verbosity. + + :returns: The processed results as a tuple of successes and errors. + """ + if verbose: + _LOGGER.info("Summarizing the results.") + successes = {} + errors = {} + for is_error, result in results: + if is_error: + errors[result[0]] = result[1] + else: + successes[result[0]] = result[1] + if verbose: + _LOGGER.info(f"Done ({len(successes)}/{len(successes) + len(errors)})\n") + + return successes, errors diff --git a/noise_reduction/requirements.txt b/noise_reduction/requirements.txt new file mode 100644 index 000000000..30934ad7c --- /dev/null +++ b/noise_reduction/requirements.txt @@ -0,0 +1,5 @@ +tqdm +deepfilternet +librosa +noisereduce +torchaudio>=2.1.2 \ No newline at end of file diff --git a/noise_reduction/test_noise_reduction.py b/noise_reduction/test_noise_reduction.py new file mode 100644 index 000000000..a77377565 --- /dev/null +++ b/noise_reduction/test_noise_reduction.py @@ -0,0 +1,75 @@ +import tempfile + +import mlrun +import pytest + + +@pytest.mark.parametrize( + "audio_source", + [ + "data/test_data.wav", + "data/test_data.mp3", + "data", + ], +) +def test_reduce_noise(audio_source): + # set up the project and function + artifact_path = tempfile.TemporaryDirectory().name + project = mlrun.new_project("noise-reduction") + noise_reduction_function = project.set_function( + func="function.yaml", + name="reduce_noise", + kind="job", + image="mlrun/mlrun", + ) + + # run the function + noise_reduction_run = noise_reduction_function.run( + handler="reduce_noise", + inputs={"audio_source": audio_source}, + params={ + "target_directory": artifact_path + "/data", + "sample_rate": None, + }, + local=True, + artifact_path=artifact_path, + returns=["successes: file", "errors: file"], + ) + + assert noise_reduction_run.outputs["successes"] + + +@pytest.mark.parametrize( + "audio_source", + [ + "data/test_data.wav", + "data/test_data.mp3", + "data", + ], +) +def test_reduce_noise_dfn(audio_source): + # set up the project and function + artifact_path = tempfile.TemporaryDirectory().name + project = mlrun.new_project("noise-reduction") + noise_reduction_function = project.set_function( + func="function.yaml", + name="reduce_noise", + kind="job", + image="mlrun/mlrun", + ) + + # run the function + noise_reduction_run = noise_reduction_function.run( + handler="reduce_noise_dfn", + inputs={"audio_source": audio_source}, + params={ + "target_directory": artifact_path + "/data", + "atten_lim_db": 50, + }, + local=True, + artifact_path=artifact_path, + returns=["successes: file", "errors: file"], + ) + + # assert that the function run completed successfully + assert noise_reduction_run.outputs["successes"] From 1e0cb66aba9cbe29c1066ef2b27b9e23d09a89d2 Mon Sep 17 00:00:00 2001 From: Eyal Danieli Date: Wed, 28 Aug 2024 11:52:53 +0300 Subject: [PATCH 12/38] delete `load_dask` (#822) --- README.md | 1 - catalog.json | 2 +- catalog.yaml | 9 -- load_dask/function.yaml | 75 --------- load_dask/item.yaml | 25 --- load_dask/load_dask.ipynb | 309 -------------------------------------- load_dask/load_dask.py | 68 --------- 7 files changed, 1 insertion(+), 488 deletions(-) delete mode 100644 load_dask/function.yaml delete mode 100644 load_dask/item.yaml delete mode 100644 load_dask/load_dask.ipynb delete mode 100644 load_dask/load_dask.py diff --git a/README.md b/README.md index 9a1e74821..1136c963d 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,6 @@ it is expected that contributors follow certain guidelines/protocols (please chi | [feature-selection](feature_selection/feature_selection.ipynb) | job | Select features through multiple Statistical and Model filters | data-prep, ml | | [gen-class-data](gen_class_data/gen_class_data.ipynb) | job | Create a binary classification sample dataset and save. | data-prep | | [github-utils](github_utils/github_utils.ipynb) | job | add comments to github pull request | notifications, utils | -| [load-dask](load_dask/load_dask.ipynb) | dask | load dask cluster with data | data-movement, utils | | [load-dataset](load_dataset/load_dataset.ipynb) | job | load a toy dataset from scikit-learn | data-source, ml | | [model-monitoring-batch](model_monitoring_batch/model_monitoring_batch.ipynb) | job | | | | [model-monitoring-stream](model_monitoring_stream/model_monitoring_stream.ipynb) | nuclio | | | diff --git a/catalog.json b/catalog.json index 6fff9830c..4bcc4022d 100644 --- a/catalog.json +++ b/catalog.json @@ -1 +1 @@ -{"aggregate": {"description": "Rolling aggregation over Metrics and Lables according to specifications", "categories": ["data-prep"], "kind": "job", "docfile": "aggregate/aggregate.ipynb", "versions": {"latest": "aggregate/function.yaml"}}, "arc-to-parquet": {"description": "retrieve remote archive, open and save as parquet", "categories": ["data-movement", "utils"], "kind": "job", "docfile": "arc_to_parquet/arc_to_parquet.ipynb", "versions": {"latest": "arc_to_parquet/function.yaml"}}, "bert-embeddings": {"description": "Get BERT based embeddings for given text", "categories": ["NLP", "BERT", "embeddings"], "kind": "remote", "docfile": "bert_embeddings/bert_embeddings.ipynb", "versions": {"latest": "bert_embeddings/function.yaml"}}, "churn-server": {"description": "churn classification and predictor", "categories": ["serving", "ml"], "kind": "serving", "docfile": "churn_server/churn_server.ipynb", "versions": {"latest": "churn_server/function.yaml"}}, "concept-drift": {"description": "Deploy a streaming Concept Drift detector on a labeled stream", "categories": ["ml", "serve"], "kind": "job", "docfile": "concept_drift/concept_drift.ipynb", "versions": {"latest": "concept_drift/function.yaml"}}, "concept-drift-streaming": {"description": "Deploy a streaming Concept Drift detector on a labeled stream. the nuclio part of the concept_drift function", "categories": ["ml", "serve"], "kind": "remote", "docfile": "concept_drift_streaming/concept_drift_streaming.ipynb", "versions": {"latest": "concept_drift_streaming/function.yaml"}}, "coxph-test": {"description": "Test cox proportional hazards model", "categories": ["ml", "test"], "kind": "job", "docfile": "coxph_test/coxph_test.ipynb", "versions": {"latest": "coxph_test/function.yaml"}}, "coxph-trainer": {"description": "cox proportional hazards, kaplan meier plots", "categories": ["training", "ml"], "kind": "job", "docfile": "coxph_trainer/coxph_trainer.ipynb", "versions": {"latest": "coxph_trainer/function.yaml"}}, "describe": {"description": "describe and visualizes dataset stats", "categories": ["analysis"], "kind": "job", "docfile": "describe/describe.ipynb", "versions": {"latest": "describe/function.yaml"}}, "describe-dask": {"description": "describe and visualizes dataset stats", "categories": ["analysis"], "kind": "job", "docfile": "describe_dask/describe_dask.ipynb", "versions": {"latest": "describe_dask/function.yaml"}}, "describe-spark": {"description": "", "categories": [], "kind": "job", "docfile": "describe_spark/describe_spark.ipynb", "versions": {"latest": "describe_spark/function.yaml"}}, "feature-perms": {"description": "estimate feature importances using permutations", "categories": ["analysis"], "kind": "job", "docfile": "feature_perms/feature_perms.ipynb", "versions": {"latest": "feature_perms/function.yaml"}}, "feature-selection": {"description": "Select features through multiple Statistical and Model filters", "categories": ["data-prep", "ml"], "kind": "job", "docfile": "feature_selection/feature_selection.ipynb", "versions": {"latest": "feature_selection/function.yaml"}}, "gen-class-data": {"description": "Create a binary classification sample dataset and save.", "categories": ["data-prep"], "kind": "job", "docfile": "gen_class_data/gen_class_data.ipynb", "versions": {"latest": "gen_class_data/function.yaml"}}, "github-utils": {"description": "add comments to github pull request", "categories": ["notifications", "utils"], "kind": "job", "docfile": "github_utils/github_utils.ipynb", "versions": {"latest": "github_utils/function.yaml"}}, "load-dask": {"description": "load dask cluster with data", "categories": ["data-movement", "utils"], "kind": "dask", "docfile": "load_dask/load_dask.ipynb", "versions": {"latest": "load_dask/function.yaml"}}, "load-dataset": {"description": "load a toy dataset from scikit-learn", "categories": ["data-source", "ml"], "kind": "job", "docfile": "load_dataset/load_dataset.ipynb", "versions": {"latest": "load_dataset/function.yaml"}}, "model-monitoring-batch": {"description": "", "categories": [], "kind": "job", "docfile": "model_monitoring_batch/model_monitoring_batch.ipynb", "versions": {"latest": "model_monitoring_batch/function.yaml"}}, "model-monitoring-stream": {"description": "", "categories": [], "kind": "remote", "docfile": "model_monitoring_stream/model_monitoring_stream.ipynb", "versions": {"latest": "model_monitoring_stream/function.yaml"}}, "model-server": {"description": "generic sklearn model server", "categories": ["serving", "ml"], "kind": "remote", "docfile": "model_server/model_server.ipynb", "versions": {"latest": "model_server/function.yaml"}}, "model-server-tester": {"description": "test model servers", "categories": ["ml", "test"], "kind": "job", "docfile": "model_server_tester/model_server_tester.ipynb", "versions": {"latest": "model_server_tester/function.yaml"}}, "open-archive": {"description": "Open a file/object archive into a target directory", "categories": ["data-movement", "utils"], "kind": "job", "docfile": "open_archive/open_archive.ipynb", "versions": {"latest": "open_archive/function.yaml"}}, "pandas-profiling-report": {"description": "Create Pandas Profiling Report from Dataset", "categories": ["analysis"], "kind": "job", "docfile": "pandas_profiling_report/pandas_profiling_report.ipynb", "versions": {"latest": "pandas_profiling_report/function.yaml"}}, "project-runner": {"description": "Nuclio based - Cron scheduler for running your MLRun projects", "categories": ["utils"], "kind": "remote", "docfile": "project_runner/project_runner.ipynb", "versions": {"latest": "project_runner/function.yaml"}}, "rnn-serving": {"description": "deploy an rnn based stock analysis model server.", "categories": ["model-serving"], "kind": "serving", "docfile": "rnn_serving/rnn_serving.ipynb", "versions": {"latest": "rnn_serving/function.yaml"}}, "send-email": {"description": "Send Email messages through SMTP server", "categories": ["notifications"], "kind": "job", "docfile": "send_email/send_email.ipynb", "versions": {"latest": "send_email/function.yaml"}}, "sentiment-analysis-serving": {"description": "BERT based sentiment classification model", "categories": ["serving", "NLP", "BERT", "sentiment analysis"], "kind": "serving", "docfile": "sentiment_analysis_serving/sentiment_analysis_serving.ipynb", "versions": {"latest": "sentiment_analysis_serving/function.yaml"}}, "sklearn-classifier": {"description": "train any classifier using scikit-learn's API", "categories": ["ml", "training"], "kind": "job", "docfile": "sklearn_classifier/sklearn_classifier.ipynb", "versions": {"latest": "sklearn_classifier/function.yaml"}}, "sklearn-classifier-dask": {"description": "train any classifier using scikit-learn's API over Dask", "categories": ["ml", "training", "dask"], "kind": "job", "docfile": "sklearn_classifier_dask/sklearn_classifier_dask.ipynb", "versions": {"latest": "sklearn_classifier_dask/function.yaml"}}, "slack-notify": {"description": "Send Slack notification", "categories": ["ops"], "kind": "job", "docfile": "slack_notify/slack_notify.ipynb", "versions": {"latest": "slack_notify/function.yaml"}}, "spark-submit": {"description": "", "categories": [], "kind": "job", "docfile": "spark_submit/spark_submit.ipynb", "versions": {"latest": "spark_submit/function.yaml"}}, "sql-to-file": {"description": "SQL To File - Ingest data using SQL query", "categories": ["data-prep"], "kind": "job", "docfile": "sql_to_file/sql_to_file.ipynb", "versions": {"latest": "sql_to_file/function.yaml"}}, "stream-to-parquet": {"description": "Saves a stream to Parquet and can lunch drift detection task on it", "categories": ["ml", "serve"], "kind": "remote", "docfile": "stream_to_parquet/stream_to_parquet.ipynb", "versions": {"latest": "stream_to_parquet/function.yaml"}}, "test-classifier": {"description": "test a classifier using held-out or new data", "categories": ["ml", "test"], "kind": "job", "docfile": "test_classifier/test_classifier.ipynb", "versions": {"latest": "test_classifier/function.yaml"}}, "tf1-serving": {"description": "tf1 image classification server", "categories": ["serving", "dl"], "kind": "remote", "docfile": "tf1_serving/tf1_serving.ipynb", "versions": {"latest": "tf1_serving/function.yaml"}}, "tf2-serving": {"description": "tf2 image classification server", "categories": ["serving", "dl"], "kind": "remote", "docfile": "tf2_serving/tf2_serving.ipynb", "versions": {"latest": "tf2_serving/function.yaml"}}, "tf2-serving-v2": {"description": "tf2 image classification server v2", "categories": ["serving", "dl"], "kind": "serving", "docfile": "tf2_serving_v2/tf2_serving_v2.ipynb", "versions": {"latest": "tf2_serving_v2/function.yaml"}}, "v2-model-server": {"description": "generic sklearn model server", "categories": ["serving", "ml"], "kind": "serving", "docfile": "v2_model_server/v2_model_server.ipynb", "versions": {"latest": "v2_model_server/function.yaml"}}, "v2-model-tester": {"description": "test v2 model servers", "categories": ["ml", "test"], "kind": "job", "docfile": "v2_model_tester/v2_model_tester.ipynb", "versions": {"latest": "v2_model_tester/function.yaml"}}, "virtual-drift": {"description": "Compute drift magnitude between Time-Samples T and U", "categories": ["ml", "serve", "concept-drift"], "kind": "job", "docfile": "virtual_drift/virtual_drift.ipynb", "versions": {"latest": "virtual_drift/function.yaml"}}, "xgb-custom": {"description": "simulate data with outliers.", "categories": ["model-testing"], "kind": "job", "docfile": "xgb_custom/xgb_custom.ipynb", "versions": {"latest": "xgb_custom/function.yaml"}}, "xgb-serving": {"description": "deploy an XGBoost model server.", "categories": ["model-serving"], "kind": "remote", "docfile": "xgb_serving/xgb_serving.ipynb", "versions": {"latest": "xgb_serving/function.yaml"}}, "xgb-test": {"description": "Test one or more classifier models against held-out dataset.", "categories": ["model-test"], "kind": "job", "docfile": "xgb_test/xgb_test.ipynb", "versions": {"latest": "xgb_test/function.yaml"}}, "xgb-trainer": {"description": "train multiple model types using xgboost.", "categories": ["model-prep"], "kind": "job", "docfile": "xgb_trainer/xgb_trainer.ipynb", "versions": {"latest": "xgb_trainer/function.yaml"}}} \ No newline at end of file +{"aggregate": {"description": "Rolling aggregation over Metrics and Lables according to specifications", "categories": ["data-prep"], "kind": "job", "docfile": "aggregate/aggregate.ipynb", "versions": {"latest": "aggregate/function.yaml"}}, "arc-to-parquet": {"description": "retrieve remote archive, open and save as parquet", "categories": ["data-movement", "utils"], "kind": "job", "docfile": "arc_to_parquet/arc_to_parquet.ipynb", "versions": {"latest": "arc_to_parquet/function.yaml"}}, "bert-embeddings": {"description": "Get BERT based embeddings for given text", "categories": ["NLP", "BERT", "embeddings"], "kind": "remote", "docfile": "bert_embeddings/bert_embeddings.ipynb", "versions": {"latest": "bert_embeddings/function.yaml"}}, "churn-server": {"description": "churn classification and predictor", "categories": ["serving", "ml"], "kind": "serving", "docfile": "churn_server/churn_server.ipynb", "versions": {"latest": "churn_server/function.yaml"}}, "concept-drift": {"description": "Deploy a streaming Concept Drift detector on a labeled stream", "categories": ["ml", "serve"], "kind": "job", "docfile": "concept_drift/concept_drift.ipynb", "versions": {"latest": "concept_drift/function.yaml"}}, "concept-drift-streaming": {"description": "Deploy a streaming Concept Drift detector on a labeled stream. the nuclio part of the concept_drift function", "categories": ["ml", "serve"], "kind": "remote", "docfile": "concept_drift_streaming/concept_drift_streaming.ipynb", "versions": {"latest": "concept_drift_streaming/function.yaml"}}, "coxph-test": {"description": "Test cox proportional hazards model", "categories": ["ml", "test"], "kind": "job", "docfile": "coxph_test/coxph_test.ipynb", "versions": {"latest": "coxph_test/function.yaml"}}, "coxph-trainer": {"description": "cox proportional hazards, kaplan meier plots", "categories": ["training", "ml"], "kind": "job", "docfile": "coxph_trainer/coxph_trainer.ipynb", "versions": {"latest": "coxph_trainer/function.yaml"}}, "describe": {"description": "describe and visualizes dataset stats", "categories": ["analysis"], "kind": "job", "docfile": "describe/describe.ipynb", "versions": {"latest": "describe/function.yaml"}}, "describe-dask": {"description": "describe and visualizes dataset stats", "categories": ["analysis"], "kind": "job", "docfile": "describe_dask/describe_dask.ipynb", "versions": {"latest": "describe_dask/function.yaml"}}, "describe-spark": {"description": "", "categories": [], "kind": "job", "docfile": "describe_spark/describe_spark.ipynb", "versions": {"latest": "describe_spark/function.yaml"}}, "feature-perms": {"description": "estimate feature importances using permutations", "categories": ["analysis"], "kind": "job", "docfile": "feature_perms/feature_perms.ipynb", "versions": {"latest": "feature_perms/function.yaml"}}, "feature-selection": {"description": "Select features through multiple Statistical and Model filters", "categories": ["data-prep", "ml"], "kind": "job", "docfile": "feature_selection/feature_selection.ipynb", "versions": {"latest": "feature_selection/function.yaml"}}, "gen-class-data": {"description": "Create a binary classification sample dataset and save.", "categories": ["data-prep"], "kind": "job", "docfile": "gen_class_data/gen_class_data.ipynb", "versions": {"latest": "gen_class_data/function.yaml"}}, "github-utils": {"description": "add comments to github pull request", "categories": ["notifications", "utils"], "kind": "job", "docfile": "github_utils/github_utils.ipynb", "versions": {"latest": "github_utils/function.yaml"}}, "load-dataset": {"description": "load a toy dataset from scikit-learn", "categories": ["data-source", "ml"], "kind": "job", "docfile": "load_dataset/load_dataset.ipynb", "versions": {"latest": "load_dataset/function.yaml"}}, "model-monitoring-batch": {"description": "", "categories": [], "kind": "job", "docfile": "model_monitoring_batch/model_monitoring_batch.ipynb", "versions": {"latest": "model_monitoring_batch/function.yaml"}}, "model-monitoring-stream": {"description": "", "categories": [], "kind": "remote", "docfile": "model_monitoring_stream/model_monitoring_stream.ipynb", "versions": {"latest": "model_monitoring_stream/function.yaml"}}, "model-server": {"description": "generic sklearn model server", "categories": ["serving", "ml"], "kind": "remote", "docfile": "model_server/model_server.ipynb", "versions": {"latest": "model_server/function.yaml"}}, "model-server-tester": {"description": "test model servers", "categories": ["ml", "test"], "kind": "job", "docfile": "model_server_tester/model_server_tester.ipynb", "versions": {"latest": "model_server_tester/function.yaml"}}, "open-archive": {"description": "Open a file/object archive into a target directory", "categories": ["data-movement", "utils"], "kind": "job", "docfile": "open_archive/open_archive.ipynb", "versions": {"latest": "open_archive/function.yaml"}}, "pandas-profiling-report": {"description": "Create Pandas Profiling Report from Dataset", "categories": ["analysis"], "kind": "job", "docfile": "pandas_profiling_report/pandas_profiling_report.ipynb", "versions": {"latest": "pandas_profiling_report/function.yaml"}}, "project-runner": {"description": "Nuclio based - Cron scheduler for running your MLRun projects", "categories": ["utils"], "kind": "remote", "docfile": "project_runner/project_runner.ipynb", "versions": {"latest": "project_runner/function.yaml"}}, "rnn-serving": {"description": "deploy an rnn based stock analysis model server.", "categories": ["model-serving"], "kind": "serving", "docfile": "rnn_serving/rnn_serving.ipynb", "versions": {"latest": "rnn_serving/function.yaml"}}, "send-email": {"description": "Send Email messages through SMTP server", "categories": ["notifications"], "kind": "job", "docfile": "send_email/send_email.ipynb", "versions": {"latest": "send_email/function.yaml"}}, "sentiment-analysis-serving": {"description": "BERT based sentiment classification model", "categories": ["serving", "NLP", "BERT", "sentiment analysis"], "kind": "serving", "docfile": "sentiment_analysis_serving/sentiment_analysis_serving.ipynb", "versions": {"latest": "sentiment_analysis_serving/function.yaml"}}, "sklearn-classifier": {"description": "train any classifier using scikit-learn's API", "categories": ["ml", "training"], "kind": "job", "docfile": "sklearn_classifier/sklearn_classifier.ipynb", "versions": {"latest": "sklearn_classifier/function.yaml"}}, "sklearn-classifier-dask": {"description": "train any classifier using scikit-learn's API over Dask", "categories": ["ml", "training", "dask"], "kind": "job", "docfile": "sklearn_classifier_dask/sklearn_classifier_dask.ipynb", "versions": {"latest": "sklearn_classifier_dask/function.yaml"}}, "slack-notify": {"description": "Send Slack notification", "categories": ["ops"], "kind": "job", "docfile": "slack_notify/slack_notify.ipynb", "versions": {"latest": "slack_notify/function.yaml"}}, "spark-submit": {"description": "", "categories": [], "kind": "job", "docfile": "spark_submit/spark_submit.ipynb", "versions": {"latest": "spark_submit/function.yaml"}}, "sql-to-file": {"description": "SQL To File - Ingest data using SQL query", "categories": ["data-prep"], "kind": "job", "docfile": "sql_to_file/sql_to_file.ipynb", "versions": {"latest": "sql_to_file/function.yaml"}}, "stream-to-parquet": {"description": "Saves a stream to Parquet and can lunch drift detection task on it", "categories": ["ml", "serve"], "kind": "remote", "docfile": "stream_to_parquet/stream_to_parquet.ipynb", "versions": {"latest": "stream_to_parquet/function.yaml"}}, "test-classifier": {"description": "test a classifier using held-out or new data", "categories": ["ml", "test"], "kind": "job", "docfile": "test_classifier/test_classifier.ipynb", "versions": {"latest": "test_classifier/function.yaml"}}, "tf1-serving": {"description": "tf1 image classification server", "categories": ["serving", "dl"], "kind": "remote", "docfile": "tf1_serving/tf1_serving.ipynb", "versions": {"latest": "tf1_serving/function.yaml"}}, "tf2-serving": {"description": "tf2 image classification server", "categories": ["serving", "dl"], "kind": "remote", "docfile": "tf2_serving/tf2_serving.ipynb", "versions": {"latest": "tf2_serving/function.yaml"}}, "tf2-serving-v2": {"description": "tf2 image classification server v2", "categories": ["serving", "dl"], "kind": "serving", "docfile": "tf2_serving_v2/tf2_serving_v2.ipynb", "versions": {"latest": "tf2_serving_v2/function.yaml"}}, "v2-model-server": {"description": "generic sklearn model server", "categories": ["serving", "ml"], "kind": "serving", "docfile": "v2_model_server/v2_model_server.ipynb", "versions": {"latest": "v2_model_server/function.yaml"}}, "v2-model-tester": {"description": "test v2 model servers", "categories": ["ml", "test"], "kind": "job", "docfile": "v2_model_tester/v2_model_tester.ipynb", "versions": {"latest": "v2_model_tester/function.yaml"}}, "virtual-drift": {"description": "Compute drift magnitude between Time-Samples T and U", "categories": ["ml", "serve", "concept-drift"], "kind": "job", "docfile": "virtual_drift/virtual_drift.ipynb", "versions": {"latest": "virtual_drift/function.yaml"}}, "xgb-custom": {"description": "simulate data with outliers.", "categories": ["model-testing"], "kind": "job", "docfile": "xgb_custom/xgb_custom.ipynb", "versions": {"latest": "xgb_custom/function.yaml"}}, "xgb-serving": {"description": "deploy an XGBoost model server.", "categories": ["model-serving"], "kind": "remote", "docfile": "xgb_serving/xgb_serving.ipynb", "versions": {"latest": "xgb_serving/function.yaml"}}, "xgb-test": {"description": "Test one or more classifier models against held-out dataset.", "categories": ["model-test"], "kind": "job", "docfile": "xgb_test/xgb_test.ipynb", "versions": {"latest": "xgb_test/function.yaml"}}, "xgb-trainer": {"description": "train multiple model types using xgboost.", "categories": ["model-prep"], "kind": "job", "docfile": "xgb_trainer/xgb_trainer.ipynb", "versions": {"latest": "xgb_trainer/function.yaml"}}} \ No newline at end of file diff --git a/catalog.yaml b/catalog.yaml index 2b9d7c6b0..c3364fefa 100644 --- a/catalog.yaml +++ b/catalog.yaml @@ -128,15 +128,6 @@ github-utils: kind: job versions: latest: github_utils/function.yaml -load-dask: - categories: - - data-movement - - utils - description: load dask cluster with data - docfile: load_dask/load_dask.ipynb - kind: dask - versions: - latest: load_dask/function.yaml load-dataset: categories: - data-source diff --git a/load_dask/function.yaml b/load_dask/function.yaml deleted file mode 100644 index a0f73c5fe..000000000 --- a/load_dask/function.yaml +++ /dev/null @@ -1,75 +0,0 @@ -kind: dask -metadata: - name: load-dask - tag: '' - hash: 2af86b4c6ce0bc3e3d0468c1b66a5358482f383e - project: '' - labels: - author: yjb - categories: - - data-preparation - - etl -spec: - command: '' - image: mlrun/ml-models - env: [] - build: - functionSourceCode: ZnJvbSBtbHJ1bi5leGVjdXRpb24gaW1wb3J0IE1MQ2xpZW50Q3R4CmZyb20gbWxydW4uZGF0YXN0b3JlIGltcG9ydCBEYXRhSXRlbQoKZnJvbSB0eXBpbmcgaW1wb3J0IExpc3QsIE9wdGlvbmFsCgoKZGVmIGxvYWRfZGFzaygKICAgICAgICBjb250ZXh0OiBNTENsaWVudEN0eCwKICAgICAgICBzcmNfZGF0YTogRGF0YUl0ZW0sCiAgICAgICAgZGFza19rZXk6IHN0ciA9ICJkYXNrX2tleSIsCiAgICAgICAgaW5jX2NvbHM6IE9wdGlvbmFsW0xpc3Rbc3RyXV0gPSBOb25lLAogICAgICAgIGluZGV4X2NvbHM6IE9wdGlvbmFsW0xpc3Rbc3RyXV0gPSBOb25lLAogICAgICAgIGRhc2tfcGVyc2lzdDogYm9vbCA9IFRydWUsCiAgICAgICAgcmVmcmVzaF9kYXRhOiBib29sID0gVHJ1ZSwKICAgICAgICBzY2hlZHVsZXJfa2V5OiBzdHIgPSAic2NoZWR1bGVyIgopIC0+IE5vbmU6CiAgICAiIiJMb2FkIGRhdGFzZXQgaW50byBhbiBleGlzdGluZyBkYXNrIGNsdXN0ZXIKCiAgICBkYXNrIGpvYnMgZGVmaW5lIHRoZSBkYXNrIGNsaWVudCBwYXJhbWV0ZXJzIGF0IHRoZSBqb2IgbGV2ZWwsIHRoaXMgbWV0aG9kIHdpbGwgcmFpc2UgYW4gZXJyb3IgaWYgbm8gY2xpZW50IGlzIGRldGVjdGVkLgoKICAgIDpwYXJhbSBjb250ZXh0OiAgICAgICAgIHRoZSBmdW5jdGlvbiBjb250ZXh0CiAgICA6cGFyYW0gc3JjX2RhdGE6ICAgICAgICB1cmwgb2YgdGhlIGRhdGEgZmlsZSBvciBwYXJ0aXRpb25lZCBkYXRhc2V0IGFzIGVpdGhlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3QgRGF0YUl0ZW0sIHN0cmluZywgb3IgcGF0aCBvYmplY3QgKHNpbWlsYXIgdG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmRhcyByZWFkX2NzdikKICAgIDpwYXJhbSBkYXNrX2tleTogICAgICAgIGRlc3RpbmF0aW9uIGtleSBvZiBkYXRhIG9uIGRhc2sgY2x1c3RlciBhbmQgYXJ0aWZhY3Qgc3RvcmUKICAgIDpwYXJhbSBpbmNfY29sczogICAgICAgIGluY2x1ZGUgb25seSB0aGVzZSBjb2x1bW5zICh2ZXJ5IGZhc3QpCiAgICA6cGFyYW0gaW5kZXhfY29sczogICAgICBsaXN0IG9mIGluZGV4IGNvbHVtbiBuYW1lcyAoY2FuIGJlIGEgbG9uZy1ydW5uaW5nIHByb2Nlc3MpCiAgICA6cGFyYW0gZGFza19wZXJzaXN0OiAgICAoVHJ1ZSkgc2hvdWxkIHRoZSBkYXRhIGJlIHBlcnNpc3RlZCAodGhyb3VnaCB0aGUgYGNsaWVudC5wZXJzaXN0YCBvcCkKICAgIDpwYXJhbSByZWZyZXNoX2RhdGE6ICAgIChGYWxzZSkgaWYgdGhlIGRhc2tfa2V5IGFscmVhZHkgZXhpc3RzIGluIHRoZSBkYXNrIGNsdXN0ZXIsIHRoaXMgd2lsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgYW4gRXhjZXB0aW9uLiAgU2V0IHRvIFRydWUgdG8gcmVwbGFjZSB0aGUgZXhpc3RpbmcgY2x1c3RlciBkYXRhLgogICAgOnBhcmFtIHNjaGVkdWxlcl9rZXk6ICAgKHNjaGVkdWxlcikgdGhlIGRhc2sgc2NoZWR1bGVyIGNvbmZpZ3VyYXRpb24sIGpzb24gYWxzbyBsb2dnZWQgYXMgYW4gYXJ0aWZhY3QKICAgICIiIgogICAgaWYgaGFzYXR0cihjb250ZXh0LCAiZGFza19jbGllbnQiKToKICAgICAgICBkYXNrX2NsaWVudCA9IGNvbnRleHQuZGFza19jbGllbnQKICAgIGVsc2U6CiAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJhIGRhc2sgY2xpZW50IHdhcyBub3QgZm91bmQgaW4gdGhlIGV4ZWN1dGlvbiBjb250ZXh0IikKCiAgICBkZiA9IHNyY19kYXRhLmFzX2RmKGRmX21vZHVsZT1kZCkKCiAgICBpZiBkYXNrX3BlcnNpc3Q6CiAgICAgICAgZGYgPSBkYXNrX2NsaWVudC5wZXJzaXN0KGRmKQogICAgICAgIGlmIGRhc2tfY2xpZW50LmRhdGFzZXRzIGFuZCBkYXNrX2tleSBpbiBkYXNrX2NsaWVudC5kYXRhc2V0czoKICAgICAgICAgICAgZGFza19jbGllbnQudW5wdWJsaXNoX2RhdGFzZXQoZGFza19rZXkpCiAgICAgICAgZGFza19jbGllbnQucHVibGlzaF9kYXRhc2V0KGRmLCBuYW1lPWRhc2tfa2V5KQoKICAgIGlmIGNvbnRleHQ6CiAgICAgICAgY29udGV4dC5kYXNrX2NsaWVudCA9IGRhc2tfY2xpZW50CgogICAgIyBzaGFyZSB0aGUgc2NoZWR1bGVyLCB3aGV0aGVyIGRhdGEgaXMgcGVyc2lzdGVkIG9yIG5vdAogICAgZGFza19jbGllbnQud3JpdGVfc2NoZWR1bGVyX2ZpbGUoc2NoZWR1bGVyX2tleSArICIuanNvbiIpCgogICAgIyB3ZSBkb24ndCB1c2UgbG9nX2RhdGFzZXQgaGVyZSB1bnRpbCBpdCBjYW4gdGFrZSBpbnRvIGFjY291bnQKICAgICMgZGFzayBvcmlnaW4gYW5kIGFwcGx5IGRhc2sgZGVzY3JpYmUuCiAgICBjb250ZXh0LmxvZ19hcnRpZmFjdChzY2hlZHVsZXJfa2V5LCBsb2NhbF9wYXRoPXNjaGVkdWxlcl9rZXkgKyAiLmpzb24iKQ== - commands: [] - code_origin: https://github.com/daniels290813/functions.git#55a79c32be5d233cc11efcf40cd3edbe309bfdef:/home/kali/functions/load_dask/load_dask.py - default_handler: load_dask - entry_points: - load_dask: - name: load_dask - doc: 'Load dataset into an existing dask cluster - - - dask jobs define the dask client parameters at the job level, this method - will raise an error if no client is detected.' - parameters: - - name: context - type: MLClientCtx - doc: the function context - default: '' - - name: src_data - type: DataItem - doc: url of the data file or partitioned dataset as either artifact DataItem, - string, or path object (similar to pandas read_csv) - default: '' - - name: dask_key - type: str - doc: destination key of data on dask cluster and artifact store - default: dask_key - - name: inc_cols - type: Optional[List[str]] - doc: include only these columns (very fast) - default: null - - name: index_cols - type: Optional[List[str]] - doc: list of index column names (can be a long-running process) - default: null - - name: dask_persist - type: bool - doc: (True) should the data be persisted (through the `client.persist` op) - default: true - - name: refresh_data - type: bool - doc: (False) if the dask_key already exists in the dask cluster, this will - raise an Exception. Set to True to replace the existing cluster data. - default: true - - name: scheduler_key - type: str - doc: (scheduler) the dask scheduler configuration, json also logged as an - artifact - default: scheduler - outputs: - - default: '' - lineno: 7 - description: load dask cluster with data - remote: true - nthreads: 1 - min_replicas: 0 - max_replicas: 16 - scheduler_timeout: 60 minutes - affinity: null -verbose: false diff --git a/load_dask/item.yaml b/load_dask/item.yaml deleted file mode 100644 index 3d923e370..000000000 --- a/load_dask/item.yaml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: v1 -categories: -- data-preparation -- etl -description: load dask cluster with data -doc: '' -example: load_dask.ipynb -generationDate: 2022-08-28:17-25 -hidden: false -icon: '' -labels: - author: yjb -maintainers: [] -marketplaceType: '' -mlrunVersion: 1.1.0 -name: load-dask -platformVersion: 3.5.0 -spec: - filename: load_dask.py - handler: load_dask - image: mlrun/ml-models - kind: dask - requirements: [] -url: '' -version: 1.1.0 diff --git a/load_dask/load_dask.ipynb b/load_dask/load_dask.ipynb deleted file mode 100644 index 3dfcdddb5..000000000 --- a/load_dask/load_dask.ipynb +++ /dev/null @@ -1,309 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# load dask cluster with data\n", - "load a parquet dataset into a dask cluster" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# nuclio: ignore\n", - "import nuclio" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%nuclio config kind = \"dask\"\n", - "%nuclio config spec.image = \"mlrun/ml-models\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "import json\n", - "import numpy as np\n", - "import pandas as pd\n", - "\n", - "import dask\n", - "import dask.dataframe as dd\n", - "from dask.distributed import Client, LocalCluster\n", - "\n", - "from mlrun.execution import MLClientCtx\n", - "from mlrun.datastore import DataItem\n", - "\n", - "from typing import List, Optional\n", - "\n", - "def load_dask(\n", - " context: MLClientCtx,\n", - " src_data: DataItem,\n", - " dask_key: str = \"dask_key\",\n", - " inc_cols: Optional[List[str]] = None,\n", - " index_cols: Optional[List[str]] = None,\n", - " dask_persist: bool = True,\n", - " refresh_data: bool = True,\n", - " scheduler_key: str = \"scheduler\"\n", - ") -> None:\n", - " \"\"\"Load dataset into an existing dask cluster\n", - " \n", - " dask jobs define the dask client parameters at the job level, this method will raise an error if no client is detected.\n", - " \n", - " :param context: the function context\n", - " :param src_data: url of the data file or partitioned dataset as either\n", - " artifact DataItem, string, or path object (similar to \n", - " pandas read_csv)\n", - " :param dask_key: destination key of data on dask cluster and artifact store\n", - " :param inc_cols: include only these columns (very fast)\n", - " :param index_cols: list of index column names (can be a long-running process)\n", - " :param dask_persist: (True) should the data be persisted (through the `client.persist` op)\n", - " :param refresh_data: (False) if the dask_key already exists in the dask cluster, this will \n", - " raise an Exception. Set to True to replace the existing cluster data.\n", - " :param scheduler_key: (scheduler) the dask scheduler configuration, json also logged as an artifact\n", - " \"\"\"\n", - " if hasattr(context, \"dask_client\"):\n", - " dask_client = context.dask_client\n", - " else:\n", - " raise Exception(\"a dask client was not found in the execution context\")\n", - " \n", - " df = src_data.as_df(df_module=dd)\n", - "\n", - " if dask_persist:\n", - " df = dask_client.persist(df)\n", - " if dask_client.datasets and dask_key in dask_client.datasets:\n", - " dask_client.unpublish_dataset(dask_key)\n", - " dask_client.publish_dataset(df, name=dask_key)\n", - " \n", - " if context:\n", - " context.dask_client = dask_client\n", - " \n", - " # share the scheduler, whether data is persisted or not\n", - " dask_client.write_scheduler_file(scheduler_key+\".json\")\n", - " \n", - " # we don't use log_dataset here until it can take into account\n", - " # dask origin and apply dask describe.\n", - " context.log_artifact(scheduler_key, local_path=scheduler_key+\".json\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# nuclio: end-code" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### mlconfig" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from mlrun import mlconf\n", - "import os\n", - "\n", - "mlconf.dbpath = mlconf.dbpath or 'http://mlrun-api:8080'\n", - "mlconf.artifact_path = mlconf.artifact_path or f'{os.environ[\"HOME\"]}/artifacts'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### save" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from mlrun import code_to_function \n", - "# create job function object from notebook code\n", - "fn = code_to_function(\"load_dask\", handler='load_dask')\n", - "\n", - "# add metadata (for templates and reuse)\n", - "fn.spec.description = \"load dask cluster with data\"\n", - "fn.metadata.categories = [\"data-movement\", \"utils\"]\n", - "fn.metadata.labels = {\"author\": \"yjb\"}\n", - "fn.spec.remote = True\n", - "fn.spec.replicas = 4\n", - "fn.spec.max_replicas = 8\n", - "fn.spec.service_type = \"NodePort\"\n", - "fn.export(\"function.yaml\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### test" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# load function from marketplacen\n", - "from mlrun import import_function\n", - "\n", - "# vcs_branch = 'development'\n", - "# base_vcs = f'https://raw.githubusercontent.com/mlrun/functions/{vcs_branch}/'\n", - "# mlconf.hub_url = mlconf.hub_url or base_vcs + f'{name}/function.yaml'\n", - "# fn = import_function(\"hub://load_dask\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "if \"V3IO_HOME\" in list(os.environ):\n", - " from mlrun import mount_v3io\n", - " fn.apply(mount_v3io())\n", - "else:\n", - " # is you set up mlrun using the instructions at https://github.com/mlrun/mlrun/blob/master/hack/local/README.md\n", - " from mlrun.platforms import mount_pvc\n", - " fn.apply(mount_pvc('nfsvol', 'nfsvol', '/home/joyan/data'))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from mlrun import NewTask, run_local\n", - "\n", - "task_params = {\n", - " \"name\": \"tasks load dask cluster with data\",\n", - " \"params\" : {\n", - " \"persist\" : True,\n", - " \"refresh_data\" : True,\n", - " \"dask_key\" : \"dask_key\"}}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "run = fn.run(NewTask(**task_params), \n", - " handler=load_dask, \n", - " inputs={\"src_data\" : os.path.join(mlconf.artifact_path, 'iris.parquet') },\n", - " artifact_path=mlconf.artifact_path)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "func.status.to_dict()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import dask\n", - "import dask.dataframe as dd\n", - "from dask.distributed import Client, LocalCluster" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### TODO: this client dash board wont work -- wrong port!\n", - "\n", - "...even though its the correct client" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "client = Client(func.status.to_dict()['scheduler_address'])\n", - "client" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "list(client.list_datasets())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "client.datasets['dask_key']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/load_dask/load_dask.py b/load_dask/load_dask.py deleted file mode 100644 index 76c53c216..000000000 --- a/load_dask/load_dask.py +++ /dev/null @@ -1,68 +0,0 @@ -# Copyright 2019 Iguazio -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -from mlrun.execution import MLClientCtx -from mlrun.datastore import DataItem - -from typing import List, Optional - - -def load_dask( - context: MLClientCtx, - src_data: DataItem, - dask_key: str = "dask_key", - inc_cols: Optional[List[str]] = None, - index_cols: Optional[List[str]] = None, - dask_persist: bool = True, - refresh_data: bool = True, - scheduler_key: str = "scheduler" -) -> None: - """Load dataset into an existing dask cluster - - dask jobs define the dask client parameters at the job level, this method will raise an error if no client is detected. - - :param context: the function context - :param src_data: url of the data file or partitioned dataset as either - artifact DataItem, string, or path object (similar to - pandas read_csv) - :param dask_key: destination key of data on dask cluster and artifact store - :param inc_cols: include only these columns (very fast) - :param index_cols: list of index column names (can be a long-running process) - :param dask_persist: (True) should the data be persisted (through the `client.persist` op) - :param refresh_data: (False) if the dask_key already exists in the dask cluster, this will - raise an Exception. Set to True to replace the existing cluster data. - :param scheduler_key: (scheduler) the dask scheduler configuration, json also logged as an artifact - """ - if hasattr(context, "dask_client"): - dask_client = context.dask_client - else: - raise Exception("a dask client was not found in the execution context") - - df = src_data.as_df(df_module=dd) - - if dask_persist: - df = dask_client.persist(df) - if dask_client.datasets and dask_key in dask_client.datasets: - dask_client.unpublish_dataset(dask_key) - dask_client.publish_dataset(df, name=dask_key) - - if context: - context.dask_client = dask_client - - # share the scheduler, whether data is persisted or not - dask_client.write_scheduler_file(scheduler_key + ".json") - - # we don't use log_dataset here until it can take into account - # dask origin and apply dask describe. - context.log_artifact(scheduler_key, local_path=scheduler_key + ".json") \ No newline at end of file From 6fdc1b1adb171283d70b2e5458d0c943d93c4f8e Mon Sep 17 00:00:00 2001 From: Avi Asulin Date: Thu, 29 Aug 2024 13:25:11 +0300 Subject: [PATCH 13/38] [feature selection] update function yaml --- feature_selection/function.yaml | 75 +++++++++++++-------------------- feature_selection/item.yaml | 6 +-- 2 files changed, 32 insertions(+), 49 deletions(-) diff --git a/feature_selection/function.yaml b/feature_selection/function.yaml index 0851f54d3..d4e95f1e9 100644 --- a/feature_selection/function.yaml +++ b/feature_selection/function.yaml @@ -1,58 +1,33 @@ kind: job -metadata: - name: feature-selection - tag: '' - hash: 6dba16d062d81f78d3d210fee75edfe8b1def9b3 - project: '' - labels: - author: orz - categories: - - data-preparation - - machine-learning +verbose: false spec: + disable_auto_mount: false command: '' - args: [] - image: mlrun/mlrun - build: - functionSourceCode: IyBDb3B5cmlnaHQgMjAxOSBJZ3VhemlvCiMKIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiMKaW1wb3J0IGpzb24KaW1wb3J0IG9zCgppbXBvcnQgbWF0cGxvdGxpYi5weXBsb3QgYXMgcGx0CmltcG9ydCBtbHJ1bgppbXBvcnQgbWxydW4uZGF0YXN0b3JlCmltcG9ydCBtbHJ1bi51dGlscwppbXBvcnQgbWxydW4uZmVhdHVyZV9zdG9yZSBhcyBmcwppbXBvcnQgbnVtcHkgYXMgbnAKaW1wb3J0IHBhbmRhcyBhcyBwZAppbXBvcnQgc2VhYm9ybiBhcyBzbnMKZnJvbSBtbHJ1bi5hcnRpZmFjdHMgaW1wb3J0IFBsb3RBcnRpZmFjdApmcm9tIG1scnVuLmRhdGFzdG9yZS50YXJnZXRzIGltcG9ydCBQYXJxdWV0VGFyZ2V0CiMgTUxSdW4gdXRpbHMKZnJvbSBtbHJ1bi51dGlscy5oZWxwZXJzIGltcG9ydCBjcmVhdGVfY2xhc3MKIyBGZWF0dXJlIHNlbGVjdGlvbiBzdHJhdGVnaWVzCmZyb20gc2tsZWFybi5mZWF0dXJlX3NlbGVjdGlvbiBpbXBvcnQgU2VsZWN0RnJvbU1vZGVsLCBTZWxlY3RLQmVzdAojIFNjYWxlIGZlYXR1cmUgc2NvcmVzZ2l0IHN0CmZyb20gc2tsZWFybi5wcmVwcm9jZXNzaW5nIGltcG9ydCBNaW5NYXhTY2FsZXIKIyBTS0xlYXJuIGVzdGltYXRvcnMgbGlzdApmcm9tIHNrbGVhcm4udXRpbHMgaW1wb3J0IGFsbF9lc3RpbWF0b3JzCgpERUZBVUxUX1NUQVRfRklMVEVSUyA9IFsiZl9jbGFzc2lmIiwgIm11dHVhbF9pbmZvX2NsYXNzaWYiLCAiY2hpMiIsICJmX3JlZ3Jlc3Npb24iXQpERUZBVUxUX01PREVMX0ZJTFRFUlMgPSB7CiAgICAiTGluZWFyU1ZDIjogIkxpbmVhclNWQyIsCiAgICAiTG9naXN0aWNSZWdyZXNzaW9uIjogIkxvZ2lzdGljUmVncmVzc2lvbiIsCiAgICAiRXh0cmFUcmVlc0NsYXNzaWZpZXIiOiAiRXh0cmFUcmVlc0NsYXNzaWZpZXIiLAp9CgoKZGVmIF9jbGVhcl9jdXJyZW50X2ZpZ3VyZSgpOgogICAgIiIiCiAgICBDbGVhciBtYXRwbG90bGliIGN1cnJlbnQgZmlndXJlLgogICAgIiIiCiAgICBwbHQuY2xhKCkKICAgIHBsdC5jbGYoKQogICAgcGx0LmNsb3NlKCkKCgpkZWYgc2hvd192YWx1ZXNfb25fYmFycyhheHMsIGhfdj0idiIsIHNwYWNlPTAuNCk6CiAgICBkZWYgX3Nob3dfb25fc2luZ2xlX3Bsb3QoYXhfKToKICAgICAgICBpZiBoX3YgPT0gInYiOgogICAgICAgICAgICBmb3IgcCBpbiBheF8ucGF0Y2hlczoKICAgICAgICAgICAgICAgIF94ID0gcC5nZXRfeCgpICsgcC5nZXRfd2lkdGgoKSAvIDIKICAgICAgICAgICAgICAgIF95ID0gcC5nZXRfeSgpICsgcC5nZXRfaGVpZ2h0KCkKICAgICAgICAgICAgICAgIHZhbHVlID0gaW50KHAuZ2V0X2hlaWdodCgpKQogICAgICAgICAgICAgICAgYXhfLnRleHQoX3gsIF95LCB2YWx1ZSwgaGE9ImNlbnRlciIpCiAgICAgICAgZWxpZiBoX3YgPT0gImgiOgogICAgICAgICAgICBmb3IgcCBpbiBheF8ucGF0Y2hlczoKICAgICAgICAgICAgICAgIF94ID0gcC5nZXRfeCgpICsgcC5nZXRfd2lkdGgoKSArIGZsb2F0KHNwYWNlKQogICAgICAgICAgICAgICAgX3kgPSBwLmdldF95KCkgKyBwLmdldF9oZWlnaHQoKQogICAgICAgICAgICAgICAgdmFsdWUgPSBpbnQocC5nZXRfd2lkdGgoKSkKICAgICAgICAgICAgICAgIGF4Xy50ZXh0KF94LCBfeSwgdmFsdWUsIGhhPSJsZWZ0IikKCiAgICBpZiBpc2luc3RhbmNlKGF4cywgbnAubmRhcnJheSk6CiAgICAgICAgZm9yIGlkeCwgYXggaW4gbnAubmRlbnVtZXJhdGUoYXhzKToKICAgICAgICAgICAgX3Nob3dfb25fc2luZ2xlX3Bsb3QoYXgpCiAgICBlbHNlOgogICAgICAgIF9zaG93X29uX3NpbmdsZV9wbG90KGF4cykKCgpkZWYgcGxvdF9zdGF0KGNvbnRleHQsIHN0YXRfbmFtZSwgc3RhdF9kZik6CiAgICBfY2xlYXJfY3VycmVudF9maWd1cmUoKQoKICAgICMgQWRkIGNoYXJ0CiAgICBheCA9IHBsdC5heGVzKCkKICAgIHN0YXRfY2hhcnQgPSBzbnMuYmFycGxvdCgKICAgICAgICB4PXN0YXRfbmFtZSwKICAgICAgICB5PSJpbmRleCIsCiAgICAgICAgZGF0YT1zdGF0X2RmLnNvcnRfdmFsdWVzKHN0YXRfbmFtZSwgYXNjZW5kaW5nPUZhbHNlKS5yZXNldF9pbmRleCgpLAogICAgICAgIGF4PWF4LAogICAgKQogICAgcGx0LnRpZ2h0X2xheW91dCgpCgogICAgZm9yIHAgaW4gc3RhdF9jaGFydC5wYXRjaGVzOgogICAgICAgIHdpZHRoID0gcC5nZXRfd2lkdGgoKQogICAgICAgIHBsdC50ZXh0KAogICAgICAgICAgICA1ICsgcC5nZXRfd2lkdGgoKSwKICAgICAgICAgICAgcC5nZXRfeSgpICsgMC41NSAqIHAuZ2V0X2hlaWdodCgpLAogICAgICAgICAgICAiezoxLjJmfSIuZm9ybWF0KHdpZHRoKSwKICAgICAgICAgICAgaGE9ImNlbnRlciIsCiAgICAgICAgICAgIHZhPSJjZW50ZXIiLAogICAgICAgICkKCiAgICBjb250ZXh0LmxvZ19hcnRpZmFjdCgKICAgICAgICBQbG90QXJ0aWZhY3QoZiJ7c3RhdF9uYW1lfSIsIGJvZHk9cGx0LmdjZigpKSwKICAgICAgICBsb2NhbF9wYXRoPW9zLnBhdGguam9pbigicGxvdHMiLCAiZmVhdHVyZV9zZWxlY3Rpb24iLCBmIntzdGF0X25hbWV9Lmh0bWwiKSwKICAgICkKICAgIF9jbGVhcl9jdXJyZW50X2ZpZ3VyZSgpCgoKZGVmIGZlYXR1cmVfc2VsZWN0aW9uKAogICAgY29udGV4dCwKICAgIGRmX2FydGlmYWN0LAogICAgazogaW50ID0gNSwKICAgIG1pbl92b3RlczogZmxvYXQgPSAwLjUsCiAgICBsYWJlbF9jb2x1bW46IHN0ciA9IE5vbmUsCiAgICBzdGF0X2ZpbHRlcnM6IGxpc3QgPSBOb25lLAogICAgbW9kZWxfZmlsdGVyczogZGljdCA9IE5vbmUsCiAgICBtYXhfc2NhbGVkX3Njb3JlczogYm9vbCA9IFRydWUsCiAgICBzYW1wbGVfcmF0aW86IGZsb2F0ID0gTm9uZSwKICAgIG91dHB1dF92ZWN0b3JfbmFtZTogZmxvYXQgPSBOb25lLAogICAgaWdub3JlX3R5cGVfZXJyb3JzOiBib29sID0gRmFsc2UsCiAgICBpc19mZWF0dXJlX3ZlY3RvcjogYm9vbCA9IEZhbHNlLAopOgogICAgIiIiCiAgICBBcHBsaWVzIHNlbGVjdGVkIGZlYXR1cmUgc2VsZWN0aW9uIHN0YXRpc3RpY2FsIGZ1bmN0aW9ucyBvciBtb2RlbHMgb24gb3VyICdkZl9hcnRpZmFjdCcuCgogICAgRWFjaCBzdGF0aXN0aWNhbCBmdW5jdGlvbiBvciBtb2RlbCB3aWxsIHZvdGUgZm9yIGl0J3MgYmVzdCBLIHNlbGVjdGVkIGZlYXR1cmVzLgogICAgSWYgYSBmZWF0dXJlIGhhcyA+PSAnbWluX3ZvdGVzJyB2b3RlcywgaXQgd2lsbCBiZSBzZWxlY3RlZC4KCiAgICA6cGFyYW0gY29udGV4dDogICAgICAgICAgICAgdGhlIGZ1bmN0aW9uIGNvbnRleHQuCiAgICA6cGFyYW0gZGZfYXJ0aWZhY3Q6ICAgICAgICAgZGF0YWZyYW1lIHRvIHBhc3MgYXMgaW5wdXQuCiAgICA6cGFyYW0gazogICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIHRvcCBmZWF0dXJlcyB0byBzZWxlY3QgZnJvbSBlYWNoIHN0YXRpc3RpY2FsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gb3IgbW9kZWwuCiAgICA6cGFyYW0gbWluX3ZvdGVzOiAgICAgICAgICAgbWluaW1hbCBudW1iZXIgb2Ygdm90ZXMgKGZyb20gYSBtb2RlbCBvciBieSBzdGF0aXN0aWNhbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKSBuZWVkZWQgZm9yIGEgZmVhdHVyZSB0byBiZSBzZWxlY3RlZC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW4gYmUgc3BlY2lmaWVkIGJ5IHBlcmNlbnRhZ2Ugb2Ygdm90ZXMgb3IgYWJzb2x1dGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2Ygdm90ZXMuCiAgICA6cGFyYW0gbGFiZWxfY29sdW1uOiAgICAgICAgZ3JvdW5kLXRydXRoICh5KSBsYWJlbHMuCiAgICA6cGFyYW0gc3RhdF9maWx0ZXJzOiAgICAgICAgc3RhdGlzdGljYWwgZnVuY3Rpb25zIHRvIGFwcGx5IHRvIHRoZSBmZWF0dXJlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmcm9tIHNrbGVhcm4uZmVhdHVyZV9zZWxlY3Rpb24pLgogICAgOnBhcmFtIG1vZGVsX2ZpbHRlcnM6ICAgICAgIG1vZGVscyB0byB1c2UgZm9yIGZlYXR1cmUgZXZhbHVhdGlvbiwgY2FuIGJlIHNwZWNpZmllZCBieQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsIG5hbWUgKGV4LiBMaW5lYXJTVkMpLCBmb3JtYWxpemVkIGpzb24gKGNvbnRhaW5zICdDTEFTUycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ZJVCcsICdNRVRBJykgb3IgYSBwYXRoIHRvIHN1Y2gganNvbiBmaWxlLgogICAgOnBhcmFtIG1heF9zY2FsZWRfc2NvcmVzOiAgIHByb2R1Y2UgZmVhdHVyZSBzY29yZXMgdGFibGUgc2NhbGVkIHdpdGggbWF4X3NjYWxlci4KICAgIDpwYXJhbSBzYW1wbGVfcmF0aW86ICAgICAgICBwZXJjZW50YWdlIG9mIHRoZSBkYXRhc2V0IHRoZSB1c2VyIHdoaXNoZXMgdG8gY29tcHV0ZSB0aGUgZmVhdHVyZSBzZWxlY3Rpb24gcHJvY2VzcyBvbi4KICAgIDpwYXJhbSBvdXRwdXRfdmVjdG9yX25hbWU6ICBjcmVhdGVzIGEgbmV3IGZlYXR1cmUgdmVjdG9yIGNvbnRhaW5pbmcgb25seSB0aGUgaWRlbnRpZmllcyBmZWF0dXJlcy4KICAgIDpwYXJhbSBpZ25vcmVfdHlwZV9lcnJvcnM6ICBza2lwcyBkYXRhdHlwZXMgdGhhdCBhcmUgbmVpdGhlciBmbG9hdCBub3IgaW50IHdpdGhpbiB0aGUgZmVhdHVyZSB2ZWN0b3IuCiAgICA6cGFyYW0gaXNfZmVhdHVyZV92ZWN0b3I6ICAgYm9vbCBzdGF0aW5nIGlmIHRoZSBkYXRhIGlzIHBhc3NlZCBhcyBhIGZlYXR1cmUgdmVjdG9yLgogICAgIiIiCiAgICBzdGF0X2ZpbHRlcnMgPSBzdGF0X2ZpbHRlcnMgb3IgREVGQVVMVF9TVEFUX0ZJTFRFUlMKICAgIG1vZGVsX2ZpbHRlcnMgPSBtb2RlbF9maWx0ZXJzIG9yIERFRkFVTFRfTU9ERUxfRklMVEVSUwogICAgIyBDaGVjayBpZiBkZi5tZXRhIGlzIHZhbGlkLCBpZiBpdCBpcywgbG9vayBmb3IgYSBmZWF0dXJlIHZlY3RvcgogICAgc3RvcmVfdXJpX3ByZWZpeCwgXyA9IG1scnVuLmRhdGFzdG9yZS5wYXJzZV9zdG9yZV91cmkoZGZfYXJ0aWZhY3QuYXJ0aWZhY3RfdXJsKQogICAgaXNfZmVhdHVyZV92ZWN0b3IgPSBtbHJ1bi51dGlscy5TdG9yZVByZWZpeC5GZWF0dXJlVmVjdG9yID09IHN0b3JlX3VyaV9wcmVmaXgKCiAgICAjIExvb2sgaW5zaWRlIG1ldGEuc3BlYy5sYWJlbF9mZWF0dXJlIHRvIGlkZW50aWZ5IHRoZSBsYWJlbF9jb2x1bW4gaWYgdGhlIHVzZXIgZGlkIG5vdCBzcGVjaWZ5IGl0CiAgICBpZiBsYWJlbF9jb2x1bW4gaXMgTm9uZToKICAgICAgICBpZiBpc19mZWF0dXJlX3ZlY3RvcjoKICAgICAgICAgICAgbGFiZWxfY29sdW1uID0gZGZfYXJ0aWZhY3QubWV0YS5zcGVjLmxhYmVsX2ZlYXR1cmUuc3BsaXQoIi4iKVsxXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIk5vIGxhYmVsX2NvbHVtbiB3YXMgZ2l2ZW4sIHBsZWFzZSBhZGQgYSBsYWJlbF9jb2x1bW4uIikKCiAgICAjIFVzZSB0aGUgZmVhdHVyZSB2ZWN0b3IgYXMgZGF0YWZyYW1lCiAgICBkZiA9IGRmX2FydGlmYWN0LmFzX2RmKCkKCiAgICAjIEVuc3VyZSBrIGlzIG5vdCBiaWdnZXIgdGhhbiB0aGUgdG90YWwgbnVtYmVyIG9mIGZlYXR1cmVzCiAgICBpZiBrID4gZGYuc2hhcGVbMV06CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgZiJLIGNhbm5vdCBiZSBiaWdnZXIgdGhhbiB0aGUgdG90YWwgbnVtYmVyIG9mIGZlYXR1cmVzICh7ZGYuc2hhcGVbMV19KS4gUGxlYXNlIGNob29zZSBhIHNtYWxsZXIgSy4iCiAgICAgICAgKQogICAgZWxpZiBrIDwgMToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJLIGNhbm5vdCBiZSBzbWFsbGVyIHRoYW4gMS4gUGxlYXNlIGNob29zZSBhIGJpZ2dlciBLLiIpCgogICAgIyBDcmVhdGUgYSBzYW1wbGUgZGF0YWZyYW1lIG9mIHRoZSBvcmlnaW5hbCBmZWF0dXJlIHZlY3RvcgogICAgaWYgc2FtcGxlX3JhdGlvOgogICAgICAgIGRmID0gKAogICAgICAgICAgICBkZi5ncm91cGJ5KGxhYmVsX2NvbHVtbikKICAgICAgICAgICAgLmFwcGx5KGxhbWJkYSB4OiB4LnNhbXBsZShmcmFjPXNhbXBsZV9yYXRpbykpCiAgICAgICAgICAgIC5yZXNldF9pbmRleChkcm9wPVRydWUpCiAgICAgICAgKQogICAgICAgIGRmID0gZGYuZHJvcG5hKCkKCiAgICAjIFNldCBmZWF0dXJlIHZlY3RvciBhbmQgbGFiZWxzCiAgICB5ID0gZGYucG9wKGxhYmVsX2NvbHVtbikKICAgIFggPSBkZgoKICAgIGlmIG5wLm9iamVjdF8gaW4gbGlzdChYLmR0eXBlcykgYW5kIGlnbm9yZV90eXBlX2Vycm9ycyBpcyBGYWxzZToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICBmIntkZi5zZWxlY3RfZHR5cGVzKGluY2x1ZGU9WydvYmplY3QnXSkuY29sdW1ucy50b2xpc3QoKX0gYXJlIG5laXRoZXIgZmxvYXQgb3IgaW50LiIKICAgICAgICApCgogICAgIyBDcmVhdGUgc2VsZWN0ZWQgc3RhdGlzdGljYWwgZXN0aW1hdG9ycwogICAgc3RhdF9mdW5jdGlvbnNfbGlzdCA9IHsKICAgICAgICBzdGF0X25hbWU6IFNlbGVjdEtCZXN0KAogICAgICAgICAgICBzY29yZV9mdW5jPWNyZWF0ZV9jbGFzcyhmInNrbGVhcm4uZmVhdHVyZV9zZWxlY3Rpb24ue3N0YXRfbmFtZX0iKSwgaz1rCiAgICAgICAgKQogICAgICAgIGZvciBzdGF0X25hbWUgaW4gc3RhdF9maWx0ZXJzCiAgICB9CiAgICByZXF1aXJlc19hYnMgPSBbImNoaTIiXQoKICAgICMgUnVuIHN0YXRpc3RpYyBmaWx0ZXJzCiAgICBzZWxlY3RlZF9mZWF0dXJlc19hZ2cgPSB7fQogICAgc3RhdHNfZGYgPSBwZC5EYXRhRnJhbWUoaW5kZXg9WC5jb2x1bW5zKS5kcm9wbmEoKQoKICAgIGZvciBzdGF0X25hbWUsIHN0YXRfZnVuYyBpbiBzdGF0X2Z1bmN0aW9uc19saXN0Lml0ZW1zKCk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBwYXJhbXMgPSAoWCwgeSkgaWYgc3RhdF9uYW1lIGluIHJlcXVpcmVzX2FicyBlbHNlIChhYnMoWCksIHkpCiAgICAgICAgICAgIHN0YXQgPSBzdGF0X2Z1bmMuZml0KCpwYXJhbXMpCgogICAgICAgICAgICAjIENvbGxlY3Qgc3RhdCBmdW5jdGlvbiByZXN1bHRzCiAgICAgICAgICAgIHN0YXRfZGYgPSBwZC5EYXRhRnJhbWUoCiAgICAgICAgICAgICAgICBpbmRleD1YLmNvbHVtbnMsIGNvbHVtbnM9W3N0YXRfbmFtZV0sIGRhdGE9c3RhdC5zY29yZXNfCiAgICAgICAgICAgICkKICAgICAgICAgICAgcGxvdF9zdGF0KGNvbnRleHQsIHN0YXRfbmFtZSwgc3RhdF9kZikKICAgICAgICAgICAgc3RhdHNfZGYgPSBzdGF0c19kZi5qb2luKHN0YXRfZGYpCgogICAgICAgICAgICAjIFNlbGVjdCBLIEJlc3QgZmVhdHVyZXMKICAgICAgICAgICAgc2VsZWN0ZWRfZmVhdHVyZXMgPSBYLmNvbHVtbnNbc3RhdF9mdW5jLmdldF9zdXBwb3J0KCldCiAgICAgICAgICAgIHNlbGVjdGVkX2ZlYXR1cmVzX2FnZ1tzdGF0X25hbWVdID0gc2VsZWN0ZWRfZmVhdHVyZXMKCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYiQ291bGRuJ3QgY2FsY3VsYXRlIHtzdGF0X25hbWV9IGJlY2F1c2Ugb2Y6IHtlfSIpCgogICAgIyBDcmVhdGUgbW9kZWxzIGZyb20gY2xhc3MgbmFtZSAvIGpzb24gZmlsZSAvIGpzb24gcGFyYW1zCiAgICBhbGxfc2tsZWFybl9lc3RpbWF0b3JzID0gZGljdChhbGxfZXN0aW1hdG9ycygpKSBpZiBsZW4obW9kZWxfZmlsdGVycykgPiAwIGVsc2Uge30KICAgIHNlbGVjdGVkX21vZGVscyA9IHt9CiAgICBmb3IgbW9kZWxfbmFtZSwgbW9kZWwgaW4gbW9kZWxfZmlsdGVycy5pdGVtcygpOgogICAgICAgIGlmICIuanNvbiIgaW4gbW9kZWw6CiAgICAgICAgICAgIGN1cnJlbnRfbW9kZWwgPSBqc29uLmxvYWQob3Blbihtb2RlbCwgInIiKSkKICAgICAgICAgICAgY2xhc3NpZmllcl9jbGFzcyA9IGNyZWF0ZV9jbGFzcyhjdXJyZW50X21vZGVsWyJNRVRBIl1bImNsYXNzIl0pCiAgICAgICAgICAgIHNlbGVjdGVkX21vZGVsc1ttb2RlbF9uYW1lXSA9IGNsYXNzaWZpZXJfY2xhc3MoKipjdXJyZW50X21vZGVsWyJDTEFTUyJdKQogICAgICAgIGVsaWYgbW9kZWwgaW4gYWxsX3NrbGVhcm5fZXN0aW1hdG9yczoKICAgICAgICAgICAgc2VsZWN0ZWRfbW9kZWxzW21vZGVsX25hbWVdID0gYWxsX3NrbGVhcm5fZXN0aW1hdG9yc1ttb2RlbF9uYW1lXSgpCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGN1cnJlbnRfbW9kZWwgPSBqc29uLmxvYWRzKG1vZGVsKQogICAgICAgICAgICAgICAgY2xhc3NpZmllcl9jbGFzcyA9IGNyZWF0ZV9jbGFzcyhjdXJyZW50X21vZGVsWyJNRVRBIl1bImNsYXNzIl0pCiAgICAgICAgICAgICAgICBzZWxlY3RlZF9tb2RlbHNbbW9kZWxfbmFtZV0gPSBjbGFzc2lmaWVyX2NsYXNzKCoqY3VycmVudF9tb2RlbFsiQ0xBU1MiXSkKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICAgICAgY29udGV4dC5sb2dnZXIuaW5mbyhmInVuYWJsZSB0byBsb2FkIHttb2RlbH0gYmVjYXVzZSBvZjoge2V9IikKCiAgICAjIFJ1biBtb2RlbCBmaWx0ZXJzCiAgICBtb2RlbHNfZGYgPSBwZC5EYXRhRnJhbWUoaW5kZXg9WC5jb2x1bW5zKQogICAgZm9yIG1vZGVsX25hbWUsIG1vZGVsIGluIHNlbGVjdGVkX21vZGVscy5pdGVtcygpOgoKICAgICAgICBpZiBtb2RlbF9uYW1lID09ICJMb2dpc3RpY1JlZ3Jlc3Npb24iOgogICAgICAgICAgICBtb2RlbC5zZXRfcGFyYW1zKHNvbHZlcj0ibGlibGluZWFyIikKCiAgICAgICAgIyBUcmFpbiBtb2RlbCBhbmQgZ2V0IGZlYXR1cmUgaW1wb3J0YW5jZQogICAgICAgIHNlbGVjdF9mcm9tX21vZGVsID0gU2VsZWN0RnJvbU1vZGVsKG1vZGVsKS5maXQoWCwgeSkKICAgICAgICBmZWF0dXJlX2lkeCA9IHNlbGVjdF9mcm9tX21vZGVsLmdldF9zdXBwb3J0KCkKICAgICAgICBmZWF0dXJlX25hbWVzID0gWC5jb2x1bW5zW2ZlYXR1cmVfaWR4XQogICAgICAgIHNlbGVjdGVkX2ZlYXR1cmVzX2FnZ1ttb2RlbF9uYW1lXSA9IGZlYXR1cmVfbmFtZXMudG9saXN0KCkKCiAgICAgICAgIyBDb2xsZWN0IG1vZGVsIGZlYXR1cmUgaW1wb3J0YW5jZQogICAgICAgIGlmIGhhc2F0dHIoc2VsZWN0X2Zyb21fbW9kZWwuZXN0aW1hdG9yXywgImNvZWZfIik6CiAgICAgICAgICAgIHN0YXRfZGYgPSBzZWxlY3RfZnJvbV9tb2RlbC5lc3RpbWF0b3JfLmNvZWZfCiAgICAgICAgZWxpZiBoYXNhdHRyKHNlbGVjdF9mcm9tX21vZGVsLmVzdGltYXRvcl8sICJmZWF0dXJlX2ltcG9ydGFuY2VzXyIpOgogICAgICAgICAgICBzdGF0X2RmID0gc2VsZWN0X2Zyb21fbW9kZWwuZXN0aW1hdG9yXy5mZWF0dXJlX2ltcG9ydGFuY2VzXwoKICAgICAgICBzdGF0X2RmID0gcGQuRGF0YUZyYW1lKGluZGV4PVguY29sdW1ucywgY29sdW1ucz1bbW9kZWxfbmFtZV0sIGRhdGE9c3RhdF9kZlswXSkKICAgICAgICBtb2RlbHNfZGYgPSBtb2RlbHNfZGYuam9pbihzdGF0X2RmKQoKICAgICAgICBwbG90X3N0YXQoY29udGV4dCwgbW9kZWxfbmFtZSwgc3RhdF9kZikKCiAgICAjIENyZWF0ZSBmZWF0dXJlX3Njb3JlcyBERiB3aXRoIHN0YXQgJiBtb2RlbCBmaWx0ZXJzIHNjb3JlcwogICAgcmVzdWx0X21hdHJpeF9kZiA9IHBkLmNvbmNhdChbc3RhdHNfZGYsIG1vZGVsc19kZl0sIGF4aXM9MSwgc29ydD1GYWxzZSkKICAgIGNvbnRleHQubG9nX2RhdGFzZXQoCiAgICAgICAga2V5PSJmZWF0dXJlX3Njb3JlcyIsCiAgICAgICAgZGY9cmVzdWx0X21hdHJpeF9kZiwKICAgICAgICBsb2NhbF9wYXRoPSJmZWF0dXJlX3Njb3Jlcy5wYXJxdWV0IiwKICAgICAgICBmb3JtYXQ9InBhcnF1ZXQiLAogICAgKQogICAgaWYgbWF4X3NjYWxlZF9zY29yZXM6CiAgICAgICAgbm9ybWFsaXplZF9kZiA9IHJlc3VsdF9tYXRyaXhfZGYucmVwbGFjZShbbnAuaW5mLCAtbnAuaW5mXSwgbnAubmFuKS52YWx1ZXMKICAgICAgICBtaW5fbWF4X3NjYWxlciA9IE1pbk1heFNjYWxlcigpCiAgICAgICAgbm9ybWFsaXplZF9kZiA9IG1pbl9tYXhfc2NhbGVyLmZpdF90cmFuc2Zvcm0obm9ybWFsaXplZF9kZikKICAgICAgICBub3JtYWxpemVkX2RmID0gcGQuRGF0YUZyYW1lKAogICAgICAgICAgICBkYXRhPW5vcm1hbGl6ZWRfZGYsCiAgICAgICAgICAgIGNvbHVtbnM9cmVzdWx0X21hdHJpeF9kZi5jb2x1bW5zLAogICAgICAgICAgICBpbmRleD1yZXN1bHRfbWF0cml4X2RmLmluZGV4LAogICAgICAgICkKICAgICAgICBjb250ZXh0LmxvZ19kYXRhc2V0KAogICAgICAgICAgICBrZXk9Im1heF9zY2FsZWRfc2NvcmVzX2ZlYXR1cmVfc2NvcmVzIiwKICAgICAgICAgICAgZGY9bm9ybWFsaXplZF9kZiwKICAgICAgICAgICAgbG9jYWxfcGF0aD0ibWF4X3NjYWxlZF9zY29yZXNfZmVhdHVyZV9zY29yZXMucGFycXVldCIsCiAgICAgICAgICAgIGZvcm1hdD0icGFycXVldCIsCiAgICAgICAgKQoKICAgICMgQ3JlYXRlIGZlYXR1cmUgY291bnQgRGF0YUZyYW1lCiAgICBmb3IgdGVzdF9uYW1lIGluIHNlbGVjdGVkX2ZlYXR1cmVzX2FnZzoKICAgICAgICByZXN1bHRfbWF0cml4X2RmW3Rlc3RfbmFtZV0gPSBbCiAgICAgICAgICAgIDEgaWYgeCBpbiBzZWxlY3RlZF9mZWF0dXJlc19hZ2dbdGVzdF9uYW1lXSBlbHNlIDAgZm9yIHggaW4gWC5jb2x1bW5zCiAgICAgICAgXQogICAgcmVzdWx0X21hdHJpeF9kZi5sb2NbOiwgIm51bV92b3RlcyJdID0gcmVzdWx0X21hdHJpeF9kZi5zdW0oYXhpcz0xKQogICAgY29udGV4dC5sb2dfZGF0YXNldCgKICAgICAgICBrZXk9InNlbGVjdGVkX2ZlYXR1cmVzX2NvdW50IiwKICAgICAgICBkZj1yZXN1bHRfbWF0cml4X2RmLAogICAgICAgIGxvY2FsX3BhdGg9InNlbGVjdGVkX2ZlYXR1cmVzX2NvdW50LnBhcnF1ZXQiLAogICAgICAgIGZvcm1hdD0icGFycXVldCIsCiAgICApCgogICAgIyBIb3cgbWFueSB2b3RlcyBhcmUgbmVlZGVkIGZvciBhIGZlYXR1cmUgdG8gYmUgc2VsZWN0ZWQ/CiAgICBpZiBpc2luc3RhbmNlKG1pbl92b3RlcywgaW50KToKICAgICAgICB2b3Rlc19uZWVkZWQgPSBtaW5fdm90ZXMKICAgIGVsc2U6CiAgICAgICAgbnVtX2ZpbHRlcnMgPSBsZW4oc3RhdF9maWx0ZXJzKSArIGxlbihtb2RlbF9maWx0ZXJzKQogICAgICAgIHZvdGVzX25lZWRlZCA9IGludChucC5mbG9vcihudW1fZmlsdGVycyAqIG1heChtaW4obWluX3ZvdGVzLCAxKSwgMCkpKQogICAgY29udGV4dC5sb2dnZXIuaW5mbyhmInZvdGVzIG5lZWRlZCB0byBiZSBzZWxlY3RlZDoge3ZvdGVzX25lZWRlZH0iKQoKICAgICMgQ3JlYXRlIGZpbmFsIGZlYXR1cmUgZGF0YWZyYW1lCiAgICBzZWxlY3RlZF9mZWF0dXJlcyA9IHJlc3VsdF9tYXRyaXhfZGZbCiAgICAgICAgcmVzdWx0X21hdHJpeF9kZi5udW1fdm90ZXMgPj0gdm90ZXNfbmVlZGVkCiAgICBdLmluZGV4LnRvbGlzdCgpCiAgICBnb29kX2ZlYXR1cmVfZGYgPSBkZi5sb2NbOiwgc2VsZWN0ZWRfZmVhdHVyZXNdCiAgICBmaW5hbF9kZiA9IHBkLmNvbmNhdChbZ29vZF9mZWF0dXJlX2RmLCB5XSwgYXhpcz0xKQogICAgY29udGV4dC5sb2dfZGF0YXNldCgKICAgICAgICBrZXk9InNlbGVjdGVkX2ZlYXR1cmVzIiwKICAgICAgICBkZj1maW5hbF9kZiwKICAgICAgICBsb2NhbF9wYXRoPSJzZWxlY3RlZF9mZWF0dXJlcy5wYXJxdWV0IiwKICAgICAgICBmb3JtYXQ9InBhcnF1ZXQiLAogICAgKQoKICAgICMgQ3JlYXRpbmcgYSBuZXcgZmVhdHVyZSB2ZWN0b3IgY29udGFpbmluZyBvbmx5IHRoZSBpZGVudGlmaWVkIHRvcCBmZWF0dXJlcwogICAgaWYgaXNfZmVhdHVyZV92ZWN0b3IgYW5kIGRmX2FydGlmYWN0Lm1ldGEuc3BlYy5mZWF0dXJlcyBhbmQgb3V0cHV0X3ZlY3Rvcl9uYW1lOgogICAgICAgICMgU2VsZWN0aW5nIHRoZSB0b3AgSyBmZWF0dXJlcyBmcm9tIG91ciB0b3AgZmVhdHVyZSBkYXRhZnJhbWUKICAgICAgICBzZWxlY3RlZF9mZWF0dXJlcyA9IHJlc3VsdF9tYXRyaXhfZGYuaGVhZChrKS5pbmRleAoKICAgICAgICAjIE1hdGNoIHRoZSBzZWxlY3RlZCBmZWF0dXJlIG5hbWVzIHRvIHRoZSBGUyBGZWF0dXJlIGFubm90YXRpb25zCiAgICAgICAgbWF0Y2hlZF9zZWxlY3Rpb25zID0gWwogICAgICAgICAgICBmZWF0dXJlCiAgICAgICAgICAgIGZvciBmZWF0dXJlIGluIGxpc3QoZGZfYXJ0aWZhY3QubWV0YS5zcGVjLmZlYXR1cmVzKQogICAgICAgICAgICBmb3Igc2VsZWN0ZWQgaW4gbGlzdChzZWxlY3RlZF9mZWF0dXJlcykKICAgICAgICAgICAgaWYgZmVhdHVyZS5lbmRzd2l0aChzZWxlY3RlZCkKICAgICAgICBdCgogICAgICAgICMgRGVmaW5pbmcgb3VyIG5ldyBmZWF0dXJlIHZlY3RvcgogICAgICAgIHRvcF9mZWF0dXJlc19mdiA9IGZzLkZlYXR1cmVWZWN0b3IoCiAgICAgICAgICAgIG91dHB1dF92ZWN0b3JfbmFtZSwKICAgICAgICAgICAgbWF0Y2hlZF9zZWxlY3Rpb25zLAogICAgICAgICAgICBsYWJlbF9mZWF0dXJlPSJsYWJlbHMubGFiZWwiLAogICAgICAgICAgICBkZXNjcmlwdGlvbj0iZmVhdHVyZSB2ZWN0b3IgY29tcG9zZWQgc3RyaWN0bHkgb2Ygb3VyIHRvcCBmZWF0dXJlcyIsCiAgICAgICAgKQoKICAgICAgICAjIFNhdmluZwogICAgICAgIHRvcF9mZWF0dXJlc19mdi5zYXZlKCkKICAgICAgICBmcy5nZXRfb2ZmbGluZV9mZWF0dXJlcyh0b3BfZmVhdHVyZXNfZnYsIHRhcmdldD1QYXJxdWV0VGFyZ2V0KCkpCgogICAgICAgICMgTG9nZ2luZyBvdXIgbmV3IGZlYXR1cmUgdmVjdG9yIFVSSQogICAgICAgIGNvbnRleHQubG9nX3Jlc3VsdCgidG9wX2ZlYXR1cmVzX3ZlY3RvciIsIHRvcF9mZWF0dXJlc19mdi51cmkpCg== - commands: [] - code_origin: '' - origin_filename: '' - requirements: [] entry_points: show_values_on_bars: - name: show_values_on_bars - doc: '' + lineno: 54 parameters: - name: axs - name: h_v default: v - name: space default: 0.4 - outputs: [] - lineno: 54 + name: show_values_on_bars has_varargs: false has_kwargs: false - plot_stat: - name: plot_stat doc: '' + plot_stat: + lineno: 76 parameters: - name: context - name: stat_name - name: stat_df - outputs: [] - lineno: 76 + name: plot_stat has_varargs: false has_kwargs: false + doc: '' feature_selection: - name: feature_selection - doc: 'Applies selected feature selection statistical functions or models on - our ''df_artifact''. - - - Each statistical function or model will vote for it''s best K selected features. - - If a feature has >= ''min_votes'' votes, it will be selected.' + lineno: 106 parameters: - name: context doc: the function context. @@ -103,18 +78,26 @@ spec: type: bool doc: bool stating if the data is passed as a feature vector. default: false - outputs: [] - lineno: 106 + name: feature_selection has_varargs: false has_kwargs: false - description: Select features through multiple Statistical and Model filters + doc: 'Applies selected feature selection statistical functions or models on + our ''df_artifact''. + + + Each statistical function or model will vote for it''s best K selected features. + + If a feature has >= ''min_votes'' votes, it will be selected.' + build: + origin_filename: '' + functionSourceCode: IyBDb3B5cmlnaHQgMjAxOSBJZ3VhemlvCiMKIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiMKaW1wb3J0IGpzb24KaW1wb3J0IG9zCgppbXBvcnQgbWF0cGxvdGxpYi5weXBsb3QgYXMgcGx0CmltcG9ydCBtbHJ1bgppbXBvcnQgbWxydW4uZGF0YXN0b3JlCmltcG9ydCBtbHJ1bi51dGlscwppbXBvcnQgbWxydW4uZmVhdHVyZV9zdG9yZSBhcyBmcwppbXBvcnQgbnVtcHkgYXMgbnAKaW1wb3J0IHBhbmRhcyBhcyBwZAppbXBvcnQgc2VhYm9ybiBhcyBzbnMKZnJvbSBtbHJ1bi5hcnRpZmFjdHMgaW1wb3J0IFBsb3RBcnRpZmFjdApmcm9tIG1scnVuLmRhdGFzdG9yZS50YXJnZXRzIGltcG9ydCBQYXJxdWV0VGFyZ2V0CiMgTUxSdW4gdXRpbHMKZnJvbSBtbHJ1bi51dGlscy5oZWxwZXJzIGltcG9ydCBjcmVhdGVfY2xhc3MKIyBGZWF0dXJlIHNlbGVjdGlvbiBzdHJhdGVnaWVzCmZyb20gc2tsZWFybi5mZWF0dXJlX3NlbGVjdGlvbiBpbXBvcnQgU2VsZWN0RnJvbU1vZGVsLCBTZWxlY3RLQmVzdAojIFNjYWxlIGZlYXR1cmUgc2NvcmVzZ2l0IHN0CmZyb20gc2tsZWFybi5wcmVwcm9jZXNzaW5nIGltcG9ydCBNaW5NYXhTY2FsZXIKIyBTS0xlYXJuIGVzdGltYXRvcnMgbGlzdApmcm9tIHNrbGVhcm4udXRpbHMgaW1wb3J0IGFsbF9lc3RpbWF0b3JzCgpERUZBVUxUX1NUQVRfRklMVEVSUyA9IFsiZl9jbGFzc2lmIiwgIm11dHVhbF9pbmZvX2NsYXNzaWYiLCAiY2hpMiIsICJmX3JlZ3Jlc3Npb24iXQpERUZBVUxUX01PREVMX0ZJTFRFUlMgPSB7CiAgICAiTGluZWFyU1ZDIjogIkxpbmVhclNWQyIsCiAgICAiTG9naXN0aWNSZWdyZXNzaW9uIjogIkxvZ2lzdGljUmVncmVzc2lvbiIsCiAgICAiRXh0cmFUcmVlc0NsYXNzaWZpZXIiOiAiRXh0cmFUcmVlc0NsYXNzaWZpZXIiLAp9CgoKZGVmIF9jbGVhcl9jdXJyZW50X2ZpZ3VyZSgpOgogICAgIiIiCiAgICBDbGVhciBtYXRwbG90bGliIGN1cnJlbnQgZmlndXJlLgogICAgIiIiCiAgICBwbHQuY2xhKCkKICAgIHBsdC5jbGYoKQogICAgcGx0LmNsb3NlKCkKCgpkZWYgc2hvd192YWx1ZXNfb25fYmFycyhheHMsIGhfdj0idiIsIHNwYWNlPTAuNCk6CiAgICBkZWYgX3Nob3dfb25fc2luZ2xlX3Bsb3QoYXhfKToKICAgICAgICBpZiBoX3YgPT0gInYiOgogICAgICAgICAgICBmb3IgcCBpbiBheF8ucGF0Y2hlczoKICAgICAgICAgICAgICAgIF94ID0gcC5nZXRfeCgpICsgcC5nZXRfd2lkdGgoKSAvIDIKICAgICAgICAgICAgICAgIF95ID0gcC5nZXRfeSgpICsgcC5nZXRfaGVpZ2h0KCkKICAgICAgICAgICAgICAgIHZhbHVlID0gaW50KHAuZ2V0X2hlaWdodCgpKQogICAgICAgICAgICAgICAgYXhfLnRleHQoX3gsIF95LCB2YWx1ZSwgaGE9ImNlbnRlciIpCiAgICAgICAgZWxpZiBoX3YgPT0gImgiOgogICAgICAgICAgICBmb3IgcCBpbiBheF8ucGF0Y2hlczoKICAgICAgICAgICAgICAgIF94ID0gcC5nZXRfeCgpICsgcC5nZXRfd2lkdGgoKSArIGZsb2F0KHNwYWNlKQogICAgICAgICAgICAgICAgX3kgPSBwLmdldF95KCkgKyBwLmdldF9oZWlnaHQoKQogICAgICAgICAgICAgICAgdmFsdWUgPSBpbnQocC5nZXRfd2lkdGgoKSkKICAgICAgICAgICAgICAgIGF4Xy50ZXh0KF94LCBfeSwgdmFsdWUsIGhhPSJsZWZ0IikKCiAgICBpZiBpc2luc3RhbmNlKGF4cywgbnAubmRhcnJheSk6CiAgICAgICAgZm9yIGlkeCwgYXggaW4gbnAubmRlbnVtZXJhdGUoYXhzKToKICAgICAgICAgICAgX3Nob3dfb25fc2luZ2xlX3Bsb3QoYXgpCiAgICBlbHNlOgogICAgICAgIF9zaG93X29uX3NpbmdsZV9wbG90KGF4cykKCgpkZWYgcGxvdF9zdGF0KGNvbnRleHQsIHN0YXRfbmFtZSwgc3RhdF9kZik6CiAgICBfY2xlYXJfY3VycmVudF9maWd1cmUoKQoKICAgICMgQWRkIGNoYXJ0CiAgICBheCA9IHBsdC5heGVzKCkKICAgIHN0YXRfY2hhcnQgPSBzbnMuYmFycGxvdCgKICAgICAgICB4PXN0YXRfbmFtZSwKICAgICAgICB5PSJpbmRleCIsCiAgICAgICAgZGF0YT1zdGF0X2RmLnNvcnRfdmFsdWVzKHN0YXRfbmFtZSwgYXNjZW5kaW5nPUZhbHNlKS5yZXNldF9pbmRleCgpLAogICAgICAgIGF4PWF4LAogICAgKQogICAgcGx0LnRpZ2h0X2xheW91dCgpCgogICAgZm9yIHAgaW4gc3RhdF9jaGFydC5wYXRjaGVzOgogICAgICAgIHdpZHRoID0gcC5nZXRfd2lkdGgoKQogICAgICAgIHBsdC50ZXh0KAogICAgICAgICAgICA1ICsgcC5nZXRfd2lkdGgoKSwKICAgICAgICAgICAgcC5nZXRfeSgpICsgMC41NSAqIHAuZ2V0X2hlaWdodCgpLAogICAgICAgICAgICAiezoxLjJmfSIuZm9ybWF0KHdpZHRoKSwKICAgICAgICAgICAgaGE9ImNlbnRlciIsCiAgICAgICAgICAgIHZhPSJjZW50ZXIiLAogICAgICAgICkKCiAgICBjb250ZXh0LmxvZ19hcnRpZmFjdCgKICAgICAgICBQbG90QXJ0aWZhY3QoZiJ7c3RhdF9uYW1lfSIsIGJvZHk9cGx0LmdjZigpKSwKICAgICAgICBsb2NhbF9wYXRoPW9zLnBhdGguam9pbigicGxvdHMiLCAiZmVhdHVyZV9zZWxlY3Rpb24iLCBmIntzdGF0X25hbWV9Lmh0bWwiKSwKICAgICkKICAgIF9jbGVhcl9jdXJyZW50X2ZpZ3VyZSgpCgoKZGVmIGZlYXR1cmVfc2VsZWN0aW9uKAogICAgY29udGV4dCwKICAgIGRmX2FydGlmYWN0LAogICAgazogaW50ID0gNSwKICAgIG1pbl92b3RlczogZmxvYXQgPSAwLjUsCiAgICBsYWJlbF9jb2x1bW46IHN0ciA9IE5vbmUsCiAgICBzdGF0X2ZpbHRlcnM6IGxpc3QgPSBOb25lLAogICAgbW9kZWxfZmlsdGVyczogZGljdCA9IE5vbmUsCiAgICBtYXhfc2NhbGVkX3Njb3JlczogYm9vbCA9IFRydWUsCiAgICBzYW1wbGVfcmF0aW86IGZsb2F0ID0gTm9uZSwKICAgIG91dHB1dF92ZWN0b3JfbmFtZTogZmxvYXQgPSBOb25lLAogICAgaWdub3JlX3R5cGVfZXJyb3JzOiBib29sID0gRmFsc2UsCiAgICBpc19mZWF0dXJlX3ZlY3RvcjogYm9vbCA9IEZhbHNlLAopOgogICAgIiIiCiAgICBBcHBsaWVzIHNlbGVjdGVkIGZlYXR1cmUgc2VsZWN0aW9uIHN0YXRpc3RpY2FsIGZ1bmN0aW9ucyBvciBtb2RlbHMgb24gb3VyICdkZl9hcnRpZmFjdCcuCgogICAgRWFjaCBzdGF0aXN0aWNhbCBmdW5jdGlvbiBvciBtb2RlbCB3aWxsIHZvdGUgZm9yIGl0J3MgYmVzdCBLIHNlbGVjdGVkIGZlYXR1cmVzLgogICAgSWYgYSBmZWF0dXJlIGhhcyA+PSAnbWluX3ZvdGVzJyB2b3RlcywgaXQgd2lsbCBiZSBzZWxlY3RlZC4KCiAgICA6cGFyYW0gY29udGV4dDogICAgICAgICAgICAgdGhlIGZ1bmN0aW9uIGNvbnRleHQuCiAgICA6cGFyYW0gZGZfYXJ0aWZhY3Q6ICAgICAgICAgZGF0YWZyYW1lIHRvIHBhc3MgYXMgaW5wdXQuCiAgICA6cGFyYW0gazogICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIHRvcCBmZWF0dXJlcyB0byBzZWxlY3QgZnJvbSBlYWNoIHN0YXRpc3RpY2FsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gb3IgbW9kZWwuCiAgICA6cGFyYW0gbWluX3ZvdGVzOiAgICAgICAgICAgbWluaW1hbCBudW1iZXIgb2Ygdm90ZXMgKGZyb20gYSBtb2RlbCBvciBieSBzdGF0aXN0aWNhbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKSBuZWVkZWQgZm9yIGEgZmVhdHVyZSB0byBiZSBzZWxlY3RlZC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW4gYmUgc3BlY2lmaWVkIGJ5IHBlcmNlbnRhZ2Ugb2Ygdm90ZXMgb3IgYWJzb2x1dGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2Ygdm90ZXMuCiAgICA6cGFyYW0gbGFiZWxfY29sdW1uOiAgICAgICAgZ3JvdW5kLXRydXRoICh5KSBsYWJlbHMuCiAgICA6cGFyYW0gc3RhdF9maWx0ZXJzOiAgICAgICAgc3RhdGlzdGljYWwgZnVuY3Rpb25zIHRvIGFwcGx5IHRvIHRoZSBmZWF0dXJlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmcm9tIHNrbGVhcm4uZmVhdHVyZV9zZWxlY3Rpb24pLgogICAgOnBhcmFtIG1vZGVsX2ZpbHRlcnM6ICAgICAgIG1vZGVscyB0byB1c2UgZm9yIGZlYXR1cmUgZXZhbHVhdGlvbiwgY2FuIGJlIHNwZWNpZmllZCBieQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsIG5hbWUgKGV4LiBMaW5lYXJTVkMpLCBmb3JtYWxpemVkIGpzb24gKGNvbnRhaW5zICdDTEFTUycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ZJVCcsICdNRVRBJykgb3IgYSBwYXRoIHRvIHN1Y2gganNvbiBmaWxlLgogICAgOnBhcmFtIG1heF9zY2FsZWRfc2NvcmVzOiAgIHByb2R1Y2UgZmVhdHVyZSBzY29yZXMgdGFibGUgc2NhbGVkIHdpdGggbWF4X3NjYWxlci4KICAgIDpwYXJhbSBzYW1wbGVfcmF0aW86ICAgICAgICBwZXJjZW50YWdlIG9mIHRoZSBkYXRhc2V0IHRoZSB1c2VyIHdoaXNoZXMgdG8gY29tcHV0ZSB0aGUgZmVhdHVyZSBzZWxlY3Rpb24gcHJvY2VzcyBvbi4KICAgIDpwYXJhbSBvdXRwdXRfdmVjdG9yX25hbWU6ICBjcmVhdGVzIGEgbmV3IGZlYXR1cmUgdmVjdG9yIGNvbnRhaW5pbmcgb25seSB0aGUgaWRlbnRpZmllcyBmZWF0dXJlcy4KICAgIDpwYXJhbSBpZ25vcmVfdHlwZV9lcnJvcnM6ICBza2lwcyBkYXRhdHlwZXMgdGhhdCBhcmUgbmVpdGhlciBmbG9hdCBub3IgaW50IHdpdGhpbiB0aGUgZmVhdHVyZSB2ZWN0b3IuCiAgICA6cGFyYW0gaXNfZmVhdHVyZV92ZWN0b3I6ICAgYm9vbCBzdGF0aW5nIGlmIHRoZSBkYXRhIGlzIHBhc3NlZCBhcyBhIGZlYXR1cmUgdmVjdG9yLgogICAgIiIiCiAgICBzdGF0X2ZpbHRlcnMgPSBzdGF0X2ZpbHRlcnMgb3IgREVGQVVMVF9TVEFUX0ZJTFRFUlMKICAgIG1vZGVsX2ZpbHRlcnMgPSBtb2RlbF9maWx0ZXJzIG9yIERFRkFVTFRfTU9ERUxfRklMVEVSUwogICAgIyBDaGVjayBpZiBkZi5tZXRhIGlzIHZhbGlkLCBpZiBpdCBpcywgbG9vayBmb3IgYSBmZWF0dXJlIHZlY3RvcgogICAgc3RvcmVfdXJpX3ByZWZpeCwgXyA9IG1scnVuLmRhdGFzdG9yZS5wYXJzZV9zdG9yZV91cmkoZGZfYXJ0aWZhY3QuYXJ0aWZhY3RfdXJsKQogICAgaXNfZmVhdHVyZV92ZWN0b3IgPSBtbHJ1bi51dGlscy5TdG9yZVByZWZpeC5GZWF0dXJlVmVjdG9yID09IHN0b3JlX3VyaV9wcmVmaXgKCiAgICAjIExvb2sgaW5zaWRlIG1ldGEuc3BlYy5sYWJlbF9mZWF0dXJlIHRvIGlkZW50aWZ5IHRoZSBsYWJlbF9jb2x1bW4gaWYgdGhlIHVzZXIgZGlkIG5vdCBzcGVjaWZ5IGl0CiAgICBpZiBsYWJlbF9jb2x1bW4gaXMgTm9uZToKICAgICAgICBpZiBpc19mZWF0dXJlX3ZlY3RvcjoKICAgICAgICAgICAgbGFiZWxfY29sdW1uID0gZGZfYXJ0aWZhY3QubWV0YS5zcGVjLmxhYmVsX2ZlYXR1cmUuc3BsaXQoIi4iKVsxXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIk5vIGxhYmVsX2NvbHVtbiB3YXMgZ2l2ZW4sIHBsZWFzZSBhZGQgYSBsYWJlbF9jb2x1bW4uIikKCiAgICAjIFVzZSB0aGUgZmVhdHVyZSB2ZWN0b3IgYXMgZGF0YWZyYW1lCiAgICBkZiA9IGRmX2FydGlmYWN0LmFzX2RmKCkKCiAgICAjIEVuc3VyZSBrIGlzIG5vdCBiaWdnZXIgdGhhbiB0aGUgdG90YWwgbnVtYmVyIG9mIGZlYXR1cmVzCiAgICBpZiBrID4gZGYuc2hhcGVbMV06CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgZiJLIGNhbm5vdCBiZSBiaWdnZXIgdGhhbiB0aGUgdG90YWwgbnVtYmVyIG9mIGZlYXR1cmVzICh7ZGYuc2hhcGVbMV19KS4gUGxlYXNlIGNob29zZSBhIHNtYWxsZXIgSy4iCiAgICAgICAgKQogICAgZWxpZiBrIDwgMToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJLIGNhbm5vdCBiZSBzbWFsbGVyIHRoYW4gMS4gUGxlYXNlIGNob29zZSBhIGJpZ2dlciBLLiIpCgogICAgIyBDcmVhdGUgYSBzYW1wbGUgZGF0YWZyYW1lIG9mIHRoZSBvcmlnaW5hbCBmZWF0dXJlIHZlY3RvcgogICAgaWYgc2FtcGxlX3JhdGlvOgogICAgICAgIGRmID0gKAogICAgICAgICAgICBkZi5ncm91cGJ5KGxhYmVsX2NvbHVtbikKICAgICAgICAgICAgLmFwcGx5KGxhbWJkYSB4OiB4LnNhbXBsZShmcmFjPXNhbXBsZV9yYXRpbykpCiAgICAgICAgICAgIC5yZXNldF9pbmRleChkcm9wPVRydWUpCiAgICAgICAgKQogICAgICAgIGRmID0gZGYuZHJvcG5hKCkKCiAgICAjIFNldCBmZWF0dXJlIHZlY3RvciBhbmQgbGFiZWxzCiAgICB5ID0gZGYucG9wKGxhYmVsX2NvbHVtbikKICAgIFggPSBkZgoKICAgIGlmIG5wLm9iamVjdF8gaW4gbGlzdChYLmR0eXBlcykgYW5kIGlnbm9yZV90eXBlX2Vycm9ycyBpcyBGYWxzZToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICBmIntkZi5zZWxlY3RfZHR5cGVzKGluY2x1ZGU9WydvYmplY3QnXSkuY29sdW1ucy50b2xpc3QoKX0gYXJlIG5laXRoZXIgZmxvYXQgb3IgaW50LiIKICAgICAgICApCgogICAgIyBDcmVhdGUgc2VsZWN0ZWQgc3RhdGlzdGljYWwgZXN0aW1hdG9ycwogICAgc3RhdF9mdW5jdGlvbnNfbGlzdCA9IHsKICAgICAgICBzdGF0X25hbWU6IFNlbGVjdEtCZXN0KAogICAgICAgICAgICBzY29yZV9mdW5jPWNyZWF0ZV9jbGFzcyhmInNrbGVhcm4uZmVhdHVyZV9zZWxlY3Rpb24ue3N0YXRfbmFtZX0iKSwgaz1rCiAgICAgICAgKQogICAgICAgIGZvciBzdGF0X25hbWUgaW4gc3RhdF9maWx0ZXJzCiAgICB9CiAgICByZXF1aXJlc19hYnMgPSBbImNoaTIiXQoKICAgICMgUnVuIHN0YXRpc3RpYyBmaWx0ZXJzCiAgICBzZWxlY3RlZF9mZWF0dXJlc19hZ2cgPSB7fQogICAgc3RhdHNfZGYgPSBwZC5EYXRhRnJhbWUoaW5kZXg9WC5jb2x1bW5zKS5kcm9wbmEoKQoKICAgIGZvciBzdGF0X25hbWUsIHN0YXRfZnVuYyBpbiBzdGF0X2Z1bmN0aW9uc19saXN0Lml0ZW1zKCk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBwYXJhbXMgPSAoWCwgeSkgaWYgc3RhdF9uYW1lIGluIHJlcXVpcmVzX2FicyBlbHNlIChhYnMoWCksIHkpCiAgICAgICAgICAgIHN0YXQgPSBzdGF0X2Z1bmMuZml0KCpwYXJhbXMpCgogICAgICAgICAgICAjIENvbGxlY3Qgc3RhdCBmdW5jdGlvbiByZXN1bHRzCiAgICAgICAgICAgIHN0YXRfZGYgPSBwZC5EYXRhRnJhbWUoCiAgICAgICAgICAgICAgICBpbmRleD1YLmNvbHVtbnMsIGNvbHVtbnM9W3N0YXRfbmFtZV0sIGRhdGE9c3RhdC5zY29yZXNfCiAgICAgICAgICAgICkKICAgICAgICAgICAgcGxvdF9zdGF0KGNvbnRleHQsIHN0YXRfbmFtZSwgc3RhdF9kZikKICAgICAgICAgICAgc3RhdHNfZGYgPSBzdGF0c19kZi5qb2luKHN0YXRfZGYpCgogICAgICAgICAgICAjIFNlbGVjdCBLIEJlc3QgZmVhdHVyZXMKICAgICAgICAgICAgc2VsZWN0ZWRfZmVhdHVyZXMgPSBYLmNvbHVtbnNbc3RhdF9mdW5jLmdldF9zdXBwb3J0KCldCiAgICAgICAgICAgIHNlbGVjdGVkX2ZlYXR1cmVzX2FnZ1tzdGF0X25hbWVdID0gc2VsZWN0ZWRfZmVhdHVyZXMKCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYiQ291bGRuJ3QgY2FsY3VsYXRlIHtzdGF0X25hbWV9IGJlY2F1c2Ugb2Y6IHtlfSIpCgogICAgIyBDcmVhdGUgbW9kZWxzIGZyb20gY2xhc3MgbmFtZSAvIGpzb24gZmlsZSAvIGpzb24gcGFyYW1zCiAgICBhbGxfc2tsZWFybl9lc3RpbWF0b3JzID0gZGljdChhbGxfZXN0aW1hdG9ycygpKSBpZiBsZW4obW9kZWxfZmlsdGVycykgPiAwIGVsc2Uge30KICAgIHNlbGVjdGVkX21vZGVscyA9IHt9CiAgICBmb3IgbW9kZWxfbmFtZSwgbW9kZWwgaW4gbW9kZWxfZmlsdGVycy5pdGVtcygpOgogICAgICAgIGlmICIuanNvbiIgaW4gbW9kZWw6CiAgICAgICAgICAgIGN1cnJlbnRfbW9kZWwgPSBqc29uLmxvYWQob3Blbihtb2RlbCwgInIiKSkKICAgICAgICAgICAgY2xhc3NpZmllcl9jbGFzcyA9IGNyZWF0ZV9jbGFzcyhjdXJyZW50X21vZGVsWyJNRVRBIl1bImNsYXNzIl0pCiAgICAgICAgICAgIHNlbGVjdGVkX21vZGVsc1ttb2RlbF9uYW1lXSA9IGNsYXNzaWZpZXJfY2xhc3MoKipjdXJyZW50X21vZGVsWyJDTEFTUyJdKQogICAgICAgIGVsaWYgbW9kZWwgaW4gYWxsX3NrbGVhcm5fZXN0aW1hdG9yczoKICAgICAgICAgICAgc2VsZWN0ZWRfbW9kZWxzW21vZGVsX25hbWVdID0gYWxsX3NrbGVhcm5fZXN0aW1hdG9yc1ttb2RlbF9uYW1lXSgpCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGN1cnJlbnRfbW9kZWwgPSBqc29uLmxvYWRzKG1vZGVsKQogICAgICAgICAgICAgICAgY2xhc3NpZmllcl9jbGFzcyA9IGNyZWF0ZV9jbGFzcyhjdXJyZW50X21vZGVsWyJNRVRBIl1bImNsYXNzIl0pCiAgICAgICAgICAgICAgICBzZWxlY3RlZF9tb2RlbHNbbW9kZWxfbmFtZV0gPSBjbGFzc2lmaWVyX2NsYXNzKCoqY3VycmVudF9tb2RlbFsiQ0xBU1MiXSkKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICAgICAgY29udGV4dC5sb2dnZXIuaW5mbyhmInVuYWJsZSB0byBsb2FkIHttb2RlbH0gYmVjYXVzZSBvZjoge2V9IikKCiAgICAjIFJ1biBtb2RlbCBmaWx0ZXJzCiAgICBtb2RlbHNfZGYgPSBwZC5EYXRhRnJhbWUoaW5kZXg9WC5jb2x1bW5zKQogICAgZm9yIG1vZGVsX25hbWUsIG1vZGVsIGluIHNlbGVjdGVkX21vZGVscy5pdGVtcygpOgoKICAgICAgICBpZiBtb2RlbF9uYW1lID09ICJMb2dpc3RpY1JlZ3Jlc3Npb24iOgogICAgICAgICAgICBtb2RlbC5zZXRfcGFyYW1zKHNvbHZlcj0ibGlibGluZWFyIikKCiAgICAgICAgIyBUcmFpbiBtb2RlbCBhbmQgZ2V0IGZlYXR1cmUgaW1wb3J0YW5jZQogICAgICAgIHNlbGVjdF9mcm9tX21vZGVsID0gU2VsZWN0RnJvbU1vZGVsKG1vZGVsKS5maXQoWCwgeSkKICAgICAgICBmZWF0dXJlX2lkeCA9IHNlbGVjdF9mcm9tX21vZGVsLmdldF9zdXBwb3J0KCkKICAgICAgICBmZWF0dXJlX25hbWVzID0gWC5jb2x1bW5zW2ZlYXR1cmVfaWR4XQogICAgICAgIHNlbGVjdGVkX2ZlYXR1cmVzX2FnZ1ttb2RlbF9uYW1lXSA9IGZlYXR1cmVfbmFtZXMudG9saXN0KCkKCiAgICAgICAgIyBDb2xsZWN0IG1vZGVsIGZlYXR1cmUgaW1wb3J0YW5jZQogICAgICAgIGlmIGhhc2F0dHIoc2VsZWN0X2Zyb21fbW9kZWwuZXN0aW1hdG9yXywgImNvZWZfIik6CiAgICAgICAgICAgIHN0YXRfZGYgPSBzZWxlY3RfZnJvbV9tb2RlbC5lc3RpbWF0b3JfLmNvZWZfCiAgICAgICAgZWxpZiBoYXNhdHRyKHNlbGVjdF9mcm9tX21vZGVsLmVzdGltYXRvcl8sICJmZWF0dXJlX2ltcG9ydGFuY2VzXyIpOgogICAgICAgICAgICBzdGF0X2RmID0gc2VsZWN0X2Zyb21fbW9kZWwuZXN0aW1hdG9yXy5mZWF0dXJlX2ltcG9ydGFuY2VzXwoKICAgICAgICBzdGF0X2RmID0gcGQuRGF0YUZyYW1lKGluZGV4PVguY29sdW1ucywgY29sdW1ucz1bbW9kZWxfbmFtZV0sIGRhdGE9c3RhdF9kZlswXSkKICAgICAgICBtb2RlbHNfZGYgPSBtb2RlbHNfZGYuam9pbihzdGF0X2RmKQoKICAgICAgICBwbG90X3N0YXQoY29udGV4dCwgbW9kZWxfbmFtZSwgc3RhdF9kZikKCiAgICAjIENyZWF0ZSBmZWF0dXJlX3Njb3JlcyBERiB3aXRoIHN0YXQgJiBtb2RlbCBmaWx0ZXJzIHNjb3JlcwogICAgcmVzdWx0X21hdHJpeF9kZiA9IHBkLmNvbmNhdChbc3RhdHNfZGYsIG1vZGVsc19kZl0sIGF4aXM9MSwgc29ydD1GYWxzZSkKICAgIGNvbnRleHQubG9nX2RhdGFzZXQoCiAgICAgICAga2V5PSJmZWF0dXJlX3Njb3JlcyIsCiAgICAgICAgZGY9cmVzdWx0X21hdHJpeF9kZiwKICAgICAgICBsb2NhbF9wYXRoPSJmZWF0dXJlX3Njb3Jlcy5wYXJxdWV0IiwKICAgICAgICBmb3JtYXQ9InBhcnF1ZXQiLAogICAgKQogICAgaWYgbWF4X3NjYWxlZF9zY29yZXM6CiAgICAgICAgbm9ybWFsaXplZF9kZiA9IHJlc3VsdF9tYXRyaXhfZGYucmVwbGFjZShbbnAuaW5mLCAtbnAuaW5mXSwgbnAubmFuKS52YWx1ZXMKICAgICAgICBtaW5fbWF4X3NjYWxlciA9IE1pbk1heFNjYWxlcigpCiAgICAgICAgbm9ybWFsaXplZF9kZiA9IG1pbl9tYXhfc2NhbGVyLmZpdF90cmFuc2Zvcm0obm9ybWFsaXplZF9kZikKICAgICAgICBub3JtYWxpemVkX2RmID0gcGQuRGF0YUZyYW1lKAogICAgICAgICAgICBkYXRhPW5vcm1hbGl6ZWRfZGYsCiAgICAgICAgICAgIGNvbHVtbnM9cmVzdWx0X21hdHJpeF9kZi5jb2x1bW5zLAogICAgICAgICAgICBpbmRleD1yZXN1bHRfbWF0cml4X2RmLmluZGV4LAogICAgICAgICkKICAgICAgICBjb250ZXh0LmxvZ19kYXRhc2V0KAogICAgICAgICAgICBrZXk9Im1heF9zY2FsZWRfc2NvcmVzX2ZlYXR1cmVfc2NvcmVzIiwKICAgICAgICAgICAgZGY9bm9ybWFsaXplZF9kZiwKICAgICAgICAgICAgbG9jYWxfcGF0aD0ibWF4X3NjYWxlZF9zY29yZXNfZmVhdHVyZV9zY29yZXMucGFycXVldCIsCiAgICAgICAgICAgIGZvcm1hdD0icGFycXVldCIsCiAgICAgICAgKQoKICAgICMgQ3JlYXRlIGZlYXR1cmUgY291bnQgRGF0YUZyYW1lCiAgICBmb3IgdGVzdF9uYW1lIGluIHNlbGVjdGVkX2ZlYXR1cmVzX2FnZzoKICAgICAgICByZXN1bHRfbWF0cml4X2RmW3Rlc3RfbmFtZV0gPSBbCiAgICAgICAgICAgIDEgaWYgeCBpbiBzZWxlY3RlZF9mZWF0dXJlc19hZ2dbdGVzdF9uYW1lXSBlbHNlIDAgZm9yIHggaW4gWC5jb2x1bW5zCiAgICAgICAgXQogICAgcmVzdWx0X21hdHJpeF9kZi5sb2NbOiwgIm51bV92b3RlcyJdID0gcmVzdWx0X21hdHJpeF9kZi5zdW0oYXhpcz0xKQogICAgY29udGV4dC5sb2dfZGF0YXNldCgKICAgICAgICBrZXk9InNlbGVjdGVkX2ZlYXR1cmVzX2NvdW50IiwKICAgICAgICBkZj1yZXN1bHRfbWF0cml4X2RmLAogICAgICAgIGxvY2FsX3BhdGg9InNlbGVjdGVkX2ZlYXR1cmVzX2NvdW50LnBhcnF1ZXQiLAogICAgICAgIGZvcm1hdD0icGFycXVldCIsCiAgICApCgogICAgIyBIb3cgbWFueSB2b3RlcyBhcmUgbmVlZGVkIGZvciBhIGZlYXR1cmUgdG8gYmUgc2VsZWN0ZWQ/CiAgICBpZiBpc2luc3RhbmNlKG1pbl92b3RlcywgaW50KToKICAgICAgICB2b3Rlc19uZWVkZWQgPSBtaW5fdm90ZXMKICAgIGVsc2U6CiAgICAgICAgbnVtX2ZpbHRlcnMgPSBsZW4oc3RhdF9maWx0ZXJzKSArIGxlbihtb2RlbF9maWx0ZXJzKQogICAgICAgIHZvdGVzX25lZWRlZCA9IGludChucC5mbG9vcihudW1fZmlsdGVycyAqIG1heChtaW4obWluX3ZvdGVzLCAxKSwgMCkpKQogICAgY29udGV4dC5sb2dnZXIuaW5mbyhmInZvdGVzIG5lZWRlZCB0byBiZSBzZWxlY3RlZDoge3ZvdGVzX25lZWRlZH0iKQoKICAgICMgQ3JlYXRlIGZpbmFsIGZlYXR1cmUgZGF0YWZyYW1lCiAgICBzZWxlY3RlZF9mZWF0dXJlcyA9IHJlc3VsdF9tYXRyaXhfZGZbCiAgICAgICAgcmVzdWx0X21hdHJpeF9kZi5udW1fdm90ZXMgPj0gdm90ZXNfbmVlZGVkCiAgICBdLmluZGV4LnRvbGlzdCgpCiAgICBnb29kX2ZlYXR1cmVfZGYgPSBkZi5sb2NbOiwgc2VsZWN0ZWRfZmVhdHVyZXNdCiAgICBmaW5hbF9kZiA9IHBkLmNvbmNhdChbZ29vZF9mZWF0dXJlX2RmLCB5XSwgYXhpcz0xKQogICAgY29udGV4dC5sb2dfZGF0YXNldCgKICAgICAgICBrZXk9InNlbGVjdGVkX2ZlYXR1cmVzIiwKICAgICAgICBkZj1maW5hbF9kZiwKICAgICAgICBsb2NhbF9wYXRoPSJzZWxlY3RlZF9mZWF0dXJlcy5wYXJxdWV0IiwKICAgICAgICBmb3JtYXQ9InBhcnF1ZXQiLAogICAgKQoKICAgICMgQ3JlYXRpbmcgYSBuZXcgZmVhdHVyZSB2ZWN0b3IgY29udGFpbmluZyBvbmx5IHRoZSBpZGVudGlmaWVkIHRvcCBmZWF0dXJlcwogICAgaWYgaXNfZmVhdHVyZV92ZWN0b3IgYW5kIGRmX2FydGlmYWN0Lm1ldGEuc3BlYy5mZWF0dXJlcyBhbmQgb3V0cHV0X3ZlY3Rvcl9uYW1lOgogICAgICAgICMgU2VsZWN0aW5nIHRoZSB0b3AgSyBmZWF0dXJlcyBmcm9tIG91ciB0b3AgZmVhdHVyZSBkYXRhZnJhbWUKICAgICAgICBzZWxlY3RlZF9mZWF0dXJlcyA9IHJlc3VsdF9tYXRyaXhfZGYuaGVhZChrKS5pbmRleAoKICAgICAgICAjIE1hdGNoIHRoZSBzZWxlY3RlZCBmZWF0dXJlIG5hbWVzIHRvIHRoZSBGUyBGZWF0dXJlIGFubm90YXRpb25zCiAgICAgICAgbWF0Y2hlZF9zZWxlY3Rpb25zID0gWwogICAgICAgICAgICBmZWF0dXJlCiAgICAgICAgICAgIGZvciBmZWF0dXJlIGluIGxpc3QoZGZfYXJ0aWZhY3QubWV0YS5zcGVjLmZlYXR1cmVzKQogICAgICAgICAgICBmb3Igc2VsZWN0ZWQgaW4gbGlzdChzZWxlY3RlZF9mZWF0dXJlcykKICAgICAgICAgICAgaWYgZmVhdHVyZS5lbmRzd2l0aChzZWxlY3RlZCkKICAgICAgICBdCgogICAgICAgICMgRGVmaW5pbmcgb3VyIG5ldyBmZWF0dXJlIHZlY3RvcgogICAgICAgIHRvcF9mZWF0dXJlc19mdiA9IGZzLkZlYXR1cmVWZWN0b3IoCiAgICAgICAgICAgIG91dHB1dF92ZWN0b3JfbmFtZSwKICAgICAgICAgICAgbWF0Y2hlZF9zZWxlY3Rpb25zLAogICAgICAgICAgICBsYWJlbF9mZWF0dXJlPSJsYWJlbHMubGFiZWwiLAogICAgICAgICAgICBkZXNjcmlwdGlvbj0iZmVhdHVyZSB2ZWN0b3IgY29tcG9zZWQgc3RyaWN0bHkgb2Ygb3VyIHRvcCBmZWF0dXJlcyIsCiAgICAgICAgKQoKICAgICAgICAjIFNhdmluZwogICAgICAgIHRvcF9mZWF0dXJlc19mdi5zYXZlKCkKICAgICAgICBmcy5nZXRfb2ZmbGluZV9mZWF0dXJlcyh0b3BfZmVhdHVyZXNfZnYsIHRhcmdldD1QYXJxdWV0VGFyZ2V0KCkpCgogICAgICAgICMgTG9nZ2luZyBvdXIgbmV3IGZlYXR1cmUgdmVjdG9yIFVSSQogICAgICAgIGNvbnRleHQubG9nX3Jlc3VsdCgidG9wX2ZlYXR1cmVzX3ZlY3RvciIsIHRvcF9mZWF0dXJlc19mdi51cmkpCg== + code_origin: '' default_handler: feature_selection - disable_auto_mount: false - clone_target_dir: '' - env: [] - priority_class_name: '' - preemption_mode: prevent - affinity: null - tolerations: null - security_context: {} -verbose: false + description: Select features through multiple Statistical and Model filters + image: mlrun/mlrun +metadata: + categories: + - data-preparation + - machine-learning + tag: '' + name: feature-selection diff --git a/feature_selection/item.yaml b/feature_selection/item.yaml index 7e80a417b..1c79e6f12 100644 --- a/feature_selection/item.yaml +++ b/feature_selection/item.yaml @@ -12,9 +12,9 @@ labels: author: orz maintainers: [] marketplaceType: '' -mlrunVersion: 1.1.0 +mlrunVersion: 1.7.0 name: feature-selection -platformVersion: 3.5.0 +platformVersion: 3.6.0 spec: filename: feature_selection.py handler: feature_selection @@ -22,4 +22,4 @@ spec: kind: job requirements: [] url: '' -version: 1.4.0 +version: 1.5.0 From 64907af0011894ceffe6e7e8471a306eb215221f Mon Sep 17 00:00:00 2001 From: Avi Asulin Date: Mon, 2 Sep 2024 14:52:10 +0300 Subject: [PATCH 14/38] [feature selection] update function yaml --- feature_selection/function.yaml | 56 ++++++++++++++++----------------- feature_selection/item.yaml | 2 +- 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/feature_selection/function.yaml b/feature_selection/function.yaml index d4e95f1e9..f1bf53b8a 100644 --- a/feature_selection/function.yaml +++ b/feature_selection/function.yaml @@ -1,33 +1,43 @@ +metadata: + name: feature-selection + tag: '' + categories: + - data-preparation + - machine-learning kind: job -verbose: false spec: - disable_auto_mount: false - command: '' entry_points: show_values_on_bars: - lineno: 54 + doc: '' + has_kwargs: false parameters: - name: axs - name: h_v default: v - name: space default: 0.4 - name: show_values_on_bars + lineno: 54 has_varargs: false - has_kwargs: false - doc: '' + name: show_values_on_bars plot_stat: - lineno: 76 + doc: '' + has_kwargs: false parameters: - name: context - name: stat_name - name: stat_df - name: plot_stat + lineno: 76 has_varargs: false - has_kwargs: false - doc: '' + name: plot_stat feature_selection: - lineno: 106 + doc: 'Applies selected feature selection statistical functions or models on + our ''df_artifact''. + + + Each statistical function or model will vote for it''s best K selected features. + + If a feature has >= ''min_votes'' votes, it will be selected.' + has_kwargs: false parameters: - name: context doc: the function context. @@ -78,26 +88,16 @@ spec: type: bool doc: bool stating if the data is passed as a feature vector. default: false - name: feature_selection + lineno: 106 has_varargs: false - has_kwargs: false - doc: 'Applies selected feature selection statistical functions or models on - our ''df_artifact''. - - - Each statistical function or model will vote for it''s best K selected features. - - If a feature has >= ''min_votes'' votes, it will be selected.' + name: feature_selection + disable_auto_mount: false + command: '' build: origin_filename: '' functionSourceCode: IyBDb3B5cmlnaHQgMjAxOSBJZ3VhemlvCiMKIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiMKaW1wb3J0IGpzb24KaW1wb3J0IG9zCgppbXBvcnQgbWF0cGxvdGxpYi5weXBsb3QgYXMgcGx0CmltcG9ydCBtbHJ1bgppbXBvcnQgbWxydW4uZGF0YXN0b3JlCmltcG9ydCBtbHJ1bi51dGlscwppbXBvcnQgbWxydW4uZmVhdHVyZV9zdG9yZSBhcyBmcwppbXBvcnQgbnVtcHkgYXMgbnAKaW1wb3J0IHBhbmRhcyBhcyBwZAppbXBvcnQgc2VhYm9ybiBhcyBzbnMKZnJvbSBtbHJ1bi5hcnRpZmFjdHMgaW1wb3J0IFBsb3RBcnRpZmFjdApmcm9tIG1scnVuLmRhdGFzdG9yZS50YXJnZXRzIGltcG9ydCBQYXJxdWV0VGFyZ2V0CiMgTUxSdW4gdXRpbHMKZnJvbSBtbHJ1bi51dGlscy5oZWxwZXJzIGltcG9ydCBjcmVhdGVfY2xhc3MKIyBGZWF0dXJlIHNlbGVjdGlvbiBzdHJhdGVnaWVzCmZyb20gc2tsZWFybi5mZWF0dXJlX3NlbGVjdGlvbiBpbXBvcnQgU2VsZWN0RnJvbU1vZGVsLCBTZWxlY3RLQmVzdAojIFNjYWxlIGZlYXR1cmUgc2NvcmVzZ2l0IHN0CmZyb20gc2tsZWFybi5wcmVwcm9jZXNzaW5nIGltcG9ydCBNaW5NYXhTY2FsZXIKIyBTS0xlYXJuIGVzdGltYXRvcnMgbGlzdApmcm9tIHNrbGVhcm4udXRpbHMgaW1wb3J0IGFsbF9lc3RpbWF0b3JzCgpERUZBVUxUX1NUQVRfRklMVEVSUyA9IFsiZl9jbGFzc2lmIiwgIm11dHVhbF9pbmZvX2NsYXNzaWYiLCAiY2hpMiIsICJmX3JlZ3Jlc3Npb24iXQpERUZBVUxUX01PREVMX0ZJTFRFUlMgPSB7CiAgICAiTGluZWFyU1ZDIjogIkxpbmVhclNWQyIsCiAgICAiTG9naXN0aWNSZWdyZXNzaW9uIjogIkxvZ2lzdGljUmVncmVzc2lvbiIsCiAgICAiRXh0cmFUcmVlc0NsYXNzaWZpZXIiOiAiRXh0cmFUcmVlc0NsYXNzaWZpZXIiLAp9CgoKZGVmIF9jbGVhcl9jdXJyZW50X2ZpZ3VyZSgpOgogICAgIiIiCiAgICBDbGVhciBtYXRwbG90bGliIGN1cnJlbnQgZmlndXJlLgogICAgIiIiCiAgICBwbHQuY2xhKCkKICAgIHBsdC5jbGYoKQogICAgcGx0LmNsb3NlKCkKCgpkZWYgc2hvd192YWx1ZXNfb25fYmFycyhheHMsIGhfdj0idiIsIHNwYWNlPTAuNCk6CiAgICBkZWYgX3Nob3dfb25fc2luZ2xlX3Bsb3QoYXhfKToKICAgICAgICBpZiBoX3YgPT0gInYiOgogICAgICAgICAgICBmb3IgcCBpbiBheF8ucGF0Y2hlczoKICAgICAgICAgICAgICAgIF94ID0gcC5nZXRfeCgpICsgcC5nZXRfd2lkdGgoKSAvIDIKICAgICAgICAgICAgICAgIF95ID0gcC5nZXRfeSgpICsgcC5nZXRfaGVpZ2h0KCkKICAgICAgICAgICAgICAgIHZhbHVlID0gaW50KHAuZ2V0X2hlaWdodCgpKQogICAgICAgICAgICAgICAgYXhfLnRleHQoX3gsIF95LCB2YWx1ZSwgaGE9ImNlbnRlciIpCiAgICAgICAgZWxpZiBoX3YgPT0gImgiOgogICAgICAgICAgICBmb3IgcCBpbiBheF8ucGF0Y2hlczoKICAgICAgICAgICAgICAgIF94ID0gcC5nZXRfeCgpICsgcC5nZXRfd2lkdGgoKSArIGZsb2F0KHNwYWNlKQogICAgICAgICAgICAgICAgX3kgPSBwLmdldF95KCkgKyBwLmdldF9oZWlnaHQoKQogICAgICAgICAgICAgICAgdmFsdWUgPSBpbnQocC5nZXRfd2lkdGgoKSkKICAgICAgICAgICAgICAgIGF4Xy50ZXh0KF94LCBfeSwgdmFsdWUsIGhhPSJsZWZ0IikKCiAgICBpZiBpc2luc3RhbmNlKGF4cywgbnAubmRhcnJheSk6CiAgICAgICAgZm9yIGlkeCwgYXggaW4gbnAubmRlbnVtZXJhdGUoYXhzKToKICAgICAgICAgICAgX3Nob3dfb25fc2luZ2xlX3Bsb3QoYXgpCiAgICBlbHNlOgogICAgICAgIF9zaG93X29uX3NpbmdsZV9wbG90KGF4cykKCgpkZWYgcGxvdF9zdGF0KGNvbnRleHQsIHN0YXRfbmFtZSwgc3RhdF9kZik6CiAgICBfY2xlYXJfY3VycmVudF9maWd1cmUoKQoKICAgICMgQWRkIGNoYXJ0CiAgICBheCA9IHBsdC5heGVzKCkKICAgIHN0YXRfY2hhcnQgPSBzbnMuYmFycGxvdCgKICAgICAgICB4PXN0YXRfbmFtZSwKICAgICAgICB5PSJpbmRleCIsCiAgICAgICAgZGF0YT1zdGF0X2RmLnNvcnRfdmFsdWVzKHN0YXRfbmFtZSwgYXNjZW5kaW5nPUZhbHNlKS5yZXNldF9pbmRleCgpLAogICAgICAgIGF4PWF4LAogICAgKQogICAgcGx0LnRpZ2h0X2xheW91dCgpCgogICAgZm9yIHAgaW4gc3RhdF9jaGFydC5wYXRjaGVzOgogICAgICAgIHdpZHRoID0gcC5nZXRfd2lkdGgoKQogICAgICAgIHBsdC50ZXh0KAogICAgICAgICAgICA1ICsgcC5nZXRfd2lkdGgoKSwKICAgICAgICAgICAgcC5nZXRfeSgpICsgMC41NSAqIHAuZ2V0X2hlaWdodCgpLAogICAgICAgICAgICAiezoxLjJmfSIuZm9ybWF0KHdpZHRoKSwKICAgICAgICAgICAgaGE9ImNlbnRlciIsCiAgICAgICAgICAgIHZhPSJjZW50ZXIiLAogICAgICAgICkKCiAgICBjb250ZXh0LmxvZ19hcnRpZmFjdCgKICAgICAgICBQbG90QXJ0aWZhY3QoZiJ7c3RhdF9uYW1lfSIsIGJvZHk9cGx0LmdjZigpKSwKICAgICAgICBsb2NhbF9wYXRoPW9zLnBhdGguam9pbigicGxvdHMiLCAiZmVhdHVyZV9zZWxlY3Rpb24iLCBmIntzdGF0X25hbWV9Lmh0bWwiKSwKICAgICkKICAgIF9jbGVhcl9jdXJyZW50X2ZpZ3VyZSgpCgoKZGVmIGZlYXR1cmVfc2VsZWN0aW9uKAogICAgY29udGV4dCwKICAgIGRmX2FydGlmYWN0LAogICAgazogaW50ID0gNSwKICAgIG1pbl92b3RlczogZmxvYXQgPSAwLjUsCiAgICBsYWJlbF9jb2x1bW46IHN0ciA9IE5vbmUsCiAgICBzdGF0X2ZpbHRlcnM6IGxpc3QgPSBOb25lLAogICAgbW9kZWxfZmlsdGVyczogZGljdCA9IE5vbmUsCiAgICBtYXhfc2NhbGVkX3Njb3JlczogYm9vbCA9IFRydWUsCiAgICBzYW1wbGVfcmF0aW86IGZsb2F0ID0gTm9uZSwKICAgIG91dHB1dF92ZWN0b3JfbmFtZTogZmxvYXQgPSBOb25lLAogICAgaWdub3JlX3R5cGVfZXJyb3JzOiBib29sID0gRmFsc2UsCiAgICBpc19mZWF0dXJlX3ZlY3RvcjogYm9vbCA9IEZhbHNlLAopOgogICAgIiIiCiAgICBBcHBsaWVzIHNlbGVjdGVkIGZlYXR1cmUgc2VsZWN0aW9uIHN0YXRpc3RpY2FsIGZ1bmN0aW9ucyBvciBtb2RlbHMgb24gb3VyICdkZl9hcnRpZmFjdCcuCgogICAgRWFjaCBzdGF0aXN0aWNhbCBmdW5jdGlvbiBvciBtb2RlbCB3aWxsIHZvdGUgZm9yIGl0J3MgYmVzdCBLIHNlbGVjdGVkIGZlYXR1cmVzLgogICAgSWYgYSBmZWF0dXJlIGhhcyA+PSAnbWluX3ZvdGVzJyB2b3RlcywgaXQgd2lsbCBiZSBzZWxlY3RlZC4KCiAgICA6cGFyYW0gY29udGV4dDogICAgICAgICAgICAgdGhlIGZ1bmN0aW9uIGNvbnRleHQuCiAgICA6cGFyYW0gZGZfYXJ0aWZhY3Q6ICAgICAgICAgZGF0YWZyYW1lIHRvIHBhc3MgYXMgaW5wdXQuCiAgICA6cGFyYW0gazogICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIHRvcCBmZWF0dXJlcyB0byBzZWxlY3QgZnJvbSBlYWNoIHN0YXRpc3RpY2FsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gb3IgbW9kZWwuCiAgICA6cGFyYW0gbWluX3ZvdGVzOiAgICAgICAgICAgbWluaW1hbCBudW1iZXIgb2Ygdm90ZXMgKGZyb20gYSBtb2RlbCBvciBieSBzdGF0aXN0aWNhbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKSBuZWVkZWQgZm9yIGEgZmVhdHVyZSB0byBiZSBzZWxlY3RlZC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW4gYmUgc3BlY2lmaWVkIGJ5IHBlcmNlbnRhZ2Ugb2Ygdm90ZXMgb3IgYWJzb2x1dGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2Ygdm90ZXMuCiAgICA6cGFyYW0gbGFiZWxfY29sdW1uOiAgICAgICAgZ3JvdW5kLXRydXRoICh5KSBsYWJlbHMuCiAgICA6cGFyYW0gc3RhdF9maWx0ZXJzOiAgICAgICAgc3RhdGlzdGljYWwgZnVuY3Rpb25zIHRvIGFwcGx5IHRvIHRoZSBmZWF0dXJlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmcm9tIHNrbGVhcm4uZmVhdHVyZV9zZWxlY3Rpb24pLgogICAgOnBhcmFtIG1vZGVsX2ZpbHRlcnM6ICAgICAgIG1vZGVscyB0byB1c2UgZm9yIGZlYXR1cmUgZXZhbHVhdGlvbiwgY2FuIGJlIHNwZWNpZmllZCBieQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsIG5hbWUgKGV4LiBMaW5lYXJTVkMpLCBmb3JtYWxpemVkIGpzb24gKGNvbnRhaW5zICdDTEFTUycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ZJVCcsICdNRVRBJykgb3IgYSBwYXRoIHRvIHN1Y2gganNvbiBmaWxlLgogICAgOnBhcmFtIG1heF9zY2FsZWRfc2NvcmVzOiAgIHByb2R1Y2UgZmVhdHVyZSBzY29yZXMgdGFibGUgc2NhbGVkIHdpdGggbWF4X3NjYWxlci4KICAgIDpwYXJhbSBzYW1wbGVfcmF0aW86ICAgICAgICBwZXJjZW50YWdlIG9mIHRoZSBkYXRhc2V0IHRoZSB1c2VyIHdoaXNoZXMgdG8gY29tcHV0ZSB0aGUgZmVhdHVyZSBzZWxlY3Rpb24gcHJvY2VzcyBvbi4KICAgIDpwYXJhbSBvdXRwdXRfdmVjdG9yX25hbWU6ICBjcmVhdGVzIGEgbmV3IGZlYXR1cmUgdmVjdG9yIGNvbnRhaW5pbmcgb25seSB0aGUgaWRlbnRpZmllcyBmZWF0dXJlcy4KICAgIDpwYXJhbSBpZ25vcmVfdHlwZV9lcnJvcnM6ICBza2lwcyBkYXRhdHlwZXMgdGhhdCBhcmUgbmVpdGhlciBmbG9hdCBub3IgaW50IHdpdGhpbiB0aGUgZmVhdHVyZSB2ZWN0b3IuCiAgICA6cGFyYW0gaXNfZmVhdHVyZV92ZWN0b3I6ICAgYm9vbCBzdGF0aW5nIGlmIHRoZSBkYXRhIGlzIHBhc3NlZCBhcyBhIGZlYXR1cmUgdmVjdG9yLgogICAgIiIiCiAgICBzdGF0X2ZpbHRlcnMgPSBzdGF0X2ZpbHRlcnMgb3IgREVGQVVMVF9TVEFUX0ZJTFRFUlMKICAgIG1vZGVsX2ZpbHRlcnMgPSBtb2RlbF9maWx0ZXJzIG9yIERFRkFVTFRfTU9ERUxfRklMVEVSUwogICAgIyBDaGVjayBpZiBkZi5tZXRhIGlzIHZhbGlkLCBpZiBpdCBpcywgbG9vayBmb3IgYSBmZWF0dXJlIHZlY3RvcgogICAgc3RvcmVfdXJpX3ByZWZpeCwgXyA9IG1scnVuLmRhdGFzdG9yZS5wYXJzZV9zdG9yZV91cmkoZGZfYXJ0aWZhY3QuYXJ0aWZhY3RfdXJsKQogICAgaXNfZmVhdHVyZV92ZWN0b3IgPSBtbHJ1bi51dGlscy5TdG9yZVByZWZpeC5GZWF0dXJlVmVjdG9yID09IHN0b3JlX3VyaV9wcmVmaXgKCiAgICAjIExvb2sgaW5zaWRlIG1ldGEuc3BlYy5sYWJlbF9mZWF0dXJlIHRvIGlkZW50aWZ5IHRoZSBsYWJlbF9jb2x1bW4gaWYgdGhlIHVzZXIgZGlkIG5vdCBzcGVjaWZ5IGl0CiAgICBpZiBsYWJlbF9jb2x1bW4gaXMgTm9uZToKICAgICAgICBpZiBpc19mZWF0dXJlX3ZlY3RvcjoKICAgICAgICAgICAgbGFiZWxfY29sdW1uID0gZGZfYXJ0aWZhY3QubWV0YS5zcGVjLmxhYmVsX2ZlYXR1cmUuc3BsaXQoIi4iKVsxXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIk5vIGxhYmVsX2NvbHVtbiB3YXMgZ2l2ZW4sIHBsZWFzZSBhZGQgYSBsYWJlbF9jb2x1bW4uIikKCiAgICAjIFVzZSB0aGUgZmVhdHVyZSB2ZWN0b3IgYXMgZGF0YWZyYW1lCiAgICBkZiA9IGRmX2FydGlmYWN0LmFzX2RmKCkKCiAgICAjIEVuc3VyZSBrIGlzIG5vdCBiaWdnZXIgdGhhbiB0aGUgdG90YWwgbnVtYmVyIG9mIGZlYXR1cmVzCiAgICBpZiBrID4gZGYuc2hhcGVbMV06CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgZiJLIGNhbm5vdCBiZSBiaWdnZXIgdGhhbiB0aGUgdG90YWwgbnVtYmVyIG9mIGZlYXR1cmVzICh7ZGYuc2hhcGVbMV19KS4gUGxlYXNlIGNob29zZSBhIHNtYWxsZXIgSy4iCiAgICAgICAgKQogICAgZWxpZiBrIDwgMToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJLIGNhbm5vdCBiZSBzbWFsbGVyIHRoYW4gMS4gUGxlYXNlIGNob29zZSBhIGJpZ2dlciBLLiIpCgogICAgIyBDcmVhdGUgYSBzYW1wbGUgZGF0YWZyYW1lIG9mIHRoZSBvcmlnaW5hbCBmZWF0dXJlIHZlY3RvcgogICAgaWYgc2FtcGxlX3JhdGlvOgogICAgICAgIGRmID0gKAogICAgICAgICAgICBkZi5ncm91cGJ5KGxhYmVsX2NvbHVtbikKICAgICAgICAgICAgLmFwcGx5KGxhbWJkYSB4OiB4LnNhbXBsZShmcmFjPXNhbXBsZV9yYXRpbykpCiAgICAgICAgICAgIC5yZXNldF9pbmRleChkcm9wPVRydWUpCiAgICAgICAgKQogICAgICAgIGRmID0gZGYuZHJvcG5hKCkKCiAgICAjIFNldCBmZWF0dXJlIHZlY3RvciBhbmQgbGFiZWxzCiAgICB5ID0gZGYucG9wKGxhYmVsX2NvbHVtbikKICAgIFggPSBkZgoKICAgIGlmIG5wLm9iamVjdF8gaW4gbGlzdChYLmR0eXBlcykgYW5kIGlnbm9yZV90eXBlX2Vycm9ycyBpcyBGYWxzZToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICBmIntkZi5zZWxlY3RfZHR5cGVzKGluY2x1ZGU9WydvYmplY3QnXSkuY29sdW1ucy50b2xpc3QoKX0gYXJlIG5laXRoZXIgZmxvYXQgb3IgaW50LiIKICAgICAgICApCgogICAgIyBDcmVhdGUgc2VsZWN0ZWQgc3RhdGlzdGljYWwgZXN0aW1hdG9ycwogICAgc3RhdF9mdW5jdGlvbnNfbGlzdCA9IHsKICAgICAgICBzdGF0X25hbWU6IFNlbGVjdEtCZXN0KAogICAgICAgICAgICBzY29yZV9mdW5jPWNyZWF0ZV9jbGFzcyhmInNrbGVhcm4uZmVhdHVyZV9zZWxlY3Rpb24ue3N0YXRfbmFtZX0iKSwgaz1rCiAgICAgICAgKQogICAgICAgIGZvciBzdGF0X25hbWUgaW4gc3RhdF9maWx0ZXJzCiAgICB9CiAgICByZXF1aXJlc19hYnMgPSBbImNoaTIiXQoKICAgICMgUnVuIHN0YXRpc3RpYyBmaWx0ZXJzCiAgICBzZWxlY3RlZF9mZWF0dXJlc19hZ2cgPSB7fQogICAgc3RhdHNfZGYgPSBwZC5EYXRhRnJhbWUoaW5kZXg9WC5jb2x1bW5zKS5kcm9wbmEoKQoKICAgIGZvciBzdGF0X25hbWUsIHN0YXRfZnVuYyBpbiBzdGF0X2Z1bmN0aW9uc19saXN0Lml0ZW1zKCk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBwYXJhbXMgPSAoWCwgeSkgaWYgc3RhdF9uYW1lIGluIHJlcXVpcmVzX2FicyBlbHNlIChhYnMoWCksIHkpCiAgICAgICAgICAgIHN0YXQgPSBzdGF0X2Z1bmMuZml0KCpwYXJhbXMpCgogICAgICAgICAgICAjIENvbGxlY3Qgc3RhdCBmdW5jdGlvbiByZXN1bHRzCiAgICAgICAgICAgIHN0YXRfZGYgPSBwZC5EYXRhRnJhbWUoCiAgICAgICAgICAgICAgICBpbmRleD1YLmNvbHVtbnMsIGNvbHVtbnM9W3N0YXRfbmFtZV0sIGRhdGE9c3RhdC5zY29yZXNfCiAgICAgICAgICAgICkKICAgICAgICAgICAgcGxvdF9zdGF0KGNvbnRleHQsIHN0YXRfbmFtZSwgc3RhdF9kZikKICAgICAgICAgICAgc3RhdHNfZGYgPSBzdGF0c19kZi5qb2luKHN0YXRfZGYpCgogICAgICAgICAgICAjIFNlbGVjdCBLIEJlc3QgZmVhdHVyZXMKICAgICAgICAgICAgc2VsZWN0ZWRfZmVhdHVyZXMgPSBYLmNvbHVtbnNbc3RhdF9mdW5jLmdldF9zdXBwb3J0KCldCiAgICAgICAgICAgIHNlbGVjdGVkX2ZlYXR1cmVzX2FnZ1tzdGF0X25hbWVdID0gc2VsZWN0ZWRfZmVhdHVyZXMKCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYiQ291bGRuJ3QgY2FsY3VsYXRlIHtzdGF0X25hbWV9IGJlY2F1c2Ugb2Y6IHtlfSIpCgogICAgIyBDcmVhdGUgbW9kZWxzIGZyb20gY2xhc3MgbmFtZSAvIGpzb24gZmlsZSAvIGpzb24gcGFyYW1zCiAgICBhbGxfc2tsZWFybl9lc3RpbWF0b3JzID0gZGljdChhbGxfZXN0aW1hdG9ycygpKSBpZiBsZW4obW9kZWxfZmlsdGVycykgPiAwIGVsc2Uge30KICAgIHNlbGVjdGVkX21vZGVscyA9IHt9CiAgICBmb3IgbW9kZWxfbmFtZSwgbW9kZWwgaW4gbW9kZWxfZmlsdGVycy5pdGVtcygpOgogICAgICAgIGlmICIuanNvbiIgaW4gbW9kZWw6CiAgICAgICAgICAgIGN1cnJlbnRfbW9kZWwgPSBqc29uLmxvYWQob3Blbihtb2RlbCwgInIiKSkKICAgICAgICAgICAgY2xhc3NpZmllcl9jbGFzcyA9IGNyZWF0ZV9jbGFzcyhjdXJyZW50X21vZGVsWyJNRVRBIl1bImNsYXNzIl0pCiAgICAgICAgICAgIHNlbGVjdGVkX21vZGVsc1ttb2RlbF9uYW1lXSA9IGNsYXNzaWZpZXJfY2xhc3MoKipjdXJyZW50X21vZGVsWyJDTEFTUyJdKQogICAgICAgIGVsaWYgbW9kZWwgaW4gYWxsX3NrbGVhcm5fZXN0aW1hdG9yczoKICAgICAgICAgICAgc2VsZWN0ZWRfbW9kZWxzW21vZGVsX25hbWVdID0gYWxsX3NrbGVhcm5fZXN0aW1hdG9yc1ttb2RlbF9uYW1lXSgpCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGN1cnJlbnRfbW9kZWwgPSBqc29uLmxvYWRzKG1vZGVsKQogICAgICAgICAgICAgICAgY2xhc3NpZmllcl9jbGFzcyA9IGNyZWF0ZV9jbGFzcyhjdXJyZW50X21vZGVsWyJNRVRBIl1bImNsYXNzIl0pCiAgICAgICAgICAgICAgICBzZWxlY3RlZF9tb2RlbHNbbW9kZWxfbmFtZV0gPSBjbGFzc2lmaWVyX2NsYXNzKCoqY3VycmVudF9tb2RlbFsiQ0xBU1MiXSkKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICAgICAgY29udGV4dC5sb2dnZXIuaW5mbyhmInVuYWJsZSB0byBsb2FkIHttb2RlbH0gYmVjYXVzZSBvZjoge2V9IikKCiAgICAjIFJ1biBtb2RlbCBmaWx0ZXJzCiAgICBtb2RlbHNfZGYgPSBwZC5EYXRhRnJhbWUoaW5kZXg9WC5jb2x1bW5zKQogICAgZm9yIG1vZGVsX25hbWUsIG1vZGVsIGluIHNlbGVjdGVkX21vZGVscy5pdGVtcygpOgoKICAgICAgICBpZiBtb2RlbF9uYW1lID09ICJMb2dpc3RpY1JlZ3Jlc3Npb24iOgogICAgICAgICAgICBtb2RlbC5zZXRfcGFyYW1zKHNvbHZlcj0ibGlibGluZWFyIikKCiAgICAgICAgIyBUcmFpbiBtb2RlbCBhbmQgZ2V0IGZlYXR1cmUgaW1wb3J0YW5jZQogICAgICAgIHNlbGVjdF9mcm9tX21vZGVsID0gU2VsZWN0RnJvbU1vZGVsKG1vZGVsKS5maXQoWCwgeSkKICAgICAgICBmZWF0dXJlX2lkeCA9IHNlbGVjdF9mcm9tX21vZGVsLmdldF9zdXBwb3J0KCkKICAgICAgICBmZWF0dXJlX25hbWVzID0gWC5jb2x1bW5zW2ZlYXR1cmVfaWR4XQogICAgICAgIHNlbGVjdGVkX2ZlYXR1cmVzX2FnZ1ttb2RlbF9uYW1lXSA9IGZlYXR1cmVfbmFtZXMudG9saXN0KCkKCiAgICAgICAgIyBDb2xsZWN0IG1vZGVsIGZlYXR1cmUgaW1wb3J0YW5jZQogICAgICAgIGlmIGhhc2F0dHIoc2VsZWN0X2Zyb21fbW9kZWwuZXN0aW1hdG9yXywgImNvZWZfIik6CiAgICAgICAgICAgIHN0YXRfZGYgPSBzZWxlY3RfZnJvbV9tb2RlbC5lc3RpbWF0b3JfLmNvZWZfCiAgICAgICAgZWxpZiBoYXNhdHRyKHNlbGVjdF9mcm9tX21vZGVsLmVzdGltYXRvcl8sICJmZWF0dXJlX2ltcG9ydGFuY2VzXyIpOgogICAgICAgICAgICBzdGF0X2RmID0gc2VsZWN0X2Zyb21fbW9kZWwuZXN0aW1hdG9yXy5mZWF0dXJlX2ltcG9ydGFuY2VzXwoKICAgICAgICBzdGF0X2RmID0gcGQuRGF0YUZyYW1lKGluZGV4PVguY29sdW1ucywgY29sdW1ucz1bbW9kZWxfbmFtZV0sIGRhdGE9c3RhdF9kZlswXSkKICAgICAgICBtb2RlbHNfZGYgPSBtb2RlbHNfZGYuam9pbihzdGF0X2RmKQoKICAgICAgICBwbG90X3N0YXQoY29udGV4dCwgbW9kZWxfbmFtZSwgc3RhdF9kZikKCiAgICAjIENyZWF0ZSBmZWF0dXJlX3Njb3JlcyBERiB3aXRoIHN0YXQgJiBtb2RlbCBmaWx0ZXJzIHNjb3JlcwogICAgcmVzdWx0X21hdHJpeF9kZiA9IHBkLmNvbmNhdChbc3RhdHNfZGYsIG1vZGVsc19kZl0sIGF4aXM9MSwgc29ydD1GYWxzZSkKICAgIGNvbnRleHQubG9nX2RhdGFzZXQoCiAgICAgICAga2V5PSJmZWF0dXJlX3Njb3JlcyIsCiAgICAgICAgZGY9cmVzdWx0X21hdHJpeF9kZiwKICAgICAgICBsb2NhbF9wYXRoPSJmZWF0dXJlX3Njb3Jlcy5wYXJxdWV0IiwKICAgICAgICBmb3JtYXQ9InBhcnF1ZXQiLAogICAgKQogICAgaWYgbWF4X3NjYWxlZF9zY29yZXM6CiAgICAgICAgbm9ybWFsaXplZF9kZiA9IHJlc3VsdF9tYXRyaXhfZGYucmVwbGFjZShbbnAuaW5mLCAtbnAuaW5mXSwgbnAubmFuKS52YWx1ZXMKICAgICAgICBtaW5fbWF4X3NjYWxlciA9IE1pbk1heFNjYWxlcigpCiAgICAgICAgbm9ybWFsaXplZF9kZiA9IG1pbl9tYXhfc2NhbGVyLmZpdF90cmFuc2Zvcm0obm9ybWFsaXplZF9kZikKICAgICAgICBub3JtYWxpemVkX2RmID0gcGQuRGF0YUZyYW1lKAogICAgICAgICAgICBkYXRhPW5vcm1hbGl6ZWRfZGYsCiAgICAgICAgICAgIGNvbHVtbnM9cmVzdWx0X21hdHJpeF9kZi5jb2x1bW5zLAogICAgICAgICAgICBpbmRleD1yZXN1bHRfbWF0cml4X2RmLmluZGV4LAogICAgICAgICkKICAgICAgICBjb250ZXh0LmxvZ19kYXRhc2V0KAogICAgICAgICAgICBrZXk9Im1heF9zY2FsZWRfc2NvcmVzX2ZlYXR1cmVfc2NvcmVzIiwKICAgICAgICAgICAgZGY9bm9ybWFsaXplZF9kZiwKICAgICAgICAgICAgbG9jYWxfcGF0aD0ibWF4X3NjYWxlZF9zY29yZXNfZmVhdHVyZV9zY29yZXMucGFycXVldCIsCiAgICAgICAgICAgIGZvcm1hdD0icGFycXVldCIsCiAgICAgICAgKQoKICAgICMgQ3JlYXRlIGZlYXR1cmUgY291bnQgRGF0YUZyYW1lCiAgICBmb3IgdGVzdF9uYW1lIGluIHNlbGVjdGVkX2ZlYXR1cmVzX2FnZzoKICAgICAgICByZXN1bHRfbWF0cml4X2RmW3Rlc3RfbmFtZV0gPSBbCiAgICAgICAgICAgIDEgaWYgeCBpbiBzZWxlY3RlZF9mZWF0dXJlc19hZ2dbdGVzdF9uYW1lXSBlbHNlIDAgZm9yIHggaW4gWC5jb2x1bW5zCiAgICAgICAgXQogICAgcmVzdWx0X21hdHJpeF9kZi5sb2NbOiwgIm51bV92b3RlcyJdID0gcmVzdWx0X21hdHJpeF9kZi5zdW0oYXhpcz0xKQogICAgY29udGV4dC5sb2dfZGF0YXNldCgKICAgICAgICBrZXk9InNlbGVjdGVkX2ZlYXR1cmVzX2NvdW50IiwKICAgICAgICBkZj1yZXN1bHRfbWF0cml4X2RmLAogICAgICAgIGxvY2FsX3BhdGg9InNlbGVjdGVkX2ZlYXR1cmVzX2NvdW50LnBhcnF1ZXQiLAogICAgICAgIGZvcm1hdD0icGFycXVldCIsCiAgICApCgogICAgIyBIb3cgbWFueSB2b3RlcyBhcmUgbmVlZGVkIGZvciBhIGZlYXR1cmUgdG8gYmUgc2VsZWN0ZWQ/CiAgICBpZiBpc2luc3RhbmNlKG1pbl92b3RlcywgaW50KToKICAgICAgICB2b3Rlc19uZWVkZWQgPSBtaW5fdm90ZXMKICAgIGVsc2U6CiAgICAgICAgbnVtX2ZpbHRlcnMgPSBsZW4oc3RhdF9maWx0ZXJzKSArIGxlbihtb2RlbF9maWx0ZXJzKQogICAgICAgIHZvdGVzX25lZWRlZCA9IGludChucC5mbG9vcihudW1fZmlsdGVycyAqIG1heChtaW4obWluX3ZvdGVzLCAxKSwgMCkpKQogICAgY29udGV4dC5sb2dnZXIuaW5mbyhmInZvdGVzIG5lZWRlZCB0byBiZSBzZWxlY3RlZDoge3ZvdGVzX25lZWRlZH0iKQoKICAgICMgQ3JlYXRlIGZpbmFsIGZlYXR1cmUgZGF0YWZyYW1lCiAgICBzZWxlY3RlZF9mZWF0dXJlcyA9IHJlc3VsdF9tYXRyaXhfZGZbCiAgICAgICAgcmVzdWx0X21hdHJpeF9kZi5udW1fdm90ZXMgPj0gdm90ZXNfbmVlZGVkCiAgICBdLmluZGV4LnRvbGlzdCgpCiAgICBnb29kX2ZlYXR1cmVfZGYgPSBkZi5sb2NbOiwgc2VsZWN0ZWRfZmVhdHVyZXNdCiAgICBmaW5hbF9kZiA9IHBkLmNvbmNhdChbZ29vZF9mZWF0dXJlX2RmLCB5XSwgYXhpcz0xKQogICAgY29udGV4dC5sb2dfZGF0YXNldCgKICAgICAgICBrZXk9InNlbGVjdGVkX2ZlYXR1cmVzIiwKICAgICAgICBkZj1maW5hbF9kZiwKICAgICAgICBsb2NhbF9wYXRoPSJzZWxlY3RlZF9mZWF0dXJlcy5wYXJxdWV0IiwKICAgICAgICBmb3JtYXQ9InBhcnF1ZXQiLAogICAgKQoKICAgICMgQ3JlYXRpbmcgYSBuZXcgZmVhdHVyZSB2ZWN0b3IgY29udGFpbmluZyBvbmx5IHRoZSBpZGVudGlmaWVkIHRvcCBmZWF0dXJlcwogICAgaWYgaXNfZmVhdHVyZV92ZWN0b3IgYW5kIGRmX2FydGlmYWN0Lm1ldGEuc3BlYy5mZWF0dXJlcyBhbmQgb3V0cHV0X3ZlY3Rvcl9uYW1lOgogICAgICAgICMgU2VsZWN0aW5nIHRoZSB0b3AgSyBmZWF0dXJlcyBmcm9tIG91ciB0b3AgZmVhdHVyZSBkYXRhZnJhbWUKICAgICAgICBzZWxlY3RlZF9mZWF0dXJlcyA9IHJlc3VsdF9tYXRyaXhfZGYuaGVhZChrKS5pbmRleAoKICAgICAgICAjIE1hdGNoIHRoZSBzZWxlY3RlZCBmZWF0dXJlIG5hbWVzIHRvIHRoZSBGUyBGZWF0dXJlIGFubm90YXRpb25zCiAgICAgICAgbWF0Y2hlZF9zZWxlY3Rpb25zID0gWwogICAgICAgICAgICBmZWF0dXJlCiAgICAgICAgICAgIGZvciBmZWF0dXJlIGluIGxpc3QoZGZfYXJ0aWZhY3QubWV0YS5zcGVjLmZlYXR1cmVzKQogICAgICAgICAgICBmb3Igc2VsZWN0ZWQgaW4gbGlzdChzZWxlY3RlZF9mZWF0dXJlcykKICAgICAgICAgICAgaWYgZmVhdHVyZS5lbmRzd2l0aChzZWxlY3RlZCkKICAgICAgICBdCgogICAgICAgICMgRGVmaW5pbmcgb3VyIG5ldyBmZWF0dXJlIHZlY3RvcgogICAgICAgIHRvcF9mZWF0dXJlc19mdiA9IGZzLkZlYXR1cmVWZWN0b3IoCiAgICAgICAgICAgIG91dHB1dF92ZWN0b3JfbmFtZSwKICAgICAgICAgICAgbWF0Y2hlZF9zZWxlY3Rpb25zLAogICAgICAgICAgICBsYWJlbF9mZWF0dXJlPSJsYWJlbHMubGFiZWwiLAogICAgICAgICAgICBkZXNjcmlwdGlvbj0iZmVhdHVyZSB2ZWN0b3IgY29tcG9zZWQgc3RyaWN0bHkgb2Ygb3VyIHRvcCBmZWF0dXJlcyIsCiAgICAgICAgKQoKICAgICAgICAjIFNhdmluZwogICAgICAgIHRvcF9mZWF0dXJlc19mdi5zYXZlKCkKICAgICAgICBmcy5nZXRfb2ZmbGluZV9mZWF0dXJlcyh0b3BfZmVhdHVyZXNfZnYsIHRhcmdldD1QYXJxdWV0VGFyZ2V0KCkpCgogICAgICAgICMgTG9nZ2luZyBvdXIgbmV3IGZlYXR1cmUgdmVjdG9yIFVSSQogICAgICAgIGNvbnRleHQubG9nX3Jlc3VsdCgidG9wX2ZlYXR1cmVzX3ZlY3RvciIsIHRvcF9mZWF0dXJlc19mdi51cmkpCg== code_origin: '' default_handler: feature_selection - description: Select features through multiple Statistical and Model filters image: mlrun/mlrun -metadata: - categories: - - data-preparation - - machine-learning - tag: '' - name: feature-selection + description: Select features through multiple Statistical and Model filters +verbose: false diff --git a/feature_selection/item.yaml b/feature_selection/item.yaml index 1c79e6f12..c7400a7f0 100644 --- a/feature_selection/item.yaml +++ b/feature_selection/item.yaml @@ -22,4 +22,4 @@ spec: kind: job requirements: [] url: '' -version: 1.5.0 +version: 1.7.0 From d1d61a0f1765749cdd5ee0d4225aea1c60093f88 Mon Sep 17 00:00:00 2001 From: Avi Asulin Date: Mon, 2 Sep 2024 16:09:01 +0300 Subject: [PATCH 15/38] Revert "[onnx utils] update onnx utils packages" This reverts commit 88727986ffa91662593958023be8ac3ccef2cab0. --- onnx_utils/function.yaml | 42 ++++++++++++++++++----------------- onnx_utils/item.yaml | 16 ++++++------- onnx_utils/requirements.txt | 12 +++++----- onnx_utils/test_onnx_utils.py | 4 ++-- 4 files changed, 38 insertions(+), 36 deletions(-) diff --git a/onnx_utils/function.yaml b/onnx_utils/function.yaml index 88f810fb4..7a0054c4d 100644 --- a/onnx_utils/function.yaml +++ b/onnx_utils/function.yaml @@ -2,7 +2,7 @@ kind: job metadata: name: onnx-utils tag: '' - hash: fd6cd909ef6e055c348b44a0313e190513cd755b + hash: 0c4a6491b976d5220d3ebfb83a3905dd47e86be2 project: '' labels: author: guyl @@ -16,16 +16,16 @@ spec: functionSourceCode: IyBDb3B5cmlnaHQgMjAxOSBJZ3VhemlvCiMKIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiMKZnJvbSB0eXBpbmcgaW1wb3J0IEFueSwgQ2FsbGFibGUsIERpY3QsIExpc3QsIFR1cGxlCgppbXBvcnQgbWxydW4KCgpjbGFzcyBfVG9PTk5YQ29udmVyc2lvbnM6CiAgICAiIiIKICAgIEFuIE9OTlggY29udmVyc2lvbiBmdW5jdGlvbnMgbGlicmFyeSBjbGFzcy4KICAgICIiIgoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiB0Zl9rZXJhc190b19vbm54KAogICAgICAgIG1vZGVsX2hhbmRsZXIsCiAgICAgICAgb25ueF9tb2RlbF9uYW1lOiBzdHIgPSBOb25lLAogICAgICAgIG9wdGltaXplX21vZGVsOiBib29sID0gVHJ1ZSwKICAgICAgICBpbnB1dF9zaWduYXR1cmU6IExpc3RbVHVwbGVbVHVwbGVbaW50XSwgc3RyXV0gPSBOb25lLAogICAgKToKICAgICAgICAiIiIKICAgICAgICBDb252ZXJ0IGEgVEYuS2VyYXMgbW9kZWwgdG8gYW4gT05OWCBtb2RlbCBhbmQgbG9nIGl0IGJhY2sgdG8gTUxSdW4gYXMgYSBuZXcgbW9kZWwgb2JqZWN0LgoKICAgICAgICA6cGFyYW0gbW9kZWxfaGFuZGxlcjogICBBbiBpbml0aWFsaXplZCBURktlcmFzTW9kZWxIYW5kbGVyIHdpdGggYSBsb2FkZWQgbW9kZWwgdG8gY29udmVydCB0byBPTk5YLgogICAgICAgIDpwYXJhbSBvbm54X21vZGVsX25hbWU6IFRoZSBuYW1lIHRvIHVzZSB0byBsb2cgdGhlIGNvbnZlcnRlZCBPTk5YIG1vZGVsLiBJZiBub3QgZ2l2ZW4sIHRoZSBnaXZlbiBgbW9kZWxfbmFtZWAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHVzZWQgd2l0aCBhbiBhZGRpdGlvbmFsIHN1ZmZpeCBgX29ubnhgLiBEZWZhdWx0ZWQgdG8gTm9uZS4KICAgICAgICA6cGFyYW0gb3B0aW1pemVfbW9kZWw6ICBXaGV0aGVyIG9yIG5vdCB0byBvcHRpbWl6ZSB0aGUgT05OWCBtb2RlbCB1c2luZyAnb25ueG9wdGltaXplcicgYmVmb3JlIHNhdmluZyB0aGUgbW9kZWwuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdGVkIHRvIFRydWUuCiAgICAgICAgOnBhcmFtIGlucHV0X3NpZ25hdHVyZTogQSBsaXN0IG9mIHRoZSBpbnB1dCBsYXllcnMgc2hhcGUgYW5kIGRhdGEgdHlwZSBwcm9wZXJ0aWVzLiBFeHBlY3RlZCB0byByZWNlaXZlIGEgbGlzdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIGVhY2ggZWxlbWVudCBpcyBhbiBpbnB1dCBsYXllciB0dXBsZS4gQW4gaW5wdXQgbGF5ZXIgdHVwbGUgaXMgYSB0dXBsZSBvZjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMF0gPSBMYXllcidzIHNoYXBlLCBhIHR1cGxlIG9mIGludGVnZXJzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxXSA9IExheWVyJ3MgZGF0YSB0eXBlLCBhIG1scnVuLmRhdGFfdHlwZXMuVmFsdWVUeXBlIHN0cmluZy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBOb25lLCB0aGUgaW5wdXQgc2lnbmF0dXJlIHdpbGwgYmUgdHJpZWQgdG8gYmUgcmVhZCBmcm9tIHRoZSBtb2RlbCBhcnRpZmFjdC4gRGVmYXVsdGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gTm9uZS4KICAgICAgICAiIiIKICAgICAgICAjIEltcG9ydCB0aGUgZnJhbWV3b3JrIGFuZCBoYW5kbGVyOgogICAgICAgIGltcG9ydCB0ZW5zb3JmbG93IGFzIHRmCiAgICAgICAgZnJvbSBtbHJ1bi5mcmFtZXdvcmtzLnRmX2tlcmFzIGltcG9ydCBURktlcmFzVXRpbHMKCiAgICAgICAgIyBDaGVjayB0aGUgZ2l2ZW4gJ2lucHV0X3NpZ25hdHVyZScgcGFyYW1ldGVyOgogICAgICAgIGlmIGlucHV0X3NpZ25hdHVyZSBpcyBOb25lOgogICAgICAgICAgICAjIFJlYWQgdGhlIGlucHV0cyBmcm9tIHRoZSBtb2RlbDoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgbW9kZWxfaGFuZGxlci5yZWFkX2lucHV0c19mcm9tX21vZGVsKCkKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlcnJvcjoKICAgICAgICAgICAgICAgIHJhaXNlIG1scnVuLmVycm9ycy5NTFJ1blJ1bnRpbWVFcnJvcigKICAgICAgICAgICAgICAgICAgICBmIlBsZWFzZSBwcm92aWRlIHRoZSAnaW5wdXRfc2lnbmF0dXJlJyBwYXJhbWV0ZXIuIFRoZSBmdW5jdGlvbiB0cmllZCByZWFkaW5nIHRoZSBpbnB1dCBsYXllcnMgIgogICAgICAgICAgICAgICAgICAgIGYiaW5mb3JtYXRpb24gYXV0b21hdGljYWxseSBidXQgZmFpbGVkIHdpdGggdGhlIGZvbGxvd2luZyBlcnJvcjoge2Vycm9yfSIKICAgICAgICAgICAgICAgICkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIFBhcnNlIHRoZSAnaW5wdXRfc2lnbmF0dXJlJyBwYXJhbWV0ZXI6CiAgICAgICAgICAgIGlucHV0X3NpZ25hdHVyZSA9IFsKICAgICAgICAgICAgICAgIHRmLlRlbnNvclNwZWMoCiAgICAgICAgICAgICAgICAgICAgc2hhcGU9c2hhcGUsCiAgICAgICAgICAgICAgICAgICAgZHR5cGU9VEZLZXJhc1V0aWxzLmNvbnZlcnRfdmFsdWVfdHlwZV90b190Zl9kdHlwZSgKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZT12YWx1ZV90eXBlCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGZvciAoc2hhcGUsIHZhbHVlX3R5cGUpIGluIGlucHV0X3NpZ25hdHVyZQogICAgICAgICAgICBdCgogICAgICAgICMgQ29udmVydCB0byBPTk5YOgogICAgICAgIG1vZGVsX2hhbmRsZXIudG9fb25ueCgKICAgICAgICAgICAgbW9kZWxfbmFtZT1vbm54X21vZGVsX25hbWUsCiAgICAgICAgICAgIGlucHV0X3NpZ25hdHVyZT1pbnB1dF9zaWduYXR1cmUsCiAgICAgICAgICAgIG9wdGltaXplPW9wdGltaXplX21vZGVsLAogICAgICAgICkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgcHl0b3JjaF90b19vbm54KAogICAgICAgIG1vZGVsX2hhbmRsZXIsCiAgICAgICAgb25ueF9tb2RlbF9uYW1lOiBzdHIgPSBOb25lLAogICAgICAgIG9wdGltaXplX21vZGVsOiBib29sID0gVHJ1ZSwKICAgICAgICBpbnB1dF9zaWduYXR1cmU6IExpc3RbVHVwbGVbVHVwbGVbaW50LCAuLi5dLCBzdHJdXSA9IE5vbmUsCiAgICAgICAgaW5wdXRfbGF5ZXJzX25hbWVzOiBMaXN0W3N0cl0gPSBOb25lLAogICAgICAgIG91dHB1dF9sYXllcnNfbmFtZXM6IExpc3Rbc3RyXSA9IE5vbmUsCiAgICAgICAgZHluYW1pY19heGVzOiBEaWN0W3N0ciwgRGljdFtpbnQsIHN0cl1dID0gTm9uZSwKICAgICAgICBpc19iYXRjaGVkOiBib29sID0gVHJ1ZSwKICAgICk6CiAgICAgICAgIiIiCiAgICAgICAgQ29udmVydCBhIFB5VG9yY2ggbW9kZWwgdG8gYW4gT05OWCBtb2RlbCBhbmQgbG9nIGl0IGJhY2sgdG8gTUxSdW4gYXMgYSBuZXcgbW9kZWwgb2JqZWN0LgoKICAgICAgICA6cGFyYW0gbW9kZWxfaGFuZGxlcjogICAgICAgQW4gaW5pdGlhbGl6ZWQgUHlUb3JjaE1vZGVsSGFuZGxlciB3aXRoIGEgbG9hZGVkIG1vZGVsIHRvIGNvbnZlcnQgdG8gT05OWC4KICAgICAgICA6cGFyYW0gb25ueF9tb2RlbF9uYW1lOiAgICAgVGhlIG5hbWUgdG8gdXNlIHRvIGxvZyB0aGUgY29udmVydGVkIE9OTlggbW9kZWwuIElmIG5vdCBnaXZlbiwgdGhlIGdpdmVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBtb2RlbF9uYW1lYCB3aWxsIGJlIHVzZWQgd2l0aCBhbiBhZGRpdGlvbmFsIHN1ZmZpeCBgX29ubnhgLiBEZWZhdWx0ZWQgdG8gTm9uZS4KICAgICAgICA6cGFyYW0gb3B0aW1pemVfbW9kZWw6ICAgICAgV2hldGhlciBvciBub3QgdG8gb3B0aW1pemUgdGhlIE9OTlggbW9kZWwgdXNpbmcgJ29ubnhvcHRpbWl6ZXInIGJlZm9yZSBzYXZpbmcgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLiBEZWZhdWx0ZWQgdG8gVHJ1ZS4KICAgICAgICA6cGFyYW0gaW5wdXRfc2lnbmF0dXJlOiAgICAgQSBsaXN0IG9mIHRoZSBpbnB1dCBsYXllcnMgc2hhcGUgYW5kIGRhdGEgdHlwZSBwcm9wZXJ0aWVzLiBFeHBlY3RlZCB0byByZWNlaXZlIGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCB3aGVyZSBlYWNoIGVsZW1lbnQgaXMgYW4gaW5wdXQgbGF5ZXIgdHVwbGUuIEFuIGlucHV0IGxheWVyIHR1cGxlIGlzIGEgdHVwbGUgb2Y6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswXSA9IExheWVyJ3Mgc2hhcGUsIGEgdHVwbGUgb2YgaW50ZWdlcnMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxXSA9IExheWVyJ3MgZGF0YSB0eXBlLCBhIG1scnVuLmRhdGFfdHlwZXMuVmFsdWVUeXBlIHN0cmluZy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgTm9uZSwgdGhlIGlucHV0IHNpZ25hdHVyZSB3aWxsIGJlIHRyaWVkIHRvIGJlIHJlYWQgZnJvbSB0aGUgbW9kZWwgYXJ0aWZhY3QuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRlZCB0byBOb25lLgogICAgICAgIDpwYXJhbSBpbnB1dF9sYXllcnNfbmFtZXM6ICBMaXN0IG9mIG5hbWVzIHRvIGFzc2lnbiB0byB0aGUgaW5wdXQgbm9kZXMgb2YgdGhlIGdyYXBoIGluIG9yZGVyLiBBbGwgb2YgdGhlIG90aGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgKGlubmVyIGxheWVycykgY2FuIGJlIHNldCBhcyB3ZWxsIGJ5IHBhc3NpbmcgYWRkaXRpb25hbCBuYW1lcyBpbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC4gVGhlIG9yZGVyIGlzIGJ5IHRoZSBvcmRlciBvZiB0aGUgcGFyYW1ldGVycyBpbiB0aGUgbW9kZWwuIElmIE5vbmUsIHRoZSBpbnB1dHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSByZWFkIGZyb20gdGhlIGhhbmRsZXIncyBpbnB1dHMuIElmIGl0cyBhbHNvIE5vbmUsIGl0IGlzIGRlZmF1bHRlZCB0bzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlucHV0XzAiLCAiaW5wdXRfMSIsIC4uLgogICAgICAgIDpwYXJhbSBvdXRwdXRfbGF5ZXJzX25hbWVzOiBMaXN0IG9mIG5hbWVzIHRvIGFzc2lnbiB0byB0aGUgb3V0cHV0IG5vZGVzIG9mIHRoZSBncmFwaCBpbiBvcmRlci4gSWYgTm9uZSwgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dHMgd2lsbCBiZSByZWFkIGZyb20gdGhlIGhhbmRsZXIncyBvdXRwdXRzLiBJZiBpdHMgYWxzbyBOb25lLCBpdCBpcyBkZWZhdWx0ZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG86ICJvdXRwdXRfMCIgKGZvciBtdWx0aXBsZSBvdXRwdXRzLCB0aGlzIHBhcmFtZXRlciBtdXN0IGJlIHByb3ZpZGVkKS4KICAgICAgICA6cGFyYW0gZHluYW1pY19heGVzOiAgICAgICAgSWYgcGFydCBvZiB0aGUgaW5wdXQgLyBvdXRwdXQgc2hhcGUgaXMgZHluYW1pYywgbGlrZSAoYmF0Y2hfc2l6ZSwgMywgMzIsIDMyKSB5b3UgY2FuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZnkgaXQgYnkgZ2l2aW5nIGEgZHluYW1pYyBheGlzIHRvIHRoZSBpbnB1dCAvIG91dHB1dCBsYXllciBieSBpdHMgbmFtZSBhcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5wdXQgbGF5ZXIgbmFtZSI6IHswOiAiYmF0Y2hfc2l6ZSJ9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dHB1dCBsYXllciBuYW1lIjogezA6ICJiYXRjaF9zaXplIn0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgcHJvdmlkZWQsIHRoZSAnaXNfYmF0Y2hlZCcgZmxhZyB3aWxsIGJlIGlnbm9yZWQuIERlZmF1bHRlZCB0byBOb25lLgogICAgICAgIDpwYXJhbSBpc19iYXRjaGVkOiAgICAgICAgICBXaGV0aGVyIHRvIGluY2x1ZGUgYSBiYXRjaCBzaXplIGFzIHRoZSBmaXJzdCBheGlzIGluIGV2ZXJ5IGlucHV0IGFuZCBvdXRwdXQgbGF5ZXIuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRlZCB0byBUcnVlLiBXaWxsIGJlIGlnbm9yZWQgaWYgJ2R5bmFtaWNfYXhlcycgaXMgcHJvdmlkZWQuCiAgICAgICAgIiIiCiAgICAgICAgIyBJbXBvcnQgdGhlIGZyYW1ld29yayBhbmQgaGFuZGxlcjoKICAgICAgICBpbXBvcnQgdG9yY2gKICAgICAgICBmcm9tIG1scnVuLmZyYW1ld29ya3MucHl0b3JjaCBpbXBvcnQgUHlUb3JjaFV0aWxzCgogICAgICAgICMgUGFyc2UgdGhlICdpbnB1dF9zaWduYXR1cmUnIHBhcmFtZXRlcjoKICAgICAgICBpZiBpbnB1dF9zaWduYXR1cmUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlucHV0X3NpZ25hdHVyZSA9IHR1cGxlKAogICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgIHRvcmNoLnplcm9zKAogICAgICAgICAgICAgICAgICAgICAgICBzaXplPXNoYXBlLAogICAgICAgICAgICAgICAgICAgICAgICBkdHlwZT1QeVRvcmNoVXRpbHMuY29udmVydF92YWx1ZV90eXBlX3RvX3RvcmNoX2R0eXBlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZT12YWx1ZV90eXBlCiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIGZvciAoc2hhcGUsIHZhbHVlX3R5cGUpIGluIGlucHV0X3NpZ25hdHVyZQogICAgICAgICAgICAgICAgXQogICAgICAgICAgICApCgogICAgICAgICMgQ29udmVydCB0byBPTk5YOgogICAgICAgIG1vZGVsX2hhbmRsZXIudG9fb25ueCgKICAgICAgICAgICAgbW9kZWxfbmFtZT1vbm54X21vZGVsX25hbWUsCiAgICAgICAgICAgIGlucHV0X3NhbXBsZT1pbnB1dF9zaWduYXR1cmUsCiAgICAgICAgICAgIG9wdGltaXplPW9wdGltaXplX21vZGVsLAogICAgICAgICAgICBpbnB1dF9sYXllcnNfbmFtZXM9aW5wdXRfbGF5ZXJzX25hbWVzLAogICAgICAgICAgICBvdXRwdXRfbGF5ZXJzX25hbWVzPW91dHB1dF9sYXllcnNfbmFtZXMsCiAgICAgICAgICAgIGR5bmFtaWNfYXhlcz1keW5hbWljX2F4ZXMsCiAgICAgICAgICAgIGlzX2JhdGNoZWQ9aXNfYmF0Y2hlZAogICAgICAgICkKCgojIE1hcCBmb3IgZ2V0dGluZyB0aGUgY29udmVyc2lvbiBmdW5jdGlvbiBhY2NvcmRpbmcgdG8gdGhlIHByb3ZpZGVkIGZyYW1ld29yazoKX0NPTlZFUlNJT05fTUFQID0gewogICAgInRlbnNvcmZsb3cua2VyYXMiOiBfVG9PTk5YQ29udmVyc2lvbnMudGZfa2VyYXNfdG9fb25ueCwKICAgICJ0b3JjaCI6IF9Ub09OTlhDb252ZXJzaW9ucy5weXRvcmNoX3RvX29ubngsCn0gICMgdHlwZTogRGljdFtzdHIsIENhbGxhYmxlXQoKCmRlZiB0b19vbm54KAogICAgY29udGV4dDogbWxydW4uTUxDbGllbnRDdHgsCiAgICBtb2RlbF9wYXRoOiBzdHIsCiAgICBvbm54X21vZGVsX25hbWU6IHN0ciA9IE5vbmUsCiAgICBvcHRpbWl6ZV9tb2RlbDogYm9vbCA9IFRydWUsCiAgICBmcmFtZXdvcmtfa3dhcmdzOiBEaWN0W3N0ciwgQW55XSA9IE5vbmUsCik6CiAgICAiIiIKICAgIENvbnZlcnQgdGhlIGdpdmVuIG1vZGVsIHRvIGFuIE9OTlggbW9kZWwuCgogICAgOnBhcmFtIGNvbnRleHQ6ICAgICAgICAgIFRoZSBNTFJ1biBmdW5jdGlvbiBleGVjdXRpb24gY29udGV4dAogICAgOnBhcmFtIG1vZGVsX3BhdGg6ICAgICAgIFRoZSBtb2RlbCBwYXRoIHN0b3JlIG9iamVjdC4KICAgIDpwYXJhbSBvbm54X21vZGVsX25hbWU6ICBUaGUgbmFtZSB0byB1c2UgdG8gbG9nIHRoZSBjb252ZXJ0ZWQgT05OWCBtb2RlbC4gSWYgbm90IGdpdmVuLCB0aGUgZ2l2ZW4gYG1vZGVsX25hbWVgIHdpbGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSB1c2VkIHdpdGggYW4gYWRkaXRpb25hbCBzdWZmaXggYF9vbm54YC4gRGVmYXVsdGVkIHRvIE5vbmUuCiAgICA6cGFyYW0gb3B0aW1pemVfbW9kZWw6ICAgV2hldGhlciB0byBvcHRpbWl6ZSB0aGUgT05OWCBtb2RlbCB1c2luZyAnb25ueG9wdGltaXplcicgYmVmb3JlIHNhdmluZyB0aGUgbW9kZWwuIERlZmF1bHRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFRydWUuCiAgICA6cGFyYW0gZnJhbWV3b3JrX2t3YXJnczogQWRkaXRpb25hbCBhcmd1bWVudHMgZWFjaCBmcmFtZXdvcmsgbWF5IHJlcXVpcmUgaW4gb3JkZXIgdG8gY29udmVydCB0byBPTk5YLiBUbyBnZXQgdGhlIGRvYwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBvZiB0aGUgZGVzaXJlZCBmcmFtZXdvcmsgb25ueCBjb252ZXJzaW9uIGZ1bmN0aW9uLCBwYXNzICJoZWxwIi4KICAgICIiIgogICAgZnJvbSBtbHJ1bi5mcmFtZXdvcmtzLmF1dG9fbWxydW4uYXV0b19tbHJ1biBpbXBvcnQgQXV0b01MUnVuCgogICAgIyBHZXQgYSBtb2RlbCBoYW5kbGVyIG9mIHRoZSByZXF1aXJlZCBmcmFtZXdvcms6CiAgICBtb2RlbF9oYW5kbGVyID0gQXV0b01MUnVuLmxvYWRfbW9kZWwobW9kZWxfcGF0aD1tb2RlbF9wYXRoLCBjb250ZXh0PWNvbnRleHQpCgogICAgIyBHZXQgdGhlIG1vZGVsJ3MgZnJhbWV3b3JrOgogICAgZnJhbWV3b3JrID0gbW9kZWxfaGFuZGxlci5GUkFNRVdPUktfTkFNRQoKICAgICMgVXNlIHRoZSBjb252ZXJzaW9uIG1hcCB0byBnZXQgdGhlIHNwZWNpZmljIGZyYW1ld29yayB0byBvbm54IGNvbnZlcnNpb246CiAgICBpZiBmcmFtZXdvcmsgbm90IGluIF9DT05WRVJTSU9OX01BUDoKICAgICAgICByYWlzZSBtbHJ1bi5lcnJvcnMuTUxSdW5JbnZhbGlkQXJndW1lbnRFcnJvcigKICAgICAgICAgICAgZiJUaGUgZm9sbG93aW5nIGZyYW1ld29yazogJ3tmcmFtZXdvcmt9JywgaGFzIG5vIE9OTlggY29udmVyc2lvbi4iCiAgICAgICAgKQogICAgY29udmVyc2lvbl9mdW5jdGlvbiA9IF9DT05WRVJTSU9OX01BUFtmcmFtZXdvcmtdCgogICAgIyBDaGVjayBpZiBuZWVkZWQgdG8gcHJpbnQgdGhlIGZ1bmN0aW9uJ3MgZG9jIHN0cmluZyAoImhlbHAiIGlzIHBhc3NlZCk6CiAgICBpZiBmcmFtZXdvcmtfa3dhcmdzID09ICJoZWxwIjoKICAgICAgICBwcmludChjb252ZXJzaW9uX2Z1bmN0aW9uLl9fZG9jX18pCiAgICAgICAgcmV0dXJuCgogICAgIyBTZXQgdGhlIGRlZmF1bHQgZW1wdHkgZnJhbWV3b3JrIGt3YXJncyBpZiBuZWVkZWQ6CiAgICBpZiBmcmFtZXdvcmtfa3dhcmdzIGlzIE5vbmU6CiAgICAgICAgZnJhbWV3b3JrX2t3YXJncyA9IHt9CgogICAgIyBSdW4gdGhlIGNvbnZlcnNpb246CiAgICB0cnk6CiAgICAgICAgY29udmVyc2lvbl9mdW5jdGlvbigKICAgICAgICAgICAgbW9kZWxfaGFuZGxlcj1tb2RlbF9oYW5kbGVyLAogICAgICAgICAgICBvbm54X21vZGVsX25hbWU9b25ueF9tb2RlbF9uYW1lLAogICAgICAgICAgICBvcHRpbWl6ZV9tb2RlbD1vcHRpbWl6ZV9tb2RlbCwKICAgICAgICAgICAgKipmcmFtZXdvcmtfa3dhcmdzLAogICAgICAgICkKICAgIGV4Y2VwdCBUeXBlRXJyb3IgYXMgZXhjZXB0aW9uOgogICAgICAgIHJhaXNlIG1scnVuLmVycm9ycy5NTFJ1bkludmFsaWRBcmd1bWVudEVycm9yKAogICAgICAgICAgICBmIkVSUk9SOiBBIFR5cGVFcnJvciBleGNlcHRpb24gd2FzIHJhaXNlZCBkdXJpbmcgdGhlIGNvbnZlcnNpb246XG57ZXhjZXB0aW9ufS4gIgogICAgICAgICAgICBmIlBsZWFzZSByZWFkIHRoZSB7ZnJhbWV3b3JrfSBmcmFtZXdvcmsgY29udmVyc2lvbiBmdW5jdGlvbiBkb2Mgc3RyaW5nIGJ5IHBhc3NpbmcgJ2hlbHAnIGluIHRoZSAiCiAgICAgICAgICAgIGYiJ2ZyYW1ld29ya19rd2FyZ3MnIGRpY3Rpb25hcnkgcGFyYW1ldGVyLiIKICAgICAgICApCgoKZGVmIG9wdGltaXplKAogICAgY29udGV4dDogbWxydW4uTUxDbGllbnRDdHgsCiAgICBtb2RlbF9wYXRoOiBzdHIsCiAgICBvcHRpbWl6YXRpb25zOiBMaXN0W3N0cl0gPSBOb25lLAogICAgZml4ZWRfcG9pbnQ6IGJvb2wgPSBGYWxzZSwKICAgIG9wdGltaXplZF9tb2RlbF9uYW1lOiBzdHIgPSBOb25lLAopOgogICAgIiIiCiAgICBPcHRpbWl6ZSB0aGUgZ2l2ZW4gT05OWCBtb2RlbC4KCiAgICA6cGFyYW0gY29udGV4dDogICAgICAgICAgICAgIFRoZSBNTFJ1biBmdW5jdGlvbiBleGVjdXRpb24gY29udGV4dC4KICAgIDpwYXJhbSBtb2RlbF9wYXRoOiAgICAgICAgICAgUGF0aCB0byB0aGUgT05OWCBtb2RlbCBvYmplY3QuCiAgICA6cGFyYW0gb3B0aW1pemF0aW9uczogICAgICAgIExpc3Qgb2YgcG9zc2libGUgb3B0aW1pemF0aW9ucy4gVG8gc2VlIHdoYXQgb3B0aW1pemF0aW9ucyBhcmUgYXZhaWxhYmxlLCBwYXNzICJoZWxwIi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgTm9uZSwgYWxsIG9mIHRoZSBvcHRpbWl6YXRpb25zIHdpbGwgYmUgdXNlZC4gRGVmYXVsdGVkIHRvIE5vbmUuCiAgICA6cGFyYW0gZml4ZWRfcG9pbnQ6ICAgICAgICAgIE9wdGltaXplIHRoZSB3ZWlnaHRzIHVzaW5nIGZpeGVkIHBvaW50LiBEZWZhdWx0ZWQgdG8gRmFsc2UuCiAgICA6cGFyYW0gb3B0aW1pemVkX21vZGVsX25hbWU6IFRoZSBuYW1lIG9mIHRoZSBvcHRpbWl6ZWQgbW9kZWwuIElmIE5vbmUsIHRoZSBvcmlnaW5hbCBtb2RlbCB3aWxsIGJlIG92ZXJyaWRkZW4uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRlZCB0byBOb25lLgogICAgIiIiCiAgICAjIEltcG9ydCB0aGUgbW9kZWwgaGFuZGxlcjoKICAgIGltcG9ydCBvbm54b3B0aW1pemVyCiAgICBmcm9tIG1scnVuLmZyYW1ld29ya3Mub25ueCBpbXBvcnQgT05OWE1vZGVsSGFuZGxlcgoKICAgICMgQ2hlY2sgaWYgbmVlZGVkIHRvIHByaW50IHRoZSBhdmFpbGFibGUgb3B0aW1pemF0aW9ucyAoImhlbHAiIGlzIHBhc3NlZCk6CiAgICBpZiBvcHRpbWl6YXRpb25zID09ICJoZWxwIjoKICAgICAgICBhdmFpbGFibGVfcGFzc2VzID0gIlxuKiAiLmpvaW4ob25ueG9wdGltaXplci5nZXRfYXZhaWxhYmxlX3Bhc3NlcygpKQogICAgICAgIHByaW50KGYiVGhlIGF2YWlsYWJsZSBvcHRpbWl6YXRpb25zIGFyZTpcbioge2F2YWlsYWJsZV9wYXNzZXN9IikKICAgICAgICByZXR1cm4KCiAgICAjIENyZWF0ZSB0aGUgbW9kZWwgaGFuZGxlcjoKICAgIG1vZGVsX2hhbmRsZXIgPSBPTk5YTW9kZWxIYW5kbGVyKAogICAgICAgIG1vZGVsX3BhdGg9bW9kZWxfcGF0aCwgY29udGV4dD1jb250ZXh0CiAgICApCgogICAgIyBMb2FkIHRoZSBPTk5YIG1vZGVsOgogICAgbW9kZWxfaGFuZGxlci5sb2FkKCkKCiAgICAjIE9wdGltaXplIHRoZSBtb2RlbCB1c2luZyB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbnM6CiAgICBtb2RlbF9oYW5kbGVyLm9wdGltaXplKG9wdGltaXphdGlvbnM9b3B0aW1pemF0aW9ucywgZml4ZWRfcG9pbnQ9Zml4ZWRfcG9pbnQpCgogICAgIyBSZW5hbWUgaWYgbmVlZGVkOgogICAgaWYgb3B0aW1pemVkX21vZGVsX25hbWUgaXMgbm90IE5vbmU6CiAgICAgICAgbW9kZWxfaGFuZGxlci5zZXRfbW9kZWxfbmFtZShtb2RlbF9uYW1lPW9wdGltaXplZF9tb2RlbF9uYW1lKQoKICAgICMgTG9nIHRoZSBvcHRpbWl6ZWQgbW9kZWw6CiAgICBtb2RlbF9oYW5kbGVyLmxvZygpCg== base_image: mlrun/mlrun commands: [] - code_origin: '' - origin_filename: '' + code_origin: https://github.com/yonishelach/functions.git#f84b9565a33d8159315992ebba5838d41f6cc112:/Users/Yonatan_Shelach/projects/functions/onnx_utils/onnx_utils.py + origin_filename: /Users/Yonatan_Shelach/projects/functions/onnx_utils/onnx_utils.py with_mlrun: false auto_build: true requirements: - - onnx~=1.15.0 - - onnxruntime~=1.8.1 - - onnxoptimizer~=0.2.0 - - onnxmltools~=1.9.0 - - tf2onnx~=1.16.0 + - onnx~=1.13.0 + - onnxruntime~=1.14.0 + - onnxoptimizer~=0.3.0 + - onnxmltools~=1.11.0 + - tf2onnx~=1.13.0 entry_points: tf_keras_to_onnx: name: tf_keras_to_onnx @@ -35,6 +35,7 @@ spec: - name: model_handler doc: An initialized TFKerasModelHandler with a loaded model to convert to ONNX. + default: '' - name: onnx_model_name type: str doc: The name to use to log the converted ONNX model. If not given, the given @@ -54,10 +55,9 @@ spec: data type, a mlrun.data_types.ValueType string. If None, the input signature will be tried to be read from the model artifact. Defaulted to None.' default: null - outputs: [] + outputs: + - default: '' lineno: 26 - has_varargs: false - has_kwargs: false pytorch_to_onnx: name: pytorch_to_onnx doc: Convert a PyTorch model to an ONNX model and log it back to MLRun as a @@ -66,6 +66,7 @@ spec: - name: model_handler doc: An initialized PyTorchModelHandler with a loaded model to convert to ONNX. + default: '' - name: onnx_model_name type: str doc: The name to use to log the converted ONNX model. If not given, the given @@ -113,10 +114,9 @@ spec: doc: Whether to include a batch size as the first axis in every input and output layer. Defaulted to True. Will be ignored if 'dynamic_axes' is provided. default: true - outputs: [] + outputs: + - default: '' lineno: 81 - has_varargs: false - has_kwargs: false to_onnx: name: to_onnx doc: Convert the given model to an ONNX model. @@ -124,9 +124,11 @@ spec: - name: context type: MLClientCtx doc: The MLRun function execution context + default: '' - name: model_path type: str doc: The model path store object. + default: '' - name: onnx_model_name type: str doc: The name to use to log the converted ONNX model. If not given, the given @@ -144,10 +146,9 @@ spec: ONNX. To get the doc string of the desired framework onnx conversion function, pass "help". default: null - outputs: [] + outputs: + - default: '' lineno: 160 - has_varargs: false - has_kwargs: false optimize: name: optimize doc: Optimize the given ONNX model. @@ -155,9 +156,11 @@ spec: - name: context type: MLClientCtx doc: The MLRun function execution context. + default: '' - name: model_path type: str doc: Path to the ONNX model object. + default: '' - name: optimizations type: List[str] doc: List of possible optimizations. To see what optimizations are available, @@ -173,10 +176,9 @@ spec: doc: The name of the optimized model. If None, the original model will be overridden. Defaulted to None. default: null - outputs: [] + outputs: + - default: '' lineno: 219 - has_varargs: false - has_kwargs: false description: ONNX intigration in MLRun, some utils functions for the ONNX framework, optimizing and converting models from different framework to ONNX using MLRun. default_handler: to_onnx diff --git a/onnx_utils/item.yaml b/onnx_utils/item.yaml index 84486d9f8..36335837a 100644 --- a/onnx_utils/item.yaml +++ b/onnx_utils/item.yaml @@ -12,9 +12,9 @@ labels: author: guyl maintainers: [] marketplaceType: '' -mlrunVersion: 1.6.3 +mlrunVersion: 1.1.0 name: onnx_utils -platformVersion: 3.5.4 +platformVersion: 3.5.0 spec: extra_spec: allow_empty_resources: true @@ -26,10 +26,10 @@ spec: image: mlrun/mlrun kind: job requirements: - - onnx~=1.15.0 - - onnxruntime~=1.8.1 - - onnxoptimizer~=0.2.0 - - onnxmltools~=1.9.0 - - tf2onnx~=1.16.0 + - onnx~=1.13.0 + - onnxruntime~=1.14.0 + - onnxoptimizer~=0.3.0 + - onnxmltools~=1.11.0 + - tf2onnx~=1.13.0 url: '' -version: 1.3.0 +version: 1.2.0 diff --git a/onnx_utils/requirements.txt b/onnx_utils/requirements.txt index a9acd7371..dc7ff1e7b 100644 --- a/onnx_utils/requirements.txt +++ b/onnx_utils/requirements.txt @@ -1,11 +1,11 @@ tqdm~=4.62.3 -tensorflow~=2.13.0 +tensorflow~=2.7.0 torch~=1.10.0 torchvision~=0.11.1 -onnx~=1.15.0 -onnxruntime~=1.12.1 -onnxoptimizer~=0.3.0 +onnx~=1.10.1 +onnxruntime~=1.8.1 +onnxoptimizer~=0.2.0 onnxmltools~=1.9.0 -tf2onnx~=1.16.0 +tf2onnx~=1.9.0 plotly~=5.4.0 -#wrapt<1.15.0 # wrapt==1.15.0 fails tensorflow 2.7 Todo: please remove when updating tensorflow \ No newline at end of file +wrapt<1.15.0 # wrapt==1.15.0 fails tensorflow 2.7 Todo: please remove when updating tensorflow \ No newline at end of file diff --git a/onnx_utils/test_onnx_utils.py b/onnx_utils/test_onnx_utils.py index aaae96372..35b224c4a 100644 --- a/onnx_utils/test_onnx_utils.py +++ b/onnx_utils/test_onnx_utils.py @@ -257,7 +257,7 @@ def test_pytorch_to_onnx(): filename="test_onnx_utils.py", name="log_model", kind="job", - image="mlrun/mlrun", + image="mlrun/ml-models", ) # Run the function to log the model: @@ -341,7 +341,7 @@ def test_optimize(): filename="test_onnx_utils.py", name="log_model", kind="job", - image="mlrun/mlrun", + image="mlrun/ml-models", ) # Run the function to log the model: From 98d09427db1cc9bdd08e3c498289e0bb35664df6 Mon Sep 17 00:00:00 2001 From: Avi Asulin Date: Mon, 2 Sep 2024 16:12:12 +0300 Subject: [PATCH 16/38] [feature selection] update function yaml --- feature_selection/item.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature_selection/item.yaml b/feature_selection/item.yaml index c7400a7f0..1b25ec410 100644 --- a/feature_selection/item.yaml +++ b/feature_selection/item.yaml @@ -12,7 +12,7 @@ labels: author: orz maintainers: [] marketplaceType: '' -mlrunVersion: 1.7.0 +mlrunVersion: 1.6.4 name: feature-selection platformVersion: 3.6.0 spec: From 2fb20802033039178fcf94ad33eff63155e9ff37 Mon Sep 17 00:00:00 2001 From: Avi Asulin Date: Mon, 2 Sep 2024 16:34:04 +0300 Subject: [PATCH 17/38] [feature selection] update function yaml --- feature_selection/requirements.txt | 2 +- feature_selection/test_feature_selection.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/feature_selection/requirements.txt b/feature_selection/requirements.txt index 961f64ea4..70a079c7d 100644 --- a/feature_selection/requirements.txt +++ b/feature_selection/requirements.txt @@ -1,4 +1,4 @@ -scikit-learn~=1.0.2 +scikit-learn matplotlib seaborn scikit-plot diff --git a/feature_selection/test_feature_selection.py b/feature_selection/test_feature_selection.py index 6289648f2..d21e648ff 100644 --- a/feature_selection/test_feature_selection.py +++ b/feature_selection/test_feature_selection.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. # -from mlrun import code_to_function +from mlrun import code_to_function, get_dataitem from pathlib import Path import shutil @@ -44,5 +44,5 @@ def test_run_local_feature_selection(): inputs={'df_artifact': 'data/metrics.pq'}, artifact_path='artifacts/', ) - assert run.artifact('feature_scores').get() and run.artifact('selected_features').get() + assert run.outputs['feature_scores'] and run.outputs['selected_features'] _delete_outputs({ARTIFACTS_PATH, RUNS_PATH, SCHEDULES_PATH}) From 55e1dc0b0a3f96d40e85672a879ae3064bcef895 Mon Sep 17 00:00:00 2001 From: Eyal Danieli Date: Mon, 9 Sep 2024 09:46:33 +0300 Subject: [PATCH 18/38] Delete unsupported functions from the hub (#824) * delete EOS functions * bring back validate_great_expectations * bring back load_dataset --- bert_embeddings/bert_embeddings.ipynb | 503 ---- bert_embeddings/bert_embeddings.py | 41 - bert_embeddings/function.yaml | 38 - bert_embeddings/item.yaml | 26 - bert_embeddings/requirements.txt | 1 - bert_embeddings/test_bert_embeddings.py | 32 - concept_drift/README.md | 132 - concept_drift/concept_drift.ipynb | 793 ------ concept_drift/concept_drift.py | 147 - concept_drift/function.yaml | 112 - concept_drift/item.yaml | 27 - concept_drift/requirements.txt | 1 - .../concept_drift_streaming.ipynb | 480 ---- .../concept_drift_streaming.py | 157 - concept_drift_streaming/function.yaml | 48 - concept_drift_streaming/item.yaml | 29 - concept_drift_streaming/requirements.txt | 1 - feature_perms/README.ipynb | 788 ----- feature_perms/feature_perms.ipynb | 1106 ------- feature_perms/feature_perms.py | 174 -- feature_perms/function.yaml | 63 - feature_perms/item.yaml | 25 - feature_perms/requirements.txt | 5 - feature_perms/test_feature_perms.py | 134 - get_offline_features/function.yaml | 127 - .../get_offline_features.ipynb | 1536 ---------- get_offline_features/get_offline_features.py | 142 - get_offline_features/item.yaml | 26 - .../test_get_offline_features.py | 239 -- hugging_face_classifier_trainer/function.yaml | 368 --- .../hugging_face_classifier_trainer.ipynb | 2533 ----------------- .../hugging_face_classifier_trainer.py | 832 ------ hugging_face_classifier_trainer/item.yaml | 31 - .../requirements.txt | 6 - .../test_hugging_face_classifier_trainer.py | 145 - huggingface_auto_trainer/function.yaml | 349 --- .../huggingface_auto_trainer.ipynb | 195 -- .../huggingface_auto_trainer.py | 855 ------ huggingface_auto_trainer/item.yaml | 25 - huggingface_auto_trainer/requirements.txt | 5 - .../test_huggingface_auto_trainer.py | 42 - ingest/function.yaml | 87 - ingest/ingest.ipynb | 762 ----- ingest/ingest.py | 84 - ingest/item.yaml | 27 - ingest/test_ingest.py | 171 -- model_monitoring_stream/function.yaml | 267 -- model_monitoring_stream/item.yaml | 23 - .../model_monitoring_stream.ipynb | 178 -- .../model_monitoring_stream.py | 768 ----- model_monitoring_stream/requirements.txt | 3 - pandas_profiling_report/README.md | 26 - pandas_profiling_report/function.yaml | 40 - pandas_profiling_report/item.yaml | 25 - .../pandas_profiling_report.ipynb | 794 ------ .../pandas_profiling_report.py | 41 - project_runner/function.yaml | 53 - project_runner/project_runner.ipynb | 340 --- rnn_serving/function.yaml | 46 - rnn_serving/item.yaml | 25 - rnn_serving/requirements.txt | 2 - rnn_serving/rnn_serving.ipynb | 285 -- rnn_serving/rnn_serving.py | 35 - rnn_serving/test_rnn_serving.py | 74 - slack_notify/README.md | 1 - slack_notify/function.yaml | 48 - slack_notify/item.yaml | 25 - slack_notify/slack_notify.ipynb | 293 -- slack_notify/slack_notify.py | 48 - snowflake_dask/README.md | 38 - snowflake_dask/config-template.yaml | 5 - snowflake_dask/function.yaml | 81 - .../img/iguazio-project-secrets.png | Bin 105122 -> 0 bytes snowflake_dask/img/snowflake-dask.png | Bin 58722 -> 0 bytes snowflake_dask/item.yaml | 25 - snowflake_dask/requirements.txt | 2 - snowflake_dask/snowflake-dask-mlrun.ipynb | 437 --- snowflake_dask/snowflake_dask.py | 125 - snowflake_dask/test_snowflake_dask.py | 24 - sql_to_file/function.yaml | 47 - sql_to_file/item.yaml | 24 - sql_to_file/requirements.txt | 2 - sql_to_file/sql_to_file.ipynb | 1567 ---------- sql_to_file/sql_to_file.py | 45 - sql_to_file/test_sql_to_file.py | 31 - stream_to_parquet/function.yaml | 45 - stream_to_parquet/item.yaml | 28 - stream_to_parquet/stream_to_parquet.ipynb | 698 ----- stream_to_parquet/stream_to_parquet.py | 96 - tf1_serving/function.yaml | 48 - tf1_serving/item.yaml | 28 - tf1_serving/requirements.txt | 2 - tf1_serving/tf1_serving.ipynb | 567 ---- tf1_serving/tf1_serving.py | 87 - tf2_serving_v2/function.yaml | 45 - tf2_serving_v2/item.yaml | 28 - tf2_serving_v2/requirements.txt | 2 - tf2_serving_v2/tf2_serving_v2.ipynb | 545 ---- tf2_serving_v2/tf2_serving_v2.py | 82 - virtual_drift/README.md | 56 - virtual_drift/function.yaml | 129 - virtual_drift/item.yaml | 28 - virtual_drift/virtual_drift.ipynb | 935 ------ virtual_drift/virtual_drift.py | 206 -- xgb_custom/function.yaml | 241 -- xgb_custom/item.yaml | 26 - xgb_custom/requirements.txt | 7 - xgb_custom/test_xgb_custom.py | 50 - xgb_custom/xgb_custom.ipynb | 922 ------ xgb_custom/xgb_custom.py | 239 -- xgb_serving/function.yaml | 40 - xgb_serving/item.yaml | 29 - xgb_serving/requirements.txt | 7 - xgb_serving/test_xgb_serving.py | 67 - xgb_serving/xgb_serving.ipynb | 421 --- xgb_serving/xgb_serving.py | 33 - 116 files changed, 25080 deletions(-) delete mode 100644 bert_embeddings/bert_embeddings.ipynb delete mode 100644 bert_embeddings/bert_embeddings.py delete mode 100644 bert_embeddings/function.yaml delete mode 100644 bert_embeddings/item.yaml delete mode 100644 bert_embeddings/requirements.txt delete mode 100644 bert_embeddings/test_bert_embeddings.py delete mode 100644 concept_drift/README.md delete mode 100644 concept_drift/concept_drift.ipynb delete mode 100644 concept_drift/concept_drift.py delete mode 100644 concept_drift/function.yaml delete mode 100644 concept_drift/item.yaml delete mode 100644 concept_drift/requirements.txt delete mode 100644 concept_drift_streaming/concept_drift_streaming.ipynb delete mode 100644 concept_drift_streaming/concept_drift_streaming.py delete mode 100644 concept_drift_streaming/function.yaml delete mode 100644 concept_drift_streaming/item.yaml delete mode 100644 concept_drift_streaming/requirements.txt delete mode 100644 feature_perms/README.ipynb delete mode 100644 feature_perms/feature_perms.ipynb delete mode 100644 feature_perms/feature_perms.py delete mode 100644 feature_perms/function.yaml delete mode 100644 feature_perms/item.yaml delete mode 100644 feature_perms/requirements.txt delete mode 100644 feature_perms/test_feature_perms.py delete mode 100644 get_offline_features/function.yaml delete mode 100644 get_offline_features/get_offline_features.ipynb delete mode 100644 get_offline_features/get_offline_features.py delete mode 100644 get_offline_features/item.yaml delete mode 100644 get_offline_features/test_get_offline_features.py delete mode 100644 hugging_face_classifier_trainer/function.yaml delete mode 100644 hugging_face_classifier_trainer/hugging_face_classifier_trainer.ipynb delete mode 100755 hugging_face_classifier_trainer/hugging_face_classifier_trainer.py delete mode 100755 hugging_face_classifier_trainer/item.yaml delete mode 100644 hugging_face_classifier_trainer/requirements.txt delete mode 100644 hugging_face_classifier_trainer/test_hugging_face_classifier_trainer.py delete mode 100644 huggingface_auto_trainer/function.yaml delete mode 100644 huggingface_auto_trainer/huggingface_auto_trainer.ipynb delete mode 100644 huggingface_auto_trainer/huggingface_auto_trainer.py delete mode 100644 huggingface_auto_trainer/item.yaml delete mode 100644 huggingface_auto_trainer/requirements.txt delete mode 100644 huggingface_auto_trainer/test_huggingface_auto_trainer.py delete mode 100644 ingest/function.yaml delete mode 100644 ingest/ingest.ipynb delete mode 100644 ingest/ingest.py delete mode 100644 ingest/item.yaml delete mode 100644 ingest/test_ingest.py delete mode 100644 model_monitoring_stream/function.yaml delete mode 100644 model_monitoring_stream/item.yaml delete mode 100644 model_monitoring_stream/model_monitoring_stream.ipynb delete mode 100644 model_monitoring_stream/model_monitoring_stream.py delete mode 100644 model_monitoring_stream/requirements.txt delete mode 100644 pandas_profiling_report/README.md delete mode 100644 pandas_profiling_report/function.yaml delete mode 100644 pandas_profiling_report/item.yaml delete mode 100644 pandas_profiling_report/pandas_profiling_report.ipynb delete mode 100644 pandas_profiling_report/pandas_profiling_report.py delete mode 100644 project_runner/function.yaml delete mode 100644 project_runner/project_runner.ipynb delete mode 100644 rnn_serving/function.yaml delete mode 100644 rnn_serving/item.yaml delete mode 100644 rnn_serving/requirements.txt delete mode 100644 rnn_serving/rnn_serving.ipynb delete mode 100644 rnn_serving/rnn_serving.py delete mode 100644 rnn_serving/test_rnn_serving.py delete mode 100644 slack_notify/README.md delete mode 100644 slack_notify/function.yaml delete mode 100644 slack_notify/item.yaml delete mode 100644 slack_notify/slack_notify.ipynb delete mode 100644 slack_notify/slack_notify.py delete mode 100644 snowflake_dask/README.md delete mode 100644 snowflake_dask/config-template.yaml delete mode 100644 snowflake_dask/function.yaml delete mode 100644 snowflake_dask/img/iguazio-project-secrets.png delete mode 100644 snowflake_dask/img/snowflake-dask.png delete mode 100644 snowflake_dask/item.yaml delete mode 100644 snowflake_dask/requirements.txt delete mode 100644 snowflake_dask/snowflake-dask-mlrun.ipynb delete mode 100644 snowflake_dask/snowflake_dask.py delete mode 100644 snowflake_dask/test_snowflake_dask.py delete mode 100644 sql_to_file/function.yaml delete mode 100644 sql_to_file/item.yaml delete mode 100644 sql_to_file/requirements.txt delete mode 100644 sql_to_file/sql_to_file.ipynb delete mode 100644 sql_to_file/sql_to_file.py delete mode 100644 sql_to_file/test_sql_to_file.py delete mode 100644 stream_to_parquet/function.yaml delete mode 100644 stream_to_parquet/item.yaml delete mode 100644 stream_to_parquet/stream_to_parquet.ipynb delete mode 100644 stream_to_parquet/stream_to_parquet.py delete mode 100644 tf1_serving/function.yaml delete mode 100644 tf1_serving/item.yaml delete mode 100644 tf1_serving/requirements.txt delete mode 100644 tf1_serving/tf1_serving.ipynb delete mode 100644 tf1_serving/tf1_serving.py delete mode 100644 tf2_serving_v2/function.yaml delete mode 100644 tf2_serving_v2/item.yaml delete mode 100644 tf2_serving_v2/requirements.txt delete mode 100644 tf2_serving_v2/tf2_serving_v2.ipynb delete mode 100644 tf2_serving_v2/tf2_serving_v2.py delete mode 100644 virtual_drift/README.md delete mode 100644 virtual_drift/function.yaml delete mode 100644 virtual_drift/item.yaml delete mode 100644 virtual_drift/virtual_drift.ipynb delete mode 100644 virtual_drift/virtual_drift.py delete mode 100644 xgb_custom/function.yaml delete mode 100644 xgb_custom/item.yaml delete mode 100644 xgb_custom/requirements.txt delete mode 100644 xgb_custom/test_xgb_custom.py delete mode 100644 xgb_custom/xgb_custom.ipynb delete mode 100644 xgb_custom/xgb_custom.py delete mode 100644 xgb_serving/function.yaml delete mode 100644 xgb_serving/item.yaml delete mode 100644 xgb_serving/requirements.txt delete mode 100644 xgb_serving/test_xgb_serving.py delete mode 100644 xgb_serving/xgb_serving.ipynb delete mode 100644 xgb_serving/xgb_serving.py diff --git a/bert_embeddings/bert_embeddings.ipynb b/bert_embeddings/bert_embeddings.ipynb deleted file mode 100644 index cb6d55841..000000000 --- a/bert_embeddings/bert_embeddings.ipynb +++ /dev/null @@ -1,503 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## BERT Embeddings Serverless Function\n", - "This notebook presents deployment of pretrained BERT model that outputs embeddings for given textual sequences as a serverless function. Embeddings are meaningful, contextual representations of text in the form of ndarrays that are used frequently as input to various learning tasks in the field of NLP." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Embeddings without bert" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "[One-Hot Encoding](https://en.wikipedia.org/wiki/One-hot) is a general method that can vectorize any categorical features. It is simple and fast to create and update the vectorization.
\n", - "in case of text embeddings, each row is a sentence and each column is a word/char/[n-gram](https://en.wikipedia.org/wiki/N-gram)." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# some sentences to do examine\n", - "sentences = ['the quick brown fox jumps over the lazy dog',\n", - " 'Hello I am Jacob',\n", - " 'Daniel visited Tel-Aviv last month']" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "lets see the difference between bert embeddings and one-hot encoding" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['the', 'quick', 'brown', 'fox', 'jumps', 'over', 'lazy', 'dog', 'Hello', 'I', 'am', 'Jacob', 'Daniel', 'visited', 'Tel-Aviv', 'last', 'month']\n" - ] - } - ], - "source": [ - "# constructing a list of all the words (will be our columns) - make sure no duplicate words are set\n", - "tokens = []\n", - "for sentence in sentences:\n", - " for word in sentence.split():\n", - " tokens.append(word) if word not in tokens else \"\"\n", - "print(tokens)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "# constructing the one hot vector\n", - "import pandas as pd\n", - "import numpy as np\n", - "\n", - "one_hot = pd.DataFrame(columns = range(len(tokens)))\n", - "# filling our empty dataframe with each sentence encoding\n", - "for sentence in sentences:\n", - " vector = np.zeros(len(tokens))\n", - " for word in sentence.split():\n", - " vector[tokens.index(word)]=1\n", - " one_hot = one_hot.append(pd.Series(vector),ignore_index=True)\n", - "one_hot.columns = tokens" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
thequickbrownfoxjumpsoverlazydogHelloIamJacobDanielvisitedTel-Avivlastmonth
01.01.01.01.01.01.01.01.00.00.00.00.00.00.00.00.00.0
10.00.00.00.00.00.00.00.01.01.01.01.00.00.00.00.00.0
20.00.00.00.00.00.00.00.00.00.00.00.01.01.01.01.01.0
\n", - "
" - ], - "text/plain": [ - " the quick brown fox jumps over lazy dog Hello I am Jacob \\\n", - "0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 \n", - "1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 \n", - "2 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", - "\n", - " Daniel visited Tel-Aviv last month \n", - "0 0.0 0.0 0.0 0.0 0.0 \n", - "1 0.0 0.0 0.0 0.0 0.0 \n", - "2 1.0 1.0 1.0 1.0 1.0 " - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "one_hot" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The table above represents the one-hot encoding of our sentences, each row is a sentence and each column is a word.\n", - "this representation is very slim and will be a very weak learning dataset." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Introducing Bert embeddings" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "from mlrun import import_function, auto_mount" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "# importing the function from the hub\n", - "fn = import_function(\"hub://bert_embeddings\").apply(auto_mount())" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2023-02-02 09:29:59,002 [info] Starting remote function deploy\n", - "2023-02-02 09:29:59 (info) Deploying function\n", - "2023-02-02 09:29:59 (info) Building\n", - "2023-02-02 09:29:59 (info) Staging files and preparing base images\n", - "2023-02-02 09:29:59 (info) Building processor image\n", - "2023-02-02 09:32:09 (info) Build complete\n", - "2023-02-02 09:32:35 (info) Function deploy complete\n", - "> 2023-02-02 09:32:36,059 [info] successfully deployed function: {'internal_invocation_urls': ['nuclio-default-bert-embeddings.default-tenant.svc.cluster.local:8080'], 'external_invocation_urls': ['default-bert-embeddings-default.default-tenant.app.cto-office.iguazio-cd1.com/']}\n" - ] - } - ], - "source": [ - "# deploying the function\n", - "addr = fn.deploy()" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "import requests\n", - "import json\n", - "# sending a request to the function endpoint to get the sentences' embeddings\n", - "resp = requests.post(addr, json=json.dumps(sentences))" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "import pickle\n", - "output_embeddings = pickle.loads(resp.content)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "embeddings per token shape: (3, 11, 768), pooled embeddings shape: (3, 768)\n" - ] - } - ], - "source": [ - "print(f'embeddings per token shape: {output_embeddings[0].shape}, pooled embeddings shape: {output_embeddings[1].shape}')" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
0123456789...758759760761762763764765766767
0-0.733322-0.2235400.3424620.383463-0.1647960.0405220.8028450.1528420.331639-0.999779...0.2065640.2314150.1964330.7979080.4351750.7493700.2460980.427603-0.5773840.842063
1-0.953005-0.535132-0.7438220.8939340.646276-0.2793880.9435130.275504-0.555109-0.999992...0.582386-0.0046140.9760790.931517-0.3914420.5303840.675933-0.682721-0.7463390.957809
2-0.843678-0.453405-0.8260110.6508050.494036-0.1541170.8216420.349507-0.650629-0.999978...0.618286-0.3367000.9362620.857577-0.7874890.2461370.676243-0.612532-0.7087860.840879
\n", - "

3 rows × 768 columns

\n", - "
" - ], - "text/plain": [ - " 0 1 2 3 4 5 6 \\\n", - "0 -0.733322 -0.223540 0.342462 0.383463 -0.164796 0.040522 0.802845 \n", - "1 -0.953005 -0.535132 -0.743822 0.893934 0.646276 -0.279388 0.943513 \n", - "2 -0.843678 -0.453405 -0.826011 0.650805 0.494036 -0.154117 0.821642 \n", - "\n", - " 7 8 9 ... 758 759 760 761 \\\n", - "0 0.152842 0.331639 -0.999779 ... 0.206564 0.231415 0.196433 0.797908 \n", - "1 0.275504 -0.555109 -0.999992 ... 0.582386 -0.004614 0.976079 0.931517 \n", - "2 0.349507 -0.650629 -0.999978 ... 0.618286 -0.336700 0.936262 0.857577 \n", - "\n", - " 762 763 764 765 766 767 \n", - "0 0.435175 0.749370 0.246098 0.427603 -0.577384 0.842063 \n", - "1 -0.391442 0.530384 0.675933 -0.682721 -0.746339 0.957809 \n", - "2 -0.787489 0.246137 0.676243 -0.612532 -0.708786 0.840879 \n", - "\n", - "[3 rows x 768 columns]" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd.DataFrame(output_embeddings[1])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "we can see that the size of the first dimension of the outputs is three since we passed in three sequences. Also the intermediate dimension of the first output is the maximal number of tokens across all input sequences. Sequences with less tokens are padded with zero values.
\n", - "Note that the first input has an intermediate dimension of size 11 that corresponds to the number of max tokens in the input sequence after addition of two special tokens marking beginning and end of a sequence by the tokenizer.
\n", - "The last dimension for both is of size 768 which is the embedding dimension for this default configuration of bert.
\n", - "Now you tell me, which encoding are you gonna use in your project ??" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/bert_embeddings/bert_embeddings.py b/bert_embeddings/bert_embeddings.py deleted file mode 100644 index 109081b1b..000000000 --- a/bert_embeddings/bert_embeddings.py +++ /dev/null @@ -1,41 +0,0 @@ -# Copyright 2019 Iguazio -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -import json -import pickle - -import torch -from transformers import BertModel, BertTokenizer - - -def init_context(context): - tokenizer = BertTokenizer.from_pretrained("bert-base-uncased") - model = BertModel.from_pretrained("bert-base-uncased") - model.eval() - - setattr(context.user_data, "tokenizer", tokenizer) - setattr(context.user_data, "model", model) - - -def handler(context, event): - docs = json.loads(event.body) - docs = [doc.lower() for doc in docs] - docs = context.user_data.tokenizer.batch_encode_plus( - docs, pad_to_max_length=True, return_tensors="pt" - ) - - with torch.no_grad(): - embeddings = context.user_data.model(**docs) - embeddings = [embeddings[0].numpy(), embeddings[1].numpy()] - return pickle.dumps(embeddings) diff --git a/bert_embeddings/function.yaml b/bert_embeddings/function.yaml deleted file mode 100644 index 4a3fcf54f..000000000 --- a/bert_embeddings/function.yaml +++ /dev/null @@ -1,38 +0,0 @@ -kind: remote -metadata: - name: bert-embeddings - tag: '' - hash: 57a2ce8e0da1f6e813a8649e9ea6fcbb69a1ce5f - project: '' - labels: - framework: pytorch - categories: - - machine-learning - - data-preparation -spec: - command: '' - args: [] - image: mlrun/mlrun - build: - functionSourceCode: IyBDb3B5cmlnaHQgMjAxOSBJZ3VhemlvCiMKIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiMKaW1wb3J0IGpzb24KaW1wb3J0IHBpY2tsZQoKaW1wb3J0IHRvcmNoCmZyb20gdHJhbnNmb3JtZXJzIGltcG9ydCBCZXJ0TW9kZWwsIEJlcnRUb2tlbml6ZXIKCgpkZWYgaW5pdF9jb250ZXh0KGNvbnRleHQpOgogICAgdG9rZW5pemVyID0gQmVydFRva2VuaXplci5mcm9tX3ByZXRyYWluZWQoImJlcnQtYmFzZS11bmNhc2VkIikKICAgIG1vZGVsID0gQmVydE1vZGVsLmZyb21fcHJldHJhaW5lZCgiYmVydC1iYXNlLXVuY2FzZWQiKQogICAgbW9kZWwuZXZhbCgpCgogICAgc2V0YXR0cihjb250ZXh0LnVzZXJfZGF0YSwgInRva2VuaXplciIsIHRva2VuaXplcikKICAgIHNldGF0dHIoY29udGV4dC51c2VyX2RhdGEsICJtb2RlbCIsIG1vZGVsKQoKCmRlZiBoYW5kbGVyKGNvbnRleHQsIGV2ZW50KToKICAgIGRvY3MgPSBqc29uLmxvYWRzKGV2ZW50LmJvZHkpCiAgICBkb2NzID0gW2RvYy5sb3dlcigpIGZvciBkb2MgaW4gZG9jc10KICAgIGRvY3MgPSBjb250ZXh0LnVzZXJfZGF0YS50b2tlbml6ZXIuYmF0Y2hfZW5jb2RlX3BsdXMoCiAgICAgICAgZG9jcywgcGFkX3RvX21heF9sZW5ndGg9VHJ1ZSwgcmV0dXJuX3RlbnNvcnM9InB0IgogICAgKQoKICAgIHdpdGggdG9yY2gubm9fZ3JhZCgpOgogICAgICAgIGVtYmVkZGluZ3MgPSBjb250ZXh0LnVzZXJfZGF0YS5tb2RlbCgqKmRvY3MpCiAgICBlbWJlZGRpbmdzID0gW2VtYmVkZGluZ3NbMF0ubnVtcHkoKSwgZW1iZWRkaW5nc1sxXS5udW1weSgpXQogICAgcmV0dXJuIHBpY2tsZS5kdW1wcyhlbWJlZGRpbmdzKQo= - commands: [] - code_origin: http://github.com/aviaIguazio/functions.git#a1c9940e4c2420c88063768b4038e29b1f4e37a6:/Users/Avi_Asulin/PycharmProjects/mlrun/functions/bert_embeddings/bert_embeddings.py - origin_filename: /Users/Avi_Asulin/PycharmProjects/mlrun/functions/bert_embeddings/bert_embeddings.py - requirements: - - torch - description: Get BERT based embeddings for given text - default_handler: '' - disable_auto_mount: false - clone_target_dir: '' - env: [] - priority_class_name: '' - preemption_mode: prevent - min_replicas: 1 - max_replicas: 4 - source: '' - function_handler: bert_embeddings:handler - base_image_pull: false - affinity: null - tolerations: null - security_context: {} -verbose: false diff --git a/bert_embeddings/item.yaml b/bert_embeddings/item.yaml deleted file mode 100644 index f0eaed1c0..000000000 --- a/bert_embeddings/item.yaml +++ /dev/null @@ -1,26 +0,0 @@ -apiVersion: v1 -categories: -- machine-learning -- data-preparation -description: Get BERT based embeddings for given text -doc: '' -example: bert_embeddings.ipynb -generationDate: 2022-08-28:17-25 -hidden: false -icon: '' -labels: - framework: pytorch -maintainers: [] -marketplaceType: '' -mlrunVersion: 1.4.1 -name: bert-embeddings -platformVersion: 3.5.3 -spec: - filename: bert_embeddings.py - handler: handler - image: mlrun/mlrun - kind: nuclio - requirements: - - torch -url: '' -version: 1.2.0 diff --git a/bert_embeddings/requirements.txt b/bert_embeddings/requirements.txt deleted file mode 100644 index 747b7aa97..000000000 --- a/bert_embeddings/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -transformers \ No newline at end of file diff --git a/bert_embeddings/test_bert_embeddings.py b/bert_embeddings/test_bert_embeddings.py deleted file mode 100644 index 7ad9101cc..000000000 --- a/bert_embeddings/test_bert_embeddings.py +++ /dev/null @@ -1,32 +0,0 @@ -# Copyright 2019 Iguazio -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -from bert_embeddings import init_context,handler -import nuclio -import json -import pickle -import numpy as np - -ARCHIVE = "https://archive.ics.uci.edu/ml/machine-learning-databases/00280/HIGGS.csv.gz" -ARTIFACTS_PATH = 'artifacts' - - -def test_bert_embeddings(): - event = nuclio.Event(body=json.dumps(['John loves Mary'])) - ctx = nuclio.Context() - init_context(ctx) - outputs = pickle.loads(handler(ctx, event)) - assert (True if abs(np.mean(outputs[0]) - -0.011996539) <= 0.0001 else False) is True - assert (True if abs(np.mean(outputs[0]) - -0.011996539) > 0 else False) is True - diff --git a/concept_drift/README.md b/concept_drift/README.md deleted file mode 100644 index 92e6d893e..000000000 --- a/concept_drift/README.md +++ /dev/null @@ -1,132 +0,0 @@ -# Concept Drift - -**Concept drift** is a change in the statistical properties of the **target variable** over time. - -When deploying our models to production, we must ensure our models perform as we expect them to - reaching the same level of performence we have seen on our test sets or at least performing in the same quality as when they were deployed. - -However, often this is not the case. there are many factors that can affect our model's performance like seasonality or any unkown root causes that will change the laws underlying our data and invalidate some assumptions made by the model. - -We offer this function to help combat Concept Drift with implementation of streaming DDM, EDDM and PH concept drift detectors. - -## How to integrate - -This function is made of two parts: - -1. Kubernetes job to instantiate the selected models with a provided base dataset (the test dataset could be used) -2. [Nuclio serverless function](../concept_drift_streaming/concept_drift_streaming.ipynb) listed on a _labeled stream_, which will be deployed from this function after the models initialization and run the models per event and provide necessary alerts. - -There are two steps to integrate sucessfully with your workflow: - -1. Provide a stream where each event containes the joined **label** and **prediction** for that specific event. -2. Add this function to the workflow with the following params: - -```markdown -:param context: MLRun context -:param base_dataset: Dataset containing label_col and prediction_col to initialize the detectors -:param input_stream: labeled stream to track. - Should contain label_col and prediction_col -:param output_stream: Output stream to push the detector's alerts -:param output_tsdb: Output TSDB table to allow analysis and display -:param tsdb_batch_size: Batch size of alerts to buffer before pushing to the TSDB -:param callbacks: Additional rest endpoints to send the alert data to -:param models: List of the detectors to deploy - Defaults to ['ddm', 'eddm', 'pagehinkley']. -:param models_dest: Location for saving the detectors - Defaults to 'models' (in relation to artifact_path). -:param pagehinkley_threshold: Drift level threshold for PH detector Defaults to 10. -:param ddm_warning_level: Warning level alert for DDM detector Defaults to 2. -:param ddm_out_control_level: Drift level alert for DDM detector Defaults to 3. -:param label_col: Label column to be used on base_dataset and input_stream - Defaults to 'label'. -:param prediction_col: Prediction column to be used on base_dataset and input_stream - Defaults to 'prediction'. -:param hub_url: hub_url in case the default is not used, concept_drift_streaming will be loaded - by this url - Defaults to mlconf.hub_url. -:param fn_tag: hub tag to use - Defaults to 'master' -``` - -## Algorithms - -We offer to deploy up to 3 concept drift streaming detectors - -### DDM - Drift Detection Method - -Models the **Number of errors** as a **binomial** variable. This enables us to confine the expected number of errors in a prediction stream window to within some standard deviation. - -- Good for **abrupt** drift changes - -
- -![$mu=np_t$](https://latex.codecogs.com/svg.latex?mu=np_t) - -![$\sigma=\sqrt{\frac{p_t(1-p_t)}{n}}$]() - -
- -**Alert** when: - -
- -![$p_t+\sigma_t\ge{p_{min}+3\sigma_{min}}$](https://latex.codecogs.com/svg.latex?p_t+\sigma_t\ge{p_{min}+3\sigma_{min}}) - -
- -### EDDM - Early Drift Detection Method - -Uses the distance between two consecutive errors. - -- works better for **gradual** drift changes. -- More sensitive then DDM for noise -- Requires Minimal number of errors to initialize the statistics. - -**Warning**: - -
- -![$\frac{p_t+2\sigma_t}{p_{max}+2\sigma_{max}}<0.95$](https://latex.codecogs.com/svg.latex?\frac{p_t+2\sigma_t}{p_{max}+2\sigma_{max}}<0.95) - -
- -**Alert**: - -
- -![$\frac{p_t+2\sigma_t}{p_{max}+2\sigma_{max}}<0.90$](https://latex.codecogs.com/svg.latex?\frac{p_t+2\sigma_t}{p_{max}+2\sigma_{max}}<0.90) - -
- -### PageHinkley Test: - -The PageHinkley test is a sequential analysis technique typically used for monitoring change detection. (The test was designed to detect change in avg. of a Gaussian signal). In this test we use: -x*1*, ..., x*n* - labeled dataset -δ - magnitude threshold -λ - detection threshold - -
- -![$\hat{x_T}=\frac{1}{T}\sum_{t=1}^{t}{x_t}$](https://latex.codecogs.com/svg.latex?\hat{x_T}=\frac{1}{T}\sum_{t=1}^{t}{x_t}) - -![$\sum_{t=1}^T{x_t-\hat{x_T}-\delta}$](https://latex.codecogs.com/svg.latex?U_T=\sum_{t=1}^T{x_t-\hat{x_T}-\delta}) - -![$m_T=min(U_t,t=1..T)$]() - -
- -**Alert**: - -
- -![$U_T-m_T>\lambda$](https://latex.codecogs.com/svg.latex?U_T-m_T>\lambda) - -
- -## Additional resources -[A Study on Change Detection Methods](https://pdfs.semanticscholar.org/bb6e/8a44c0efcd725aae1c0b1817561f6e278c2c.pdf), Raquel Sebasti˜ao1,2 and Jo˜ao Gama1,3, 1 LIAAD-INESC Porto L.A., University of Porto -Rua de Ceuta, 118 - 6, 4050-190 Porto, Portugal -2 Faculty of Science, University of Porto -3 Faculty of Economics, University of Porto -{raquel,jgama}@liaad.up.pt - -[MLOps Live #4 - How to Detect & Remediate Drift in Production with MLOps Automation](https://www.youtube.com/watch?v=66_Q7mJZOSc&t=1296s) diff --git a/concept_drift/concept_drift.ipynb b/concept_drift/concept_drift.ipynb deleted file mode 100644 index e9c063b66..000000000 --- a/concept_drift/concept_drift.ipynb +++ /dev/null @@ -1,793 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Concept Drift - Deployer\n", - "Deploy a streaming Concept Drift detector on a labeled stream. \n", - "It will initialize the selected drift detectors with the base_dataset's statistics and deploy the [concept_drift_streaming](https://github.com/mlrun/functions/blob/master/concept_drift_streaming/concept_drift_streaming.ipynb) function from the hub.
\n", - "adding [V3IOStreamTrigger](https://nuclio.io/docs/latest/reference/triggers/v3iostream/) in order to listen to the input_stream." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Steps**\n", - "\n", - "1. [Data exploration](#Data-exploration)\n", - "2. [Creating the input stream](#Creating-the-input-stream)\n", - "3. [Importing the function](#Importing-the-function)\n", - "4. [Running the function remotely](#Running-the-function-remotely)\n", - "5. [Testing the function](#Testing-the-function)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Data exploration**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In order to know about the performance of a drift detector by measuring the different detection metrics, we need to know beforehand where a real drift occurs.
\n", - "This is only possible with synthetic datasets.
The scikit-multiflow framework allows generating several kinds of synthetic data to simulate the occurrence of drifts.
\n", - "[Harvard dataverse](https://dataverse.harvard.edu) provides futher explanations on the [used dataset](https://dataverse.harvard.edu/dataset.xhtml?persistentId=doi:10.7910/DVN/5OWRGB) along with different kinds of drifted datasets.
\n", - "mixed_0101_abrupto has 4 concepts and 3 drifts at time steps 10000, 20000, and 30000.
\n", - "Our dataset will be train-test-splitted, the train part (first 5000 examples) is used to train the model (that is generated easly using [sklearn_classifer](https://github.com/mlrun/functions/blob/master/sklearn_classifier/sklearn_classifier.ipynb)).
\n", - "The test part (which is already predicted by the model) will be pushed to the input stream in order to detect drifts." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
X1X2X3X4class
00.01.00.4601010.5927441.0
11.01.00.5887880.5749840.0
20.00.00.4016410.6793251.0
31.01.00.3060760.1821080.0
40.00.00.9628470.5792451.0
\n", - "
" - ], - "text/plain": [ - " X1 X2 X3 X4 class\n", - "0 0.0 1.0 0.460101 0.592744 1.0\n", - "1 1.0 1.0 0.588788 0.574984 0.0\n", - "2 0.0 0.0 0.401641 0.679325 1.0\n", - "3 1.0 1.0 0.306076 0.182108 0.0\n", - "4 0.0 0.0 0.962847 0.579245 1.0" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import pandas as pd\n", - "data_path = 'https://s3.wasabisys.com/iguazio/data/function-marketplace-data/concept_drift/mixed_0101_abrupto.csv'\n", - "predicted_train_path = 'https://s3.wasabisys.com/iguazio/data/function-marketplace-data/concept_drift/predicted_abrupto_train.csv'\n", - "predicted_test_data_path = 'https://s3.wasabisys.com/iguazio/data/function-marketplace-data/concept_drift/predicted_abrupto_test.csv'\n", - "# You can find the model used here\n", - "models_path = 'https://s3.wasabisys.com/iguazio/models/function-marketplace-models/concept_drift/concept_drift_random_forest.pkl'\n", - "original_data = pd.read_csv(data_path)\n", - "original_data.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
X1X2X3X4classpredicted_col
349950.00.00.0101060.6472690.01.0
349961.01.00.2936510.7372911.00.0
349970.00.00.8485460.5523370.01.0
349981.01.00.6147540.8598961.00.0
349991.00.00.2653060.8437160.01.0
\n", - "
" - ], - "text/plain": [ - " X1 X2 X3 X4 class predicted_col\n", - "34995 0.0 0.0 0.010106 0.647269 0.0 1.0\n", - "34996 1.0 1.0 0.293651 0.737291 1.0 0.0\n", - "34997 0.0 0.0 0.848546 0.552337 0.0 1.0\n", - "34998 1.0 1.0 0.614754 0.859896 1.0 0.0\n", - "34999 1.0 0.0 0.265306 0.843716 0.0 1.0" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "predicted_test = pd.read_csv(predicted_test_data_path)\n", - "predicted_test.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Creating the input stream**" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "import os \n", - "\n", - "container = os.path.join('/',os.environ['V3IO_HOME'].split('/')[0])\n", - "user = os.environ[\"V3IO_USERNAME\"]\n", - "rel_path = os.getcwd()[6:] + '/artifacts'\n", - "\n", - "base_input_stream = os.path.join(user,rel_path) + \"/inputs_stream\"\n", - "base_output_stream = os.path.join(user,rel_path) + \"/output_stream\"\n", - "input_stream = os.path.join(container,base_input_stream)\n", - "output_stream = os.path.join(container,user,rel_path) + \"/output_stream\"\n", - "tsdb_path = os.path.join(container,user,rel_path) + \"/output_tsdb\"\n", - "\n", - "stream_consumer_group = 'cg45'" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "import v3io.dataplane\n", - "\n", - "client = v3io.dataplane.Client()\n", - "response = client.stream.create(container = container,\n", - " stream_path=base_input_stream,\n", - " shard_count=1,\n", - " raise_for_status = v3io.dataplane.RaiseForStatus.never)\n", - "response.raise_for_status([409, 204])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Importing the function**" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2021-10-25 10:27:04,105 [info] created and saved project function-marketplace\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Importing the function\n", - "import mlrun\n", - "mlrun.set_environment(project='function-marketplace')\n", - "\n", - "fn = mlrun.import_function(\"hub://concept_drift:development\")\n", - "fn.apply(mlrun.auto_mount())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Running the function remotely**" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2021-10-25 10:27:04,567 [info] starting run concept_drift uid=fa07c222e77d4eac86d2ce9317aaded1 DB=http://mlrun-api:8080\n", - "> 2021-10-25 10:27:04,709 [info] Job is running in the background, pod: concept-drift-ggxgb\n", - "> 2021-10-25 10:27:11,199 [info] Loading base dataset\n", - "> 2021-10-25 10:27:13,227 [info] Creating models\n", - "> 2021-10-25 10:27:13,227 [info] Streaming data to models\n", - "> 2021-10-25 10:27:13,347 [info] Logging ready models\n", - "> 2021-10-25 10:27:13,487 [info] Deploying Concept Drift Streaming function\n", - "> 2021-10-25 10:27:13,490 [info] Starting remote function deploy\n", - "2021-10-25 10:27:13 (info) Deploying function\n", - "2021-10-25 10:27:13 (info) Building\n", - "2021-10-25 10:27:13 (info) Staging files and preparing base images\n", - "2021-10-25 10:27:13 (info) Building processor image\n", - "2021-10-25 10:27:15 (info) Build complete\n", - "2021-10-25 10:27:21 (info) Function deploy complete\n", - "> 2021-10-25 10:27:21,797 [info] successfully deployed function: {'internal_invocation_urls': ['nuclio-function-marketplace-concept-drift-streaming.default-tenant.svc.cluster.local:8080'], 'external_invocation_urls': ['default-tenant.app.dev39.lab.iguazeng.com:31143']}\n", - "> 2021-10-25 10:27:21,868 [info] run executed, status=completed\n", - "final state: completed\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
projectuiditerstartstatenamelabelsinputsparametersresultsartifacts
function-marketplace0Oct 25 10:27:10completedconcept_drift
v3io_user=dani
kind=job
owner=dani
host=concept-drift-ggxgb
base_dataset
input_stream=/users/dani/test/functions/concept_drift/artifacts/inputs_stream
consumer_group=cg45
output_stream=/users/dani/test/functions/concept_drift/artifacts/output_stream
output_tsdb=/users/dani/test/functions/concept_drift/artifacts/output_tsdb
tsdb_batch_size=1
models=['ddm', 'eddm', 'pagehinkley']
label_col=class
prediction_col=predicted_col
fn_tag=development
eddm_concept_drift
pagehinkley_concept_drift
ddm_concept_drift
\n", - "
\n", - "
\n", - "
\n", - " Title\n", - " ×\n", - "
\n", - " \n", - "
\n", - "
\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - }, - { - "data": { - "text/html": [ - " > to track results use the .show() or .logs() methods or click here to open in UI" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2021-10-25 10:27:23,031 [info] run executed, status=completed\n" - ] - } - ], - "source": [ - "drift_run = fn.run(name='concept_drift',\n", - " params={'input_stream' : input_stream,\n", - " 'consumer_group' : stream_consumer_group,\n", - " 'output_stream' : output_stream,\n", - " 'output_tsdb' : tsdb_path,\n", - " 'tsdb_batch_size' : 1,\n", - " 'models' : ['ddm', 'eddm', 'pagehinkley'], # defaults\n", - " 'label_col' : 'class',\n", - " 'prediction_col' : 'predicted_col',\n", - " 'fn_tag' : 'development'},\n", - " inputs={'base_dataset' : predicted_train_path},\n", - " artifact_path = os.path.join(os.getcwd(), 'artifacts'))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Testing the function**\n", - "> Mark that we are testing the deployed function - concept_drift_streaming" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'data': '{\"class\": 1.0, \"request\": {\"instances\": [{\"X1\": 0.0, \"X2\": 0.0, \"X3\": 0.0634475073, \"X4\": 0.4136568818}]}, \"resp\": [1], \"when\": \"2021-10-25 10:27:23.152584\", \"model\": \"sklearn.ensemble.RandomForestClassifier\"}'}" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import json\n", - "import datetime\n", - "\n", - "# Reshaping the data to V3IOStream format.\n", - "def restructure_stream_event(context, event):\n", - " instances = [dict()]\n", - " for key in predicted_test.keys():\n", - " if key not in ['when', 'class', 'model', 'worker', 'hostname', 'predicted_col']:\n", - " instances[0].update({key: event.pop(key)})\n", - " event['request'] = {'instances': instances}\n", - " event['resp'] = [int(event.pop('predicted_col'))]\n", - " event['when'] = datetime.datetime.strftime(datetime.datetime.now(), format=\"%Y-%m-%d %H:%M:%S.%f\")\n", - " event['model'] = 'sklearn.ensemble.RandomForestClassifier'\n", - " return event\n", - " \n", - " \n", - "records = json.loads(predicted_test.to_json(orient='records'))\n", - "records = [{'data': json.dumps(restructure_stream_event(context, record))} for record in records]\n", - "\n", - "# showing first record\n", - "records[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "# Creating v3io client\n", - "v3io_client = v3io.dataplane.Client()\n", - "\n", - "# Pushing some undrifted data to the input stream\n", - "response = v3io_client.stream.put_records(container=container,\n", - " stream_path=base_input_stream, \n", - " records=records[4900:5100])" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'SequenceNumber': 200,\n", - " 'Data': 'eyJjbGFzcyI6IDAuMCwgInJlcXVlc3QiOiB7Imluc3RhbmNlcyI6IFt7IlgxIjogMC4wLCAiWDIiOiAwLjAsICJYMyI6IDAuMzMzMTYzNjk4OSwgIlg0IjogMC40MjE2NzY1Njg3fV19LCAicmVzcCI6IFsxXSwgIndoZW4iOiAiMjAyMS0xMC0yNSAxMDoyNzoyMy4yOTM3OTgiLCAibW9kZWwiOiAic2tsZWFybi5lbnNlbWJsZS5SYW5kb21Gb3Jlc3RDbGFzc2lmaWVyIn0=',\n", - " 'ArrivalTimeSec': 1635157644,\n", - " 'ArrivalTimeNSec': 395309631}" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Getting earliest location in the shard\n", - "location = json.loads(v3io_client.stream.seek(container=container,\n", - " stream_path=base_input_stream,\n", - " shard_id=0,\n", - " seek_type='EARLIEST').body)['Location']\n", - "# Getting records from input stream\n", - "response = v3io_client.stream.get_records(container=container,\n", - " stream_path=base_input_stream,\n", - " shard_id=0, location=location)\n", - "# Showing the last sequence that is written to the input stream\n", - "json.loads(response.body)['Records'][-1]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Make sure some time has passed - the function needs to be triggered by the input stream, then it'll write to the output stream" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "# Getting earliest location in the shard\n", - "location = json.loads(v3io_client.stream.seek(container=container,\n", - " stream_path=base_output_stream,\n", - " shard_id=0,\n", - " seek_type='EARLIEST').body)['Location']\n", - "# Getting records from output stream\n", - "response = v3io_client.stream.get_records(container=container,\n", - " stream_path=base_output_stream,\n", - " shard_id=0, location=location)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "sequence number : 106, data : {'class': 0.0, 'request': {'instances': [{'X1': 0.0, 'X2': 0.0, 'X3': 0.9628473804, 'X4': 0.5792453402}]}, 'resp': [1], 'when': '2021-10-25 10:27:23.291145', 'model': 'sklearn.ensemble.RandomForestClassifier', 'ddm_warning_zone': 0, 'ddm_drift': 1, 'eddm_warning_zone': 0, 'eddm_drift': 0}\n", - "sequence number : 122, data : {'class': 0.0, 'request': {'instances': [{'X1': 0.0, 'X2': 0.0, 'X3': 0.4969765505, 'X4': 0.9784738351}]}, 'resp': [1], 'when': '2021-10-25 10:27:23.291558', 'model': 'sklearn.ensemble.RandomForestClassifier', 'ddm_warning_zone': 0, 'ddm_drift': 0, 'eddm_warning_zone': 0, 'eddm_drift': 1}\n" - ] - } - ], - "source": [ - "# Showing changed detected\n", - "import base64\n", - "for instance in json.loads(response.body)['Records']:\n", - " seq = instance[\"SequenceNumber\"]\n", - " data = json.loads(base64.b64decode(instance['Data']))\n", - " if(data['ddm_drift']==1 or data['eddm_drift']==1):\n", - " print(f'sequence number : {seq}, data : {data}')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can see that the system detected a change in the 106 instance, which is 10006 instance in the real dataset -
\n", - "5000 first instances are for train, we started pushing data from the 4900 instance of the test dataset (9900 from the real dataset), and we pushed only 200 instances.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "[Back to the top](#Concept-Drift---Deployer)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python [conda env:root] *", - "language": "python", - "name": "conda-root-py" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/concept_drift/concept_drift.py b/concept_drift/concept_drift.py deleted file mode 100644 index 03355d3b5..000000000 --- a/concept_drift/concept_drift.py +++ /dev/null @@ -1,147 +0,0 @@ -# Copyright 2019 Iguazio -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Generated by nuclio.export.NuclioExporter - -import skmultiflow.drift_detection # We will grab our PH, DDM, EDDM algorithms from here -import numpy as np -import pandas as pd -import os -from cloudpickle import dumps, load, dump - -from nuclio.triggers import V3IOStreamTrigger -from mlrun import DataItem, import_function, mlconf, MLClientCtx, mount_v3io - -import random - - -def concept_drift_deployer( - context: MLClientCtx, - base_dataset: DataItem, - input_stream: str, - consumer_group: str, - output_stream: str, - output_tsdb: str, - tsdb_batch_size: int, - callbacks: list, - models: list = ["ddm", "eddm", "pagehinkley"], - models_dest="models", - pagehinkley_threshold: float = 10, - ddm_warning_level: float = 2, - ddm_out_control_level: float = 3, - label_col="label", - prediction_col="prediction", - hub_url: str = mlconf.hub_url, - fn_tag: str = "master", -): - """Deploy a streaming Concept Drift detector on a labeled stream - This function is the Deployment step for the Streaming Concept Drift Detector. - It will load the selected drift detectors and initialize them with the - base_dataset's statistics. Then it will deploy the concept_drift_streaming - function and pass the models to it for streaming concept-drift detection on top - of a labeled stream. - - :param context: MLRun context - :param base_dataset: Dataset containing label_col and prediction_col to initialize the detectors - :param input_stream: labeled stream to track. - Should contain label_col and prediction_col - :param output_stream: Output stream to push the detector's alerts - :param output_tsdb: Output TSDB table to allow analysis and display - :param tsdb_batch_size: Batch size of alerts to buffer before pushing to the TSDB - :param callbacks: Additional rest endpoints to send the alert data to - :param models: List of the detectors to deploy - Defaults to ['ddm', 'eddm', 'pagehinkley']. - :param models_dest: Location for saving the detectors - Defaults to 'models' (in relation to artifact_path). - :param pagehinkley_threshold: Drift level threshold for PH detector Defaults to 10. - :param ddm_warning_level: Warning level alert for DDM detector Defaults to 2. - :param ddm_out_control_level: Drift level alert for DDM detector Defaults to 3. - :param label_col: Label column to be used on base_dataset and input_stream - Defaults to 'label'. - :param prediction_col: Prediction column to be used on base_dataset and input_stream - Defaults to 'prediction'. - :param hub_url: hub_url in case the default is not used, concept_drift_streaming will be loaded - by this url - Defaults to mlconf.hub_url. - :param fn_tag: hub tag to use - Defaults to 'master' - """ - - mlconf.dbpath = mlconf.dbpath or "http://mlrun-api:8080" - mlconf.hub_url = hub_url - fn = import_function(url=f"hub://concept_drift_streaming:{fn_tag}") - - context.logger.info("Loading base dataset") - base_df = base_dataset.as_df() - error_stream = np.where( - base_df[prediction_col].values == base_df[label_col].values, 0, 1 - ) - - context.logger.info("Creating models") - models = [ - model.strip() - for model in os.getenv("models", "pagehinkley, ddm, eddm").split(",") - ] - models = { - "eddm": skmultiflow.drift_detection.EDDM(), - "pagehinkley": skmultiflow.drift_detection.PageHinkley( - min_instances=len(error_stream), threshold=pagehinkley_threshold - ), - "ddm": skmultiflow.drift_detection.DDM( - min_num_instances=len(error_stream), - warning_level=ddm_warning_level, - out_control_level=ddm_out_control_level, - ), - } - - context.logger.info("Streaming data to models") - for i in range(len(error_stream)): - for model_name, model in models.items(): - model.add_element(error_stream[i]) - - context.logger.info("Logging ready models") - for name, model in models.items(): - data = dumps(model) - model_file = f"{name}.pkl" - context.log_model( - f"{name}_concept_drift", - body=data, - labels={"framework": "skmultiflow", "workflow": "concept-drift"}, - model_file=model_file, - model_dir=models_dest, - tag="latest", - ) - fn.set_envs( - { - f"{name}_model_path": os.path.join( - context.artifact_path, models_dest, model_file - ) - } - ) - - context.logger.info("Deploying Concept Drift Streaming function") - fn.set_envs( - { - "label_col": label_col, - "prediction_col": prediction_col, - "drift_stream": output_stream, - "tsdb_table": output_tsdb, - "pagehinkley_threshold": pagehinkley_threshold, - "ddm_warning_level": ddm_warning_level, - "ddm_out_control": ddm_out_control_level, - } - ) - fn.add_v3io_stream_trigger(stream_path = input_stream, name = 'stream', group = consumer_group) - fn.apply(mount_v3io()) - fn.deploy(project=context.project) diff --git a/concept_drift/function.yaml b/concept_drift/function.yaml deleted file mode 100644 index 071111c78..000000000 --- a/concept_drift/function.yaml +++ /dev/null @@ -1,112 +0,0 @@ -kind: job -metadata: - name: concept-drift - tag: '' - hash: 935da41196802875e19948974f32b6f00c29feb2 - project: '' - labels: - author: orz - framework: sklearn - categories: - - machine-learning - - model-serving -spec: - command: '' - args: [] - image: mlrun/ml-models - env: [] - default_handler: concept_drift_deployer - entry_points: - concept_drift_deployer: - name: concept_drift_deployer - doc: "Deploy a streaming Concept Drift detector on a labeled stream\n This\ - \ function is the Deployment step for the Streaming Concept Drift Detector.\n\ - \ It will load the selected drift detectors and initialize them with the\n\ - \ base_dataset's statistics. Then it will deploy the concept_drift_streaming\n\ - \ function and pass the models to it for streaming concept-drift detection\ - \ on top\n of a labeled stream." - parameters: - - name: context - type: MLClientCtx - doc: MLRun context - default: '' - - name: base_dataset - type: DataItem - doc: Dataset containing label_col and prediction_col to initialize the detectors - default: '' - - name: input_stream - type: str - doc: labeled stream to track. Should contain label_col and prediction_col - default: '' - - name: consumer_group - type: str - default: '' - - name: output_stream - type: str - doc: Output stream to push the detector's alerts - default: '' - - name: output_tsdb - type: str - doc: Output TSDB table to allow analysis and display - default: '' - - name: tsdb_batch_size - type: int - doc: Batch size of alerts to buffer before pushing to the TSDB - default: '' - - name: callbacks - type: list - doc: Additional rest endpoints to send the alert data to - default: '' - - name: models - type: list - doc: List of the detectors to deploy Defaults to ['ddm', 'eddm', 'pagehinkley']. - default: - - ddm - - eddm - - pagehinkley - - name: models_dest - doc: Location for saving the detectors Defaults to 'models' (in relation to - artifact_path). - default: models - - name: pagehinkley_threshold - type: float - doc: Drift level threshold for PH detector Defaults to 10. - default: 10 - - name: ddm_warning_level - type: float - doc: Warning level alert for DDM detector Defaults to 2. - default: 2 - - name: ddm_out_control_level - type: float - doc: Drift level alert for DDM detector Defaults to 3. - default: 3 - - name: label_col - doc: Label column to be used on base_dataset and input_stream Defaults to - 'label'. - default: label - - name: prediction_col - doc: Prediction column to be used on base_dataset and input_stream Defaults - to 'prediction'. - default: prediction - - name: hub_url - type: str - doc: hub_url in case the default is not used, concept_drift_streaming will - be loaded by this url Defaults to mlconf.hub_url. - default: <_ast.Name object at 0x7f48eda946d0> - - name: fn_tag - type: str - doc: hub tag to use Defaults to 'master' - default: master - outputs: - - default: '' - lineno: 15 - description: Deploy a streaming Concept Drift detector on a labeled stream - build: - functionSourceCode: IyBHZW5lcmF0ZWQgYnkgbnVjbGlvLmV4cG9ydC5OdWNsaW9FeHBvcnRlcgoKaW1wb3J0IHNrbXVsdGlmbG93LmRyaWZ0X2RldGVjdGlvbiAgIyBXZSB3aWxsIGdyYWIgb3VyIFBILCBERE0sIEVERE0gYWxnb3JpdGhtcyBmcm9tIGhlcmUKaW1wb3J0IG51bXB5IGFzIG5wCmltcG9ydCBwYW5kYXMgYXMgcGQKaW1wb3J0IG9zCmZyb20gY2xvdWRwaWNrbGUgaW1wb3J0IGR1bXBzLCBsb2FkLCBkdW1wCgpmcm9tIG51Y2xpby50cmlnZ2VycyBpbXBvcnQgVjNJT1N0cmVhbVRyaWdnZXIKZnJvbSBtbHJ1biBpbXBvcnQgRGF0YUl0ZW0sIGltcG9ydF9mdW5jdGlvbiwgbWxjb25mLCBNTENsaWVudEN0eCwgbW91bnRfdjNpbwoKaW1wb3J0IHJhbmRvbQoKCmRlZiBjb25jZXB0X2RyaWZ0X2RlcGxveWVyKAogICAgY29udGV4dDogTUxDbGllbnRDdHgsCiAgICBiYXNlX2RhdGFzZXQ6IERhdGFJdGVtLAogICAgaW5wdXRfc3RyZWFtOiBzdHIsCiAgICBjb25zdW1lcl9ncm91cDogc3RyLAogICAgb3V0cHV0X3N0cmVhbTogc3RyLAogICAgb3V0cHV0X3RzZGI6IHN0ciwKICAgIHRzZGJfYmF0Y2hfc2l6ZTogaW50LAogICAgY2FsbGJhY2tzOiBsaXN0LAogICAgbW9kZWxzOiBsaXN0ID0gWyJkZG0iLCAiZWRkbSIsICJwYWdlaGlua2xleSJdLAogICAgbW9kZWxzX2Rlc3Q9Im1vZGVscyIsCiAgICBwYWdlaGlua2xleV90aHJlc2hvbGQ6IGZsb2F0ID0gMTAsCiAgICBkZG1fd2FybmluZ19sZXZlbDogZmxvYXQgPSAyLAogICAgZGRtX291dF9jb250cm9sX2xldmVsOiBmbG9hdCA9IDMsCiAgICBsYWJlbF9jb2w9ImxhYmVsIiwKICAgIHByZWRpY3Rpb25fY29sPSJwcmVkaWN0aW9uIiwKICAgIGh1Yl91cmw6IHN0ciA9IG1sY29uZi5odWJfdXJsLAogICAgZm5fdGFnOiBzdHIgPSAibWFzdGVyIiwKKToKICAgICIiIkRlcGxveSBhIHN0cmVhbWluZyBDb25jZXB0IERyaWZ0IGRldGVjdG9yIG9uIGEgbGFiZWxlZCBzdHJlYW0KICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdGhlIERlcGxveW1lbnQgc3RlcCBmb3IgdGhlIFN0cmVhbWluZyBDb25jZXB0IERyaWZ0IERldGVjdG9yLgogICAgICAgSXQgd2lsbCBsb2FkIHRoZSBzZWxlY3RlZCBkcmlmdCBkZXRlY3RvcnMgYW5kIGluaXRpYWxpemUgdGhlbSB3aXRoIHRoZQogICAgICAgYmFzZV9kYXRhc2V0J3Mgc3RhdGlzdGljcy4gIFRoZW4gaXQgd2lsbCBkZXBsb3kgdGhlIGNvbmNlcHRfZHJpZnRfc3RyZWFtaW5nCiAgICAgICBmdW5jdGlvbiBhbmQgcGFzcyB0aGUgbW9kZWxzIHRvIGl0IGZvciBzdHJlYW1pbmcgY29uY2VwdC1kcmlmdCBkZXRlY3Rpb24gb24gdG9wCiAgICAgICBvZiBhIGxhYmVsZWQgc3RyZWFtLgoKICAgIDpwYXJhbSBjb250ZXh0OiAgICAgICAgIE1MUnVuIGNvbnRleHQKICAgIDpwYXJhbSBiYXNlX2RhdGFzZXQ6ICAgIERhdGFzZXQgY29udGFpbmluZyBsYWJlbF9jb2wgYW5kIHByZWRpY3Rpb25fY29sIHRvIGluaXRpYWxpemUgdGhlIGRldGVjdG9ycwogICAgOnBhcmFtIGlucHV0X3N0cmVhbTogICAgbGFiZWxlZCBzdHJlYW0gdG8gdHJhY2suCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG91bGQgY29udGFpbiBsYWJlbF9jb2wgYW5kIHByZWRpY3Rpb25fY29sCiAgICA6cGFyYW0gb3V0cHV0X3N0cmVhbTogICBPdXRwdXQgc3RyZWFtIHRvIHB1c2ggdGhlIGRldGVjdG9yJ3MgYWxlcnRzCiAgICA6cGFyYW0gb3V0cHV0X3RzZGI6ICAgICBPdXRwdXQgVFNEQiB0YWJsZSB0byBhbGxvdyBhbmFseXNpcyBhbmQgZGlzcGxheQogICAgOnBhcmFtIHRzZGJfYmF0Y2hfc2l6ZTogQmF0Y2ggc2l6ZSBvZiBhbGVydHMgdG8gYnVmZmVyIGJlZm9yZSBwdXNoaW5nIHRvIHRoZSBUU0RCCiAgICA6cGFyYW0gY2FsbGJhY2tzOiAgICAgICBBZGRpdGlvbmFsIHJlc3QgZW5kcG9pbnRzIHRvIHNlbmQgdGhlIGFsZXJ0IGRhdGEgdG8KICAgIDpwYXJhbSBtb2RlbHM6ICAgICAgICAgIExpc3Qgb2YgdGhlIGRldGVjdG9ycyB0byBkZXBsb3kKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvIFsnZGRtJywgJ2VkZG0nLCAncGFnZWhpbmtsZXknXS4KICAgIDpwYXJhbSBtb2RlbHNfZGVzdDogICAgIExvY2F0aW9uIGZvciBzYXZpbmcgdGhlIGRldGVjdG9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8gJ21vZGVscycgKGluIHJlbGF0aW9uIHRvIGFydGlmYWN0X3BhdGgpLgogICAgOnBhcmFtIHBhZ2VoaW5rbGV5X3RocmVzaG9sZDogIERyaWZ0IGxldmVsIHRocmVzaG9sZCBmb3IgUEggZGV0ZWN0b3IgRGVmYXVsdHMgdG8gMTAuCiAgICA6cGFyYW0gZGRtX3dhcm5pbmdfbGV2ZWw6ICAgICAgV2FybmluZyBsZXZlbCBhbGVydCBmb3IgRERNIGRldGVjdG9yIERlZmF1bHRzIHRvIDIuCiAgICA6cGFyYW0gZGRtX291dF9jb250cm9sX2xldmVsOiAgRHJpZnQgbGV2ZWwgYWxlcnQgZm9yIERETSBkZXRlY3RvciBEZWZhdWx0cyB0byAzLgogICAgOnBhcmFtIGxhYmVsX2NvbDogICAgICAgTGFiZWwgY29sdW1uIHRvIGJlIHVzZWQgb24gYmFzZV9kYXRhc2V0IGFuZCBpbnB1dF9zdHJlYW0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvICdsYWJlbCcuCiAgICA6cGFyYW0gcHJlZGljdGlvbl9jb2w6ICBQcmVkaWN0aW9uIGNvbHVtbiB0byBiZSB1c2VkIG9uIGJhc2VfZGF0YXNldCBhbmQgaW5wdXRfc3RyZWFtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byAncHJlZGljdGlvbicuCiAgICA6cGFyYW0gaHViX3VybDogICAgICAgICBodWJfdXJsIGluIGNhc2UgdGhlIGRlZmF1bHQgaXMgbm90IHVzZWQsIGNvbmNlcHRfZHJpZnRfc3RyZWFtaW5nIHdpbGwgYmUgbG9hZGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSB0aGlzIHVybAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8gbWxjb25mLmh1Yl91cmwuCiAgICA6cGFyYW0gZm5fdGFnOiAgICAgICAgICBodWIgdGFnIHRvIHVzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8gJ21hc3RlcicKICAgICIiIgoKICAgIG1sY29uZi5kYnBhdGggPSBtbGNvbmYuZGJwYXRoIG9yICJodHRwOi8vbWxydW4tYXBpOjgwODAiCiAgICBtbGNvbmYuaHViX3VybCA9IGh1Yl91cmwKICAgIGZuID0gaW1wb3J0X2Z1bmN0aW9uKHVybD1mImh1YjovL2NvbmNlcHRfZHJpZnRfc3RyZWFtaW5nOntmbl90YWd9IikKCiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKCJMb2FkaW5nIGJhc2UgZGF0YXNldCIpCiAgICBiYXNlX2RmID0gYmFzZV9kYXRhc2V0LmFzX2RmKCkKICAgIGVycm9yX3N0cmVhbSA9IG5wLndoZXJlKAogICAgICAgIGJhc2VfZGZbcHJlZGljdGlvbl9jb2xdLnZhbHVlcyA9PSBiYXNlX2RmW2xhYmVsX2NvbF0udmFsdWVzLCAwLCAxCiAgICApCgogICAgY29udGV4dC5sb2dnZXIuaW5mbygiQ3JlYXRpbmcgbW9kZWxzIikKICAgIG1vZGVscyA9IFsKICAgICAgICBtb2RlbC5zdHJpcCgpCiAgICAgICAgZm9yIG1vZGVsIGluIG9zLmdldGVudigibW9kZWxzIiwgInBhZ2VoaW5rbGV5LCBkZG0sIGVkZG0iKS5zcGxpdCgiLCIpCiAgICBdCiAgICBtb2RlbHMgPSB7CiAgICAgICAgImVkZG0iOiBza211bHRpZmxvdy5kcmlmdF9kZXRlY3Rpb24uRURETSgpLAogICAgICAgICJwYWdlaGlua2xleSI6IHNrbXVsdGlmbG93LmRyaWZ0X2RldGVjdGlvbi5QYWdlSGlua2xleSgKICAgICAgICAgICAgbWluX2luc3RhbmNlcz1sZW4oZXJyb3Jfc3RyZWFtKSwgdGhyZXNob2xkPXBhZ2VoaW5rbGV5X3RocmVzaG9sZAogICAgICAgICksCiAgICAgICAgImRkbSI6IHNrbXVsdGlmbG93LmRyaWZ0X2RldGVjdGlvbi5ERE0oCiAgICAgICAgICAgIG1pbl9udW1faW5zdGFuY2VzPWxlbihlcnJvcl9zdHJlYW0pLAogICAgICAgICAgICB3YXJuaW5nX2xldmVsPWRkbV93YXJuaW5nX2xldmVsLAogICAgICAgICAgICBvdXRfY29udHJvbF9sZXZlbD1kZG1fb3V0X2NvbnRyb2xfbGV2ZWwsCiAgICAgICAgKSwKICAgIH0KCiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKCJTdHJlYW1pbmcgZGF0YSB0byBtb2RlbHMiKQogICAgZm9yIGkgaW4gcmFuZ2UobGVuKGVycm9yX3N0cmVhbSkpOgogICAgICAgIGZvciBtb2RlbF9uYW1lLCBtb2RlbCBpbiBtb2RlbHMuaXRlbXMoKToKICAgICAgICAgICAgbW9kZWwuYWRkX2VsZW1lbnQoZXJyb3Jfc3RyZWFtW2ldKQoKICAgIGNvbnRleHQubG9nZ2VyLmluZm8oIkxvZ2dpbmcgcmVhZHkgbW9kZWxzIikKICAgIGZvciBuYW1lLCBtb2RlbCBpbiBtb2RlbHMuaXRlbXMoKToKICAgICAgICBkYXRhID0gZHVtcHMobW9kZWwpCiAgICAgICAgbW9kZWxfZmlsZSA9IGYie25hbWV9LnBrbCIKICAgICAgICBjb250ZXh0LmxvZ19tb2RlbCgKICAgICAgICAgICAgZiJ7bmFtZX1fY29uY2VwdF9kcmlmdCIsCiAgICAgICAgICAgIGJvZHk9ZGF0YSwKICAgICAgICAgICAgbGFiZWxzPXsiZnJhbWV3b3JrIjogInNrbXVsdGlmbG93IiwgIndvcmtmbG93IjogImNvbmNlcHQtZHJpZnQifSwKICAgICAgICAgICAgbW9kZWxfZmlsZT1tb2RlbF9maWxlLAogICAgICAgICAgICBtb2RlbF9kaXI9bW9kZWxzX2Rlc3QsCiAgICAgICAgICAgIHRhZz0ibGF0ZXN0IiwKICAgICAgICApCiAgICAgICAgZm4uc2V0X2VudnMoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGYie25hbWV9X21vZGVsX3BhdGgiOiBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5hcnRpZmFjdF9wYXRoLCBtb2RlbHNfZGVzdCwgbW9kZWxfZmlsZQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgIGNvbnRleHQubG9nZ2VyLmluZm8oIkRlcGxveWluZyBDb25jZXB0IERyaWZ0IFN0cmVhbWluZyBmdW5jdGlvbiIpCiAgICBmbi5zZXRfZW52cygKICAgICAgICB7CiAgICAgICAgICAgICJsYWJlbF9jb2wiOiBsYWJlbF9jb2wsCiAgICAgICAgICAgICJwcmVkaWN0aW9uX2NvbCI6IHByZWRpY3Rpb25fY29sLAogICAgICAgICAgICAiZHJpZnRfc3RyZWFtIjogb3V0cHV0X3N0cmVhbSwKICAgICAgICAgICAgInRzZGJfdGFibGUiOiBvdXRwdXRfdHNkYiwKICAgICAgICAgICAgInBhZ2VoaW5rbGV5X3RocmVzaG9sZCI6IHBhZ2VoaW5rbGV5X3RocmVzaG9sZCwKICAgICAgICAgICAgImRkbV93YXJuaW5nX2xldmVsIjogZGRtX3dhcm5pbmdfbGV2ZWwsCiAgICAgICAgICAgICJkZG1fb3V0X2NvbnRyb2wiOiBkZG1fb3V0X2NvbnRyb2xfbGV2ZWwsCiAgICAgICAgfQogICAgKQogICAgZm4uYWRkX3YzaW9fc3RyZWFtX3RyaWdnZXIoc3RyZWFtX3BhdGggPSBpbnB1dF9zdHJlYW0sIG5hbWUgPSAnc3RyZWFtJywgZ3JvdXAgPSBjb25zdW1lcl9ncm91cCkKICAgIGZuLmFwcGx5KG1vdW50X3YzaW8oKSkKICAgIGZuLmRlcGxveShwcm9qZWN0PWNvbnRleHQucHJvamVjdCkK - commands: - - python -m pip install scikit-multiflow - code_origin: https://github.com/daniels290813/functions.git#82bbfde4afa2eae77059e05c70bbebacf530fd0d:/User/test/functions/concept_drift/concept_drift.py - origin_filename: /User/test/functions/concept_drift/concept_drift.py - disable_auto_mount: false - affinity: null -verbose: false diff --git a/concept_drift/item.yaml b/concept_drift/item.yaml deleted file mode 100644 index 2ee37e386..000000000 --- a/concept_drift/item.yaml +++ /dev/null @@ -1,27 +0,0 @@ -apiVersion: v1 -categories: -- machine-learning -- model-serving -description: Deploy a streaming Concept Drift detector on a labeled stream -doc: '' -example: concept_drift.ipynb -generationDate: 2022-08-28:17-25 -hidden: false -icon: '' -labels: - author: orz - framework: sklearn -maintainers: [] -marketplaceType: '' -mlrunVersion: 1.1.0 -name: concept-drift -platformVersion: 3.5.0 -spec: - filename: concept_drift.py - handler: concept_drift_deployer - image: mlrun/ml-models - kind: job - requirements: - - scikit-multiflow -url: '' -version: 1.1.0 diff --git a/concept_drift/requirements.txt b/concept_drift/requirements.txt deleted file mode 100644 index fa0fddd88..000000000 --- a/concept_drift/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -skmultiflow \ No newline at end of file diff --git a/concept_drift_streaming/concept_drift_streaming.ipynb b/concept_drift_streaming/concept_drift_streaming.ipynb deleted file mode 100644 index b916cb7a2..000000000 --- a/concept_drift_streaming/concept_drift_streaming.ipynb +++ /dev/null @@ -1,480 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Concept Drift Streaming" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import nuclio" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "from pprint import pprint" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "%%nuclio cmd -c\n", - "python -m pip install scikit-multiflow==0.4.1\n", - "python -m pip install v3io_frames" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "%nuclio: setting kind to 'nuclio'\n", - "%nuclio: setting spec.build.baseImage to 'mlrun/ml-models'\n" - ] - } - ], - "source": [ - "# Define function spec\n", - "%nuclio config kind = \"nuclio\"\n", - "%nuclio config spec.build.baseImage = \"mlrun/ml-models\"\n", - "\n", - "# Add V3IO Mount\n", - "# %nuclio env %v3io" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "# nuclio: ignore\n", - "env = {'label_col': 'resp',\n", - " 'prediction_col': 'prediction',\n", - " 'drift_stream': '/bigdata/network-operations/drift_stream',\n", - " 'tsdb_table': 'network-operations/drift_tsdb',\n", - " 'pagehinkley_threshold': 10,\n", - " 'models': ['pagehinkley', 'ddm', 'eddm'],\n", - " 'window_size': 10}\n", - "config = {'kind': 'nuclio',\n", - " 'spec.build.baseImage': 'mlrun/ml-models'}\n", - "cmd = ['python -m pip install scikit-multiflow',\n", - " 'python -m pip install v3io_frames']\n", - "v3io = True\n", - "config = nuclio.ConfigSpec(env=env,\n", - " config=config,\n", - " cmd=cmd,\n", - " v3io=v3io)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "# nuclio: start-code" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "import skmultiflow.drift_detection\n", - "import numpy as np\n", - "import pandas as pd\n", - "import os\n", - "import json\n", - "import v3io.dataplane\n", - "import v3io_frames as v3f\n", - "import requests\n", - "from cloudpickle import load\n", - "\n", - "# For testing\n", - "import random" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "def split_path(mntpath=''):\n", - " if mntpath[0] == '/':\n", - " mntpath = mntpath[1:]\n", - " paths = mntpath.split('/')\n", - " container = paths[0]\n", - " subpath = ''\n", - " if len(paths) > 1:\n", - " subpath = mntpath[len(container):]\n", - " return container, subpath\n", - "\n", - "\n", - "def create_stream(context, path, shards=1):\n", - " # create a stream w/8 shards\n", - " container, stream_path = split_path(path)\n", - " context.logger.info(f'Creating stream in Container: {container} & Path {stream_path}')\n", - " response = context.v3io_client.create_stream(container=container,\n", - " path=stream_path, \n", - " shard_count=shards,\n", - " raise_for_status=v3io.dataplane.RaiseForStatus.never)\n", - " response.raise_for_status([409, 204])\n", - " \n", - " \n", - "def push_to_stream(context, stream_path, data):\n", - " records = [{'data': json.dumps(rec)} for rec in data]\n", - " container, stream_path = split_path(stream_path)\n", - " response = context.v3io_client.put_records(container=container,\n", - " path=stream_path, \n", - " records=records)\n", - "\n", - "\n", - "def construct_record(record):\n", - " label_col = os.getenv('label_col', 'label')\n", - " prediction_col = os.getenv('prediction_col', 'prediction')\n", - " res = dict([(k, record[k]) for k in ['when', 'class', 'model', 'resp', 'request']])\n", - " res['feature_vector'] = res.pop('request')['instances'][0]\n", - " res['timestamp'] = res.pop('when')\n", - " res['prediction'] = res['resp'][0]\n", - " return res" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "def init_context(context):\n", - " # create a v3io context object\n", - " v3io_client = v3io.dataplane.Client()\n", - " setattr(context, \"v3io_client\", v3io_client)\n", - " \n", - " # Setup windowing for TSDB writer\n", - " v3f_client = v3f.Client('framesd:8081', container='bigdata')\n", - " setattr(context, \"v3f\", v3f_client)\n", - " window = []\n", - " setattr(context, 'window', window)\n", - " setattr(context, 'window_size', int(os.getenv('window_size', 10)))\n", - " setattr(context, 'tsdb_table', os.getenv('tsdb_table', 'concept_drift_tsdb_1'))\n", - " try:\n", - " context.v3f.create('tsdb', context.tsdb_table, rate='1/s', if_exists=1)\n", - " except Exception as e:\n", - " context.logger.info(f'Creating context with rate= faile for {e}')\n", - " context.v3f.create('tsdb', context.tsdb_table, attrs={'rate': '1/s'}, if_exists=1)\n", - " \n", - " # Setup callbacks\n", - " callbacks = [callback.strip() for callback in os.getenv('callbacks', '').split(',')]\n", - " setattr(context, 'callbacks', callbacks)\n", - " \n", - " # Setup drift stream\n", - " setattr(context, 'drift_stream', os.getenv('drift_stream', '/bigdata/drift_stream'))\n", - " try:\n", - " create_stream(context, context.drift_stream, int(os.getenv('drift_stream_shards', 1)))\n", - " except:\n", - " context.logger.info(f'{context.drift_stream} already exists')\n", - " \n", - " # Load models\n", - " models = {}\n", - " model_types = ['pagehinkely', 'ddm', 'eddm']\n", - " path_suffix = '_model_path'\n", - " for model in model_types:\n", - " model_env = f'{model}{path_suffix}'\n", - " if model_env in os.environ:\n", - " with open(os.environ[model_env], 'rb') as f:\n", - " models[model] = load(f)\n", - " setattr(context, 'models', models)\n", - " \n", - " # Columns to check\n", - " setattr(context, 'label_col', os.getenv('label_col', 'label'))\n", - " setattr(context, 'prediction_col', os.getenv('prediction_col', 'prediction'))" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "def handler(context, event):\n", - " # Construct event\n", - " context.logger.info(f'event: {event.body}')\n", - " full_event = json.loads(event.body)\n", - " record = construct_record(full_event)\n", - " \n", - " # Is our prediction wrong?\n", - " is_error = record[context.label_col] != record[context.prediction_col]\n", - " context.logger.info(f'Adding {is_error}')\n", - " \n", - " # Process the {is_error} element with our algorithms\n", - " for name, model in context.models.items():\n", - " # Add element\n", - " results = {'timestamp': record['timestamp']}\n", - " results['algorithm'] = name\n", - " model.add_element(is_error)\n", - " \n", - " # Detect warning zone (if applicable to the algorithm)\n", - " if hasattr(model, 'detected_warning_zone') and model.detected_warning_zone():\n", - " context.logger.info(f'{name}\\tWarning zone detected')\n", - " results['warning_zone'] = 1\n", - " full_event[f'{name}_warning_zone'] = 1\n", - " else:\n", - " results['warning_zone'] = 0\n", - " full_event[f'{name}_warning_zone'] = 0\n", - " \n", - " # Detect drift\n", - " if model.detected_change():\n", - " context.logger.info('Change Detected')\n", - " results['change_detected'] = 1\n", - " full_event[f'{name}_drift'] = 1\n", - " else:\n", - " results['change_detected'] = 0\n", - " full_event[f'{name}_drift'] = 0\n", - " context.window.append(results)\n", - " \n", - " # Return results\n", - " # Write to stream\n", - " push_to_stream(context, context.drift_stream, [full_event])\n", - " \n", - " # Add to callbacks\n", - " if context.callbacks != ['']:\n", - " for callback in context.callbacks:\n", - " requests.post(url=callback,\n", - " json=full_event)\n", - " \n", - " if (len(context.window) / len(context.models)) >= context.window_size:\n", - " df = pd.DataFrame(context.window)\n", - " df['timestamp'] = pd.to_datetime(df['timestamp'])\n", - " df = df.set_index(['timestamp', 'algorithm'])\n", - " context.v3f.write('tsdb', context.tsdb_table, df)\n", - " context.window = []" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "# nuclio: end-code" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Test " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "init_context(context)\n", - "event = nuclio.Event(body=json.dumps({'prediction': 0,\n", - " 'when': 'now',\n", - " 'class': 'ClassModel', \n", - " 'model': 'tester_v1', \n", - " 'resp': [0], \n", - " 'request': {'instances': [[1, 1.2, 3]]}}))\n", - "out = handler(context, event)\n", - "out" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Cluster" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%nuclio deploy -n network-operations-concept-drift -p network-operations" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Save function yaml" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "from os import path\n", - "from mlrun import run_local, NewTask, mlconf, import_function, mount_v3io, code_to_function, get_run_db\n", - "mlconf.dbpath = mlconf.dbpath or 'http://mlrun-api:8080'" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[mlrun] 2020-07-14 13:49:22,720 function spec saved to path: /User/functions/concept_drift_streaming/function.yaml\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# create job function object from notebook code\n", - "fn = code_to_function(\"concept_drift_streaming\", kind='nuclio')\n", - "\n", - "# add metadata (for templates and reuse)\n", - "fn.spec.default_handler = \"handler\"\n", - "fn.spec.description = \"Deploy a streaming Concept Drift detector on a labeled stream. the nuclio part of the concept_drift function\"\n", - "fn.metadata.categories = [\"ml\", \"serve\"]\n", - "fn.metadata.labels = {\"author\": \"orz\", \"framework\": \"sklearn\"}\n", - "fn.export(\"/User/functions/concept_drift_streaming/function.yaml\")" - ] - }, - { - "cell_type": "code", - "execution_count": 120, - "metadata": {}, - "outputs": [], - "source": [ - "stream_trigger = nuclio.triggers.V3IOStreamTrigger(url='/bigdata/network-operations/inference_stream@cd2')" - ] - }, - { - "cell_type": "code", - "execution_count": 121, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 121, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "fn.add_trigger('labeled_stream', stream_trigger)" - ] - }, - { - "cell_type": "code", - "execution_count": 122, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 122, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "fn.apply(mount_v3io()).with_v3io()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "fn.export(\"function.yaml\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Stream testing" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [], - "source": [ - "fn = import_function('./function.yaml')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "fn.deploy(project='network-operations')" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.8" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/concept_drift_streaming/concept_drift_streaming.py b/concept_drift_streaming/concept_drift_streaming.py deleted file mode 100644 index ebcbf8a1b..000000000 --- a/concept_drift_streaming/concept_drift_streaming.py +++ /dev/null @@ -1,157 +0,0 @@ -# Copyright 2019 Iguazio -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Generated by nuclio.export.NuclioExporter - -import skmultiflow.drift_detection -import numpy as np -import pandas as pd -import os -import json -import v3io.dataplane -import v3io_frames as v3f -import requests -from cloudpickle import load - -import random - - -def split_path(mntpath=""): - if mntpath[0] == "/": - mntpath = mntpath[1:] - paths = mntpath.split("/") - container = paths[0] - subpath = "" - if len(paths) > 1: - subpath = mntpath[len(container) :] - return container, subpath - - -def create_stream(context, path, shards=1): - container, stream_path = split_path(path) - context.logger.info( - f"Creating stream in Container: {container} & Path {stream_path}" - ) - response = context.v3io_client.create_stream( - container=container, - path=stream_path, - shard_count=shards, - raise_for_status=v3io.dataplane.RaiseForStatus.never, - ) - response.raise_for_status([409, 204]) - - -def push_to_stream(context, stream_path, data): - records = [{"data": json.dumps(rec)} for rec in data] - container, stream_path = split_path(stream_path) - response = context.v3io_client.put_records( - container=container, path=stream_path, records=records - ) - - -def construct_record(record): - label_col = os.getenv("label_col", "label") - prediction_col = os.getenv("prediction_col", "prediction") - res = dict([(k, record[k]) for k in ["when", "class", "model", "resp", "request"]]) - res["feature_vector"] = res.pop("request")["instances"][0] - res["timestamp"] = res.pop("when") - res[prediction_col] = res["resp"][0] - return res - - -def init_context(context): - v3io_client = v3io.dataplane.Client() - setattr(context, "v3io_client", v3io_client) - - v3f_client = v3f.Client("framesd:8081", container="bigdata") - setattr(context, "v3f", v3f_client) - window = [] - setattr(context, "window", window) - setattr(context, "window_size", int(os.getenv("window_size", 10))) - setattr(context, "tsdb_table", os.getenv("tsdb_table", "concept_drift_tsdb_1")) - try: - context.v3f.create("tsdb", context.tsdb_table, rate="1/s", if_exists=1) - except Exception as e: - context.logger.info(f"Creating context with rate= faile for {e}") - context.v3f.create( - "tsdb", context.tsdb_table, attrs={"rate": "1/s"}, if_exists=1 - ) - - callbacks = [callback.strip() for callback in os.getenv("callbacks", "").split(",")] - setattr(context, "callbacks", callbacks) - - setattr(context, "drift_stream", os.getenv("drift_stream", "/bigdata/drift_stream")) - try: - create_stream( - context, context.drift_stream, int(os.getenv("drift_stream_shards", 1)) - ) - except: - context.logger.info(f"{context.drift_stream} already exists") - - models = {} - model_types = ["pagehinkely", "ddm", "eddm"] - path_suffix = "_model_path" - for model in model_types: - model_env = f"{model}{path_suffix}" - if model_env in os.environ: - with open(os.environ[model_env], "rb") as f: - models[model] = load(f) - setattr(context, "models", models) - - setattr(context, "label_col", os.getenv("label_col", "label")) - setattr(context, "prediction_col", os.getenv("prediction_col", "prediction")) - - -def handler(context, event): - context.logger.info(f"event: {event.body}") - full_event = json.loads(event.body) - record = construct_record(full_event) - - is_error = record[context.label_col] != record[context.prediction_col] - context.logger.info(f"Adding {is_error}") - - for name, model in context.models.items(): - results = {"timestamp": record["timestamp"]} - results["algorithm"] = name - model.add_element(is_error) - - if hasattr(model, "detected_warning_zone") and model.detected_warning_zone(): - context.logger.info(f"{name}\tWarning zone detected") - results["warning_zone"] = 1 - full_event[f"{name}_warning_zone"] = 1 - else: - results["warning_zone"] = 0 - full_event[f"{name}_warning_zone"] = 0 - - if model.detected_change(): - context.logger.info("Change Detected") - results["change_detected"] = 1 - full_event[f"{name}_drift"] = 1 - else: - results["change_detected"] = 0 - full_event[f"{name}_drift"] = 0 - context.window.append(results) - - push_to_stream(context, context.drift_stream, [full_event]) - - if context.callbacks != [""]: - for callback in context.callbacks: - requests.post(url=callback, json=full_event) - - if (len(context.window) / len(context.models)) >= context.window_size: - df = pd.DataFrame(context.window) - df["timestamp"] = pd.to_datetime(df["timestamp"]) - df = df.set_index(["timestamp", "algorithm"]) - context.v3f.write("tsdb", context.tsdb_table, df) - context.window = [] diff --git a/concept_drift_streaming/function.yaml b/concept_drift_streaming/function.yaml deleted file mode 100644 index 3001b1bf5..000000000 --- a/concept_drift_streaming/function.yaml +++ /dev/null @@ -1,48 +0,0 @@ -kind: remote -metadata: - name: concept-drift-streaming - tag: '' - hash: dc41ff41149be69f19b91a6d78a06571937063ae - project: '' - labels: - author: orz - framework: sklearn - categories: - - machine-learning - - monitoring -spec: - command: '' - args: [] - image: mlrun/ml-models - description: Deploy a streaming Concept Drift detector on a labeled stream. the - nuclio part of the concept_drift function - min_replicas: 1 - max_replicas: 4 - env: [] - base_spec: - apiVersion: nuclio.io/v1 - kind: Function - metadata: - name: concept-drift-streaming - labels: {} - annotations: - nuclio.io/generated_by: function generated from /User/test/functions/concept_drift_streaming/concept_drift_streaming.py - spec: - runtime: python:3.6 - handler: concept_drift_streaming:handler - env: [] - volumes: [] - build: - commands: [] - noBaseImagesPull: true - functionSourceCode: IyBHZW5lcmF0ZWQgYnkgbnVjbGlvLmV4cG9ydC5OdWNsaW9FeHBvcnRlcgoKaW1wb3J0IHNrbXVsdGlmbG93LmRyaWZ0X2RldGVjdGlvbgppbXBvcnQgbnVtcHkgYXMgbnAKaW1wb3J0IHBhbmRhcyBhcyBwZAppbXBvcnQgb3MKaW1wb3J0IGpzb24KaW1wb3J0IHYzaW8uZGF0YXBsYW5lCmltcG9ydCB2M2lvX2ZyYW1lcyBhcyB2M2YKaW1wb3J0IHJlcXVlc3RzCmZyb20gY2xvdWRwaWNrbGUgaW1wb3J0IGxvYWQKCmltcG9ydCByYW5kb20KCgpkZWYgc3BsaXRfcGF0aChtbnRwYXRoPSIiKToKICAgIGlmIG1udHBhdGhbMF0gPT0gIi8iOgogICAgICAgIG1udHBhdGggPSBtbnRwYXRoWzE6XQogICAgcGF0aHMgPSBtbnRwYXRoLnNwbGl0KCIvIikKICAgIGNvbnRhaW5lciA9IHBhdGhzWzBdCiAgICBzdWJwYXRoID0gIiIKICAgIGlmIGxlbihwYXRocykgPiAxOgogICAgICAgIHN1YnBhdGggPSBtbnRwYXRoW2xlbihjb250YWluZXIpIDpdCiAgICByZXR1cm4gY29udGFpbmVyLCBzdWJwYXRoCgoKZGVmIGNyZWF0ZV9zdHJlYW0oY29udGV4dCwgcGF0aCwgc2hhcmRzPTEpOgogICAgY29udGFpbmVyLCBzdHJlYW1fcGF0aCA9IHNwbGl0X3BhdGgocGF0aCkKICAgIGNvbnRleHQubG9nZ2VyLmluZm8oCiAgICAgICAgZiJDcmVhdGluZyBzdHJlYW0gaW4gQ29udGFpbmVyOiB7Y29udGFpbmVyfSAmIFBhdGgge3N0cmVhbV9wYXRofSIKICAgICkKICAgIHJlc3BvbnNlID0gY29udGV4dC52M2lvX2NsaWVudC5jcmVhdGVfc3RyZWFtKAogICAgICAgIGNvbnRhaW5lcj1jb250YWluZXIsCiAgICAgICAgcGF0aD1zdHJlYW1fcGF0aCwKICAgICAgICBzaGFyZF9jb3VudD1zaGFyZHMsCiAgICAgICAgcmFpc2VfZm9yX3N0YXR1cz12M2lvLmRhdGFwbGFuZS5SYWlzZUZvclN0YXR1cy5uZXZlciwKICAgICkKICAgIHJlc3BvbnNlLnJhaXNlX2Zvcl9zdGF0dXMoWzQwOSwgMjA0XSkKCgpkZWYgcHVzaF90b19zdHJlYW0oY29udGV4dCwgc3RyZWFtX3BhdGgsIGRhdGEpOgogICAgcmVjb3JkcyA9IFt7ImRhdGEiOiBqc29uLmR1bXBzKHJlYyl9IGZvciByZWMgaW4gZGF0YV0KICAgIGNvbnRhaW5lciwgc3RyZWFtX3BhdGggPSBzcGxpdF9wYXRoKHN0cmVhbV9wYXRoKQogICAgcmVzcG9uc2UgPSBjb250ZXh0LnYzaW9fY2xpZW50LnB1dF9yZWNvcmRzKAogICAgICAgIGNvbnRhaW5lcj1jb250YWluZXIsIHBhdGg9c3RyZWFtX3BhdGgsIHJlY29yZHM9cmVjb3JkcwogICAgKQoKCmRlZiBjb25zdHJ1Y3RfcmVjb3JkKHJlY29yZCk6CiAgICBsYWJlbF9jb2wgPSBvcy5nZXRlbnYoImxhYmVsX2NvbCIsICJsYWJlbCIpCiAgICBwcmVkaWN0aW9uX2NvbCA9IG9zLmdldGVudigicHJlZGljdGlvbl9jb2wiLCAicHJlZGljdGlvbiIpCiAgICByZXMgPSBkaWN0KFsoaywgcmVjb3JkW2tdKSBmb3IgayBpbiBbIndoZW4iLCAiY2xhc3MiLCAibW9kZWwiLCAicmVzcCIsICJyZXF1ZXN0Il1dKQogICAgcmVzWyJmZWF0dXJlX3ZlY3RvciJdID0gcmVzLnBvcCgicmVxdWVzdCIpWyJpbnN0YW5jZXMiXVswXQogICAgcmVzWyJ0aW1lc3RhbXAiXSA9IHJlcy5wb3AoIndoZW4iKQogICAgcmVzW3ByZWRpY3Rpb25fY29sXSA9IHJlc1sicmVzcCJdWzBdCiAgICByZXR1cm4gcmVzCgoKZGVmIGluaXRfY29udGV4dChjb250ZXh0KToKICAgIHYzaW9fY2xpZW50ID0gdjNpby5kYXRhcGxhbmUuQ2xpZW50KCkKICAgIHNldGF0dHIoY29udGV4dCwgInYzaW9fY2xpZW50IiwgdjNpb19jbGllbnQpCgogICAgdjNmX2NsaWVudCA9IHYzZi5DbGllbnQoImZyYW1lc2Q6ODA4MSIsIGNvbnRhaW5lcj0iYmlnZGF0YSIpCiAgICBzZXRhdHRyKGNvbnRleHQsICJ2M2YiLCB2M2ZfY2xpZW50KQogICAgd2luZG93ID0gW10KICAgIHNldGF0dHIoY29udGV4dCwgIndpbmRvdyIsIHdpbmRvdykKICAgIHNldGF0dHIoY29udGV4dCwgIndpbmRvd19zaXplIiwgaW50KG9zLmdldGVudigid2luZG93X3NpemUiLCAxMCkpKQogICAgc2V0YXR0cihjb250ZXh0LCAidHNkYl90YWJsZSIsIG9zLmdldGVudigidHNkYl90YWJsZSIsICJjb25jZXB0X2RyaWZ0X3RzZGJfMSIpKQogICAgdHJ5OgogICAgICAgIGNvbnRleHQudjNmLmNyZWF0ZSgidHNkYiIsIGNvbnRleHQudHNkYl90YWJsZSwgcmF0ZT0iMS9zIiwgaWZfZXhpc3RzPTEpCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgY29udGV4dC5sb2dnZXIuaW5mbyhmIkNyZWF0aW5nIGNvbnRleHQgd2l0aCByYXRlPSBmYWlsZSBmb3Ige2V9IikKICAgICAgICBjb250ZXh0LnYzZi5jcmVhdGUoCiAgICAgICAgICAgICJ0c2RiIiwgY29udGV4dC50c2RiX3RhYmxlLCBhdHRycz17InJhdGUiOiAiMS9zIn0sIGlmX2V4aXN0cz0xCiAgICAgICAgKQoKICAgIGNhbGxiYWNrcyA9IFtjYWxsYmFjay5zdHJpcCgpIGZvciBjYWxsYmFjayBpbiBvcy5nZXRlbnYoImNhbGxiYWNrcyIsICIiKS5zcGxpdCgiLCIpXQogICAgc2V0YXR0cihjb250ZXh0LCAiY2FsbGJhY2tzIiwgY2FsbGJhY2tzKQoKICAgIHNldGF0dHIoY29udGV4dCwgImRyaWZ0X3N0cmVhbSIsIG9zLmdldGVudigiZHJpZnRfc3RyZWFtIiwgIi9iaWdkYXRhL2RyaWZ0X3N0cmVhbSIpKQogICAgdHJ5OgogICAgICAgIGNyZWF0ZV9zdHJlYW0oCiAgICAgICAgICAgIGNvbnRleHQsIGNvbnRleHQuZHJpZnRfc3RyZWFtLCBpbnQob3MuZ2V0ZW52KCJkcmlmdF9zdHJlYW1fc2hhcmRzIiwgMSkpCiAgICAgICAgKQogICAgZXhjZXB0OgogICAgICAgIGNvbnRleHQubG9nZ2VyLmluZm8oZiJ7Y29udGV4dC5kcmlmdF9zdHJlYW19IGFscmVhZHkgZXhpc3RzIikKCiAgICBtb2RlbHMgPSB7fQogICAgbW9kZWxfdHlwZXMgPSBbInBhZ2VoaW5rZWx5IiwgImRkbSIsICJlZGRtIl0KICAgIHBhdGhfc3VmZml4ID0gIl9tb2RlbF9wYXRoIgogICAgZm9yIG1vZGVsIGluIG1vZGVsX3R5cGVzOgogICAgICAgIG1vZGVsX2VudiA9IGYie21vZGVsfXtwYXRoX3N1ZmZpeH0iCiAgICAgICAgaWYgbW9kZWxfZW52IGluIG9zLmVudmlyb246CiAgICAgICAgICAgIHdpdGggb3Blbihvcy5lbnZpcm9uW21vZGVsX2Vudl0sICJyYiIpIGFzIGY6CiAgICAgICAgICAgICAgICBtb2RlbHNbbW9kZWxdID0gbG9hZChmKQogICAgc2V0YXR0cihjb250ZXh0LCAibW9kZWxzIiwgbW9kZWxzKQoKICAgIHNldGF0dHIoY29udGV4dCwgImxhYmVsX2NvbCIsIG9zLmdldGVudigibGFiZWxfY29sIiwgImxhYmVsIikpCiAgICBzZXRhdHRyKGNvbnRleHQsICJwcmVkaWN0aW9uX2NvbCIsIG9zLmdldGVudigicHJlZGljdGlvbl9jb2wiLCAicHJlZGljdGlvbiIpKQoKCmRlZiBoYW5kbGVyKGNvbnRleHQsIGV2ZW50KToKICAgIGNvbnRleHQubG9nZ2VyLmluZm8oZiJldmVudDoge2V2ZW50LmJvZHl9IikKICAgIGZ1bGxfZXZlbnQgPSBqc29uLmxvYWRzKGV2ZW50LmJvZHkpCiAgICByZWNvcmQgPSBjb25zdHJ1Y3RfcmVjb3JkKGZ1bGxfZXZlbnQpCgogICAgaXNfZXJyb3IgPSByZWNvcmRbY29udGV4dC5sYWJlbF9jb2xdICE9IHJlY29yZFtjb250ZXh0LnByZWRpY3Rpb25fY29sXQogICAgY29udGV4dC5sb2dnZXIuaW5mbyhmIkFkZGluZyB7aXNfZXJyb3J9IikKCiAgICBmb3IgbmFtZSwgbW9kZWwgaW4gY29udGV4dC5tb2RlbHMuaXRlbXMoKToKICAgICAgICByZXN1bHRzID0geyJ0aW1lc3RhbXAiOiByZWNvcmRbInRpbWVzdGFtcCJdfQogICAgICAgIHJlc3VsdHNbImFsZ29yaXRobSJdID0gbmFtZQogICAgICAgIG1vZGVsLmFkZF9lbGVtZW50KGlzX2Vycm9yKQoKICAgICAgICBpZiBoYXNhdHRyKG1vZGVsLCAiZGV0ZWN0ZWRfd2FybmluZ196b25lIikgYW5kIG1vZGVsLmRldGVjdGVkX3dhcm5pbmdfem9uZSgpOgogICAgICAgICAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYie25hbWV9XHRXYXJuaW5nIHpvbmUgZGV0ZWN0ZWQiKQogICAgICAgICAgICByZXN1bHRzWyJ3YXJuaW5nX3pvbmUiXSA9IDEKICAgICAgICAgICAgZnVsbF9ldmVudFtmIntuYW1lfV93YXJuaW5nX3pvbmUiXSA9IDEKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXN1bHRzWyJ3YXJuaW5nX3pvbmUiXSA9IDAKICAgICAgICAgICAgZnVsbF9ldmVudFtmIntuYW1lfV93YXJuaW5nX3pvbmUiXSA9IDAKCiAgICAgICAgaWYgbW9kZWwuZGV0ZWN0ZWRfY2hhbmdlKCk6CiAgICAgICAgICAgIGNvbnRleHQubG9nZ2VyLmluZm8oIkNoYW5nZSBEZXRlY3RlZCIpCiAgICAgICAgICAgIHJlc3VsdHNbImNoYW5nZV9kZXRlY3RlZCJdID0gMQogICAgICAgICAgICBmdWxsX2V2ZW50W2Yie25hbWV9X2RyaWZ0Il0gPSAxCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzdWx0c1siY2hhbmdlX2RldGVjdGVkIl0gPSAwCiAgICAgICAgICAgIGZ1bGxfZXZlbnRbZiJ7bmFtZX1fZHJpZnQiXSA9IDAKICAgICAgICBjb250ZXh0LndpbmRvdy5hcHBlbmQocmVzdWx0cykKCiAgICBwdXNoX3RvX3N0cmVhbShjb250ZXh0LCBjb250ZXh0LmRyaWZ0X3N0cmVhbSwgW2Z1bGxfZXZlbnRdKQoKICAgIGlmIGNvbnRleHQuY2FsbGJhY2tzICE9IFsiIl06CiAgICAgICAgZm9yIGNhbGxiYWNrIGluIGNvbnRleHQuY2FsbGJhY2tzOgogICAgICAgICAgICByZXF1ZXN0cy5wb3N0KHVybD1jYWxsYmFjaywganNvbj1mdWxsX2V2ZW50KQoKICAgIGlmIChsZW4oY29udGV4dC53aW5kb3cpIC8gbGVuKGNvbnRleHQubW9kZWxzKSkgPj0gY29udGV4dC53aW5kb3dfc2l6ZToKICAgICAgICBkZiA9IHBkLkRhdGFGcmFtZShjb250ZXh0LndpbmRvdykKICAgICAgICBkZlsidGltZXN0YW1wIl0gPSBwZC50b19kYXRldGltZShkZlsidGltZXN0YW1wIl0pCiAgICAgICAgZGYgPSBkZi5zZXRfaW5kZXgoWyJ0aW1lc3RhbXAiLCAiYWxnb3JpdGhtIl0pCiAgICAgICAgY29udGV4dC52M2Yud3JpdGUoInRzZGIiLCBjb250ZXh0LnRzZGJfdGFibGUsIGRmKQogICAgICAgIGNvbnRleHQud2luZG93ID0gW10K - source: '' - build: - commands: - - python -m pip install scikit-multiflow==0.4.1 v3io_frames - code_origin: https://github.com/daniels290813/functions.git#d96059851b5d51fd4583e982483eb973fccc47d2:/User/test/functions/concept_drift_streaming/concept_drift_streaming.py - origin_filename: /User/test/functions/concept_drift_streaming/concept_drift_streaming.py - default_handler: handler - disable_auto_mount: false - affinity: null -verbose: false diff --git a/concept_drift_streaming/item.yaml b/concept_drift_streaming/item.yaml deleted file mode 100644 index 91dcb9f4f..000000000 --- a/concept_drift_streaming/item.yaml +++ /dev/null @@ -1,29 +0,0 @@ -apiVersion: v1 -categories: -- machine-learning -- monitoring -description: Deploy a streaming Concept Drift detector on a labeled stream. the nuclio - part of the concept_drift function -doc: '' -example: concept_drift_streaming.ipynb -generationDate: 2022-08-28:17-25 -hidden: false -icon: '' -labels: - author: orz - framework: sklearn -maintainers: [] -marketplaceType: '' -mlrunVersion: 1.1.0 -name: concept-drift-streaming -platformVersion: 3.5.0 -spec: - filename: concept_drift_streaming.py - handler: handler - image: mlrun/ml-models - kind: nuclio - requirements: - - scikit-multiflow==0.4.1 - - v3io_frames -url: '' -version: 1.1.0 diff --git a/concept_drift_streaming/requirements.txt b/concept_drift_streaming/requirements.txt deleted file mode 100644 index fa0fddd88..000000000 --- a/concept_drift_streaming/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -skmultiflow \ No newline at end of file diff --git a/feature_perms/README.ipynb b/feature_perms/README.ipynb deleted file mode 100644 index 0929a6f6a..000000000 --- a/feature_perms/README.ipynb +++ /dev/null @@ -1,788 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# feature importances" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "There are a number of ways to compute feature importances and **the default estimates reported by scikit learn can be shown to be biased** under certain circumstances. In addition, many non-tree algorithms do not provide conveniently calculated feature importance estimates. The following demonstration is based on material that draws heavily from the following sources:" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## references\n", - "\n", - "\n", - "### repos\n", - "\n", - "* **[Feature importances for scikit-learn machine learning models](https://github.com/parrt/random-forest-importances)**, [MIT License](https://github.com/parrt/random-forest-importances/blob/master/LICENSE)\n", - "* **[Scikit-Learn ensemble module - forests](https://github.com/scikit-learn/scikit-learn/blob/0.23.1/sklearn/ensemble/_forest.py)**, [BSD License](https://github.com/scikit-learn/scikit-learn/blob/fd237278e895b42abe8d8d09105cbb82dc2cbba7/sklearn/ensemble/_forest.py#L40)\n", - "* **[ELI5 - Permutation Importance](https://eli5.readthedocs.io/en/latest/blackbox/permutation_importance.html)** \n", - "\n", - "### articles\n", - "\n", - "Strobl, C., Boulesteix, A., Zeileis, A. et al. **[Bias in random forest variable importance measures: Illustrations, sources and a solution](https://link.springer.com/article/10.1186/1471-2105-8-25#citeas)**. BMC Bioinformatics 8, 25 (2007). https://doi.org/10.1186/1471-2105-8-25 \n", - "\n", - "Strobl, C., Boulesteix, A., Kneib, T. et al. **[Conditional variable importance for random forests](https://bmcbioinformatics.biomedcentral.com/articles/10.1186/1471-2105-9-307#citeas)**. BMC Bioinformatics 9, 307 (2008). https://doi.org/10.1186/1471-2105-9-307 " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## what we'll do\n", - "\n", - "* demonstrate an issue with default feature importance estimates \n", - "* provide alternatives and compare to the default \n", - "* create a new function `feature_perms` that implements a computationally simple algorithm \n", - "* create a new function `dropcol_importances` that implements a computationally intensive algorithm that is more accurate\n", - "* test our new functions\n", - "\n", - "It should be noted that although we are developing this notebook using a classification example, an almost identical presentation can be done for regression." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## imports" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import pandas as pd\n", - "\n", - "import sklearn\n", - "from sklearn.base import clone\n", - "\n", - "from sklearn.ensemble import RandomForestClassifier as SomeModel\n", - "\n", - "import matplotlib.pyplot as plt\n", - "import seaborn as sns\n", - "\n", - "from typing import Union, Callable, List" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## default feature importances\n", - "\n", - "This is a function that plots default feature importances from an estimated model object when available. It is taken from mlrun's current source-code implementation:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "def feature_importances(\n", - " model: SomeModel,\n", - " header: List[str], \n", - " figsz=(10, 5)\n", - ") -> None:\n", - " \"\"\"Display default model feature importances\n", - "\n", - " Only works for models with attribute 'feature_importances_`\n", - "\n", - " :param model: fitted model with a feature_importances_ attribute\n", - " :param header: feature labels\n", - " :param figsz: matplotlib figure size\n", - " \"\"\"\n", - " if not hasattr(model, \"feature_importances_\"):\n", - " raise Exception(\n", - " \"feature importances are only available for some models\")\n", - "\n", - " # create a feature importance table with desired labels\n", - " zipped = zip(model.feature_importances_, header)\n", - " feature_imp = pd.DataFrame(\n", - " sorted(zipped), columns=[\"freq\", \"feature\"]).sort_values(\n", - " by=\"freq\", ascending=False)\n", - "\n", - " plt.clf()\n", - " plt.figure(figsize=figsz)\n", - " sns.barplot(x=\"freq\", y=\"feature\", data=feature_imp)\n", - " plt.title(\"features\")\n", - " plt.tight_layout();\n", - " \n", - " return feature_imp" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## permuted features\n", - "\n", - "A proposed solution that has general applicability is randomly permuted features**[refs](#references)**: \n", - "* loop through the feature set \n", - "* shuffle one feature \n", - "* run predict\n", - "* compare the (marginal) change in accuracy (or other metric of interest) \n", - "\n", - "This approach is computationally more demanding than relying on the default values, however it can be easily parallelized. To perform the estimation we only need an estimated model and a held-out test set. The following was proposed in **[Beware Default Random Forest Importances](https://explained.ai/rf-importance/index.html)**:\n", - "\n", - "( the following 3 glue functions will no longer be publicly visible in the sklearn package from 0.24 onwards, consider this a temporary hack while we refactor these away)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**the following has been refactored in final version of function:**" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "from distutils.version import LooseVersion\n", - "import numpy as np\n", - "from sklearn.utils import check_random_state\n", - "\n", - "def _generate_sample_indices(random_state: int, n_samples: int, n_samples_bootstrap: int):\n", - " \"\"\"\n", - " Private function used to _parallel_build_trees function.\n", - " taken from:\n", - " https://github.com/scikit-learn/scikit-learn/blob/2253807bb488b6de73796aef2de38a6dcf282d86/sklearn/ensemble/_forest.py#L116\n", - " (public availability to be deprecated by sklearn v0.24)\n", - " \"\"\"\n", - " random_instance = check_random_state(random_state)\n", - " sample_indices = random_instance.randint(0, n_samples, n_samples_bootstrap)\n", - "\n", - " return sample_indices\n", - "\n", - "def _generate_unsampled_indices(random_state: int, n_samples: int, n_samples_bootstrap: int):\n", - " \"\"\"\n", - " Private function used to forest._set_oob_score function.\n", - " taken from: \n", - " https://github.com/scikit-learn/scikit-learn/blob/2253807bb488b6de73796aef2de38a6dcf282d86/sklearn/ensemble/_forest.py#L126\n", - " (public availability to be deprecated by sklearn v0.24)\n", - " \"\"\"\n", - " sample_indices = _generate_sample_indices(random_state, n_samples,\n", - " n_samples_bootstrap)\n", - " sample_counts = np.bincount(sample_indices, minlength=n_samples)\n", - " unsampled_mask = sample_counts == 0\n", - " indices_range = np.arange(n_samples)\n", - " unsampled_indices = indices_range[unsampled_mask]\n", - "\n", - " return unsampled_indices\n", - "\n", - "def _get_unsampled_indices(tree, n_samples: int):\n", - " \"\"\"\n", - " An interface to get unsampled indices regardless of sklearn version.\n", - " \"\"\"\n", - " import warnings\n", - " warnings.simplefilter(action=\"ignore\", category=FutureWarning)\n", - " if LooseVersion(sklearn.__version__) >= LooseVersion(\"0.22\"):\n", - " # Version 0.22 or newer uses 3 arguments.\n", - " from sklearn.ensemble.forest import _get_n_samples_bootstrap\n", - " n_samples_bootstrap = _get_n_samples_bootstrap(n_samples, n_samples)\n", - " return _generate_unsampled_indices(tree.random_state, n_samples,\n", - " n_samples_bootstrap)\n", - " else:\n", - " # Version 0.21 or older uses only two arguments.\n", - " return _generate_unsampled_indices(tree.random_state, n_samples)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following function estimates classifier accuracy and has been borrowed from **[references](#references)**. See **[breitman on oob](https://www.stat.berkeley.edu/~breiman/OOBestimation.pdf)** for details on out-of-bag estimation:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def oob_classifier_accuracy(rf, X_train: np.array, y_train: np.array) -> float:\n", - " \"\"\"\n", - " Compute out-of-bag (OOB) accuracy for a scikit-learn forest classifier.\n", - " \n", - " https://github.com/scikit-learn/scikit-learn/blob/a24c8b46/sklearn/ensemble/forest.py#L425\n", - " \"\"\"\n", - " X = X_train.values\n", - " y = y_train.values\n", - "\n", - " n_samples = len(X)\n", - " n_classes = len(np.unique(y))\n", - " predictions = np.zeros((n_samples, n_classes))\n", - " for tree in rf.estimators_:\n", - " unsampled_indices = _get_unsampled_indices(tree, n_samples)\n", - " tree_preds = tree.predict_proba(X[unsampled_indices, :])\n", - " predictions[unsampled_indices] += tree_preds\n", - "\n", - " predicted_class_indexes = np.argmax(predictions, axis=1)\n", - " predicted_classes = [rf.classes_[i] for i in predicted_class_indexes]\n", - "\n", - " oob_score = np.mean(y == predicted_classes)\n", - " \n", - " return oob_score" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Putting it all together:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "def permutation_importances(\n", - " model, \n", - " X_train: np.array,\n", - " y_train: np.array, \n", - " header: List[str],\n", - " metric: Callable = oob_classifier_accuracy,\n", - " figsz=(10, 5)\n", - ") -> np.array:\n", - " \"\"\"calculate change in metric from permuting feature columns\n", - " \n", - " modified from https://explained.ai/rf-importance/index.html\n", - " \n", - " uses a pre-estimated model\n", - "\n", - " :param X_train: training set features\n", - " :param y_train: training set ground truths, regression targets\n", - " :param header: column labels for X_train\n", - " :param figsz: matplotlib figure size\n", - " \n", - " \"\"\"\n", - " baseline = metric(model, X_train, y_train)\n", - " imp = []\n", - " for col in X_train.columns:\n", - " save = X_train[col].copy()\n", - " X_train[col] = np.random.permutation(X_train[col])\n", - " m = metric(model, X_train, y_train)\n", - " X_train[col] = save\n", - " imp.append(baseline - m)\n", - " \n", - " # create a feature importance table with desired labels\n", - " zipped = zip(imp, header)\n", - " feature_imp = pd.DataFrame(sorted(zipped), columns=[\"importance\", \"feature\"])\n", - " feature_imp.sort_values(by=\"importance\", ascending=False, inplace=True)\n", - "\n", - " plt.clf()\n", - " plt.figure(figsize=figsz)\n", - " sns.barplot(x=\"importance\", y=\"feature\", data=feature_imp)\n", - " plt.title(\"feature permutation importances\")\n", - " plt.tight_layout()\n", - "\n", - " return np.array(feature_imp)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## drop-column importances\n", - "\n", - "According to our **[references](#references)** a more accurate measure of feature importance would have us re-estimate the model after dropping a column. This is considered as being close to \"ideal\". Unfortunately, the entire model needs to be re-estimated for each column and without some approximating shortcut this is likely to be infeasible for large datasets.\n", - "\n", - "Here is the suggested implementation and **don't run this on big models!**:" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "def dropcol_importances(\n", - " model, \n", - " X_train: np.array,\n", - " y_train: np.array,\n", - " header: List[str] = [],\n", - " random_state: int = 1994,\n", - " figsz=(10, 5)\n", - ") -> pd.DataFrame:\n", - " \"\"\"drop columns and re-estimate model\n", - " \n", - " modified from https://explained.ai/rf-importance/index.html\n", - " \n", - " :param rf: model to fit\n", - " :param X_train: training set features\n", - " :param y_train: training set ground truth labels\n", - "\n", - " Returns:\n", - " pd.DataFrame: table of diffs vs baseline metric\n", - " \"\"\"\n", - " # cloning makes copy of model pre-fit\n", - " # calculate a baseline with all features\n", - " model_ = clone(model)\n", - " model_.random_state = random_state\n", - " model_.fit(X_train, y_train)\n", - " baseline = model_.oob_score_\n", - " \n", - " # now drop each colum, refit model and calc metric\n", - " imp = []\n", - " for col in X_train.columns:\n", - " X = X_train.drop(col, axis=1)\n", - " model_ = clone(model)\n", - " model_.random_state = random_state\n", - " model_.fit(X, y_train)\n", - " o = model_.oob_score_\n", - " imp.append(baseline - o)\n", - " \n", - " # put it all in a table\n", - " imp = np.array(imp)\n", - " feature_imps = pd.DataFrame(\n", - " data={'feature': X_train.columns,\n", - " 'importance': imp})\n", - " #feature_imps.set_index('feature', inplace=True)\n", - " feature_imps.sort_values('importance', ascending=True, inplace=True)\n", - " \n", - " plt.clf()\n", - " plt.figure(figsize=figsz)\n", - " sns.barplot(x=\"importance\", y=\"feature\", data=feature_imps)\n", - " plt.title(\"drop column feature importances\")\n", - " plt.tight_layout()\n", - " \n", - " return feature_imps" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## demonstration\n", - "\n", - "In this demonstratuon we are going to take a fraction of a fraction of **[Kaggle's RentHop rental listing interest competition](https://www.kaggle.com/c/two-sigma-connect-rental-listing-inquiries)**--the complete dataset is presently >80GB, we'll be looking at 5K rows. \n", - "\n", - "The competition's **[goal](https://www.kaggle.com/c/two-sigma-connect-rental-listing-inquiries)** was\n", - "> to predict the number of inquiries a new listing receives based on the listing’s creation date and other features. \n", - "\n", - "Doing so would help **[RentHop](https://www.renthop.com/)**\n", - "> better handle fraud control, identify potential listing quality issues, and allow owners and agents to better understand renters’ needs and preferences." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "data = \"/User/artifacts/two-sigma-connect-rental-listing-inquiries/\"\n", - "NFRAC = 0.1" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "sample dimensions (4935, 6)\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
bathroomsbedroomspricelongitudelatitudeinterest_level
182351.001800-73.996040.71972
421401.023000-73.987940.76533
46771.011350-73.899640.85492
\n", - "
" - ], - "text/plain": [ - " bathrooms bedrooms price longitude latitude interest_level\n", - "18235 1.0 0 1800 -73.9960 40.7197 2\n", - "42140 1.0 2 3000 -73.9879 40.7653 3\n", - "4677 1.0 1 1350 -73.8996 40.8549 2" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df = pd.read_csv(data + 'rent.csv').sample(frac=NFRAC)\n", - "print(\"sample dimensions\", df.shape)\n", - "df.head(3)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "features = ['bathrooms', 'bedrooms', 'longitude', 'latitude', 'price']\n", - "dfr = df[features]\n", - "\n", - "# drop price column\n", - "X_train, y_train = dfr.drop('price', axis=1), dfr['price']\n", - "\n", - "# insert column with random values\n", - "X_train['random'] = np.random.random(size=len(X_train))\n", - "features = ['bathrooms', 'bedrooms', 'longitude', 'latitude', 'random']" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "RandomForestClassifier(n_jobs=-1, oob_score=True)" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# define model\n", - "model_params = {\n", - " \"n_estimators\" : 100, \n", - " \"min_samples_leaf\" : 1,\n", - " \"n_jobs\" : -1,\n", - " \"oob_score\" : True\n", - "}\n", - "\n", - "model = SomeModel(**model_params)\n", - "\n", - "# estimate\n", - "model.fit(X_train, y_train)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### to run this the model needs a default attribute" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "default feature_importances [0.01683784 0.03215169 0.29983429 0.30418813 0.34698806]\n" - ] - }, - { - "data": { - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "if hasattr(model, \"feature_importances_\"):\n", - " print(\"default feature_importances\", model.feature_importances_)\n", - " feature_importances(model, features)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## permutation importances\n", - "\n", - "No need to check for default attributes or functions, this can be run on any kind of model:" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[0.06545086119554205, 'longitude'],\n", - " [0.06160081053698076, 'latitude'],\n", - " [0.053495440729483285, 'bedrooms'],\n", - " [0.021681864235055734, 'bathrooms'],\n", - " [0.0004052684903748799, 'random']], dtype=object)" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "pi = permutation_importances(model, X_train, y_train, features)\n", - "pi" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## drop-column importances" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
featureimportance
4random-0.042756
0bathrooms0.001824
1bedrooms0.023100
2longitude0.049240
3latitude0.051874
\n", - "
" - ], - "text/plain": [ - " feature importance\n", - "4 random -0.042756\n", - "0 bathrooms 0.001824\n", - "1 bedrooms 0.023100\n", - "2 longitude 0.049240\n", - "3 latitude 0.051874" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "dc = dropcol_importances(model, X_train, y_train)\n", - "dc" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## conclusions" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "So I would say location is a prime factor, then the number of bedrooms. Bathrooms often is gte bedrooms, and is likely correlated so one of them should likely be dropped." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.8" - }, - "toc-autonumbering": false, - "toc-showcode": false, - "toc-showmarkdowntxt": false - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/feature_perms/feature_perms.ipynb b/feature_perms/feature_perms.ipynb deleted file mode 100644 index 77da7b553..000000000 --- a/feature_perms/feature_perms.ipynb +++ /dev/null @@ -1,1106 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# permutation_importances as reusable function" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## function code" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# nuclio: ignore\n", - "import nuclio" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import pandas as pd\n", - "import numbers\n", - "\n", - "import sklearn\n", - "from sklearn.base import clone\n", - "from sklearn.utils import check_random_state\n", - "\n", - "import matplotlib.pyplot as plt\n", - "import seaborn as sns\n", - "\n", - "from cloudpickle import load\n", - "\n", - "from mlrun.execution import MLClientCtx\n", - "from mlrun.datastore import DataItem\n", - "from mlrun.artifacts import get_model, PlotArtifact\n", - "from typing import Union, Callable, List\n", - "\n", - "def _get_n_samples_bootstrap(n_samples, max_samples) -> int:\n", - " \"\"\"get the number of samples in a bootstrap sample\n", - " \n", - " returns the total number of samples to draw for the bootstrap sample\n", - " \n", - " private api in sklearn >= v0.24, taken from sklearn.ensemble._forest.py\n", - "\n", - " :param n_samples: Number of samples in the dataset.\n", - " :param max_samples: \n", - " The maximum number of samples to draw from the total available:\n", - " - if float, this indicates a fraction of the total and should be\n", - " the interval `(0, 1)`;\n", - " - if int, this indicates the exact number of samples;\n", - " - if None, this indicates the total number of samples.\n", - " \"\"\"\n", - " if max_samples is None:\n", - " return n_samples\n", - "\n", - " if isinstance(max_samples, numbers.Integral):\n", - " if not (1 <= max_samples <= n_samples):\n", - " msg = \"`max_samples` must be in range 1 to {} but got value {}\"\n", - " raise ValueError(msg.format(n_samples, max_samples))\n", - " return max_samples\n", - "\n", - " if isinstance(max_samples, numbers.Real):\n", - " if not (0 < max_samples < 1):\n", - " msg = \"`max_samples` must be in range (0, 1) but got value {}\"\n", - " raise ValueError(msg.format(max_samples))\n", - " return int(round(n_samples * max_samples))\n", - "\n", - " msg = \"`max_samples` should be int or float, but got type '{}'\"\n", - " raise TypeError(msg.format(type(max_samples)))\n", - "\n", - "def _get_unsampled_ix(random_state, n_samples: int) -> np.array:\n", - " \"\"\"\n", - " future-proof get unsampled indices\n", - " \"\"\"\n", - " n_bootstrap = _get_n_samples_bootstrap(n_samples, n_samples)\n", - " random_instance = check_random_state(random_state)\n", - " sample_indices = random_instance.randint(0, n_samples, n_bootstrap)\n", - " sample_counts = np.bincount(sample_indices, minlength=n_samples)\n", - "\n", - " return np.arange(n_samples)[sample_counts==0]\n", - "\n", - "def _oob_classifier_accuracy(rf, X_train, y_train) -> float:\n", - " \"\"\"\n", - " Compute out-of-bag (OOB) accuracy for a scikit-learn forest classifier.\n", - " \n", - " https://github.com/scikit-learn/scikit-learn/blob/a24c8b46/sklearn/ensemble/forest.py#L425\n", - " \"\"\"\n", - " X = X_train.values if isinstance(X_train, pd.DataFrame) else X_train\n", - " y = y_train.values if isinstance(y_train, pd.Series) else y_train\n", - "\n", - " n_samples = len(X)\n", - " n_classes = len(np.unique(y))\n", - " predictions = np.zeros((n_samples, n_classes))\n", - " for tree in rf.estimators_:\n", - " unsampled_indices = _get_unsampled_ix(tree.random_state, n_samples)\n", - " tree_preds = tree.predict_proba(X[unsampled_indices, :])\n", - " predictions[unsampled_indices] += tree_preds\n", - "\n", - " predicted_class_indexes = np.argmax(predictions, axis=1)\n", - " predicted_classes = [rf.classes_[i] for i in predicted_class_indexes]\n", - "\n", - " oob_score = np.mean(y == predicted_classes)\n", - " \n", - " return oob_score\n", - "\n", - "def permutation_importances(\n", - " context: MLClientCtx,\n", - " model: DataItem,\n", - " dataset: DataItem,\n", - " labels: str,\n", - " figsz=(10, 5),\n", - " plots_dest: str = \"plots\",\n", - " fitype: str = \"permute\"\n", - ") -> pd.DataFrame:\n", - " \"\"\"calculate change in metric\n", - " \n", - " type 'permute' uses a pre-estimated model\n", - " type 'dropcol' uses a re-estimates model\n", - " \n", - " :param context: the function's execution context\n", - " :param model: a trained model\n", - " :param dataset: features and ground truths, regression targets\n", - " :param labels name of the ground truths column\n", - " :param figsz: matplotlib figure size\n", - " :param plots_dest: path within artifact store\n", - " :\n", - " \"\"\"\n", - " model_file, model_data, _ = get_model(model.url, suffix='.pkl')\n", - " model = load(open(str(model_file), \"rb\"))\n", - " \n", - " X = dataset.as_df()\n", - " y = X.pop(labels)\n", - " header = X.columns\n", - " \n", - " # this will be paramettrized next version, and include regression\n", - " metric = _oob_classifier_accuracy\n", - " \n", - " baseline = metric(model, X, y)\n", - " \n", - " imp = []\n", - " for col in X.columns:\n", - " if fitype is \"permute\":\n", - " save = X[col].copy()\n", - " X[col] = np.random.permutation(X[col])\n", - " m = metric(model, X, y)\n", - " X[col] = save\n", - " imp.append(baseline - m)\n", - " elif fitype is \"dropcol\":\n", - " X_ = X.drop(col, axis=1)\n", - " model_ = clone(model)\n", - " model_.random_state = random_state\n", - " model_.fit(X_, y)\n", - " o = model_.oob_score_\n", - " imp.append(baseline - o)\n", - " else:\n", - " raise ValueError(\"unknown fitype, only 'permute' or 'dropcol' permitted\")\n", - "\n", - " # create a feature importance table with desired labels\n", - " zipped = zip(imp, header)\n", - " feature_imp = pd.DataFrame(sorted(zipped), columns=[\"importance\", \"feature\"])\n", - " feature_imp.sort_values(by=\"importance\", ascending=False, inplace=True)\n", - "\n", - " plt.clf()\n", - " plt.figure(figsize=figsz)\n", - " sns.barplot(x=\"importance\", y=\"feature\", data=feature_imp)\n", - " plt.title(f\"feature importances-{fitype}\")\n", - " plt.tight_layout()\n", - "\n", - " context.log_artifact(PlotArtifact(f\"feature importances-{fitype}\", body=plt.gcf()),\n", - " local_path=f\"{plots_dest}/feature-permutations.html\")\n", - " context.log_dataset(f\"feature-importances-{fitype}-tbl\", df=feature_imp, index=False)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "# nuclio: end-code" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## save function" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[mlrun] 2020-06-07 19:58:25,298 function spec saved to path: function.yaml\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from mlrun import code_to_function\n", - "from mlrun.platforms.other import auto_mount\n", - "\n", - "gpus = False\n", - "\n", - "# create job function object from notebook code\n", - "fn_params = {\n", - " \"name\" : \"feature-perms\",\n", - " \"handler\" : \"permutation_importances\",\n", - " \"kind\" : \"job\",\n", - " \"image\" : \"mlrun/ml-models\" if not gpus else \"mlrun/ml-models-gpu\",\n", - " \"description\" : \"estimate feature importances using permutations\",\n", - " \"categories\" : [\"analysis\"],\n", - " \"labels\" : {\"author\": \"yjb\"}\n", - "}\n", - "\n", - "perms_fn = code_to_function(**fn_params)\n", - "perms_fn.apply(auto_mount())\n", - "perms_fn.export(\"function.yaml\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## tests" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "from mlrun import import_function\n", - "from mlrun import NewTask, mlconf" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### get some data" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[mlrun] 2020-06-07 19:58:25,352 starting run tasks arc-to-parq uid=e9bc67f2189c418d96bfde754d369956 -> http://mlrun-api:8080\n", - "[mlrun] 2020-06-07 19:58:25,486 Job is running in the background, pod: tasks-arc-to-parq-xqkr7\n", - "[mlrun] 2020-06-07 19:58:29,118 starting local run: main.py # arc_to_parquet\n", - "[mlrun] 2020-06-07 19:58:29,169 downloading https://raw.githubusercontent.com/parrt/random-forest-importances/master/notebooks/data/rent.csv to local tmp\n", - "[mlrun] 2020-06-07 19:58:29,535 destination file does not exist, downloading\n", - "[mlrun] 2020-06-07 19:58:29,898 log artifact rent at /User/artifacts/rent.csv, size: 1492462, db: Y\n", - "\n", - "[mlrun] 2020-06-07 19:58:29,917 run executed, status=completed\n", - "final state: succeeded\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
projectuiditerstartstatenamelabelsinputsparametersresultsartifacts
default0Jun 07 19:58:29completedtasks arc-to-parq
v3io_user=admin
kind=job
owner=admin
host=tasks-arc-to-parq-xqkr7
archive_url
key=rent
stats=True
file_ext=csv
rent
\n", - "
\n", - "
\n", - "
\n", - " Title\n", - " ×\n", - "
\n", - " \n", - "
\n", - "
\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "to track results use .show() or .logs() or in CLI: \n", - "!mlrun get run e9bc67f2189c418d96bfde754d369956 --project default , !mlrun logs e9bc67f2189c418d96bfde754d369956 --project default\n", - "[mlrun] 2020-06-07 19:58:31,666 run executed, status=completed\n" - ] - } - ], - "source": [ - "data_url = \"https://raw.githubusercontent.com/parrt/random-forest-importances/master/notebooks/data/rent.csv\"\n", - "\n", - "fn = import_function(\"hub://arc_to_parquet\", \"a2p\")\n", - "fn.apply(auto_mount())\n", - "\n", - "params = {\n", - " \"name\" : \"tasks arc-to-parq\",\n", - " \"params\" : {\"key\":\"rent\", \"stats\": True, \"file_ext\":\"csv\"}\n", - "}\n", - "acquire_run = fn.run(NewTask(**params),inputs={\"archive_url\" : data_url},\n", - " artifact_path=mlconf.artifact_path)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### train a model" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[mlrun] 2020-06-07 19:58:31,704 starting run tasks random forest uid=57af834167264641905a5bb5e6b0e263 -> http://mlrun-api:8080\n", - "[mlrun] 2020-06-07 19:58:31,861 Job is running in the background, pod: tasks-random-forest-vkjk5\n", - "[mlrun] 2020-06-07 19:58:35,390 starting local run: main.py # train_model\n", - "[mlrun] 2020-06-07 19:58:36,310 log artifact test_set at /User/artifacts/data/test_set.parquet, size: 24484, db: Y\n", - "[mlrun] 2020-06-07 19:58:37,153 log artifact confusion-matrix at /User/artifacts/model/plots/confusion-matrix.html, size: 27401, db: N\n", - "[mlrun] 2020-06-07 19:58:37,598 log artifact feature-importances at /User/artifacts/model/plots/feature-importances.html, size: 19685, db: N\n", - "[mlrun] 2020-06-07 19:58:37,806 log artifact precision-recall-multiclass at /User/artifacts/model/plots/precision-recall-multiclass.html, size: 74009, db: N\n", - "[mlrun] 2020-06-07 19:58:37,936 log artifact roc-multiclass at /User/artifacts/model/plots/roc-multiclass.html, size: 73053, db: N\n", - "[mlrun] 2020-06-07 19:58:38,079 log artifact model at /User/artifacts/model/, size: 10346780, db: Y\n", - "\n", - "[mlrun] 2020-06-07 19:58:38,106 run executed, status=completed\n", - "final state: succeeded\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
projectuiditerstartstatenamelabelsinputsparametersresultsartifacts
default0Jun 07 19:58:36completedtasks random forest
v3io_user=admin
kind=job
owner=admin
host=tasks-random-forest-vkjk5
class=sklearn.ensemble.RandomForestClassifier
dataset
sample=-5000
model_pkg_class=sklearn.ensemble.RandomForestClassifier
label_column=interest_level
CLASS_n_estimators=100
CLASS_min_samples_leaf=1
CLASS_n_jobs=-1
CLASS_oob_score=True
test-accuracy=0.6902857142857143
test-error=0.3097142857142857
auc-micro=0.8567196734693878
auc-weighted=0.7077200281488216
f1-score=0.44361444815007395
precision_score=0.4969837043184901
recall_score=0.42733978329897576
test_set
confusion-matrix
feature-importances
precision-recall-multiclass
roc-multiclass
model
\n", - "
\n", - "
\n", - "
\n", - " Title\n", - " ×\n", - "
\n", - " \n", - "
\n", - "
\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "to track results use .show() or .logs() or in CLI: \n", - "!mlrun get run 57af834167264641905a5bb5e6b0e263 --project default , !mlrun logs 57af834167264641905a5bb5e6b0e263 --project default\n", - "[mlrun] 2020-06-07 19:58:41,115 run executed, status=completed\n" - ] - } - ], - "source": [ - "fn = import_function(\"hub://sklearn_classifier\", \"skrf\")\n", - "fn.apply(auto_mount())\n", - "\n", - "# define model\n", - "params = {\n", - " \"name\" : \"tasks random forest\",\n", - " \"params\" : {\n", - " \"sample\" : -5_000, # 5k random rows,\n", - " \"model_pkg_class\" : \"sklearn.ensemble.RandomForestClassifier\",\n", - " \"label_column\" : \"interest_level\",\n", - " \"CLASS_n_estimators\" : 100,\n", - " \"CLASS_min_samples_leaf\" : 1,\n", - " \"CLASS_n_jobs\" : -1,\n", - " \"CLASS_oob_score\" : True}\n", - "}\n", - "\n", - "train_run = fn.run(NewTask(**params), inputs={\"dataset\" : acquire_run.outputs[\"rent\"]},\n", - " artifact_path=mlconf.artifact_path)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "

Feature Importances

\n", - "" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from IPython.display import HTML\n", - "HTML(filename=train_run.outputs['feature-importances'])" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "data = acquire_run.outputs[\"rent\"]\n", - "labels = \"interest_level\"\n", - "model = train_run.outputs[\"model\"]\n" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[mlrun] 2020-06-07 19:58:41,152 starting run features-permutation_importances uid=89235b15ac2a4213aefc906c178a1c5e -> http://mlrun-api:8080\n", - "[mlrun] 2020-06-07 19:58:41,312 Job is running in the background, pod: features-permutation-importances-dwxmt\n", - "[mlrun] 2020-06-07 19:58:44,871 starting local run: main.py # permutation_importances\n", - "[mlrun] 2020-06-07 19:58:48,714 log artifact feature importances-permute at /User/artifacts/plots/feature-permutations.html, size: 25694, db: Y\n", - "[mlrun] 2020-06-07 19:58:48,770 log artifact feature-importances-permute-tbl at /User/artifacts/feature-importances-permute-tbl.csv, size: 167, db: Y\n", - "\n", - "[mlrun] 2020-06-07 19:58:48,785 run executed, status=completed\n", - "final state: succeeded\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
projectuiditerstartstatenamelabelsinputsparametersresultsartifacts
default0Jun 07 19:58:45completedfeatures-permutation_importances
v3io_user=admin
kind=job
owner=admin
host=features-permutation-importances-dwxmt
model
dataset
labels=interest_level
plots_dest=plots
feature importances-permute
feature-importances-permute-tbl
\n", - "
\n", - "
\n", - "
\n", - " Title\n", - " ×\n", - "
\n", - " \n", - "
\n", - "
\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "to track results use .show() or .logs() or in CLI: \n", - "!mlrun get run 89235b15ac2a4213aefc906c178a1c5e --project default , !mlrun logs 89235b15ac2a4213aefc906c178a1c5e --project default\n", - "[mlrun] 2020-06-07 19:58:50,488 run executed, status=completed\n" - ] - } - ], - "source": [ - "fi_perms = perms_fn.run(\n", - " NewTask(params={\"labels\": labels, \n", - " \"plots_dest\": \"plots\"}),\n", - " inputs={\"model\": model, \"dataset\": data},\n", - " artifact_path=mlconf.artifact_path)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from IPython.display import HTML\n", - "HTML(filename=fi_perms.outputs['feature importances-permute'])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.8" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} \ No newline at end of file diff --git a/feature_perms/feature_perms.py b/feature_perms/feature_perms.py deleted file mode 100644 index 13caae32e..000000000 --- a/feature_perms/feature_perms.py +++ /dev/null @@ -1,174 +0,0 @@ -# Copyright 2019 Iguazio -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Generated by nuclio.export.NuclioExporter - -import numpy as np -import pandas as pd -import numbers - -import sklearn -from sklearn.base import clone -from sklearn.utils import check_random_state - -import matplotlib.pyplot as plt -import seaborn as sns - -from cloudpickle import load - -from mlrun.execution import MLClientCtx -from mlrun.datastore import DataItem -from mlrun.artifacts import get_model, PlotArtifact -from typing import Union, Callable, List - - -def _get_n_samples_bootstrap(n_samples, max_samples) -> int: - """get the number of samples in a bootstrap sample - - returns the total number of samples to draw for the bootstrap sample - - private api in sklearn >= v0.24, taken from sklearn.ensemble._forest.py - - :param n_samples: Number of samples in the dataset. - :param max_samples: - The maximum number of samples to draw from the total available: - - if float, this indicates a fraction of the total and should be - the interval `(0, 1)`; - - if int, this indicates the exact number of samples; - - if None, this indicates the total number of samples. - """ - if max_samples is None: - return n_samples - - if isinstance(max_samples, numbers.Integral): - if not (1 <= max_samples <= n_samples): - msg = "`max_samples` must be in range 1 to {} but got value {}" - raise ValueError(msg.format(n_samples, max_samples)) - return max_samples - - if isinstance(max_samples, numbers.Real): - if not (0 < max_samples < 1): - msg = "`max_samples` must be in range (0, 1) but got value {}" - raise ValueError(msg.format(max_samples)) - return int(round(n_samples * max_samples)) - - msg = "`max_samples` should be int or float, but got type '{}'" - raise TypeError(msg.format(type(max_samples))) - - -def _get_unsampled_ix(random_state, n_samples: int) -> np.array: - """ - future-proof get unsampled indices - """ - n_bootstrap = _get_n_samples_bootstrap(n_samples, n_samples) - random_instance = check_random_state(random_state) - sample_indices = random_instance.randint(0, n_samples, n_bootstrap) - sample_counts = np.bincount(sample_indices, minlength=n_samples) - - return np.arange(n_samples)[sample_counts == 0] - - -def _oob_classifier_accuracy(rf, X_train, y_train) -> float: - """ - Compute out-of-bag (OOB) accuracy for a scikit-learn forest classifier. - - https://github.com/scikit-learn/scikit-learn/blob/a24c8b46/sklearn/ensemble/forest.py#L425 - """ - X = X_train.values if isinstance(X_train, pd.DataFrame) else X_train - y = y_train.values if isinstance(y_train, pd.Series) else y_train - - n_samples = len(X) - n_classes = len(np.unique(y)) - predictions = np.zeros((n_samples, n_classes)) - for tree in rf.estimators_: - unsampled_indices = _get_unsampled_ix(tree.random_state, n_samples) - tree_preds = tree.predict_proba(X[unsampled_indices, :]) - predictions[unsampled_indices] += tree_preds - - predicted_class_indexes = np.argmax(predictions, axis=1) - predicted_classes = [rf.classes_[i] for i in predicted_class_indexes] - - oob_score = np.mean(y == predicted_classes) - - return oob_score - - -def permutation_importance( - context: MLClientCtx, - model: DataItem, - dataset: DataItem, - labels: str, - figsz=(10, 5), - plots_dest: str = "plots", - fitype: str = "permute", -) -> pd.DataFrame: - """calculate change in metric - - type 'permute' uses a pre-estimated model - type 'dropcol' uses a re-estimates model - - :param context: the function's execution context - :param model: a trained model - :param dataset: features and ground truths, regression targets - :param labels name of the ground truths column - :param figsz: matplotlib figure size - :param plots_dest: path within artifact store - : - """ - model_file, model_data, _ = get_model(model.url, suffix=".pkl") - model = load(open(str(model_file), "rb")) - - X = dataset.as_df() - y = X.pop(labels) - header = X.columns - - metric = _oob_classifier_accuracy - - baseline = metric(model, X, y) - - imp = [] - for col in X.columns: - if fitype is "permute": - save = X[col].copy() - X[col] = np.random.permutation(X[col]) - m = metric(model, X, y) - X[col] = save - imp.append(baseline - m) - elif fitype is "dropcol": - X_ = X.drop(col, axis=1) - model_ = clone(model) - #model_.random_state = random_state - model_.fit(X_, y) - o = model_.oob_score_ - imp.append(baseline - o) - else: - raise ValueError("unknown fitype, only 'permute' or 'dropcol' permitted") - - zipped = zip(imp, header) - feature_imp = pd.DataFrame(sorted(zipped), columns=["importance", "feature"]) - feature_imp.sort_values(by="importance", ascending=False, inplace=True) - - plt.clf() - plt.figure(figsize=figsz) - sns.barplot(x="importance", y="feature", data=feature_imp) - plt.title(f"feature importances-{fitype}") - plt.tight_layout() - - context.log_artifact( - PlotArtifact(f"feature importances-{fitype}", body=plt.gcf()), - local_path=f"{plots_dest}/feature-permutations.html", - ) - context.log_dataset( - f"feature-importances-{fitype}-tbl", df=feature_imp, index=False - ) diff --git a/feature_perms/function.yaml b/feature_perms/function.yaml deleted file mode 100644 index 713981fdf..000000000 --- a/feature_perms/function.yaml +++ /dev/null @@ -1,63 +0,0 @@ -kind: job -metadata: - name: feature-perms - tag: '' - hash: 2e32234a73e2e48f029cf6c957b150ec2ffd4bc7 - project: '' - labels: - author: yjb - categories: - - data-analysis -spec: - command: '' - args: [] - image: mlrun/ml-models - env: [] - default_handler: permutation_importance - entry_points: - permutation_importance: - name: permutation_importance - doc: 'calculate change in metric - - - type ''permute'' uses a pre-estimated model - - type ''dropcol'' uses a re-estimates model' - parameters: - - name: context - type: MLClientCtx - doc: the function's execution context - default: '' - - name: model - type: DataItem - doc: a trained model - default: '' - - name: dataset - type: DataItem - doc: features and ground truths, regression targets - default: '' - - name: labels - type: str - default: '' - - name: figsz - doc: matplotlib figure size - default: - - 10 - - 5 - - name: plots_dest - type: str - doc: path within artifact store - default: plots - - name: fitype - type: str - default: permute - outputs: - - default: '' - lineno: 93 - description: estimate feature importances using permutations - build: - functionSourceCode: IyBHZW5lcmF0ZWQgYnkgbnVjbGlvLmV4cG9ydC5OdWNsaW9FeHBvcnRlcgoKaW1wb3J0IG51bXB5IGFzIG5wCmltcG9ydCBwYW5kYXMgYXMgcGQKaW1wb3J0IG51bWJlcnMKCmltcG9ydCBza2xlYXJuCmZyb20gc2tsZWFybi5iYXNlIGltcG9ydCBjbG9uZQpmcm9tIHNrbGVhcm4udXRpbHMgaW1wb3J0IGNoZWNrX3JhbmRvbV9zdGF0ZQoKaW1wb3J0IG1hdHBsb3RsaWIucHlwbG90IGFzIHBsdAppbXBvcnQgc2VhYm9ybiBhcyBzbnMKCmZyb20gY2xvdWRwaWNrbGUgaW1wb3J0IGxvYWQKCmZyb20gbWxydW4uZXhlY3V0aW9uIGltcG9ydCBNTENsaWVudEN0eApmcm9tIG1scnVuLmRhdGFzdG9yZSBpbXBvcnQgRGF0YUl0ZW0KZnJvbSBtbHJ1bi5hcnRpZmFjdHMgaW1wb3J0IGdldF9tb2RlbCwgUGxvdEFydGlmYWN0CmZyb20gdHlwaW5nIGltcG9ydCBVbmlvbiwgQ2FsbGFibGUsIExpc3QKCgpkZWYgX2dldF9uX3NhbXBsZXNfYm9vdHN0cmFwKG5fc2FtcGxlcywgbWF4X3NhbXBsZXMpIC0+IGludDoKICAgICIiImdldCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaW4gYSBib290c3RyYXAgc2FtcGxlCgogICAgcmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIHNhbXBsZXMgdG8gZHJhdyBmb3IgdGhlIGJvb3RzdHJhcCBzYW1wbGUKCiAgICBwcml2YXRlIGFwaSBpbiBza2xlYXJuID49IHYwLjI0LCB0YWtlbiBmcm9tIHNrbGVhcm4uZW5zZW1ibGUuX2ZvcmVzdC5weQoKICAgIDpwYXJhbSBuX3NhbXBsZXM6ICAgTnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIGRhdGFzZXQuCiAgICA6cGFyYW0gbWF4X3NhbXBsZXM6CiAgICAgICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIHNhbXBsZXMgdG8gZHJhdyBmcm9tIHRoZSB0b3RhbCBhdmFpbGFibGU6CiAgICAgICAgICAgIC0gaWYgZmxvYXQsIHRoaXMgaW5kaWNhdGVzIGEgZnJhY3Rpb24gb2YgdGhlIHRvdGFsIGFuZCBzaG91bGQgYmUKICAgICAgICAgICAgICB0aGUgaW50ZXJ2YWwgYCgwLCAxKWA7CiAgICAgICAgICAgIC0gaWYgaW50LCB0aGlzIGluZGljYXRlcyB0aGUgZXhhY3QgbnVtYmVyIG9mIHNhbXBsZXM7CiAgICAgICAgICAgIC0gaWYgTm9uZSwgdGhpcyBpbmRpY2F0ZXMgdGhlIHRvdGFsIG51bWJlciBvZiBzYW1wbGVzLgogICAgIiIiCiAgICBpZiBtYXhfc2FtcGxlcyBpcyBOb25lOgogICAgICAgIHJldHVybiBuX3NhbXBsZXMKCiAgICBpZiBpc2luc3RhbmNlKG1heF9zYW1wbGVzLCBudW1iZXJzLkludGVncmFsKToKICAgICAgICBpZiBub3QgKDEgPD0gbWF4X3NhbXBsZXMgPD0gbl9zYW1wbGVzKToKICAgICAgICAgICAgbXNnID0gImBtYXhfc2FtcGxlc2AgbXVzdCBiZSBpbiByYW5nZSAxIHRvIHt9IGJ1dCBnb3QgdmFsdWUge30iCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IobXNnLmZvcm1hdChuX3NhbXBsZXMsIG1heF9zYW1wbGVzKSkKICAgICAgICByZXR1cm4gbWF4X3NhbXBsZXMKCiAgICBpZiBpc2luc3RhbmNlKG1heF9zYW1wbGVzLCBudW1iZXJzLlJlYWwpOgogICAgICAgIGlmIG5vdCAoMCA8IG1heF9zYW1wbGVzIDwgMSk6CiAgICAgICAgICAgIG1zZyA9ICJgbWF4X3NhbXBsZXNgIG11c3QgYmUgaW4gcmFuZ2UgKDAsIDEpIGJ1dCBnb3QgdmFsdWUge30iCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IobXNnLmZvcm1hdChtYXhfc2FtcGxlcykpCiAgICAgICAgcmV0dXJuIGludChyb3VuZChuX3NhbXBsZXMgKiBtYXhfc2FtcGxlcykpCgogICAgbXNnID0gImBtYXhfc2FtcGxlc2Agc2hvdWxkIGJlIGludCBvciBmbG9hdCwgYnV0IGdvdCB0eXBlICd7fSciCiAgICByYWlzZSBUeXBlRXJyb3IobXNnLmZvcm1hdCh0eXBlKG1heF9zYW1wbGVzKSkpCgoKZGVmIF9nZXRfdW5zYW1wbGVkX2l4KHJhbmRvbV9zdGF0ZSwgbl9zYW1wbGVzOiBpbnQpIC0+IG5wLmFycmF5OgogICAgIiIiCiAgICBmdXR1cmUtcHJvb2YgZ2V0IHVuc2FtcGxlZCBpbmRpY2VzCiAgICAiIiIKICAgIG5fYm9vdHN0cmFwID0gX2dldF9uX3NhbXBsZXNfYm9vdHN0cmFwKG5fc2FtcGxlcywgbl9zYW1wbGVzKQogICAgcmFuZG9tX2luc3RhbmNlID0gY2hlY2tfcmFuZG9tX3N0YXRlKHJhbmRvbV9zdGF0ZSkKICAgIHNhbXBsZV9pbmRpY2VzID0gcmFuZG9tX2luc3RhbmNlLnJhbmRpbnQoMCwgbl9zYW1wbGVzLCBuX2Jvb3RzdHJhcCkKICAgIHNhbXBsZV9jb3VudHMgPSBucC5iaW5jb3VudChzYW1wbGVfaW5kaWNlcywgbWlubGVuZ3RoPW5fc2FtcGxlcykKCiAgICByZXR1cm4gbnAuYXJhbmdlKG5fc2FtcGxlcylbc2FtcGxlX2NvdW50cyA9PSAwXQoKCmRlZiBfb29iX2NsYXNzaWZpZXJfYWNjdXJhY3kocmYsIFhfdHJhaW4sIHlfdHJhaW4pIC0+IGZsb2F0OgogICAgIiIiCiAgICBDb21wdXRlIG91dC1vZi1iYWcgKE9PQikgYWNjdXJhY3kgZm9yIGEgc2Npa2l0LWxlYXJuIGZvcmVzdCBjbGFzc2lmaWVyLgoKICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9zY2lraXQtbGVhcm4vc2Npa2l0LWxlYXJuL2Jsb2IvYTI0YzhiNDYvc2tsZWFybi9lbnNlbWJsZS9mb3Jlc3QucHkjTDQyNQogICAgIiIiCiAgICBYID0gWF90cmFpbi52YWx1ZXMgaWYgaXNpbnN0YW5jZShYX3RyYWluLCBwZC5EYXRhRnJhbWUpIGVsc2UgWF90cmFpbgogICAgeSA9IHlfdHJhaW4udmFsdWVzIGlmIGlzaW5zdGFuY2UoeV90cmFpbiwgcGQuU2VyaWVzKSBlbHNlIHlfdHJhaW4KCiAgICBuX3NhbXBsZXMgPSBsZW4oWCkKICAgIG5fY2xhc3NlcyA9IGxlbihucC51bmlxdWUoeSkpCiAgICBwcmVkaWN0aW9ucyA9IG5wLnplcm9zKChuX3NhbXBsZXMsIG5fY2xhc3NlcykpCiAgICBmb3IgdHJlZSBpbiByZi5lc3RpbWF0b3JzXzoKICAgICAgICB1bnNhbXBsZWRfaW5kaWNlcyA9IF9nZXRfdW5zYW1wbGVkX2l4KHRyZWUucmFuZG9tX3N0YXRlLCBuX3NhbXBsZXMpCiAgICAgICAgdHJlZV9wcmVkcyA9IHRyZWUucHJlZGljdF9wcm9iYShYW3Vuc2FtcGxlZF9pbmRpY2VzLCA6XSkKICAgICAgICBwcmVkaWN0aW9uc1t1bnNhbXBsZWRfaW5kaWNlc10gKz0gdHJlZV9wcmVkcwoKICAgIHByZWRpY3RlZF9jbGFzc19pbmRleGVzID0gbnAuYXJnbWF4KHByZWRpY3Rpb25zLCBheGlzPTEpCiAgICBwcmVkaWN0ZWRfY2xhc3NlcyA9IFtyZi5jbGFzc2VzX1tpXSBmb3IgaSBpbiBwcmVkaWN0ZWRfY2xhc3NfaW5kZXhlc10KCiAgICBvb2Jfc2NvcmUgPSBucC5tZWFuKHkgPT0gcHJlZGljdGVkX2NsYXNzZXMpCgogICAgcmV0dXJuIG9vYl9zY29yZQoKCmRlZiBwZXJtdXRhdGlvbl9pbXBvcnRhbmNlKAogICAgY29udGV4dDogTUxDbGllbnRDdHgsCiAgICBtb2RlbDogRGF0YUl0ZW0sCiAgICBkYXRhc2V0OiBEYXRhSXRlbSwKICAgIGxhYmVsczogc3RyLAogICAgZmlnc3o9KDEwLCA1KSwKICAgIHBsb3RzX2Rlc3Q6IHN0ciA9ICJwbG90cyIsCiAgICBmaXR5cGU6IHN0ciA9ICJwZXJtdXRlIiwKKSAtPiBwZC5EYXRhRnJhbWU6CiAgICAiIiJjYWxjdWxhdGUgY2hhbmdlIGluIG1ldHJpYwoKICAgIHR5cGUgJ3Blcm11dGUnIHVzZXMgYSBwcmUtZXN0aW1hdGVkIG1vZGVsCiAgICB0eXBlICdkcm9wY29sJyB1c2VzIGEgcmUtZXN0aW1hdGVzIG1vZGVsCgogICAgOnBhcmFtIGNvbnRleHQ6ICAgICB0aGUgZnVuY3Rpb24ncyBleGVjdXRpb24gY29udGV4dAogICAgOnBhcmFtIG1vZGVsOiAgICAgICBhIHRyYWluZWQgbW9kZWwKICAgIDpwYXJhbSBkYXRhc2V0OiAgICAgZmVhdHVyZXMgYW5kIGdyb3VuZCB0cnV0aHMsIHJlZ3Jlc3Npb24gdGFyZ2V0cwogICAgOnBhcmFtIGxhYmVscyAgICAgICBuYW1lIG9mIHRoZSBncm91bmQgdHJ1dGhzIGNvbHVtbgogICAgOnBhcmFtIGZpZ3N6OiAgICAgICBtYXRwbG90bGliIGZpZ3VyZSBzaXplCiAgICA6cGFyYW0gcGxvdHNfZGVzdDogIHBhdGggd2l0aGluIGFydGlmYWN0IHN0b3JlCiAgICA6CiAgICAiIiIKICAgIG1vZGVsX2ZpbGUsIG1vZGVsX2RhdGEsIF8gPSBnZXRfbW9kZWwobW9kZWwudXJsLCBzdWZmaXg9Ii5wa2wiKQogICAgbW9kZWwgPSBsb2FkKG9wZW4oc3RyKG1vZGVsX2ZpbGUpLCAicmIiKSkKCiAgICBYID0gZGF0YXNldC5hc19kZigpCiAgICB5ID0gWC5wb3AobGFiZWxzKQogICAgaGVhZGVyID0gWC5jb2x1bW5zCgogICAgbWV0cmljID0gX29vYl9jbGFzc2lmaWVyX2FjY3VyYWN5CgogICAgYmFzZWxpbmUgPSBtZXRyaWMobW9kZWwsIFgsIHkpCgogICAgaW1wID0gW10KICAgIGZvciBjb2wgaW4gWC5jb2x1bW5zOgogICAgICAgIGlmIGZpdHlwZSBpcyAicGVybXV0ZSI6CiAgICAgICAgICAgIHNhdmUgPSBYW2NvbF0uY29weSgpCiAgICAgICAgICAgIFhbY29sXSA9IG5wLnJhbmRvbS5wZXJtdXRhdGlvbihYW2NvbF0pCiAgICAgICAgICAgIG0gPSBtZXRyaWMobW9kZWwsIFgsIHkpCiAgICAgICAgICAgIFhbY29sXSA9IHNhdmUKICAgICAgICAgICAgaW1wLmFwcGVuZChiYXNlbGluZSAtIG0pCiAgICAgICAgZWxpZiBmaXR5cGUgaXMgImRyb3Bjb2wiOgogICAgICAgICAgICBYXyA9IFguZHJvcChjb2wsIGF4aXM9MSkKICAgICAgICAgICAgbW9kZWxfID0gY2xvbmUobW9kZWwpCiAgICAgICAgICAgICNtb2RlbF8ucmFuZG9tX3N0YXRlID0gcmFuZG9tX3N0YXRlCiAgICAgICAgICAgIG1vZGVsXy5maXQoWF8sIHkpCiAgICAgICAgICAgIG8gPSBtb2RlbF8ub29iX3Njb3JlXwogICAgICAgICAgICBpbXAuYXBwZW5kKGJhc2VsaW5lIC0gbykKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bmtub3duIGZpdHlwZSwgb25seSAncGVybXV0ZScgb3IgJ2Ryb3Bjb2wnIHBlcm1pdHRlZCIpCgogICAgemlwcGVkID0gemlwKGltcCwgaGVhZGVyKQogICAgZmVhdHVyZV9pbXAgPSBwZC5EYXRhRnJhbWUoc29ydGVkKHppcHBlZCksIGNvbHVtbnM9WyJpbXBvcnRhbmNlIiwgImZlYXR1cmUiXSkKICAgIGZlYXR1cmVfaW1wLnNvcnRfdmFsdWVzKGJ5PSJpbXBvcnRhbmNlIiwgYXNjZW5kaW5nPUZhbHNlLCBpbnBsYWNlPVRydWUpCgogICAgcGx0LmNsZigpCiAgICBwbHQuZmlndXJlKGZpZ3NpemU9Zmlnc3opCiAgICBzbnMuYmFycGxvdCh4PSJpbXBvcnRhbmNlIiwgeT0iZmVhdHVyZSIsIGRhdGE9ZmVhdHVyZV9pbXApCiAgICBwbHQudGl0bGUoZiJmZWF0dXJlIGltcG9ydGFuY2VzLXtmaXR5cGV9IikKICAgIHBsdC50aWdodF9sYXlvdXQoKQoKICAgIGNvbnRleHQubG9nX2FydGlmYWN0KAogICAgICAgIFBsb3RBcnRpZmFjdChmImZlYXR1cmUgaW1wb3J0YW5jZXMte2ZpdHlwZX0iLCBib2R5PXBsdC5nY2YoKSksCiAgICAgICAgbG9jYWxfcGF0aD1mIntwbG90c19kZXN0fS9mZWF0dXJlLXBlcm11dGF0aW9ucy5odG1sIiwKICAgICkKICAgIGNvbnRleHQubG9nX2RhdGFzZXQoCiAgICAgICAgZiJmZWF0dXJlLWltcG9ydGFuY2VzLXtmaXR5cGV9LXRibCIsIGRmPWZlYXR1cmVfaW1wLCBpbmRleD1GYWxzZQogICAgKQo= - commands: [] - code_origin: https://github.com/daniels290813/functions.git#55a79c32be5d233cc11efcf40cd3edbe309bfdef:/home/kali/functions/feature_perms/feature_perms.py - affinity: null -verbose: false diff --git a/feature_perms/item.yaml b/feature_perms/item.yaml deleted file mode 100644 index bd909d3ee..000000000 --- a/feature_perms/item.yaml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: v1 -categories: -- data-analysis -description: estimate feature importances using permutations -doc: '' -example: feature_perms.ipynb -generationDate: 2022-08-28:17-25 -hidden: false -icon: '' -labels: - author: yjb -maintainers: [] -marketplaceType: '' -mlrunVersion: 1.1.0 -name: feature-perms -platformVersion: 3.5.0 -spec: - filename: feature_perms.py - handler: permutation_importance - image: mlrun/ml-models - kind: job - requirements: [] -url: '' -version: 1.1.0 -test_valid : False diff --git a/feature_perms/requirements.txt b/feature_perms/requirements.txt deleted file mode 100644 index 70a079c7d..000000000 --- a/feature_perms/requirements.txt +++ /dev/null @@ -1,5 +0,0 @@ -scikit-learn -matplotlib -seaborn -scikit-plot - diff --git a/feature_perms/test_feature_perms.py b/feature_perms/test_feature_perms.py deleted file mode 100644 index a59891ea8..000000000 --- a/feature_perms/test_feature_perms.py +++ /dev/null @@ -1,134 +0,0 @@ -# Copyright 2019 Iguazio -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -from mlrun import code_to_function, import_function -from pathlib import Path -import os - -ARTIFACTS_PATH = 'artifacts' -DATA_URL = "https://raw.githubusercontent.com/parrt/random-forest-importances/master/notebooks/data/rent.csv" -FEATURE_OUTPUT = "feature-importances-permute-tbl" - - -def arc_to_parquet(): - from mlrun import import_function - - archive_func = import_function('hub://arc_to_parquet') - - archive_run = archive_func.run( - handler="arc_to_parquet", - params={"key": "rent", "stats": True, "file_ext": "csv"}, - inputs={"archive_url": DATA_URL}, - artifact_path=os.getcwd() + '/artifacts', - local=True, - ) - - return archive_run.artifact('rent').url - - -def sklearn_classifier(run): - cwd = os.getcwd() - file_path = str(Path(cwd).parent.absolute()) + "/sklearn_classifier/sklearn_classifier.py" - fn = code_to_function( - name='test_sklearn_classifier', - filename=file_path, - handler="train_model", - kind="local", - ) - - fn.spec.command = file_path - fn.run( - params={ - "sample": -5_000, # 5k random rows, - "model_pkg_class": "sklearn.ensemble.RandomForestClassifier", - "label_column": "interest_level", - "CLASS_n_estimators": 100, - "CLASS_min_samples_leaf": 1, - "CLASS_n_jobs": -1, - "CLASS_oob_score": True, - }, - handler="train_model", - inputs={"dataset": run.outputs["rent"]}, - artifact_path='artifacts', - ) - - -def train_model(data): - from mlrun import import_function - - train = import_function('hub://sklearn_classifier') - - train_run = train.run( - inputs={"dataset": data}, - params={ - "sample": -5_000, # 5k random rows, - "model_pkg_class": "sklearn.ensemble.RandomForestClassifier", - "label_column": "interest_level", - "CLASS_n_estimators": 100, - "CLASS_min_samples_leaf": 1, - "CLASS_n_jobs": -1, - "CLASS_oob_score": True, - }, - local=True - ) - - return train_run.artifact('model').url - - -def test_feature_selection_run_local(): - data = arc_to_parquet() - model = train_model(data) - labels = "interest_level" - fn = code_to_function( - name='test_run_local_feature_perms', - filename="feature_perms.py", - handler="permutation_importance", - kind="local", - ) - fn.spec.command = "feature_perms.py" - - run = fn.run( - params={ - "labels": labels, - "plots_dest": "plots", - }, - inputs={ - "model": model, - "dataset": data, - }, - artifact_path='artifacts', - ) - - assert run.artifact(FEATURE_OUTPUT).get() - - -def test_feature_perms_import_function(): - data = arc_to_parquet() - model = train_model(data) - labels = "interest_level" - fn = import_function("function.yaml") - - run = fn.run( - params={ - "labels": labels, - "plots_dest": "plots" - }, - inputs={ - "model": model, - "dataset": data}, - artifact_path=os.getcwd() + '/artifacts', - local=True, - ) - - assert run.artifact(FEATURE_OUTPUT).get() diff --git a/get_offline_features/function.yaml b/get_offline_features/function.yaml deleted file mode 100644 index 3c6a8a87a..000000000 --- a/get_offline_features/function.yaml +++ /dev/null @@ -1,127 +0,0 @@ -kind: job -metadata: - name: get-offline-features - tag: '' - hash: 5ac6c4e2b67440b464710c072708a3581125c2f8 - project: '' - labels: - author: yonish - categories: - - data-preparation - - data-analysis - - feature-store -spec: - command: '' - args: [] - image: mlrun/mlrun - build: - functionSourceCode: IyBDb3B5cmlnaHQgMjAxOSBJZ3VhemlvCiMKIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiMKZnJvbSB0eXBpbmcgaW1wb3J0IFVuaW9uLCBMaXN0LCBEaWN0CgppbXBvcnQgbWxydW4KaW1wb3J0IG1scnVuLmZlYXR1cmVfc3RvcmUgYXMgZnMKZnJvbSBtbHJ1bi5kYXRhc3RvcmUuc3RvcmVfcmVzb3VyY2VzIGltcG9ydCBpc19zdG9yZV91cmksIHBhcnNlX3N0b3JlX3VyaQpmcm9tIG1scnVuLmRhdGFzdG9yZS50YXJnZXRzIGltcG9ydCBnZXRfdGFyZ2V0X2RyaXZlciwga2luZF90b19kcml2ZXIKZnJvbSBtbHJ1bi5kYXRhc3RvcmUuYmFzZSBpbXBvcnQgRGF0YUl0ZW0KZnJvbSBtbHJ1bi5leGVjdXRpb24gaW1wb3J0IE1MQ2xpZW50Q3R4CmZyb20gbWxydW4udXRpbHMgaW1wb3J0IFN0b3JlUHJlZml4LCBwYXJzZV92ZXJzaW9uZWRfb2JqZWN0X3VyaQpmcm9tIG1scnVuLmVycm9ycyBpbXBvcnQgTUxSdW5JbnZhbGlkQXJndW1lbnRFcnJvcgoKCmRlZiBnZXRfb2ZmbGluZV9mZWF0dXJlcygKICAgIGNvbnRleHQ6IE1MQ2xpZW50Q3R4LAogICAgZmVhdHVyZV92ZWN0b3I6IHN0ciwKICAgIGZlYXR1cmVzOiBVbmlvbltMaXN0W3N0cl0sIE5vbmVdID0gTm9uZSwKICAgIGxhYmVsX2ZlYXR1cmU6IHN0ciA9IE5vbmUsCiAgICBkZXNjcmlwdGlvbjogc3RyID0gTm9uZSwKICAgIGVudGl0eV9yb3dzOiBEYXRhSXRlbSA9IE5vbmUsCiAgICBlbnRpdHlfdGltZXN0YW1wX2NvbHVtbjogc3RyID0gTm9uZSwKICAgIHRhcmdldDogVW5pb25bc3RyLCBEaWN0XSA9IE5vbmUsCiAgICBydW5fY29uZmlnOiBVbmlvbltzdHIsIERpY3RdID0gTm9uZSwKICAgIGRyb3BfY29sdW1uczogTGlzdFtzdHJdID0gTm9uZSwKICAgIHN0YXJ0X3RpbWU6IHN0ciA9IE5vbmUsCiAgICBlbmRfdGltZTogc3RyID0gTm9uZSwKICAgIHdpdGhfaW5kZXhlczogYm9vbCA9IEZhbHNlLAogICAgdXBkYXRlX3N0YXRzOiBib29sID0gRmFsc2UsCik6CiAgICAiIiJyZXRyaWV2ZSBvZmZsaW5lIGZlYXR1cmUgdmVjdG9yIHJlc3VsdHMKCiAgICBzcGVjaWZ5IGEgZmVhdHVyZSB2ZWN0b3Igb2JqZWN0L3VyaSBhbmQgcmV0cmlldmUgdGhlIGRlc2lyZWQgZmVhdHVyZXMsIHRoZWlyIG1ldGFkYXRhCiAgICBhbmQgc3RhdGlzdGljcy4gcmV0dXJucyA6cHk6Y2xhc3M6YH5tbHJ1bi5mZWF0dXJlX3N0b3JlLk9mZmxpbmVWZWN0b3JSZXNwb25zZWAsCiAgICByZXN1bHRzIGNhbiBiZSByZXR1cm5lZCBhcyBhIGRhdGFmcmFtZSBvciB3cml0dGVuIHRvIGEgdGFyZ2V0LgogICAgSWYgZmVhdHVyZSB2ZWN0b3IgZG9lcyBub3QgZXhpc3QsIGEgbmV3IG9uZSB3aWxsIGJlIGNyZWF0ZWQgYW5kIHNhdmVkIHdpdGggdGhlIGdpdmVuIGZlYXR1cmVzLgoKICAgIFRoZSBzdGFydF90aW1lIGFuZCBlbmRfdGltZSBhdHRyaWJ1dGVzIGFsbG93IGZpbHRlcmluZyB0aGUgZGF0YSB0byBhIGdpdmVuIHRpbWUgcmFuZ2UsIHRoZXkgYWNjZXB0CiAgICBzdHJpbmcgdmFsdWVzIG9yIHBhbmRhcyBgVGltZXN0YW1wYCBvYmplY3RzLCBzdHJpbmcgdmFsdWVzIGNhbiBhbHNvIGJlIHJlbGF0aXZlLCBmb3IgZXhhbXBsZToKICAgICJub3ciLCAibm93IC0gMWQyaCIsICJub3crNW0iLCB3aGVyZSBhIHZhbGlkIHBhbmRhcyBUaW1lZGVsdGEgc3RyaW5nIGZvbGxvd3MgdGhlIHZlcmIgIm5vdyIsCiAgICBmb3IgdGltZSBhbGlnbm1lbnQgeW91IGNhbiB1c2UgdGhlIHZlcmIgImZsb29yIiBlLmcuICJub3cgLTFkIGZsb29yIDFIIiB3aWxsIGFsaWduIHRoZSB0aW1lIHRvIHRoZSBsYXN0IGhvdXIKICAgICh0aGUgZmxvb3Igc3RyaW5nIGlzIHBhc3NlZCB0byBwYW5kYXMuVGltZXN0YW1wLmZsb29yKCksIGNhbiB1c2UgRCwgSCwgVCwgUyBmb3IgZGF5LCBob3VyLCBtaW4sIHNlYyBhbGlnbm1lbnQpCgoKICAgIDpwYXJhbSBjb250ZXh0OiAgICAgICAgTUxSdW4gY29udGV4dAogICAgOnBhcmFtIGZlYXR1cmVfdmVjdG9yOiBmZWF0dXJlIHZlY3RvciB1cmkKICAgIDpwYXJhbSBmZWF0dXJlczogICAgICAgUmVsZXZhbnQgb25seSBpZiBmZWF0dXJlX3ZlY3RvciBub3QgZXhpc3QuIGxpc3Qgb2YgZmVhdHVyZSB0byBjb2xsZWN0IHRvIHRoaXMgdmVjdG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCBbPHByb2plY3Q+L108ZmVhdHVyZV9zZXQ+LjxmZWF0dXJlX25hbWUgb3IgKj4gW2FzIDxhbGlhcz5dCiAgICA6cGFyYW0gbGFiZWxfZmVhdHVyZTogIGZlYXR1cmUgbmFtZSB0byBiZSB1c2VkIGFzIGxhYmVsIGRhdGEKICAgIDpwYXJhbSBkZXNjcmlwdGlvbjogICAgdGV4dCBkZXNjcmlwdGlvbiBvZiB0aGUgdmVjdG9yCiAgICA6cGFyYW0gZW50aXR5X3Jvd3M6ICAgIFVSSSBvZiB0aGUgZGF0YSBlbnRpdHkgcm93cyB0byBqb2luIHdpdGgKICAgIDpwYXJhbSB0YXJnZXQ6ICAgICAgICAgd2hlcmUgdG8gd3JpdGUgdGhlIHJlc3VsdHMgdG8KICAgIDpwYXJhbSBkcm9wX2NvbHVtbnM6ICAgbGlzdCBvZiBjb2x1bW5zIHRvIGRyb3AgZnJvbSB0aGUgZmluYWwgcmVzdWx0CiAgICA6cGFyYW0gZW50aXR5X3RpbWVzdGFtcF9jb2x1bW46IHRpbWVzdGFtcCBjb2x1bW4gbmFtZSBpbiB0aGUgZW50aXR5IHJvd3MgZGF0YWZyYW1lCiAgICA6cGFyYW0gcnVuX2NvbmZpZzogICAgIGZ1bmN0aW9uIGFuZC9vciBydW4gY29uZmlndXJhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICBzZWUgOnB5OmNsYXNzOmB+bWxydW4uZmVhdHVyZV9zdG9yZS5SdW5Db25maWdgCiAgICA6cGFyYW0gc3RhcnRfdGltZTogICAgICBkYXRldGltZSwgbG93IGxpbWl0IG9mIHRpbWUgbmVlZGVkIHRvIGJlIGZpbHRlcmVkLiBPcHRpb25hbAogICAgICAgIGVudGl0eV90aW1lc3RhbXBfY29sdW1uIG11c3QgYmUgcGFzc2VkIHdoZW4gdXNpbmcgdGltZSBmaWx0ZXJpbmcKICAgIDpwYXJhbSBlbmRfdGltZTogICAgICAgIGRhdGV0aW1lLCBoaWdoIGxpbWl0IG9mIHRpbWUgbmVlZGVkIHRvIGJlIGZpbHRlcmVkLiBPcHRpb25hbAogICAgICAgIGVudGl0eV90aW1lc3RhbXBfY29sdW1uIG11c3QgYmUgcGFzc2VkIHdoZW4gdXNpbmcgdGltZSBmaWx0ZXJpbmcKICAgIDpwYXJhbSB3aXRoX2luZGV4ZXM6ICAgIHJldHVybiB2ZWN0b3Igd2l0aCBpbmRleCBjb2x1bW5zIChkZWZhdWx0IEZhbHNlKQogICAgOnBhcmFtIHVwZGF0ZV9zdGF0czogICAgdXBkYXRlIGZlYXR1cmVzIHN0YXRpc3RpY3MgZnJvbSB0aGUgcmVxdWVzdGVkIGZlYXR1cmUgc2V0cyBvbiB0aGUgdmVjdG9yLiBEZWZhdWx0IGlzIEZhbHNlLgoKICAgIDpyZXR1cm5zIGZlYXR1cmVfdmVjdG9yIGlucHV0CiAgICAiIiIKCiAgICBpZiBmZWF0dXJlczoKICAgICAgICAjIENyZWF0aW5nIGEgbmV3IEZlYXR1cmVWZWN0b3IgYW5kIHNhdmluZzoKICAgICAgICBpZiBpc19zdG9yZV91cmkoZmVhdHVyZV92ZWN0b3IpOgogICAgICAgICAgICBwcmVmaXgsIG5ld191cmkgPSBwYXJzZV9zdG9yZV91cmkoZmVhdHVyZV92ZWN0b3IpCiAgICAgICAgICAgIGlmIHByZWZpeCAhPSBTdG9yZVByZWZpeC5GZWF0dXJlVmVjdG9yOgogICAgICAgICAgICAgICAgcmFpc2UgTUxSdW5JbnZhbGlkQXJndW1lbnRFcnJvcigKICAgICAgICAgICAgICAgICAgICBmInByb3ZpZGVkIHN0b3JlIHVyaSAoe2ZlYXR1cmVfdmVjdG9yfSkgZG9lcyBub3QgcmVwcmVzZW50IGEgZmVhdHVyZSB2ZWN0b3IgKHByZWZpeD17cHJlZml4fSkiCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGZlYXR1cmVfdmVjdG9yID0gbmV3X3VyaQoKICAgICAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYiQ3JlYXRpbmcgRmVhdHVyZVZlY3RvciB7ZmVhdHVyZV92ZWN0b3J9IikKICAgICAgICBwcm9qZWN0LCBuYW1lLCB0YWcsIF8gPSBwYXJzZV92ZXJzaW9uZWRfb2JqZWN0X3VyaShmZWF0dXJlX3ZlY3RvciwgbWxydW4ubWxjb25mLmRlZmF1bHRfcHJvamVjdCkKICAgICAgICB2ZWN0b3IgPSBmcy5GZWF0dXJlVmVjdG9yKG5hbWUsIGZlYXR1cmVzLCBsYWJlbF9mZWF0dXJlPWxhYmVsX2ZlYXR1cmUsIGRlc2NyaXB0aW9uPWRlc2NyaXB0aW9uKQogICAgICAgIHZlY3Rvci5tZXRhZGF0YS5wcm9qZWN0ID0gcHJvamVjdAogICAgICAgIHZlY3Rvci5tZXRhZGF0YS50YWcgPSB0YWcKICAgICAgICB2ZWN0b3Iuc2F2ZSgpCiAgICAgICAgZmVhdHVyZV92ZWN0b3JfdXJpID0gdmVjdG9yLnVyaQogICAgZWxzZToKICAgICAgICBpZiBpc19zdG9yZV91cmkoZmVhdHVyZV92ZWN0b3IpOgogICAgICAgICAgICBmZWF0dXJlX3ZlY3Rvcl91cmkgPSBmZWF0dXJlX3ZlY3RvcgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHZlY3RvciA9IGZzLmdldF9mZWF0dXJlX3ZlY3RvcihmZWF0dXJlX3ZlY3RvcikKICAgICAgICAgICAgZmVhdHVyZV92ZWN0b3JfdXJpID0gdmVjdG9yLnVyaQoKICAgICMgUHJlcGFyaW5nIGVudGl0eV9yb3dzOgogICAgaWYgZW50aXR5X3Jvd3MgaXMgbm90IE5vbmU6CiAgICAgICAgY29udGV4dC5sb2dnZXIuaW5mbyhmIkNyZWF0aW5nIERhdGFGcmFtZSBmcm9tIGVudGl0eV9yb3dzID0ge2VudGl0eV9yb3dzfSIpCiAgICAgICAgZW50aXR5X3Jvd3MgPSBlbnRpdHlfcm93cy5hc19kZigpCgogICAgIyBQcmVwYXJpbmcgdGFyZ2V0OgogICAgaWYgdGFyZ2V0OgogICAgICAgIGlmIGlzaW5zdGFuY2UodGFyZ2V0LCBzdHIpOgogICAgICAgICAgICB0YXJnZXQgPSBraW5kX3RvX2RyaXZlclt0YXJnZXRdKCkKCiAgICAgICAgbmFtZSA9IHRhcmdldC5uYW1lIGlmIGhhc2F0dHIodGFyZ2V0LCAibmFtZSIpIGVsc2UgdGFyZ2V0WyJuYW1lIl0KICAgICAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYiUHJlcGFyaW5nICd7bmFtZX0nIHRhcmdldCIpCiAgICAgICAgdGFyZ2V0ID0gZ2V0X3RhcmdldF9kcml2ZXIodGFyZ2V0KQogICAgaWYgaGFzYXR0cih0YXJnZXQsICdwYXRoJykgYW5kIHRhcmdldC5wYXRoOgogICAgICAgIGNvbnRleHQubG9nX3Jlc3VsdCgidGFyZ2V0IiwgdGFyZ2V0LnBhdGgpCgogICAgIyBQcmVwYXJpbmcgcnVuX2NvbmZpZzoKICAgIGlmIHJ1bl9jb25maWcgYW5kIGlzaW5zdGFuY2UocnVuX2NvbmZpZywgZGljdCk6CiAgICAgICAgY29udGV4dC5sb2dnZXIuaW5mbygiUHJlcGFyaW5nIHJ1biBjb25maWd1cmF0aW9uIikKICAgICAgICBydW5fY29uZmlnID0gZnMuUnVuQ29uZmlnKCoqcnVuX2NvbmZpZykKCiAgICAjIENhbGxpbmcgZ2V0X29mZmxpbmVfZmVhdHVyZXM6CiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKAogICAgICAgIGYiZ2V0dGluZyBvZmZsaW5lIGZlYXR1cmVzIGZyb20gdGhlIEZlYXR1cmVWZWN0b3Ige2ZlYXR1cmVfdmVjdG9yfSIKICAgICkKICAgIGZzLmdldF9vZmZsaW5lX2ZlYXR1cmVzKAogICAgICAgIGZlYXR1cmVfdmVjdG9yPWZlYXR1cmVfdmVjdG9yX3VyaSwKICAgICAgICBlbnRpdHlfcm93cz1lbnRpdHlfcm93cywKICAgICAgICBlbnRpdHlfdGltZXN0YW1wX2NvbHVtbj1lbnRpdHlfdGltZXN0YW1wX2NvbHVtbiwKICAgICAgICB0YXJnZXQ9dGFyZ2V0LAogICAgICAgIHJ1bl9jb25maWc9cnVuX2NvbmZpZywKICAgICAgICBkcm9wX2NvbHVtbnM9ZHJvcF9jb2x1bW5zLAogICAgICAgIHN0YXJ0X3RpbWU9c3RhcnRfdGltZSwKICAgICAgICBlbmRfdGltZT1lbmRfdGltZSwKICAgICAgICB3aXRoX2luZGV4ZXM9d2l0aF9pbmRleGVzLAogICAgICAgIHVwZGF0ZV9zdGF0cz11cGRhdGVfc3RhdHMsCiAgICApCgogICAgY29udGV4dC5sb2dfcmVzdWx0KCJmZWF0dXJlX3ZlY3RvciIsIGZlYXR1cmVfdmVjdG9yKQogICAgY29udGV4dC5sb2dfcmVzdWx0KCJmZWF0dXJlX3ZlY3Rvcl91cmkiLCBmZWF0dXJlX3ZlY3Rvcl91cmkpCg== - commands: [] - code_origin: https://github.com/yonishelach/functions.git#82aab1724569d20c73cca114beb2fac0821d3383:/Users/Yonatan_Shelach/projects/functions/get_offline_features/get_offline_features.py - origin_filename: /Users/Yonatan_Shelach/projects/functions/get_offline_features/get_offline_features.py - entry_points: - get_offline_features: - name: get_offline_features - doc: 'retrieve offline feature vector results - - - specify a feature vector object/uri and retrieve the desired features, their - metadata - - and statistics. returns :py:class:`~mlrun.feature_store.OfflineVectorResponse`, - - results can be returned as a dataframe or written to a target. - - If feature vector does not exist, a new one will be created and saved with - the given features. - - - The start_time and end_time attributes allow filtering the data to a given - time range, they accept - - string values or pandas `Timestamp` objects, string values can also be relative, - for example: - - "now", "now - 1d2h", "now+5m", where a valid pandas Timedelta string follows - the verb "now", - - for time alignment you can use the verb "floor" e.g. "now -1d floor 1H" will - align the time to the last hour - - (the floor string is passed to pandas.Timestamp.floor(), can use D, H, T, - S for day, hour, min, sec alignment)' - parameters: - - name: context - type: MLClientCtx - doc: MLRun context - default: '' - - name: feature_vector - type: str - doc: feature vector uri - default: '' - - name: features - type: Union[List[str], ] - doc: Relevant only if feature_vector not exist. list of feature to collect - to this vector format [/]. [as - ] - default: null - - name: label_feature - type: str - doc: feature name to be used as label data - default: null - - name: description - type: str - doc: text description of the vector - default: null - - name: entity_rows - type: DataItem - doc: URI of the data entity rows to join with - default: null - - name: entity_timestamp_column - type: str - doc: timestamp column name in the entity rows dataframe - default: null - - name: target - type: Union[str, Dict] - doc: where to write the results to - default: null - - name: run_config - type: Union[str, Dict] - doc: function and/or run configuration see :py:class:`~mlrun.feature_store.RunConfig` - default: null - - name: drop_columns - type: List[str] - doc: list of columns to drop from the final result - default: null - - name: start_time - type: str - doc: datetime, low limit of time needed to be filtered. Optional entity_timestamp_column - must be passed when using time filtering - default: null - - name: end_time - type: str - doc: datetime, high limit of time needed to be filtered. Optional entity_timestamp_column - must be passed when using time filtering - default: null - - name: with_indexes - type: bool - doc: return vector with index columns (default False) - default: false - - name: update_stats - type: bool - doc: update features statistics from the requested feature sets on the vector. - Default is False. - default: false - outputs: - - default: '' - lineno: 27 - description: retrieve offline feature vector results - default_handler: get_offline_features - disable_auto_mount: false - env: [] - priority_class_name: '' - preemption_mode: prevent - affinity: null - tolerations: null - security_context: {} -verbose: false diff --git a/get_offline_features/get_offline_features.ipynb b/get_offline_features/get_offline_features.ipynb deleted file mode 100644 index d97402a2e..000000000 --- a/get_offline_features/get_offline_features.ipynb +++ /dev/null @@ -1,1536 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# `get_offline_features()` from MLRun FeatureStore\n", - "\n", - "This MLRun Function has the following `params`:\n", - "\n", - "- `feature_vector: str`, feature vector uri.\n", - "\n", - "- `entity_rows: DataItem` = None, URI of the data entity rows to join with.\n", - "\n", - "- `entity_timestamp_column: str = None`, timestamp column name in the entity rows dataframe.\n", - "\n", - "- `target: Union[str, Dict] = None`, where to write the results to.\n", - "\n", - "- `run_config: Union[str, Dict] = None`, function and/or run configuration see :py:class:`~mlrun.feature_store.RunConfig`.\n", - "\n", - "- `drop_columns: List[str] = None`, list of columns to drop from the final result. \n", - "\n", - "- `start_time: str = None`, datetime, low limit of time needed to be filtered. Optional. `entity_timestamp_column` must be passed when using time filtering.\n", - "\n", - "- `end_time: str = None`, datetime, high limit of time needed to be filtered. Optional. `entity_timestamp_column` must be passed when using time filtering.\n", - "\n", - "- `with_indexes: bool = False`, return vector with index columns (default False).\n", - "\n", - "- `update_stats: bool = False`, update features statistics from the requested feature sets on the vector. Default is False." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import mlrun\n", - "import mlrun.feature_store as fstore\n", - "from mlrun.datastore.targets import CSVTarget\n", - "from mlrun.datastore.sources import CSVSource\n", - "from mlrun.run import get_dataitem\n", - "from mlrun.feature_store.steps import *\n", - "from mlrun.features import MinMaxValidator\n", - "import pandas as pd\n", - "import datetime\n", - "import os" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2022-01-31 14:41:48,288 [info] loaded project get-offline-features from MLRun DB\n" - ] - } - ], - "source": [ - "ABS_PATH = 'v3io://users/{}/get_offline_features/'.format(os.environ['V3IO_USERNAME'])\n", - "# Initialize the MLRun project object\n", - "project = mlrun.get_or_create_project('get-offline-features', context=\"./\", user_project=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Generating the Same FeatureSets and FeatureVecotrs Based on the Stocks Example" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Create Sample Data For Demo" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "quotes = pd.DataFrame(\n", - " {\n", - " \"time\": [\n", - " pd.Timestamp(\"2016-05-25 13:30:00.023\"),\n", - " pd.Timestamp(\"2016-05-25 13:30:00.023\"),\n", - " pd.Timestamp(\"2016-05-25 13:30:00.030\"),\n", - " pd.Timestamp(\"2016-05-25 13:30:00.041\"),\n", - " pd.Timestamp(\"2016-05-25 13:30:00.048\"),\n", - " pd.Timestamp(\"2016-05-25 13:30:00.049\"),\n", - " pd.Timestamp(\"2016-05-25 13:30:00.072\"),\n", - " pd.Timestamp(\"2016-05-25 13:30:00.075\")\n", - " ],\n", - " \"ticker\": [\n", - " \"GOOG\",\n", - " \"MSFT\",\n", - " \"MSFT\",\n", - " \"MSFT\",\n", - " \"GOOG\",\n", - " \"AAPL\",\n", - " \"GOOG\",\n", - " \"MSFT\"\n", - " ],\n", - " \"bid\": [720.50, 51.95, 51.97, 51.99, 720.50, 97.99, 720.50, 52.01],\n", - " \"ask\": [720.93, 51.96, 51.98, 52.00, 720.93, 98.01, 720.88, 52.03]\n", - " }\n", - ")\n", - "\n", - "trades = pd.DataFrame(\n", - " {\n", - " \"time\": [\n", - " pd.Timestamp(\"2016-05-25 13:30:00.023\"),\n", - " pd.Timestamp(\"2016-05-25 13:30:00.038\"),\n", - " pd.Timestamp(\"2016-05-25 13:30:00.048\"),\n", - " pd.Timestamp(\"2016-05-25 13:30:00.048\"),\n", - " pd.Timestamp(\"2016-05-25 13:30:00.048\")\n", - " ],\n", - " \"ticker\": [\"MSFT\", \"MSFT\", \"GOOG\", \"GOOG\", \"AAPL\"],\n", - " \"price\": [51.95, 51.95, 720.77, 720.92, 98.0],\n", - " \"quantity\": [75, 155, 100, 100, 100]\n", - " }\n", - ")\n", - "\n", - "stocks = pd.DataFrame(\n", - " {\n", - " \"ticker\": [\"MSFT\", \"GOOG\", \"AAPL\"],\n", - " \"name\": [\"Microsoft Corporation\", \"Alphabet Inc\", \"Apple Inc\"],\n", - " \"exchange\": [\"NASDAQ\", \"NASDAQ\", \"NASDAQ\"]\n", - " }\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def move_date(df, col):\n", - " max_date = df[col].max()\n", - " now_date = datetime.datetime.now()\n", - " delta = now_date - max_date \n", - " df[col] = df[col] + delta \n", - " return df\n", - "\n", - "quotes = move_date(quotes, \"time\")\n", - "trades = move_date(trades, \"time\")\n", - "trades.to_csv('trades.csv', index=False)\n", - "data_uri = os.path.join(ABS_PATH, 'trades.csv')" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
timetickerbidask
02022-01-31 14:41:48.260566GOOG720.50720.93
12022-01-31 14:41:48.260566MSFT51.9551.96
22022-01-31 14:41:48.267566MSFT51.9751.98
32022-01-31 14:41:48.278566MSFT51.9952.00
42022-01-31 14:41:48.285566GOOG720.50720.93
52022-01-31 14:41:48.286566AAPL97.9998.01
62022-01-31 14:41:48.309566GOOG720.50720.88
72022-01-31 14:41:48.312566MSFT52.0152.03
\n", - "
" - ], - "text/plain": [ - " time ticker bid ask\n", - "0 2022-01-31 14:41:48.260566 GOOG 720.50 720.93\n", - "1 2022-01-31 14:41:48.260566 MSFT 51.95 51.96\n", - "2 2022-01-31 14:41:48.267566 MSFT 51.97 51.98\n", - "3 2022-01-31 14:41:48.278566 MSFT 51.99 52.00\n", - "4 2022-01-31 14:41:48.285566 GOOG 720.50 720.93\n", - "5 2022-01-31 14:41:48.286566 AAPL 97.99 98.01\n", - "6 2022-01-31 14:41:48.309566 GOOG 720.50 720.88\n", - "7 2022-01-31 14:41:48.312566 MSFT 52.01 52.03" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "quotes" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
timetickerpricequantity
02022-01-31 14:41:48.288476MSFT51.9575
12022-01-31 14:41:48.303476MSFT51.95155
22022-01-31 14:41:48.313476GOOG720.77100
32022-01-31 14:41:48.313476GOOG720.92100
42022-01-31 14:41:48.313476AAPL98.00100
\n", - "
" - ], - "text/plain": [ - " time ticker price quantity\n", - "0 2022-01-31 14:41:48.288476 MSFT 51.95 75\n", - "1 2022-01-31 14:41:48.303476 MSFT 51.95 155\n", - "2 2022-01-31 14:41:48.313476 GOOG 720.77 100\n", - "3 2022-01-31 14:41:48.313476 GOOG 720.92 100\n", - "4 2022-01-31 14:41:48.313476 AAPL 98.00 100" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "trades" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
tickernameexchange
0MSFTMicrosoft CorporationNASDAQ
1GOOGAlphabet IncNASDAQ
2AAPLApple IncNASDAQ
\n", - "
" - ], - "text/plain": [ - " ticker name exchange\n", - "0 MSFT Microsoft Corporation NASDAQ\n", - "1 GOOG Alphabet Inc NASDAQ\n", - "2 AAPL Apple Inc NASDAQ" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "stocks" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Build & Ingest Simple Feature Set (stocks)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
nameexchange
ticker
MSFTMicrosoft CorporationNASDAQ
GOOGAlphabet IncNASDAQ
AAPLApple IncNASDAQ
\n", - "
" - ], - "text/plain": [ - " name exchange\n", - "ticker \n", - "MSFT Microsoft Corporation NASDAQ\n", - "GOOG Alphabet Inc NASDAQ\n", - "AAPL Apple Inc NASDAQ" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# add feature set without time column (stock ticker metadata) \n", - "stocks_set = fstore.FeatureSet(\"stocks\", entities=[fstore.Entity(\"ticker\")])\n", - "fstore.ingest(stocks_set, stocks, infer_options=fstore.InferOptions.default())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Build Advanced feature set - with feature engineering pipeline" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "quotes_set = fstore.FeatureSet(\"stock-quotes\", entities=[fstore.Entity(\"ticker\")])" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "class MyMap(MapClass):\n", - " def __init__(self, multiplier=1, **kwargs):\n", - " super().__init__(**kwargs)\n", - " self._multiplier = multiplier\n", - "\n", - " def do(self, event):\n", - " event[\"multi\"] = event[\"bid\"] * self._multiplier\n", - " return event" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "mlrun-flow\n", - "\n", - "\n", - "\n", - "_start\n", - "\n", - "start\n", - "\n", - "\n", - "\n", - "MyMap\n", - "\n", - "MyMap\n", - "\n", - "\n", - "\n", - "_start->MyMap\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "storey.Extend\n", - "\n", - "storey.Extend\n", - "\n", - "\n", - "\n", - "MyMap->storey.Extend\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "filter\n", - "\n", - "filter\n", - "\n", - "\n", - "\n", - "storey.Extend->filter\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "FeaturesetValidator\n", - "\n", - "FeaturesetValidator\n", - "\n", - "\n", - "\n", - "filter->FeaturesetValidator\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "Aggregates\n", - "\n", - "Aggregates\n", - "\n", - "\n", - "\n", - "FeaturesetValidator->Aggregates\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "parquet\n", - "\n", - "\n", - "parquet\n", - "\n", - "\n", - "\n", - "Aggregates->parquet\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "nosql\n", - "\n", - "\n", - "nosql\n", - "\n", - "\n", - "\n", - "Aggregates->nosql\n", - "\n", - "\n", - "\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "quotes_set.graph.to(\"MyMap\", multiplier=3)\\\n", - " .to(\"storey.Extend\", _fn=\"({'extra': event['bid'] * 77})\")\\\n", - " .to(\"storey.Filter\", \"filter\", _fn=\"(event['bid'] > 51.92)\")\\\n", - " .to(FeaturesetValidator())\n", - "\n", - "quotes_set.add_aggregation(\"ask\", [\"sum\", \"max\"], \"1h\", \"10m\", name=\"asks1\")\n", - "quotes_set.add_aggregation(\"ask\", [\"sum\", \"max\"], \"5h\", \"10m\", name=\"asks5\")\n", - "quotes_set.add_aggregation(\"bid\", [\"min\", \"max\"], \"1h\", \"10m\", name=\"bids\")\n", - "\n", - "# add feature validation policy\n", - "quotes_set[\"bid\"] = fstore.Feature(validator=MinMaxValidator(min=52, severity=\"info\"))\n", - "\n", - "# add default target definitions and plot\n", - "quotes_set.set_targets()\n", - "quotes_set.plot(rankdir=\"LR\", with_targets=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Ingest Data Into Offline And Online Stores" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "info! bid value is smaller than min, key=['MSFT'] time=2022-01-31 14:41:51.377248+00:00 args={'min': 52, 'value': 51.95}\n", - "info! bid value is smaller than min, key=['MSFT'] time=2022-01-31 14:41:51.377927+00:00 args={'min': 52, 'value': 51.97}\n", - "info! bid value is smaller than min, key=['MSFT'] time=2022-01-31 14:41:51.378103+00:00 args={'min': 52, 'value': 51.99}\n", - "info! bid value is smaller than min, key=['MSFT'] time=2022-01-31 14:41:51.578640+00:00 args={'min': 52, 'value': 51.95}\n", - "info! bid value is smaller than min, key=['MSFT'] time=2022-01-31 14:41:51.581692+00:00 args={'min': 52, 'value': 51.97}\n", - "info! bid value is smaller than min, key=['MSFT'] time=2022-01-31 14:41:51.584351+00:00 args={'min': 52, 'value': 51.99}\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
asks1_max_1hasks1_sum_1hasks5_max_5hasks5_sum_5hbids_max_1hbids_min_1htimebidaskmultiextra
ticker
GOOG720.93720.93720.93720.93720.50720.502022-01-31 14:41:48.260566720.50720.932161.5055478.50
MSFT51.9651.9651.9651.9651.9551.952022-01-31 14:41:48.26056651.9551.96155.854000.15
MSFT51.98103.9451.98103.9451.9751.952022-01-31 14:41:48.26756651.9751.98155.914001.69
MSFT52.00155.9452.00155.9451.9951.952022-01-31 14:41:48.27856651.9952.00155.974003.23
GOOG720.931441.86720.931441.86720.50720.502022-01-31 14:41:48.285566720.50720.932161.5055478.50
AAPL98.0198.0198.0198.0197.9997.992022-01-31 14:41:48.28656697.9998.01293.977545.23
GOOG720.932162.74720.932162.74720.50720.502022-01-31 14:41:48.309566720.50720.882161.5055478.50
MSFT52.03207.9752.03207.9752.0151.952022-01-31 14:41:48.31256652.0152.03156.034004.77
\n", - "
" - ], - "text/plain": [ - " asks1_max_1h asks1_sum_1h asks5_max_5h asks5_sum_5h bids_max_1h \\\n", - "ticker \n", - "GOOG 720.93 720.93 720.93 720.93 720.50 \n", - "MSFT 51.96 51.96 51.96 51.96 51.95 \n", - "MSFT 51.98 103.94 51.98 103.94 51.97 \n", - "MSFT 52.00 155.94 52.00 155.94 51.99 \n", - "GOOG 720.93 1441.86 720.93 1441.86 720.50 \n", - "AAPL 98.01 98.01 98.01 98.01 97.99 \n", - "GOOG 720.93 2162.74 720.93 2162.74 720.50 \n", - "MSFT 52.03 207.97 52.03 207.97 52.01 \n", - "\n", - " bids_min_1h time bid ask multi \\\n", - "ticker \n", - "GOOG 720.50 2022-01-31 14:41:48.260566 720.50 720.93 2161.50 \n", - "MSFT 51.95 2022-01-31 14:41:48.260566 51.95 51.96 155.85 \n", - "MSFT 51.95 2022-01-31 14:41:48.267566 51.97 51.98 155.91 \n", - "MSFT 51.95 2022-01-31 14:41:48.278566 51.99 52.00 155.97 \n", - "GOOG 720.50 2022-01-31 14:41:48.285566 720.50 720.93 2161.50 \n", - "AAPL 97.99 2022-01-31 14:41:48.286566 97.99 98.01 293.97 \n", - "GOOG 720.50 2022-01-31 14:41:48.309566 720.50 720.88 2161.50 \n", - "MSFT 51.95 2022-01-31 14:41:48.312566 52.01 52.03 156.03 \n", - "\n", - " extra \n", - "ticker \n", - "GOOG 55478.50 \n", - "MSFT 4000.15 \n", - "MSFT 4001.69 \n", - "MSFT 4003.23 \n", - "GOOG 55478.50 \n", - "AAPL 7545.23 \n", - "GOOG 55478.50 \n", - "MSFT 4004.77 " - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# save ingest data and print the FeatureSet spec\n", - "fstore.ingest(quotes_set, quotes)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Get an Offline Feature Vector" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "features = [\n", - " \"stock-quotes.multi\",\n", - " \"stock-quotes.asks5_sum_5h as total_ask\",\n", - " \"stock-quotes.bids_min_1h\",\n", - " \"stock-quotes.bids_max_1h\",\n", - " \"stocks.*\",\n", - "]\n", - "\n", - "vector = fstore.FeatureVector(\"stocks-vec\", features)\n", - "vector.save()" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "target_dict = CSVTarget('mycsv',path=os.path.join(ABS_PATH, 'my_csv.csv')).to_dict()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Using `get_offline_features()` " - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "get_offline_features_fn = mlrun.import_function('hub://get_offline_features:development')" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2022-01-31 14:41:52,066 [info] starting run get-offline-features-get_offline_features uid=956663b9a9ba448c9ea65e8e9245718e DB=http://mlrun-api:8080\n", - "> 2022-01-31 14:41:52,214 [info] Creating DataFrame from entity_rows = v3io://users/yonatan/get_offline_features/trades.csv\n", - "> 2022-01-31 14:41:52,292 [info] Preparing 'mycsv' target\n", - "> 2022-01-31 14:41:52,294 [info] getting offline features from the FeatureVector store://feature-vectors/get-offline-features-yonatan/stocks-vec\n", - "> 2022-01-31 14:41:52,708 [info] wrote target: {'name': 'mycsv', 'kind': 'csv', 'path': 'v3io://users/yonatan/get_offline_features/my_csv.csv', 'status': 'ready', 'updated': '2022-01-31T14:41:52.708534+00:00'}\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
projectuiditerstartstatenamelabelsinputsparametersresultsartifacts
get-offline-features-yonatan0Jan 31 14:41:52completedget-offline-features-get_offline_features
v3io_user=yonatan
kind=
owner=yonatan
host=jupyter-yoni-647b99c95d-w4jlc
entity_rows
feature_vector=store://feature-vectors/get-offline-features-yonatan/stocks-vec
target={'name': 'mycsv', 'kind': 'csv', 'path': 'v3io://users/yonatan/get_offline_features/my_csv.csv', 'partitioned': False}
entity_timestamp_column=time
target=v3io://users/yonatan/get_offline_features/my_csv.csv
feature_vector=store://feature-vectors/get-offline-features-yonatan/stocks-vec
\n", - "
\n", - "
\n", - "
\n", - " Title\n", - " ×\n", - "
\n", - " \n", - "
\n", - "
\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - }, - { - "data": { - "text/html": [ - " > to track results use the .show() or .logs() methods or click here to open in UI" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2022-01-31 14:41:52,896 [info] run executed, status=completed\n" - ] - } - ], - "source": [ - "gof_run = get_offline_features_fn.run(\n", - " handler='get_offline_features',\n", - " inputs= {'entity_rows': data_uri},\n", - " params={'feature_vector': vector.uri,\n", - " 'target': target_dict,\n", - " 'entity_timestamp_column': \"time\",\n", - " },\n", - " local=True\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'store://feature-vectors/get-offline-features-yonatan/stocks-vec'" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "gof_run.outputs['feature_vector']" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Unnamed: 0pricequantitymultitotal_askbids_min_1hbids_max_1hnameexchange
0051.9575155.8551.9651.9551.95Microsoft CorporationNASDAQ
1151.9575155.91103.9451.9551.97Microsoft CorporationNASDAQ
2251.9575155.97155.9451.9551.99Microsoft CorporationNASDAQ
3351.9575156.03207.9751.9552.01Microsoft CorporationNASDAQ
4451.95155155.8551.9651.9551.95Microsoft CorporationNASDAQ
5551.95155155.91103.9451.9551.97Microsoft CorporationNASDAQ
6651.95155155.97155.9451.9551.99Microsoft CorporationNASDAQ
7751.95155156.03207.9751.9552.01Microsoft CorporationNASDAQ
88720.771002161.50720.93720.50720.50Alphabet IncNASDAQ
99720.771002161.501441.86720.50720.50Alphabet IncNASDAQ
1010720.771002161.502162.74720.50720.50Alphabet IncNASDAQ
1111720.921002161.50720.93720.50720.50Alphabet IncNASDAQ
1212720.921002161.501441.86720.50720.50Alphabet IncNASDAQ
1313720.921002161.502162.74720.50720.50Alphabet IncNASDAQ
141498.00100293.9798.0197.9997.99Apple IncNASDAQ
\n", - "
" - ], - "text/plain": [ - " Unnamed: 0 price quantity multi total_ask bids_min_1h \\\n", - "0 0 51.95 75 155.85 51.96 51.95 \n", - "1 1 51.95 75 155.91 103.94 51.95 \n", - "2 2 51.95 75 155.97 155.94 51.95 \n", - "3 3 51.95 75 156.03 207.97 51.95 \n", - "4 4 51.95 155 155.85 51.96 51.95 \n", - "5 5 51.95 155 155.91 103.94 51.95 \n", - "6 6 51.95 155 155.97 155.94 51.95 \n", - "7 7 51.95 155 156.03 207.97 51.95 \n", - "8 8 720.77 100 2161.50 720.93 720.50 \n", - "9 9 720.77 100 2161.50 1441.86 720.50 \n", - "10 10 720.77 100 2161.50 2162.74 720.50 \n", - "11 11 720.92 100 2161.50 720.93 720.50 \n", - "12 12 720.92 100 2161.50 1441.86 720.50 \n", - "13 13 720.92 100 2161.50 2162.74 720.50 \n", - "14 14 98.00 100 293.97 98.01 97.99 \n", - "\n", - " bids_max_1h name exchange \n", - "0 51.95 Microsoft Corporation NASDAQ \n", - "1 51.97 Microsoft Corporation NASDAQ \n", - "2 51.99 Microsoft Corporation NASDAQ \n", - "3 52.01 Microsoft Corporation NASDAQ \n", - "4 51.95 Microsoft Corporation NASDAQ \n", - "5 51.97 Microsoft Corporation NASDAQ \n", - "6 51.99 Microsoft Corporation NASDAQ \n", - "7 52.01 Microsoft Corporation NASDAQ \n", - "8 720.50 Alphabet Inc NASDAQ \n", - "9 720.50 Alphabet Inc NASDAQ \n", - "10 720.50 Alphabet Inc NASDAQ \n", - "11 720.50 Alphabet Inc NASDAQ \n", - "12 720.50 Alphabet Inc NASDAQ \n", - "13 720.50 Alphabet Inc NASDAQ \n", - "14 97.99 Apple Inc NASDAQ " - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "mlrun.get_dataitem(gof_run.outputs['feature_vector']).as_df()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/get_offline_features/get_offline_features.py b/get_offline_features/get_offline_features.py deleted file mode 100644 index a48faa9c3..000000000 --- a/get_offline_features/get_offline_features.py +++ /dev/null @@ -1,142 +0,0 @@ -# Copyright 2019 Iguazio -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -from typing import Union, List, Dict - -import mlrun -import mlrun.feature_store as fs -from mlrun.datastore.store_resources import is_store_uri, parse_store_uri -from mlrun.datastore.targets import get_target_driver, kind_to_driver -from mlrun.datastore.base import DataItem -from mlrun.execution import MLClientCtx -from mlrun.utils import StorePrefix, parse_versioned_object_uri -from mlrun.errors import MLRunInvalidArgumentError - - -def get_offline_features( - context: MLClientCtx, - feature_vector: str, - features: Union[List[str], None] = None, - label_feature: str = None, - description: str = None, - entity_rows: DataItem = None, - entity_timestamp_column: str = None, - target: Union[str, Dict] = None, - run_config: Union[str, Dict] = None, - drop_columns: List[str] = None, - start_time: str = None, - end_time: str = None, - with_indexes: bool = False, - update_stats: bool = False, -): - """retrieve offline feature vector results - - specify a feature vector object/uri and retrieve the desired features, their metadata - and statistics. returns :py:class:`~mlrun.feature_store.OfflineVectorResponse`, - results can be returned as a dataframe or written to a target. - If feature vector does not exist, a new one will be created and saved with the given features. - - The start_time and end_time attributes allow filtering the data to a given time range, they accept - string values or pandas `Timestamp` objects, string values can also be relative, for example: - "now", "now - 1d2h", "now+5m", where a valid pandas Timedelta string follows the verb "now", - for time alignment you can use the verb "floor" e.g. "now -1d floor 1H" will align the time to the last hour - (the floor string is passed to pandas.Timestamp.floor(), can use D, H, T, S for day, hour, min, sec alignment) - - - :param context: MLRun context - :param feature_vector: feature vector uri - :param features: Relevant only if feature_vector not exist. list of feature to collect to this vector - format [/]. [as ] - :param label_feature: feature name to be used as label data - :param description: text description of the vector - :param entity_rows: URI of the data entity rows to join with - :param target: where to write the results to - :param drop_columns: list of columns to drop from the final result - :param entity_timestamp_column: timestamp column name in the entity rows dataframe - :param run_config: function and/or run configuration - see :py:class:`~mlrun.feature_store.RunConfig` - :param start_time: datetime, low limit of time needed to be filtered. Optional - entity_timestamp_column must be passed when using time filtering - :param end_time: datetime, high limit of time needed to be filtered. Optional - entity_timestamp_column must be passed when using time filtering - :param with_indexes: return vector with index columns (default False) - :param update_stats: update features statistics from the requested feature sets on the vector. Default is False. - - :returns feature_vector input - """ - - if features: - # Creating a new FeatureVector and saving: - if is_store_uri(feature_vector): - prefix, new_uri = parse_store_uri(feature_vector) - if prefix != StorePrefix.FeatureVector: - raise MLRunInvalidArgumentError( - f"provided store uri ({feature_vector}) does not represent a feature vector (prefix={prefix})" - ) - feature_vector = new_uri - - context.logger.info(f"Creating FeatureVector {feature_vector}") - project, name, tag, _ = parse_versioned_object_uri(feature_vector, mlrun.mlconf.default_project) - vector = fs.FeatureVector(name, features, label_feature=label_feature, description=description) - vector.metadata.project = project - vector.metadata.tag = tag - vector.save() - feature_vector_uri = vector.uri - else: - if is_store_uri(feature_vector): - feature_vector_uri = feature_vector - else: - vector = fs.get_feature_vector(feature_vector) - feature_vector_uri = vector.uri - - # Preparing entity_rows: - if entity_rows is not None: - context.logger.info(f"Creating DataFrame from entity_rows = {entity_rows}") - entity_rows = entity_rows.as_df() - - # Preparing target: - if target: - if isinstance(target, str): - target = kind_to_driver[target]() - - name = target.name if hasattr(target, "name") else target["name"] - context.logger.info(f"Preparing '{name}' target") - target = get_target_driver(target) - if hasattr(target, 'path') and target.path: - context.log_result("target", target.path) - - # Preparing run_config: - if run_config and isinstance(run_config, dict): - context.logger.info("Preparing run configuration") - run_config = fs.RunConfig(**run_config) - - # Calling get_offline_features: - context.logger.info( - f"getting offline features from the FeatureVector {feature_vector}" - ) - fs.get_offline_features( - feature_vector=feature_vector_uri, - entity_rows=entity_rows, - entity_timestamp_column=entity_timestamp_column, - target=target, - run_config=run_config, - drop_columns=drop_columns, - start_time=start_time, - end_time=end_time, - with_indexes=with_indexes, - update_stats=update_stats, - ) - - context.log_result("feature_vector", feature_vector) - context.log_result("feature_vector_uri", feature_vector_uri) diff --git a/get_offline_features/item.yaml b/get_offline_features/item.yaml deleted file mode 100644 index 17241f6e4..000000000 --- a/get_offline_features/item.yaml +++ /dev/null @@ -1,26 +0,0 @@ -apiVersion: v1 -categories: -- data-preparation -- data-analysis -- feature-store -description: retrieve offline feature vector results -doc: '' -example: get_offline_features.ipynb -generationDate: 2022-08-28:17-25 -hidden: false -icon: '' -labels: - author: yonish -maintainers: [] -marketplaceType: '' -mlrunVersion: 1.1.0 -name: get_offline_features -platformVersion: 3.5.0 -spec: - filename: get_offline_features.py - handler: get_offline_features - image: mlrun/mlrun - kind: job - requirements: [] -url: '' -version: 1.2.0 diff --git a/get_offline_features/test_get_offline_features.py b/get_offline_features/test_get_offline_features.py deleted file mode 100644 index 21913e011..000000000 --- a/get_offline_features/test_get_offline_features.py +++ /dev/null @@ -1,239 +0,0 @@ -# Copyright 2019 Iguazio -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -import os -import tempfile -import shutil -import datetime - -import pytest -import mlrun -import mlrun.feature_store as fstore -from mlrun.datastore.targets import CSVTarget -from mlrun.feature_store.steps import * -from mlrun.features import MinMaxValidator -from mlrun.run import get_dataitem - - -REQUIRED_ENV_VARS = [ - "MLRUN_DBPATH", - "MLRUN_ARTIFACT_PATH", - "V3IO_USERNAME", - "V3IO_API", - "V3IO_ACCESS_KEY", -] - - -def _validate_environment_variables() -> bool: - """ - Checks that all required Environment variables are set. - """ - environment_keys = os.environ.keys() - return all(key in environment_keys for key in REQUIRED_ENV_VARS) - - -def _set_environment(): - """ - Creating project and temp dir for the project. - """ - artifact_path = tempfile.TemporaryDirectory().name - os.makedirs(artifact_path) - project = mlrun.get_or_create_project( - "get-offline-features-test", context="./", user_project=True - ) - return artifact_path, project - - -def _cleanup_environment(artifact_path: str): - """ - Cleanup the test environment, deleting files and artifacts created during the test. - - :param artifact_path: The artifact path to delete. - """ - # Clean the local directory: - for test_output in [ - *os.listdir(artifact_path), - "schedules", - "runs", - "artifacts", - "functions", - ]: - test_output_path = os.path.abspath(f"./{test_output}") - if os.path.exists(test_output_path): - if os.path.isdir(test_output_path): - shutil.rmtree(test_output_path) - else: - os.remove(test_output_path) - - # Clean the artifacts directory: - shutil.rmtree(artifact_path) - - -def create_dataframes() -> (pd.DataFrame, pd.DataFrame, pd.DataFrame): - """ - Creates all the necessary DataFrames to the test. - """ - - def move_date(df, col): - max_date = df[col].max() - now_date = datetime.datetime.now() - delta = now_date - max_date - df[col] = df[col] + delta - return df - - stocks = pd.DataFrame( - { - "ticker": ["MSFT", "GOOG", "AAPL"], - "name": ["Microsoft Corporation", "Alphabet Inc", "Apple Inc"], - "exchange": ["NASDAQ", "NASDAQ", "NASDAQ"], - } - ) - - quotes = pd.DataFrame( - { - "time": [ - pd.Timestamp("2016-05-25 13:30:00.023"), - pd.Timestamp("2016-05-25 13:30:00.023"), - pd.Timestamp("2016-05-25 13:30:00.030"), - pd.Timestamp("2016-05-25 13:30:00.041"), - pd.Timestamp("2016-05-25 13:30:00.048"), - pd.Timestamp("2016-05-25 13:30:00.049"), - pd.Timestamp("2016-05-25 13:30:00.072"), - pd.Timestamp("2016-05-25 13:30:00.075"), - ], - "ticker": ["GOOG", "MSFT", "MSFT", "MSFT", "GOOG", "AAPL", "GOOG", "MSFT"], - "bid": [720.50, 51.95, 51.97, 51.99, 720.50, 97.99, 720.50, 52.01], - "ask": [720.93, 51.96, 51.98, 52.00, 720.93, 98.01, 720.88, 52.03], - } - ) - - trades = pd.DataFrame( - { - "time": [ - pd.Timestamp("2016-05-25 13:30:00.023"), - pd.Timestamp("2016-05-25 13:30:00.038"), - pd.Timestamp("2016-05-25 13:30:00.048"), - pd.Timestamp("2016-05-25 13:30:00.048"), - pd.Timestamp("2016-05-25 13:30:00.048"), - ], - "ticker": ["MSFT", "MSFT", "GOOG", "GOOG", "AAPL"], - "price": [51.95, 51.95, 720.77, 720.92, 98.0], - "quantity": [75, 155, 100, 100, 100], - } - ) - quotes = move_date(quotes, "time") - trades = move_date(trades, "time") - return quotes, trades, stocks - - -class MyMap(MapClass): - def __init__(self, multiplier=1, **kwargs): - super().__init__(**kwargs) - self._multiplier = multiplier - - def do(self, event): - event["multi"] = event["bid"] * self._multiplier - return event - - -def _create_feature_set(): - """ - Creating all the necessary FeatureSets for the test. - """ - stocks_set = fstore.FeatureSet("stocks", entities=[fstore.Entity("ticker")]) - - quotes_set = fstore.FeatureSet("stock-quotes", entities=[fstore.Entity("ticker")]) - - quotes_set.graph.to("MyMap", multiplier=3).to( - "storey.Extend", _fn="({'extra': event['bid'] * 77})" - ).to("storey.Filter", "filter", _fn="(event['bid'] > 51.92)").to( - FeaturesetValidator() - ) - - quotes_set.add_aggregation("ask", ["sum", "max"], "1h", "10m", name="asks1") - quotes_set.add_aggregation("ask", ["sum", "max"], "5h", "10m", name="asks5") - quotes_set.add_aggregation("bid", ["min", "max"], "1h", "10m", name="bids") - - # add feature validation policy - quotes_set["bid"] = fstore.Feature( - validator=MinMaxValidator(min=52, severity="info") - ) - - # add default target definitions and plot - quotes_set.set_targets() - return quotes_set, stocks_set - - -@pytest.mark.skipif( - condition=not _validate_environment_variables(), - reason="Project's environment variables are not set", -) -def test_get_offline_vector(): - # Creating project: - artifact_path, project = _set_environment() - - # Importing the marketplace function: - gof_fn = mlrun.import_function("function.yaml") - - # Creating the dataframes: - quotes, trades, stocks = create_dataframes() - - # Defining features for the FeatureVector: - features = [ - "stock-quotes.multi", - "stock-quotes.asks5_sum_5h as total_ask", - "stock-quotes.bids_min_1h", - "stock-quotes.bids_max_1h", - "stocks.*", - ] - - # Creating the FeatureSets and ingesting them: - quotes_set, stocks_set = _create_feature_set() - fstore.ingest(stocks_set, stocks) - fstore.ingest(quotes_set, quotes) - - # Saving the trades dataframe as a csv to use as entity_rows: - trades_uri = os.path.join(artifact_path, "trades.csv") - trades.to_csv(trades_uri, index=False) - - # Creating target for the FeatureVector: - target_dict = CSVTarget( - "mycsv", path=os.path.join(artifact_path, "my_csv.csv") - ).to_dict() - - # Running the getting_offline_features function: - gof_run = None - try: - gof_run = gof_fn.run( - handler="get_offline_features", - inputs={"entity_rows": trades_uri}, - params={ - "feature_vector": "stocks-vec", - "features": features, - "target": target_dict, - "entity_timestamp_column": "time", - }, - local=True, - ) - - except Exception as e: - print(f"- The test failed - raised the following error:\n- {e}") - - target_df = get_dataitem(gof_run.outputs["target"]).as_df() - vector_df = get_dataitem(gof_run.outputs["feature_vector"]).as_df() - - # Asserting that the target and FeatureVector dataframes are the same: - assert mlrun.datastore.is_store_uri(gof_run.outputs["feature_vector_uri"]) - assert vector_df.equals(target_df), "Target and feature vector are not the same" - _cleanup_environment(artifact_path) diff --git a/hugging_face_classifier_trainer/function.yaml b/hugging_face_classifier_trainer/function.yaml deleted file mode 100644 index eb223b2bf..000000000 --- a/hugging_face_classifier_trainer/function.yaml +++ /dev/null @@ -1,368 +0,0 @@ -kind: job -metadata: - name: hugging-face-classifier-trainer - tag: '' - hash: e8113e81f04c96fc9a8a94e717dea81ee3e05a18 - project: '' - labels: - author: davids - categories: - - machine-learning - - model-training -spec: - command: '' - args: [] - image: '' - build: - functionSourceCode: aW1wb3J0IG9zCmltcG9ydCBzaHV0aWwKaW1wb3J0IHRlbXBmaWxlCmltcG9ydCB6aXBmaWxlCmZyb20gYWJjIGltcG9ydCBBQkMKZnJvbSB0eXBpbmcgaW1wb3J0IEFueSwgQ2FsbGFibGUsIERpY3QsIExpc3QsIE9wdGlvbmFsLCBUdXBsZSwgVW5pb24KCmltcG9ydCBtbHJ1bgppbXBvcnQgbWxydW4uZGF0YXN0b3JlCmltcG9ydCBtbHJ1bi51dGlscwppbXBvcnQgbnVtcHkgYXMgbnAKaW1wb3J0IHBhbmRhcyBhcyBwZAppbXBvcnQgdHJhbnNmb3JtZXJzCmZyb20gZGF0YXNldHMgaW1wb3J0IERhdGFzZXQsIGxvYWRfZGF0YXNldCwgbG9hZF9tZXRyaWMKZnJvbSBtbHJ1biBpbXBvcnQgTUxDbGllbnRDdHgKZnJvbSBtbHJ1biBpbXBvcnQgZmVhdHVyZV9zdG9yZSBhcyBmcwpmcm9tIG1scnVuLmFydGlmYWN0cyBpbXBvcnQgQXJ0aWZhY3QsIFBsb3RseUFydGlmYWN0CmZyb20gbWxydW4uZGF0YXN0b3JlIGltcG9ydCBEYXRhSXRlbQpmcm9tIG1scnVuLmZyYW1ld29ya3MuX2NvbW1vbiBpbXBvcnQgQ29tbW9uVHlwZXMsIE1MUnVuSW50ZXJmYWNlCmZyb20gbWxydW4udXRpbHMgaW1wb3J0IGNyZWF0ZV9jbGFzcwpmcm9tIHBsb3RseSBpbXBvcnQgZ3JhcGhfb2JqZWN0cyBhcyBnbwpmcm9tIHNrbGVhcm4ubW9kZWxfc2VsZWN0aW9uIGltcG9ydCB0cmFpbl90ZXN0X3NwbGl0CmZyb20gdHJhbnNmb3JtZXJzIGltcG9ydCAoCiAgICBBdXRvVG9rZW5pemVyLAogICAgRGF0YUNvbGxhdG9yV2l0aFBhZGRpbmcsCiAgICBFdmFsUHJlZGljdGlvbiwKICAgIFByZVRyYWluZWRNb2RlbCwKICAgIFByZVRyYWluZWRUb2tlbml6ZXIsCiAgICBUcmFpbmVyLAogICAgVHJhaW5lckNhbGxiYWNrLAogICAgVHJhaW5lckNvbnRyb2wsCiAgICBUcmFpbmVyU3RhdGUsCiAgICBUcmFpbmluZ0FyZ3VtZW50cywKKQoKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLWZyb20gTUxSVU4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpjbGFzcyBIRk9SVE9wdGltaXplck1MUnVuSW50ZXJmYWNlKE1MUnVuSW50ZXJmYWNlLCBBQkMpOgogICAgIiIiCiAgICBJbnRlcmZhY2UgZm9yIGFkZGluZyBNTFJ1biBmZWF0dXJlcyBmb3IgdGVuc29yZmxvdyBrZXJhcyBBUEkuCiAgICAiIiIKCiAgICAjIE1MUnVuJ3MgY29udGV4dCBkZWZhdWx0IG5hbWU6CiAgICBERUZBVUxUX0NPTlRFWFRfTkFNRSA9ICJtbHJ1bi1odWdnaW5nZmFjZSIKCiAgICAjIEF0dHJpYnV0ZXMgdG8gYmUgaW5zZXJ0ZWQgc28gdGhlIE1MUnVuIGludGVyZmFjZSB3aWxsIGJlIGZ1bGx5IGVuYWJsZWQuCiAgICBfUFJPUEVSVElFUyA9IHsKICAgICAgICAiX2F1dG9fbG9nIjogRmFsc2UsCiAgICAgICAgIl9jb250ZXh0IjogTm9uZSwKICAgICAgICAiX21vZGVsX25hbWUiOiAibW9kZWwiLAogICAgICAgICJfdGFnIjogIiIsCiAgICAgICAgIl9sYWJlbHMiOiBOb25lLAogICAgICAgICJfZXh0cmFfZGF0YSI6IE5vbmUsCiAgICB9CiAgICBfTUVUSE9EUyA9IFsiZW5hYmxlX2F1dG9fbG9nZ2luZyJdCiAgICAjIEF0dHJpYnV0ZXMgdG8gcmVwbGFjZSBzbyB0aGUgTUxSdW4gaW50ZXJmYWNlIHdpbGwgYmUgZnVsbHkgZW5hYmxlZC4KICAgIF9SRVBMQUNFRF9NRVRIT0RTID0gWwogICAgICAgICJvcHRpbWl6ZSIsCiAgICBdCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgYWRkX2ludGVyZmFjZSgKICAgICAgICBjbHMsCiAgICAgICAgb2JqLAogICAgICAgIHJlc3RvcmF0aW9uOiBDb21tb25UeXBlcy5NTFJ1bkludGVyZmFjZVJlc3RvcmF0aW9uVHlwZSA9IE5vbmUsCiAgICApOgogICAgICAgICIiIgogICAgICAgIEVucmljaCB0aGUgb2JqZWN0IHdpdGggdGhpcyBpbnRlcmZhY2UgcHJvcGVydGllcywgbWV0aG9kcyBhbmQgZnVuY3Rpb25zLCBzbyBpdCB3aWxsIGhhdmUgdGhpcyBUZW5zb3JGbG93LktlcmFzCiAgICAgICAgTUxSdW4ncyBmZWF0dXJlcy4KICAgICAgICA6cGFyYW0gb2JqOiAgICAgICAgICAgICAgICAgICAgIFRoZSBvYmplY3QgdG8gZW5yaWNoIGhpcyBpbnRlcmZhY2UuCiAgICAgICAgOnBhcmFtIHJlc3RvcmF0aW9uOiBSZXN0b3JhdGlvbiBpbmZvcm1hdGlvbiB0dXBsZSBhcyByZXR1cm5lZCBmcm9tICdyZW1vdmVfaW50ZXJmYWNlJyBpbiBvcmRlciB0bwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkIHRoZSBpbnRlcmZhY2UgaW4gYSBjZXJ0YWluIHN0YXRlLgogICAgICAgICIiIgogICAgICAgIHN1cGVyKEhGT1JUT3B0aW1pemVyTUxSdW5JbnRlcmZhY2UsIGNscykuYWRkX2ludGVyZmFjZSgKICAgICAgICAgICAgb2JqPW9iaiwgcmVzdG9yYXRpb249cmVzdG9yYXRpb24KICAgICAgICApCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgbWxydW5fb3B0aW1pemUoY2xzKToKICAgICAgICAiIiIKICAgICAgICBNTFJ1bidzIHRmLmtlcmFzLk1vZGVsLmZpdCB3cmFwcGVyLiBJdCB3aWxsIHNldHVwIHRoZSBvcHRpbWl6ZXIgd2hlbiB1c2luZyBob3Jvdm9kLiBUaGUgb3B0aW1pemVyIG11c3QgYmUKICAgICAgICBwYXNzZWQgaW4gYSBrZXl3b3JkIGFyZ3VtZW50IGFuZCB3aGVuIHVzaW5nIGhvcm92b2QsIGl0IG11c3QgYmUgcGFzc2VkIGFzIGFuIE9wdGltaXplciBpbnN0YW5jZSwgbm90IGEgc3RyaW5nLgoKICAgICAgICByYWlzZSBNTFJ1bkludmFsaWRBcmd1bWVudEVycm9yOiBJbiBjYXNlIHRoZSBvcHRpbWl6ZXIgcHJvdmlkZWQgZGlkIG5vdCBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyBhYm92ZS4KICAgICAgICAiIiIKCiAgICAgICAgZGVmIHdyYXBwZXIoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAgICAgc2F2ZV9kaXIgPSBjbHMuX2dldF9mdW5jdGlvbl9hcmd1bWVudCgKICAgICAgICAgICAgICAgIHNlbGYub3B0aW1pemUsCiAgICAgICAgICAgICAgICBhcmd1bWVudF9uYW1lPSJzYXZlX2RpciIsCiAgICAgICAgICAgICAgICBwYXNzZWRfYXJncz1hcmdzLAogICAgICAgICAgICAgICAgcGFzc2VkX2t3YXJncz1rd2FyZ3MsCiAgICAgICAgICAgIClbMF0KCiAgICAgICAgICAgICMgQ2FsbCB0aGUgb3JpZ2luYWwgb3B0aW1pemUgbWV0aG9kOgogICAgICAgICAgICByZXN1bHQgPSBzZWxmLm9yaWdpbmFsX29wdGltaXplKCphcmdzLCAqKmt3YXJncykKCiAgICAgICAgICAgIGlmIHNlbGYuX2F1dG9fbG9nOgogICAgICAgICAgICAgICAgIyBMb2cgdGhlIG9ubnggbW9kZWw6CiAgICAgICAgICAgICAgICBzZWxmLl9jb250ZXh0LmxvZ19tb2RlbCgKICAgICAgICAgICAgICAgICAgICBrZXk9Im1vZGVsIiwKICAgICAgICAgICAgICAgICAgICBkYl9rZXk9c2VsZi5fbW9kZWxfbmFtZSwKICAgICAgICAgICAgICAgICAgICBtb2RlbF9maWxlPWYie3NhdmVfZGlyfS9tb2RlbF9vcHRpbWl6ZWQub25ueCIsCiAgICAgICAgICAgICAgICAgICAgdGFnPXNlbGYuX3RhZywKICAgICAgICAgICAgICAgICAgICBmcmFtZXdvcms9Ik9OTlgiLAogICAgICAgICAgICAgICAgICAgIGxhYmVscz1zZWxmLl9sYWJlbHMsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFfZGF0YT1zZWxmLl9leHRyYV9kYXRhLAogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgICAgICByZXR1cm4gd3JhcHBlcgoKICAgIGRlZiBlbmFibGVfYXV0b19sb2dnaW5nKAogICAgICAgIHNlbGYsCiAgICAgICAgY29udGV4dDogbWxydW4uTUxDbGllbnRDdHgsCiAgICAgICAgbW9kZWxfbmFtZTogc3RyID0gIm1vZGVsIiwKICAgICAgICB0YWc6IHN0ciA9ICIiLAogICAgICAgIGxhYmVsczogRGljdFtzdHIsIHN0cl0gPSBOb25lLAogICAgICAgIGV4dHJhX2RhdGE6IGRpY3QgPSBOb25lLAogICAgKToKICAgICAgICBzZWxmLl9hdXRvX2xvZyA9IFRydWUKCiAgICAgICAgc2VsZi5fY29udGV4dCA9IGNvbnRleHQKICAgICAgICBzZWxmLl9tb2RlbF9uYW1lID0gbW9kZWxfbmFtZQogICAgICAgIHNlbGYuX3RhZyA9IHRhZwogICAgICAgIHNlbGYuX2xhYmVscyA9IGxhYmVscwogICAgICAgIHNlbGYuX2V4dHJhX2RhdGEgPSBleHRyYV9kYXRhCgoKY2xhc3MgSEZUcmFpbmVyTUxSdW5JbnRlcmZhY2UoTUxSdW5JbnRlcmZhY2UsIEFCQyk6CiAgICAiIiIKICAgIEludGVyZmFjZSBmb3IgYWRkaW5nIE1MUnVuIGZlYXR1cmVzIGZvciB0ZW5zb3JmbG93IGtlcmFzIEFQSS4KICAgICIiIgoKICAgICMgTUxSdW5zIGNvbnRleHQgZGVmYXVsdCBuYW1lOgogICAgREVGQVVMVF9DT05URVhUX05BTUUgPSAibWxydW4taHVnZ2luZ2ZhY2UiCgogICAgIyBBdHRyaWJ1dGVzIHRvIHJlcGxhY2Ugc28gdGhlIE1MUnVuIGludGVyZmFjZSB3aWxsIGJlIGZ1bGx5IGVuYWJsZWQuCiAgICBfUkVQTEFDRURfTUVUSE9EUyA9IFsKICAgICAgICAidHJhaW4iLAogICAgICAgICMgImV2YWx1YXRlIgogICAgXQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGFkZF9pbnRlcmZhY2UoCiAgICAgICAgY2xzLAogICAgICAgIG9iajogVHJhaW5lciwKICAgICAgICByZXN0b3JhdGlvbjogQ29tbW9uVHlwZXMuTUxSdW5JbnRlcmZhY2VSZXN0b3JhdGlvblR5cGUgPSBOb25lLAogICAgKToKICAgICAgICAiIiIKICAgICAgICBFbnJpY2ggdGhlIG9iamVjdCB3aXRoIHRoaXMgaW50ZXJmYWNlIHByb3BlcnRpZXMsIG1ldGhvZHMgYW5kIGZ1bmN0aW9ucywgc28gaXQgd2lsbCBoYXZlIHRoaXMgVGVuc29yRmxvdy5LZXJhcwogICAgICAgIE1MUnVucyBmZWF0dXJlcy4KICAgICAgICA6cGFyYW0gb2JqOiAgICAgICAgICAgICAgICAgICAgIFRoZSBvYmplY3QgdG8gZW5yaWNoIGhpcyBpbnRlcmZhY2UuCiAgICAgICAgOnBhcmFtIHJlc3RvcmF0aW9uOiBSZXN0b3JhdGlvbiBpbmZvcm1hdGlvbiB0dXBsZSBhcyByZXR1cm5lZCBmcm9tICdyZW1vdmVfaW50ZXJmYWNlJyBpbiBvcmRlciB0bwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkIHRoZSBpbnRlcmZhY2UgaW4gYSBjZXJ0YWluIHN0YXRlLgogICAgICAgICIiIgoKICAgICAgICBzdXBlcihIRlRyYWluZXJNTFJ1bkludGVyZmFjZSwgY2xzKS5hZGRfaW50ZXJmYWNlKAogICAgICAgICAgICBvYmo9b2JqLCByZXN0b3JhdGlvbj1yZXN0b3JhdGlvbgogICAgICAgICkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBtbHJ1bl90cmFpbihjbHMpOgoKICAgICAgICAiIiIKICAgICAgICBNTFJ1bnMgdGYua2VyYXMuTW9kZWwuZml0IHdyYXBwZXIuIEl0IHdpbGwgc2V0dXAgdGhlIG9wdGltaXplciB3aGVuIHVzaW5nIGhvcm92b2QuIFRoZSBvcHRpbWl6ZXIgbXVzdCBiZQogICAgICAgIHBhc3NlZCBpbiBhIGtleXdvcmQgYXJndW1lbnQgYW5kIHdoZW4gdXNpbmcgaG9yb3ZvZCwgaXQgbXVzdCBiZSBwYXNzZWQgYXMgYW4gT3B0aW1pemVyIGluc3RhbmNlLCBub3QgYSBzdHJpbmcuCgogICAgICAgIHJhaXNlIE1MUnVuSW52YWxpZEFyZ3VtZW50RXJyb3I6IEluIGNhc2UgdGhlIG9wdGltaXplciBwcm92aWRlZCBkaWQgbm90IGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIGFib3ZlLgogICAgICAgICIiIgoKICAgICAgICBkZWYgd3JhcHBlcihzZWxmOiBUcmFpbmVyLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICAgICAjIFJlc3RvcmUgdGhlIGV2YWx1YXRpb24gbWV0aG9kIGFzIGB0cmFpbmAgd2lsbCB1c2UgaXQ6CiAgICAgICAgICAgICMgY2xzLl9yZXN0b3JlX2F0dHJpYnV0ZShvYmo9c2VsZiwgYXR0cmlidXRlX25hbWU9ImV2YWx1YXRlIikKCiAgICAgICAgICAgICMgQ2FsbCB0aGUgb3JpZ2luYWwgZml0IG1ldGhvZDoKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5vcmlnaW5hbF90cmFpbigqYXJncywgKiprd2FyZ3MpCgogICAgICAgICAgICAjIFJlcGxhY2UgdGhlIGV2YWx1YXRpb24gbWV0aG9kIGFnYWluOgogICAgICAgICAgICAjIGNscy5fcmVwbGFjZV9mdW5jdGlvbihvYmo9c2VsZiwgZnVuY3Rpb25fbmFtZT0iZXZhbHVhdGUiKQoKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgICAgICByZXR1cm4gd3JhcHBlcgoKCmNsYXNzIE1MUnVuQ2FsbGJhY2soVHJhaW5lckNhbGxiYWNrKToKICAgICIiIgogICAgQ2FsbGJhY2sgZm9yIGNvbGxlY3RpbmcgbG9ncyBkdXJpbmcgdHJhaW5pbmcgLyBldmFsdWF0aW9uIG9mIHRoZSBgVHJhaW5lcmAgQVBJLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKAogICAgICAgIHNlbGYsCiAgICAgICAgY29udGV4dDogbWxydW4uTUxDbGllbnRDdHggPSBOb25lLAogICAgICAgIG1vZGVsX25hbWU6IHN0ciA9ICJtb2RlbCIsCiAgICAgICAgdGFnOiBzdHIgPSAiIiwKICAgICAgICBsYWJlbHM6IERpY3Rbc3RyLCBzdHJdID0gTm9uZSwKICAgICAgICBleHRyYV9kYXRhOiBkaWN0ID0gTm9uZSwKICAgICk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCgogICAgICAgICMgU3RvcmUgdGhlIGNvbmZpZ3VyYXRpb25zOgogICAgICAgIHNlbGYuX2NvbnRleHQgPSAoCiAgICAgICAgICAgIGNvbnRleHQKICAgICAgICAgICAgaWYgY29udGV4dCBpcyBub3QgTm9uZQogICAgICAgICAgICBlbHNlIG1scnVuLmdldF9vcl9jcmVhdGVfY3R4KCIuL21scnVuLWh1Z2dpbmdmYWNlIikKICAgICAgICApCiAgICAgICAgc2VsZi5fbW9kZWxfbmFtZSA9IG1vZGVsX25hbWUKICAgICAgICBzZWxmLl90YWcgPSB0YWcKICAgICAgICBzZWxmLl9sYWJlbHMgPSBsYWJlbHMKICAgICAgICBzZWxmLl9leHRyYV9kYXRhID0gZXh0cmFfZGF0YSBpZiBleHRyYV9kYXRhIGlzIG5vdCBOb25lIGVsc2Uge30KCiAgICAgICAgIyBTZXQgdXAgdGhlIGxvZ2dpbmcgbW9kZToKICAgICAgICBzZWxmLl9pc190cmFpbmluZyA9IEZhbHNlCiAgICAgICAgc2VsZi5fc3RlcHM6IExpc3RbTGlzdFtpbnRdXSA9IFtdCiAgICAgICAgc2VsZi5fbWV0cmljX3Njb3JlczogRGljdFtzdHIsIExpc3RbZmxvYXRdXSA9IHt9CiAgICAgICAgc2VsZi5fYXJ0aWZhY3RzOiBEaWN0W3N0ciwgQXJ0aWZhY3RdID0ge30KCiAgICBkZWYgb25fZXBvY2hfYmVnaW4oCiAgICAgICAgc2VsZiwKICAgICAgICBhcmdzOiBUcmFpbmluZ0FyZ3VtZW50cywKICAgICAgICBzdGF0ZTogVHJhaW5lclN0YXRlLAogICAgICAgIGNvbnRyb2w6IFRyYWluZXJDb250cm9sLAogICAgICAgICoqa3dhcmdzLAogICAgKToKICAgICAgICBzZWxmLl9zdGVwcy5hcHBlbmQoW10pCgogICAgZGVmIG9uX2Vwb2NoX2VuZCgKICAgICAgICBzZWxmLAogICAgICAgIGFyZ3M6IFRyYWluaW5nQXJndW1lbnRzLAogICAgICAgIHN0YXRlOiBUcmFpbmVyU3RhdGUsCiAgICAgICAgY29udHJvbDogVHJhaW5lckNvbnRyb2wsCiAgICAgICAgKiprd2FyZ3MsCiAgICApOgogICAgICAgIHNlbGYuX2xvZ19tZXRyaWNzKCkKCiAgICBkZWYgb25fbG9nKAogICAgICAgIHNlbGYsCiAgICAgICAgYXJnczogVHJhaW5pbmdBcmd1bWVudHMsCiAgICAgICAgc3RhdGU6IFRyYWluZXJTdGF0ZSwKICAgICAgICBjb250cm9sOiBUcmFpbmVyQ29udHJvbCwKICAgICAgICBsb2dzOiBEaWN0W3N0ciwgZmxvYXRdID0gTm9uZSwKICAgICAgICAqKmt3YXJncywKICAgICk6CiAgICAgICAgcmVjZW50X2xvZ3MgPSBzdGF0ZS5sb2dfaGlzdG9yeVstMV0uY29weSgpCgogICAgICAgIHJlY2VudF9sb2dzLnBvcCgiZXBvY2giKQogICAgICAgIGN1cnJlbnRfc3RlcCA9IGludChyZWNlbnRfbG9ncy5wb3AoInN0ZXAiKSkKICAgICAgICBpZiBjdXJyZW50X3N0ZXAgbm90IGluIHNlbGYuX3N0ZXBzWy0xXToKICAgICAgICAgICAgc2VsZi5fc3RlcHNbLTFdLmFwcGVuZChjdXJyZW50X3N0ZXApCgogICAgICAgIGZvciBtZXRyaWNfbmFtZSwgbWV0cmljX3Njb3JlIGluIHJlY2VudF9sb2dzLml0ZW1zKCk6CiAgICAgICAgICAgIGlmIG1ldHJpY19uYW1lLnN0YXJ0c3dpdGgoInRyYWluXyIpOgogICAgICAgICAgICAgICAgaWYgbWV0cmljX25hbWUuc3BsaXQoInRyYWluXyIpWzFdIG5vdCBpbiBzZWxmLl9tZXRyaWNfc2NvcmVzOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX21ldHJpY19zY29yZXNbbWV0cmljX25hbWVdID0gW21ldHJpY19zY29yZV0KICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIG1ldHJpY19uYW1lIG5vdCBpbiBzZWxmLl9tZXRyaWNfc2NvcmVzOgogICAgICAgICAgICAgICAgc2VsZi5fbWV0cmljX3Njb3Jlc1ttZXRyaWNfbmFtZV0gPSBbXQogICAgICAgICAgICBzZWxmLl9tZXRyaWNfc2NvcmVzW21ldHJpY19uYW1lXS5hcHBlbmQobWV0cmljX3Njb3JlKQoKICAgIGRlZiBvbl90cmFpbl9iZWdpbigKICAgICAgICBzZWxmLAogICAgICAgIGFyZ3M6IFRyYWluaW5nQXJndW1lbnRzLAogICAgICAgIHN0YXRlOiBUcmFpbmVyU3RhdGUsCiAgICAgICAgY29udHJvbDogVHJhaW5lckNvbnRyb2wsCiAgICAgICAgKiprd2FyZ3MsCiAgICApOgogICAgICAgIHNlbGYuX2lzX3RyYWluaW5nID0gVHJ1ZQoKICAgIGRlZiBvbl90cmFpbl9lbmQoCiAgICAgICAgc2VsZiwKICAgICAgICBhcmdzOiBUcmFpbmluZ0FyZ3VtZW50cywKICAgICAgICBzdGF0ZTogVHJhaW5lclN0YXRlLAogICAgICAgIGNvbnRyb2w6IFRyYWluZXJDb250cm9sLAogICAgICAgIG1vZGVsOiBQcmVUcmFpbmVkTW9kZWwgPSBOb25lLAogICAgICAgIHRva2VuaXplcjogUHJlVHJhaW5lZFRva2VuaXplciA9IE5vbmUsCiAgICAgICAgKiprd2FyZ3MsCiAgICApOgogICAgICAgIHNlbGYuX2xvZ19tZXRyaWNzKCkKCiAgICAgICAgdGVtcF9kaXJlY3RvcnkgPSB0ZW1wZmlsZS5nZXR0ZW1wZGlyKCkKCiAgICAgICAgIyBTYXZlIGFuZCBsb2cgdGhlIHRva2VuaXplcjoKICAgICAgICBpZiB0b2tlbml6ZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICMgU2F2ZSB0b2tlbml6ZXI6CiAgICAgICAgICAgIHRva2VuaXplcl9kaXIgPSBvcy5wYXRoLmpvaW4odGVtcF9kaXJlY3RvcnksICJ0b2tlbml6ZXIiKQogICAgICAgICAgICB0b2tlbml6ZXIuc2F2ZV9wcmV0cmFpbmVkKHNhdmVfZGlyZWN0b3J5PXRva2VuaXplcl9kaXIpCiAgICAgICAgICAgICMgWmlwIHRoZSB0b2tlbml6ZXIgZGlyZWN0b3J5OgogICAgICAgICAgICB0b2tlbml6ZXJfemlwID0gc2h1dGlsLm1ha2VfYXJjaGl2ZSgKICAgICAgICAgICAgICAgIGJhc2VfbmFtZT0idG9rZW5pemVyIiwKICAgICAgICAgICAgICAgIGZvcm1hdD0iemlwIiwKICAgICAgICAgICAgICAgIHJvb3RfZGlyPXRva2VuaXplcl9kaXIsCiAgICAgICAgICAgICkKICAgICAgICAgICAgIyBMb2cgdGhlIHppcCBmaWxlOgogICAgICAgICAgICBzZWxmLl9hcnRpZmFjdHNbInRva2VuaXplciJdID0gc2VsZi5fY29udGV4dC5sb2dfYXJ0aWZhY3QoCiAgICAgICAgICAgICAgICBpdGVtPSJ0b2tlbml6ZXIiLCBsb2NhbF9wYXRoPXRva2VuaXplcl96aXAKICAgICAgICAgICAgKQoKICAgICAgICAjIFNhdmUgdGhlIG1vZGVsOgogICAgICAgIG1vZGVsX2RpciA9IG9zLnBhdGguam9pbih0ZW1wX2RpcmVjdG9yeSwgIm1vZGVsIikKICAgICAgICBtb2RlbC5zYXZlX3ByZXRyYWluZWQoc2F2ZV9kaXJlY3Rvcnk9bW9kZWxfZGlyKQoKICAgICAgICAjIFppcCB0aGUgbW9kZWwgZGlyZWN0b3J5OgogICAgICAgIHNodXRpbC5tYWtlX2FyY2hpdmUoCiAgICAgICAgICAgIGJhc2VfbmFtZT0ibW9kZWwiLAogICAgICAgICAgICBmb3JtYXQ9InppcCIsCiAgICAgICAgICAgIHJvb3RfZGlyPW1vZGVsX2RpciwKICAgICAgICApCgogICAgICAgICMgTG9nIHRoZSBtb2RlbDoKICAgICAgICBzZWxmLl9jb250ZXh0LmxvZ19tb2RlbCgKICAgICAgICAgICAga2V5PSJtb2RlbCIsCiAgICAgICAgICAgIGRiX2tleT1zZWxmLl9tb2RlbF9uYW1lLAogICAgICAgICAgICBtb2RlbF9maWxlPSJtb2RlbC56aXAiLAogICAgICAgICAgICB0YWc9c2VsZi5fdGFnLAogICAgICAgICAgICBmcmFtZXdvcms9Ikh1Z2dpbmcgRmFjZSIsCiAgICAgICAgICAgIGxhYmVscz1zZWxmLl9sYWJlbHMsCiAgICAgICAgICAgIGV4dHJhX2RhdGE9eyoqc2VsZi5fYXJ0aWZhY3RzLCAqKnNlbGYuX2V4dHJhX2RhdGF9LAogICAgICAgICkKCiAgICBkZWYgb25fZXZhbHVhdGUoCiAgICAgICAgc2VsZiwKICAgICAgICBhcmdzOiBUcmFpbmluZ0FyZ3VtZW50cywKICAgICAgICBzdGF0ZTogVHJhaW5lclN0YXRlLAogICAgICAgIGNvbnRyb2w6IFRyYWluZXJDb250cm9sLAogICAgICAgICoqa3dhcmdzLAogICAgKToKICAgICAgICBzZWxmLl9sb2dfbWV0cmljcygpCgogICAgICAgIGlmIHNlbGYuX2lzX3RyYWluaW5nOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBUT0RPOiBVcGRhdGUgdGhlIG1vZGVsIG9iamVjdAoKICAgIGRlZiBfbG9nX21ldHJpY3Moc2VsZik6CiAgICAgICAgZm9yIG1ldHJpY19uYW1lLCBtZXRyaWNfc2NvcmVzIGluIHNlbGYuX21ldHJpY19zY29yZXMuaXRlbXMoKToKICAgICAgICAgICAgc2VsZi5fY29udGV4dC5sb2dfcmVzdWx0KGtleT1tZXRyaWNfbmFtZSwgdmFsdWU9bWV0cmljX3Njb3Jlc1stMV0pCiAgICAgICAgICAgIGlmIGxlbihtZXRyaWNfc2NvcmVzKSA+IDE6CiAgICAgICAgICAgICAgICBzZWxmLl9sb2dfbWV0cmljX3Bsb3QobmFtZT1tZXRyaWNfbmFtZSwgc2NvcmVzPW1ldHJpY19zY29yZXMpCiAgICAgICAgc2VsZi5fY29udGV4dC5jb21taXQoY29tcGxldGVkPUZhbHNlKQoKICAgIGRlZiBfbG9nX21ldHJpY19wbG90KHNlbGYsIG5hbWU6IHN0ciwgc2NvcmVzOiBMaXN0W2Zsb2F0XSk6CiAgICAgICAgIyBJbml0aWFsaXplIGEgcGxvdGx5IGZpZ3VyZToKICAgICAgICBtZXRyaWNfZmlndXJlID0gZ28uRmlndXJlKCkKCiAgICAgICAgIyBBZGQgdGl0bGVzOgogICAgICAgIG1ldHJpY19maWd1cmUudXBkYXRlX2xheW91dCgKICAgICAgICAgICAgdGl0bGU9bmFtZS5jYXBpdGFsaXplKCkucmVwbGFjZSgiXyIsICIgIiksCiAgICAgICAgICAgIHhheGlzX3RpdGxlPSJTYW1wbGVzIiwKICAgICAgICAgICAgeWF4aXNfdGl0bGU9IlNjb3JlcyIsCiAgICAgICAgKQoKICAgICAgICAjIERyYXc6CiAgICAgICAgbWV0cmljX2ZpZ3VyZS5hZGRfdHJhY2UoCiAgICAgICAgICAgIGdvLlNjYXR0ZXIoeD1ucC5hcmFuZ2UobGVuKHNjb3JlcykpLCB5PXNjb3JlcywgbW9kZT0ibGluZXMiKQogICAgICAgICkKCiAgICAgICAgIyBDcmVhdGUgdGhlIHBsb3RseSBhcnRpZmFjdDoKICAgICAgICBhcnRpZmFjdF9uYW1lID0gZiJ7bmFtZX1fcGxvdCIKICAgICAgICBhcnRpZmFjdCA9IFBsb3RseUFydGlmYWN0KGtleT1hcnRpZmFjdF9uYW1lLCBmaWd1cmU9bWV0cmljX2ZpZ3VyZSkKICAgICAgICBzZWxmLl9hcnRpZmFjdHNbYXJ0aWZhY3RfbmFtZV0gPSBzZWxmLl9jb250ZXh0LmxvZ19hcnRpZmFjdChhcnRpZmFjdCkKCgpkZWYgX2FwcGx5X21scnVuX29uX3RyYWluZXIoCiAgICB0cmFpbmVyOiB0cmFuc2Zvcm1lcnMuVHJhaW5lciwKICAgIG1vZGVsX25hbWU6IHN0ciA9IE5vbmUsCiAgICB0YWc6IHN0ciA9ICIiLAogICAgY29udGV4dDogbWxydW4uTUxDbGllbnRDdHggPSBOb25lLAogICAgYXV0b19sb2c6IGJvb2wgPSBUcnVlLAogICAgbGFiZWxzOiBEaWN0W3N0ciwgc3RyXSA9IE5vbmUsCiAgICBleHRyYV9kYXRhOiBkaWN0ID0gTm9uZSwKICAgICoqa3dhcmdzLAopOgogICAgIyBHZXQgcGFyYW1ldGVycyBkZWZhdWx0czoKICAgIGlmIGNvbnRleHQgaXMgTm9uZToKICAgICAgICBjb250ZXh0ID0gbWxydW4uZ2V0X29yX2NyZWF0ZV9jdHgoSEZUcmFpbmVyTUxSdW5JbnRlcmZhY2UuREVGQVVMVF9DT05URVhUX05BTUUpCgogICAgSEZUcmFpbmVyTUxSdW5JbnRlcmZhY2UuYWRkX2ludGVyZmFjZShvYmo9dHJhaW5lcikKCiAgICBpZiBhdXRvX2xvZzoKICAgICAgICB0cmFpbmVyLmFkZF9jYWxsYmFjaygKICAgICAgICAgICAgTUxSdW5DYWxsYmFjaygKICAgICAgICAgICAgICAgIGNvbnRleHQ9Y29udGV4dCwKICAgICAgICAgICAgICAgIG1vZGVsX25hbWU9bW9kZWxfbmFtZSwKICAgICAgICAgICAgICAgIHRhZz10YWcsCiAgICAgICAgICAgICAgICBsYWJlbHM9bGFiZWxzLAogICAgICAgICAgICAgICAgZXh0cmFfZGF0YT1leHRyYV9kYXRhLAogICAgICAgICAgICApCiAgICAgICAgKQoKCmRlZiBfYXBwbHlfbWxydW5fb25fb3B0aW1pemVyKAogICAgb3B0aW1pemVyLAogICAgbW9kZWxfbmFtZTogc3RyID0gTm9uZSwKICAgIHRhZzogc3RyID0gIiIsCiAgICBjb250ZXh0OiBtbHJ1bi5NTENsaWVudEN0eCA9IE5vbmUsCiAgICBhdXRvX2xvZzogYm9vbCA9IFRydWUsCiAgICBsYWJlbHM6IERpY3Rbc3RyLCBzdHJdID0gTm9uZSwKICAgIGV4dHJhX2RhdGE6IGRpY3QgPSBOb25lLAogICAgKiprd2FyZ3MsCik6CiAgICAjIEdldCBwYXJhbWV0ZXJzIGRlZmF1bHRzOgogICAgaWYgY29udGV4dCBpcyBOb25lOgogICAgICAgIGNvbnRleHQgPSBtbHJ1bi5nZXRfb3JfY3JlYXRlX2N0eCgKICAgICAgICAgICAgSEZPUlRPcHRpbWl6ZXJNTFJ1bkludGVyZmFjZS5ERUZBVUxUX0NPTlRFWFRfTkFNRQogICAgICAgICkKCiAgICBIRk9SVE9wdGltaXplck1MUnVuSW50ZXJmYWNlLmFkZF9pbnRlcmZhY2Uob2JqPW9wdGltaXplcikKCiAgICBpZiBhdXRvX2xvZzoKICAgICAgICBvcHRpbWl6ZXIuZW5hYmxlX2F1dG9fbG9nZ2luZygKICAgICAgICAgICAgY29udGV4dD1jb250ZXh0LAogICAgICAgICAgICBtb2RlbF9uYW1lPW1vZGVsX25hbWUsCiAgICAgICAgICAgIHRhZz10YWcsCiAgICAgICAgICAgIGxhYmVscz1sYWJlbHMsCiAgICAgICAgICAgIGV4dHJhX2RhdGE9ZXh0cmFfZGF0YSwKICAgICAgICApCgoKZGVmIGFwcGx5X21scnVuKAogICAgaHVnZ2luZ2ZhY2Vfb2JqZWN0LAogICAgbW9kZWxfbmFtZTogc3RyID0gTm9uZSwKICAgIHRhZzogc3RyID0gIiIsCiAgICBjb250ZXh0OiBtbHJ1bi5NTENsaWVudEN0eCA9IE5vbmUsCiAgICBhdXRvX2xvZzogYm9vbCA9IFRydWUsCiAgICBsYWJlbHM6IERpY3Rbc3RyLCBzdHJdID0gTm9uZSwKICAgIGV4dHJhX2RhdGE6IGRpY3QgPSBOb25lLAogICAgKiprd2FyZ3MsCik6CiAgICAiIiIKICAgIFdyYXAgdGhlIGdpdmVuIG1vZGVsIHdpdGggTUxSdW4ncyBpbnRlcmZhY2UgcHJvdmlkaW5nIGl0IHdpdGggbWxydW4ncyBhZGRpdGlvbmFsIGZlYXR1cmVzLgogICAgOnBhcmFtIGh1Z2dpbmdmYWNlX29iamVjdDogVGhlIG1vZGVsIHRvIHdyYXAuIENhbiBiZSBsb2FkZWQgZnJvbSB0aGUgbW9kZWwgcGF0aCBnaXZlbiBhcyB3ZWxsLgogICAgOnBhcmFtIG1vZGVsX25hbWU6ICAgICAgICAgVGhlIG1vZGVsIG5hbWUgdG8gdXNlIGZvciBzdG9yaW5nIHRoZSBtb2RlbCBhcnRpZmFjdC4gRGVmYXVsdDogIm1vZGVsIi4KICAgIDpwYXJhbSB0YWc6ICAgICAgICAgICAgICAgIFRoZSBtb2RlbCdzIHRhZyB0byBsb2cgd2l0aC4KICAgIDpwYXJhbSBjb250ZXh0OiAgICAgICAgICAgIE1MUnVuIGNvbnRleHQgdG8gd29yayB3aXRoLiBJZiBubyBjb250ZXh0IGlzIGdpdmVuIGl0IHdpbGwgYmUgcmV0cmlldmVkIHZpYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21scnVuLmdldF9vcl9jcmVhdGVfY3R4KE5vbmUpJwogICAgOnBhcmFtIGF1dG9fbG9nOiAgICAgICAgICAgV2hldGhlciB0byBlbmFibGUgTUxSdW4ncyBhdXRvIGxvZ2dpbmcuIERlZmF1bHQ6IFRydWUuCiAgICAiIiIKCiAgICBpZiBpc2luc3RhbmNlKGh1Z2dpbmdmYWNlX29iamVjdCwgdHJhbnNmb3JtZXJzLlRyYWluZXIpOgogICAgICAgIHJldHVybiBfYXBwbHlfbWxydW5fb25fdHJhaW5lcigKICAgICAgICAgICAgdHJhaW5lcj1odWdnaW5nZmFjZV9vYmplY3QsCiAgICAgICAgICAgIG1vZGVsX25hbWU9bW9kZWxfbmFtZSwKICAgICAgICAgICAgdGFnPXRhZywKICAgICAgICAgICAgY29udGV4dD1jb250ZXh0LAogICAgICAgICAgICBhdXRvX2xvZz1hdXRvX2xvZywKICAgICAgICAgICAgbGFiZWxzPWxhYmVscywKICAgICAgICAgICAgZXh0cmFfZGF0YT1leHRyYV9kYXRhLAogICAgICAgICkKICAgIGltcG9ydCBvcHRpbXVtLm9ubnhydW50aW1lIGFzIG9wdGltdW1fb3J0CgogICAgaWYgaXNpbnN0YW5jZShodWdnaW5nZmFjZV9vYmplY3QsIG9wdGltdW1fb3J0Lk9SVE9wdGltaXplcik6CiAgICAgICAgcmV0dXJuIF9hcHBseV9tbHJ1bl9vbl9vcHRpbWl6ZXIoCiAgICAgICAgICAgIG9wdGltaXplcj1odWdnaW5nZmFjZV9vYmplY3QsCiAgICAgICAgICAgIG1vZGVsX25hbWU9bW9kZWxfbmFtZSwKICAgICAgICAgICAgdGFnPXRhZywKICAgICAgICAgICAgY29udGV4dD1jb250ZXh0LAogICAgICAgICAgICBhdXRvX2xvZz1hdXRvX2xvZywKICAgICAgICAgICAgbGFiZWxzPWxhYmVscywKICAgICAgICAgICAgZXh0cmFfZGF0YT1leHRyYV9kYXRhLAogICAgICAgICkKICAgIHJhaXNlIG1scnVuLmVycm9ycy5NTFJ1bkludmFsaWRBcmd1bWVudEVycm9yCgoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGZyb20gYXV0b190cmFpbmVyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KY2xhc3MgS1dBcmdzUHJlZml4ZXM6CiAgICBNT0RFTF9DTEFTUyA9ICJDTEFTU18iCiAgICBGSVQgPSAiRklUXyIKICAgIFRSQUlOID0gIlRSQUlOXyIKICAgIFBSRURJQ1QgPSAiUFJFRElDVF8iCgoKZGVmIF9nZXRfc3ViX2RpY3RfYnlfcHJlZml4KHNyYzogRGljdCwgcHJlZml4X2tleTogc3RyKSAtPiBEaWN0W3N0ciwgQW55XToKICAgICIiIgogICAgQ29sbGVjdCBhbGwgdGhlIGtleXMgZnJvbSB0aGUgZ2l2ZW4gZGljdCB0aGF0IHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiBwcmVmaXggYW5kIGNyZWF0ZXMgYSBuZXcgZGljdGlvbmFyeSB3aXRoIHRoZXNlCiAgICBrZXlzLgoKICAgIDpwYXJhbSBzcmM6ICAgICAgICAgVGhlIHNvdXJjZSBkaWN0IHRvIGV4dHJhY3QgdGhlIHZhbHVlcyBmcm9tLgogICAgOnBhcmFtIHByZWZpeF9rZXk6ICBPbmx5IGtleXMgd2l0aCB0aGlzIHByZWZpeCB3aWxsIGJlIHJldHVybmVkLiBUaGUga2V5cyBpbiB0aGUgcmVzdWx0IGRpY3Qgd2lsbCBiZSB3aXRob3V0IHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4LgogICAgIiIiCiAgICByZXR1cm4gewogICAgICAgIGtleS5yZXBsYWNlKHByZWZpeF9rZXksICIiKTogdmFsCiAgICAgICAgZm9yIGtleSwgdmFsIGluIHNyYy5pdGVtcygpCiAgICAgICAgaWYga2V5LnN0YXJ0c3dpdGgocHJlZml4X2tleSkKICAgIH0KCgpkZWYgX2dldF9kYXRhZnJhbWUoCiAgICBjb250ZXh0OiBNTENsaWVudEN0eCwKICAgIGRhdGFzZXQ6IERhdGFJdGVtLAogICAgbGFiZWxfY29sdW1uczogT3B0aW9uYWxbVW5pb25bc3RyLCBMaXN0W3N0cl1dXSA9IE5vbmUsCiAgICBkcm9wX2NvbHVtbnM6IFVuaW9uW3N0ciwgTGlzdFtzdHJdLCBpbnQsIExpc3RbaW50XV0gPSBOb25lLAopIC0+IFR1cGxlW3BkLkRhdGFGcmFtZSwgT3B0aW9uYWxbVW5pb25bc3RyLCBMaXN0W3N0cl1dXV06CiAgICAiIiIKICAgIEdldHRpbmcgdGhlIERhdGFGcmFtZSBvZiB0aGUgZGF0YXNldCBhbmQgZHJvcCB0aGUgY29sdW1ucyBhY2NvcmRpbmdseS4KCiAgICA6cGFyYW0gY29udGV4dDogICAgICAgICBNTFJ1biBjb250ZXh0LgogICAgOnBhcmFtIGRhdGFzZXQ6ICAgICAgICAgVGhlIGRhdGFzZXQgdG8gdHJhaW4gdGhlIG1vZGVsIG9uLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuIGJlIGVpdGhlciBhIGxpc3Qgb2YgbGlzdHMsIGRpY3QsIFVSSSBvciBhIEZlYXR1cmVWZWN0b3IuCiAgICA6cGFyYW0gbGFiZWxfY29sdW1uczogICBUaGUgdGFyZ2V0IGxhYmVsKHMpIG9mIHRoZSBjb2x1bW4ocykgaW4gdGhlIGRhdGFzZXQuIGZvciBSZWdyZXNzaW9uIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc2lmaWNhdGlvbiB0YXNrcy4KICAgIDpwYXJhbSBkcm9wX2NvbHVtbnM6ICAgIHN0ci9pbnQgb3IgYSBsaXN0IG9mIHN0cmluZ3MvaW50cyB0aGF0IHJlcHJlc2VudCB0aGUgY29sdW1uIG5hbWVzL2luZGljZXMgdG8gZHJvcC4KICAgICIiIgogICAgaWYgaXNpbnN0YW5jZShkYXRhc2V0LCAobGlzdCwgZGljdCkpOgogICAgICAgIGRhdGFzZXQgPSBwZC5EYXRhRnJhbWUoZGF0YXNldCkKICAgICAgICAjIENoZWNraW5nIGlmIGRyb3BfY29sdW1ucyBwcm92aWRlZCBieSBpbnRlZ2VyIHR5cGU6CiAgICAgICAgaWYgZHJvcF9jb2x1bW5zOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGRyb3BfY29sdW1ucywgc3RyKSBvciAoCiAgICAgICAgICAgICAgICBpc2luc3RhbmNlKGRyb3BfY29sdW1ucywgbGlzdCkKICAgICAgICAgICAgICAgIGFuZCBhbnkoaXNpbnN0YW5jZShjb2wsIHN0cikgZm9yIGNvbCBpbiBkcm9wX2NvbHVtbnMpCiAgICAgICAgICAgICk6CiAgICAgICAgICAgICAgICBjb250ZXh0LmxvZ2dlci5lcnJvcigKICAgICAgICAgICAgICAgICAgICAiZHJvcF9jb2x1bW5zIG11c3QgYmUgYW4gaW50ZWdlci9saXN0IG9mIGludGVnZXJzIGlmIG5vdCBwcm92aWRlZCB3aXRoIGEgVVJJL0ZlYXR1cmVWZWN0b3IgZGF0YXNldCIKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IKICAgICAgICAgICAgZGF0YXNldC5kcm9wKGRyb3BfY29sdW1ucywgYXhpcz0xLCBpbnBsYWNlPVRydWUpCgogICAgICAgIHJldHVybiBkYXRhc2V0LCBsYWJlbF9jb2x1bW5zCgogICAgc3RvcmVfdXJpX3ByZWZpeCwgXyA9IG1scnVuLmRhdGFzdG9yZS5wYXJzZV9zdG9yZV91cmkoZGF0YXNldC5hcnRpZmFjdF91cmwpCiAgICBpZiBtbHJ1bi51dGlscy5TdG9yZVByZWZpeC5GZWF0dXJlVmVjdG9yID09IHN0b3JlX3VyaV9wcmVmaXg6CiAgICAgICAgIyBmZWF0dXJlLXZlY3RvciBjYXNlOgogICAgICAgIGxhYmVsX2NvbHVtbnMgPSBsYWJlbF9jb2x1bW5zIG9yIGRhdGFzZXQubWV0YS5zdGF0dXMubGFiZWxfY29sdW1uCiAgICAgICAgZGF0YXNldCA9IGZzLmdldF9vZmZsaW5lX2ZlYXR1cmVzKAogICAgICAgICAgICBkYXRhc2V0Lm1ldGEudXJpLCBkcm9wX2NvbHVtbnM9ZHJvcF9jb2x1bW5zCiAgICAgICAgKS50b19kYXRhZnJhbWUoKQoKICAgICAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYibGFiZWwgY29sdW1uczoge2xhYmVsX2NvbHVtbnN9IikKICAgIGVsc2U6CiAgICAgICAgIyBzaW1wbGUgVVJMIGNhc2U6CiAgICAgICAgZGF0YXNldCA9IGRhdGFzZXQuYXNfZGYoKQogICAgICAgIGlmIGRyb3BfY29sdW1uczoKICAgICAgICAgICAgaWYgYWxsKGNvbCBpbiBkYXRhc2V0IGZvciBjb2wgaW4gZHJvcF9jb2x1bW5zKToKICAgICAgICAgICAgICAgIGRhdGFzZXQgPSBkYXRhc2V0LmRyb3AoZHJvcF9jb2x1bW5zLCBheGlzPTEpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBjb250ZXh0LmxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgICAgICJub3QgYWxsIG9mIHRoZSBjb2x1bW5zIHRvIGRyb3AgaW4gdGhlIGRhdGFzZXQsIGRyb3AgY29sdW1ucyBwcm9jZXNzIHNraXBwZWQiCiAgICAgICAgICAgICAgICApCiAgICByZXR1cm4gZGF0YXNldCwgbGFiZWxfY29sdW1ucwoKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIdWdnaW5nIEZhY2UgVHJhaW5lciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCmRlZiBfY3JlYXRlX2NvbXB1dGVfbWV0cmljcyhtZXRyaWNzOiBMaXN0W3N0cl0pIC0+IENhbGxhYmxlW1tFdmFsUHJlZGljdGlvbl0sIERpY3RdOgogICAgIiIiCiAgICBUaGlzIGZ1bmN0aW9uIGNyZWF0ZSBhbmQgcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNvbXB1dGUgbWV0cmljcyBhdCBldmFsdWF0aW9uLgogICAgOnBhcmFtIG1ldHJpY3M6IExpc3Qgb2YgZGlmZmVyZW50IG1ldHJpY3MgZm9yIGV2YWx1YXRlIHRoZSBtb2RlbCBzdWNoIGFzIGYxLCBhY2N1cmFjeSBldGMuCgogICAgOnJldHVybnM6IEZ1bmN0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNvbXB1dGUgbWV0cmljcyBhdCBldmFsdWF0aW9uLgogICAgICAgICAgICAgTXVzdCB0YWtlIGEgW2BFdmFsUHJlZGljdGlvbmBdIGFuZCByZXR1cm4gYSBkaWN0aW9uYXJ5IHN0cmluZyB0byBtZXRyaWMgdmFsdWVzLgogICAgIiIiCgogICAgZGVmIF9jb21wdXRlX21ldHJpY3MoZXZhbF9wcmVkKToKICAgICAgICBsb2dpdHMsIGxhYmVscyA9IGV2YWxfcHJlZAogICAgICAgIHByZWRpY3Rpb25zID0gbnAuYXJnbWF4KGxvZ2l0cywgYXhpcz0tMSkKICAgICAgICBtZXRyaWNfZGljdF9yZXN1bHRzID0ge30KICAgICAgICBmb3IgbWV0cmljIGluIG1ldHJpY3M6CiAgICAgICAgICAgIGxvYWRfbWV0ID0gbG9hZF9tZXRyaWMobWV0cmljKQogICAgICAgICAgICBtZXRyaWNfcmVzID0gbG9hZF9tZXQuY29tcHV0ZShwcmVkaWN0aW9ucz1wcmVkaWN0aW9ucywgcmVmZXJlbmNlcz1sYWJlbHMpWwogICAgICAgICAgICAgICAgbWV0cmljCiAgICAgICAgICAgIF0KICAgICAgICAgICAgbWV0cmljX2RpY3RfcmVzdWx0c1ttZXRyaWNdID0gbWV0cmljX3JlcwoKICAgICAgICByZXR1cm4gbWV0cmljX2RpY3RfcmVzdWx0cwoKICAgIHJldHVybiBfY29tcHV0ZV9tZXRyaWNzCgoKZGVmIF9lZGl0X2NvbHVtbnMoCiAgICBkYXRhc2V0OiBEYXRhc2V0LAogICAgZHJvcF9jb2x1bW5zOiBMaXN0W3N0cl0gPSBOb25lLAogICAgcmVuYW1lX2NvbHVtbnM6IFtzdHIsIHN0cl0gPSBOb25lLAopIC0+IERhdGFzZXQ6CiAgICAiIiIKICAgIERyb3AgYW5kIHJlbmFtZXMgdGhhdCBjb2x1bW5zIG9mIHRoZSBnaXZlbiBkYXRhc2V0CiAgICA6cGFyYW0gZGF0YXNldDogICAgICAgICBEYXRhc2V0IHRvIHByb2Nlc3MKICAgIDpwYXJhbSBkcm9wX2NvbHVtbnM6ICAgIFRoZSBjb2x1bW5zIHRvIGRyb3AgZnJvbSB0aGUgZGF0YXNldC4KICAgIDpwYXJhbSByZW5hbWVfY29sdW1uczogIERpY3Qgb2YgY29sdW1ucyBybyByZW5hbWUgOiB7PG9sZF9uYW1lPjogPG5ld19uYW1lPiwgLi4ufQoKICAgIDpyZXR1cm5zOiBUaGUgZGF0YXNldCBhZnRlciB0aGUgZGVzaXJlZCBwcm9jZXNzCiAgICAiIiIKICAgIGlmIGRyb3BfY29sdW1uczoKICAgICAgICBkYXRhc2V0ID0gZGF0YXNldC5yZW1vdmVfY29sdW1ucyhkcm9wX2NvbHVtbnMpCiAgICBpZiByZW5hbWVfY29sdW1uczoKICAgICAgICBkYXRhc2V0ID0gZGF0YXNldC5yZW5hbWVfY29sdW1ucyhyZW5hbWVfY29sdW1ucykKICAgIHJldHVybiBkYXRhc2V0CgoKZGVmIF9wcmVwYXJlX2RhdGFzZXQoCiAgICBjb250ZXh0OiBNTENsaWVudEN0eCwKICAgIGRhdGFzZXRfbmFtZTogc3RyLAogICAgbGFiZWxfbmFtZTogc3RyID0gTm9uZSwKICAgIGRyb3BfY29sdW1uczogT3B0aW9uYWxbTGlzdFtzdHJdXSA9IE5vbmUsCiAgICBudW1fb2ZfdHJhaW5fc2FtcGxlczogaW50ID0gTm9uZSwKICAgIHRyYWluX3Rlc3Rfc3BsaXRfc2l6ZTogZmxvYXQgPSBOb25lLAogICAgcmFuZG9tX3N0YXRlOiBpbnQgPSBOb25lLAopIC0+IFR1cGxlW0RhdGFzZXQsIERhdGFzZXRdOgogICAgIiIiCiAgICBMb2FkaW5nIHRoZSBkYXRhc2V0IGFuZCBlZGl0aW5nIHRoZSBjb2x1bW5zCgogICAgOnBhcmFtIGNvbnRleHQ6ICAgICAgICAgICAgICAgICBNTFJ1biBjb250ZXgKICAgIDpwYXJhbSBkYXRhc2V0X25hbWU6ICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGRhdGFzZXQgdG8gZ2V0IGZyb20gdGhlIEh1Z2dpbmdGYWNlIGh1YgogICAgOnBhcmFtIGxhYmVsX25hbWU6ICAgICAgICAgICAgICBUaGUgdGFyZ2V0IGxhYmVsIG9mIHRoZSBjb2x1bW4gaW4gdGhlIGRhdGFzZXQuCiAgICA6cGFyYW0gZHJvcF9jb2x1bW5zOiAgICAgICAgICAgIFRoZSBjb2x1bW5zIHRvIGRyb3AgZnJvbSB0aGUgZGF0YXNldC4KICAgIDpwYXJhbSBudW1fb2ZfdHJhaW5fc2FtcGxlczogICAgTWF4IG51bWJlciBvZiB0cmFpbmluZyBzYW1wbGVzLCBmb3IgZGVidWdnaW5nLgogICAgOnBhcmFtIHRyYWluX3Rlc3Rfc3BsaXRfc2l6ZTogICBTaG91bGQgYmUgYmV0d2VlbiAwLjAgYW5kIDEuMCBhbmQgcmVwcmVzZW50IHRoZSBwcm9wb3J0aW9uIG9mIHRoZSBkYXRhc2V0IHRvIGluY2x1ZGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHRlc3Qgc3BsaXQuCiAgICA6cGFyYW0gcmFuZG9tX3N0YXRlOiAgICAgICAgICAgIFJhbmRvbSBzdGF0ZSBmb3IgdHJhaW5fdGVzdF9zcGxpdAoKICAgICIiIgoKICAgIGNvbnRleHQubG9nZ2VyLmluZm8oCiAgICAgICAgZiJMb2FkaW5nIGFuZCBlZGl0aW5nIHtkYXRhc2V0X25hbWV9IGRhdGFzZXQgZnJvbSBIdWdnaW5nIEZhY2UgaHViIgogICAgKQogICAgcmVuYW1lX2NvbHMgPSB7bGFiZWxfbmFtZTogImxhYmVscyJ9CgogICAgIyBMb2FkaW5nIGFuZCBlZGl0aW5nIGRhdGFzZXQ6CiAgICBkYXRhc2V0ID0gbG9hZF9kYXRhc2V0KGRhdGFzZXRfbmFtZSkKCiAgICAjIHRyYWluIHNldAogICAgdHJhaW5fZGF0YXNldCA9IGRhdGFzZXRbInRyYWluIl0KICAgIGlmIG51bV9vZl90cmFpbl9zYW1wbGVzOgogICAgICAgIHRyYWluX2RhdGFzZXQgPSB0cmFpbl9kYXRhc2V0LnNodWZmbGUoc2VlZD1yYW5kb21fc3RhdGUpLnNlbGVjdCgKICAgICAgICAgICAgbGlzdChyYW5nZShudW1fb2ZfdHJhaW5fc2FtcGxlcykpCiAgICAgICAgKQogICAgdHJhaW5fZGF0YXNldCA9IF9lZGl0X2NvbHVtbnModHJhaW5fZGF0YXNldCwgZHJvcF9jb2x1bW5zLCByZW5hbWVfY29scykKCiAgICAjIHRlc3Qgc2V0CiAgICB0ZXN0X2RhdGFzZXQgPSBkYXRhc2V0WyJ0ZXN0Il0KICAgIGlmIHRyYWluX3Rlc3Rfc3BsaXRfc2l6ZSBvciBudW1fb2ZfdHJhaW5fc2FtcGxlczoKICAgICAgICB0cmFpbl90ZXN0X3NwbGl0X3NpemUgPSB0cmFpbl90ZXN0X3NwbGl0X3NpemUgb3IgMC4yCiAgICAgICAgbnVtX29mX3Rlc3Rfc2FtcGxlcyA9IGludCgKICAgICAgICAgICAgKHRyYWluX2RhdGFzZXQubnVtX3Jvd3MgKiB0cmFpbl90ZXN0X3NwbGl0X3NpemUpCiAgICAgICAgICAgIC8vICgxIC0gdHJhaW5fdGVzdF9zcGxpdF9zaXplKQogICAgICAgICkKICAgICAgICB0ZXN0X2RhdGFzZXQgPSB0ZXN0X2RhdGFzZXQuc2h1ZmZsZShzZWVkPXJhbmRvbV9zdGF0ZSkuc2VsZWN0KAogICAgICAgICAgICBsaXN0KHJhbmdlKG51bV9vZl90ZXN0X3NhbXBsZXMpKQogICAgICAgICkKICAgIHRlc3RfZGF0YXNldCA9IF9lZGl0X2NvbHVtbnModGVzdF9kYXRhc2V0LCBkcm9wX2NvbHVtbnMsIHJlbmFtZV9jb2xzKQoKICAgIHJldHVybiB0cmFpbl9kYXRhc2V0LCB0ZXN0X2RhdGFzZXQKCgpkZWYgdHJhaW4oCiAgICBjb250ZXh0OiBNTENsaWVudEN0eCwKICAgIGhmX2RhdGFzZXQ6IHN0ciA9IE5vbmUsCiAgICBkYXRhc2V0OiBEYXRhSXRlbSA9IE5vbmUsCiAgICB0ZXN0X3NldDogRGF0YUl0ZW0gPSBOb25lLAogICAgZHJvcF9jb2x1bW5zOiBPcHRpb25hbFtMaXN0W3N0cl1dID0gTm9uZSwKICAgIHByZXRyYWluZWRfdG9rZW5pemVyOiBzdHIgPSBOb25lLAogICAgcHJldHJhaW5lZF9tb2RlbDogc3RyID0gTm9uZSwKICAgIG1vZGVsX2NsYXNzOiBzdHIgPSBOb25lLAogICAgbW9kZWxfbmFtZTogc3RyID0gImh1Z2dpbmdmYWNlLW1vZGVsIiwKICAgIGxhYmVsX25hbWU6IHN0ciA9ICJsYWJlbHMiLAogICAgdGV4dF9jb2w6IHN0ciA9ICJ0ZXh0IiwKICAgIG51bV9vZl90cmFpbl9zYW1wbGVzOiBpbnQgPSBOb25lLAogICAgdHJhaW5fdGVzdF9zcGxpdF9zaXplOiBmbG9hdCA9IE5vbmUsCiAgICBtZXRyaWNzOiBMaXN0W3N0cl0gPSBOb25lLAogICAgcmFuZG9tX3N0YXRlOiBpbnQgPSBOb25lLAopOgogICAgIiIiCiAgICBUcmFpbmluZyBhbmQgZXZhbHVhdGluZyBhIHByZXRyYWluZWQgbW9kZWwgd2l0aCBhIHByZXRyYWluZWQgdG9rZW5pemVyIG92ZXIgYSBkYXRhc2V0LgogICAgVGhlIGRhdGFzZXQgY2FuIGJlIGVpdGhlciBiZSB0aGUgbmFtZSBvZiB0aGUgZGF0YXNldCB0aGF0IGNvbnRhaW5zIGluIHRoZSBIdWdnaW5nRmFjZSBodWIsCiAgICBvciBhIFVSSSBvciBhIEZlYXR1cmVWZWN0b3IKCiAgICA6cGFyYW0gY29udGV4dDogICAgICAgICAgICAgICAgIE1MUnVuIGNvbnRleHQKICAgIDpwYXJhbSBoZl9kYXRhc2V0OiAgICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGRhdGFzZXQgdG8gZ2V0IGZyb20gdGhlIEh1Z2dpbmdGYWNlIGh1YgogICAgOnBhcmFtIGRhdGFzZXQ6ICAgICAgICAgICAgICAgICBUaGUgZGF0YXNldCB0byB0cmFpbiB0aGUgbW9kZWwgb24uIENhbiBiZSBlaXRoZXIgYSBVUkkgb3IgYSBGZWF0dXJlVmVjdG9yCiAgICA6cGFyYW0gdGVzdF9zZXQ6ICAgICAgICAgICAgICAgIFRoZSB0ZXN0IHNldCB0byB0cmFpbiB0aGUgbW9kZWwgd2l0aC4KICAgIDpwYXJhbSBkcm9wX2NvbHVtbnM6ICAgICAgICAgICAgVGhlIGNvbHVtbnMgdG8gZHJvcCBmcm9tIHRoZSBkYXRhc2V0LgogICAgOnBhcmFtIHByZXRyYWluZWRfdG9rZW5pemVyOiAgICBUaGUgbmFtZSBvZiB0aGUgcHJldHJhaW5lZCB0b2tlbml6ZXIgZnJvbSB0aGUgSHVnZ2luZ0ZhY2UgaHViLgogICAgOnBhcmFtIHByZXRyYWluZWRfbW9kZWw6ICAgICAgICBUaGUgbmFtZSBvZiB0aGUgcHJldHJhaW5lZCBtb2RlbCBmcm9tIHRoZSBIdWdnaW5nRmFjZSBodWIuCiAgICA6cGFyYW0gbW9kZWxfbmFtZTogICAgICAgICAgICAgIFRoZSBtb2RlbCdzIG5hbWUgdG8gdXNlIGZvciBzdG9yaW5nIHRoZSBtb2RlbCBhcnRpZmFjdCwgZGVmYXVsdCB0byAnbW9kZWwnCiAgICA6cGFyYW0gbW9kZWxfY2xhc3M6ICAgICAgICAgICAgIFRoZSBjbGFzcyBvZiB0aGUgbW9kZWwsIGUuZy4gYHRyYW5zZm9ybWVycy5BdXRvTW9kZWxGb3JTZXF1ZW5jZUNsYXNzaWZpY2F0aW9uYAogICAgOnBhcmFtIGxhYmVsX25hbWU6ICAgICAgICAgICAgICBUaGUgdGFyZ2V0IGxhYmVsIG9mIHRoZSBjb2x1bW4gaW4gdGhlIGRhdGFzZXQuCiAgICA6cGFyYW0gdGV4dF9jb2w6ICAgICAgICAgICAgICAgIFRoZSBpbnB1dCB0ZXh0IGNvbHVtbiB1biB0aGUgZGF0YXNldC4KICAgIDpwYXJhbSBudW1fb2ZfdHJhaW5fc2FtcGxlczogICAgTWF4IG51bWJlciBvZiB0cmFpbmluZyBzYW1wbGVzLCBmb3IgZGVidWdnaW5nLgogICAgOnBhcmFtIHRyYWluX3Rlc3Rfc3BsaXRfc2l6ZTogICBTaG91bGQgYmUgYmV0d2VlbiAwLjAgYW5kIDEuMCBhbmQgcmVwcmVzZW50IHRoZSBwcm9wb3J0aW9uIG9mIHRoZSBkYXRhc2V0IHRvIGluY2x1ZGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHRlc3Qgc3BsaXQuCiAgICA6cGFyYW0gbWV0cmljczogICAgICAgICAgICAgICAgIExpc3Qgb2YgZGlmZmVyZW50IG1ldHJpY3MgZm9yIGV2YWx1YXRlIHRoZSBtb2RlbCBzdWNoIGFzIGYxLCBhY2N1cmFjeSBldGMuCiAgICA6cGFyYW0gcmFuZG9tX3N0YXRlOiAgICAgICAgICAgIFJhbmRvbSBzdGF0ZSBmb3IgdHJhaW5fdGVzdF9zcGxpdAogICAgIiIiCgogICAgaWYgdHJhaW5fdGVzdF9zcGxpdF9zaXplIGlzIE5vbmUgYW5kIHRlc3Rfc2V0IGlzIE5vbmU6CiAgICAgICAgY29udGV4dC5sb2dnZXIuaW5mbygKICAgICAgICAgICAgIid0cmFpbl90ZXN0X3NwbGl0X3NpemUnIGlzIG5vdCBwcm92aWRlZCwgc2V0dGluZyB0cmFpbl90ZXN0X3NwbGl0X3NpemUgdG8gMC4yIgogICAgICAgICkKICAgICAgICB0cmFpbl90ZXN0X3NwbGl0X3NpemUgPSAwLjIKCiAgICAjIENyZWF0aW5nIHRva2VuaXplcjoKICAgIHRva2VuaXplciA9IEF1dG9Ub2tlbml6ZXIuZnJvbV9wcmV0cmFpbmVkKHByZXRyYWluZWRfdG9rZW5pemVyKQoKICAgIGRlZiBwcmVwcm9jZXNzX2Z1bmN0aW9uKGV4YW1wbGVzKToKICAgICAgICByZXR1cm4gdG9rZW5pemVyKGV4YW1wbGVzW3RleHRfY29sXSwgdHJ1bmNhdGlvbj1UcnVlKQoKICAgICMgcHJlcGFyZSBkYXRhIGZvciB0cmFpbmluZwogICAgaWYgaGZfZGF0YXNldDoKICAgICAgICB0cmFpbl9kYXRhc2V0LCB0ZXN0X2RhdGFzZXQgPSBfcHJlcGFyZV9kYXRhc2V0KAogICAgICAgICAgICBjb250ZXh0LAogICAgICAgICAgICBoZl9kYXRhc2V0LAogICAgICAgICAgICBsYWJlbF9uYW1lLAogICAgICAgICAgICBkcm9wX2NvbHVtbnMsCiAgICAgICAgICAgIG51bV9vZl90cmFpbl9zYW1wbGVzLAogICAgICAgICAgICB0cmFpbl90ZXN0X3NwbGl0X3NpemUsCiAgICAgICAgICAgIHJhbmRvbV9zdGF0ZT1yYW5kb21fc3RhdGUsCiAgICAgICAgKQogICAgZWxpZiBkYXRhc2V0OgogICAgICAgICMgR2V0IERhdGFGcmFtZSBieSBVUkwgb3IgYnkgRmVhdHVyZVZlY3RvcjoKICAgICAgICB0cmFpbl9kYXRhc2V0LCBsYWJlbF9uYW1lID0gX2dldF9kYXRhZnJhbWUoCiAgICAgICAgICAgIGNvbnRleHQ9Y29udGV4dCwKICAgICAgICAgICAgZGF0YXNldD1kYXRhc2V0LAogICAgICAgICAgICBsYWJlbF9jb2x1bW5zPWxhYmVsX25hbWUsCiAgICAgICAgICAgIGRyb3BfY29sdW1ucz1kcm9wX2NvbHVtbnMsCiAgICAgICAgKQogICAgICAgIGlmIHRlc3Rfc2V0OgogICAgICAgICAgICB0ZXN0X2RhdGFzZXQsIF8gPSBfZ2V0X2RhdGFmcmFtZSgKICAgICAgICAgICAgICAgIGNvbnRleHQ9Y29udGV4dCwKICAgICAgICAgICAgICAgIGRhdGFzZXQ9dGVzdF9zZXQsCiAgICAgICAgICAgICAgICBsYWJlbF9jb2x1bW5zPWxhYmVsX25hbWUsCiAgICAgICAgICAgICAgICBkcm9wX2NvbHVtbnM9ZHJvcF9jb2x1bW5zLAogICAgICAgICAgICApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdHJhaW5fZGF0YXNldCwgdGVzdF9kYXRhc2V0ID0gdHJhaW5fdGVzdF9zcGxpdCgKICAgICAgICAgICAgICAgIHRyYWluX2RhdGFzZXQsCiAgICAgICAgICAgICAgICB0ZXN0X3NpemU9dHJhaW5fdGVzdF9zcGxpdF9zaXplLAogICAgICAgICAgICAgICAgcmFuZG9tX3N0YXRlPXJhbmRvbV9zdGF0ZSwKICAgICAgICAgICAgKQogICAgICAgIHRyYWluX2RhdGFzZXQgPSBEYXRhc2V0LmZyb21fcGFuZGFzKHRyYWluX2RhdGFzZXQpCiAgICAgICAgdGVzdF9kYXRhc2V0ID0gRGF0YXNldC5mcm9tX3BhbmRhcyh0ZXN0X2RhdGFzZXQpCiAgICBlbHNlOgogICAgICAgIHJhaXNlIG1scnVuLmVycm9ycy5NTFJ1bkludmFsaWRBcmd1bWVudEVycm9yKAogICAgICAgICAgICAiVHJhaW5pbmcgZGF0YSB3YXMgbm90IHByb3ZpZGVkLiBBIHRyYWluaW5nIGRhdGFzZXQgaXMgbWFuZGF0b3J5IGZvciB0cmFpbmluZy4iCiAgICAgICAgICAgICIgUGxlYXNlIHByb3ZpZGUgYSB0cmFpbmluZyBzZXQgdXNpbmcgb25lIG9mIHRoZSBhcmd1bWVudHMgJ2hmX2RhdGFzZXQnIG9yICdkYXRhc2V0Jy4iCiAgICAgICAgKQoKICAgICMgTWFwcGluZyBkYXRhc2V0cyB3aXRoIHRoZSB0b2tlbml6ZXI6CiAgICB0b2tlbml6ZWRfdHJhaW4gPSB0cmFpbl9kYXRhc2V0Lm1hcChwcmVwcm9jZXNzX2Z1bmN0aW9uLCBiYXRjaGVkPVRydWUpCiAgICB0b2tlbml6ZWRfdGVzdCA9IHRlc3RfZGF0YXNldC5tYXAocHJlcHJvY2Vzc19mdW5jdGlvbiwgYmF0Y2hlZD1UcnVlKQoKICAgICMgQ3JlYXRpbmcgZGF0YSBjb2xsYXRvciBmb3IgYmF0Y2hpbmc6CiAgICBkYXRhX2NvbGxhdG9yID0gRGF0YUNvbGxhdG9yV2l0aFBhZGRpbmcodG9rZW5pemVyPXRva2VuaXplcikKCiAgICAjIFBhcnNpbmcga3dhcmdzOgogICAgdHJhaW5fa3dhcmdzID0gX2dldF9zdWJfZGljdF9ieV9wcmVmaXgoCiAgICAgICAgc3JjPWNvbnRleHQucGFyYW1ldGVycywgcHJlZml4X2tleT1LV0FyZ3NQcmVmaXhlcy5UUkFJTgogICAgKQogICAgbW9kZWxfY2xhc3Nfa3dhcmdzID0gX2dldF9zdWJfZGljdF9ieV9wcmVmaXgoCiAgICAgICAgc3JjPWNvbnRleHQucGFyYW1ldGVycywgcHJlZml4X2tleT1LV0FyZ3NQcmVmaXhlcy5NT0RFTF9DTEFTUwogICAgKQoKICAgICMgTG9hZGluZyBvdXIgcHJldHJhaW5lZCBtb2RlbDoKICAgIG1vZGVsX2NsYXNzX2t3YXJnc1sicHJldHJhaW5lZF9tb2RlbF9uYW1lX29yX3BhdGgiXSA9ICgKICAgICAgICBtb2RlbF9jbGFzc19rd2FyZ3MuZ2V0KCJwcmV0cmFpbmVkX21vZGVsX25hbWVfb3JfcGF0aCIpIG9yIHByZXRyYWluZWRfbW9kZWwKICAgICkKICAgIHRyYWluX2t3YXJnc1siaHViX3Rva2VuIl0gPSB0cmFpbl9rd2FyZ3MuZ2V0KCJodWJfdG9rZW4iKSBvciBwcmV0cmFpbmVkX3Rva2VuaXplcgogICAgaWYgbm90IG1vZGVsX2NsYXNzX2t3YXJnc1sicHJldHJhaW5lZF9tb2RlbF9uYW1lX29yX3BhdGgiXToKICAgICAgICByYWlzZSBtbHJ1bi5lcnJvcnMuTUxSdW5SdW50aW1lRXJyb3IoCiAgICAgICAgICAgICJNdXN0IHByb3ZpZGUgcHJldHJhaW5lZF9tb2RlbCBuYW1lIGFzICIKICAgICAgICAgICAgImZ1bmN0aW9uIGFyZ3VtZW50IG9yIGluIGV4dHJhIHBhcmFtcyIKICAgICAgICApCiAgICBtb2RlbCA9IGNyZWF0ZV9jbGFzcyhtb2RlbF9jbGFzcykuZnJvbV9wcmV0cmFpbmVkKCoqbW9kZWxfY2xhc3Nfa3dhcmdzKQoKICAgICMgUHJlcGFyaW5nIHRyYWluaW5nIGFyZ3VtZW50czoKICAgIHRyYWluaW5nX2FyZ3MgPSBUcmFpbmluZ0FyZ3VtZW50cygKICAgICAgICAqKnRyYWluX2t3YXJncywKICAgICkKCiAgICBjb21wdXRlX21ldHJpY3MgPSBfY3JlYXRlX2NvbXB1dGVfbWV0cmljcyhtZXRyaWNzKSBpZiBtZXRyaWNzIGVsc2UgTm9uZQogICAgdHJhaW5lciA9IFRyYWluZXIoCiAgICAgICAgbW9kZWw9bW9kZWwsCiAgICAgICAgYXJncz10cmFpbmluZ19hcmdzLAogICAgICAgIHRyYWluX2RhdGFzZXQ9dG9rZW5pemVkX3RyYWluLAogICAgICAgIGV2YWxfZGF0YXNldD10b2tlbml6ZWRfdGVzdCwKICAgICAgICB0b2tlbml6ZXI9dG9rZW5pemVyLAogICAgICAgIGRhdGFfY29sbGF0b3I9ZGF0YV9jb2xsYXRvciwKICAgICAgICBjb21wdXRlX21ldHJpY3M9Y29tcHV0ZV9tZXRyaWNzLAogICAgKQoKICAgIGFwcGx5X21scnVuKHRyYWluZXIsIG1vZGVsX25hbWU9bW9kZWxfbmFtZSkKCiAgICAjIEFwcGx5IHRyYWluaW5nIHdpdGggZXZhbHVhdGlvbjoKICAgIGNvbnRleHQubG9nZ2VyLmluZm8oZiJ0cmFpbmluZyAne21vZGVsX25hbWV9JyIpCiAgICB0cmFpbmVyLnRyYWluKCkKCgpkZWYgX2dldF9tb2RlbF9kaXIobW9kZWxfdXJpOiBzdHIpOgogICAgbW9kZWxfZmlsZSwgXywgXyA9IG1scnVuLmFydGlmYWN0cy5nZXRfbW9kZWwobW9kZWxfdXJpKQogICAgbW9kZWxfZGlyID0gdGVtcGZpbGUuZ2V0dGVtcGRpcigpCiAgICAjIFVuemlwIHRoZSBNb2RlbDoKICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKG1vZGVsX2ZpbGUsICJyIikgYXMgemlwX2ZpbGU6CiAgICAgICAgemlwX2ZpbGUuZXh0cmFjdGFsbChtb2RlbF9kaXIpCgogICAgcmV0dXJuIG1vZGVsX2RpcgoKCmRlZiBvcHRpbWl6ZSgKICAgIG1vZGVsX3BhdGg6IHN0ciwKICAgIG1vZGVsX25hbWU6IHN0ciA9ICJvcHRpbWl6ZWRfbW9kZWwiLAogICAgdGFyZ2V0X2Rpcjogc3RyID0gIi4vb3B0aW1pemVkIiwKICAgIG9wdGltaXphdGlvbl9sZXZlbDogaW50ID0gMSwKKToKICAgICIiIgogICAgT3B0aW1pemluZyB0aGUgdHJhbnNmb3JtZXIgbW9kZWwgdXNpbmcgT05OWCBvcHRpbWl6YXRpb24uCgoKICAgIDpwYXJhbSBtb2RlbF9wYXRoOiAgICAgICAgICBUaGUgcGF0aCBvZiB0aGUgbW9kZWwgdG8gb3B0aW1pemUuCiAgICA6cGFyYW0gbW9kZWxfbmFtZTogICAgICAgICAgTmFtZSBvZiB0aGUgb3B0aW1pemVkIG1vZGVsLgogICAgOnBhcmFtIHRhcmdldF9kaXI6ICAgICAgICAgIFRoZSBkaXJlY3RvcnkgdG8gc2F2ZSB0aGUgT05OWCBtb2RlbC4KICAgIDpwYXJhbSBvcHRpbWl6YXRpb25fbGV2ZWw6ICBPcHRpbWl6YXRpb24gbGV2ZWwgcGVyZm9ybWVkIGJ5IE9OTlggUnVudGltZSBvZiB0aGUgbG9hZGVkIGdyYXBoLiAoZGVmYXVsdCBpcyAxKQogICAgIiIiCiAgICAjIFdlIGltcG9ydCB0aGVzZSBpbiB0aGUgZnVuY3Rpb24gc2NvcGUgc28gT05OWCB3b24ndCBiZSBtYW5kYXRvcnkgZm9yIHRoZSBvdGhlciBoYW5kbGVyczoKICAgIGZyb20gb3B0aW11bS5vbm54cnVudGltZSBpbXBvcnQgT1JUTW9kZWxGb3JTZXF1ZW5jZUNsYXNzaWZpY2F0aW9uLCBPUlRPcHRpbWl6ZXIKICAgIGZyb20gb3B0aW11bS5vbm54cnVudGltZS5jb25maWd1cmF0aW9uIGltcG9ydCBPcHRpbWl6YXRpb25Db25maWcKCiAgICBtb2RlbF9kaXIgPSBfZ2V0X21vZGVsX2Rpcihtb2RlbF91cmk9bW9kZWxfcGF0aCkKICAgICMgQ3JlYXRpbmcgY29uZmlndXJhdGlvbiBmb3Igb3B0aW1pemF0aW9uIHN0ZXA6CiAgICBvcHRpbWl6YXRpb25fY29uZmlnID0gT3B0aW1pemF0aW9uQ29uZmlnKG9wdGltaXphdGlvbl9sZXZlbD1vcHRpbWl6YXRpb25fbGV2ZWwpCgogICAgIyBDb252ZXJ0aW5nIG91ciBwcmV0cmFpbmVkIG1vZGVsIHRvIGFuIE9OTlgtUnVudGltZSBtb2RlbDoKICAgIG9ydF9tb2RlbCA9IE9SVE1vZGVsRm9yU2VxdWVuY2VDbGFzc2lmaWNhdGlvbi5mcm9tX3ByZXRyYWluZWQoCiAgICAgICAgbW9kZWxfZGlyLCBmcm9tX3RyYW5zZm9ybWVycz1UcnVlCiAgICApCgogICAgIyBDcmVhdGluZyBhbiBPTk5YLVJ1bnRpbWUgb3B0aW1pemVyIGZyb20gT05OWCBtb2RlbDoKICAgIG9wdGltaXplciA9IE9SVE9wdGltaXplci5mcm9tX3ByZXRyYWluZWQob3J0X21vZGVsKQoKICAgIGFwcGx5X21scnVuKG9wdGltaXplciwgbW9kZWxfbmFtZT1tb2RlbF9uYW1lKQogICAgIyBPcHRpbWl6aW5nIGFuZCBzYXZpbmcgdGhlIE9OTlggbW9kZWw6CiAgICBvcHRpbWl6ZXIub3B0aW1pemUoc2F2ZV9kaXI9dGFyZ2V0X2Rpciwgb3B0aW1pemF0aW9uX2NvbmZpZz1vcHRpbWl6YXRpb25fY29uZmlnKQo= - base_image: mlrun/mlrun - commands: [] - code_origin: '' - origin_filename: '' - requirements: - - onnx~=1.14.1 - - onnxruntime~=1.16.1 - - optimum~=1.6.4 - - transformers~=4.26.1 - - datasets~=2.10.1 - - scikit-learn~=1.0.2 - entry_points: - add_interface: - name: add_interface - doc: 'Enrich the object with this interface properties, methods and functions, - so it will have this TensorFlow.Keras - - MLRuns features.' - parameters: - - name: cls - - name: obj - type: Trainer - doc: The object to enrich his interface. - - name: restoration - type: MLRunInterfaceRestorationType - doc: Restoration information tuple as returned from 'remove_interface' in - order to add the interface in a certain state. - default: null - outputs: [] - lineno: 146 - has_varargs: false - has_kwargs: false - mlrun_optimize: - name: mlrun_optimize - doc: 'MLRun''s tf.keras.Model.fit wrapper. It will setup the optimizer when - using horovod. The optimizer must be - - passed in a keyword argument and when using horovod, it must be passed as - an Optimizer instance, not a string. - - - raise MLRunInvalidArgumentError: In case the optimizer provided did not follow - the instructions above.' - parameters: - - name: cls - outputs: [] - lineno: 79 - has_varargs: false - has_kwargs: false - wrapper: - name: wrapper - doc: '' - parameters: - - name: self - type: Trainer - outputs: [] - lineno: 173 - has_varargs: true - has_kwargs: true - enable_auto_logging: - name: enable_auto_logging - doc: '' - parameters: - - name: self - - name: context - type: MLClientCtx - - name: model_name - type: str - default: model - - name: tag - type: str - default: '' - - name: labels - type: Dict[str, str] - default: null - - name: extra_data - type: dict - default: null - outputs: [] - lineno: 114 - has_varargs: false - has_kwargs: false - mlrun_train: - name: mlrun_train - doc: 'MLRuns tf.keras.Model.fit wrapper. It will setup the optimizer when using - horovod. The optimizer must be - - passed in a keyword argument and when using horovod, it must be passed as - an Optimizer instance, not a string. - - - raise MLRunInvalidArgumentError: In case the optimizer provided did not follow - the instructions above.' - parameters: - - name: cls - outputs: [] - lineno: 164 - has_varargs: false - has_kwargs: false - on_epoch_begin: - name: on_epoch_begin - doc: '' - parameters: - - name: self - - name: args - type: TrainingArguments - - name: state - type: TrainerState - - name: control - type: TrainerControl - outputs: [] - lineno: 220 - has_varargs: false - has_kwargs: true - on_epoch_end: - name: on_epoch_end - doc: '' - parameters: - - name: self - - name: args - type: TrainingArguments - - name: state - type: TrainerState - - name: control - type: TrainerControl - outputs: [] - lineno: 229 - has_varargs: false - has_kwargs: true - on_log: - name: on_log - doc: '' - parameters: - - name: self - - name: args - type: TrainingArguments - - name: state - type: TrainerState - - name: control - type: TrainerControl - - name: logs - type: Dict[str, float] - default: null - outputs: [] - lineno: 238 - has_varargs: false - has_kwargs: true - on_train_begin: - name: on_train_begin - doc: '' - parameters: - - name: self - - name: args - type: TrainingArguments - - name: state - type: TrainerState - - name: control - type: TrainerControl - outputs: [] - lineno: 262 - has_varargs: false - has_kwargs: true - on_train_end: - name: on_train_end - doc: '' - parameters: - - name: self - - name: args - type: TrainingArguments - - name: state - type: TrainerState - - name: control - type: TrainerControl - - name: model - type: PreTrainedModel - default: null - - name: tokenizer - type: PreTrainedTokenizer - default: null - outputs: [] - lineno: 271 - has_varargs: false - has_kwargs: true - on_evaluate: - name: on_evaluate - doc: '' - parameters: - - name: self - - name: args - type: TrainingArguments - - name: state - type: TrainerState - - name: control - type: TrainerControl - outputs: [] - lineno: 322 - has_varargs: false - has_kwargs: true - apply_mlrun: - name: apply_mlrun - doc: Wrap the given model with MLRun's interface providing it with mlrun's additional - features. - parameters: - - name: huggingface_object - doc: The model to wrap. Can be loaded from the model path given as well. - - name: model_name - type: str - doc: 'The model name to use for storing the model artifact. Default: "model".' - default: null - - name: tag - type: str - doc: The model's tag to log with. - default: '' - - name: context - type: MLClientCtx - doc: MLRun context to work with. If no context is given it will be retrieved - via 'mlrun.get_or_create_ctx(None)' - default: null - - name: auto_log - type: bool - doc: 'Whether to enable MLRun''s auto logging. Default: True.' - default: true - - name: labels - type: Dict[str, str] - default: null - - name: extra_data - type: dict - default: null - outputs: [] - lineno: 421 - has_varargs: false - has_kwargs: true - train: - name: train - doc: 'Training and evaluating a pretrained model with a pretrained tokenizer - over a dataset. - - The dataset can be either be the name of the dataset that contains in the - HuggingFace hub, - - or a URI or a FeatureVector' - parameters: - - name: context - type: MLClientCtx - doc: MLRun context - - name: hf_dataset - type: str - doc: The name of the dataset to get from the HuggingFace hub - default: null - - name: dataset - type: DataItem - doc: The dataset to train the model on. Can be either a URI or a FeatureVector - default: null - - name: test_set - type: DataItem - doc: The test set to train the model with. - default: null - - name: drop_columns - type: Optional[List[str]] - doc: The columns to drop from the dataset. - default: null - - name: pretrained_tokenizer - type: str - doc: The name of the pretrained tokenizer from the HuggingFace hub. - default: null - - name: pretrained_model - type: str - doc: The name of the pretrained model from the HuggingFace hub. - default: null - - name: model_class - type: str - doc: The class of the model, e.g. `transformers.AutoModelForSequenceClassification` - default: null - - name: model_name - type: str - doc: The model's name to use for storing the model artifact, default to 'model' - default: huggingface-model - - name: label_name - type: str - doc: The target label of the column in the dataset. - default: labels - - name: text_col - type: str - doc: The input text column un the dataset. - default: text - - name: num_of_train_samples - type: int - doc: Max number of training samples, for debugging. - default: null - - name: train_test_split_size - type: float - doc: Should be between 0.0 and 1.0 and represent the proportion of the dataset - to include in the test split. - default: null - - name: metrics - type: List[str] - doc: List of different metrics for evaluate the model such as f1, accuracy - etc. - default: null - - name: random_state - type: int - doc: Random state for train_test_split - default: null - outputs: [] - lineno: 647 - has_varargs: false - has_kwargs: false - preprocess_function: - name: preprocess_function - doc: '' - parameters: - - name: examples - outputs: [] - lineno: 696 - has_varargs: false - has_kwargs: false - optimize: - name: optimize - doc: Optimizing the transformer model using ONNX optimization. - parameters: - - name: model_path - type: str - doc: The path of the model to optimize. - - name: model_name - type: str - doc: Name of the optimized model. - default: optimized_model - - name: target_dir - type: str - doc: The directory to save the ONNX model. - default: ./optimized - - name: optimization_level - type: int - doc: Optimization level performed by ONNX Runtime of the loaded graph. (default - is 1) - default: 1 - outputs: [] - lineno: 799 - has_varargs: false - has_kwargs: false - description: Automatic train and optimize functions for HuggingFace framework - default_handler: train - disable_auto_mount: false - clone_target_dir: '' - env: [] - priority_class_name: '' - preemption_mode: prevent - affinity: null - tolerations: null - security_context: {} -verbose: false diff --git a/hugging_face_classifier_trainer/hugging_face_classifier_trainer.ipynb b/hugging_face_classifier_trainer/hugging_face_classifier_trainer.ipynb deleted file mode 100644 index 2768d2dc1..000000000 --- a/hugging_face_classifier_trainer/hugging_face_classifier_trainer.ipynb +++ /dev/null @@ -1,2533 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "pycharm": { - "name": "#%% md\n" - } - }, - "source": [ - "\n", - "# MLRun Hugging Face Classifier Trainer Tutorial" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": { - "name": "#%% md\n" - } - }, - "source": [ - "This notebook shows how to use the handlers of the Hugging Face classifier trainer.\n", - "the following handlers are:\n", - "- `train`\n", - "- `optimize`\n", - "\n", - "All you need is simply **HF model type** and a **HF dataset name**." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "scrolled": true, - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied: onnx~=1.14.1 in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from -r requirements.txt (line 1)) (1.14.1)\n", - "Requirement already satisfied: onnxruntime==1.16.1 in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from -r requirements.txt (line 2)) (1.16.1)\n", - "Requirement already satisfied: optimum~=1.6.4 in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from -r requirements.txt (line 3)) (1.6.4)\n", - "Requirement already satisfied: transformers~=4.26.1 in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from -r requirements.txt (line 4)) (4.26.1)\n", - "Requirement already satisfied: datasets~=2.10.1 in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from -r requirements.txt (line 5)) (2.10.1)\n", - "Requirement already satisfied: scikit-learn~=1.0.2 in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from -r requirements.txt (line 6)) (1.0.2)\n", - "Requirement already satisfied: coloredlogs in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from onnxruntime==1.16.1->-r requirements.txt (line 2)) (15.0.1)\n", - "Requirement already satisfied: flatbuffers in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from onnxruntime==1.16.1->-r requirements.txt (line 2)) (1.12)\n", - "Requirement already satisfied: numpy>=1.21.6 in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from onnxruntime==1.16.1->-r requirements.txt (line 2)) (1.23.5)\n", - "Requirement already satisfied: packaging in /conda/envs/mlrun-base/lib/python3.9/site-packages (from onnxruntime==1.16.1->-r requirements.txt (line 2)) (21.3)\n", - "Requirement already satisfied: protobuf in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from onnxruntime==1.16.1->-r requirements.txt (line 2)) (3.20.2)\n", - "Requirement already satisfied: sympy in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from onnxruntime==1.16.1->-r requirements.txt (line 2)) (1.12)\n", - "Requirement already satisfied: typing-extensions>=3.6.2.1 in /conda/envs/mlrun-base/lib/python3.9/site-packages (from onnx~=1.14.1->-r requirements.txt (line 1)) (4.7.1)\n", - "Requirement already satisfied: torch>=1.9 in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from optimum~=1.6.4->-r requirements.txt (line 3)) (2.1.2)\n", - "Requirement already satisfied: huggingface-hub>=0.8.0 in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from optimum~=1.6.4->-r requirements.txt (line 3)) (0.20.1)\n", - "Requirement already satisfied: filelock in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from transformers~=4.26.1->-r requirements.txt (line 4)) (3.13.1)\n", - "Requirement already satisfied: pyyaml>=5.1 in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from transformers~=4.26.1->-r requirements.txt (line 4)) (5.4.1)\n", - "Requirement already satisfied: regex!=2019.12.17 in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from transformers~=4.26.1->-r requirements.txt (line 4)) (2023.12.25)\n", - "Requirement already satisfied: requests in /conda/envs/mlrun-base/lib/python3.9/site-packages (from transformers~=4.26.1->-r requirements.txt (line 4)) (2.31.0)\n", - "Requirement already satisfied: tokenizers!=0.11.3,<0.14,>=0.11.1 in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from transformers~=4.26.1->-r requirements.txt (line 4)) (0.13.3)\n", - "Requirement already satisfied: tqdm>=4.27 in /conda/envs/mlrun-base/lib/python3.9/site-packages (from transformers~=4.26.1->-r requirements.txt (line 4)) (4.65.0)\n", - "Requirement already satisfied: pyarrow>=6.0.0 in /conda/envs/mlrun-base/lib/python3.9/site-packages (from datasets~=2.10.1->-r requirements.txt (line 5)) (11.0.0)\n", - "Requirement already satisfied: dill<0.3.7,>=0.3.0 in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from datasets~=2.10.1->-r requirements.txt (line 5)) (0.3.6)\n", - "Requirement already satisfied: pandas in /conda/envs/mlrun-base/lib/python3.9/site-packages (from datasets~=2.10.1->-r requirements.txt (line 5)) (1.4.4)\n", - "Requirement already satisfied: xxhash in /conda/envs/mlrun-base/lib/python3.9/site-packages (from datasets~=2.10.1->-r requirements.txt (line 5)) (3.3.0)\n", - "Requirement already satisfied: multiprocess in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from datasets~=2.10.1->-r requirements.txt (line 5)) (0.70.14)\n", - "Requirement already satisfied: fsspec>=2021.11.1 in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from fsspec[http]>=2021.11.1->datasets~=2.10.1->-r requirements.txt (line 5)) (2023.9.2)\n", - "Requirement already satisfied: aiohttp in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from datasets~=2.10.1->-r requirements.txt (line 5)) (3.9.1)\n", - "Requirement already satisfied: responses<0.19 in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from datasets~=2.10.1->-r requirements.txt (line 5)) (0.18.0)\n", - "Requirement already satisfied: scipy>=1.1.0 in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from scikit-learn~=1.0.2->-r requirements.txt (line 6)) (1.11.4)\n", - "Requirement already satisfied: joblib>=0.11 in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from scikit-learn~=1.0.2->-r requirements.txt (line 6)) (1.3.2)\n", - "Requirement already satisfied: threadpoolctl>=2.0.0 in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from scikit-learn~=1.0.2->-r requirements.txt (line 6)) (3.2.0)\n", - "Requirement already satisfied: attrs>=17.3.0 in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from aiohttp->datasets~=2.10.1->-r requirements.txt (line 5)) (19.1.0)\n", - "Requirement already satisfied: multidict<7.0,>=4.5 in /conda/envs/mlrun-base/lib/python3.9/site-packages (from aiohttp->datasets~=2.10.1->-r requirements.txt (line 5)) (6.0.4)\n", - "Requirement already satisfied: yarl<2.0,>=1.0 in /conda/envs/mlrun-base/lib/python3.9/site-packages (from aiohttp->datasets~=2.10.1->-r requirements.txt (line 5)) (1.9.2)\n", - "Requirement already satisfied: frozenlist>=1.1.1 in /conda/envs/mlrun-base/lib/python3.9/site-packages (from aiohttp->datasets~=2.10.1->-r requirements.txt (line 5)) (1.4.0)\n", - "Requirement already satisfied: aiosignal>=1.1.2 in /conda/envs/mlrun-base/lib/python3.9/site-packages (from aiohttp->datasets~=2.10.1->-r requirements.txt (line 5)) (1.3.1)\n", - "Requirement already satisfied: async-timeout<5.0,>=4.0 in /conda/envs/mlrun-base/lib/python3.9/site-packages (from aiohttp->datasets~=2.10.1->-r requirements.txt (line 5)) (4.0.3)\n", - "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /conda/envs/mlrun-base/lib/python3.9/site-packages (from packaging->onnxruntime==1.16.1->-r requirements.txt (line 2)) (3.1.1)\n", - "Requirement already satisfied: charset-normalizer<4,>=2 in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from requests->transformers~=4.26.1->-r requirements.txt (line 4)) (2.1.1)\n", - "Requirement already satisfied: idna<4,>=2.5 in /conda/envs/mlrun-base/lib/python3.9/site-packages (from requests->transformers~=4.26.1->-r requirements.txt (line 4)) (3.4)\n", - "Requirement already satisfied: urllib3<3,>=1.21.1 in /conda/envs/mlrun-base/lib/python3.9/site-packages (from requests->transformers~=4.26.1->-r requirements.txt (line 4)) (1.26.16)\n", - "Requirement already satisfied: certifi>=2017.4.17 in /conda/envs/mlrun-base/lib/python3.9/site-packages (from requests->transformers~=4.26.1->-r requirements.txt (line 4)) (2023.7.22)\n", - "Requirement already satisfied: networkx in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from torch>=1.9->optimum~=1.6.4->-r requirements.txt (line 3)) (3.2.1)\n", - "Requirement already satisfied: jinja2 in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from torch>=1.9->optimum~=1.6.4->-r requirements.txt (line 3)) (3.1.3)\n", - "Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.1.105 in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from torch>=1.9->optimum~=1.6.4->-r requirements.txt (line 3)) (12.1.105)\n", - "Requirement already satisfied: nvidia-cuda-runtime-cu12==12.1.105 in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from torch>=1.9->optimum~=1.6.4->-r requirements.txt (line 3)) (12.1.105)\n", - "Requirement already satisfied: nvidia-cuda-cupti-cu12==12.1.105 in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from torch>=1.9->optimum~=1.6.4->-r requirements.txt (line 3)) (12.1.105)\n", - "Requirement already satisfied: nvidia-cudnn-cu12==8.9.2.26 in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from torch>=1.9->optimum~=1.6.4->-r requirements.txt (line 3)) (8.9.2.26)\n", - "Requirement already satisfied: nvidia-cublas-cu12==12.1.3.1 in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from torch>=1.9->optimum~=1.6.4->-r requirements.txt (line 3)) (12.1.3.1)\n", - "Requirement already satisfied: nvidia-cufft-cu12==11.0.2.54 in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from torch>=1.9->optimum~=1.6.4->-r requirements.txt (line 3)) (11.0.2.54)\n", - "Requirement already satisfied: nvidia-curand-cu12==10.3.2.106 in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from torch>=1.9->optimum~=1.6.4->-r requirements.txt (line 3)) (10.3.2.106)\n", - "Requirement already satisfied: nvidia-cusolver-cu12==11.4.5.107 in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from torch>=1.9->optimum~=1.6.4->-r requirements.txt (line 3)) (11.4.5.107)\n", - "Requirement already satisfied: nvidia-cusparse-cu12==12.1.0.106 in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from torch>=1.9->optimum~=1.6.4->-r requirements.txt (line 3)) (12.1.0.106)\n", - "Requirement already satisfied: nvidia-nccl-cu12==2.18.1 in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from torch>=1.9->optimum~=1.6.4->-r requirements.txt (line 3)) (2.18.1)\n", - "Requirement already satisfied: nvidia-nvtx-cu12==12.1.105 in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from torch>=1.9->optimum~=1.6.4->-r requirements.txt (line 3)) (12.1.105)\n", - "Requirement already satisfied: triton==2.1.0 in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from torch>=1.9->optimum~=1.6.4->-r requirements.txt (line 3)) (2.1.0)\n", - "Requirement already satisfied: nvidia-nvjitlink-cu12 in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from nvidia-cusolver-cu12==11.4.5.107->torch>=1.9->optimum~=1.6.4->-r requirements.txt (line 3)) (12.3.101)\n", - "Requirement already satisfied: sentencepiece!=0.1.92,>=0.1.91 in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from transformers[sentencepiece]>=4.26.0->optimum~=1.6.4->-r requirements.txt (line 3)) (0.2.0)\n", - "Requirement already satisfied: humanfriendly>=9.1 in /conda/envs/mlrun-base/lib/python3.9/site-packages (from coloredlogs->onnxruntime==1.16.1->-r requirements.txt (line 2)) (9.2)\n", - "Requirement already satisfied: python-dateutil>=2.8.1 in /conda/envs/mlrun-base/lib/python3.9/site-packages (from pandas->datasets~=2.10.1->-r requirements.txt (line 5)) (2.8.2)\n", - "Requirement already satisfied: pytz>=2020.1 in /conda/envs/mlrun-base/lib/python3.9/site-packages (from pandas->datasets~=2.10.1->-r requirements.txt (line 5)) (2023.3.post1)\n", - "Requirement already satisfied: mpmath>=0.19 in /User/.pythonlibs/mlrun-base/lib/python3.9/site-packages (from sympy->onnxruntime==1.16.1->-r requirements.txt (line 2)) (1.3.0)\n", - "Requirement already satisfied: six>=1.5 in /conda/envs/mlrun-base/lib/python3.9/site-packages (from python-dateutil>=2.8.1->pandas->datasets~=2.10.1->-r requirements.txt (line 5)) (1.16.0)\n", - "Requirement already satisfied: MarkupSafe>=2.0 in /conda/envs/mlrun-base/lib/python3.9/site-packages (from jinja2->torch>=1.9->optimum~=1.6.4->-r requirements.txt (line 3)) (2.1.3)\n", - "Note: you may need to restart the kernel to use updated packages.\n" - ] - } - ], - "source": [ - "%pip install -r requirements.txt" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [], - "source": [ - "import mlrun" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2024-03-24 17:10:17,091 [info] Project loaded successfully: {'project_name': 'hugging-face-trainer'}\n" - ] - } - ], - "source": [ - "project = mlrun.get_or_create_project('hugging-face-trainer', context=\"./\", user_project=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": { - "name": "#%% md\n" - } - }, - "source": [ - "### **Importing the hugging_face_classifier_trainer function from the Marketplace**" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [], - "source": [ - "hugging_face_classifier_trainer = mlrun.import_function(\"hub://hugging_face_classifier_trainer\")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": { - "name": "#%% md\n" - } - }, - "source": [ - "### **Training a model**\n", - "\n", - "Choosing the `train` handler" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": { - "name": "#%% md\n" - } - }, - "source": [ - "#### Define task parameters¶\n", - "* Class parameters should contain the prefix `CLASS_`\n", - "* Train parameters should contain the prefix `TRAIN_`" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [], - "source": [ - "model_class = \"transformers.AutoModelForSequenceClassification\"\n", - "additional_parameters = {\n", - " \"TRAIN_output_dir\": \"finetuning-sentiment-model-3000-samples\",\n", - " \"TRAIN_learning_rate\": 2e-5,\n", - " \"TRAIN_per_device_train_batch_size\": 16,\n", - " \"TRAIN_per_device_eval_batch_size\": 16,\n", - " \"TRAIN_num_train_epochs\": 3,\n", - " \"TRAIN_weight_decay\": 0.01,\n", - " \"TRAIN_push_to_hub\": False,\n", - " \"TRAIN_evaluation_strategy\": \"epoch\",\n", - " \"TRAIN_eval_steps\": 1,\n", - " \"TRAIN_logging_steps\": 1,\n", - " \"CLASS_num_labels\": 2\n", - "}" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": { - "name": "#%% md\n" - } - }, - "source": [ - "#### Running the Training job with the \"train\" handler" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "pycharm": { - "name": "#%%\n" - }, - "scrolled": true, - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2024-03-24 17:10:21,025 [info] Storing function: {'name': 'hugging-face-classifier-trainer-train', 'uid': '514d8d5530c842238b1cc81983cd943e', 'db': 'http://mlrun-api:8080'}\n", - "> 2024-03-24 17:11:03,727 [info] 'train_test_split_size' is not provided, setting train_test_split_size to 0.2\n", - "> 2024-03-24 17:11:03,882 [info] Loading and editing Shayanvsf/US_Airline_Sentiment dataset from Hugging Face hub\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Found cached dataset parquet (/igz/.cache/huggingface/datasets/Shayanvsf___parquet/Shayanvsf--US_Airline_Sentiment-1319c42f87c44b2f/0.0.0/2a3b91fbd88a2c90d1dbbb32b460cf621d31bd5b05b934492fdef7d8d6f236ec)\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "f43b1388d0b344888323bec590baadee", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - " 0%| | 0/3 [00:00 2024-03-24 17:11:08,938 [info] training 'huggingface-model'\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "The following columns in the training set don't have a corresponding argument in `DistilBertForSequenceClassification.forward` and have been ignored: text. If text are not expected by `DistilBertForSequenceClassification.forward`, you can safely ignore this message.\n", - "This implementation of AdamW is deprecated and will be removed in a future version. Use the PyTorch implementation torch.optim.AdamW instead, or set `no_deprecation_warning=True` to disable this warning\n", - "***** Running training *****\n", - " Num examples = 100\n", - " Num Epochs = 3\n", - " Instantaneous batch size per device = 16\n", - " Total train batch size (w. parallel, distributed & accumulation) = 16\n", - " Gradient Accumulation steps = 1\n", - " Total optimization steps = 21\n", - " Number of trainable parameters = 66955010\n", - "You're using a DistilBertTokenizerFast tokenizer. Please note that with a fast tokenizer, using the `__call__` method is faster than using a method to encode the text followed by a call to the `pad` method to get a padded encoding.\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - " \n", - " \n", - " [21/21 00:15, Epoch 3/3]\n", - "
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
EpochTraining LossValidation LossAccuracyF1
10.7389000.5153110.7916670.000000
20.5259000.4815630.7916670.000000
30.4908000.4716750.7916670.000000

" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "The following columns in the evaluation set don't have a corresponding argument in `DistilBertForSequenceClassification.forward` and have been ignored: text. If text are not expected by `DistilBertForSequenceClassification.forward`, you can safely ignore this message.\n", - "***** Running Evaluation *****\n", - " Num examples = 24\n", - " Batch size = 16\n", - "/tmp/tmp0c1aawrq.py:561: FutureWarning:\n", - "\n", - "load_metric is deprecated and will be removed in the next major version of datasets. Use 'evaluate.load' instead, from the new library 🤗 Evaluate: https://huggingface.co/docs/evaluate\n", - "\n", - "The following columns in the evaluation set don't have a corresponding argument in `DistilBertForSequenceClassification.forward` and have been ignored: text. If text are not expected by `DistilBertForSequenceClassification.forward`, you can safely ignore this message.\n", - "***** Running Evaluation *****\n", - " Num examples = 24\n", - " Batch size = 16\n", - "The following columns in the evaluation set don't have a corresponding argument in `DistilBertForSequenceClassification.forward` and have been ignored: text. If text are not expected by `DistilBertForSequenceClassification.forward`, you can safely ignore this message.\n", - "***** Running Evaluation *****\n", - " Num examples = 24\n", - " Batch size = 16\n", - "\n", - "\n", - "Training completed. Do not forget to share your model on huggingface.co/models =)\n", - "\n", - "\n", - "tokenizer config file saved in /tmp/tokenizer/tokenizer_config.json\n", - "Special tokens file saved in /tmp/tokenizer/special_tokens_map.json\n", - "Configuration saved in /tmp/model/config.json\n", - "Model weights saved in /tmp/model/pytorch_model.bin\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "

\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
projectuiditerstartstatenamelabelsinputsparametersresultsartifacts
hugging-face-trainer-avia0Mar 24 17:10:21completedhugging-face-classifier-trainer-train
v3io_user=avia
kind=local
owner=avia
host=jupyter-avia-6454bdd4c5-xz8cg
hf_dataset=Shayanvsf/US_Airline_Sentiment
drop_columns=['airline_sentiment_confidence', 'negativereason_confidence']
pretrained_tokenizer=distilbert-base-uncased
pretrained_model=distilbert-base-uncased
model_class=transformers.AutoModelForSequenceClassification
label_name=airline_sentiment
num_of_train_samples=100
metrics=['accuracy', 'f1']
random_state=42
TRAIN_output_dir=finetuning-sentiment-model-3000-samples
TRAIN_learning_rate=2e-05
TRAIN_per_device_train_batch_size=16
TRAIN_per_device_eval_batch_size=16
TRAIN_num_train_epochs=3
TRAIN_weight_decay=0.01
TRAIN_push_to_hub=False
TRAIN_evaluation_strategy=epoch
TRAIN_eval_steps=1
TRAIN_logging_steps=1
CLASS_num_labels=2
loss=0.4908
learning_rate=0.0
eval_loss=0.47167453169822693
eval_accuracy=0.7916666666666666
eval_f1=0.0
eval_runtime=0.5186
eval_samples_per_second=46.276
eval_steps_per_second=3.856
train_runtime=17.6054
train_samples_per_second=17.04
train_steps_per_second=1.193
total_flos=3327208489680.0
loss_plot
learning_rate_plot
eval_loss_plot
eval_accuracy_plot
eval_f1_plot
eval_runtime_plot
eval_samples_per_second_plot
eval_steps_per_second_plot
tokenizer
model
\n", - "
\n", - "
\n", - "
\n", - " Title\n", - " ×\n", - "
\n", - " \n", - "
\n", - "
\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - }, - { - "data": { - "text/html": [ - " > to track results use the .show() or .logs() methods or click here to open in UI" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2024-03-24 17:12:01,880 [info] Run execution finished: {'status': 'completed', 'name': 'hugging-face-classifier-trainer-train'}\n" - ] - } - ], - "source": [ - "train_run = hugging_face_classifier_trainer.run(params={\n", - " \"hf_dataset\": \"Shayanvsf/US_Airline_Sentiment\",\n", - " \"drop_columns\": [\n", - " \"airline_sentiment_confidence\",\n", - " \"negativereason_confidence\",\n", - " ],\n", - " \"pretrained_tokenizer\": \"distilbert-base-uncased\",\n", - " \"pretrained_model\": \"distilbert-base-uncased\",\n", - " \"model_class\": \"transformers.AutoModelForSequenceClassification\",\n", - " \"label_name\": \"airline_sentiment\",\n", - " \"num_of_train_samples\": 100,\n", - " \"metrics\": [\"accuracy\", \"f1\"],\n", - " \"random_state\": 42,\n", - " **additional_parameters\n", - " },\n", - " handler=\"train\",\n", - " local=True,\n", - " )" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": { - "name": "#%% md\n" - } - }, - "source": [ - "#### The result of the train run" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{'loss': 0.4908,\n", - " 'learning_rate': 0.0,\n", - " 'eval_loss': 0.47167453169822693,\n", - " 'eval_accuracy': 0.7916666666666666,\n", - " 'eval_f1': 0.0,\n", - " 'eval_runtime': 0.5186,\n", - " 'eval_samples_per_second': 46.276,\n", - " 'eval_steps_per_second': 3.856,\n", - " 'train_runtime': 17.6054,\n", - " 'train_samples_per_second': 17.04,\n", - " 'train_steps_per_second': 1.193,\n", - " 'total_flos': 3327208489680.0,\n", - " 'loss_plot': 'v3io:///projects/hugging-face-trainer-avia/artifacts/hugging-face-classifier-trainer-train/0/loss_plot.html',\n", - " 'learning_rate_plot': 'v3io:///projects/hugging-face-trainer-avia/artifacts/hugging-face-classifier-trainer-train/0/learning_rate_plot.html',\n", - " 'eval_loss_plot': 'v3io:///projects/hugging-face-trainer-avia/artifacts/hugging-face-classifier-trainer-train/0/eval_loss_plot.html',\n", - " 'eval_accuracy_plot': 'v3io:///projects/hugging-face-trainer-avia/artifacts/hugging-face-classifier-trainer-train/0/eval_accuracy_plot.html',\n", - " 'eval_f1_plot': 'v3io:///projects/hugging-face-trainer-avia/artifacts/hugging-face-classifier-trainer-train/0/eval_f1_plot.html',\n", - " 'eval_runtime_plot': 'v3io:///projects/hugging-face-trainer-avia/artifacts/hugging-face-classifier-trainer-train/0/eval_runtime_plot.html',\n", - " 'eval_samples_per_second_plot': 'v3io:///projects/hugging-face-trainer-avia/artifacts/hugging-face-classifier-trainer-train/0/eval_samples_per_second_plot.html',\n", - " 'eval_steps_per_second_plot': 'v3io:///projects/hugging-face-trainer-avia/artifacts/hugging-face-classifier-trainer-train/0/eval_steps_per_second_plot.html',\n", - " 'tokenizer': 'store://artifacts/hugging-face-trainer-avia/hugging-face-classifier-trainer-train_tokenizer@514d8d5530c842238b1cc81983cd943e',\n", - " 'model': 'store://artifacts/hugging-face-trainer-avia/huggingface-model@514d8d5530c842238b1cc81983cd943e'}" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "train_run.outputs" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "
\n", - "
\n", - "\n", - "" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "train_run.artifact('loss_plot').show()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": { - "name": "#%% md\n" - } - }, - "source": [ - "#### Getting the model for evaluating and predicting" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [], - "source": [ - "model_path = train_run.outputs['model']" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Optimize the model**\n", - "\n", - "Choosing the `optimize` handler\n", - "\n", - "The result of using this handled is an onnx optimized model." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "scrolled": true, - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2024-03-24 17:12:02,020 [info] Storing function: {'name': 'hugging-face-classifier-trainer-optimize', 'uid': 'fbee1ead18444824a4b5c0308a677bf4', 'db': 'http://mlrun-api:8080'}\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/User/.pythonlibs/mlrun-base/lib/python3.9/site-packages/optimum/onnxruntime/configuration.py:726: FutureWarning:\n", - "\n", - "disable_embed_layer_norm will be deprecated soon, use disable_embed_layer_norm_fusion instead, disable_embed_layer_norm_fusion is set to True.\n", - "\n", - "loading configuration file /tmp/config.json\n", - "Model config DistilBertConfig {\n", - " \"_name_or_path\": \"/tmp/config.json\",\n", - " \"activation\": \"gelu\",\n", - " \"architectures\": [\n", - " \"DistilBertForSequenceClassification\"\n", - " ],\n", - " \"attention_dropout\": 0.1,\n", - " \"dim\": 768,\n", - " \"dropout\": 0.1,\n", - " \"hidden_dim\": 3072,\n", - " \"initializer_range\": 0.02,\n", - " \"max_position_embeddings\": 512,\n", - " \"model_type\": \"distilbert\",\n", - " \"n_heads\": 12,\n", - " \"n_layers\": 6,\n", - " \"pad_token_id\": 0,\n", - " \"problem_type\": \"single_label_classification\",\n", - " \"qa_dropout\": 0.1,\n", - " \"seq_classif_dropout\": 0.2,\n", - " \"sinusoidal_pos_embds\": false,\n", - " \"tie_weights_\": true,\n", - " \"torch_dtype\": \"float32\",\n", - " \"transformers_version\": \"4.26.1\",\n", - " \"vocab_size\": 30522\n", - "}\n", - "\n", - "loading configuration file /tmp/config.json\n", - "Model config DistilBertConfig {\n", - " \"_name_or_path\": \"/tmp\",\n", - " \"activation\": \"gelu\",\n", - " \"architectures\": [\n", - " \"DistilBertForSequenceClassification\"\n", - " ],\n", - " \"attention_dropout\": 0.1,\n", - " \"dim\": 768,\n", - " \"dropout\": 0.1,\n", - " \"hidden_dim\": 3072,\n", - " \"initializer_range\": 0.02,\n", - " \"max_position_embeddings\": 512,\n", - " \"model_type\": \"distilbert\",\n", - " \"n_heads\": 12,\n", - " \"n_layers\": 6,\n", - " \"pad_token_id\": 0,\n", - " \"problem_type\": \"single_label_classification\",\n", - " \"qa_dropout\": 0.1,\n", - " \"seq_classif_dropout\": 0.2,\n", - " \"sinusoidal_pos_embds\": false,\n", - " \"tie_weights_\": true,\n", - " \"torch_dtype\": \"float32\",\n", - " \"transformers_version\": \"4.26.1\",\n", - " \"vocab_size\": 30522\n", - "}\n", - "\n", - "loading weights file /tmp/pytorch_model.bin\n", - "All model checkpoint weights were used when initializing DistilBertForSequenceClassification.\n", - "\n", - "All the weights of DistilBertForSequenceClassification were initialized from the model checkpoint at /tmp.\n", - "If your task is similar to the task the model of the checkpoint was trained on, you can already use DistilBertForSequenceClassification for predictions without further training.\n", - "/User/.pythonlibs/mlrun-base/lib/python3.9/site-packages/transformers/models/distilbert/modeling_distilbert.py:218: TracerWarning:\n", - "\n", - "torch.tensor results are registered as constants in the trace. You can safely ignore this warning if you use this function to create tensors out of constant variables that would be the same every time you call this function. In any other case, this might cause the trace to be incorrect.\n", - "\n", - "Configuration saved in /tmp/tmp79wjp8m8/config.json\n", - "Could not locate the tokenizer configuration file, will try to use the model config instead.\n", - "loading configuration file /tmp/config.json\n", - "Model config DistilBertConfig {\n", - " \"_name_or_path\": \"/tmp\",\n", - " \"activation\": \"gelu\",\n", - " \"architectures\": [\n", - " \"DistilBertForSequenceClassification\"\n", - " ],\n", - " \"attention_dropout\": 0.1,\n", - " \"dim\": 768,\n", - " \"dropout\": 0.1,\n", - " \"hidden_dim\": 3072,\n", - " \"initializer_range\": 0.02,\n", - " \"max_position_embeddings\": 512,\n", - " \"model_type\": \"distilbert\",\n", - " \"n_heads\": 12,\n", - " \"n_layers\": 6,\n", - " \"pad_token_id\": 0,\n", - " \"problem_type\": \"single_label_classification\",\n", - " \"qa_dropout\": 0.1,\n", - " \"seq_classif_dropout\": 0.2,\n", - " \"sinusoidal_pos_embds\": false,\n", - " \"tie_weights_\": true,\n", - " \"torch_dtype\": \"float32\",\n", - " \"transformers_version\": \"4.26.1\",\n", - " \"vocab_size\": 30522\n", - "}\n", - "\n", - "loading configuration file /tmp/config.json\n", - "Model config DistilBertConfig {\n", - " \"_name_or_path\": \"/tmp\",\n", - " \"activation\": \"gelu\",\n", - " \"architectures\": [\n", - " \"DistilBertForSequenceClassification\"\n", - " ],\n", - " \"attention_dropout\": 0.1,\n", - " \"dim\": 768,\n", - " \"dropout\": 0.1,\n", - " \"hidden_dim\": 3072,\n", - " \"initializer_range\": 0.02,\n", - " \"max_position_embeddings\": 512,\n", - " \"model_type\": \"distilbert\",\n", - " \"n_heads\": 12,\n", - " \"n_layers\": 6,\n", - " \"pad_token_id\": 0,\n", - " \"problem_type\": \"single_label_classification\",\n", - " \"qa_dropout\": 0.1,\n", - " \"seq_classif_dropout\": 0.2,\n", - " \"sinusoidal_pos_embds\": false,\n", - " \"tie_weights_\": true,\n", - " \"torch_dtype\": \"float32\",\n", - " \"transformers_version\": \"4.26.1\",\n", - " \"vocab_size\": 30522\n", - "}\n", - "\n", - "Could not locate the tokenizer configuration file, will try to use the model config instead.\n", - "loading configuration file /tmp/config.json\n", - "Model config DistilBertConfig {\n", - " \"_name_or_path\": \"/tmp\",\n", - " \"activation\": \"gelu\",\n", - " \"architectures\": [\n", - " \"DistilBertForSequenceClassification\"\n", - " ],\n", - " \"attention_dropout\": 0.1,\n", - " \"dim\": 768,\n", - " \"dropout\": 0.1,\n", - " \"hidden_dim\": 3072,\n", - " \"initializer_range\": 0.02,\n", - " \"max_position_embeddings\": 512,\n", - " \"model_type\": \"distilbert\",\n", - " \"n_heads\": 12,\n", - " \"n_layers\": 6,\n", - " \"pad_token_id\": 0,\n", - " \"problem_type\": \"single_label_classification\",\n", - " \"qa_dropout\": 0.1,\n", - " \"seq_classif_dropout\": 0.2,\n", - " \"sinusoidal_pos_embds\": false,\n", - " \"tie_weights_\": true,\n", - " \"torch_dtype\": \"float32\",\n", - " \"transformers_version\": \"4.26.1\",\n", - " \"vocab_size\": 30522\n", - "}\n", - "\n", - "Could not locate the tokenizer configuration file, will try to use the model config instead.\n", - "loading configuration file /tmp/tmp79wjp8m8/config.json\n", - "Model config DistilBertConfig {\n", - " \"_name_or_path\": \"/tmp/tmp79wjp8m8\",\n", - " \"activation\": \"gelu\",\n", - " \"architectures\": [\n", - " \"DistilBertForSequenceClassification\"\n", - " ],\n", - " \"attention_dropout\": 0.1,\n", - " \"dim\": 768,\n", - " \"dropout\": 0.1,\n", - " \"hidden_dim\": 3072,\n", - " \"initializer_range\": 0.02,\n", - " \"max_position_embeddings\": 512,\n", - " \"model_type\": \"distilbert\",\n", - " \"n_heads\": 12,\n", - " \"n_layers\": 6,\n", - " \"pad_token_id\": 0,\n", - " \"problem_type\": \"single_label_classification\",\n", - " \"qa_dropout\": 0.1,\n", - " \"seq_classif_dropout\": 0.2,\n", - " \"sinusoidal_pos_embds\": false,\n", - " \"tie_weights_\": true,\n", - " \"torch_dtype\": \"float32\",\n", - " \"transformers_version\": \"4.26.1\",\n", - " \"vocab_size\": 30522\n", - "}\n", - "\n", - "loading configuration file /tmp/tmp79wjp8m8/config.json\n", - "Model config DistilBertConfig {\n", - " \"_name_or_path\": \"/tmp/tmp79wjp8m8\",\n", - " \"activation\": \"gelu\",\n", - " \"architectures\": [\n", - " \"DistilBertForSequenceClassification\"\n", - " ],\n", - " \"attention_dropout\": 0.1,\n", - " \"dim\": 768,\n", - " \"dropout\": 0.1,\n", - " \"hidden_dim\": 3072,\n", - " \"initializer_range\": 0.02,\n", - " \"max_position_embeddings\": 512,\n", - " \"model_type\": \"distilbert\",\n", - " \"n_heads\": 12,\n", - " \"n_layers\": 6,\n", - " \"pad_token_id\": 0,\n", - " \"problem_type\": \"single_label_classification\",\n", - " \"qa_dropout\": 0.1,\n", - " \"seq_classif_dropout\": 0.2,\n", - " \"sinusoidal_pos_embds\": false,\n", - " \"tie_weights_\": true,\n", - " \"torch_dtype\": \"float32\",\n", - " \"transformers_version\": \"4.26.1\",\n", - " \"vocab_size\": 30522\n", - "}\n", - "\n", - "Could not locate the tokenizer configuration file, will try to use the model config instead.\n", - "loading configuration file /tmp/tmp79wjp8m8/config.json\n", - "Model config DistilBertConfig {\n", - " \"_name_or_path\": \"/tmp/tmp79wjp8m8\",\n", - " \"activation\": \"gelu\",\n", - " \"architectures\": [\n", - " \"DistilBertForSequenceClassification\"\n", - " ],\n", - " \"attention_dropout\": 0.1,\n", - " \"dim\": 768,\n", - " \"dropout\": 0.1,\n", - " \"hidden_dim\": 3072,\n", - " \"initializer_range\": 0.02,\n", - " \"max_position_embeddings\": 512,\n", - " \"model_type\": \"distilbert\",\n", - " \"n_heads\": 12,\n", - " \"n_layers\": 6,\n", - " \"pad_token_id\": 0,\n", - " \"problem_type\": \"single_label_classification\",\n", - " \"qa_dropout\": 0.1,\n", - " \"seq_classif_dropout\": 0.2,\n", - " \"sinusoidal_pos_embds\": false,\n", - " \"tie_weights_\": true,\n", - " \"torch_dtype\": \"float32\",\n", - " \"transformers_version\": \"4.26.1\",\n", - " \"vocab_size\": 30522\n", - "}\n", - "\n", - "Configuration saved in optimized/config.json\n", - "Could not locate the tokenizer configuration file, will try to use the model config instead.\n", - "loading configuration file /tmp/tmp79wjp8m8/config.json\n", - "Model config DistilBertConfig {\n", - " \"_name_or_path\": \"/tmp/tmp79wjp8m8\",\n", - " \"activation\": \"gelu\",\n", - " \"architectures\": [\n", - " \"DistilBertForSequenceClassification\"\n", - " ],\n", - " \"attention_dropout\": 0.1,\n", - " \"dim\": 768,\n", - " \"dropout\": 0.1,\n", - " \"hidden_dim\": 3072,\n", - " \"initializer_range\": 0.02,\n", - " \"max_position_embeddings\": 512,\n", - " \"model_type\": \"distilbert\",\n", - " \"n_heads\": 12,\n", - " \"n_layers\": 6,\n", - " \"pad_token_id\": 0,\n", - " \"problem_type\": \"single_label_classification\",\n", - " \"qa_dropout\": 0.1,\n", - " \"seq_classif_dropout\": 0.2,\n", - " \"sinusoidal_pos_embds\": false,\n", - " \"tie_weights_\": true,\n", - " \"torch_dtype\": \"float32\",\n", - " \"transformers_version\": \"4.26.1\",\n", - " \"vocab_size\": 30522\n", - "}\n", - "\n", - "loading configuration file /tmp/tmp79wjp8m8/config.json\n", - "Model config DistilBertConfig {\n", - " \"_name_or_path\": \"/tmp/tmp79wjp8m8\",\n", - " \"activation\": \"gelu\",\n", - " \"architectures\": [\n", - " \"DistilBertForSequenceClassification\"\n", - " ],\n", - " \"attention_dropout\": 0.1,\n", - " \"dim\": 768,\n", - " \"dropout\": 0.1,\n", - " \"hidden_dim\": 3072,\n", - " \"initializer_range\": 0.02,\n", - " \"max_position_embeddings\": 512,\n", - " \"model_type\": \"distilbert\",\n", - " \"n_heads\": 12,\n", - " \"n_layers\": 6,\n", - " \"pad_token_id\": 0,\n", - " \"problem_type\": \"single_label_classification\",\n", - " \"qa_dropout\": 0.1,\n", - " \"seq_classif_dropout\": 0.2,\n", - " \"sinusoidal_pos_embds\": false,\n", - " \"tie_weights_\": true,\n", - " \"torch_dtype\": \"float32\",\n", - " \"transformers_version\": \"4.26.1\",\n", - " \"vocab_size\": 30522\n", - "}\n", - "\n", - "Could not locate the tokenizer configuration file, will try to use the model config instead.\n", - "loading configuration file /tmp/tmp79wjp8m8/config.json\n", - "Model config DistilBertConfig {\n", - " \"_name_or_path\": \"/tmp/tmp79wjp8m8\",\n", - " \"activation\": \"gelu\",\n", - " \"architectures\": [\n", - " \"DistilBertForSequenceClassification\"\n", - " ],\n", - " \"attention_dropout\": 0.1,\n", - " \"dim\": 768,\n", - " \"dropout\": 0.1,\n", - " \"hidden_dim\": 3072,\n", - " \"initializer_range\": 0.02,\n", - " \"max_position_embeddings\": 512,\n", - " \"model_type\": \"distilbert\",\n", - " \"n_heads\": 12,\n", - " \"n_layers\": 6,\n", - " \"pad_token_id\": 0,\n", - " \"problem_type\": \"single_label_classification\",\n", - " \"qa_dropout\": 0.1,\n", - " \"seq_classif_dropout\": 0.2,\n", - " \"sinusoidal_pos_embds\": false,\n", - " \"tie_weights_\": true,\n", - " \"torch_dtype\": \"float32\",\n", - " \"transformers_version\": \"4.26.1\",\n", - " \"vocab_size\": 30522\n", - "}\n", - "\n", - "Failed to remove node input: \"/distilbert/transformer/layer.0/attention/Transpose_output_0\"\n", - "input: \"/distilbert/transformer/layer.0/attention/Constant_11_output_0\"\n", - "output: \"/distilbert/transformer/layer.0/attention/Div_output_0\"\n", - "name: \"/distilbert/transformer/layer.0/attention/Div\"\n", - "op_type: \"Div\"\n", - "\n", - "Failed to remove node input: \"/distilbert/transformer/layer.1/attention/Transpose_output_0\"\n", - "input: \"/distilbert/transformer/layer.1/attention/Constant_11_output_0\"\n", - "output: \"/distilbert/transformer/layer.1/attention/Div_output_0\"\n", - "name: \"/distilbert/transformer/layer.1/attention/Div\"\n", - "op_type: \"Div\"\n", - "\n", - "Failed to remove node input: \"/distilbert/transformer/layer.2/attention/Transpose_output_0\"\n", - "input: \"/distilbert/transformer/layer.2/attention/Constant_11_output_0\"\n", - "output: \"/distilbert/transformer/layer.2/attention/Div_output_0\"\n", - "name: \"/distilbert/transformer/layer.2/attention/Div\"\n", - "op_type: \"Div\"\n", - "\n", - "Failed to remove node input: \"/distilbert/transformer/layer.3/attention/Transpose_output_0\"\n", - "input: \"/distilbert/transformer/layer.3/attention/Constant_11_output_0\"\n", - "output: \"/distilbert/transformer/layer.3/attention/Div_output_0\"\n", - "name: \"/distilbert/transformer/layer.3/attention/Div\"\n", - "op_type: \"Div\"\n", - "\n", - "Failed to remove node input: \"/distilbert/transformer/layer.4/attention/Transpose_output_0\"\n", - "input: \"/distilbert/transformer/layer.4/attention/Constant_11_output_0\"\n", - "output: \"/distilbert/transformer/layer.4/attention/Div_output_0\"\n", - "name: \"/distilbert/transformer/layer.4/attention/Div\"\n", - "op_type: \"Div\"\n", - "\n", - "Failed to remove node input: \"/distilbert/transformer/layer.5/attention/Transpose_output_0\"\n", - "input: \"/distilbert/transformer/layer.5/attention/Constant_11_output_0\"\n", - "output: \"/distilbert/transformer/layer.5/attention/Div_output_0\"\n", - "name: \"/distilbert/transformer/layer.5/attention/Div\"\n", - "op_type: \"Div\"\n", - "\n", - "Configuration saved in optimized/config.json\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
projectuiditerstartstatenamelabelsinputsparametersresultsartifacts
hugging-face-trainer-avia0Mar 24 17:12:02completedhugging-face-classifier-trainer-optimize
v3io_user=avia
kind=local
owner=avia
host=jupyter-avia-6454bdd4c5-xz8cg
model_path=store://artifacts/hugging-face-trainer-avia/huggingface-model@514d8d5530c842238b1cc81983cd943e
model
\n", - "
\n", - "
\n", - "
\n", - " Title\n", - " ×\n", - "
\n", - " \n", - "
\n", - "
\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - }, - { - "data": { - "text/html": [ - " > to track results use the .show() or .logs() methods or click here to open in UI" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2024-03-24 17:12:22,721 [info] Run execution finished: {'status': 'completed', 'name': 'hugging-face-classifier-trainer-optimize'}\n" - ] - } - ], - "source": [ - "optimize_run = hugging_face_classifier_trainer.run(params={\n", - " \"model_path\": str(model_path)\n", - " },\n", - " handler=\"optimize\",\n", - " local=True,\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'model': 'store://artifacts/hugging-face-trainer-avia/optimized_model@fbee1ead18444824a4b5c0308a677bf4'}" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "optimize_run.outputs" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Running the training remotely**\n" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "scrolled": true, - "tags": [] - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/User/.pythonlibs/mlrun-base/lib/python3.9/site-packages/mlrun/projects/operations.py:276: OverwriteBuildParamsWarning:\n", - "\n", - "The `overwrite_build_params` parameter default will change from 'False' to 'True' in 1.8.0.\n", - "\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2024-03-24 17:14:22,792 [info] Started building image: .mlrun/func-hugging-face-trainer-avia-hugging-face-classifier-trainer:latest\n", - "\u001b[36mINFO\u001b[0m[0000] Retrieving image manifest mlrun/mlrun:1.6.1 \n", - "\u001b[36mINFO\u001b[0m[0000] Retrieving image mlrun/mlrun:1.6.1 from registry index.docker.io \n", - "\u001b[36mINFO\u001b[0m[0000] Built cross stage deps: map[] \n", - "\u001b[36mINFO\u001b[0m[0000] Retrieving image manifest mlrun/mlrun:1.6.1 \n", - "\u001b[36mINFO\u001b[0m[0000] Returning cached image manifest \n", - "\u001b[36mINFO\u001b[0m[0000] Executing 0 build triggers \n", - "\u001b[36mINFO\u001b[0m[0000] Building stage 'mlrun/mlrun:1.6.1' [idx: '0', base-idx: '-1'] \n", - "\u001b[36mINFO\u001b[0m[0000] Unpacking rootfs as cmd RUN echo 'Installing /empty/requirements.txt...'; cat /empty/requirements.txt requires it. \n", - "\u001b[36mINFO\u001b[0m[0047] RUN echo 'Installing /empty/requirements.txt...'; cat /empty/requirements.txt \n", - "\u001b[36mINFO\u001b[0m[0047] Initializing snapshotter ... \n", - "\u001b[36mINFO\u001b[0m[0047] Taking snapshot of full filesystem... \n", - "\u001b[36mINFO\u001b[0m[0074] Cmd: /bin/sh \n", - "\u001b[36mINFO\u001b[0m[0074] Args: [-c echo 'Installing /empty/requirements.txt...'; cat /empty/requirements.txt] \n", - "\u001b[36mINFO\u001b[0m[0074] Running: [/bin/sh -c echo 'Installing /empty/requirements.txt...'; cat /empty/requirements.txt] \n", - "Installing /empty/requirements.txt...\n", - "mlrun[complete]==1.6.1\n", - "onnx~=1.14.1\n", - "onnxruntime~=1.16.1\n", - "optimum~=1.6.4\n", - "transformers~=4.26.1\n", - "datasets~=2.10.1\n", - "scikit-learn~=1.0.2\n", - "\u001b[36mINFO\u001b[0m[0074] Taking snapshot of full filesystem... \n", - "\u001b[36mINFO\u001b[0m[0078] No files were changed, appending empty layer to config. No layer added to image. \n", - "\u001b[36mINFO\u001b[0m[0078] RUN python -m pip install -r /empty/requirements.txt \n", - "\u001b[36mINFO\u001b[0m[0078] Cmd: /bin/sh \n", - "\u001b[36mINFO\u001b[0m[0078] Args: [-c python -m pip install -r /empty/requirements.txt] \n", - "\u001b[36mINFO\u001b[0m[0078] Running: [/bin/sh -c python -m pip install -r /empty/requirements.txt] \n", - "Requirement already satisfied: mlrun[complete]==1.6.1 in /opt/conda/lib/python3.9/site-packages (from -r /empty/requirements.txt (line 1)) (1.6.1)\n", - "Collecting onnx~=1.14.1 (from -r /empty/requirements.txt (line 2))\n", - " Obtaining dependency information for onnx~=1.14.1 from https://files.pythonhosted.org/packages/ff/24/0e522fdcadf0e15fc304145a5b6e5d7246d7f2c507fd9bfe6e1fafb2aa95/onnx-1.14.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata\n", - " Downloading onnx-1.14.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (15 kB)\n", - "Collecting onnxruntime~=1.16.1 (from -r /empty/requirements.txt (line 3))\n", - " Obtaining dependency information for onnxruntime~=1.16.1 from https://files.pythonhosted.org/packages/de/ab/ed3ae0d649cee41e870f8b1653cf4a1c1fc321e0ded4e3e1a3d4a25c0131/onnxruntime-1.16.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata\n", - " Downloading onnxruntime-1.16.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.3 kB)\n", - "Collecting optimum~=1.6.4 (from -r /empty/requirements.txt (line 4))\n", - " Obtaining dependency information for optimum~=1.6.4 from https://files.pythonhosted.org/packages/31/72/a7e3b2c57d6368c5f4bb6fba54a85cbf07d25c385a2db3f1a638f3c0ddb2/optimum-1.6.4-py3-none-any.whl.metadata\n", - " Downloading optimum-1.6.4-py3-none-any.whl.metadata (17 kB)\n", - "Collecting transformers~=4.26.1 (from -r /empty/requirements.txt (line 5))\n", - " Obtaining dependency information for transformers~=4.26.1 from https://files.pythonhosted.org/packages/1e/e2/60c3f4691b16d126ee9cfe28f598b13c424b60350ab339aba81aef054b8f/transformers-4.26.1-py3-none-any.whl.metadata\n", - " Downloading transformers-4.26.1-py3-none-any.whl.metadata (100 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100.3/100.3 kB 6.2 MB/s eta 0:00:00\n", - "Collecting datasets~=2.10.1 (from -r /empty/requirements.txt (line 6))\n", - " Obtaining dependency information for datasets~=2.10.1 from https://files.pythonhosted.org/packages/fe/17/5825fdf034ff1a315becdbb9b6fe5a2bd9d8e724464535f18809593bf9c2/datasets-2.10.1-py3-none-any.whl.metadata\n", - " Downloading datasets-2.10.1-py3-none-any.whl.metadata (20 kB)\n", - "Collecting scikit-learn~=1.0.2 (from -r /empty/requirements.txt (line 7))\n", - " Obtaining dependency information for scikit-learn~=1.0.2 from https://files.pythonhosted.org/packages/57/aa/483fbe6b5314bce2d49801e6cec1f2139a9c220d0d51494788fff47233b3/scikit_learn-1.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata\n", - " Downloading scikit_learn-1.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (10 kB)\n", - "Requirement already satisfied: urllib3<1.27,>=1.26.9 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.26.18)\n", - "Requirement already satisfied: GitPython>=3.1.41,~=3.1 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (3.1.42)\n", - "Requirement already satisfied: aiohttp~=3.9 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (3.9.3)\n", - "Requirement already satisfied: aiohttp-retry~=2.8 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (2.8.3)\n", - "Requirement already satisfied: click~=8.1 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (8.1.7)\n", - "Requirement already satisfied: kfp~=1.8 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.8.22)\n", - "Requirement already satisfied: nest-asyncio~=1.0 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.6.0)\n", - "Requirement already satisfied: ipython~=8.10 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (8.18.1)\n", - "Requirement already satisfied: nuclio-jupyter~=0.9.15 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.9.16)\n", - "Requirement already satisfied: numpy<1.27.0,>=1.16.5 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.26.4)\n", - "Requirement already satisfied: pandas<2.2,>=1.2 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (2.1.4)\n", - "Requirement already satisfied: pyarrow<15,>=10.0 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (14.0.2)\n", - "Requirement already satisfied: pyyaml~=5.1 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (5.4.1)\n", - "Requirement already satisfied: requests~=2.31 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (2.31.0)\n", - "Requirement already satisfied: tabulate~=0.8.6 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.8.10)\n", - "Requirement already satisfied: v3io~=0.5.21 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.5.23)\n", - "Requirement already satisfied: pydantic>=1.10.8,~=1.10 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.10.14)\n", - "Requirement already satisfied: mergedeep~=1.3 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.3.4)\n", - "Requirement already satisfied: v3io-frames~=0.10.12 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.10.13)\n", - "Requirement already satisfied: semver~=3.0 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (3.0.2)\n", - "Requirement already satisfied: dependency-injector~=4.41 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (4.41.0)\n", - "Requirement already satisfied: fsspec==2023.9.2 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (2023.9.2)\n", - "Requirement already satisfied: v3iofs~=0.1.17 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.1.18)\n", - "Requirement already satisfied: storey~=1.6.18 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.6.18)\n", - "Requirement already satisfied: inflection~=0.5.0 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.5.1)\n", - "Requirement already satisfied: python-dotenv~=0.17.0 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.17.1)\n", - "Requirement already satisfied: setuptools~=68.2 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (68.2.2)\n", - "Requirement already satisfied: deprecated~=1.2 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.2.14)\n", - "Requirement already satisfied: jinja2>=3.1.3,~=3.1 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (3.1.3)\n", - "Requirement already satisfied: anyio~=3.7 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (3.7.1)\n", - "Requirement already satisfied: orjson~=3.9 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (3.9.15)\n", - "Requirement already satisfied: adlfs==2023.9.0 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (2023.9.0)\n", - "Requirement already satisfied: aiobotocore<2.8,>=2.5.0 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (2.5.4)\n", - "Requirement already satisfied: avro~=1.11 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.11.3)\n", - "Requirement already satisfied: azure-core~=1.24 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.30.0)\n", - "Requirement already satisfied: azure-identity~=1.5 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.15.0)\n", - "Requirement already satisfied: azure-keyvault-secrets~=4.2 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (4.8.0)\n", - "Requirement already satisfied: boto3<1.29.0,>=1.28.0 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.28.17)\n", - "Requirement already satisfied: dask~=2023.9.0 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (2023.9.3)\n", - "Requirement already satisfied: databricks-sdk~=0.13.0 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.13.0)\n", - "Requirement already satisfied: distributed~=2023.9.0 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (2023.9.3)\n", - "Requirement already satisfied: gcsfs==2023.9.2 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (2023.9.2)\n", - "Requirement already satisfied: google-cloud-bigquery[bqstorage,pandas]==3.14.1 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (3.14.1)\n", - "Requirement already satisfied: graphviz~=0.20.0 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.20.1)\n", - "Requirement already satisfied: kafka-python~=2.0 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (2.0.2)\n", - "Requirement already satisfied: mlflow~=2.8 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (2.10.2)\n", - "Requirement already satisfied: msrest~=0.6.21 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.6.21)\n", - "Requirement already satisfied: plotly<5.12.0,~=5.4 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (5.11.0)\n", - "Requirement already satisfied: pyopenssl>=23 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (24.0.0)\n", - "Requirement already satisfied: redis~=4.3 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (4.6.0)\n", - "Requirement already satisfied: s3fs==2023.9.2 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (2023.9.2)\n", - "Requirement already satisfied: sqlalchemy~=1.4 in /opt/conda/lib/python3.9/site-packages (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.4.51)\n", - "Requirement already satisfied: azure-datalake-store<0.1,>=0.0.46 in /opt/conda/lib/python3.9/site-packages (from adlfs==2023.9.0->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.0.53)\n", - "Requirement already satisfied: azure-storage-blob>=12.12.0 in /opt/conda/lib/python3.9/site-packages (from adlfs==2023.9.0->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (12.19.0)\n", - "Requirement already satisfied: decorator>4.1.2 in /opt/conda/lib/python3.9/site-packages (from gcsfs==2023.9.2->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (5.1.1)\n", - "Requirement already satisfied: google-auth>=1.2 in /opt/conda/lib/python3.9/site-packages (from gcsfs==2023.9.2->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (2.28.1)\n", - "Requirement already satisfied: google-auth-oauthlib in /opt/conda/lib/python3.9/site-packages (from gcsfs==2023.9.2->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.2.0)\n", - "Requirement already satisfied: google-cloud-storage in /opt/conda/lib/python3.9/site-packages (from gcsfs==2023.9.2->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (2.14.0)\n", - "Requirement already satisfied: google-api-core!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.0,<3.0.0dev,>=1.31.5 in /opt/conda/lib/python3.9/site-packages (from google-cloud-bigquery[bqstorage,pandas]==3.14.1->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (2.17.1)\n", - "Requirement already satisfied: google-cloud-core<3.0.0dev,>=1.6.0 in /opt/conda/lib/python3.9/site-packages (from google-cloud-bigquery[bqstorage,pandas]==3.14.1->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (2.4.1)\n", - "Requirement already satisfied: google-resumable-media<3.0dev,>=0.6.0 in /opt/conda/lib/python3.9/site-packages (from google-cloud-bigquery[bqstorage,pandas]==3.14.1->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (2.7.0)\n", - "Requirement already satisfied: packaging>=20.0.0 in /opt/conda/lib/python3.9/site-packages (from google-cloud-bigquery[bqstorage,pandas]==3.14.1->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (23.1)\n", - "Requirement already satisfied: python-dateutil<3.0dev,>=2.7.2 in /opt/conda/lib/python3.9/site-packages (from google-cloud-bigquery[bqstorage,pandas]==3.14.1->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (2.8.2)\n", - "Requirement already satisfied: db-dtypes<2.0.0dev,>=0.3.0 in /opt/conda/lib/python3.9/site-packages (from google-cloud-bigquery[bqstorage,pandas]==3.14.1->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.2.0)\n", - "Requirement already satisfied: google-cloud-bigquery-storage<3.0.0dev,>=2.6.0 in /opt/conda/lib/python3.9/site-packages (from google-cloud-bigquery[bqstorage,pandas]==3.14.1->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (2.24.0)\n", - "Requirement already satisfied: grpcio<2.0dev,>=1.47.0 in /opt/conda/lib/python3.9/site-packages (from google-cloud-bigquery[bqstorage,pandas]==3.14.1->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.62.0)\n", - "Requirement already satisfied: protobuf>=3.20.2 in /opt/conda/lib/python3.9/site-packages (from onnx~=1.14.1->-r /empty/requirements.txt (line 2)) (3.20.3)\n", - "Requirement already satisfied: typing-extensions>=3.6.2.1 in /opt/conda/lib/python3.9/site-packages (from onnx~=1.14.1->-r /empty/requirements.txt (line 2)) (4.10.0)\n", - "Collecting coloredlogs (from onnxruntime~=1.16.1->-r /empty/requirements.txt (line 3))\n", - " Obtaining dependency information for coloredlogs from https://files.pythonhosted.org/packages/a7/06/3d6badcf13db419e25b07041d9c7b4a2c331d3f4e7134445ec5df57714cd/coloredlogs-15.0.1-py2.py3-none-any.whl.metadata\n", - " Downloading coloredlogs-15.0.1-py2.py3-none-any.whl.metadata (12 kB)\n", - "Collecting flatbuffers (from onnxruntime~=1.16.1->-r /empty/requirements.txt (line 3))\n", - " Obtaining dependency information for flatbuffers from https://files.pythonhosted.org/packages/bf/45/c961e3cb6ddad76b325c163d730562bb6deb1ace5acbed0306f5fbefb90e/flatbuffers-24.3.7-py2.py3-none-any.whl.metadata\n", - " Downloading flatbuffers-24.3.7-py2.py3-none-any.whl.metadata (849 bytes)\n", - "Collecting sympy (from onnxruntime~=1.16.1->-r /empty/requirements.txt (line 3))\n", - " Obtaining dependency information for sympy from https://files.pythonhosted.org/packages/d2/05/e6600db80270777c4a64238a98d442f0fd07cc8915be2a1c16da7f2b9e74/sympy-1.12-py3-none-any.whl.metadata\n", - " Downloading sympy-1.12-py3-none-any.whl.metadata (12 kB)\n", - "Collecting transformers[sentencepiece]>=4.26.0 (from optimum~=1.6.4->-r /empty/requirements.txt (line 4))\n", - " Obtaining dependency information for transformers[sentencepiece]>=4.26.0 from https://files.pythonhosted.org/packages/0a/fd/280f4385e76f3c1890efc15fa93f7206134fefad6351397e1bfab6d0d0de/transformers-4.39.1-py3-none-any.whl.metadata\n", - " Downloading transformers-4.39.1-py3-none-any.whl.metadata (134 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 134.8/134.8 kB 40.1 MB/s eta 0:00:00\n", - "Collecting torch>=1.9 (from optimum~=1.6.4->-r /empty/requirements.txt (line 4))\n", - " Obtaining dependency information for torch>=1.9 from https://files.pythonhosted.org/packages/98/04/95a12556d068786d6505c609daf2805bed91c9210c5185499a7c121eba47/torch-2.2.1-cp39-cp39-manylinux1_x86_64.whl.metadata\n", - " Downloading torch-2.2.1-cp39-cp39-manylinux1_x86_64.whl.metadata (25 kB)\n", - "Collecting numpy<1.27.0,>=1.16.5 (from mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1))\n", - " Obtaining dependency information for numpy<1.27.0,>=1.16.5 from https://files.pythonhosted.org/packages/4c/b9/038abd6fbd67b05b03cb1af590cfc02b7f1e5a37af7ac6a868f5093c29f5/numpy-1.23.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata\n", - " Downloading numpy-1.23.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (2.3 kB)\n", - "Collecting huggingface-hub>=0.8.0 (from optimum~=1.6.4->-r /empty/requirements.txt (line 4))\n", - " Obtaining dependency information for huggingface-hub>=0.8.0 from https://files.pythonhosted.org/packages/ab/28/d4b691840d73126d4c9845f8a22dad033ac872509b6d3a0d93b456eef424/huggingface_hub-0.21.4-py3-none-any.whl.metadata\n", - " Downloading huggingface_hub-0.21.4-py3-none-any.whl.metadata (13 kB)\n", - "Collecting filelock (from transformers~=4.26.1->-r /empty/requirements.txt (line 5))\n", - " Obtaining dependency information for filelock from https://files.pythonhosted.org/packages/81/54/84d42a0bee35edba99dee7b59a8d4970eccdd44b99fe728ed912106fc781/filelock-3.13.1-py3-none-any.whl.metadata\n", - " Downloading filelock-3.13.1-py3-none-any.whl.metadata (2.8 kB)\n", - "Collecting regex!=2019.12.17 (from transformers~=4.26.1->-r /empty/requirements.txt (line 5))\n", - " Obtaining dependency information for regex!=2019.12.17 from https://files.pythonhosted.org/packages/05/9e/80c20f1151432a6025690c9c2037053039b028a7b236fa81d7e7ac9dec60/regex-2023.12.25-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata\n", - " Downloading regex-2023.12.25-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (40 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 40.9/40.9 kB 217.5 MB/s eta 0:00:00\n", - "Collecting tokenizers!=0.11.3,<0.14,>=0.11.1 (from transformers~=4.26.1->-r /empty/requirements.txt (line 5))\n", - " Obtaining dependency information for tokenizers!=0.11.3,<0.14,>=0.11.1 from https://files.pythonhosted.org/packages/d6/27/07a337087dd507170a1b20fed3bbf8da81401185a7130a6e74e440c52040/tokenizers-0.13.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata\n", - " Downloading tokenizers-0.13.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (6.7 kB)\n", - "Requirement already satisfied: tqdm>=4.27 in /opt/conda/lib/python3.9/site-packages (from transformers~=4.26.1->-r /empty/requirements.txt (line 5)) (4.65.0)\n", - "Collecting dill<0.3.7,>=0.3.0 (from datasets~=2.10.1->-r /empty/requirements.txt (line 6))\n", - " Obtaining dependency information for dill<0.3.7,>=0.3.0 from https://files.pythonhosted.org/packages/be/e3/a84bf2e561beed15813080d693b4b27573262433fced9c1d1fea59e60553/dill-0.3.6-py3-none-any.whl.metadata\n", - " Downloading dill-0.3.6-py3-none-any.whl.metadata (9.8 kB)\n", - "Requirement already satisfied: xxhash in /opt/conda/lib/python3.9/site-packages (from datasets~=2.10.1->-r /empty/requirements.txt (line 6)) (3.4.1)\n", - "Collecting multiprocess (from datasets~=2.10.1->-r /empty/requirements.txt (line 6))\n", - " Obtaining dependency information for multiprocess from https://files.pythonhosted.org/packages/da/d9/f7f9379981e39b8c2511c9e0326d212accacb82f12fbfdc1aa2ce2a7b2b6/multiprocess-0.70.16-py39-none-any.whl.metadata\n", - " Downloading multiprocess-0.70.16-py39-none-any.whl.metadata (7.2 kB)\n", - "Collecting responses<0.19 (from datasets~=2.10.1->-r /empty/requirements.txt (line 6))\n", - " Obtaining dependency information for responses<0.19 from https://files.pythonhosted.org/packages/79/f3/2b3a6dc5986303b3dd1bbbcf482022acb2583c428cd23f0b6d37b1a1a519/responses-0.18.0-py3-none-any.whl.metadata\n", - " Downloading responses-0.18.0-py3-none-any.whl.metadata (29 kB)\n", - "Requirement already satisfied: scipy>=1.1.0 in /opt/conda/lib/python3.9/site-packages (from scikit-learn~=1.0.2->-r /empty/requirements.txt (line 7)) (1.12.0)\n", - "Requirement already satisfied: joblib>=0.11 in /opt/conda/lib/python3.9/site-packages (from scikit-learn~=1.0.2->-r /empty/requirements.txt (line 7)) (1.3.2)\n", - "Requirement already satisfied: threadpoolctl>=2.0.0 in /opt/conda/lib/python3.9/site-packages (from scikit-learn~=1.0.2->-r /empty/requirements.txt (line 7)) (3.3.0)\n", - "Requirement already satisfied: botocore<1.31.18,>=1.31.17 in /opt/conda/lib/python3.9/site-packages (from aiobotocore<2.8,>=2.5.0->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.31.17)\n", - "Requirement already satisfied: wrapt<2.0.0,>=1.10.10 in /opt/conda/lib/python3.9/site-packages (from aiobotocore<2.8,>=2.5.0->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.16.0)\n", - "Requirement already satisfied: aioitertools<1.0.0,>=0.5.1 in /opt/conda/lib/python3.9/site-packages (from aiobotocore<2.8,>=2.5.0->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.11.0)\n", - "Requirement already satisfied: aiosignal>=1.1.2 in /opt/conda/lib/python3.9/site-packages (from aiohttp~=3.9->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.3.1)\n", - "Requirement already satisfied: attrs>=17.3.0 in /opt/conda/lib/python3.9/site-packages (from aiohttp~=3.9->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (23.2.0)\n", - "Requirement already satisfied: frozenlist>=1.1.1 in /opt/conda/lib/python3.9/site-packages (from aiohttp~=3.9->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.4.1)\n", - "Requirement already satisfied: multidict<7.0,>=4.5 in /opt/conda/lib/python3.9/site-packages (from aiohttp~=3.9->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (6.0.5)\n", - "Requirement already satisfied: yarl<2.0,>=1.0 in /opt/conda/lib/python3.9/site-packages (from aiohttp~=3.9->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.9.4)\n", - "Requirement already satisfied: async-timeout<5.0,>=4.0 in /opt/conda/lib/python3.9/site-packages (from aiohttp~=3.9->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (4.0.3)\n", - "Requirement already satisfied: idna>=2.8 in /opt/conda/lib/python3.9/site-packages (from anyio~=3.7->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (3.4)\n", - "Requirement already satisfied: sniffio>=1.1 in /opt/conda/lib/python3.9/site-packages (from anyio~=3.7->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.3.1)\n", - "Requirement already satisfied: exceptiongroup in /opt/conda/lib/python3.9/site-packages (from anyio~=3.7->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.2.0)\n", - "Requirement already satisfied: six>=1.11.0 in /opt/conda/lib/python3.9/site-packages (from azure-core~=1.24->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.16.0)\n", - "Requirement already satisfied: cryptography>=2.5 in /opt/conda/lib/python3.9/site-packages (from azure-identity~=1.5->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (42.0.2)\n", - "Requirement already satisfied: msal<2.0.0,>=1.24.0 in /opt/conda/lib/python3.9/site-packages (from azure-identity~=1.5->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.27.0)\n", - "Requirement already satisfied: msal-extensions<2.0.0,>=0.3.0 in /opt/conda/lib/python3.9/site-packages (from azure-identity~=1.5->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.1.0)\n", - "Requirement already satisfied: isodate>=0.6.1 in /opt/conda/lib/python3.9/site-packages (from azure-keyvault-secrets~=4.2->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.6.1)\n", - "Requirement already satisfied: jmespath<2.0.0,>=0.7.1 in /opt/conda/lib/python3.9/site-packages (from boto3<1.29.0,>=1.28.0->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.0.1)\n", - "Requirement already satisfied: s3transfer<0.7.0,>=0.6.0 in /opt/conda/lib/python3.9/site-packages (from boto3<1.29.0,>=1.28.0->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.6.2)\n", - "Requirement already satisfied: cloudpickle>=1.5.0 in /opt/conda/lib/python3.9/site-packages (from dask~=2023.9.0->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (2.2.1)\n", - "Requirement already satisfied: partd>=1.2.0 in /opt/conda/lib/python3.9/site-packages (from dask~=2023.9.0->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.4.1)\n", - "Requirement already satisfied: toolz>=0.10.0 in /opt/conda/lib/python3.9/site-packages (from dask~=2023.9.0->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.12.0)\n", - "Requirement already satisfied: importlib-metadata>=4.13.0 in /opt/conda/lib/python3.9/site-packages (from dask~=2023.9.0->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (7.0.1)\n", - "Requirement already satisfied: locket>=1.0.0 in /opt/conda/lib/python3.9/site-packages (from distributed~=2023.9.0->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.0.0)\n", - "Requirement already satisfied: msgpack>=1.0.0 in /opt/conda/lib/python3.9/site-packages (from distributed~=2023.9.0->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.0.7)\n", - "Requirement already satisfied: psutil>=5.7.2 in /opt/conda/lib/python3.9/site-packages (from distributed~=2023.9.0->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (5.9.8)\n", - "Requirement already satisfied: sortedcontainers>=2.0.5 in /opt/conda/lib/python3.9/site-packages (from distributed~=2023.9.0->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (2.4.0)\n", - "Requirement already satisfied: tblib>=1.6.0 in /opt/conda/lib/python3.9/site-packages (from distributed~=2023.9.0->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (3.0.0)\n", - "Requirement already satisfied: tornado>=6.0.4 in /opt/conda/lib/python3.9/site-packages (from distributed~=2023.9.0->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (6.4)\n", - "Requirement already satisfied: zict>=3.0.0 in /opt/conda/lib/python3.9/site-packages (from distributed~=2023.9.0->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (3.0.0)\n", - "Requirement already satisfied: gitdb<5,>=4.0.1 in /opt/conda/lib/python3.9/site-packages (from GitPython>=3.1.41,~=3.1->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (4.0.11)\n", - "Requirement already satisfied: jedi>=0.16 in /opt/conda/lib/python3.9/site-packages (from ipython~=8.10->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.19.1)\n", - "Requirement already satisfied: matplotlib-inline in /opt/conda/lib/python3.9/site-packages (from ipython~=8.10->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.1.6)\n", - "Requirement already satisfied: prompt-toolkit<3.1.0,>=3.0.41 in /opt/conda/lib/python3.9/site-packages (from ipython~=8.10->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (3.0.43)\n", - "Requirement already satisfied: pygments>=2.4.0 in /opt/conda/lib/python3.9/site-packages (from ipython~=8.10->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (2.17.2)\n", - "Requirement already satisfied: stack-data in /opt/conda/lib/python3.9/site-packages (from ipython~=8.10->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.6.3)\n", - "Requirement already satisfied: traitlets>=5 in /opt/conda/lib/python3.9/site-packages (from ipython~=8.10->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (5.14.1)\n", - "Requirement already satisfied: pexpect>4.3 in /opt/conda/lib/python3.9/site-packages (from ipython~=8.10->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (4.9.0)\n", - "Requirement already satisfied: MarkupSafe>=2.0 in /opt/conda/lib/python3.9/site-packages (from jinja2>=3.1.3,~=3.1->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (2.1.5)\n", - "Requirement already satisfied: absl-py<2,>=0.9 in /opt/conda/lib/python3.9/site-packages (from kfp~=1.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.4.0)\n", - "Requirement already satisfied: kubernetes<26,>=8.0.0 in /opt/conda/lib/python3.9/site-packages (from kfp~=1.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (25.3.0)\n", - "Requirement already satisfied: google-api-python-client<2,>=1.7.8 in /opt/conda/lib/python3.9/site-packages (from kfp~=1.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.12.11)\n", - "Requirement already satisfied: requests-toolbelt<1,>=0.8.0 in /opt/conda/lib/python3.9/site-packages (from kfp~=1.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.10.1)\n", - "Requirement already satisfied: kfp-server-api<2.0.0,>=1.1.2 in /opt/conda/lib/python3.9/site-packages (from kfp~=1.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.8.5)\n", - "Requirement already satisfied: jsonschema<5,>=3.0.1 in /opt/conda/lib/python3.9/site-packages (from kfp~=1.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (4.21.1)\n", - "Requirement already satisfied: strip-hints<1,>=0.1.8 in /opt/conda/lib/python3.9/site-packages (from kfp~=1.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.1.10)\n", - "Requirement already satisfied: docstring-parser<1,>=0.7.3 in /opt/conda/lib/python3.9/site-packages (from kfp~=1.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.15)\n", - "Requirement already satisfied: kfp-pipeline-spec<0.2.0,>=0.1.16 in /opt/conda/lib/python3.9/site-packages (from kfp~=1.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.1.16)\n", - "Requirement already satisfied: fire<1,>=0.3.1 in /opt/conda/lib/python3.9/site-packages (from kfp~=1.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.5.0)\n", - "Requirement already satisfied: uritemplate<4,>=3.0.1 in /opt/conda/lib/python3.9/site-packages (from kfp~=1.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (3.0.1)\n", - "Requirement already satisfied: typer<1.0,>=0.3.2 in /opt/conda/lib/python3.9/site-packages (from kfp~=1.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.9.0)\n", - "Requirement already satisfied: entrypoints<1 in /opt/conda/lib/python3.9/site-packages (from mlflow~=2.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.4)\n", - "Requirement already satisfied: pytz<2024 in /opt/conda/lib/python3.9/site-packages (from mlflow~=2.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (2023.4)\n", - "Requirement already satisfied: sqlparse<1,>=0.4.0 in /opt/conda/lib/python3.9/site-packages (from mlflow~=2.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.4.4)\n", - "Requirement already satisfied: alembic!=1.10.0,<2 in /opt/conda/lib/python3.9/site-packages (from mlflow~=2.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.13.1)\n", - "Requirement already satisfied: docker<8,>=4.0.0 in /opt/conda/lib/python3.9/site-packages (from mlflow~=2.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (7.0.0)\n", - "Requirement already satisfied: Flask<4 in /opt/conda/lib/python3.9/site-packages (from mlflow~=2.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (3.0.2)\n", - "Requirement already satisfied: querystring-parser<2 in /opt/conda/lib/python3.9/site-packages (from mlflow~=2.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.2.4)\n", - "Requirement already satisfied: markdown<4,>=3.3 in /opt/conda/lib/python3.9/site-packages (from mlflow~=2.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (3.5.2)\n", - "Requirement already satisfied: matplotlib<4 in /opt/conda/lib/python3.9/site-packages (from mlflow~=2.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (3.8.3)\n", - "Requirement already satisfied: gunicorn<22 in /opt/conda/lib/python3.9/site-packages (from mlflow~=2.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (21.2.0)\n", - "Requirement already satisfied: requests-oauthlib>=0.5.0 in /opt/conda/lib/python3.9/site-packages (from msrest~=0.6.21->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.3.1)\n", - "Requirement already satisfied: certifi>=2017.4.17 in /opt/conda/lib/python3.9/site-packages (from msrest~=0.6.21->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (2024.2.2)\n", - "Requirement already satisfied: nbconvert>=6.4.5 in /opt/conda/lib/python3.9/site-packages (from nuclio-jupyter~=0.9.15->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (7.16.1)\n", - "Requirement already satisfied: notebook<7.0.0,>=6.4 in /opt/conda/lib/python3.9/site-packages (from nuclio-jupyter~=0.9.15->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (6.5.6)\n", - "Requirement already satisfied: tzdata>=2022.1 in /opt/conda/lib/python3.9/site-packages (from pandas<2.2,>=1.2->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (2024.1)\n", - "Requirement already satisfied: tenacity>=6.2.0 in /opt/conda/lib/python3.9/site-packages (from plotly<5.12.0,~=5.4->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (8.2.3)\n", - "Requirement already satisfied: charset-normalizer<4,>=2 in /opt/conda/lib/python3.9/site-packages (from requests~=2.31->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (2.0.4)\n", - "Requirement already satisfied: greenlet!=0.4.17 in /opt/conda/lib/python3.9/site-packages (from sqlalchemy~=1.4->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (3.0.3)\n", - "Requirement already satisfied: nuclio-sdk>=0.5.3 in /opt/conda/lib/python3.9/site-packages (from storey~=1.6.18->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.5.9)\n", - "Collecting networkx (from torch>=1.9->optimum~=1.6.4->-r /empty/requirements.txt (line 4))\n", - " Obtaining dependency information for networkx from https://files.pythonhosted.org/packages/d5/f0/8fbc882ca80cf077f1b246c0e3c3465f7f415439bdea6b899f6b19f61f70/networkx-3.2.1-py3-none-any.whl.metadata\n", - " Downloading networkx-3.2.1-py3-none-any.whl.metadata (5.2 kB)\n", - "Collecting nvidia-cuda-nvrtc-cu12==12.1.105 (from torch>=1.9->optimum~=1.6.4->-r /empty/requirements.txt (line 4))\n", - " Obtaining dependency information for nvidia-cuda-nvrtc-cu12==12.1.105 from https://files.pythonhosted.org/packages/b6/9f/c64c03f49d6fbc56196664d05dba14e3a561038a81a638eeb47f4d4cfd48/nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-manylinux1_x86_64.whl.metadata\n", - " Downloading nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-manylinux1_x86_64.whl.metadata (1.5 kB)\n", - "Collecting nvidia-cuda-runtime-cu12==12.1.105 (from torch>=1.9->optimum~=1.6.4->-r /empty/requirements.txt (line 4))\n", - " Obtaining dependency information for nvidia-cuda-runtime-cu12==12.1.105 from https://files.pythonhosted.org/packages/eb/d5/c68b1d2cdfcc59e72e8a5949a37ddb22ae6cade80cd4a57a84d4c8b55472/nvidia_cuda_runtime_cu12-12.1.105-py3-none-manylinux1_x86_64.whl.metadata\n", - " Downloading nvidia_cuda_runtime_cu12-12.1.105-py3-none-manylinux1_x86_64.whl.metadata (1.5 kB)\n", - "Collecting nvidia-cuda-cupti-cu12==12.1.105 (from torch>=1.9->optimum~=1.6.4->-r /empty/requirements.txt (line 4))\n", - " Obtaining dependency information for nvidia-cuda-cupti-cu12==12.1.105 from https://files.pythonhosted.org/packages/7e/00/6b218edd739ecfc60524e585ba8e6b00554dd908de2c9c66c1af3e44e18d/nvidia_cuda_cupti_cu12-12.1.105-py3-none-manylinux1_x86_64.whl.metadata\n", - " Downloading nvidia_cuda_cupti_cu12-12.1.105-py3-none-manylinux1_x86_64.whl.metadata (1.6 kB)\n", - "Collecting nvidia-cudnn-cu12==8.9.2.26 (from torch>=1.9->optimum~=1.6.4->-r /empty/requirements.txt (line 4))\n", - " Obtaining dependency information for nvidia-cudnn-cu12==8.9.2.26 from https://files.pythonhosted.org/packages/ff/74/a2e2be7fb83aaedec84f391f082cf765dfb635e7caa9b49065f73e4835d8/nvidia_cudnn_cu12-8.9.2.26-py3-none-manylinux1_x86_64.whl.metadata\n", - " Downloading nvidia_cudnn_cu12-8.9.2.26-py3-none-manylinux1_x86_64.whl.metadata (1.6 kB)\n", - "Collecting nvidia-cublas-cu12==12.1.3.1 (from torch>=1.9->optimum~=1.6.4->-r /empty/requirements.txt (line 4))\n", - " Obtaining dependency information for nvidia-cublas-cu12==12.1.3.1 from https://files.pythonhosted.org/packages/37/6d/121efd7382d5b0284239f4ab1fc1590d86d34ed4a4a2fdb13b30ca8e5740/nvidia_cublas_cu12-12.1.3.1-py3-none-manylinux1_x86_64.whl.metadata\n", - " Downloading nvidia_cublas_cu12-12.1.3.1-py3-none-manylinux1_x86_64.whl.metadata (1.5 kB)\n", - "Collecting nvidia-cufft-cu12==11.0.2.54 (from torch>=1.9->optimum~=1.6.4->-r /empty/requirements.txt (line 4))\n", - " Obtaining dependency information for nvidia-cufft-cu12==11.0.2.54 from https://files.pythonhosted.org/packages/86/94/eb540db023ce1d162e7bea9f8f5aa781d57c65aed513c33ee9a5123ead4d/nvidia_cufft_cu12-11.0.2.54-py3-none-manylinux1_x86_64.whl.metadata\n", - " Downloading nvidia_cufft_cu12-11.0.2.54-py3-none-manylinux1_x86_64.whl.metadata (1.5 kB)\n", - "Collecting nvidia-curand-cu12==10.3.2.106 (from torch>=1.9->optimum~=1.6.4->-r /empty/requirements.txt (line 4))\n", - " Obtaining dependency information for nvidia-curand-cu12==10.3.2.106 from https://files.pythonhosted.org/packages/44/31/4890b1c9abc496303412947fc7dcea3d14861720642b49e8ceed89636705/nvidia_curand_cu12-10.3.2.106-py3-none-manylinux1_x86_64.whl.metadata\n", - " Downloading nvidia_curand_cu12-10.3.2.106-py3-none-manylinux1_x86_64.whl.metadata (1.5 kB)\n", - "Collecting nvidia-cusolver-cu12==11.4.5.107 (from torch>=1.9->optimum~=1.6.4->-r /empty/requirements.txt (line 4))\n", - " Obtaining dependency information for nvidia-cusolver-cu12==11.4.5.107 from https://files.pythonhosted.org/packages/bc/1d/8de1e5c67099015c834315e333911273a8c6aaba78923dd1d1e25fc5f217/nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl.metadata\n", - " Downloading nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl.metadata (1.6 kB)\n", - "Collecting nvidia-cusparse-cu12==12.1.0.106 (from torch>=1.9->optimum~=1.6.4->-r /empty/requirements.txt (line 4))\n", - " Obtaining dependency information for nvidia-cusparse-cu12==12.1.0.106 from https://files.pythonhosted.org/packages/65/5b/cfaeebf25cd9fdec14338ccb16f6b2c4c7fa9163aefcf057d86b9cc248bb/nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl.metadata\n", - " Downloading nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl.metadata (1.6 kB)\n", - "Collecting nvidia-nccl-cu12==2.19.3 (from torch>=1.9->optimum~=1.6.4->-r /empty/requirements.txt (line 4))\n", - " Obtaining dependency information for nvidia-nccl-cu12==2.19.3 from https://files.pythonhosted.org/packages/38/00/d0d4e48aef772ad5aebcf70b73028f88db6e5640b36c38e90445b7a57c45/nvidia_nccl_cu12-2.19.3-py3-none-manylinux1_x86_64.whl.metadata\n", - " Downloading nvidia_nccl_cu12-2.19.3-py3-none-manylinux1_x86_64.whl.metadata (1.8 kB)\n", - "Collecting nvidia-nvtx-cu12==12.1.105 (from torch>=1.9->optimum~=1.6.4->-r /empty/requirements.txt (line 4))\n", - " Obtaining dependency information for nvidia-nvtx-cu12==12.1.105 from https://files.pythonhosted.org/packages/da/d3/8057f0587683ed2fcd4dbfbdfdfa807b9160b809976099d36b8f60d08f03/nvidia_nvtx_cu12-12.1.105-py3-none-manylinux1_x86_64.whl.metadata\n", - " Downloading nvidia_nvtx_cu12-12.1.105-py3-none-manylinux1_x86_64.whl.metadata (1.7 kB)\n", - "Collecting triton==2.2.0 (from torch>=1.9->optimum~=1.6.4->-r /empty/requirements.txt (line 4))\n", - " Obtaining dependency information for triton==2.2.0 from https://files.pythonhosted.org/packages/6a/5c/01d9f062f719581cf6e60053e1a005d666ec67dcb59630fffaa3a3e5c9d8/triton-2.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata\n", - " Downloading triton-2.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (1.4 kB)\n", - "Collecting nvidia-nvjitlink-cu12 (from nvidia-cusolver-cu12==11.4.5.107->torch>=1.9->optimum~=1.6.4->-r /empty/requirements.txt (line 4))\n", - " Obtaining dependency information for nvidia-nvjitlink-cu12 from https://files.pythonhosted.org/packages/58/d1/d1c80553f9d5d07b6072bc132607d75a0ef3600e28e1890e11c0f55d7346/nvidia_nvjitlink_cu12-12.4.99-py3-none-manylinux2014_x86_64.whl.metadata\n", - " Downloading nvidia_nvjitlink_cu12-12.4.99-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\n", - "INFO: pip is looking at multiple versions of transformers[sentencepiece] to determine which version is compatible with other requirements. This could take a while.\n", - "Collecting transformers[sentencepiece]>=4.26.0 (from optimum~=1.6.4->-r /empty/requirements.txt (line 4))\n", - " Obtaining dependency information for transformers[sentencepiece]>=4.26.0 from https://files.pythonhosted.org/packages/a4/73/f620d76193954e16db3d5c53a07d956d7b9c800e570758d3bff91906d4a4/transformers-4.39.0-py3-none-any.whl.metadata\n", - " Downloading transformers-4.39.0-py3-none-any.whl.metadata (134 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 134.8/134.8 kB 115.9 MB/s eta 0:00:00\n", - " Obtaining dependency information for transformers[sentencepiece]>=4.26.0 from https://files.pythonhosted.org/packages/b6/4d/fbe6d89fde59d8107f0a02816c4ac4542a8f9a85559fdf33c68282affcc1/transformers-4.38.2-py3-none-any.whl.metadata\n", - " Downloading transformers-4.38.2-py3-none-any.whl.metadata (130 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 130.7/130.7 kB 126.3 MB/s eta 0:00:00\n", - " Obtaining dependency information for transformers[sentencepiece]>=4.26.0 from https://files.pythonhosted.org/packages/3e/6b/1b589f7b69aaea8193cf5bc91cf97410284aecd97b6312cdb08baedbdffe/transformers-4.38.1-py3-none-any.whl.metadata\n", - " Downloading transformers-4.38.1-py3-none-any.whl.metadata (131 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 131.1/131.1 kB 138.2 MB/s eta 0:00:00\n", - " Obtaining dependency information for transformers[sentencepiece]>=4.26.0 from https://files.pythonhosted.org/packages/91/89/5416dc364c7ef0711c564fd61a69b03d1e40eeb5c506c38e53ba8a969e79/transformers-4.38.0-py3-none-any.whl.metadata\n", - " Downloading transformers-4.38.0-py3-none-any.whl.metadata (131 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 131.1/131.1 kB 186.3 MB/s eta 0:00:00\n", - " Obtaining dependency information for transformers[sentencepiece]>=4.26.0 from https://files.pythonhosted.org/packages/85/f6/c5065913119c41ecad148c34e3a861f719e16b89a522287213698da911fc/transformers-4.37.2-py3-none-any.whl.metadata\n", - " Downloading transformers-4.37.2-py3-none-any.whl.metadata (129 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 129.4/129.4 kB 236.8 MB/s eta 0:00:00\n", - " Obtaining dependency information for transformers[sentencepiece]>=4.26.0 from https://files.pythonhosted.org/packages/ad/67/b4d6a51dcaf988cb45b31e26c6e33fb169fe34ba5fb168b086309bd7c028/transformers-4.37.1-py3-none-any.whl.metadata\n", - " Downloading transformers-4.37.1-py3-none-any.whl.metadata (129 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 129.4/129.4 kB 156.4 MB/s eta 0:00:00\n", - " Obtaining dependency information for transformers[sentencepiece]>=4.26.0 from https://files.pythonhosted.org/packages/3c/45/52133ce6bce49a099cc865599803bf1fad93de887276f728e56848d77a70/transformers-4.37.0-py3-none-any.whl.metadata\n", - " Downloading transformers-4.37.0-py3-none-any.whl.metadata (129 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 129.4/129.4 kB 102.0 MB/s eta 0:00:00\n", - "INFO: pip is still looking at multiple versions of transformers[sentencepiece] to determine which version is compatible with other requirements. This could take a while.\n", - " Obtaining dependency information for transformers[sentencepiece]>=4.26.0 from https://files.pythonhosted.org/packages/20/0a/739426a81f7635b422fbe6cb8d1d99d1235579a6ac8024c13d743efa6847/transformers-4.36.2-py3-none-any.whl.metadata\n", - " Downloading transformers-4.36.2-py3-none-any.whl.metadata (126 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 126.8/126.8 kB 108.8 MB/s eta 0:00:00\n", - " Obtaining dependency information for transformers[sentencepiece]>=4.26.0 from https://files.pythonhosted.org/packages/fc/04/0aad491cd98b09236c54ab849863ee85421eeda5138bbf9d33ecc594652b/transformers-4.36.1-py3-none-any.whl.metadata\n", - " Downloading transformers-4.36.1-py3-none-any.whl.metadata (126 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 126.8/126.8 kB 140.6 MB/s eta 0:00:00\n", - " Obtaining dependency information for transformers[sentencepiece]>=4.26.0 from https://files.pythonhosted.org/packages/0f/12/d8e27a190ca67811f81deea3183b528d9169f10b74d827e0b9211520ecfa/transformers-4.36.0-py3-none-any.whl.metadata\n", - " Downloading transformers-4.36.0-py3-none-any.whl.metadata (126 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 126.8/126.8 kB 267.8 MB/s eta 0:00:00\n", - " Obtaining dependency information for transformers[sentencepiece]>=4.26.0 from https://files.pythonhosted.org/packages/12/dd/f17b11a93a9ca27728e12512d167eb1281c151c4c6881d3ab59eb58f4127/transformers-4.35.2-py3-none-any.whl.metadata\n", - " Downloading transformers-4.35.2-py3-none-any.whl.metadata (123 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 123.5/123.5 kB 130.2 MB/s eta 0:00:00\n", - " Obtaining dependency information for transformers[sentencepiece]>=4.26.0 from https://files.pythonhosted.org/packages/92/ba/cfff7e01f7070d9fca3964bf42b2257b86964c3e6763b8d5435436cc1d77/transformers-4.35.1-py3-none-any.whl.metadata\n", - " Downloading transformers-4.35.1-py3-none-any.whl.metadata (123 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 123.1/123.1 kB 183.6 MB/s eta 0:00:00\n", - "INFO: This is taking longer than usual. You might need to provide the dependency resolver with stricter constraints to reduce runtime. See https://pip.pypa.io/warnings/backtracking for guidance. If you want to abort this run, press Ctrl + C.\n", - " Obtaining dependency information for transformers[sentencepiece]>=4.26.0 from https://files.pythonhosted.org/packages/9a/06/e4ec2a321e57c03b7e9345d709d554a52c33760e5015fdff0919d9459af0/transformers-4.35.0-py3-none-any.whl.metadata\n", - " Downloading transformers-4.35.0-py3-none-any.whl.metadata (123 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 123.1/123.1 kB 177.3 MB/s eta 0:00:00\n", - " Obtaining dependency information for transformers[sentencepiece]>=4.26.0 from https://files.pythonhosted.org/packages/c1/bd/f64d67df4d3b05a460f281defe830ffab6d7940b7ca98ec085e94e024781/transformers-4.34.1-py3-none-any.whl.metadata\n", - " Downloading transformers-4.34.1-py3-none-any.whl.metadata (121 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 121.5/121.5 kB 270.5 MB/s eta 0:00:00\n", - " Obtaining dependency information for transformers[sentencepiece]>=4.26.0 from https://files.pythonhosted.org/packages/1a/d1/3bba59606141ae808017f6fde91453882f931957f125009417b87a281067/transformers-4.34.0-py3-none-any.whl.metadata\n", - " Downloading transformers-4.34.0-py3-none-any.whl.metadata (121 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 121.5/121.5 kB 133.4 MB/s eta 0:00:00\n", - " Obtaining dependency information for transformers[sentencepiece]>=4.26.0 from https://files.pythonhosted.org/packages/98/46/f6a79f944d5c7763a9bc13b2aa6ac72daf43a6551f5fb03bccf0a9c2fec1/transformers-4.33.3-py3-none-any.whl.metadata\n", - " Downloading transformers-4.33.3-py3-none-any.whl.metadata (119 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 119.9/119.9 kB 163.1 MB/s eta 0:00:00\n", - " Obtaining dependency information for transformers[sentencepiece]>=4.26.0 from https://files.pythonhosted.org/packages/1a/06/3817f9bb923437ead9a794f0ac0d03b8b5e0478ab112db4c413dd37c09da/transformers-4.33.2-py3-none-any.whl.metadata\n", - " Downloading transformers-4.33.2-py3-none-any.whl.metadata (119 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 119.9/119.9 kB 274.9 MB/s eta 0:00:00\n", - " Obtaining dependency information for transformers[sentencepiece]>=4.26.0 from https://files.pythonhosted.org/packages/13/30/54b59e73400df3de506ad8630284e9fd63f4b94f735423d55fc342181037/transformers-4.33.1-py3-none-any.whl.metadata\n", - " Downloading transformers-4.33.1-py3-none-any.whl.metadata (119 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 119.9/119.9 kB 274.2 MB/s eta 0:00:00\n", - " Obtaining dependency information for transformers[sentencepiece]>=4.26.0 from https://files.pythonhosted.org/packages/e1/9d/4d9fe5c3b820db10773392ac5f4a0c8dab668f70b245ce2ce09785166128/transformers-4.33.0-py3-none-any.whl.metadata\n", - " Downloading transformers-4.33.0-py3-none-any.whl.metadata (119 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 119.9/119.9 kB 185.9 MB/s eta 0:00:00\n", - " Obtaining dependency information for transformers[sentencepiece]>=4.26.0 from https://files.pythonhosted.org/packages/83/8d/f65f8138365462ace54458a9e164f4b28ce1141361970190eef36bdef986/transformers-4.32.1-py3-none-any.whl.metadata\n", - " Downloading transformers-4.32.1-py3-none-any.whl.metadata (118 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 118.5/118.5 kB 144.4 MB/s eta 0:00:00\n", - " Obtaining dependency information for transformers[sentencepiece]>=4.26.0 from https://files.pythonhosted.org/packages/ae/95/283a1c004430bd2a9425d6937fc545dd49a4e4592feb76be0299a14e2378/transformers-4.32.0-py3-none-any.whl.metadata\n", - " Downloading transformers-4.32.0-py3-none-any.whl.metadata (118 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 118.5/118.5 kB 150.3 MB/s eta 0:00:00\n", - " Obtaining dependency information for transformers[sentencepiece]>=4.26.0 from https://files.pythonhosted.org/packages/21/02/ae8e595f45b6c8edee07913892b3b41f5f5f273962ad98851dc6a564bbb9/transformers-4.31.0-py3-none-any.whl.metadata\n", - " Downloading transformers-4.31.0-py3-none-any.whl.metadata (116 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 116.9/116.9 kB 156.7 MB/s eta 0:00:00\n", - " Obtaining dependency information for transformers[sentencepiece]>=4.26.0 from https://files.pythonhosted.org/packages/5b/0b/e45d26ccd28568013523e04f325432ea88a442b4e3020b757cf4361f0120/transformers-4.30.2-py3-none-any.whl.metadata\n", - " Downloading transformers-4.30.2-py3-none-any.whl.metadata (113 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 113.6/113.6 kB 263.7 MB/s eta 0:00:00\n", - " Obtaining dependency information for transformers[sentencepiece]>=4.26.0 from https://files.pythonhosted.org/packages/b8/df/b01b5e67cde3883757c9212455cbb9169385dcab5858b7172199126b756d/transformers-4.30.1-py3-none-any.whl.metadata\n", - " Downloading transformers-4.30.1-py3-none-any.whl.metadata (113 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 113.6/113.6 kB 263.8 MB/s eta 0:00:00\n", - " Obtaining dependency information for transformers[sentencepiece]>=4.26.0 from https://files.pythonhosted.org/packages/e2/72/1af3d38e98fdcceb3876de4567ac395a66c26976e259fe2d46266e052d61/transformers-4.30.0-py3-none-any.whl.metadata\n", - " Downloading transformers-4.30.0-py3-none-any.whl.metadata (113 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 113.6/113.6 kB 266.5 MB/s eta 0:00:00\n", - " Obtaining dependency information for transformers[sentencepiece]>=4.26.0 from https://files.pythonhosted.org/packages/17/aa/a89864288afe45abe1ab79f002140a20348140e86836d96096d8f8a3bac0/transformers-4.29.2-py3-none-any.whl.metadata\n", - " Downloading transformers-4.29.2-py3-none-any.whl.metadata (112 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 112.3/112.3 kB 272.7 MB/s eta 0:00:00\n", - " Obtaining dependency information for transformers[sentencepiece]>=4.26.0 from https://files.pythonhosted.org/packages/e8/b5/ddb16f9de207e6571ab7cc5db0cc538fa2d6d91cf024565496462af4c1ce/transformers-4.29.1-py3-none-any.whl.metadata\n", - " Downloading transformers-4.29.1-py3-none-any.whl.metadata (112 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 112.3/112.3 kB 262.3 MB/s eta 0:00:00\n", - " Obtaining dependency information for transformers[sentencepiece]>=4.26.0 from https://files.pythonhosted.org/packages/45/e4/4914b11df70954d95a7c36b74bf9010c8594fcec960471479449b0deb4f7/transformers-4.29.0-py3-none-any.whl.metadata\n", - " Downloading transformers-4.29.0-py3-none-any.whl.metadata (111 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 111.9/111.9 kB 269.5 MB/s eta 0:00:00\n", - " Obtaining dependency information for transformers[sentencepiece]>=4.26.0 from https://files.pythonhosted.org/packages/d8/a7/a6ff727fd5d96d6625f4658944a2ae230f0c75743a9a117fbda013b03d3d/transformers-4.28.1-py3-none-any.whl.metadata\n", - " Downloading transformers-4.28.1-py3-none-any.whl.metadata (109 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 110.0/110.0 kB 245.6 MB/s eta 0:00:00\n", - " Obtaining dependency information for transformers[sentencepiece]>=4.26.0 from https://files.pythonhosted.org/packages/8b/13/1ce598763b3669d43f192a7911bf2bf730a328012ab8801b93187a4f70d0/transformers-4.28.0-py3-none-any.whl.metadata\n", - " Downloading transformers-4.28.0-py3-none-any.whl.metadata (109 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 110.0/110.0 kB 256.3 MB/s eta 0:00:00\n", - " Obtaining dependency information for transformers[sentencepiece]>=4.26.0 from https://files.pythonhosted.org/packages/87/f0/2a152ed10ab8601431e87a606d397f7473c5fa4f8162f4ec5bda6ddb2df4/transformers-4.27.4-py3-none-any.whl.metadata\n", - " Downloading transformers-4.27.4-py3-none-any.whl.metadata (106 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 106.7/106.7 kB 254.4 MB/s eta 0:00:00\n", - " Obtaining dependency information for transformers[sentencepiece]>=4.26.0 from https://files.pythonhosted.org/packages/52/ac/9dc5a17ba60bc354d99250d9d1629f99d76f6729cee438fa91c8cc74bc5d/transformers-4.27.3-py3-none-any.whl.metadata\n", - " Downloading transformers-4.27.3-py3-none-any.whl.metadata (106 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 106.7/106.7 kB 251.5 MB/s eta 0:00:00\n", - " Obtaining dependency information for transformers[sentencepiece]>=4.26.0 from https://files.pythonhosted.org/packages/73/f0/4a795505387a3e7cd7f0c2a2a87f876658f9a07947a38fb67bffceff9246/transformers-4.27.2-py3-none-any.whl.metadata\n", - " Downloading transformers-4.27.2-py3-none-any.whl.metadata (106 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 106.7/106.7 kB 246.1 MB/s eta 0:00:00\n", - " Obtaining dependency information for transformers[sentencepiece]>=4.26.0 from https://files.pythonhosted.org/packages/6d/9b/2f536f9e73390209e0b27b74691355dac494b7ec8154f3012fdc6debbae7/transformers-4.27.1-py3-none-any.whl.metadata\n", - " Downloading transformers-4.27.1-py3-none-any.whl.metadata (106 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 106.7/106.7 kB 114.0 MB/s eta 0:00:00\n", - " Obtaining dependency information for transformers[sentencepiece]>=4.26.0 from https://files.pythonhosted.org/packages/4d/3e/1378ed266cf991f5ab5fcb29e953d97d793c7f9242ea5dc52f856415ea3a/transformers-4.27.0-py3-none-any.whl.metadata\n", - " Downloading transformers-4.27.0-py3-none-any.whl.metadata (106 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 106.7/106.7 kB 247.2 MB/s eta 0:00:00\n", - "Collecting sentencepiece!=0.1.92,>=0.1.91 (from transformers~=4.26.1->-r /empty/requirements.txt (line 5))\n", - " Obtaining dependency information for sentencepiece!=0.1.92,>=0.1.91 from https://files.pythonhosted.org/packages/5f/01/c95e42eb86282b2c79305d3e0b0ca5a743f85a61262bb7130999c70b9374/sentencepiece-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata\n", - " Downloading sentencepiece-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (7.7 kB)\n", - "Collecting protobuf>=3.20.2 (from onnx~=1.14.1->-r /empty/requirements.txt (line 2))\n", - " Obtaining dependency information for protobuf>=3.20.2 from https://files.pythonhosted.org/packages/38/b1/d9b615dceb67ac38e13cbd7680c27182b40154996022cbb244ba1ac7d30f/protobuf-3.20.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl.metadata\n", - " Downloading protobuf-3.20.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl.metadata (679 bytes)\n", - "Requirement already satisfied: future>=0.18.2 in /opt/conda/lib/python3.9/site-packages (from v3io~=0.5.21->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.0.0)\n", - "Requirement already satisfied: ujson>=3 in /opt/conda/lib/python3.9/site-packages (from v3io~=0.5.21->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (5.9.0)\n", - "Requirement already satisfied: googleapis-common-protos>=1.5.3 in /opt/conda/lib/python3.9/site-packages (from v3io-frames~=0.10.12->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.62.0)\n", - "Requirement already satisfied: grpcio-tools!=1.34.0,<1.49,>=1.30 in /opt/conda/lib/python3.9/site-packages (from v3io-frames~=0.10.12->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.48.2)\n", - "Collecting humanfriendly>=9.1 (from coloredlogs->onnxruntime~=1.16.1->-r /empty/requirements.txt (line 3))\n", - " Obtaining dependency information for humanfriendly>=9.1 from https://files.pythonhosted.org/packages/f0/0f/310fb31e39e2d734ccaa2c0fb981ee41f7bd5056ce9bc29b2248bd569169/humanfriendly-10.0-py2.py3-none-any.whl.metadata\n", - " Downloading humanfriendly-10.0-py2.py3-none-any.whl.metadata (9.2 kB)\n", - "INFO: pip is looking at multiple versions of multiprocess to determine which version is compatible with other requirements. This could take a while.\n", - "Collecting multiprocess (from datasets~=2.10.1->-r /empty/requirements.txt (line 6))\n", - " Obtaining dependency information for multiprocess from https://files.pythonhosted.org/packages/c6/c9/820b5ab056f4ada76fbe05bd481a948f287957d6cbfd59e2dd2618b408c1/multiprocess-0.70.15-py39-none-any.whl.metadata\n", - " Downloading multiprocess-0.70.15-py39-none-any.whl.metadata (7.2 kB)\n", - " Obtaining dependency information for multiprocess from https://files.pythonhosted.org/packages/6a/f4/fbeb03ef7abdda54db4a6a75c971b88ab73d724ff09e3275cc1e99f1c946/multiprocess-0.70.14-py39-none-any.whl.metadata\n", - " Downloading multiprocess-0.70.14-py39-none-any.whl.metadata (6.6 kB)\n", - "Collecting mpmath>=0.19 (from sympy->onnxruntime~=1.16.1->-r /empty/requirements.txt (line 3))\n", - " Obtaining dependency information for mpmath>=0.19 from https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl.metadata\n", - " Downloading mpmath-1.3.0-py3-none-any.whl.metadata (8.6 kB)\n", - "Requirement already satisfied: Mako in /opt/conda/lib/python3.9/site-packages (from alembic!=1.10.0,<2->mlflow~=2.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.3.2)\n", - "Requirement already satisfied: cffi in /opt/conda/lib/python3.9/site-packages (from azure-datalake-store<0.1,>=0.0.46->adlfs==2023.9.0->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.16.0)\n", - "Requirement already satisfied: termcolor in /opt/conda/lib/python3.9/site-packages (from fire<1,>=0.3.1->kfp~=1.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (2.4.0)\n", - "Requirement already satisfied: Werkzeug>=3.0.0 in /opt/conda/lib/python3.9/site-packages (from Flask<4->mlflow~=2.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (3.0.1)\n", - "Requirement already satisfied: itsdangerous>=2.1.2 in /opt/conda/lib/python3.9/site-packages (from Flask<4->mlflow~=2.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (2.1.2)\n", - "Requirement already satisfied: blinker>=1.6.2 in /opt/conda/lib/python3.9/site-packages (from Flask<4->mlflow~=2.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.7.0)\n", - "Requirement already satisfied: smmap<6,>=3.0.1 in /opt/conda/lib/python3.9/site-packages (from gitdb<5,>=4.0.1->GitPython>=3.1.41,~=3.1->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (5.0.1)\n", - "Requirement already satisfied: httplib2<1dev,>=0.15.0 in /opt/conda/lib/python3.9/site-packages (from google-api-python-client<2,>=1.7.8->kfp~=1.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.22.0)\n", - "Requirement already satisfied: google-auth-httplib2>=0.0.3 in /opt/conda/lib/python3.9/site-packages (from google-api-python-client<2,>=1.7.8->kfp~=1.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.2.0)\n", - "Requirement already satisfied: cachetools<6.0,>=2.0.0 in /opt/conda/lib/python3.9/site-packages (from google-auth>=1.2->gcsfs==2023.9.2->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (5.3.3)\n", - "Requirement already satisfied: pyasn1-modules>=0.2.1 in /opt/conda/lib/python3.9/site-packages (from google-auth>=1.2->gcsfs==2023.9.2->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.3.0)\n", - "Requirement already satisfied: rsa<5,>=3.1.4 in /opt/conda/lib/python3.9/site-packages (from google-auth>=1.2->gcsfs==2023.9.2->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (4.9)\n", - "Requirement already satisfied: proto-plus<2.0.0dev,>=1.22.0 in /opt/conda/lib/python3.9/site-packages (from google-cloud-bigquery-storage<3.0.0dev,>=2.6.0->google-cloud-bigquery[bqstorage,pandas]==3.14.1->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.23.0)\n", - "Requirement already satisfied: google-crc32c<2.0dev,>=1.0 in /opt/conda/lib/python3.9/site-packages (from google-cloud-storage->gcsfs==2023.9.2->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.5.0)\n", - "Requirement already satisfied: zipp>=0.5 in /opt/conda/lib/python3.9/site-packages (from importlib-metadata>=4.13.0->dask~=2023.9.0->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (3.17.0)\n", - "Requirement already satisfied: parso<0.9.0,>=0.8.3 in /opt/conda/lib/python3.9/site-packages (from jedi>=0.16->ipython~=8.10->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.8.3)\n", - "Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /opt/conda/lib/python3.9/site-packages (from jsonschema<5,>=3.0.1->kfp~=1.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (2023.12.1)\n", - "Requirement already satisfied: referencing>=0.28.4 in /opt/conda/lib/python3.9/site-packages (from jsonschema<5,>=3.0.1->kfp~=1.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.33.0)\n", - "Requirement already satisfied: rpds-py>=0.7.1 in /opt/conda/lib/python3.9/site-packages (from jsonschema<5,>=3.0.1->kfp~=1.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.18.0)\n", - "Requirement already satisfied: websocket-client!=0.40.0,!=0.41.*,!=0.42.*,>=0.32.0 in /opt/conda/lib/python3.9/site-packages (from kubernetes<26,>=8.0.0->kfp~=1.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.7.0)\n", - "Requirement already satisfied: contourpy>=1.0.1 in /opt/conda/lib/python3.9/site-packages (from matplotlib<4->mlflow~=2.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.2.0)\n", - "Requirement already satisfied: cycler>=0.10 in /opt/conda/lib/python3.9/site-packages (from matplotlib<4->mlflow~=2.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.12.1)\n", - "Requirement already satisfied: fonttools>=4.22.0 in /opt/conda/lib/python3.9/site-packages (from matplotlib<4->mlflow~=2.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (4.49.0)\n", - "Requirement already satisfied: kiwisolver>=1.3.1 in /opt/conda/lib/python3.9/site-packages (from matplotlib<4->mlflow~=2.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.4.5)\n", - "Requirement already satisfied: pillow>=8 in /opt/conda/lib/python3.9/site-packages (from matplotlib<4->mlflow~=2.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (10.2.0)\n", - "Requirement already satisfied: pyparsing>=2.3.1 in /opt/conda/lib/python3.9/site-packages (from matplotlib<4->mlflow~=2.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (3.1.1)\n", - "Requirement already satisfied: importlib-resources>=3.2.0 in /opt/conda/lib/python3.9/site-packages (from matplotlib<4->mlflow~=2.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (6.1.2)\n", - "Requirement already satisfied: PyJWT[crypto]<3,>=1.0.0 in /opt/conda/lib/python3.9/site-packages (from msal<2.0.0,>=1.24.0->azure-identity~=1.5->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (2.8.0)\n", - "Requirement already satisfied: portalocker<3,>=1.0 in /opt/conda/lib/python3.9/site-packages (from msal-extensions<2.0.0,>=0.3.0->azure-identity~=1.5->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (2.8.2)\n", - "Requirement already satisfied: beautifulsoup4 in /opt/conda/lib/python3.9/site-packages (from nbconvert>=6.4.5->nuclio-jupyter~=0.9.15->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (4.12.3)\n", - "Requirement already satisfied: bleach!=5.0.0 in /opt/conda/lib/python3.9/site-packages (from nbconvert>=6.4.5->nuclio-jupyter~=0.9.15->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (6.1.0)\n", - "Requirement already satisfied: defusedxml in /opt/conda/lib/python3.9/site-packages (from nbconvert>=6.4.5->nuclio-jupyter~=0.9.15->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.7.1)\n", - "Requirement already satisfied: jupyter-core>=4.7 in /opt/conda/lib/python3.9/site-packages (from nbconvert>=6.4.5->nuclio-jupyter~=0.9.15->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (5.7.1)\n", - "Requirement already satisfied: jupyterlab-pygments in /opt/conda/lib/python3.9/site-packages (from nbconvert>=6.4.5->nuclio-jupyter~=0.9.15->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.3.0)\n", - "Requirement already satisfied: mistune<4,>=2.0.3 in /opt/conda/lib/python3.9/site-packages (from nbconvert>=6.4.5->nuclio-jupyter~=0.9.15->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (3.0.2)\n", - "Requirement already satisfied: nbclient>=0.5.0 in /opt/conda/lib/python3.9/site-packages (from nbconvert>=6.4.5->nuclio-jupyter~=0.9.15->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.9.0)\n", - "Requirement already satisfied: nbformat>=5.7 in /opt/conda/lib/python3.9/site-packages (from nbconvert>=6.4.5->nuclio-jupyter~=0.9.15->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (5.9.2)\n", - "Requirement already satisfied: pandocfilters>=1.4.1 in /opt/conda/lib/python3.9/site-packages (from nbconvert>=6.4.5->nuclio-jupyter~=0.9.15->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.5.1)\n", - "Requirement already satisfied: tinycss2 in /opt/conda/lib/python3.9/site-packages (from nbconvert>=6.4.5->nuclio-jupyter~=0.9.15->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.2.1)\n", - "Requirement already satisfied: pyzmq<25,>=17 in /opt/conda/lib/python3.9/site-packages (from notebook<7.0.0,>=6.4->nuclio-jupyter~=0.9.15->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (24.0.1)\n", - "Requirement already satisfied: argon2-cffi in /opt/conda/lib/python3.9/site-packages (from notebook<7.0.0,>=6.4->nuclio-jupyter~=0.9.15->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (23.1.0)\n", - "Requirement already satisfied: jupyter-client<8,>=5.3.4 in /opt/conda/lib/python3.9/site-packages (from notebook<7.0.0,>=6.4->nuclio-jupyter~=0.9.15->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (7.4.9)\n", - "Requirement already satisfied: ipython-genutils in /opt/conda/lib/python3.9/site-packages (from notebook<7.0.0,>=6.4->nuclio-jupyter~=0.9.15->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.2.0)\n", - "Requirement already satisfied: ipykernel in /opt/conda/lib/python3.9/site-packages (from notebook<7.0.0,>=6.4->nuclio-jupyter~=0.9.15->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (6.29.3)\n", - "Requirement already satisfied: Send2Trash>=1.8.0 in /opt/conda/lib/python3.9/site-packages (from notebook<7.0.0,>=6.4->nuclio-jupyter~=0.9.15->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.8.2)\n", - "Requirement already satisfied: terminado>=0.8.3 in /opt/conda/lib/python3.9/site-packages (from notebook<7.0.0,>=6.4->nuclio-jupyter~=0.9.15->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.18.0)\n", - "Requirement already satisfied: prometheus-client in /opt/conda/lib/python3.9/site-packages (from notebook<7.0.0,>=6.4->nuclio-jupyter~=0.9.15->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.20.0)\n", - "Requirement already satisfied: nbclassic>=0.4.7 in /opt/conda/lib/python3.9/site-packages (from notebook<7.0.0,>=6.4->nuclio-jupyter~=0.9.15->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.0.0)\n", - "Requirement already satisfied: ptyprocess>=0.5 in /opt/conda/lib/python3.9/site-packages (from pexpect>4.3->ipython~=8.10->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.7.0)\n", - "Requirement already satisfied: wcwidth in /opt/conda/lib/python3.9/site-packages (from prompt-toolkit<3.1.0,>=3.0.41->ipython~=8.10->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.2.13)\n", - "Requirement already satisfied: oauthlib>=3.0.0 in /opt/conda/lib/python3.9/site-packages (from requests-oauthlib>=0.5.0->msrest~=0.6.21->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (3.2.2)\n", - "Requirement already satisfied: wheel in /opt/conda/lib/python3.9/site-packages (from strip-hints<1,>=0.1.8->kfp~=1.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.41.2)\n", - "Requirement already satisfied: executing>=1.2.0 in /opt/conda/lib/python3.9/site-packages (from stack-data->ipython~=8.10->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (2.0.1)\n", - "Requirement already satisfied: asttokens>=2.1.0 in /opt/conda/lib/python3.9/site-packages (from stack-data->ipython~=8.10->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (2.4.1)\n", - "Requirement already satisfied: pure-eval in /opt/conda/lib/python3.9/site-packages (from stack-data->ipython~=8.10->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.2.2)\n", - "Requirement already satisfied: webencodings in /opt/conda/lib/python3.9/site-packages (from bleach!=5.0.0->nbconvert>=6.4.5->nuclio-jupyter~=0.9.15->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.5.1)\n", - "Requirement already satisfied: pycparser in /opt/conda/lib/python3.9/site-packages (from cffi->azure-datalake-store<0.1,>=0.0.46->adlfs==2023.9.0->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (2.21)\n", - "Requirement already satisfied: grpcio-status<2.0.dev0,>=1.33.2 in /opt/conda/lib/python3.9/site-packages (from google-api-core!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.0,<3.0.0dev,>=1.31.5->google-cloud-bigquery[bqstorage,pandas]==3.14.1->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.48.2)\n", - "Requirement already satisfied: platformdirs>=2.5 in /opt/conda/lib/python3.9/site-packages (from jupyter-core>=4.7->nbconvert>=6.4.5->nuclio-jupyter~=0.9.15->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (3.10.0)\n", - "Requirement already satisfied: jupyter-server>=1.8 in /opt/conda/lib/python3.9/site-packages (from nbclassic>=0.4.7->notebook<7.0.0,>=6.4->nuclio-jupyter~=0.9.15->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (2.12.5)\n", - "Requirement already satisfied: notebook-shim>=0.2.3 in /opt/conda/lib/python3.9/site-packages (from nbclassic>=0.4.7->notebook<7.0.0,>=6.4->nuclio-jupyter~=0.9.15->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.2.4)\n", - "Requirement already satisfied: fastjsonschema in /opt/conda/lib/python3.9/site-packages (from nbformat>=5.7->nbconvert>=6.4.5->nuclio-jupyter~=0.9.15->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (2.19.1)\n", - "Requirement already satisfied: pyasn1<0.6.0,>=0.4.6 in /opt/conda/lib/python3.9/site-packages (from pyasn1-modules>=0.2.1->google-auth>=1.2->gcsfs==2023.9.2->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.5.1)\n", - "Requirement already satisfied: argon2-cffi-bindings in /opt/conda/lib/python3.9/site-packages (from argon2-cffi->notebook<7.0.0,>=6.4->nuclio-jupyter~=0.9.15->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (21.2.0)\n", - "Requirement already satisfied: soupsieve>1.2 in /opt/conda/lib/python3.9/site-packages (from beautifulsoup4->nbconvert>=6.4.5->nuclio-jupyter~=0.9.15->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (2.5)\n", - "Requirement already satisfied: comm>=0.1.1 in /opt/conda/lib/python3.9/site-packages (from ipykernel->notebook<7.0.0,>=6.4->nuclio-jupyter~=0.9.15->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.2.1)\n", - "Requirement already satisfied: debugpy>=1.6.5 in /opt/conda/lib/python3.9/site-packages (from ipykernel->notebook<7.0.0,>=6.4->nuclio-jupyter~=0.9.15->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.8.1)\n", - "Requirement already satisfied: jupyter-events>=0.9.0 in /opt/conda/lib/python3.9/site-packages (from jupyter-server>=1.8->nbclassic>=0.4.7->notebook<7.0.0,>=6.4->nuclio-jupyter~=0.9.15->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.9.0)\n", - "Requirement already satisfied: jupyter-server-terminals in /opt/conda/lib/python3.9/site-packages (from jupyter-server>=1.8->nbclassic>=0.4.7->notebook<7.0.0,>=6.4->nuclio-jupyter~=0.9.15->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.5.2)\n", - "Requirement already satisfied: overrides in /opt/conda/lib/python3.9/site-packages (from jupyter-server>=1.8->nbclassic>=0.4.7->notebook<7.0.0,>=6.4->nuclio-jupyter~=0.9.15->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (7.7.0)\n", - "Requirement already satisfied: python-json-logger>=2.0.4 in /opt/conda/lib/python3.9/site-packages (from jupyter-events>=0.9.0->jupyter-server>=1.8->nbclassic>=0.4.7->notebook<7.0.0,>=6.4->nuclio-jupyter~=0.9.15->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (2.0.7)\n", - "Requirement already satisfied: rfc3339-validator in /opt/conda/lib/python3.9/site-packages (from jupyter-events>=0.9.0->jupyter-server>=1.8->nbclassic>=0.4.7->notebook<7.0.0,>=6.4->nuclio-jupyter~=0.9.15->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.1.4)\n", - "Requirement already satisfied: rfc3986-validator>=0.1.1 in /opt/conda/lib/python3.9/site-packages (from jupyter-events>=0.9.0->jupyter-server>=1.8->nbclassic>=0.4.7->notebook<7.0.0,>=6.4->nuclio-jupyter~=0.9.15->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (0.1.1)\n", - "Requirement already satisfied: fqdn in /opt/conda/lib/python3.9/site-packages (from jsonschema<5,>=3.0.1->kfp~=1.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.5.1)\n", - "Requirement already satisfied: isoduration in /opt/conda/lib/python3.9/site-packages (from jsonschema<5,>=3.0.1->kfp~=1.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (20.11.0)\n", - "Requirement already satisfied: jsonpointer>1.13 in /opt/conda/lib/python3.9/site-packages (from jsonschema<5,>=3.0.1->kfp~=1.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (2.1)\n", - "Requirement already satisfied: uri-template in /opt/conda/lib/python3.9/site-packages (from jsonschema<5,>=3.0.1->kfp~=1.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.3.0)\n", - "Requirement already satisfied: webcolors>=1.11 in /opt/conda/lib/python3.9/site-packages (from jsonschema<5,>=3.0.1->kfp~=1.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.13)\n", - "Requirement already satisfied: arrow>=0.15.0 in /opt/conda/lib/python3.9/site-packages (from isoduration->jsonschema<5,>=3.0.1->kfp~=1.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (1.3.0)\n", - "Requirement already satisfied: types-python-dateutil>=2.8.10 in /opt/conda/lib/python3.9/site-packages (from arrow>=0.15.0->isoduration->jsonschema<5,>=3.0.1->kfp~=1.8->mlrun[complete]==1.6.1->-r /empty/requirements.txt (line 1)) (2.8.19.20240106)\n", - "Downloading onnx-1.14.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (14.6 MB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 14.6/14.6 MB 274.2 MB/s eta 0:00:00\n", - "Downloading onnxruntime-1.16.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.4 MB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 6.4/6.4 MB 277.9 MB/s eta 0:00:00\n", - "Downloading optimum-1.6.4-py3-none-any.whl (227 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 227.8/227.8 kB 291.3 MB/s eta 0:00:00\n", - "Downloading transformers-4.26.1-py3-none-any.whl (6.3 MB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 6.3/6.3 MB 242.4 MB/s eta 0:00:00\n", - "Downloading datasets-2.10.1-py3-none-any.whl (469 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 469.0/469.0 kB 185.9 MB/s eta 0:00:00\n", - "Downloading scikit_learn-1.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (26.4 MB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 26.4/26.4 MB 275.9 MB/s eta 0:00:00\n", - "Downloading dill-0.3.6-py3-none-any.whl (110 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 110.5/110.5 kB 282.3 MB/s eta 0:00:00\n", - "Downloading huggingface_hub-0.21.4-py3-none-any.whl (346 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 346.4/346.4 kB 311.7 MB/s eta 0:00:00\n", - "Downloading numpy-1.23.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (17.1 MB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 17.1/17.1 MB 269.6 MB/s eta 0:00:00\n", - "Downloading regex-2023.12.25-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (773 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 773.4/773.4 kB 311.9 MB/s eta 0:00:00\n", - "Downloading responses-0.18.0-py3-none-any.whl (38 kB)\n", - "Downloading tokenizers-0.13.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (7.8 MB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 7.8/7.8 MB 264.1 MB/s eta 0:00:00\n", - "Downloading torch-2.2.1-cp39-cp39-manylinux1_x86_64.whl (755.5 MB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 755.5/755.5 MB 204.0 MB/s eta 0:00:00\n", - "Downloading nvidia_cublas_cu12-12.1.3.1-py3-none-manylinux1_x86_64.whl (410.6 MB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 410.6/410.6 MB 40.3 MB/s eta 0:00:00\n", - "Downloading nvidia_cuda_cupti_cu12-12.1.105-py3-none-manylinux1_x86_64.whl (14.1 MB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 14.1/14.1 MB 43.0 MB/s eta 0:00:00\n", - "Downloading nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-manylinux1_x86_64.whl (23.7 MB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 23.7/23.7 MB 46.9 MB/s eta 0:00:00\n", - "Downloading nvidia_cuda_runtime_cu12-12.1.105-py3-none-manylinux1_x86_64.whl (823 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 823.6/823.6 kB 51.0 MB/s eta 0:00:00\n", - "Downloading nvidia_cudnn_cu12-8.9.2.26-py3-none-manylinux1_x86_64.whl (731.7 MB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 731.7/731.7 MB 58.2 MB/s eta 0:00:00\n", - "Downloading nvidia_cufft_cu12-11.0.2.54-py3-none-manylinux1_x86_64.whl (121.6 MB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 121.6/121.6 MB 69.0 MB/s eta 0:00:00\n", - "Downloading nvidia_curand_cu12-10.3.2.106-py3-none-manylinux1_x86_64.whl (56.5 MB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 56.5/56.5 MB 36.0 MB/s eta 0:00:00\n", - "Downloading nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl (124.2 MB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 124.2/124.2 MB 52.8 MB/s eta 0:00:00\n", - "Downloading nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl (196.0 MB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 196.0/196.0 MB 45.9 MB/s eta 0:00:00\n", - "Downloading nvidia_nccl_cu12-2.19.3-py3-none-manylinux1_x86_64.whl (166.0 MB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 166.0/166.0 MB 19.6 MB/s eta 0:00:00\n", - "Downloading nvidia_nvtx_cu12-12.1.105-py3-none-manylinux1_x86_64.whl (99 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 99.1/99.1 kB 27.7 MB/s eta 0:00:00\n", - "Downloading triton-2.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (167.9 MB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 167.9/167.9 MB 41.3 MB/s eta 0:00:00\n", - "Downloading protobuf-3.20.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl (1.0 MB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.0/1.0 MB 42.8 MB/s eta 0:00:00\n", - "Downloading coloredlogs-15.0.1-py2.py3-none-any.whl (46 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 46.0/46.0 kB 192.0 MB/s eta 0:00:00\n", - "Downloading filelock-3.13.1-py3-none-any.whl (11 kB)\n", - "Downloading flatbuffers-24.3.7-py2.py3-none-any.whl (26 kB)\n", - "Downloading multiprocess-0.70.14-py39-none-any.whl (132 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 132.9/132.9 kB 100.7 MB/s eta 0:00:00\n", - "Downloading sympy-1.12-py3-none-any.whl (5.7 MB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 5.7/5.7 MB 41.4 MB/s eta 0:00:00\n", - "Downloading humanfriendly-10.0-py2.py3-none-any.whl (86 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 86.8/86.8 kB 253.7 MB/s eta 0:00:00\n", - "Downloading mpmath-1.3.0-py3-none-any.whl (536 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 536.2/536.2 kB 45.4 MB/s eta 0:00:00\n", - "Downloading sentencepiece-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.3/1.3 MB 46.1 MB/s eta 0:00:00\n", - "Downloading networkx-3.2.1-py3-none-any.whl (1.6 MB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.6/1.6 MB 43.7 MB/s eta 0:00:00\n", - "Downloading nvidia_nvjitlink_cu12-12.4.99-py3-none-manylinux2014_x86_64.whl (21.1 MB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 21.1/21.1 MB 43.8 MB/s eta 0:00:00\n", - "Installing collected packages: tokenizers, sentencepiece, mpmath, flatbuffers, sympy, regex, protobuf, nvidia-nvtx-cu12, nvidia-nvjitlink-cu12, nvidia-nccl-cu12, nvidia-curand-cu12, nvidia-cufft-cu12, nvidia-cuda-runtime-cu12, nvidia-cuda-nvrtc-cu12, nvidia-cuda-cupti-cu12, nvidia-cublas-cu12, numpy, networkx, humanfriendly, filelock, dill, triton, responses, onnx, nvidia-cusparse-cu12, nvidia-cudnn-cu12, multiprocess, huggingface-hub, coloredlogs, transformers, scikit-learn, onnxruntime, nvidia-cusolver-cu12, torch, datasets, optimum\n", - " Attempting uninstall: protobuf\n", - " Found existing installation: protobuf 3.20.3\n", - " Uninstalling protobuf-3.20.3:\n", - " Successfully uninstalled protobuf-3.20.3\n", - " Attempting uninstall: numpy\n", - " Found existing installation: numpy 1.26.4\n", - " Uninstalling numpy-1.26.4:\n", - " Successfully uninstalled numpy-1.26.4\n", - " Attempting uninstall: scikit-learn\n", - " Found existing installation: scikit-learn 1.4.1.post1\n", - " Uninstalling scikit-learn-1.4.1.post1:\n", - " Successfully uninstalled scikit-learn-1.4.1.post1\n", - "Successfully installed coloredlogs-15.0.1 datasets-2.10.1 dill-0.3.6 filelock-3.13.1 flatbuffers-24.3.7 huggingface-hub-0.21.4 humanfriendly-10.0 mpmath-1.3.0 multiprocess-0.70.14 networkx-3.2.1 numpy-1.23.5 nvidia-cublas-cu12-12.1.3.1 nvidia-cuda-cupti-cu12-12.1.105 nvidia-cuda-nvrtc-cu12-12.1.105 nvidia-cuda-runtime-cu12-12.1.105 nvidia-cudnn-cu12-8.9.2.26 nvidia-cufft-cu12-11.0.2.54 nvidia-curand-cu12-10.3.2.106 nvidia-cusolver-cu12-11.4.5.107 nvidia-cusparse-cu12-12.1.0.106 nvidia-nccl-cu12-2.19.3 nvidia-nvjitlink-cu12-12.4.99 nvidia-nvtx-cu12-12.1.105 onnx-1.14.1 onnxruntime-1.16.3 optimum-1.6.4 protobuf-3.20.2 regex-2023.12.25 responses-0.18.0 scikit-learn-1.0.2 sentencepiece-0.2.0 sympy-1.12 tokenizers-0.13.3 torch-2.2.1 transformers-4.26.1 triton-2.2.0\n", - "WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\n", - "\u001b[36mINFO\u001b[0m[0238] Taking snapshot of full filesystem... \n", - "\u001b[36mINFO\u001b[0m[0463] Pushing image to docker-registry.default-tenant.app.app-lab-2-b688.iguazio-cd2.com/mlrun/func-hugging-face-trainer-avia-hugging-face-classifier-trainer:latest \n", - "\u001b[36mINFO\u001b[0m[0493] Pushed docker-registry.default-tenant.app.app-lab-2-b688.iguazio-cd2.com/mlrun/func-hugging-face-trainer-avia-hugging-face-classifier-trainer@sha256:691d0bb3c23487b4b5d2f84ab323c24735626ee81681475f53a4158b72d4cfee \n" - ] - }, - { - "data": { - "text/plain": [ - "BuildStatus(ready=True, outputs={'image': '.mlrun/func-hugging-face-trainer-avia-hugging-face-classifier-trainer:latest'})" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "project.build_function(\"hugging-face-classifier-trainer\",with_mlrun=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "scrolled": true, - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2024-03-24 17:22:42,252 [info] Storing function: {'name': 'hugging-face-classifier-trainer-train', 'uid': '53252ce7aacb4b1aacf86bf3b862daa2', 'db': 'http://mlrun-api:8080'}\n", - "> 2024-03-24 17:22:42,536 [info] Job is running in the background, pod: hugging-face-classifier-trainer-train-dqqfr\n", - "> 2024-03-24 17:24:43,288 [info] 'train_test_split_size' is not provided, setting train_test_split_size to 0.2\n", - "> 2024-03-24 17:24:43,847 [info] Loading and editing Shayanvsf/US_Airline_Sentiment dataset from Hugging Face hub\n", - "Downloading metadata: 100%|██████████| 1.03k/1.03k [00:00<00:00, 6.77MB/s]\n", - "Downloading and preparing dataset None/None (download: 265.13 KiB, generated: 1.50 MiB, post-processed: Unknown size, total: 1.76 MiB) to /root/.cache/huggingface/datasets/Shayanvsf___parquet/Shayanvsf--US_Airline_Sentiment-1319c42f87c44b2f/0.0.0/2a3b91fbd88a2c90d1dbbb32b460cf621d31bd5b05b934492fdef7d8d6f236ec...\n", - "Downloading data files: 0%| | 0/3 [00:00 2024-03-24 17:24:47,076 [info] training 'huggingface-model'\n", - "The following columns in the training set don't have a corresponding argument in `DistilBertForSequenceClassification.forward` and have been ignored: text. If text are not expected by `DistilBertForSequenceClassification.forward`, you can safely ignore this message.\n", - "This implementation of AdamW is deprecated and will be removed in a future version. Use the PyTorch implementation torch.optim.AdamW instead, or set `no_deprecation_warning=True` to disable this warning\n", - "***** Running training *****\n", - " Num examples = 100\n", - " Num Epochs = 3\n", - " Instantaneous batch size per device = 16\n", - " Total train batch size (w. parallel, distributed & accumulation) = 16\n", - " Gradient Accumulation steps = 1\n", - " Total optimization steps = 21\n", - " Number of trainable parameters = 66955010\n", - "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n", - "To disable this warning, you can either:\n", - "\t- Avoid using `tokenizers` before the fork if possible\n", - "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n", - " 0%| | 0/21 [00:00 2024-03-24 17:26:00,230 [info] To track results use the CLI: {'info_cmd': 'mlrun get run 53252ce7aacb4b1aacf86bf3b862daa2 -p hugging-face-trainer-avia', 'logs_cmd': 'mlrun logs 53252ce7aacb4b1aacf86bf3b862daa2 -p hugging-face-trainer-avia'}\n", - "> 2024-03-24 17:26:00,231 [info] Or click for UI: {'ui_url': 'https://dashboard.default-tenant.app.app-lab-2-b688.iguazio-cd2.com/mlprojects/hugging-face-trainer-avia/jobs/monitor/53252ce7aacb4b1aacf86bf3b862daa2/overview'}\n", - "> 2024-03-24 17:26:00,231 [info] Run execution finished: {'status': 'completed', 'name': 'hugging-face-classifier-trainer-train'}\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
projectuiditerstartstatenamelabelsinputsparametersresultsartifacts
hugging-face-trainer-avia0Mar 24 17:24:39completedhugging-face-classifier-trainer-train
v3io_user=avia
kind=job
owner=avia
mlrun/client_version=1.6.1
mlrun/client_python_version=3.9.16
host=hugging-face-classifier-trainer-train-dqqfr
hf_dataset=Shayanvsf/US_Airline_Sentiment
drop_columns=['airline_sentiment_confidence', 'negativereason_confidence']
pretrained_tokenizer=distilbert-base-uncased
pretrained_model=distilbert-base-uncased
model_class=transformers.AutoModelForSequenceClassification
label_name=airline_sentiment
num_of_train_samples=100
metrics=['accuracy', 'f1']
random_state=42
TRAIN_output_dir=finetuning-sentiment-model-3000-samples
TRAIN_learning_rate=2e-05
TRAIN_per_device_train_batch_size=16
TRAIN_per_device_eval_batch_size=16
TRAIN_num_train_epochs=3
TRAIN_weight_decay=0.01
TRAIN_push_to_hub=False
TRAIN_evaluation_strategy=epoch
TRAIN_eval_steps=1
TRAIN_logging_steps=1
CLASS_num_labels=2
loss=0.5215
learning_rate=0.0
eval_loss=0.4750453531742096
eval_accuracy=0.7916666666666666
eval_f1=0.0
eval_runtime=1.0524
eval_samples_per_second=22.806
eval_steps_per_second=1.9
train_runtime=55.1543
train_samples_per_second=5.439
train_steps_per_second=0.381
total_flos=3327208489680.0
loss_plot
learning_rate_plot
eval_loss_plot
eval_accuracy_plot
eval_f1_plot
eval_runtime_plot
eval_samples_per_second_plot
eval_steps_per_second_plot
tokenizer
model
\n", - "
\n", - "
\n", - "
\n", - " Title\n", - " ×\n", - "
\n", - " \n", - "
\n", - "
\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - }, - { - "data": { - "text/html": [ - " > to track results use the .show() or .logs() methods or click here to open in UI" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2024-03-24 17:26:09,792 [info] Run execution finished: {'status': 'completed', 'name': 'hugging-face-classifier-trainer-train'}\n" - ] - } - ], - "source": [ - "train_run = hugging_face_classifier_trainer.run(params={\n", - " \"hf_dataset\": \"Shayanvsf/US_Airline_Sentiment\",\n", - " \"drop_columns\": [\n", - " \"airline_sentiment_confidence\",\n", - " \"negativereason_confidence\",\n", - " ],\n", - " \"pretrained_tokenizer\": \"distilbert-base-uncased\",\n", - " \"pretrained_model\": \"distilbert-base-uncased\",\n", - " \"model_class\": \"transformers.AutoModelForSequenceClassification\",\n", - " \"label_name\": \"airline_sentiment\",\n", - " \"num_of_train_samples\": 100,\n", - " \"metrics\": [\"accuracy\", \"f1\"],\n", - " \"random_state\": 42,\n", - " **additional_parameters\n", - " },\n", - " handler=\"train\", \n", - " )" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": { - "name": "#%% md\n" - } - }, - "source": [ - "[Back to the top](#top)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "mlrun-base", - "language": "python", - "name": "conda-env-mlrun-base-py" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.16" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/hugging_face_classifier_trainer/hugging_face_classifier_trainer.py b/hugging_face_classifier_trainer/hugging_face_classifier_trainer.py deleted file mode 100755 index 29d070395..000000000 --- a/hugging_face_classifier_trainer/hugging_face_classifier_trainer.py +++ /dev/null @@ -1,832 +0,0 @@ -import os -import shutil -import tempfile -import zipfile -from abc import ABC -from typing import Any, Callable, Dict, List, Optional, Tuple, Union - -import mlrun -import mlrun.datastore -import mlrun.utils -import numpy as np -import pandas as pd -import transformers -from datasets import Dataset, load_dataset, load_metric -from mlrun import MLClientCtx -from mlrun import feature_store as fs -from mlrun.artifacts import Artifact, PlotlyArtifact -from mlrun.datastore import DataItem -from mlrun.frameworks._common import CommonTypes, MLRunInterface -from mlrun.utils import create_class -from plotly import graph_objects as go -from sklearn.model_selection import train_test_split -from transformers import ( - AutoTokenizer, - DataCollatorWithPadding, - EvalPrediction, - PreTrainedModel, - PreTrainedTokenizer, - Trainer, - TrainerCallback, - TrainerControl, - TrainerState, - TrainingArguments, -) - - -# ----------------------from MLRUN-------------------------------- -class HFORTOptimizerMLRunInterface(MLRunInterface, ABC): - """ - Interface for adding MLRun features for tensorflow keras API. - """ - - # MLRun's context default name: - DEFAULT_CONTEXT_NAME = "mlrun-huggingface" - - # Attributes to be inserted so the MLRun interface will be fully enabled. - _PROPERTIES = { - "_auto_log": False, - "_context": None, - "_model_name": "model", - "_tag": "", - "_labels": None, - "_extra_data": None, - } - _METHODS = ["enable_auto_logging"] - # Attributes to replace so the MLRun interface will be fully enabled. - _REPLACED_METHODS = [ - "optimize", - ] - - @classmethod - def add_interface( - cls, - obj, - restoration: CommonTypes.MLRunInterfaceRestorationType = None, - ): - """ - Enrich the object with this interface properties, methods and functions, so it will have this TensorFlow.Keras - MLRun's features. - :param obj: The object to enrich his interface. - :param restoration: Restoration information tuple as returned from 'remove_interface' in order to - add the interface in a certain state. - """ - super(HFORTOptimizerMLRunInterface, cls).add_interface( - obj=obj, restoration=restoration - ) - - @classmethod - def mlrun_optimize(cls): - """ - MLRun's tf.keras.Model.fit wrapper. It will setup the optimizer when using horovod. The optimizer must be - passed in a keyword argument and when using horovod, it must be passed as an Optimizer instance, not a string. - - raise MLRunInvalidArgumentError: In case the optimizer provided did not follow the instructions above. - """ - - def wrapper(self, *args, **kwargs): - save_dir = cls._get_function_argument( - self.optimize, - argument_name="save_dir", - passed_args=args, - passed_kwargs=kwargs, - )[0] - - # Call the original optimize method: - result = self.original_optimize(*args, **kwargs) - - if self._auto_log: - # Log the onnx model: - self._context.log_model( - key="model", - db_key=self._model_name, - model_file=f"{save_dir}/model_optimized.onnx", - tag=self._tag, - framework="ONNX", - labels=self._labels, - extra_data=self._extra_data, - ) - - return result - - return wrapper - - def enable_auto_logging( - self, - context: mlrun.MLClientCtx, - model_name: str = "model", - tag: str = "", - labels: Dict[str, str] = None, - extra_data: dict = None, - ): - self._auto_log = True - - self._context = context - self._model_name = model_name - self._tag = tag - self._labels = labels - self._extra_data = extra_data - - -class HFTrainerMLRunInterface(MLRunInterface, ABC): - """ - Interface for adding MLRun features for tensorflow keras API. - """ - - # MLRuns context default name: - DEFAULT_CONTEXT_NAME = "mlrun-huggingface" - - # Attributes to replace so the MLRun interface will be fully enabled. - _REPLACED_METHODS = [ - "train", - # "evaluate" - ] - - @classmethod - def add_interface( - cls, - obj: Trainer, - restoration: CommonTypes.MLRunInterfaceRestorationType = None, - ): - """ - Enrich the object with this interface properties, methods and functions, so it will have this TensorFlow.Keras - MLRuns features. - :param obj: The object to enrich his interface. - :param restoration: Restoration information tuple as returned from 'remove_interface' in order to - add the interface in a certain state. - """ - - super(HFTrainerMLRunInterface, cls).add_interface( - obj=obj, restoration=restoration - ) - - @classmethod - def mlrun_train(cls): - - """ - MLRuns tf.keras.Model.fit wrapper. It will setup the optimizer when using horovod. The optimizer must be - passed in a keyword argument and when using horovod, it must be passed as an Optimizer instance, not a string. - - raise MLRunInvalidArgumentError: In case the optimizer provided did not follow the instructions above. - """ - - def wrapper(self: Trainer, *args, **kwargs): - # Restore the evaluation method as `train` will use it: - # cls._restore_attribute(obj=self, attribute_name="evaluate") - - # Call the original fit method: - result = self.original_train(*args, **kwargs) - - # Replace the evaluation method again: - # cls._replace_function(obj=self, function_name="evaluate") - - return result - - return wrapper - - -class MLRunCallback(TrainerCallback): - """ - Callback for collecting logs during training / evaluation of the `Trainer` API. - """ - - def __init__( - self, - context: mlrun.MLClientCtx = None, - model_name: str = "model", - tag: str = "", - labels: Dict[str, str] = None, - extra_data: dict = None, - ): - super().__init__() - - # Store the configurations: - self._context = ( - context - if context is not None - else mlrun.get_or_create_ctx("./mlrun-huggingface") - ) - self._model_name = model_name - self._tag = tag - self._labels = labels - self._extra_data = extra_data if extra_data is not None else {} - - # Set up the logging mode: - self._is_training = False - self._steps: List[List[int]] = [] - self._metric_scores: Dict[str, List[float]] = {} - self._artifacts: Dict[str, Artifact] = {} - - def on_epoch_begin( - self, - args: TrainingArguments, - state: TrainerState, - control: TrainerControl, - **kwargs, - ): - self._steps.append([]) - - def on_epoch_end( - self, - args: TrainingArguments, - state: TrainerState, - control: TrainerControl, - **kwargs, - ): - self._log_metrics() - - def on_log( - self, - args: TrainingArguments, - state: TrainerState, - control: TrainerControl, - logs: Dict[str, float] = None, - **kwargs, - ): - recent_logs = state.log_history[-1].copy() - - recent_logs.pop("epoch") - current_step = int(recent_logs.pop("step")) - if current_step not in self._steps[-1]: - self._steps[-1].append(current_step) - - for metric_name, metric_score in recent_logs.items(): - if metric_name.startswith("train_"): - if metric_name.split("train_")[1] not in self._metric_scores: - self._metric_scores[metric_name] = [metric_score] - continue - if metric_name not in self._metric_scores: - self._metric_scores[metric_name] = [] - self._metric_scores[metric_name].append(metric_score) - - def on_train_begin( - self, - args: TrainingArguments, - state: TrainerState, - control: TrainerControl, - **kwargs, - ): - self._is_training = True - - def on_train_end( - self, - args: TrainingArguments, - state: TrainerState, - control: TrainerControl, - model: PreTrainedModel = None, - tokenizer: PreTrainedTokenizer = None, - **kwargs, - ): - self._log_metrics() - - temp_directory = tempfile.gettempdir() - - # Save and log the tokenizer: - if tokenizer is not None: - # Save tokenizer: - tokenizer_dir = os.path.join(temp_directory, "tokenizer") - tokenizer.save_pretrained(save_directory=tokenizer_dir) - # Zip the tokenizer directory: - tokenizer_zip = shutil.make_archive( - base_name="tokenizer", - format="zip", - root_dir=tokenizer_dir, - ) - # Log the zip file: - self._artifacts["tokenizer"] = self._context.log_artifact( - item="tokenizer", local_path=tokenizer_zip - ) - - # Save the model: - model_dir = os.path.join(temp_directory, "model") - model.save_pretrained(save_directory=model_dir) - - # Zip the model directory: - shutil.make_archive( - base_name="model", - format="zip", - root_dir=model_dir, - ) - - # Log the model: - self._context.log_model( - key="model", - db_key=self._model_name, - model_file="model.zip", - tag=self._tag, - framework="Hugging Face", - labels=self._labels, - extra_data={**self._artifacts, **self._extra_data}, - ) - - def on_evaluate( - self, - args: TrainingArguments, - state: TrainerState, - control: TrainerControl, - **kwargs, - ): - self._log_metrics() - - if self._is_training: - return - - # TODO: Update the model object - - def _log_metrics(self): - for metric_name, metric_scores in self._metric_scores.items(): - self._context.log_result(key=metric_name, value=metric_scores[-1]) - if len(metric_scores) > 1: - self._log_metric_plot(name=metric_name, scores=metric_scores) - self._context.commit(completed=False) - - def _log_metric_plot(self, name: str, scores: List[float]): - # Initialize a plotly figure: - metric_figure = go.Figure() - - # Add titles: - metric_figure.update_layout( - title=name.capitalize().replace("_", " "), - xaxis_title="Samples", - yaxis_title="Scores", - ) - - # Draw: - metric_figure.add_trace( - go.Scatter(x=np.arange(len(scores)), y=scores, mode="lines") - ) - - # Create the plotly artifact: - artifact_name = f"{name}_plot" - artifact = PlotlyArtifact(key=artifact_name, figure=metric_figure) - self._artifacts[artifact_name] = self._context.log_artifact(artifact) - - -def _apply_mlrun_on_trainer( - trainer: transformers.Trainer, - model_name: str = None, - tag: str = "", - context: mlrun.MLClientCtx = None, - auto_log: bool = True, - labels: Dict[str, str] = None, - extra_data: dict = None, - **kwargs, -): - # Get parameters defaults: - if context is None: - context = mlrun.get_or_create_ctx(HFTrainerMLRunInterface.DEFAULT_CONTEXT_NAME) - - HFTrainerMLRunInterface.add_interface(obj=trainer) - - if auto_log: - trainer.add_callback( - MLRunCallback( - context=context, - model_name=model_name, - tag=tag, - labels=labels, - extra_data=extra_data, - ) - ) - - -def _apply_mlrun_on_optimizer( - optimizer, - model_name: str = None, - tag: str = "", - context: mlrun.MLClientCtx = None, - auto_log: bool = True, - labels: Dict[str, str] = None, - extra_data: dict = None, - **kwargs, -): - # Get parameters defaults: - if context is None: - context = mlrun.get_or_create_ctx( - HFORTOptimizerMLRunInterface.DEFAULT_CONTEXT_NAME - ) - - HFORTOptimizerMLRunInterface.add_interface(obj=optimizer) - - if auto_log: - optimizer.enable_auto_logging( - context=context, - model_name=model_name, - tag=tag, - labels=labels, - extra_data=extra_data, - ) - - -def apply_mlrun( - huggingface_object, - model_name: str = None, - tag: str = "", - context: mlrun.MLClientCtx = None, - auto_log: bool = True, - labels: Dict[str, str] = None, - extra_data: dict = None, - **kwargs, -): - """ - Wrap the given model with MLRun's interface providing it with mlrun's additional features. - :param huggingface_object: The model to wrap. Can be loaded from the model path given as well. - :param model_name: The model name to use for storing the model artifact. Default: "model". - :param tag: The model's tag to log with. - :param context: MLRun context to work with. If no context is given it will be retrieved via - 'mlrun.get_or_create_ctx(None)' - :param auto_log: Whether to enable MLRun's auto logging. Default: True. - """ - - if isinstance(huggingface_object, transformers.Trainer): - return _apply_mlrun_on_trainer( - trainer=huggingface_object, - model_name=model_name, - tag=tag, - context=context, - auto_log=auto_log, - labels=labels, - extra_data=extra_data, - ) - import optimum.onnxruntime as optimum_ort - - if isinstance(huggingface_object, optimum_ort.ORTOptimizer): - return _apply_mlrun_on_optimizer( - optimizer=huggingface_object, - model_name=model_name, - tag=tag, - context=context, - auto_log=auto_log, - labels=labels, - extra_data=extra_data, - ) - raise mlrun.errors.MLRunInvalidArgumentError - - -# ---------------------- from auto_trainer-------------------------------- -class KWArgsPrefixes: - MODEL_CLASS = "CLASS_" - FIT = "FIT_" - TRAIN = "TRAIN_" - PREDICT = "PREDICT_" - - -def _get_sub_dict_by_prefix(src: Dict, prefix_key: str) -> Dict[str, Any]: - """ - Collect all the keys from the given dict that starts with the given prefix and creates a new dictionary with these - keys. - - :param src: The source dict to extract the values from. - :param prefix_key: Only keys with this prefix will be returned. The keys in the result dict will be without this - prefix. - """ - return { - key.replace(prefix_key, ""): val - for key, val in src.items() - if key.startswith(prefix_key) - } - - -def _get_dataframe( - context: MLClientCtx, - dataset: DataItem, - label_columns: Optional[Union[str, List[str]]] = None, - drop_columns: Union[str, List[str], int, List[int]] = None, -) -> Tuple[pd.DataFrame, Optional[Union[str, List[str]]]]: - """ - Getting the DataFrame of the dataset and drop the columns accordingly. - - :param context: MLRun context. - :param dataset: The dataset to train the model on. - Can be either a list of lists, dict, URI or a FeatureVector. - :param label_columns: The target label(s) of the column(s) in the dataset. for Regression or - Classification tasks. - :param drop_columns: str/int or a list of strings/ints that represent the column names/indices to drop. - """ - if isinstance(dataset, (list, dict)): - dataset = pd.DataFrame(dataset) - # Checking if drop_columns provided by integer type: - if drop_columns: - if isinstance(drop_columns, str) or ( - isinstance(drop_columns, list) - and any(isinstance(col, str) for col in drop_columns) - ): - context.logger.error( - "drop_columns must be an integer/list of integers if not provided with a URI/FeatureVector dataset" - ) - raise ValueError - dataset.drop(drop_columns, axis=1, inplace=True) - - return dataset, label_columns - - store_uri_prefix, _ = mlrun.datastore.parse_store_uri(dataset.artifact_url) - if mlrun.utils.StorePrefix.FeatureVector == store_uri_prefix: - # feature-vector case: - label_columns = label_columns or dataset.meta.status.label_column - dataset = fs.get_offline_features( - dataset.meta.uri, drop_columns=drop_columns - ).to_dataframe() - - context.logger.info(f"label columns: {label_columns}") - else: - # simple URL case: - dataset = dataset.as_df() - if drop_columns: - if all(col in dataset for col in drop_columns): - dataset = dataset.drop(drop_columns, axis=1) - else: - context.logger.info( - "not all of the columns to drop in the dataset, drop columns process skipped" - ) - return dataset, label_columns - - -# ---------------------- Hugging Face Trainer -------------------------------- - - -def _create_compute_metrics(metrics: List[str]) -> Callable[[EvalPrediction], Dict]: - """ - This function create and returns a function that will be used to compute metrics at evaluation. - :param metrics: List of different metrics for evaluate the model such as f1, accuracy etc. - - :returns: Function that will be used to compute metrics at evaluation. - Must take a [`EvalPrediction`] and return a dictionary string to metric values. - """ - - def _compute_metrics(eval_pred): - logits, labels = eval_pred - predictions = np.argmax(logits, axis=-1) - metric_dict_results = {} - for metric in metrics: - load_met = load_metric(metric) - metric_res = load_met.compute(predictions=predictions, references=labels)[ - metric - ] - metric_dict_results[metric] = metric_res - - return metric_dict_results - - return _compute_metrics - - -def _edit_columns( - dataset: Dataset, - drop_columns: List[str] = None, - rename_columns: [str, str] = None, -) -> Dataset: - """ - Drop and renames that columns of the given dataset - :param dataset: Dataset to process - :param drop_columns: The columns to drop from the dataset. - :param rename_columns: Dict of columns ro rename : {: , ...} - - :returns: The dataset after the desired process - """ - if drop_columns: - dataset = dataset.remove_columns(drop_columns) - if rename_columns: - dataset = dataset.rename_columns(rename_columns) - return dataset - - -def _prepare_dataset( - context: MLClientCtx, - dataset_name: str, - label_name: str = None, - drop_columns: Optional[List[str]] = None, - num_of_train_samples: int = None, - train_test_split_size: float = None, - random_state: int = None, -) -> Tuple[Dataset, Dataset]: - """ - Loading the dataset and editing the columns - - :param context: MLRun contex - :param dataset_name: The name of the dataset to get from the HuggingFace hub - :param label_name: The target label of the column in the dataset. - :param drop_columns: The columns to drop from the dataset. - :param num_of_train_samples: Max number of training samples, for debugging. - :param train_test_split_size: Should be between 0.0 and 1.0 and represent the proportion of the dataset to include - in the test split. - :param random_state: Random state for train_test_split - - """ - - context.logger.info( - f"Loading and editing {dataset_name} dataset from Hugging Face hub" - ) - rename_cols = {label_name: "labels"} - - # Loading and editing dataset: - dataset = load_dataset(dataset_name) - - # train set - train_dataset = dataset["train"] - if num_of_train_samples: - train_dataset = train_dataset.shuffle(seed=random_state).select( - list(range(num_of_train_samples)) - ) - train_dataset = _edit_columns(train_dataset, drop_columns, rename_cols) - - # test set - test_dataset = dataset["test"] - if train_test_split_size or num_of_train_samples: - train_test_split_size = train_test_split_size or 0.2 - num_of_test_samples = int( - (train_dataset.num_rows * train_test_split_size) - // (1 - train_test_split_size) - ) - test_dataset = test_dataset.shuffle(seed=random_state).select( - list(range(num_of_test_samples)) - ) - test_dataset = _edit_columns(test_dataset, drop_columns, rename_cols) - - return train_dataset, test_dataset - - -def train( - context: MLClientCtx, - hf_dataset: str = None, - dataset: DataItem = None, - test_set: DataItem = None, - drop_columns: Optional[List[str]] = None, - pretrained_tokenizer: str = None, - pretrained_model: str = None, - model_class: str = None, - model_name: str = "huggingface-model", - label_name: str = "labels", - text_col: str = "text", - num_of_train_samples: int = None, - train_test_split_size: float = None, - metrics: List[str] = None, - random_state: int = None, -): - """ - Training and evaluating a pretrained model with a pretrained tokenizer over a dataset. - The dataset can be either be the name of the dataset that contains in the HuggingFace hub, - or a URI or a FeatureVector - - :param context: MLRun context - :param hf_dataset: The name of the dataset to get from the HuggingFace hub - :param dataset: The dataset to train the model on. Can be either a URI or a FeatureVector - :param test_set: The test set to train the model with. - :param drop_columns: The columns to drop from the dataset. - :param pretrained_tokenizer: The name of the pretrained tokenizer from the HuggingFace hub. - :param pretrained_model: The name of the pretrained model from the HuggingFace hub. - :param model_name: The model's name to use for storing the model artifact, default to 'model' - :param model_class: The class of the model, e.g. `transformers.AutoModelForSequenceClassification` - :param label_name: The target label of the column in the dataset. - :param text_col: The input text column un the dataset. - :param num_of_train_samples: Max number of training samples, for debugging. - :param train_test_split_size: Should be between 0.0 and 1.0 and represent the proportion of the dataset to include - in the test split. - :param metrics: List of different metrics for evaluate the model such as f1, accuracy etc. - :param random_state: Random state for train_test_split - """ - - if train_test_split_size is None and test_set is None: - context.logger.info( - "'train_test_split_size' is not provided, setting train_test_split_size to 0.2" - ) - train_test_split_size = 0.2 - - # Creating tokenizer: - tokenizer = AutoTokenizer.from_pretrained(pretrained_tokenizer) - - def preprocess_function(examples): - return tokenizer(examples[text_col], truncation=True) - - # prepare data for training - if hf_dataset: - train_dataset, test_dataset = _prepare_dataset( - context, - hf_dataset, - label_name, - drop_columns, - num_of_train_samples, - train_test_split_size, - random_state=random_state, - ) - elif dataset: - # Get DataFrame by URL or by FeatureVector: - train_dataset, label_name = _get_dataframe( - context=context, - dataset=dataset, - label_columns=label_name, - drop_columns=drop_columns, - ) - if test_set: - test_dataset, _ = _get_dataframe( - context=context, - dataset=test_set, - label_columns=label_name, - drop_columns=drop_columns, - ) - else: - train_dataset, test_dataset = train_test_split( - train_dataset, - test_size=train_test_split_size, - random_state=random_state, - ) - train_dataset = Dataset.from_pandas(train_dataset) - test_dataset = Dataset.from_pandas(test_dataset) - else: - raise mlrun.errors.MLRunInvalidArgumentError( - "Training data was not provided. A training dataset is mandatory for training." - " Please provide a training set using one of the arguments 'hf_dataset' or 'dataset'." - ) - - # Mapping datasets with the tokenizer: - tokenized_train = train_dataset.map(preprocess_function, batched=True) - tokenized_test = test_dataset.map(preprocess_function, batched=True) - - # Creating data collator for batching: - data_collator = DataCollatorWithPadding(tokenizer=tokenizer) - - # Parsing kwargs: - train_kwargs = _get_sub_dict_by_prefix( - src=context.parameters, prefix_key=KWArgsPrefixes.TRAIN - ) - model_class_kwargs = _get_sub_dict_by_prefix( - src=context.parameters, prefix_key=KWArgsPrefixes.MODEL_CLASS - ) - - # Loading our pretrained model: - model_class_kwargs["pretrained_model_name_or_path"] = ( - model_class_kwargs.get("pretrained_model_name_or_path") or pretrained_model - ) - train_kwargs["hub_token"] = train_kwargs.get("hub_token") or pretrained_tokenizer - if not model_class_kwargs["pretrained_model_name_or_path"]: - raise mlrun.errors.MLRunRuntimeError( - "Must provide pretrained_model name as " - "function argument or in extra params" - ) - model = create_class(model_class).from_pretrained(**model_class_kwargs) - - # Preparing training arguments: - training_args = TrainingArguments( - **train_kwargs, - ) - - compute_metrics = _create_compute_metrics(metrics) if metrics else None - trainer = Trainer( - model=model, - args=training_args, - train_dataset=tokenized_train, - eval_dataset=tokenized_test, - tokenizer=tokenizer, - data_collator=data_collator, - compute_metrics=compute_metrics, - ) - - apply_mlrun(trainer, model_name=model_name) - - # Apply training with evaluation: - context.logger.info(f"training '{model_name}'") - trainer.train() - - -def _get_model_dir(model_uri: str): - model_file, _, _ = mlrun.artifacts.get_model(model_uri) - model_dir = tempfile.gettempdir() - # Unzip the Model: - with zipfile.ZipFile(model_file, "r") as zip_file: - zip_file.extractall(model_dir) - - return model_dir - - -def optimize( - model_path: str, - model_name: str = "optimized_model", - target_dir: str = "./optimized", - optimization_level: int = 1, -): - """ - Optimizing the transformer model using ONNX optimization. - - - :param model_path: The path of the model to optimize. - :param model_name: Name of the optimized model. - :param target_dir: The directory to save the ONNX model. - :param optimization_level: Optimization level performed by ONNX Runtime of the loaded graph. (default is 1) - """ - # We import these in the function scope so ONNX won't be mandatory for the other handlers: - from optimum.onnxruntime import ORTModelForSequenceClassification, ORTOptimizer - from optimum.onnxruntime.configuration import OptimizationConfig - - model_dir = _get_model_dir(model_uri=model_path) - # Creating configuration for optimization step: - optimization_config = OptimizationConfig(optimization_level=optimization_level) - - # Converting our pretrained model to an ONNX-Runtime model: - ort_model = ORTModelForSequenceClassification.from_pretrained( - model_dir, from_transformers=True - ) - - # Creating an ONNX-Runtime optimizer from ONNX model: - optimizer = ORTOptimizer.from_pretrained(ort_model) - - apply_mlrun(optimizer, model_name=model_name) - # Optimizing and saving the ONNX model: - optimizer.optimize(save_dir=target_dir, optimization_config=optimization_config) diff --git a/hugging_face_classifier_trainer/item.yaml b/hugging_face_classifier_trainer/item.yaml deleted file mode 100755 index 3c0877659..000000000 --- a/hugging_face_classifier_trainer/item.yaml +++ /dev/null @@ -1,31 +0,0 @@ -apiVersion: v1 -categories: -- machine-learning -- model-training -description: Automatic train and optimize functions for HuggingFace framework -doc: '' -example: hugging_face_classifier_trainer.ipynb -generationDate: 2022-08-28:17-25 -hidden: false -icon: '' -labels: - author: davids -maintainers: [] -marketplaceType: '' -mlrunVersion: 1.6.1 -name: hugging_face_classifier_trainer -platformVersion: 3.5.5 -spec: - filename: hugging_face_classifier_trainer.py - handler: train - image: mlrun/mlrun - kind: job - requirements: - - onnx~=1.14.1 - - onnxruntime~=1.16.1 - - optimum~=1.6.4 - - transformers~=4.26.1 - - datasets~=2.10.1 - - scikit-learn~=1.0.2 -url: '' -version: 0.2.0 diff --git a/hugging_face_classifier_trainer/requirements.txt b/hugging_face_classifier_trainer/requirements.txt deleted file mode 100644 index 9d0db7b43..000000000 --- a/hugging_face_classifier_trainer/requirements.txt +++ /dev/null @@ -1,6 +0,0 @@ -onnx~=1.14.1 -onnxruntime~=1.16.1 -optimum~=1.6.4 -transformers~=4.26.1 -datasets~=2.10.1 -scikit-learn~=1.0.2 \ No newline at end of file diff --git a/hugging_face_classifier_trainer/test_hugging_face_classifier_trainer.py b/hugging_face_classifier_trainer/test_hugging_face_classifier_trainer.py deleted file mode 100644 index a5e0fee9b..000000000 --- a/hugging_face_classifier_trainer/test_hugging_face_classifier_trainer.py +++ /dev/null @@ -1,145 +0,0 @@ -# Copyright 2019 Iguazio -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -import os - -import mlrun -import pytest -from mlrun import import_function - -REQUIRED_ENV_VARS = [ - "MLRUN_DBPATH", - "MLRUN_ARTIFACT_PATH", - "V3IO_USERNAME", - "V3IO_API", - "V3IO_ACCESS_KEY", -] - -ADDITIONAL_PARAM_FOR_TRAIN = { - "TRAIN_output_dir": "finetuning-sentiment-model-3000-samples", - "TRAIN_learning_rate": 2e-5, - "TRAIN_per_device_train_batch_size": 16, - "TRAIN_per_device_eval_batch_size": 16, - "TRAIN_num_train_epochs": 2, - "TRAIN_weight_decay": 0.01, - "TRAIN_push_to_hub": False, - "TRAIN_evaluation_strategy": "epoch", - "TRAIN_eval_steps": 1, - "TRAIN_logging_steps": 1, - "CLASS_num_labels": 2, -} - - -def _validate_environment_variables() -> bool: - """ - Checks that all required Environment variables are set. - """ - environment_keys = os.environ.keys() - return all(key in environment_keys for key in REQUIRED_ENV_VARS) - - -def _set_environment(env_file=None): - if env_file: - mlrun.set_env_from_file(env_file) - mlrun.get_or_create_project( - "hugging-face-classifier-trainer-test", context="./", user_project=True - ) - - -@pytest.mark.skipif( - condition=not _validate_environment_variables(), - reason="Project's environment variables are not set", -) -def test_train_sequence_classification(): - _set_environment() - - # Importing function: - fn = import_function("function.yaml") - - train_run = None - - try: - train_run = fn.run( - params={ - "hf_dataset": "Shayanvsf/US_Airline_Sentiment", - "drop_columns": [ - "airline_sentiment_confidence", - "negativereason_confidence", - ], - "pretrained_tokenizer": "distilbert-base-uncased", - "pretrained_model": "distilbert-base-uncased", - "model_class": "transformers.AutoModelForSequenceClassification", - "label_name": "airline_sentiment", - "num_of_train_samples": 100, - "metrics": ["accuracy", "f1"], - "random_state": 42, - **ADDITIONAL_PARAM_FOR_TRAIN, - }, - handler="train", - local=True, - ) - except Exception as exception: - print(f"- The test failed - raised the following error:\n- {exception}") - assert train_run and all( - key in train_run.outputs for key in ["model", "loss"] - ), "outputs should include more data" - - -@pytest.mark.skipif( - condition=not _validate_environment_variables(), - reason="Project's environment variables are not set", -) -def test_train_and_optimize_sequence_classification(): - _set_environment() - - # Importing function: - fn = import_function("function.yaml") - - train_run = None - optimize_run = None - - try: - train_run = fn.run( - params={ - "hf_dataset": "Shayanvsf/US_Airline_Sentiment", - "drop_columns": [ - "airline_sentiment_confidence", - "negativereason_confidence", - ], - "pretrained_tokenizer": "distilbert-base-uncased", - "pretrained_model": "distilbert-base-uncased", - "model_class": "transformers.AutoModelForSequenceClassification", - "label_name": "airline_sentiment", - "num_of_train_samples": 100, - "metrics": ["accuracy", "f1"], - "random_state": 42, - **ADDITIONAL_PARAM_FOR_TRAIN, - }, - handler="train", - local=True, - ) - - optimize_run = fn.run( - params={"model_path": train_run.outputs["model"]}, - handler="optimize", - local=True, - ) - except Exception as exception: - print(f"- The test failed - raised the following error:\n- {exception}") - assert train_run and all( - key in train_run.outputs for key in ["model", "loss"] - ), "outputs should include more data" - assert optimize_run and all( - key in optimize_run.outputs for key in ["model"] - ), "outputs should include more data" diff --git a/huggingface_auto_trainer/function.yaml b/huggingface_auto_trainer/function.yaml deleted file mode 100644 index eff09b4cf..000000000 --- a/huggingface_auto_trainer/function.yaml +++ /dev/null @@ -1,349 +0,0 @@ -kind: job -metadata: - name: huggingface-auto-trainer - tag: '' - hash: 4459f0b675c36a20c8f542126a96b98b0ac82271 - project: '' - labels: - author: Zeevr - categories: - - machine-learning - - model-training -spec: - command: '' - args: [] - image: mlrun/mlrun - build: - functionSourceCode: aW1wb3J0IGltcG9ydGxpYgppbXBvcnQgb3MKaW1wb3J0IHNodXRpbAppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHppcGZpbGUKZnJvbSBhYmMgaW1wb3J0IEFCQwpmcm9tIHR5cGluZyBpbXBvcnQgRGljdCwgTGlzdCwgVHVwbGUsIFVuaW9uCgppbXBvcnQgbWxydW4KaW1wb3J0IG51bXB5IGFzIG5wCmltcG9ydCBwYW5kYXMgYXMgcGQKaW1wb3J0IHBlZnQKaW1wb3J0IHRvcmNoCmltcG9ydCB0cmFuc2Zvcm1lcnMKZnJvbSBkYXRhc2V0cyBpbXBvcnQgRGF0YXNldCwgbG9hZF9kYXRhc2V0CmZyb20gbWxydW4uYXJ0aWZhY3RzLm1hbmFnZXIgaW1wb3J0IEFydGlmYWN0LCBQbG90bHlBcnRpZmFjdApmcm9tIG1scnVuLmRhdGFzdG9yZSBpbXBvcnQgaXNfc3RvcmVfdXJpCmZyb20gbWxydW4uZnJhbWV3b3Jrcy5fY29tbW9uIGltcG9ydCBDb21tb25UeXBlcywgTUxSdW5JbnRlcmZhY2UKZnJvbSBtbHJ1bi51dGlscyBpbXBvcnQgbG9nZ2VyCmZyb20gcGVmdCBpbXBvcnQgKExvcmFDb25maWcsIFBlZnRNb2RlbCwgZ2V0X3BlZnRfbW9kZWwsCiAgICAgICAgICAgICAgICAgIHByZXBhcmVfbW9kZWxfZm9yX2tiaXRfdHJhaW5pbmcpCmZyb20gcGxvdGx5IGltcG9ydCBncmFwaF9vYmplY3RzIGFzIGdvCmZyb20gdHJhbnNmb3JtZXJzIGltcG9ydCAoQXV0b01vZGVsRm9yQ2F1c2FsTE0sIEF1dG9Ub2tlbml6ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgQml0c0FuZEJ5dGVzQ29uZmlnLCBEYXRhQ29sbGF0b3JGb3JMYW5ndWFnZU1vZGVsaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgIFByZVRyYWluZWRNb2RlbCwgUHJlVHJhaW5lZFRva2VuaXplciwgVHJhaW5lciwKICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFpbmVyQ2FsbGJhY2ssIFRyYWluZXJDb250cm9sLCBUcmFpbmVyU3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhaW5pbmdBcmd1bWVudHMpCgpzdXBwb3J0ZWRfdGFza3MgPSBbCiAgICAicXVlc3Rpb24tYW5zd2VyaW5nIiwKICAgICJzdW1tYXJpemF0aW9uIiwKICAgICJ0YWJsZS1xdWVzdGlvbi1hbnN3ZXJpbmciLAogICAgInRleHQydGV4dC1nZW5lcmF0aW9uIiwKICAgICJ0ZXh0LWNsYXNzaWZpY2F0aW9uIiwKICAgICJzZW50aW1lbnQtYW5hbHlzaXMiLAogICAgInRleHQtZ2VuZXJhdGlvbiIsCiAgICAidG9rZW4tY2xhc3NpZmljYXRpb24iLAogICAgInRyYW5zbGF0aW9uIiwKICAgICJ0cmFuc2xhdGlvbl94eF90b195eSIsCl0KCgpjbGFzcyBDb25maWdLZXlzOgogICAgZGVlcHNwZWVkID0gImRlZXBzcGVlZCIKICAgIHF1YW50aXphdGlvbiA9ICJxdWFudGl6YXRpb24iCiAgICBsb3JhID0gImxvcmEiCiAgICB0cmFpbmluZyA9ICJ0cmFpbmluZyIKICAgIHRva2VuaXplcl9wcmV0cmFpbmVkID0gInRva2VuaXplcl9wcmV0cmFpbmVkIgogICAgbW9kZWxfcHJldHJhaW5lZCA9ICJtb2RlbF9wcmV0cmFpbmVkIgogICAgZGF0YV9jb2xsYXRvciA9ICJkYXRhX2NvbGxhdG9yIgoKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLWZyb20gTUxSVU4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpjbGFzcyBIRlRyYWluZXJNTFJ1bkludGVyZmFjZShNTFJ1bkludGVyZmFjZSwgQUJDKToKICAgICIiIgogICAgVGhpcyBpcyB0ZW1wb3JhcnkgYW5kIHdpbGwgYmUgYnVpbHQgaW4gbWxydW4gMS41LjAKICAgIEludGVyZmFjZSBmb3IgYWRkaW5nIE1MUnVuIGZlYXR1cmVzIGZvciB0ZW5zb3JmbG93IGtlcmFzIEFQSS4KICAgICIiIgoKICAgICMgTUxSdW5zIGNvbnRleHQgZGVmYXVsdCBuYW1lOgogICAgREVGQVVMVF9DT05URVhUX05BTUUgPSAibWxydW4taHVnZ2luZ2ZhY2UiCgogICAgIyBBdHRyaWJ1dGVzIHRvIHJlcGxhY2Ugc28gdGhlIE1MUnVuIGludGVyZmFjZSB3aWxsIGJlIGZ1bGx5IGVuYWJsZWQuCiAgICBfUkVQTEFDRURfTUVUSE9EUyA9IFsKICAgICAgICAidHJhaW4iLAogICAgICAgICMgImV2YWx1YXRlIgogICAgXQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGFkZF9pbnRlcmZhY2UoCiAgICAgICAgY2xzLAogICAgICAgIG9iajogVHJhaW5lciwKICAgICAgICByZXN0b3JhdGlvbjogQ29tbW9uVHlwZXMuTUxSdW5JbnRlcmZhY2VSZXN0b3JhdGlvblR5cGUgPSBOb25lLAogICAgKToKICAgICAgICBzdXBlcihIRlRyYWluZXJNTFJ1bkludGVyZmFjZSwgY2xzKS5hZGRfaW50ZXJmYWNlKAogICAgICAgICAgICBvYmo9b2JqLCByZXN0b3JhdGlvbj1yZXN0b3JhdGlvbgogICAgICAgICkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBtbHJ1bl90cmFpbihjbHMpOgogICAgICAgIGRlZiB3cmFwcGVyKHNlbGY6IFRyYWluZXIsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgICAgICMgUmVzdG9yZSB0aGUgZXZhbHVhdGlvbiBtZXRob2QgYXMgYHRyYWluYCB3aWxsIHVzZSBpdDoKICAgICAgICAgICAgIyBjbHMuX3Jlc3RvcmVfYXR0cmlidXRlKG9iaj1zZWxmLCBhdHRyaWJ1dGVfbmFtZT0iZXZhbHVhdGUiKQoKICAgICAgICAgICAgIyBDYWxsIHRoZSBvcmlnaW5hbCBmaXQgbWV0aG9kOgogICAgICAgICAgICByZXN1bHQgPSBzZWxmLm9yaWdpbmFsX3RyYWluKCphcmdzLCAqKmt3YXJncykKCiAgICAgICAgICAgICMgUmVwbGFjZSB0aGUgZXZhbHVhdGlvbiBtZXRob2QgYWdhaW46CiAgICAgICAgICAgICMgY2xzLl9yZXBsYWNlX2Z1bmN0aW9uKG9iaj1zZWxmLCBmdW5jdGlvbl9uYW1lPSJldmFsdWF0ZSIpCgogICAgICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgICAgIHJldHVybiB3cmFwcGVyCgoKY2xhc3MgTUxSdW5DYWxsYmFjayhUcmFpbmVyQ2FsbGJhY2spOgogICAgIiIiCiAgICBUaGlzIGlzIHRlbXBvcmFyeSBhbmQgd2lsbCBiZSBidWlsdCBpbiBtbHJ1biAxLjUuMAogICAgQ2FsbGJhY2sgZm9yIGNvbGxlY3RpbmcgbG9ncyBkdXJpbmcgdHJhaW5pbmcgLyBldmFsdWF0aW9uIG9mIHRoZSBgVHJhaW5lcmAgQVBJLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKAogICAgICAgIHNlbGYsCiAgICAgICAgY29udGV4dDogbWxydW4uTUxDbGllbnRDdHggPSBOb25lLAogICAgICAgIG1vZGVsX25hbWU6IHN0ciA9ICJtb2RlbCIsCiAgICAgICAgdGFnOiBzdHIgPSAiIiwKICAgICAgICBsYWJlbHM6IERpY3Rbc3RyLCBzdHJdID0gTm9uZSwKICAgICAgICBleHRyYV9kYXRhOiBkaWN0ID0gTm9uZSwKICAgICk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCgogICAgICAgICMgU3RvcmUgdGhlIGNvbmZpZ3VyYXRpb25zOgogICAgICAgIHNlbGYuX2NvbnRleHQgPSAoCiAgICAgICAgICAgIGNvbnRleHQKICAgICAgICAgICAgaWYgY29udGV4dCBpcyBub3QgTm9uZQogICAgICAgICAgICBlbHNlIG1scnVuLmdldF9vcl9jcmVhdGVfY3R4KCIuL21scnVuLWh1Z2dpbmdmYWNlIikKICAgICAgICApCiAgICAgICAgc2VsZi5fbW9kZWxfbmFtZSA9IG1vZGVsX25hbWUKICAgICAgICBzZWxmLl90YWcgPSB0YWcKICAgICAgICBzZWxmLl9sYWJlbHMgPSBsYWJlbHMKICAgICAgICBzZWxmLl9leHRyYV9kYXRhID0gZXh0cmFfZGF0YSBpZiBleHRyYV9kYXRhIGlzIG5vdCBOb25lIGVsc2Uge30KCiAgICAgICAgIyBTZXQgdXAgdGhlIGxvZ2dpbmcgbW9kZToKICAgICAgICBzZWxmLl9pc190cmFpbmluZyA9IEZhbHNlCiAgICAgICAgc2VsZi5fc3RlcHM6IExpc3RbTGlzdFtpbnRdXSA9IFtdCiAgICAgICAgc2VsZi5fbWV0cmljX3Njb3JlczogRGljdFtzdHIsIExpc3RbZmxvYXRdXSA9IHt9CiAgICAgICAgc2VsZi5fYXJ0aWZhY3RzOiBEaWN0W3N0ciwgQXJ0aWZhY3RdID0ge30KCiAgICBkZWYgb25fZXBvY2hfYmVnaW4oCiAgICAgICAgc2VsZiwKICAgICAgICBhcmdzOiBUcmFpbmluZ0FyZ3VtZW50cywKICAgICAgICBzdGF0ZTogVHJhaW5lclN0YXRlLAogICAgICAgIGNvbnRyb2w6IFRyYWluZXJDb250cm9sLAogICAgICAgICoqa3dhcmdzLAogICAgKToKICAgICAgICBpZiBub3Qgc3RhdGUuaXNfd29ybGRfcHJvY2Vzc196ZXJvOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBzZWxmLl9zdGVwcy5hcHBlbmQoW10pCgogICAgZGVmIG9uX2Vwb2NoX2VuZCgKICAgICAgICBzZWxmLAogICAgICAgIGFyZ3M6IFRyYWluaW5nQXJndW1lbnRzLAogICAgICAgIHN0YXRlOiBUcmFpbmVyU3RhdGUsCiAgICAgICAgY29udHJvbDogVHJhaW5lckNvbnRyb2wsCiAgICAgICAgKiprd2FyZ3MsCiAgICApOgogICAgICAgIGlmIG5vdCBzdGF0ZS5pc193b3JsZF9wcm9jZXNzX3plcm86CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNlbGYubG9nX21ldHJpY3MoKQoKICAgIGRlZiBvbl9sb2coCiAgICAgICAgc2VsZiwKICAgICAgICBhcmdzOiBUcmFpbmluZ0FyZ3VtZW50cywKICAgICAgICBzdGF0ZTogVHJhaW5lclN0YXRlLAogICAgICAgIGNvbnRyb2w6IFRyYWluZXJDb250cm9sLAogICAgICAgIGxvZ3M6IERpY3Rbc3RyLCBmbG9hdF0gPSBOb25lLAogICAgICAgICoqa3dhcmdzLAogICAgKToKICAgICAgICBpZiBub3Qgc3RhdGUuaXNfd29ybGRfcHJvY2Vzc196ZXJvOgogICAgICAgICAgICByZXR1cm4KICAgICAgICByZWNlbnRfbG9ncyA9IHN0YXRlLmxvZ19oaXN0b3J5Wy0xXS5jb3B5KCkKCiAgICAgICAgcmVjZW50X2xvZ3MucG9wKCJlcG9jaCIpCiAgICAgICAgY3VycmVudF9zdGVwID0gaW50KHJlY2VudF9sb2dzLnBvcCgic3RlcCIpKQogICAgICAgIGlmIGN1cnJlbnRfc3RlcCBub3QgaW4gc2VsZi5fc3RlcHNbLTFdOgogICAgICAgICAgICBzZWxmLl9zdGVwc1stMV0uYXBwZW5kKGN1cnJlbnRfc3RlcCkKCiAgICAgICAgZm9yIG1ldHJpY19uYW1lLCBtZXRyaWNfc2NvcmUgaW4gcmVjZW50X2xvZ3MuaXRlbXMoKToKICAgICAgICAgICAgaWYgbWV0cmljX25hbWUuc3RhcnRzd2l0aCgidHJhaW5fIik6CiAgICAgICAgICAgICAgICBpZiBtZXRyaWNfbmFtZS5zcGxpdCgidHJhaW5fIilbMV0gbm90IGluIHNlbGYuX21ldHJpY19zY29yZXM6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fbWV0cmljX3Njb3Jlc1ttZXRyaWNfbmFtZV0gPSBbbWV0cmljX3Njb3JlXQogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgbWV0cmljX25hbWUgbm90IGluIHNlbGYuX21ldHJpY19zY29yZXM6CiAgICAgICAgICAgICAgICBzZWxmLl9tZXRyaWNfc2NvcmVzW21ldHJpY19uYW1lXSA9IFtdCiAgICAgICAgICAgIHNlbGYuX21ldHJpY19zY29yZXNbbWV0cmljX25hbWVdLmFwcGVuZChtZXRyaWNfc2NvcmUpCgogICAgZGVmIG9uX3RyYWluX2JlZ2luKAogICAgICAgIHNlbGYsCiAgICAgICAgYXJnczogVHJhaW5pbmdBcmd1bWVudHMsCiAgICAgICAgc3RhdGU6IFRyYWluZXJTdGF0ZSwKICAgICAgICBjb250cm9sOiBUcmFpbmVyQ29udHJvbCwKICAgICAgICAqKmt3YXJncywKICAgICk6CiAgICAgICAgaWYgbm90IHN0YXRlLmlzX3dvcmxkX3Byb2Nlc3NfemVybzoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5faXNfdHJhaW5pbmcgPSBUcnVlCgogICAgZGVmIG9uX3RyYWluX2VuZCgKICAgICAgICBzZWxmLAogICAgICAgIGFyZ3M6IFRyYWluaW5nQXJndW1lbnRzLAogICAgICAgIHN0YXRlOiBUcmFpbmVyU3RhdGUsCiAgICAgICAgY29udHJvbDogVHJhaW5lckNvbnRyb2wsCiAgICAgICAgbW9kZWw6IFByZVRyYWluZWRNb2RlbCA9IE5vbmUsCiAgICAgICAgdG9rZW5pemVyOiBQcmVUcmFpbmVkVG9rZW5pemVyID0gTm9uZSwKICAgICAgICAqKmt3YXJncywKICAgICk6CiAgICAgICAgaWYgbm90IHN0YXRlLmlzX3dvcmxkX3Byb2Nlc3NfemVybzoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5sb2dfbWV0cmljcygpCgogICAgZGVmIG9uX2V2YWx1YXRlKAogICAgICAgIHNlbGYsCiAgICAgICAgYXJnczogVHJhaW5pbmdBcmd1bWVudHMsCiAgICAgICAgc3RhdGU6IFRyYWluZXJTdGF0ZSwKICAgICAgICBjb250cm9sOiBUcmFpbmVyQ29udHJvbCwKICAgICAgICAqKmt3YXJncywKICAgICk6CiAgICAgICAgaWYgbm90IHN0YXRlLmlzX3dvcmxkX3Byb2Nlc3NfemVybzoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5sb2dfbWV0cmljcygpCgogICAgICAgIGlmIHNlbGYuX2lzX3RyYWluaW5nOgogICAgICAgICAgICByZXR1cm4KCiAgICBkZWYgbG9nX21ldHJpY3Moc2VsZik6CiAgICAgICAgZm9yIG1ldHJpY19uYW1lLCBtZXRyaWNfc2NvcmVzIGluIHNlbGYuX21ldHJpY19zY29yZXMuaXRlbXMoKToKICAgICAgICAgICAgc2VsZi5fY29udGV4dC5sb2dfcmVzdWx0KGtleT1tZXRyaWNfbmFtZSwgdmFsdWU9bWV0cmljX3Njb3Jlc1stMV0pCiAgICAgICAgICAgIGlmIGxlbihtZXRyaWNfc2NvcmVzKSA+IDE6CiAgICAgICAgICAgICAgICBzZWxmLmxvZ19tZXRyaWNfcGxvdChuYW1lPW1ldHJpY19uYW1lLCBzY29yZXM9bWV0cmljX3Njb3JlcykKICAgICAgICBzZWxmLl9jb250ZXh0LmNvbW1pdChjb21wbGV0ZWQ9RmFsc2UpCgogICAgZGVmIGxvZ19tZXRyaWNfcGxvdChzZWxmLCBuYW1lOiBzdHIsIHNjb3JlczogTGlzdFtmbG9hdF0pOgogICAgICAgICMgSW5pdGlhbGl6ZSBhIHBsb3RseSBmaWd1cmU6CiAgICAgICAgbWV0cmljX2ZpZ3VyZSA9IGdvLkZpZ3VyZSgpCgogICAgICAgICMgQWRkIHRpdGxlczoKICAgICAgICBtZXRyaWNfZmlndXJlLnVwZGF0ZV9sYXlvdXQoCiAgICAgICAgICAgIHRpdGxlPW5hbWUuY2FwaXRhbGl6ZSgpLnJlcGxhY2UoIl8iLCAiICIpLAogICAgICAgICAgICB4YXhpc190aXRsZT0iU2FtcGxlcyIsCiAgICAgICAgICAgIHlheGlzX3RpdGxlPSJTY29yZXMiLAogICAgICAgICkKCiAgICAgICAgIyBEcmF3OgogICAgICAgIG1ldHJpY19maWd1cmUuYWRkX3RyYWNlKAogICAgICAgICAgICBnby5TY2F0dGVyKHg9bnAuYXJhbmdlKGxlbihzY29yZXMpKSwgeT1zY29yZXMsIG1vZGU9ImxpbmVzIikKICAgICAgICApCgogICAgICAgICMgQ3JlYXRlIHRoZSBwbG90bHkgYXJ0aWZhY3Q6CiAgICAgICAgYXJ0aWZhY3RfbmFtZSA9IGYie25hbWV9X3Bsb3QiCiAgICAgICAgYXJ0aWZhY3QgPSBQbG90bHlBcnRpZmFjdChrZXk9YXJ0aWZhY3RfbmFtZSwgZmlndXJlPW1ldHJpY19maWd1cmUpCiAgICAgICAgc2VsZi5fYXJ0aWZhY3RzW2FydGlmYWN0X25hbWVdID0gc2VsZi5fY29udGV4dC5sb2dfYXJ0aWZhY3QoYXJ0aWZhY3QpCgoKZGVmIGFwcGx5X21scnVuKAogICAgdHJhaW5lcjogdHJhbnNmb3JtZXJzLlRyYWluZXIsCiAgICBtb2RlbF9uYW1lOiBzdHIgPSBOb25lLAogICAgdGFnOiBzdHIgPSAiIiwKICAgIGNvbnRleHQ6IG1scnVuLk1MQ2xpZW50Q3R4ID0gTm9uZSwKICAgIGF1dG9fbG9nOiBib29sID0gVHJ1ZSwKICAgIGxhYmVsczogRGljdFtzdHIsIHN0cl0gPSBOb25lLAogICAgZXh0cmFfZGF0YTogZGljdCA9IE5vbmUsCiAgICAqKmt3YXJncywKKToKICAgICIiIgogICAgVGhpcyBpcyB0ZW1wb3JhcnkgYW5kIHdpbGwgYmUgYnVpbHQgaW4gbWxydW4gMS41LjAKICAgICIiIgogICAgIyBHZXQgcGFyYW1ldGVycyBkZWZhdWx0czoKICAgIGlmIGNvbnRleHQgaXMgTm9uZToKICAgICAgICBjb250ZXh0ID0gbWxydW4uZ2V0X29yX2NyZWF0ZV9jdHgoSEZUcmFpbmVyTUxSdW5JbnRlcmZhY2UuREVGQVVMVF9DT05URVhUX05BTUUpCgogICAgSEZUcmFpbmVyTUxSdW5JbnRlcmZhY2UuYWRkX2ludGVyZmFjZShvYmo9dHJhaW5lcikKCiAgICBpZiBhdXRvX2xvZzoKICAgICAgICB0cmFpbmVyLmFkZF9jYWxsYmFjaygKICAgICAgICAgICAgTUxSdW5DYWxsYmFjaygKICAgICAgICAgICAgICAgIGNvbnRleHQ9Y29udGV4dCwKICAgICAgICAgICAgICAgIG1vZGVsX25hbWU9bW9kZWxfbmFtZSwKICAgICAgICAgICAgICAgIHRhZz10YWcsCiAgICAgICAgICAgICAgICBsYWJlbHM9bGFiZWxzLAogICAgICAgICAgICAgICAgZXh0cmFfZGF0YT1leHRyYV9kYXRhLAogICAgICAgICAgICApCiAgICAgICAgKQoKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLWVuZCBmcm9tIE1MUlVOLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgpkZWYgX3ByaW50X3RyYWluYWJsZV9wYXJhbWV0ZXJzKG1vZGVsKToKICAgICIiIgogICAgUHJpbnRzIHRoZSBudW1iZXIgb2YgdHJhaW5hYmxlIHBhcmFtZXRlcnMgaW4gdGhlIG1vZGVsLgogICAgIiIiCiAgICB0cmFpbmFibGVfcGFyYW1zID0gMAogICAgYWxsX3BhcmFtID0gMAogICAgZm9yIF8sIHBhcmFtIGluIG1vZGVsLm5hbWVkX3BhcmFtZXRlcnMoKToKICAgICAgICBhbGxfcGFyYW0gKz0gcGFyYW0ubnVtZWwoKQogICAgICAgIGlmIHBhcmFtLnJlcXVpcmVzX2dyYWQ6CiAgICAgICAgICAgIHRyYWluYWJsZV9wYXJhbXMgKz0gcGFyYW0ubnVtZWwoKQogICAgcHJpbnQoCiAgICAgICAgZiJ0cmFpbmFibGUgcGFyYW1zOiB7dHJhaW5hYmxlX3BhcmFtc30gfHwgYWxsIHBhcmFtczoge2FsbF9wYXJhbX0gfHwgdHJhaW5hYmxlJToiCiAgICAgICAgZiIgezEwMCAqIHRyYWluYWJsZV9wYXJhbXMgLyBhbGxfcGFyYW19IgogICAgKQoKCiMgZGVmYXVsdCBjb25maWdzCiMgd2lsbCBiZSB1c2VkIGlmIHVzZXIgcHJvdmlkZXMgIlRydWUiIHdpdGggY29uZmlnIG5hbWUgYXMgaW5wdXQKUVVBTlRJWkFUSU9OX0NPTkZJRyA9IHRyYW5zZm9ybWVycy5CaXRzQW5kQnl0ZXNDb25maWcoCiAgICBsb2FkX2luXzRiaXQ9VHJ1ZSwKICAgIGJuYl80Yml0X3VzZV9kb3VibGVfcXVhbnQ9VHJ1ZSwKICAgIGJuYl80Yml0X3F1YW50X3R5cGU9Im5mNCIsCiAgICBibmJfNGJpdF9jb21wdXRlX2R0eXBlPXRvcmNoLmJmbG9hdDE2LAopCgpMT1JBX0NPTkZJRyA9IHBlZnQuTG9yYUNvbmZpZygKICAgIHI9OCwKICAgIGxvcmFfYWxwaGE9MzIsCiAgICB0YXJnZXRfbW9kdWxlcz1bInF1ZXJ5X2tleV92YWx1ZSJdLAogICAgbG9yYV9kcm9wb3V0PTAuMDUsCiAgICBiaWFzPSJub25lIiwKICAgIHRhc2tfdHlwZT0iQ0FVU0FMX0xNIiwKKQoKREVFUFNQRUVEX0NPTkZJRyA9IHsKICAgICJ0cmFpbl9taWNyb19iYXRjaF9zaXplX3Blcl9ncHUiOiAiYXV0byIsCiAgICAiZnAxNiI6IHsiZW5hYmxlZCI6IFRydWV9LAogICAgImF1dG90dW5pbmciOiB7CiAgICAgICAgImVuYWJsZWQiOiBUcnVlLAogICAgICAgICJhcmdfbWFwcGluZ3MiOiB7CiAgICAgICAgICAgICJ0cmFpbl9taWNyb19iYXRjaF9zaXplX3Blcl9ncHUiOiAiLS1wZXJfZGV2aWNlX3RyYWluX2JhdGNoX3NpemUiLAogICAgICAgICAgICAiZ3JhZGllbnRfYWNjdW11bGF0aW9uX3N0ZXBzICI6ICItLWdyYWRpZW50X2FjY3VtdWxhdGlvbl9zdGVwcyIsCiAgICAgICAgfSwKICAgIH0sCiAgICAiemVyb19vcHRpbWl6YXRpb24iOiB7CiAgICAgICAgInN0YWdlIjogMiwKICAgIH0sCn0KCgpkZWYgX3VwZGF0ZV9jb25maWcoc3JjOiBkaWN0LCBkc3Q6IGRpY3QpOgogICAgIiIiCiAgICB1cGRhdGUgY29uZmlncyBhY2NvcmRpbmcgdG8gdXNlciwgdGhpcyB3YXkgdGhlIHVzZXIgY2FuIGFkZC9tb2RpZnkgdmFsdWVzIGluIGRlZmF1bHQgY29uZmlncyBmb3IgZS5nLgoKICAgIGdvZXMgb3ZlciBhbGwgY29uZmlncyBhbmQgY29ycmVzcG9uZGluZyBwcmVmaXhlcywgY29sbGVjdCBhbGwgdGhlIGtleXMgZnJvbSB0aGUgZ2l2ZW4gZGljdCB0aGF0IHN0YXJ0CiAgICAgd2l0aCB0aGUgcHJlZml4IGFuZCBhZGQgdGhlbSB0byBhcHByb3ByaWF0ZSBjb25maWcKCiAgICA6cGFyYW0gc3JjOiBkaWN0IG9mIGFsbCBjYW5kaWRhdGUgdmFsdWVzIHRvIHVwZGF0ZSBkaWN0LgogICAgOnBhcmFtIGRzdDogZGljdCBjb250YWluaW5nIGFsbCBjb25maWdzIHRvIHVwZGF0ZS4KICAgICIiIgoKICAgIGZvciBjb25maWdfbmFtZSwgY29uZmlnIGluIGRzdC5pdGVtcygpOgoKICAgICAgICAjIElmIGdpdmVuIFRydWUgd2UgdXNlIGRlZmF1bHQgZGljdAogICAgICAgICMgQ2FuIGFsc28gYmUgRmFsc2Ugb3IgYSBjb25maWcgZGljdCBnaXZlbiBmcm9tIHVzZXIsIHNvIHdlIGNoZWNrIHNwZWNpZmljYWxseSBmbyBUcnVlCiAgICAgICAgaWYgY29uZmlnIGlzIFRydWUgYW5kIGNvbmZpZ19uYW1lID09ICJxdWFudGl6YXRpb24iOgogICAgICAgICAgICBjb25maWcgPSBRVUFOVElaQVRJT05fQ09ORklHCgogICAgICAgIGlmIGNvbmZpZyBpcyBUcnVlIGFuZCBjb25maWdfbmFtZSA9PSAibG9yYSI6CiAgICAgICAgICAgIGNvbmZpZyA9IExPUkFfQ09ORklHCgogICAgICAgIGlmIGNvbmZpZyBpcyBUcnVlIGFuZCBjb25maWdfbmFtZSA9PSAiZGVlcHNwZWVkIjoKICAgICAgICAgICAgY29uZmlnID0gREVFUFNQRUVEX0NPTkZJRwoKICAgICAgICAjIGluIHNvbWUgY2FzZXMgd2UgY2FuIGdldCBhIGJvb2xlYW4gdmFsdWUsIGluIHRoYXQgY2FzZSBubyBuZWVkIHRvIGxvb2sgZm9yIGFyZ3MKICAgICAgICBpZiBpc2luc3RhbmNlKGNvbmZpZywgYm9vbCk6CiAgICAgICAgICAgIGNvbmZpZyA9IE5vbmUKCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKGNvbmZpZywgZGljdCk6CiAgICAgICAgICAgIGZvciBrZXksIHZhbCBpbiBzcmMuaXRlbXMoKToKICAgICAgICAgICAgICAgIGlmIGtleS5zdGFydHN3aXRoKGNvbmZpZ19uYW1lKToKICAgICAgICAgICAgICAgICAgICBjb25maWdba2V5LnJlcGxhY2UoZiJ7Y29uZmlnX25hbWV9XyIsICIiKV0gPSB2YWwKCiAgICAgICAgIyB1cGRhdGUgYnkgY29uZmlnIG5hbWUKICAgICAgICBlbHNlOgogICAgICAgICAgICBmb3Iga2V5LCB2YWwgaW4gc3JjLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBpZiBrZXkuc3RhcnRzd2l0aChjb25maWdfbmFtZSk6CiAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihjb25maWcsIGtleS5yZXBsYWNlKGYie2NvbmZpZ19uYW1lfV8iLCAiIiksIHZhbCkKCiAgICAgICAgZHN0LnVwZGF0ZSh7Y29uZmlnX25hbWU6IGNvbmZpZ30pCgoKZGVmIF9nZXRfY2xhc3Nfb2JqZWN0KGNsYXNzX3BhdGg6IHN0cikgLT4gdHlwZToKICAgICIiIgogICAgZ2l2ZW4gYSBmdWxsIGNsYXNzIG5hbWUsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29ycmVjdCBjbGFzcwoKICAgIDpwYXJhbSBjbGFzc19wYXRoOiBhIGZ1bGwgY2xhc3MgbmFtZSAoZXguICd0cmFuc2Zvcm1lcnMuQXV0b01vZGVsRm9yQ2F1c2FsTE0nKQoKICAgIDpyZXR1cm4gdGhlIHdhbnRlZCBjbGFzcyBvYmplY3QKICAgICIiIgogICAgbW9kdWxlX3BhdGgsIGNsYXNzX25hbWUgPSBjbGFzc19wYXRoLnJzcGxpdCgiLiIsIDEpCiAgICBtb2R1bGUgPSBpbXBvcnRsaWIuaW1wb3J0X21vZHVsZShtb2R1bGVfcGF0aCkKICAgIHJldHVybiBnZXRhdHRyKG1vZHVsZSwgY2xhc3NfbmFtZSkKCgpkZWYgX3NldF9tb2RlbF9hbmRfdG9rZW5pemVyKAogICAgbW9kZWw6IFVuaW9uW3N0ciwgTGlzdFtzdHJdXSwKICAgIHRva2VuaXplcjogVW5pb25bc3RyLCBMaXN0W3N0cl1dLAogICAgdGFzazogc3RyLAogICAgZnJhbWV3b3JrOiBzdHIsCiAgICBsb3JhX2NvbmZpZzogZGljdCwKICAgIHF1YW50aXphdGlvbl9jb25maWc6IGRpY3QsCiAgICB1c2VfY3VkYTogYm9vbCwKICAgIHRva2VuaXplcl9wcmV0cmFpbmVkX2NvbmZpZywKICAgIG1vZGVsX3ByZXRyYWluZWRfY29uZmlnLAogICAgZGV2aWNlX21hcDogc3RyLAopOgogICAgIiIiCiAgICBnZXQgdGhlIGNvcnJlY3QgbW9kZWwgYW5kIHRva2VuaXplciBhY2NvcmRpbmcgdG8gZ2l2ZW4gdXNlciBpbnB1dHMKCiAgICA6cGFyYW0gbW9kZWw6IGEgdHVwbGUgY29udGFpbmluZyBtb2RlbCBuYW1lIGFuZCBjbGFzcywgb3Igc3RyIHdpdGggbW9kZWwgbmFtZSBvciBwYXRoCiAgICA6cGFyYW0gdG9rZW5pemVyOiBhIHR1cGxlIGNvbnRhaW5pbmcgdG9rZW5pemVyIG5hbWUgYW5kIGNsYXNzLCBvciBzdHIgd2l0aCB0b2tlbml6ZXIgbmFtZSBvciBwYXRoCiAgICA6cGFyYW0gdGFzazogYSBzdXBwb3J0ZWQgbmxwIHRhc2ssIHVzZWQgdG8gY2hvb3NlIG1vZGVsIGlmIG5vdCBwcm92aWRlZAogICAgOnBhcmFtIGZyYW1ld29yazogcHQgb3IgdGYKICAgIDpwYXJhbSBsb3JhX2NvbmZpZzogbG9yYSBjb25maWcgb3IgTm9uZSwgdG8gbG9hZCBtb2RlbCBpbiBhcHByb3ByaWF0ZSB3YXkKICAgIDpwYXJhbSBxdWFudGl6YXRpb25fY29uZmlnOiBxdWFudGl6YXRpb24gY29uZmlnIG9yIE5vbmUsIHRvIGxvYWQgbW9kZWwgaW4gYXBwcm9wcmlhdGUgd2F5CiAgICA6cGFyYW0gdXNlX2N1ZGE6IHVzZSBncHUgb3Igbm90CiAgICA6cGFyYW0gdG9rZW5pemVyX3ByZXRyYWluZWRfY29uZmlnOiBjb25maWcgdG8gbG9hZCB0aGUgcHJldHJhaW5lZCB0b2tlbml6ZXIKICAgIDpwYXJhbSBtb2RlbF9wcmV0cmFpbmVkX2NvbmZpZzogY29uZmlnIHRvIGxvYWQgdGhlIHByZXRyYWluZWQgbW9kZWwKICAgIDpwYXJhbSBkZXZpY2VfbWFwOiBhIGRldmljZSBtYXAgZm9yIG1vZGVsIHRyYWluaW5nIGlmIHVzaW5nIG51bWJlciBvZiBncHUncwoKICAgIDpyZXR1cm5zOiBtb2RlbCBhbmQgdG9rZW5pemVyCiAgICAiIiIKICAgICMgaWYgdGFzayBpcyBub3Qgc3VwcG9ydGVkIGFuZCBubyBtb2RlbCB3YXMgZ2l2ZW4gd2UgY2FuJ3QgY2hvb3NlIG9uZQogICAgaWYgdGFzayBhbmQgdGFzayBub3QgaW4gc3VwcG9ydGVkX3Rhc2tzIGFuZCBub3QgbW9kZWw6CiAgICAgICAgbG9nZ2VyLmVycm9yKCJ1bnN1cHBvcnRlZCB0YXNrIG9wdGlvbiBjaG9zZW4iKQogICAgICAgIHJhaXNlCgogICAgIyBsb2FkIG1vZGVsIGZyb20gc3RvcmUKICAgIGlmIGlzaW5zdGFuY2UobW9kZWwsIHN0cikgYW5kIGlzX3N0b3JlX3VyaShtb2RlbCk6CiAgICAgICAgcGFzcwogICAgICAgICMgVE9ETzogbG9hZCBib3RoIG1vZGVsIGFuZCB0b2tlbml6ZXIgYW5kIHJldHVybiwgbmVlZCBndXkncyBoZWxwCgogICAgIyBpZiBpdCdzIGEgdHVwbGUgdGhlbSB3ZSBhc3N1bWUgaXQgY29udGFpbnMgb2YgYm90aCBuYW1lIGFuZCBjbGFzcwogICAgaWYgaXNpbnN0YW5jZShtb2RlbCwgbGlzdCk6CiAgICAgICAgbW9kZWxfbmFtZSwgbW9kZWxfY2xhc3MgPSBtb2RlbAogICAgICAgIG1vZGVsX2NsYXNzID0gX2dldF9jbGFzc19vYmplY3QobW9kZWxfY2xhc3MpCgogICAgIyBpbiB0aGUgY2FzZSB3ZSBkb24ndCBnZXQgdGhlIG1vZGVsIGNsYXNzIHdlIG5lZWQgdGhlIHRhc2sgaW4gb3JkZXIgdG8gY2hvb3NlIHRoZSBjb3JyZWN0IG1vZGVsCiAgICBlbHNlOgogICAgICAgIGlmIHRhc2sgaXMgTm9uZToKICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJ0YXNrIG11c3QgYmUgY2hvc2VuIGluIG9yZGVyIHRvIGRldGVybWluZSB0aGUgY29ycmVjdCBtb2RlbCIpCiAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICJ0aGlzIGZ1bmN0aW9uIHJlcXVpcmVzIGVpdGhlciBhIHN1cHBvcnRlZCB0YXNrIG9yIGEgbW9kZWwgYW5kIG1vZGVsIGNsYXNzIHRvIGJlIGNob3NlbiIKICAgICAgICAgICAgKQoKICAgICAgICBfLCBhdmFpbGFibGVfY2xhc3NlcywgdGFza19vcHRpb25zID0gdHJhbnNmb3JtZXJzLnBpcGVsaW5lcy5jaGVja190YXNrKHRhc2spCgogICAgICAgIGlmIGlzaW5zdGFuY2UobW9kZWwsIHN0cik6CiAgICAgICAgICAgIG1vZGVsX25hbWUgPSBtb2RlbAoKICAgICAgICAjIGlmIG1vZGVsIGlzIG5vdCBnaXZlbiwgd2UgdGFrZSB0aGUgZGVmYXVsdCBtb2RlbCBmb3IgdGhlIGdpdmVuIHRhc2sKICAgICAgICBlbHNlOgogICAgICAgICAgICBtb2RlbF9uYW1lLCBfID0gdHJhbnNmb3JtZXJzLnBpcGVsaW5lcy5nZXRfZGVmYXVsdF9tb2RlbF9hbmRfcmV2aXNpb24oCiAgICAgICAgICAgICAgICBhdmFpbGFibGVfY2xhc3NlcywgZnJhbWV3b3JrLCB0YXNrX29wdGlvbnMKICAgICAgICAgICAgKQogICAgICAgIGlmIG5vdCBhdmFpbGFibGVfY2xhc3Nlcy5nZXQoZnJhbWV3b3JrLCB0dXBsZSgpKToKICAgICAgICAgICAgbG9nZ2VyLmVycm9yKAogICAgICAgICAgICAgICAgImdpdmVuIHRhc2sncyBkZWZhdWx0IG1vZGVsIGlzIG5vdCBzdXBwb3J0ZWQgaW4gc3BlY2lmaWVkIGZyYW1ld29yayIKICAgICAgICAgICAgKQogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAidGhpcyBmdW5jdGlvbiByZXF1aXJlcyBlaXRoZXIgYSBzdXBwb3J0ZWQgdGFzayBvciBhIG1vZGVsIGFuZCBtb2RlbCBjbGFzcyB0byBiZSBjaG9zZW4iCiAgICAgICAgICAgICkKCiAgICAgICAgbW9kZWxfY2xhc3MgPSBhdmFpbGFibGVfY2xhc3Nlc1tmcmFtZXdvcmtdWzBdCgogICAgIyBsb2FkIHRoZSBwcmV0cmFpbmVkIG1vZGVsCiAgICBpZiB1c2VfY3VkYToKICAgICAgICBkZXZpY2VfbWFwID0gZGV2aWNlX21hcAogICAgZWxzZToKICAgICAgICBkZXZpY2VfbWFwID0gTm9uZQoKICAgIG1vZGVsID0gbW9kZWxfY2xhc3MuZnJvbV9wcmV0cmFpbmVkKAogICAgICAgIG1vZGVsX25hbWUsCiAgICAgICAgcXVhbnRpemF0aW9uX2NvbmZpZz1xdWFudGl6YXRpb25fY29uZmlnLAogICAgICAgIGRldmljZV9tYXA9ZGV2aWNlX21hcCwKICAgICAgICAqKm1vZGVsX3ByZXRyYWluZWRfY29uZmlnLAogICAgKQoKICAgICMgSWYgcXVhbnRpemF0aW9uIGNvbmZpZyBpcyBnaXZlbiB3ZSB3aWxsIGxvYWQgYSBxdWFudGl6ZWQgbW9kZWwsIGlmIG5vdCBhIHJlZ3VsYXIgb25lCiAgICBpZiBxdWFudGl6YXRpb25fY29uZmlnOgogICAgICAgIG1vZGVsLmdyYWRpZW50X2NoZWNrcG9pbnRpbmdfZW5hYmxlKCkKICAgICAgICBtb2RlbCA9IHBlZnQucHJlcGFyZV9tb2RlbF9mb3Jfa2JpdF90cmFpbmluZyhtb2RlbCkKCiAgICAjIElmIGxvcmEgY29uZmlnIHdhcyBnaXZlbiB3ZSB3YW50IHRvIGRvIGxvcmEgZmluZSB0dW5lLCB3ZSB1cGRhdGUgbW9kZWwgaGVyZQogICAgaWYgbG9yYV9jb25maWc6CiAgICAgICAgbW9kZWwgPSBwZWZ0LmdldF9wZWZ0X21vZGVsKG1vZGVsLCBsb3JhX2NvbmZpZykKCiAgICAjIGlmIG5vdCBzcGVjaWZpZWQgd2UgY2hvb3NlIHRoZSBkZWZhdWx0IHRva2VuaXplciB0aGF0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1vZGVsCiAgICBpZiB0b2tlbml6ZXIgaXMgTm9uZToKICAgICAgICB0b2tlbml6ZXIgPSB0cmFuc2Zvcm1lcnMuQXV0b1Rva2VuaXplci5mcm9tX3ByZXRyYWluZWQobW9kZWxfbmFtZSkKICAgICAgICByZXR1cm4gbW9kZWxfbmFtZSwgbW9kZWwsIHRva2VuaXplcgoKICAgIGlmIGlzaW5zdGFuY2UodG9rZW5pemVyLCBzdHIpOgogICAgICAgIHRva2VuaXplcl9uYW1lID0gdG9rZW5pemVyCiAgICAgICAgdG9rZW5pemVyX2NsYXNzID0gdHJhbnNmb3JtZXJzLkF1dG9Ub2tlbml6ZXIKCiAgICAjIGlmIGl0J3Mgbm90IGEgc3RyIHRoZW4gaXQncyBhIHR1cGxlIG9mIGJvdGggbmFtZSBhbmQgY2xhc3MKICAgIGVsc2U6CiAgICAgICAgdG9rZW5pemVyX25hbWUsIHRva2VuaXplcl9jbGFzcyA9IHRva2VuaXplcgogICAgICAgIHRva2VuaXplcl9jbGFzcyA9IF9nZXRfY2xhc3Nfb2JqZWN0KHRva2VuaXplcl9jbGFzcykKCiAgICB0b2tlbml6ZXIgPSB0b2tlbml6ZXJfY2xhc3MuZnJvbV9wcmV0cmFpbmVkKAogICAgICAgIHRva2VuaXplcl9uYW1lLCAqKnRva2VuaXplcl9wcmV0cmFpbmVkX2NvbmZpZwogICAgKQoKICAgIHRva2VuaXplci5wYWRfdG9rZW4gPSB0b2tlbml6ZXIuZW9zX3Rva2VuCgogICAgcmV0dXJuIG1vZGVsX25hbWUsIG1vZGVsLCB0b2tlbml6ZXIKCgpkZWYgX2RhdGFzZXRfbG9hZGVyKGRhdGFzZXQ6IHN0ciwgaXNfdHJhaW46IGJvb2wgPSBUcnVlLCAqKmt3YXJncykgLT4gRGF0YXNldDoKICAgICIiIgogICAgbG9hZHMgdGhlIHNwZWNpZmljIGRhdGFzZXQgcHJvdmlkZWQgYnkgdGhlIHVzZXIKCiAgICA6cGFyYW0gZGF0YXNldDogbmFtZSBvciBwYXRoIG9mIGRhdGFzZXQgdG8gbG9hZAogICAgOnBhcmFtIGlzX3RyYWluOiBib29sIHRoYXQgaW5kaWNhdGVzIHRoZSBwdXJwb3NlIG9mIHRoZSBkYXRhc2V0CiAgICA6cGFyYW0ga3dhcmdzOiBvdGhlciBrd2FyZ3MgZm9yIGxvYWRpbmcgdGhlIGRhdGFzZXQKCiAgICA6cmV0dXJuczogbG9hZGVkIGRhdGFzZXQKICAgICIiIgogICAgIyBpZiBzcGxpdCBpbiBrd2FyZ3MgdGhlbiB0aGUgdXNlciBkZWNpZGVzIGhvdyB0byBzcGxpdCB0aGUgZGF0YXNldAogICAgaWYgInNwbGl0IiBpbiBrd2FyZ3M6CiAgICAgICAgcmV0dXJuIGxvYWRfZGF0YXNldChkYXRhc2V0LCAqKmt3YXJncykKCiAgICAjIGlmIGl0J3MgYSBkYXRhc2V0IGZvciB0cmFpbiB3ZSBzcGxpdCB3aXRoIHRyYWluCiAgICBpZiBpc190cmFpbjoKICAgICAgICByZXR1cm4gbG9hZF9kYXRhc2V0KGRhdGFzZXQsIHNwbGl0PSJ0cmFpbiIsICoqa3dhcmdzKQoKICAgICMgaWYgaXQncyBldmFsIGRhdGFzZXQsIHRoZW4gYSBsb3Qgb2YgbmFtZXMgYXJlIGFjY2VwdGFibGUgZm9yIHRoZSBzZXQgYW5kIHdlIGNoZWNrIGFsbCBvZiB0aGVtCiAgICBkYXRhc2V0ID0gbG9hZF9kYXRhc2V0KGRhdGFzZXQsICoqa3dhcmdzKQogICAgaWYgInRlc3QiIGluIGRhdGFzZXQ6CiAgICAgICAgcmV0dXJuIGRhdGFzZXQuZ2V0KCJ0ZXN0IikKICAgIGVsaWYgImV2YWwiIGluIGRhdGFzZXQ6CiAgICAgICAgcmV0dXJuIGRhdGFzZXQuZ2V0KCJldmFsIikKICAgIGVsaWYgInZhbGlkYXRpb24iIGluIGRhdGFzZXQ6CiAgICAgICAgcmV0dXJuIGRhdGFzZXQuZ2V0KCJ2YWxpZGF0aW9uIikKCgpkZWYgX3ByZXBhcmVfZGF0YXNldCgKICAgIHRyYWluX2RhdGFzZXQ6IHN0ciwKICAgIGV2YWxfZGF0YXNldDogc3RyLAogICAgdHJhaW5fbG9hZF9kYXRhc2V0X2t3YXJncywKICAgIGV2YWxfbG9hZF9kYXRhc2V0X2t3YXJncywKICAgIHRva2VuaXplciwKICAgIGRhdGFzZXRfY29sdW1uc190b190cmFpbjogVW5pb25bc3RyLCBsaXN0XSwKKSAtPiAoRGF0YXNldCwgVW5pb25bRGF0YXNldCwgTm9uZV0pOgogICAgIiIiCiAgICBMb2FkcyB0aGUgdHJhaW4gYW5kIGV2YWwgZGF0YXNldHMgKGlmIHByb3ZpZGVkKSBwYXNzZXMgdGhlbSB0aHJvdWdoIHRoZSB0b2tlbml6ZXIgYW5kCiAgICByZXR1cm5zIHRoZW0gcmVhZHkgdG8gdXNlIGluIHRyYWluaW5nCgogICAgOnBhcmFtIHRyYWluX2RhdGFzZXQ6IHRoZSBuYW1lIG9yIHBhdGggdG8gdGhlIHRyYWluIGRhdGFzZXQKICAgIDpwYXJhbSBldmFsX2RhdGFzZXQ6IHRoZSBuYW1lIG9yIHBhdGggdG8gdGhlIGV2YWwgZGF0YXNldAogICAgOnBhcmFtIGRhdGFzZXRfY29sdW1uc190b190cmFpbjogd2hpY2ggY29sdW1ucyB0byBwYXNzIHRvIHRoZSBtb2RlbCBhcyBpbnB1dHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZWVkIHRvIHBhc3MgdGhyb3VnaCB0aGUgdG9rZW5pemVyIGZpcnN0KQogICAgOnBhcmFtIHRyYWluX2xvYWRfZGF0YXNldF9rd2FyZ3M6IGt3YXJncyBmb3IgZGF0YXNldCBsb2FkaW5nCiAgICA6cGFyYW0gZXZhbF9sb2FkX2RhdGFzZXRfa3dhcmdzOiBrd2FyZ3MgZm9yIGRhdGFzZXQgbG9hZGluZwogICAgOnBhcmFtIHRva2VuaXplcjogdGhlIHRva2VuaXplciB0byBwYXNzIHRoZSBkYXRhIHRocm91Z2gKCiAgICA6cmV0dXJuczogdG9rZW5pemVkIGRhdGFzZXRzCiAgICAiIiIKICAgIGlmIG5vdCB0b2tlbml6ZXIucGFkX3Rva2VuOgogICAgICAgIHRva2VuaXplci5wYWRfdG9rZW4gPSB0b2tlbml6ZXIuZW9zX3Rva2VuCgogICAgIyB3ZSB0YWtlIGNvbCBuYW1lL3MgaW4gYSBsaXN0IGZvciBlYXN5IGdlbmVyYWxpemF0aW9uCiAgICBpZiBpc2luc3RhbmNlKGRhdGFzZXRfY29sdW1uc190b190cmFpbiwgc3RyKToKICAgICAgICBkYXRhc2V0X2NvbHVtbnNfdG9fdHJhaW4gPSBbZGF0YXNldF9jb2x1bW5zX3RvX3RyYWluXQoKICAgIGlmIGlzaW5zdGFuY2UodHJhaW5fZGF0YXNldCwgbWxydW4uZGF0YXN0b3JlLkRhdGFJdGVtKToKICAgICAgICB0cmFpbl9kYXRhc2V0ID0gRGF0YXNldC5mcm9tX3BhbmRhcyh0cmFpbl9kYXRhc2V0LmFzX2RmKCkpCiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgdHJhaW5fZGF0YXNldC5tYXAoCiAgICAgICAgICAgICAgICBsYW1iZGEgZXhhbXBsZXM6IHRva2VuaXplcigKICAgICAgICAgICAgICAgICAgICAqW2V4YW1wbGVzW2NvbF0gZm9yIGNvbCBpbiBkYXRhc2V0X2NvbHVtbnNfdG9fdHJhaW5dLAogICAgICAgICAgICAgICAgICAgIHRydW5jYXRpb249VHJ1ZSwKICAgICAgICAgICAgICAgICAgICBwYWRkaW5nPVRydWUsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgYmF0Y2hlZD1UcnVlLAogICAgICAgICAgICApLAogICAgICAgICAgICBOb25lLAogICAgICAgICkKCiAgICAjIExvYWQgZGF0YXNldHMKICAgICMgaWYgcHJvdmlkZWQgdHdvIHBhdGhzL25hbWVzIHdlIGxvYWQgZWFjaCBzZXBhcmF0ZWx5IHVzaW5nIGRlc2lnbmF0ZWQgZnVuYwogICAgaWYgZXZhbF9kYXRhc2V0OgogICAgICAgIHRyYWluX2RhdGFzZXQgPSBfZGF0YXNldF9sb2FkZXIoCiAgICAgICAgICAgIGRhdGFzZXQ9dHJhaW5fZGF0YXNldCwgaXNfdHJhaW49VHJ1ZSwgKip0cmFpbl9sb2FkX2RhdGFzZXRfa3dhcmdzCiAgICAgICAgKQogICAgICAgIGV2YWxfZGF0YXNldCA9IF9kYXRhc2V0X2xvYWRlcigKICAgICAgICAgICAgZGF0YXNldD1ldmFsX2RhdGFzZXQsIGlzX3RyYWluPUZhbHNlLCAqKmV2YWxfbG9hZF9kYXRhc2V0X2t3YXJncwogICAgICAgICkKCiAgICAjIGlmIG9ubHkgb24gcGF0aCBpcyBnaXZlbiB0aGVuIHdlIG11c3QgY2hlY2sgaWYgaXQgY29udGFpbnMgYm90aCBkYXRhc2V0IG9yIGlmIG9ubHkgb25lIHNob3VsZCBiZSB1c2VkCiAgICBlbHNlOgogICAgICAgIGRhdGFzZXQgPSBsb2FkX2RhdGFzZXQodHJhaW5fZGF0YXNldCwgKip0cmFpbl9sb2FkX2RhdGFzZXRfa3dhcmdzKQogICAgICAgIGlmICJ0cmFpbiIgaW4gZGF0YXNldDoKICAgICAgICAgICAgdHJhaW5fZGF0YXNldCA9IGRhdGFzZXQuZ2V0KCJ0cmFpbiIpCiAgICAgICAgICAgIGlmICJ0ZXN0IiBpbiBkYXRhc2V0OgogICAgICAgICAgICAgICAgZXZhbF9kYXRhc2V0ID0gZGF0YXNldC5nZXQoInRlc3QiKQogICAgICAgICAgICBlbGlmICJldmFsIiBpbiBkYXRhc2V0OgogICAgICAgICAgICAgICAgZXZhbF9kYXRhc2V0ID0gZGF0YXNldC5nZXQoImV2YWwiKQogICAgICAgICAgICBlbGlmICJ2YWxpZGF0aW9uIiBpbiBkYXRhc2V0OgogICAgICAgICAgICAgICAgZXZhbF9kYXRhc2V0ID0gZGF0YXNldC5nZXQoInZhbGlkYXRpb24iKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBvbmx5IHRyYWluIGRhdGFzZXQgZ2l2ZW4sIHRva2VuaXplIGFuZCByZXR1cm4gaXQKICAgICAgICAgICAgICAgIHJldHVybiAoCiAgICAgICAgICAgICAgICAgICAgdHJhaW5fZGF0YXNldC5tYXAoCiAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYSBleGFtcGxlczogdG9rZW5pemVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKltleGFtcGxlc1tjb2xdIGZvciBjb2wgaW4gZGF0YXNldF9jb2x1bW5zX3RvX3RyYWluXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydW5jYXRpb249VHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc9VHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2hlZD1UcnVlLAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgTm9uZSwKICAgICAgICAgICAgICAgICkKICAgICAgICBlbHNlOgogICAgICAgICAgICBsb2dnZXIuZXJyb3IoInRyYWluIGRhdGFzZXQgaXMgbWFuZGF0b3J5IikKICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoIm5vIHRyYWluIGRhdGFzZXQgZm91bmQgaW4gZ2l2ZW4gZGF0YXNldCIpCgogICAgIyBUb2tlbml6ZSB0aGUgZGF0YSBzbyB0aGUgbW9kZWwgY2FuIHVuZGVyc3RhbmQgaXQKICAgIHRva2VuaXplZF90cmFpbl9kYXRhc2V0ID0gdHJhaW5fZGF0YXNldC5tYXAoCiAgICAgICAgbGFtYmRhIGV4YW1wbGVzOiB0b2tlbml6ZXIoCiAgICAgICAgICAgICpbZXhhbXBsZXNbY29sXSBmb3IgY29sIGluIGRhdGFzZXRfY29sdW1uc190b190cmFpbl0sCiAgICAgICAgICAgIHRydW5jYXRpb249VHJ1ZSwKICAgICAgICAgICAgcGFkZGluZz1UcnVlLAogICAgICAgICksCiAgICAgICAgYmF0Y2hlZD1UcnVlLAogICAgKQoKICAgIHRva2VuaXplZF9ldmFsX2RhdGFzZXQgPSBldmFsX2RhdGFzZXQubWFwKAogICAgICAgIGxhbWJkYSBleGFtcGxlczogdG9rZW5pemVyKAogICAgICAgICAgICAqW2V4YW1wbGVzW2NvbF0gZm9yIGNvbCBpbiBkYXRhc2V0X2NvbHVtbnNfdG9fdHJhaW5dLAogICAgICAgICAgICB0cnVuY2F0aW9uPVRydWUsCiAgICAgICAgICAgIHBhZGRpbmc9VHJ1ZSwKICAgICAgICApLAogICAgICAgIGJhdGNoZWQ9VHJ1ZSwKICAgICkKCiAgICByZXR1cm4gdG9rZW5pemVkX3RyYWluX2RhdGFzZXQsIHRva2VuaXplZF9ldmFsX2RhdGFzZXQKCgpkZWYgZmluZXR1bmVfbGxtKAogICAgY29udGV4dDogbWxydW4uTUxDbGllbnRDdHgsCiAgICB0cmFpbl9kYXRhc2V0OiBVbmlvbltzdHIsIG1scnVuLmRhdGFzdG9yZS5EYXRhSXRlbV0sCiAgICBldmFsX2RhdGFzZXQ6IHN0ciA9IE5vbmUsCiAgICB0cmFpbl9sb2FkX2RhdGFzZXRfa3dhcmdzOiBkaWN0ID0ge30sCiAgICBldmFsX2xvYWRfZGF0YXNldF9rd2FyZ3M6IGRpY3QgPSB7fSwKICAgIGRhdGFzZXRfY29sdW1uc190b190cmFpbjogVW5pb25bc3RyLCBsaXN0XSA9ICJ0ZXh0IiwKICAgIG1vZGVsOiBVbmlvbltzdHIsIExpc3Rbc3RyXV0gPSAiaHVnZ2luZ2ZhY2UtbW9kZWwiLAogICAgdG9rZW5pemVyOiBVbmlvbltzdHIsIExpc3Rbc3RyXV0gPSBOb25lLAogICAgZGVlcHNwZWVkX2NvbmZpZzogVW5pb25bZGljdCwgYm9vbF0gPSBGYWxzZSwKICAgIHF1YW50aXphdGlvbl9jb25maWc6IFVuaW9uW2RpY3QsIGJvb2xdID0gRmFsc2UsCiAgICBsb3JhX2NvbmZpZzogVW5pb25bZGljdCwgYm9vbF0gPSBGYWxzZSwKICAgIHRyYWluaW5nX2NvbmZpZzogZGljdCA9IHt9LAogICAgbW9kZWxfcHJldHJhaW5lZF9jb25maWc6IGRpY3QgPSB7fSwKICAgIHRva2VuaXplcl9wcmV0cmFpbmVkX2NvbmZpZzogZGljdCA9IHt9LAogICAgZGF0YV9jb2xsYXRvcl9jb25maWc6IGRpY3QgPSB7fSwKICAgIHRhc2s6IHN0ciA9ICJ0ZXh0LWdlbmVyYXRpb24iLAogICAgdXNlX2N1ZGE6IGJvb2wgPSBUcnVlLAogICAgZnJhbWV3b3JrOiBzdHIgPSAicHQiLAogICAgZGV2aWNlX21hcDogc3RyID0gImF1dG8iLAogICAgKiprd2FyZ3MsCik6CiAgICAiIiIKICAgIEZpbmUtdHVuZXMgYSBMYW5ndWFnZSBNb2RlbCAoTExNKSBvbiBhIHNwZWNpZmljIHRhc2sgdXNpbmcgdGhlIHByb3ZpZGVkIGRhdGFzZXQuCiAgICAgVGhlIGZ1bmN0aW9uIHRha2VzIHZhcmlvdXMgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIHRvIGN1c3RvbWl6ZSB0aGUgdHJhaW5pbmcgcHJvY2VzcwogICAgIGFuZCBhZGFwdCB0aGUgbW9kZWwgdG8gc3BlY2lmaWMgdGFza3MgdXNpbmcgYSBwcm92aWRlZCBkYXRhc2V0LgoKICAgIDpwYXJhbSBjb250ZXh0OiBtbHJ1biBjb250ZXh0IGluIG9yZGVyIHRvIGxvZyB0cmFpbmVkIG1vZGVsCiAgICA6cGFyYW0gZGF0YXNldF9jb2x1bW5zX3RvX3RyYWluOiB3aGljaCBjb2x1bW5zIHRvIHBhc3MgdG8gdGhlIG1vZGVsIGFzIGlucHV0cwogICAgOnBhcmFtIGV2YWxfbG9hZF9kYXRhc2V0X2t3YXJnczoga3dhcmdzIGZvciBkYXRhc2V0IGxvYWRpbmcKICAgIDpwYXJhbSB0cmFpbl9sb2FkX2RhdGFzZXRfa3dhcmdzOiBrd2FyZ3MgZm9yIGRhdGFzZXQgbG9hZGluZwogICAgOnBhcmFtIGZyYW1ld29yazogcHQgb3QgdGYKICAgIDpwYXJhbSB1c2VfY3VkYTogdXNlIGdwdSBvciBub3QKICAgIDpwYXJhbSB0b2tlbml6ZXJfcHJldHJhaW5lZF9jb25maWc6IGNvbmZpZyB0byBsb2FkIHRoZSBwcmV0cmFpbmVkIHRva2VuaXplcgogICAgOnBhcmFtIG1vZGVsX3ByZXRyYWluZWRfY29uZmlnOiBjb25maWcgdG8gbG9hZCB0aGUgcHJldHJhaW5lZCBtb2RlbAogICAgOnBhcmFtIHRva2VuaXplcjogYSB0dXBsZSBjb250YWluaW5nIHRva2VuaXplciBuYW1lIGFuZCBjbGFzcywgb3Igc3RyIHdpdGggdG9rZW5pemVyIG5hbWUgb3IgcGF0aAogICAgOnBhcmFtIG1vZGVsOiBhIHR1cGxlIGNvbnRhaW5pbmcgbW9kZWwgbmFtZSBhbmQgY2xhc3MsIG9yIHN0ciB3aXRoIG1vZGVsIG5hbWUgb3IgcGF0aAogICAgOnBhcmFtIHRyYWluX2RhdGFzZXQ6IFRoZSB0cmFpbiBkYXRhc2V0IHVzZWQgZm9yIGZpbmUtdHVuaW5nIHRoZSBsYW5ndWFnZSBtb2RlbC4KICAgIDpwYXJhbSBldmFsX2RhdGFzZXQ6IFRoZSBldmFsIGRhdGFzZXQgdXNlZCBmb3IgZXZhbHVhdGUgdGhlIGxhbmd1YWdlIG1vZGVsIGR1cmluZyB0cmFpbmluZy4KICAgIDpwYXJhbSBkZWVwc3BlZWRfY29uZmlnOiBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIERlZXBTcGVlZCAob3B0aW9uYWwpLgogICAgOnBhcmFtIHF1YW50aXphdGlvbl9jb25maWc6IENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgbW9kZWwgcXVhbnRpemF0aW9uIChvcHRpb25hbCkuCiAgICA6cGFyYW0gbG9yYV9jb25maWc6IENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgTG93LVJhbmsgQXBwcm94aW1hdGlvbiAoTG9SQSkgKG9wdGlvbmFsKS4KICAgIDpwYXJhbSB0cmFpbmluZ19jb25maWc6IENvbmZpZ3VyYXRpb24gb3B0aW9ucyBzcGVjaWZpYyB0byB0aGUgZmluZS10dW5pbmcgdHJhaW5pbmcgcHJvY2VzcyAob3B0aW9uYWwpLgogICAgOnBhcmFtIGRhdGFfY29sbGF0b3JfY29uZmlnOiBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIGRhdGEgY29sbGF0aW9uIGR1cmluZyB0cmFpbmluZyAob3B0aW9uYWwpLgogICAgOnBhcmFtIHRhc2s6IEEgZGVzY3JpcHRpb24gb2YgdGhlIHNwZWNpZmljIHRhc2sgdGhlIG1vZGVsIGlzIGJlaW5nIGZpbmUtdHVuZWQgZm9yLgogICAgOnBhcmFtIGt3YXJnczogQWRkaXRpb25hbCBrZXl3b3JkIGFyZ3VtZW50cy4KICAgICIiIgoKICAgICMgVE9ETzogbWF0Y2ggZm9yd2FyZC5rZXl3b3JkIHRvIGRhdGFzZXQua2V5d29yZCAtIGNoZWNrIGlmIHJlbGV2YW50IGluIG5ldyBkZXNpZ24KICAgICMgVE9ETzogYWRkIHdhcm5pbmcgZm9yIGxhYmVsLCBhbmQgYWRkIG9wdGlvbiB0byBtb2RpZnkgZGF0YXNldCBjb2wgbmFtZXMgLSBjaGVjayBpZiByZWxldmFudCBpbiBuZXcgZGVzaWduCgogICAgIyBMb29rIGZvciB1cGRhdGVzIHRvIGNvbmZpZ3MgZ2l2ZW4gaW4ga3dhcmdzCiAgICBjb25maWdzID0gewogICAgICAgIENvbmZpZ0tleXMuZGVlcHNwZWVkOiBkZWVwc3BlZWRfY29uZmlnLAogICAgICAgIENvbmZpZ0tleXMucXVhbnRpemF0aW9uOiBxdWFudGl6YXRpb25fY29uZmlnLAogICAgICAgIENvbmZpZ0tleXMubG9yYTogbG9yYV9jb25maWcsCiAgICAgICAgQ29uZmlnS2V5cy50cmFpbmluZzogdHJhaW5pbmdfY29uZmlnLAogICAgICAgIENvbmZpZ0tleXMubW9kZWxfcHJldHJhaW5lZDogbW9kZWxfcHJldHJhaW5lZF9jb25maWcsCiAgICAgICAgQ29uZmlnS2V5cy50b2tlbml6ZXJfcHJldHJhaW5lZDogdG9rZW5pemVyX3ByZXRyYWluZWRfY29uZmlnLAogICAgICAgIENvbmZpZ0tleXMuZGF0YV9jb2xsYXRvcjogZGF0YV9jb2xsYXRvcl9jb25maWcsCiAgICB9CiAgICBfdXBkYXRlX2NvbmZpZyhkc3Q9Y29uZmlncywgc3JjPWt3YXJncykKCiAgICAjIGNoZWNrIGdwdSBwZXJtaXNzaW9uIGFuZCBhdmFpbGFiaWxpdHkKICAgIGlmIHVzZV9jdWRhOgogICAgICAgIGlmIHRvcmNoLmN1ZGEuaXNfYXZhaWxhYmxlKCk6CiAgICAgICAgICAgICMgQ2xlYW4gZ3B1IGNhY2hlCiAgICAgICAgICAgIHRvcmNoLmN1ZGEuZW1wdHlfY2FjaGUoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCIndXNlX2N1ZGEnIGlzIHNldCB0byBUcnVlLCBidXQgbm8gY3VkYSBkZXZpY2UgaXMgYXZhaWxhYmxlIikKCiAgICAjIGdldCBtb2RlbCBhbmQgdG9rZW5pemVyCiAgICBtb2RlbF9uYW1lLCBtb2RlbCwgdG9rZW5pemVyID0gX3NldF9tb2RlbF9hbmRfdG9rZW5pemVyKAogICAgICAgIG1vZGVsPW1vZGVsLAogICAgICAgIHRva2VuaXplcj10b2tlbml6ZXIsCiAgICAgICAgdGFzaz10YXNrLAogICAgICAgIGZyYW1ld29yaz1mcmFtZXdvcmssCiAgICAgICAgbG9yYV9jb25maWc9Y29uZmlnc1tDb25maWdLZXlzLmxvcmFdLAogICAgICAgIHF1YW50aXphdGlvbl9jb25maWc9Y29uZmlnc1tDb25maWdLZXlzLnF1YW50aXphdGlvbl0sCiAgICAgICAgdXNlX2N1ZGE9dXNlX2N1ZGEsCiAgICAgICAgdG9rZW5pemVyX3ByZXRyYWluZWRfY29uZmlnPXRva2VuaXplcl9wcmV0cmFpbmVkX2NvbmZpZywKICAgICAgICBtb2RlbF9wcmV0cmFpbmVkX2NvbmZpZz1jb25maWdzW0NvbmZpZ0tleXMubW9kZWxfcHJldHJhaW5lZF0sCiAgICAgICAgZGV2aWNlX21hcD1kZXZpY2VfbWFwLAogICAgKQoKICAgICMgTG9hZCBkYXRhc2V0cwogICAgdG9rZW5pemVkX3RyYWluLCB0b2tlbml6ZWRfZXZhbCA9IF9wcmVwYXJlX2RhdGFzZXQoCiAgICAgICAgdHJhaW5fZGF0YXNldD10cmFpbl9kYXRhc2V0LAogICAgICAgIGV2YWxfZGF0YXNldD1ldmFsX2RhdGFzZXQsCiAgICAgICAgdHJhaW5fbG9hZF9kYXRhc2V0X2t3YXJncz10cmFpbl9sb2FkX2RhdGFzZXRfa3dhcmdzLAogICAgICAgIGV2YWxfbG9hZF9kYXRhc2V0X2t3YXJncz1ldmFsX2xvYWRfZGF0YXNldF9rd2FyZ3MsCiAgICAgICAgdG9rZW5pemVyPXRva2VuaXplciwKICAgICAgICBkYXRhc2V0X2NvbHVtbnNfdG9fdHJhaW49ZGF0YXNldF9jb2x1bW5zX3RvX3RyYWluLAogICAgKQoKICAgICMgSW5pdGlhbGl6ZSB0aGUgZGF0YSBjb2xsYXRvciBmb3IgdGhlIHRyYWluZXIgdG8gdXNlIGluIG9yZGVyIHRvIGNyZWF0ZSBiYXRjaGVzIG9mIGRhdGEKICAgIGRhdGFfY29sbGF0b3IgPSB0cmFuc2Zvcm1lcnMuRGF0YUNvbGxhdG9yRm9yTGFuZ3VhZ2VNb2RlbGluZygKICAgICAgICB0b2tlbml6ZXI9dG9rZW5pemVyLCBtbG09RmFsc2UsICoqZGF0YV9jb2xsYXRvcl9jb25maWcKICAgICkKCiAgICAjIEluaXRpYWxpemUgdHJhaW5pbmcga3dhcmdzIGZyb20gdXNlciBrd2FyZ3M6CiAgICB0cmFpbl9rd2FyZ3MgPSBjb25maWdzW0NvbmZpZ0tleXMudHJhaW5pbmddCgogICAgIyBJZiBkZWVwc3BlZWQgY29uZmlnIGdpdmVuIHdlIGFkZCBpdCB0byB0cmFpbmluZyBrd2FyZ3MKICAgIGlmIGNvbmZpZ3NbQ29uZmlnS2V5cy5kZWVwc3BlZWRdOgogICAgICAgIHRyYWluX2t3YXJnc1siZGVlcHNwZWVkIl0gPSBjb25maWdzW0NvbmZpZ0tleXMuZGVlcHNwZWVkXQoKICAgICMgVGFrZSBhIGxvb2sgYXQgdGhlIHRyYWluYWJsZSBwYXJhbWV0ZXJzIGluIHRoZSBtb2RlbAogICAgX3ByaW50X3RyYWluYWJsZV9wYXJhbWV0ZXJzKG1vZGVsKQoKICAgICMgUHJlcGFyaW5nIHRyYWluaW5nIGFyZ3VtZW50czoKICAgIHRyYWluaW5nX2FyZ3MgPSB0cmFuc2Zvcm1lcnMuVHJhaW5pbmdBcmd1bWVudHMoCiAgICAgICAgb3V0cHV0X2Rpcj10ZW1wZmlsZS5ta2R0ZW1wKCksCiAgICAgICAgKip0cmFpbl9rd2FyZ3MsCiAgICApCgogICAgdHJhaW5lciA9IHRyYW5zZm9ybWVycy5UcmFpbmVyKAogICAgICAgIG1vZGVsPW1vZGVsLAogICAgICAgIHRyYWluX2RhdGFzZXQ9dG9rZW5pemVkX3RyYWluLAogICAgICAgIGV2YWxfZGF0YXNldD10b2tlbml6ZWRfZXZhbCwKICAgICAgICB0b2tlbml6ZXI9dG9rZW5pemVyLAogICAgICAgIGRhdGFfY29sbGF0b3I9ZGF0YV9jb2xsYXRvciwKICAgICAgICBhcmdzPXRyYWluaW5nX2FyZ3MsCiAgICApCgogICAgYXBwbHlfbWxydW4odHJhaW5lciwgbW9kZWxfbmFtZT1tb2RlbF9uYW1lLnNwbGl0KCIvIilbLTFdKQogICAgbW9kZWwuY29uZmlnLnVzZV9jYWNoZSA9ICgKICAgICAgICBGYWxzZSAgIyBzaWxlbmNlIHRoZSB3YXJuaW5ncy4gUGxlYXNlIHJlLWVuYWJsZSBmb3IgaW5mZXJlbmNlIQogICAgKQoKICAgICMgQXBwbHkgdHJhaW5pbmcgd2l0aCBldmFsdWF0aW9uOgogICAgY29udGV4dC5sb2dnZXIuaW5mbyhmInRyYWluaW5nICd7bW9kZWxfbmFtZX0nIikKICAgIHRyYWluZXIudHJhaW4oKQoKICAgIHRlbXBfZGlyZWN0b3J5ID0gdGVtcGZpbGUuVGVtcG9yYXJ5RGlyZWN0b3J5KCkubmFtZQogICAgdHJhaW5lci5zYXZlX21vZGVsKHRlbXBfZGlyZWN0b3J5KQoKICAgICMgWmlwIHRoZSBtb2RlbCBkaXJlY3Rvcnk6CiAgICBzaHV0aWwubWFrZV9hcmNoaXZlKAogICAgICAgIGJhc2VfbmFtZT0ibW9kZWwiLAogICAgICAgIGZvcm1hdD0iemlwIiwKICAgICAgICByb290X2Rpcj10ZW1wX2RpcmVjdG9yeSwKICAgICkKCiAgICAjIExvZyB0aGUgbW9kZWw6CiAgICBjb250ZXh0LmxvZ19tb2RlbCgKICAgICAgICBrZXk9Im1vZGVsIiwKICAgICAgICBkYl9rZXk9bW9kZWxfbmFtZS5zcGxpdCgiLyIpWy0xXSwKICAgICAgICBtb2RlbF9maWxlPSJtb2RlbC56aXAiLAogICAgICAgIHRhZz0iIiwKICAgICAgICBmcmFtZXdvcms9Ikh1Z2dpbmcgRmFjZSIsCiAgICApCgoKZGVmIGV2YWx1YXRlKAogICAgY29udGV4dCwKICAgIG1vZGVsX3BhdGgsCiAgICBkYXRhOiBwZC5EYXRhRnJhbWUsCiAgICBtb2RlbF9uYW1lOiBzdHIgPSBOb25lLAogICAgdG9rZW5pemVyX25hbWU6IHN0ciA9IE5vbmUsCik6CiAgICAiIiIKICAgIEV2YWx1YXRpbmcgdGhlIG1vZGVsIHVzaW5nIHBlcnBsZXhpdHksIGZvciBtb3JlIGluZm9ybWF0aW9uIHZpc2l0OgogICAgaHR0cHM6Ly9odWdnaW5nZmFjZS5jby9kb2NzL3RyYW5zZm9ybWVycy9wZXJwbGV4aXR5CgogICAgOnBhcmFtIGNvbnRleHQ6ICAgICBtbHJ1biBjb250ZXh0CiAgICA6cGFyYW0gbW9kZWxfcGF0aDogIHBhdGggdG8gdGhlIG1vZGVsIGRpcmVjdG9yeQogICAgOnBhcmFtIGRhdGE6ICAgICAgICB0aGUgZGF0YSB0byBldmFsdWF0ZSB0aGUgbW9kZWwKICAgIDpwYXJhbSBtb2RlbF9uYW1lOiAgbmFtZSBvZiBiYXNlIG1vZGVsCiAgICA6cGFyYW0gdG9rZW5pemVyX25hbWU6IG5hbWUgb2YgYmFzZSB0b2tlbml6ZXIKICAgICIiIgogICAgIyBHZXQgdGhlIG1vZGVsIGFydGlmYWN0IGFuZCBmaWxlOgogICAgKAogICAgICAgIG1vZGVsX2ZpbGUsCiAgICAgICAgbW9kZWxfYXJ0aWZhY3QsCiAgICAgICAgZXh0cmFfZGF0YSwKICAgICkgPSBtbHJ1bi5hcnRpZmFjdHMuZ2V0X21vZGVsKG1vZGVsX3BhdGgpCgogICAgIyBSZWFkIHRoZSBuYW1lOgogICAgX21vZGVsX25hbWUgPSBtb2RlbF9hcnRpZmFjdC5zcGVjLmRiX2tleQoKICAgICMgRXh0cmFjdCBsb2dnZWQgbW9kZWwgZmlsZXM6CiAgICBtb2RlbF9kaXJlY3RvcnkgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKG1vZGVsX2ZpbGUpLCBfbW9kZWxfbmFtZSkKICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKG1vZGVsX2ZpbGUsICJyIikgYXMgemlwX2ZpbGU6CiAgICAgICAgemlwX2ZpbGUuZXh0cmFjdGFsbChtb2RlbF9kaXJlY3RvcnkpCgogICAgIyBMb2FkaW5nIHRoZSBzYXZlZCBwcmV0cmFpbmVkIHRva2VuaXplciBhbmQgbW9kZWw6CiAgICBkYXRhc2V0ID0gRGF0YXNldC5mcm9tX3BhbmRhcyhkYXRhKQogICAgdG9rZW5pemVyID0gQXV0b1Rva2VuaXplci5mcm9tX3ByZXRyYWluZWQodG9rZW5pemVyX25hbWUpCiAgICBwYWRfdG9rZW5faWQgPSB0b2tlbml6ZXIuZW9zX3Rva2VuX2lkCiAgICBtb2RlbCA9IEF1dG9Nb2RlbEZvckNhdXNhbExNLmZyb21fcHJldHJhaW5lZCgKICAgICAgICBtb2RlbF9uYW1lLCBkZXZpY2VfbWFwPSJjdWRhOjAiLCB0cnVzdF9yZW1vdGVfY29kZT1UcnVlLCBsb2FkX2luXzhiaXQ9VHJ1ZQogICAgKQogICAgbW9kZWwgPSBQZWZ0TW9kZWwuZnJvbV9wcmV0cmFpbmVkKG1vZGVsLCBtb2RlbF9kaXJlY3RvcnkpCiAgICBtb2RlbC5ldmFsKCkKICAgIGVuY29kaW5ncyA9IHRva2VuaXplcigiXG5cbiIuam9pbihkYXRhc2V0WyJ0ZXh0Il1bOjVdKSwgcmV0dXJuX3RlbnNvcnM9InB0IikKCiAgICBtYXhfbGVuZ3RoID0gMTAyNAogICAgc3RyaWRlID0gNTEyCiAgICBzZXFfbGVuID0gZW5jb2RpbmdzLmlucHV0X2lkcy5zaXplKDEpCgogICAgbmxscyA9IFtdCiAgICBwcmV2X2VuZF9sb2MgPSAwCiAgICBmb3IgYmVnaW5fbG9jIGluIHJhbmdlKDAsIHNlcV9sZW4sIHN0cmlkZSk6CiAgICAgICAgZW5kX2xvYyA9IG1pbihiZWdpbl9sb2MgKyBtYXhfbGVuZ3RoLCBzZXFfbGVuKQogICAgICAgIHRyZ19sZW4gPSBlbmRfbG9jIC0gcHJldl9lbmRfbG9jICAjIG1heSBiZSBkaWZmZXJlbnQgZnJvbSBzdHJpZGUgb24gbGFzdCBsb29wCiAgICAgICAgaW5wdXRfaWRzID0gZW5jb2RpbmdzLmlucHV0X2lkc1s6LCBiZWdpbl9sb2M6ZW5kX2xvY10KICAgICAgICB0YXJnZXRfaWRzID0gaW5wdXRfaWRzLmNsb25lKCkKICAgICAgICB0YXJnZXRfaWRzWzosIDotdHJnX2xlbl0gPSAtMTAwCgogICAgICAgIHdpdGggdG9yY2gubm9fZ3JhZCgpOgogICAgICAgICAgICBvdXRwdXRzID0gbW9kZWwoaW5wdXRfaWRzLmN1ZGEoKSwgbGFiZWxzPXRhcmdldF9pZHMpCgogICAgICAgICAgICAjIGxvc3MgaXMgY2FsY3VsYXRlZCB1c2luZyBDcm9zc0VudHJvcHlMb3NzIHdoaWNoIGF2ZXJhZ2VzIG92ZXIgdmFsaWQgbGFiZWxzCiAgICAgICAgICAgICMgTi5CLiB0aGUgbW9kZWwgb25seSBjYWxjdWxhdGVzIGxvc3Mgb3ZlciB0cmdfbGVuIC0gMSBsYWJlbHMsIGJlY2F1c2UgaXQgaW50ZXJuYWxseSBzaGlmdHMgdGhlIGxhYmVscwogICAgICAgICAgICAjIHRvIHRoZSBsZWZ0IGJ5IDEuCiAgICAgICAgICAgIG5lZ19sb2dfbGlrZWxpaG9vZCA9IG91dHB1dHMubG9zcwoKICAgICAgICBubGxzLmFwcGVuZChuZWdfbG9nX2xpa2VsaWhvb2QpCgogICAgICAgIHByZXZfZW5kX2xvYyA9IGVuZF9sb2MKICAgICAgICBpZiBlbmRfbG9jID09IHNlcV9sZW46CiAgICAgICAgICAgIGJyZWFrCgogICAgcHBsID0gdG9yY2guZXhwKHRvcmNoLnN0YWNrKG5sbHMpLm1lYW4oKSkuaXRlbSgpCiAgICBjb250ZXh0LmxvZ19yZXN1bHQoInBlcnBsZXhpdHkiLCBwcGwpCg== - commands: [] - code_origin: https://github.com/ZeevRispler/functions.git#a63a647cf6bc3015a8dcbd18903f9db44bdf0b66:/Users/Zeev_Rispler/PycharmProjects/functions/huggingface_auto_trainer/huggingface_auto_trainer.py - origin_filename: /Users/Zeev_Rispler/PycharmProjects/functions/huggingface_auto_trainer/huggingface_auto_trainer.py - requirements: [] - entry_points: - add_interface: - name: add_interface - doc: '' - parameters: - - name: cls - default: '' - - name: obj - type: Trainer - default: '' - - name: restoration - type: MLRunInterfaceRestorationType - default: null - outputs: - - default: '' - lineno: 70 - mlrun_train: - name: mlrun_train - doc: '' - parameters: - - name: cls - default: '' - outputs: - - default: '' - lineno: 80 - wrapper: - name: wrapper - doc: '' - parameters: - - name: self - type: Trainer - default: '' - outputs: - - default: '' - lineno: 81 - on_epoch_begin: - name: on_epoch_begin - doc: '' - parameters: - - name: self - default: '' - - name: args - type: TrainingArguments - default: '' - - name: state - type: TrainerState - default: '' - - name: control - type: TrainerControl - default: '' - outputs: - - default: '' - lineno: 129 - on_epoch_end: - name: on_epoch_end - doc: '' - parameters: - - name: self - default: '' - - name: args - type: TrainingArguments - default: '' - - name: state - type: TrainerState - default: '' - - name: control - type: TrainerControl - default: '' - outputs: - - default: '' - lineno: 140 - on_log: - name: on_log - doc: '' - parameters: - - name: self - default: '' - - name: args - type: TrainingArguments - default: '' - - name: state - type: TrainerState - default: '' - - name: control - type: TrainerControl - default: '' - - name: logs - type: Dict[str, float] - default: null - outputs: - - default: '' - lineno: 151 - on_train_begin: - name: on_train_begin - doc: '' - parameters: - - name: self - default: '' - - name: args - type: TrainingArguments - default: '' - - name: state - type: TrainerState - default: '' - - name: control - type: TrainerControl - default: '' - outputs: - - default: '' - lineno: 177 - on_train_end: - name: on_train_end - doc: '' - parameters: - - name: self - default: '' - - name: args - type: TrainingArguments - default: '' - - name: state - type: TrainerState - default: '' - - name: control - type: TrainerControl - default: '' - - name: model - type: PreTrainedModel - default: null - - name: tokenizer - type: PreTrainedTokenizer - default: null - outputs: - - default: '' - lineno: 188 - on_evaluate: - name: on_evaluate - doc: '' - parameters: - - name: self - default: '' - - name: args - type: TrainingArguments - default: '' - - name: state - type: TrainerState - default: '' - - name: control - type: TrainerControl - default: '' - outputs: - - default: '' - lineno: 201 - log_metrics: - name: log_metrics - doc: '' - parameters: - - name: self - default: '' - outputs: - - default: '' - lineno: 215 - log_metric_plot: - name: log_metric_plot - doc: '' - parameters: - - name: self - default: '' - - name: name - type: str - default: '' - - name: scores - type: List[float] - default: '' - outputs: - - default: '' - lineno: 222 - apply_mlrun: - name: apply_mlrun - doc: This is temporary and will be built in mlrun 1.5.0 - parameters: - - name: trainer - type: Trainer - default: '' - - name: model_name - type: str - default: null - - name: tag - type: str - default: '' - - name: context - type: MLClientCtx - default: null - - name: auto_log - type: bool - default: true - - name: labels - type: Dict[str, str] - default: null - - name: extra_data - type: dict - default: null - outputs: - - default: '' - lineno: 244 - finetune_llm: - name: finetune_llm - doc: "Fine-tunes a Language Model (LLM) on a specific task using the provided\ - \ dataset.\n The function takes various configuration parameters to customize\ - \ the training process\n and adapt the model to specific tasks using a provided\ - \ dataset." - parameters: - - name: context - type: MLClientCtx - doc: mlrun context in order to log trained model - default: '' - - name: train_dataset - type: Union[str, mlrun.datastore.DataItem] - doc: The train dataset used for fine-tuning the language model. - default: '' - - name: eval_dataset - type: str - doc: The eval dataset used for evaluate the language model during training. - default: null - - name: train_load_dataset_kwargs - type: dict - doc: kwargs for dataset loading - default: {} - - name: eval_load_dataset_kwargs - type: dict - doc: kwargs for dataset loading - default: {} - - name: dataset_columns_to_train - type: Union[str, list] - doc: which columns to pass to the model as inputs - default: text - - name: model - type: Union[str, List[str]] - doc: a tuple containing model name and class, or str with model name or path - default: huggingface-model - - name: tokenizer - type: Union[str, List[str]] - doc: a tuple containing tokenizer name and class, or str with tokenizer name - or path - default: null - - name: deepspeed_config - type: Union[dict, bool] - doc: Configuration options for DeepSpeed (optional). - default: false - - name: quantization_config - type: Union[dict, bool] - doc: Configuration options for model quantization (optional). - default: false - - name: lora_config - type: Union[dict, bool] - doc: Configuration options for Low-Rank Approximation (LoRA) (optional). - default: false - - name: training_config - type: dict - doc: Configuration options specific to the fine-tuning training process (optional). - default: {} - - name: model_pretrained_config - type: dict - doc: config to load the pretrained model - default: {} - - name: tokenizer_pretrained_config - type: dict - doc: config to load the pretrained tokenizer - default: {} - - name: data_collator_config - type: dict - doc: Configuration options for data collation during training (optional). - default: {} - - name: task - type: str - doc: A description of the specific task the model is being fine-tuned for. - default: text-generation - - name: use_cuda - type: bool - doc: use gpu or not - default: true - - name: framework - type: str - doc: pt ot tf - default: pt - - name: device_map - type: str - default: auto - outputs: - - default: '' - lineno: 630 - evaluate: - name: evaluate - doc: 'Evaluating the model using perplexity, for more information visit: - - https://huggingface.co/docs/transformers/perplexity' - parameters: - - name: context - doc: mlrun context - default: '' - - name: model_path - doc: path to the model directory - default: '' - - name: data - type: DataFrame - doc: the data to evaluate the model - default: '' - - name: model_name - type: str - doc: name of base model - default: null - - name: tokenizer_name - type: str - doc: name of base tokenizer - default: null - outputs: - - default: '' - lineno: 784 - description: fine-tune llm model with ease - default_handler: finetune_llm - disable_auto_mount: false - clone_target_dir: '' - env: [] - priority_class_name: '' - preemption_mode: prevent - affinity: null - tolerations: null - security_context: {} -verbose: false diff --git a/huggingface_auto_trainer/huggingface_auto_trainer.ipynb b/huggingface_auto_trainer/huggingface_auto_trainer.ipynb deleted file mode 100644 index 847fa98d6..000000000 --- a/huggingface_auto_trainer/huggingface_auto_trainer.ipynb +++ /dev/null @@ -1,195 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "a2c5dc6d-33d0-4e74-a875-6eab556e3b2d", - "metadata": {}, - "source": [ - "# Llm auto trainer" - ] - }, - { - "cell_type": "markdown", - "id": "cc7aa261-17b2-4362-bf6a-34af79b0230b", - "metadata": {}, - "source": [ - "## Notebook Introduction: Fine-Tuning a Large Language Model with Ease\n", - "\n", - "Welcome to this example notebook that demonstrates a simplified yet powerful approach to fine-tuning a Large Language Model (LLM) effortlessly. Fine-tuning is a crucial technique that allows you to adapt pre-trained language models to specific tasks, making them more contextually relevant and useful.\n", - "\n", - "In this notebook, we will walk you through a step-by-step process of fine-tuning a state-of-the-art language model using a user-friendly and efficient method. You don't need to be an expert in machine learning or natural language processing to follow along – our approach focuses on simplicity and effectiveness." - ] - }, - { - "cell_type": "markdown", - "id": "425249e9-f43f-45e6-aa25-9f53099049cd", - "metadata": {}, - "source": [ - "### First, we will select the model we wish to fine-tune and take the matching tokenizer and appropriate config" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3410e9c2-0557-4961-995e-0ef0cc07bf82", - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "from transformers import AutoTokenizer, AutoModelForCausalLM, GenerationConfig\n", - "from transformers import logging\n", - "\n", - "logging.set_verbosity(\"CRITICAL\")\n", - "\n", - "model_name = \"tiiuae/falcon-7b\"\n", - "tokenizer = model_name\n", - "generation_config = GenerationConfig.from_pretrained(model_name)" - ] - }, - { - "cell_type": "markdown", - "id": "f33f3c35-cf61-4b0f-8da9-1c30d3b53230", - "metadata": {}, - "source": [ - "### Then, in order to use with mlrun, we will create an mlrun project and create an mlrun function" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a8ee7c35-adf7-4ed8-9e7e-e659b9461cd5", - "metadata": {}, - "outputs": [], - "source": [ - "import mlrun\n", - "\n", - "project = mlrun.get_or_create_project(\n", - " name=\"auto-trainer-test\",\n", - " context=\"./\",\n", - " user_project=True,\n", - " parameters={\n", - " \"default_image\": \"yonishelach/mlrun-llm\",\n", - " },\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d56b834f-adf6-4736-8de7-3348e050f561", - "metadata": {}, - "outputs": [], - "source": [ - "project.set_function(\n", - " \"auto-trainer.py\",\n", - " name=\"auto-trainer\",\n", - " kind=\"job\",\n", - " image=\"yonishelach/mlrun-llm\",\n", - " handler=\"finetune_llm\",\n", - ")\n", - "project.save()" - ] - }, - { - "cell_type": "markdown", - "id": "f42315db-6ddd-4dc1-89f3-c732f92d0d47", - "metadata": {}, - "source": [ - "### we can set the every config or parameter we want, including training arguments, hyper parameters and more, and pass to the function" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8e62e577-15fb-477d-9c56-fa9fb4c2669b", - "metadata": {}, - "outputs": [], - "source": [ - "import transformers\n", - "\n", - "training_arguments = {\n", - " \"per_device_train_batch_size\": 4,\n", - " \"gradient_accumulation_steps\": 1,\n", - " \"warmup_steps\": 2,\n", - " \"max_steps\": 10,\n", - " \"learning_rate\": 2e-4,\n", - " \"fp16\": True,\n", - " \"logging_steps\": 1,\n", - " \"optim\": \"paged_adamw_8bit\",\n", - "}" - ] - }, - { - "cell_type": "markdown", - "id": "284a5772-f88d-46c9-87bc-fc14e434c1b4", - "metadata": {}, - "source": [ - "### Now we simply run the function" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "11ab5888-5870-4bf8-9657-db930adecd77", - "metadata": {}, - "outputs": [], - "source": [ - "training_run = mlrun.run_function(\n", - " function=\"auto-trainer\",\n", - " name=\"auto-trainer\",\n", - " local=True,\n", - " params={\n", - " \"model\": (model_name, \"transformers.AutoModelForCausalLM\"),\n", - " \"tokenizer\": tokenizer,\n", - " \"train_dataset\": \"Abirate/english_quotes\",\n", - " \"training_config\": training_arguments,\n", - " \"quantization_config\": True,\n", - " \"lora_config\": True,\n", - " \"dataset_columns_to_train\": \"quote\",\n", - " \"lora_target_modules\": [\"query_key_value\"],\n", - " \"model_pretrained_config\": {\"trust_remote_code\": True, \"use_cache\": False},\n", - " },\n", - " handler=\"finetune_llm\",\n", - " outputs=[\"model\"],\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "0e674d25-5f1f-4ea8-af02-7d22c2fb6760", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7a4dfe9b-407a-43c0-9c5e-56de106477ac", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "mlrun-base", - "language": "python", - "name": "conda-env-mlrun-base-py" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.16" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/huggingface_auto_trainer/huggingface_auto_trainer.py b/huggingface_auto_trainer/huggingface_auto_trainer.py deleted file mode 100644 index d1166318c..000000000 --- a/huggingface_auto_trainer/huggingface_auto_trainer.py +++ /dev/null @@ -1,855 +0,0 @@ -import importlib -import os -import shutil -import tempfile -import zipfile -from abc import ABC -from typing import Dict, List, Tuple, Union - -import mlrun -import numpy as np -import pandas as pd -import peft -import torch -import transformers -from datasets import Dataset, load_dataset -from mlrun.artifacts.manager import Artifact, PlotlyArtifact -from mlrun.datastore import is_store_uri -from mlrun.frameworks._common import CommonTypes, MLRunInterface -from mlrun.utils import logger -from peft import (LoraConfig, PeftModel, get_peft_model, - prepare_model_for_kbit_training) -from plotly import graph_objects as go -from transformers import (AutoModelForCausalLM, AutoTokenizer, - BitsAndBytesConfig, DataCollatorForLanguageModeling, - PreTrainedModel, PreTrainedTokenizer, Trainer, - TrainerCallback, TrainerControl, TrainerState, - TrainingArguments) - -supported_tasks = [ - "question-answering", - "summarization", - "table-question-answering", - "text2text-generation", - "text-classification", - "sentiment-analysis", - "text-generation", - "token-classification", - "translation", - "translation_xx_to_yy", -] - - -class ConfigKeys: - deepspeed = "deepspeed" - quantization = "quantization" - lora = "lora" - training = "training" - tokenizer_pretrained = "tokenizer_pretrained" - model_pretrained = "model_pretrained" - data_collator = "data_collator" - - -# ----------------------from MLRUN-------------------------------- -class HFTrainerMLRunInterface(MLRunInterface, ABC): - """ - This is temporary and will be built in mlrun 1.5.0 - Interface for adding MLRun features for tensorflow keras API. - """ - - # MLRuns context default name: - DEFAULT_CONTEXT_NAME = "mlrun-huggingface" - - # Attributes to replace so the MLRun interface will be fully enabled. - _REPLACED_METHODS = [ - "train", - # "evaluate" - ] - - @classmethod - def add_interface( - cls, - obj: Trainer, - restoration: CommonTypes.MLRunInterfaceRestorationType = None, - ): - super(HFTrainerMLRunInterface, cls).add_interface( - obj=obj, restoration=restoration - ) - - @classmethod - def mlrun_train(cls): - def wrapper(self: Trainer, *args, **kwargs): - # Restore the evaluation method as `train` will use it: - # cls._restore_attribute(obj=self, attribute_name="evaluate") - - # Call the original fit method: - result = self.original_train(*args, **kwargs) - - # Replace the evaluation method again: - # cls._replace_function(obj=self, function_name="evaluate") - - return result - - return wrapper - - -class MLRunCallback(TrainerCallback): - """ - This is temporary and will be built in mlrun 1.5.0 - Callback for collecting logs during training / evaluation of the `Trainer` API. - """ - - def __init__( - self, - context: mlrun.MLClientCtx = None, - model_name: str = "model", - tag: str = "", - labels: Dict[str, str] = None, - extra_data: dict = None, - ): - super().__init__() - - # Store the configurations: - self._context = ( - context - if context is not None - else mlrun.get_or_create_ctx("./mlrun-huggingface") - ) - self._model_name = model_name - self._tag = tag - self._labels = labels - self._extra_data = extra_data if extra_data is not None else {} - - # Set up the logging mode: - self._is_training = False - self._steps: List[List[int]] = [] - self._metric_scores: Dict[str, List[float]] = {} - self._artifacts: Dict[str, Artifact] = {} - - def on_epoch_begin( - self, - args: TrainingArguments, - state: TrainerState, - control: TrainerControl, - **kwargs, - ): - if not state.is_world_process_zero: - return - self._steps.append([]) - - def on_epoch_end( - self, - args: TrainingArguments, - state: TrainerState, - control: TrainerControl, - **kwargs, - ): - if not state.is_world_process_zero: - return - self.log_metrics() - - def on_log( - self, - args: TrainingArguments, - state: TrainerState, - control: TrainerControl, - logs: Dict[str, float] = None, - **kwargs, - ): - if not state.is_world_process_zero: - return - recent_logs = state.log_history[-1].copy() - - recent_logs.pop("epoch") - current_step = int(recent_logs.pop("step")) - if current_step not in self._steps[-1]: - self._steps[-1].append(current_step) - - for metric_name, metric_score in recent_logs.items(): - if metric_name.startswith("train_"): - if metric_name.split("train_")[1] not in self._metric_scores: - self._metric_scores[metric_name] = [metric_score] - continue - if metric_name not in self._metric_scores: - self._metric_scores[metric_name] = [] - self._metric_scores[metric_name].append(metric_score) - - def on_train_begin( - self, - args: TrainingArguments, - state: TrainerState, - control: TrainerControl, - **kwargs, - ): - if not state.is_world_process_zero: - return - self._is_training = True - - def on_train_end( - self, - args: TrainingArguments, - state: TrainerState, - control: TrainerControl, - model: PreTrainedModel = None, - tokenizer: PreTrainedTokenizer = None, - **kwargs, - ): - if not state.is_world_process_zero: - return - self.log_metrics() - - def on_evaluate( - self, - args: TrainingArguments, - state: TrainerState, - control: TrainerControl, - **kwargs, - ): - if not state.is_world_process_zero: - return - self.log_metrics() - - if self._is_training: - return - - def log_metrics(self): - for metric_name, metric_scores in self._metric_scores.items(): - self._context.log_result(key=metric_name, value=metric_scores[-1]) - if len(metric_scores) > 1: - self.log_metric_plot(name=metric_name, scores=metric_scores) - self._context.commit(completed=False) - - def log_metric_plot(self, name: str, scores: List[float]): - # Initialize a plotly figure: - metric_figure = go.Figure() - - # Add titles: - metric_figure.update_layout( - title=name.capitalize().replace("_", " "), - xaxis_title="Samples", - yaxis_title="Scores", - ) - - # Draw: - metric_figure.add_trace( - go.Scatter(x=np.arange(len(scores)), y=scores, mode="lines") - ) - - # Create the plotly artifact: - artifact_name = f"{name}_plot" - artifact = PlotlyArtifact(key=artifact_name, figure=metric_figure) - self._artifacts[artifact_name] = self._context.log_artifact(artifact) - - -def apply_mlrun( - trainer: transformers.Trainer, - model_name: str = None, - tag: str = "", - context: mlrun.MLClientCtx = None, - auto_log: bool = True, - labels: Dict[str, str] = None, - extra_data: dict = None, - **kwargs, -): - """ - This is temporary and will be built in mlrun 1.5.0 - """ - # Get parameters defaults: - if context is None: - context = mlrun.get_or_create_ctx(HFTrainerMLRunInterface.DEFAULT_CONTEXT_NAME) - - HFTrainerMLRunInterface.add_interface(obj=trainer) - - if auto_log: - trainer.add_callback( - MLRunCallback( - context=context, - model_name=model_name, - tag=tag, - labels=labels, - extra_data=extra_data, - ) - ) - - -# ----------------------end from MLRUN-------------------------------- - - -def _print_trainable_parameters(model): - """ - Prints the number of trainable parameters in the model. - """ - trainable_params = 0 - all_param = 0 - for _, param in model.named_parameters(): - all_param += param.numel() - if param.requires_grad: - trainable_params += param.numel() - print( - f"trainable params: {trainable_params} || all params: {all_param} || trainable%:" - f" {100 * trainable_params / all_param}" - ) - - -# default configs -# will be used if user provides "True" with config name as input -QUANTIZATION_CONFIG = transformers.BitsAndBytesConfig( - load_in_4bit=True, - bnb_4bit_use_double_quant=True, - bnb_4bit_quant_type="nf4", - bnb_4bit_compute_dtype=torch.bfloat16, -) - -LORA_CONFIG = peft.LoraConfig( - r=8, - lora_alpha=32, - target_modules=["query_key_value"], - lora_dropout=0.05, - bias="none", - task_type="CAUSAL_LM", -) - -DEEPSPEED_CONFIG = { - "train_micro_batch_size_per_gpu": "auto", - "fp16": {"enabled": True}, - "autotuning": { - "enabled": True, - "arg_mappings": { - "train_micro_batch_size_per_gpu": "--per_device_train_batch_size", - "gradient_accumulation_steps ": "--gradient_accumulation_steps", - }, - }, - "zero_optimization": { - "stage": 2, - }, -} - - -def _update_config(src: dict, dst: dict): - """ - update configs according to user, this way the user can add/modify values in default configs for e.g. - - goes over all configs and corresponding prefixes, collect all the keys from the given dict that start - with the prefix and add them to appropriate config - - :param src: dict of all candidate values to update dict. - :param dst: dict containing all configs to update. - """ - - for config_name, config in dst.items(): - - # If given True we use default dict - # Can also be False or a config dict given from user, so we check specifically fo True - if config is True and config_name == "quantization": - config = QUANTIZATION_CONFIG - - if config is True and config_name == "lora": - config = LORA_CONFIG - - if config is True and config_name == "deepspeed": - config = DEEPSPEED_CONFIG - - # in some cases we can get a boolean value, in that case no need to look for args - if isinstance(config, bool): - config = None - - elif isinstance(config, dict): - for key, val in src.items(): - if key.startswith(config_name): - config[key.replace(f"{config_name}_", "")] = val - - # update by config name - else: - for key, val in src.items(): - if key.startswith(config_name): - setattr(config, key.replace(f"{config_name}_", ""), val) - - dst.update({config_name: config}) - - -def _get_class_object(class_path: str) -> type: - """ - given a full class name, this function returns the correct class - - :param class_path: a full class name (ex. 'transformers.AutoModelForCausalLM') - - :return the wanted class object - """ - module_path, class_name = class_path.rsplit(".", 1) - module = importlib.import_module(module_path) - return getattr(module, class_name) - - -def _set_model_and_tokenizer( - model: Union[str, List[str]], - tokenizer: Union[str, List[str]], - task: str, - framework: str, - lora_config: dict, - quantization_config: dict, - use_cuda: bool, - tokenizer_pretrained_config, - model_pretrained_config, - device_map: str, -): - """ - get the correct model and tokenizer according to given user inputs - - :param model: a tuple containing model name and class, or str with model name or path - :param tokenizer: a tuple containing tokenizer name and class, or str with tokenizer name or path - :param task: a supported nlp task, used to choose model if not provided - :param framework: pt or tf - :param lora_config: lora config or None, to load model in appropriate way - :param quantization_config: quantization config or None, to load model in appropriate way - :param use_cuda: use gpu or not - :param tokenizer_pretrained_config: config to load the pretrained tokenizer - :param model_pretrained_config: config to load the pretrained model - :param device_map: a device map for model training if using number of gpu's - - :returns: model and tokenizer - """ - # if task is not supported and no model was given we can't choose one - if task and task not in supported_tasks and not model: - logger.error("unsupported task option chosen") - raise - - # load model from store - if isinstance(model, str) and is_store_uri(model): - pass - # TODO: load both model and tokenizer and return, need guy's help - - # if it's a tuple them we assume it contains of both name and class - if isinstance(model, list): - model_name, model_class = model - model_class = _get_class_object(model_class) - - # in the case we don't get the model class we need the task in order to choose the correct model - else: - if task is None: - logger.error("task must be chosen in order to determine the correct model") - raise Exception( - "this function requires either a supported task or a model and model class to be chosen" - ) - - _, available_classes, task_options = transformers.pipelines.check_task(task) - - if isinstance(model, str): - model_name = model - - # if model is not given, we take the default model for the given task - else: - model_name, _ = transformers.pipelines.get_default_model_and_revision( - available_classes, framework, task_options - ) - if not available_classes.get(framework, tuple()): - logger.error( - "given task's default model is not supported in specified framework" - ) - raise Exception( - "this function requires either a supported task or a model and model class to be chosen" - ) - - model_class = available_classes[framework][0] - - # load the pretrained model - if use_cuda: - device_map = device_map - else: - device_map = None - - model = model_class.from_pretrained( - model_name, - quantization_config=quantization_config, - device_map=device_map, - **model_pretrained_config, - ) - - # If quantization config is given we will load a quantized model, if not a regular one - if quantization_config: - model.gradient_checkpointing_enable() - model = peft.prepare_model_for_kbit_training(model) - - # If lora config was given we want to do lora fine tune, we update model here - if lora_config: - model = peft.get_peft_model(model, lora_config) - - # if not specified we choose the default tokenizer that corresponding to the model - if tokenizer is None: - tokenizer = transformers.AutoTokenizer.from_pretrained(model_name) - return model_name, model, tokenizer - - if isinstance(tokenizer, str): - tokenizer_name = tokenizer - tokenizer_class = transformers.AutoTokenizer - - # if it's not a str then it's a tuple of both name and class - else: - tokenizer_name, tokenizer_class = tokenizer - tokenizer_class = _get_class_object(tokenizer_class) - - tokenizer = tokenizer_class.from_pretrained( - tokenizer_name, **tokenizer_pretrained_config - ) - - tokenizer.pad_token = tokenizer.eos_token - - return model_name, model, tokenizer - - -def _dataset_loader(dataset: str, is_train: bool = True, **kwargs) -> Dataset: - """ - loads the specific dataset provided by the user - - :param dataset: name or path of dataset to load - :param is_train: bool that indicates the purpose of the dataset - :param kwargs: other kwargs for loading the dataset - - :returns: loaded dataset - """ - # if split in kwargs then the user decides how to split the dataset - if "split" in kwargs: - return load_dataset(dataset, **kwargs) - - # if it's a dataset for train we split with train - if is_train: - return load_dataset(dataset, split="train", **kwargs) - - # if it's eval dataset, then a lot of names are acceptable for the set and we check all of them - dataset = load_dataset(dataset, **kwargs) - if "test" in dataset: - return dataset.get("test") - elif "eval" in dataset: - return dataset.get("eval") - elif "validation" in dataset: - return dataset.get("validation") - - -def _prepare_dataset( - train_dataset: str, - eval_dataset: str, - train_load_dataset_kwargs, - eval_load_dataset_kwargs, - tokenizer, - dataset_columns_to_train: Union[str, list], -) -> (Dataset, Union[Dataset, None]): - """ - Loads the train and eval datasets (if provided) passes them through the tokenizer and - returns them ready to use in training - - :param train_dataset: the name or path to the train dataset - :param eval_dataset: the name or path to the eval dataset - :param dataset_columns_to_train: which columns to pass to the model as inputs - (need to pass through the tokenizer first) - :param train_load_dataset_kwargs: kwargs for dataset loading - :param eval_load_dataset_kwargs: kwargs for dataset loading - :param tokenizer: the tokenizer to pass the data through - - :returns: tokenized datasets - """ - if not tokenizer.pad_token: - tokenizer.pad_token = tokenizer.eos_token - - # we take col name/s in a list for easy generalization - if isinstance(dataset_columns_to_train, str): - dataset_columns_to_train = [dataset_columns_to_train] - - if isinstance(train_dataset, mlrun.datastore.DataItem): - train_dataset = Dataset.from_pandas(train_dataset.as_df()) - return ( - train_dataset.map( - lambda examples: tokenizer( - *[examples[col] for col in dataset_columns_to_train], - truncation=True, - padding=True, - ), - batched=True, - ), - None, - ) - - # Load datasets - # if provided two paths/names we load each separately using designated func - if eval_dataset: - train_dataset = _dataset_loader( - dataset=train_dataset, is_train=True, **train_load_dataset_kwargs - ) - eval_dataset = _dataset_loader( - dataset=eval_dataset, is_train=False, **eval_load_dataset_kwargs - ) - - # if only on path is given then we must check if it contains both dataset or if only one should be used - else: - dataset = load_dataset(train_dataset, **train_load_dataset_kwargs) - if "train" in dataset: - train_dataset = dataset.get("train") - if "test" in dataset: - eval_dataset = dataset.get("test") - elif "eval" in dataset: - eval_dataset = dataset.get("eval") - elif "validation" in dataset: - eval_dataset = dataset.get("validation") - else: - # only train dataset given, tokenize and return it - return ( - train_dataset.map( - lambda examples: tokenizer( - *[examples[col] for col in dataset_columns_to_train], - truncation=True, - padding=True, - ), - batched=True, - ), - None, - ) - else: - logger.error("train dataset is mandatory") - raise KeyError("no train dataset found in given dataset") - - # Tokenize the data so the model can understand it - tokenized_train_dataset = train_dataset.map( - lambda examples: tokenizer( - *[examples[col] for col in dataset_columns_to_train], - truncation=True, - padding=True, - ), - batched=True, - ) - - tokenized_eval_dataset = eval_dataset.map( - lambda examples: tokenizer( - *[examples[col] for col in dataset_columns_to_train], - truncation=True, - padding=True, - ), - batched=True, - ) - - return tokenized_train_dataset, tokenized_eval_dataset - - -def finetune_llm( - context: mlrun.MLClientCtx, - train_dataset: Union[str, mlrun.datastore.DataItem], - eval_dataset: str = None, - train_load_dataset_kwargs: dict = {}, - eval_load_dataset_kwargs: dict = {}, - dataset_columns_to_train: Union[str, list] = "text", - model: Union[str, List[str]] = "huggingface-model", - tokenizer: Union[str, List[str]] = None, - deepspeed_config: Union[dict, bool] = False, - quantization_config: Union[dict, bool] = False, - lora_config: Union[dict, bool] = False, - training_config: dict = {}, - model_pretrained_config: dict = {}, - tokenizer_pretrained_config: dict = {}, - data_collator_config: dict = {}, - task: str = "text-generation", - use_cuda: bool = True, - framework: str = "pt", - device_map: str = "auto", - **kwargs, -): - """ - Fine-tunes a Language Model (LLM) on a specific task using the provided dataset. - The function takes various configuration parameters to customize the training process - and adapt the model to specific tasks using a provided dataset. - - :param context: mlrun context in order to log trained model - :param dataset_columns_to_train: which columns to pass to the model as inputs - :param eval_load_dataset_kwargs: kwargs for dataset loading - :param train_load_dataset_kwargs: kwargs for dataset loading - :param framework: pt ot tf - :param use_cuda: use gpu or not - :param tokenizer_pretrained_config: config to load the pretrained tokenizer - :param model_pretrained_config: config to load the pretrained model - :param tokenizer: a tuple containing tokenizer name and class, or str with tokenizer name or path - :param model: a tuple containing model name and class, or str with model name or path - :param train_dataset: The train dataset used for fine-tuning the language model. - :param eval_dataset: The eval dataset used for evaluate the language model during training. - :param deepspeed_config: Configuration options for DeepSpeed (optional). - :param quantization_config: Configuration options for model quantization (optional). - :param lora_config: Configuration options for Low-Rank Approximation (LoRA) (optional). - :param training_config: Configuration options specific to the fine-tuning training process (optional). - :param data_collator_config: Configuration options for data collation during training (optional). - :param task: A description of the specific task the model is being fine-tuned for. - :param kwargs: Additional keyword arguments. - """ - - # TODO: match forward.keyword to dataset.keyword - check if relevant in new design - # TODO: add warning for label, and add option to modify dataset col names - check if relevant in new design - - # Look for updates to configs given in kwargs - configs = { - ConfigKeys.deepspeed: deepspeed_config, - ConfigKeys.quantization: quantization_config, - ConfigKeys.lora: lora_config, - ConfigKeys.training: training_config, - ConfigKeys.model_pretrained: model_pretrained_config, - ConfigKeys.tokenizer_pretrained: tokenizer_pretrained_config, - ConfigKeys.data_collator: data_collator_config, - } - _update_config(dst=configs, src=kwargs) - - # check gpu permission and availability - if use_cuda: - if torch.cuda.is_available(): - # Clean gpu cache - torch.cuda.empty_cache() - else: - logger.warning("'use_cuda' is set to True, but no cuda device is available") - - # get model and tokenizer - model_name, model, tokenizer = _set_model_and_tokenizer( - model=model, - tokenizer=tokenizer, - task=task, - framework=framework, - lora_config=configs[ConfigKeys.lora], - quantization_config=configs[ConfigKeys.quantization], - use_cuda=use_cuda, - tokenizer_pretrained_config=tokenizer_pretrained_config, - model_pretrained_config=configs[ConfigKeys.model_pretrained], - device_map=device_map, - ) - - # Load datasets - tokenized_train, tokenized_eval = _prepare_dataset( - train_dataset=train_dataset, - eval_dataset=eval_dataset, - train_load_dataset_kwargs=train_load_dataset_kwargs, - eval_load_dataset_kwargs=eval_load_dataset_kwargs, - tokenizer=tokenizer, - dataset_columns_to_train=dataset_columns_to_train, - ) - - # Initialize the data collator for the trainer to use in order to create batches of data - data_collator = transformers.DataCollatorForLanguageModeling( - tokenizer=tokenizer, mlm=False, **data_collator_config - ) - - # Initialize training kwargs from user kwargs: - train_kwargs = configs[ConfigKeys.training] - - # If deepspeed config given we add it to training kwargs - if configs[ConfigKeys.deepspeed]: - train_kwargs["deepspeed"] = configs[ConfigKeys.deepspeed] - - # Take a look at the trainable parameters in the model - _print_trainable_parameters(model) - - # Preparing training arguments: - training_args = transformers.TrainingArguments( - output_dir=tempfile.mkdtemp(), - **train_kwargs, - ) - - trainer = transformers.Trainer( - model=model, - train_dataset=tokenized_train, - eval_dataset=tokenized_eval, - tokenizer=tokenizer, - data_collator=data_collator, - args=training_args, - ) - - apply_mlrun(trainer, model_name=model_name.split("/")[-1]) - model.config.use_cache = ( - False # silence the warnings. Please re-enable for inference! - ) - - # Apply training with evaluation: - context.logger.info(f"training '{model_name}'") - trainer.train() - - temp_directory = tempfile.TemporaryDirectory().name - trainer.save_model(temp_directory) - - # Zip the model directory: - shutil.make_archive( - base_name="model", - format="zip", - root_dir=temp_directory, - ) - - # Log the model: - context.log_model( - key="model", - db_key=model_name.split("/")[-1], - model_file="model.zip", - tag="", - framework="Hugging Face", - ) - - -def evaluate( - context, - model_path, - data: pd.DataFrame, - model_name: str = None, - tokenizer_name: str = None, -): - """ - Evaluating the model using perplexity, for more information visit: - https://huggingface.co/docs/transformers/perplexity - - :param context: mlrun context - :param model_path: path to the model directory - :param data: the data to evaluate the model - :param model_name: name of base model - :param tokenizer_name: name of base tokenizer - """ - # Get the model artifact and file: - ( - model_file, - model_artifact, - extra_data, - ) = mlrun.artifacts.get_model(model_path) - - # Read the name: - _model_name = model_artifact.spec.db_key - - # Extract logged model files: - model_directory = os.path.join(os.path.dirname(model_file), _model_name) - with zipfile.ZipFile(model_file, "r") as zip_file: - zip_file.extractall(model_directory) - - # Loading the saved pretrained tokenizer and model: - dataset = Dataset.from_pandas(data) - tokenizer = AutoTokenizer.from_pretrained(tokenizer_name) - pad_token_id = tokenizer.eos_token_id - model = AutoModelForCausalLM.from_pretrained( - model_name, device_map="cuda:0", trust_remote_code=True, load_in_8bit=True - ) - model = PeftModel.from_pretrained(model, model_directory) - model.eval() - encodings = tokenizer("\n\n".join(dataset["text"][:5]), return_tensors="pt") - - max_length = 1024 - stride = 512 - seq_len = encodings.input_ids.size(1) - - nlls = [] - prev_end_loc = 0 - for begin_loc in range(0, seq_len, stride): - end_loc = min(begin_loc + max_length, seq_len) - trg_len = end_loc - prev_end_loc # may be different from stride on last loop - input_ids = encodings.input_ids[:, begin_loc:end_loc] - target_ids = input_ids.clone() - target_ids[:, :-trg_len] = -100 - - with torch.no_grad(): - outputs = model(input_ids.cuda(), labels=target_ids) - - # loss is calculated using CrossEntropyLoss which averages over valid labels - # N.B. the model only calculates loss over trg_len - 1 labels, because it internally shifts the labels - # to the left by 1. - neg_log_likelihood = outputs.loss - - nlls.append(neg_log_likelihood) - - prev_end_loc = end_loc - if end_loc == seq_len: - break - - ppl = torch.exp(torch.stack(nlls).mean()).item() - context.log_result("perplexity", ppl) diff --git a/huggingface_auto_trainer/item.yaml b/huggingface_auto_trainer/item.yaml deleted file mode 100644 index e556c11df..000000000 --- a/huggingface_auto_trainer/item.yaml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: v1 -categories: -- machine-learning -- model-training -description: fine-tune llm model with ease -doc: '' -example: huggingface_auto_trainer.ipynb -generationDate: 2023-08-21:17-25 -hidden: false -icon: '' -labels: - author: Zeevr -maintainers: [] -marketplaceType: '' -mlrunVersion: 1.4.0 -name: huggingface-auto-trainer -platformVersion: 3.5.0 -spec: - filename: huggingface_auto_trainer.py - handler: finetune_llm - image: mlrun/mlrun - kind: job - requirements: [] -url: '' -version: 1.0.0 diff --git a/huggingface_auto_trainer/requirements.txt b/huggingface_auto_trainer/requirements.txt deleted file mode 100644 index 1376b1d00..000000000 --- a/huggingface_auto_trainer/requirements.txt +++ /dev/null @@ -1,5 +0,0 @@ -peft -transformers -torch -datasets -plotly diff --git a/huggingface_auto_trainer/test_huggingface_auto_trainer.py b/huggingface_auto_trainer/test_huggingface_auto_trainer.py deleted file mode 100644 index 53576e4e7..000000000 --- a/huggingface_auto_trainer/test_huggingface_auto_trainer.py +++ /dev/null @@ -1,42 +0,0 @@ -import tempfile - -import mlrun - - -def test_train(): - - model_name = "distilgpt2" - tokenizer = model_name - auto_trainer = mlrun.import_function("function.yaml") - - training_arguments = { - "per_device_train_batch_size": 4, - "gradient_accumulation_steps": 1, - "warmup_steps": 2, - "max_steps": 10, - "learning_rate": 2e-4, - "logging_steps": 1, - } - - params = { - "model": (model_name, "transformers.AutoModelForCausalLM"), - "tokenizer": tokenizer, - "train_dataset": "Abirate/english_quotes", - "training_config": training_arguments, - "dataset_columns_to_train": "quote", - "model_pretrained_config": {"use_cache": False}, - "use_cuda": False, - } - - try: - with tempfile.TemporaryDirectory() as test_directory: - auto_trainer.run( - local=True, - params=params, - handler="finetune_llm", - returns=["model"], - workdir=test_directory, - ) - - except Exception as exception: - print(f"- The training failed - raised the following error:\n- {exception}") diff --git a/ingest/function.yaml b/ingest/function.yaml deleted file mode 100644 index a05ca6698..000000000 --- a/ingest/function.yaml +++ /dev/null @@ -1,87 +0,0 @@ -kind: job -metadata: - name: ingest - tag: '' - hash: 7e28700a86ebdd18d887fe588492201a1e3ef2f6 - project: '' - labels: - author: yonish - categories: - - data-preparation - - data-analysis - - feature-store -spec: - command: '' - args: [] - image: mlrun/mlrun - build: - functionSourceCode: ZnJvbSB0eXBpbmcgaW1wb3J0IFVuaW9uLCBMaXN0LCBEaWN0CgppbXBvcnQgbWxydW4uZmVhdHVyZV9zdG9yZSBhcyBmcwpmcm9tIG1scnVuLmV4ZWN1dGlvbiBpbXBvcnQgTUxDbGllbnRDdHgKZnJvbSBtbHJ1bi5kYXRhX3R5cGVzIGltcG9ydCBJbmZlck9wdGlvbnMKCgpkZWYgaW5nZXN0KAogICAgY29udGV4dDogTUxDbGllbnRDdHgsCiAgICBmZWF0dXJlc2V0OiBzdHIsCiAgICBzb3VyY2U6IHN0ciwKICAgIHRhcmdldHM6IExpc3RbVW5pb25bc3RyLCBEaWN0XV0gPSBOb25lLAogICAgbmFtZXNwYWNlPU5vbmUsCiAgICBpbmZlcl9vcHRpb25zPU5vbmUsCiAgICBydW5fY29uZmlnOiBVbmlvbltzdHIsIERpY3RdID0gTm9uZSwKICAgIHNwYXJrX2NvbnRleHQ9Tm9uZSwKICAgIG92ZXJ3cml0ZT1Ob25lLAopOgogICAgIiIiUmVhZCBsb2NhbCBEYXRhRnJhbWUsIGZpbGUsIFVSTCwgb3Igc291cmNlIGludG8gdGhlIGZlYXR1cmUgc3RvcmUKICAgIEluZ2VzdCByZWFkcyBmcm9tIHRoZSBzb3VyY2UsIHJ1biB0aGUgZ3JhcGggdHJhbnNmb3JtYXRpb25zLCBpbmZlcnMgIG1ldGFkYXRhIGFuZCBzdGF0cwogICAgYW5kIHdyaXRlcyB0aGUgcmVzdWx0cyB0byB0aGUgZGVmYXVsdCBvZiBzcGVjaWZpZWQgdGFyZ2V0cwoKICAgIHdoZW4gdGFyZ2V0cyBhcmUgbm90IHNwZWNpZmllZCBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgY29uZmlndXJlZCBkZWZhdWx0IHRhcmdldHMKICAgICh3aWxsIHVzdWFsbHkgYmUgTm9TUUwgZm9yIHJlYWwtdGltZSBhbmQgUGFycXVldCBmb3Igb2ZmbGluZSkuCgogICAgZXhhbXBsZTo6CgogICAgICAgIHN0b2Nrc19zZXQgPSBGZWF0dXJlU2V0KCJzdG9ja3MiLCBlbnRpdGllcz1bRW50aXR5KCJ0aWNrZXIiKV0pCiAgICAgICAgc3RvY2tzID0gcGQucmVhZF9jc3YoInN0b2Nrcy5jc3YiKQogICAgICAgIGRmID0gaW5nZXN0KHN0b2Nrc19zZXQsIHN0b2NrcywgaW5mZXJfb3B0aW9ucz1mc3RvcmUuSW5mZXJPcHRpb25zLmRlZmF1bHQoKSkKCiAgICAgICAgIyBmb3IgcnVubmluZyBhcyByZW1vdGUgam9iCiAgICAgICAgY29uZmlnID0gUnVuQ29uZmlnKGltYWdlPSdtbHJ1bi9tbHJ1bicpLmFwcGx5KG1vdW50X3YzaW8oKSkKICAgICAgICBkZiA9IGluZ2VzdChzdG9ja3Nfc2V0LCBzdG9ja3MsIHJ1bl9jb25maWc9Y29uZmlnKQoKICAgICAgICAjIHNwZWNpZnkgc291cmNlIGFuZCB0YXJnZXRzCiAgICAgICAgc291cmNlID0gQ1NWU291cmNlKCJteWNzdiIsIHBhdGg9Im1lYXN1cmVtZW50cy5jc3YiKQogICAgICAgIHRhcmdldHMgPSBbQ1NWVGFyZ2V0KCJteWNzdiIsIHBhdGg9Ii4vbXljc3YuY3N2IildCiAgICAgICAgaW5nZXN0KG1lYXN1cmVtZW50cywgc291cmNlLCB0YXJnZXRzKQoKICAgIDpwYXJhbSBjb250ZXh0OiAgICAgICBNTFJ1biBjb250ZXh0CiAgICA6cGFyYW0gZmVhdHVyZXNldDogICAgZmVhdHVyZSBzZXQgb2JqZWN0IG9yIGZlYXR1cmVzZXQudXJpLiAodXJpIG11c3QgYmUgb2YgYSBmZWF0dXJlIHNldCB0aGF0IGlzIGluIHRoZSBEQiwKICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsIGAuc2F2ZSgpYCBpZiBpdCdzIG5vdCkKICAgIDpwYXJhbSBzb3VyY2U6ICAgICAgICBzb3VyY2UgZGF0YWZyYW1lIG9yIGZpbGUgcGF0aAogICAgOnBhcmFtIHRhcmdldHM6ICAgICAgIG9wdGlvbmFsIGxpc3Qgb2YgZGF0YSB0YXJnZXQgb2JqZWN0cwogICAgOnBhcmFtIG5hbWVzcGFjZTogICAgIG5hbWVzcGFjZSBvciBtb2R1bGUgY29udGFpbmluZyBncmFwaCBjbGFzc2VzCiAgICA6cGFyYW0gaW5mZXJfb3B0aW9uczogc2NoZW1hIGFuZCBzdGF0cyBpbmZlciBvcHRpb25zCiAgICA6cGFyYW0gcnVuX2NvbmZpZzogICAgZnVuY3Rpb24gYW5kL29yIHJ1biBjb25maWd1cmF0aW9uIGZvciByZW1vdGUgam9icywKICAgICAgICAgICAgICAgICAgICAgICAgICBzZWUgOnB5OmNsYXNzOmB+bWxydW4uZmVhdHVyZV9zdG9yZS5SdW5Db25maWdgCiAgICA6cGFyYW0gc3BhcmtfY29udGV4dDogbG9jYWwgc3Bhcmsgc2Vzc2lvbiBmb3Igc3BhcmsgaW5nZXN0aW9uLCBleGFtcGxlIGZvciBjcmVhdGluZyB0aGUgc3BhcmsgY29udGV4dDoKICAgICAgICAgICAgICAgICAgICAgICAgICBgc3BhcmsgPSBTcGFya1Nlc3Npb24uYnVpbGRlci5hcHBOYW1lKCJTcGFyayBmdW5jdGlvbiIpLmdldE9yQ3JlYXRlKClgCiAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIHJlbW90ZSBzcGFyayBpbmdlc3Rpb24sIHRoaXMgc2hvdWxkIGNvbnRhaW4gdGhlIHJlbW90ZSBzcGFyayBzZXJ2aWNlIG5hbWUKICAgIDpwYXJhbSBvdmVyd3JpdGU6ICAgICBkZWxldGUgdGhlIHRhcmdldHMnIGRhdGEgcHJpb3IgdG8gaW5nZXN0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6IFRydWUgZm9yIG5vbi1zY2hlZHVsZWQgaW5nZXN0IC0gZGVsZXRlcyB0aGUgdGFyZ2V0cyB0aGF0IGFyZSBhYm91dCB0byBiZSBpbmdlc3RlZC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFsc2UgZm9yIHNjaGVkdWxlZCBpbmdlc3QgLSBkb2VzIG5vdCBkZWxldGUgdGhlIHRhcmdldCkKCiAgICAiIiIKICAgICMgU2V0dGluZyBpbmZlcl9vcHRpb25zIHRvIGRlZmF1bHQ6CiAgICBjb250ZXh0Ll9wYXJhbWV0ZXJzWyJpbmZlcl9vcHRpb25zIl0gPSBpbmZlcl9vcHRpb25zIG9yIEluZmVyT3B0aW9ucy5kZWZhdWx0KCkKCiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYiQ2FsbGluZyBpbmdlc3Rpb24gdGFzayB3aXRoOiB7ZmVhdHVyZXNldH0iKQoKICAgICMgaW5nZXN0IGNhbGxlZCB3aXRoIG1scnVuX2NvbnRleHQsIGZlYXR1cmVfc2V0LCBzb3VyY2UgYW5kIHRhcmdldHMgcGFzc2VkIHdpdGggY29udGV4dAogICAgIyBUaGlzIHBhcmFtcyBoZXJlIGZvciBkb2N1bWVudGF0aW9uIHB1cnBvc2VzIG9ubHkKICAgIGZzLmluZ2VzdCgKICAgICAgICBtbHJ1bl9jb250ZXh0PWNvbnRleHQsCiAgICAgICAgbmFtZXNwYWNlPW5hbWVzcGFjZSwKICAgICAgICBzcGFya19jb250ZXh0PXNwYXJrX2NvbnRleHQsCiAgICApCiAgICBjb250ZXh0LmxvZ19yZXN1bHQoImZlYXR1cmVzZXQiLCBmZWF0dXJlc2V0KQo= - commands: [] - code_origin: https://github.com/mlrun/functions.git#886a88217c2a2570c81a14877f9c1dfb1ac8a244:C:\Users\yonatans\projects\functions\ingest\ingest.py - origin_filename: C:\Users\yonatans\projects\functions\ingest\ingest.py - entry_points: - ingest: - name: ingest - doc: "Read local DataFrame, file, URL, or source into the feature store\nIngest\ - \ reads from the source, run the graph transformations, infers metadata and\ - \ stats\nand writes the results to the default of specified targets\n\nwhen\ - \ targets are not specified data is stored in the configured default targets\n\ - (will usually be NoSQL for real-time and Parquet for offline).\n\nexample::\n\ - \n stocks_set = FeatureSet(\"stocks\", entities=[Entity(\"ticker\")])\n\ - \ stocks = pd.read_csv(\"stocks.csv\")\n df = ingest(stocks_set, stocks,\ - \ infer_options=fstore.InferOptions.default())\n\n # for running as remote\ - \ job\n config = RunConfig(image='mlrun/mlrun').apply(mount_v3io())\n \ - \ df = ingest(stocks_set, stocks, run_config=config)\n\n # specify source\ - \ and targets\n source = CSVSource(\"mycsv\", path=\"measurements.csv\"\ - )\n targets = [CSVTarget(\"mycsv\", path=\"./mycsv.csv\")]\n ingest(measurements,\ - \ source, targets)" - parameters: - - name: context - type: MLClientCtx - doc: MLRun context - default: '' - - name: featureset - type: str - doc: feature set object or featureset.uri. (uri must be of a feature set that - is in the DB, call `.save()` if it's not) - default: '' - - name: source - type: str - doc: source dataframe or file path - default: '' - - name: targets - type: List[Union[str, Dict]] - doc: optional list of data target objects - default: null - - name: namespace - doc: namespace or module containing graph classes - default: null - - name: infer_options - doc: schema and stats infer options - default: null - - name: run_config - type: Union[str, Dict] - doc: function and/or run configuration for remote jobs, see :py:class:`~mlrun.feature_store.RunConfig` - default: null - - name: spark_context - doc: 'local spark session for spark ingestion, example for creating the spark - context: `spark = SparkSession.builder.appName("Spark function").getOrCreate()` - For remote spark ingestion, this should contain the remote spark service - name' - default: null - - name: overwrite - doc: 'delete the targets'' data prior to ingestion (default: True for non-scheduled - ingest - deletes the targets that are about to be ingested. False for scheduled - ingest - does not delete the target)' - default: null - outputs: - - default: '' - lineno: 8 - description: Feature Store ingest function that runs the transformation graph on - the source of the featureset. - default_handler: ingest - disable_auto_mount: false - env: [] - priority_class_name: '' - affinity: null -verbose: false diff --git a/ingest/ingest.ipynb b/ingest/ingest.ipynb deleted file mode 100644 index 7da398b4f..000000000 --- a/ingest/ingest.ipynb +++ /dev/null @@ -1,762 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Feature Store Ingest" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Read local DataFrame, file, URL, or source into the feature store\n", - "Ingest reads from the source, run the graph transformations, infers metadata and stats\n", - "and writes the results to the default of specified targets." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Creating Project" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import mlrun\n", - "import mlrun.feature_store as fstore\n", - "from mlrun.datastore.sources import CSVSource\n", - "from mlrun.feature_store.steps import *\n", - "from mlrun.features import MinMaxValidator\n", - "import pandas as pd\n", - "import datetime" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2022-01-31 13:52:16,939 [info] loaded project ingest from MLRun DB\n" - ] - } - ], - "source": [ - "# Initialize the MLRun project object\n", - "project = mlrun.get_or_create_project('ingest', context=\"./\", user_project=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Create Sample Data For Demo" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "quotes = pd.DataFrame(\n", - " {\n", - " \"time\": [\n", - " pd.Timestamp(\"2016-05-25 13:30:00.023\"),\n", - " pd.Timestamp(\"2016-05-25 13:30:00.023\"),\n", - " pd.Timestamp(\"2016-05-25 13:30:00.030\"),\n", - " pd.Timestamp(\"2016-05-25 13:30:00.041\"),\n", - " pd.Timestamp(\"2016-05-25 13:30:00.048\"),\n", - " pd.Timestamp(\"2016-05-25 13:30:00.049\"),\n", - " pd.Timestamp(\"2016-05-25 13:30:00.072\"),\n", - " pd.Timestamp(\"2016-05-25 13:30:00.075\"),\n", - " ],\n", - " \"ticker\": [\"GOOG\", \"MSFT\", \"MSFT\", \"MSFT\", \"GOOG\", \"AAPL\", \"GOOG\", \"MSFT\"],\n", - " \"bid\": [720.50, 51.95, 51.97, 51.99, 720.50, 97.99, 720.50, 52.01],\n", - " \"ask\": [720.93, 51.96, 51.98, 52.00, 720.93, 98.01, 720.88, 52.03],\n", - " }\n", - ")\n", - "\n", - "# move date:\n", - "max_date = quotes[\"time\"].max()\n", - "now_date = datetime.datetime.now()\n", - "delta = now_date - max_date\n", - "quotes[\"time\"] = quotes[\"time\"] + delta" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
timetickerbidask
02022-01-31 13:52:16.905388GOOG720.50720.93
12022-01-31 13:52:16.905388MSFT51.9551.96
22022-01-31 13:52:16.912388MSFT51.9751.98
32022-01-31 13:52:16.923388MSFT51.9952.00
42022-01-31 13:52:16.930388GOOG720.50720.93
52022-01-31 13:52:16.931388AAPL97.9998.01
62022-01-31 13:52:16.954388GOOG720.50720.88
72022-01-31 13:52:16.957388MSFT52.0152.03
\n", - "
" - ], - "text/plain": [ - " time ticker bid ask\n", - "0 2022-01-31 13:52:16.905388 GOOG 720.50 720.93\n", - "1 2022-01-31 13:52:16.905388 MSFT 51.95 51.96\n", - "2 2022-01-31 13:52:16.912388 MSFT 51.97 51.98\n", - "3 2022-01-31 13:52:16.923388 MSFT 51.99 52.00\n", - "4 2022-01-31 13:52:16.930388 GOOG 720.50 720.93\n", - "5 2022-01-31 13:52:16.931388 AAPL 97.99 98.01\n", - "6 2022-01-31 13:52:16.954388 GOOG 720.50 720.88\n", - "7 2022-01-31 13:52:16.957388 MSFT 52.01 52.03" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "quotes" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Build Advanced Feature Set - With Feature Engineering Pipeline" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Define a custom pipeline step (python class)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "class MyMap(MapClass):\n", - " def __init__(self, multiplier=1, **kwargs):\n", - " super().__init__(**kwargs)\n", - " self._multiplier = multiplier\n", - "\n", - " def do(self, event):\n", - " event[\"multi\"] = event[\"bid\"] * self._multiplier\n", - " return event" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Build and show the transformatiom pipeline" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "mlrun-flow\n", - "\n", - "\n", - "\n", - "_start\n", - "\n", - "start\n", - "\n", - "\n", - "\n", - "map.MyMap\n", - "\n", - "map.MyMap\n", - "\n", - "\n", - "\n", - "_start->map.MyMap\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "storey.Extend\n", - "\n", - "storey.Extend\n", - "\n", - "\n", - "\n", - "map.MyMap->storey.Extend\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "filter\n", - "\n", - "filter\n", - "\n", - "\n", - "\n", - "storey.Extend->filter\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "FeaturesetValidator\n", - "\n", - "FeaturesetValidator\n", - "\n", - "\n", - "\n", - "filter->FeaturesetValidator\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "Aggregates\n", - "\n", - "Aggregates\n", - "\n", - "\n", - "\n", - "FeaturesetValidator->Aggregates\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "parquet\n", - "\n", - "\n", - "parquet\n", - "\n", - "\n", - "\n", - "Aggregates->parquet\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "nosql\n", - "\n", - "\n", - "nosql\n", - "\n", - "\n", - "\n", - "Aggregates->nosql\n", - "\n", - "\n", - "\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "quotes_set = fstore.FeatureSet(\"stock-quotes\", entities=[fstore.Entity(\"ticker\")])\n", - "\n", - "quotes_set.graph.to(\"map.MyMap\", multiplier=3).to(\n", - " \"storey.Extend\", _fn=\"({'extra': event['bid'] * 77})\"\n", - ").to(\"storey.Filter\", \"filter\", _fn=\"(event['bid'] > 51.92)\").to(\n", - " FeaturesetValidator()\n", - ")\n", - "\n", - "quotes_set.add_aggregation(\"ask\", [\"sum\", \"max\"], \"1h\", \"10m\", name=\"asks1\")\n", - "quotes_set.add_aggregation(\"ask\", [\"sum\", \"max\"], \"5h\", \"10m\", name=\"asks5\")\n", - "quotes_set.add_aggregation(\"bid\", [\"min\", \"max\"], \"1h\", \"10m\", name=\"bids\")\n", - "\n", - "# add feature validation policy\n", - "quotes_set[\"bid\"] = fstore.Feature(\n", - " validator=MinMaxValidator(min=52, severity=\"info\")\n", - ")\n", - "\n", - "# add default target definitions and plot\n", - "quotes_set.set_targets()\n", - "quotes_set.plot(rankdir=\"LR\", with_targets=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Saving the feature set in the feature store " - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "quotes_set.save()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Creating the data source of the feature set to apply the ingest on:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "data_uri = 'quotes.csv'\n", - "quotes.to_csv(data_uri, index=False)\n", - "source = CSVSource('quotes', data_uri).to_dict()\n", - "source" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Import ingest function" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "ingest_fn = mlrun.import_function(\"function.yaml\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Running the function locally" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2022-01-31 13:52:17,201 [info] starting run ingest-ingest uid=4bd5d12691a8439d90bf53847f59df1a DB=http://mlrun-api:8080\n", - "> 2022-01-31 13:52:17,354 [info] Ingesting the FeatureSet: store://feature-sets/ingest-yonatan/stock-quotes\n", - "> 2022-01-31 13:52:17,427 [info] starting ingestion task to store://feature-sets/ingest-yonatan/stock-quotes:latest.\n", - "info! bid value is smaller than min, key=['MSFT'] time=2022-01-31 13:52:19.466055 args={'min': 52, 'value': 51.95}\n", - "info! bid value is smaller than min, key=['MSFT'] time=2022-01-31 13:52:19.466072 args={'min': 52, 'value': 51.97}\n", - "info! bid value is smaller than min, key=['MSFT'] time=2022-01-31 13:52:19.466085 args={'min': 52, 'value': 51.99}\n", - "info! bid value is smaller than min, key=['MSFT'] time=2022-01-31 13:52:19.671677 args={'min': 52, 'value': 51.95}\n", - "info! bid value is smaller than min, key=['MSFT'] time=2022-01-31 13:52:19.671692 args={'min': 52, 'value': 51.97}\n", - "info! bid value is smaller than min, key=['MSFT'] time=2022-01-31 13:52:19.671708 args={'min': 52, 'value': 51.99}\n", - "> 2022-01-31 13:52:19,915 [info] ingestion task completed, targets:\n", - "> 2022-01-31 13:52:19,915 [info] [{'name': 'parquet', 'kind': 'parquet', 'path': 'v3io:///projects/ingest-yonatan/FeatureStore/stock-quotes/parquet/sets/stock-quotes-latest', 'status': 'created', 'updated': '2022-01-31T13:52:19.649303+00:00', 'last_written': datetime.datetime(2022, 1, 31, 13, 52, 19, 671753)}, {'name': 'nosql', 'kind': 'nosql', 'path': 'v3io:///projects/ingest-yonatan/FeatureStore/stock-quotes/nosql/sets/stock-quotes-latest', 'status': 'created', 'updated': '2022-01-31T13:52:19.650044+00:00'}]\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
projectuiditerstartstatenamelabelsinputsparametersresultsartifacts
ingest-yonatan0Jan 31 13:52:17completedingest-ingest
v3io_user=yonatan
kind=
owner=yonatan
host=jupyter-yoni-647b99c95d-w4jlc
featureset=store://feature-sets/ingest-yonatan/stock-quotes
source={'kind': 'csv', 'name': 'quotes', 'path': 'quotes.csv'}
infer_options=63
overwrite=None
targets=None
featureset=store://feature-sets/ingest-yonatan/stock-quotes
\n", - "
\n", - "
\n", - "
\n", - " Title\n", - " ×\n", - "
\n", - " \n", - "
\n", - "
\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - }, - { - "data": { - "text/html": [ - " > to track results use the .show() or .logs() methods or click here to open in UI" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2022-01-31 13:52:20,045 [info] run executed, status=completed\n" - ] - } - ], - "source": [ - "ingest_run = ingest_fn.run(\n", - " handler=\"ingest\",\n", - " params={\n", - " \"featureset\": quotes_set.uri,\n", - " \"source\": source,\n", - " },\n", - " local=True,\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## View of the targets' state after run" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'created'" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "fstore.get_feature_set(ingest_run.outputs['featureset']).status.state" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/ingest/ingest.py b/ingest/ingest.py deleted file mode 100644 index 1412cbaf5..000000000 --- a/ingest/ingest.py +++ /dev/null @@ -1,84 +0,0 @@ -# Copyright 2019 Iguazio -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -from typing import Union, List, Dict - -import mlrun.feature_store as fs -from mlrun.execution import MLClientCtx -from mlrun.data_types import InferOptions - - -def ingest( - context: MLClientCtx, - featureset: str, - source: str, - targets: List[Union[str, Dict]] = None, - namespace=None, - infer_options=None, - run_config: Union[str, Dict] = None, - spark_context=None, - overwrite=None, -): - """Read local DataFrame, file, URL, or source into the feature store - Ingest reads from the source, run the graph transformations, infers metadata and stats - and writes the results to the default of specified targets - - when targets are not specified data is stored in the configured default targets - (will usually be NoSQL for real-time and Parquet for offline). - - example:: - - stocks_set = FeatureSet("stocks", entities=[Entity("ticker")]) - stocks = pd.read_csv("stocks.csv") - df = ingest(stocks_set, stocks, infer_options=fstore.InferOptions.default()) - - # for running as remote job - config = RunConfig(image='mlrun/mlrun').apply(mount_v3io()) - df = ingest(stocks_set, stocks, run_config=config) - - # specify source and targets - source = CSVSource("mycsv", path="measurements.csv") - targets = [CSVTarget("mycsv", path="./mycsv.csv")] - ingest(measurements, source, targets) - - :param context: MLRun context - :param featureset: feature set object or featureset.uri. (uri must be of a feature set that is in the DB, - call `.save()` if it's not) - :param source: source dataframe or file path - :param targets: optional list of data target objects - :param namespace: namespace or module containing graph classes - :param infer_options: schema and stats infer options - :param run_config: function and/or run configuration for remote jobs, - see :py:class:`~mlrun.feature_store.RunConfig` - :param spark_context: local spark session for spark ingestion, example for creating the spark context: - `spark = SparkSession.builder.appName("Spark function").getOrCreate()` - For remote spark ingestion, this should contain the remote spark service name - :param overwrite: delete the targets' data prior to ingestion - (default: True for non-scheduled ingest - deletes the targets that are about to be ingested. - False for scheduled ingest - does not delete the target) - - """ - # Setting infer_options to default: - context._parameters["infer_options"] = infer_options or InferOptions.default() - - context.logger.info(f"Calling ingestion task with: {featureset}") - - # ingest called with mlrun_context, feature_set, source and targets passed with context - # This params here for documentation purposes only - fs.ingest( - mlrun_context=context, - namespace=namespace, - spark_context=spark_context, - ) - context.log_result("featureset", featureset) diff --git a/ingest/item.yaml b/ingest/item.yaml deleted file mode 100644 index 8665e88f4..000000000 --- a/ingest/item.yaml +++ /dev/null @@ -1,27 +0,0 @@ -apiVersion: v1 -categories: -- data-preparation -- data-analysis -- feature-store -description: Feature Store ingest function that runs the transformation graph on the - source of the featureset. -doc: '' -example: ingest.ipynb -generationDate: 2022-08-28:17-25 -hidden: false -icon: '' -labels: - author: yonish -maintainers: [] -marketplaceType: '' -mlrunVersion: 1.1.0 -name: ingest -platformVersion: 3.5.0 -spec: - filename: ingest.py - handler: ingest - image: mlrun/mlrun - kind: job - requirements: [] -url: '' -version: 1.1.0 diff --git a/ingest/test_ingest.py b/ingest/test_ingest.py deleted file mode 100644 index 224f520b4..000000000 --- a/ingest/test_ingest.py +++ /dev/null @@ -1,171 +0,0 @@ -# Copyright 2019 Iguazio -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -import os -import tempfile -import shutil -import datetime -import pytest - -import mlrun -import mlrun.feature_store as fstore -from mlrun.datastore.sources import CSVSource -from mlrun.feature_store.steps import * -from mlrun.features import MinMaxValidator -import pandas as pd - -REQUIRED_ENV_VARS = [ - "MLRUN_DBPATH", - "MLRUN_ARTIFACT_PATH", - "V3IO_USERNAME", - "V3IO_API", - "V3IO_ACCESS_KEY", -] - - -def _validate_environment_variables() -> bool: - """ - Checks that all required Environment variables are set. - """ - environment_keys = os.environ.keys() - return all(key in environment_keys for key in REQUIRED_ENV_VARS) - - -def _set_environment(): - artifact_path = tempfile.TemporaryDirectory().name - os.makedirs(artifact_path) - project = mlrun.new_project("ingest-test") - return artifact_path, project - - -def _cleanup_environment(artifact_path: str): - """ - Cleanup the test environment, deleting files and artifacts created during the test. - - :param artifact_path: The artifact path to delete. - """ - # Clean the local directory: - for test_output in [ - *os.listdir(artifact_path), - "schedules", - "runs", - "artifacts", - "functions", - ]: - test_output_path = os.path.abspath(f"./{test_output}") - if os.path.exists(test_output_path): - if os.path.isdir(test_output_path): - shutil.rmtree(test_output_path) - else: - os.remove(test_output_path) - - # Clean the artifacts' directory: - shutil.rmtree(artifact_path) - - -def create_dataframes() -> (pd.DataFrame, pd.DataFrame): - quotes = pd.DataFrame( - { - "time": [ - pd.Timestamp("2016-05-25 13:30:00.023"), - pd.Timestamp("2016-05-25 13:30:00.023"), - pd.Timestamp("2016-05-25 13:30:00.030"), - pd.Timestamp("2016-05-25 13:30:00.041"), - pd.Timestamp("2016-05-25 13:30:00.048"), - pd.Timestamp("2016-05-25 13:30:00.049"), - pd.Timestamp("2016-05-25 13:30:00.072"), - pd.Timestamp("2016-05-25 13:30:00.075"), - ], - "ticker": ["GOOG", "MSFT", "MSFT", "MSFT", "GOOG", "AAPL", "GOOG", "MSFT"], - "bid": [720.50, 51.95, 51.97, 51.99, 720.50, 97.99, 720.50, 52.01], - "ask": [720.93, 51.96, 51.98, 52.00, 720.93, 98.01, 720.88, 52.03], - } - ) - - # move date: - max_date = quotes["time"].max() - now_date = datetime.datetime.now() - delta = now_date - max_date - quotes["time"] = quotes["time"] + delta - - return quotes - - -class MyMap(MapClass): - def __init__(self, multiplier=1, **kwargs): - super().__init__(**kwargs) - self._multiplier = multiplier - - def do(self, event): - event["multi"] = event["bid"] * self._multiplier - return event - - -def _create_feature_set(): - quotes_set = fstore.FeatureSet("stock-quotes", entities=[fstore.Entity("ticker")]) - - quotes_set.graph.to("test_ingest.MyMap", multiplier=3).to( - "storey.Extend", _fn="({'extra': event['bid'] * 77})" - ).to("storey.Filter", "filter", _fn="(event['bid'] > 51.92)").to( - FeaturesetValidator() - ) - - quotes_set.add_aggregation("ask", ["sum", "max"], "1h", "10m", name="asks1") - quotes_set.add_aggregation("ask", ["sum", "max"], "5h", "10m", name="asks5") - quotes_set.add_aggregation("bid", ["min", "max"], "1h", "10m", name="bids") - - # add feature validation policy - quotes_set["bid"] = fstore.Feature( - validator=MinMaxValidator(min=52, severity="info") - ) - - # add default target definitions - quotes_set.set_targets() - return quotes_set - - -@pytest.mark.skipif( - condition=not _validate_environment_variables(), - reason="Project's environment variables are not set", -) -def test_ingest(): - artifact_path, project = _set_environment() - ingest_fn = mlrun.import_function("function.yaml") - quotes = create_dataframes() - - quotes_set = _create_feature_set() - quotes_set.save() - - data_uri = os.path.join(artifact_path, "quotes.csv") - quotes.to_csv(data_uri, index=False) - source = CSVSource("quotes", data_uri).to_dict() - - ingest_run = None - try: - ingest_run = ingest_fn.run( - handler="ingest", - params={ - "featureset": quotes_set.uri, - "source": source, - }, - local=True, - ) - - except Exception as exception: - print(f"- The test failed - raised the following error:\n- {exception}") - assert ( - fstore.get_feature_set(ingest_run.outputs["featureset"]).status.state - == "created" - ), "Targets not created successfully" - _cleanup_environment(artifact_path) diff --git a/model_monitoring_stream/function.yaml b/model_monitoring_stream/function.yaml deleted file mode 100644 index 07a21c40b..000000000 --- a/model_monitoring_stream/function.yaml +++ /dev/null @@ -1,267 +0,0 @@ -kind: remote -metadata: - name: model-monitoring-stream - tag: '' - hash: 33f4d6de0858b3dfc9d150fc82fbed6feb05534c - project: '' - categories: - - monitoring -spec: - command: '' - args: [] - image: livsmichael/mlrun-api:automation - entry_points: - consume: - name: consume - doc: '' - parameters: - - name: self - default: '' - - name: event - type: Dict - default: '' - outputs: - - default: '' - lineno: 293 - compute_predictions_per_second: - name: compute_predictions_per_second - doc: '' - parameters: - - name: event - type: dict - default: '' - outputs: - - default: '' - lineno: 311 - process_before_kv: - name: process_before_kv - doc: '' - parameters: - - name: self - default: '' - - name: event - type: dict - default: '' - outputs: - - default: '' - lineno: 316 - process_before_events_tsdb: - name: process_before_events_tsdb - doc: '' - parameters: - - name: event - type: Dict - default: '' - outputs: - - default: '' - lineno: 325 - process_before_parquet: - name: process_before_parquet - doc: '' - parameters: - - name: event - type: dict - default: '' - outputs: - - default: '' - lineno: 362 - set_none_if_empty: - name: set_none_if_empty - doc: '' - parameters: - - name: _event - type: dict - default: '' - - name: keys - type: List[str] - default: '' - outputs: - - default: '' - lineno: 364 - drop_if_exists: - name: drop_if_exists - doc: '' - parameters: - - name: _event - type: dict - default: '' - - name: keys - type: List[str] - default: '' - outputs: - - default: '' - lineno: 369 - unpack_if_exists: - name: unpack_if_exists - doc: '' - parameters: - - name: _event - type: dict - default: '' - - name: keys - type: List[str] - default: '' - outputs: - - default: '' - lineno: 373 - do: - name: do - doc: '' - parameters: - - name: self - default: '' - - name: event - type: Dict - default: '' - outputs: - - default: '' - lineno: 702 - resume_state: - name: resume_state - doc: '' - parameters: - - name: self - default: '' - - name: endpoint_id - default: '' - outputs: - - default: '' - lineno: 475 - is_valid: - name: is_valid - doc: '' - parameters: - - name: self - default: '' - - name: endpoint_id - type: str - default: '' - - name: validation_function - default: '' - - name: field - type: Any - default: '' - - name: dict_path - type: List[str] - default: '' - outputs: - - default: '' - lineno: 495 - handle_errors: - name: handle_errors - doc: '' - parameters: - - name: self - default: '' - - name: endpoint_id - default: '' - - name: event - default: '' - outputs: - - default: '' - type: bool - lineno: 503 - enrich_even_details: - name: enrich_even_details - doc: '' - parameters: - - name: event - default: '' - outputs: - - default: '' - lineno: 511 - is_not_none: - name: is_not_none - doc: '' - parameters: - - name: field - type: Any - default: '' - - name: dict_path - type: List[str] - default: '' - outputs: - - default: '' - lineno: 536 - is_list_of_numerics: - name: is_list_of_numerics - doc: '' - parameters: - - name: field - type: List[Union[int, float, dict, list]] - default: '' - - name: dict_path - type: List[str] - default: '' - outputs: - - default: '' - lineno: 545 - get_endpoint_record: - name: get_endpoint_record - doc: '' - parameters: - - name: kv_container - type: str - default: '' - - name: kv_path - type: str - default: '' - - name: endpoint_id - type: str - default: '' - - name: access_key - type: str - default: '' - outputs: - - default: '' - lineno: 717 - init_context: - name: init_context - doc: '' - parameters: - - name: context - type: MLClientCtx - default: '' - outputs: - - default: '' - lineno: 743 - handler: - name: handler - doc: '' - parameters: - - name: context - type: MLClientCtx - default: '' - - name: event - type: Event - default: '' - outputs: - - default: '' - lineno: 751 - description: '' - min_replicas: 1 - max_replicas: 4 - env: [] - base_spec: - apiVersion: nuclio.io/v1 - kind: Function - metadata: - name: model-monitoring-stream - labels: {} - annotations: - nuclio.io/generated_by: function generated from /home/michaell/projects/functions/model_monitoring_stream/model_monitoring_stream.py - spec: - runtime: python:3.6 - handler: model_monitoring_stream:handler - env: [] - volumes: [] - build: - commands: [] - noBaseImagesPull: true - functionSourceCode: aW1wb3J0IGpzb24KaW1wb3J0IG9zCmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlZmF1bHRkaWN0CmZyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lCmZyb20gb3MgaW1wb3J0IGVudmlyb24KZnJvbSB0eXBpbmcgaW1wb3J0IERpY3QsIExpc3QsIFNldCwgT3B0aW9uYWwsIEFueSwgVW5pb24KCmltcG9ydCBwYW5kYXMgYXMgcGQKaW1wb3J0IHYzaW8KZnJvbSBtbHJ1bi5jb25maWcgaW1wb3J0IGNvbmZpZwpmcm9tIG1scnVuLnJ1biBpbXBvcnQgTUxDbGllbnRDdHgKZnJvbSBtbHJ1bi51dGlscyBpbXBvcnQgbG9nZ2VyCmZyb20gbWxydW4udXRpbHMubW9kZWxfbW9uaXRvcmluZyBpbXBvcnQgKAogICAgcGFyc2VfbW9kZWxfZW5kcG9pbnRfc3RvcmVfcHJlZml4LAogICAgY3JlYXRlX21vZGVsX2VuZHBvaW50X2lkLAopCmZyb20gbWxydW4udXRpbHMudjNpb19jbGllbnRzIGltcG9ydCBnZXRfdjNpb19jbGllbnQsIGdldF9mcmFtZXNfY2xpZW50CmZyb20gbnVjbGlvIGltcG9ydCBFdmVudApmcm9tIHN0b3JleSBpbXBvcnQgKAogICAgRmllbGRBZ2dyZWdhdG9yLAogICAgTm9vcERyaXZlciwKICAgIFRhYmxlLAogICAgTWFwLAogICAgTWFwQ2xhc3MsCiAgICBBZ2dyZWdhdGVCeUtleSwKICAgIGJ1aWxkX2Zsb3csCiAgICBGaWx0ZXIsCiAgICBGbGF0TWFwLAogICAgVFNEQlRhcmdldCwKICAgIFBhcnF1ZXRUYXJnZXQsCiAgICBTeW5jRW1pdFNvdXJjZSwKKQpmcm9tIHN0b3JleS5kdHlwZXMgaW1wb3J0IFNsaWRpbmdXaW5kb3dzCmZyb20gc3RvcmV5LnN0ZXBzIGltcG9ydCBTYW1wbGVXaW5kb3cKIyBDb25zdGFudHMKZnJvbSB2M2lvLmRhdGFwbGFuZSBpbXBvcnQgUmFpc2VGb3JTdGF0dXMKCklTT184MDYxX1VUQyA9ICIlWS0lbS0lZCAlSDolTTolUy4lZiV6IgpGVU5DVElPTl9VUkkgPSAiZnVuY3Rpb25fdXJpIgpNT0RFTCA9ICJtb2RlbCIKVkVSU0lPTiA9ICJ2ZXJzaW9uIgpWRVJTSU9ORURfTU9ERUwgPSAidmVyc2lvbmVkX21vZGVsIgpNT0RFTF9DTEFTUyA9ICJtb2RlbF9jbGFzcyIKVElNRVNUQU1QID0gInRpbWVzdGFtcCIKRU5EUE9JTlRfSUQgPSAiZW5kcG9pbnRfaWQiClJFUVVFU1RfSUQgPSAicmVxdWVzdF9pZCIKTEFCRUxTID0gImxhYmVscyIKVU5QQUNLRURfTEFCRUxTID0gInVucGFja2VkX2xhYmVscyIKTEFURU5DWV9BVkdfNU0gPSAibGF0ZW5jeV9hdmdfNW0iCkxBVEVOQ1lfQVZHXzFIID0gImxhdGVuY3lfYXZnXzFoIgpQUkVESUNUSU9OU19QRVJfU0VDT05EID0gInByZWRpY3Rpb25zX3Blcl9zZWNvbmQiClBSRURJQ1RJT05TX0NPVU5UXzVNID0gInByZWRpY3Rpb25zX2NvdW50XzVtIgpQUkVESUNUSU9OU19DT1VOVF8xSCA9ICJwcmVkaWN0aW9uc19jb3VudF8xaCIKRklSU1RfUkVRVUVTVCA9ICJmaXJzdF9yZXF1ZXN0IgpMQVNUX1JFUVVFU1QgPSAibGFzdF9yZXF1ZXN0IgpFUlJPUl9DT1VOVCA9ICJlcnJvcl9jb3VudCIKRU5USVRJRVMgPSAiZW50aXRpZXMiCkZFQVRVUkVfTkFNRVMgPSAiZmVhdHVyZV9uYW1lcyIKTEFCRUxfQ09MVU1OUyA9ICJsYWJlbF9jb2x1bW5zIgpMQVRFTkNZID0gImxhdGVuY3kiClJFQ09SRF9UWVBFID0gInJlY29yZF90eXBlIgpGRUFUVVJFUyA9ICJmZWF0dXJlcyIKUFJFRElDVElPTiA9ICJwcmVkaWN0aW9uIgpQUkVESUNUSU9OUyA9ICJwcmVkaWN0aW9ucyIKTkFNRURfRkVBVFVSRVMgPSAibmFtZWRfZmVhdHVyZXMiCk5BTUVEX1BSRURJQ1RJT05TID0gIm5hbWVkX3ByZWRpY3Rpb25zIgpCQVNFX01FVFJJQ1MgPSAiYmFzZV9tZXRyaWNzIgpDVVNUT01fTUVUUklDUyA9ICJjdXN0b21fbWV0cmljcyIKRU5EUE9JTlRfRkVBVFVSRVMgPSAiZW5kcG9pbnRfZmVhdHVyZXMiCk1FVFJJQ1MgPSAibWV0cmljcyIKQkFUQ0hfVElNRVNUQU1QID0gImJhdGNoX3RpbWVzdGFtcCIKVElNRV9GT1JNQVQ6IHN0ciA9ICIlWS0lbS0lZCAlSDolTTolUy4lZiIgICMgSVNPIDgwNjEKCgojIFN0cmVhbSBwcm9jZXNzaW5nIGNvZGUKY2xhc3MgRXZlbnRTdHJlYW1Qcm9jZXNzb3I6CiAgICBkZWYgX19pbml0X18oCiAgICAgICAgc2VsZiwKICAgICAgICBwcm9qZWN0OiBzdHIsCiAgICAgICAgc2FtcGxlX3dpbmRvdzogaW50ID0gMTAsCiAgICAgICAgdHNkYl9iYXRjaGluZ19tYXhfZXZlbnRzOiBpbnQgPSAxMCwKICAgICAgICB0c2RiX2JhdGNoaW5nX3RpbWVvdXRfc2VjczogaW50ID0gNjAgKiA1LCAgIyBEZWZhdWx0IDUgbWludXRlcwogICAgICAgIHBhcnF1ZXRfYmF0Y2hpbmdfbWF4X2V2ZW50czogaW50ID0gMTBfMDAwLAogICAgICAgIHBhcnF1ZXRfYmF0Y2hpbmdfdGltZW91dF9zZWNzOiBpbnQgPSA2MCAqIDYwLCAgIyBEZWZhdWx0IDEgaG91cgogICAgICAgIGFnZ3JlZ2F0ZV9jb3VudF93aW5kb3dzOiBPcHRpb25hbFtMaXN0W3N0cl1dID0gTm9uZSwKICAgICAgICBhZ2dyZWdhdGVfY291bnRfcGVyaW9kOiBzdHIgPSAiMzBzIiwKICAgICAgICBhZ2dyZWdhdGVfYXZnX3dpbmRvd3M6IE9wdGlvbmFsW0xpc3Rbc3RyXV0gPSBOb25lLAogICAgICAgIGFnZ3JlZ2F0ZV9hdmdfcGVyaW9kOiBzdHIgPSAiMzBzIiwKICAgICAgICB2M2lvX2FjY2Vzc19rZXk6IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAgICAgIHYzaW9fZnJhbWVzZDogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICAgICAgdjNpb19hcGk6IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAgKToKICAgICAgICBzZWxmLnByb2plY3QgPSBwcm9qZWN0CiAgICAgICAgc2VsZi5zYW1wbGVfd2luZG93ID0gc2FtcGxlX3dpbmRvdwogICAgICAgIHNlbGYudHNkYl9iYXRjaGluZ19tYXhfZXZlbnRzID0gdHNkYl9iYXRjaGluZ19tYXhfZXZlbnRzCiAgICAgICAgc2VsZi50c2RiX2JhdGNoaW5nX3RpbWVvdXRfc2VjcyA9IHRzZGJfYmF0Y2hpbmdfdGltZW91dF9zZWNzCiAgICAgICAgc2VsZi5wYXJxdWV0X2JhdGNoaW5nX21heF9ldmVudHMgPSBwYXJxdWV0X2JhdGNoaW5nX21heF9ldmVudHMKICAgICAgICBzZWxmLnBhcnF1ZXRfYmF0Y2hpbmdfdGltZW91dF9zZWNzID0gcGFycXVldF9iYXRjaGluZ190aW1lb3V0X3NlY3MKICAgICAgICBzZWxmLmFnZ3JlZ2F0ZV9jb3VudF93aW5kb3dzID0gYWdncmVnYXRlX2NvdW50X3dpbmRvd3Mgb3IgWyI1bSIsICIxaCJdCiAgICAgICAgc2VsZi5hZ2dyZWdhdGVfY291bnRfcGVyaW9kID0gYWdncmVnYXRlX2NvdW50X3BlcmlvZAogICAgICAgIHNlbGYuYWdncmVnYXRlX2F2Z193aW5kb3dzID0gYWdncmVnYXRlX2F2Z193aW5kb3dzIG9yIFsiNW0iLCAiMWgiXQogICAgICAgIHNlbGYuYWdncmVnYXRlX2F2Z19wZXJpb2QgPSBhZ2dyZWdhdGVfYXZnX3BlcmlvZAoKICAgICAgICBzZWxmLnYzaW9fZnJhbWVzZCA9IHYzaW9fZnJhbWVzZCBvciBjb25maWcudjNpb19mcmFtZXNkCiAgICAgICAgc2VsZi52M2lvX2FwaSA9IHYzaW9fYXBpIG9yIGNvbmZpZy52M2lvX2FwaQoKICAgICAgICBzZWxmLnYzaW9fYWNjZXNzX2tleSA9IHYzaW9fYWNjZXNzX2tleSBvciBlbnZpcm9uLmdldCgiVjNJT19BQ0NFU1NfS0VZIikKICAgICAgICBzZWxmLm1vZGVsX21vbml0b3JpbmdfYWNjZXNzX2tleSA9ICgKICAgICAgICAgICAgb3MuZW52aXJvbi5nZXQoIk1PREVMX01PTklUT1JJTkdfQUNDRVNTX0tFWSIpIG9yIHNlbGYudjNpb19hY2Nlc3Nfa2V5CiAgICAgICAgKQoKICAgICAgICB0ZW1wbGF0ZSA9IGNvbmZpZy5tb2RlbF9lbmRwb2ludF9tb25pdG9yaW5nLnN0b3JlX3ByZWZpeGVzLmRlZmF1bHQKCiAgICAgICAga3ZfcGF0aCA9IHRlbXBsYXRlLmZvcm1hdChwcm9qZWN0PXByb2plY3QsIGtpbmQ9ImVuZHBvaW50cyIpCiAgICAgICAgXywgc2VsZi5rdl9jb250YWluZXIsIHNlbGYua3ZfcGF0aCA9IHBhcnNlX21vZGVsX2VuZHBvaW50X3N0b3JlX3ByZWZpeChrdl9wYXRoKQoKICAgICAgICB0c2RiX3BhdGggPSB0ZW1wbGF0ZS5mb3JtYXQocHJvamVjdD1wcm9qZWN0LCBraW5kPSJldmVudHMiKQogICAgICAgIF8sIHNlbGYudHNkYl9jb250YWluZXIsIHNlbGYudHNkYl9wYXRoID0gcGFyc2VfbW9kZWxfZW5kcG9pbnRfc3RvcmVfcHJlZml4KAogICAgICAgICAgICB0c2RiX3BhdGgKICAgICAgICApCiAgICAgICAgc2VsZi50c2RiX3BhdGggPSBmIntzZWxmLnRzZGJfY29udGFpbmVyfS97c2VsZi50c2RiX3BhdGh9IgoKICAgICAgICBzZWxmLnBhcnF1ZXRfcGF0aCA9IGNvbmZpZy5tb2RlbF9lbmRwb2ludF9tb25pdG9yaW5nLnN0b3JlX3ByZWZpeGVzLnVzZXJfc3BhY2UuZm9ybWF0KAogICAgICAgICAgICBwcm9qZWN0PXByb2plY3QsIGtpbmQ9InBhcnF1ZXQiCiAgICAgICAgKQoKICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgIlYzSU8gQ29uZmlndXJhdGlvbiIsCiAgICAgICAgICAgIHYzaW9fYWNjZXNzX2tleT1zZWxmLnYzaW9fYWNjZXNzX2tleSwKICAgICAgICAgICAgbW9kZWxfbW9uaXRvcmluZ19hY2Nlc3Nfa2V5PXNlbGYubW9kZWxfbW9uaXRvcmluZ19hY2Nlc3Nfa2V5LAogICAgICAgICAgICBkZWZhdWx0X3N0b3JlX3ByZWZpeD1jb25maWcubW9kZWxfZW5kcG9pbnRfbW9uaXRvcmluZy5zdG9yZV9wcmVmaXhlcy5kZWZhdWx0LAogICAgICAgICAgICB1c2VyX3NwYWNlX3N0b3JlX3ByZWZpeD1jb25maWcubW9kZWxfZW5kcG9pbnRfbW9uaXRvcmluZy5zdG9yZV9wcmVmaXhlcy51c2VyX3NwYWNlLAogICAgICAgICAgICB2M2lvX2FwaT1zZWxmLnYzaW9fYXBpLAogICAgICAgICAgICB2M2lvX2ZyYW1lc2Q9c2VsZi52M2lvX2ZyYW1lc2QsCiAgICAgICAgICAgIGt2X2NvbnRhaW5lcj1zZWxmLmt2X2NvbnRhaW5lciwKICAgICAgICAgICAga3ZfcGF0aD1zZWxmLmt2X3BhdGgsCiAgICAgICAgICAgIHRzZGJfY29udGFpbmVyPXNlbGYudHNkYl9jb250YWluZXIsCiAgICAgICAgICAgIHRzZGJfcGF0aD1zZWxmLnRzZGJfcGF0aCwKICAgICAgICAgICAgcGFycXVldF9wYXRoPXNlbGYucGFycXVldF9wYXRoLAogICAgICAgICkKCiAgICAgICAgc2VsZi5fa3Zfa2V5cyA9IFsKICAgICAgICAgICAgRlVOQ1RJT05fVVJJLAogICAgICAgICAgICBNT0RFTCwKICAgICAgICAgICAgTU9ERUxfQ0xBU1MsCiAgICAgICAgICAgIFRJTUVTVEFNUCwKICAgICAgICAgICAgRU5EUE9JTlRfSUQsCiAgICAgICAgICAgIExBQkVMUywKICAgICAgICAgICAgVU5QQUNLRURfTEFCRUxTLAogICAgICAgICAgICBMQVRFTkNZX0FWR181TSwKICAgICAgICAgICAgTEFURU5DWV9BVkdfMUgsCiAgICAgICAgICAgIFBSRURJQ1RJT05TX1BFUl9TRUNPTkQsCiAgICAgICAgICAgIFBSRURJQ1RJT05TX0NPVU5UXzVNLAogICAgICAgICAgICBQUkVESUNUSU9OU19DT1VOVF8xSCwKICAgICAgICAgICAgRklSU1RfUkVRVUVTVCwKICAgICAgICAgICAgTEFTVF9SRVFVRVNULAogICAgICAgICAgICBFUlJPUl9DT1VOVCwKICAgICAgICBdCgogICAgICAgIHNlbGYuX2Zsb3cgPSBidWlsZF9mbG93KAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICBTeW5jRW1pdFNvdXJjZSgpLAogICAgICAgICAgICAgICAgUHJvY2Vzc0VuZHBvaW50RXZlbnQoCiAgICAgICAgICAgICAgICAgICAga3ZfY29udGFpbmVyPXNlbGYua3ZfY29udGFpbmVyLAogICAgICAgICAgICAgICAgICAgIGt2X3BhdGg9c2VsZi5rdl9wYXRoLAogICAgICAgICAgICAgICAgICAgIHYzaW9fYWNjZXNzX2tleT1zZWxmLnYzaW9fYWNjZXNzX2tleSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBGaWx0ZXJOb3ROb25lKCksCiAgICAgICAgICAgICAgICBGbGF0TWFwKGxhbWJkYSB4OiB4KSwKICAgICAgICAgICAgICAgIE1hcEZlYXR1cmVOYW1lcygKICAgICAgICAgICAgICAgICAgICBrdl9jb250YWluZXI9c2VsZi5rdl9jb250YWluZXIsCiAgICAgICAgICAgICAgICAgICAga3ZfcGF0aD1zZWxmLmt2X3BhdGgsCiAgICAgICAgICAgICAgICAgICAgYWNjZXNzX2tleT1zZWxmLnYzaW9fYWNjZXNzX2tleSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAjIEJyYW5jaCAxOiBBZ2dyZWdhdGUgZXZlbnRzLCBjb3VudCBhdmVyYWdlcyBhbmQgdXBkYXRlIFRTREIgYW5kIEtWCiAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgQWdncmVnYXRlQnlLZXkoCiAgICAgICAgICAgICAgICAgICAgICAgIGFnZ3JlZ2F0ZXM9WwogICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRBZ2dyZWdhdG9yKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSRURJQ1RJT05TLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORFBPSU5UX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiY291bnQiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbGlkaW5nV2luZG93cygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZ2dyZWdhdGVfY291bnRfd2luZG93cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZ2dyZWdhdGVfY291bnRfcGVyaW9kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRBZ2dyZWdhdG9yKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExBVEVOQ1ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEFURU5DWSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbImF2ZyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsaWRpbmdXaW5kb3dzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFnZ3JlZ2F0ZV9hdmdfd2luZG93cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZ2dyZWdhdGVfYXZnX3BlcmlvZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgdGFibGU9VGFibGUoIm5vdGFibGUiLCBOb29wRHJpdmVyKCkpLAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgU2FtcGxlV2luZG93KAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNhbXBsZV93aW5kb3cKICAgICAgICAgICAgICAgICAgICApLCAgIyBBZGQgcmVxdWlyZWQgZ2FwIGJldHdlZW4gZXZlbnQgdG8gYXBwbHkgc2FtcGxpbmcKICAgICAgICAgICAgICAgICAgICBNYXAoc2VsZi5jb21wdXRlX3ByZWRpY3Rpb25zX3Blcl9zZWNvbmQpLAogICAgICAgICAgICAgICAgICAgICMgQnJhbmNoIDEuMTogVXBkYXRlZCBLVgogICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgTWFwKHNlbGYucHJvY2Vzc19iZWZvcmVfa3YpLAogICAgICAgICAgICAgICAgICAgICAgICBXcml0ZVRvS1YoY29udGFpbmVyPXNlbGYua3ZfY29udGFpbmVyLCB0YWJsZT1zZWxmLmt2X3BhdGgpLAogICAgICAgICAgICAgICAgICAgICAgICBJbmZlclNjaGVtYSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYzaW9fYWNjZXNzX2tleT1zZWxmLnYzaW9fYWNjZXNzX2tleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYzaW9fZnJhbWVzZD1zZWxmLnYzaW9fZnJhbWVzZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1zZWxmLmt2X2NvbnRhaW5lciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlPXNlbGYua3ZfcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICMgQnJhbmNoIDEuMjogVXBkYXRlIFRTREIKICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICMgTWFwIHRoZSBldmVudCBpbnRvIHRhZ2dhYmxlIGZpZWxkcywgYWRkIHJlY29yZCB0eXBlIHRvIGVhY2ggZmllbGQKICAgICAgICAgICAgICAgICAgICAgICAgTWFwKHNlbGYucHJvY2Vzc19iZWZvcmVfZXZlbnRzX3RzZGIpLAogICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXJLZXlzKEJBU0VfTUVUUklDUyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnBhY2tWYWx1ZXMoQkFTRV9NRVRSSUNTKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRTREJUYXJnZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aD1zZWxmLnRzZGJfcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlPSIxMC9tIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX2NvbD1USU1FU1RBTVAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyPXNlbGYudHNkYl9jb250YWluZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzX2tleT1zZWxmLnYzaW9fYWNjZXNzX2tleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2M2lvX2ZyYW1lcz1zZWxmLnYzaW9fZnJhbWVzZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleF9jb2xzPVtFTkRQT0lOVF9JRCwgUkVDT1JEX1RZUEVdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgU2V0dGluZ3MgZm9yIF9CYXRjaGluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9ldmVudHM9c2VsZi50c2RiX2JhdGNoaW5nX21heF9ldmVudHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dF9zZWNzPXNlbGYudHNkYl9iYXRjaGluZ190aW1lb3V0X3NlY3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PUVORFBPSU5UX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyS2V5cyhFTkRQT0lOVF9GRUFUVVJFUyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnBhY2tWYWx1ZXMoRU5EUE9JTlRfRkVBVFVSRVMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVFNEQlRhcmdldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoPXNlbGYudHNkYl9wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGU9IjEwL20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfY29sPVRJTUVTVEFNUCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXI9c2VsZi50c2RiX2NvbnRhaW5lciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3Nfa2V5PXNlbGYudjNpb19hY2Nlc3Nfa2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYzaW9fZnJhbWVzPXNlbGYudjNpb19mcmFtZXNkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4X2NvbHM9W0VORFBPSU5UX0lELCBSRUNPUkRfVFlQRV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBTZXR0aW5ncyBmb3IgX0JhdGNoaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2V2ZW50cz1zZWxmLnRzZGJfYmF0Y2hpbmdfbWF4X2V2ZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0X3NlY3M9c2VsZi50c2RiX2JhdGNoaW5nX3RpbWVvdXRfc2VjcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9RU5EUE9JTlRfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXJLZXlzKENVU1RPTV9NRVRSSUNTKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlck5vdE5vbmUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVucGFja1ZhbHVlcyhDVVNUT01fTUVUUklDUyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUU0RCVGFyZ2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg9c2VsZi50c2RiX3BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZT0iMTAvbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZV9jb2w9VElNRVNUQU1QLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1zZWxmLnRzZGJfY29udGFpbmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc19rZXk9c2VsZi52M2lvX2FjY2Vzc19rZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjNpb19mcmFtZXM9c2VsZi52M2lvX2ZyYW1lc2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhfY29scz1bRU5EUE9JTlRfSUQsIFJFQ09SRF9UWVBFXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFNldHRpbmdzIGZvciBfQmF0Y2hpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfZXZlbnRzPXNlbGYudHNkYl9iYXRjaGluZ19tYXhfZXZlbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRfc2Vjcz1zZWxmLnRzZGJfYmF0Y2hpbmdfdGltZW91dF9zZWNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT1FTkRQT0lOVF9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAjIEJyYW5jaCAyOiBCYXRjaCBldmVudHMsIHdyaXRlIHRvIHBhcnF1ZXQKICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICBNYXAoc2VsZi5wcm9jZXNzX2JlZm9yZV9wYXJxdWV0KSwKICAgICAgICAgICAgICAgICAgICBQYXJxdWV0VGFyZ2V0KAogICAgICAgICAgICAgICAgICAgICAgICBwYXRoPXNlbGYucGFycXVldF9wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25fY29scz1bIiRrZXkiLCAiJHllYXIiLCAiJG1vbnRoIiwgIiRkYXkiLCAiJGhvdXIiXSwKICAgICAgICAgICAgICAgICAgICAgICAgaW5mZXJfY29sdW1uc19mcm9tX2RhdGE9VHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgIyBTZXR0aW5ncyBmb3IgX0JhdGNoaW5nCiAgICAgICAgICAgICAgICAgICAgICAgIG1heF9ldmVudHM9c2VsZi5wYXJxdWV0X2JhdGNoaW5nX21heF9ldmVudHMsCiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRfc2Vjcz1zZWxmLnBhcnF1ZXRfYmF0Y2hpbmdfdGltZW91dF9zZWNzLAogICAgICAgICAgICAgICAgICAgICAgICAjIFNldHRpbmdzIGZvciB2M2lvIHN0b3JhZ2UKICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZV9vcHRpb25zPXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2M2lvX2FwaSI6IHNlbGYudjNpb19hcGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidjNpb19hY2Nlc3Nfa2V5Ijogc2VsZi5tb2RlbF9tb25pdG9yaW5nX2FjY2Vzc19rZXksCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgIF0KICAgICAgICApLnJ1bigpCgogICAgZGVmIGNvbnN1bWUoc2VsZiwgZXZlbnQ6IERpY3QpOgogICAgICAgIGV2ZW50cyA9IFtdCiAgICAgICAgaWYgImhlYWRlcnMiIGluIGV2ZW50IGFuZCAidmFsdWVzIiBpbiBldmVudDoKICAgICAgICAgICAgZm9yIHZhbHVlcyBpbiBldmVudFsidmFsdWVzIl06CiAgICAgICAgICAgICAgICBldmVudHMuYXBwZW5kKHtrOiB2IGZvciBrLCB2IGluIHppcChldmVudFsiaGVhZGVycyJdLCB2YWx1ZXMpfSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBldmVudHMuYXBwZW5kKGV2ZW50KQoKICAgICAgICBmb3IgZW5yaWNoZWQgaW4gbWFwKGVucmljaF9ldmVuX2RldGFpbHMsIGV2ZW50cyk6CiAgICAgICAgICAgIGlmIGVucmljaGVkIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgc2VsZi5fZmxvdy5lbWl0KAogICAgICAgICAgICAgICAgICAgIGVucmljaGVkLAogICAgICAgICAgICAgICAgICAgIGtleT1lbnJpY2hlZFtFTkRQT0lOVF9JRF0sCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfdGltZT1kYXRldGltZS5zdHJwdGltZShlbnJpY2hlZFsid2hlbiJdLCBJU09fODA2MV9VVEMpLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcGFzcwoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBjb21wdXRlX3ByZWRpY3Rpb25zX3Blcl9zZWNvbmQoZXZlbnQ6IGRpY3QpOgogICAgICAgIGV2ZW50W1BSRURJQ1RJT05TX1BFUl9TRUNPTkRdID0gZmxvYXQoZXZlbnRbUFJFRElDVElPTlNfQ09VTlRfNU1dKSAvIDYwMAogICAgICAgIHJldHVybiBldmVudAoKICAgIGRlZiBwcm9jZXNzX2JlZm9yZV9rdihzZWxmLCBldmVudDogZGljdCk6CiAgICAgICAgIyBGaWx0ZXIgcmVsZXZhbnQga2V5cwogICAgICAgIGUgPSB7azogZXZlbnRba10gZm9yIGsgaW4gc2VsZi5fa3Zfa2V5c30KICAgICAgICAjIFVucGFjayBsYWJlbHMgZGljdGlvbmFyeQogICAgICAgIGUgPSB7KiplLCAqKmUucG9wKFVOUEFDS0VEX0xBQkVMUywge30pfQogICAgICAgICMgV3JpdGUgbGFiZWxzIHRvIGt2IGFzIGpzb24gc3RyaW5nIHRvIGJlIHByZXNlbnRhYmxlIGxhdGVyCiAgICAgICAgZVtMQUJFTFNdID0ganNvbi5kdW1wcyhlW0xBQkVMU10pCiAgICAgICAgcmV0dXJuIGUKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgcHJvY2Vzc19iZWZvcmVfZXZlbnRzX3RzZGIoZXZlbnQ6IERpY3QpOgogICAgICAgIGJhc2VfZmllbGRzID0gW1RJTUVTVEFNUCwgRU5EUE9JTlRfSURdCgogICAgICAgIGJhc2VfZXZlbnQgPSB7azogZXZlbnRba10gZm9yIGsgaW4gYmFzZV9maWVsZHN9CiAgICAgICAgYmFzZV9ldmVudFtUSU1FU1RBTVBdID0gcGQudG9fZGF0ZXRpbWUoCiAgICAgICAgICAgIGJhc2VfZXZlbnRbVElNRVNUQU1QXSwgZm9ybWF0PVRJTUVfRk9STUFUCiAgICAgICAgKQoKICAgICAgICBiYXNlX21ldHJpY3MgPSB7CiAgICAgICAgICAgIFJFQ09SRF9UWVBFOiBCQVNFX01FVFJJQ1MsCiAgICAgICAgICAgIFBSRURJQ1RJT05TX1BFUl9TRUNPTkQ6IGV2ZW50W1BSRURJQ1RJT05TX1BFUl9TRUNPTkRdLAogICAgICAgICAgICBQUkVESUNUSU9OU19DT1VOVF81TTogZXZlbnRbUFJFRElDVElPTlNfQ09VTlRfNU1dLAogICAgICAgICAgICBQUkVESUNUSU9OU19DT1VOVF8xSDogZXZlbnRbUFJFRElDVElPTlNfQ09VTlRfMUhdLAogICAgICAgICAgICBMQVRFTkNZX0FWR181TTogZXZlbnRbTEFURU5DWV9BVkdfNU1dLAogICAgICAgICAgICBMQVRFTkNZX0FWR18xSDogZXZlbnRbTEFURU5DWV9BVkdfMUhdLAogICAgICAgICAgICAqKmJhc2VfZXZlbnQsCiAgICAgICAgfQoKICAgICAgICBlbmRwb2ludF9mZWF0dXJlcyA9IHsKICAgICAgICAgICAgUkVDT1JEX1RZUEU6IEVORFBPSU5UX0ZFQVRVUkVTLAogICAgICAgICAgICAqKmV2ZW50W05BTUVEX1BSRURJQ1RJT05TXSwKICAgICAgICAgICAgKipldmVudFtOQU1FRF9GRUFUVVJFU10sCiAgICAgICAgICAgICoqYmFzZV9ldmVudCwKICAgICAgICB9CgogICAgICAgIHByb2Nlc3NlZCA9IHtCQVNFX01FVFJJQ1M6IGJhc2VfbWV0cmljcywgRU5EUE9JTlRfRkVBVFVSRVM6IGVuZHBvaW50X2ZlYXR1cmVzfQoKICAgICAgICBpZiBldmVudFtNRVRSSUNTXToKICAgICAgICAgICAgcHJvY2Vzc2VkW0NVU1RPTV9NRVRSSUNTXSA9IHsKICAgICAgICAgICAgICAgIFJFQ09SRF9UWVBFOiBDVVNUT01fTUVUUklDUywKICAgICAgICAgICAgICAgICoqZXZlbnRbTUVUUklDU10sCiAgICAgICAgICAgICAgICAqKmJhc2VfZXZlbnQsCiAgICAgICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHByb2Nlc3NlZAoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBwcm9jZXNzX2JlZm9yZV9wYXJxdWV0KGV2ZW50OiBkaWN0KToKICAgICAgICBkZWYgc2V0X25vbmVfaWZfZW1wdHkoX2V2ZW50OiBkaWN0LCBrZXlzOiBMaXN0W3N0cl0pOgogICAgICAgICAgICBmb3Iga2V5IGluIGtleXM6CiAgICAgICAgICAgICAgICBpZiBub3QgX2V2ZW50LmdldChrZXkpOgogICAgICAgICAgICAgICAgICAgIF9ldmVudFtrZXldID0gTm9uZQoKICAgICAgICBkZWYgZHJvcF9pZl9leGlzdHMoX2V2ZW50OiBkaWN0LCBrZXlzOiBMaXN0W3N0cl0pOgogICAgICAgICAgICBmb3Iga2V5IGluIGtleXM6CiAgICAgICAgICAgICAgICBfZXZlbnQucG9wKGtleSwgTm9uZSkKCiAgICAgICAgZGVmIHVucGFja19pZl9leGlzdHMoX2V2ZW50OiBkaWN0LCBrZXlzOiBMaXN0W3N0cl0pOgogICAgICAgICAgICBmb3Iga2V5IGluIGtleXM6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IF9ldmVudC5nZXQoa2V5KQogICAgICAgICAgICAgICAgaWYgdmFsdWUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgX2V2ZW50ID0geyoqdmFsdWUsICoqZXZlbnR9CgogICAgICAgIGRyb3BfaWZfZXhpc3RzKGV2ZW50LCBbVU5QQUNLRURfTEFCRUxTLCBGRUFUVVJFU10pCiAgICAgICAgdW5wYWNrX2lmX2V4aXN0cyhldmVudCwgW0VOVElUSUVTXSkKICAgICAgICBzZXRfbm9uZV9pZl9lbXB0eShldmVudCwgW0xBQkVMUywgTUVUUklDUywgRU5USVRJRVNdKQogICAgICAgIHJldHVybiBldmVudAoKCmNsYXNzIFByb2Nlc3NFbmRwb2ludEV2ZW50KE1hcENsYXNzKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBrdl9jb250YWluZXI6IHN0ciwga3ZfcGF0aDogc3RyLCB2M2lvX2FjY2Vzc19rZXk6IHN0ciwgKiprd2FyZ3MpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKiprd2FyZ3MpCiAgICAgICAgc2VsZi5rdl9jb250YWluZXI6IHN0ciA9IGt2X2NvbnRhaW5lcgogICAgICAgIHNlbGYua3ZfcGF0aDogc3RyID0ga3ZfcGF0aAogICAgICAgIHNlbGYudjNpb19hY2Nlc3Nfa2V5OiBzdHIgPSB2M2lvX2FjY2Vzc19rZXkKICAgICAgICBzZWxmLmZpcnN0X3JlcXVlc3Q6IERpY3Rbc3RyLCBzdHJdID0gZGljdCgpCiAgICAgICAgc2VsZi5sYXN0X3JlcXVlc3Q6IERpY3Rbc3RyLCBzdHJdID0gZGljdCgpCiAgICAgICAgc2VsZi5lcnJvcl9jb3VudDogRGljdFtzdHIsIGludF0gPSBkZWZhdWx0ZGljdChpbnQpCiAgICAgICAgc2VsZi5lbmRwb2ludHM6IFNldFtzdHJdID0gc2V0KCkKCiAgICBkZWYgZG8oc2VsZiwgZXZlbnQ6IGRpY3QpOgogICAgICAgIGZ1bmN0aW9uX3VyaSA9IGV2ZW50W0ZVTkNUSU9OX1VSSV0KICAgICAgICB2ZXJzaW9uZWRfbW9kZWwgPSBldmVudFtWRVJTSU9ORURfTU9ERUxdCiAgICAgICAgZW5kcG9pbnRfaWQgPSBldmVudFtFTkRQT0lOVF9JRF0KCiAgICAgICAgIyBJbiBjYXNlIHRoaXMgcHJvY2VzcyBmYWlscywgcmVzdW1lIHN0YXRlIGZyb20gZXhpc3RpbmcgcmVjb3JkCiAgICAgICAgc2VsZi5yZXN1bWVfc3RhdGUoZW5kcG9pbnRfaWQpCgogICAgICAgICMgSGFuZGxlIGVycm9ycyBjb21pbmcgZnJvbSBzdHJlYW0KICAgICAgICBmb3VuZF9lcnJvcnMgPSBzZWxmLmhhbmRsZV9lcnJvcnMoZW5kcG9pbnRfaWQsIGV2ZW50KQogICAgICAgIGlmIGZvdW5kX2Vycm9yczoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgIyBWYWxpZGF0ZSBldmVudCBmaWVsZHMKICAgICAgICBtb2RlbF9jbGFzcyA9IGV2ZW50LmdldCgibW9kZWxfY2xhc3MiKSBvciBldmVudC5nZXQoImNsYXNzIikKICAgICAgICB0aW1lc3RhbXAgPSBldmVudC5nZXQoIndoZW4iKQogICAgICAgIHJlcXVlc3RfaWQgPSBldmVudC5nZXQoInJlcXVlc3QiLCB7fSkuZ2V0KCJpZCIpCiAgICAgICAgbGF0ZW5jeSA9IGV2ZW50LmdldCgibWljcm9zZWMiKQogICAgICAgIGZlYXR1cmVzID0gZXZlbnQuZ2V0KCJyZXF1ZXN0Iiwge30pLmdldCgiaW5wdXRzIikKICAgICAgICBwcmVkaWN0aW9ucyA9IGV2ZW50LmdldCgicmVzcCIsIHt9KS5nZXQoIm91dHB1dHMiKQoKICAgICAgICBpZiBub3Qgc2VsZi5pc192YWxpZChlbmRwb2ludF9pZCwgaXNfbm90X25vbmUsIHRpbWVzdGFtcCwgWyJ3aGVuIl0sKToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgaWYgZW5kcG9pbnRfaWQgbm90IGluIHNlbGYuZmlyc3RfcmVxdWVzdDoKICAgICAgICAgICAgc2VsZi5maXJzdF9yZXF1ZXN0W2VuZHBvaW50X2lkXSA9IHRpbWVzdGFtcAogICAgICAgIHNlbGYubGFzdF9yZXF1ZXN0W2VuZHBvaW50X2lkXSA9IHRpbWVzdGFtcAoKICAgICAgICBpZiBub3Qgc2VsZi5pc192YWxpZChlbmRwb2ludF9pZCwgaXNfbm90X25vbmUsIHJlcXVlc3RfaWQsIFsicmVxdWVzdCIsICJpZCJdLCk6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgaWYgbm90IHNlbGYuaXNfdmFsaWQoZW5kcG9pbnRfaWQsIGlzX25vdF9ub25lLCBsYXRlbmN5LCBbIm1pY3Jvc2VjIl0sKToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICBpZiBub3Qgc2VsZi5pc192YWxpZCgKICAgICAgICAgICAgZW5kcG9pbnRfaWQsIGlzX25vdF9ub25lLCBmZWF0dXJlcywgWyJyZXF1ZXN0IiwgImlucHV0cyJdLAogICAgICAgICk6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgaWYgbm90IHNlbGYuaXNfdmFsaWQoCiAgICAgICAgICAgIGVuZHBvaW50X2lkLCBpc19ub3Rfbm9uZSwgcHJlZGljdGlvbnMsIFsicmVzcCIsICJvdXRwdXRzIl0sCiAgICAgICAgKToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgdW5wYWNrZWRfbGFiZWxzID0ge2YiX3trfSI6IHYgZm9yIGssIHYgaW4gZXZlbnQuZ2V0KExBQkVMUywge30pLml0ZW1zKCl9CgogICAgICAgICMgU2VwYXJhdGUgZWFjaCBtb2RlbCBpbnZvY2F0aW9uIGludG8gc3ViIGV2ZW50cwogICAgICAgIGV2ZW50cyA9IFtdCiAgICAgICAgZm9yIGksIChmZWF0dXJlLCBwcmVkaWN0aW9uKSBpbiBlbnVtZXJhdGUoemlwKGZlYXR1cmVzLCBwcmVkaWN0aW9ucykpOgogICAgICAgICAgICBpZiBub3Qgc2VsZi5pc192YWxpZCgKICAgICAgICAgICAgICAgIGVuZHBvaW50X2lkLAogICAgICAgICAgICAgICAgaXNfbGlzdF9vZl9udW1lcmljcywKICAgICAgICAgICAgICAgIGZlYXR1cmUsCiAgICAgICAgICAgICAgICBbInJlcXVlc3QiLCAiaW5wdXRzIiwgZiJbe2l9XSJdLAogICAgICAgICAgICApOgogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHByZWRpY3Rpb24sIGxpc3QpOgogICAgICAgICAgICAgICAgcHJlZGljdGlvbiA9IFtwcmVkaWN0aW9uXQoKICAgICAgICAgICAgZXZlbnRzLmFwcGVuZCgKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBGVU5DVElPTl9VUkk6IGZ1bmN0aW9uX3VyaSwKICAgICAgICAgICAgICAgICAgICBNT0RFTDogdmVyc2lvbmVkX21vZGVsLAogICAgICAgICAgICAgICAgICAgIE1PREVMX0NMQVNTOiBtb2RlbF9jbGFzcywKICAgICAgICAgICAgICAgICAgICBUSU1FU1RBTVA6IHRpbWVzdGFtcCwKICAgICAgICAgICAgICAgICAgICBFTkRQT0lOVF9JRDogZW5kcG9pbnRfaWQsCiAgICAgICAgICAgICAgICAgICAgUkVRVUVTVF9JRDogcmVxdWVzdF9pZCwKICAgICAgICAgICAgICAgICAgICBMQVRFTkNZOiBsYXRlbmN5LAogICAgICAgICAgICAgICAgICAgIEZFQVRVUkVTOiBmZWF0dXJlLAogICAgICAgICAgICAgICAgICAgIFBSRURJQ1RJT046IHByZWRpY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgRklSU1RfUkVRVUVTVDogc2VsZi5maXJzdF9yZXF1ZXN0W2VuZHBvaW50X2lkXSwKICAgICAgICAgICAgICAgICAgICBMQVNUX1JFUVVFU1Q6IHNlbGYubGFzdF9yZXF1ZXN0W2VuZHBvaW50X2lkXSwKICAgICAgICAgICAgICAgICAgICBFUlJPUl9DT1VOVDogc2VsZi5lcnJvcl9jb3VudFtlbmRwb2ludF9pZF0sCiAgICAgICAgICAgICAgICAgICAgTEFCRUxTOiBldmVudC5nZXQoTEFCRUxTLCB7fSksCiAgICAgICAgICAgICAgICAgICAgTUVUUklDUzogZXZlbnQuZ2V0KE1FVFJJQ1MsIHt9KSwKICAgICAgICAgICAgICAgICAgICBFTlRJVElFUzogZXZlbnQuZ2V0KCJyZXF1ZXN0Iiwge30pLmdldChFTlRJVElFUywge30pLAogICAgICAgICAgICAgICAgICAgIFVOUEFDS0VEX0xBQkVMUzogdW5wYWNrZWRfbGFiZWxzLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApCiAgICAgICAgcmV0dXJuIGV2ZW50cwoKICAgIGRlZiByZXN1bWVfc3RhdGUoc2VsZiwgZW5kcG9pbnRfaWQpOgogICAgICAgICMgTWFrZSBzdXJlIHByb2Nlc3MgaXMgcmVzdW1hYmxlLCBpZiBwcm9jZXNzIGZhaWxzIGZvciBhbnkgcmVhc29uLCBiZSBhYmxlIHRvIHBpY2sgdGhpbmdzIHVwIGNsb3NlIHRvIHdoZXJlIHdlCiAgICAgICAgIyBsZWZ0IHRoZW0KICAgICAgICBpZiBlbmRwb2ludF9pZCBub3QgaW4gc2VsZi5lbmRwb2ludHM6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJUcnlpbmcgdG8gcmVzdW1lIHN0YXRlIiwgZW5kcG9pbnRfaWQ9ZW5kcG9pbnRfaWQpCiAgICAgICAgICAgIGVuZHBvaW50X3JlY29yZCA9IGdldF9lbmRwb2ludF9yZWNvcmQoCiAgICAgICAgICAgICAgICBrdl9jb250YWluZXI9c2VsZi5rdl9jb250YWluZXIsCiAgICAgICAgICAgICAgICBrdl9wYXRoPXNlbGYua3ZfcGF0aCwKICAgICAgICAgICAgICAgIGVuZHBvaW50X2lkPWVuZHBvaW50X2lkLAogICAgICAgICAgICAgICAgYWNjZXNzX2tleT1zZWxmLnYzaW9fYWNjZXNzX2tleSwKICAgICAgICAgICAgKQogICAgICAgICAgICBpZiBlbmRwb2ludF9yZWNvcmQ6CiAgICAgICAgICAgICAgICBmaXJzdF9yZXF1ZXN0ID0gZW5kcG9pbnRfcmVjb3JkLmdldChGSVJTVF9SRVFVRVNUKQogICAgICAgICAgICAgICAgaWYgZmlyc3RfcmVxdWVzdDoKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcnN0X3JlcXVlc3RbZW5kcG9pbnRfaWRdID0gZmlyc3RfcmVxdWVzdAogICAgICAgICAgICAgICAgZXJyb3JfY291bnQgPSBlbmRwb2ludF9yZWNvcmQuZ2V0KEVSUk9SX0NPVU5UKQogICAgICAgICAgICAgICAgaWYgZXJyb3JfY291bnQ6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvcl9jb3VudFtlbmRwb2ludF9pZF0gPSBlcnJvcl9jb3VudAogICAgICAgICAgICBzZWxmLmVuZHBvaW50cy5hZGQoZW5kcG9pbnRfaWQpCgogICAgZGVmIGlzX3ZhbGlkKAogICAgICAgIHNlbGYsIGVuZHBvaW50X2lkOiBzdHIsIHZhbGlkYXRpb25fZnVuY3Rpb24sIGZpZWxkOiBBbnksIGRpY3RfcGF0aDogTGlzdFtzdHJdCiAgICApOgogICAgICAgIGlmIHZhbGlkYXRpb25fZnVuY3Rpb24oZmllbGQsIGRpY3RfcGF0aCk6CiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgc2VsZi5lcnJvcl9jb3VudFtlbmRwb2ludF9pZF0gKz0gMQogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBoYW5kbGVfZXJyb3JzKHNlbGYsIGVuZHBvaW50X2lkLCBldmVudCkgLT4gYm9vbDoKICAgICAgICBpZiAiZXJyb3IiIGluIGV2ZW50OgogICAgICAgICAgICBzZWxmLmVycm9yX2NvdW50W2VuZHBvaW50X2lkXSArPSAxCiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgIHJldHVybiBGYWxzZQoKCmRlZiBlbnJpY2hfZXZlbl9kZXRhaWxzKGV2ZW50KSAtPiBPcHRpb25hbFtkaWN0XToKICAgIGZ1bmN0aW9uX3VyaSA9IGV2ZW50LmdldChGVU5DVElPTl9VUkkpCgogICAgaWYgbm90IGlzX25vdF9ub25lKGZ1bmN0aW9uX3VyaSwgW0ZVTkNUSU9OX1VSSV0pOgogICAgICAgIHJldHVybiBOb25lCgogICAgbW9kZWwgPSBldmVudC5nZXQoTU9ERUwpCiAgICBpZiBub3QgaXNfbm90X25vbmUobW9kZWwsIFtNT0RFTF0pOgogICAgICAgIHJldHVybiBOb25lCgogICAgdmVyc2lvbiA9IGV2ZW50LmdldChWRVJTSU9OKQogICAgdmVyc2lvbmVkX21vZGVsID0gZiJ7bW9kZWx9Ont2ZXJzaW9ufSIgaWYgdmVyc2lvbiBlbHNlIGYie21vZGVsfTpsYXRlc3QiCgogICAgZW5kcG9pbnRfaWQgPSBjcmVhdGVfbW9kZWxfZW5kcG9pbnRfaWQoCiAgICAgICAgZnVuY3Rpb25fdXJpPWZ1bmN0aW9uX3VyaSwgdmVyc2lvbmVkX21vZGVsPXZlcnNpb25lZF9tb2RlbCwKICAgICkKCiAgICBlbmRwb2ludF9pZCA9IHN0cihlbmRwb2ludF9pZCkKCiAgICBldmVudFtWRVJTSU9ORURfTU9ERUxdID0gdmVyc2lvbmVkX21vZGVsCiAgICBldmVudFtFTkRQT0lOVF9JRF0gPSBlbmRwb2ludF9pZAoKICAgIHJldHVybiBldmVudAoKCmRlZiBpc19ub3Rfbm9uZShmaWVsZDogQW55LCBkaWN0X3BhdGg6IExpc3Rbc3RyXSk6CiAgICBpZiBmaWVsZCBpcyBub3QgTm9uZToKICAgICAgICByZXR1cm4gVHJ1ZQogICAgbG9nZ2VyLmVycm9yKAogICAgICAgIGYiRXhwZWN0ZWQgZXZlbnQgZmllbGQgaXMgbWlzc2luZzoge2ZpZWxkfSBbRXZlbnQgLT4geycnLmpvaW4oZGljdF9wYXRoKX1dIgogICAgKQogICAgcmV0dXJuIEZhbHNlCgoKZGVmIGlzX2xpc3Rfb2ZfbnVtZXJpY3MoCiAgICBmaWVsZDogTGlzdFtVbmlvbltpbnQsIGZsb2F0LCBkaWN0LCBsaXN0XV0sIGRpY3RfcGF0aDogTGlzdFtzdHJdCik6CiAgICBpZiBhbGwoaXNpbnN0YW5jZSh4LCBpbnQpIG9yIGlzaW5zdGFuY2UoeCwgZmxvYXQpIGZvciB4IGluIGZpZWxkKToKICAgICAgICByZXR1cm4gVHJ1ZQogICAgbG9nZ2VyLmVycm9yKAogICAgICAgIGYiRXhwZWN0ZWQgZXZlbnQgZmllbGQgaXMgbWlzc2luZzoge2ZpZWxkfSBbRXZlbnQgLT4geycnLmpvaW4oZGljdF9wYXRoKX1dIgogICAgKQogICAgcmV0dXJuIEZhbHNlCgoKY2xhc3MgRmlsdGVyTm90Tm9uZShGaWx0ZXIpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsICoqa3dhcmdzKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKGZuPWxhbWJkYSBldmVudDogZXZlbnQgaXMgbm90IE5vbmUsICoqa3dhcmdzKQoKCmNsYXNzIEZpbHRlcktleXMoTWFwQ2xhc3MpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXygqKmt3YXJncykKICAgICAgICBzZWxmLmtleXMgPSBsaXN0KGFyZ3MpCgogICAgZGVmIGRvKHNlbGYsIGV2ZW50KToKICAgICAgICBuZXdfZXZlbnQgPSB7fQogICAgICAgIGZvciBrZXkgaW4gc2VsZi5rZXlzOgogICAgICAgICAgICBpZiBrZXkgaW4gZXZlbnQ6CiAgICAgICAgICAgICAgICBuZXdfZXZlbnRba2V5XSA9IGV2ZW50W2tleV0KCiAgICAgICAgcmV0dXJuIG5ld19ldmVudCBpZiBuZXdfZXZlbnQgZWxzZSBOb25lCgoKY2xhc3MgVW5wYWNrVmFsdWVzKE1hcENsYXNzKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKiprd2FyZ3MpCiAgICAgICAgc2VsZi5rZXlzX3RvX3VucGFjayA9IHNldChhcmdzKQoKICAgIGRlZiBkbyhzZWxmLCBldmVudCk6CiAgICAgICAgdW5wYWNrZWQgPSB7fQogICAgICAgIGZvciBrZXkgaW4gZXZlbnQua2V5cygpOgogICAgICAgICAgICBpZiBrZXkgaW4gc2VsZi5rZXlzX3RvX3VucGFjazoKICAgICAgICAgICAgICAgIHVucGFja2VkID0geyoqdW5wYWNrZWQsICoqZXZlbnRba2V5XX0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHVucGFja2VkW2tleV0gPSBldmVudFtrZXldCiAgICAgICAgcmV0dXJuIHVucGFja2VkCgoKY2xhc3MgTWFwRmVhdHVyZU5hbWVzKE1hcENsYXNzKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBrdl9jb250YWluZXI6IHN0ciwga3ZfcGF0aDogc3RyLCBhY2Nlc3Nfa2V5OiBzdHIsICoqa3dhcmdzKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCoqa3dhcmdzKQogICAgICAgIHNlbGYua3ZfY29udGFpbmVyID0ga3ZfY29udGFpbmVyCiAgICAgICAgc2VsZi5rdl9wYXRoID0ga3ZfcGF0aAogICAgICAgIHNlbGYuYWNjZXNzX2tleSA9IGFjY2Vzc19rZXkKICAgICAgICBzZWxmLmZlYXR1cmVfbmFtZXMgPSB7fQogICAgICAgIHNlbGYubGFiZWxfY29sdW1ucyA9IHt9CgogICAgZGVmIGRvKHNlbGYsIGV2ZW50OiBEaWN0KToKICAgICAgICBlbmRwb2ludF9pZCA9IGV2ZW50W0VORFBPSU5UX0lEXQoKICAgICAgICBpZiBlbmRwb2ludF9pZCBub3QgaW4gc2VsZi5mZWF0dXJlX25hbWVzOgogICAgICAgICAgICBlbmRwb2ludF9yZWNvcmQgPSBnZXRfZW5kcG9pbnRfcmVjb3JkKAogICAgICAgICAgICAgICAga3ZfY29udGFpbmVyPXNlbGYua3ZfY29udGFpbmVyLAogICAgICAgICAgICAgICAga3ZfcGF0aD1zZWxmLmt2X3BhdGgsCiAgICAgICAgICAgICAgICBlbmRwb2ludF9pZD1lbmRwb2ludF9pZCwKICAgICAgICAgICAgICAgIGFjY2Vzc19rZXk9c2VsZi5hY2Nlc3Nfa2V5LAogICAgICAgICAgICApCiAgICAgICAgICAgIGZlYXR1cmVfbmFtZXMgPSBlbmRwb2ludF9yZWNvcmQuZ2V0KEZFQVRVUkVfTkFNRVMpCiAgICAgICAgICAgIGZlYXR1cmVfbmFtZXMgPSBqc29uLmxvYWRzKGZlYXR1cmVfbmFtZXMpIGlmIGZlYXR1cmVfbmFtZXMgZWxzZSBOb25lCgogICAgICAgICAgICBsYWJlbF9jb2x1bW5zID0gZW5kcG9pbnRfcmVjb3JkLmdldChMQUJFTF9DT0xVTU5TKQogICAgICAgICAgICBsYWJlbF9jb2x1bW5zID0ganNvbi5sb2FkcyhsYWJlbF9jb2x1bW5zKSBpZiBsYWJlbF9jb2x1bW5zIGVsc2UgTm9uZQoKICAgICAgICAgICAgaWYgbm90IGZlYXR1cmVfbmFtZXM6CiAgICAgICAgICAgICAgICBsb2dnZXIud2FybigKICAgICAgICAgICAgICAgICAgICBmIkZlYXR1cmUgbmFtZXMgYXJlIG5vdCBpbml0aWFsaXplZCwgdGhleSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIiwKICAgICAgICAgICAgICAgICAgICBlbmRwb2ludF9pZD1lbmRwb2ludF9pZCwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGZlYXR1cmVfbmFtZXMgPSBbZiJme2l9IiBmb3IgaSwgXyBpbiBlbnVtZXJhdGUoZXZlbnRbRkVBVFVSRVNdKV0KICAgICAgICAgICAgICAgIGdldF92M2lvX2NsaWVudCgpLmt2LnVwZGF0ZSgKICAgICAgICAgICAgICAgICAgICBjb250YWluZXI9c2VsZi5rdl9jb250YWluZXIsCiAgICAgICAgICAgICAgICAgICAgdGFibGVfcGF0aD1zZWxmLmt2X3BhdGgsCiAgICAgICAgICAgICAgICAgICAgYWNjZXNzX2tleT1zZWxmLmFjY2Vzc19rZXksCiAgICAgICAgICAgICAgICAgICAga2V5PWV2ZW50W0VORFBPSU5UX0lEXSwKICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzPXtGRUFUVVJFX05BTUVTOiBqc29uLmR1bXBzKGZlYXR1cmVfbmFtZXMpfSwKICAgICAgICAgICAgICAgICAgICByYWlzZV9mb3Jfc3RhdHVzPVJhaXNlRm9yU3RhdHVzLmFsd2F5cywKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgIGlmIG5vdCBsYWJlbF9jb2x1bW5zOgogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oCiAgICAgICAgICAgICAgICAgICAgZiJsYWJlbCBjb2x1bW4gbmFtZXMgYXJlIG5vdCBpbml0aWFsaXplZCwgdGhleSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIiwKICAgICAgICAgICAgICAgICAgICBlbmRwb2ludF9pZD1lbmRwb2ludF9pZCwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGxhYmVsX2NvbHVtbnMgPSBbZiJwe2l9IiBmb3IgaSwgXyBpbiBlbnVtZXJhdGUoZXZlbnRbUFJFRElDVElPTl0pXQogICAgICAgICAgICAgICAgZ2V0X3YzaW9fY2xpZW50KCkua3YudXBkYXRlKAogICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1zZWxmLmt2X2NvbnRhaW5lciwKICAgICAgICAgICAgICAgICAgICB0YWJsZV9wYXRoPXNlbGYua3ZfcGF0aCwKICAgICAgICAgICAgICAgICAgICBhY2Nlc3Nfa2V5PXNlbGYuYWNjZXNzX2tleSwKICAgICAgICAgICAgICAgICAgICBrZXk9ZXZlbnRbRU5EUE9JTlRfSURdLAogICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM9e0xBQkVMX0NPTFVNTlM6IGpzb24uZHVtcHMobGFiZWxfY29sdW1ucyl9LAogICAgICAgICAgICAgICAgICAgIHJhaXNlX2Zvcl9zdGF0dXM9UmFpc2VGb3JTdGF0dXMuYWx3YXlzLAogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgc2VsZi5sYWJlbF9jb2x1bW5zW2VuZHBvaW50X2lkXSA9IGxhYmVsX2NvbHVtbnMKICAgICAgICAgICAgc2VsZi5mZWF0dXJlX25hbWVzW2VuZHBvaW50X2lkXSA9IGZlYXR1cmVfbmFtZXMKCiAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgIkxhYmVsIGNvbHVtbnMiLCBlbmRwb2ludF9pZD1lbmRwb2ludF9pZCwgbGFiZWxfY29sdW1ucz1sYWJlbF9jb2x1bW5zCiAgICAgICAgICAgICkKICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAiRmVhdHVyZSBuYW1lcyIsIGVuZHBvaW50X2lkPWVuZHBvaW50X2lkLCBmZWF0dXJlX25hbWVzPWZlYXR1cmVfbmFtZXMKICAgICAgICAgICAgKQoKICAgICAgICBmZWF0dXJlX25hbWVzID0gc2VsZi5mZWF0dXJlX25hbWVzW2VuZHBvaW50X2lkXQogICAgICAgIGZlYXR1cmVzID0gZXZlbnRbRkVBVFVSRVNdCiAgICAgICAgZXZlbnRbTkFNRURfRkVBVFVSRVNdID0gewogICAgICAgICAgICBuYW1lOiBmZWF0dXJlIGZvciBuYW1lLCBmZWF0dXJlIGluIHppcChmZWF0dXJlX25hbWVzLCBmZWF0dXJlcykKICAgICAgICB9CgogICAgICAgIGxhYmVsX2NvbHVtbnMgPSBzZWxmLmxhYmVsX2NvbHVtbnNbZW5kcG9pbnRfaWRdCiAgICAgICAgcHJlZGljdGlvbiA9IGV2ZW50W1BSRURJQ1RJT05dCiAgICAgICAgZXZlbnRbTkFNRURfUFJFRElDVElPTlNdID0gewogICAgICAgICAgICBuYW1lOiBwcmVkaWN0aW9uIGZvciBuYW1lLCBwcmVkaWN0aW9uIGluIHppcChsYWJlbF9jb2x1bW5zLCBwcmVkaWN0aW9uKQogICAgICAgIH0KICAgICAgICBsb2dnZXIuaW5mbygiTWFwcGVkIGV2ZW50IiwgZXZlbnQ9ZXZlbnQpCiAgICAgICAgcmV0dXJuIGV2ZW50CgoKY2xhc3MgV3JpdGVUb0tWKE1hcENsYXNzKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb250YWluZXI6IHN0ciwgdGFibGU6IHN0ciwgKiprd2FyZ3MpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKiprd2FyZ3MpCiAgICAgICAgc2VsZi5jb250YWluZXIgPSBjb250YWluZXIKICAgICAgICBzZWxmLnRhYmxlID0gdGFibGUKCiAgICBkZWYgZG8oc2VsZiwgZXZlbnQ6IERpY3QpOgogICAgICAgIGdldF92M2lvX2NsaWVudCgpLmt2LnVwZGF0ZSgKICAgICAgICAgICAgY29udGFpbmVyPXNlbGYuY29udGFpbmVyLAogICAgICAgICAgICB0YWJsZV9wYXRoPXNlbGYudGFibGUsCiAgICAgICAgICAgIGtleT1ldmVudFtFTkRQT0lOVF9JRF0sCiAgICAgICAgICAgIGF0dHJpYnV0ZXM9ZXZlbnQsCiAgICAgICAgKQogICAgICAgIHJldHVybiBldmVudAoKCmNsYXNzIEluZmVyU2NoZW1hKE1hcENsYXNzKToKICAgIGRlZiBfX2luaXRfXygKICAgICAgICBzZWxmLAogICAgICAgIHYzaW9fYWNjZXNzX2tleTogc3RyLAogICAgICAgIHYzaW9fZnJhbWVzZDogc3RyLAogICAgICAgIGNvbnRhaW5lcjogc3RyLAogICAgICAgIHRhYmxlOiBzdHIsCiAgICAgICAgKiprd2FyZ3MsCiAgICApOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKiprd2FyZ3MpCiAgICAgICAgc2VsZi5jb250YWluZXIgPSBjb250YWluZXIKICAgICAgICBzZWxmLnYzaW9fYWNjZXNzX2tleSA9IHYzaW9fYWNjZXNzX2tleQogICAgICAgIHNlbGYudjNpb19mcmFtZXNkID0gdjNpb19mcmFtZXNkCiAgICAgICAgc2VsZi50YWJsZSA9IHRhYmxlCiAgICAgICAgc2VsZi5rZXlzID0gc2V0KCkKCiAgICBkZWYgZG8oc2VsZiwgZXZlbnQ6IERpY3QpOgogICAgICAgIGtleV9zZXQgPSBzZXQoZXZlbnQua2V5cygpKQogICAgICAgIGlmIG5vdCBrZXlfc2V0Lmlzc3Vic2V0KHNlbGYua2V5cyk6CiAgICAgICAgICAgIHNlbGYua2V5cy51cGRhdGUoa2V5X3NldCkKICAgICAgICAgICAgZ2V0X2ZyYW1lc19jbGllbnQoCiAgICAgICAgICAgICAgICB0b2tlbj1zZWxmLnYzaW9fYWNjZXNzX2tleSwKICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1zZWxmLmNvbnRhaW5lciwKICAgICAgICAgICAgICAgIGFkZHJlc3M9c2VsZi52M2lvX2ZyYW1lc2QsCiAgICAgICAgICAgICkuZXhlY3V0ZShiYWNrZW5kPSJrdiIsIHRhYmxlPXNlbGYudGFibGUsIGNvbW1hbmQ9ImluZmVyX3NjaGVtYSIpCiAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgIkZvdW5kIG5ldyBrZXlzLCBpbmZlcnJlZCBzY2hlbWEiLCB0YWJsZT1zZWxmLnRhYmxlLCBldmVudD1ldmVudAogICAgICAgICAgICApCiAgICAgICAgcmV0dXJuIGV2ZW50CgoKZGVmIGdldF9lbmRwb2ludF9yZWNvcmQoCiAgICBrdl9jb250YWluZXI6IHN0ciwga3ZfcGF0aDogc3RyLCBlbmRwb2ludF9pZDogc3RyLCBhY2Nlc3Nfa2V5OiBzdHIKKSAtPiBPcHRpb25hbFtkaWN0XToKICAgIGxvZ2dlci5pbmZvKAogICAgICAgIGYiR3JhYmJpbmcgZW5kcG9pbnQgZGF0YSIsCiAgICAgICAgY29udGFpbmVyPWt2X2NvbnRhaW5lciwKICAgICAgICB0YWJsZV9wYXRoPWt2X3BhdGgsCiAgICAgICAga2V5PWVuZHBvaW50X2lkLAogICAgKQogICAgdHJ5OgogICAgICAgIGVuZHBvaW50X3JlY29yZCA9ICgKICAgICAgICAgICAgZ2V0X3YzaW9fY2xpZW50KCkKICAgICAgICAgICAgLmt2LmdldCgKICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1rdl9jb250YWluZXIsCiAgICAgICAgICAgICAgICB0YWJsZV9wYXRoPWt2X3BhdGgsCiAgICAgICAgICAgICAgICBrZXk9ZW5kcG9pbnRfaWQsCiAgICAgICAgICAgICAgICBhY2Nlc3Nfa2V5PWFjY2Vzc19rZXksCiAgICAgICAgICAgICAgICByYWlzZV9mb3Jfc3RhdHVzPXYzaW8uZGF0YXBsYW5lLlJhaXNlRm9yU3RhdHVzLmFsd2F5cywKICAgICAgICAgICAgKQogICAgICAgICAgICAub3V0cHV0Lml0ZW0KICAgICAgICApCiAgICAgICAgcmV0dXJuIGVuZHBvaW50X3JlY29yZAogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICByZXR1cm4gTm9uZQoKCmRlZiBpbml0X2NvbnRleHQoY29udGV4dDogTUxDbGllbnRDdHgpOgogICAgY29udGV4dC5sb2dnZXIuaW5mbygiSW5pdGlhbGl6aW5nIEV2ZW50U3RyZWFtUHJvY2Vzc29yIikKICAgIHBhcmFtZXRlcnMgPSBlbnZpcm9uLmdldCgiTU9ERUxfTU9OSVRPUklOR19QQVJBTUVURVJTIikKICAgIHBhcmFtZXRlcnMgPSBqc29uLmxvYWRzKHBhcmFtZXRlcnMpIGlmIHBhcmFtZXRlcnMgZWxzZSB7fQogICAgc3RyZWFtX3Byb2Nlc3NvciA9IEV2ZW50U3RyZWFtUHJvY2Vzc29yKCoqcGFyYW1ldGVycykKICAgIHNldGF0dHIoY29udGV4dCwgInN0cmVhbV9wcm9jZXNzb3IiLCBzdHJlYW1fcHJvY2Vzc29yKQoKCmRlZiBoYW5kbGVyKGNvbnRleHQ6IE1MQ2xpZW50Q3R4LCBldmVudDogRXZlbnQpOgogICAgZXZlbnRfYm9keSA9IGpzb24ubG9hZHMoZXZlbnQuYm9keSkKICAgIGNvbnRleHQubG9nZ2VyLmRlYnVnKGV2ZW50X2JvZHkpCiAgICBjb250ZXh0LnN0cmVhbV9wcm9jZXNzb3IuY29uc3VtZShldmVudF9ib2R5KQo= - source: '' - build: - commands: [] - code_origin: https://github.com/Michaelliv/functions.git#202b4c489e4c02c3025742ea237f1a042b7c6043:/home/michaell/projects/functions/model_monitoring_stream/model_monitoring_stream.py - default_handler: handler -verbose: false diff --git a/model_monitoring_stream/item.yaml b/model_monitoring_stream/item.yaml deleted file mode 100644 index 219fa5286..000000000 --- a/model_monitoring_stream/item.yaml +++ /dev/null @@ -1,23 +0,0 @@ -apiVersion: v1 -categories: -- monitoring -description: '' -doc: '' -example: model_monitoring_stream.ipynb -generationDate: 2022-08-28:17-25 -hidden: false -icon: '' -labels: {} -maintainers: [] -marketplaceType: '' -mlrunVersion: 1.1.0 -name: model-monitoring-stream -platformVersion: 3.5.0 -spec: - filename: model_monitoring_stream.py - handler: handler - image: livsmichael/mlrun-api:automation - kind: nuclio - requirements: [] -url: '' -version: 1.1.0 diff --git a/model_monitoring_stream/model_monitoring_stream.ipynb b/model_monitoring_stream/model_monitoring_stream.ipynb deleted file mode 100644 index 93d8c92e4..000000000 --- a/model_monitoring_stream/model_monitoring_stream.ipynb +++ /dev/null @@ -1,178 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "source": [ - "# Model Monitoring\n", - "\n", - "## Initial set up (and pre-requisites)\n", - "1. Make sure you have the `mlrun-api` datasource available in your Grafana instance, otherwise add it by:\n", - " 1. Open your grafana instance\n", - " 2. Navigate to `Configuration -> Data Sources`\n", - " 3. Press `Add data source` and configure the following parameters\n", - " ```\n", - " Name: mlrun-api\n", - " URL: http://mlrun-api:8080/api/grafana-proxy/model-endpoints\n", - " Access: Server (default)\n", - "\n", - " ## Add a custom header of:\n", - " X-V3io-Session-Key: \n", - " ```\n", - " 4. Press `Save & Test` to make sure it works, a confirmation message should appear when this button is pressed\n", - "\n", - "2. Import the available dashboards `(./dashboards/*)` to you Grafana instance\n", - "3. To allow the system to utilize drift measurement, make sure you supply the train set when logging the model on the\n", - " training step\n", - "\n", - " ```python\n", - " # Log model\n", - " context.log_model(\n", - " \"model\",\n", - " body=dumps(model),\n", - " artifact_path=context.artifact_subpath(\"models\"),\n", - " extra_data=eval_metrics,\n", - " model_file=\"model.pkl\",\n", - " metrics=context.results,\n", - " training_set=X_test, # <- make sure this is passed into log_model\n", - " labels={\"class\": \"sklearn.linear_model.LogisticRegression\"}\n", - " )\n", - " ```\n", - "4. When serving a model, make sure that the Nuclio function is deployed with tracking enabled by applying\n", - " `fn.set_tracking()`\n", - "\n", - "## Configuration\n", - "The stream processing portion of the model monitoring, can be deployed under multiple configuration options. The\n", - "available configurations can be found under `stream.Config`. Once configured it should be supplied as environment\n", - "parameters to the Nuclio function by setting `fn.set_envs`\n", - "\n", - "```python\n", - "project: str # project name\n", - "sample_window: int # The sampling window for the data that flows into the TSDB and the KV\n", - "kv_path_template: str # Path template for the kv table\n", - "tsdb_path_template: str # Path template for the tsdb table\n", - "parquet_path_template: str # v3io parquets path template, assumes v3io is mounted\n", - "tsdb_batching_max_events: int # The max amount of event to batch before writing the batch to tsdb\n", - "tsdb_batching_timeout_secs: int # The max amount of seconds a given batch can be gathered before being emitted\n", - "parquet_batching_max_events: int # The max amount of event to batch before writing the batch to parquet\n", - "parquet_batching_timeout_secs: int # The max amount of seconds, a given batch can be gathered before being written to parquet\n", - "container: str # container name\n", - "v3io_access_key: str # V3IO Access key\n", - "v3io_framesd: str # V3IO framesd URL\n", - "time_format: str # The time format into which time related fields will be converted\n", - "aggregate_count_windows: List[str] # List of window sizes for predictions count\n", - "aggregate_count_period: str # Period of predictions count windows\n", - "aggregate_avg_windows: List[str] # List of window sizes for average latency\n", - "aggregate_avg_period: str # Period of average latency windows\n", - "```" - ], - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%% md\n" - } - } - }, - { - "cell_type": "markdown", - "source": [ - "## Export function yaml" - ], - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%% md\n" - } - } - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [ - "from mlrun import code_to_function\n", - "from mlrun.runtimes import RemoteRuntime\n", - "\n", - "\n", - "fn: RemoteRuntime = code_to_function(\n", - " name=\"model-monitoring-stream\",\n", - " kind=\"nuclio\",\n", - " image=\"mlrun/mlrun\",\n", - " filename=\"model_monitoring_stream.py\",\n", - " handler=\"handler\",\n", - ")\n", - "fn.export(\"model_monitoring_stream.yaml\")\n" - ], - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - } - }, - { - "cell_type": "markdown", - "source": [ - "## Deploy Stream Processing" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [ - "import os\n", - "\n", - "from mlrun import import_function\n", - "from mlrun.platforms import mount_v3io\n", - "from mlrun.runtimes import RemoteRuntime\n", - "import json\n", - "\n", - "# Set project name\n", - "project = \"\"\n", - "\n", - "fn: RemoteRuntime = import_function(\"hub://model_monitoring_stream\")\n", - "\n", - "fn.add_v3io_stream_trigger(\n", - " stream_path=f\"projects/{project}/model-endpoints/stream\",\n", - " name=\"monitoring_stream_trigger\",\n", - ")\n", - "\n", - "fn.set_env(\"MODEL_MONITORING_PARAMETERS\", json.dumps({\"project\": project, \"v3io_framesd\": os.environ.get(\"V3IO_FRAMESD\")}))\n", - "\n", - "fn.metadata.project = project\n", - "fn.apply(mount_v3io())\n", - "fn.deploy()" - ], - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - } - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} \ No newline at end of file diff --git a/model_monitoring_stream/model_monitoring_stream.py b/model_monitoring_stream/model_monitoring_stream.py deleted file mode 100644 index 90c8b92c2..000000000 --- a/model_monitoring_stream/model_monitoring_stream.py +++ /dev/null @@ -1,768 +0,0 @@ -# Copyright 2019 Iguazio -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -import json -import os -from collections import defaultdict -from datetime import datetime -from os import environ -from typing import Dict, List, Set, Optional, Any, Union - -import pandas as pd -import v3io -from mlrun.config import config -from mlrun.run import MLClientCtx -from mlrun.utils import logger -from mlrun.utils.model_monitoring import ( - parse_model_endpoint_store_prefix, - create_model_endpoint_id, -) -from mlrun.utils.v3io_clients import get_v3io_client, get_frames_client -from nuclio import Event -from storey import ( - FieldAggregator, - NoopDriver, - Table, - Map, - MapClass, - AggregateByKey, - build_flow, - Filter, - FlatMap, - TSDBTarget, - ParquetTarget, - SyncEmitSource, -) -from storey.dtypes import SlidingWindows -from storey.steps import SampleWindow -# Constants -from v3io.dataplane import RaiseForStatus - -ISO_8061_UTC = "%Y-%m-%d %H:%M:%S.%f%z" -FUNCTION_URI = "function_uri" -MODEL = "model" -VERSION = "version" -VERSIONED_MODEL = "versioned_model" -MODEL_CLASS = "model_class" -TIMESTAMP = "timestamp" -ENDPOINT_ID = "endpoint_id" -REQUEST_ID = "request_id" -LABELS = "labels" -UNPACKED_LABELS = "unpacked_labels" -LATENCY_AVG_5M = "latency_avg_5m" -LATENCY_AVG_1H = "latency_avg_1h" -PREDICTIONS_PER_SECOND = "predictions_per_second" -PREDICTIONS_COUNT_5M = "predictions_count_5m" -PREDICTIONS_COUNT_1H = "predictions_count_1h" -FIRST_REQUEST = "first_request" -LAST_REQUEST = "last_request" -ERROR_COUNT = "error_count" -ENTITIES = "entities" -FEATURE_NAMES = "feature_names" -LABEL_COLUMNS = "label_columns" -LATENCY = "latency" -RECORD_TYPE = "record_type" -FEATURES = "features" -PREDICTION = "prediction" -PREDICTIONS = "predictions" -NAMED_FEATURES = "named_features" -NAMED_PREDICTIONS = "named_predictions" -BASE_METRICS = "base_metrics" -CUSTOM_METRICS = "custom_metrics" -ENDPOINT_FEATURES = "endpoint_features" -METRICS = "metrics" -BATCH_TIMESTAMP = "batch_timestamp" -TIME_FORMAT: str = "%Y-%m-%d %H:%M:%S.%f" # ISO 8061 - - -# Stream processing code -class EventStreamProcessor: - def __init__( - self, - project: str, - sample_window: int = 10, - tsdb_batching_max_events: int = 10, - tsdb_batching_timeout_secs: int = 60 * 5, # Default 5 minutes - parquet_batching_max_events: int = 10_000, - parquet_batching_timeout_secs: int = 60 * 60, # Default 1 hour - aggregate_count_windows: Optional[List[str]] = None, - aggregate_count_period: str = "30s", - aggregate_avg_windows: Optional[List[str]] = None, - aggregate_avg_period: str = "30s", - v3io_access_key: Optional[str] = None, - v3io_framesd: Optional[str] = None, - v3io_api: Optional[str] = None, - ): - self.project = project - self.sample_window = sample_window - self.tsdb_batching_max_events = tsdb_batching_max_events - self.tsdb_batching_timeout_secs = tsdb_batching_timeout_secs - self.parquet_batching_max_events = parquet_batching_max_events - self.parquet_batching_timeout_secs = parquet_batching_timeout_secs - self.aggregate_count_windows = aggregate_count_windows or ["5m", "1h"] - self.aggregate_count_period = aggregate_count_period - self.aggregate_avg_windows = aggregate_avg_windows or ["5m", "1h"] - self.aggregate_avg_period = aggregate_avg_period - - self.v3io_framesd = v3io_framesd or config.v3io_framesd - self.v3io_api = v3io_api or config.v3io_api - - self.v3io_access_key = v3io_access_key or environ.get("V3IO_ACCESS_KEY") - self.model_monitoring_access_key = ( - os.environ.get("MODEL_MONITORING_ACCESS_KEY") or self.v3io_access_key - ) - - template = config.model_endpoint_monitoring.store_prefixes.default - - kv_path = template.format(project=project, kind="endpoints") - _, self.kv_container, self.kv_path = parse_model_endpoint_store_prefix(kv_path) - - tsdb_path = template.format(project=project, kind="events") - _, self.tsdb_container, self.tsdb_path = parse_model_endpoint_store_prefix( - tsdb_path - ) - self.tsdb_path = f"{self.tsdb_container}/{self.tsdb_path}" - - self.parquet_path = config.model_endpoint_monitoring.store_prefixes.user_space.format( - project=project, kind="parquet" - ) - - logger.info( - "V3IO Configuration", - v3io_access_key=self.v3io_access_key, - model_monitoring_access_key=self.model_monitoring_access_key, - default_store_prefix=config.model_endpoint_monitoring.store_prefixes.default, - user_space_store_prefix=config.model_endpoint_monitoring.store_prefixes.user_space, - v3io_api=self.v3io_api, - v3io_framesd=self.v3io_framesd, - kv_container=self.kv_container, - kv_path=self.kv_path, - tsdb_container=self.tsdb_container, - tsdb_path=self.tsdb_path, - parquet_path=self.parquet_path, - ) - - self._kv_keys = [ - FUNCTION_URI, - MODEL, - MODEL_CLASS, - TIMESTAMP, - ENDPOINT_ID, - LABELS, - UNPACKED_LABELS, - LATENCY_AVG_5M, - LATENCY_AVG_1H, - PREDICTIONS_PER_SECOND, - PREDICTIONS_COUNT_5M, - PREDICTIONS_COUNT_1H, - FIRST_REQUEST, - LAST_REQUEST, - ERROR_COUNT, - ] - - self._flow = build_flow( - [ - SyncEmitSource(), - ProcessEndpointEvent( - kv_container=self.kv_container, - kv_path=self.kv_path, - v3io_access_key=self.v3io_access_key, - ), - FilterNotNone(), - FlatMap(lambda x: x), - MapFeatureNames( - kv_container=self.kv_container, - kv_path=self.kv_path, - access_key=self.v3io_access_key, - ), - # Branch 1: Aggregate events, count averages and update TSDB and KV - [ - AggregateByKey( - aggregates=[ - FieldAggregator( - PREDICTIONS, - ENDPOINT_ID, - ["count"], - SlidingWindows( - self.aggregate_count_windows, - self.aggregate_count_period, - ), - ), - FieldAggregator( - LATENCY, - LATENCY, - ["avg"], - SlidingWindows( - self.aggregate_avg_windows, - self.aggregate_avg_period, - ), - ), - ], - table=Table("notable", NoopDriver()), - ), - SampleWindow( - self.sample_window - ), # Add required gap between event to apply sampling - Map(self.compute_predictions_per_second), - # Branch 1.1: Updated KV - [ - Map(self.process_before_kv), - WriteToKV(container=self.kv_container, table=self.kv_path), - InferSchema( - v3io_access_key=self.v3io_access_key, - v3io_framesd=self.v3io_framesd, - container=self.kv_container, - table=self.kv_path, - ), - ], - # Branch 1.2: Update TSDB - [ - # Map the event into taggable fields, add record type to each field - Map(self.process_before_events_tsdb), - [ - FilterKeys(BASE_METRICS), - UnpackValues(BASE_METRICS), - TSDBTarget( - path=self.tsdb_path, - rate="10/m", - time_col=TIMESTAMP, - container=self.tsdb_container, - access_key=self.v3io_access_key, - v3io_frames=self.v3io_framesd, - index_cols=[ENDPOINT_ID, RECORD_TYPE], - # Settings for _Batching - max_events=self.tsdb_batching_max_events, - timeout_secs=self.tsdb_batching_timeout_secs, - key=ENDPOINT_ID, - ), - ], - [ - FilterKeys(ENDPOINT_FEATURES), - UnpackValues(ENDPOINT_FEATURES), - TSDBTarget( - path=self.tsdb_path, - rate="10/m", - time_col=TIMESTAMP, - container=self.tsdb_container, - access_key=self.v3io_access_key, - v3io_frames=self.v3io_framesd, - index_cols=[ENDPOINT_ID, RECORD_TYPE], - # Settings for _Batching - max_events=self.tsdb_batching_max_events, - timeout_secs=self.tsdb_batching_timeout_secs, - key=ENDPOINT_ID, - ), - ], - [ - FilterKeys(CUSTOM_METRICS), - FilterNotNone(), - UnpackValues(CUSTOM_METRICS), - TSDBTarget( - path=self.tsdb_path, - rate="10/m", - time_col=TIMESTAMP, - container=self.tsdb_container, - access_key=self.v3io_access_key, - v3io_frames=self.v3io_framesd, - index_cols=[ENDPOINT_ID, RECORD_TYPE], - # Settings for _Batching - max_events=self.tsdb_batching_max_events, - timeout_secs=self.tsdb_batching_timeout_secs, - key=ENDPOINT_ID, - ), - ], - ], - ], - # Branch 2: Batch events, write to parquet - [ - Map(self.process_before_parquet), - ParquetTarget( - path=self.parquet_path, - partition_cols=["$key", "$year", "$month", "$day", "$hour"], - infer_columns_from_data=True, - # Settings for _Batching - max_events=self.parquet_batching_max_events, - timeout_secs=self.parquet_batching_timeout_secs, - # Settings for v3io storage - storage_options={ - "v3io_api": self.v3io_api, - "v3io_access_key": self.model_monitoring_access_key, - }, - ), - ], - ] - ).run() - - def consume(self, event: Dict): - events = [] - if "headers" in event and "values" in event: - for values in event["values"]: - events.append({k: v for k, v in zip(event["headers"], values)}) - else: - events.append(event) - - for enriched in map(enrich_even_details, events): - if enriched is not None: - self._flow.emit( - enriched, - key=enriched[ENDPOINT_ID], - event_time=datetime.strptime(enriched["when"], ISO_8061_UTC), - ) - else: - pass - - @staticmethod - def compute_predictions_per_second(event: dict): - event[PREDICTIONS_PER_SECOND] = float(event[PREDICTIONS_COUNT_5M]) / 600 - return event - - def process_before_kv(self, event: dict): - # Filter relevant keys - e = {k: event[k] for k in self._kv_keys} - # Unpack labels dictionary - e = {**e, **e.pop(UNPACKED_LABELS, {})} - # Write labels to kv as json string to be presentable later - e[LABELS] = json.dumps(e[LABELS]) - return e - - @staticmethod - def process_before_events_tsdb(event: Dict): - base_fields = [TIMESTAMP, ENDPOINT_ID] - - base_event = {k: event[k] for k in base_fields} - base_event[TIMESTAMP] = pd.to_datetime( - base_event[TIMESTAMP], format=TIME_FORMAT - ) - - base_metrics = { - RECORD_TYPE: BASE_METRICS, - PREDICTIONS_PER_SECOND: event[PREDICTIONS_PER_SECOND], - PREDICTIONS_COUNT_5M: event[PREDICTIONS_COUNT_5M], - PREDICTIONS_COUNT_1H: event[PREDICTIONS_COUNT_1H], - LATENCY_AVG_5M: event[LATENCY_AVG_5M], - LATENCY_AVG_1H: event[LATENCY_AVG_1H], - **base_event, - } - - endpoint_features = { - RECORD_TYPE: ENDPOINT_FEATURES, - **event[NAMED_PREDICTIONS], - **event[NAMED_FEATURES], - **base_event, - } - - processed = {BASE_METRICS: base_metrics, ENDPOINT_FEATURES: endpoint_features} - - if event[METRICS]: - processed[CUSTOM_METRICS] = { - RECORD_TYPE: CUSTOM_METRICS, - **event[METRICS], - **base_event, - } - - return processed - - @staticmethod - def process_before_parquet(event: dict): - def set_none_if_empty(_event: dict, keys: List[str]): - for key in keys: - if not _event.get(key): - _event[key] = None - - def drop_if_exists(_event: dict, keys: List[str]): - for key in keys: - _event.pop(key, None) - - def unpack_if_exists(_event: dict, keys: List[str]): - for key in keys: - value = _event.get(key) - if value is not None: - _event = {**value, **event} - - drop_if_exists(event, [UNPACKED_LABELS, FEATURES]) - unpack_if_exists(event, [ENTITIES]) - set_none_if_empty(event, [LABELS, METRICS, ENTITIES]) - return event - - -class ProcessEndpointEvent(MapClass): - def __init__(self, kv_container: str, kv_path: str, v3io_access_key: str, **kwargs): - super().__init__(**kwargs) - self.kv_container: str = kv_container - self.kv_path: str = kv_path - self.v3io_access_key: str = v3io_access_key - self.first_request: Dict[str, str] = dict() - self.last_request: Dict[str, str] = dict() - self.error_count: Dict[str, int] = defaultdict(int) - self.endpoints: Set[str] = set() - - def do(self, event: dict): - function_uri = event[FUNCTION_URI] - versioned_model = event[VERSIONED_MODEL] - endpoint_id = event[ENDPOINT_ID] - - # In case this process fails, resume state from existing record - self.resume_state(endpoint_id) - - # Handle errors coming from stream - found_errors = self.handle_errors(endpoint_id, event) - if found_errors: - return None - - # Validate event fields - model_class = event.get("model_class") or event.get("class") - timestamp = event.get("when") - request_id = event.get("request", {}).get("id") - latency = event.get("microsec") - features = event.get("request", {}).get("inputs") - predictions = event.get("resp", {}).get("outputs") - - if not self.is_valid(endpoint_id, is_not_none, timestamp, ["when"],): - return None - - if endpoint_id not in self.first_request: - self.first_request[endpoint_id] = timestamp - self.last_request[endpoint_id] = timestamp - - if not self.is_valid(endpoint_id, is_not_none, request_id, ["request", "id"],): - return None - if not self.is_valid(endpoint_id, is_not_none, latency, ["microsec"],): - return None - if not self.is_valid( - endpoint_id, is_not_none, features, ["request", "inputs"], - ): - return None - if not self.is_valid( - endpoint_id, is_not_none, predictions, ["resp", "outputs"], - ): - return None - - unpacked_labels = {f"_{k}": v for k, v in event.get(LABELS, {}).items()} - - # Separate each model invocation into sub events - events = [] - for i, (feature, prediction) in enumerate(zip(features, predictions)): - if not self.is_valid( - endpoint_id, - is_list_of_numerics, - feature, - ["request", "inputs", f"[{i}]"], - ): - return None - - if not isinstance(prediction, list): - prediction = [prediction] - - events.append( - { - FUNCTION_URI: function_uri, - MODEL: versioned_model, - MODEL_CLASS: model_class, - TIMESTAMP: timestamp, - ENDPOINT_ID: endpoint_id, - REQUEST_ID: request_id, - LATENCY: latency, - FEATURES: feature, - PREDICTION: prediction, - FIRST_REQUEST: self.first_request[endpoint_id], - LAST_REQUEST: self.last_request[endpoint_id], - ERROR_COUNT: self.error_count[endpoint_id], - LABELS: event.get(LABELS, {}), - METRICS: event.get(METRICS, {}), - ENTITIES: event.get("request", {}).get(ENTITIES, {}), - UNPACKED_LABELS: unpacked_labels, - } - ) - return events - - def resume_state(self, endpoint_id): - # Make sure process is resumable, if process fails for any reason, be able to pick things up close to where we - # left them - if endpoint_id not in self.endpoints: - logger.info("Trying to resume state", endpoint_id=endpoint_id) - endpoint_record = get_endpoint_record( - kv_container=self.kv_container, - kv_path=self.kv_path, - endpoint_id=endpoint_id, - access_key=self.v3io_access_key, - ) - if endpoint_record: - first_request = endpoint_record.get(FIRST_REQUEST) - if first_request: - self.first_request[endpoint_id] = first_request - error_count = endpoint_record.get(ERROR_COUNT) - if error_count: - self.error_count[endpoint_id] = error_count - self.endpoints.add(endpoint_id) - - def is_valid( - self, endpoint_id: str, validation_function, field: Any, dict_path: List[str] - ): - if validation_function(field, dict_path): - return True - self.error_count[endpoint_id] += 1 - return False - - def handle_errors(self, endpoint_id, event) -> bool: - if "error" in event: - self.error_count[endpoint_id] += 1 - return True - - return False - - -def enrich_even_details(event) -> Optional[dict]: - function_uri = event.get(FUNCTION_URI) - - if not is_not_none(function_uri, [FUNCTION_URI]): - return None - - model = event.get(MODEL) - if not is_not_none(model, [MODEL]): - return None - - version = event.get(VERSION) - versioned_model = f"{model}:{version}" if version else f"{model}:latest" - - endpoint_id = create_model_endpoint_id( - function_uri=function_uri, versioned_model=versioned_model, - ) - - endpoint_id = str(endpoint_id) - - event[VERSIONED_MODEL] = versioned_model - event[ENDPOINT_ID] = endpoint_id - - return event - - -def is_not_none(field: Any, dict_path: List[str]): - if field is not None: - return True - logger.error( - f"Expected event field is missing: {field} [Event -> {''.join(dict_path)}]" - ) - return False - - -def is_list_of_numerics( - field: List[Union[int, float, dict, list]], dict_path: List[str] -): - if all(isinstance(x, int) or isinstance(x, float) for x in field): - return True - logger.error( - f"Expected event field is missing: {field} [Event -> {''.join(dict_path)}]" - ) - return False - - -class FilterNotNone(Filter): - def __init__(self, **kwargs): - super().__init__(fn=lambda event: event is not None, **kwargs) - - -class FilterKeys(MapClass): - def __init__(self, *args, **kwargs): - super().__init__(**kwargs) - self.keys = list(args) - - def do(self, event): - new_event = {} - for key in self.keys: - if key in event: - new_event[key] = event[key] - - return new_event if new_event else None - - -class UnpackValues(MapClass): - def __init__(self, *args, **kwargs): - super().__init__(**kwargs) - self.keys_to_unpack = set(args) - - def do(self, event): - unpacked = {} - for key in event.keys(): - if key in self.keys_to_unpack: - unpacked = {**unpacked, **event[key]} - else: - unpacked[key] = event[key] - return unpacked - - -class MapFeatureNames(MapClass): - def __init__(self, kv_container: str, kv_path: str, access_key: str, **kwargs): - super().__init__(**kwargs) - self.kv_container = kv_container - self.kv_path = kv_path - self.access_key = access_key - self.feature_names = {} - self.label_columns = {} - - def do(self, event: Dict): - endpoint_id = event[ENDPOINT_ID] - - if endpoint_id not in self.feature_names: - endpoint_record = get_endpoint_record( - kv_container=self.kv_container, - kv_path=self.kv_path, - endpoint_id=endpoint_id, - access_key=self.access_key, - ) - feature_names = endpoint_record.get(FEATURE_NAMES) - feature_names = json.loads(feature_names) if feature_names else None - - label_columns = endpoint_record.get(LABEL_COLUMNS) - label_columns = json.loads(label_columns) if label_columns else None - - if not feature_names: - logger.warn( - f"Feature names are not initialized, they will be automatically generated", - endpoint_id=endpoint_id, - ) - feature_names = [f"f{i}" for i, _ in enumerate(event[FEATURES])] - get_v3io_client().kv.update( - container=self.kv_container, - table_path=self.kv_path, - access_key=self.access_key, - key=event[ENDPOINT_ID], - attributes={FEATURE_NAMES: json.dumps(feature_names)}, - raise_for_status=RaiseForStatus.always, - ) - - if not label_columns: - logger.warn( - f"label column names are not initialized, they will be automatically generated", - endpoint_id=endpoint_id, - ) - label_columns = [f"p{i}" for i, _ in enumerate(event[PREDICTION])] - get_v3io_client().kv.update( - container=self.kv_container, - table_path=self.kv_path, - access_key=self.access_key, - key=event[ENDPOINT_ID], - attributes={LABEL_COLUMNS: json.dumps(label_columns)}, - raise_for_status=RaiseForStatus.always, - ) - - self.label_columns[endpoint_id] = label_columns - self.feature_names[endpoint_id] = feature_names - - logger.info( - "Label columns", endpoint_id=endpoint_id, label_columns=label_columns - ) - logger.info( - "Feature names", endpoint_id=endpoint_id, feature_names=feature_names - ) - - feature_names = self.feature_names[endpoint_id] - features = event[FEATURES] - event[NAMED_FEATURES] = { - name: feature for name, feature in zip(feature_names, features) - } - - label_columns = self.label_columns[endpoint_id] - prediction = event[PREDICTION] - event[NAMED_PREDICTIONS] = { - name: prediction for name, prediction in zip(label_columns, prediction) - } - logger.info("Mapped event", event=event) - return event - - -class WriteToKV(MapClass): - def __init__(self, container: str, table: str, **kwargs): - super().__init__(**kwargs) - self.container = container - self.table = table - - def do(self, event: Dict): - get_v3io_client().kv.update( - container=self.container, - table_path=self.table, - key=event[ENDPOINT_ID], - attributes=event, - ) - return event - - -class InferSchema(MapClass): - def __init__( - self, - v3io_access_key: str, - v3io_framesd: str, - container: str, - table: str, - **kwargs, - ): - super().__init__(**kwargs) - self.container = container - self.v3io_access_key = v3io_access_key - self.v3io_framesd = v3io_framesd - self.table = table - self.keys = set() - - def do(self, event: Dict): - key_set = set(event.keys()) - if not key_set.issubset(self.keys): - self.keys.update(key_set) - get_frames_client( - token=self.v3io_access_key, - container=self.container, - address=self.v3io_framesd, - ).execute(backend="kv", table=self.table, command="infer_schema") - logger.info( - "Found new keys, inferred schema", table=self.table, event=event - ) - return event - - -def get_endpoint_record( - kv_container: str, kv_path: str, endpoint_id: str, access_key: str -) -> Optional[dict]: - logger.info( - f"Grabbing endpoint data", - container=kv_container, - table_path=kv_path, - key=endpoint_id, - ) - try: - endpoint_record = ( - get_v3io_client() - .kv.get( - container=kv_container, - table_path=kv_path, - key=endpoint_id, - access_key=access_key, - raise_for_status=v3io.dataplane.RaiseForStatus.always, - ) - .output.item - ) - return endpoint_record - except Exception: - return None - - -def init_context(context: MLClientCtx): - context.logger.info("Initializing EventStreamProcessor") - parameters = environ.get("MODEL_MONITORING_PARAMETERS") - parameters = json.loads(parameters) if parameters else {} - stream_processor = EventStreamProcessor(**parameters) - setattr(context, "stream_processor", stream_processor) - - -def handler(context: MLClientCtx, event: Event): - event_body = json.loads(event.body) - context.logger.debug(event_body) - context.stream_processor.consume(event_body) diff --git a/model_monitoring_stream/requirements.txt b/model_monitoring_stream/requirements.txt deleted file mode 100644 index ef238930e..000000000 --- a/model_monitoring_stream/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -storey -nuclio -v3io \ No newline at end of file diff --git a/pandas_profiling_report/README.md b/pandas_profiling_report/README.md deleted file mode 100644 index 40e0c9b22..000000000 --- a/pandas_profiling_report/README.md +++ /dev/null @@ -1,26 +0,0 @@ -## pandas_profiling_report - -Creates an html report with various graphs/statistics/correlations for a given dataset. See sample report [here](https://pandas-profiling.github.io/pandas-profiling/examples/master/titanic/titanic_report.html). Link to GitHub page [here](https://github.com/pandas-profiling/pandas-profiling). - - -Usage example: - -```python -import mlrun, os -mlrun.mlconf.dbpath = 'http://mlrun-api:8080' - -# Load pandas_profiling_report function from Github -func = mlrun.import_function("hub://pandas_profiling_report").apply(mlrun.mount_v3io()) - -# Build MLRun image (only needs to be run once) -func.deploy() - -# Create task -data = 'https://iguazio-sample-data.s3.amazonaws.com/datasets/iris_dataset.csv' - -task = NewTask(name="pandas-profiling-report", - inputs={"data": DATA_URL}) - -# Run task on cluster -run = func.run(task, artifact_path='/User/artifacts') -``` diff --git a/pandas_profiling_report/function.yaml b/pandas_profiling_report/function.yaml deleted file mode 100644 index ffdbbf837..000000000 --- a/pandas_profiling_report/function.yaml +++ /dev/null @@ -1,40 +0,0 @@ -kind: job -metadata: - name: pandas-profiling-report - tag: '' - hash: 79fe77fb2920a8ffecfef2f614a0be494c2ea43b - project: '' - labels: - author: nicks - categories: - - data-analysis -spec: - command: '' - args: [] - image: mlrun/mlrun - env: [] - default_handler: pandas_profiling_report - entry_points: - pandas_profiling_report: - name: pandas_profiling_report - doc: Create a Pandas Profiling Report for a dataset. - parameters: - - name: context - type: MLClientCtx - doc: the function context - default: '' - - name: data - type: DataItem - doc: Dataset to create report for - default: '' - outputs: - - default: '' - lineno: 10 - description: Create Pandas Profiling Report from Dataset - build: - functionSourceCode: IyBHZW5lcmF0ZWQgYnkgbnVjbGlvLmV4cG9ydC5OdWNsaW9FeHBvcnRlcgoKaW1wb3J0IHBhbmRhcyBhcyBwZAppbXBvcnQgcGFuZGFzX3Byb2ZpbGluZwoKZnJvbSBtbHJ1bi5leGVjdXRpb24gaW1wb3J0IE1MQ2xpZW50Q3R4CmZyb20gbWxydW4uZGF0YXN0b3JlIGltcG9ydCBEYXRhSXRlbQoKCmRlZiBwYW5kYXNfcHJvZmlsaW5nX3JlcG9ydCgKICAgIGNvbnRleHQ6IE1MQ2xpZW50Q3R4LAogICAgZGF0YTogRGF0YUl0ZW0sCikgLT4gTm9uZToKICAgICIiIkNyZWF0ZSBhIFBhbmRhcyBQcm9maWxpbmcgUmVwb3J0IGZvciBhIGRhdGFzZXQuCiAgICA6cGFyYW0gY29udGV4dDogICAgICAgICB0aGUgZnVuY3Rpb24gY29udGV4dAogICAgOnBhcmFtIGRhdGE6ICAgICAgICAgICAgRGF0YXNldCB0byBjcmVhdGUgcmVwb3J0IGZvcgogICAgIiIiCgogICAgZGYgPSBkYXRhLmFzX2RmKCkKCiAgICBwcm9maWxlID0gZGYucHJvZmlsZV9yZXBvcnQodGl0bGU9IlBhbmRhcyBQcm9maWxpbmcgUmVwb3J0IikKCiAgICBjb250ZXh0LmxvZ19hcnRpZmFjdCgKICAgICAgICAiUGFuZGFzIFByb2ZpbGluZyBSZXBvcnQiLAogICAgICAgIGJvZHk9cHJvZmlsZS50b19odG1sKCksCiAgICAgICAgbG9jYWxfcGF0aD0icGFuZGFzX3Byb2ZpbGluZ19yZXBvcnQuaHRtbCIsCiAgICApCg== - commands: - - python -m pip install pandas_profiling - code_origin: https://github.com/daniels290813/functions.git#55a79c32be5d233cc11efcf40cd3edbe309bfdef:/home/kali/functions/pandas_profiling_report/pandas_profiling_report.py - affinity: null -verbose: false diff --git a/pandas_profiling_report/item.yaml b/pandas_profiling_report/item.yaml deleted file mode 100644 index 13d374369..000000000 --- a/pandas_profiling_report/item.yaml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: v1 -categories: -- data-analysis -description: Create Pandas Profiling Report from Dataset -doc: '' -example: pandas_profiling_report.ipynb -generationDate: 2022-08-28:17-25 -hidden: false -icon: '' -labels: - author: nicks -maintainers: [] -marketplaceType: '' -mlrunVersion: 1.1.0 -name: pandas-profiling-report -platformVersion: 3.5.0 -spec: - filename: pandas_profiling_report.py - handler: pandas_profiling_report - image: mlrun/mlrun - kind: job - requirements: - - pandas_profiling -url: '' -version: 1.1.0 diff --git a/pandas_profiling_report/pandas_profiling_report.ipynb b/pandas_profiling_report/pandas_profiling_report.ipynb deleted file mode 100644 index 61aeba265..000000000 --- a/pandas_profiling_report/pandas_profiling_report.ipynb +++ /dev/null @@ -1,794 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Pandas Profiling Report" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# nuclio: ignore\n", - "import nuclio" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "%nuclio: setting kind to 'job'\n", - "%nuclio: setting spec.image to 'mlrun/mlrun'\n" - ] - } - ], - "source": [ - "%nuclio config kind = \"job\"\n", - "%nuclio config spec.image = \"mlrun/mlrun\"" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "%%nuclio cmd -c\n", - "pip install pandas_profiling" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "import pandas_profiling\n", - "\n", - "from mlrun.execution import MLClientCtx\n", - "from mlrun.datastore import DataItem" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "def pandas_profiling_report(\n", - " context: MLClientCtx,\n", - " data: DataItem,\n", - ") -> None:\n", - " \"\"\"Create a Pandas Profiling Report for a dataset.\n", - " :param context: the function context\n", - " :param data: Dataset to create report for\n", - " \"\"\"\n", - " \n", - " # Load dataset\n", - " df = data.as_df()\n", - " \n", - " # Create Pandas Profiling Report\n", - " profile = df.profile_report(title='Pandas Profiling Report')\n", - " \n", - " # Save to MLRun DB\n", - " context.log_artifact('Pandas Profiling Report',\n", - " body=profile.to_html(),\n", - " local_path='pandas_profiling_report.html')" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "# nuclio: end-code" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### mlconfig" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "from mlrun import mlconf\n", - "import os\n", - "\n", - "mlconf.dbpath = 'http://mlrun-api:8080'\n", - "mlconf.artifact_path = mlconf.artifact_path or f'{os.environ[\"HOME\"]}/artifacts'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### save" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2020-10-15 19:21:40,986 [info] function spec saved to path: function.yaml\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from mlrun import code_to_function\n", - "\n", - "# create job function object from notebook code\n", - "fn = code_to_function(\"pandas_profiling_report\", kind=\"job\")\n", - "\n", - "# add metadata (for templates and reuse)\n", - "fn.spec.default_handler = \"pandas_profiling_report\"\n", - "fn.spec.description = \"Create Pandas Profiling Report from Dataset\"\n", - "fn.metadata.categories = [\"analysis\"]\n", - "fn.metadata.labels = {\"author\": \"nicks\"}\n", - "fn.export(\"function.yaml\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## tests" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from mlrun.platforms import auto_mount\n", - "fn.apply(auto_mount())" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "from mlrun import NewTask, run_local\n", - "\n", - "DATA_URL = 'https://iguazio-sample-data.s3.amazonaws.com/datasets/iris_dataset.csv'" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "task = NewTask(name=\"pandas-profiling-report\", \n", - " handler=pandas_profiling_report, \n", - " inputs={\"data\": DATA_URL})" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### run locally" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2020-10-15 19:21:41,030 [warning] warning!, server (0.5.1) and client (0.5.2) ver dont match\n", - "> 2020-10-15 19:21:41,031 [info] starting run pandas-profiling-report uid=0894aed4f2854d96b776e25bdcaff80e -> http://mlrun-api:8080\n", - "> 2020-10-15 19:21:41,062 [warning] warning!, server (0.5.1) and client (0.5.2) ver dont match\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "86c3397cc7384565815af90bc5a6d10b", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "HBox(children=(FloatProgress(value=0.0, description='Summarize dataset', max=19.0, style=ProgressStyle(descrip…" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "e7dece2ab7184c909611cf0aed3ef474", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "HBox(children=(FloatProgress(value=0.0, description='Generate report structure', max=1.0, style=ProgressStyle(…" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "7153ac93afcd4e77a4b5a312766af995", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "HBox(children=(FloatProgress(value=0.0, description='Render HTML', max=1.0, style=ProgressStyle(description_wi…" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
projectuiditerstartstatenamelabelsinputsparametersresultsartifacts
default0Oct 15 19:21:41completedpandas-profiling-report
v3io_user=nicks
kind=handler
owner=nicks
host=nicks-jupyter-76668bdd46-g9sxf
data
Pandas Profiling Report
\n", - "
\n", - "
\n", - "
\n", - " Title\n", - " ×\n", - "
\n", - " \n", - "
\n", - "
\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "to track results use .show() or .logs() or in CLI: \n", - "!mlrun get run 0894aed4f2854d96b776e25bdcaff80e --project default , !mlrun logs 0894aed4f2854d96b776e25bdcaff80e --project default\n", - "> 2020-10-15 19:21:52,944 [info] run executed, status=completed\n" - ] - } - ], - "source": [ - "run = run_local(task)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### run remotely" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "# Create MLRun image (only needs to be run once)\n", - "fn.deploy()" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2020-10-15 19:23:17,199 [info] starting run pandas-profiling-report uid=0ab5c8dbff95471da6018c1a7afd3b22 -> http://mlrun-api:8080\n", - "> 2020-10-15 19:23:17,303 [info] Job is running in the background, pod: pandas-profiling-report-xr48m\n", - "Summarize dataset: 100%|██████████| 19/19 [00:05<00:00, 3.78it/s, Completed] \n", - "Generate report structure: 100%|██████████| 1/1 [00:02<00:00, 2.22s/it]\n", - "> 2020-10-15 19:23:33,779 [info] run executed, status=completed\n", - "Render HTML: 100%|██████████| 1/1 [00:00<00:00, 2.07it/s]\n", - "final state: succeeded\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
projectuiditerstartstatenamelabelsinputsparametersresultsartifacts
default0Oct 15 19:23:25completedpandas-profiling-report
v3io_user=nicks
kind=job
owner=nicks
host=pandas-profiling-report-xr48m
data
Pandas Profiling Report
\n", - "
\n", - "
\n", - "
\n", - " Title\n", - " ×\n", - "
\n", - " \n", - "
\n", - "
\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "to track results use .show() or .logs() or in CLI: \n", - "!mlrun get run 0ab5c8dbff95471da6018c1a7afd3b22 --project default , !mlrun logs 0ab5c8dbff95471da6018c1a7afd3b22 --project default\n", - "> 2020-10-15 19:23:36,481 [info] run executed, status=completed\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "fn.run(task, inputs={\"data\": DATA_URL})" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/pandas_profiling_report/pandas_profiling_report.py b/pandas_profiling_report/pandas_profiling_report.py deleted file mode 100644 index c3d3d4d32..000000000 --- a/pandas_profiling_report/pandas_profiling_report.py +++ /dev/null @@ -1,41 +0,0 @@ -# Copyright 2019 Iguazio -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Generated by nuclio.export.NuclioExporter - -import pandas as pd -import pandas_profiling - -from mlrun.execution import MLClientCtx -from mlrun.datastore import DataItem - - -def pandas_profiling_report( - context: MLClientCtx, - data: DataItem, -) -> None: - """Create a Pandas Profiling Report for a dataset. - :param context: the function context - :param data: Dataset to create report for - """ - - df = data.as_df() - - profile = df.profile_report(title="Pandas Profiling Report") - - context.log_artifact( - "Pandas Profiling Report", - body=profile.to_html(), - local_path="pandas_profiling_report.html", - ) diff --git a/project_runner/function.yaml b/project_runner/function.yaml deleted file mode 100644 index 1c43fd3b1..000000000 --- a/project_runner/function.yaml +++ /dev/null @@ -1,53 +0,0 @@ -kind: remote -metadata: - name: project-runner - tag: '' - hash: b7888996aa9a7833972928fa06fa238f674099b3 - project: '' - labels: - author: orz - categories: - - utils -spec: - command: '' - args: [] - image: '' - entry_points: - init_context: - name: init_context - doc: '' - parameters: - - name: context - outputs: [] - lineno: 8 - handler: - name: handler - doc: "Imports the latest project version and runs the \nspecified workflow" - parameters: - - name: context - - name: event - outputs: [] - lineno: 11 - description: Nuclio based - Cron scheduler for running your MLRun projects - min_replicas: 1 - max_replicas: 1 - env: [] - base_spec: - apiVersion: nuclio.io/v1 - kind: Function - metadata: - annotations: - nuclio.io/generated_by: function generated from 02-07-2020 by admin - labels: {} - name: project-runner - spec: - build: - baseImage: mlrun/mlrun - commands: [] - functionSourceCode: IyBHZW5lcmF0ZWQgYnkgbnVjbGlvLmV4cG9ydC5OdWNsaW9FeHBvcnRlcgoKZnJvbSBtbHJ1biBpbXBvcnQgbG9hZF9wcm9qZWN0CmZyb20gbWxydW4gaW1wb3J0IG1sY29uZgppbXBvcnQganNvbgppbXBvcnQgb3MKCmRlZiBpbml0X2NvbnRleHQoY29udGV4dCk6CiAgICBzZXRhdHRyKGNvbnRleHQsICdodWJfdXJsJywgb3MuZ2V0ZW52KCdodWJfdXJsJywgTm9uZSkpCgpkZWYgaGFuZGxlcihjb250ZXh0LCBldmVudCk6CiAgICAiIiJJbXBvcnRzIHRoZSBsYXRlc3QgcHJvamVjdCB2ZXJzaW9uIGFuZCBydW5zIHRoZSAKICAgIHNwZWNpZmllZCB3b3JrZmxvdwogICAgIiIiCiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKCdQdWxsaW5nIHByb2plY3QgYW5kIHdvcmtmbG93IGRldGFpbHMnKQogICAgaWYgaXNpbnN0YW5jZShldmVudC5ib2R5LCBkaWN0KToKICAgICAgICBkZXRhaWxzID0gZXZlbnQuYm9keQogICAgZWxzZToKICAgICAgICBkZXRhaWxzID0ganNvbi5sb2FkcyhldmVudC5ib2R5KQogICAgY29udGV4dC5sb2dnZXIuaW5mbyhkZXRhaWxzKQogICAgcHJvamVjdF91cmwgPSBkZXRhaWxzWydwcm9qZWN0X3VybCddCiAgICB3b3JrZmxvdyA9IGRldGFpbHNbJ3dvcmtmbG93J10KICAgIGFydGlmYWN0X3BhdGggPSBkZXRhaWxzLmdldCgnYXJ0aWZhY3RfcGF0aCcsIG9zLmVudmlyb24uZ2V0KCdhcnRpZmFjdF9wYXRoJywgTm9uZSkpCiAgICBodWJfdXJsID0gZGV0YWlscy5nZXQoJ2h1Yl91cmwnLCBjb250ZXh0Lmh1Yl91cmwpCgogICAgaWYgaHViX3VybDoKICAgICAgICBtbGNvbmYuaHViX3VybCA9IGh1Yl91cmwKCiAgICBwcm9qZWN0PSBsb2FkX3Byb2plY3Qob3MucGF0aC5hYnNwYXRoKCcuL2xvYWRlZF9wcm9qZWN0JyksIHVybD1wcm9qZWN0X3VybCkKICAgIHByb2plY3QucnVuKG5hbWU9d29ya2Zsb3csCiAgICAgICAgICAgICAgICBhcmd1bWVudHM9e30sCiAgICAgICAgICAgICAgICBhcnRpZmFjdF9wYXRoPWFydGlmYWN0X3BhdGgsCiAgICAgICAgICAgICAgICB3YXRjaD1GYWxzZSkKCg== - noBaseImagesPull: true - env: [] - handler: project_runner:handler - runtime: python:3.6 - volumes: [] - source: '' diff --git a/project_runner/project_runner.ipynb b/project_runner/project_runner.ipynb deleted file mode 100644 index 04bebea12..000000000 --- a/project_runner/project_runner.ipynb +++ /dev/null @@ -1,340 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Project runner\n", - "Imports the latest project version and runs the specified workflow" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "import nuclio" - ] - }, - { - "cell_type": "code", - "execution_count": 61, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "%nuclio: setting spec.build.baseImage to 'mlrun/mlrun'\n" - ] - } - ], - "source": [ - "%nuclio config spec.build.baseImage = \"mlrun/mlrun\"" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "# nuclio: start-code" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "from mlrun import load_project\n", - "from mlrun import mlconf\n", - "import json\n", - "import os" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "def init_context(context):\n", - " setattr(context, 'hub_url', os.getenv('hub_url', None))" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [], - "source": [ - "def handler(context, event):\n", - " \"\"\"Imports the latest project version and runs the \n", - " specified workflow\n", - " \"\"\"\n", - " context.logger.info('Pulling project and workflow details')\n", - " if isinstance(event.body, dict):\n", - " details = event.body\n", - " else:\n", - " details = json.loads(event.body)\n", - " context.logger.info(details)\n", - " project_url = details['project_url']\n", - " workflow = details['workflow']\n", - " artifact_path = details.get('artifact_path', os.environ.get('artifact_path', None))\n", - " hub_url = details.get('hub_url', context.hub_url)\n", - "\n", - " if hub_url:\n", - " mlconf.hub_url = hub_url\n", - "\n", - " project= load_project(os.path.abspath('./loaded_project'), url=project_url)\n", - " project.run(name=workflow,\n", - " arguments={},\n", - " artifact_path=artifact_path,\n", - " watch=False)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "# nuclio: end-code" - ] - }, - { - "cell_type": "code", - "execution_count": 63, - "metadata": {}, - "outputs": [], - "source": [ - "import json\n", - "runner_event = {'project_url': '/User/demo-network-operations/project.yaml',\n", - " 'workflow': 'main',\n", - " 'hub_url': '/User/functions/{name}/function.yaml',\n", - " 'artifact_path': '/User/functions/project_runner/artifacts/'}" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Python> 2020-07-01 14:36:45,368 [info] \n", - "Python> 2020-07-01 14:36:45,369 [info] {'project_url': '/User/demo-network-operations/project.yaml', 'workflow': 'main', 'hub_url': '/User/functions/{name}/function.yaml', 'artifact_path': '/User/functions/project_runner/artifacts/'}\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/conda/lib/python3.6/site-packages/kfp/components/_data_passing.py:168: UserWarning: Missing type name was inferred as \"JsonArray\" based on the value \"['cpu_utilization', 'throughput', 'packet_loss', 'latency']\".\n", - " warnings.warn('Missing type name was inferred as \"{}\" based on the value \"{}\".'.format(type_name, str(value)))\n", - "/conda/lib/python3.6/site-packages/kfp/components/_data_passing.py:168: UserWarning: Missing type name was inferred as \"JsonArray\" based on the value \"['mean', 'sum', 'std', 'var', 'min', 'max', 'median']\".\n", - " warnings.warn('Missing type name was inferred as \"{}\" based on the value \"{}\".'.format(type_name, str(value)))\n", - "/conda/lib/python3.6/site-packages/kfp/components/_data_passing.py:168: UserWarning: Missing type name was inferred as \"Integer\" based on the value \"20\".\n", - " warnings.warn('Missing type name was inferred as \"{}\" based on the value \"{}\".'.format(type_name, str(value)))\n", - "/conda/lib/python3.6/site-packages/kfp/components/_data_passing.py:168: UserWarning: Missing type name was inferred as \"Float\" based on the value \"0.3\".\n", - " warnings.warn('Missing type name was inferred as \"{}\" based on the value \"{}\".'.format(type_name, str(value)))\n", - "/conda/lib/python3.6/site-packages/kfp/components/_data_passing.py:168: UserWarning: Missing type name was inferred as \"JsonArray\" based on the value \"[1, 0]\".\n", - " warnings.warn('Missing type name was inferred as \"{}\" based on the value \"{}\".'.format(type_name, str(value)))\n", - "/conda/lib/python3.6/site-packages/kfp/components/_data_passing.py:168: UserWarning: Missing type name was inferred as \"Integer\" based on the value \"-1\".\n", - " warnings.warn('Missing type name was inferred as \"{}\" based on the value \"{}\".'.format(type_name, str(value)))\n", - "/conda/lib/python3.6/site-packages/kfp/components/_data_passing.py:168: UserWarning: Missing type name was inferred as \"Float\" based on the value \"0.1\".\n", - " warnings.warn('Missing type name was inferred as \"{}\" based on the value \"{}\".'.format(type_name, str(value)))\n", - "/conda/lib/python3.6/site-packages/kfp/components/_data_passing.py:168: UserWarning: Missing type name was inferred as \"Float\" based on the value \"0.75\".\n", - " warnings.warn('Missing type name was inferred as \"{}\" based on the value \"{}\".'.format(type_name, str(value)))\n" - ] - }, - { - "data": { - "text/html": [ - "Experiment link here" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "Run link here" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[mlrun] 2020-07-01 14:36:46,646 Pipeline run id=cf85ec1b-2df7-403c-b7b4-b9bdb8fcf92f, check UI or DB for progress\n" - ] - } - ], - "source": [ - "init_context(context)\n", - "event = nuclio.Event(body=json.dumps(runner_event))\n", - "out = handler(context, event)\n", - "out" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Deployment" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [], - "source": [ - "from mlrun import code_to_function, mount_v3io\n", - "from nuclio.triggers import CronTrigger" - ] - }, - { - "cell_type": "code", - "execution_count": 89, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[mlrun] 2020-07-02 09:30:36,014 function spec saved to path: function.yaml\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 89, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Saving the function for import via hub://project_runner\n", - "fn = code_to_function(name='project-runner',\n", - " kind='nuclio')\n", - "fn.spec.description = 'Nuclio based - Cron scheduler for running your MLRun projects'\n", - "fn.metadata.categories = [\"utils\"]\n", - "fn.metadata.labels = {'author': 'orz'}\n", - "fn.spec.maxReplicas = 1\n", - "fn.export('function.yaml')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### How to call from your project?\n", - "> **After** importing the function" - ] - }, - { - "cell_type": "code", - "execution_count": 90, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 90, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cron_string = '* * 1 * *' # Regular cron string as in https://pypi.org/project/croniter/\n", - "\n", - "# Set defaults\n", - "fn.set_envs({'artifact_path': '/User/functions/project_runner/artifacts/',\n", - " 'hub_url': '/User/functions/{name}/function.yaml'})\n", - "\n", - "# Set project and workflow event\n", - "runner_event = {'project_url': '/User/demo-network-operations/project.yaml',\n", - " 'workflow': 'main'}\n", - "\n", - "# Add as a trigger\n", - "fn.add_trigger('cron', \n", - " CronTrigger(schedule=cron_string,\n", - " body=json.dumps(runner_event),\n", - " headers={'X-Nuclio-Target': 'project-runner'}))\n", - "\n", - "# Add mount for access to the different directories\n", - "fn.apply(mount_v3io())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[mlrun] 2020-07-02 09:31:16,905 deploy started\n", - "[nuclio] 2020-07-02 09:31:19,021 (info) Build complete\n" - ] - } - ], - "source": [ - "fn.deploy()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python [conda env:root] *", - "language": "python", - "name": "conda-root-py" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.8" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/rnn_serving/function.yaml b/rnn_serving/function.yaml deleted file mode 100644 index 7a09e1f46..000000000 --- a/rnn_serving/function.yaml +++ /dev/null @@ -1,46 +0,0 @@ -kind: serving -metadata: - name: rnn-serving - tag: '' - hash: 548cd27edfdc49aed0b069d94bd049435d484722 - project: '' - labels: - author: Daniel - categories: - - model-serving - - machine-learning -spec: - command: '' - args: [] - image: mlrun/ml-models - description: deploy an rnn based stock analysis model server. - min_replicas: 1 - max_replicas: 4 - env: [] - base_spec: - apiVersion: nuclio.io/v1 - kind: Function - metadata: - name: rnn-serving - labels: {} - annotations: - nuclio.io/generated_by: function generated from /User/test/functions/rnn_serving/rnn_serving.py - spec: - runtime: python:3.6 - handler: rnn_serving:handler - env: [] - volumes: [] - build: - commands: [] - noBaseImagesPull: true - functionSourceCode: aW1wb3J0IG1scnVuCmltcG9ydCBudW1weSBhcyBucApmcm9tIHRlbnNvcmZsb3cgaW1wb3J0IGtlcmFzCmltcG9ydCBqc29uCgoKY2xhc3MgUk5OX01vZGVsX1NlcnZpbmcobWxydW4uc2VydmluZy5WMk1vZGVsU2VydmVyKToKICAgIGRlZiBsb2FkKHNlbGYpOgogICAgICAgICIiImxvYWQgYW5kIGluaXRpYWxpemUgdGhlIG1vZGVsIGFuZC9vciBvdGhlciBlbGVtZW50cyIiIgogICAgICAgIG1vZGVsX2ZpbGUsIGV4dHJhX2RhdGEgPSBzZWxmLmdldF9tb2RlbChzdWZmaXg9Ii5oNSIpCiAgICAgICAgc2VsZi5tb2RlbCA9IGtlcmFzLm1vZGVscy5sb2FkX21vZGVsKG1vZGVsX2ZpbGUpCgogICAgZGVmIHByZWRpY3Qoc2VsZiwgYm9keSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICAiIiJHZW5lcmF0ZSBtb2RlbCBwcmVkaWN0aW9ucyBmcm9tIHNhbXBsZS4iIiIKICAgICAgICAgICAgZmVhdHMgPSBucC5hc2FycmF5KGJvZHlbJ2lucHV0cyddKQogICAgICAgICAgICByZXN1bHQgPSBzZWxmLm1vZGVsLnByZWRpY3QoZmVhdHMpCiAgICAgICAgICAgIHJlc3VsdCA9IGpzb24uZHVtcHMocmVzdWx0LnRvbGlzdCgpKQogICAgICAgICAgICByZXR1cm4gcmVzdWx0CiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIkZhaWxlZCB0byBwcmVkaWN0ICVzIiAlIGUpCmZyb20gbWxydW4ucnVudGltZXMgaW1wb3J0IG51Y2xpb19pbml0X2hvb2sKZGVmIGluaXRfY29udGV4dChjb250ZXh0KToKICAgIG51Y2xpb19pbml0X2hvb2soY29udGV4dCwgZ2xvYmFscygpLCAnc2VydmluZ192MicpCgpkZWYgaGFuZGxlcihjb250ZXh0LCBldmVudCk6CiAgICByZXR1cm4gY29udGV4dC5tbHJ1bl9oYW5kbGVyKGNvbnRleHQsIGV2ZW50KQo= - source: '' - function_kind: serving_v2 - build: - commands: [] - code_origin: https://github.com/daniels290813/functions.git#97b63199864dd95681bca5af86835d177bf9d67b:/User/test/functions/rnn_serving/rnn_serving.py - origin_filename: /User/test/functions/rnn_serving/rnn_serving.py - secret_sources: [] - mount_applied: false - affinity: null -verbose: false diff --git a/rnn_serving/item.yaml b/rnn_serving/item.yaml deleted file mode 100644 index 5cc7b9367..000000000 --- a/rnn_serving/item.yaml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: v1 -categories: -- model-serving -- machine-learning -description: deploy an rnn based stock analysis model server. -doc: '' -example: rnn_serving.ipynb -generationDate: 2022-08-28:17-25 -hidden: false -icon: '' -labels: - author: Daniel -maintainers: [] -marketplaceType: '' -mlrunVersion: 1.1.0 -name: rnn-serving -platformVersion: 3.5.0 -spec: - filename: rnn_serving.py - handler: handler - image: mlrun/ml-models - kind: serving - requirements: null -url: '' -version: 1.1.0 diff --git a/rnn_serving/requirements.txt b/rnn_serving/requirements.txt deleted file mode 100644 index ff480e35d..000000000 --- a/rnn_serving/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -tensorflow==2.8.2 -wget \ No newline at end of file diff --git a/rnn_serving/rnn_serving.ipynb b/rnn_serving/rnn_serving.ipynb deleted file mode 100644 index dbdf3b874..000000000 --- a/rnn_serving/rnn_serving.ipynb +++ /dev/null @@ -1,285 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# **RNN Serving**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following section we create a new model serving function which wraps our class , and specify model and other resources.
\n", - "Deploying the serving function will provide us an http endpoint that can handle requests in real time.
\n", - "This function is part of the [stock-analysis demo](https://github.com/mlrun/demos/tree/master/stock-analysis).
\n", - "To see how the model is trained or how the data-set is generated, check out code folder in the demo repository." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Steps**\n", - "\n", - "1. [Setup function parameters](#Setup-function-parameters)\n", - "2. [Importing the function](#Importing-the-function)\n", - "3. [Testing the function locally](#Testing-the-function-locally)\n", - "4. [Testing the function remotely](#Testing-the-function-remotely)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import warnings\n", - "warnings.filterwarnings(\"ignore\")" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "# Following packages are required, make sure to install\n", - "# !pip install pip install torch==1.6.0\n", - "# !pip install tensorflow\n", - "# !pip install keras" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Setup function parameters**" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "# Setting up models path\n", - "rnn_model_path = 'https://s3.wasabisys.com/iguazio/models/function-marketplace-models/rnn_serving/rnn_model.h5'\n", - "data_path = 'https://s3.wasabisys.com/iguazio/data/function-marketplace-data/rnn_serving/stocks_data.pkl'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Importing the function**" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2021-10-17 10:43:46,363 [info] loaded project function-marketplace from MLRun DB\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import mlrun\n", - "mlrun.set_environment(project='function-marketplace')\n", - "\n", - "# Importing the function from the hub\n", - "fn = mlrun.import_function(\"hub://rnn_serving\")\n", - "fn.apply(mlrun.auto_mount())\n", - "\n", - "# Manually specifying needed packages \n", - "fn.spec.build.commands = ['pip install torch==1.6.0', 'pip install tensorflow', 'pip install keras']\n", - "\n", - "# Adding the model \n", - "fn.add_model(key='rnn_model', model_path=rnn_model_path ,class_name='RNN_Model_Serving')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Testing the function locally**" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2021-10-17 10:43:54,256 [info] model rnn_model was loaded\n", - "> 2021-10-17 10:43:54,257 [info] Initializing endpoint records\n", - "> 2021-10-17 10:43:54,276 [info] Loaded ['rnn_model']\n" - ] - } - ], - "source": [ - "# When mocking, class has to be present\n", - "from rnn_serving import *\n", - "\n", - "# Mocking function\n", - "server = fn.to_mock_server()" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "# Getting the data\n", - "import cloudpickle as cp\n", - "from urllib.request import urlopen\n", - "\n", - "rnn_data = cp.load(urlopen(data_path))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "model used in this example take inputs with the shape `(None, None, 11)`.
\n", - "whereas the first dimenstion is the number of instances, the second dimenstion is the number of timestamps
\n", - "and the last dimenstion is the number of features the dataset have.
\n", - "our testing dataset has `(1,10,11)` means one instance to predict, with sequence length of 10, each step has 11 features." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'id': '1bf6a3dc4d204e6e8bfd5834f5d691f1',\n", - " 'model_name': 'rnn_model',\n", - " 'outputs': '[[0.43563252687454224]]'}" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import requests\n", - "\n", - "# KFServing protocol event\n", - "event_data = {\"inputs\": rnn_data}\n", - "\n", - "response = server.test(path='/v2/models/rnn_model/predict',body=event_data)\n", - "response" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Testing the function remotely**" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2021-10-17 10:43:57,192 [info] Starting remote function deploy\n", - "2021-10-17 10:43:57 (info) Deploying function\n", - "2021-10-17 10:43:57 (info) Building\n", - "2021-10-17 10:43:57 (info) Staging files and preparing base images\n", - "2021-10-17 10:43:57 (info) Building processor image\n", - "2021-10-17 10:43:58 (info) Build complete\n", - "2021-10-17 10:44:10 (info) Function deploy complete\n", - "> 2021-10-17 10:44:11,677 [info] successfully deployed function: {'internal_invocation_urls': ['nuclio-function-marketplace-rnn-serving.default-tenant.svc.cluster.local:8080'], 'external_invocation_urls': ['default-tenant.app.dev39.lab.iguazeng.com:30255']}\n" - ] - } - ], - "source": [ - "address = fn.deploy()" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'id': '1bf6a3dc4d204e6e8bfd5834f5d691f1',\n", - " 'model_name': 'rnn_model',\n", - " 'outputs': '[[0.43563252687454224]]'}" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import json\n", - "import requests\n", - "\n", - "# using requests to predict\n", - "response = requests.put(address+\"/v2/models/rnn_model/predict\", json = json.dumps(event_data))\n", - "json.loads(response.text)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "[Back to the top](#RNN-Serving)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/rnn_serving/rnn_serving.py b/rnn_serving/rnn_serving.py deleted file mode 100644 index d7e783d7a..000000000 --- a/rnn_serving/rnn_serving.py +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright 2019 Iguazio -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -import mlrun -import numpy as np -from tensorflow import keras -import json - - -class RNN_Model_Serving(mlrun.serving.V2ModelServer): - def load(self): - """load and initialize the model and/or other elements""" - model_file, extra_data = self.get_model(suffix=".h5") - self.model = keras.models.load_model(model_file) - - def predict(self, body): - try: - """Generate model predictions from sample.""" - feats = np.asarray(body['inputs']) - result = self.model.predict(feats) - result = json.dumps(result.tolist()) - return result - except Exception as e: - raise Exception("Failed to predict %s" % e) \ No newline at end of file diff --git a/rnn_serving/test_rnn_serving.py b/rnn_serving/test_rnn_serving.py deleted file mode 100644 index fb2f49974..000000000 --- a/rnn_serving/test_rnn_serving.py +++ /dev/null @@ -1,74 +0,0 @@ -# Copyright 2019 Iguazio -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -import os -import wget -from mlrun import import_function -from os import path -from rnn_serving import * - -DATASET = np.array([[6.9955170e-01, 6.9952875e-01, 2.7922913e-02, 2.7853036e-02, - 6.9955170e-01, 7.0086759e-01, 7.0118028e-01, 7.0142627e-01, - 2.7922913e-02, 0.0000000e+00, 0.0000000e+00], - [6.9955170e-01, 6.9998503e-01, 1.6527303e-03, 2.7853036e-02, - 7.0000792e-01, 7.0085293e-01, 7.0118028e-01, 7.0203447e-01, - 1.6527303e-03, 0.0000000e+00, 0.0000000e+00], - [6.9955170e-01, 7.0025057e-01, 1.6904050e-04, 2.7853036e-02, - 7.0027345e-01, 7.0014298e-01, 7.0190376e-01, 7.0128226e-01, - 1.6904050e-04, 0.0000000e+00, 0.0000000e+00], - [6.9955170e-01, 7.0144778e-01, 1.6904050e-04, 2.7853036e-02, - 7.0147055e-01, 7.0178574e-01, 7.0236105e-01, 7.0295709e-01, - 7.3906886e-03, 0.0000000e+00, 0.0000000e+00], - [6.9955170e-01, 7.0324355e-01, 1.6904050e-04, 2.7853036e-02, - 7.0326620e-01, 7.0308524e-01, 7.0490342e-01, 7.0427048e-01, - 2.4815742e-03, 0.0000000e+00, 0.0000000e+00], - [6.9955170e-01, 7.0324355e-01, 1.6904050e-04, 2.7853036e-02, - 7.0191067e-01, 7.0173001e-01, 7.0354480e-01, 7.0291305e-01, - 2.9976186e-03, 0.0000000e+00, 0.0000000e+00], - [6.9955170e-01, 7.0324355e-01, 1.6904050e-04, 2.7853036e-02, - 7.0166123e-01, 7.0148063e-01, 7.0284635e-01, 7.0249581e-01, - 2.7904075e-03, 0.0000000e+00, 0.0000000e+00], - [6.9955170e-01, 7.0324355e-01, 1.6904050e-04, 2.7853036e-02, - 7.0133996e-01, 7.0143080e-01, 7.0297277e-01, 7.0250750e-01, - 4.1491759e-04, 0.0000000e+00, 0.0000000e+00], - [6.9955170e-01, 7.0324355e-01, 1.6904050e-04, 2.7853036e-02, - 7.0150572e-01, 7.0251614e-01, 7.0281982e-01, 7.0370042e-01, - 2.1256472e-03, 0.0000000e+00, 0.0000000e+00], - [6.9955170e-01, 7.0324355e-01, 1.6904050e-04, 2.7853036e-02, - 7.0272487e-01, 7.0258951e-01, 7.0429617e-01, 7.0376801e-01, - 1.4207334e-03, 0.0000000e+00, 0.0000000e+00]]).reshape(1, 10, 11).tolist() - - -def download_pretrained_model(model_path): - # Run this to download the pre-trained model to your `models` directory - model_location = 'https://s3.wasabisys.com/iguazio/models/rnn/rnn_model.h5' - saved_models_directory = model_path - # Create paths - os.makedirs(saved_models_directory, exist_ok=1) - model_filepath = os.path.join(saved_models_directory, os.path.basename(model_location)) - wget.download(model_location, model_filepath) - - -def test_rnn_serving(): - model_path = os.path.join(os.path.abspath('./'), 'models') - model = model_path + '/rnn_model.h5' - if not path.exists(model): - download_pretrained_model(model_path) - - fn = import_function('function.yaml') - fn.add_model('rnn_model', model_path=model, class_name='RNN_Model_Serving') - # create an emulator (mock server) from the function configuration) - server = fn.to_mock_server() - resp = server.test("/v2/models/rnn_model/infer", {"inputs": DATASET}) - assert (resp['outputs'] == '[[0.453309565782547]]') diff --git a/slack_notify/README.md b/slack_notify/README.md deleted file mode 100644 index 9bde32995..000000000 --- a/slack_notify/README.md +++ /dev/null @@ -1 +0,0 @@ -# Send Notification to Slack \ No newline at end of file diff --git a/slack_notify/function.yaml b/slack_notify/function.yaml deleted file mode 100644 index 95af087c0..000000000 --- a/slack_notify/function.yaml +++ /dev/null @@ -1,48 +0,0 @@ -kind: job -metadata: - name: slack-notify - tag: '' - hash: 3de7e78ed9b7928af192badf988055086431fb58 - project: '' - labels: - author: mdl - categories: - - utils -spec: - command: '' - args: [] - image: python:3.6-jessie - env: [] - default_handler: slack_notify - entry_points: - slack_notify: - name: slack_notify - doc: Summarize a table - parameters: - - name: context - type: MLClientCtx - doc: the function context - default: '' - - name: webhook_url - type: str - doc: 'Slack incoming webhook URL. Please read: https://api.slack.com/messaging/webhooks' - default: URL - - name: slack_blocks - type: List[str] - doc: Message blocks list. NOT IMPLEMENTED YET - default: [] - - name: notification_text - type: str - doc: Notification text - default: Notification - outputs: - - default: '' - lineno: 14 - description: Send Slack notification - build: - functionSourceCode: IyBHZW5lcmF0ZWQgYnkgbnVjbGlvLmV4cG9ydC5OdWNsaW9FeHBvcnRlcgoKaW1wb3J0IHdhcm5pbmdzCgp3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoYWN0aW9uPSJpZ25vcmUiLCBjYXRlZ29yeT1GdXR1cmVXYXJuaW5nKQoKaW1wb3J0IG9zCmltcG9ydCBqc29uCmltcG9ydCByZXF1ZXN0cwpmcm9tIG1scnVuLmV4ZWN1dGlvbiBpbXBvcnQgTUxDbGllbnRDdHgKZnJvbSB0eXBpbmcgaW1wb3J0IExpc3QKCgpkZWYgc2xhY2tfbm90aWZ5KAogICAgY29udGV4dDogTUxDbGllbnRDdHgsCiAgICB3ZWJob29rX3VybDogc3RyID0gIlVSTCIsCiAgICBzbGFja19ibG9ja3M6IExpc3Rbc3RyXSA9IFtdLAogICAgbm90aWZpY2F0aW9uX3RleHQ6IHN0ciA9ICJOb3RpZmljYXRpb24iLAopIC0+IE5vbmU6CiAgICAiIiJTdW1tYXJpemUgYSB0YWJsZQogICAgOnBhcmFtIGNvbnRleHQ6ICAgICAgICAgdGhlIGZ1bmN0aW9uIGNvbnRleHQKICAgIDpwYXJhbSB3ZWJob29rX3VybDogICAgIFNsYWNrIGluY29taW5nIHdlYmhvb2sgVVJMLiBQbGVhc2UgcmVhZDogaHR0cHM6Ly9hcGkuc2xhY2suY29tL21lc3NhZ2luZy93ZWJob29rcwogICAgOnBhcmFtIG5vdGlmaWNhdGlvbl90ZXh0OiAgICAgICAgICAgIE5vdGlmaWNhdGlvbiB0ZXh0CiAgICA6cGFyYW0gc2xhY2tfYmxvY2tzOiAgICAgICAgICBNZXNzYWdlIGJsb2NrcyBsaXN0LiBOT1QgSU1QTEVNRU5URUQgWUVUCiAgICAiIiIKCiAgICBkYXRhID0geyJ0ZXh0Ijogbm90aWZpY2F0aW9uX3RleHR9CiAgICBwcmludCgiPT09PSIsIHdlYmhvb2tfdXJsKQogICAgcmVzcG9uc2UgPSByZXF1ZXN0cy5wb3N0KAogICAgICAgIHdlYmhvb2tfdXJsLCBkYXRhPWpzb24uZHVtcHMoZGF0YSksIGhlYWRlcnM9eyJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24vanNvbiJ9CiAgICApCgogICAgcHJpbnQoIlJlc3BvbnNlOiAiICsgc3RyKHJlc3BvbnNlLnRleHQpKQogICAgcHJpbnQoIlJlc3BvbnNlIGNvZGU6ICIgKyBzdHIocmVzcG9uc2Uuc3RhdHVzX2NvZGUpKQo= - commands: - - python -m pip install requests - code_origin: https://github.com/daniels290813/functions.git#55a79c32be5d233cc11efcf40cd3edbe309bfdef:/home/kali/functions/slack_notify/slack_notify.py - affinity: null -verbose: false diff --git a/slack_notify/item.yaml b/slack_notify/item.yaml deleted file mode 100644 index 6bdfd2c83..000000000 --- a/slack_notify/item.yaml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: v1 -categories: -- utils -description: Send Slack notification -doc: '' -example: slack_notify.ipynb -generationDate: 2022-08-28:17-25 -hidden: false -icon: '' -labels: - author: mdl -maintainers: [] -marketplaceType: '' -mlrunVersion: 1.1.0 -name: slack-notify -platformVersion: 3.5.0 -spec: - filename: slack_notify.py - handler: slack_notify - image: python:3.6-jessie - kind: job - requirements: - - requests -url: '' -version: 1.1.0 diff --git a/slack_notify/slack_notify.ipynb b/slack_notify/slack_notify.ipynb deleted file mode 100644 index 8119bb8cf..000000000 --- a/slack_notify/slack_notify.ipynb +++ /dev/null @@ -1,293 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "# nuclio: ignore\n", - "import nuclio" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "%nuclio: setting kind to 'job'\n", - "%nuclio: setting spec.image to 'python:3.6-jessie'\n" - ] - } - ], - "source": [ - "%nuclio config kind = \"job\"\n", - "%nuclio config spec.image = \"python:3.6-jessie\"" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [], - "source": [ - "%%nuclio cmd -c \n", - "pip install requests" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [], - "source": [ - "import warnings\n", - "warnings.simplefilter(action='ignore', category=FutureWarning)" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "import json\n", - "import requests\n", - "from mlrun.execution import MLClientCtx\n", - "from typing import List" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [], - "source": [ - "def slack_notify(\n", - " context: MLClientCtx,\n", - " webhook_url: str = \"URL\",\n", - " slack_blocks: List[str] = [],\n", - " notification_text: str = \"Notification\"\n", - ") -> None:\n", - " \"\"\"Summarize a table\n", - " :param context: the function context\n", - " :param webhook_url: Slack incoming webhook URL. Please read: https://api.slack.com/messaging/webhooks\n", - " :param notification_text: Notification text\n", - " :param slack_blocks: Message blocks list. NOT IMPLEMENTED YET\n", - " \"\"\"\n", - " \n", - " data = {\n", - " 'text': notification_text\n", - " }\n", - " print(\"====\",webhook_url)\n", - " response = requests.post(webhook_url, data=json.dumps(\n", - " data), headers={'Content-Type': 'application/json'})\n", - "\n", - " print('Response: ' + str(response.text))\n", - " print('Response code: ' + str(response.status_code))" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [], - "source": [ - "# nuclio: end-code" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### mlconfig" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [], - "source": [ - "from mlrun import mlconf\n", - "import os\n", - "\n", - "mlconf.dbpath = 'http://mlrun-api:8080'\n", - "mlconf.artifact_path = mlconf.artifact_path or f'{os.environ[\"HOME\"]}/artifacts'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### save" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from mlrun import code_to_function\n", - "\n", - "# create job function object from notebook code\n", - "fn = code_to_function(\"slack_notify\")\n", - "# add metadata (for templates and reuse)\n", - "fn.spec.default_handler = \"slack_notify\"\n", - "fn.spec.description = \"Send Slack notification\"\n", - "fn.metadata.categories = [\"ops\"]\n", - "fn.metadata.labels = {\"author\": \"mdl\"}\n", - "fn.export(\"function.yaml\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## tests" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from mlrun import import_function\n", - "func = import_function(\"hub://slack_notify\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from mlrun import NewTask, run_local\n", - "\n", - "\n", - "#Slack incoming webhook URL. Please read: https://api.slack.com/messaging/webhooks\n", - "task_params = {\n", - " \"webhook_url\" : \"https://hooks.slack.com/services/xxxxxxxx/xxxxxxxxx/xxxxxxxxxxxxxx\",\n", - " \"notification_text\" : \"Test Notification\"\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "task = NewTask(\n", - " name=\"tasks slack notify\", \n", - " params = task_params,\n", - " handler=slack_notify)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### run local where artifact path is fixed " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "run = run_local(task, artifact_path=mlconf.artifact_path)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### run remote where artifact path includes the run id" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "func.deploy()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "func.run(task, params=task_params, workdir=mlconf.artifact_path)" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "function: slack-notify\n", - "Send Slack notification\n", - "default handler: slack_notify\n", - "entry points:\n", - " slack_notify: Summarize a table\n", - " context(MLClientCtx) - the function context\n", - " webhook_url(str) - Slack incoming webhook URL. Please read: https://api.slack.com/messaging/webhooks, default=URL\n", - " slack_blocks(List[str]) - Message blocks list. NOT IMPLEMENTED YET\n", - " notification_text(str) - Notification text, default=Notification\n" - ] - } - ], - "source": [ - "func.doc()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.8" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/slack_notify/slack_notify.py b/slack_notify/slack_notify.py deleted file mode 100644 index 3208ffee1..000000000 --- a/slack_notify/slack_notify.py +++ /dev/null @@ -1,48 +0,0 @@ -# Copyright 2019 Iguazio -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Generated by nuclio.export.NuclioExporter - -import warnings - -warnings.simplefilter(action="ignore", category=FutureWarning) - -import os -import json -import requests -from mlrun.execution import MLClientCtx -from typing import List - - -def slack_notify( - context: MLClientCtx, - webhook_url: str = "URL", - slack_blocks: List[str] = [], - notification_text: str = "Notification", -) -> None: - """Summarize a table - :param context: the function context - :param webhook_url: Slack incoming webhook URL. Please read: https://api.slack.com/messaging/webhooks - :param notification_text: Notification text - :param slack_blocks: Message blocks list. NOT IMPLEMENTED YET - """ - - data = {"text": notification_text} - print("====", webhook_url) - response = requests.post( - webhook_url, data=json.dumps(data), headers={"Content-Type": "application/json"} - ) - - print("Response: " + str(response.text)) - print("Response code: " + str(response.status_code)) diff --git a/snowflake_dask/README.md b/snowflake_dask/README.md deleted file mode 100644 index 70fa3c927..000000000 --- a/snowflake_dask/README.md +++ /dev/null @@ -1,38 +0,0 @@ -# **Data Preperation Function** - -## `Snowflake_dask` - -![](img/snowflake-dask.png) - -This function query the data from a snowflake database and process the results -in parallel in a Dask cluster. -It will publish the dask dataframe in the cluster for other process to use. -It can also write the results dataframe to parquet files. - -```markdown - -:param context: the function context -:param dask_client: dask cluster function name -:param connection_info: Snowflake database connection info (this will be in a secret later) -:param query: query to for Snowflake -:param parquet_out_dir: directory path for the output parquet files (default None, not write out) -:param publish_name: name of the dask dataframe to publish to the dask cluster (default None, not publish) -``` - -To use the function, you will need to either have the password or key pair authentication to Snowflake configured. - -To get the password, or generate key pair in Snowflake and configure Snowflake for key pair authentication, please follow Snowflake [documentation](https://docs.snowflake.com/en/user-guide/key-pair-auth.html) here. - -After obtained password or key pair, please set up the project secrets in your Iguazio cluster. - -If you are using password, you only need to add ```sfPassword``` secret to the project settings. - -If you are using the key pair authentication, you will need to add both ```pkPath``` and ```pkPassword``` to the project settings. - - where: - - ```pkPath``` is the file path to your private key file in the cluster, for example ```/User/rsa_key.p8``` - -```pkPassword``` is your private key encryption password. Please see the screenshot below for your reference. - -![Secrets Screenshot](img/iguazio-project-secrets.png) diff --git a/snowflake_dask/config-template.yaml b/snowflake_dask/config-template.yaml deleted file mode 100644 index fb46ac2e6..000000000 --- a/snowflake_dask/config-template.yaml +++ /dev/null @@ -1,5 +0,0 @@ -user: "..." -password: "..." -warehouse: "..." -account: "..." -application: "Iguazio" \ No newline at end of file diff --git a/snowflake_dask/function.yaml b/snowflake_dask/function.yaml deleted file mode 100644 index c9cc8d746..000000000 --- a/snowflake_dask/function.yaml +++ /dev/null @@ -1,81 +0,0 @@ -kind: job -metadata: - name: snowflake-dask - tag: '' - hash: a002c7743b4a7471c7befe00f5497de050ebe902 - project: snowflake-dask - labels: - author: xingsheng - categories: - - data-prep - credentials: - access_key: ec09bfc8-1cb4-466d-9049-852081973ce3 -spec: - command: '' - args: [] - image: .mlrun/func-snowflake-dask-snowflake-dask:latest - build: - functionSourceCode: IiIiU25vd2ZsYWtlIERhc2sgLSBJbmdlc3QgU25hb3dmbGFrZSBkYXRhIHdpdGggRGFzayIiIgppbXBvcnQgd2FybmluZ3MKaW1wb3J0IG1scnVuCmZyb20gbWxydW4uZXhlY3V0aW9uIGltcG9ydCBNTENsaWVudEN0eAppbXBvcnQgc25vd2ZsYWtlLmNvbm5lY3RvciBhcyBzbm93CmZyb20gZGFzay5kaXN0cmlidXRlZCBpbXBvcnQgQ2xpZW50CmZyb20gZGFzay5kYXRhZnJhbWUgaW1wb3J0IGZyb21fZGVsYXllZApmcm9tIGRhc2sgaW1wb3J0IGRlbGF5ZWQKZnJvbSBkYXNrIGltcG9ydCBkYXRhZnJhbWUgYXMgZGQKZnJvbSBjcnlwdG9ncmFwaHkuaGF6bWF0LmJhY2tlbmRzIGltcG9ydCBkZWZhdWx0X2JhY2tlbmQKZnJvbSBjcnlwdG9ncmFwaHkuaGF6bWF0LnByaW1pdGl2ZXMgaW1wb3J0IHNlcmlhbGl6YXRpb24KCndhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiKQoKQGRlbGF5ZWQKZGVmIGxvYWQoYmF0Y2gpOgoKICAgICIiIkEgZGVsYXllZCBsb2FkIG9uZSBiYXRjaC4iIiIKCiAgICB0cnk6CiAgICAgICAgcHJpbnQoIkJBVENISU5HIikKICAgICAgICBkZl8gPSBiYXRjaC50b19wYW5kYXMoKQogICAgICAgIHJldHVybiBkZl8KICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBwcmludChmIkZhaWxlZCBvbiB7YmF0Y2h9IGZvciB7ZX0iKQogICAgICAgIHJhaXNlCgpkZWYgbG9hZF9yZXN1bHRzKGNvbnRleHQ6IE1MQ2xpZW50Q3R4LAogICAgICAgICAgICAgICAgIGRhc2tfY2xpZW50OiBzdHIsCiAgICAgICAgICAgICAgICAgY29ubmVjdGlvbl9pbmZvOiBzdHIsCiAgICAgICAgICAgICAgICAgcXVlcnk6IHN0ciwKICAgICAgICAgICAgICAgICBwYXJxdWV0X291dF9kaXIgPSBOb25lLAogICAgICAgICAgICAgICAgIHB1Ymxpc2hfbmFtZSA9IE5vbmUKICAgICAgICAgICAgICAgICkgLT4gTm9uZToKCiAgICAiIiJTbm93Zmxha2UgRGFzayAtIEluZ2VzdCBTbmFvd2ZsYWtlIGRhdGEgd2l0aCBEYXNrCgogICAgOnBhcmFtIGNvbnRleHQ6ICAgICAgICAgICB0aGUgZnVuY3Rpb24gY29udGV4dAogICAgOnBhcmFtIGRhc2tfY2xpZW50OiAgICAgICBkYXNrIGNsdXN0ZXIgZnVuY3Rpb24gbmFtZQogICAgOnBhcmFtIGNvbm5lY3Rpb25faW5mbzogICBTbm93Zmxha2UgZGF0YWJhc2UgY29ubmVjdGlvbiBpbmZvICh0aGlzIHdpbGwgYmUgaW4gYSBzZWNyZXQgbGF0ZXIpCiAgICA6cGFyYW0gcXVlcnk6ICAgICAgICAgICAgIHF1ZXJ5IHRvIGZvciBTbm93Zmxha2UKICAgIDpwYXJhbSBwYXJxdWV0X291dF9kaXI6ICAgZGlyZWN0b3J5IHBhdGggZm9yIHRoZSBvdXRwdXQgcGFycXVldCBmaWxlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCBOb25lLCBub3Qgd3JpdGUgb3V0KQogICAgOnBhcmFtIHB1Ymxpc2hfbmFtZTogICAgICBuYW1lIG9mIHRoZSBkYXNrIGRhdGFmcmFtZSB0byBwdWJsaXNoIHRvIHRoZSBkYXNrIGNsdXN0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgTm9uZSwgbm90IHB1Ymxpc2gpCgogICAgIiIiCiAgICBjb250ZXh0ID0gbWxydW4uZ2V0X29yX2NyZWF0ZV9jdHgoJ3NuYXdmbGFrZS1kYXNrLWNsdXN0ZXInKQogICAgc2ZfcGFzc3dvcmQgPSBjb250ZXh0LmdldF9zZWNyZXQoJ3NmUGFzc3dvcmQnKQogICAgcGtfcGF0aCA9ICBjb250ZXh0LmdldF9zZWNyZXQoJ3BrUGF0aCcpCiAgICBwa19wYXNzd29yZCA9ICBjb250ZXh0LmdldF9zZWNyZXQoJ3BrUGFzc3dvcmQnKQoKICAgIGlmIHBrX3BhdGggYW5kIHBrX3Bhc3N3b3JkOgogICAgICAgIHdpdGggb3Blbihwa19wYXRoLCAicmIiKSBhcyBrZXk6CiAgICAgICAgICAgIHBfa2V5PSBzZXJpYWxpemF0aW9uLmxvYWRfcGVtX3ByaXZhdGVfa2V5KAogICAgICAgICAgICAgICAga2V5LnJlYWQoKSwKICAgICAgICAgICAgICAgIHBhc3N3b3JkPXN0cihwa19wYXNzd29yZCkuZW5jb2RlKCksCiAgICAgICAgICAgICAgICBiYWNrZW5kPWRlZmF1bHRfYmFja2VuZCgpCiAgICAgICAgICAgICkKICAgICAgICBwa2IgPSBwX2tleS5wcml2YXRlX2J5dGVzKAogICAgICAgICAgICBlbmNvZGluZz1zZXJpYWxpemF0aW9uLkVuY29kaW5nLkRFUiwKICAgICAgICAgICAgZm9ybWF0PXNlcmlhbGl6YXRpb24uUHJpdmF0ZUZvcm1hdC5QS0NTOAogICAgICAgICAgICAsZW5jcnlwdGlvbl9hbGdvcml0aG09c2VyaWFsaXphdGlvbi5Ob0VuY3J5cHRpb24oKQogICAgICAgICkKICAgICAgICBjb25uZWN0aW9uX2luZm8ucG9wKCdwYXNzd29yZCcsICdObyBwYXNzd29yZCBmb3VuZCcpCiAgICAgICAgY29ubmVjdGlvbl9pbmZvWydwcml2YXRlX2tleSddID0gcGtiCiAgICBlbGlmIHNmX3Bhc3N3b3JkOgogICAgICAgIGNvbm5lY3Rpb25faW5mb1sncGFzc3dvcmQnXSA9IHNmX3Bhc3N3b3JkCiAgICBlbHNlOgogICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiXG5QbGVhc2Ugc2V0IHVwIHRoZSBzZWNyZXQgZm9yIFNub3dmbGFrZSBpbiB5b3VyIHByb2plY3QhXG4iKQoKICAgICMgc2V0dXAgZGFzayBjbGllbnQgZnJvbSB0aGUgTUxSdW4gZGFzayBjbHVzdGVyIGZ1bmN0aW9uCiAgICBpZiBkYXNrX2NsaWVudDoKICAgICAgICBjbGllbnQgPSBtbHJ1bi5pbXBvcnRfZnVuY3Rpb24oZGFza19jbGllbnQpLmNsaWVudAogICAgICAgIGNvbnRleHQubG9nZ2VyLmluZm8oZidFeGlzdGluZyBkYXNrIGNsaWVudCA9PT0gPj4+IHtjbGllbnR9XG4nKQogICAgZWxzZToKICAgICAgICBjbGllbnQgPSBDbGllbnQoKQogICAgICAgIGNvbnRleHQubG9nZ2VyLmluZm8oZidcbk5ld2x5IGNyZWF0ZWQgZGFzayBjbGllbnQgPT09ID4+PiB7Y2xpZW50fVxuJykKCiAgICBjb25uID0gc25vdy5jb25uZWN0KCoqY29ubmVjdGlvbl9pbmZvKQogICAgY3VyID0gY29ubi5jdXJzb3IoKQogICAgY3VyLmV4ZWN1dGUocXVlcnkpCiAgICBiYXRjaGVzID0gY3VyLmdldF9yZXN1bHRfYmF0Y2hlcygpCiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYnYmF0Y2hlcyBsZW4gPT09IHtsZW4oYmF0Y2hlcyl9XG4nKQoKICAgIGRmcyA9IFtdCiAgICBmb3IgYmF0Y2ggaW4gYmF0Y2hlczoKICAgICAgICBpZiBiYXRjaC5yb3djb3VudCA+IDA6CiAgICAgICAgICAgIGRmID0gbG9hZChiYXRjaCkKICAgICAgICAgICAgZGZzLmFwcGVuZChkZikKICAgIGRkZiA9IGZyb21fZGVsYXllZChkZnMpCgogICAgIyBtYXRlcmlhbGl6ZSB0aGUgcXVlcnkgcmVzdWx0cyBzZXQgZm9yIHNvbWUgc2FtcGxlIGNvbXB1dGUKCiAgICBkZGZfZGVzY3JpYmUgPSBkZGYuZGVzY3JpYmUoKS5jb21wdXRlKCkKCiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYncXVlcnkgID09PSA+Pj4ge3F1ZXJ5fVxuJykKICAgIGNvbnRleHQubG9nZ2VyLmluZm8oZidkZGYgID09PSA+Pj4ge2RkZn1cbicpCiAgICBjb250ZXh0LmxvZ19yZXN1bHQoJ251bWJlciBvZiByb3dzJywgbGVuKGRkZi5pbmRleCkpCiAgICBjb250ZXh0LmxvZ19kYXRhc2V0KCJkZGZfZGVzY3JpYmUiLCBkZj1kZGZfZGVzY3JpYmUpCgogICAgaWYgcHVibGlzaF9uYW1lOgogICAgICAgIGNvbnRleHQubG9nX3Jlc3VsdCgnZGF0YV9zZXRfbmFtZScsIHB1Ymxpc2hfbmFtZSkKICAgICAgICBpZiBub3QgY2xpZW50Lmxpc3RfZGF0YXNldHMoKToKICAgICAgICAgICAgZGRmLnBlcnNpc3QobmFtZSA9IHB1Ymxpc2hfbmFtZSkKICAgICAgICAgICAgY2xpZW50LnB1Ymxpc2hfZGF0YXNldChwdWJsaXNoX25hbWU9ZGRmKQoKICAgIGlmIHBhcnF1ZXRfb3V0X2RpcjoKICAgICAgICBkZC50b19wYXJxdWV0KGRmPWRkZiwgcGF0aD1wYXJxdWV0X291dF9kaXIpCiAgICAgICAgY29udGV4dC5sb2dfcmVzdWx0KCdwYXJxdWV0IGRpcmVjdG9yeScsIHBhcnF1ZXRfb3V0X2RpcikK - base_image: mlrun/mlrun - commands: - - python -m pip install bokeh snowflake-connector-python[pandas] mlrun~=0.9.1 - code_origin: https://github.com/xsqian/functions.git#6b31040e2ad762602f335b0589823a1c61a09975:snowflake_dask.py - origin_filename: snowflake_dask.py - entry_points: - load: - name: load - doc: A delayed load one batch. - parameters: - - name: batch - default: '' - outputs: - - default: '' - lineno: 15 - load_results: - name: load_results - doc: Snowflake Dask - Ingest Snaowflake data with Dask - parameters: - - name: context - type: MLClientCtx - doc: the function context - default: '' - - name: dask_client - type: str - doc: dask cluster function name - default: '' - - name: connection_info - type: str - doc: Snowflake database connection info (this will be in a secret later) - default: '' - - name: query - type: str - doc: query to for Snowflake - default: '' - - name: parquet_out_dir - doc: directory path for the output parquet files (default None, not write - out) - default: null - - name: publish_name - doc: name of the dask dataframe to publish to the dask cluster (default None, - not publish) - default: null - outputs: - - default: '' - lineno: 28 - description: Snowflake Dask - Ingest snowflake data in parallel with Dask cluster - default_handler: load_results - disable_auto_mount: false - env: - - name: V3IO_API - value: '' - - name: V3IO_USERNAME - value: '' - - name: V3IO_ACCESS_KEY - value: '' - - name: V3IO_FRAMESD - value: '' - priority_class_name: igz-workload-medium - preemption_mode: prevent - affinity: null - tolerations: null -verbose: false diff --git a/snowflake_dask/img/iguazio-project-secrets.png b/snowflake_dask/img/iguazio-project-secrets.png deleted file mode 100644 index 29f48aa338e3639981cadb6c31cac31cfb96d2bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105122 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 diff --git a/snowflake_dask/item.yaml b/snowflake_dask/item.yaml deleted file mode 100644 index c12d3aba0..000000000 --- a/snowflake_dask/item.yaml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: v1 -categories: -- data-preparation -description: Snowflake Dask - Ingest snowflake data in parallel with Dask cluster -doc: '' -example: snowflake-dask-mlrun.ipynb -generationDate: 2022-08-28:17-25 -hidden: false -icon: '' -labels: - author: xingsheng - framework: dask -maintainers: [] -marketplaceType: '' -mlrunVersion: 1.4.1 -name: snowflake_dask -platformVersion: 3.5.0 -spec: - filename: snowflake_dask.py - handler: load_results - image: mlrun/mlrun - kind: job - requirements: [] -url: '' -version: 1.1.0 diff --git a/snowflake_dask/requirements.txt b/snowflake_dask/requirements.txt deleted file mode 100644 index 0bca2c92f..000000000 --- a/snowflake_dask/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -bokeh -snowflake-connector-python[pandas] diff --git a/snowflake_dask/snowflake-dask-mlrun.ipynb b/snowflake_dask/snowflake-dask-mlrun.ipynb deleted file mode 100644 index 03936f2a5..000000000 --- a/snowflake_dask/snowflake-dask-mlrun.ipynb +++ /dev/null @@ -1,437 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# This notebook is to create a function to ingest data from snowflake with a Dask cluster" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The dask frameworks enables users to parallelize their python code and run it as a distributed process on Iguazio cluster and dramatically accelerate their performance.
\n", - "In this notebook we'll create an mlrun function running as a dask client to ingest data from snowflake.
\n", - "It also demonstrates how to run parallelize query against snowflake using Dask Delayed option to query a large data set from snowflake.
\n", - "The function will be published on the function marketplace.
\n", - "For more information on dask over kubernetes: https://kubernetes.dask.org/en/latest/" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Set up the enviroment" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import mlrun\n", - "import os\n", - "import warnings\n", - "import yaml\n", - "\n", - "project_name = \"snowflake-dask\"\n", - "dask_cluster_name=\"snowflake-dask-cluster\"\n", - "artifact_path = mlrun.set_environment(project=project_name,\n", - " artifact_path = os.path.join(os.path.abspath('/v3io/projects/'), project_name))\n", - "\n", - "warnings.filterwarnings(\"ignore\")\n", - "\n", - "print(f'artifact_path = {artifact_path}')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Load snowflake configuration from config file. \n", - "This is for demo purpose, in the real production code, you would need to put the snowflake connection info into secrets use the secrets in the running pod to connect to snowflake" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Load connection info\n", - "with open(\".config.yaml\") as f:\n", - " connection_info = yaml.safe_load(f)\n", - "\n", - "# verify the config\n", - "print(connection_info['account'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Create a python function" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This function querys data from snowflake using snowflake python connector for parallel processing of the query results.
\n", - "With snoeflake python connector, when you execute a query, the cursor will return the result batches.
\n", - "Using Dask Delayed it will return and process results set in parallel.
" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### write the function to a py file" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%%writefile snowflake_dask.py\n", - "\"\"\"Snowflake Dask - Ingest Snowflake data with Dask\"\"\"\n", - "import warnings\n", - "import mlrun\n", - "from mlrun.execution import MLClientCtx\n", - "import snowflake.connector as snow\n", - "from dask.distributed import Client\n", - "from dask.dataframe import from_delayed\n", - "from dask import delayed\n", - "from dask import dataframe as dd\n", - "from cryptography.hazmat.backends import default_backend\n", - "from cryptography.hazmat.primitives import serialization\n", - "\n", - "warnings.filterwarnings(\"ignore\")\n", - "\n", - "@delayed\n", - "def load(batch):\n", - "\n", - " \"\"\"A delayed load one batch.\"\"\"\n", - "\n", - " try:\n", - " print(\"BATCHING\")\n", - " df_ = batch.to_pandas()\n", - " return df_\n", - " except Exception as e:\n", - " print(f\"Failed on {batch} for {e}\")\n", - " raise\n", - "\n", - "def load_results(context: MLClientCtx,\n", - " dask_client: str,\n", - " connection_info: str,\n", - " query: str,\n", - " parquet_out_dir = None,\n", - " publish_name = None\n", - " ) -> None:\n", - "\n", - " \"\"\"Snowflake Dask - Ingest Snowflake data with Dask\n", - "\n", - " :param context: the function context\n", - " :param dask_client: dask cluster function name\n", - " :param connection_info: Snowflake database connection info (this will be in a secret later)\n", - " :param query: query to for Snowflake\n", - " :param parquet_out_dir: directory path for the output parquet files\n", - " (default None, not write out)\n", - " :param publish_name: name of the dask dataframe to publish to the dask cluster\n", - " (default None, not publish)\n", - "\n", - " \"\"\"\n", - " context = mlrun.get_or_create_ctx('snawflake-dask-cluster')\n", - " sf_password = context.get_secret('sfPassword')\n", - " pk_path = context.get_secret('pkPath')\n", - " pk_password = context.get_secret('pkPassword')\n", - "\n", - " if pk_path and pk_password:\n", - " with open(pk_path, \"rb\") as key:\n", - " p_key= serialization.load_pem_private_key(\n", - " key.read(),\n", - " password=str(pk_password).encode(),\n", - " backend=default_backend()\n", - " )\n", - " pkb = p_key.private_bytes(\n", - " encoding=serialization.Encoding.DER,\n", - " format=serialization.PrivateFormat.PKCS8\n", - " ,encryption_algorithm=serialization.NoEncryption()\n", - " )\n", - " connection_info.pop('password', 'No password found')\n", - " connection_info['private_key'] = pkb\n", - " elif sf_password:\n", - " connection_info['password'] = sf_password\n", - " else:\n", - " raise Exception(\"\\nPlease set up the secret for Snowflake in your project!\\n\")\n", - "\n", - " # setup dask client from the MLRun dask cluster function\n", - " if dask_client:\n", - " client = mlrun.import_function(dask_client).client\n", - " context.logger.info(f'Existing dask client === >>> {client}\\n')\n", - " else:\n", - " client = Client()\n", - " context.logger.info(f'\\nNewly created dask client === >>> {client}\\n')\n", - "\n", - " conn = snow.connect(**connection_info)\n", - " cur = conn.cursor()\n", - " cur.execute(query)\n", - " batches = cur.get_result_batches()\n", - " context.logger.info(f'batches len === {len(batches)}\\n')\n", - "\n", - " dfs = []\n", - " for batch in batches:\n", - " if batch.rowcount > 0:\n", - " df = load(batch)\n", - " dfs.append(df)\n", - " ddf = from_delayed(dfs)\n", - "\n", - " # materialize the query results set for some sample compute\n", - "\n", - " ddf_describe = ddf.describe().compute()\n", - "\n", - " context.logger.info(f'query === >>> {query}\\n')\n", - " context.logger.info(f'ddf === >>> {ddf}\\n')\n", - " context.log_result('number of rows', len(ddf.index))\n", - " context.log_dataset(\"ddf_describe\", df=ddf_describe)\n", - "\n", - " if publish_name:\n", - " context.log_result('data_set_name', publish_name)\n", - " if not client.list_datasets():\n", - " ddf.persist(name = publish_name)\n", - " client.publish_dataset(publish_name=ddf)\n", - "\n", - " if parquet_out_dir:\n", - " dd.to_parquet(df=ddf, path=parquet_out_dir)\n", - " context.log_result('parquet directory', parquet_out_dir)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Convert the code to MLRun function" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Use code_to_function to convert the code to MLRun
" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "fn = mlrun.code_to_function(name=\"snowflake-dask\", \n", - " kind='job', \n", - " filename='snowflake_dask.py',\n", - " image='mlrun/mlrun',\n", - " requirements='requirements.txt',\n", - " handler=\"load_results\", \n", - " description=\"Snowflake Dask - Ingest snowflake data in parallel with Dask cluster\",\n", - " categories=[\"data-prep\"],\n", - " labels={\"author\": \"xingsheng\"}\n", - " )\n", - "fn.apply(mlrun.platforms.auto_mount())\n", - "fn.deploy()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### export function to local `function.yaml` file for testing\n", - "in the real usage, we will import a function from hub" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "fn.export('function.yaml')\n", - "# print(fn.to_yaml())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### import a function from local `function.yaml' for testing (Need to change it to import from hub before PR)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "fn = mlrun.import_function(\"./function.yaml\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# fn = mlrun.import_function(\"hub://snowflake_dask\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "fn.apply(mlrun.platforms.auto_mount()) # this is a very important line" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### create a dask cluster and specify the configuration for the dask process (e.g. replicas, memory etc)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# function URI is db:///\n", - "dask_uri = f'db://{project_name}/{dask_cluster_name}'\n", - "dask_uri" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dsf = mlrun.new_function(name=dask_cluster_name, \n", - " kind='dask', \n", - " image='mlrun/mlrun',\n", - " requirements=[\"bokeh\", \"snowflake-connector-python[pandas]\"]\n", - " )\n", - "dsf.apply(mlrun.mount_v3io())\n", - "dsf.spec.remote = True\n", - "dsf.spec.min_replicas = 1\n", - "dsf.spec.max_replicas = 10\n", - "dsf.spec.service_type = \"NodePort\"\n", - "dsf.with_requests(mem='4G', cpu='2')\n", - "# dsf.spec.node_port=30088\n", - "# dsf.spec.scheduler_timeout = \"5 days\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dsf.deploy()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "client = dsf.client" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Run the function" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "When running the function you would see a remote dashboard link as part of the result. click on this link takes you to the dask monitoring dashboard" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "p = 'my-local-test'\n", - "parquet_path = f\"/v3io/bigdata/pq_from_sf_dask/{p}\"\n", - "\n", - "fn.run(handler = 'load_results',\n", - " params={\"dask_client\": dask_uri, \n", - " \"connection_info\": connection_info, \n", - " \"query\": \"SELECT * FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.CUSTOMER\",\n", - " \"parquet_out_dir\": parquet_path,\n", - " \"publish_name\": \"customer\",\n", - " }\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "client.close()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Track the progress in the UI" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Users can view the progress and detailed information in the mlrun UI by clicking on the uid above.
\n", - "Also, to track the dask progress in the dask UI click on the \"dashboard link\" above the \"client\" section" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python [conda env:root] *", - "language": "python", - "name": "conda-root-py" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/snowflake_dask/snowflake_dask.py b/snowflake_dask/snowflake_dask.py deleted file mode 100644 index 8846e821d..000000000 --- a/snowflake_dask/snowflake_dask.py +++ /dev/null @@ -1,125 +0,0 @@ -# Copyright 2019 Iguazio -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -"""Snowflake Dask - Ingest Snaowflake data with Dask""" - -import warnings -import mlrun -from mlrun.execution import MLClientCtx -import snowflake.connector as snow -from dask.distributed import Client -from dask.dataframe import from_delayed -from dask import delayed -from dask import dataframe as dd -from cryptography.hazmat.backends import default_backend -from cryptography.hazmat.primitives import serialization - -warnings.filterwarnings("ignore") - -@delayed -def load(batch): - - """A delayed load one batch.""" - - try: - print("BATCHING") - df_ = batch.to_pandas() - return df_ - except Exception as e: - print(f"Failed on {batch} for {e}") - raise - -def load_results(context: MLClientCtx, - dask_client: str, - connection_info: str, - query: str, - parquet_out_dir = None, - publish_name = None - ) -> None: - - """Snowflake Dask - Ingest Snowflake data with Dask - - :param context: the function context - :param dask_client: dask cluster function name - :param connection_info: Snowflake database connection info (this will be in a secret later) - :param query: query to for Snowflake - :param parquet_out_dir: directory path for the output parquet files - (default None, not write out) - :param publish_name: name of the dask dataframe to publish to the dask cluster - (default None, not publish) - - """ - context = mlrun.get_or_create_ctx('snawflake-dask-cluster') - sf_password = context.get_secret('sfPassword') - pk_path = context.get_secret('pkPath') - pk_password = context.get_secret('pkPassword') - - if pk_path and pk_password: - with open(pk_path, "rb") as key: - p_key= serialization.load_pem_private_key( - key.read(), - password=str(pk_password).encode(), - backend=default_backend() - ) - pkb = p_key.private_bytes( - encoding=serialization.Encoding.DER, - format=serialization.PrivateFormat.PKCS8 - ,encryption_algorithm=serialization.NoEncryption() - ) - connection_info.pop('password', 'No password found') - connection_info['private_key'] = pkb - elif sf_password: - connection_info['password'] = sf_password - else: - raise Exception("\nPlease set up the secret for Snowflake in your project!\n") - - # setup dask client from the MLRun dask cluster function - if dask_client: - client = mlrun.import_function(dask_client).client - context.logger.info(f'Existing dask client === >>> {client}\n') - else: - client = Client() - context.logger.info(f'\nNewly created dask client === >>> {client}\n') - - conn = snow.connect(**connection_info) - cur = conn.cursor() - cur.execute(query) - batches = cur.get_result_batches() - context.logger.info(f'batches len === {len(batches)}\n') - - dfs = [] - for batch in batches: - if batch.rowcount > 0: - df = load(batch) - dfs.append(df) - ddf = from_delayed(dfs) - - # materialize the query results set for some sample compute - - ddf_describe = ddf.describe().compute() - - context.logger.info(f'query === >>> {query}\n') - context.logger.info(f'ddf === >>> {ddf}\n') - context.log_result('number of rows', len(ddf.index)) - context.log_dataset("ddf_describe", df=ddf_describe) - - if publish_name: - context.log_result('data_set_name', publish_name) - if not client.list_datasets(): - ddf.persist(name = publish_name) - client.publish_dataset(publish_name=ddf) - - if parquet_out_dir: - dd.to_parquet(df=ddf, path=parquet_out_dir) - context.log_result('parquet directory', parquet_out_dir) diff --git a/snowflake_dask/test_snowflake_dask.py b/snowflake_dask/test_snowflake_dask.py deleted file mode 100644 index fc2d4c93a..000000000 --- a/snowflake_dask/test_snowflake_dask.py +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright 2019 Iguazio -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -"""Snowflake Dask unit test""" -from mlrun import import_function - -def test_snowflake_dask(): - """An unit test""" - fn_to_test = import_function("function.yaml") - - # a fake assert to pass the unit test - if fn_to_test.to_yaml().__contains__('job'): - assert True diff --git a/sql_to_file/function.yaml b/sql_to_file/function.yaml deleted file mode 100644 index 10b332a58..000000000 --- a/sql_to_file/function.yaml +++ /dev/null @@ -1,47 +0,0 @@ -kind: job -metadata: - name: sql-to-file - tag: '' - hash: 61f616fe697994e05cf018f2ee94c4ea25ed8863 - project: '' - labels: - author: adih - categories: - - data-preparation -spec: - command: '' - args: [] - image: mlrun/mlrun - env: [] - default_handler: sql_to_file - entry_points: - sql_to_file: - name: sql_to_file - doc: SQL Ingest - Ingest data using SQL query - parameters: - - name: context - type: MLClientCtx - doc: the function context - default: '' - - name: sql_query - type: str - doc: the sql query used to retrieve the data - default: '' - - name: database_url - type: str - doc: database connection URL - default: '' - - name: file_ext - type: str - doc: ("parquet") format for result file - default: parquet - outputs: - - default: '' - lineno: 9 - description: SQL To File - Ingest data using SQL query - build: - functionSourceCode: IyBHZW5lcmF0ZWQgYnkgbnVjbGlvLmV4cG9ydC5OdWNsaW9FeHBvcnRlcgoKaW1wb3J0IHBhbmRhcyBhcyBwZAppbXBvcnQgcHloaXZlCmZyb20gc3FsYWxjaGVteS5lbmdpbmUgaW1wb3J0IGNyZWF0ZV9lbmdpbmUKZnJvbSBtbHJ1bi5leGVjdXRpb24gaW1wb3J0IE1MQ2xpZW50Q3R4CgoKZGVmIHNxbF90b19maWxlKAogICAgY29udGV4dDogTUxDbGllbnRDdHgsCiAgICBzcWxfcXVlcnk6IHN0ciwKICAgIGRhdGFiYXNlX3VybDogc3RyLAogICAgZmlsZV9leHQ6IHN0ciA9ICJwYXJxdWV0IiwKKSAtPiBOb25lOgogICAgIiIiU1FMIEluZ2VzdCAtIEluZ2VzdCBkYXRhIHVzaW5nIFNRTCBxdWVyeQoKICAgIDpwYXJhbSBjb250ZXh0OiAgICAgICAgICAgdGhlIGZ1bmN0aW9uIGNvbnRleHQKICAgIDpwYXJhbSBzcWxfcXVlcnk6ICAgICAgICAgdGhlIHNxbCBxdWVyeSB1c2VkIHRvIHJldHJpZXZlIHRoZSBkYXRhCiAgICA6cGFyYW0gZGF0YWJhc2VfdXJsOiAgICAgIGRhdGFiYXNlIGNvbm5lY3Rpb24gVVJMCiAgICA6cGFyYW0gZmlsZV9leHQ6ICAgICAgICAgICgicGFycXVldCIpIGZvcm1hdCBmb3IgcmVzdWx0IGZpbGUKICAgICIiIgoKICAgIGVuZ2luZSA9IGNyZWF0ZV9lbmdpbmUoZGF0YWJhc2VfdXJsKQogICAgZGYgPSBwZC5yZWFkX3NxbChzcWxfcXVlcnksIGVuZ2luZSkKCiAgICBjb250ZXh0LmxvZ19kYXRhc2V0KAogICAgICAgICJxdWVyeSByZXN1bHQiLAogICAgICAgIGRmPWRmLAogICAgICAgIGZvcm1hdD1maWxlX2V4dCwKICAgICAgICBhcnRpZmFjdF9wYXRoPWNvbnRleHQuYXJ0aWZhY3Rfc3VicGF0aCgiZGF0YSIpLAogICAgKQo= - commands: [] - code_origin: https://github.com/daniels290813/functions.git#55a79c32be5d233cc11efcf40cd3edbe309bfdef:/home/kali/functions/sql_to_file/sql_to_file.py - affinity: null -verbose: false diff --git a/sql_to_file/item.yaml b/sql_to_file/item.yaml deleted file mode 100644 index 2f6ae4c53..000000000 --- a/sql_to_file/item.yaml +++ /dev/null @@ -1,24 +0,0 @@ -apiVersion: v1 -categories: -- data-preparation -description: SQL To File - Ingest data using SQL query -doc: '' -example: sql_to_file.ipynb -generationDate: 2022-08-28:17-25 -hidden: false -icon: '' -labels: - author: adih -maintainers: [] -marketplaceType: '' -mlrunVersion: 1.1.0 -name: sql-to-file -platformVersion: 3.5.0 -spec: - filename: sql_to_file.py - handler: sql_to_file - image: mlrun/mlrun - kind: job - requirements: [] -url: '' -version: 1.1.0 diff --git a/sql_to_file/requirements.txt b/sql_to_file/requirements.txt deleted file mode 100644 index 822eabb88..000000000 --- a/sql_to_file/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -pyhive -pymysql \ No newline at end of file diff --git a/sql_to_file/sql_to_file.ipynb b/sql_to_file/sql_to_file.ipynb deleted file mode 100644 index d4a084adb..000000000 --- a/sql_to_file/sql_to_file.ipynb +++ /dev/null @@ -1,1567 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# SQL Ingest - Ingest data using SQL query " - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "ename": "ModuleNotFoundError", - "evalue": "No module named 'nuclio'", - "output_type": "error", - "traceback": [ - "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m", - "\u001B[1;31mModuleNotFoundError\u001B[0m Traceback (most recent call last)", - "\u001B[1;32m\u001B[0m in \u001B[0;36m\u001B[1;34m\u001B[0m\n\u001B[0;32m 1\u001B[0m \u001B[1;31m# nuclio: ignore\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[1;32m----> 2\u001B[1;33m \u001B[1;32mimport\u001B[0m \u001B[0mnuclio\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m 3\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n", - "\u001B[1;31mModuleNotFoundError\u001B[0m: No module named 'nuclio'" - ] - } - ], - "source": [ - "# nuclio: ignore\n", - "import nuclio" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "%nuclio: setting kind to 'job'\n", - "%nuclio: setting spec.image to 'mlrun/mlrun'\n" - ] - } - ], - "source": [ - "%nuclio config kind = \"job\"\n", - "%nuclio config spec.build.baseImage = \"mlrun/mlrun\"" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "%%nuclio cmd -c\n", - "pip install --no-cache-dir git+https://github.com/v3io/PyHive.git@v0.6.999 \n", - "pip install sqlalchemy==1.3.11\n", - "pip install PyMySQL==0.9.3" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "import pyhive\n", - "from sqlalchemy.engine import create_engine\n", - "from mlrun.execution import MLClientCtx\n", - "\n", - "\n", - "def sql_to_file(\n", - " context: MLClientCtx,\n", - " sql_query: str,\n", - " database_url: str,\n", - " file_ext: str = \"parquet\",\n", - ") -> None:\n", - " \"\"\"SQL Ingest - Ingest data using SQL query\n", - "\n", - " :param context: the function context\n", - " :param sql_query: the sql query used to retrieve the data\n", - " :param database_url: database connection URL\n", - " :param file_ext: (\"parquet\") format for result file\n", - "\n", - "\"\"\"\n", - "\n", - " engine = create_engine(database_url)\n", - " df = pd.read_sql(sql_query, engine)\n", - "\n", - " context.log_dataset('query result',\n", - " df=df,\n", - " format=file_ext,\n", - " artifact_path=context.artifact_subpath('data'))\n" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "# nuclio: end-code" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### mlconfig" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "ename": "KeyError", - "evalue": "'HOME'", - "output_type": "error", - "traceback": [ - "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m", - "\u001B[1;31mKeyError\u001B[0m Traceback (most recent call last)", - "\u001B[1;32m\u001B[0m in \u001B[0;36m\u001B[1;34m\u001B[0m\n\u001B[0;32m 2\u001B[0m \u001B[1;32mimport\u001B[0m \u001B[0mos\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m 3\u001B[0m \u001B[0mmlconf\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mdbpath\u001B[0m \u001B[1;33m=\u001B[0m \u001B[0mmlconf\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mdbpath\u001B[0m \u001B[1;32mor\u001B[0m \u001B[1;34m'http://mlrun-api:8080'\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[1;32m----> 4\u001B[1;33m \u001B[0mmlconf\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0martifact_path\u001B[0m \u001B[1;33m=\u001B[0m \u001B[0mmlconf\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0martifact_path\u001B[0m \u001B[1;32mor\u001B[0m \u001B[1;34mf'{os.environ[\"HOME\"]}/artifacts'\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m 5\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m 6\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n", - "\u001B[1;32mC:\\Program Files\\Python37\\lib\\os.py\u001B[0m in \u001B[0;36m__getitem__\u001B[1;34m(self, key)\u001B[0m\n\u001B[0;32m 679\u001B[0m \u001B[1;32mexcept\u001B[0m \u001B[0mKeyError\u001B[0m\u001B[1;33m:\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m 680\u001B[0m \u001B[1;31m# raise KeyError with the original key value\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[1;32m--> 681\u001B[1;33m \u001B[1;32mraise\u001B[0m \u001B[0mKeyError\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mkey\u001B[0m\u001B[1;33m)\u001B[0m \u001B[1;32mfrom\u001B[0m \u001B[1;32mNone\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m 682\u001B[0m \u001B[1;32mreturn\u001B[0m \u001B[0mself\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mdecodevalue\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mvalue\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m 683\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n", - "\u001B[1;31mKeyError\u001B[0m: 'HOME'" - ] - } - ], - "source": [ - "from mlrun import mlconf\n", - "import os\n", - "mlconf.dbpath = mlconf.dbpath or 'http://mlrun-api:8080'\n", - "mlconf.artifact_path = mlconf.artifact_path or f'{os.environ[\"HOME\"]}/artifacts'\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Save function" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "def mount_secret(\n", - " secret_name, volume_mount_path, volume_name='secret', items=None\n", - "):\n", - " def _mount_secret(task):\n", - " from kubernetes import client as k8s_client\n", - " vol = k8s_client.V1SecretVolumeSource(secret_name=secret_name, items=items)\n", - " return task.add_volume(\n", - " k8s_client.V1Volume(name=volume_name, secret=vol)\n", - " ).add_volume_mount(\n", - " k8s_client.V1VolumeMount(mount_path=volume_mount_path, name=volume_name)\n", - " )\n", - " return _mount_secret" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "from mlrun import code_to_function, NewTask\n", - "import os\n", - "\n", - "fn = code_to_function(name=\"sql_to_file\",\n", - " handler=\"sql_to_file\",\n", - " description=\"SQL To File - Ingest data using SQL query\",\n", - " categories=[\"data-prep\"],\n", - " labels={\"author\": \"adih\"})\n", - "\n", - "if \"V3IO_ACCESS_KEY\" in list(os.environ):\n", - " fn.apply(mount_secret(secret_name='presto-tls',\n", - " volume_mount_path= '/var/run/iguazio/secrets/'))\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Build the image" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[mlrun] 2020-06-29 12:42:44,100 starting remote build, image: .mlrun/func-default-sql-ingest-latest\n", - "\u001B[36mINFO\u001B[0m[0000] Resolved base name mlrun/mlrun:0.4.10 to mlrun/mlrun:0.4.10 \n", - "\u001B[36mINFO\u001B[0m[0000] Resolved base name mlrun/mlrun:0.4.10 to mlrun/mlrun:0.4.10 \n", - "\u001B[36mINFO\u001B[0m[0000] Retrieving image manifest mlrun/mlrun:0.4.10 \n", - "\u001B[36mINFO\u001B[0m[0000] Retrieving image manifest mlrun/mlrun:0.4.10 \n", - "\u001B[36mINFO\u001B[0m[0000] Built cross stage deps: map[] \n", - "\u001B[36mINFO\u001B[0m[0000] Retrieving image manifest mlrun/mlrun:0.4.10 \n", - "\u001B[36mINFO\u001B[0m[0000] Retrieving image manifest mlrun/mlrun:0.4.10 \n", - "\u001B[36mINFO\u001B[0m[0001] Unpacking rootfs as cmd RUN pip install --no-cache-dir git+https://github.com/v3io/PyHive.git@v0.6.999 requires it. \n", - "\u001B[36mINFO\u001B[0m[0027] Taking snapshot of full filesystem... \n", - "\u001B[36mINFO\u001B[0m[0039] Resolving paths \n", - "\u001B[36mINFO\u001B[0m[0046] RUN pip install --no-cache-dir git+https://github.com/v3io/PyHive.git@v0.6.999 \n", - "\u001B[36mINFO\u001B[0m[0046] cmd: /bin/sh \n", - "\u001B[36mINFO\u001B[0m[0046] args: [-c pip install --no-cache-dir git+https://github.com/v3io/PyHive.git@v0.6.999] \n", - "Collecting git+https://github.com/v3io/PyHive.git@v0.6.999\n", - " Cloning https://github.com/v3io/PyHive.git (to revision v0.6.999) to /tmp/pip-req-build-ycqhuolw\n", - " Running command git clone -q https://github.com/v3io/PyHive.git /tmp/pip-req-build-ycqhuolw\n", - "Requirement already satisfied: future in /usr/local/lib/python3.7/site-packages (from PyHive==0.6.1.dev0) (0.18.2)\n", - "Requirement already satisfied: python-dateutil in /usr/local/lib/python3.7/site-packages (from PyHive==0.6.1.dev0) (2.8.1)\n", - "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.7/site-packages (from python-dateutil->PyHive==0.6.1.dev0) (1.15.0)\n", - "Building wheels for collected packages: PyHive\n", - " Building wheel for PyHive (setup.py): started\n", - " Building wheel for PyHive (setup.py): finished with status 'done'\n", - " Created wheel for PyHive: filename=PyHive-0.6.1.dev0-py3-none-any.whl size=46402 sha256=63dca405cbae83da4cfcabfd61fd00f1683bc008c8bfa2272eac7054ec283166\n", - " Stored in directory: /tmp/pip-ephem-wheel-cache-mwb52l_u/wheels/05/11/cd/4ac4df0fcee76e5ceb614c39c56fca1eead41c0ac32ff6285d\n", - "Successfully built PyHive\n", - "Installing collected packages: PyHive\n", - "Successfully installed PyHive-0.6.1.dev0\n", - "\u001B[36mINFO\u001B[0m[0048] Taking snapshot of full filesystem... \n", - "\u001B[36mINFO\u001B[0m[0048] Resolving paths \n", - "\u001B[36mINFO\u001B[0m[0053] RUN pip install sqlalchemy==1.3.11 \n", - "\u001B[36mINFO\u001B[0m[0053] cmd: /bin/sh \n", - "\u001B[36mINFO\u001B[0m[0053] args: [-c pip install sqlalchemy==1.3.11] \n", - "Collecting sqlalchemy==1.3.11\n", - " Downloading SQLAlchemy-1.3.11.tar.gz (6.0 MB)\n", - "Building wheels for collected packages: sqlalchemy\n", - " Building wheel for sqlalchemy (setup.py): started\n", - " Building wheel for sqlalchemy (setup.py): finished with status 'done'\n", - " Created wheel for sqlalchemy: filename=SQLAlchemy-1.3.11-cp37-cp37m-linux_x86_64.whl size=1216921 sha256=9dd22e89acfbb68df0c1d189d36907a16c9393e4174598eb4bf377ce57132f3c\n", - " Stored in directory: /root/.cache/pip/wheels/0a/60/60/f26cbd183a3bb0031ace108156036dd925ec0138ee1c496a16\n", - "Successfully built sqlalchemy\n", - "Installing collected packages: sqlalchemy\n", - " Attempting uninstall: sqlalchemy\n", - " Found existing installation: SQLAlchemy 1.3.17\n", - " Uninstalling SQLAlchemy-1.3.17:\n", - " Successfully uninstalled SQLAlchemy-1.3.17\n", - "Successfully installed sqlalchemy-1.3.11\n", - "\u001B[36mINFO\u001B[0m[0057] Taking snapshot of full filesystem... \n", - "\u001B[36mINFO\u001B[0m[0057] Resolving paths \n", - "\u001B[36mINFO\u001B[0m[0063] RUN pip install PyMySQL==0.9.3 \n", - "\u001B[36mINFO\u001B[0m[0063] cmd: /bin/sh \n", - "\u001B[36mINFO\u001B[0m[0063] args: [-c pip install PyMySQL==0.9.3] \n", - "Collecting PyMySQL==0.9.3\n", - " Downloading PyMySQL-0.9.3-py2.py3-none-any.whl (47 kB)\n", - "Installing collected packages: PyMySQL\n", - "Successfully installed PyMySQL-0.9.3\n", - "\u001B[36mINFO\u001B[0m[0064] Taking snapshot of full filesystem... \n", - "\u001B[36mINFO\u001B[0m[0064] Resolving paths \n" - ] - }, - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "fn.deploy()" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[mlrun] 2020-06-30 01:58:41,604 function spec saved to path: function.yaml\n" - ] - }, - { - "data": { - "text/plain": "" - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "fn.export('function.yaml')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Test" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Reading from a public MySQL DB" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "mysql_url = 'mysql+pymysql://rfamro@mysql-rfam-public.ebi.ac.uk:4497/Rfam'\n", - "mysql_query = 'select rfam_acc,rfam_id,auto_wiki,description,author,seed_source FROM family'" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "from mlrun import NewTask, run_local\n", - "\n", - "sql_task = NewTask(name='sql',\n", - " handler=sql_to_file,\n", - " params={'sql_query': mysql_query,\n", - " 'database_url': mysql_url})\n" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[mlrun] 2020-06-29 12:43:59,253 starting run sql uid=b0914edaa58e45ee97c132200c6b60be -> http://mlrun-api:8080\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "

\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "to track results use .show() or .logs() or in CLI: \n", - "!mlrun get run b0914edaa58e45ee97c132200c6b60be --project default , !mlrun logs b0914edaa58e45ee97c132200c6b60be --project default\n", - "[mlrun] 2020-06-29 12:44:02,344 run executed, status=completed\n" - ] - } - ], - "source": [ - "sql_func = run_local(sql_task)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Run it on a cluster" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[mlrun] 2020-06-29 12:44:02,350 starting run sql uid=46ff7ef67e314be49353982cdd8d073a -> http://mlrun-api:8080\n", - "[mlrun] 2020-06-29 12:44:02,622 Job is running in the background, pod: sql-mplpz\n", - "[mlrun] 2020-06-29 12:44:09,070 run executed, status=completed\n", - "final state: succeeded\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
projectuiditerstartstatenamelabelsinputsparametersresultsartifacts
default0Jun 29 12:44:06completedsql
v3io_user=admin
kind=job
owner=admin
host=sql-mplpz
sql_query=select rfam_acc,rfam_id,auto_wiki,description,author,seed_source FROM family
database_url=mysql+pymysql://rfamro@mysql-rfam-public.ebi.ac.uk:4497/Rfam
query result
\n", - "
\n", - "
\n", - "
\n", - " Title\n", - " ×\n", - "
\n", - " \n", - "
\n", - "
\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "to track results use .show() or .logs() or in CLI: \n", - "!mlrun get run 46ff7ef67e314be49353982cdd8d073a --project default , !mlrun logs 46ff7ef67e314be49353982cdd8d073a --project default\n", - "[mlrun] 2020-06-29 12:44:11,893 run executed, status=completed\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "fn.run(sql_task)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### SQL query from Iguazio Key Value via Presto" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You need to create a table and set the sql_table path accordingly.
\n", - "you can find an example of creating such table in https://github.com/v3io/tutorials/blob/master/data-ingestion-and-preparation/basic-data-ingestion-and-preparation.ipynb" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "# nuclio: ignore\n", - "import os\n", - "sql_table = os.path.join('v3io.users.\"'+str(os.getenv('V3IO_USERNAME'))+'/examples/stocks_tab\"')\n", - "sql_query_string = 'select * from '+sql_table+\"\"" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Done.\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
securitydescsecuritytypetimeisinminpricedateendpricenumberoftradesmnemoniccurrencysecurityidmaxpricetradedvolumestartprice
UBS I.ETF-DL G.SEL.DIV.ADETF08:27IE00BMP3HG278.4182018-03-26 00:00:00.0008.4181UBUMEUR25054508.4184038.418
GILEAD SCIENCES DL-,001Common stock08:00US375558103659.72018-03-26 00:00:00.00059.843GISEUR250649559.8474559.7
3M CO. DL-,01Common stock08:00US88579Y1010176.512018-03-26 00:00:00.000176.511MMMEUR2506577176.5139176.51
DIEBOLD NIXDORF INH.O.N.Common stock08:06DE000A0CAYB266.32018-03-26 00:00:00.00066.31WINEUR250428666.36066.3
XTR.II EUR.INF.LINK.BD 1CETF08:13LU0290358224218.972018-03-26 00:00:00.000218.971DBXKEUR2505840218.97110218.97
UBS-ETF-MSCI EMU S.C.EOADETF08:33LU0671493277100.22018-03-26 00:00:00.000100.21UEFDEUR2506045100.2180100.2
ASMALLWORLD AG SF 1Common stock08:23CH040488012912.72018-03-26 00:00:00.00012.711Q7EUR308912212.740012.7
IS.DJ GLOB.TITAN.50 U.ETFETF08:42DE000628938231.252018-03-26 00:00:00.00031.251EXI2EUR250502931.255031.25
ISHS IV-AGEING POPUL.ETFETF08:17IE00BYZK46694.9262018-03-26 00:00:00.0004.92612B77EUR25055524.926254.926
PORSCHE AUTOM.HLDG VZOCommon stock08:00DE000PAH003864.682018-03-26 00:00:00.00064.768PAH3EUR250481664.7669864.7
" - ], - "text/plain": [ - "[('UBS I.ETF-DL G.SEL.DIV.AD', 'ETF', '08:27', 'IE00BMP3HG27', 8.418, '2018-03-26 00:00:00.000', 8.418, 1, 'UBUM', 'EUR', 2505450, 8.418, 403, 8.418),\n", - " ('GILEAD SCIENCES DL-,001', 'Common stock', '08:00', 'US3755581036', 59.7, '2018-03-26 00:00:00.000', 59.84, 3, 'GIS', 'EUR', 2506495, 59.84, 745, 59.7),\n", - " ('3M CO. DL-,01', 'Common stock', '08:00', 'US88579Y1010', 176.51, '2018-03-26 00:00:00.000', 176.51, 1, 'MMM', 'EUR', 2506577, 176.51, 39, 176.51),\n", - " ('DIEBOLD NIXDORF INH.O.N.', 'Common stock', '08:06', 'DE000A0CAYB2', 66.3, '2018-03-26 00:00:00.000', 66.3, 1, 'WIN', 'EUR', 2504286, 66.3, 60, 66.3),\n", - " ('XTR.II EUR.INF.LINK.BD 1C', 'ETF', '08:13', 'LU0290358224', 218.97, '2018-03-26 00:00:00.000', 218.97, 1, 'DBXK', 'EUR', 2505840, 218.97, 110, 218.97),\n", - " ('UBS-ETF-MSCI EMU S.C.EOAD', 'ETF', '08:33', 'LU0671493277', 100.2, '2018-03-26 00:00:00.000', 100.2, 1, 'UEFD', 'EUR', 2506045, 100.2, 180, 100.2),\n", - " ('ASMALLWORLD AG SF 1', 'Common stock', '08:23', 'CH0404880129', 12.7, '2018-03-26 00:00:00.000', 12.7, 1, '1Q7', 'EUR', 3089122, 12.7, 400, 12.7),\n", - " ('IS.DJ GLOB.TITAN.50 U.ETF', 'ETF', '08:42', 'DE0006289382', 31.25, '2018-03-26 00:00:00.000', 31.25, 1, 'EXI2', 'EUR', 2505029, 31.25, 50, 31.25),\n", - " ('ISHS IV-AGEING POPUL.ETF', 'ETF', '08:17', 'IE00BYZK4669', 4.926, '2018-03-26 00:00:00.000', 4.926, 1, '2B77', 'EUR', 2505552, 4.926, 25, 4.926),\n", - " ('PORSCHE AUTOM.HLDG VZO', 'Common stock', '08:00', 'DE000PAH0038', 64.68, '2018-03-26 00:00:00.000', 64.76, 8, 'PAH3', 'EUR', 2504816, 64.76, 698, 64.7)]" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "%sql select * from $sql_table limit 10" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "sql_task = NewTask(name='sql', \n", - " handler=sql_to_file,\n", - " params={'sql_query': sql_query_string,\n", - " 'database_url': os.getenv('DATABASE_URL')}\n", - " )\n" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[mlrun] 2020-06-29 12:44:14,406 starting run sql uid=d32a57bb990d4142bb1f63862e8906bf -> http://mlrun-api:8080\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
projectuiditerstartstatenamelabelsinputsparametersresultsartifacts
default0Jun 29 12:44:14completedsql
v3io_user=admin
kind=handler
owner=admin
host=jupyter-b9c7995f9-4fblj
sql_query=select * from v3io.users.\"admin/examples/stocks_tab\"
database_url=presto://admin:8278ee8e-0f31-4aea-a105-2eab202bec93@presto-api-presto.default-tenant.app.cs-mlrun-test.iguazio-c0.com:443/v3io?protocol=https&requests_kwargs=%7B%22verify%22%3A+%22%2Fvar%2Frun%2Figuazio%2Fsecrets%2Ftls.crt%22%2C+%22cert%22%3A+%5B%22%2Fvar%2Frun%2Figuazio%2Fsecrets%2Ftls.crt%22%2C+%22%2Fvar%2Frun%2Figuazio%2Fsecrets%2Ftls.key%22%5D%7D
query result
\n", - "
\n", - "
\n", - "
\n", - " Title\n", - " ×\n", - "
\n", - " \n", - "
\n", - "
\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "to track results use .show() or .logs() or in CLI: \n", - "!mlrun get run d32a57bb990d4142bb1f63862e8906bf --project default , !mlrun logs d32a57bb990d4142bb1f63862e8906bf --project default\n", - "[mlrun] 2020-06-29 12:44:18,102 run executed, status=completed\n" - ] - } - ], - "source": [ - "sql_func = run_local(sql_task)" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[mlrun] 2020-06-29 12:44:18,112 starting run sql uid=db9507007f6d452e9ca020e4f483e33b -> http://mlrun-api:8080\n", - "[mlrun] 2020-06-29 12:44:18,387 Job is running in the background, pod: sql-g7p4f\n", - "[mlrun] 2020-06-29 12:44:25,033 run executed, status=completed\n", - "final state: succeeded\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
projectuiditerstartstatenamelabelsinputsparametersresultsartifacts
default0Jun 29 12:44:21completedsql
v3io_user=admin
kind=job
owner=admin
host=sql-g7p4f
sql_query=select * from v3io.users.\"admin/examples/stocks_tab\"
database_url=presto://admin:8278ee8e-0f31-4aea-a105-2eab202bec93@presto-api-presto.default-tenant.app.cs-mlrun-test.iguazio-c0.com:443/v3io?protocol=https&requests_kwargs=%7B%22verify%22%3A+%22%2Fvar%2Frun%2Figuazio%2Fsecrets%2Ftls.crt%22%2C+%22cert%22%3A+%5B%22%2Fvar%2Frun%2Figuazio%2Fsecrets%2Ftls.crt%22%2C+%22%2Fvar%2Frun%2Figuazio%2Fsecrets%2Ftls.key%22%5D%7D
query result
\n", - "
\n", - "
\n", - "
\n", - " Title\n", - " ×\n", - "
\n", - " \n", - "
\n", - "
\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "to track results use .show() or .logs() or in CLI: \n", - "!mlrun get run db9507007f6d452e9ca020e4f483e33b --project default , !mlrun logs db9507007f6d452e9ca020e4f483e33b --project default\n", - "[mlrun] 2020-06-29 12:44:27,645 run executed, status=completed\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "fn.run(sql_task)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.8" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} \ No newline at end of file diff --git a/sql_to_file/sql_to_file.py b/sql_to_file/sql_to_file.py deleted file mode 100644 index 6d5e152ba..000000000 --- a/sql_to_file/sql_to_file.py +++ /dev/null @@ -1,45 +0,0 @@ -# Copyright 2019 Iguazio -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Generated by nuclio.export.NuclioExporter - -import pandas as pd -import pyhive -from sqlalchemy.engine import create_engine -from mlrun.execution import MLClientCtx - - -def sql_to_file( - context: MLClientCtx, - sql_query: str, - database_url: str, - file_ext: str = "parquet", -) -> None: - """SQL Ingest - Ingest data using SQL query - - :param context: the function context - :param sql_query: the sql query used to retrieve the data - :param database_url: database connection URL - :param file_ext: ("parquet") format for result file - """ - - engine = create_engine(database_url) - df = pd.read_sql(sql_query, engine) - - context.log_dataset( - "query result", - df=df, - format=file_ext, - artifact_path=context.artifact_subpath("data"), - ) diff --git a/sql_to_file/test_sql_to_file.py b/sql_to_file/test_sql_to_file.py deleted file mode 100644 index d636b86ca..000000000 --- a/sql_to_file/test_sql_to_file.py +++ /dev/null @@ -1,31 +0,0 @@ -# Copyright 2019 Iguazio -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -from mlrun import code_to_function - -mysql_url = 'mysql+pymysql://rfamro@mysql-rfam-public.ebi.ac.uk:4497/Rfam' -mysql_query = 'select rfam_acc,rfam_id,auto_wiki,description,author,seed_source FROM family' - - -def test_run_sql_to_file(): - fn = code_to_function(name='test_sql_to_file', - filename="sql_to_file.py", - handler="sql_to_file", - kind="job", - ) - run = fn.run(params={'sql_query': mysql_query, - 'database_url': mysql_url}, - local=True) - - assert(run.artifact("query result")) \ No newline at end of file diff --git a/stream_to_parquet/function.yaml b/stream_to_parquet/function.yaml deleted file mode 100644 index f8786cc92..000000000 --- a/stream_to_parquet/function.yaml +++ /dev/null @@ -1,45 +0,0 @@ -kind: remote -metadata: - name: stream-to-parquet - tag: '' - hash: 78316bfbe731714715c19f0bc6deabf8652f15c4 - project: '' - labels: - author: orz - categories: - - machine-learning - - data-preparation -spec: - command: '' - args: [] - image: mlrun/ml-models - description: Saves a stream to Parquet and can lunch drift detection task on it - min_replicas: 1 - max_replicas: 1 - env: [] - base_spec: - apiVersion: nuclio.io/v1 - kind: Function - metadata: - name: stream-to-parquet - labels: {} - annotations: - nuclio.io/generated_by: function generated from /User/test/functions/stream_to_parquet/stream_to_parquet.py - spec: - runtime: python:3.6 - handler: stream_to_parquet:handler - env: [] - volumes: [] - build: - commands: [] - noBaseImagesPull: true - functionSourceCode: IyBHZW5lcmF0ZWQgYnkgbnVjbGlvLmV4cG9ydC5OdWNsaW9FeHBvcnRlcgoKaW1wb3J0IG9zCmltcG9ydCBwYW5kYXMgYXMgcGQKaW1wb3J0IG51bXB5IGFzIG5wCmltcG9ydCBqc29uCmltcG9ydCBkYXRldGltZQppbXBvcnQgbWxydW4KCgpkZWYgcmVjb3JkX3RvX2ZlYXR1cmVzKHJlY29yZCk6CiAgICBmZWF0dXJlcyA9IHJlY29yZFsicmVxdWVzdCJdWyJpbnN0YW5jZXMiXVswXQogICAgdGltZXN0YW1wID0gcmVjb3JkWyJ3aGVuIl0KICAgIHByZWRpY3Rpb24gPSByZWNvcmRbInJlc3AiXQoKICAgIHJlY29yZCA9IHsidGltZXN0YW1wIjogdGltZXN0YW1wLCAqKmZlYXR1cmVzLCAicHJlZGljdGlvbnMiOiBwcmVkaWN0aW9ufQoKICAgIHJldHVybiByZWNvcmQKCgpkZWYgaW5pdF9jb250ZXh0KGNvbnRleHQpOgogICAgc2V0YXR0cihjb250ZXh0LCAiYmF0Y2giLCBbXSkKICAgIHNldGF0dHIoY29udGV4dCwgIndpbmRvdyIsIGludChvcy5nZXRlbnYoIndpbmRvdyIsIDEwKSkpCiAgICBzZXRhdHRyKGNvbnRleHQsICJzYXZlX3RvIiwgb3MuZ2V0ZW52KCJzYXZlX3RvIiwgIi9iaWdkYXRhL2luZmVyZW5jZV9wcS8iKSkKICAgIG9zLm1ha2VkaXJzKGNvbnRleHQuc2F2ZV90bywgZXhpc3Rfb2s9VHJ1ZSkKCiAgICBtbHJ1bi5tbGNvbmYuZGJwYXRoID0gbWxydW4ubWxjb25mLmRicGF0aCBvciAiaHR0cDovL21scnVuLWFwaTo4MDgwIgogICAgYXJ0aWZhY3RfcGF0aCA9IG9zLmdldGVudigiYXJ0aWZhY3RfcGF0aCIsIE5vbmUpCiAgICBpZiBhcnRpZmFjdF9wYXRoOgogICAgICAgIG1scnVuLm1sY29uZi5hcnRpZmFjdF9wYXRoID0gYXJ0aWZhY3RfcGF0aAogICAgaWYgImh1Yl91cmwiIGluIG9zLmVudmlyb246CiAgICAgICAgbWxydW4ubWxjb25mLmh1Yl91cmwgPSBvcy5lbnZpcm9uWyJodWJfdXJsIl0KICAgIHZpcnR1YWxfZHJpZnRfZm4gPSBtbHJ1bi5pbXBvcnRfZnVuY3Rpb24oImh1YjovL3ZpcnR1YWxfZHJpZnQiKQogICAgdmlydHVhbF9kcmlmdF9mbi5hcHBseShtbHJ1bi5hdXRvX21vdW50KCkpCiAgICBzZXRhdHRyKGNvbnRleHQsICJ2aXJ0dWFsX2RyaWZ0X2ZuIiwgdmlydHVhbF9kcmlmdF9mbikKCiAgICBwcmVkaWN0aW9uc19jb2wgPSBvcy5nZXRlbnYoInByZWRpY3Rpb25zIiwgTm9uZSkKICAgIGxhYmVsX2NvbCA9IG9zLmdldGVudigibGFiZWxfY29sIiwgTm9uZSkKICAgIHNldGF0dHIoY29udGV4dCwgImJhc2VfZGF0YXNldCIsIG9zLmdldGVudigiYmFzZV9kYXRhc2V0IiwgIiIpKQogICAgc2V0YXR0cihjb250ZXh0LCAiaW5kZXhlcyIsIGpzb24ubG9hZHMob3MuZW52aXJvbi5nZXQoImluZGV4ZXMiLCAiW10iKSkpCiAgICBzZXRhdHRyKGNvbnRleHQsICJwcmVkaWN0aW9uc19jb2wiLCBwcmVkaWN0aW9uc19jb2wpCiAgICBzZXRhdHRyKGNvbnRleHQsICJsYWJlbF9jb2wiLCBsYWJlbF9jb2wpCiAgICBzZXRhdHRyKAogICAgICAgIGNvbnRleHQsICJyZXN1bHRzX3RzZGJfY29udGFpbmVyIiwgb3MuZ2V0ZW52KCJyZXN1bHRzX3RzZGJfY29udGFpbmVyIiwgTm9uZSkKICAgICkKICAgIHNldGF0dHIoY29udGV4dCwgInJlc3VsdHNfdHNkYl90YWJsZSIsIG9zLmdldGVudigicmVzdWx0c190c2RiX3RhYmxlIiwgTm9uZSkpCgoKZGVmIGhhbmRsZXIoY29udGV4dCwgZXZlbnQpOgoKICAgIGNvbnRleHQubG9nZ2VyLmluZm8oZiJBZGRpbmcge2V2ZW50LmJvZHl9IikKICAgIGNvbnRleHQuYmF0Y2guYXBwZW5kKHJlY29yZF90b19mZWF0dXJlcyhqc29uLmxvYWRzKGV2ZW50LmJvZHkpKSkKCiAgICBpZiBsZW4oY29udGV4dC5iYXRjaCkgPiBjb250ZXh0LndpbmRvdzoKICAgICAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGNvbnRleHQuYmF0Y2hbOjFdKQogICAgICAgIGNvbnRleHQubG9nZ2VyLmluZm8oY29udGV4dC5pbmRleGVzKQogICAgICAgIGRmID0gcGQuRGF0YUZyYW1lKGNvbnRleHQuYmF0Y2gpCiAgICAgICAgY29udGV4dC5sb2dnZXIuaW5mbyhmImRmIGV4YW1wbGU6IHtkZi5oZWFkKDEpfSIpCiAgICAgICAgaWYgY29udGV4dC5pbmRleGVzOgogICAgICAgICAgICBkZiA9IGRmLnNldF9pbmRleChjb250ZXh0LmluZGV4ZXMpCiAgICAgICAgZGZfcGF0aCA9IG9zLnBhdGguam9pbigKICAgICAgICAgICAgY29udGV4dC5zYXZlX3RvLAogICAgICAgICAgICBmIntkYXRldGltZS5kYXRldGltZS5ub3coKS5zdHJmdGltZSgnJVktJW0tJWRUJUg6JU06JVMnKX0ucHEiLAogICAgICAgICkKICAgICAgICBkZi50b19wYXJxdWV0KGRmX3BhdGgsaW5kZXg9RmFsc2UpCgogICAgICAgIHRhc2sgPSBtbHJ1bi5OZXdUYXNrKAogICAgICAgICAgICBuYW1lPSJkcmlmdF9tYWduaXR1ZGUiLAogICAgICAgICAgICBoYW5kbGVyPSJkcmlmdF9tYWduaXR1ZGUiLAogICAgICAgICAgICBwYXJhbXM9ewogICAgICAgICAgICAgICAgImxhYmVsX2NvbCI6IGNvbnRleHQubGFiZWxfY29sLAogICAgICAgICAgICAgICAgInByZWRpY3Rpb25fY29sIjogY29udGV4dC5wcmVkaWN0aW9uc19jb2wsCiAgICAgICAgICAgICAgICAicmVzdWx0c190c2RiX2NvbnRhaW5lciI6IGNvbnRleHQucmVzdWx0c190c2RiX2NvbnRhaW5lciwKICAgICAgICAgICAgICAgICJyZXN1bHRzX3RzZGJfdGFibGUiOiBjb250ZXh0LnJlc3VsdHNfdHNkYl90YWJsZSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgaW5wdXRzPXsidCI6IGNvbnRleHQuYmFzZV9kYXRhc2V0LCAidSI6IGRmX3BhdGh9LAogICAgICAgICAgICBhcnRpZmFjdF9wYXRoPW1scnVuLm1sY29uZi5hcnRpZmFjdF9wYXRoLAogICAgICAgICkKCiAgICAgICAgY29udGV4dC52aXJ0dWFsX2RyaWZ0X2ZuLnJ1bih0YXNrLCB3YXRjaD1GYWxzZSkKCiAgICAgICAgY29udGV4dC5iYXRjaCA9IFtdCg== - source: '' - build: - commands: [] - code_origin: https://github.com/daniels290813/functions.git#3605c9b8dcadab89a5a45f7d16dcd2fcfeca8697:/User/test/functions/stream_to_parquet/stream_to_parquet.py - origin_filename: /User/test/functions/stream_to_parquet/stream_to_parquet.py - default_handler: handler - disable_auto_mount: false - affinity: null -verbose: false diff --git a/stream_to_parquet/item.yaml b/stream_to_parquet/item.yaml deleted file mode 100644 index cbd59376e..000000000 --- a/stream_to_parquet/item.yaml +++ /dev/null @@ -1,28 +0,0 @@ -apiVersion: v1 -categories: -- machine-learning -- data-preparation -description: Saves a stream to Parquet and can lunch drift detection task on it -doc: '' -example: stream_to_parquet.ipynb -generationDate: 2022-08-28:17-25 -hidden: false -icon: '' -labels: - author: orz -maintainers: [] -marketplaceType: '' -mlrunVersion: 1.1.0 -name: stream-to-parquet -platformVersion: 3.5.0 -spec: - customFields: - max_replicas: 1 - min_replicas: 1 - filename: stream_to_parquet.py - handler: handler - image: mlrun/ml-models - kind: nuclio - requirements: [] -url: '' -version: 1.1.0 diff --git a/stream_to_parquet/stream_to_parquet.ipynb b/stream_to_parquet/stream_to_parquet.ipynb deleted file mode 100644 index e47c6be92..000000000 --- a/stream_to_parquet/stream_to_parquet.ipynb +++ /dev/null @@ -1,698 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Stream to Parquet" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Part of the [network operations](https://github.com/mlrun/demos/tree/0.7.x/network-operations) demo pipeline, this function listens to a labeld stream and writes it as parquet files.
\n", - "This function also deploys the function [virtual_drift](https://github.com/mlrun/functions/tree/master/virtual_drift) from the hub, which computes drift magnitude metrics between base dataset t and dataset u,
\n", - "in our case (as well as in the demo) - base dataset (the one that the model trained on) and the dataset the model predicted.
\n", - "virtual_drift writes the output to TSDB." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Steps**\n", - "\n", - "1. [Data exploration](#Data-exploration)\n", - "2. [Creating the labeled stream](#Creating-the-labeled-stream)\n", - "3. [Importing the function](#Importing-the-function)\n", - "4. [Running the functioh remotely](#Running-the-function-remotely)\n", - "5. [Testing the function](#Testing-the-function)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Data exploration**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In order to know about the performance of a drift detector by measuring the different detection metrics, we need to know beforehand where a real drift occurs.
\n", - "This is only possible with synthetic datasets.
The scikit-multiflow framework allows generating several kinds of synthetic data to simulate the occurrence of drifts.
\n", - "[Harvard dataverse](https://dataverse.harvard.edu) provides futher explanations on the [used dataset](https://dataverse.harvard.edu/dataset.xhtml?persistentId=doi:10.7910/DVN/5OWRGB) along with different kinds of drifted datasets.
\n", - "mixed_0101_abrupto has 4 concepts and 3 drifts at time steps 10000, 20000, and 30000.
\n", - "Our dataset will be train-test-splitted, the train part (first 5000 examples) is used to train the model (that is generated easly using [sklearn_classifer](https://github.com/mlrun/functions/blob/master/sklearn_classifier/sklearn_classifier.ipynb)).
\n", - "The test part (which is already predicted by the model) will be pushed to the input stream in order to detect drifts." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
X1X2X3X4class
00.01.00.4601010.5927441.0
11.01.00.5887880.5749840.0
20.00.00.4016410.6793251.0
31.01.00.3060760.1821080.0
40.00.00.9628470.5792451.0
\n", - "
" - ], - "text/plain": [ - " X1 X2 X3 X4 class\n", - "0 0.0 1.0 0.460101 0.592744 1.0\n", - "1 1.0 1.0 0.588788 0.574984 0.0\n", - "2 0.0 0.0 0.401641 0.679325 1.0\n", - "3 1.0 1.0 0.306076 0.182108 0.0\n", - "4 0.0 0.0 0.962847 0.579245 1.0" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import pandas as pd\n", - "data_path = 'https://s3.wasabisys.com/iguazio/data/function-marketplace-data/concept_drift/mixed_0101_abrupto.csv'\n", - "base_dataset = 'https://s3.wasabisys.com/iguazio/data/function-marketplace-data/concept_drift/predicted_abrupto_train.csv'\n", - "# The predicted test data is pushed to the stream\n", - "predicted_test_data_path = 'https://s3.wasabisys.com/iguazio/data/function-marketplace-data/concept_drift/predicted_abrupto_test.csv'\n", - "# You can find the model used here\n", - "models_path = 'https://s3.wasabisys.com/iguazio/models/function-marketplace-models/concept_drift/concept_drift_random_forest.pkl'\n", - "original_data = pd.read_csv(data_path)\n", - "original_data.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
X1X2X3X4classpredicted_col
349950.00.00.0101060.6472690.01.0
349961.01.00.2936510.7372911.00.0
349970.00.00.8485460.5523370.01.0
349981.01.00.6147540.8598961.00.0
349991.00.00.2653060.8437160.01.0
\n", - "
" - ], - "text/plain": [ - " X1 X2 X3 X4 class predicted_col\n", - "34995 0.0 0.0 0.010106 0.647269 0.0 1.0\n", - "34996 1.0 1.0 0.293651 0.737291 1.0 0.0\n", - "34997 0.0 0.0 0.848546 0.552337 0.0 1.0\n", - "34998 1.0 1.0 0.614754 0.859896 1.0 0.0\n", - "34999 1.0 0.0 0.265306 0.843716 0.0 1.0" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "predicted_test = pd.read_csv(predicted_test_data_path)\n", - "predicted_test.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Creating the labeled stream**" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "import os \n", - "\n", - "container = os.path.join('/',os.environ['V3IO_HOME'].split('/')[0])\n", - "user = os.environ[\"V3IO_USERNAME\"]\n", - "rel_path = os.getcwd()[6:] + '/artifacts'\n", - "\n", - "base_input_stream = os.path.join(user,rel_path) + \"/inputs_stream\"\n", - "base_output_stream = os.path.join(user,rel_path) + \"/output_stream\"\n", - "input_stream = os.path.join(container,base_input_stream)\n", - "tsdb_path = os.path.join(user,rel_path) + \"/output_tsdb\"\n", - "\n", - "stream_consumer_group = 's2p'" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "import v3io.dataplane\n", - "\n", - "client = v3io.dataplane.Client()\n", - "response = client.stream.create(container = container,\n", - " stream_path=base_input_stream,\n", - " shard_count=1,\n", - " raise_for_status = v3io.dataplane.RaiseForStatus.never)\n", - "response.raise_for_status([409, 204])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Importing the function**" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2021-10-26 14:37:45,224 [info] created and saved project function-marketplace\n" - ] - } - ], - "source": [ - "import mlrun\n", - "\n", - "# Importing the function\n", - "mlrun.set_environment(project='function-marketplace')\n", - "\n", - "fn = mlrun.import_function(\"hub://stream_to_parquet:development\")\n", - "fn.apply(mlrun.auto_mount())\n", - "\n", - "fn.add_v3io_stream_trigger(stream_path=input_stream, name='stream', group=stream_consumer_group)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Running the function remotely**" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2021-10-26 14:37:45,513 [info] Starting remote function deploy\n", - "2021-10-26 14:37:45 (info) Deploying function\n", - "2021-10-26 14:37:45 (info) Building\n", - "2021-10-26 14:37:45 (info) Staging files and preparing base images\n", - "2021-10-26 14:37:45 (info) Building processor image\n", - "2021-10-26 14:37:47 (info) Build complete\n", - "2021-10-26 14:37:55 (info) Function deploy complete\n", - "> 2021-10-26 14:37:55,689 [info] successfully deployed function: {'internal_invocation_urls': ['nuclio-function-marketplace-stream-to-parquet.default-tenant.svc.cluster.local:8080'], 'external_invocation_urls': ['default-tenant.app.dev39.lab.iguazeng.com:31445']}\n" - ] - }, - { - "data": { - "text/plain": [ - "'http://default-tenant.app.dev39.lab.iguazeng.com:31445'" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import json\n", - "fn.set_envs({'window': 200,\n", - " 'save_to': os.path.join(os.path.join('/User',rel_path), 'inference_pq'),\n", - " 'prediction_col': 'predicted_col',\n", - " 'label_col': 'class',\n", - " 'base_dataset': base_dataset,\n", - " 'results_tsdb_container': container[1:],\n", - " 'results_tsdb_table': tsdb_path,\n", - " 'mount_path': os.path.join(container,user),\n", - " 'mount_remote': container,\n", - " 'artifact_path': os.path.join('/User',rel_path)})\n", - "\n", - "fn.deploy()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Testing the function**" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'data': '{\"request\": {\"instances\": [{\"X1\": 0.0, \"X2\": 0.0, \"X3\": 0.0634475073, \"X4\": 0.4136568818, \"class\": 1.0, \"predicted_col\": 1.0}]}, \"resp\": [1], \"when\": \"2021-10-26 14:37:55.864974\", \"model\": \"sklearn.ensemble.RandomForestClassifier\"}'}" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import json\n", - "import datetime\n", - "\n", - "# Reshaping the data to V3IOStream format.\n", - "def restructure_stream_event(context, event):\n", - " instances = [dict()]\n", - " for key in predicted_test.keys():\n", - " if key not in ['when', 'model', 'worker', 'hostname', 'predicted_col']:\n", - " instances[0].update({key: event.pop(key)})\n", - " instances[0].update({key: event.get(key)}) \n", - " event['request'] = {'instances': instances}\n", - " event['resp'] = [int(event.pop('predicted_col'))]\n", - " event['when'] = datetime.datetime.strftime(datetime.datetime.now(), format=\"%Y-%m-%d %H:%M:%S.%f\")\n", - " event['model'] = 'sklearn.ensemble.RandomForestClassifier'\n", - " return event\n", - " \n", - " \n", - "records = json.loads(predicted_test.to_json(orient='records'))\n", - "records = [{'data': json.dumps(restructure_stream_event(context, record))} for record in records]\n", - "\n", - "# showing first record\n", - "records[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "# Pushing some data to the input stream\n", - "step = 500\n", - "for i in range(0,20000,step):\n", - " response = client.stream.put_records(container=container,\n", - " stream_path=base_input_stream, \n", - " records=records[i:i+step])" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
class_shift_helingerclass_shift_kldclass_shift_tvdprior_helingerprior_kldprior_tvdstream
time
2021-10-26 14:38:08.027000+00:000.0017590.0000250.0024881.010.01.0some_stream
2021-10-26 14:38:08.699000+00:000.0017590.0000250.0024881.010.01.0some_stream
2021-10-26 14:38:09.599000+00:000.0017590.0000250.0024881.010.01.0some_stream
2021-10-26 14:38:10.759000+00:000.0017590.0000250.0024881.010.01.0some_stream
2021-10-26 14:38:11.561000+00:000.0017590.0000250.0024881.010.01.0some_stream
........................
2021-10-26 14:39:42.037000+00:000.0017590.0000250.0024881.010.01.0some_stream
2021-10-26 14:39:42.191000+00:000.0017590.0000250.0024881.010.01.0some_stream
2021-10-26 14:39:42.586000+00:000.0017590.0000250.0024881.010.01.0some_stream
2021-10-26 14:39:42.816000+00:000.0017590.0000250.0024881.010.01.0some_stream
2021-10-26 14:39:49.180000+00:000.0017590.0000250.0024881.010.01.0some_stream
\n", - "

99 rows × 7 columns

\n", - "
" - ], - "text/plain": [ - " class_shift_helinger class_shift_kld \\\n", - "time \n", - "2021-10-26 14:38:08.027000+00:00 0.001759 0.000025 \n", - "2021-10-26 14:38:08.699000+00:00 0.001759 0.000025 \n", - "2021-10-26 14:38:09.599000+00:00 0.001759 0.000025 \n", - "2021-10-26 14:38:10.759000+00:00 0.001759 0.000025 \n", - "2021-10-26 14:38:11.561000+00:00 0.001759 0.000025 \n", - "... ... ... \n", - "2021-10-26 14:39:42.037000+00:00 0.001759 0.000025 \n", - "2021-10-26 14:39:42.191000+00:00 0.001759 0.000025 \n", - "2021-10-26 14:39:42.586000+00:00 0.001759 0.000025 \n", - "2021-10-26 14:39:42.816000+00:00 0.001759 0.000025 \n", - "2021-10-26 14:39:49.180000+00:00 0.001759 0.000025 \n", - "\n", - " class_shift_tvd prior_helinger prior_kld \\\n", - "time \n", - "2021-10-26 14:38:08.027000+00:00 0.002488 1.0 10.0 \n", - "2021-10-26 14:38:08.699000+00:00 0.002488 1.0 10.0 \n", - "2021-10-26 14:38:09.599000+00:00 0.002488 1.0 10.0 \n", - "2021-10-26 14:38:10.759000+00:00 0.002488 1.0 10.0 \n", - "2021-10-26 14:38:11.561000+00:00 0.002488 1.0 10.0 \n", - "... ... ... ... \n", - "2021-10-26 14:39:42.037000+00:00 0.002488 1.0 10.0 \n", - "2021-10-26 14:39:42.191000+00:00 0.002488 1.0 10.0 \n", - "2021-10-26 14:39:42.586000+00:00 0.002488 1.0 10.0 \n", - "2021-10-26 14:39:42.816000+00:00 0.002488 1.0 10.0 \n", - "2021-10-26 14:39:49.180000+00:00 0.002488 1.0 10.0 \n", - "\n", - " prior_tvd stream \n", - "time \n", - "2021-10-26 14:38:08.027000+00:00 1.0 some_stream \n", - "2021-10-26 14:38:08.699000+00:00 1.0 some_stream \n", - "2021-10-26 14:38:09.599000+00:00 1.0 some_stream \n", - "2021-10-26 14:38:10.759000+00:00 1.0 some_stream \n", - "2021-10-26 14:38:11.561000+00:00 1.0 some_stream \n", - "... ... ... \n", - "2021-10-26 14:39:42.037000+00:00 1.0 some_stream \n", - "2021-10-26 14:39:42.191000+00:00 1.0 some_stream \n", - "2021-10-26 14:39:42.586000+00:00 1.0 some_stream \n", - "2021-10-26 14:39:42.816000+00:00 1.0 some_stream \n", - "2021-10-26 14:39:49.180000+00:00 1.0 some_stream \n", - "\n", - "[99 rows x 7 columns]" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Reading from TSDB\n", - "import v3io_frames as v3f\n", - "\n", - "v3f_client = v3f.Client(os.environ[\"V3IO_FRAMESD\"],container=container[1:])\n", - "v3f_client.read(backend='tsdb',table=tsdb_path)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "[Back to the top](#Stream-to-Parquet)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/stream_to_parquet/stream_to_parquet.py b/stream_to_parquet/stream_to_parquet.py deleted file mode 100644 index 175c12822..000000000 --- a/stream_to_parquet/stream_to_parquet.py +++ /dev/null @@ -1,96 +0,0 @@ -# Copyright 2019 Iguazio -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Generated by nuclio.export.NuclioExporter - -import os -import pandas as pd -import numpy as np -import json -import datetime -import mlrun - - -def record_to_features(record): - features = record["request"]["instances"][0] - timestamp = record["when"] - prediction = record["resp"] - - record = {"timestamp": timestamp, **features, "predictions": prediction} - - return record - - -def init_context(context): - setattr(context, "batch", []) - setattr(context, "window", int(os.getenv("window", 10))) - setattr(context, "save_to", os.getenv("save_to", "/bigdata/inference_pq/")) - os.makedirs(context.save_to, exist_ok=True) - - mlrun.mlconf.dbpath = mlrun.mlconf.dbpath or "http://mlrun-api:8080" - artifact_path = os.getenv("artifact_path", None) - if artifact_path: - mlrun.mlconf.artifact_path = artifact_path - if "hub_url" in os.environ: - mlrun.mlconf.hub_url = os.environ["hub_url"] - virtual_drift_fn = mlrun.import_function("hub://virtual_drift") - virtual_drift_fn.apply(mlrun.auto_mount()) - setattr(context, "virtual_drift_fn", virtual_drift_fn) - - predictions_col = os.getenv("predictions", None) - label_col = os.getenv("label_col", None) - setattr(context, "base_dataset", os.getenv("base_dataset", "")) - setattr(context, "indexes", json.loads(os.environ.get("indexes", "[]"))) - setattr(context, "predictions_col", predictions_col) - setattr(context, "label_col", label_col) - setattr( - context, "results_tsdb_container", os.getenv("results_tsdb_container", None) - ) - setattr(context, "results_tsdb_table", os.getenv("results_tsdb_table", None)) - - -def handler(context, event): - - context.logger.info(f"Adding {event.body}") - context.batch.append(record_to_features(json.loads(event.body))) - - if len(context.batch) > context.window: - context.logger.info(context.batch[:1]) - context.logger.info(context.indexes) - df = pd.DataFrame(context.batch) - context.logger.info(f"df example: {df.head(1)}") - if context.indexes: - df = df.set_index(context.indexes) - df_path = os.path.join( - context.save_to, - f"{datetime.datetime.now().strftime('%Y-%m-%dT%H:%M:%S')}.pq", - ) - df.to_parquet(df_path,index=False) - - task = mlrun.NewTask( - name="drift_magnitude", - handler="drift_magnitude", - params={ - "label_col": context.label_col, - "prediction_col": context.predictions_col, - "results_tsdb_container": context.results_tsdb_container, - "results_tsdb_table": context.results_tsdb_table, - }, - inputs={"t": context.base_dataset, "u": df_path}, - artifact_path=mlrun.mlconf.artifact_path, - ) - - context.virtual_drift_fn.run(task, watch=False) - - context.batch = [] diff --git a/tf1_serving/function.yaml b/tf1_serving/function.yaml deleted file mode 100644 index e6a57c4b2..000000000 --- a/tf1_serving/function.yaml +++ /dev/null @@ -1,48 +0,0 @@ -kind: remote -metadata: - name: tf1-serving - tag: '' - hash: 20cdeb2119a67fc51e55474ac84d386c7b658db3 - project: '' - labels: - author: yaronh - categories: - - model-serving - - machine-learning -spec: - command: '' - args: [] - image: mlrun/mlrun - description: tf1 image classification server - min_replicas: 1 - max_replicas: 4 - env: - - name: MODEL_CLASS - value: TFModel - - name: ENABLE_EXPLAINER - value: false - base_spec: - apiVersion: nuclio.io/v1 - kind: Function - metadata: - name: tf1-serving - labels: {} - annotations: - nuclio.io/generated_by: function generated from /home/kali/functions/tf1_serving/tf1_serving.py - spec: - runtime: python:3.6 - handler: tf1_serving:handler - env: [] - volumes: [] - build: - commands: [] - noBaseImagesPull: true - functionSourceCode: IyBHZW5lcmF0ZWQgYnkgbnVjbGlvLmV4cG9ydC5OdWNsaW9FeHBvcnRlcgoKaW1wb3J0IHdhcm5pbmdzCgp3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoYWN0aW9uPSJpZ25vcmUiLCBjYXRlZ29yeT1GdXR1cmVXYXJuaW5nKQoKaW1wb3J0IGpzb24KaW1wb3J0IG51bXB5IGFzIG5wCmltcG9ydCByZXF1ZXN0cwpmcm9tIHRlbnNvcmZsb3cgaW1wb3J0IGtlcmFzCmZyb20ga2VyYXMubW9kZWxzIGltcG9ydCBsb2FkX21vZGVsCmZyb20ga2VyYXMucHJlcHJvY2Vzc2luZyBpbXBvcnQgaW1hZ2UKZnJvbSBrZXJhcy5wcmVwcm9jZXNzaW5nLmltYWdlIGltcG9ydCBsb2FkX2ltZwpmcm9tIG9zIGltcG9ydCBlbnZpcm9uLCBwYXRoCmZyb20gUElMIGltcG9ydCBJbWFnZQpmcm9tIGlvIGltcG9ydCBCeXRlc0lPCmZyb20gdXJsbGliLnJlcXVlc3QgaW1wb3J0IHVybG9wZW4KaW1wb3J0IG1scnVuCgoKY2xhc3MgVEZNb2RlbChtbHJ1bi5ydW50aW1lcy5NTE1vZGVsU2VydmVyKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lOiBzdHIsIG1vZGVsX2Rpcjogc3RyKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKG5hbWUsIG1vZGVsX2RpcikKCiAgICAgICAgc2VsZi5JTUFHRV9XSURUSCA9IGludChlbnZpcm9uLmdldCgiSU1BR0VfV0lEVEgiLCAiMTI4IikpCiAgICAgICAgc2VsZi5JTUFHRV9IRUlHSFQgPSBpbnQoZW52aXJvbi5nZXQoIklNQUdFX0hFSUdIVCIsICIxMjgiKSkKICAgICAgICBzZWxmLmNsYXNzZXMgPSBOb25lCiAgICAgICAgdHJ5OgogICAgICAgICAgICB3aXRoIG9wZW4oZW52aXJvblsiY2xhc3Nlc19tYXAiXSwgInIiKSBhcyBmOgogICAgICAgICAgICAgICAgc2VsZi5jbGFzc2VzID0ganNvbi5sb2FkKGYpCiAgICAgICAgZXhjZXB0OgogICAgICAgICAgICBwYXNzCgogICAgZGVmIGxvYWQoc2VsZik6CiAgICAgICAgbW9kZWxfZmlsZSwgZXh0cmFfZGF0YSA9IHNlbGYuZ2V0X21vZGVsKCIuaDUiKQogICAgICAgIHNlbGYubW9kZWwgPSBsb2FkX21vZGVsKG9wZW4obW9kZWxfZmlsZSwgInJiIikpCgogICAgZGVmIHByZXByb2Nlc3Moc2VsZiwgYm9keSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBvdXRwdXQgPSB7Imluc3RhbmNlcyI6IFtdfQogICAgICAgICAgICBpbnN0YW5jZXMgPSBib2R5LmdldCgiaW5zdGFuY2VzIiwgW10pCiAgICAgICAgICAgIGZvciBieXRlX2ltYWdlIGluIGluc3RhbmNlczoKICAgICAgICAgICAgICAgIGltZyA9IEltYWdlLm9wZW4oYnl0ZV9pbWFnZSkKICAgICAgICAgICAgICAgIGltZyA9IGltZy5yZXNpemUoKHNlbGYuSU1BR0VfV0lEVEgsIHNlbGYuSU1BR0VfSEVJR0hUKSkKCiAgICAgICAgICAgICAgICB4ID0gaW1hZ2UuaW1nX3RvX2FycmF5KGltZykKICAgICAgICAgICAgICAgIHggPSBucC5leHBhbmRfZGltcyh4LCBheGlzPTApCiAgICAgICAgICAgICAgICBvdXRwdXRbImluc3RhbmNlcyJdLmFwcGVuZCh4KQoKICAgICAgICAgICAgb3V0cHV0WyJpbnN0YW5jZXMiXSA9IFtucC52c3RhY2sob3V0cHV0WyJpbnN0YW5jZXMiXSldCiAgICAgICAgICAgIHJldHVybiBvdXRwdXQKICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbihmInJlY2VpdmVkOiB7Ym9keX0iKQoKICAgIGRlZiBwcmVkaWN0KHNlbGYsIGRhdGEpOgogICAgICAgIGltYWdlcyA9IGRhdGEuZ2V0KCJpbnN0YW5jZXMiLCBbXSkKCiAgICAgICAgcHJlZGljdGVkX3Byb2JhYmlsaXR5ID0gc2VsZi5tb2RlbC5wcmVkaWN0KGltYWdlcykKCiAgICAgICAgcmV0dXJuIHByZWRpY3RlZF9wcm9iYWJpbGl0eQoKICAgIGRlZiBwb3N0cHJvY2VzcyhzZWxmLCBwcmVkaWN0ZWRfcHJvYmFiaWxpdHkpOgogICAgICAgIGlmIHNlbGYuY2xhc3NlczoKICAgICAgICAgICAgcHJlZGljdGVkX2NsYXNzZXMgPSBucC5hcm91bmQocHJlZGljdGVkX3Byb2JhYmlsaXR5LCAxKS50b2xpc3QoKVswXQogICAgICAgICAgICBwcmVkaWN0ZWRfcHJvYmFiaWxpdGllcyA9IHByZWRpY3RlZF9wcm9iYWJpbGl0eS50b2xpc3QoKVswXQogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgInByZWRpY3Rpb24iOiBbCiAgICAgICAgICAgICAgICAgICAgc2VsZi5jbGFzc2VzW3N0cihpbnQoY2xzKSldIGZvciBjbHMgaW4gcHJlZGljdGVkX2NsYXNzZXMKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBmJ3tzZWxmLmNsYXNzZXNbIjEiXX0tcHJvYmFiaWxpdHknOiBwcmVkaWN0ZWRfcHJvYmFiaWxpdGllcywKICAgICAgICAgICAgfQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBwcmVkaWN0ZWRfcHJvYmFiaWxpdHkudG9saXN0KClbMF0KCmZyb20gbWxydW4ucnVudGltZXMgaW1wb3J0IG51Y2xpb19pbml0X2hvb2sKZGVmIGluaXRfY29udGV4dChjb250ZXh0KToKICAgIG51Y2xpb19pbml0X2hvb2soY29udGV4dCwgZ2xvYmFscygpLCAnc2VydmluZycpCgpkZWYgaGFuZGxlcihjb250ZXh0LCBldmVudCk6CiAgICByZXR1cm4gY29udGV4dC5tbHJ1bl9oYW5kbGVyKGNvbnRleHQsIGV2ZW50KQo= - source: '' - function_kind: serving - build: - commands: [] - code_origin: https://github.com/daniels290813/functions.git#55a79c32be5d233cc11efcf40cd3edbe309bfdef:/home/kali/functions/tf1_serving/tf1_serving.py - default_handler: handler - affinity: null -verbose: false diff --git a/tf1_serving/item.yaml b/tf1_serving/item.yaml deleted file mode 100644 index 6a5648ab0..000000000 --- a/tf1_serving/item.yaml +++ /dev/null @@ -1,28 +0,0 @@ -apiVersion: v1 -categories: -- model-serving -- machine-learning -description: tf1 image classification server -doc: '' -example: tf1_serving.ipynb -generationDate: 2022-08-28:17-25 -hidden: false -icon: '' -labels: - author: yaronh -maintainers: [] -marketplaceType: '' -mlrunVersion: 1.1.0 -name: tf1-serving -platformVersion: 3.5.0 -spec: - env: - ENABLE_EXPLAINER: false - MODEL_CLASS: TFModel - filename: tf1_serving.py - handler: handler - image: mlrun/mlrun - kind: nuclio:serving - requirements: [] -url: '' -version: 1.1.0 diff --git a/tf1_serving/requirements.txt b/tf1_serving/requirements.txt deleted file mode 100644 index 8d3d19557..000000000 --- a/tf1_serving/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -pillow -tensorflow \ No newline at end of file diff --git a/tf1_serving/tf1_serving.ipynb b/tf1_serving/tf1_serving.ipynb deleted file mode 100644 index 1d42ee606..000000000 --- a/tf1_serving/tf1_serving.ipynb +++ /dev/null @@ -1,567 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Image Classification Model - Serving Function\n", - "\n", - "This notebook demonstrates how to deploy a Tensorflow model using MLRun & Nuclio.\n", - "\n", - "**In this notebook you will:**\n", - "* Write a Tensorflow-Model class to load and predict on the incoming data\n", - "* Deploy the model as a serverless function\n", - "* Invoke the serving endpoint with data as:\n", - " * URLs to images hosted on S3\n", - " * Direct image send\n", - " \n", - "**Steps:** \n", - "* [Define Nuclio function](#Define-Nuclio-function) \n", - " * [Install dependencies and set config](#Install-dependencies-and-set-config) \n", - " * [Model serving class](#Model-Serving-Class) \n", - "* [Deploy the serving function to the cluster](#Deploy-the-serving-function-to-the-cluster) \n", - "* [Define test parameters](#Define-test-parameters)\n", - "* [Test the deployed function on the cluster](#Test-the-deployed-function-on-the-cluster)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Define Nuclio Function" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To use the magic commands for deploying this jupyter notebook as a nuclio function we must first import nuclio \n", - "Since we do not want to import nuclio in the actual function, the comment annotation `nuclio: ignore` is used. This marks the cell for nuclio, telling it to ignore the cell's values when building the function." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# nuclio: ignore\n", - "import nuclio" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Install dependencies and set config\n", - "> Note: Since tensorflow 1.14 is being pulled from the baseimage it is not directly installed as a build command.\n", - "If it is not installed on your system please uninstall and install using the line: `pip install tensorflow==1.14 keras`" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "%nuclio: setting kind to 'nuclio:serving'\n", - "%nuclio: setting 'MODEL_CLASS' environment variable\n", - "%nuclio: setting spec.build.baseImage to 'mlrun/mlrun'\n" - ] - } - ], - "source": [ - "%nuclio config kind=\"nuclio:serving\"\n", - "%nuclio env MODEL_CLASS=TFModel\n", - "\n", - "# tensorflow version 1 requires a different version of python than \n", - "# the default (3.7), so we override the default tag here:\n", - "\n", - "%nuclio config spec.build.baseImage = \"mlrun/mlrun\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Since we are using packages which are not surely installed on our baseimage, or want to verify that a specific version of the package will be installed we use the `%nuclio cmd` annotation. \n", - ">`%nuclio cmd` works both locally and during deployment by default, but can be set with `-c` flag to only run the commands while deploying or `-l` to set the variable for the local environment only." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "%%nuclio cmd -c\n", - "pip install tensorflow==1.14 keras==2.3.1 'h5py<3.0.0'\n", - "pip install requests pillow" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Function Code" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "import warnings\n", - "warnings.simplefilter(action=\"ignore\", category=FutureWarning)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "import json\n", - "import numpy as np\n", - "import requests\n", - "from tensorflow import keras\n", - "from keras.models import load_model\n", - "from keras.preprocessing import image\n", - "from keras.preprocessing.image import load_img\n", - "from os import environ, path\n", - "from PIL import Image\n", - "from io import BytesIO\n", - "from urllib.request import urlopen\n", - "import mlrun" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Model Serving Class" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We define the `TFModel` class which we will use to define data handling and prediction of our model. \n", - "\n", - "The class should consist of:\n", - "* `__init__(name, model_dir)` - Setup the internal parameters\n", - "* `load(self)` - How to load the model and broadcast it's ready for prediction\n", - "* `preprocess(self, body)` - How to handle the incoming event, forming the request to an `{'instances': []}` dictionary as requested by the protocol\n", - "* `predict(self, data)` - Receives and `{'instances': []}` and returns the model's prediction as a list\n", - "* `postprocess(self, data)` - Does any additional processing needed on the predictions." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "class TFModel(mlrun.runtimes.MLModelServer):\n", - " def __init__(self, name: str, model_dir: str):\n", - " super().__init__(name, model_dir)\n", - "\n", - " self.IMAGE_WIDTH = int(environ.get('IMAGE_WIDTH', '128'))\n", - " self.IMAGE_HEIGHT = int(environ.get('IMAGE_HEIGHT', '128'))\n", - " self.classes = None\n", - " try:\n", - " with open(environ['classes_map'], 'r') as f:\n", - " self.classes = json.load(f)\n", - " except:\n", - " pass\n", - " \n", - " def load(self):\n", - " model_file, extra_data = self.get_model('.h5')\n", - " self.model = load_model(open(model_file, 'rb'))\n", - " \n", - " def preprocess(self, body):\n", - " try:\n", - " output = {'instances': []}\n", - " instances = body.get('instances', [])\n", - " for byte_image in instances:\n", - " img = Image.open(byte_image)\n", - " img = img.resize((self.IMAGE_WIDTH, self.IMAGE_HEIGHT))\n", - "\n", - " # Load image\n", - " x = image.img_to_array(img)\n", - " x = np.expand_dims(x, axis=0)\n", - " output['instances'].append(x)\n", - " \n", - " # Format instances list\n", - " output['instances'] = [np.vstack(output['instances'])]\n", - " return output\n", - " except:\n", - " raise Exception(f'received: {body}')\n", - " \n", - "\n", - " def predict(self, data):\n", - " images = data.get('instances', [])\n", - "\n", - " # Predict\n", - " predicted_probability = self.model.predict(images)\n", - "\n", - " # return prediction\n", - " return predicted_probability\n", - " \n", - " def postprocess(self, predicted_probability):\n", - " if self.classes:\n", - " predicted_classes = np.around(predicted_probability, 1).tolist()[0]\n", - " predicted_probabilities = predicted_probability.tolist()[0]\n", - " return {\n", - " 'prediction': [self.classes[str(int(cls))] for cls in predicted_classes], \n", - " f'{self.classes[\"1\"]}-probability': predicted_probabilities\n", - " }\n", - " else:\n", - " return predicted_probability.tolist()[0]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To let our nuclio builder know that our function code ends at this point we will use the comment annotation `nuclio: end-code`. \n", - "\n", - "Any new cell from now on will be treated as if a `nuclio: ignore` comment was set, and will not be added to the funcion." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "# nuclio: end-code" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Test the function locally" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Make sure your local TF / Keras version is the same as pulled in the nuclio image for accurate testing\n", - "\n", - "Set the served models and their file paths using: `SERVING_MODEL_ = `\n", - "\n", - "> Note: this notebook assumes the model and categories are under /User/mlrun/examples/" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "from PIL import Image\n", - "from io import BytesIO\n", - "import matplotlib.pyplot as plt\n", - "import os, requests" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Define test parameters" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Test image:\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAQUAAAD8CAYAAAB+fLH0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOy9WYxkaXbf97t73LixL7lnbT3d093TPTOcnhlO05YhmqJNCbZomKQtE7D9YFiSQYsgIALis58EGLBfbAMiaMMyLC6CbUqyQWlI26QEGeB4ZsRhs9fauiorKzMjM/bl7osf7j1fRlJsUpTYVj/UBQpVlRkRN+63nPM///M/59OKouDF9eJ6cb245NL/ZX+BF9eL68X12bpeGIUX14vrxXXjemEUXlwvrhfXjeuFUXhxvbheXDeuF0bhxfXienHduF4YhRfXi+vFdeP61IyCpmk/omnaR5qmPdQ07ec+rfu8uF5cL64/2Uv7NHQKmqYZwH3gh4FT4NvAf1AUxft/4jd7cb24Xlx/otenhRS+DjwsiuJxURQx8MvAj35K93pxvbheXH+Cl/kpfe4h8Gzr/6fA93/Si726Wwx6XQDyPAcNKCj/BgzdwDB0siwjSVMoQNM1irxAN3SKvKAocvI8pwQ+BZqmYZomRVGQpCmGbqDrGpqmla8DdE3DMCzSNEHTNErUpKHp5Ws0NAzDoCjKzy//LtB0vfwOGmi6Xt23oMhzDMNA0zTSNKUoCvTq/xqUf1ffK00Tsqx8Vl3X0TWdLEsxDANdNyiKHICigCzLAMiq71SrOeR5+bxUQ1XkBVAgwE/Ty3sahkGW5RTVmOTVZxUF6IYORVE+q1Y+R3l/GacMTdMpioI0S9F1HUPXybLr1yVJQp4X6n6apmFZVnnPolATKeNejvP1HJX3zbbGvxpXtHJsqvtn1fOlaVbe29BJ4hTPqxOGYTkv1Xst2yLLMrI0LT+XAtO0yfOcLMvQdZ0sz6s1oaPrWrX2CgxDJ00z8jwjzwuyPEPXNPK8qL6PhmGa2JZFXhSkSUIBGLquvn+5hjUoiutn1fVyWVc/K7+nTV6tafn+um6gaeV3ybIMy7bQq7EpiqJaV+W8lmNerdcsr8aarfHV0ar1VRSQ5xkywIvlio0faH/Qfvy0jMIfdLMbcYqmaX8R+IsA3XaTn/3P/iPyPCeOY2q1GrZtk6YpYRiyWq0wDIOdnR00TSPLMvI8x3Ecnj9/TqfTwfM8PvzwQyzLot/vlwNqWQCsVisAXNelXq8TRRFFUVS/N5nNZnieR5IkauDFoGRZRhzHtNttbNsmCAKKoiCOY3zfV9/D8zwsyyIIAmq1Gpqmoes6tm3j+z6GYdBoNNRrIFXfKwgCsizD8zzW67WMT/WsGp1OB9u2abVaZFnGfD4HwHEcsiwjTVMWiwWmadJsNrFtG8uy0LTSqF1eXpLnOe12mzzPSZIEz/PodDrM53N0Xef8/Fx93zQtjdP+/hDbtplMJpimyWazUWPVbreJ45jxeMzdu3fxfZ9ut6vGO4oiGo0Guq6r58tznVarhe/7nJ2dYds2tVqNLMtwHEcZYNfSMQyDnAJDt0iShCjNSLOMIAjB0InChG6ri23bLBczXNeh3WwQhj5JHGJZBroGvr+mKAqWQWn8dnd31bp4/vw5AJ1OB9M08X2f9XpNnufcu3ePOI5ZLBbouk4URcxmM3RdZzgsx6UoCvV8UG6+xWJBFEX0+31WqxWmaRLHMbZtV5uzwPM8tc41TSMMQzabjfoMWeNpmqo5y/OcVqtFkiRkWcZkMsF1XWq1GhcXFxwfH2OaJvP5HNM01e/SNCVNU/I8J01TptMppmnyK//Hb3zi5v20jMIpcLz1/yPgbPsFRVH8PPDzALePDop6va42e1EU1Go1Go0GeZ5zcXFBEAQsFgscp/SSsnlkkFqtFsPhkCzL1GbO8xzLsnBdlziO0fXraEk8eRyHQLnBxFvJe7IsY7PZqL+LoiAMQ+XxWq0WpmmSZaWnW6/XZFmmjE+e54RhqDZZnuesVit838c0wfd9bNvGdV216GQj27aNYRikKcznc/b391kul2RZRhRF1Go1er0eQRBwfn6uvnscx+o18ly6rmNZFoZhYJpm5d1LY1av1zFNE13X1Xe1LItOp4NlWei6rl5Tq9VIkkQZnjAMsSwL0zTRNE3dW4x46YV1hZ7iOCeKIpIkwTRN9Zl5nqsNk2UZmV5U7zXLcbAd0vUaNJ1aDaIkI4rWaJrGdDqlIKNhNKh51ZgHG5pND0PXCIIA2zbQwkgZA5mjZrNJFEXKaMO1Ma7X6xiGQRzHNJtN0jQljmP1R4yBrBPDMNRzyjjneU6v1+Py8pI4jtW6cBxHzXer1aJWq2EYhnJKYoCLoiBJEqBEH5vNhjzPOTg4wDAM1us1URTRbDYJw5BarYZlWcoAFEWxhXQLhZLg93no33d9Wkbh28DLmqbdBZ4DfwH4yU96cVHkagGJVb66umK1WpFlGb7vqwccj8foeulxdF2n1+vh+z6np6f0ej3yPGc+n1MUBZvNBsuy1MLbntQkSdB1nXa7r9CBeM1Op6M2mMB9QS9RFGEYBo7jlANomuXCLAo6nY5a3OXGN+l2u7iui+u6pGnKw4cPKxhbqO8gm2o4HNLpdG5s8DwvN/RkMlGbMgxDfN8vYXCWYds2zWZTfVf5fjKWzWYTXddZLpdoWgniJpMJYRgqI2Hbtlq4sig3mwWe5zEcDplMJqzXa7X5gyAgSRLq9TqTyQzbtkmSjCzLaLe7TCYTxuOp2iClQS2RheM4HB0dKW+o67r6W9M0krQMq4oiIUxSNHRGl+Xzo5ukaU6r0yXJC1zXKw27rrFcrEjSGKdWp9VqlQacAtN26PU8dF1ns9mQJAm1Wk0Zu8lkosa/1WoRBIEy+rZts9lssG2b4XBIHMdYlqVQWhRFpGmqPs9xHIUCxICKowuCgCAIME0Ty7JoNBoAakMXRYHjOLRaLRaLxY31mGUZQRBgWRaPHj3i9ddfxzRN3nvvPYVQfN9nd3dXIezFYoFt2+WYVs5T1/XSKWT5J27eT8UoFEWRapr2nwPfBAzgfyiK4r1Per14UNkIYnGvIXTp9afTKbu7uzSbTQXD8zxXD351dUVRFDSbTQzDUAu80+lweXmpFqh4AsuyWC59tcCbzSbdbld5kO2Ju7i4UO8TzmAwGJAkCe12W3nj9XpNv9/H930WiwWLxQLLsmg2m8qwrFYrHKfG8fExWZYxm81oNpvs7+9zeXlJURTcvn2bMAyZTpf4vs+tW7dYLpfKc61WK1arFUmSEAQBvV5P3ce2bbUR1+u1Wohpmqowx3Vdlsslu7u7hGHIxcUFrVaLer2uFpC85smTJ3ieh+/7HB0dKa8jCx/AsixarRZxHLNcLqnX6yoMkxDEdT0GgwHtdptWq8VsNgNQENc0y+VYaCaFppOkCXFUorAgSrBrdaaTGUmS0Ol0efjsEa+99hp+FFOsNZIoqBBCgR9GJElKkcNivsRyS1TX6/WIoojxeKyQ0GAwIMsy1us1L7/8MlEUKSQlG3y5LOdBwkLHcbh79y7z+ZzVakUYhtTrdTzPU156Z2eH9XpNkiRYloXneQDKe3uepxxNHMd4nqf2QhRF7O/vEwQBvu8TRZFCxPfu3SMIAqbTqUJkgmZHoxH7+/vU63VWq5V6v23b7OzssFgsboz1H3R9WkiBoih+Dfi1f5bXGoZZwTwbx3HUZr64uMD3fXZ2dlT8ZlkWURQxmUzI85yjoyPG47GCejKBtVpNWfE8z9nf3688b65iuTiOFeIQsipJEhUXynfSNA3XdSmKgsFgoGLP2WxGrVbDcRx1X7HKjUaDJEkwDENBZtkwEn5so5A8zxmNRoqou7y8rLiCjTKWpmmqeLTdbrPZbBQMlo0lSEbgruM46h6Xl5dkWaa8V7fbVePgOI56j4Q6woPIIhaYrGma8mK9Xo+iMCgKjdHoSoVscRypTdXt9slzaLfbLJdLNpsNcRwr79lsNtnb2+P+/fvl76KMl156icvLMce37pAkCZrhMJlO8bwGs9mM8XTCrdt3ePjoMc2GR1Fk3D4+5OzsFNsysc0SJsdpory6cC3L5ZI0TVUIWq/X0SvC+OnTp1iWVXIVy2X5GdXYbxu6JEnodrs0Gg2ePHmiDLHwVeKUBPXVajWm0ymu6yoUl2UZSZLg+74KqdI0BVChgKBOcX5JkrDZbJQhcRwHx3FIkoTd3V2m0ynz+RzLstjZ2SGKIi4vL9E0jcvLSxXuFX9IAPGpGYU/zpVlqVqc8/lcTZ54doE9ruveiHsbjQa1Wk3FrYPBQJEy4imh5B0mk4myqkEQqPfoeqEWjCx+8RRxHHN1dQWgNtBsNqPT6SjmXzaxbdvs7u5SFAXn5+eYpkm/36fT6bBarSpGPlMWutMpjYYsAokzHcchDEO16dIUtSAkBJEQQIyYkEriAcUIAIogtSxL3W+z2WCaJnt7ezx9+hRN09TYZVmmsh2bzeYGqto2ILJYNU3DtusKWQi0TtNUGVIZ+9FopMjSxWKhjJcYvbt377LZbDg7GxNGCe3OgJUfkCYZ56ML1msfy7a5vJrhtZo8f36O41hs/IAkTYnTnE1Qzt3a18tY3XIoCg0/8Fkul1xcXNDv9xkMBgpZNhoNTNNkuVwq4yeEo8yXoDwZnyzLOD8/V+tNNrGMV1EUXF5eslwuFQ/mOA6+7yuEkqbXZHNRFMznc3Z3dxVfIKShOMKiKHBdV4U0YRiqdStzXK/XgdKQCffU7/cVdyLO6P/38OGf5xJ4JASU4ziK4ZVNXK/XFZwHlOHwPI9Go3Ej1haEYJomYRjeSBVKXFnC6KaaKCEH5T1ivW3b5uLigjzP6ff7rNdr5bG3WX6BlfP5XHmD9XqtUAhwI6NRbihbLTzZlOKlS4OYKub6OmWoq3vKBpaNKIhKPJHcU8g8uZemaco4CCkmWQB5j2layjgKAlgsFsrQCDrRKA2VW6urZ1oVa6IwJs8KhQriJFKpySiKlMcVr9dut6txMzFNmzQNIa9SfOhlGlk3qxDQIAh85osFO8O+Mjqe50GeEoax8tJJNafiYCQbIuSizI2gInlWuEYJsp5kDYkxl9+FYUi321VjblkWYXhNYkvo4vs+V1dXNBoNRRDKvEpot01WOo6jslbT6ZT1ek2321VOURyErKflcqnmZ7PZKOcnSGcb7X3S9ZkwCrJQsyyj2+2qB9zeAGIthSkXyC4PHkURq9UK13UVxBKGXogxQRvCC5Sf4/H8+XNl/QVWOo7Dyy+/zHq9Jk1TFQ6UcLjLaDRSsF8mTMKEba+xXC7V4hBEEccxk8lEcQBFUShiC8C2bWzbBiCOFwr+isEKggDDMBgOhxiGwXw+VwhCOIVtjydZAiHEJPYfjUbcuXNHGS9JtxqGUZFWfRqNBmmakiQJy+VSGeXBYMBisWC1WinPKPer1+u89dZbfO9731Meq9lssre/y3w+V88qaVJ5BgnHvGaLdrfH7MkTWh0PP4zwg4jVakOcQRAnLFZXzCbn9Pt9Hjx6SLfd4eBgH69eo+45xEFAlMTUbEfpJcTpyMaWMFXCTOEb0jSl1WqhaRrj8Vg5pjRNaTabKs04nU4VAhwOh8oLSxZGeIQ4jlUGql6vK+QlhLcYciEykyQhSRLW6zWu67K3t6dCHN/3GY/HuK5Lr9dT4SlQhXLXYXYQBDdSn+12W82TaRqfvB8/rY3+x7myCn7Jho+iiOVySa/XA1CEzHw+vxbyVJtEvJB4Rhl8QQtRFCkDIAy3xGpRFOF5ber1uvL6wgC7rqsIKMliOI6jNr9kN+I4ptFoqOyD7/s4jqOIUwlNBOqLtxYOIk1TFecLmy+stqZpN7xXu91G0zSVOViv19i2rVCA53lomqYWtni77fGSlJdlWXS7XWXExBMKLyJpX/k9XEPSMAzxPA/P80rPrlkqKxLHMcPh8Ma8TadTxa5LWCebaT6fK9Ze0JVpX/NBq9WK6XRKEAREUUKuBSUvk6HuOZ2WoZa3qGOYGlkeYRsGFDpFJYQTzkmgthgIMb5CaMs8y5wJwbqd1hPjnySJMgIyPjJXEmZ5nsdsNiNNU0ajkeIRZH7kvrI+hcOStK6kumXuJH0t611QgCBgTdNUilMyDYDKsAnP84eVN3wmjIIs6M1mowiaZrNJv99X8HJbvJPnuWJVN5sN3W4Xx3EU4bYzGNBuNvnoo49wK/2Bv9koS29ommJ059Mpuq4TxzGd1iFRENGo13Fdm4uzk3LgtYzID0uP0BsA4JsbBcvDTYBj2ZiaQb/b5OnTp4qAjKvFLRthMBgQhqVll80gC1ZQiry2KApcpxS3uK6LoZUGptOqq7g0jkMso8Bx6yrXLeGGCKLk3+Kd47Dc7INeuyRUNwvqNRNTLw1BGEW0Wi0MLLK4YLKclZvJqKHbJovpisvzsTJYhlMqJtM0pd2pUxCz8efUXIONP2dvv08cx6xmU4oiQ9fBrOU0vBpRnOPUNXaGuyzXIWmaE24MPvrwPpNZmb589PgBeVGAlnNxdUmrVaZY/axgfTXBsQwupwv8KKQ1bvDqK6/QajaxTZNWqwF5gdvzmE9n1cbVGHT6zCdjNoFPr9vBNA1WqwlpYiieQSlYK56g3W6zWq1KRGCZkGckRU6ua0yXC2W47bpLHobkuka33SYIAmazmUJ8lmXh+z6dTgcoDVYQBKzXayV0cl1XCeGWyyWr1Yr9/X3a7TZJkjAej5nP5wppSmpVQocoimhX+2e9XpehWlFwdXFRGqXPOqega5qKp5rNJk+ePFExsugUgiBQMHU7zhWyajqdqnzybDZjsVjw+c9/njiOefPNN/n2t7+tYljxAALv79y5ozbTwcGBivN83wdKL9tqSk65TIN6lVCm/FlIHEdAQc31VEZD4GMYhsxmM6Vcazab+FVuWkhC27Y5OztT7LSo5wRqLhYLBSG3oeh27Co/k3hXQq7tZ3Ech8VsqbI7/X6fo6Mjzs/PVWpT0zRGoxFhcM20i9GVfL3k8OM4xnIMhfTE+7uui2EYSrHY6XTI6xlBsMGuWQx3ShQYRBGu16iMYin2WvsJjlvDWlt885vf5O692+RFQZyE7A6GzGZTwjCk0RkQRVGJqoqcJFiznM2xDAPLfJl202M+L9O494YdtY7+1L/6A7z//vs3hEci2Lq6XCoUIZ5WREau6yo+RM+v+a/tbINknGTzXl5eMpvNFLIUJCBpZTGswnPJuC2XSzzPUw6i2Wwyn8+ZTCYMh0PFETSbTRW2SdpbkMfjx49vcBMSfpdCq08ue/pMGIUsz6nX64r4kkkZDocURcFisVBZBxk0UW41m02VkvF9nzRNmc1mCsZNp1Pee+89Go2GuocQRRKKSDwtXlXkvhKLlcpE/0bGQWLTkgA0Kw9gqPSThDICNyVskM+XxSBIQbIVi8VCvUdgrngsIcYk5SrhQZ7nRJVmQ6C+QFsxIBJWAIqTEOJM7iEpSF3Xubq6Uqy5hEu1Wk2lM8MwVNyOZhTqsyQsE6Mtz21ZFlmuESUxhZaTpQUZlRa/0IjjtILWKUEQ0+v1sG2Tu3fvUhQZaZIQbHza7TbtdvuGilCvahvIU7QClfasOzVag5ZSxmqaQRiGPHzwmMViwd5woEIiUXlK2CZzJWHAarVSXEGSJGQUSvwUxzH1ep1arcZ4PCbPc2Vwto2+jNk2Ifn7w10xGtsOT0JaGV8JO7fHXOZH0pYSekrYIfMs6/czTzQmScKjR48wDIOPPvqInZ0d4jjmvffeU5tfILEgComLhLAbDAZ0u93KaxQqVfnmm2/y7rvvKlGTEI++Xy6we/fuKeXk0dGRMkwSc0m4Mtzp3tjcEhOmaYq+yUlTjSSJyDJTSUllciX9V6r/JsxmM+xaTTHbwvz3ej01cTs7O6RpyrLiUYRfkYW2TTDFcYxhuWpxF0WhdPcSY9ZqNUUkQrlxjo6OALi8vFSoRIip/f19HNtjuVwqIZeIxYSrEePqNtwbBrvV6hAEEYvFogqjNFarDV7NrRZ/jh+VYh80Ez9MAZ3pbMl8vuT5symr1YqPP37E7du3Kci4urqi0+ngWg7tRgO9ANN2yaosSF6khH65Ua4uL3k3zxl0O7z99tvs7e2BXs4/wHe/+11ee+01dN3EMAo2W9kIIXnFIKzXa0UACudxcXFB3fPoNMtwdjaeYBsmQZqRhBUZXoBjWkRpRrtd8laSGdtsNsznc27duqV0ESJ3FrQhqUWZY8Mw6Ha7KnW6bcQkHSlZM5HDHx4d4ft+mV0zDOLqGWVNf9L1mTAKVBBJlFeS9hJSZDQa0Ww22dnZueHhhM3PskxBaE3T2NvdZb1es9lsCIKAdrvNycmJEpwIzBY2VrIYMphCjL300ksEQVBZ/wxd18iylDwvB3e1WipG3/PqVSza5vz8XHkAKbQSjmHbO4thqVUGAlBFL6JuCyq9u6RcBabKs0pGxXJKQkx0+ZKKkj+CSFzXJfRLUY4gFMnwSFwrqs7AT1Sc7DjODa2/oKA4jqk368qriYcTr5qmKb7vU6vV8FdrsjwhB3w/wLTsEr0FGZZls1lHzKZLxa7L+N1/8CFpnLAzOMYwDKbTKXWnRq5rmIaJrhVEUZUmzAuVoRkDFxeXWJbDzvGAOCqh/cHBkUrJCgEscfm2LFu4BTGsYji63W5VnBUoLyyaAEGbYqCpEJimaYpTkLBKEIDMvfxsOzW8ncKVdVtumUKhMdu2lbMUByMIQ/7IPAjB+5knGsXjiqy22+2qYo8wDDk8PFQKs9FoRL/fV6TKdkGPpNukFuHq6uqG0Ec+Q8jL8/NztQjCMMRxHCX02Gw23L9/n+FwWMWVCzabDcPhUKkDBYZL1WBZDLTG930ODw/xfZ9nz56piez1ego6GpbFyckJm82GwWCgiEMR9Qi51Ww21XOen5+r6kaB6MKW1xtlpZ+w1o1GA9u2efLkCf1+v+QxKuXc3t4euq4rskpgpvAGkt5N4kIZgyiK2N3dVQt4MpmoLE0QRIpJD4JIIamyLiGuaiICHMeq4GzGau2z8UPQTbxGlzTNmc1XPHz0lDyH19/4Ah9//Ij5fE7NdrBdD8swSKMYs9DwnBr93R1ms1lZodls0nRd/CgkiUvjFIUxv/O773D/4SN+4if/XWXcRlppSKfjy1L8o1tKeLXZlHqZq6srhQo9z1NVpGJka7UaVlWVuFMhCdMwyLMMQ9fZVKlsMQZSZ+I4jor/DcPg3r17SnHoOA6LxYL1ek2n01GZKNd1FcIQWbyEw4vFQvFh8plSf7OYT0uVaoX0jg73yzWv65jGZzwlSVWMsk0girZ+Gw1I3C3lt5ZlKbUgoCSoVoUmBO6L5kHiXbi2ykICCZchWgdJz0l6NMviG2kpsebiFSQVKWToZDJRqVJZCGdnZyr+lFoL0QBILlzSWrKBt2XKAn8ldBLUFIYhfjhWJJeoNgX2y7MLF6OTKqJqG56K0lDKnpuNrjJWUmMhMa8YHYGvgk6ExxAoLBmV0oBapHkIWvk63TK5Gs8xTA+v0eLk5JQozND0gvF4rDQBrVaLLE6wDJONvyyzB70+/sanyHKaXgPTLpGmlhfUbJugcihQhqcff/wxtmnRaNTRdeOGWCiJYsV7uK6u1qFkbIS9FwJXnIqMjRCHIjDbjvPlj/AM2xWlvu8r1Wccx4psFOThOI4KC4IgUIpLUTFKWllety30K0luF8/zGI/HimT1PE850U+6PhNGQddK8mU8HlOrlYVC24MknvPi4oIwDLm8vFTst0yATEiWZdSqRSqLdbPZsLu7C5TSXfFwWZZxeHjI1dWV2mBSjCIxG6AmplTxFUSRj6aZiu0tc/oB5+eXKhyRnLLU2gsBJFWV9pa2XTZRXhGuMmlZlrGs1JGapvHqq6+SZZmqNNyW40ZhpBafiKxk8Uj2Q6pLiyxSYyoCGNHTixgriiIM3b/WylcEl3zmcDhUEHftB5ydnSkj3Gg06LRLWfh0M2UxXzIYDPCaHqt1mbpbrktS2Kl53Lp9j9/93nt84c2v8HvvvMfXv/F93P/gQ/YPD1hMZwwGfTqNJhfPT2m3Wniui6Hp9DsNYs9ViFIrwHPruJ7H6GpCkmSs/YBs6fPd7/4Ot4+PqNfrHB7skaYZbq2E+qEfsF4nuG5BFCXqOaT+xfM8VawmG/bZk6eYWmksDTTSan5lvdqGiZYXNDtthsNhVQTnqLGVuF7GXQyskMX1ep1nz54pPkrCRJH6h2GZIpe0tiBV4YXCMCRPIy4vFvR6PfrddlnUB9Ts2mc/+5DnmRJ4CCwSEk5SKWma8sorr1Cv1xmPx3zpS19iuVzy4YcfKvWiwPSg0jvIgEk5tUC/8p4lkrh37x6tVkvVGoggRwRLi8WiNDqaTRzlpEmpGbh393aZBl1HShTi2B6mVdYbiLRZ6iGExJLy4yCKaLfbCu2IUEieQd7fbreVjPbq6krFi/Iz8ViCWhqNBlEU8fz5c6XGlDhSkIFlFIp1Pzg4UHUTtm2r7/T06VPVH0JCLCmpbjQaLBbl5i6zBDb37t1T5bpSMCaoSQrKDNui2e7iOBZXk1Ky64cRf//XvsmHDx7z1vf9AEFQ5uDPL0ccH+zTud2i4daIwpBXX32V6dUYLc853j9gNL3AMQ28epswcCkKDXSdpEJxjUaLVfUMk8kEx7LZ39/FqzfZ+CtM06o4nbqqC7AsS6Uni6JELJeXl6p0fTt9KfyNOJjtoitJRa+qorUgCDg9PVXchPAJ22O+LUdvt9vs7u4qJaVwUlLiLTL8zWaj0s3iGCWtnUQblXETY+W6rkrHf9L1mTAKoKlUjsRr291s0jRV5b8iGxXYLNBblIe2bSu5pyj+RKcvHk/gn1RbSnGJWPDVaqU4Dglj4ihXAynfR7z6dDpV0JIwVaRemqZ0Oh2FOlzXZbValT0W4ph+v69QQUlcrlS4IHGhhCG7u7uKSNwuzJHwwKhievFGImUWQZhs6jRNaVR6h+0KPUE9Uv6raRrPTs7VM0t2QkIt8WxhGGI5Ndrttop9t0uAwzBUYYB4NwlnAHZ29vjVv/M/cnh4mzfeeIOnT5+pcYPrui/oJsgAACAASURBVIHh/gEaOXmSklXQu1azKYoqNHTKkAZdJ4giul2dPIe8KMiygk00URkM0zTRtfIZ6nUXXZPGKjUsy1FEsOu6dDodFouF4roEjQqHIq+V8EOQn0B4KW6S/0s4eV1NGqu0ofA60q1Lq0R2wl0J7yFrWDiL7RSjlHLruk69ZipDsl14Jgjvk67PhFGwLIv9/X1WqxXL5ZIHDx5QFAXHx8dqAbmui+/7jEYjdF3nu9/9rtKFCwwTAY14XTEoBwcHiiCTiRL2XHLH4v1EWahpGnt7e0r/3ql08U6tjl0zuZqOlJah2fFUyFF3muiaiefVq8WiEwQxlmXi+yvQEuJkQxQG5Fmd2XJDEmc06g7Dfkm4RVFElhY4NQcdFHw9Pz9Xxk44DCEkL8fnpQpPK0m2w+M9RqMRnV5TZS/Ozs4wq4W5nbPeJk5FxxEEAb3hQNUlaJrGfLUsC8eaDfr9sghJagPee/9djo6O6A96TKdTVUmZjzKOj49L9OBr3DreRytyJhdXdBwP/2rCXm/A973xZe4//hijVseoWbz2xpdYXo159aV7vPWlL/K//53/FUvXSeMNug6tQQeNFpPJhFarxXK55Hh3WPIypoFflKlgq9ckjmN+7+M1RVwwHs2ZLUI63T6mAWESslhM8FybPF5wdPeL2LbN48ePqdVM4thkvS7Y3e2jaRlRVHZp6vf7yquvVitFYm4Lmfr9Pp2woxzX7qCsj3jw4AH9fl/VkozHY3INhSa3y62Fj5J05rZsX9d1JWqS+hbJQBiGwSZIiFMwLJfeoCTg0xyipCCOk0/cj58Jo6BpZSpuW/Jbr9e5uLig0WhwfHysuATpaCQiHYHTQso1Gg1a1UBLfr/sS7AA+Kd6NmxLS6XHoIihzs7OlMUWAY/cU1JB0mhEoRmvRDP1ust6vVZNU6TJaRSHKqwRMtDfhNVzJ4RhabwcuzSCUdUuTgq/tuGneGZRv5mmqQqWJKQQL5Omaak9cBz0vFCoSDyPNOAQg+q6LtP5WvEyYkylVFgQnaRcO52OGgNBZ8KKb8PlxWKBTkWWaRrvvfcBr7zySslt1Dscxhm7u02+853v0G80+drX3uK//xs/z8HuAAMqXUfpiaOwbDgjxHCeVE1dGhah76twRpR8QRQqhBiGIXkWE0cbimoNBdV7xJvLeEsPDc/zrsVhYXYDggvnIu8RgnW7fdt6va50HC1VwyBefx34ivzVNE3VLEh4ImSj7/tKsCeVkrpe9gOR30vWQhCM8BDiQCTM+KTrM2EUTNNS3IFlWQpW/9iP/RjT6ZTvfOc7pGmqQgeJ/SSmEhZ2tVqVhmO9plYrIa0Us4hx2IZ2uq5zfHysqgylwEm4jE6no4qQvGZTtcOS+4pysoShdY6Ojgg3IWdnZximQLasarHVLDdQelPoMxgMmIxniuHWtNK49bplarRYZaqYRr7X4eGhUnkKyWTWHC4uLlSnp1arxa1bt7h//z7r9ZrJZMJbb72FaZo8+ui+gr0CbWVziYGdzWb0h/vKOwGKjW+1WlW7tjLsGo/HAJyfn6u+EkEQqJDs+fPn5HnOzI/YGfTJkpRZ1XBkupgzXcekuYld7/Dx0xPefWfN3bt3efurX+W/+2/+Wz7/8kskoQ+UCtYoLb2l53kcHR1xcXHBcDhkOZuXJG+WEzWbKoWXZRnddg1jbVAUGc9OnjC+ctnbH0KRMez30cnJs4STkxPFsUwmE+r1Ot1uV2WihMsh0xU/Jc5MKiBFoi8btSy8K9OaEjoIud3r9UryVy/DIOkqVhQF0+kUTSsb99ZqNXzfZzqdAmV/T6kFEg4iiiL1HaQxrmSjtkOdMlz9l9B56Y9zFcV1gZPEVcPhkI8//ljVJhiGoarMRFUnTG2SJKp5qcSBsrjFS8rrJCaUrjuSphRDIxJXyfmKhRWlmLRek4Ug3IZ8F9cuFWlZTjXpfVW4lec5QVgu1O0yVokvSy4jVykrSZvJs4gXF9h6eHio0I7j1HCsCnpmOXEYgV2QJSmWYRLlIc+fnapxE55FkJBAXxHwyGYXtlwktKZpVkVdoTK2lmUpsZikeWUhiscTGbiu65iOQ6fXJ40TLkZXtHu7vP3220wWG27ducP/849/nTe+8Bo/+7M/y3/4F36C+XRGEmxAy9ndHdJr9SpjbajvJwKePM+p11ySygtLyzrTqdFuNtCratvVasXe7oCaW1WIpmXtxSZcqmpDCQV0XVfckBhCx3TVRpOsgDgnQPFDwqHIZhVnICSuiJJEkCbaCNGMSJGbrBEhO6Vnh2QaJPPheZ5qPyAkr4jORJEq4ccnXZ8JoyCl02IhwzBULa5kYrZTL4CKoyRnvrOzo9I7WdU30TTL9u0iNZZQQyCZ5Oa73a4q7pEOQEVR8PDhQwXRXM9TElQhGaXjr5B1SZLQa/fKttujs4q5vqDb7bJYzMsQp1Z6cckknJ6e0mp2VIMXQCkFt3tICKciEDMMQ05OTrBtu+RDKqlyt9tV3MB0OlWh1507d1itVvR6PTaVrFuKaaQtXRRFqtvP3t4ehWapjS0EmtxXmp0KIrNtm1u3bqkU8HK5ZG9vTzWkWS6XaJaFYZRNWHTgo5MHFJrOm29+iQ8++ICT0xFJlvLn/9yfZTlf8Nf+6s/w7OPH+Os1+zs7zBfT0jD3usyXCzy3wdOnTxWRuTfcKbkkNNK4rJ9wXZfpdMp4tSLLM3qdDmeXl6xWK27fOsR1y/e0Gk2yJMWPSuMt4qH5fM7Z2Zmaa+AGcSdGVhCXOAqRy0saV7I2gsaEyATKdvD+dU2OaGO2pfSi1wmCgLt376oKSqUWrUKf5XKpMnm7u7tEUaT6MkroVGohPnk/fiaMgq7rPH36VFXTSRpvu9uRV21KafcudfDn5+c0K6jYbDZLqGXbPHr0iIODA2U0ZKDECgvJ6HmeamMmiEEMieM47O3tUavVWFRts6Qtm6QdV6uVgtNpmjKZTJRqsIx1U15//XUeP35EkiScPj9hOp2qhed5HoEvfRUzoqiMw2fTJyRJws7uQC1AsfoPHjxQ36PZbKpFm2UZaRxTr7I39VqNy4sLAIosY9Drqc5R0tREhE4CNSXFZZomB0d3VKZB5N/bjWDr9boixiSWlhj+4OBAGfQwDMvQqmq2cn5+wehqwqOnJxwc3yGKU17/wsu02z2+9847+Ks5Tx7dJ/R9+s02EfD89KREY3WHk5MT4jSi6bU4PDxUhsnUSmK57tbZ29tjs9koJn6+XNJoNtgslqznC9Is5f79h2w2G/Z3Ki7JreMVKMckDmBbQt9qlQVWjukyn88VcpQ1KGMpehEJCeLKSHmex9XVFfv7+6zXa77xjW8wGo2w3RrdbpfHjx+r14rjEIchXNvDhw/V31ITs1qtSoK50t1Ihk3SkaPRSK2hsvFO9In78TNhFLJKnyDx32g0otfrMZlM1IaQ+EwgrEBygXnSXSkMQ6aVGk3IMOmdkKapQhxSEiyfIZA9CAJeeeUVNamS3gyr1JHwCpPJRP1OauzjOCaISwsuPEWSRKzXaw4ODkrF4LKUqK5WK8WdjPOpSllCyXfYVk2VzYpiU4yWTLYUfW2nx7ar5yzLUm3vJfx6+PCh6iok6TBZ/OKNpLRcCCn5ufTElFblEsNK2CGEq9SwNBoN1SpvZ2eH6XSsDOI7v/cep6fP+cbbf4qsEP1Izg984+ucntzHNk2Gh/vEQchiOWPYH7C7O2S1WWO7Ncz0uuZFILVj2VV+Plbj0Gg0SijuufhhzO27d/HjCK0KC/QCkjhlPl+i5RmdfudavGVcl0Nvc017e3skYaZCI0ApY6VWQSpsf39losyFELiq+rTTVjUykp4WYns7fJBshHA6g8FAaSO2UZ0Y622id7vpiqZ/5nUKsLe3p5hyOblHPFAclyf1SP58G/JKr8U8z1Ufg6BCDVKBJiy7TIQ0MtkuCpH229uFJPP5nA8//LAUOX3ucziOw9XVFZZllem+6sCUOI5V56SdftlB9/nZs0r5168IoonK4W8rG8tQxqty4AW1WiU71stJ1o3rpqHSbEPkzkKG2bZNnmbEUcTz+eJGzLi7u8vz58+Joqg8PGbj31DWAaoIrVarqcKrdrutMjYSKu3s7Kj+DZqmcXZ2phrZStmw8C1FUSgp+nw+Lw26mdNs1JlOZ+X7BkO+9d3vcefWHeIs5R/9w9/i4OCAV++W9Sbnp8/YzJe0Gh6mXqLCg6NDWt0Oj58+YW+4c0OCHW5K8s2yLPwKpQyHwzJn71hcjSecja9oNRpM53OSJOY0TWi1X8XSNCynpjinIAhKwreqXJXMwnQ6LUVKRll5KmHDtmxZivDKvhueWsuiO9guVHvnnXfQNI2D4yPVh0LIxm3+Sz5bPs80yzNFjo6OlAZFWsRti9gkKydGQ1oQ/GGnwXwmjEJaFXlAWTIsQheRbsrgCKyyLEv1vN9ukCpwVYQkw+EQz/OYTqfKewmbLlZXioikNx7AaDS6riisKhNlYUun5v39fYVkhLSTIiNAHUYidRpywEhBpmSqUuiUxGllZLo3ZNuysYTMErZ5Gxoul0sODw/VYhHtu2yURqPB4eEhy+WS+bzkNZbLpeJTRDSzXRIttRzTaXlkmu/7qoJUoKyo6oIgUMZYdPvSOUiMDlRquzRBN6s0cp6zni8Z7hzghwHPnz/Htm2+/MUvsZk9YToZ8/z5M7rNFvWq1+aqImslnbo9n77vQ3XGZb1WxuqCIAFMHXaGAx6fPAO79PazxZzFojyxq1N1cxLeRJCBZKQAdeCO53nYRk3xUNttAgWhyPyJJkTmTfQzsjlnsxmmaTJ//31FJEr2SFCcIIXtGgf5TEG6QnhL6fs2hyaoRbgMEUt90vUvZBQ0TXsCrIAMSIui+KqmaT3gV4A7wBPg3yuKYvZHfA7rKo24Xq8VXBYvL/nhTqej0kwi3pFuQLJR8jxnMBhwenpKnpdNVvb29hTUF9JFcuniESRXL0fPiWUWWHxxcUG9Xuf4+Fid+ZDnuWqrNZ/P8X2fQbc87KSgHPynT59W5cetauKiGyFQkiRYpqMsfZ5XDVLcsjbh8vKSfr+vJjRJEnZ2yupA2eCmaaIVULMdtALSuDx3ol5zWS2WzCZlGst1arSbLZb+WpGSEqIIiSaHmkhjXCkfTpIyXSeQXI64KzmCc6XEy/Oc27dvYxhGKZaq8uthGGLkIXE2IU0T3njjDX7jN/8RR26dn/6pn+ZXfvkXuXXrFqenJ6zGT5hOp/Q6bXrNDr6/ZjabcPfuS9y7dw/brREmseKRhOPotkoSerVakSaJGq88zynSjDgrjdncD+l2OpyPLpjP54xGI9rNFrpmYBgo5axpmiwWCzqdjqofETQVrCOVMmy322ptXl5eqpSkoFjRb2zLmKFEx/P5vOz4NL0+AUz2hPABgjCLorgha47jWFX9yr6QsFGMiGTJRBOxs7NTGZ5PNyX5g0VRjLf+/3PA/1UUxV/XNO3nqv//tT/sA9yaqxRicjiIeK6iKFSXYzkGSzIHm82GxWKhat63F7dIg7ebjW7LfmVjivUX5l8mUNqAt1otpZEQ7ytxn6SrttvG5e3Sky2WMxXjaZrGkydPyknZHahFLCKqNCmt/Pn5Ba7rYRgGuzv7ZQvwyFcNVwQdie5euBa4ViZKmmob0o9GI0UkCokorcLEsG53bBISV8ZRQqP1eq3CF8mXb2s+AFX3IOlBSbHJJqk3WpyNnrG/v49hGHz+85/n3XffLcfVNNG06y5FaRQzHZXVkkdHR4xGIxabNUbNJopT9oYDJQmG667g8r0kvQqwe7DL+eiCi8mMVsvm5ORElabHUVpVqIYMdzo3PLKsCyGnhfD2V6EKuaQtXrvdZjweqw0dRZE6I0S8PqD4LjEYIioSZCHk73ZaXUhmKBvkbJfbi/ZAEKsgge1eHZJClvv+YdenET78KPCnq3//TeC3+COMQhLHpNWG1TQNvTryqt/vYxkGi0okNB1fqrp0KCFhqyOQOmY+jaqJuW7JJRay3W4zm83UQEqKabmcK6t6TZJZOI6F69bYbFakaUy93qBWFTTpQByGvPTSS5yfn5ekYhzjuS6YFpso5tnZJe12WzWktWqlCGoTaDQaXbQ8pu6WCEhztcp4XQurlqs5frCm1Wrg++uKAygN1TvvfE/lvI+PD9E0mK/nZWYhLFHAydkJnlcamJ2DHbV47LoNeaEWrvSPePb0yXXNRBjgr1eYVlkHgaahGwZoGkfHxyUxVvE5q9UKrQi5rPo99rsewWZBlgTkSYyfxBwf3y4Lkto2//dv/mMePnpGZ3CbN15+g3gV4N22yOOQZ6fPeP1Hfoj7foNXvvi1sgQ+zXDdGkkQcnZySnZ5yeHePq1Gk3SVk9kFLbtFOAu43FxS5DmDQQ+SHNOAYFMSohd5hOHY9Ns1njx9SsvK2SQZ/XaL+49PsJoD3GaLQW4TBhme18QwNPxgzWq9wK15dLtDao7L89Mx3U6Nvf2BQktyiHGv31LQ3ms4JHGmkIcUwwkXJUShpA9FBSmoV8JbQVtyzmWz7mHppaGYXpWno7lyrEBNU5kKcRrCqQnCLBHpp9dkpQB+XdO0AvgbRXmS9G5RFOcARVGca5q28we9Uds6in7QKw8k3S72kZRfv9/n/fffJ8syXn75JR48eHBDPit8gzDEpWdrq8Ne5bMkTBCvJ9kBx7kmIMWii5JNBE7SZ0DXde7evavSf5vNhpdffpnd3V2+/e1vl0ankj5/+ctfVuHK0VHZ6WdbFEQlXNku4jo8PFSxqTRRybJEISBJfQqxJWXgkv8G2N/fV5tVEMmtW7ewLIvxeEwcx/S7JS9z9+5dzs/PieOY27dvlw05qswNlJWkImDa399XRVAy3uLxkixR9QfdbpeDg31Go5HiibrdPuPxmEbT5lvf/i6G6dDdKXAcm3fffYcsjWi3m3Rbn+Mf/uZv4ftlEdXh4SEfP/yYw8NDXn/9ddB0gqoGoDBNak2P2bqEz4NBjy+8/gV0o9woy8UM27Spd1pYSYJTM8myBK/e5ODgiPPRBZfzS2y3QavR5Pz0GT/wr/0gcRyx2awIwnV5LmXFW+VZWXOyWfv4fohGqNS1aZoqsdLu7i66rqu04MJfKlXt7xcuiVZEZPWe59Hr9VgsFpycnNzImAFKAp0nqeJutrUmIsSTVLHb8JSzE85su9jq0zIK/0pRFGfVxv8NTdM+/Gd9Y7F1FP3L924X0nxC4iHZhBITClkixItc7XZbkULyoJIakvSaZVmK6BMiT4Qipqmr94maUSz7NgPcbJb56Nu3b2PbNh988IFi6q+urojjuNRFGJbqcZClKXXXwd+s1OJybJNup8XkanSjnFU8jpCVopJ0nOuzKATdSNpJUoGO46gDbeXZBEqKmEYWocDY7eP35N+SwpVYNEwLsjQm8NfEUUC71VDhUhwFWKZBv9+DPOLy8kpBUyF9BcaKwX76dESWlSdFvfrqq7z3/v1Kfh6TZymPHz1A0zPuHB0ShCGubbG7W2Yinp+eMZ5NSdOc3Z1Sfh2mCZugDB1ydOabFXmS4jU80iLFQKt0FRGGCUVxXXWpaRq3Do+w3AZXi4/Y29nl+ekJjVtDlSXQtIK6V2M4HBKFCatVQJFDu90hjhbKMErsv7Ozo05zEhJX1pSMgTgU+b8oIbeJWhHXSZGTyK6FoJY1CvxTMmZJR9q2zarKWkjVrehyVEXvJ1z/QkahKIqz6u9LTdN+Ffg6MNI0bb9CCfvA5R/1Obp2feKTZVlKtCH17FLE8fz5c5VdEKHSwcGBEh5J/L9YLJhMJhwcHGAYBrPZTPUSkME8ODjAsiwePryv8vWyiOU8P9mAJXSP1YY1TZM333yT8Xisil4Gg0FJltYtlVW4vLxUKSHZmDKp9+7dU6o34UeyLGN3d5ednR3F9sdxqH4nJd3ynURrsJ0W63a7zOdzVWDWbrcVXyBt1ybj8mzH6XTK0dGR0jIAahxM06TbLHUJ9+/f5+TkhFdeeUURpHI+ZK1WwzYdfD9QxOV8Xh7ko1FKzOU077TIGe7sM1+u+d7v/i5Pnpzw9a9/g/l8yvhqxPHeDmkaM766wLZtTp8+YbUOeenlVwiTlIPD26w2EW98+Ss8PXlGGq1p9vu4To24SBnNZrS8Oo6usX/7NkWWo00uscKQYD7F0HRcr4G1WjLo9fneu+9juXU8x+bZyROarQ61wqder9HuNJReIEkSdM2kKAyKHDodXZ0onqapIhqLolCNWMQwt1otRfQJOpVamW1eTBSNklURDkuyHdu9QQw0JSoT/qHf7yu0INycfA+pkZGam3LtfApGQdM0D9CLolhV//43gP8C+HvAfwz89ervv/tHfVZe5Ao6iZIRrpVlwn4vl5troUpF0smpTOJxS+GOUcXbx5imydXVlTo+TWSm0lRFshfbBI1MonhQCUME0p6envLbv/3bfPWrX1VGqt/vq4rI+XxOlkTEoa9Ku2WCJIxxHEf1FxSjJ0VbsrjyKj4Wmbc8g4RGIoWVCd+u0ReUJNASUAhDwjJhu0XKvVwuVVenXq9HEgX46yWNemmsQ7/sLaiTk6cxeQpx6LMMNxwdHSllaL8/UFJwIcCiKGLjB4RxSqPZ5oMPPsC2ayyXc+7ducXp00fkeZe3v/EN/s9/UB5W3u/36Q/K0On8/JIvffkrdId7xFHCrTt3IQ8UAtILcBwL07bp9npoOkRZiu24mJaDleeQZ+iGhmPZFFUzn7rXZDI/Y2cwwA/TqkQZBlbZOXk2L2sdak6dbndIUZ1teXh4qMIGgeaCAgAVGkZhpuC/hKibzUYRlsvlstzA5s0WcULOCrITQjOOYyK/bM3WbDbVGA+HQ0VEqiKsVlNVbEJZaSsh8acVPuwCv1p9uAn8YlEU/0DTtG8Df1vTtP8EOAF+4o/6IIFPUmxycHCgGoBIk8pSwDOg1WqV9QJVt6R3331XLewkSap0WckKT6dTpbKL4xjP81THIMlKmKauMhAS90uaRziITqfDaFSeUPzkyRMVwpyfn6s2cpKiOzg4IM9zLi4uVHWjdL+Bsmbji1/8ImEYlpV9y6Xq4SDtt4qiUC3rsyxRaSUJM6T4S/oHCmwUDkMau2qapmTaUVSm0A4ODmg3W0rqvD0Hot+QYi0JweSAGFFuCms/n8+ZTqc0GmXzGElNighnfDWpOhDFPHv2jA8ePSOMUv79f+fH+Jv/0/8MhsbV1Yj55JIvvPYaNdPgm3//1/nq17/G1dUVtuPy5a98nbOzc5x6m9Um4NbdFlpbZ2/vgCKPFDm3Wa357j/5NpPLK77/+7+GW6vantul+tRIC9IsxdVtGo0Wur/mzvExT09Pee3zr/D4yVPSLGcyCUjTmJpbks2aft2Oz/d90iTD90MMvUSOOzs7KlySkFdOsV6tVhi6oxSH0jhmNBop57S3t1emgZuNG3oD6Qgurd9lDQsi3s5OADx79kyFJZKhK/Tro/DEqYhC9g+RKfzzG4WiKB4DX/oDfj4BfuiP81lxFKvU0WAw4P3331dQSWoTXNflK1/5CicnJ6qsdLst1mQyUT31sqzg9u3bqtxYRETCEQjEyrIMx7FU4YywvlJcIjn6UoJdjqLEZ67rqjTj9sb+4L13aTabeG4Nre6q9vE6BXfv3mU+n3N5cc7h8S21qefzudq0kmsWCHhxccadO3cIw1ClWAeDgYo9RdM+nU5vwFUhnZ49e6ag5d27d0tthu6r0EIUmtKdWTT8EnLVajV2BqVOYqVrxGFAr9PmcH+Peq3s4NPv96nXPZUanExmN1KbksLUNIe80Pjdd95l6S/LysM0JM8yprMxk/MRtw6PGE1X/Fs/+uP8rb/1i6zWAXfuvsQP/pkf5v/91nd48vHj8rj6Z6esq6yMTilS6nUH7A13aDYa5YGvecbHH3/M1eWYllPDNnSKQk6NzqEoyJOUj957l5rXwI9C/CAiSSKarTp57lD3ypoEDQNdtwn8EMtysExDGdter6c0DHBd0JZlGflWibWEDsLLiDMLw5AovZY4l8TpQJ31KYIyCRefjp/yxhtv0Gg0+Na3vsWtW7duIGAJBYWXqtfrSsh2za998n78TCgaRRwkp+mIXl5kz1JsIwzta6+9xoMHD8pKvirdKPLSKIpYr31FAkpDFiFpNlXPPBl802yoFlXSMXcwGCiJqCCC6XSuWrlLPll6LsrBMlEUEemaar4iG1t0EaKbf/ToEaPRSMWrokBbLBbqVGwVP1bhiYQ0krKSkEJ4EpFCi/5CUMV27YLA3SSKFRsui3P7DEJphiL8guTORR0qHIcoFss6AVP1njDNiuA1rztD5XlOoemYps14NlfoJooihu02p09PeOn4NlmS4rW7/PL/8r/xfV/7On/u3/7z9Ho9fumXfgldMxmdn/HDP/zDvPvuu+zv7m01f0mp2TaWZRCHEadPT4BSvn779m1GT0+J8wzLLGshyHJM3aDdajKelyd7x0lGUmVXSp4pJU5KPcLhwTHrdYihmziOi65F6oi+fr+vxluIxe1wDrhB9AIKEQqkNx1bOSEhlWVsRd7c7Xap1+t8NJmqn0sWStYboBS0tltTnIPoVwSVf+ZLp23HVgrC0WjEvXv3ePbsmaqTl1TdBx98wJ07d7h16xZnZ2eqQlFCB8/zyLJMwXLpUeA4juqvJ9pyCRV0HRXXQRlrfe5zn1NnN4rYSTaudJTWdZ29vT0lJpKr3+uqNml5nmOZBpPJhGbD48H9jzg+PqbbadNod1XcKWnJfr8PlEZSGrgMh0N1SpHEnI8fP1axq4RZYuQEHYm6MIoi3n//fcVDdLtdyAulyhQeRlq9SXqz0WgwnYyJo5AsvRZt9brls2qGTt2tKeVikqS8/PLLCtGsViuytFClu8+fPye3hthuXXXtDsMAx9JxahYHB3sVaWlxdjXn6NZLAqZ9SwAAIABJREFU3Hv5C/yX/9V/zZ/9N3+E4XBIr93Bc2yKLOWtL72B4bbZbNZkcdlj0jJLhn2TLxgHpair1WjSqDcpgpjFrDx56mBngL2zy7Oz5xwdHXE2GrOaz6g3W6RaQlFIj4wU2ymPqndsl6IwlFEYDAbKoEt9gsyBOLeiKNCro+oAJYgSib1sTl3X0UxDCfYsy1IH0gphKMg1jmNee+01Hj16pPgvUduapnnjjM+g2j+S8pTU+qcqc/6TuqSgCMoUy0cffaS+uBShnJ+f88Ybr6uDXrrdLqenp4o4i6KIW7duVQPTUY1gpahH2PJtZVhZ2FOoDSTeUuJzOWJuZ2eH0ehKSZHT9Lohq1QqXlxclFCyfajq56VWoF6vK15EJlCq8CRlKE1di6JQhOJwOFQiFymg2iYsRaUpLdjE88rCAhTLvb+/z/3791kul8rDCokqaUNJiwZBcMPYSIpOiEtBSUJolv0dSoQxHo/ZbEp9RJrkFZIpjUrTs1kFZR/OnBwNaa+W89orr3Dy8DHHn/s89+68ws/8zE/zV37qr/CX/9O/xN/9e7/KrcMDhr0+//oP/WnCTdlDoOb1yhSjWyMLQ1Ve3djdpV67lhqLOKhm24wunqmGvqZpli3h6w5REtNut1nH/o36ABF0GYZBu91XLeDke2/rAASdSgrZsiw0LLUBt7MF8l6FKkAhQ0EJV1dXN3Qh2/0apKZGFKYSDkt4q2kam7Bc5zKngqbLGpxPvj4TRkHXNNrNsq/i4eEht44OGY/HJdlkGsynE7QiV+x+eVpvi3q9wXLhkyQLjo9v8+D+UzzP43vfe0e1zRbJryjJpJR6vV4rq9psNqvmFAuCIODhw8fcunWLi4tLDMNiNLoqm4RoGm+99RarqrfC9jFtd+/e5dGjR5xfjvE8T/X6ny3XTKZzVn4ZynitTrV4fOK4oFazcV2nakN3qyIsC1qtBpZlqhz4crlUxKnUgUhYVXrrC3S9QNdNNE3HcVza7VrVN2HB5eU/qU6XajOZlfDTrjksViWLfe9zLykptYQnha7R6nb58pe/zPPnz7l//yFWnNLwWnQafaga6fbbPSxNZzmes9PqslgtuDg/Y+/wiFXoczWb0tjfI5yv0dOUnU6HydUFb7/9Ns9PT+g0+9z/6GP6/T3c9i6Tp0/4q3/pL/OTP/7jzEfn3Nnb58/84A/RaDT4hV/4BX7qp36K2WzGgw9/h9FopHL+hmFwfHzMpCo2c73SWLquy2QygXhDbuq0Bn1qjk2z1abX63H3+CU+DB+Shhl2YfP/UfemQZJl53nec2/e3Pc9s/alu3rfZh8sMxgMYRAUF4CiqSBNAwqJhiMoR5gUzZB+MLhYP8QIh2yRtE2FJIoGuIBhahAAKZLYCAwGM4NpzNLd02vtW1bu+77cvNc/Tp4zPTQIMCxLMcqIierKqa7qyrz3nPN93/s+b6c3IndcIRgO4PKHCXpDWE4Y2wMcLihXD+j3gop8XS1XGA2GTEcTXIaBNpnSqTWU8QvEjelxiimWbY7QbROXw2Bqjgj63LQGI1VOgJggyHKh3RYjXqmvKJVKaqKwtLSkHLTyJCH7CKYtvD+yv+FwOEilUqIsnJ00v9vjPbEoyJGdXJnlCyOP4LITPh6P1J/fmfuKScK6a51QKEShUFB1cDQaxev1KhpRMBhUu53UnMufI3sIiUSCQqFAJBKhWCwqebR0NcqLT/49aQ+WfQq5a8j6Tk4N5BsjVWnyNCF3BzlqlF8nTVqySSR3F8lI8Hg8FAoF9TEcjqipijySyh0LUCeah5WfshchEWJyZCln5aFQiGq1yp07dxQ4pVKp0Gq1cLu9SksytcxZIywIukYqlSaaSNDqCsXlpNWhWCzy6Pn38c2XvkEoFCCRSHB4eMhkPFSl3/r6Op/85Cd57fXX6PV6XL9+XTESX3jhBbLZLD/5kz+p+BiFQoFarcby8jKWZZHL5ZSUXYq4pF9DNpelvHs46L/rd1XsBEvM9buTvjqeD4dDAk7hIXDwTq7kYDBQkxa3242hO97lldA0je5wIPQl1pSpPUMNplOiCatpDPpDpUuQWZ6yNPR6vepEI0VlAN1WWwmb5PsmexTya+RrIP/9gGIsaJqG9l7vKciFwO12s7+/r5iA0gsha9zRWByHptMpumYQj8cwzakIejE0AkEPg/2OUj/COzf8eDxWXAF5w8j/pOtPglNisRh7e3tqvCYdc8PhkLt376qsS9kAlMw/2aCU4yKn06mapnJ0KG/yyWSkbnR5UTUaDfWz5AUsa8D5+XmSySSlUonRaKT6GcFgkFarpTrVgLLzOhwO0uk06+vrGIah0qWTyaT6d0rZtPyZEmsvOt5DIhFxE3Q6HXK5HG63WyHn5THb4TCI+cXC1+m0BBtjNGQ0maLhoFptEgrHefXVV/nYxz7GN7/5DeZWFimXyywsLJBMJPE43ZRKJfb29vjN3/xNPvCBD5DNZvn0pz/NZz/7WR555BHW1ta4fv06mUyGt956i0wqwcWLl1UZ9uyzzzGdTnnw4IESw43HUkswxJraxGIJokEfmg29VJ9KpUan02N1ZY3s/ALtXptiscD20S6Gw0WpVMLtcbFgzBFJJ9FtS2QzGgb+WckbDoUUIq/TauN4aJPwh98RL8mE9NXVVZVE1mw28fl8ZBaWlSs3Ho8rvYsE5cq+j6Zp2DOEoCwTAFWiSBn9eDxmfmlRIeRl83l3d1csEt+jp+D4tV/7tf9U9/rf+vFb//J/+7VnnnwEl8tFIpFQARyRSIRgMChELPE4pXKeWq3KaDQU+PRKCa/HS6/Xne3gOpcvX6JUKiv0mtwx9vb2gHci3qW4RrrvKpWK6p7L5mKxWKRSqVCr1VhfX2d3d5dHHnmEZrPJwsKCcs3J0FcZhCsnBvV6nd3dXSqVijqZyP5FNBpRx3QQpUiz2SSdTuP1ehUuTY5LJUBDjkDb7bZi8gkB10BNAyQDIpFI0G63lWBFKtvAVlZeuVM+3D2Xx9BAwK8clCLaXkhuB/0h4/FE1amxaIxWW4jBXB4XO7u7aLrBSaFMrdHGRKdYrKCZ0O60qNWqtJp1KpUKiXgMw+HE0B3Uag3u3L5Lt9fl7NmzSsj23HPP4Xa72d7eVqK00WjERz/2USKxKD6/H4/PS7ffw7SmBMMhhqMRU8vC6/cRCAWxLZt6vcbNN99As8G2oFqtEQiEsNFEzoCmc+bcGUxzynE+jz/gw+l2MZ417EbDPsP+EI/bSyQWJRgIEovFcEtWotvDcDTCoTuYmCadbpfRxMTpcuPxeNEdBl6fH90hSjxdd+APBAmFI2Tm5pT+QE7jZB9HcjCkPiQ5Q85Lb4vH4yGbzSoBmtz4mDXTpZtTTkacTifXb7zNz//jX/z173Y/vidOCvJmkeM1Wb9L4YZ0oQWDQdFncLnw+4MMh0MuX7480yiMFQtA7rKSgSiR1+FwWIluJJX44emB3NFNU2Qk5HI5lpaW3iUSuXz5MicnJ2o6EYvFyOfz+P1+0uk00WiUk5MTBbeQ6DU5EZA7mNyppTpT3mDy9YhEIupzCU7x+/2KOSi1F/K4KssaSQCWJRigXkN5sbjd7+QWSm+J1BjI104ePyVRSJQ3YoGKRuL4fAE1PWlYdQXJdblcaLrB8fExhWqTydTGFQgzHJvkcjmWjUUis55COp3GMER3f2l+kXpdGKpsXTSSP/rRj5LJZPj2t7/N5uYmfr9f9Td+8Ed+hNe+9S0l95aNz0ajwfLyMoOBmBAtLS0Jh2Krjc8XwOvxq5OnUAhOMM0pCwtLlCs1lpdW1Xth2xrVaoXQzPMx6I/QvW6BQPO4qTcbjM2JkFmPx3THXSUQcmgC/uKfLaQC8x9SJ2DZtJblsJSWy4X5YRirEIgF1N+X43WpuJWLgywPZNPx+PhYjZFln0GWlvK6+W6P98hJ4X/9tY8885R6UeSbK19MqdaKxqM0Gk3G4wkaDnw+P81mi16vz2AwYm5unnqthdvtIpvNMhyKDAaZa9hut1X8vPRJHBwc4PF4qNVqajSZSqWUAEjeILlcTo0o5ThSoNUFou3MmTPcvHmTcrmsfA9yVi2bgnL02O12OTnJqfovmUwSDodVEK6cBMjvPR6PlRZjfn5eBYDouq76EG63EM7IbAzbthUcdG5uTs2lxQLQUyOxxcVFJZAxTVNNPKQgq1KpKuLTuXPnxZ9Ni4sXLxEIBCiXy6SyaarV0szyLWS/3d6AertHoVjFF4rS6Q7xGk7M6YRQKMhoKPokPq+HpcVlTo5zuFwehsMRP/ixH2Q0GnHq1Cn+5E/+hIWFBd7//vfj8/l4+eWXxekxEmFuYRGfP8Dc/ALzp07hchhYNqyfOoXP7ycWjxNMp9A8bhymxcbGaTrNFulEEnNiAhqhYIRgMEKxXMK2odvvUiyWmNhToYD0+6jX6/hmY0aX00m/16c77GFrYE4mDGZ4OjQBCXZ7ZrGBUxPN6aY/GBIMhylXqzRaLWLxBGg6lWoNc2rhdLvZ29ujXq+rk8LDzUNJtpKLeLPRUCe9drutTgEPTyJcLhe2Jnoby8vL7yo1dF3n5etv8gu/+D+9d08KsraXN4NhGOomkSaibrfLZOrG7wvicnqYTi1sG1wuQWuajKf0ugM0zaEkqXJXVQafaFQpFiU5+s6dO5w7d45ut6uEO0tLS8o2LFV5ciwlm32TyYRkMkmhUGD6EE5O/j955AOUSEjKXaU+QHodZA0oQS1yl5caDYmeLxaLilAld4N2uw2Arj9M6h0qaezDDEtZe8sYeenwrNVqAGrOLX0VDof+rrJCshkl3k42BzVD0Id0xHG1VK4SDIYZ5sqARqvZYTLrlsvfUwJgZVZCIZenUKhw4fwlajXBs3zzzTd5/vnn2dvbYzQasbm5ybPPPsvCwgK3bt0ilckqV6A1GzmfOnVKKF1jMcbDIbWc6CPNZTPcuXVLWMsHPUXjcru8DIYTpmhMLai36ty+fZuJPqVar+ENeXE6BWAlEAiAJXZmyyGa4pNZf8rpEP0l/aFd3+v1Mpk1i3O5nDoVtttt1SuQjVSpS5HXmNy4ZBNbXmPNZhPdRgnk5P0iF31Zpsp+18NCNrmhyTHz3/R4T5wU/o/f/s1f+9GPfhjbtoVIZYatvn//vrKk1ut1XG4vGk503clgMELTnJgTi/F4ynRqU6006XX7uD2ibkokEu+ISGbwknQ6TSQSodPp0Ol0WF9fV6VFrVZTxGj5AkoLq2ysyZtbqh2LxSKLi4scHBwoSXav16NarTKZTFRpIpV3csGr12tKESebiVLFOJqh0CeTCbVaTV2Q8uQkfRbJZFLdXL2eMFbJi00qJGVHWmYROhwOrl27qgAsUiMiL1C5qNXrdUajoWpCiqmG6GQnEyk6na4SiMWSUQaDoepqe9xe/KEQN27dJZcvEklm2D845tFLl6jWKgwGfYYD4XMxHDoH+4dEQmHOnj3PhQsXcXlcJJNJUqkUh4eH9Pt9rl+/TiwWY3FxEU0TixAOF+1OFxsNl9uD2+PF6w+geV3YE4vhaIzDcOL2eHFMbSbmmKX5BdrNJn6vH7fLw9HRMUfHOSzA7fbwrZe/xdLSMmPLxGHo5ItFUikxXtawGQ1GeL0+TEwMx4xzCaSSSXx+Hw6HgTmdYllTNF3D6fYRCofJZLO43G48Xi+RaBRN14nHE0wmJv3BgPFDDl4pYX8YOSinRaFQCH3WK5hMJgqpLz07ctLg8XhwedxKOzEcDtUG5/P5+MYr1/kff+EX3rsnBSnOkMKNer2uZrNylfP5fGg4cLkcaJoDy2oxGo2ZjMXNZGMzGHQxTYtFV0odw2TNKV84+bwcW8rewcOlS6lUUl19eXqROYwPh9devXpVhdKm02mF3g4EAiqyToatSnFWo9EgFAoRj8eVmlFKrzVNI5VKqWh62xYhu3IxAtQCJ0VbIBkB72Dq5K7QmB0z5e8t/04iERPmHtNUElk5tpPyZ+H3MHG7PWo6IqXn4rV0KjVjo1tn0OvjmoFOHbqTQr5Ic/b6OXSD0QxOK157U43L/H4/45GY1GxtbbEwv4Q+1pWCVOYgfPzjH+fg4OBdsmHDKSTxD58Kg8Eg/X6f+fn5d8aPwyGVXI54PM4f/dEf8eiVS4pIlEgk0B1utnb2OD7ZVjdfvV7H6/Mpc5nApYGNrZrXmkPHoTtUv0DSsmu1Gq1GYyaX7iukvrSoy2Zfq9VSPpbRUGxGEs4CqD6PFLs9POaW5ePDpaQ8Fcv+ksfvU6NO+XrLa/89732QjTNpHy6Xywqt/TCAst0RxqfhcMh4JLzhtWZDKNG64gUcDEbkcjnVaZdzXnm0lm+gXD2/+c1vMj8/r/wL8k0DmJ+fV6anfD6vduZms8nKygq3b99mNBqRSCQAlGPS5/ORTqdptVqK2ZdKpXC73ZycnJDP50kkYsrwJS23kiUhzSuj0Yj9/X1AmI7+elkjLbvhcJhMZk7p6H0+H8vLyywuLtLpdFRAjbyAisUi9XpdzdvltEday6UMt9831bxdvkfBYBCHLgRdUhJt26KGdczq2vMXr2LhwOl0kUikKJfLZLNZyuXyzOk3QLNNdUM/+cTT3HjjLX7xF/8JhXyJWFJY6D/zmc/woQ99iEKhwCuvvMLS0hJ/+qd/SjAY5JFHHuH1G6+ysbHB5cuX1cIAvMswJj0fyWRSvVbC/i03gDLDoQjsKVdrzM0t8Pbbb2MZtrrJup0+c3NrtJp1fG7hMRkMB0q1OB6JCIJGo4HXLco2yVC0ddEvkBoQOWHL5XIkk0ll8OvP7NRSMXr+/HlFkq5UKliWpezummUrPwugfm952pMp4ZIWLRdLSTOTPae/6fGeWBQ0TWdj4zy1Wo2trT1aLVFTLy2tzTT5YqfLziUIhd3E43E2d7aEky+iM7J6TJ1T0qlFdM3B9uZd1a2X5pJ4PE4sIjrz/W4f09QI+OJEfDo+l1t0eIPCV3Dl6iUCoRC9fodoWJQfXiOMzxUgHA4S9As+YTKTxJxO8cfE8a7b6xEJBYVlVvORTacY9nuEw2GuXr4koCZzWR48eCDgLENRJsgFoN/vk4jF6bY77O3skkqliEWiKpil0xKNUKfDIODzq4shnzth0BMqTXmkl00peRP4vR4sc0IiJoRKrpRTdf4nozEBnx+/14fP66PX6TI/P4/bK0Jrp1MTTQOPx0mvJxSQDsNkPOmIxdcbYtDtYY6nnF47h8fh4e7b99GwCQW9pBfnSM9l+cqffhkbyBdKrKysUK7WWD99lm9885v8xE/8BJphUWsVSSxH2bz/gNMX1jkuHnHu/DkODnLYGjjdHtyeAK12n2c/+H56vR5vvPZtgsEgmcycKIdcXqyJ4Gg2a4JZ0R8IcEsyGafVEZqRdDyBZdkU8wVKuX3iPoOdcpneqIbbGabRbWLpBp6Qn6N8Aa9Lw+dxMBq3ifqihNwhBVlp1jviJGVNiMcTVCoV/H4HXveY5YX0bKQoiMyjfouA14DpkHjEPzt5hTjJ5wnPYC2j8ZhUOo1lWayurfG1r32NZz/0IVHaVQqqx2NOh/gDbrJzSYDZQiMakHJCpuv6uxaOh5uO3+3xN8ua/jM+9Jk8NZvNKrWa1JJLx6A8ng8GA7V7yiOTbETKkWRvOEIznNi6QzSQ0CiUK1TqDTTDiTcQZGLZtLo9BhOL3sik1mrT7vVYXluj1RF5CocHx6p08fk8uA0HwaCfZDKuxntej4eA14dTdzCaHUkBVTLIHoOk9DxsipEnkod7FXKRkM0i+eYJT0FP+elBXAAyZk827yRxSY5w5VFXlhEP48AkOl5OXaRfXx4/M5kssVicTqeLy+VmOBwxGo3pdLqY5hTLsplOLaX3l7kRd+7cETdIf6hCfubmF1WJtLq6isPh4Pz58woRVqlUuH37Npqm8e1XXuX69escHx/z0z/90zSbTZy6gzt37vDoo4/y1NNPkEwk2L5/j2a1QjoZJx6JEvB6iEeimOaE0bDPaCwIzePxUAXpSCx8NpsF3gH5jEYC+qtZNi5DMAdGgyHjwRBrOqHdbKLZzMbmTiWhl/oS+fvL5+RYUYrKpENR9nceJjvLvo/slUh/xOHhoRK0ra6uUi6XFdE8Ho+r9zoSiahmoxxLSviObF5KhJu06r/nTwrYNru727PjqJtIZGEWXlLHMHQqlZKi3rrdbrLZLNWGaMDpgyHBYJT+cMJJ7oR2q4M/FMXl9VKbqfocre7MMXnCmzdvK+iE0+lkZx9cbieJaIT5aFpo9pMJNN3N2JySCgoBVSKaIJVKiaNX3yQS9DMxp3S7PQZdkbbsdbtpN9tcuHCB7e1t1UWPRCIcHQm6ssxxkCITGSgjjuG2cFQGgzz66KOMx2O2t7cV/l4KpcrlsmqISrBHp9MhlUopOrOmCZ6lNH9JkZRgNBRV81IeJWXdK4/htVqNZluIXtbW1pQxR5Zd8mILBoPYmhPTtJhM2jjdAr/e6Q146qmnePnbr3Hpscf4jd/4DZaSc0rVl0wmCYVCKqj25s2bPP/cc9Trdd737AfZ2dnjAx/4AH/4+7/Pk08+ycu7r/D888+z8+A+w4UFGvUWS8mocGDWawRCIeoFD2NzwvziMh6fX8BaGdEdNKlXhK/m2rVruAwng1nO5GAwwDUbIQ7GY0aDMfFIFEt3clw9wASSkRDJ+XmqlSKWy0nP28WaGu8Sfs3NxEcy01EyE+QESKg9OyqLUhrOQDQFo/EkumYTDgXwet6xUVuWRa/bJhoJcef2LXHT20LRKL+XnGhJj4ymaaKEcojGtRwvy6Rqqa79mx7viUVBjiOFBVf4D2TDTdbOsj7KZFJCszDjAVa2tvF6RSe3URdNJVvTMS0bl8erLvT+cARooDuo1htMKyJPYGJDv9PGH/ASjsXRHS7yJWG8SsSTeDw+NM1BpVyk3Xkn/luQi2Oz0eCs8WSJcVS5XFY3j/g3Z9SbIbkQspNs2/a7cHJyl5bGJ/mzpFtUKtkkoUcaxCRsNhqNKtafnGrIDIvRaKQUjg6HQ8me5XjS7/crOrBpmuSLBWKxGOnZMVZi3WQCtlxABmNYmKVUjUemGs/6AiK1Shq3ut0ui4tC3ry8vEylUhLH4MGA5557Tkmtv/rVr7KxscHnP/95Lp2/yP7+Po8//jjdVptMKonTYTAZD3Fr4Hca+NyCkTi/tITu8YgAnLbYELw+NxErxKAtdmCnQ4h8xrOFTXboez2hO/C4XFSrdYrVE8LBEMPxCCwbHY1Bt4cR8Cm3o9zhH4aiyhNePB7H7XZTLOYVI2QymSh5vOwHSTCLXChrtZra9eXoMpFIiJJ0NtJ0OjQ1WZLvlQSy9no95ufnhZq1O1SN1+FwSCqVUgv693q8JxaF4XDA8fEhp0+fZjIZUamU1E1vmmOeeuoJYfqJRiiXBb8xGBFjt8uXL/PgwY5SFY6NCflqE7PdU8wAaZ3N5/MUi0UikQiJRIJGp8/pC1e4d/c2nUafncMTKsUCg14Tv9fNtUsXWFk2CAR0rEmPfLEAwGQ8JT2XFeISS3gzXIZoanZazZmLUzj01tbWAIHLWlhYUPoCyRmYTCZKXNJut9na2sLj8XDp0iVMUzAKyuWymnpIYIbkIMTjcdXM7Pf7ahzZ6XQ4OTkhnU6LC962icfjBINBNfItFApqLCrBo4BSao4mJpPJlJ2dPd73vveRz+dVv6LbFYIx0Jmby+APBDncP6LfLzK1NZxuN1/60leIJJKsrp/ia994kUa3QSaVJBgMcuPGDXRN0KiS8QUlhLp16xYf/PCHhIhKd+B0GFw+dwFrOqVcLNFrizyQs2srtE9ydLpdguEQls/N0f4uU9siFIuTzSRw+n2U8nm63Sb7u3ssLi7iPXde/M6znVvTNFqdNs12S5SvvTHnz5ylWn0Z3TRZnZ+nXq/Snw5ZX1mdZXzYTLWh0lhIFa20ostydzKZUMybarGt1wXPQdrWY7GYam6//NKLPP300xg6xKNh8vm8GD/XKsQiISxzzNmNUyr+UMqgk8mkmhpFo1E6nQ77+/vkcjlSmQU1Fvd6vTQaDcUe/V6P90ZPYTZaqdVqavWVs/5Go8Hx8TH1ev1dEXHlchmZl7e6uqrqueFwSKvdptVuMzFNnC4X5UqFGzdvcpLP4/P7qdXrtDsdVlZX+fZ3XmfjzDkuXbrMm2/dxOnxEk+keenl1yiUqty9t8mtt+/icHpZWlkjlZljbnER05yytLgyc0m6yefzKtBWEpWr1SrNZpNKpaIkyxICK2tbad+WUw0JWjk6OuLBgwfU63USiYSCrcg6UuokyuWyOrqGQiH29/cpFosKmjIYDEgmk6yurqpa0+v1Uq/XiUajxGIx5ubmWFpaIhwOqylFs9kkm80qPPnm5qYSVcn+SL/fJxaLkUinKZVKMxKWKFu2t7cZT8REJZ/PY1lw6tQput0u0WiUaDTKlStXcLmE+vSVV17BsixOnTpFvzfg5W+9gq47uHr1Clvbm4wGAzrNJsGAn/XlZarlEoahk82kSCdTGJqOz+0hEYuTTKVwul1Men28M19AKBBAmy16Ur4tNSPtdptoPE57Np2q1RrEI1EW5+bxul3YlonX5abZaNHvDegPBiLHYjbNefi0Jl+jhyGp5XJZjcRTqRSxWIxMJkO/3+fg4IDhcKjk2FLrMhqN1Fg1n8+rsag078XjcVUGyx6F7CmlUuI0XalU3oXylxJ2MR5/j5cPlmXR7XUIG2Echk6311FHIofDg2VPcRi6gkj4/X4Gs+bRxJyi68J6WizUqdca1KpVdbzVNI3gQ29ePp8nlUrx3Ic+BEAo4OHLX/pzUR97PZSKRTbW11g/dYZvvfo6xkxEUms8w8bGhlIhYll85/UbjMYDqvUGk9GYCxcu4HCKmyaVShEOh9nZ2SEcFit/tSokw6dOnSIcDrO/v692eF3XCYfDisrb6XTMT9JQAAAgAElEQVRUmo+u64r0807mpKVuYLngdDodSqWS0h7Io60cs4odvqsQdpIo3Ov1uHnzpjKQeTwe4vE4xVINt8tLIu6k2Wjj9/vJHefFotc4xqE7aTU7nJTvkEql2D84ot5oUSyX6Q1EX8Pj9TMam3zwQ8/y0p//JafWVtXv1Ov1aDabnDm9jsvl4uDggNOnT+N0uSicnPAPP/X3efXllzm7cYbd7U1Ora3z9ls3aFfLhINBnG4vDsum0qyTzmZIbWwwqlXBshl1Rd7BsD8Q2pBAkEgojGVOldHIAmxNw+314nAaXH/lZZrtjlJa+vweBoMuqXicRreNLxRCNxy0egNCYT+1Wk0Rw5xOJ2+//bYqL+UoXDpnI5GIKtPkBjg3N8fW1hY7Ozvo2NhTU210kVCQk+MjdE1jNJilWfe6BAIBhSGUqlK/X/xb5DUhnba5fJlKpaJOgKlUilarNeszvccbjTbvZBhKsKQk4tq2rSSg+XwesN7JGjSFuKbTERSiWq1G/qRAq9VV38/hcGCORyTSadFcmYoO+b3bbxONRjm1mEGf9CkWi9iWiW5bHB4e0+/3ef/T7+P+/U3qrRF/9uVX0L/8KtceucSptVWuXLqI2+8nk0pTzB+zsChYA4tp4TPI5XKMx2OV2CShL1KlWK1WVXLU0dER6XSaK1euUK/XVT7m0tKSmn7IutflcpHP5wmFQjQaDSVK0XVd7QzyyDiZTFhcXKRQKHB0dKRAtw8ePFCIOynsikaj7O3tKQr2eDym3RnNRExTvF4/R0c5lT1x+vRphcvzRNzkcnm2tnYo5E5YO3WGyGRKpdXh1Vdf5Xd+93f5+z/7s8QMJycnJ4oP0ahX1cj02rVr7O3scO/ePZ778Ef4gR/4Ab74xS+iTacY6ER9PnRrSrteIeh24ovFuLW1yeOPP040mqQ3noCm447EqReLuN1eBr0hw+4Yj+ETCLp2R6R8z66BQqGA0+mk2W6xv7/Pzv4e5tSm22mRTcbRNJvRWPRjYrEIIxt6ozGpuSTmpK8Edw8bmcbjsdKqpFIppTLVdZ3d3d13cTAbjQYbGxvCdzJjhUhrvSwJ5Nc9zNpIJBJKFCf7RTK7U+pxZLNTfpSiJenElFOy7/Z4TywKhsPBcNinMktNksGu8heSN4ZQ9b0Tzy2Px4AiEo/HY3TNRsMCe4rhMAgFw3Q7LdVg8/s8DPpdDIdGcSePaU7xeVz4vH4CgRCDwYjz5y7y0rdewel0EYsnGIwm2JrG3bs7nOTLWNhcOH+aTq/LeGpiaxqaZquxkTRVyRwF+bNlN3pubk6VPNJHL3f0hxWPUnAlTwjSQZlIJJTxSu5MpmkSjUaVpbrb7bK0tKQaf4Ay2cjGWLVaZTAYUCqV1PhM6uglqUrmSxwdHSkgiDRpHR8fY7nctLsC8a4ZooHp8wdFOE0iSbsrVJ5Hu9tcOX8Rr9dLNpvlJHckUPAzSbjcwUulEk888QQ/+F99lL2tLV751ss8+xOfEAKmhUWcuoNUMsGPXr5Ms9nG4w/gnE7ZvHGTWCxGMpkG3QCPB/J5Wq0Wp0+fFv2WaAzDnLDi9eKZLRCtTptOv8fZyVn2DnPiGrQtugPpQ7HwRkLoFljYIkfCpSlJ+sPN2mg0qk4Jov5PK+Buu90mm82q06EUEw0GAyKhoDrdSqxeIBBQpY5kIoxGIyazMfBkMlENbfm1gOoZSEK5vK4kMv6/CHCrwyGOzoFAQOUlyNFOIBBQtXcgaNBo1JTJwzRNTp86xeHhCXatKZpVpQqDmYRXx8tU1xj0ROfc5xE0I3M8QrP92FOTZ55+guOTAoeHh9iWSa/bxh+IsLm5yT/42f+emzffptfrUag0MEdDOoMR9dYxxWKe+xdPEY9GuHzpDOVqiYX5LL1OVzUTJXI7Go0q66u8QHK5HIuLi7jdbgEamanbJHVJ1vVSvisbSpPJhCtXrmDbNtevX1dZmQsLC4r/WCgU1CJkGAbz8/Pq4pE6gaOjI5VRISXU8kLt9/vcuHGDcCSlQCyDwQC/369cpfF4XL1HuVye1157DZfhZmpa6JqTfEEkXXsCbhVXv7YksiszmYw6yXU6HVqtFoeHh7gMg6eeeorHn3iSF154gblsGsOy+dEf/iHe+M7rjAZDYXvXNazphN3jY3ETBvzYU4uN7AKa10u/XMMXCGC1utTKYuR7cnxMeWYuarZbtDptTgoF8sUCr7/1JolEQpxEdR2H06DVatDrNhkN2jg9bnq5HNmVVVweD+VqhUmvoRZmucjGYjHi8TjJZJJ4PM5gMKBcLqmbXO7ivZ4wZBUKBbLZLOl0mkLuiN5Mh5NIJOh22oxmjEW3y0mtWuHpp5/G7Xbz1q3bpNNp5Y14mBotQ2Pcbje1RkellC0uLpJMJhX38XtNIL5vo1HTtH+naVpZ07Q7Dz0X0zTtq5qmbc8+RmfPa5qm/ZamaTuapr2tadojf5tFQdcdvP/pD9JudtExsExwaE5SiQyWCUsLK+ztHDAcjDEcHgyXj3ZrgMcbYjSa4nA6CQS8NNoFBpM6Y8vE0mE0ndAd9ukN+soR2Ot00AGnw4HH5WI8HDEZ9HEbTiaDHvVamcLJHoYx4Q8++3/SbByztBhlORvh4rlV1pbm8Hs82JaDQr7D9e88YP+wR6vj5dadKt5ghN7IpDucMBpbnD1/gUqlhtPpptftEvD7SSYSaLqLqaVjazq7+wd8/cVvsLu/S2/YIT2XZPdgk73DLTTNQaPRot8XPIPhcMz29i71ehOXyyM4le0ut+/eo9Fqs7O3T384IpXJohtOmu0OtUYTp9uDren4AkEO8xWiqXkKlTomDsbmFK8/wOHhoRj/TsbUqhXq3TKbe/eotirE0nGcXi/lepN2z2RzJ8dk6qFUGdJotplaGol0mv38MX1zTHPQpVwt0em0WF9aIBONMDYtsksL1DsNvEEHtXYRzRhhaibNTou5pTVu3dnm1Re/QjoewGXYrJ8/zY0Hd+liUR4O6No624UK9aHN6noG6OPUJgR8TjRtCp02HiaMKidY3RIR5wB9UMIRDuEIhxg5dIxAAM3tod0fMJnaJBNpPG4fve6AevmYqTnA6QvRGE4ZuyOYRgivP4I2HjEf8qE1TnDqohR1YBPwuUglInhcEA66MfQJ9rSP36sr74p0xUqQrlyEJXHM5fVjuL0EwlEGYxOHy4OtG4RjCVrdPstrp/AFwzg9PsLhMK1WC8Mw1JRD2vxlTEAmk8HrduB1O5jLJDg62KFWKWCZQyzze5OX/jYnhf8L+N+Bzz703D8F/sq27d/QNO2fzj7/J8DHgNOz/54Efmf28Xs+3G43R0dHBINBgsEge3t7OJ1OyuUy586d4/j4WGCt94+V6s8wDJwOQ8VnHRwcKIONLCkmkwk6GpZjiqELTHt0FgM+7A+YjMZMzQGgEwqFiEQiDCcmhsPJcDxiOrWVnNTjdbG4NM/NmxVabbFLnL9wFsuy+PO/+DPOnj3L4uIi33jxkGtXrhIIiIToaqXO3MI8TsNBMBah027R6XTwB7wMhr0ZlUkc/3/kR36Yra0t7t65T7Ek5tuHh4csLy9zeHhIu92mXC4znYqQE8mfPDg4AF1AaWQOpq7rLCwsqCnIyckJ165do1wus762ojQGmUyG+/fvUy6XSaTSGC43hmUTjMS4e39LjIJDcSZTjeFggi8QIhSJcn9zG1tzzvDmPSKRCNlsFtvSODk5YTieKCWlIkxZmjop1WYlTbXeEI02hyH6CF/4Mza3t9A0jctXrnF0dMRwOOSll17ip//eT3P7jRtEZtzMzq260B7gxKE7CXnFzXL9tdfweQx6nTYfeu6DzC0uELBdSuE3nYzIpBLcvzul1aiRTQsX5NXLF2l0BNNgMJ5Qa4pG76DXw556adZLPPn4o9TrVXzRJIGA2JHjsSRnz20odeN0OqVarRKLxQiFoip4Vr4Wksshd/SbN29ycnKC0+lkbW1NCcPk9ZxIJLBtm7t376opVTAoyrNyuawiCw4ODpTOREYgLCws0O122djYYGtri0QiIaYP/zGGKNu2X9I0beWvPf1jwIdmf/4M8OJsUfgx4LO2KG5e0zQtos3CZr/Pz6BWq7GysqLkt9ISCqibPBgUtKV+v6+aKlvb25w/fx7DMCgVinT7PSxLGEUeRlKFQ2GYhZtg2cpcsrwyRygUYTqbvfeGA6qVGgFsTp3a4N79+9y6dYuVlTWazTof+cjzXL16ma9+9avcvPkWHo+HjY1TbG9vcuPGmzz7vsd49bXrfPD97xNKsmGPCxcugC1uEgFvmTIYDonF5tE0W8FYisUS+byAxkbCImAkFhYqxcPDQ+bn5+nNlHiTiYh/lwxIj8/7rgCRdrutmlwyQ0DyGhwOB8N+H49LyF4zmQx3797F6QnQaIsSYopBs9XBnGr0B0Mq1QaDgcg/SGfnGE9sKtW6ilIfj8eUS9UZIl803ZyGW5U8k4nIe5zaFqY1pd3uMhybxKJRpqatVJ7FYpGQF1ZWViiUS4xmo8Nf+qVf4nN/8Ic8+9QHWVlexjAMktEgGg567Q7D4ZiG3qRWq80AIza98ZBWu0t/OMB0+Mlm0gD0e10G/R4Bvw9sC2tq4jQcJOIxkqkIx/kCuUIRt9s9Q9q1cDps4pmk6vHIa7PXE/Jwt8dJKpVSidPS0SjDV+RUQYqW+v0+8XhcsRRkboNsDkqHayqVUorVUCjEyiwtzLIsBQeyLEuV2FJ1KonikhAtYUHJZFLIzf8TjCTT8ka3Rbp0avb8PHD80NflZs/9vxYFTdM+DXwaIBmPcvHiRdWEu3v3rlocJM76jTfeIJnKCPXYqE8mlWAwGnH54gViiTgej4vDo6e4c+cOR4ciH8GYNYBCwSCGruH2+nA7xYLRaNSZjEYUijmhKtMEaWlqw8LCAvOLS4xGI5544imy2Szj8ZCVlRU+97nPcXJywjPPfEA1Qb/2ta/NVHsu3rxxh1DAR63aIpmM89ijV2g0WtTqBS6ev8Cdu7dIpRIsLi6oBp5QCmocHBzh9wdF88wdYDyaEAmLpl6321UCpkgkQjKZVN4Qh8OBwylYfcfHxyq9OxaL8eSTT/Lqq68Sj8fZ29sjk8nQazdxYLGwsMxffOkrPPb4kzQ6PfoTm3K1xuLyKl/88tcxx8NZA61PpdrBtjTi8ST37m+zuLBMp9MhGksS0fy8+cYN0qksn/rUp/jMZ34fTXMQT8QZmWJyIbgPQpvR7Qbp9vrYtk7+pMzp0xt8+MM/wO/8q39Fvd7kfY9foVpv0u33GIxnmYmf/zzr6+vcevsG5mSE2R+yvrqAy+XizJnz+N1BavUm7XaH7qDPX37lL7l27Qq397bodrusZJeJBsVMX6ZztesVQj43GlN0Q6N0ckQ0HSfg9TCdjFmcn2NsCrhJIhmjXKlQrdpgmXiC0YeSuyaUihUVZCRNaYPBkO3tbTW2NAxDidok6UrmMCwsLCg4rs/nU7xQufmFQuLkeevWLYB30cOlGM3lctFsNpVydmVlhUKhoCZT0WiUUqkktDLWf77pw3dbfr5r8WLb9r8G/jXA2dNr9urVq3znq18VlN5Mhrm5OcWpazSEPboza8R0Oh2uXLvKdDohk03NEqTB5dDxOA1cbvFrOTQNXbNxYDMc9LAtE3MoZtDhUIipz4NpQbfTFQjuqQW6jtPpxtZ0vB4/sUQcv9/P/Qe32dvfIZGMEY2FefmVl6hWq5w9e5bnf+A5CoUC586dY3/rmPsP7rK9e0CtVid3csTK0iLnz57mm996mXQ6gWlalEolptMp6+vrjEbv4Od0zaDd6tNuNRSivlAoKJvx6uoqtVqNYrHIysqKQo2nwoIPWS6XSSaT6ij7pS99Se3CJycnIicCi5OTE6KJFIbTzQtf+AJv3bqD1x9Ed3nYPirS6A5xztx6S0tzMwaAsJ37vAHypRLz8/MMxiNajQrPPfccb711E81wks3O0+v3yWTm6PR7uF0eNHQGgx7D8ZjRZMpkMsXpdKE5TH7khz/BH//xH2NaU8LhIPe2tgiHw+TyJzz55BP0+30q1So3btzg4vop3nz9Oh/7yEeJBYXlu1lvMRiO+fqL32T/+JB/8On/jtYXP8+t+/e5s3ufQCjEretv8MyzH8DXc+FxG7zxxhvcvPEGS0tLLC4tsbOzQ7GQIxj2k82kqDaazC8tc/311xmORSZnMi5Om16PayZZ7qlJQ683IBIRXg6v10urJazp6+un2dnZURZomRwtmQ9ra2tYlsXx8TGRSIRMJqOER1LOL0s96Y/xeATjQobblstlMpmMamZLZmOpVCIWi3FycqJEUXL68b3SYP6/LgolWRZompYFyrPnc8DiQ1+3AOS/3zcbDgb8xec+h23bLC0tkclk1JF6OBzS6XQ4c+aMwGe53dTqdeypRSwSpVGtEYnHuHfvngqD1ey6ogxJvLYxw1z5Q6L+6raFlrzZ7YkxjWEIp5rDyc///D+m1+/z4MEDqvUGX/7yVzk82iafz7O6ukqlUlFUplwux+HhobiIczkS0SxXr17ltddexbJM3O4UlgVv3LjJ6bVVmk0hp41Fo1QqFXZ2dmm3u1y6dInjo5NZLZpQcFcpOFpaWqJcLqsYvJWVFfL5vDqSOhwODg8P1ShXHhuj0SjXr1/n2rVrCvpSLhYIBoO88u3r3Lp7n1K5iq05aHe6+MMuzKlNKp2lV68Tj8dnM/IZiNYfUt1rOT+fn1/kwYMHnD9/nsPcCbFYDKfLQyqVonjnLpFIRMzfx35l5PL5fEyGE1wu2Dh3VnXoI5EIzUYFuw1rp9a5v/mAbrvDyoLA0kWjUc6snyKZinNylKPeaNDs9Gl3ehRKRbB1tra2eOaZZ/D43Hzlr77EUx94P+NihRe//jXW19f5vd/7vZlD1WI6nVCrVdA0e+aATbJ7sI/X6ybo9ykKeCgYYdAf4vW58fmD2DgYjQez0kCg/G3bptcVfYPTp0/PvA9FZV9+ON1cBtNKxqIcN8uR5ubmplh0Z1AbyeQol8uUy2XloZGlx3AoJjOJRELxQjRNo9FoqGnY+vq6+lx3/P8/kvxT4FPAb8w+fvGh5/8HTdP+GNFgbH2/fgKAzydyBPL5vOoZ9Ho9CoUCw+GQjY0NcYyyLNxuFx63i+Ggj8Np0O126HY7BIMBUskEw9UV7tzdxzJNHJoTHR2n4SQ005/7Z+5IScmNRmNcvnyZdDbD/XubHOaO+ef//J/T6w85d+4cDza36Xa7nDl7ltOnzgh7a0jImGu1Ggvz87z66qusroqR0P27D3j88cdxedziTR32+fo3vsW1q5e5e3+HVqvFE489gtsVZC67IkaWkTQ3b9whlRJ4e4dhq0h4SeGV/obBYEAoFBJkIK9XAV7kwiQJvpVKhbm5Oe7fv8/CwgL7+/vs7u4yGo3IlwSopt3r0WgLX8R4CsOJiUkLyxaAklRcYPDm0nNYmkU6kaRarRKJRKjX6wz7OovzGba3t8TJIxoXI7fuAM2hc+PGTVqdDq+99h2CwTAjs0M+XyAajaNpTsq1Ek8/8RS/+iv/DK/PT3fQJ1/KEwyGaXZ7dPYPmVoTXA4HlgaXLl1gYWEOw9B5/bXX2Lm/Q7VRJxSOk5mbp9cfMpyY/N5nfp/1M+vUmnXuPdik0WpzKpGi0+vzgWeeZWxOCUdjivE4NqcsLC3jcLooFo7xuAw69Q5vvfWWuB6lJX8wZDATGQUDYTQcaDhmLtMwXq+HXq8jeje9IYbDhcvtpFAoEAqFFHz35OSEs2fPqrDe27dvs7CwwGAw4M0331TGqkZDnBYjERH0I8Gujz32GFtbW9TrdRYXF/F4PO9SzI7HY7UQjcdjFhcXVT6JTBf/j+IpaJr2OeDbwBlN03Kapv3D2WLwEU3TtoGPzD4H+AtgD9gB/g3wc9/v+wPYtqWaMdJH3u12abVa7xLb9Pt9eu3OLOKtQafVZjRbIZ26SHYOBALYM42AdJXJY5kUePT7fXqdLg5NZ35+nnA4zNbmDsViEdDxeQOKnDM/P8/ly5fZ3t5ld3efU6c2WFhYIhZLMD+/yMHBERcuXJoBY12cv3iOYjFPMOhnZ2+X4WCEZjjY3TvAaXiplBvs7OaoVlocH+Up5Mv4/QFlkllbXyGdTmJZJi7XO+BNmVMhYZ1S6NJoNMjlcso9KdVqkgItdwlpk67Vauwfn5ArlukOxqAbuDw+pSY1DAOnoeNxOwkHQ4yHI8bDEV63h16nTTadwuNyEg4GWF1eQrMtPB4fhiE8/hqOmRzdORuVady7d09AaPqCLiSmOT58Xj/Pf+Sj1JtNqhWBiXe73VjYjM0JY3OCwzAIx6IkEgmWlpbI5XKUyyVa7QZje4rm0BlPzRngVMh7z5+/SCGf59TaGmdObxCPxsidnPDmW2/xb/7tvyUcibC3v0+v36dQLDIcjXC6XNTqdfq9HpY5xTB0hoOeCtY1DIPp7LW00Ol0ekpoNx6Zs9OaAeiqdyATnqSBSTpWZW8IUM1FqWCUqLaHFYqSuiVFRxL/Byi1rMxBlQnq0jov+w7yfngYA/83Pf4204ef+hv+1/Pf5Wtt4B9931Xgrz0kdkyaheTFubi4qAAllmWhM6VYas/wWsKaevPtW6L7GvLj97qJhgWkpN/vg2VjTy2siXjTBjOPgcsQKT3JZJKRZaDrBgsLC3i9fibWlGQizcraKrpuEE8kqNVqbJw5xeHhIcfHJzMox4SPf/zH1Q24v7/PBz/4QTa33+IrX/kaxdKA0XDC4vwCum4QDoR568Ydstl53r61zVe/9HUee+wR3G4nhUKJM2dOE40GaDbr1Os10pk4LjcYmkclUiWTSWVokYlXe3t7hEIhFpfFRSM5iHKi4/P5uHnzJp1OhxdffFE4+twxRsPh7PjuQrfE6NXnduF2OXDpNrptsnF6HZfTQafTYXVlifF4SLVSmoWuBtjavEs6nSYUTuD3+2nUW7OFfUggZJBOZWl1O7z88qsz0K642bOZeSqVGqn0PA8ebIGtoxsOTgo5dGzWz5xnMJoAFktLiwSDftrdDjdu3CAdDtFpNHDrGp/+uX9ENBql1e5y7959kv0xlm2zvbfLE088wQ//8N/hP/yHP+XKtatc/9a3+OQnP8kLL7xAu93mp/7bT/Grv/qrPPLII6yns5TrTSKJFMdbt5lfWmZrc5NqUzAU3V4vY9PENC10l7hlpGV+OrUVq+Cdml8QoEUvRHhRFhYWFB/hypUrqrRwu91cu3aN4+NjJR7TtHdyUJxOJ6VSSW0I165dE7g4y1KNw0qlonwWkg5dLpcVnFdCiw3DoNlsisXmvW6IAhTWStbMkq8okdg+nw+Hjmqi+DweprOmi1z95PjH63XPtORTJpMR/UGXsBnA7/dijicEg34ikRDdbhuHRxyF05kMiYSDTr9Hv98nl8vz0ksvEYlGqdXqZLMZ9vb2iEQiLC8v8/Ef+3G+8IUvqBFTt9vF6/GzsXGKVCrFgwdbTIYmt269TdAfwhxZLMyvcPfuPa5cuozX5aTV7GFOx+gOQdxJpaM4XU66vRamOabdaRLwuBS3r9frKfutDH2RUI3NzU21m0iK0PHxsYrik/Vqr9djrE9xGC7cHh9OQ8BAHNZUpQ15PB6sqUmv3eHcxhk2N+9jmxM0y+bU2gq6rnPjxg0WFxfp93vKo7+/v084HMY0xZze7fJizoKBZV2s6/rMugwbGxt89rN/QDjgxWbKuXPnmE4ndPo90DUWFhYJhEMUTnIsZdP0xgJZ59Tg6mOP0Wg2WVtfJxiJU2u06e0fwlSMQD/87PP8i//lX/B3/+tPcOvGTVqtFr/8y7/MxYsX+fSnP81v//Zvq8Ceo6MjhcQbj8eKcBWLxeiOhIR9PHMaOp0G5tQm7A8o9P506mEyns5KOs+7KNwy/GU4HHJ4eEgsFlMaBTlql9Qmy7KUIe7hyVQikSCbzXJ0dCSus1nzeW5uTrFM5YlgNJqVN8GgCP+Nx5Xhbn5+Xp00NP09vii43e7ZzVcjEo0q6e/Ozo6AhkyndLpdUqkM85EEvV6PZGZRdGzDSU6fPo2u6xwcHGBoHhbm17ieu47XHyIYidPpjVkLZui02ixl50nF4/SaNQaDHj2vuMFqrSL7+4f80A/9MNs7+6QzUZaXF7l16xarq6u879oFtGFb9D1CHr7zza+iDdu879FH6XZFzNnv/M5v0Rh0FPxkMBiwtrbG1atXCQaDvPjii0SSHnaO7/LY40/x4MEDRpMBr77xBt9+6w3m0hk+8fEfZTQasbwQYGVlhVQmILIpLpylXC4zvygyDx57/Enefvtt0hknb775Jul4ikq+jtcvtAmd9pA337qD7nZy/8ED/MEAnd6QUChK1BEUwJNEGtu2KRdLZDMLVCoVHEOYz2RE46o3Ib0QoNxsk1lawh/ycmfrPsFgiOHUIleqCoHVrRt4fT5s3YE90XE6DVxTF7tHB3zgg8+ys3cAbjd6z4897hL2x5gMTH7mv/l7/NVf/SVzC1lyuSNOCiXOnz9P7sZNnn76abY27+OeTJmPJvDZDnrDCdn1BXweF7Vmg3Y1jzU8zb/73d+jPxqxtbvH8x/5CP6gwa/8z79CIBDgdz/zh9QbDU6vLYLLRalW5/9+4d8LDoLLSTIaZmdzi77fj2HoHBZKFKotzpzZmAUNh6g3WzhsJ4Ou4x3fQixKr98Fc0w4EaLcKDPVIjg9MQzLolLNEYvFOHPmigq6tSwxdZKBuEtLS8r0d/HiRaU3kAyQjY0NHjx4oHJEZMBxr9djbW3tXZg9j8ej/DZ7e3uYpok9mTJ0exn0evTtLqlYAoetgWmha+9x74M5s0TXajUWFxdxOp3s7e2JlbrbZX19fUbAzStyTS6XQ9d10um0mjTIiPlnnvkAR0dHjCZC03/tkSt0mi1Vp7VaLWKhEMFgkJ4h2AZTxoqOD6sAACAASURBVHz42Q9RPMnjc7qpVar81r/8TT7/+c8LoYhTI7uwyOVrj7Czs0N/NObilavEkilMG779ndcJhCM4g4L2JBs6o9GIF198UX0ejQqF2+3btzEMg0uXrvD2zRsKifbCCy8IqGm5KObSdwfUajVKlTqFglj5Y4kMb916m8ODIxHm0mhjTjSGE3Fq6XQ6lMpl9vf3sTSIJeIsLCzQ7or0pmZLuCLlbpTJZNja2uLHf/zHuX/nLvF4fEacTrC5ucmlS5cYDgdMrZGCtYSCEZpN0dsxZ27LWr1OKp0VwNBAgGw2qxpkkjAkX5NPfOITfOc731E06/F4zFNPPcUbb7zBx3/sx3jjjTeEN6LXxTB0XDoMxyNu3XqbRDRKJBzk4oWr/PsvfJE7Dx5guJyMrSkvv/oK2/tHhONxOsM+gVCE9Y3THOxv8ciVq+ho7O/v49Qd/ODf+SHyuRNCkTB3b99hZWUFl9MzY3L6OHV6g+6gj9vrY2t7m/5sciKTvWS5K65JB9hTXC4DdzyKxyOYFa+//rqaCHi9XnVjj0Yjhaz3+XxkMhkRR+dyCfHYTBUpaeaSlCXHyoCaTMi8z9FopDJBgsEghu4QorxZItj+4YFigdrfYyb5noCsaIjkoNOnT7/LzbW1tcXGxoZyRcpfSGq8h8OhqqXa7TaGYTA3NzfLPrDVG9ZqtYjH46rmCgaDnDlzhgsXLjCXyWCZJrY55f69e5QKRQ4PDnjkylX+2a//On/3p36K82fPks7McenyVYqlCqFwlKklqMR/9fUX8Xj9tNpdMlkR6ZbNZnn66ad58skn6Xa7rK6u8jM/8zP83M/9HOl0mt3dXQXFEFLYkAqFcbpcVKtVXnvtO7x6/TWK5QroDobjCW6Pj/5gRKFYYnNrl1qjycQEry9Ardul3u5QaTQ5LhQZmVN8wRD+QIj1tdMMB2OYanicXoXTz2QyqvmYyWSIx+McHR0Ri8WIRCKKATgYDBSApdvtquPo/8PcmwZJct/nmU9WVVZV1n1XV/V9d093YwZzAJgZAhgQBCiSokCQIlf3ilyJor0rWbIlOeSVvAxJQcV6l6uw5dUBWTZF0RQFS6IhkiABEAQHBDADzH10T0/fd9d931lVuR/+lQnAQVBa7YYD9QWY6YmensrKf/6O931e/bqoqkpDbVGpVg0BWrlcFgMwtwdzTyrudDp7MfY2fuZnfoann34an8/HpcuXmJycZHFxkSeffJLLly+L8J+eBkCAdToodictVcWqKFhtAu+/uLxMuVFjP3FIvlRkdXMLWRGsxmw+T6NVZ2Nrk7HRCV6/fIlKrcra2hrFStlox1qtFi6PG6fTSSAQYHh4GLdb4NJHR8eFSpE3w1nNVhFlqKdteb1e4vE4IG5U3enYbrc5PDwkk8kYwCA9Qbyvrw/gzaF5uUyhUGB9fZ1kMmnYp10uF4FAwAg1ajQahntWx+PpbZC+jrZYLPh8PpGH0rPW6zh/HSjb/QHW6XdJQtQffPY3/vn/Yqix6vW6YQ++evUqExMTbG5uks3mDOilnutQrVaNXe/m5iY+n4+21kW2yuwd7NPVuoRDYdbX1ikUcvjcbnweD1azwJ91220+9pEnqZYqpFNpJkbGsVvtjI2OUsqX+S9f+QqrK6uMz0zz0vnznHvve7l5e5H7HjjN2MQER+YXKJTKjE1MkCsU8Ps8xGJxtrd3SCaS9PcPkEgkWVxc4trVa6gtFbWlMjI2SaPZYunOEuPjE7g9bg4PE1jMFirVGl6vh2vXrrO8tk4ynWVze58r125Qb6rcXdnE4fSws3dAOltAtinkG3XqzRaFcoX9ZJJmq01XMqHYHUiY6OuLY5NtaF2w9OAr5WJJfKg9Xk4cP47ZbGZ0eIQrV64IvqHLi9vtottt02jUDVFYq6VSrdTI5fI9MpMgXrXUNrLNhkW2ksvnMZstDA2PsLW9g9PhYKA/9haIaYnFxUXW1td49NFHWVpa5Fd/9Vd57rnn0CQTtYogSLt7EXf7+3soDgculxvF6cBmV1jd2WZ1axNPIEA6X8Tp9dLqtDlMpwhFo7h9Xkq1CharBdlkYmt7hyNH5nG6nNhsdvZ2d5FtMjtb23Q6Xe7cXeaBs2c4du9xGs0me4cHVOt1Uuks6UyGZlOl2eNfunr8yVqtBlqHWCyGSRKbtFq1Ymy8nE6XIUDS4wrL5bJhknK73TgcYvvT6XRYWVkxoK+FQoFqtWpAi3Xpsl4pWCwW45DQU73eGrNY71XOSi8H0+VyGXOKZ188zz/7le+fOv2uqBSQBDUoEAhw4sQJgzNosViMYFidFKTruPUTUF/z6JNbh8NBpVI2AK+6Hz0Y9OP1eolGo704OdF7WyQTa8t3KRdLvOf0GdwOJ3Q1um0BPvU4XbTqDf72q8/wP/7sp7hw8Q2OHjuObLUjW+2kMzlsdgdmi5X3PPiwMUA6ceIEExMTXLp0yfBq6EDWfD5PJpPpYc26PPvss+zvC16iZBEp2LV6XfTpWDCZbdQbLba299g/SFIoVsjmCqTSeaw2hUq1TrlSo1xvIMlWFKcbyWzBZlNwuTy0mm3sNgeybEOWbcTjcYPV2N/fj9Vq5bXXXmNmZsaAjtZqtbf1t/o10GPwdLGN2+1GtlmpNepoEkbcnv6++3rVglNxGEE3kUiE5557zqhWlpeXOXbsGE8//bQxKJNlG1JPRl4slBkeGqVUKtNFQsNCrdniMJ0hVyqTyRfomiQk2Uqz3cHt89LoqHR7n6tmq8XtpTtMzc5w5+4ymUyGXCGPN+AHTEgWM9VGnbm5eUqlMmtra2xvb6OqHbLZrPAhNFq0NeGdsdrsxoDb6XQa1CidSaHTlgqFgtEe6C5JwEjx0mEroVCIYDBIJBKhv7/fGAhPTk7i9/vfhmjXv4+OVwOMp7+OH/D7/fT19SHbrMg2ETRbKBUpVcooTgdur4d2551Xku+KQ8HaExMlEgkuX75sEIn0fiqZTPLGG28YJVA4HDZ2svpk9/DwELvdztbWFhOTI/gDHhrNCu12g63tdSM38c6dO6ysrPSMRVVskpnNtXXajSYH27s0e2Xu4q3bxONxjh07xun3nOVTn/oUly9fJhKJEI1G+bEf+zFCoRAf+tCHDHJQMBjk6NF7UdUOiUSKfL7IwsJRHA4XNpuC1WrHbncQDkfJFopMzszS1rpIJgs7u/s4XG72dvfJ5PK0Wm1CoQiK202xWiWRyWGxK7S6EolMnoNUFllxgcWG0xugVK4Siw8QCIQYGBqm3YV4/yCTk9NIkplmvUWzoSJbbIbzU5/HZLNZ7rnnHl5++WVUVWVmZoaBAeErGBsbw+VyMTExYYBjK5WKQdpOJBJ0ul2SqRTRaJRStWLkO3hdbs6ePYvW6ZLLvJmJeeLECSRJMuYJDz/8MD/3cz9nOCjL5TJmq0wuV2A/kcSmONhPpmh1JZptjf1UhkK1iWS14wmGqakdhienqLdaDI+NYbZaCUfD7B/u4w/6abYamGUL+weH1BpN7qyusbyyxt2VNRrtDvlyBbvi5J7jJ1DbXSrVOoVyhUq1zvrGFvWmKmC5dgdWm93gIlitVjweD4VCwVB56i7JZDIp3KKNBslk0sjm0B2S+qag3W4byVH6gaqvKmu1GgMDAxweHhrZHPq1GxkZIRwOE41GmZyc7EUiFIxcER18rOdx6nGG29vbbGxsYOulS32/17ti0NhSVQ4PD3nfhz9MZnfXsMvq4Rj1ep2hoSG2t7cZHR0lHo8b6U9//ud/ztjYGIFAgHw+Ly5WPkunozIw0E86naFcqpDOJFFsDvp7se+6WMjWC+gwSaLH0mPUnG4XNruLTm8gs76+zsLCAsfuO45abRowDJ28s7q6yuuvv04+e2gAW/ULqNN+9ciuQCBA39AI58+f59y5c2w514zIOJtiN7BtktrC4/GRyWRot9uMjIwZ2oNGo8HMzBFsNhuHhwlmZ2bY29sjFovRF4myurSMq9cj9/f3Y7KYjXmGV/Eb76Heiy4vL3PixAnKvSj5U6dOUW+baDYFTj6dTtPuNEilUmi9UBRJEuEy2Wwai81KvlQ0Yux1ebTH6cJutVLprcJkWebMmTN84xtfM/IJpqen+dznPkcoFOrh43thtV3BkizXqihOF6GQg0q5iEm2Eo700c4mCYaE/j+bySNZzBTKoiVaX19HkiTjvZscnqRer7OzvUk4FKRcKOIPBvAF/BQLOUbGxzDJFmZmZlAUha3dPQ4TCQKBEKVKhVxBPGnNZpm+mBOrbDYkyzoZS3eiCiWizyAr6UNAnZmpU6R13qiOc3O5XG/jLS4vLxuuRkVRBEm6d5hYLBa2t7eNFa9ugtO9Eel0mlqjAaUSFqsVi9XK3sEBXSAQDP5/s07/93hZzGa8Xi8XvvMdgsEgg4ODxlQVYHNzs6ce0wwBhn5q/uiP/ii3bt3i2LFjbG1toSgKFbWKz+9lbn6ar/3dBl6v8JA77CLSO5fLYzeJC9Gwgi8oIsmbmoaGiXK9jiSb+eGf+ikONoRH3R0OQKtFvidZLRezWC1wsLfF4f4209PT9EUCzEyNGU+DtbU1pqamKJVKfPvb32Z4eJjr16/TaLRYunOXvlg/V65exaEoVBtNWo0Wit1OvlhC0zo4OgqZYpl4PC6YCLt7PV17i1azyfrqGmazWZSl9QaDoTBhn8h9WJidQTZJXLtyGbPZLA6LeJQ7d5d69mbNYD0GAgHaqsrx48fJptKsra0JRBrCIdnpdLh8+TJj40O9ktnFXvXAGB42u22cbhfVeg3ZYiNfFKnO9WqN0eER2i2VaDBEo1NndnaWJz7yAT772X8tsgo6Kq+99hqbm5ukUim8Xi+zs3P4e96QYi6PCtgdLhLpDOFAEIfDQbpQQXF5Wbp7l/HxUeYmJsnnRWamRod6vYbW6RLvjxEMBrnw2hsi6i8QRO3JmovVGodXr3P/qRP0x/txe3xIiDSutfV1TBYZk7WJ2uv/TRYZtbdetHgU0Zo0m9hkUYWWu23sdisCCUsvaMdk6Ap0MtPBwYGR0qRTyovFotFW6IeZfoDotmt9ZhAKhbh06RIgSEu61dpmszE5OWmY65xOp/Ez6oY4XQb9rsex6b1RvV43AjeTySRDQ0PIskw8HueNN95AkkwGxmtnZ4elpSWcTifT09O8+uqrWK1WSqUSuWoar9fP6dP3YzbJfO/li6TTKVwOF4pZRjaZ3zKVFW1IpwtOvx+Hy8NHH3scUw9EEYyG6XQ6JNbXuHjxIgBLS0tEIhEymYwRfxbyefnQ+x9neW2dRCJBMBhkdnaWxcVFUqmUoT8fGhoiGAzyvStX6XQ6LCwc5WtfewaP243VaqFeNyNbRKpUp9NhMNZHMnHYE3C56DQbRPxBOp0OQ3HheCuVSoR8HmrNBjYgn8ngslqxAKGgn3qzgcNpp6O1aXdVEokEk5OTmBFeiuRhgqnJSc6fP8/k2Dgmk4nDw0MKVZWFhTmuXb9MNBpld3cXr9dDo9HslboCctNsizJ4YGCIQr5EX1+celWs74ZGxYpycHAQr9vDxz/+cX7nt/93Q3r7W//6t/jUpz7FmTNnuHXrVi/A1sLW5rZRiiuKQrPVIRYfwG4XAa4Ws8z21iYT41MoDhvJgyQTE2MCRrJ0g8G+OIVCgYmRYV5//XWGR8dEpdaoIyGRSCUJBvy02iq+YIBIX5RkOkU+k8XldtMX72dlZQV373BK5fI4XS7sdgfegB9Tp24EvApPSg3sogXweVyGIGph4ZhQXRaLbGxskM1mmZmZoVgsGjRr3QRVrVYN09309DQAW1tbJBIJJEliamqqNzOrGFzIjY0N6vU6/f39tNttEomEoYCV7TbCjggOl/BSeHwCQhMIBQ2Z9fd7vStmCpqmCXoQGINAPdnG5/MZ5bge0Q4YZOJAIEAsFjNKbl1GOjExZhB1dU6dPqnVraiFQgHF5WR0bIyRsVEikQj+YID19XVye3uUc3kq9RovfvclTCbw+TxUq2X8fi+ZTIpIJMTExBjb25tcuvQ6Pp+HVDLDmdPvYXZmjqHBET765I/y3kfex8jwGNFIDJtVQbbYCAZCZPI5SqUS9933gOGgEweUAIKK1V6JcrnUk6mKAZ7Dae/tuxuGE3JjbR27WSYWitCo1jD3vCRTU1PYbDYajYaRnK3H0DebTex2u7F+1FWToVBIEIo6HdbW1oTiMxrF1dsE6KsufZKtdjsoLjEE1tsHnRysNsBpV1CsorSen5/nxRdfNNK/f/d3f1cEBt+9a+QoZHJZIwNDTz6Se9Fupp613WpXjOi0XCpHLBYjHA4L92NXM7ZT9WoNxWan1vPO6INgp9NJsdAL4+1AvdVkYWHBWNFOTExw7NgxUqkUSm/qHwiEsCp2sTru8R51F+5bV4SqqhqZoKqqIssyoVDICNxJJpOAAMnoSeI6el+vhPVUaX3wqw8c9VV2Pp9nbm7O0MTAmz4K3ewUCoWMvFLd86Ov6Vutd/mh0Gm3sVkk/B4nfeEAG6vLeJx2pK5Ks1YmebCL3+M0es7NzU2Gh4eN/u/GjRtMTEwY0VyF9SK59QJyy8Ls2BThSID4cJSx2VGaUpdyW6XQ6lLvWpFrJvyOINVinWA4imQ2oXaaBIZifPeFb/C3X/oCe8u3efbLXyG1uomlrtLvCzE/Oc/Q4ASjo0f48Z/+NL/wP/8q0cEpPv6JJ4lEA8wemWRmdoK7K4t0tRb3P3CC6Zlx5uanaXcaxP0e/uknfxZaDdw2mV/5pV/EjIRVsWNzOGkBtXab3Y19WtU2c1PzBD0hhmKDjA+N8fEnP8pgLI6mtnDarMycuof11C57+TSSw4bD48VidWDBznBsnFZJ4+zxh+kPDHPm4bMcpJJ0ZRstLBw/8zD5hkpDstBWbGxlkzj6/ExPTxvCo52dHZrNJrlcznBu6mhxh9WFWZNBs2A2y3S7GqlMGqfbheyAvsEYLr+b3Z1D7DYXhXyFbtfEr/3ab1Ap19G6JoKBCH5fCI/bT6taxmqGSNBH8mAXi9Qlm9pnY2OZTOYAn8/OrVuXcLhMaDRJ5RIUyiWWVza5tbhCvWUmV2owPj3HxSs36FpklB4qPZFI0Na62BQ7JqsZk1XmW9/5Nn/ztWfI1ypMTEwQCYfJpNK0Gk2cioNoMMLsxAxOmxO11iboCTEcHyISCOJWHJi7JqROl06jjQUJta4S8PrpC0colUoGXt/j8RCPxwmHw0bg7ZUrV4TWo1XH43YQCvoEJ/Rgl3wuTaNeYX5uBokOil2mkM/QaUv0RQe4s7RKrG+Q9z36QzQbHTzuAD5vCIvZjtvlxyrZcFpdtKoqtWKdwb4h7p0/js1kN7JCvt/rXdM+6AEm6XTa2Nm6XELiqyiK4BTuJY2+S2cG6Cz8dDoNCGrSUGgQVVXZONjBHwoyNTXB9165QDw+wEj/GJFQlJA/hMPm5KFHzvHC+ZeIjwxxcHDA5Ow00ckJvv5XT5PLZGn3shss9TbZfA5fIEij1cRuFWWs2+02VnDNpngavfDCC2QyGSKRCFtbW0Z4h6IojIyM9HT2KpevXCEYDPLaa6+RzmaYnZ3l0tUrdDodYv1xwzc/OTnJrVu3OH36NNVqlZWVFUOANDAwgM/n4/qd62JXbjIJ1aMvSK0q9tXLy8u4HG6+8Y1vGFZb3bxTKBYMnT9g5HY2m02iYeEgtdktlMtFtrbT2O02Y2qu8wJNVpuB4Bc6fCEiq1aroInqb3Nzk+npaeN6njgpeJEAZrP0to2S7pjVhUGaptHf38/29ja1Wo3bt29z5MgRHE4Lw0OjFApC8zA5MWP4X0KhEHfu3Hkz79Hc4x9KoiTXeYVFtWgoCRcXFzE1VEOhiUlUbhZZZWnlOi21YwwTd/f3OH7sXubm5nj55e+SzaVFSG29jtUiU6vVsFjMhKIi3bpYFH9PIBBgb2/P2Fro16PefVOcp1vT9UAhncSkV8c2m2Ig2d663dC1DZqmGQe3rrrUE7GsVquoIMzvfOu/K8RLf/SH//6zHzj3HjY3t3AoTkySmWKhhNYVpOdGo0k2m8NiFWsaXc1YKBQMoISec1gqlWhWmhw9fi8m2czu3g5Wm5WWqiLLFhq1Fq2mSkft4vX6aNZLeIJ+AtEwJ888QKvV5Ld/61/jUBRMXY0Pf/BDqM0W5VqTwbExvIEAIxNTxAYGmJ6dxmq1UK1VabUaPP30VzjY3+XGjRsMDw8bk/zBwUEWFxdZWlpieXm5F4W3R7FUor+/X6Dse8DNkbFRFEVhfWNdQDs9gi40Pj5uyGLHxsaoVqtEIhFjIt0F9vcPGBkZoVyqEvAFaTQaeN1eTpw4QbVS5tSp+7hy5QpDo/2EAiEiwSixaB9SF4IBP/Vqlf3dHVwOB9VymbGRKcxmE1evXsZkkgyyUCAQpNVUaTaFb7+ptnuo8zfnQ2KA5uFHPvwR/uIvvojVasNqs/OFL3yBsbExfuEzn+Zzn/scwWCAcFjs6Vtqk/2DffoikbcF7OrtTjAYZH5+3ijLO73DKxYTaLuhIYEfAwgEhZHN43Hh8/oJRyLs7OxQyBdwOh34vSKyHg0qlQqNRpOhoWFq9RqZXIH17U2y+Tz5Uhm106bT1fjJn/5pvvX8twhEQizMTuFyu1hZXaPVrOP3eelqXdA0FIcCmnhoub1ew9z31rZMzyk5ffq0eKglU2QyWSQkZNmK1WqjkC9gkkysr2/QqDeQZStul5v1jW1DR/LWdiOfzxOJRIw1p77d0TH0eoBzJBLhr7/2LL/0y7/8fcVL74pKQdM03D4v8UGhT1AcDkyyhZ39Pfr6+rDYrFQbdZxWq1Eh6CenPmXV34RgMIhdUshk0qiqSDCKRCKsr6+jaTAUH0NRxNOuUMrT7ISIRSIEQ2GajSZul4eQP0ghm2eof4B0IoVJk+gbEuiziZlZzGYJb8BPPpfD7nTwvdeeE4Rmh4iGP3nypBHH9v73v9/gTDocQsBTKpWo1Rp0ul0uXrxIKBQyJLcmWVwSi0UM8UanB2i1WmxsbxEKhag1G7S1LleuXyNXLDA0NERb63JwcMDQ0BAH+wkxoFO7nDhxgksXL5FMpohEIly69DpHjy4wPDDI9773KhIyo6NjdDoa1VIZqasRDYUpFvOEQgFWVlbodoV7NZ/PoqEaq7FQKEw2K3T2XcmExWzGKst02sIINjQwSLVSotvuYJZMlMolFKebYMiPyQxPPfUU0O2p+pzUGzUjWVkXpO3v7xuAUrfbbWj733jjDT7xiU+Qz6e5ffs2fX0DxPoEpWh4aBTJpJFOp7BarQwP92M2m0mmRGK3bBahOqbeASZJprcZ2FZXBVQnmUyiIaFpEm6bFYdk4pmvP8PZBx+k0Wxy5cpVBgZEnoZDsbG1sYLT6cDpEBVkSzVh7wUJ22w2o6rqdrt4vV6y2SzBYJBms8nAwADbmxsG5FZXIZpMJkMXoudDvlXarAfadrtdQ/XY6XQMY1Q6nTboXIqi0N8vhqeKotDutN/xfnxXHAr6BmF1dZXBwUHjHzI0NISmafT19YkPSkN9W1afLpl1u92cOnWKnZ0dnE4nQ7Fhsc/3OFHsVuoHFR48e5pkIs3tW3fJ5fL43EHKtSqNZonHnvywoYG/ePEiI8PDVMsV3nP/aXa3t5E6XdzhCIODg3Q7beGFT6dYXVmmWMxz/wMnqZXFAHRocJQvf/nLxCJRPvwLn+FrX/sah4eHXHjlVYaHh6kUSwwNDWG22uj2gkmXlpYIR8WTzBsQXMZWW3gKkslkz7Irk0gksNvFoCsejxsy2aWlJfz+IEtLy9x79DjXrt3g1/7Fr/Lss88SDUWZmBinXCpxZG5WBMEGQnz8iSe58NolGqVKT7kn2q+h4X4KqRSS2sFkN5FOZxkaGqJQyOF0ulDVFvl8gQfun2R62sLt27eRLOKp1e1igF1yuSzz8wtoCLJxJBLBapMZjPdjsVg43NvFaVeolAo0akIIJXU79IVDZDMZ/H6/sa7TU7B1O/iTTz7Jt771LT784Q8RiWSMNd2tm0uGMa5aKxGLR9nc3DaEWH3ROBJQrZYpZHPIspmO1sblclOv1/m7Z74GNrGqbrYErblWb3KYTTM8LD5TxWqFRqNBULGTTGcYGuinWi3jcHnw+jxYLWZMZpm+vvjbDrhUKoXL5TJ0K2azmVwuRzabxeVykU6JwNpyudqDrLiNGc74uEC7pVIpul2hiAyFQuTzeRYWFgiHw+zv7xstm67wtVqthqlQH8LHYjEODw+xyu8sXnpXtA9/8G9//7OPP3wGxeGgv3+AfKHA1NQ0xVKJbC6Hojgolcp4PKI6cLvdximoT1dDoZDR26ezGQ6Th5w6JcQ44aAfl8NNR+2QSmfxBwLIVivvffx9LJy4l3yxhMlkZmdrm/3dffoifaiNlmhhOhrTUzMMHz2CqrZZWlykpaqkUgkikTA+n5drly/j8XhYXLxFvdbk3Llz/N0zz7B4+zZ3l5fZ2triJ3/iJ7h58yYSoqctlMqGWUuSJGq9wJr+wQGhj6+Ip+bCkTmk3vop2tdHsVQy3HZ6rqTabqOqGqFgBNkiBEXNXpLxzvYWnW6beKyPSqVMs9nA5/Pw10//NW21Q9AfZO7IHB63m6XFJaamJohGwty8eR2H20+9XsNkglqtyt7eTi/Ny0elXKVcruB2u+mP9XG4v4/H5aZcLIKm4XG7mJs9QjwWY2tzA6ts4QMf+ADFQoF/8plf4PLl19G6HdwuJ8PDA6yu3OX4vfdSLhVoNJrMzMwAGFFpbrebS5cuceTIEZaXl1EUBZvNyubmNi6nB7PZQqOuEg5H6HY1oIvfJ7B5icQhVpuDcrnChz74AdLpDLLZzIkTJ8nnstRqdQqFPDarjVq3QxcwyzKYzJjMZoLhEJgkOloXVW0gmTTUegvZIlOpVjnznrNYzGbKpRKyTcbn8dFSVbp0DYmy2+2mhyTpugAAIABJREFUWq3S7XaFXwJxcx89epSBgQGKBZEHortXdSCLfhPr/MVCoYDZYjVEfbpKUudvejzCyLW/v0+5XDYozs1mE6fTyfj4OE6nk68++xy/9M++f/vwrtg+IEkEwxEyuTzJdIZcocjm9g6ZXJ7xySmaapu9g0ODlJvNCpGKPvRJJpPcvn2b3d1dw7UXiUS4du0arVZDRJG7nQQCPoJBPysrKzzyvkd58cUXMPXSenQY64kTJ7BbrUxOTvLGG2/w4PseJRiPsbchnmzWHgm63W5zcHDA2NgYI+NjjI6O8sgjjzI8PMx3v/tdw849OTmJ0+nk+eefByAWi/Hwww+LhOoeGEMfBnm9XiHYKRYNFWSukMcsW+iikcll0SRhIa43G9QadRqtJk21ZaC/Dg+TnD37INls3gBr6E8Om02m1Wrw6quvGrOMVqvF4aHwXUxOTtJut4nFYkZe5EMPPUQqlcLj8RhJ1uKGtBGNRo0VrziQO711ZafXcuS5efMmmibK29OnTzM4OMj3XjnP0NAQfr+faDRqxLFfuXKJra0tIpEIV69eNVB8mUyGvb09PvKRj7C0tMTMzAznzp3j/PnvMTIywszMLLVqw3AeBgIBHIoLj0fYlI8fP2kATq9dvUEkEmFgYIitrS1y2R6JSDLTaAi9SrujGSg0HVNnRsNmMeOw2XEpwsugdtrkiyWuXr3K6uoqUzPTtNUOO/t7gmFZbxkrSX2dWKlUDDSaoiiGRN9mU7DbHVitdoLBMHa7A5fLg6I4CQbDKIoTMBEIhAy0njBcOSmVRCJ4Lpdja2sLk8nEcC8bIxaLGRRp3Wnpcrl+YEKUpP2AL/73eh1bOKJ98+kv8NprrzE3NyegoZEI6XSa9fV1jhw5gqIoJA4OGR8fJ51Os729zQMPPMDi4iI7OzsMDw9zeHhIp9PhQ0/8CMnDQ1793suEw2HQusTj/XQ1M8urW/yb/+PzxAaHOThM4vMFeP/7HiOfyWLFxOz0DPefPCXKVq+btY11IUd1e3n11VeZnJxEVZvce+I47Xab3YN9bDZx0S9cuEBie5eBgQG+9KUvMTk5iSRJBAIBtra2BAuy57voyjKjY2O0Wi0h6241OTg4wB8KAuLGN5vN+JxuwyJut9uNQFKdiKzLY8slkdFw/Ni9ZDIZGvUahUKOe+bnqdUqOOwKSCJzsNlq0WyqPPieR9jc3EJRnGxtbYhJP23q9SomE2gWF7dv3yQY8rG2toLarqOqLebnF9jc2EaWBSFLQj/YxFxnZ3uPmZkZWq12T38hDscf/vCPUK1W+fVf/3VUtdWD1Epcu3aFubk50uk0/f0xMvmSYYnXNw96EK7+lB0bG8PtdlMuVUmnMyh2JyBs9+l0mqmpMZbvLjE6OsLlK28wNDzG448/zn/6sz/j1KlT3LpxTYTnFvLIsiwYB40aak+DoXV6wzqtI2z7ahNFTzFvt3E6fGidLmaLhKLYGOiPA106ap16tUY4EkJRbFgtJmZnZ/H5fIaGQJ+R6FSlSqVCJBSlXC5zcHBgAFOcTicbGxuG9XlxcVFI8+0O7r33XoaGhtjf3yeREOwNs9lsVNL5fL6Hnq8aYJjh4WEDy/aZX/9Nbi0tf1+x87uiUtA0WF1ZZ3JiGrfLS7OhkkpmqNeaxPr6CQbCVMo1Fo4eNaas/f397O3tGVBNXZji9/u5ePEiX/rylxkZGcHpUDBpkM9kaTXq5PNZFhYWWF1fY3x8nPn5eVKHCfLZHE5FODKz2SyrG+uY/D5qjQZDY6P816e/wsLsFM1qCa/bTTadYXt7G4fNTjw2xOFBmjcuXTOi2+bn54lEIoyMjLC+vk6tJqLLh4eHmZ2dZWJiwrCJ68IUPRfQarUyMjJCIBAgGo0iy7KBm9OHVrrQqFgskkqleM97HsJiEYGtLpeLvr4+IwpvcnKSvf0dY8hUbdRJ57KkshmSmTSZXA63z8t+4hCzLNOVQDMJZsXCwgLLy8uMjIwQi8UYGxtje3ubcDhsRPSpqorUS+KSZdkofXWXq90uoK5PPfUUX/ziFw1/iY7vn5qaIplMMjk5zv3332+ARvQMhJ2dHSwWC6urqxQKBVRVFR6BjLih1ZYA9eorvOHhYa5cuYKEmd3dXYaHRnE6nfze7/0eH//4J1heXmbuyEKvOvMb0QAmk/gc6WG8jVpNPIUVB16XG6/bg8vhxG6TeylUYDKLRKhSqcTIyAiTk9PEB/p7a3MM/Fk+nzeurdPpNKoHWZbx+/34fUGGh0bx+4LYbQ7aaheX04PNqtBpa6CZcDk9eD1+I3TZZDIZIUFer/fNIOZe/oNe2XV7yWhvXVF2f4BL8l0xU/h3//b3P/uJJz9MXyyGy+2m1VYJRcJIJhOr62tcv3EDn99P3/gYG3fuEA6HjQ/T+vq6YQXW33CT1UxLbWK3yszPzdFpqdy6dZt6o0lXEqaZUKSPw3SCB06e4ebVG9TKVdFTlqscO3GCI2ce4NqFCwyMjvCN577FI8fvxWYxo3U6HOztYrFYqdWbTNyzwHdeeIl6o8nP/+I/QeplNei8xHa7jcvlwmaz0dfXRyAQ4ODgAKvDQVfTDEGNXVGEVdvrFRSqXFY8lTodgqEQqXQayWSi0WxiMptRO22q9RqdbheT2cyVS9eZmZkhcZjE6/Xg9/k4ODjEbNLY29vh4YcewmyWaDYbxAYHeeKJj3Dr9iLz8wssLi3xI0/8CCurq3TpABrLd+9w+vRDfOlLf8Ho6DDBYIBGU+zeBwYGqJSrlEplstksEh0atQZej5u22uolYCep1arIFivxWIzpqUn29g9IJhOG8MlkhnA4SKvVYmpqgt3dXdLpNIpD6BNu377N448/TrVaJZ/PG6CcU6dOcf78eUZGRrl9+za2XtDu5ctXONg/JJvN8EM/9EO4XE6GhgTePh4fxOFw4lDshEJBquUKnW6b8bFxJAnDityRzEiA1AXZasGjOHC5FCRNo1Iu0qxW0TpdOpoFm83aSwaz09U65HNZEocHVCpluprYmkxNjhvbJd08VS6XDby7Dmfd2d57G++gXBZYP6X3uahUKgwMDBAIBGg0GwZBTPgrNAYHB8nlcgaXMR6PG+2jJElMTk6KyqhUwmw281+/+Ty/+A4zhXfF9gENw5Ou76Cj0SiZTIbh4WEjRHUwJnpGWZapVqvs7e0ZVCVVVbFYLAQCAeqdJo899hgbvVJ9Z2eHe+65h5u3l+iabZw5c4bf/3d/SLVR58aNGyQSCXxuD/FoH1NTU6J1Wd/k2rVrKF43bp+XSDhILl/k1o0bPPmxj1Go1Ak7HNAUUFWXy8W3n30RuV0lGo3yl3/5l4a33ePxUC6XuXFD9LOKotB+SxyY2Wym3mwYNnG73Y7b6zHWkpFIBJvNxvDwMHt7e3Q6HWPzommCMHXkyDxXrlzh/Y89zvLyEjarwNNPTo4BIoFIV9Z97Md/nOe+9QLVatX4sF67dk2U5lKHZFLExT/33HM89NBDtDtNw925s7ONz+fvYcdHuHDhgjhsGi0j0EXPLCwWiz0I7h7lcpm1zS2sViuVSoVA0GfYpG02G/v7+wbC/OTJk9y8eRO/388rr7xivEd6y/Tiiy8yNzfH4uIiTqcTv9/P0aP3MjY2wdLiHcqVEslkkuXlJcKRAG6323DYCqm0mf39fTLZFLLZQqUiID3xeJygWVQLtXIJi1nCabfRabeoVSs0qxU6Jk3Me8xCoShmW1Zk2YRit+PzuQgH/b0tQM2YGemCLJ3epM8WALxeL9sbe8b7pStF9fxI3fnYbrfZ3983Phu6vFmWZSMsWK8gdQjt7u4uo6Oj5PN5I3+iXq//QEPU3ztTkCTpPwI/DKQ0TZvv/d5ngZ8H0r0/9q80TXu297XfAP4noAP8kqZpz/19Z8LCkWnt6//5KbFWunULVVUNpkI0GmVxcRFN0ygVygZsRd/J6oq1vb09Tp8+Tb1eJ5FK0u12uXnzJrOzs4ZWvVAoGDbWmzdvoqoqV29v8cRHfpRMJsfZsw/i83i5ceUylUKesNfN5MgQ95w6RbtY4vUrV2l027S6Xaqqyoc/+jG+853v8thj7+fOnTtcv34dv9vF1NQUmiRx7doNnG4XaBKr62v4fAG+893vCq97R3gGvH4f127eQDKZsNllknsH2KxWIn4/dpuNZKmK1yfQdHbZysBAnN2dLaGvd4iniCjXMRiQ5XLZ2FVHo1HOnj3L2toaPp+PjY0N0okiVqsVu93KsWPHxHTf4+Kll17C7Xbz7W8/z0MPPUT6MGHo9qvVMorLSSKREG1Op2V4SaqVvHHAhcJREokETrebzZ1tAn6xP9ckmJua5/btm5hMgNQxhnnNRpehgVHCoTiZdJ5EclX4GGRFwEBMFtROF18wwNVr1/D5fMQHYrSKOaKRGHc2NnE4vewcJnH7vLQaNc7ef4JKuQBqTfwdXXGztxpNdre3GRsb42BvH6tZeCUURaFeq2GxS4ZgSh+WFgoF433W3Zs+t+tNu3JHpb+/n1APftJRmwadeWg4Rj6fF1ua/n7Dsq7ng5rNAqFfKecNTmd/f79BS1JVlVKphM/nw+VyiTWtx4HFLA4CEOa14eFRJEmirYq2wO12c5hM9hKqBQ/j/PmXKJVzqKrK55/6MmubO993pvCPjaIH+H1N0/7Pt/6GJElHgB8D5oA48G1JkqY0TXtnIBxgMQsjR6lUIhqNGjgpnUnn8/mMQYrdbieTyTA+Pt5TojUYHx+n3W5z8+ZNLBYLuz3RUywWo9FokE6LPXM0GqXZbDI5Ocng4CBLS0ts7GQpFnLEYlHq9SqlQp5SqcTs7AyPPPwQL379GdaXlljf2CJXyBMbGSKVSPDRT/wPXHn9DZL7e/zB5z/P4OAghxvbNEJeIpEQ3S4E/V7yRZE0dObsewiFQiQSB+TzRbpdiXgkbMA5KrUy4cgwa7VVJEmiXK1RLJapdTWOHj1Kt6PxxsULyLLM4OAw+XwWkwbhsGiZ+vsHWV9fp1QSxGkQ/ezBwYFhrvrgBz/I8ePH+fIX/4pEIoE5EGBjfb33ZyXe/9jjvPjii8wfWWBjbZMjM1Pk8/meuEfqZXaa2NnZMiC4arNFp6Viki3k83k6HRFqQlfDLluJBENs7e7Q6XT4zvPfxu0R1GSNNqFwmEajwdjsOMlkmu3rV+jri+P2KphljXZHPE1rdfHUy6Y26dQzdGwtknslLGqXO7ev4faFqVWKhAMBMIPL4SWRTuBU7Lz48isE/T5kq5N4PE4sFuPcQw9x4YJ4L4cHh8QB4PawsbHB+PgoHo/HkM3rZPHt7e2e6EwM7Er5nPG01TmKjUZDbBYkzchv0MOARbBuxdj2TE9P4/V6BVC3VKJUzLK1tUWz2SSRSBhqRb366nQ6RnucSiVBk3pSZ/B4PMLT0W7jcQsMnNlsJpPJoGliuLy+vso9R+dZWlrCbP4BMIV/yKHwDlH07/R6AviKpmlNYFOSpDXgPkTC1Du+zGaTMZyq1WpGhqJ+iuq9lq5ilCTJcJrpKb16KaZjsmdmZrh69SqVSoUf/+mfZmttjc3NTex2O5VKhVdeeYV2u82tW7c4Mr/A9tYG/bEBrl69ylC8n9XVVcJeN7LFxvDoCFaXi8uXL1OuVjgyN0cul2NosJ9cJktfIMT29i6zU5OMTI+wviYMW0okhNVu58knn2B5ZRWrTeaRh8+xtbNNq1njG998lnypSKgvSqGU5+rVq9x7770oVhvrd1do1OqoZgHTOHfuHKVC3hgaeb1+ZJOIFtMdi3quQl9fnzGACofDgMCSraysiHJWA7/Hi8NmZ6hfxJUNDg5w8eJFTvZo1fVKlXyxjMVqB0lDcTppV9rE43Hu3r3Tq7yEWcqEk06nQ7UhYtmV3kBL143orV2zWsGt2OlqXRSXQjgUIpkS8XabO7todKjUykQCAqK6u7tLJpNBtppxKg7UTgPFasEideg2qmCSObZwhEvXb3Lv8ftI5IvEBwfpYmJ4eIhkKsGP/8RPoCgKq8urrK2t0VZbJA8FC6KvL0pff4zdrW0cLgfNVsPYbnQ6HQOKopOYdQFQt9s1HJ1vnRNonY6oXjvCgaivHIvFIh6Px0C69/f34/P5jOAe3VWptwi6W7bbc8sWi0WDsah/fiPhKMFgkMPDZM9nYTV+Fh3wYzabMJksZDIZkslDRseGe0Nhcdi80+sftJLsHQpf/2/ah58FSsBl4F9ompaXJOnfAxc1TftS78/9GfBNTdP++gd9/6NzM9rffuH/xmazGYYZPehCN+jcuXOH0WEx+Z6bm+Pw8BCXy9ULJOkJf/r7KRQKpLMZQ+sdjUaZPXEC6nXUVovV1VWKxSIgpKIm2cV/+LM/54EzZ9nZEd6BkNfPwtwca3eXmJ+colgscljIsra2xqOPvY+m2haWWquNxOEhAaePbCqNbLHQNz5IMBTiuedewOVysXjnLmbZQigUYe/ggPFxQS1WHDJmi4WT951CM1u4fWeJl1/5HuViBY/Hg9NqRzaZKTaEcKevL0Ly8BBJkuiLRKhUS3RaKpKk4XQ6WVpaYmhoiJWVFUPAEggEWFtbM9Zoc3NzjIyM4LMLk823vvUtRkZGGBgY4OqVa3i9XuHDl2VmZo6QyKXY2toiFAxgMkGzJcQy2VSSQNBHuSyCaLRum2oPTGqxWDHJFvpiQl3n9vjY29vDZrPRLtSwKWI45/K68Pp9tNHY2d3HYrMTCIY5ODggdbCLx+0mlUpgkrpEQgEkrYsJMPWQQWbJRKfbolprMDM/z87ePidPP8jW3j6K28fVm7c4feYMVqsNWZa5e+0Gg4ODbG0JaM7m5iYWk9kQ9ug3pU2WjPCdYDBINps1Dl19M1Wv17FZzAZ2brA/htfrxdxb/ZUKOUDMCkJhL1NTU4yPjxths6FQCFVVOXLkCCsrK2INaTP32JSysbFwuVwUi0WKxaIxO5EkiWP3LvDC89/uZVM6yWQyxONiCJlJ54yE6f3DPdLptDHHUttNI5Lu53/lN1m8u/qPbh++3+uPgN9BBFr/DvB54FP8v4iilyTp08CnAWLRMPm8KNuPHDliZEjqrIDhkRFjX1sulwmHw4brUI9ir9fr5PN5mk3hdygWi4yOjrK/v8+rL7xANBolnU4zMDBAt9tlZWWFcDhMKnHA+vqquEjzR/H5fJw8dYqLr11ArZXZ2t2h1WqxtLLMqfvvo1SpIMtiZeaw2sgkU9SrZYb645w8cYKsWuVP//RP0TRoNGr0x6LYHApLd+4yPj7OztYGicQBjVqF0ckJLl68yOjUBE888QSzc0d46k/+A7LFQlNVaXSadDTo6+vj7t27+L2CRLW/vy+08WhkMlmsViuKojA2NobNJhyLly9fZnd315DU6v2oqqo8evYcW1tbWK0CBKpLxc1mM/fd9wBXrlzB4/EQ7hfuRpPFbKQeX7hwAZssUSmVkIByuSCemr2VJCC0FFWxgq1WKkaKVcjuQjZbMMsiqq9ea+Jwi8GyZpLYP9hGUZxoHROdtiSyIenSbKhYzRqybMVikumqbWw2BcXhpK/PhlmC8dERtrfWaTRUCqUK586dY/nuXSKxGHfv3iXuFolg7XaLO3cWBWG5WqXZqqOhEYmG8Pv93F1aNFgPeiaj3h7oSsNarYbVbDLYDHrb0FFVI6FLh7UCJJNJwuGwcS1u376N1+sFhHtScBCkN41evSollUoZzsh6vW4crktLS9Tr9V41kTYOGZ/PR6oX0KPLnGOxGA6n2Dr09fUZjJEflBD1j6oU3ulrvSEjmqb9Xu9rzwGf1TTtB7YP0+Mj2p9+/rcZHBwUFFpZ5vz58zidTqampoxQUrqS4ZK8desWQ0NDhg8iEAhw/vx5sYIxmxgfH8fr9fLSSy8Z4her1cr09DQej8cQw9TrTb7+zee5fv02P/zER6lW69hlO6dOnOSN117FabPi83mJDQ0imYQQJZVNY5Nlrl++SqVY4qd+8ifZXVmFdoer68tileRysrO9R6utIstW9vYPKZfLqN0Ofl+Qza1V2kjUmw1agE1RePCh93L16jW++MUv8hv/8l9xsLvH3mGCM2fO8PLLL2NG9OsBvxe/34cZQV1yuhSaTRFBVigUjPdVb8VCoRD1ep1oNEqlUmFhepZTp05x5co1PG4fu7u7TExMUq3WuX7tJufOnaNeryM7FeYXjvCFL/xHGvUaw0NxRoeGWb5zi43NVaSuhsvloFKpiX24BM2GimQ2iSe0zYbPFyCZTlGv1wk6RPJ3uVylg7C9x/v7yRVzpDJprFYZr88NbSc+nxeny0atkicY8NFuNpAAMzYsZituh5eqmmRkZIS9fRFcs59MMb9wlO+88iqlhorD7ePG4iLHj58kvbVBJpN5281RrlREBdNuG65DqdM2cjj0G1cPsNF6K2SbzUa1VDQYl32RELVajWw6TbVaxWLCCJSZnBoxWI2BQABN03j88cf54z/+Y4LBIHNzc+LvsJqIx+Ps7grxG2AAbo4fPy4+O6oqfk6Pg3yu0DuwPL1rLqTwDsXFyZMnuX37Nmq31gPeYAjBAn5hB/jIz3yaqzdu/f9XKUiSFHtLxPyTwO3e//8d8GVJkv4vxKBxEnjj7/t+mqYRjUYxm81sbwsM19mzZ41TWF+7RWIDuBoN8YTv8fz01U4qleL48eP09fWxub1lVBl+vx+Hw8H09DSVSsV4IuqDn1AoQDQcIhwOUsznqTdVAgMBnnrqKd7/6Htp1KscPXqMlfU1ZFvPRNLtcvfuXRSHjQ8+/jH+05/8EV63m6mJSSbHx0ikklgsVpKyEM843S4cig2bTSaRSLGyvITNYcPVYxPYrVZMZjOXLl2iVKnw0Y9+lGe//jW++tVvsLu7y/PPP8+pU6fIZ9Lk83kUxcbOzi7O3hpN0IVLxr9NVYWbUYfK6rMGfRW1tr3OxOwkIxOj7Ozska+UWNnY5IknnqBcb3Dt1m2OHz9OIptkc3tX4L3MFpoNlU5HRVHsSF2NbreNbLFgNovS1yLLdGXo9IZbojRvGZBStdvBJIv/Wm0KGiaWlpYZGR1gamyMrtYCk4mxkQW6Whu304Zs7adcLGCWXKhqG60to9idBH19yI5wj1cRF9DaaJS7y0tEQiFaqSx22cL46BgmJMqFPHTaeL1uWq0GZrOEbDXT6aoUyiLAOO6LEw+G31aNwpscxHq9bnAkTJogjauqanAeQoGAANpqYrbQ6XQMi7vubnS5XEYocLfbRVVVscb1udjb2zMqXr1S8fv9mEziIbe3t2d8D6fDRSaTIRaLiXmGJhk/q05v7tAw1p8Au7u7tJpi9tZsNt/5/v4HrCT/EjgHhIAk8L/1fn0M0RpsAb+gHxKSJP2viFaiDfyypmnf/PsOhYmRQe3f/OavGLiver2OoigsLy/zyU9+kvX1dRHG2ZWMXbXeZ01MTLC4uGhAJDRNwx8MGGVWIpEQISejo2xsbHD06FGcTiexWIxCocD1a1eoN9oUS1W++J//C2MTkwwPDIvdsEXGYpZwO13Ew1ExwFyY4/LlS4xNjPLG6xeg0+WRs2dJJhL43G6uLy1icyi0muLpU2+2SKVS7B0khD/BbmN3d49ao0apUgGLpVcpOHjg7MPcWlykWChjtyr09cX5zKd/gfvvX+Azn/nnLN66wZkzZ7hnfo4//pM/ROpqTE1Ncu3aNXx+lzHQs/Ys5oCRYahTfyORCJKsMTN9hFarjSzbuHVzEQkL8/P3YDbLIvZecVKpiw2QiQ52q4XLr1+gUSsxMz1Bs1aiXq9SKZVxOL2onXaPXt2i1mhgs9npHxzg8CAJZqGi8wTcdNtdTCYLrYZKV+0yNNBPwOdiaDCO221jZ2eLpqaitpvcf/9JHn3fgyJdqViiXlP53vnLrK5sUa10GRgYYHCwH5fdhtOpsLsjBsmJTJZcpcrdlTXKTQE8DThEcJBZtlCuCW2G8JQIMI9ZFlGEg6GouMFDIePprmMBdft7sVjE1cOypdNpKqUCbrcbp6IIcZAkWlun04nLbWNwcBCfz8fp06ffJlC6efMmtVpNIPOsb6LdC4XC24xfJ0+eJBwOc+HCBaFU9TpZWrzD5OQkmiYO/FQqQyqV4tH3PiYgv/v72J2m3kBUtI97ewcU8iVMJhP/9F9+lqWV7z9TeFd4H2YmxrS//JPP02yKVGF9s+DxeMjlckiSJKK8HW5UVTUQ3kePHuVv/uZv+MQnPsHGxgalUon5+XlKFREso1tJt7a2GBsbY2VlxbAi6/vglaXbmKx28oUKf/XXz2Cy2OjvH2Rve4f3PvIIz/7dM4yNjXHP+Cx2uxVJtjAwNMDNpZuMjAyRThwyP3eE5MEhit1Ot7dG9Xi8HCQTKHYnuUKey5evkisWKORFqEq9WaPR7oBJoqy2aXc1PP4w991/ho2NDVRVo1wsIfXIRZ/85CdZvHWDdDrNxtoqd+/eFe5Pl4tCoYDDKQNvkpMajQaqqhIMBtne3jYw4sFgkGC/cNv19cWRLQrz8/dQLtVIp7MMD43y4IMP8dWvPsPx48d46cVv0203CQV8lAs58tkkVjNUKwUsJolsLoPF4hD5iiZxKJgsFpT/h7k3j7HsTM/7fme7+75X3drXruqu6m6S3RxuPRzbw5nRSNHi8SjeHUuIYdkeCAgEyXaQCIhtyQakRLKFOPIYiTRRZFmakUajmdGIbFLchks3m72wu/auveru+3buPUv++O49khJJCWIj4AUIEmywq1n31nfe73mf5/d4fciqgtvlRVIV6vU6TaNJMpnG7wnill0E/SHS0QjzM5Pkz0+Q7R5PP32NxReXwDTpVs6xZBNFU9EHFrbt4vS0xuFBjrffvs9s9jLTU1PkTw9JxcPsbT8SSPh2i/uPNlE9XrZ29hlYFpgdYrEYuXyeUrWCruvMzs/R7nXR+31CoRDReIzGeRld14nHBRw3k8nQaDRbfebVAAAgAElEQVQAEWYb8QpcikyhUBDAn06LcrmMjBCvvW5h9fZ6vWguHILUiHswMSFclnNzc3zuc5/j4cOHuF2y0+1ZKBRIJpPOxFetCjv3yJcTT0Qo5IssLi5ydHSCZVmk02Ok02nOTnPU63UqlQora7O0mh0KhQJjY+MYhkXuvIBp2vyTn/l5Nnf3/tRD4WNhc/6lf/OLP/3F7/+c4/oKBsVKKp1OO803uVyOZqPJxYsXuXPnDl6vl60tId51u11qtRqLi4sUi0UurFwgFouxubmJqqrU63VOTk5IpVL0ej1nIjk/P6eYzzE7v0Cr1eGt777LwDQ4OjphbnaWfC7H5bVLdDodarkSLrcLC+jpPWRVRpIgGotSq1RoNhp4PC62t3ecuGwoGCSZSuNyuzBNi8zYGNgSH3zwAZpLxR8MgQSBYAjV7UYfmIQjUU5Pz8lkxqhVa4SCguv367/+63zhL/8Qzz33HL/9ta+JFqlhtt/n8zEY9BzY7Si1ONIRKhWhho/uxbOLc0PmQRVNczM/v0Cj3qTZbHHp0hqPHz8ml8vjcmmcnZ6QTqWRJRvJtqhWSujdDpYlcPSmZdLrCUqSqqmAhM/vR5ZlenqPYCAEsiSgrkE3tmmDLbF64RJ+n494JMKje/doNur8zb/2w4yvr9Ipb8Oghzvmx+WRURQb3TAxzQG27MEfCNEfWGw8OKJcrpCKR3nn3XeQsWg3mvQHA6KJOOVSlezkNMV8nvFMkmgsyuO9PaSh3wUJ2p0OHq9X6AimQeE0h67rjnjdbredcpVKRXgTer0eiiwJoKymEQoGaLfbuIfofFnCyU+AuEKM+KGj+vpRF+fe3h5nZ2fUaxXHGTtCt6mqSqUitgkjyEo4HCYUDuL3+cnn81iWoJJvbGwOSUtJTk5OxDq036JQyKNpgj0yNzc/5DYEufnmO/z9f/APPr42Z1FBpnB0dMiNGzfY3Nyk220TDsPJiUBIra2tcX5+TrPdYnp2hieeeIIHDx44d2p7B+LJBLFE3Gngefz4MUdHR+RyOf7KX/krvP3220xMTLCyssL774segKPTU84KJWZnZ3n+mad45513CPk9FAonNFsdNLdCo91E1Q2CnTBzY3Hu3LlNMBJkff2S8AN0WiiqwsL6Go8+OiAVn2TpwhIHx0d84/d+n1gyQaPT5vD4CG/Az+KlZdqmB08kwuneHoupaVYmJykWi2zcvYvX6yUTDSIP0sheL9/6g99jZmaGf/Yv/zmmafLijU/y4z/+4/zSL/5r7t69S6VS4fqTlxkMBpSLJcbSGVRF4vCwR+74gHQsTLNeJxT00e222b23gc8fJOD1Ew/F2NncJlcocf3pZ3jju2+RnZxidnmeD997ky9+8YdJxFOkUhlef/U1en2J/qDD9s4GyeksbVnDq/RQvV5sy0JSIBaOYpgDJNPE7AnXXsSt0tTbeDUfab+fkOzC7Pe5srTA01eyZGdiNLpbYBTwhNzItsmg1kZzhZFkN2GfDJJFNNLGwkDxhqBaZm/7Pju5R0wFIxh9C8XvZbuc56xWFkUsnQqRpI+TfAXzrEg0mRnSigxqtQpe1YVqW+SOj2g0GrhdorUqOlyHd3WdeCqJiY2kKvRNA1O36Zw1mZqaolwuYiKRSMTpdrs0mjUqzSaaLA3BM5ozzUWjUcePM7rqjQ6LSDRJNBoFYDw7TblSF1dYb5BcvsjJqXDpxmKiwKarN5mcFlu5k7NTZudnWFxe4Pbt22gemYHRo3w8zEaEFCKhGDIST1y9PCSG/9nkpY/FpPDv/u2//env/fSLTsZ8tKcdrddUVRgw1tfXCYVCnJ+fOzDQCxcuOH2Toz3v/fv3aQxhJHNzcywtLZHL5Zibm+Pk5ESg3b1eDg8PqddrhELhYUmGaEwuV2ooiophmEOxTuGZYZx6Z3cbv99PqVJC13uAKBUdIeFM3SYYCvLyzZuc5/PsHTymVCnTNwwKpTKn5+dUKmV0Q/4TBh/RKynurPl8fthlOABFodFoMDk5SW3Y6/i5z36WL3/5y/ydv/23RTmpqnF8fCCeQENRr9cV/ZXVilhZSuBkJjS3h57eR9VcBIIhgqEQSDKJZIrDoyMCfj+X1tZoNSrsPX6MMTB5/HifUqEoCnos8dQuFvPYlolliESkEB1lNFVF1VQG/T6KIjtCpKRKBL1+QoEwyWiEcinPU0+vM/nECkrAi2x1MS0bW5FRNDeWYSFZMpJLAySwbPS+gWkrDEyFwpGIB3eqbdLJNH3TxpZl2pZBriQQdKptYw9M1q88xerqKvG48G40GnVsWwCDDVOIfe12G5fL4zQwybLs1M6PNIXRk94aTgm1moDKVIcBtlarKfQcWVDKZUVyVptut9tBv48szaM4840bN8hms464WK1WCQQCSJJEpVJxvraqqqTSomV9BL5dX193QCu2bXPt2jW2t7eZGDIzRgyMkRVdkiR+5Te+yj/4h1/6+E4KsiJElk984hO89tprfOELX3DwY+12m2w2SygU4sGDB2QyGV789Kd54+ZN1tfX2d7eplAoUCqVePLJJ5046ugNaDabgiEw3B3ncjlM02R9fZ10Os3hwWPCEdH1MOpBGNV0pdJjQ7NHgEBYqMXXn/kErVYLc1tEeqvVKpYt7pntVguNIEdn5+RKZe5/9IAf/Ms/xHu3b1Gv1plZWKLWqIs7bCTt2GRH+YJut0ulUuHixYvkcjlKpRJer5cbN25wdHjI6uoqRweH3Lx5k0a1xj//H/4ZLpeLH/uxH+Nn/sVPMz4+zrkueAszMzPD8hPh/R/VkEciEaThE2p8LMNkdgyvP0il1mB7a4OV5SV29h6TfLzHrXsfMjczx+beDi/9xZfw+XxsPdpgcmKCdqNKr1nDq7npI/bqPq9X5BqGsdxRSnSUQAx6w1iDAbOT4zz46LssLy8ytpqlUzym1qhju1UebWzw1NPrKK4Aqs9CUmWwDLBsUDQwwpiWyqDvJpw5x+XzcuvtO6huN9FImnAiQcA9Ts8QT+JqvUkmJsjOzWaTldXl4YNGplwuOhmQkVlJU71EIhGHsTBqwdra2nKIV+Pj47hVhfffe49gMMj4eAbDsqkWC2BLKKqKaRhYw5hyp9P5E4CaWq1GLBYjGo2yubmJx+Ph3r17joYwOztLa7gurdfr6LpOJBKh0Wj8iZbp0Ybtww8/5KmnnuLo6Ijr169TrVaZnZ1lLJ1xXJjBoNDjHj58KK423d6f+fP4sTgU2q02KysrbGxs8Pzzz3NwcEAoFHJ+kBOJBJZlEY1GSSaT9NttksmkU0oyCo/s7+/jHd4P/X4/rVaLTqfD5OQkR0dHTp681WpRq9WcN+ns7MxZHVWr1WEnZUeszWybdDrA9va200T18OFDnn32E0SjgqfodbuwLRu3qrGxsUevr9Pp98mMZ/n9V24SCATY2t6l1e7i8XlJpDPO/8v+/j6PHj0iEonQ7/eZnZ11at0+//nPU2k1iMViFAs5zk9PGAx0tjYeous645kxQkqIw6N9AgHxZxxLp1BVld3dXVZXV50DsdvtOuQdj6Y4OPJOp0On1ycU8LG1s0cylaHb7bK7u8tLn/ss1UqNv/3X/xZf/uV/T8DtJZ1OM56MoWKxt/UITQK3z+/Uo4OwmstDXcU07T+aFCwFvdOgWi0TjvhYv7IItFFdCt5gkN3DM97/YJOLV67jGXiQ7B4elwtkG7s/QFI0XF4fiqmhKeAK+Kg3G6ApdPQeWruN7dLIXlhi0NOpNku0KlUYmAwGopi4WCw6n5kR+HfEkRwlMUcHwshyXK8LVFoikXCe3o8ebRKJxrFtk05H2KPjsQS2KQjTnXYT+KPpbFT9NhgMnFDfCBYrScKuXq/XndKiUdhqJIqPUPejUttRYfLk5KTDa7x27Rq+dJrNzU1mZ2fp90SuZkTyKhQKznpS+rh3SWqaxltvvcULL7zgfDMSiQSAszEIBALE43Hu3LnD7PKy0xEw6kNMp9MO3nvkSBvVnj9+/JjP/OAP8uZ3voPb7WZ9fd2p8ZqemhCU5E6HzFicarXKpUuXqFRqvPrqq7zwwgucnZ2xef8Bt+98QL/fc0pApyeyVCoVsjMzbGxsEA6GKNfFjrlwUiKVSTOQZDwBPxcuXabZbLK1d8jdR9uMp0SaMJVKOVy+arXqMPyTySSPHj3i5ddfE1gwVaQ808kkf+Ov/XVarRb3P7xLvVrjy//LL6OoYkd9fn4+FMJwKsXa7TaWYeD3ixan5NDdmc/nxVipqAxsiexYmvOzE6LhEEsL86hBjVg8wW/+1m8RTyS4dvkqr998lU69QrtWYTyVod/rYCF8/tg2Ho8Lj+ai2WqgKSqGIVBxvW6XeqlFdjLJzvYG//LnfhJ/xEu3cUJDV1C0AJYW4Z1be6ytN1m5kGF+cQIoATqS1gfJxrZ6DAwD3egytTDH48MDcKl0zAEhVabdEwddwO+nmMsT8HhRLYhGo5TLZSanssOV3TGRSGhISBZZBY/Hg8/rc6zAqqo6HESvVzRS9ft9dnd3sWWJdq/L9MQkJydHjGUnsG2TerUGikw0JlyGjaqoEBzF4INDlP+oTl7XdZaXlzFNk3g8jiRJjjA56oAY5UcGg4EDsG02m6ytrVEqlZiZmaFcLou4+fGx0+ExWturqsr8/DztdptSqSSIVx/33od/+z//0k//xJf+Pqenp84I3263KRaLqKrKzMyME2GNxWK889ZblMtl2u02Y2OiQLRUKpHJZGg2hQDk8XhQFMVRjWvFolPdNcKYtVotIpEwlmVzenrK6sU1sbXY2qZWq6NpwjOxsbEpuIymQTqTIhIOoyoyg75OwO+n3W4Rj0Qp5PO0+wNa3Rb+QIB6XVSp64M+Xp+fgWkSDId56aXP8qlP3nDCLpZlMTs7y6VLlxxl+t69ewJ37/cSCgVp1GpMT00J0apa5aN79zg9PaVaKeP1eJBkMa436rUhFl2MnoO+PuxeVJwwT6NexzJNIpEwsiLU83v3H5BMpVBUbRhQCzIw+xwcHIJpk0wkqZbKxKIxxtMpHj38iEDAR3+gEx3ixQVNSCYRj9Pv64xlMsjyELvv8VCrNoklQoxlE9z4zLMg65iyheYLgOLlNN/G5YsSdF9iYmIey7DxBTSwDaCLJfWRJBtJsVBVm7NSiZnpGY62D7BNi3g0ycA0Oc6dUygWMQ0DxbaxDBNXOEIqlaLRqA8fPCrt4fam3Wk5qU+/P+j0dBweHjpJ3dHVdrQ1CIej1OsNznI5Aj4/nW4P73AD49JcuNxuDMvAGvQwTdMpb8lkMs6Db3x8HMBpUFcUhWq1it/vJxQKOetP0zRJp9OOv6ZYFJHo8/PzYfI250BZqtUqV68KJJ9lmmxsbBCPx7Esi3K5zMTEBGtra/wfX/tdfuwf/qOPr6agDM0V2WyWhaUl9nZ2hj0Ft5ifn8ftdrOyssJrr71GIBDgmWee4eWXX3aKOU9PTzk9PXXuXSJDHnRO33K5LNJ7Xi+VSsW5b49gLbl8kbGhR36Ew15YWKDRbDu7Y0XTCHi9gv4TixOPRZAsE8s0GQw9Aa1mk3giiSRJ7B8e0Wo3SCZi1IeR24GuUyiV+LVf+zVSsaiTmvP5fBweHnJ2diZy+cMxVZZl6ucnjKczlPIFoY8oKhG/4PuFgkG0WEyIZZbtJEgHgwHdrtjqjNajtinS66NR3jAM6vU6tiQOi3g0TL/XI+TxgCwzOzNFtVPj6OCI7PQY6VSK1/7gFZ66+oRwkdoWsgUuzx9ZgEW010ur1RK7dUU8aUc7e8O2sGUbWZOxDQMp6MNjKrQNFUlSSCYTzM5NM5OYJZuFvu7CNrtIkgqoyBggmUOHpClaxHt9R0caDAbUmw0axgBJlkGW6LZ7eF0iR2CaJmPjae7evYvH43L6M/2BGTwejzM5ja6WoykuFAqxt7fnjO26ruP1BXAPk4sut5tOs0G+UODaU0/R7/fYePjI6az4416gUc4kEomg67oD0LEsi+npabrdLs2mIFr98d6HbrfrXHsqlYqzqszlcpydnTExMUGvJ9bSlUpFPGwMk5mZGRRFoVar4XIJLF46ncYYfMx7H0CEfKampnjt5k2CwSBHR0fOuJbLCdjHxYsXabfb7O3tsba25ryRMzMzxONx5ufnnQrver3O1NQUGxsbTtnpnTt3HG7D3NycmDCKecbGxggEAuzsHjhI8WbzjHK57JzwkiJj2haxZILFhUUCXg+1khjBq8PsfSwSpdxrcHBwgNvjI+D3kMvn8AfDVIs53F4fvU6HTCLumGNGyvLk5KSjgWxubjpvejQURNe7zMxMERgKXue5U/Reh2QyiWWYBHxejs9PKZfLpBLi9x0l8hRJwFTNoatRlmUkW5hg9G6XttYG4PP/xQ/y/u07JBIJh2S1+2iTs4MjlibneOv1N5idnQVg//iI7PQU1VoRr0um1+2TTqeJRaOcnh7jdYkfKL3bc75mq9kkEPdhqbB/eozkDdKtV/EEfWiqC1nSyIwF0dwujna3ePMdg+tPrQynBEBygamAjADSKBKJaIybf/AyxmDAQO9zWDkkkkxgDfpoPg8BRaau9zBkcKkuBzozOzvL9PQk5bIAAFcqFecp7dJ8TsBsFDR69913SafT9Pt956Gyv78/JCkJ0tHANIgEQxweHVEpl8nnC4TDQSJRgZ4bmccqlQqqqnL//n0Bixn/o36IS5cukU6nyefzZLNZ0XY2PDhG9K5sNkuheIZlWbhcLoLBINevX+fk5IRWq4XL5WJ3d5dAIOAQrD0ej8MhsW172Af6ZyNOPhbgVk1TnZNzbm6OUCjE3Nyc03coyzJTc3Pk83mnCSeRSPDBBx+wtLRELBbD7/cjDSGup6en4g32+ZxvzNWrVwXqPRRy4CyDwYBEIsHq6qqTnR+tRXVdp9frOSk5VVVJp9MOG2+Uthz0dMbGxhzIaKvZQO91abcaNKoV6tUq9WpZZDA8bq6uX0aSxH1/1PmwsLBAMBgU4Z7hm9toNJxy16mpKSzTFIh7l9sBm47WSyN4qqZpDoMgFos5U8PICTfqGFSHeQXLsuj3OrRaLYrFIrVKyTHoHDzeJZNM8dQTT7C0sMjy4hKNas2BrtYadcYnsoxPTRKLxXC5XI6xZ9Q1ORLqRpZrb8jLwBw+xTUPpiVjWyI85VJUPC6FSNiLJZcolbax7TqDQRfMAdga4AbLDaaGbGlUSmWODw4Z9HRHuR+BdGrNBq1Om75h0Ol1CQ/Zl1tbWw5WvlwuO6tHXddJp9PDz6PGxMQE09PT7O/vO27EWCxGJpMRus/4GJOTk0KgTqeZmJiiUq/x8OEG9Xqd9fV1Mplxzs7OqFarTufDqP15NPKPrpDz8/MEhsyFqakpACfzM/pvDMNwBPF4PO4cXqMJIZlM0mq1iMfjQlcJBCgWi2xvbzsw4HK5LMJSf86k8LHQFH753/3yT//Uf/eP2d/cdLrwRqLYlStXUFWV7c1NLn/iE9y7fdtpnw4Gg9RqNbrdLqFQiI/u3v0TpJq33niDsbEx6vW6syk4Pz/n0qVLDtAlEgmzvbNLLBajVhNsv5nZORRFxe0Ro3CpVKZcq3J6fML8/BxYNvfufkjA58XoDzCMAZWS2FM3OzUazSaSLIudvcdDMBDEtCwGA4Pt7W3GxzPYyM6HLBaLOahuAT3NOWRi0xyws71NLBbDrWrYtk27KWy1rUbTgdAk0ylRi6aqhEIh2sN9udslFGzvcNXqcrmwTANVVbFskBUFyxYQllg8jq73WVhc5OzsjPzJGZIFnXaH8cw4169f55133mFmdgrDGtDptpEVCZ/Ly87OztBX4qXZaNBsNQkGAvh8fxTNrnTrnOVOuLS2xuXVFXx+P5VqDduWaLTadPs6LpfK6lKa1ISfWNiHZXRQPB6wFLBUMFWwNIyBxP/+H36N85NTxmIZJMOiXmuxd7CPFgpQbzVpd9qEgmLMd3kCTE9Pc3p6gsvlIpc7ZzAQT/5WW9zHxXUhzoULF3jjjTc4PT11KNqjg+P09FRU2PUtcoU8yUSCTqdLX++hKDIet5v+oE9xqPQnIgHnST3KnrhcLgKBAKlUiieffJJGo0EoFOJgf9+hYo/CgIuLi7hcLvb29hzaWCwewev1Oh6Eubk5oZvVas46Utd1vB4v8/PzhEIhTk5OnMNieXmZX/2PX+MffeljDG6tVyp89N3vYhgG3W6X/f19BxUu8FHi6V05P6PWqNPudtAHfQzLZGVlhaOjIz68d1eEfXo9FtOL7O7uks1mnaftyDCSSqU4OTkRvL5+H9nuI1sS3337Dfz+APFYiIFhcXntAkdHj3G7wO2SUAOiU+DdD94hEY0RC4SIBPycnp5iGybWwEDv9mjoAwJKiEqjTqvT43t/6AcIhsN0jD5dfcDOwWMePXrEWDTFQG+ROzvk4QNh2/b5fBTzJj6PgiIZVEolJpLTLE0sUszn6ZsDFEXC61FR5CC2ZOJTPBh2i26zQSCoYRpubBMi4TQKEjISmmqhqoBtoPe7yJpIiXpdHTo9Hc0l0241SKTStAc2kfQkar5BOiQ6CZ74xHPk8mccnZ/StweUqhU0tw+fN4gkQb1UJJudRNe7mKaBooJPESagVqtNIp6hXu0j9SVWli9iWiD5NSrdJrHxCBIWPlNDb/eRMWg3NYKaD5CRZRdGp4fqcoOmgq7TrFZ57ZWb1PZyRN3iA19vtkSjk19DxiQTS4jSYa/A3VumTrF0yurqBR4+3KDZ6JJJZ2nWLRaX58nn81y7+ml29m/xh6+/wsRkRkwSmkxPF56B/qBHMOTFsvv0m01k26ZcEJHr1nBaSyQSjGeTHB0d0Ww2KTQGzM/P4/F4GEulCQT9BHx+mq06wZCbe/dvEQ6H6XRFW3SrXSGZTNI9rxMIurh7Tzhvs9ksxyd74lq3K5iPAAG/h9OTQ6Ymx1lanOPWrVvkc4K30Wg06Pf7zM/PMxgMODg4YGlpiYcPH2Iaf/b14WNxKLhcbnK5nLN5uHRJYBvOz88FuiqT4cGtWxSLRV588UXeeustms0mwWDQaQ8yTVMorpaF3hUUJsBp43n8+DH9ft/Z+5pD4a1azIsatFabZCJDMp2iWhPuyHQmxa3b75NIRqn3dFRZol5r0u/20YNdzJ5Bu97A1IVBxO/1Mp6d4CyfEw3D9SavvvoqtUYDU5FIpscIR8Upf3BwwOzsrNOaPaL87uyI7MTa2hqapnGWP3M2KYIr0WFgWPSNAbZtIssmqqrQH4jdtoSBYdq43BoyNgGfB1W2kBUby7SwbBnLEvd8l8sFsoKqubFUzxCGKzwMmWSCZETQih98dI90Oo0sw7Vr12g2apTyBVbW1vjoowdomoLXG6bVtGk0BL+h0Whg9AUu3jQHmKaB7FUZSDbRZIrDkwKz81P0bR3JtpAwkT0uZBtckoSiSNhGB0m2UdxuwKZ6ekjQH6LX6/DBB7doNi36fYNmW5TTev0B3F43oVCYSCyB2yt8Kc1mE6OvUypVUFUPxkB0ICwszg3zBj7c7gk8Xrco0un1HPfgyFkoGrbcBAKBYd1fw9kk6LpOPl9genqaWq1OrVan2+0RDIZwaxYSLixTodnoYQwkZqcXkCSNcChJtVqmWmmSSKTY39/H5/PhdnsZDEx0vY2quohEYrjdAtJr2zbxWMIpBWo2BA5A7/WRJYWpyWnH03Pv3gMH9DKqqO90OqTT6WFO5U9/fSw0BaQ/gkCM1iqj2uxarcZHt287iuzIVNJqtbjywgvOODcas0bpSIHylh0Pwqh8JJlMsnrxIslkknQ6ze7OIacnedwuv1OjtnxhkVK5wGDQZWIyhWX3nDthJBIhkUhwaViScpbLYUsQDIfw+HwcnZ5weHjIg0cP6QyZha1Wi+eeeZZENMbGxgaqJDsiqqZpzlXBtm1mZma4fPkyS0tLvPjii1xcWyGZjgu/vyYzjM0jSyqS7MK0ZFrtHqlEEsWWyI6PsbgwQyTsITMWI5mK4PFJaC7weGUCQSG4jWy3I/emW1Mo5nOsXVrl1T/4fVyawsMHH5Edzwjc+7e+zZUrV9jfe4zH42FmZpoHD+6zv78vqtSLRbHzH/QEWarXQde7DkdA0zTOyucUajWqHZ2zos5p0cSUMlhyHN0OILl8mC4NiRbdTgFJNWg2inRqeaxeg0g0yP37d/nyl7/MrTsfYJoWjUaTVquDhYRpS1i2RCqZQVE0DvaPCEfjTE7PsjB/kanJedqtHvF4glQqzb17d+npbf7uj/xN2p0av/07/4Hzszy2JSFLKudneSLhGLKkEgpG6OsG7VYXVXFhGgqNeo9atUNfh/GxGUxDoa+DaSj4vBFsS8MceKhVBjRqJnpXxhy4ODupEA2PYVsuAv4knbZJsSBEzlg0RbczoFJuEAkn8HqCnJ8V2dnep9Pu43b5kSTJaa22bZtyueysm9vtNuFw2BGqW60WDx8+ZGVlxakQtCwLRVb+zB/Hj8WkYFtCUJmdnaXb7ToGixFEZX9/n2vXrhFLxLl16xbLy8vCgDJsLhoJNoYhsgujVCDgtPL4fD6HkzcyoxSLRcbGsoJnmEyxu7vNydkpzXaLTCZFKCxalkulIqbtcdZCqiowZn/xpU9jDQyqxZL4d24Py2NrvHfrfVrdDpKssnd4wNzCAqVSibPzPBPjWc5y58xkp50/WyaTIRwOi1XRMPb88OHDYcJT2LQ1t0qtUcU0TYEVN0Dv9JxOgKA/hGTLeDQhmHY6HfRuD/dYUnQHYtPTW/QNkWh0uVxItiWqz2SQFA3dGBAJBdjc2iEzXmBg6A7E9ZlnnuZ3vvbbIpQUCtHv97l+7RqRcJDWsHrN7VYJBAI0qpWhqCmETYEqs3B7XIRDUY4OT3n2+Ri722f4PHG8XplBX8KrqmiSCi4DyxBTRjgcBtVDq1gBZG7efJ3Dw2NWV9Zp1Qbow3YqVXEhSUVhGiwAACAASURBVAogCZZAIMzVq1fxDWEky7MrmIaEbZ0BDSzL4oknnuDe/Q/56td+g+2dR1y/fp2dnS1HhB4BWQOBgHOdVRRFdFFmZsjnBTS1OxT1ksk42GIKSyaTeDwe4hHRdBVPRIlHorjdGpoqMzY2BpZotopGw5iWTjIpsISZzBjj48Jk1el0SSREWMq2xSZJkVWnxt7lcjmaw+TkpEN38vv9+P1BcYX6Yzb/EVxlJP7+aa+PxaGguQTYY2Jign6/7xST9Pt9stks169fx7IsPvzwQ4LBoFNP/vjxYyKRCMVikZmZGe7evcvMzAyBYaz0ypUrjqBoGAaZ8XESiQRbW1s0m038fj+X15/g4cMHJIfW46ULy3x47zaf//z34PG7KZXP8fo0tnbLQ21D1JX9xm/8JqlEkngsxuVLa6QSSfL5PGPZcS711ykUi+K+7vWgud34PF68Hg87m1usX72CKqlcuHAB27Z5/30Bpxp1WIyuN+l0mlgy5vQDyDYCbJo/F74AVcM0bRq6ztaDNouLiyh4UGWVJy5fo5DLiRyCLKaCaCTlXLNcmoC59jptJEVFNyySsRDtepVLK4s0qiXmpufY3dpkeXkZv9eHafRp5aq8/vrr/MD3f58DBdk8OSKeiFIonIsJodsWh5fiwjLBssUmwmp2ubd3m5XVy7z826/w3/73/w2DPmgSVFs69UYJzWWhKTqy5KZ4VCQYiHDr/bf41V/5dRqNFkFfFFUNcbTfcLoxQ+E4vYEIeEWicSLxFLsHh0xOTGHZsH75Cu+9foeTkyMSyTitZodgyM/Tn7jG73/n93B7JKamx3n9jVeYmpxnairjuGXT6bSz0UqlUkPLuE7A46PfN/H5gnzf9/0AL730ElNTU9y9e5c7d+5w8+ZNLMuiFspxcipISy5VQVEkVleWeePNl5mayBKJhFheXsa2Ily4eAk8HrrDsuNkIu1EqwN+cRC3223QbAzDYmJCmPRM0+T09BS32zvMa4gJdGxM/NkNw3CKgNrtNqurqx//Q8G2hACYHhvj4YMHXL9+nXK5zMLCAltbWxQKBad6ze12c3x8TCqVYnx8HJ/PRyaT4Y033uDatWu0220mJiYwDIOdoQmqWCzyzDPPcHp87EBEs9ks+/v7tOyewx+4evUqRyfHfPrTn+bmzZv0zT7j4+M8fvzYWZcWCgVkG6ZmZ3DLKj1dZ3NnW0BLZYmBZbK0tMTM7Cyvv/kWvV6PRqvFzt4efUPYWyvFEpVKjUKhQC6XY3V1VRSCtFpOcGlkp5Vdwn6bjAnXZqNeRZUlZFnB6Is+hKA/QDycplau0aw18fu9BH3C/dZuCwOWhI3X48IcTgqSJIl1ocuFaYMiCXyYYRjIyDx59TIXV9eIxSIc7h/QdjVYW71I7vSUqcms6EGo1fH5PcQTUSqV8tBS3aLf64jEoeom4A9hWSZenxt3XcaveejUWnSbx/z4f/1PubS2zt/9kR/mjVf+ENsskUyEqLeE3fvg4IjjoxyDvkmnPSAQiOAPxBn0TRTVRO8LPmW5XMbrD5AYSxEKR1lYXqE3sIjH4+SLJY6P38PjEk9OUS8o87nv+Qz/8l/9CxYXFymVc0iSqLAbHz44vvWtbzm+mK2tLRYXF53E5IsvvojPFWZhYYHLly/z7rvv8hM/8RN4PB6xzWi1SKfTgsnQEZsvVZPwRkX/Y7VWIBT2Eon6UFWbQumYgDfDnfffZ2Fhgf39fSYmJohnsyxeuOAcNqP3LBKJOIVIhUKBTqfDE088weHhIQCpVIqtrS0UReHRo0eEQiGWlpY4ORFAlnv37iEr/wkNUf9/vC5dWLLf/OZvUiwWMQzRLZDP59nd3eXq1avD8RdCkbDTN7i1tcWzzz5LNpvl/v37Do/w6eefJ390jNvt5vz8fFjfJcb+YDDI1aee4vzkhEajweLiIo/ubYg78vwc+fw5iVScWqPO7dvvMz45wfn5GW+//Ta5gk6j0eDVV1/Fo7lwqRrTk5OCnNsSVXEXLlzgU5/6JOfn50xOT3F0dMLJ2Rm5QoGtnR0kSWFze4uVlRUazbZzyI3o1deuXWN8fJx6vc7W1pYQwYIeFElmY+MRvW6bVr3BzPQkoYCP+dlZvB7B+zd0kcKLREMA1BoiS58vlIhGksiaC4/bj9vtRVHqYuXVbWP0xfq23mxh2RJXrj9Lt9dncfkCXd0Y8v9sJsezHBzsI2Hh9/oYzwoikYJELn/C8fER9VqJfr+HKotDzTZtbFvC7wsTi8QYi0W592CT/sDGH0rj8/pxedyEw24kBqhyh2a9wt6pKLPJZifpD2x6XR1kF7at0Gr3MAaWoD7LwjeRnZxmfnGBWr2NbgwIR+I8cf1pHj3c5OHGJnNzc3zjP36d559/Hq/PxeHhHpZtsL2zQTgcpFA8I5sd5/DwkIX5i3i9XidA1+0KIO7nP/95fvRHfxRZlvnc5z6HSxZRZIBKpUKjIYhaIw1lfHx8OO2eDUViH+lklEDARzwWxh/wsnZxmWpVmJkurbxANpt1glfHx8dMT0/jC4W4e/s2V556il6rhScep3K0T6VScZySuq47dKhRPkhVVebmRDwgkUhwcHDAD3zhC5SHrVHf+9d/lI3tP5289LE4FC4uL9rvvfx1ut0uyUyG1155hU997/ey/eGHZLNZJ/xULJdEEOSJJ8gdH1Ov1zFN0zEaxWIxisUiQb9Qi0d39Z2dHSYnJymXy+TzeWZnZ53159zUJGdnOeLD0hSPz0swEefhh/dpdtrs7OwA8PVvvMrh4SHhcJjNR4/IZrNUyxV8Ph9TU1OCLCQrXH1inWAwSG/Q58rlJ2g0Gjzc2ODevXvMzswTCIf49re/jS8YcrogR52EI63DNE0H7NltiPScpijMz04yPZUlEvbTalTpNKqEI0EmshmWVtZF5XivTafTodnpYtkS5VKL3d0TkDW8niiqoqG6+lhGH8sc0G42MAd9fIEgfcMkOT6FLxBic2uH5z75F0knkhweHggnXLnI2toa3U6LwvmZswHqD7psb29SLJxhmAN8bsGI9Lp9SJKMhIbfG8AluQhHI5SrVU5yORKpFItL81SKBdwuF7FgyImP981hLaAkocgaXb2PommomhiRS6Uymldsl5KpDKurl3jhU3+Bubl5/sd//W/Q+wbn+QKX168QikbYf7jB2NgYd+/eYXw8w8NHD6hUi0NnoMr5+SkTExOMZaZRFIVQKMSVK1f44he/yDe/+U2++c1vOiag+fl5Bj2dszNRKhOPx8nlcpTLZcbHx9F1nWKxKDIOygDNpeLzeUglIkQiYcbHkgRDfi6uLHB8fMjM7BTxyAzFYtERgROJBOfn58zNzTE1NcXZ2ZlzFc6OiUrFcDhMrVZz7NnVatUBIBeLRUxLdzSrkZ9namqKXq/HX/qhv8GDja3/rL0P/1lfHo/bISznz87w+Xyc7YguhrOzM6cEY2xsjEajQe742MFrn5+fOzHUTqcjeAQrqxwcHDin/UggqlarjjEERBBlY+MRsVicN996nWc+8Rz37t2jPzCJRqOMj0/Q6/Ud2+hovE4mkyiKgi/gxzYtBwjTaDTY2dkhnkry1FNP8Z3vfIcLFy44Tj/TNPnw9gesrKyQK5acGPeIuByNRh3YysipqBgGbs3FwtwskbAXr8fFvTu3iIb8vPjisywtzPPUE+vYXhVJlunrOp1ul26/j4RCudzlrbfucHpeolJuo+ttgqoI5FgyaIqMZKuOgFkbMjEb9SpbjzYwF/pMT09TKZd57dVX0BQB+fB4PE6t+UjkHbkm//hfsixhWzbtdpumPSAxkSWoQOd4l3pXwVanaOkt9k+KxENxopEIkmzjUVRMFNGNKNt4PCp9c+CsiyMJPz6fgNU+99xzBEJhvvrVr5KdnGR8fIJqrUG92cLj9xEKhXjxxRusr69zenpIdmKM/YM9BoMwsgLn56cEg2FKpQpul4Cg/OzP/iypVIqXXnpJWIsLBWKxGPV6nTfffBO/x8u1a9eQZZmTE2GImp2ddTZkoqjFS6/dQpGV4VpSxTIVZMlNr2vQbvVJJsfwesL09A61eoW5uTkCgQAzMzNoLoVINES702T/YE9E4V2K0/41qlIcfb5G2Z/R5Dk7N+lMCbIsk0qlnAJb+0+vYwE+JodCpyOw1qOcQyQScehIAI1GQ+QEhj2PoxErFouRSqWo1Wo88clPcvu117hx44ZYpQ2pM6MRL53JkJ6aAsPg3p07pNNpHjx4QCzs4Tx3QigU5PBon93dXVTNTTAYZtA3mJ6aQ1M9FEpt1tfX2dzcZG5mhq9//esiU4BNpycOmaULy6RTcR49euT4Db7xjW+QTKd5/PgxHrePWq1Gp9OhPRg4dtWRA3NkNpEkaSgcuVnMTjA5OUmpmEPvgd518T/93L9C77UY9Op4PRqV4gnelEtsFYJuVLeJ1rOwJYn0+BTTszP4AlFefeUdvvMHr2AZForLhd7rOLSqo5MTxsbGKDeqFEqlYZHOCamUmKCikRAej4eT0yMk2yQQEBHj+/fuoWiS8/6ZlkFfQtyn2z08Hi+hYAxzYKHbNsVGjXgyQigTRDfbnNWOMD0mql+l2ungjcTwKDaqqmCYJrYt4LZ6r4ttmciq+P5YtAmHs4yNjbGzs0d6LMPFi5c4y52zdnmF/TfeRJFVNM3N2tplfvIf/X3hELUGPNr4yHG+ttttxjKTIFn84i/+Il/76u/wzjvv8PM///OOJfz+/fuOgzCXE1HogM/D2blgIfYHPRRVYm39Ip/97Gfpdrt85StfAaCca9Hv9zD6Fq2GiUuzaTUHIJmUik10vcNAl3F7FC5cWBpOvBG63TaJRIxEIsY3vvENrly5gqJI+HweOk3x2RHBt65TNf/mm2861XMj89Lu7i7LQ9TA7u6u43n5824IH4tDweP14vL5iaXS9I0BjVqVubk5Bn1BnHG7NdA07AFEQkJX0Ls9FElGkRXOTk7pdbpcXFnl6OiItdk5vv3tb/PiX/iU6CDwuIf+eYW9nQ36gy6Hx/vMzE2haAHOHz1CklQKxzkuXLosbKfRCIWi4DgkklGuXJzn6OiYQa/O737jq8wuLLG8uoplws0/fB1fwE/LlAjaMrbHz3v3H4pDzefjrFIhNTXF5uFj8QTQNKRel3BCIL7GJ8fZ2dmhVCogIUbidCpBNBwh4gqiSQrzC5P0jQpPf3KNrlLG9hr4fBqWYdPtD1B0HdMcEIhlaLTr1Bt9klEfg26BQMiF7Woz90yY//LSZ/jKz/4KhZJB2JcCU0WWIRUPINFDkwf09QGF0yIrC+PkDzfwzs9huG0qxROaNRe63mZyekY8cTSFTqOKioRuymAqdAYmtq1h2DI93UTVuqJ/oNfgLGfg9rrwqVFcVoBOUSIaiqP6fITSorqt35cxLAs0iWaljG2BrIVQNJmAV2xNLl+9wv7jIyw0Wl2LCVeIXLFBT5f45re+w9zCDO8cvcfzn3yK3/zNr3Dt+pO8++67+P1+6rUm09PTglvgC7G+vs6P/MiP8Ku/8qucHh/Tqrepliqi10HvMjUxTrfbpl6vkkoGUFUTmx4Hhyd4PB4B9Ql4uXvvPd7+7qtYlsXP/MzPcPHiRX73d17md7/+28O+SD++oIeT3DnZsQybO/u88PyzFAo5FucWkfHTarSJhNNsb2+TTqe488F9el2DWq1BtVrnwoULpLMh8Hq58/rrLC2JWsPNnYcYts7y6iV2dnbo9XqUilUmsuM0GzWWlpZoNqKOx+HPe30sNIW11Qv2d1/+PQKBAL12i+Mj0ffXqFdZXltj76OPRFpRFv6ATCbD+fm5cyc/PT3lxo0b5HI5cZdFolQq4Xa78fh99I0BkXhMQEd6PVqdNteuXePx48c8/cwnOTo6olAoODXjIzTXxIQoXV1YWCB/ckYgFOSd997n/fdv88G9+5TKNSxbIp5Kow/6uDQPsWhwyOproeu6GL0rFbxeL8lk0hk1D4+PCIVCwtraaBKJRKhXqviHTMpUKoVbcxGQ3ESjYertPH/zv/ohZJeNRAdZMvFrbsz+AKtvMZBVXF4vCytPkS/XsC2LsEclGpDRQh5sSaIhqViyyltff4Obr7xJrzogGgpTKpxj0QYsyrUOA0PC7QoRTwSwJMFpsC2Jw+MjDMOkbxh4fH6HLZCKBp2n1sgrMgqTjSrrAoEAXVOi2WigaRrJZJJ2U9iH/R4R6omEwwQCAUKRoOP9j8aT1Go1Nrd2WF1dRXW52dvb4yd+6icpnpcIBoN8eO+hSLyWa5RrVVweNwtLgs15eLLPz/3czxHR/EQiEWKxGIPBgOXlZT7zmc8wvzDL3/t7f49qtcpgMCAZiw/JW+I96Q96WJZBtVp2RFzbtikUCg4IZWRsGzE2R4U8k5OTvPfuh6xfWsPt1kilE/ylv/Apnn/hORRsdna3KOZzNJp1PJrYbIiMjmfovxGCcDgisIJer3t4RWgxNTX1JwpqR5iA09NTp/RItgVNKp/PO9qXZVkUCgX+1pf+MR9tbP9/0xQkSZpE1NBnAAv4Zdu2f0GSpBjwG8AMohDmi8OSWQn4BeB7gA7wd2zbvvP/8DUoFcu4NDfb27t0Oy2CwTDHR6ekU2PUagJTlZmYBHCYd6NRKBAIcHx87OyTn776JOOTUxweH+H3+ykeHeEPR4jFkwTDIW7dusX+4TGa20un2RIpu56O1+VGlWS2t7ZhYQFNVggHghh6n4ODA9YuC2JTPB4XLkC3wKuNjCoXVlfQux3efPNN1tbWnGvAyKFZKBQ4OztjcXGRTkeAVX0+n/NhGE9nMIYY8BHfcHn9Mq1Wg0ZPRvO4UVQL0+4jWRJ6v4/e7WMPLI4LbZCaRDMWXd2Dz6UwMGwGAwvNdCEpCqrswrJVZpcu4n//Ic1KEUuSkV1uZEwGhhhFZUmYyXLFgrMH73R1seFRBbdg0Gw6acv6EJo7+nAOBgPM4dXNBhHbVhQiwRCuYWPRKJ34x9ejvZ6IWqfG0/QNg2Q4jD8YQtFUZgYGB0eHJDNjfN8PfD/f/v0/IOwLcuNTL9JoNATP0iecrY8P9vn0pz/NV77yFX7zt36d9StX8NlupqenCYfDHB7us7S0xKXLK/yv//5/4+7dD8lkMiQSCZ577llnDT4xOc7RkQDi1utVp2THtoWNeHQAigi1eGB1Oh2nBj6VSnHp0iq1WgWXWwXJ4Dvf+Q5vvf06k9kx0ukk83OzhMJBshkBC4qNjXG0s0Mw6Gd8bpLTx49RFAmPRxw+Dx48YGJiinK57NCkTFPg5DRNY3FxkZdffplkMomh95wrdKVSIRwOMzU1haZpqH8Oeen/zfXBQLRK35EkKQh8IEnSy4jW6Zu2bf+sJEk/BfwU8JPA5xB1cYvA04gy2qf/vC+gKCqzCxd4cPcOsWiS0NTMEFN1kUajw5PPfpJmsUilWSUcDhOZmkIvFh2kWjwep9frkcvluHLlCqeFMnNzc5SqTVrdAbMLyzQ7bWYXL4jp4NkbNJtNzs/P2dx8RK1WQ1EUjo8PCQQC/NW/+sPs7e2Rz5+jKApnZydcu/4kt2/f5pmnr/N73/o2E2PjeH0But0e/W6HVCrB/bv3CAQEWXpkrz4/P3ecaCMT0snw/t5qtfD5fMSjMSzLcjBdgIgiI3H37h0uX10nZERoNJu4fAqm3aff7WD1dRRJRUPjOKdy995DUvOfZnx8EhOdQjGP2TXIejSUUAif5qVnGCxf+QSzH+wxMHY43tthLJmgUTtmYFhYtoFpWrRaFboDcfi63G4MwxIuTQRXAsnCHHIN6/WWo92M/g4S2GAbJi7TQvUIjmb6j3EwR7ZybfhrI+I0qoytSCQzY/QGfYLRGP52j4VYHF8whKS5CEUjBDx+vvnNbyJJmgMfKRaL/MIv/Sw3brzE4tISX/ihv0yn0+H2Wx/idvlQFI3l5RW+9KUv8U/+6U8xNTXJ7t42Y+NJ4okwb739Br1ej1argSSbdDpi4puamiKdSTpIM1Vx02q1REZCUSkWisOadyEYT03O4HZ5OT87IOD3MzMzRaNRp1orobkSHB0dMDaWQte71Gpl+t0O+fw53Q9ucf3ppzg6PiDRbQx/vSoszRjIiujgHInw5XLZST6OWCJO9kTvDQXzcapDEnipVBLoAP0/Adw6rIM7H/5zU5KkDSALfD+iPg7gV4A/HB4K3w/8qi3uJe9KkhT5v3RP/t9ehmGC4qLZbBP0BQmnMhSOj/H7xAQQDhQ5OzvD5Re8gM3NTeLxuPjmT03R7XZZX19ndXWV/f19PP4I5XodSdOQXS4kRcXt8vCtb/8+N27c4P79+/h8Pp588ike3HmfdCrB2NgYp6enRCMhPrj9vmiV9gofQUnvEvB5WZxfwDBtPvnC86yvt7h99x7FUoV7Dx7AIUQTcf5P5t47SNL7Pu/8vG+//XbOuXt6ws7OzszOZuwCi0hEERLFIFEMEinJFJ1UCuezJYvS+SxKtq/sOlmlk8+6s3S6stKJokmKIiEBIAACWGAXwOa8s5PzTOec33B//HpesSxSdtlXV+gq1G71zs42evr9vd/wPJ9neXkZXdd57bXXaLfbFndh/6DodDoWAEVVVRwOB+OjY+zu7g6t0iI8JBgMMpLOMJ5Ic3Bqkin7GK1uB8XtoT8Y0OkPcNqdOJ1uuo0OB2eP8/alW/hCEabmUjRKLbRemXDEjc0OeruJ5pJwONzsVrscPvEgP/B9n+CX/oefpVhtgGGgGfpwE2LS7bVRHHb6gwHVZgOn042m62haH1MC05AwZYGTt9lt9IaeFHHI2yx2gGEYyA47PUPDaLUwh8O7breL1y0EOPseDH24wbh15x6nTp1Ctqv02m0RJGwIzcPJU6fodnvkSyU8Hg/9fp+x0SyBQICJA1M8+PBRfvYf/iJHD8/RaDQo7O6xtLTEL/zCL/HE06f58A/8CN2u8MIcmBynUMjzsY99BE3TKJfLNOo1gsEgPp/HSnzelwnfuX3POtgNQx5i/UycThdjY37hmDVNGo0OdruLblcjEolQr1VIp9P4fF72drdJpRPkd/fY2t6gkN8hm81aP3uP18Xe3h6qqpDL5ZiaOohh6FRrZUvhGw4luHPnjkUDP3jwILu7u7jdblqtFrdv3+a5556jVi7h8/lYWFgQ4bLhsKWBMPT/jyArw4Tpk8B7QGL/Qh/+Gh9+WQbY/I6/tjV87j//Xn9fkqTLkiRdrjUavP3aayIcdnUVBgMhjBlmQO73SfvAlGQyiWEYrK2tceXKFZLJJAyBI1NzcwTDIbx+HwtLixiYuL0eisUip06cJJhKc/DAJEF/gPxeztp2lIYfslAoZPWdDoeDSCQiZgzpNIah0e21KRdLFAo5nHZVsP2RsCkSm2vrVh/t94v+U/SnIpNxd3fXChGt1wWleX+N5B4CYfbR7v1+H6fTKUi95TKNhuhxB70+qurA5XbT6XRpNtrYFBW7CkgDllfusrNbp9OtYtCh3amAU8bmd2AywDAHRIJeHnhglkKxzG4+hzlMNGo0GnS6Xbp9gapTFHHP2I8s21+d2mw2HG6Xlaws2xRsih3FrmJXHdhVBwNNx6bYkWQb/YGGbFMsD4Gu60SjUYsx0O/3rRwDsUsfJxQSsNNGvUWxUCafL+L3+/nqV7/GV77yFYrFIlevX6M36HNoZppAKMjpU0f5h5//R3hcbgI+Pz/4Ax9ic32DH//MZxkfH+W3f/N3KZVKpFIpQqGQIGQ5HBSLZfp9zWpnEokE9Xqd69evW87ExcVlarUWkmSn0egI2XFPo9vp06i3KJeqtJodfN4A0Ugcu+IAUx5ejFFeeukllpaWBEJtVyh0W80ObrcXw4BkMkmxWOTObYGiBxmfz8fW1jbdbpdEPGUFCNvtdtxuscnad9YC5POi3Xv++eepVqtMTExY6/rDhw9b2ZfiZ2v/ntf5f/X2QZIkL/BVRGhs/a/LxL/5pd/lub8xzTRN83eB3wU4eeyoOXdklm996yVGUmlqlRK6PiAQj7K2sECzKS6a7byg2MzNzZFMJrl586YQE83Pk2k0SB46RHNnB5vDTblc4rnnnsXr8XDz5g2mD06xt7fHrbffpl6v8+gTT9Cq1zl65DDtloj5nj5zhl61SioZx+P3s7W+zoXzbzE1NcVffuXLfOgHP8K//53/k2g8hmSaRKIi1doE1tc3qJSLqG4xfKpUKjidTrLZLO122wq/3acq+Xw+RkZGyOfzLC0uAaD1BHfR4XBYbD/FMChVytx59wY/GHoWj8+Jqes4VSem08TQTBwON5gVPvujTzE1HWZn6wqS0SQZ9uBw6mA0QO9jmA76Oiwu1ohHkhiDPuFAkEIuj6p00U1TbGpkg4Gm0RnKqPvaAEwZA2Fykm0SkmFgYKL1dVxOFdMw0IazhEG/L2LjZRnF4SAcChEMBMimstSq1b82demiZSoXiqiqSjwep9PpUMoX0PsDZFnh2MkTeNw+Op0e5UKJ40ePoSgqKysrHDhwYJijmCAYDPLRj36C559/Hr/Xy/z8HR596CwzByf4jd/4Df7wD/54yN4cZ2trA13XCQUjjI+PAVAqlSjkqwx6bUrFGslkkpnpI9TrDdqtPbyeEAF/VKyPB3lGR8doNBroum4FIh8/fsLSKuyzPZeW7zM+msDnDeByOzC0AR5PgOzICKpDoVouEQpF2NjYRlEcKIqDdqtPJOwkEg6h6X12d3e5ePEKc3OzaAPhc+h2uxZJaWRkxEKz7WMNo9Eo/U7bSvwul8si2m4Yi2Ca/53eB0mS7MMD4U9M0/za8OncflsgSVIKyA+f3wKy3/HXR4Cdv+37dzodQtEwhw/P0G23OXfuTcbGxrh15RKpVIrlZg2H0z4Eg3rY3d1le3sbj8dDNBolEAhQLBYJ5HJ402ly6+t4PS46nQ6bm0Wy6RT+WARZMvG6PVy4cIF74r7/VwAAIABJREFU169RqVQIx4NEIhHhXVBVHLEY82+9RSwWw+PxWAowh8PBq6+8zKc+9QmuXbuBYndQqtTpD3RMw8BuF7i2RqdrlcPhcJiJiQkkSbJYgNVq1bJ/r62tDfMABT9x/y7a7XYtAG3K6UHSDdr1Bg7Fjt2mgAyyJCMjmIV2m4qi6PiyYZxqn0DQQ6/RQbXrOOyApGNqGvlSi+5Ap7Crs7u2xc1Lt9C1Ph6PC0NvY/ZFv9rtabS7A/q6ANkAyJKEarej6waGBKYEyjAnAcNElhTsisMSLemyjmITiDaH6kKWBMTV4XBYqsVIKGwFm2iahjEcmPnsTor5Es888wzVYpWKWSGdFOTjGzdvW4dppVQgHA4ze2SSX/1n/4pf+7Vfo9fp8MILL/Avfv3XkV3wS//0H2O32xkbz7KyssJbb7/J0aNHabdEv722uoHH46Neb3LgwAGq5Tw+n2/4szCR5Q6tZncIpnXi8QR45pkTeLwqY2NjJBIJkQTt91OpVMhms5baEKBYzLG4sMD8/F3W1lbotJuUimVcqoNwOIjNZscmq4yPHRi+B9BoNNnbyw0TqKpkMiOsrW6QyxVwuVxiTR6NWgpYl0sQwlwuF08/+yx4PNy7eBFFwqo6Q6GQ9TkOBoPYVfW//VAYbhN+H7hnmuZvfscffQP4SeBfD3/9i+94/mclSfoSYsBY+9vmCSAYjTevXyYYDLK0cA/VbuPg1Djffu0VNrdW8bnd7O1tozjdlntQlH1FRkdHyefz9Ho9oUFfWyMYDrCxty2SkkbHiCbiYAzoteoUtjfJRIf20mSM0YMHuD8/L2jPqoN+v08qniCfz6NpGidOn2ZrbY1es83MzAwenx+Px0W3NyCZjHN/cYmdnS1kWSEcDhFziAjy/Yn6nTt3LL/7PkFK0zQ2hzJt15AQ3Ww2aVRrBPx+/H4/qVRKpFPXGiiSzEgiRbveJuB34w8E0NFxyE5skg2Xw4vfbxBLJJBdXuz+ANVCD7/Thqz16DZadLU+3Z6dRtvgxsW3ufTeVVbvb5KIBAkG3LR7shj8aToDw8S02ZAlG4ox5DxiIMsSIKMNBtgQYcCqy4mqg6bY6ck9S/VpSjLGQMOUZfrtDrntHdqNJvIwumw/Acw0Taanp+l0OqytrorPXFWwK20mKJLM1vYW66vr+P1BMokkRn+ArEv86E98hiefeoy3Xn+PM2fO8Prrr/Pg6dP8yhd+mc/+2GcEHLc/4MjsYd689AadTod0JoFpGkwenKDb0XC7/YyNiorj7bcv8NCZYyiKcLCePfsIUzPjoEGnAy+++C2uXbvGxsYG7U6Je3fvMxgMrE3YPtErGo1aUYa5/K5AzKsqY+MjYJg8+dRjTB+c5LHHH+Hu7du0Wi3m7y2TSifJZidYWlrC5fRRKlaHODgn4bBQ0Rq6jVarxdbWFpOTk+zu7gqAryEMYJcvXuT0ww8z++CDlJaXrC3Xfgzhfsz93yJo/K+qFB4Ffhy4JUnS9eFzvzI8DL4sSdLngQ3gE8M/+yvEOnIJsZL83H/pHxCZfXZGJ8YYnZ3i/F+9yI0b14hGo1SrFcrlsrCxZrIWE2E/dmtrawvTNJmZmaFarVKv11FUma2tTVxOJ71+l1qpyKDbw+N2Uy0WCYRC9DrCM2/oGuIdMqnXa8PU3w4+n5ft7W3u37ktPPU+D4GJCW6/fd4CvBqyjMflZmRkhGazLQCaIbc1VZckiXA4zMjIiHU49HoitWega4RCIQKBAKVCUQiWhmx/RVGsXT8IZ6PL6WR1eZlozD+0TaugShiGCaZMp1GkLBt4oklsChj9Dpqsokomva5Bs6uzuVWiUK6zvryE2e9jDvoYuoZTVWi1BuIuL4kyQNc1kMQ2wZSAoZ5lv6Kx2exgEzoF2ZCsweL+f/v/D4ClHgzIMsaQbKxpIkkpFApZeZp2u+hzEzFBL75z+x4HDx5kbu4I6+vrOF0eioUisXiSbDrDk08+xq/88j/nUz/yo+zs7PDTP/3TNOt1zp49SyadYHdrG7sq8eKLLzI6myGZTLJwfwUJm0D+KR4C/iBXrlwjFotx5vRD/NzP/V1GsimwA3341//yt3jzzbeIRGLYZIV8Pi/mQVEn29vb1Go1ZFkmm82ytbVlUZoGgwHNZhOvx0+71RKE8WqdVrPJn33pP3FgfJSbN28yms3w5JNPUi4UrdSn0ewYkmTDNHV03aCQL4EpUy5V8frcHJ6bQpZlYWn3eKwt3OqQ8Xj90iXK5TInjx1lcXGRdDrNgQMHmJ+fp9vtWq/vv/lQME3zbb77nADgme/y9SbwM/+l7/udDxkTqddm/e4t+v0+iUiIg4cOcefWLbqtFg8+fppr165RrlXxeV3IUoxAIMDly5d57LHHWFlZwdD7+H1uJHSmTj1ALBYXAhOvD7uqUqpW2cwJMGo4HufunTvE43F29krUm0JktLW1BRQplUo897GPUW/2UJ1eciubxJIhFq9dIRiP0traJZ5O0+lq6Gs7zEzNcuPWHWxuJ5Mjk+zm9mhV9/B6vWxtbtPpCCipLMvopoY2FPrs7GyxtraCx+XF4/EQicTY2drlk5/8JIOBTrfdodwQ8WOqK8i9O/PUqk1+5NMfJhD0sNtZJRD0ItvL+N1hMQ23NTEGHdwOKJZL+HwZ2l2VTtPgja+9QqVcQ+tV0Ro1wgEFf0BFlw08wTQ4gnh8AkrS3dvDwI4sSQyafVRVoVVt4fV68Tnc2GUbhm6g1Tt4UyGRPdFqEwqFGHTFLEJVBXDELZs40anv7jE9dxi7Q2V9Y4NOv4eLID1TQsOGxx3C63Dh9PpIZEZQVDuVapWtpfuUG2JIpmPSunqBV779KjfPL+A2/NgNhU996of4xz//P9Ltdjh0VPT7piShuD20ahr1kpNes4PPkSEcCjAykubo7Cxnzz5IKBMGE/7NP/sX/Ktf+18oV0qEQgFUVWFndxOvx6RSuUelWkZRZA7NTHD73gKKYieZ8VAp19DNJplslEFfp1IVwzxVdZJv7eJ1ezAljb3KBl6Xi26vS62hktt1YfSr/PbVC6THxsR76/Px0EMPEQgEeO+99wiHwzTaDbLjWSLtCA6Hg2a1iWzIdJtddjZ2iMfjzE7NYrfbmZ+fJ7edIxaLsby6zQNnHiWfz9Pq6Hj9UYLhJKVKC+P9LnOWJJnNzS1GRkaQZZmRkSxXLl1GVVXOnn2YjY0NkskUDrebUqnMoTNnWL1+nUceeZR79+aHO1gdt9tNuVzhzoV3RIthV2k3W2wU1/H7/STjCQxNp9tqMz11CJuioHkNer2exdFvtVpks1kuvPIKmUyGeDxOt9vFH/TQbrfZ2tjk5q07PPTwY1y/fhtN64s98dQk5Wodl9tBsZi32huv102v10GWZSv4ZZ+WtJ+qNBiI1OPl5WUwJC5evEg6PUIkFEZXbIBBr6+RTGeo1Iq8/vpbJBIRDh85QKPaI54I0+2YqHYbNkOi1emjGyaSYef1V98kEpnihW+8gqkL0rLbJRMMhbCrKnt7e3T7PcLRKHaHyszMDIVCgbt37+ILhCyWo8PhwD7kSIIwk+0r97SBgWp34nIbGAaYpoTT6UYe3ks0A1qtDoOegIe6vR4xFygVURU7oVCIbCpDca+A3+PF5nWRTKcIBoM0hjj+8+fPC+LRSIb/4/d+h4//8Cc5EJvkV3/1V/n83/8cU1OTLC8vMXVoEkqwt1sgkx2h2egSDEQ5NH2Qxx9/lKc/8CQOVaFSKfPv//ff5mtf+wq1ahlVVVhcXMRUXKgOhXxRdLw2BbLZDG6vi0gsiizLbGxu4HYJcKquSfR6OpgKpgmtVpt+X8Pt9qLanegDg8JeAY/XRSaeEO1jv4PT4UbXTDweLzabwurqKsePH0eSJF5++WWefvppHnzwQZF8NjkJus5X/viPOX36NIZpUK3XWNtYFzMfWSKZTmEYhkX1zhcLmMgWxWx/JalpmuXG/F6P98Wh0OmKwdM+CLM+TFQ6cOAATp+PZFKQdbHJLC0tWWuxnZ0dYUjp963sg/2Vjd/vF6isTgdlmLIsyl6bVa4CQwhnzZKu7lthH3n8cZAkNleFd3329HG6lQrr65uMjIxQq1SYmTnEK6+8hqbp5HJ50RvOL/DgQw/xh3/0H5mensZld1oqP03T0IcILrfbbYldOm3hDTAxOXXiAYrFIidOnCKTSvP6yy8QjUZRbODyuDGlCG++cR6f30U09mmSySh+d5hKpYo5UHD7/GAKV6Jm63Lzxh3u33sF01DRdReBQAhdG2CaEtgU/IEQjl6Pfl/D5fHSqDVpNTsE/CEGw8Hf/ipyf4Oynwa1P8mutWvWmsw0DHCoqDZF0H0M02q3up2emCc4VJwOB94hWLVaroDfsFqQeDxOKpUSB+XSEoVCgWQsTqlY4t/91v/Gay+8QiVfRAuP8k9+4R8Ri0UYDERuQ7lcxjQk3C4v2gBOnTrN4dk5PvaRH0JVFTa31vnTP/kTavUKd2/fotPp4HEJl24ymSRXqeF0qkOQro3MSHrINYSNje1hgHEISVY4evT4MLl8k83NLarVKoqiEg7FhxuCXUYOCD6GXZFptTq0Wy2S8Rh2uwNJstHva7RaHSv+7fDhw2iaxrVr1/B6vYTDYe7cucPJkyd55JFHxGdVE23X/tB9b2/Pcv5KkmRpYro9MUPYb0UNw6BQKAz9RI7veT2+Lw4Fj8/HJ/7u59man+fOnTvMzc1hSBAazXLn0iVGRkZwetw43C6Lt5iZnuatF1/E4XBYPVIwGBRBmu22ta7c97Y7HA4ymYzlj9hnQUYCYUqFHIoMAZ+HUyeOoes6L33zLzhz5gz1apl0Mk6vUmF3aOtW+houl5Nut8cDD5zkm9/8S8DA6/WQG/rYT5w4RrfbpVDMYVdt0GU4fLSh6wPa7bZVNfiGB9/m2qa1riwWi+gDjdhoBptNolwsMTd2CGerwVHlQQb9Hm+8cpF+t4Nit1nJQ8GwD0VRyJfyNBotNE1G1x1IyIyPZajXGwQiYYvjWKnXGFR1BoO+5QoMBgIiebkrmAZ22WapMnVdR0Z88PZTm2OJhKiyGk1yuRwyEgMM9GEMuiLbUFUJfyhIuVpBlmX84Qhjo6OCTN0VB+bM7CzhUIhSo8KVK5colUrDwJc1fuC5Z/n0pz/Nb/7Gv6XZbJL0+CiVd5AkE28ghmI36Q/arKys8dgTT/FnX/oa1VqbxYVV/sN/+F2+9Kd/DMDYSJZTD5wgFPaxubmO0y1Wpjabje3tLUIhH+FwGEVRaDabLNxfJBKJUC6XCQXj2O12KpUKsmJy6+Y8d22LtJoidyQRz3LyhDhEPvvZnxTVqlsh6PcDBndu36JcLNBpNcDUkQwdWVJRbCpTU1OkUimq1Sq9Xo+RkRE2Nzex2Wwi8CibZXthQWzEsjPsbm2haRoPnjlLLpezVI6YMslEGk3TCAaDVtbJvr5nn8a1f4h8t8f74lDotFoUVzcIh6IcmTtGtVolFIywvbCMx+3D5fTQ64rS0263E48lWbp2k35PYyQziq7rVv6foUMoGOTGjRu4nE5Mw+DQ1BSKotBqNokOw043NzeZPnSIwl7BuijX19dZWVnh1EMPceTIESLRKKurq6LEHnRZXxOJvsV6mSc/+AOce/VVErEITzzxGJ1OjzfeeIOHHznLnbt3yOX2SKczSDbZwoYbhoEp7WPnRe7jfj6gaZqcPHkSl8PN3Nwc5XKVarWKP+4D3UCqVOgONAzThmHasCkO2rU+ToeXfruLxyUEV3s7NUx0TNlEtXvwenzk8hWOHZ1lZXmLUChCMBIWsestJ5Iiysh6s2GFrAL4vF66g76V0LX/0HUdh121xEyKohDwi0xPm2ynVmuIu9AQ2sqQN9EfaCBLuN1udNNke3OLYDhEIp7Crbqt+Pd6o0EsIQJTqtUqy8vL2G02IqEw/9M//QKXLgq16cTYOMVOTUB4HDKJZIxqvcYnPvEJPvHJz/Lt197k9//vP2R3p4iu60wdyuJw2EnG45TLZfb29shmhb1+ZWVFgGxlG76AH6/fRyaTodfrsbKyJrIyUUimssiyTDAUwzQlRkZGrGSvs2fPEolEcfqG79VwClfNN5i/f5dKqUwkFOHo3BH8XicOu0osGhRmq1KZUNzP6uoqMzMzPPTQQ1y+fBlJkpidnWVzc5PS+fPWgTQ6MY4pQa1RJxQJ0xnKmYPBIHt7e+KGo4jK2DAMvF4vBw4cGFay81bk/fd6vC9cknPTU+bFV7/B5uYmmUyGjY0NK1pe0zROnDhBs9lkaWHRuvuvra3x/PPPI7lcbCws4PP5rDXf+sYqjz32GNeuXePUqVNkMhlr/bdPy5EkSUyNk2kkSaJardJoNCwU3He2I/1+38oQ2NjaIplMMzKaZWN9C0W1c/KB07z11lu88sordAYab5x7k0BA2FQDwTAbG5vUW01ssp1Wp40k2ZAkcVH5fD4CPpGE7ff4WV5cYWZmhnK5ytTkQfzpAIlojH63x8riEqrdjt/hpdfpUCtViIUj5Pb2SGSEIk62Qb1ew0DoHXyBIKFIHNOQUFUn09OzNPvCkFQoFKjX66RSKS5fvozNZiMQCKCqKvfu3WO3KD5gsXBEtD5D0nQiFicWFmlD4XCYvVoVr9dL0Cci+eLRmIi28/up1WpsrK4BUK4ViUQijI2N4XC4WF5YJByOkspkh9FswvMxMpri4sWLKDYbboeT7c0ttjc3sUkybqeLXrtDOBSiYgiceXZsVKzbag1sNgfVWoe93QoDTSIYENyBeExCVVVrjqMoCru5HJVKxWqLgsEg8WiYbrfPkSNHOHnyJNOHZglEvBh9kEX8BK++dI6bN26ztbVFq9Wycht1XUe2YVVUAOGAD03TKJUKlAo5IpEwbpeDbrdNJpUgkYhhVxWe/9Cz3L17V2xzZJlTp07h9XoJDKu2e/fuMXvkCO+eP49zSFMCLPXlK6+8wuzsLJqmcejQIYrFItmZae5eElqfe/fuWbmSkUiE7/uRH+PazdvvZ/KSk3qjhepwcfvOPY4dO4amaVRrAmaaL5SGwzk3u7s5gsEgrVaH9fXN4YW+R7e7RiaTwe32YuoDnHaVkVSaV156mZ/6qZ+iUa3htKu4HU6+9eJLHDsm9tH24eHQ7/dJJBN0um10Q2NxSZRqZ86codlssrW9RzabZcQw6Pb7JA5OWXbbr3/tq9jtdp547FHOvfcu8XiURqOFaUrkFgTUtdVqCTGPTcZmE+7C/fKuXm1Qq9W4snmFo3PHSKfTzM0dZSSd4cLNd3C73XRbXcbGJlhfXaPaaxCPxsCQyJdrFMp12pqGJInciIFm0Bv0GU+JfENJVjg0PU2z0WZ1bY3ZE3NsbGwQjsaIxhNDUlCI3nC20O32SSbTDNDI5XKWcs+hqpYzdX+uI2zQCUu7f3JqWhC0dvc4ND1Lo1ZHtTu5ePEiqZE0jVqder3OqeMH8brc3Lp1B6/XP3T6AbKE6gCvR4SfbG+s02o2yWRSDHp9bJKM3W6j2+/g9DpptVpsbGzgdDqpVOu0Wj3CkZSInW+I9Zugdo1Sr9cFlMRmw9AM2u0ukmQjEApz/PhJPve5z+F1u4ZDZxlJgnq9x+rKDl6PsIe73W6e/b4nePaDT6B1QXHDoAV2D6BBs9FH13UCQRemAXpnQLMlZmSL9+fpD3oUiyL4aHN9mXKlhNfrZX5+3or1CwQCpFIpzp07ZylfU6kUtXJZbCMaDYLhsFiBdjogy0TjcWx2O+FolKvXrwvi2NYWiUSCYrHIkSNHuHDhAtFoVFRlvf73vB7fF4dCfzAgFotZuuxer2d57gOBAPfv3+fAgQPW/CAcDvOhD32ImzdvYpom0WiU9fV1NjY2eOihhzC0LlevXmVvb4+nn36ad999F0mSSKfTpCcmKBaFLuDo0aPcGHonVEXh1vUb1nQ96POTz+fJ7+6RTqcJzIb5+te/zg//yMe5cuUK9Dr0Om3iyQRgUCqVaHVaTEyMsrWzRbk8j6IoRKIhtIHBwDAY9HV0E5HjaPSHuPAOjZow2eyj286fP08mk6VarhANxllb2sDn9RL2hfD4/LgcburtDsVqjUQywdzx45RrRYrFIpVWC380zub2NrulOrNzR6jV67QHGtnJA9h2dri7cJ/Dhw8jSRKLCwvYkBjompD6FgrYJFkItTwe4QPpClGSfWiVBiyfQCgUwh1NEI1GOXbkKJqm4bSrTH9ymnffeYf79xdptNoEg2E2tjZxqg5KpRK1apWN9XUcNgWv24Pb7SYYjaEbBqX8Drqm0Wm28Pt82GQZ2a4gmQYGgC7j8QUw7Lahb6KJrpucOnUaj8dHMJTgz7/2V3S7LSLhJI8++jg/9JEPEAgG6fc1nB4FSYH8njhQJJud8fFxAmEF2QAMmfV1sYERytKyJU/fy+1iGAaZxCiXL19GloXtvd1pCoy7aicUClAoFMjn85jt5rDVkshmMzicdjqdFpOTE3S6bUZHR8hmM5x56AwgEP7BYNCKSwRYX1/n0Sef5NUXX2Rubg5VdVKp1KhW67TbXbrdLo888hjVanVo7Y8NM1DF5kGWZW7duoXHIxgYKysr9Aff+1B4X7QPp0+fMv/T7/+Opc1OJpN4vV7u3btHIpGwvOuqZKNULHLz5k28XhHcCVicwHq9zsmTJzn37ZeZmJggk8lw7Zrwyq+trTE5OYkyDGC9cuUK3//9349ig8uXLmEYBvF4XISZ1OuWR/7evXt4PB5ye1W+/0Mf4qWX/0r43qMRytUqjz7+CNhs/Lvf+i1GR0e5v7HOtes3KRRKVMpVEqk0lUoNZDvtVpdOr49iU+kPmlYis8shWhNTMxnLjg8TjqOsr67x8GOPCtORLJNOpwkGg7TbbaFQ03pWXPrNG1cIhUKk0iOEw1G2d3MEgyFu3rrDsZMn8Pv9wxi0EtMzh1haWhKrKk0nv5djY3WNTrvN9uYWPp9PbEWMFpVKhWpJDDFDwSBOpxOXw8nE6NhwfTzC+JETHDl82BIl5fdyXL16lXajSa/TtXI8dKVD0OfH6GvMTR/Godh56823GT0wSTyZwOH1YUgQcwnWQqlaYWVlhXK1gup0UiqVCEdF+zE9O8OB7AyGofHmW+dYXl6k0WoiSTZmDh/lJ3/i75HOjJLPlYnHo0haD7fbgeyCv/rmOe4vLPD6ubfo9frYVSfNdktQnxpiAOx0qezu7ojsTreDbq+FzSbCZh9//FHee+uKEFQ5nXzpz/4fyuUSr776LS5dfm+4rRAbJr/NRrfbpVoVr8Pr9yHJBoGAj3a7STIjNm5LS0uMjo7yxBNPkBji+x5++GGRL1oQgNl9F2at0WR6etoSyYVCIXI5UUErikIoFGJ3d5dyfg8QLUa73SYSibC4uEgikeCjP/55rt649f5tH7R+n2w2ixIIsLcsQjTv379Ps9nk8NGjYLezMz+P1u4yNjZGs9nE6XQSCAS4cuUKkUiEWCzG7u4uOzs7jI6OIssyu7u7FqNgbGzMYiGmDx6k2WzSbrfxhwP4fD5KpRJOp5NGo0EkEiEQj7O+sMDBgwcZHR3l3t0V9nZ2mJubs/pQw9S4dfMmhWH0e7lSotFo4A94abVa6LoP0zTxer00Wl3r99rAoNPVrXUqYN0VvvCFL/Ctb32L+fkFPvrRj7K5tU0qkWJza4PtbUEcVhSFXCknErQ6bXTDIBQJYrPJLK4s480XkG0qTz/7LIrTxQ9+5MPcunWLe/fusbW1RSKVoFKtitdcK7O7u4vf78fldFLI5anVaqK18tqsIaOiKFb2htftsWC6Ho+Hvb080WicaknE2J97Q3hXRkaEBH0w0On3NVSnIjI2EECVntGxlIzBYJCOpg+9H5o1id83T/V6PcLRCCcfOEUoFCKWTPB7v/d/4XI5KVcFaGTm8GE8Hg9PPv0c07PjIIPLGaXTgRdeeIHNzU3yhRKbO7tUqnXcPh9uj4NWu4tNtuP3BTFVH6ap43G7GBsbx+dzE4mGWF1bQlUVBoMe7753gYA/xvT0NP1Bly984ZfI5Xap1+v8z//8l9nd3eW1117F5/OidPs0m3ULdNtq1vEHherR5/dgYtBqN3n44YepVCriNebzBINBrl+/bg1gT58+zfb2NoVCgbHxg3Q7fWHLrtdFvF0wSCqZEQFJgTD5XBGvy8nC8DN88+bNYSUj4uu/c3j8nz/eF5XCyWNz5rXL52jkBBPxvffes7IlDx48yObmJvfv3yeaEGhrVVUZG81y4cIFUvEYvV6PZEIMt1wOJ2++dY6HH36Yd955h9OnT3P9+nV8PtETJhIJC53lcDiYnhlndVVYnjeG24WZqWkqlQo+X4Dl5WXcThf1bptYLMbq6iper1fIUUfFgOvixYt4PB6Rfn3nDuFQlLv372OaJusbO9hkOwbgdnmpNVsiJDQQY2e44tzPATQMwwrCqdWEUy+ezIhdfrXK5OQkFy5cYHJykna7zeHDgkn5wAMP4Pb6ePfddzlz5gxXL1/C5/MxPTXJ/Pw90qkUKytLjKTFh8au2oTibXmZkydPWqasQCDA7du3uX79OpOTk4zPiAtzeWGZXqfP7KE5XKqLiZEDJONpAoEAMjZ2ew3cbje1eoV0MsXVq1fQen3GRke4desW3/rWS0yMj2N3KERCYXxuD5sbGxY56MiJ48wcnmVjbwdd17ENhOW83W7TbrcBkaMAQldSKonDNxgRlUs8nqTRbmHoMuFolN7AJBZN4vUFmJiYFA7MkSAejw+/x4upG2BIBIJ2zD688Bcvs7G2LpytniiKojA1dQCX20G5nEd12Jmbm2by0DjmUGfSbDa5du0ajUaDVrPL7Vt3KZUqbGxs4fX4aDbbzM3N8bM/8zl+8Rf+yTC5qY026PHAA8fptts4nXZssrCtj0+mLUFYPBpjZ2eP8ey4mNvYxGB0fFTc2FJjY5imyeZ+1c0aAAAgAElEQVTmNpGICMdZX1+nVqvz3Mc+xsK1Gxyanub1N15ldHSUUNDPjRvXyKQStFpN2q0GP/2FX+Xmnfn3b6Wg6zqtQsGyGO9juVRVpVgsMjIyAoDdKfzkly5dwuV0MDk5SToRZ3FRbCUajQaqTyUSiVipzna7nbm5OYEX29sTWLfh+rFarTJ96gjlchmbJIg1DocwRe2z81VVJZaIY28KuXEuJySkk5OTgiEYCjEzM0Or1SKfzwuM+NauFdWlGzLtfhdTkhj0dZweL36/n92tXULhAIqicPbsWfx+P+fOneOdd8/T6/U4ceIEJjq3b9/G4/Hw4IMPWrvnbreLx+NhYjgfkWXZmrvE42KQVK2VWVkRtKfl5UVLyebz+eh0W+RyOWsmsO+wGwwG1Go1/EM2hdfrxRiI9alhiGRsh8NBvdVELhboDfo4FCdrObE18nm9uFwugbBzChfo+vo6sViM8fFxEinBnUQ3yOdymKZJKpWy8Px+rw9ZsVHY3LMQ5vsMhv1sTVmWLWdlzB6zeJrT07OcOHWadDqDPxAAGSQJen3oduH6rYsUCjeplitMjI/j8wZIRkXO5oc//kFhf+mBDtgcMOhAu6Oj6z2uXb/Kl7/8ZY4dn0PTNL72518hEokwNzfH5IEpnnv2IX7oYx/H5VPJbVcxDIM//IM/YmFhiS9+8Yv8+q//Os1mk3ffvUC5VOD+/TsEfD4cDgWHQ/wMQqEQOzs7OBwOJsYO4PU2GQwG5HI5Zg5N43Z7WFtbE05KRQjDRkezVKt1NrdE+FE8HqO8ucnYWJZyqcBTH/oQ969d4YUXXuDhhx8CQ7OMee/7SuH4kVnzxS//RyqVCqVSiYmJCUuSGRgZoZPPiw2BLlMoFAS5yOUkFothakL40mk3BTI9kWRzdYWNjQ28Xq+ljLty5QozMzNWurPf72dlZYV6rUgymaRWa2AYBqVSWbAMNKHcm52Zw+FwUKgWmT5+nHo+L+62djvZbJZWq8X29rb1A9NkmZXlNdY2N9na2mIvV6LXHeD1CyiHwy3k0npfGJAikYj1PiwsLBCLxXA4HESjUeG2tIkoso985CNcv36daFRIbVOpFC6Xi4WFBR5//HGuXr9mId3mZg+j6xr1SpVYPML66gqxWIzbt0Q0eSaTYX5+3oJwOBwilLbX6/Hmm29afEF/xM766gbNZpux0Qn6/QEg4/eEiMeT2GwK9XqdsalJZFkWrcIwnPXE8aO88MILbKyv8sgjjxCLxRgMhKJR7w9YWlwE3UDHZPTABE63CxQRvVfZLVIfch/3FXr7wNv9bMdAIIDDpWK32wkFIzidbpqtDq1WmzMPPcoHn38e1QXFXId8Pk+puGuFBu3t7dFqtdjd2kZVnfT7gllgs9moNzvD6kNYkze3Nuh0WgSDfgaaQMI7nU567Q7JZHJoBe9ZKc+lUglDh5MnT3LkyBHOPHiSw8fnGLS6bG6uc/G9dwiFfLz3zjtUqyUCftGS2R1i1pXJpOl1uwQCAZYX7pPJZDg8Oyta0FqVGzduYFNdli6h1+vjdrvZ3cnx9NNPU6s1uHNHkMSn5w7T6/XI50RbfeTwDM1mg8X7C/ziv/w33Lhz7/1bKQCsrq7idrtJpVLcvHmTbDZrrfLC4TBLS0vMnX2czc1NTp06xcb6GisrK7TqNR5//HG2NgUPcWH+PmcfeZhCoUC1WsXtFsKYj3zkI+Tzwiu/srJCPp/nxBNP8O7LLwxVhjrJZJJsdpRyqUomk6FUqhCMhKnX6yJIo1y2cgU3NzcpFosUhhVOr9dDkiRcHg+RSIT1YW6f3W6n2xH8hH3AJkAgEKDVatHr9ahUKuIAmp0lFosRDot/c2Njg3hyhGq1wgsvfNNy5D300EMUi4Xh1Plhvv3t13j40Ue5fPkyjUadnZ1tzl94C8kwURSZVCLJ1vYGU5MHKZVKDAYDJicnh7mKKvV6HYfDQaVSGQaTpsSAN+oCQ2JlZY1IJMLOzi5IYHc5CEbCYn0WFi2AqqqUCwU6nQ6pZFwARTVBj3IodrwuJzV9QLUkmBKdYRtlmqbQQZgGhiKjqHbMoMC67ezsiPfU5WJmZsZ6r/aFNycmTnD8+HGe/MDT9LUBqt0FThmzC92BQb2kEQi4CIfHWLjTo1qtIhsmE6NjGIbBT3zms7jdblZXV7l69Sob20KDYrfbrcjBdEZkQt6+fZNQKEI8JtKW3KqX9fVNq3pTFGWYUC3s/esby+zsbnDr9jX+zk/+BN1ul50dsSJ86qnHee6ZZ/j6179Koy5kyKGIoHC53W5UxcapB05Sr4j09FdeeRnD0Hji8cc5OHUA1eUmk85y/vx5KpUaExMTqA6F3b1tlpdWh+BfeOONNxgdHeXQ1CTVatWaJ4yPj9N/v4uXjs5Omy995Q+E8q3ft5hz+0O/XC7H0WPHuHj5Bpom8g3HRrMoisLBiXHefPNN3C4Hx44dY21lFckm02g0OHToEAsLC5w8eRI5EKCTz7O0tEQqlbJ4iXduXCOVEnvtcrlCrdlgZ3uPUCiCZJMZyYwSHhvj5oU38fl8lMtl/H4/r776Kk8++SSKopBKpURuYy7HbqnE8tIqS6ur1Ot1Nrf2qJRrlCoVtIGBZiIESwFhqNk3p7jdbrrdLrOzs9ZKqtPpkE4LBmUymbSCZ8+cOWPNWU6cOIGiKHS6fY4dO8b6+irf/MY3OHnyOINuj4WFeWLRKD6fh0xK6PDdbr9l6+52u2QyGatPvnpVgLedTifF/KYQi2k6it1OtV5HdbqpN1sMdGGPHp+Y5OjBaQxdH4p5GnRabaJhoa4zDQ2fz8czzzxDPJ3i6qXLrK2u4lDs9DpdkukUE1MHWd/axOX1UG3UMbqa5avYV+jlcjk8Hg9TU1PioO12GXQHwlDW1/EFA3Q6XZaWl/noRz/OyVOn6ff7XLp6hUK+SDufp1qtslfIo9jtyHYZySaTTKd48OxZHE47pVKJra1NUqkUH/zg8zidTu7fv8/y0irXrl3DMMT68dChQ4yNjHH06FG8Xi/Ly4ucv/Am6+vr9Ps9XG4HLpdIDNvZLiBLYpCczWYoFnL8g3/weSqlEnfv3uIzP/ZpwtksX/2jLxEOh4nFojTqVSYmsmyur1Ao5hjNpmm3m+Rzu0QiEbJjk6ytrWEYJul0Gl03KRbKlMtlRkfHUVVhbLu/vCq8ErrG2UceYXVxkXw+h6Hp/OTP/wILK6vv3yzJ0yePmZcvn+Py668zNTXFzo4YOM3OzrK8vGx9QManDjPo9Th//jxPPv2UMP5UK8LlqAvzx4HxCeRwiEGpZEWlr6+vk06nLXNULBaj0WiwurqKx26n3W5z9oMfZPPuPSq1GrKssL27w9zhoyTTAui6trrI+Pg4Y+PjbG9tsbOzY7kd93MaookEuWKRjfUtvvr1r2Oz2bh85QY723uYkoQ2MNARqcHNdoNut2uVwvuchXA4jH34mux2OzZE2Eg4HKZUKqFpmpWGXCqVrJyBVCZNsVik1+uR29uh0+mQTacYHx+n3WoIRZtTgGhDoRhut5tYLDY8JNzDbYnOlStXyGQyuFwuVhfvgSzhdHuYnp6mXKuL4WggQLsrtimyYsNjOEin02ysrVCr1bBJQpk4PjpCv98nn9vlAx/4AO2Bxu7ODt1WG1M38PmETwO7Da/Px04hh01RcNqdVhXRbDYtJaLIPnBZK7eQbzg7OjiJ0+miVq9z6tRpXnntVTrtHuWaSOPSNA2lpYk1s2pDk8RGw+5S8QcD1FsNUdG4VDLp5PCQ9qKqKjvbe+RyOR544DQPnjnL2toad+/eJRqIiVSvRhXD0DAMjUg0zHPPPcXExARXrl6iUqmwtLTF9WtX0TSNeDyKNuhx5MgMi/fv8/TTH+Dw7DTr6+v88Mc/zcsvv8xTTz1JtVJibW2JSinPkaOHqZQLuFwOLl18l09/5jPM353H7/fTbLZxOBxUK7UhXt8cgoIhHA5z5eYtstksGHDu3Dk+9YlP8PbbbzOWHeWH/s7f4/b8d8+StH3xi1/8//kI+JuP3/y3/+sXZ0cSPProo6ytrQkDlNOJN5Gg22iQnZlB1nVy+eJfk22cTuq1Gv5IBIeiUK0KhHW9VicUDFAtlaxU52q1SigUAsSkd21tjYMHDzI2OUktl6dYLtEqVYhEo4wfmkVRZMKhKB6fl35/gKI6CPq9GIZBq9m0YuNTqRR+vx+HwyEGcx4P3lCIeDTG1nB9pBtQKVcZaBqmCSZCUm1T7BiGic2mEAqF8Xp99Hp9XC433W4PSZKFHdzltfIB9/bEAG6fBr2PdEun05hIQzZgA5/HR6VSpV6rUa1WeObpZ+n1umxubOJwOHE6XZaJzOv1WlmE+2SodDrN7u4u9WoFXRO5mv5AAFV1kEgmKZdL+P0BksP9dy1fJBwKDrmLmpjiqwqqYkfX+6iqyrEjR6nW65TLZSQgEY8Tj8ZwOB20Wi0KpRK+oBi8ypIYgu2HAO+7NJ1OJ3Nzc0xNTdHv90mmRpCGs5D+YECpVGJja4tao8G9+/dottt4fV78gQCKIaE6VPr6AE3XsKk2QmGhKG11m+iGRrvdtMJiK5UqHo+HI0fnwJS4desW+UKOWq3K8ePHcNkdFAp5RjJpJiZGadRr7O7ssL29yY3r19EGfc6cPs3jTzxNtysqvUajTrVS5siRw4yPjfHNb34Dh2qnXq+TzmQ5efIk7733LslEnEQiRiQcIhwJcf3aVXw+L5o2wOt2Mz5+gPXVNdqtDqlkiuWlZbTBAK/by6HpaUqFIoV8nlgqxcjICP1+j+xolnZTZE86HQ7+5Kt/zs/83M//2ne7Ht8XMwUJifHxcavfrlQqwi49DIgFEbftdrvZ2NggEonQaDSEvNWuUCqVyOfzHDp0CJfDSWs4S3AlEtDvMzc8GHq9ntDoB4PYg0HodDA0kwcfeJArV65w9ANPUVxcJDo+QbdeQzfB4XIK7cPICNubm2RmZ7n33ntiXRiPc/PmTc4+8wz0ety6do2ZY8f48pe/gmEYPPHEE9xfWCEUjHD95k3qtSadviDyODx+ZMWGZFOoN7tiah+K4XC5kGx9a+oe8kTodDoW0Wef6z8YDEilUjjUeRyql5XldZHO3TPY3VrD4/HgcthJxDN8+ctfI5/Pc/rUSSsEt9VqWZJaTdMsUdd+aR4KhTAHghWh9XV2t3ap1WocP36cZx99AtUlJMbPP/kUr730bV5//TXcQzqzU7HR7/ZotxqC1CTLNGs1kZxVqzPo9dF7AyqlspUJGksmuHXvLqpTTN+/k4qtqiqLi4sYhsE777xDMBjE6/Xy1oV3ADhy7JiYHXk8dLtdRiYnOH76FJValcXFRXRdJz4qWB3tTpNmu4HdbqNcLWFv1ZFlA5fTBTaVTqeHoqgUCoVhcLCdZqtKIOhie2eVUqnEXm6dmD/B8ePH2dzcZHdvi2q1TDIZp9lsUi5VKRUrzN9bIhSN4/W4OX36ND/2Y59me2uDd955i/zengDSDAaMjY3xp1/6Q1wuFx/+8Ic5d+7bnDx1gtFDU2AY1GstbLKKods49+Y7AvsXi+F0ulhYWMTt8g6RbPCX3/xLJiYmcThcbG1vEItHSI2Psr6wZIXBNGrNv/V6fF8cCkgSBw4coNlsEovFLLNOIpHg8uXLREslotEowazQBfT7fasH7/V6KIqC0+mk3W7TrDdIZEfY2djAFY2CJvT72aFLbGFhgUOHDoGmsT10Sq5vCCjmlW+9gs2uojhduIcp04o/iKNUwdA0MhMTlFZXmX3wQYqrq7j9fqLRKPT7DIZ9f71eZ2pqik6/z8rKiliTqqoV6rkP3dRMxSLwptNpwuEwk5OTOBwOfD6fCImJRIgGEni9opTdt7s2GoI+nc8L0dDp06eJJeLE4xEkCVaXN9jYWEPr9ckX9tjdFuxAv89naTb2cye63S4+n498Ps/o6CgHDhyg1+tx7do1Al6xN9c0DY/NRrfT4f78PJVCXkTSV6vQ6+H3urHbbMLj73JSLBZxOgTTwj5cIZbLZXomwiVpV4ciKLdI2m418Ph9QpjWbrG+vv7/MvfeUXaf9b3u89u99zJtT++jkUa9WJa7ZXDDNoZjCKbYYB8CmOQeICShZOViIJwAoYSSY1MOwWAH4gI2xl0SsiWrjaZpet8zu/defuePd88O68ZwcnLvXcuzlpdtyTOSR7Pf+b3f7+fzPPU5SyqVqq8dt3Tr+XyeQCDAvfd/lNXVVY4dOwZABVkM/txO+gYFquyOO28nl8vx8x88xsLiPNdeezWyXGFpeYFKKY9KpcBo1KPWKEVSdGWzfoULBoO8+GKAoaEB+vp7ePXVkzicVhxOK1okzpw+yS233MJvf/s8hVyOdDKJXq+nkBW7TZ/Px/KGnyOXH+ZXv/oVP/iBn21DA3zoQx9gbmaGiYmLVCslzp07h9vrwuVycP78GcxmE3Nzc2iUChoaGrj55lvFatpgpq21A0mu1J2Q5XKVVCpFR2sHm5ubFHNFVJKCjtY2HGXhIdm+/4C4hinV9TDUH4apvUlmCrtHhuXv//3fUiwWMRqFIMRqtdI1MMDJl1+mqUkEOxzuJpR6PVQqFLMZQqEQqXgMj8eDvgbGWFlaBoVE1/btYkFtMJDZ3GRxcZGhoSGR+KoJPgKBAKp8mcefeIpmXwuhSIw//eQnmLp4kYH9+0gEgpQq4g9gc3kWo9GIx+NBp9OxsLDA6uoquVyO/fv34/R4iIXD2Ds6eOXpZ9EaDPT19TE9s4Db5UWt1aJUqFn1b/D6668TTRTrgSG9Xo9ara5/0edyOSYmJoSpKCqyG5lMpj6Jz+fztLa2cvLkSVpbW0W+o/YYmkqlcNjsqNVKFEClUkarEcSngb5+KpUS3kYbra2tKJVKnn32WSFaNRpxuwUcNJ/Pi1SjJKrR+VwGqSqTTYs5RntLMzqNuDIdPnyY8bl5Zi5NU6mUhF+xxnfQ1+jbZpMBk8lEKJmhUhLCl3ztUVapVOLraKdYLpHIZ6kik05m6oeCwLppxK/b3i4O1HKZsbExkiUFvX19TE1N0d3Tyb0f/CBjY2OcPHWSEydF3qO7u1toCf1xcvks1XKJO26/hW3DQwTWhUM0n01SKZUIhUL4NzNksincbhcmswGLxYDH60KlkpiYHEOn05BOp3HoHEiSAqPRSHdXLwMDQzz22C+YmZ5Dq9XR0tKKJEkU5BI333QjExMTXLhwDovZiMViYGlhgTvvvJ233HA98XiccMzP888/z549e/CvbdDX18dg3yBLS0sU8wVAwuNy1+LmBs6fP08ikWDnyG4uXryI2+0lGBCbsNZWIf/dccVuUrEYo+cvAtDX3YdKqSWXzfLWu97DhfE3bkm+KQ6Fof4e+YmffJ9SqVSvsFosFqrVal1Jn8lk0JuEqCUWi1Es5PF6vVw4ewaLxYLH7cRoNJLP5lCqxXpoa3C3VWy57IormBobo7e3l1gsxtraGvlwHKVKgFsKlSq7Dh4Qs4qmRsrZHOFolGq1ik4SgppSqUR7ezszMzP1x2ydTofRaAQglEjQ2NBMrraNMJpsrK36OfX662z4A8wuLDI/P49KI0AnNputPqNQq9V1eYckSWKNmRcVaIPBgF6vr0tjmpubmZmZobm5mXA4THOLOBwkhUwxX0CtVmLU6ymXS+g0WhxOG73dPSwsLFAoiarzVr23UqkQCATo7e1lfX2dVCrFwMAA+YwYdlKVyaaTGPUG1lZWKeQyNHuFezGXySCZLciVKrGYsBnrtGoqxRKpVBKzyURbmw+NRkO2AtWyOGRzKVEUSiQS5MslfG2tFCWZaDRKuVyth6dUKpWQDdfgM1sHmMViYWYtRDQa5cCBA2wGA5w69SpdvT285S1H+d2rJ5mYmMAf2MRg0JNLlFEqFditZhq8TixmE/FokEavhz27Rsim0xw7doxovEIymWTHyDZsdguFQoadu3aQSsWJxUNotRrOnTtHPrplRNeRTKQpl6tcd91RTr32OoVCEaPRjNPppH/7IKsryxSLRcxmI6VinlBogwP79jEzM8WVV1xOe3s70YSYF0WjUYx6A9lsnpHhEdbX1ynkRHHusoOH0BqNjJ45SUNDAyqleHpUq7Vo1NpahTtRJy2dmjglvpnanFSrVTrbOrHbXCTicW69+/2cuTD65j0U+ro65Ue+/012XXEFkaUlIpEIvX19jF28SENDA+72dmbOn0dRKdaDR6lUql7c2djYoLW1VfgGanKOUqlER0cHCrOZcg0qsQUFSSaTxGIx0TeoKLHabczOzjK0fZi19XXUWiEmyeRzSFvk5nyJqakpHC4nVqsVZY06tBEQd0Ob08HGxgbBxVWqyFitdlQqFdMzc8JTsRHA7/dz7MQJnE4nY9N+vF63IC9ZjPVVViaToloVZOd4IorL3kapVMLpstfDN11dnYTDwrjscjuYnZ3F47KI0phaVJvDwQjpdBa1UkNbSyulUkWEpewOQhtzYksRDNPa3obJaqFcER0ET2MDCqWSfL5IPplEoVDQ1t2OLMvMzc2QTCbJp9NIlSoKScbjdFGQFGi1WsoFsVJ2OZ1kMhnma5Kbq45cIbIX6aw4jORqHYG3RcAqFAoYzeKgUteSkUgSuVwOjU54G0vViqAImYwUCgXSyRJ/8zd/w6OPPlrvkOzfvx+Hw8HFixfx+/3ceeedNd7ACzXRrwhBWaymGglZbCisVjMul4vm9lb8fj+BDVEmctlE2UglKZArVbRqUR+vFsNsBkXbVqHU4nQ3IClUHDx0hAMHDjK/uExPTw+P/exH4grnX8XX7Aa5SnOjmx3D2/nXX/ySbQPbWF9f57qbb8Fms+Hz+Ugmk0xOTiJJEkNDQn/ndrvJZrPIskzPzh2ceeUV9BphMEvE4qhVKpqamlhdWiYYDIpymqbM/v37OX9ulFwuh8fTgMfTQDAQ4va772Vy+o2t02+K7cP3v/edz//tlx9ErunTtkCqkiSRyWRIxwTCy2Yx0dLRgX91ldbWVqxuN+VCQXwyVlfrwzlPXx9GhcgqqGQZtVZLqVhkdHSU1vZ2VpaXazx9NVqdgXA4THt7OxfHxuju7kZVWwlabeKw8G9soET8ATV4G1CqlKytrmIym4lGooTCYUqFIrFIlGqpQDgcoaHBw8LCPJvBDcKRIJVqhc1Nfw24EUapNWC3W9HqNMTiYZqaGimXi6hUAqFus1sE+l4nYbXpqcpFlEpwOCxYrSYBUqmWicWieDxuKhUVmWyRYr5MOpUjncyi1xlIp9I4XR462ttRqVTEEwmq5QJICjQ6LYlUhnKpQjKVJJ/P09TSTLFYZGVlGb1GiyxBMp2mVClRqcqolLW2ptnMjuEdKCUlZQmSySTJRAKr1YrX4xF4uZUVkfAri2CYSW8UiLZKhWKxSCadJl87DJRaNflikWK5TFUWc5NKjdlYKpexWCw43aIPk0ylaG9vx9fSwU9/+tP6NwqDwcDm5iYXLlyol4nSaaFt1+sNyHKF97znPWRzIo/R29tDqVRi27ZBotEoBoOB4OYapUKeSDDAYH8vPZ0d5DNpVBKUSwUUVKmUi2RzaWQU6PQG9EYzJouFtrZ2PN5GXnzxRbK5PLOzs+SzKQwGPdVqmXIpj0KSWF1ZYmF+nr179tDb3cvevXupIpFJp1EqFJiMRtwuF/sPHuT4K6/gcbvxr6/j9XjY8PuZnZrE5/PhsAnBSzaTQYI6wi+bzbKyskJTSwPBQIBgIMjVV13FytIKZqMZvU7PTx79Bf/1Tz/yhtuH/yOX5P9fb+l0Gv/0NJLBwMLCAkajEavdXpN1ilOyvbcXk8UCCgV2pxMUCvLpNAqVimK5jFxLE1rsdoKzs0TjcSqyTGGLlLy4yMDQEBcvXqShqYmp6WlKlQre9nYCgQDrm0Lwevr0aZxuN3a7XURF+/po9fmwWaz1gM/y4hIajYa1tTU6OztF+WhwkI6ODg5edQWDQ/0YjDqisTAGg55du3Zit1sFkadawmQ20NfXy/LKIoWi0L9rtWqcTnvtIBCpQofDgdGoI5WKMzDQTyQaZHVtmWw2i04nIr8eTwNebyMryxsgq+nsHsDlbCRXKJJOZ2lpbsXr9YJCgV6vpaHBg85gFIp3pYCtblXTC+USqVSKcDhMR0cHKpUGWZYJhUJEI2JF5/J4xe/L/G/V9a3O/la2oFAo1GcgitrhnM/nKWZzaJQq9CoNUk0+C4BSgaRQIKmUKNRi9l0ul0kkEhQKhfp2ZGumUq2K4ZpOo8VutRGPxoiEwug0WoYGBnnm109z6823YDGZeemFF/ncZz7L2OgFbBYr+WyO/t4+3nf3e3E5nLidLixmc/2v6UuTRIMB1EqJarnI0uI8dquFcrlIqZCjKpdRSDKFYrkGtRVQYJtVcB01Gg3XXnstBoOhrrW7cOFCPYnZ3NyM2+1meHiYeDxONBplaWmpFkYSIuKtKPqpkyc5cuQIsixz+MiRuk9027Zt5HI5nnvuOSKRCDMzM0QiEQKBAJVKhUOHDnH48GEB6a0IiO/42CSZmn8inU5R/SPauP/t9UGSJB/wY6ABqALfl2X5HyRJ+jzwQSBU+0//Upblp2vv82ngHkS/5GOyLD/7x36Nwb4e+cmfPCzy9s3NUCiwvrhYfxGGQkKXpdeo67y5rZlBuVwW9KKau69YLKLX60XKryZy7evrIxKJ4PT5SGxs1A1OmUyG+flFdu7axerKCuVKRcSph4ZoamtDLpdYXFxkdnaWvu4ewVUIBNh22WXkAgFiCaGAU9aGfGq1mt7BHlI1zFk6nSVXyDM5cQmFWkMqleJXv/41qVSa42fGMer1KJVKvvzlL/PII48IRNjmOgqFgu7uboLBICDT29vL6dOvs3fPQZxON/mcwKpfvDiO19tIT3cvXd2DdHV1MbJjWKwXzQqQYfT8BC+9+FtUKhVD2wZEmzESwWKx0CT9maEAACAASURBVNHVzhNPPMGZM2fEgVR7QW5xLcqFMlVAZ9CjUAAKiUI+S6VUpsnpRK1SYdQbqKoUzMzMoFEKBLxBrxd4vOUVNjc3mb00TVtbG51eH3aXU0Sr8+JzU6QqOg9qJVqdjngqiV6pFYalVKp+3VheXkal1VAoFHB53AIIsxnj/vvv5/nnn0ehULC0tIRer2dtbY39+/cTiUQYGBjg2LFjZNI53G43rW1ib69UKrn2uqtZX1/nxIljeL1e+vv7UVNmdHRUQFOR6psjrVZLOllzcGg0aM0mACwWC/39gwwMbkOWJcwmK5cuTRNLJgBwWAzEE1GGBvv4nz/6J7KZNDqNkAht3zaMXJYF4l8W6cStOdWePXto6Onh7Msv4/WKqLWmhuQ3WS34/X5cdgeFQoH+3j5ePXmSoaEhGj2iGyLZbBz/7dMolUqamppQKsXwN58vsmvXLoYvu4pLs/P/6e5DGfi/ZFk+J0mSGTgrSdJztZ/7mizL//3/cYgMAv8FGAKagOclSeqVZfkPuq9LpRLdPT3Mz80xU+Mt2mw2crkc3d3dNDU1sby8jNPlACAUCaNWqzE3NBFfW0Ot1ZDKpOs9hH379omwi0FPOpthMxgQK5z1NWw2G7/73e/YvXs3/s0NWtvamJubQ6EQ2jSz2SyGhuUygY1N9Fodne0dNHoEPrytrY2p116ju0bf3djYwGA2MT8/zxVXXAGlIul0mkuXLgmoxfwCXq+XUDRSL3udO3eOg/v3Y7fbefDBB7nnnnvqzomurq66a1GlUuFyNlDIV/G1dJFOFYhFlkmlcnR39XDwwJXsHNnNW996I1a7RLkMv/zlb5ibmWVpeY5oKMz1113N+z5wD1arGUlX8zAkcoyNjfG5z/4Nu3bt4tbbbiMUCjE2PkowGMTtdrO+vorX2UxzSzNGs4FwNEIul0FSqFAqZTR6HalYnGK+gMEmcGp6k4hub+Ht1Gq1gOnWYCCBDTFM0+h1yAqJbKlAWQEmpx2zwYBKp6UcixKJp+stPoVCQalUrr8YFxcXUdRgs7tHdvKjh39Qb3ru2bmLaDSKQgapKlMuFLl4/gJXHbmCl19+GZ1GxfzMLJIEHo+Hs6df5+jRowT868zPz5NOJHGYtQT86zQ3iBdioVAgnU7S2NCNUoGocktVtDrRqTGZLSApSSRSHDhwgNdePU1jYwNtbW0kk0lMRg2RaIinn366jrGTJAmPx0M4HKbJ20QymcRotaFSKHE5hPBldXmFaDiC1Sx8JamUSF2WCkXCiRgdHR2YDaKuPzo6Sm9vLz6fj+DGJpubm2IGkcmI2VRM/PelYhGTQSISCv/RF/x/xBC1AWwp51OSJE3xBmr533u7FfiZLMsFYFGSpDlgH/DqH3oHnVZHqVjEYrHUQSdmswCUrK+v07ljhyDOJBJEIhHMZrN45E2kyOWLVGMJqrKETm8kEAzz/Asv0d7eTiaTobu7m0KhwPr6Gjt37kRpd9DU7CMciaFSa9EZ9FRjUVKpJDuGt9fLQZjNmFMpofZqbSWbTaPXa1lfWaa7twf/+irexgYCm352tu1n3+5dTI5dxGrW09QsFGWPPPJzhndsZ2J8isuOXMGxY1+kUq3y7W//I9mKmo9+9KPceuutgmkYCOByeaiUJZQKLRazBZPJhMUoyDx2S5X3v++DeDweDHozKyt+Pvzhj7C2HOd/fP9nPPDJ+9BoNNxyyw0oFDcQi6b5p3/6Hh1dXZjMFk6ffp3f/OZpCoUCw8M76O3tRmMw8cxzz6HXaQkGN9HqRLYgFg6hU2uoSlCuVlhZXUepVVKsCNO0WqUhm82jUKrJ5gpozWJmsLEmjMdytYrf7yebzgg3Z2MjbW1t6CpKMvmcwL7rdKipYjQZAElIfmtXhOhmmGg0irrWipxfXMDlchGJx+js7GR1fQ23282ZM68jSRIdHe1YLGaOHz9GIpGgtbWV+fm5uhNydXUFl8tFIhFHo1HjaxVwYKfLylNPPYFer+Xeez/AsWPHiG1uMDy0XcwjshkWFxcpFstMTk0jqQRX0+V2ky0ruPzwFbjdboYGB9HrxCr98OHDKJVKTp9+nVOnThGPBZGpYLOaamlOGYdN9CdWl1fw+/3Y7XZ27xZcC7dLbMt27drFhn8Ni8WCXC2ztrZGqVTi0KFDZIriaSIeEZux9vZ28rkcc3Nz9AwM4u3vh3icpu4uxs+eZW5ujpFde1GgJBjcJBwKIP2RnML/UXhJkqR2YCdwCuGY/IgkSXcDZxBPE7HagfHa773bGm9wiEiS9CHgQwBNDV7UJhPampX49++kbrebciyGo7GxDt7Ytm2bKOyEBR14ixXQ2dlZ3+NvO3iQ2XPn2NjYqJN9JEmiEo/XtxBbM4uGhgampqZYWVlh+/btnD59mo72dhr7+6mcP8/U+ASNXk89XffS8y/Q5GvBbLWwc/9+EjWzL4g0ZlWW0Gq13H777fz66d9gNArS9MiOnbR1tHPvvfei0NuZnJzEZLKQzxdxu93o9UYi4YT4wnN6BBimoGHfvkPcdONNbGwEefLJXzM5McPk5CRdnd20tLRwzz0f5PA1g6RSRX7w43/mwtlzmMwG7v6Td6NWq7ntttvp7e0lGglx5MgRiqUSX/ryV3C5HaKSm06KR2KNjnQiTlGjYWhoiHS2gt3mIJVOY7XY0enEI2xwfZ219XXkahWpXEVt+DegazqdFlr6shh4ZTKZuo9DUZRBIb4YNQY9uUKe9t5ussWCKEMlE2i1Whan58V2Aur9iC3M2JY52e/3o5XENWN1ZYWhoSE6aqviDb9f9EnyeQr5PCajUbgwZYE0UypArVSxvLiEwSi6JU8+8QRXXnmE30UjnD9/Ho1OfB1aLBZaO9pFszOfR6PV4nS5GGzrpX9oG26HE29zI/lUnsXFRcIBUbp78cWXBGpPp2Tdv0pzkxe3283mhh+LxcL09DQWk5mu/i4MBgPj4+P09/czPDyMcDpTb9FuMTueffZZTDYb8soKU1NTbBsYrM9dHA6hDdxcXqZarbK2tsbwjhF0Wj0NDQ1Ui0W0WsHHdLlcKJX/H4SXJEkyAa8AX5Bl+ZeSJHmBMAJP8bdAoyzLH5Ak6dvAq7Is/6T2fg8BT8uy/Is/9LG3DfTJv3n0J6RSqbpmfG1tjcbGRsLhMJZactBud6A1Gjl76lSdy18sihBQPp9n+/btLCwsCBpNqVRn1+n1enFHrtGWtnL/RqORqiTXH+sUMsxcmmZtdZVDhw4R3BAdg0ZvAxfHzmEwGDAajbS0tTI3O8vE1BT79+8nlUmL35/TyeriCqGwQJw1NDSwUHNVvO097+XvPvc5FpdW2NjYII/4fUSjURx2FxaLFYvFwsEDl3HXXe/GZrPy7LPP8zeffxCXy0V7ezsOh4O9e/ZzzTVXYbLB177yMIFAQBSrTFW2bdvGDUePsr62wZ898AA33ngjH//YA4RDEWanp1msNTdfeOVlLCYzWp2GXEYUmLK5FFRl1EqhF8tkU1jtzbg8bjL5HDqDjlAohEQVh9VGPpmEqoxSkqhKYhCoVogKeiGfp1KpkEokKRQKDPUP0NHRQUuTD5/PR0WukisUhJ/AZMRoNhGMhLkwOopSqeTixCQ6nY7mlhbW19epIrgT65uCeaDV63jyySfZP7K3nl3weDxMT08Ti8UIh8P09/ej1WrR6/VUKhUkSUlvbzfj4+M4HDbC4TBKlVTrxQjiVF9fH4M9A7hcLp5/6UUqlQrFcgmtTofOaBCy4FYfIyMjWB2N6HTC/mXQ6WmsEb1eeuEFNtf9zMzMsL62Rji8yb79ewgFN7js4G4K+RypRISWpmZCgSCVYgWfz4dGq2JkZES0P0slLl26xG233cb58+dZWFhg//79BAIBLl68yI79B3G5XGSS4krhtDuYm50VV1+dQPyVy2WikUQt9NVKOBxGo1WTSMQwW4z817/8WyZm5v7zPAVJktTAL4B/lmX5lwCyLAd+7+f/CfhV7V/XAN/vvXsL4P9jH1+r1VIqCWvS5uameHEcPMjSkpjyt7S0iLRfIkFydZXG5mamZ2cZHBzEptHU75+jY2N4vV4ytTt5vlikpaWF+fl5kskkNpuNarVKd28vAKvLy/i6O8VvQq0mFwjWXQ8Gg4G2tjae/tWv8fl8JGJhcDjq2XuDSQwrT5w4wYWLoxSLRY4ePcrKop8b3voWnE5PzZWwzOrKCv/3X3wGq9XK2tqGIBAXijQ1NWG3ufj4A3+O2+3mm9/8No//669ZWw2QyeTw+Xw8/IPv4PV62dzc5POf/yzTMxd4/Kn/id1uZ2BgAK3BytGj7+Dvvv5VItFNQpENdu8d4IP330MmmUKtBbfbydRUleWageru93+At7/9KL9+6gV+/shP2b5tkEI+w/mzZ7j++usoFousri2j1joplcTVIBAS7MY9e/aQjsdIlEsYdXqUMmQL4hBwNzYRDAZr2xEdg4ODZDIZ2traBLa/Ck6vB4PJWL8jb6n6csk0lCts+DdQqVTMzMyIirNCQTQqroypVAqr1UqxWMTj8VAti4OnWCyyvLhEg8eL2WgSbohcnlwmi8Ihsg65XI7lxQUaGxuZnJigo6ODlZUlisU8pUKejrZ2xscuMntpicbGRm6743aWV1coVso0NTXR3d8notZGA2azmUpFWe+K5GpPRJFIhFwuz9raGvNzc7jdbgYGerA7rLT6mrh06RIjO7bT39vJhXPn2b1zF0adkVAohK+1GZ1O9GzUajVXXnklzzzzDLe8612srKxgsViIx+McOXIEg0MQwvIZoUV0djsx1UjNZ0+/zoHLLyefStHVqSaXy3Hy5AkCgQBWm4XGRi/5QpZS+f+FdVoSzzIPAVOyLH/19368sTZvALgNGK/985PATyVJ+ipi0NgDnP5jv8YWT1+j0dS9i8laZsHhcLC8vCyGKMEg20dGOHP6NFdcfz2vvvwyPT09FArCI9jY2Ii3s5NSPE5zdzcbCwtItS2E1WrF5XJhsdtZX1mp04sWZ2Zoa20lF4uxtrKCVqvFaDTy4nPPI0nCAqTRaNBoNCQSCfbt20coFGJ9w08wHCYej+PxeAiFQnzjG98gFk4xMTWJVivWSguLy1itVk6cfI3GxkYMBoN4hGvq4IorrqS7u5sf//jHLCwsoVSqGegfpFyu8ld/9Vd4PFa++rWvcvHiRfQGLc0tjXR3dwk0mVqir7+T5eVlfvij/8HHHvgIfX19PProo0xNTvLOd96JXJb5ylf+gTOnzpDN5hkeHGL//v3ceONRfvvbVzl16hR33HEHt97xVv7bR/8Mr1f0LE6ePIlWowJFiWK5VK932+3b6zYuYblSUi0Kg/aWqxOo9zysVmv90Pf5fEQSSVQaNdSkujqdTqj1akAcrVqDXBFU7UQigcPhYGZmhkQiIXIjDlEgyqVTNDc3k46JpqrNZuP06dN1EO5WiC2RSNRAsPm6+3IrKen3+3E6nVQqpfrHHxoagqoWtVasmwcHB8kVCxhq6Lstc5Vao0GtUpJOl+pr1UothRoKheju7uaaq6/m/PnzrKws0Nbuo621GUkuYDab62zMTCaDXiM2ZcP793PqpZe47PLLWVtZIRQSS73nH38cnU4n/ky0oqJuNpuZnp7GZhYhvmq1Wl/dNjQ0sDw3RzQaJZcto9drUShUXHXVVWRzGTo62nj+hd8iV//wDeE/spI8DBwHxhArSYC/BO4CRhDXhyXgvq1DQpKkvwI+gNhcfFyW5Wf+2K+xZ/cu+czx50nUklhGux20WmIrK1QqFaJR8Ti+c+dOisUiDodDFKZaWxmtacS2zEblcpmSArGaWl6hr6+PWDQqBogqsdI0GYx1ClK5IqrUbrdIF7obGylkMmxsiFbg1mEQ3ghhMpk4N3qB7u5ukpk0y2vrXBwbQ28yEo3HSKVSrG8IPHyhIGjNpWKVheUlfI0dqFUavvCFL6JSafjBD/6JpaUlfD4fOp2O/fv38yd/8id861vfYnx8vL4KUxkU+P1+BgYGatCVJt72trfR2tqKyWQiEAjw8ssv8+53v5tMJsePf/QTGhsbOXHid0xNTdPY0MzOnbt517vejVar5p//+RFi4SUGBgYYHh7m77/yZbq6urj/vg/x7nffVZ9+J5IxfC1tdHR0MH5pEpfXw8FDhxgdHWXD76fR5WH0/AVaW1qoKJTodDrSqRSBQACtWsOBAweIBEOiZNXRIf5fW700NTVhMZqIhgWBee7SNLlMVnyhT04JYG6rj7GxMXr6ejl37hw2h108WRgN2Gw2krWSWSaeQV17miiViqRSKcqVYq2mLKS3lYqQ+FZKeUwmE71d3XUTUz4rCmbV2gFnMpmw+9qQJDH47Onp4ciRIyiVSiH5rbERFUol2UoerVpXJ2rls2IOlk6kmZubY3pqWhymuhyrq6vIckWIcz1eZFlmz549nPjdMXp7eynk8vjaWknXDNv9/f0sLi7W6U86na5+2JjNZihX67MalUolREZeIfVJp4XPs6WlhUg0SaVSYffVV7F+6RKexgYuXbpELB7nw5/4a8Yn/5PgVlmWT/DGlaqn/8j7fAH4wv/uY9ffKmVS4TDWlhbyoRAUi4y+/rpoMyLw4n6/uIGYzWby+Twej4eNpaV6vNnu9UK5TKVUwh8J1Vdiy8vLFAuFOqRUo1LXAaWFQgGLVbQRZVnsi6nBPLY4+z6fD5PJxMi1O3j00UdRq9U8/uQT3HLrbZx+/XFMJhMTk1M4nU7CoQgbG2EOHTrM2NiEaFkqtfR29nLDDTcxODDEj3/8Y4rFMqOjZ7nxxhtpb2/nbW97G2q1mgcffLCOe1teXiYSidDc0czIyC7y+Tx33vlODh48iM2m47XXLrC5ucnQ0BC33nobf//f/wGlUsmlS5eYmJgUEBK7neuvv56bb74Zqw0++pHPsm3bNj7xqb8gGU9w//0fYtfIdgYGBnjggQcwGEz1oVdvby9erxej0Ugmk0GdSPDSSy/Vg06xWKw+z5EUEga9lrnZaSQZVCoFk+MXsVms5LJpCoUcNrMJJRKZZAqpKtcxcNF4nHQySaFUJJPPkcpm8BoMgsZ96jXRa/F48Hq9BCNhIpEIhaKwMOmUOgKBQC2AZROyEyU1P4JITY6MbCedTrO6MIdUFU8vW0+iZrMZtVpdD0X5fD6s3ibRyK2h0YLBIG01enK5XK73UraeELY6KqlUilwux6uvvsrCwgL+NYGSk/MbNchviXy+iEavw26xMjo6CoBeqyOwsVlnR77rvvtYnZxksH+AZDxRl+c4bHYSsTilQhGz0VRvBycSCQEeViqJRCLo9Xp6e3tFBH8zzL5rryXj32BmZganRwB0WyqVeu/ljd7eFNXpcqVS/yLbqgdvfdePx+PMzMzUdVmRSISzZ8/y9ne9i7W1NeDfnARbp6rP1wpaLeuzszQ3NfH666/T4PaIZF02h9lsxmwyUSmX6/h0tVpNKpViYWGB5uZm2traCIVCjI+PE4lEOMZxGhoaUOsNNDa1MDYxSWNLC7lsgfe+/wO8/vrrnD1/ERRKLo6PYbXaKRbLvO3229i7Zz9f/eo3+PUzTzM0uI2rrrma7z70jzz44IM8+cyv+OE//xij0VhnRsw+9xs0Gg07d+7ku9/9HkajmrGxaX75y1+Sz5W47fbrMZtsPPjQl4lEIhw6dIhz5y7gcDjo6OjgyJEjXH31FSgU8PDDP8Jqh9WVKJ/7/KcpFot8/ON/zqVLl7juumuIR2OcPXueufklrrvmamZmZti9Zz9qlZL5+XkCoSB9gwOUymWKlTI2p3ikTyeStLa3MTU9Tb6QFTZwrSAm+RobSKfTxKNh5EoJs15sJkr5DAspoZbX1OAqWw6N6cX5einsxRdfRK/Xc+XVV3Hx4kWy2SzJZJJCuVQbGorgWTwbr1foY7EYDoeDdI3p2dTUQLFYZHp6WhC3iiUy5RThYBiFQklXTy+FkqB2W+3iADBaLbS0+mhqaqK5uVmshC0WgPpBoJAExk2v0aOUxIDaYrEgyaIjc6J6oo7rr1Qq9HZ2EQyJYXlXVxc6nYELFy4I7J7VTKFQYGpqiuuuu45qtcry+DhtbW2g1da3Zs3NzVQqFZ599lm6u7uJRaIMDw8zMTHByMgIbW1tbGxsoNVq61SxM2fOUC5XGX9VzBMsFgvlQh5JqaBcKqCvpVHf6O1NcShUKpU63n0rv77FSBgfH+fw4cN1U07H9u0olUqOPf88hw8fZmlJAEWy2Wz97lguFIgHAmjUalAq6evuEad2pUq2mqFaM0pVKhXC4Si9O3czf/EixWIZk8lCMBimWCxTLlex28WwzeNyc+zEcW66+VYkpYKXT5wgkytQqlT51a+eRq3VMjA0TDKVB1nBtm3ba2m647z4wstsbgbZvXsvd999N2fOnOHa668jnRakH1sNfhoKhejq6qK1vY3vfe97tLf7WFsJ8NhjL+FwOHjPe97LysoKf/npL3Lu3DkSiURt1hLGZLRw2aHL+cAH3g9AoVBmcXGeD3/4vZx6bYy2dh9/9ucfE/mBZA6zxcTb3/4OEjHhJxwbG2N6do6DBw7Q1dXFc889h1ZvQK3WEgyEMZpN+AObdHZ2UypVKOdLKJVq0ukspUIKs8eDz9fMzPS08D94G1hfX0enUbOxsU4ikWCor78e5dWV9RQKBVKZNDqjAZfXg8Yg2rAdHR1IksTMzAzlchmHyynCT2shGhsbMZnFi8llddW6JBEcDjs+n49QOMDs7CyFQq4uUw2Hw5QLQtW+ZVvSaDRoDKLd6utoF41MrVjFejweEaWXJORyGUmphN+3bysUSFK1fgXd0hFUq1U+8IEPkEgkCGyIJ5h4eAH/2po4vLIZgoEQzc0+UqkU115zFeFgiBuuP4rb62FtbY3z58+zubmJ0Whk92WXgUYDpRKRtTX27dvHnssv5/RLLxOPC7jwyy+/THNzcz0MFYlE6OzspKenB7vdybFjxyhVylx55ZWs+/209vRgMpv/6JPCm6IluWfXiPzqb57k1KlT9ahnNBpl165dLCws0NTUhFarZW5uTvT1a08RRqORWC2tFQqFaubiKoVyCU9bG+tzcwT8GwwNDREJhdFqtWjUYiIbj9QKMLEQPp8Pd3MzawsL+P1+RkdH68OuQCBAd3c3kWgUi8XGiZOvksllsTk8PPGrX2Oz2YkmhX69UqnQ0TXAvffeyze+8Q3m5xa47LLLBW16zc8Pf/hDqhUE0ceorQ/atFote/fu5TOf+QzpdJrR0VGq1Sq33347agx88pOf5KWXXqoTmFwuF9lsloMHDzI8PMw997yfY8dOcuTIIUwmuPnmd5PNpWlo8PD1f/h79u7djVIpknSlUontw3v51re+RSIR5/4PfYj29laGBgaRZCEVKZeLtDQ1UyoXMZnNJLJprA475UqFzs5Onn/uOUrZPJViiUq5zMriFLt37yafzTE0NMSZU2KurFap6OnpgaroQ5j0Joy1QZvJYiYcjZDMZti+c4RILEq8JsBxWFy1erma9fV1imWxEZIVohGr1mgYHh4mGhCOx5aWFpxOBxMTE2xsrnPVVVexsrJEMBjE6xWOUjmVw+awMzyyA6PVglKtYtuuEZpbfbS1tyMpha9SVRHf8aXaAZCIx+tagK0fk6tVUAKysEsrlUqiYUHCDm0KBUF7a7vI2BRiGPR6UEAmEUOlULK2skiDx0s+lyIeDZNKpejq6cNkMvHYY4/VQ3xbw3CNRrR2t3ypTU1N9PX11ZH/drvIvGi12to8q0BPTw9TExNIksT+gweZnJxElsDb2EAqleJt77mPsck3ZjS+KQ6FncPb5F898kNKpRKxWAyfz0cul6tLStqHhyGdJlN7vFQqlYTDIqq51UEfHBwknRYd/S3+viRJGAwG0skUmXSazs5OpsYnkGW57jpApax7FmKxGIGaper48ePkcjmuuOIKVlZWCETDnDp9mmyhwI7tO0llCzz9m+dIZbK4PA0olGo+85nP8MF7Psjhw4fp7+/n6NGjPPDAn9XTaHa7nUKhJO7oOjVHjhzh6NGj7Nu3jy984Qvcdttt3HjjjTz00EN897vfpVqtsji/htPurPseUqkUX/rSl+pPT8WiQKa95YYbicfjuNwOvF4vX//6V3nggY8xOSX28qWSCLjc8JajHDp0NZ///Ocp1zwM/T3dHL3+Wl577TX8/nUcVgFhOXv2HAq1imK1wuHDh5menWF4eJiVpWVmp6dRIFHI5qiWxaowEYthMBhYXlwS8JSmZtrb2wXMVaHAbLJSqogikcFsIhqLodaJVKnBaCQUFfh5p8nJ4qKgcptMJpLpFLGYIG23tbWRroV6bEYbR44c4eTJk8zOzqDX67HZLfh8Prxed+06JkJug109eBsaKMtVegf6MdusmOxWtDodRpOJKlCWK2iqyn/39bkVJvr9N1khgywOWlmWKeSK6PRa4uEE1WqVkydOMjs7y8rSNGaTidbWFrq7OtGqlMQjATQqFQ6rEblSpqOjg2Q6w+rqKmazmebmZiYnJwXgt/Ya2Ll3L5fGxzl16hQ7du5kfHycVCrF7t27iUQEx2JgYICJiQlMJhMNDQ3kMhmsVqswmtVKZemsAPTe8p77/mD34U1xKAwP9suPPfSduhvP7XZjcbsZP3uW1tZWDAYDS0tLdfHs1lDHbDaTzWaJRCJ4vd76tiAQCLBj926Cfj8rS8sMDw+zWlvzlGsK7q2o6QvHX+HChQsMDg7S39+P1+vla1/7GiMjI8zOztbbehaXKJ8sr/pZXfcTjSVJZPL09g+i0ep517vezUc/9nGGt4m25LFjxygWy/X1nUKhECWkmrXqnnvu4R3vuJNPfeov2LZtG5dffjlf+tKXeOqpp2qk3rSAw3rayGazVKtVvvrVr+LxeIQ3sLGR48eP09rayr333ksul8Ng0PHOd76T02dRrwAAIABJREFU3bt386lPfVIIaipFiuU8bqebf/mXRxkZGWFo2wg2mw2dXkOjt4Fqtcx/+/M/4+Mfe4Dh7UOMjY0xMrydUrFKWa6iMegZ2bWTXEE81Zx+7RTVYon52TnymSzd3S31hGg4GEKJWOX29/XV5zQKGbQGPRaLBVPtz83ucqLWCpKRy+1mYmJCxHfDgiBldzrIZrOYLKKPcm70gliFqlTs3LmTQrrA5qbQujc1icSrTq8hFovR39/L8PAwPl+zQOS7G7Db7YQjETp6u3G4nEhKpeBkKhSUZZHC1KnU/7EvWklGrv7bgVHMC0DQ0rzI1hTzRTEvUcusryyTy2aRqyVcdhtKypgMBqwmHRsrKyiUEp6mFiqVCouLi2i1Wg4dOkS5XGZuTrAVm5qaOHv2LNlsFptDJFFNJhOvvPIKXV1ddHV1ibax34/D4SCXy1HMCrdGe2cH6XSaXLFAT2+viGPf+A4mLs2+eQ+FkW1D8hM/eaju0lOpVHWTtNVqJRKJEIvF6O7uFrtmpRK5NocAMJpMIEkk40KsoVaq6pkHo8lEMh5HIQvhjMkgpulOp5PG/n7W52ZpHhjg5Sef5MKFCzidTqampkROXZLqwhSN1cjC4hIXLo4JeQxq2jt7afG1cfbcKGazldvuuJNXXvwtL774IuVyGZ/Px2wtaWYyiTTkI488wvve9z46fR187nOfIxKJ8Mwzz/DYY4+RSqUoFgW0dSu66vI0MTIywr333suOHX1ks1Uefvhhent7ueuuu0imk3S0ddDU7GHv3r389Kc/xePxMDExhdVqpbGxkW9/+9sMDQ2xtLjCgYMH0BjE/1c8GuMzn/0r7nrnf+HmG9+CUqnEZjHX+QT5rEQ6m6Grt4emlmYSySQHDhxgYnycYr6A2WDk4oVRwnE/VrOlvi9vaRStvL6eXlEuk2WWl5eRFaIJGAgE6ko4jVot6NZKZb04ZdRZCAaDNPuELlCj03Ly5Ekcblc9J7B//35avC01jPocwWCAXbt24d9YI51OA1UOHDjA5ZdfRrlcxltTD2r1ekCAgLV6MWz7Ywo1gDd8jUgy1YpcLzhVSlVUKiW5tAhyqRQqdCYtVCGVTJDPpKmW8lCtoKiWcLsdhNZXWF9ZJp1KsvfgZYyNjdWLcVtrdmEgF3j/8fFxdDod/duGGB0dRafTceDAAU6dOsWVR48SDwRYXFxEVzN0d7W1UiyKVa1Gp6V3aIhMjZtxxa3vYnzqjSErb4pBo1KppK23FxQKqFYppdMsLCzQ0NDAysoKvcPDNNW4gVuhGdELT2O1WonHYthq24lqtYpKocRitbKyvCx4jx4P46dOiz1uVVwdLEYTVGWCwSAzMzMYjUY6OzvZtm0ba2tr+Hw+nnvuOWZnZ4W/UVklFBRXFqvdyfzCMn9+x51897vfw2y2c811R/nrv/5rPA475VIVp8vJzMxMnQd5zz33cPXVV3PXXXfxiU98gpuuv4H77rsPt9vNE088QSgaoq+7j3w+j81mY319HbfLwV/85adwuVw0NHo4dNmVpFIpvvjFL/Kpv/gESFV6uruIRqP0mtv40H338NRTTzAxMcaRI1cyNjZGX18fvpY2vvTFv+OXv/xXPG4vyVyQSCREY0MD73znnbz//e8lk8+QSSZYWSnR1NTE2voyrc1CLx8IBUEpvpvmS0Vi8Tg3XHc9P//pI2I+k0yjUGko5cV1JFcs0dfXSSgSZXF5hTZfK+v+Tfq29xFJxomlk+zZtZszZ85g1ImBoyzLNHi8ddN0pVJBo9Hw6quv4mkQq9GttKmyWq1fnarVKkajkf7+frGhSidwu910dLTVvZMNDQ0oNKKxCSIsp9b+WxKWqizEk/DHeKb/7m3rsNhC0JfLFfQmcdAE1oKcPTuH0WwkFg2TiMYwaFXYrSZKuTSlfAtz01NYjQaam5vrsuHBgwehVGKt1hbecnwqFAqam5upVqusrq5y7bXXilxEOo3FYiG0tla7nooBusfjIRIMkc5lBcpPq2NydBSzTTBB3+hKtPX2pnhSGOzrkV999qn6TGHru7zZbK7LSrxer7iLq9XMzc3h9XpxOp1sbGzUWHnaOoptaWFRhDyAttZWMpkM2VSafDbHiy++iNvtJrgh4tQFhSDWHDhwgJ///Od0dXVx5swZbr75Zp544ol6N/9fnnmSYqGEzmBGUqp5xzvfxYuvvEpjczPzC2K6nkilUEvy733Cq9xxxx3cdNNN/Ovjv2Dnzp089dRTJBJxtGWJ+fn5euhqfn6+vrZqaWnh/vvvZ2xsjLfedhsf/ehHOX36NB/+8IeRZZlvfvObQkOfTmMymfjTP/1Tvvb1L1EuV2uQkxJXXnEV119/AydOnKSjvZvHH3+cVEqIZdXGAnq9ngce+Chf/MKD6A1a5EqVfD5HS1MTKyviqqbGQaFURG3QsXffPhRqIb159JGfUS4UaW5opJgvoDLWAkS1EE0sHOHw4cMENwOsrq7icbq4/vrrefhnD9Pe3o7ZZEKn1jA3N0dXaztrq6tYTGYqxZI4sG0umpqamLw0xcbGBulsje8gCzmqRqvlwIEDBNeDddQ+yKJUZtDS1taGSiVKb11dHWQyGVQ174dGqaBaFcNClUowJ4D63+U3eGiQ+fevEQmZSllkFVQqFVtggGJOzHgKOaERdHncnDt3llg0TGuTl2qxQDoeZuf2YU6dfIW25kZ8HZ3k8+IqpFAoaG1vZ/ziRex2O8ViUXwcl4tCQajv9GaRyNxzzTW8/MQTdQXhoUOHCIfDzM3NiVxFNo3P5yOWFHMOnV5PJB4jk8nw3/72a0zNLrx5nxTUKhVWtx3KZZQK8YneiqQaDW7W19eJaxTo1Soq+TzDu7cTWF5iauI8rW1tqJQVMtkYhXJJiFKMWsqVPNlslmBYzcKCqN6ura2htWgpUKC1X3gmZs6PIVdlLpw+hcfhoFjI097ZwWtnXicny2DQ88KrJ1n0pxgaHCKdTjOyfYSfPfpL3vKWt1CtVvn1k49jMBhqeQkHxWKRoaEhuru7aW/18eMfPMzll1/OU48/zuTkJH19feiMRoorC4wtzNDS0oLDJ+K6R2+/hcOHD7OwuMjIZfu54S3Xsb6+zu7du9FolXznO99BpZYoFLMYTTqMJh3FUo5UUjy2Op1OTEYVd999NwMDA3zjG19neXmeldVZNBoNOr2MUqFDhYY9I/toavCxvLyI2WJEpzMSicUxmm2kMnmqlU3xCFvJsrYySyKRoKenh5tvvJbp6WmxG9drqeaL2J1OUuUqgTVxp3U7XSzMzYv1n17Hq6dPQapMfDWMrd2EUWtAj45KQaZaklheWhdtvkKF9cU5xmYv0d7ejslho6pSsL6+jkYjjOJKpZLR0VG8nham5xd45XcnMZlMHD58GI/Hg7uhikVrQlKpkRU6NHotUqFUK76JxQEKBXKhgqQWg8VKoYRSq6ZcydevBJIkISEhvwGlSCEXxKGCAuQKkqQAWYFapUCjUhPLxgiHovz8pz/A5XKglBSU0zFUSolsKsny0gLXXH0Vr544TkNrG3Pnx4QCripz/DfPoTMZBb2pv4/l5SWC8SgoJJq72okFQvR2d7N68SKRUIhGr5dwMEg+m8VsNKJVq2lqaiIe8DMxdhGz2YpOb2B6aZY73v4Ojv3uJPl88Q++Ht8UTwo7tw/JLz/xUyKRCD6fT2TodTqKSVF2qdSYfm6bg2AgQDQeEzxGnQBXSgoFSrudc8deoaOjg6WF1TrrsaOjgxdeeKEuJd2KiwqZho7oRpjZeQEynZyZIZPLEk9nyORyBMMRylXxKFtRCDvzfffdx2c/+1luuukmTp06xeLioujGr66KarXayDve8Q48Hg/r66usrq4yOioKU1qdhqamJo4fP47RZK5bnrq7u/F4PHz84x+nvb2dr3zlKzz99NNCH5dJc9ttt3H8+HFSqVQdOGuz2bj//vuZmZnhoYcewu3yEI1Gueeee9ixYwdf/OIXWVha4B+/9Y98+tOfZmRkhM3NTUKhEKVykeuvv55nn32m1krdRKXewqmJb3myLFOtiG+bRqORkZERxsfH62Ehi8WCLMtsbGygVxno7+8Xa0SVqv443NHRgd/vp6enRxzs4UDdSCWiyKl6IaqhoYFcTqDp1CY9qVSq/vmRJIl0Oo1SqcRoNNar1NFIql6DL9UMUVv8BrPZjE6no6enB5vNxkc+/OH6VU6tViOpJfF0UAEkKBWFvVxnE1eMraeDP/T6UFIEqbapqEhi6KjSMH5hguXlFeIxgVXbt2uAFl8zi3PzTI6P4XE7KeayBAMb7N2zm7npS+TyGdwGAarxNjUiyzIdO7YzNzmORqejdXgb5USchaUlrFYrSzMLFAoFBgcHWV5eJp/P43K56OzsFFdrq5Uf/a/23jzIsqu+8/yce+/bX77cMysrMytr36WSCslaLANCGgQE3XgdHGaM3XaE23aPu3GEY5qxewyN7Qg3Ed0d3e6ecXTbPWDCDNCAw6ZZbGBAMmAESCWVVPuWyqzc98y3v3vvmT/O/d133q0sgQ2SKoY8ES/ee/fdd8/+O7/f97f9p//EkYkxFhYWGBndjcKh3vLJF7roHRjk7f/LL3H+8h0MNN519LD+9J/+R1ZWVjh+3PiIK6UYO3iQ5uZmZLaq2Vrd5K57TvHCCy+YHAUpj81ymZmZGY4eP8bFixd54xvfyNe/8S1u3LjB4KBRS83Pz8fBWc6dO8ejjz7KF77wBeM16cPi0hKtULNVLtMMQlZWV6k1GqxvbZLJ5slms5y+70G01qytrXHy5Ek+85nP0Gwag5h0Ok1PTw9Hjx7lp3/qnVy/fp0/+7M/w3Vd5uZnOX78OFtbW4yPm0zB3d3dtHyfVCrFoUOHeN/73seZM2d4z3veQ29vL4tLi/T1mqzO//J/+y3+5E/+hFqtRhAETE1P8VM/+VM8/vjj/O7v/i71ej0y3qqbfIiR3FypVDh9+jRf+vKXGB4aZmFxgULe4CbvfOc7efTRR/nRRx4CYHT3CC2/cQtRCHyTpSkVRa7u6enB933uv/9+nnrqqTglX6vW5OTJk1y6ZOz9x8bGuHLlCvv378dxnDj9W0+P8SqcmZmJcaF8Ps/CwkKcvaurqwvHceLwdmEYkslk4vgaAkg2Gg2KhZ742UCcV1PkasEcuru7OX78BKdPn+bnfu7nmJiYwHHNRg7DMM68VSjkwQxfHG9SzJqTpVrZiPJWpHCUBzh4KZepyfkoJGCBeq1JMd3g/PkXWV5colGrkk653H3iOFub60zeuE4xlyXUPrv7hzh16hTPnX2edC5LrpAnnTfOUhuVMlNTU2ZzK0VPrseEp/M8Tpw4QSaT4fLly/FYiTv96IAh3Ckvzcr6GoODw2yVqxQKBX7uPf+S7zzz7LZE4Y4I3Koche+3aDYbrK6uEAQ+jqPYWlqkXq9RKnXhOIqRkVHOnT2HDhUD/UP4jYBCtkA+X+Qv/+Kv6O3tZ2lphXqrSbG7xOLKMi9eOG9Ch1UrVOo1evr7+NrffYNyrcr80iIzC4uU6w3wUmxWayyvrOLjUOjqZnjXbrRyabQCnChn4dGjR/nSl74Ugzz1ej1K2WXwg7/54l9z8dIF5uZnqVTLZLNZLl68GLtw57J5FheWaDQanDp1il/6pV9ibm6OD33oQxw5coRMJsPEngkGBwd55JFH+OhHPxprWaamp3jowYc4ceIEH/zgB1laXmLfvn3ML8zH/huiwRBvusOHDpPJZBjdPcqBAweoVCo8/vjjvOMd7+DQwUMcPnQ4NsuVDSABV3VkxSfBUzKZDFtbW5GDj2ZycjLekELIa7VanPZ8ZWWFRqMRv5erFfwwwE151Bp1tiplLl+9wvDILrp7e6g3G1RqVRqNRpwDpNVqdXze3NykWjWJVcvlchwXQ/JY1Ot1/IjgSn6IfD7P4sIy169Ncu3qDbY2K7QaIa1mgOs6dPUUKZTyoEEH5kWoIFQo7Wz7SmdyeKkcyvEINLT8kNXVLdY21ilXajz3/At86i8+zUc/+lEcx4ltb8SDVMy1xadiaX2VqbkZZhfmGZ/YA1F4wOXVFQYHB3nzW56gWCzSPzRIo9Vi99gYuUKBQGvWNzc5ePgwZ198kb97+mkeeOghxvbsYXNji77eftK5LMeOneDg4cM4jsOXv/xlVpcWb78f7wRO4ejBffrD//b3qdeNJ9vwsIlJFwRBrF5ZXV2lv2+EY8eO8eyzz1JrGNnP1yHz8/MsLC5y6NAhY1dQq/PlL3/Z6OKzWRqNBrt27TIGMZHzi0mbXmFpvcxGeYt8rshWpUyh0EW92cT3QxzPZWSXCTSyubbKL/7iL/L+97/foPM3b8a+/Y899hgPPPAAH//4x5mcvB5bWwaBjizTvDjVm+t47Nmzh5/4yX/M0NAQv/EbvxFHrF5bWyMMo2Apb3kLH/7wh6nVKvGGP3DgAG9961v5vd/7PaMGi6zpzIlInDoP4P777+fChQsEQcDY2Bg3b97k9a9/PW94wxv47d/+V4yMjABhZDOfAhVGxICYKLhOJs5+LVmqisUiWmvy+byJh+g49HaZEymXy5mISFFcRhEz5PTuHugBoFarmfD7kc9KPcpgnc0ar8N0qKhWq+RyuZgASDtE/DCZo7Kx6hoMDiUBcyRNgOcZ2KzeUHGwnYmJCXp6ejh27JjBiO65h1OnTjE2NkYmb+wUjEYhWqDbnKctHeAog1FobV6OAyvLZZRSTE/PcPnyZX7irT/GZz/7GVzlcO3KZfp6uylkM7gOsfiwVd7gH/3ETzAV5TzJFfLgGF+L4w88QH1t1cSmdBwmJiZ44dlz9PT0EARBbLczPT1tco/2GnPvmZkZmlvrDAwMMDMzw7333su1a9e4ev0aPT09/Nrv/D4Xr24PNN4ReR/+w7//d+//sfvvIZfPkUqncVyHow8/xFB3idm5OYaGh6hUK1y/NsXK6ipLS8tsrG8wOz/PtavXqDcarK6uMTn1EjOzs7iZLN09PdyYnKTl+3SVSpx57jmqtRrlSoXllRXWovBaTQ0aBz/wCXFo+T6VWh0NFPJdFLqKHDlyhK5igbNnz7K0tGQ2Qm8vlUqFvXv38va3v50zZ87wzDPP0GhWcV2H9fUNPM8lk8mSTqdYXzfq1Hy+wK//+q8zPDzI+973vlj8kDDmo6OjbG1tce3aNQA2NtbZ2tpCa82pU6f42Mc+ZvTgkZ+I60bRjhpNBgYGaDabeJ5HX19fHA5NApo8+uijfOQjH8GJIiTV65HrcGhOTHsjhGGI75tNJUFthWuQ084QvoCg1YojW0lMA/EHkOK6Ls2gs69yYoZhGNuneJ6HCgyBAWLuRUx4RewwDkqGe5DNrpSJvqyj8PFyCgdBgMaLr4l78dTUlDHyaTaZn58nCAK6S10UigVDB1wM5gCEfkgYhDiRxsL1HFqtgCAIUcohlYK1tQq5XJae7izNZsDo6G6+/uSXeN3rTrOxvk46lSKTSdPd1cX6+hrra2scP3aUo0ePMD1zk2qtZszKNza4+5FHuHj2LDnPIwxMAtxszjiczd2c5+TJkzQajViVubq6yvr6OhMTE8zOzlKpVAhbPpcuXWbP3j3U6nVQirSXIgxC/uqLX+E3/sV7ts37cEdwCof2Tej/8IH/g7U1oy4ZHx/H900E35mZmdiI6dBBA6ycP3+ebD6H7/u8dNOwsrUoNPZmpcz6lrEG3NraIpVKmdRk9TqAtaAMotxUxiFL62g3aAfHcwlDc/1/evwJKpUK58+9QCplNBmpCN39mZ/5GR555BF+8zd/M4770N0j/gxZstk8zYbP0tIK/f2DDA0O8973vpd//s/fg6MaJsdDJhMnys3n8+zatYsnnniCP/zDPzTJa11i24Xe3l4TkSgKcCqyrtaadCpLq9WKDa6azSazs7MMDQ1RKBSYnp6mp6cnUnGl0Frjuio6XVWMKQRBq20nkMrfUo9sUtn0QRDgYa41m8047L4k85F7lVLgGKMosUsQmT+fz8cnfiqVopDKxM/IZrMRgfLjBD7Sfwk7Jmy4EJdUKhV/F44hoG2oJNyEhGsrFArkcjmGh4fp7e5icHAwzuexvr6O53kcOXKEo0ePGq1RrcbkzRlGR0fZ2NhgaWmJQ4cOMzs7G4OZ3/jGNxgZGeGFZ7/J3NwMzXqDsd0jnLr7JI1qBXTA4sI8B/ZOsLm1TkuHvBAlI0qlUlQqFU6cOMHVq1d5+OGHcV2Xja1Nw51Wm3GC4XK5zN69e5mZmWFsbMwYj+3bx/z0NMvLqya58u4RxsfHOX/hRRq1OvV6nV/97Q9weXLqzlVJeqk0M7MLbGxsGLvvC5d57LHHWFlZYXnFsErnL1ymt2+YVD5LV59Z3OvlLWZmZ8kVCzSbTVa3TKSdgcHh+DQNw5CVlZWOvIn2QvX9FmEUhUYpF6VCquU6nueZRJ1+k0bdmFKPjo7S3d0dE62JiQn+4A/+gNnZWUZGoph9YYtQ++RyWZQyrPL997+ORiPg/vt+hOvXJ82G9Nw463OjYQjE4uIijz/+OJ/97Gdj+V07Jp3b8ePH+drXvkatVouRf9l4gsBLuLJCoRBbRi4tLZFKpbjvvvt49lkTZzKVSkeoehgRgvYG1rqd1AXa6Lv8LsRUCBBATE+j/9mxBuwS+D6B7xMGBqNBaxQQBgE6DHGUwon+I4ZFdv1A7JIMhvuw67VDqAsgKQROR/eF2kdHa6C+WaVaK7NV3sDzPNbWV8hLkF8dxv4wjuNwc+olXjz7fOxWXWn4fOC//msOHTrEE088wX//+MfjEHTVapWVpSU2o2Qvb3/723n6775JJp3iK1/5Cp6Ce07dxbFjx2hUK2xubpLOZnnogQdjn5xr166xOL/AgX37mZm+ie/7nLjvPr715JO0Gia35H333cfNm00KuQyFXIbF+VnK5TKXLpzj0KFDPPfcc2SzWUZGRoz7uOdR8X3C0N/W9kLKHcEp7B4e1r/+C+9mbm4ujg9w8+ZNXNdlbW3NeNUVi/jaoKtb5XJ8WszOz9EKTVLQ3n5j800YmbFGSHy9Xo9ZR8MVtPscOBF/GPnDO9o4UVWrdfbu3ctgv/FO26qZsGFyqv38z/88X/3qV3n++edjp5ONjQ2y+YBUKkV//yBbmxWCAJoNnz//84/zT3/lV1ldNQlkerrScYYlMJtMIhdPTU2ZtgUBw2NDrK+v8+CDD/LUU0+ZoKqVSrzg5fR0nUwcU6C7u5vFxcX4NM/lcjz88MN88pOfjMQKw947DhH77uMHzRhTALOBXCcTt0+Ij8jp9Xo9FiPSro5xBKWUCSRrcTNCgOtbBniV8HtioRhEREIs7aQOyTbleV78fOmzhO0T7YbRHhQ6rAztwCgtdMxxxFxiJGqJmlNrTVobsUwIS29vL7VazfyWThvT7HSarmIvx48fp7+/nxfPnaVcLjMxMcHGxhqZTIaXXnrJxNE8cZwXXniee0/dQ7NeY3lpgT2ju6nXKjQbdQ7t30c6Y8Sm/v5+5ufn2djYYGBggAP79tNoNFhaWmJjY4OJMeNyfeK+u6mtrXHmzJlYVLx69Srj4+MMDAwwPD5OZW2N+bU6169fp1Y1gW0X52bJZT3Srsc//Vd/wMXrk3cup9BstvjC33zZBOJotbj4oY/Q3d1NNps1UYIzedY3Kyyvm5iIxWKRUJmNX65UTJCLVIqVNeN81KobGVfTihaqY+iiAjdKJNKOoiOsLhBqtHJxHYcwaLF3zwSf/x+fNQFQcDhw4ACvf/3rOXbsGB/4wAdwXZf+/v4Y6DLtrZGLMj9ls1nuuuseBgeGede73kWr6RNGZtZdXXnW19cBYpCuWMwzNzeH5zl0d3ezubnJ4uIiJ06c4Itf/KJJKhNly4L26Wk2VUA645FKu5S6i1SqW2xtbTGxe5xcLsf6xirZXJpyZZNctjs6QSXpbhonEG6grYrT4a16ekkNL2HQtNY4KojtSdLpdAwYJksmnQatjTWh6+JEbH+xUIj9HlKpFJ7r4kd2JV0RsCligGAbAKnIalGHPkppPNfgDHKvjJFSKuIUQsIwsH4zr2w2E4c18+tNmk0nJjq1WiXmTMTEvl6vMzwwwuWL5yPQs86+ffv4ypXLZLIpBgcH6e3uJuUq5ufneeihh1iYm2d5cYGuoknT99LGGsePH2dzbRWNcY2em5vjwL79XLhwgdGR3Xzz69/g4MGDpJXLxO4x/GaLVqNJdWmRfHc3lU1DPDZWVziwd8J4BocBzz/7DEeOHKHsm6hSTpQdanBwkEzaoV6pbjs/Uu4IouCHAU7OoxyBYlpr6uvNmJIPDg7S8lsEWpHO5qk3I+rfCkh7GerVRgebmc5l0UArNFxBq9nqOLmUUngZA4LppkuoQ3TY1kcX8l0sLRpVULG7ZAyn+ntYX17g8P4J/vJTn0AFTRQuuZRDLpWDoEnGhWbNpe77pLQxdx3q7eebX/8aYbNCIZulUqlSKpTY2NiI2XyJc3D69Gk+8YlPxHb+XV1dpIIWBw8e5urV66yurpNOZ2NzZumvUq7BFLwAR3lsbpQJAygWSszOzPP444/z13/91+hQkcsWCHUdTYgmwA80RAShkwAoUCFi/6uBlu+DCmn5DbyUF528LULHIZvNknIcMl7KENxQGZBSG5bfcz3qnnlOKp+mHmiUckhn0tSkP26Kplb4UVq3XC5HEBGewHUIFeA6aMeJNqqi1miaZLnpNIHrgQuOcgharXgTe56HqrVwMYdDIzQqTpSHH8DqZjnmqJopzVa1bPCMlAnQ2opsHlSoSSmHQqmbpU0Tv8PFJVABV6evU6/XmZiYoNJqEFZMyjt3rcm18y9RLm9y6MABSqUiy4trdBV7mXppmt6+HjK5Ll6aX8Xz8jx36TpaeaxVG2S6e1nc2qRZb1BsGW1brVXH1yFnnztj3NoDPzaBHpvYY5LcDA2uyxfKAAAgAElEQVTy0s1p8j27efwtT3DxhRfitAZHTpxkYWEBN3V7b9A7gig0GiY+nVBwUTlpranX63HshGqlHlsmyiaXU0NYyzAM8UMDPsk9AjzZcrIQANeSXYVgbGyYoJ8LCwu0osUVhiFvfvOb+eAHP2gs36IAKcJmSltyuRzZbJY3vOENHDhwgD/6oz8CDBehlIpjHnqeF+e+FIRfvOTEIGlra4sDRw/z4osvGlVdFN0HOuV1GScg8hA09VUqFXbv3s3MzAx9fX0sLCwYTio2VGr3eTsx0gYVY7DQ+s3+T8zah4ZlL+ZNCHyCMLYzEA7Ctn8QEcR+yXjIaR3jAtHv8pvMr9QtBFY4Ba11HINRxAMBI7U2iWmUUgSRAdPm5iaFQiEm1s26sbFIe2b9pBw37qvv+ywuLppwblbQ4GvXrpFOpzl27BiDg4MM9g6ahDTFIi+eP8/wYD9+0KCn1MXwrn5WVlYol8tcjixje0oljh07ydnnnqdS3uT06dPs3mVyWoyPmzDwjgqpNpoMDO9iZWWF7lBz8MhR0t3daMcQwWq1yo2pJa5euBCHIxDPSgPGpm+Zbyl3BFEIw7bsZ5+AMnmysVvNILq/vTHshSnsrHinCKuZXMzJuu0NIhtMXFilHfv27TP5GjY3KRaLrK2txWowqSOWnSODpk9/+tMxqx2GIeUICxGATNojsr9gCQIS+r5PsVjkxo0b8f02VmKPgZyIEurbRDg2BG1qaipmzz3P68g4nAT07GJzVjYBkbHd7lqowg5RwIHYtDiIuA5bvWnXL5hEOp2J65d6tgM/bXwoSeTk/1IEu7B/b0ZgqXba4KZoRLTWOBjbh9CP8AuP2ChqaHggHuv19XUmJyfjvCKe53H9+nUTsMe7Rv+AccYqFQvMLS7gEJD2XC5dWiWT8hjeNUQxn8NzFDenptja2CCVdkmlXLq7CmQKObq7imysrbPcarGytgLKZWp6xlj2emm8VAZw6O7pM2Clu85DDx3k4sWLccaooaGhGGfxv5+8D69O2R6xloUiiT4zUYx83/djsE02o5wIWmt0ZKgZBEGssrJ95u2F5AS3mrIGQRAbJklYrOHhYZ555hl6e3tjz01ZlLb6LZvN8sQTT/C5z32OUqkUJ7np7e2Nre7ErFZOONE+aK3jDS+nnsiwUp+t+7c3lNgGAHEmrK6uLhYXF2NNQSqVMgFAWu0+C5cjHJhdxPBHNlwQBDGBS2pxRN4PIyOoeNwtWqOdNtch9fq+H3MD0idJwSdWjBJTMamJEKDR1kKACfqb/E3G255rWUutVlvd2Wg0TFSnnh5SjrHk7O4qGS/cZot6vW5iT+bSMafjeZ7JKVIqxWMqnEMtrFEup+ju7mJ2foaRXbuYm5tjfHyUk3cd52//9knG9ozz+GOP4jgOA339PPnkV1hbKnPvvadYWVpkY2WJs2fP0tVVMNzEwC6CIGBpbYtS3xDleoONSoNuL8vaVo3hfIlizwCVrUqcL+XEiROsrq6STpvM3TbIfcu83/aXqCilssBTGKtwD/ik1vp9Sql9wMeAPuBZ4Oe11k2lVAaTuv51wArwTq315HepJV5o9mIVQiFsc6VSiVRqqVh/bS/O2FxX6Vs2a7wwE6eOfRq21ZR+h85bIgwrZaIIix2ArR+XjTE7O8ulS5eiVPTlmJXb2NiIg8f09vbGC8dxHGq1Gr7vMzY2FoeDE8KzsLAQ+xiIBaA4DtknNCqK/Rjl4mw2m/T09LCwsMDx48e5efNmrLd33LbdgT1+yWL/ZosQNisv4LCw9C7SJnNPjCl4HvVWMzZCstWXQhRsQmGtvw4RQ4rYMMhvIooJIRAOTBLU6FabSwl1GM+d53m4TtuuQdbf+vo6LioO/ZfJZMilM/E4ifgiRB4wwUzSaZRSMeFPqSqV6gY35zTDA4PUGlXS2SyXrpisZc2W5vLlq/gtQ/iXeky+0p/8xXeztrAISvP8s2c4dOgAExMTzM/OMbb/GOvr6+QLy5S6+0zWq/PnqdaarK1vMTo2QTafwnNSXLlivGOfffZZ7r7bJM5dXFyMwfHtyvfi+9AA3qS1PoVJ/vIWpdSDwL/BpKI/BKwBvxzd/8vAmtb6IPDvo/u+p2Lr3GXhyUKRzWlYnzaAJItVFrjNGcjvwC2EwF7otpUcGJaxVquxtLQUG/8MDQ2ZwK/RCSDou/38IAgYHR2NFwjQYeQjEyF9qFQqcV9KpVIccWltzXiBbkZeooVCIYreVIzVffKSkzAMwyj5SRAv7q0tk0nJ932GhoZib0J7fOS0k5dtByD3ybiK3C4ETbgGUQvKeAuHIUTVcRyq1WqH/C/Ps+uTefQ8L+6LtEEMlaRddjYxW80o4xtzLtbzkyKGTeSEY5E+2GKTEBZps3CE4v8iHFilUomfJZaS1XolVr1WG1UWFhaYm5ujVqtRrVZZX1+nUCyxvLrCPafvRWtjlPXStRs0Wk1aTZ++wQE2Nrb47Gc/y/rmBpcvX6ZSqXDy5Mk4f8nY2BjZbDZWpy4tLjI9Pc3GxgaHjx/n8OHDpAYGIJejp6cH1709P/BdiYI2pRx9TUUvDbwJ+GR0/cPAj0ef3xF9J/r9MWUf1bcpyYmSd3uzJydLTiDbDFcWavL19ylSx+bmZnwiCZGSzSgnmywI2VBa69iDbXFxkVrNZGoulUr09JiEJVKH4ChAbOPf398fs3Zy6ku/t7a2YmIoxEApY9MvYKo8UxamxHoUq1CT3ToXG8nIphGiYHMgNqGU8ZZoQALy2ZydnNACEoszExC3TzZys9mk0WjE/7XnVoiF/bKJoG0SLXUmxU8BA8WTVcQQITxyv31YyG9J7ELepd5UKkW9XieXy8Wqc9/3Y/FBgE3ThiaNVp1ao2rGynXx0ilqjTrXJ6fo6u5lcuomjpvmc5//G144f5Hd43tZXtvi0pUb/N23v8PlK9fJFLo4ec9pxvcdIGj5LM4vQKjp7e7h+tVr9I7voVTsYm5mFrerxEs3JpmZmaFSqfC1r37V5FSZn+dClBpACPd25XtNMOsCzwAHgf8MXAPWtdbC59np5keB6WgwfaXUBtCPyVB9m9IpKyY/C3vuOp2yI9CxCeR/2jLASd7/vRZBsYUrSHIdQHyC2JZzImIIFpDL5W7hUmRDAR1cjqDfrVYr5ggkwU2xWIwXuIhOguprrUmns/F32ViyueRZQgiEfRfia8vZSVDRZt9FBpdxt/MexAQk6ourInFOtTkOza1AoLD5SbxAPtuHQ7xabgGL28Rju/44jkO9Vr8FUE4+65Z2JdpqEz8vlY3rVMpolcRqEIi5Ka1DHEcBGj/0CUKfoV0j9JRKNGp1qlFyorUtE0XLdTyy+QIH9u3jG9/4OvlCN6pLMzl1k/7+XvLFEuNjZqvNztyMCdxLZ583VrjjY3zqQ/83pVKJmZkZJiYm4oxe+bxJuzeyZw+NRv22a/97IgraONnfo5TqAf4COLbdbTK2L/ObPQG/AvwKGLWgzbLa2IL9MhFuOifbnmDbKMVq+y2LKtGS7fqLUirOzRcEAfl8HiA+dRzHia36JOy8cBSCCYiRkbjzysYUMUhOSJnYy5cvs3v3bvr6+pienjYenqEfb+q+vj601lQqlQ48ICnnx9iKtZGNIU4t6nLYOa60CZyMrc25xcZCqVQMAgK3iBxhGOLoNheUSqVic9owDHHTqY5TWcQJmyM0Y+J2qCxlrEEMtZx4fux22mtAvgsRLJVKMffUahlOBkd1EOwkdqGQddceF3lvtZpxoGERB2VuRbwx7t1bccRox3FM5Gjf59KVKwz09dHX14fruswurOLPLDA8PMzHP/VXTEyM09vdxcrKCrt3DTM0Ok61XOaprz/NqSNHGBoaYixKCJwrFFhdNvkjsuk0r7v7bs6dO8fExASP/viPszltgv08++yzMadjz3ey/L3iKWit14GvAg8CPUopISp2uvk4FX30ezewus2z/ovW+j6t9X2yOGwQMAkIyoQncQHppLDwSUJiE46Xe3aibR2ybLVajd24Bdyy2VQboPJ9P85XKGa7chraQJrN2UB7Ea+vr0cnv5HZZaHJYhez3Hw+H7sKC1cgz5F+2aeW7ce/XbFtAaRd0jb5TYhhcnxlzJJsuDzHFhvkZcv9yfndbn5sMSZ5CMgaEAJiE1ohiPJfW2Nlz7fUcTvR026TPMMu4rUqoqJk8EaFKKfNvQmxHBwcNEFx55dYWV1neGQXfQMDtFo+6xubBIFmdX2TrmI3xVI3k5NTOF6a4ydPkstnuHzlIpqA9Y1VLpx/gb6RIUbHRtAE7D11kp5eI65W5+bQWrOwsEAYhpRKJWZnZxF/n+3K95J1ehBoaa3XlVI54G8w4OEvAJ/SWn9MKfXHwFmt9f+plPpnwF1a619VSv0s8JNa6//55epIpzw90FOKvycXlUyArZGQyc9kMh2Lzpar7Qm3F4rNXuptABdb3pL7u3ImqpEEiK1Wqx14h9Qh3IAATXb7pQ9J2wm5J4yMaLTW9PX1GZfYjRr1ej3K65CPQb2krj9bNCo7SZ8np67I0kKQtNYo3Ykl2CKCtM11XZyoX/ZmFflZnpnNZmODKZtQ2GNss9l2n6GNNdicoet1qkq11h0YivRbNAASj0FANgFTZU3YMr5wV0A8b9vhCHZdMh4iRqZSKTzl4Ech3DKZDP29Ji/IoQMHGBgY4MWzLxg8qlhgcnKSbDYbq6gLhULMKebzJsFxV58BmatlI3oW8zkKxRwnjx0nlfLo6+3l6tXLdHd309NtUuFtrK1x7NhRGrU6w0MD1Ot16tVyzE129ZqAxtlslq4uY2AV+Jre3l4efOIfce7SPzzE+wjw4QhXcIBPaK3/h1LqPPAxpdTvA2eAP43u/1PgI0qpqxgO4We/exUqRqlt6myza0C8QOwJs++1T2Kb+9jOAMY+BZNFNoftpttoNOLFJwTJ5k6kniAwGarkXgGfbNTd5hLsdgOx0dLq6ipra2v09A/T1WXY1Hb481aHPK+Uot60jIrCkLQX+SYEIYEGxzDDhFH7BaRLntj25ojVeYmNYos9tVpt2/tsdbAAdPb4Sn1J9aOZ0zY7Lye62GdIW+X0t4mN3GuHcpc22QTAnnN7fch4JteC1GOLuBpFJjKNzufzcZQnx3HiyFStVgu/XObIkSMEQcDi4iLFYpEDBw7gOA7Xr19neHg4Tm7caDSobBk1diblkU53RzhSEwXMzS0wP7/IsaOp2AFr165dBC2fQwf388wzz3D16lXe9a538bWvfY19+/bxmc98hne/+91Uq3UqlQoju0a/K8b2vaSiPwvcu83168CPbHO9DvzMd3tu4l8dBGA79ixJIKK6OjiHpGwo98h7cjCUUuiXYaPsemxZXU5JmxOQk07Ui67rxtqLpEbF7oe9KB3HiQOXyAm/vLwcx0csFosdRM9mi32/vWBvJ0LJ70l038Zd7PGyCa78X9SaSdDVHqcOTszCPgTgtO+339uahE4cyHGcjr5K24TQJLkxez7sa/Y60RHeIu2T8b+dpsoWG4womYvFKlEZb21tUa1W2draioPc9A8Psbi4SLVqMnN7nkkf39PTY/wkKhUWFxfJFo1GSNTOpVKJlGfiLV65coWebpNdbGhoiI31Tfbt24fnGJ+TPXcdZumlG1QqFfbs2cP58+e59957OXv+HG9/+9spjIxQvnKNmZkZUl4mjmF5u3JHWDRq3fbPtyl2cnHZJ+p2eEPSz94mDiJS2LjE7SimzV7KPSnV9rewCYQsdsE1yuUy8/PzsRgDWACaEy8MWYwi90ofRN1XKpnovkFoFmolip7keR59PT20Wq0OF+rQWtAydrbNhs3RBEFb7JF22W2ICYrlOyIET8ZEZPhYM2RZFdqii/TxdriRLRLGdVvgpMyjAIzSFntNJLlBuz4pwokqpWJX+uTGsPsh3+3DxuYy1tbWKBW7YnFyaWnJRLqKxkX+f/ny5VgUtAH0RqNBoVDg2rVrpFIpulImB+aesXGmp6eZvHGNy5cvk89mKRRyNKI0dBsbG+RzBW7cuEGpWKTZbLC8uITfanD//fdTr5a5ceMGy8vLvPFtb+OpL3whWgshP/rWt7J6YypWK9+u3BFEQalbjYtsVNrGFJJEISkOQCdLaf/XZgXb/7sVa7XBqHhB0LbZhzamIYtLrkto8dXV1TiSkG1kJc+3zYrttgu6L3U3LWLZaNRwnFwEPBo3ZwjNy/gGm3ZbhCvmFpRtGdg+8ZJig7QneeLbokA2m40XVblc7uB0kpsyOT82ZyX9vGU+LS7l1rXSOS82R2QTattJzeYSbK5iu2ck8Y3tuAebixIxIfSN1qmrUDCxMssmcdGePXvQWrO5uYnWBpNZWlqKCWxvby9DQ0Ps3jOG7/tcvHgxxoWEsAdBQKVhDJkcx8FPGfB0aWmJnp5uMpkMx48d4XOf+xx9PSV27dpl1lGrRalUoru7m2vXbjB/+TKBb7AX9/u1U3jlS5tC2xZ50CnD2gZCNtWFW+VZaC8CWXjJid5OpJD77IUuz7SJlDzH1m6Ij4aoDuWEE8Q9ufDk1LNPdOEcBJdQumVYKa0Jw4DKlkmVl0mlaaVNRGOlIQg7VZKivZDQZ7Y9gdZtbMMeHynyHDEYs8dORCdJemuLMknCbPs0yCawN6tcFzFAtBLaIspyX5wyzlIbCmGTe2wVrWAlUr+tgrP7K/iKzKNYnYoBlmAZ0n4wKub+nt7YbqSrq4tsLmPS0UVqWzFGG9g1jOd5DA8PU61WaTab9PWZhEFHjhxhZmaG1dVVAmXSB/hNI5pVq3VSKZfBgWG2yhsErYChoV3RgbNsOJ9Uije96U2ce+FFsoUCBw8eZHnRBGl54Md+jIWbN6nVakxPT3P6jW/kha9/nZMn7jZexwnx3C53BFFQSsWDLwtY9NJyLXniJPXSdrE5guT9yROLsPM0vF3ZjiPZTgxJsp9CWOxTy2ZD7bbIJpPTJwgCNLLQ23X6QRMXl1TaJZc3MR4ztC0a0aB9E1TUjZhxpTE2BGFnnMWkPL5dv+1xTH6+HWH+bqKa1GurQSFyUgqat4gCMecU+Tckwc1kn+z/2/iB3T4RcSTgbE9PD4uLi/i+T1dXF0opVldXOyIxSdt934ewk/CLVkrUxul0mvX19Ti6ssRvlH5ev36d9fV1stksN6dnDSeRMQfFWJQQt9Vq0V3qRYc+L774IrlcjoGBPvbu3cuVS5fY2tpieXmZhdlZgiBgYGCAarXK6vx8HIptZWWF9akpDh06RLPZNFzInY4pQHuTCHgjKqTk4oJbWcZkSSLdssnku/2bUp0b43bPFJk06W+RJCg2lyGfbXk2SZwEZ7CfZftwqFDjOJ3xAJo1E8chm81SKhRRoabW8uN2QlvUStpDyG82lmBvdHuThbrtoixjJP4B2xG/5P/tuRJOLzn+tlm6EAjbg0/uFy5RIjzZ4y/jbZtuJ+u3OUt7fuX+er3O4uIi4+PjtFotJicnY58RSTcgY5vL5XA05PO5eBylD+IwNzQwiFKKzWqFSqXCoUOHKJfLrK2t0dvby+rqKhsbG4yMmIxQDX8V3/eZm1ugu7ubPWPjFIp5Ctkcly5dYGN9nV27dgEOq6urXLx4ESKO8PTp06yvrRjVdMb4jJw5c4ZAwe7duykUCiwuLpJOp9k1vDsGi29X7gii4EQoqi1rJ08WG7izicJ2ZTu77iSSLq9ay98WpEoWYY/tk0ueIWKA4ziUSiW2trbik0U2t83yJgmBLCrxBZDFb54hMreAmm2vwM3NjXhzFnL5mAOJOQ7AVZ1YBlp3iGHyntTYhGFIaM2DbRORHMvtAERbtLKNyoQI2eMieTjlerNV73i+zKkQwiAIYlsMe2yhrXq01cZKqThOQhLbsQlWOp3m+vXr5PN5Dhw4QBAEzM3NxaBqV1dXbGbuoigVu2LNiKvMM3IRQVtbWzP1RuHflpeXGRoaMvhApUK1arJBv/TSSwwNDfHmN7+FmZkZbly/GuXLTHHt6nXWV1c4dOgQhw8dYnV1NSI+TRNerb+fixcvUip28cLZ5+jv7yc90MfGxgbj4+MM7R6hWCxy7tw5yuU1wxW12jYrtyt3BFEQSh0vxgT4leyAfardbgNDp6mrjQXYJ7btWfhyahpZQPEJrtpYh7TJdU0IMbGBFxPjpBwscrSceMKC2gtUio2u25tSTnmR+72EijCJf9jFVknaWgn7//LZHuPt1JD2vUnikFx8ttXkdn1NXrPnaTvOwx4ze93YbU/OuzzDHiObG/E8L85bKSHgBc8QrkYphed6HSpRWWPCTUgwnGKxyPLyMl1dXWxubsYh/bPZLN3d3aRSKXK5HJubmyaAT6FEqVRieXEpUruaBDiiSgQ4fvxIHMDmqaee4vQ995LP5xkYGKC7u4vp6WlGR0cp9HRzc3o6Ar/zsaFVvV6/8zkFrYlZVR29HMeJw32be0w48OTiSIKKNsGwN5wsNBuolP+5joODRqFjW30VRePxxU5eOziOQjkuCuOc5SiTGKTVDAhdCANMpOnIjFVrTS4dRSFutY2EXF/TbNVju4NGo4ECMp4hUJ5yDAagFGk38i50Ik2C46CUiVPoaE0QhgRgQstHuvtcOkcQpGNbh5jYqUh9qRQ44HjRKY8mGtwYu1AKghAg2piui/YcFA5h7PwFjqNohZEBkmPuV8ohCEPclItyXUIid+ZmI4pf4MQq3Gw2a/wRfBOXERXG+JK9aYUA2B6POmqochyc6H43is2RchyUVqSVEXXKtTKhirKZuxE+QURcgwA/CKjWauQzWbKpNM1anUa1FhM3gMqmyWpFEFJr1qhVqm0i77gxhhAEAdm0AR6ddIaBAeN+L6nlJSze7t1daG28cRdmp2nVaywvLXL50jnuuecelDK5N1tByNrWFs3AHGJXr71Ed6lId3cXI8O78FIOi/OzlPIZVuam6e8ucOXcWSZO3o92cqyurTA02E9lY52wtkYqCFH6jscU6OAObOptX9sO0LKRZPu+JCubfK6wowISQVsOt01hY1Y77OROkmKGPFvCgQcRYNis1TsWuSygINCxW7R9+tsqNdd1SbmGUIg6SkVtR0faEUsel5PfPh2TYKC0I8lR3K4kxYLbnfT22CbnUopgEVKniAFyAiZNrbebb5t7CK0+iMORF2FEqch8PeUZ1r9QKBBEYeiCBFeRVIsmOR5b82SvF4fO+Ze+K6ViexMZn2azyfq6Ce+/tLTE2NgYy8vLaK3ZtWsXMzPTcdax+++/n9XVVUZGRjoiZ42OjjIxMcHayiJhYCJ6DQ30s7CwwNjYGHML84yPjHDy5Mk4KfP43j1MTV6L4kWWuHbpEq1GvYNDS5Y7hijIIrA3bXJBkvhuZOzOkGH2Z/kuZq+2Xl7AP9u6K0lQZNG7rkso6SGsjSHPEjHAcRwaUdTdpsjoQZRrwG9vJs9x0a6KA79KUFeRq2U8HMeJjWNCK2Sd4zhGq6A1WMZBQlRsDsEWd6Q4KHPCKky8xpg9uNV6U/4n8n4srnjtFG42ECn326pluSaxJIIgiJPI2gZQMl9J70epQ4q0UbAcpVSsxrQxDHuugiAg0G1xSSlju+F5XmyDEgTtTNW24Zr0V8ZE4k+mXC8+cIIwoFar4eRypNPpOFpYo2E4oEajEWfSHhoaolarMTExwerqKpOTkxw9fgzf9zl6/ATFUjd+qJmZm+fAgQN4nsfS0hIra+ssLC1TyLiUK5sQanKZNCnXY9fQIJNnnmFsdDeZYonhYZ8rU5P0jY+ya2iYWq3G6uIcSqk4UNDtyh1BFJSClGUtaANfNuW2T/DkqWSfIPYilWcI8bAtG4FYvSWLIolStxfnrVGH7RMxBrG8zlByjmr7PcREBB+8tgajXq/HYJYUexMC8UQGWqz+Og2KXEuuFmKQBASTHFeSWCRBwyQWsR1QZ5+k9oazn5N0Aku2JWknIWNqE+kOoibPsgiW1GckHYt7wVpDtI27zPMiLtKqM2g1b8EnbM7FXnehskRX2gCyzFWj0cBJtxPbyNh1dXXFfXJdl7GxMS5fvszAwACnT5+mr6+Pz3/+80xMTOA4DpVKJY47GYYh/UO72O3tZmV5ka6uEksLC1GIPheFw8LNmyilqFerPPvkk2ysreE6e+JoX61WA61v1bBJuUOIQhvBh04W3T79hbW3N2SShYdOpFxOpaQoIc8WIxW7Lba40S63stg2Yi+LJg58Em2UbCody+SxSKIcWrrTmlD05baTlai4HMfBS0enYiQz+6FhvUPdjgZlP0eebW9I6bcX9U/kcVvccJQigDi1W3I8tuMIkr75QoRtAut5XgzA2uMqOIjMhT2utk+CZIgSIu44DtUoVqXMeSqVIuUYgNCLiLgXxWbIZrP4EbvXCsz4tPzIDNtqj68N8Qis+fYck908DCMRMOWhNB1gXS6T7QgZuFHfMGOn24ZXpVIpdoXPZs39p0+fplqtUq5V6e3r49vf+Q6nTp1iYHCQb3372wwPDzM+Pk4lsn8Y37OHlZUlqtUyuwaHmJ2fZ9fQEEsrq4yMjjIzN0u5skWz2aTSgJ/6J/+Er332M1y4cI69e8ao1GukHBfPu32I9zsibVw2k9Z7hoc62EVhIcGKrKNudSSyF5DNRidlXMEQkqecrRqz9d1J2TKdageKlfaIWNLRbt/Ix3KSO5qOxam1Np6LqpMQAbFrtN1Ov96Mnmus5ZRrOIJmYIKv6Oj/2WjTiB9GtVqN7etFpIg3XcaozcQCTxycpH1yykmxLQ6Tp76w8RKgNgzDbaNNOY6DR1utLOKHPcZSZHxl09kilhAEgEYUL9LzPAPKptOkXc+oIbXhCpWmLSbqyIu1qwjA8tqqCT4TiXE2IZN6BaiGNoF1XZeM6xG0jGapWCyiAxO2zxPbDz8wmbhRjIyM0NPTE3MIMifSx1wuh6+hUqmwvr7OvhYVd38AAA/XSURBVH372NjY4J577uHZZ5/lrrvuYmxsjOeee46hoSHm56ZRaEZGhqmWN2k16hw5cICl5QUKmTTVqokbOTq+D9dVJiSg57GyssT+vftQDrzz136Li9fu4LRxrmNUeUm59VZwrNPIxmZD5R75TUoSAJJiy7s2WwttXbct18p3223YBiiTHI198oLJWtTmUnRsf2DXbwdVFaDKI4pQZHmS2uwyqm0rYW9QOVWT+IBSCi/y99DKAHNaRY7VBrbBxdwTbMMd2RxIUixJjrldhJVPGn3JRtxOJWyPvz1OybHOZDKxb4eiU8zwHLftyBXSQRzt+5Ki6nbrwi6+75Py2klrsmkTpTopCEl4PfF9EELoui49PT0sLS2ZpDI5k/n62Mm7mJqa4s1vfjNra2vsO3iIQqmbxZVVyrU66a0yynU4sG8fUy+9RL26SV9PL0sryxQKBaYmb3Dk0CGWlhbo7+1mdnaWI0eO8PzzZ+IDcM/4njsfU5DTE60xPj56W1zATbkdEyUcgpSkbGrLgHJf0gbC1qUnN2dHgFQ6ZUphkYWQCSrtppyO53oRMfAcK+6CE+DTKRpprWODJmGlfd+nr9RjTsO6CRbaaJnrfhBFFo7YZhFb5PSR+JJiKxGGYUwwgkicFA4g6f0pTk+1ZjsnY3I87TG04wwI2GljQrE4SKftgg3UClGwny/ci2xaux2e55GPwqF5nkcQhVpTkSu8g7mnVOxq2xi02r4sdqAaIUytVsukplPgug5aKUIFTioCvYFQRYZkITipduQvyR/qRxyuqFxFpLCBSjn4yuUy+XyesbExljaMuvOhhx4inU4zOjoat+nKlSvk83nGx8dN9OZ6i8nJl+jv7+P5qUnOnDnDQ/ffx4ED+1lYWOKRRx5haWWFG9eu8thjj/Hkk08yMb6HUqnEyOhurl+/Tub7yfvwahQZKLhV/dTxnuAekovudv+z77XvSf5HvouMbINcSRHDPom3e952JeYgXFCO2wEMJomUcCLlsslz6LiRFaSKuJ6wsy7bQnI7AM8WcfyWFeRWQELHiU7yWz0F7fG18Q6Zu+1O8lsxmfY82J/t4LM2lrTdnMhmE+tDHT2jXq+bFPdhGGtlVMTmC95ig9BBwnjHnjdbfLsdJyQco3C0MvY2mCz1Sn/klAbjUFUulxkeHmbv3r3U63WOn7iL7u5uvvDXX+Sxxx6j0fS5eOkKIyMjPPDgw1y9epUXXjyP67o88Lq7qVS3ePrpb1GtbLJreDeZXI5vf/vbPPSjD3Pp0hWGh4fxVMhTf/skW1tbPP/88+zfv590NsPy8nIHsb9lnd4JmEIundYHdu9GqbbdgO0vEJ/gTqetgs1GxwYtuhNdl3d7M0Nn4FAbiLtdcZTXQRSkTluk8DwPP2zFYoNSKk6OkvZSbT29Bu3e6rQjPh92e1o1437teCZnoZsyQTpqzYZJxgtRKvpbw9/DrZvYcRyajbafhIy1vRGE2yg3ah2cmP0Mew6ELRbOI8ldxL4WYad2R+Zb7ktyBbYIKf+ziadr1acwmEw2ZVD6TMoYRuWzubivlVqVWq1GiCEkwgk1o7UThiHK63TPT3KiMaaA4f5SqRRdXV1kUiYPBRGRzaRM3AyVSsdqTuEa8vk8xWKRbDZLs9lkYmKC/t176Ovrw/M8pqenjRt2lHRobm4OgNHRUUqlEi+c/Q6Xzl/gwMF9FHM5pqYmyaUcZm/eZO+ePezbu4discjMjSvs37+fWrNhIj7tP0i5WiGXK/CPf+FXuTZ1887FFELddtO1T4ukDKncToDLZldtim7Lz7C9hiL5PQl0yf+SrK59zXZSgkgV6iRUpnIKul7MViulaFhAqjzTDhkvv4mHXr0Z6fVTXrwB7T7b9gOyEW1sQ56rdZuFTrLnMp5JjKZjrhJE1YmAtduNa7IN9vzYxk/JZ9r/s2Vx4SxEdJJnyhi0MPYfSEStUMcbstYw/hJeuq3+vR1XI+3cToyVuc5lsrGnZT6KxGT3NQgCmq1qHCdR5rdYLFIul2m1Whw9ejQOqFOtGqJ1+PBhpqenmZ2dpVAoMDY2xtDQEOVymampKVqtFqOjo6ytreFi7HBajTo9PT3Mz8/z8EMPUK1WGR0dpV6vs7pugrM88CMP4m2mmJ6ewUvd6fEUFLRccByMTXnYDsuFbk9u3W/cslBFdk3KqslJttk6+x5bRZbEK+zroW472tjso0YTismoBqVv3UiO41DzmzihgxO0bgHb3AivcC3z5iizGw3d5oAqtSrlaiVmUyULcjqVphn4sRwrRjjSfuE+5N3NGbuMzc3NeHNIRChpb7PZpDubwfddGo0mrTBA+yEpz4TqFGZAKY9UqhNvSRJksf+gJb4KXsd8xT4MKvKMxcjt9vwGgeT3COI+Nfw29uM4Ls1Wy2gkHAc/DNDNRmzXUQtbsQWlaiSIJmbMlePQDMTQXpaeMSs33xVhCM2mj+84hFHo/YKr2KqUSaU8gmYTE/QmbVLmKYfA0bgqJHSVicKdy5LKZhgdHad/ZBdBoAkaPt2DRTzPY+rmDAPDwyxdusLh4/tIexme/rtv4tdaJixfVz8Te/uZn5vhwoUL9Ja6KFd90qk8u/aN87fffpGxsTHSbop02uPu+45w9oXn+MYzT5PLmAA5Ke8OT0UPbZbX1yb/oLGDt7AA3Zk0RN7FBkFYb8/zOmIzJDe3farYrGhHa26zwLcD2ZJlO6cqWwsg/7UJQ5urCA1hUO2EMUHkVyCoubRHnK+kLyKa2DYL4vMhbZLTqlFvR0hOjoXYAxQKBTxHRCQHNwwIU9BoNQmCED8+7RWaThEgOV7xWPnt6NHCoSS5OGlPklNMEvowDAl00DG2KVH7hp1OdUoZOwNoa5ZscaSDSIe3zl9ynqT+VkRo0AG+08B1HTKuRzodYQlBgPJMm/L5PMVSN1ob8/aW75vwbZUKmUzOsPszM/QODRiv0bSxdzh/4QJry2sM9Q9w7wP3MDc3R+A2+OY3v8n01CRjY2ORM1QfxUKBzc11VpdXcF2X0V39NBo1MpkMg4ODJhaFcFIvU+4QomCK1saHXxH5H2iLKIQax7vVXtvGC2zWVH5LssRStgMJ7UUi7bF/s+vcjrWW536vfW0/V7Jlg52bRohDTDQssSjZZkWb2AjR0NpoNOyYhHa/RTMBdOAjvu+TzWbJpMzGbbV8s1di7uZWkcsmANuNt9baOJ5ZLyFY23Fq24F90EnAbW5L6vU8z4CnYZv9B+KM1/aYJef05TAle77iZ9AGyR2lCUNDFKQdKIdMoUixWKSnpwcvnYmjXxeijF9CvJrNJr4OTYi1vn7CMCSfzzM1NYUKFccOH8HLpE0CmlyewcFB9u8zFo/PP/sMBw7so1arMTc3RyGXZ2tri0UnYGxsN7Ozs8zOzrJ3YsyIUbUazVbztn29I4iCUpasaa4AUVjyeHGATyf7bi8YSfqRBIfM89W2Cw7okPNt4hJvNqVuWXz291v7cuv17dSeHRvKGggZhxjAy7TRdjEOEkcq4SY8z2R0lv/YGYCS2gytNTo0YyDJZMIwjEPJgSEQPT09lIo5qtUq1WoNgnam5TD0Y0DNcRxC3clZ2UZASU4tyXlJxCJ7Lm1swRb3kv/NeJm4r1prClkTEblSLhO22hwBgON2+mrIM+3x9n0ftonZuR3xcBwnnjhDIHSHP4gZdye2idDaOMvVajXWNjbJ5fMMDAyxsbFBvd5kz/hehkZ2MbZvgoXFJZp+i30HD3D06FEeeuBhFhcWuHzuEqdPn+bM2acBYwPxzDPPcPDgQZaWFih1dbG6usrxh49RLBZ56folzp07x2OPvp63vvWtTN64GoeQf7lyR2gflFJLQIWXzTf5ipaB17DuH/b6f5j7/lrWP6G1HtzuhzuCKAAopb6jtb7vh63uH/b6f5j7fifUv135e+WS3Ck7Zaf8/7/sEIWdslN2Ske5k4jCf/khrfuHvf4f5r7fCfXfUu4YTGGn7JSdcmeUO4lT2Ck7ZafcAeU1JwpKqbcopS4ppa4qpd77KtU5qZR6QSn1nFLqO9G1PqXUF5VSV6L33h9gff9NKbWolHrRurZtfcqU/xiNx1ml1OlXoO73K6Vmov4/p5R6m/Xb/x7VfUkp9cT3U3f0vHGl1FeUUheUUueUUv8iuv6K9/9l6n5V+q+UyiqlvqWUej6q/19H1/cppZ6O+v5xpVQ6up6Jvl+Nft/7/dT/Dy5JY51X8wW4wDVgP5AGngeOvwr1TgIDiWsfBN4bfX4v8G9+gPW9HjgNvPjd6gPeBnweY8H1IPD0K1D3+4Hf2ube49EcZIB90dy432f9I8Dp6HMXcDmq5xXv/8vU/ar0P+pDMfqcAp6O+vQJ4Gej638M/Fr0+deBP44+/yzw8Vd6L2z3eq05hR8Brmqtr2utm8DHgHe8Rm15B/Dh6POHgR//QT1Ya/0UsPo91vcO4M+0Kd8EepRSIz/gum9X3gF8TGvd0FrfAK5i5ugfXLTWc1rrZ6PPW8AFYJRXof8vU/ftyg+0/1EfytHXVPTSwJuAT0bXk32XMfkk8Ji6nensK1hea6IwCkxb32/y8pP2gyoa+Bul1DNKqV+Jrg1rrefALCZg6BVuw+3qe7XG5H+N2PP/ZolKr2jdETt8L+bEfFX7n6gbXqX+K6VcpdRzwCLwRQz3sa61lnhodh1x/dHvG0D/91P/P6S81kRhOyr4aqhDflRrfRp4K/DPlFKvfxXq/F7LqzEm/xdwALgHmAP+7Stdt1KqCHwKeI/WevPlbv1Bt2Gbul+1/mutA631PcAYhus49jJ1vFb7oaO81kThJjBufR8DZl/pSrXWs9H7IvAXmMlaEDY1el98hZtxu/pe8THRWi9EizUE/ittFvkVqVsplcJsyj/XWn86uvyq9H+7ul/t/kd1rgNfxWAKPUop8Uqy64jrj37v5nsX/X5g5bUmCt8GDkVobBoDrvzVK1mhUqqglOqSz8CbgRejen8huu0XgL98JdvxMvX9FfDuCIV/ENgQNvsHVRIy+k9g+i91/2yEgu8DDgHf+j7rUsCfAhe01v/O+ukV7//t6n61+q+UGlRK9USfc8DjGFzjK8BPR7cl+y5j8tPA/6sj1PFVLa8FuplAaN+GQYWvAb/zKtS3H4MwPw+ckzoxstuXgSvRe98PsM7/B8OmtjCnwS/frj4MC/mfo/F4AbjvFaj7I9Gzz2IW4oh1/+9EdV8C3voD6PsjGBb4LPBc9Hrbq9H/l6n7Vek/cDdwJqrnReB3rTX4LQyQ+d+BTHQ9G32/Gv2+/5XeD9u9diwad8pO2Skd5bUWH3bKTtkpd1jZIQo7ZafslI6yQxR2yk7ZKR1lhyjslJ2yUzrKDlHYKTtlp3SUHaKwU3bKTukoO0Rhp+yUndJRdojCTtkpO6Wj/H/CPyt+k5pxYgAAAABJRU5ErkJggg==\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Testing event\n", - "cat_image_url = 'https://s3.amazonaws.com/iguazio-sample-data/images/catanddog/cat.102.jpg'\n", - "response = requests.get(cat_image_url)\n", - "cat_image = response.content\n", - "img = Image.open(BytesIO(cat_image))\n", - "\n", - "print('Test image:')\n", - "plt.imshow(img)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Define Function specifications" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "from mlrun import mlconf\n", - "import os\n", - "\n", - "# Model Server variables\n", - "model_class = 'TFModel'\n", - "model_name = 'cat_vs_dog_tfv1' # Define for later use in tests\n", - "models = {model_name: os.path.join(mlconf.artifact_path, 'tf1/cats_n_dogs.h5')}\n", - "\n", - "# Specific model variables\n", - "function_envs = {\n", - " 'IMAGE_HEIGHT': 128,\n", - " 'IMAGE_WIDTH': 128,\n", - " 'classes_map': os.path.join(mlconf.artifact_path, 'categories_map.json')\n", - "}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Deploy the serving function to the cluster" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "from mlrun import new_model_server, mount_v3io" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[mlrun] 2020-05-04 21:22:18,924 function spec saved to path: function.yaml\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Setup the model server function\n", - "fn = new_model_server('tf1-serving', \n", - " model_class=model_class,\n", - " models=models)\n", - "fn.set_envs(function_envs)\n", - "fn.spec.description = \"tf1 image classification server\"\n", - "fn.metadata.categories = ['serving', 'dl']\n", - "fn.metadata.labels = {'author': 'yaronh'}\n", - "fn.export(\"function.yaml\")" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "if \"V3IO_HOME\" in list(os.environ):\n", - " from mlrun import mount_v3io\n", - " fn.apply(mount_v3io())\n", - "else:\n", - " # is you set up mlrun using the instructions at\n", - " # https://github.com/mlrun/mlrun/blob/master/hack/local/README.md\n", - " from mlrun.platforms import mount_pvc\n", - " fn.apply(mount_pvc('nfsvol', 'nfsvol', '/home/joyan/data'))" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[mlrun] 2020-04-30 20:52:15,886 deploy started\n", - "[nuclio] 2020-04-30 20:53:46,385 (info) Build complete\n", - "[nuclio] 2020-04-30 20:53:56,566 (info) Function deploy complete\n", - "[nuclio] 2020-04-30 20:53:56,573 done updating tensorflow-v1-2layers, function address: 3.135.130.246:30961\n" - ] - } - ], - "source": [ - "# Deploy the model server\n", - "addr = fn.deploy(project='cat-and-dog-servers')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Test the deployed function on the cluster" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Test the deployed function (with URL)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Sending event: {\"data_url\": \"https://s3.amazonaws.com/iguazio-sample-data/images/catanddog/cat.102.jpg\"}\n" - ] - }, - { - "data": { - "text/plain": [ - "b'[0.0]'" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# URL event\n", - "event_body = json.dumps({\"data_url\": cat_image_url})\n", - "print(f'Sending event: {event_body}')\n", - "\n", - "headers = {'Content-type': 'application/json'}\n", - "response = requests.post(url=addr + f'/{model_name}/predict', data=event_body, headers=headers)\n", - "response.content" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Test the deployed function (with Jpeg Image)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Sending image from https://s3.amazonaws.com/iguazio-sample-data/images/catanddog/cat.102.jpg\n" - ] - }, - { - "data": { - "text/plain": [ - "b'[0.0]'" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# URL event\n", - "event_body = cat_image\n", - "print(f'Sending image from {cat_image_url}')\n", - "plt.imshow(img)\n", - "\n", - "headers = {'Content-type': 'image/jpeg'}\n", - "response = requests.post(url=addr + f'/{model_name}/predict/', data=event_body, headers=headers)\n", - "response.content" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/tf1_serving/tf1_serving.py b/tf1_serving/tf1_serving.py deleted file mode 100644 index d9816c684..000000000 --- a/tf1_serving/tf1_serving.py +++ /dev/null @@ -1,87 +0,0 @@ -# Copyright 2019 Iguazio -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Generated by nuclio.export.NuclioExporter - -import warnings - -warnings.simplefilter(action="ignore", category=FutureWarning) - -import json -import numpy as np -import requests -from tensorflow import keras -from keras.models import load_model -from keras.preprocessing import image -from keras.preprocessing.image import load_img -from os import environ, path -from PIL import Image -from io import BytesIO -from urllib.request import urlopen -import mlrun - - -class TFModel(mlrun.runtimes.MLModelServer): - def __init__(self, name: str, model_dir: str): - super().__init__(name, model_dir) - - self.IMAGE_WIDTH = int(environ.get("IMAGE_WIDTH", "128")) - self.IMAGE_HEIGHT = int(environ.get("IMAGE_HEIGHT", "128")) - self.classes = None - try: - with open(environ["classes_map"], "r") as f: - self.classes = json.load(f) - except: - pass - - def load(self): - model_file, extra_data = self.get_model(".h5") - self.model = load_model(open(model_file, "rb")) - - def preprocess(self, body): - try: - output = {"instances": []} - instances = body.get("instances", []) - for byte_image in instances: - img = Image.open(byte_image) - img = img.resize((self.IMAGE_WIDTH, self.IMAGE_HEIGHT)) - - x = image.img_to_array(img) - x = np.expand_dims(x, axis=0) - output["instances"].append(x) - - output["instances"] = [np.vstack(output["instances"])] - return output - except: - raise Exception(f"received: {body}") - - def predict(self, data): - images = data.get("instances", []) - - predicted_probability = self.model.predict(images) - - return predicted_probability - - def postprocess(self, predicted_probability): - if self.classes: - predicted_classes = np.around(predicted_probability, 1).tolist()[0] - predicted_probabilities = predicted_probability.tolist()[0] - return { - "prediction": [ - self.classes[str(int(cls))] for cls in predicted_classes - ], - f'{self.classes["1"]}-probability': predicted_probabilities, - } - else: - return predicted_probability.tolist()[0] diff --git a/tf2_serving_v2/function.yaml b/tf2_serving_v2/function.yaml deleted file mode 100644 index 4dbe9f3fc..000000000 --- a/tf2_serving_v2/function.yaml +++ /dev/null @@ -1,45 +0,0 @@ -kind: serving -metadata: - name: tf2-serving-v2 - tag: '' - hash: 8748deb1d9804f9b436c913322c84d5b46c82bd9 - project: '' - labels: - author: yaronh - categories: - - model-serving - - machine-learning -spec: - command: '' - args: [] - image: mlrun/mlrun - description: tf2 image classification server v2 - min_replicas: 1 - max_replicas: 4 - env: [] - base_spec: - apiVersion: nuclio.io/v1 - kind: Function - metadata: - name: tf2-serving-v2 - labels: {} - annotations: - nuclio.io/generated_by: function generated from /home/kali/functions/tf2_serving_v2/tf2_serving_v2.py - spec: - runtime: python:3.6 - handler: tf2_serving_v2:handler - env: [] - volumes: [] - build: - commands: [] - noBaseImagesPull: true - functionSourceCode: IyBHZW5lcmF0ZWQgYnkgbnVjbGlvLmV4cG9ydC5OdWNsaW9FeHBvcnRlcgoKaW1wb3J0IHdhcm5pbmdzCgp3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoYWN0aW9uPSJpZ25vcmUiLCBjYXRlZ29yeT1GdXR1cmVXYXJuaW5nKQoKaW1wb3J0IGpzb24KaW1wb3J0IG51bXB5IGFzIG5wCmltcG9ydCByZXF1ZXN0cwpmcm9tIHRlbnNvcmZsb3cgaW1wb3J0IGtlcmFzCmZyb20gdGVuc29yZmxvdy5rZXJhcy5tb2RlbHMgaW1wb3J0IGxvYWRfbW9kZWwKZnJvbSB0ZW5zb3JmbG93LmtlcmFzLnByZXByb2Nlc3NpbmcgaW1wb3J0IGltYWdlCmZyb20gdGVuc29yZmxvdy5rZXJhcy5wcmVwcm9jZXNzaW5nLmltYWdlIGltcG9ydCBsb2FkX2ltZwpmcm9tIG9zIGltcG9ydCBlbnZpcm9uLCBwYXRoCmZyb20gUElMIGltcG9ydCBJbWFnZQpmcm9tIGlvIGltcG9ydCBCeXRlc0lPCmZyb20gdXJsbGliLnJlcXVlc3QgaW1wb3J0IHVybG9wZW4KaW1wb3J0IG1scnVuCgoKY2xhc3MgVEZNb2RlbChtbHJ1bi5zZXJ2aW5nLlYyTW9kZWxTZXJ2ZXIpOgogICAgZGVmIGxvYWQoc2VsZik6CiAgICAgICAgc2VsZi5JTUFHRV9XSURUSCA9IGludChlbnZpcm9uLmdldCgiSU1BR0VfV0lEVEgiLCAiMTI4IikpCiAgICAgICAgc2VsZi5JTUFHRV9IRUlHSFQgPSBpbnQoZW52aXJvbi5nZXQoIklNQUdFX0hFSUdIVCIsICIxMjgiKSkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICB3aXRoIG9wZW4oZW52aXJvblsiY2xhc3Nlc19tYXAiXSwgInIiKSBhcyBmOgogICAgICAgICAgICAgICAgc2VsZi5jbGFzc2VzID0ganNvbi5sb2FkKGYpCiAgICAgICAgZXhjZXB0OgogICAgICAgICAgICBzZWxmLmNsYXNzZXMgPSBOb25lCgogICAgICAgIG1vZGVsX2ZpbGUsIGV4dHJhX2RhdGEgPSBzZWxmLmdldF9tb2RlbCgiLmg1IikKICAgICAgICBzZWxmLm1vZGVsID0gbG9hZF9tb2RlbChtb2RlbF9maWxlKQoKICAgIGRlZiBwcmVwcm9jZXNzKHNlbGYsIGJvZHksIG9wZXJhdGlvbik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBvdXRwdXQgPSB7ImlucHV0cyI6IFtdfQogICAgICAgICAgICBpbnB1dHMgPSBib2R5LmdldCgiaW5wdXRzIiwgW10pCiAgICAgICAgICAgIGZvciBieXRlX2ltYWdlIGluIGlucHV0czoKICAgICAgICAgICAgICAgIGltZyA9IEltYWdlLm9wZW4oYnl0ZV9pbWFnZSkKICAgICAgICAgICAgICAgIGltZyA9IGltZy5yZXNpemUoKHNlbGYuSU1BR0VfV0lEVEgsIHNlbGYuSU1BR0VfSEVJR0hUKSkKCiAgICAgICAgICAgICAgICB4ID0gaW1hZ2UuaW1nX3RvX2FycmF5KGltZykKICAgICAgICAgICAgICAgIHggPSBucC5leHBhbmRfZGltcyh4LCBheGlzPTApCiAgICAgICAgICAgICAgICBvdXRwdXRbImlucHV0cyJdLmFwcGVuZCh4KQoKICAgICAgICAgICAgb3V0cHV0WyJpbnB1dHMiXSA9IFtucC52c3RhY2sob3V0cHV0WyJpbnB1dHMiXSldCiAgICAgICAgICAgIHJldHVybiBvdXRwdXQKICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbihmInJlY2VpdmVkOiB7Ym9keX0iKQoKICAgIGRlZiBwcmVkaWN0KHNlbGYsIGRhdGEpOgogICAgICAgIGltYWdlcyA9IGRhdGEuZ2V0KCJpbnB1dHMiLCBbXSkKCiAgICAgICAgcHJlZGljdGVkX3Byb2JhYmlsaXR5ID0gc2VsZi5tb2RlbC5wcmVkaWN0KGltYWdlcykKCiAgICAgICAgcmV0dXJuIHByZWRpY3RlZF9wcm9iYWJpbGl0eS50b2xpc3QoKVswXQoKCmZyb20gbWxydW4ucnVudGltZXMgaW1wb3J0IG51Y2xpb19pbml0X2hvb2sKCgpkZWYgaW5pdF9jb250ZXh0KGNvbnRleHQpOgogICAgbnVjbGlvX2luaXRfaG9vayhjb250ZXh0LCBnbG9iYWxzKCksICJzZXJ2aW5nX3YyIikKCgpkZWYgaGFuZGxlcihjb250ZXh0LCBldmVudCk6CiAgICByZXR1cm4gY29udGV4dC5tbHJ1bl9oYW5kbGVyKGNvbnRleHQsIGV2ZW50KQoKZnJvbSBtbHJ1bi5ydW50aW1lcyBpbXBvcnQgbnVjbGlvX2luaXRfaG9vawpkZWYgaW5pdF9jb250ZXh0KGNvbnRleHQpOgogICAgbnVjbGlvX2luaXRfaG9vayhjb250ZXh0LCBnbG9iYWxzKCksICdzZXJ2aW5nX3YyJykKCmRlZiBoYW5kbGVyKGNvbnRleHQsIGV2ZW50KToKICAgIHJldHVybiBjb250ZXh0Lm1scnVuX2hhbmRsZXIoY29udGV4dCwgZXZlbnQpCg== - source: '' - function_kind: serving_v2 - build: - commands: - - python -m pip install requests pillow tensorflow>=2.1 - code_origin: https://github.com/daniels290813/functions.git#55a79c32be5d233cc11efcf40cd3edbe309bfdef:/home/kali/functions/tf2_serving_v2/tf2_serving_v2.py - secret_sources: [] - affinity: null -verbose: false diff --git a/tf2_serving_v2/item.yaml b/tf2_serving_v2/item.yaml deleted file mode 100644 index dc7640b0b..000000000 --- a/tf2_serving_v2/item.yaml +++ /dev/null @@ -1,28 +0,0 @@ -apiVersion: v1 -categories: -- model-serving -- machine-learning -description: tf2 image classification server v2 -doc: '' -example: tf2_serving_v2.ipynb -generationDate: 2022-08-28:17-25 -hidden: false -icon: '' -labels: - author: yaronh -maintainers: [] -marketplaceType: '' -mlrunVersion: 1.1.0 -name: tf2-serving-v2 -platformVersion: 3.5.0 -spec: - filename: tf2_serving_v2.py - handler: handler - image: mlrun/mlrun - kind: serving - requirements: - - requests - - pillow - - tensorflow>=2.1 -url: '' -version: 1.1.0 diff --git a/tf2_serving_v2/requirements.txt b/tf2_serving_v2/requirements.txt deleted file mode 100644 index 8d3d19557..000000000 --- a/tf2_serving_v2/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -pillow -tensorflow \ No newline at end of file diff --git a/tf2_serving_v2/tf2_serving_v2.ipynb b/tf2_serving_v2/tf2_serving_v2.ipynb deleted file mode 100644 index 6a15b11a4..000000000 --- a/tf2_serving_v2/tf2_serving_v2.ipynb +++ /dev/null @@ -1,545 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Image Classification Model - Serving Function\n", - "\n", - "This notebook demonstrates how to deploy a Tensorflow model using MLRun & Nuclio.\n", - "\n", - "**In this notebook you will:**\n", - "* Write a Tensorflow-Model class to load and predict on the incoming data\n", - "* Deploy the model as a serverless function\n", - "* Invoke the serving endpoint with data as:\n", - " * URLs to images hosted on S3\n", - " * Direct image send\n", - " \n", - "**Steps:** \n", - "* [Define Nuclio function](#Define-Nuclio-function) \n", - " * [Install dependencies and set config](#Install-dependencies-and-set-config) \n", - " * [Model serving class](#Model-Serving-Class) \n", - "* [Deploy the serving function to the cluster](#Deploy-the-serving-function-to-the-cluster) \n", - "* [Define test parameters](#Define-test-parameters)\n", - "* [Test the deployed function on the cluster](#Test-the-deployed-function-on-the-cluster)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Define Nuclio Function" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To use the magic commands for deploying this jupyter notebook as a nuclio function we must first import nuclio \n", - "Since we do not want to import nuclio in the actual function, the comment annotation `nuclio: ignore` is used. This marks the cell for nuclio, telling it to ignore the cell's values when building the function." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The history saving thread hit an unexpected error (DatabaseError('database disk image is malformed')).History will not be written to the database.\n" - ] - } - ], - "source": [ - "# nuclio: ignore\n", - "import nuclio" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Install dependencies and set config\n", - "> Note: Since tensorflow is being pulled from the baseimage it is not directly installed as a build command.\n", - "If it is not installed on your system please uninstall and install using the line: `pip install tensorflow`" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "%nuclio: setting kind to 'serving'\n", - "%nuclio: setting spec.build.baseImage to 'mlrun/mlrun'\n" - ] - } - ], - "source": [ - "%nuclio config kind=\"serving\"\n", - "\n", - "# tensorflow 2 use the default serving image (or the mlrun/ml-models for a faster build)\n", - "\n", - "%nuclio config spec.build.baseImage = \"mlrun/mlrun\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Since we are using packages which are not surely installed on our baseimage, or want to verify that a specific version of the package will be installed we use the `%nuclio cmd` annotation. \n", - ">`%nuclio cmd` works both locally and during deployment by default, but can be set with `-c` flag to only run the commands while deploying or `-l` to set the variable for the local environment only." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "%%nuclio cmd -c\n", - "pip install tensorflow>=2.1\n", - "pip install requests pillow" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Function Code" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "import warnings\n", - "warnings.simplefilter(action=\"ignore\", category=FutureWarning)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2021-01-29 23:47:50,165 [warning] Failed resolving version info. Ignoring and using defaults\n", - "> 2021-01-29 23:47:51,342 [warning] Unable to parse server or client version. Assuming compatible: {'server_version': '0.6.0-rc9', 'client_version': 'unstable'}\n" - ] - } - ], - "source": [ - "import json\n", - "import numpy as np\n", - "import requests\n", - "from tensorflow import keras\n", - "from tensorflow.keras.models import load_model\n", - "from tensorflow.keras.preprocessing import image\n", - "from tensorflow.keras.preprocessing.image import load_img\n", - "from os import environ, path\n", - "from PIL import Image\n", - "from io import BytesIO\n", - "from urllib.request import urlopen\n", - "import mlrun" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Model Serving Class" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We define the `TFModel` class which we will use to define data handling and prediction of our model. \n", - "\n", - "The class should consist of:\n", - "* `__init__(name, model_dir)` - Setup the internal parameters\n", - "* `load(self)` - How to load the model and broadcast it's ready for prediction\n", - "* `preprocess(self, body)` - How to handle the incoming event, forming the request to an `{'instances': []}` dictionary as requested by the protocol\n", - "* `predict(self, data)` - Receives and `{'instances': []}` and returns the model's prediction as a list\n", - "* `postprocess(self, data)` - Does any additional processing needed on the predictions." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "class TFModel(mlrun.serving.V2ModelServer):\n", - "\n", - " def load(self):\n", - " self.IMAGE_WIDTH = int(environ.get('IMAGE_WIDTH', '128'))\n", - " self.IMAGE_HEIGHT = int(environ.get('IMAGE_HEIGHT', '128'))\n", - " \n", - " try:\n", - " with open(environ['classes_map'], 'r') as f:\n", - " self.classes = json.load(f)\n", - " except:\n", - " self.classes = None\n", - " \n", - " model_file, extra_data = self.get_model('.h5')\n", - " self.model = load_model(model_file)\n", - " \n", - " def preprocess(self, body, operation):\n", - " try:\n", - " output = {'inputs': []}\n", - " inputs = body.get('inputs', [])\n", - " for byte_image in inputs:\n", - " img = Image.open(byte_image)\n", - " img = img.resize((self.IMAGE_WIDTH, self.IMAGE_HEIGHT))\n", - "\n", - " # Load image\n", - " x = image.img_to_array(img)\n", - " x = np.expand_dims(x, axis=0)\n", - " output['inputs'].append(x)\n", - " \n", - " # Format inputs list\n", - " output['inputs'] = [np.vstack(output['inputs'])]\n", - " return output\n", - " except:\n", - " raise Exception(f'received: {body}')\n", - " \n", - "\n", - " def predict(self, data):\n", - " images = data.get('inputs', [])\n", - "\n", - " # Predict\n", - " predicted_probability = self.model.predict(images)\n", - "\n", - " # return prediction\n", - " return predicted_probability.tolist()[0]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To let our nuclio builder know that our function code ends at this point we will use the comment annotation `nuclio: end-code`. \n", - "\n", - "Any new cell from now on will be treated as if a `nuclio: ignore` comment was set, and will not be added to the funcion." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "# nuclio: end-code" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Test the function locally" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Make sure your local TF / Keras version is the same as pulled in the nuclio image for accurate testing\n", - "\n", - "Set the served models and their file paths using: `SERVING_MODEL_ = `\n", - "\n", - "> Note: this notebook assumes the model and categories are under /User/mlrun/examples/" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "from PIL import Image\n", - "from io import BytesIO\n", - "import matplotlib.pyplot as plt\n", - "import os" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Define test parameters" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Test image:\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Testing event\n", - "cat_image_url = 'https://s3.amazonaws.com/iguazio-sample-data/images/catanddog/cat.102.jpg'\n", - "response = requests.get(cat_image_url)\n", - "cat_image = response.content\n", - "img = Image.open(BytesIO(cat_image))\n", - "\n", - "print('Test image:')\n", - "plt.imshow(img)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Define Function specifications" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "from mlrun import mlconf\n", - "\n", - "# Specific model variables\n", - "function_envs = {\n", - " 'IMAGE_HEIGHT': 224,\n", - " 'IMAGE_WIDTH': 224,\n", - " 'classes_map': '/Userv3io/projects/cat-and-dog-servers/artifacts/categories_map.json',\n", - "}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Deploy the serving function to the cluster" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "from mlrun import code_to_function, mount_v3io" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2021-01-29 23:47:54,881 [info] function spec saved to path: function.yaml\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Setup the model server function\n", - "\n", - "fn = code_to_function('tf2-serving-v2', kind=\"serving\")\n", - "fn.spec.description = \"tf2 image classification server v2\"\n", - "fn.metadata.categories = ['serving', 'dl']\n", - "fn.metadata.labels = {'author': 'yaronh'}\n", - "fn.export(\"function.yaml\")\n", - "fn.set_envs(function_envs)\n", - "fn.add_model(key=\"model\",\n", - " model_path=\"/User/mlrun_repos/demos/image-classification-with-distributed-training/pipe/52f2145e-7a54-4137-8c7b-b6c20cc8b1fd/tfmodels/model.h5\",\n", - " class_name=\"TFModel\")" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "if \"V3IO_HOME\" in list(os.environ):\n", - " from mlrun import mount_v3io\n", - " fn.apply(mount_v3io())\n", - "else:\n", - " # is you set up mlrun using the instructions at\n", - " # https://github.com/mlrun/mlrun/blob/master/hack/local/README.md\n", - " from mlrun.platforms import mount_pvc\n", - " fn.apply(mount_pvc('nfsvol', 'nfsvol', '/home/joyan/data'))" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2021-01-29 23:47:54,893 [info] Starting remote function deploy\n", - "2021-01-29 23:47:55 (info) Deploying function\n", - "2021-01-29 23:47:55 (info) Building\n", - "2021-01-29 23:47:55 (info) Staging files and preparing base images\n", - "2021-01-29 23:47:56 (info) Building processor image\n", - "2021-01-29 23:47:57 (info) Build complete\n", - "2021-01-29 23:48:07 (info) Function deploy complete\n", - "> 2021-01-29 23:48:08,029 [info] function deployed, address=default-tenant.app.us-sales30-demo.iguazio-cd2.com:31946\n" - ] - } - ], - "source": [ - "# Deploy the model server\n", - "addr = fn.deploy(project='cat-and-dog-servers')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Test the deployed function on the cluster" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Test the deployed function (with URL)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "payload = json.dumps({\"data_url\" : cat_image_url})" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'id': '38224902-a688-4985-9424-578ff9ccb4a5',\n", - " 'model_name': 'model',\n", - " 'outputs': [0.0]}" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "fn.invoke(path='/v2/models/model/predict', body=payload)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Test the deployed function (with Jpeg Image)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'id': '246c00fc-225c-44ec-b221-4e6c99f7bc5d',\n", - " 'model_name': 'model',\n", - " 'outputs': [0.0]}" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "fn.invoke(path='/v2/models/model/predict',\n", - " body=cat_image,\n", - " headers={'Content-type': 'image/jpeg'})" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/tf2_serving_v2/tf2_serving_v2.py b/tf2_serving_v2/tf2_serving_v2.py deleted file mode 100644 index d3642c202..000000000 --- a/tf2_serving_v2/tf2_serving_v2.py +++ /dev/null @@ -1,82 +0,0 @@ -# Copyright 2019 Iguazio -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Generated by nuclio.export.NuclioExporter - -import warnings - -warnings.simplefilter(action="ignore", category=FutureWarning) - -import json -import numpy as np -import requests -from tensorflow import keras -from tensorflow.keras.models import load_model -from tensorflow.keras.preprocessing import image -from tensorflow.keras.preprocessing.image import load_img -from os import environ, path -from PIL import Image -from io import BytesIO -from urllib.request import urlopen -import mlrun - - -class TFModel(mlrun.serving.V2ModelServer): - def load(self): - self.IMAGE_WIDTH = int(environ.get("IMAGE_WIDTH", "128")) - self.IMAGE_HEIGHT = int(environ.get("IMAGE_HEIGHT", "128")) - - try: - with open(environ["classes_map"], "r") as f: - self.classes = json.load(f) - except: - self.classes = None - - model_file, extra_data = self.get_model(".h5") - self.model = load_model(model_file) - - def preprocess(self, body, operation): - try: - output = {"inputs": []} - inputs = body.get("inputs", []) - for byte_image in inputs: - img = Image.open(byte_image) - img = img.resize((self.IMAGE_WIDTH, self.IMAGE_HEIGHT)) - - x = image.img_to_array(img) - x = np.expand_dims(x, axis=0) - output["inputs"].append(x) - - output["inputs"] = [np.vstack(output["inputs"])] - return output - except: - raise Exception(f"received: {body}") - - def predict(self, data): - images = data.get("inputs", []) - - predicted_probability = self.model.predict(images) - - return predicted_probability.tolist()[0] - - -from mlrun.runtimes import nuclio_init_hook - - -def init_context(context): - nuclio_init_hook(context, globals(), "serving_v2") - - -def handler(context, event): - return context.mlrun_handler(context, event) diff --git a/virtual_drift/README.md b/virtual_drift/README.md deleted file mode 100644 index cd7383904..000000000 --- a/virtual_drift/README.md +++ /dev/null @@ -1,56 +0,0 @@ -# Drift Magnitude - -Concept drift and shift are major issues that greatly affect the accuracy and reliability of many real-world applications of machine learning. We can use the following Drift Magnitude metrics to map and understand our concepts and how close the properties of the data we used to train the models on are to the current data we receive. - -## How to integrate - -The Virtual Drift function is built to receive two data batches of data (as `dataitem` or `Dataframe`), base batch *t* and current batch *u*. - -```markdown -:param context: MLRun context -:param t: Base dataset for the drift metrics -:param u: Test dataset for the drift metrics -:param label_col: Label colum in t and u -:param prediction_col: Predictions column in t and u -:param discritizers: Dictionary of dicsritizers for the features if available - (Created automatically if not provided) -:param n_bins: Number of bins to be used for histrogram creation from continuous variables -:param stream_name: Output stream to push metrics to -:param results_tsdb_container: TSDB table container to push metrics to -:param results_tsdb_table: TSDB table to push metrics to -``` - -The function will calculate the selected drift mangitude metrics that were selected and apply them to the **features**, **labels** and **predictions**. It will then save those metrics and export them via Parquet and TSDB. Alerting could be added on top of the metrics via Grafana or a function. - -## Metrics - -The drift magnitude metrics we calculate are: - -### TVD - Total Variation Distance - -Provides a symetric drift distance between two periods *t* and *u* -Z - vector of random variables -P*t* - Probability distribution over timespan *t* - -![\sigma_{t, u}(Z)=\frac{1}{2}\sum_{\hat{z}\in{dom(Z)}}{|P_t{(\hat{Z})-P_u{(\hat{Z})}}|}]() - -### Helinger Distance - -Hellinger distance is an *f* divergence measuer, similar to the Kullback-Leibler (KL) divergence. However, unlike KL Divergence the Hellinger divergence is symmetric and bounded over a probability space. - -P, Q - Discrete probability distributions (P*i*, ..., P*k*). - -![H(P,Q)=\frac{1}{\sqrt{2}}\sqrt{\sum_{i=1}^{k}{(\sqrt{p_i}-\sqrt{q_i})^2}}]() - - -### KL Divergence - -KL Divergence (or relative entropy) is a measure of how one probability distribution differs from another. It is an asymmetric measure (thus it's not a metric) and it doesn't satisfy the triangle inequality. KL Divergence of 0, indicates two identical distributrions. - -![D_{KL}(P||Q)=\sum_{x\in{X}}{(P(x)\log{\frac{P(x)}{Q(x)}})}]() - -## Additional Resources - -Webb, Geoffrey I. et al. “[Characterizing Concept Drift.](https://arxiv.org/abs/1511.03816)” Data Mining and Knowledge Discovery 30.4 (2016): 964–994. Crossref. Web. - -[MLOps Live #4 - How to Detect & Remediate Drift in Production with MLOps Automation](https://www.youtube.com/watch?v=66_Q7mJZOSc&t=1296s) diff --git a/virtual_drift/function.yaml b/virtual_drift/function.yaml deleted file mode 100644 index 55dcec11c..000000000 --- a/virtual_drift/function.yaml +++ /dev/null @@ -1,129 +0,0 @@ -kind: job -metadata: - name: virtual-drift - tag: '' - hash: 8990fdd72fc550189a0c8b488b69997428b786c9 - project: '' - labels: - author: orz - categories: - - data-analysis - - machine-learning -spec: - command: '' - args: [] - image: mlrun/ml-models - env: [] - default_handler: drift_magnitude - entry_points: - to_observations: - name: to_observations - doc: '' - parameters: - - name: context - default: '' - - name: t - default: '' - - name: u - default: '' - - name: key - default: '' - outputs: - - default: '' - lineno: 16 - tvd: - name: tvd - doc: '' - parameters: - - name: t - default: '' - - name: u - default: '' - outputs: - - default: '' - lineno: 42 - helinger: - name: helinger - doc: '' - parameters: - - name: t - default: '' - - name: u - default: '' - outputs: - - default: '' - lineno: 46 - kl_divergence: - name: kl_divergence - doc: '' - parameters: - - name: t - default: '' - - name: u - default: '' - outputs: - - default: '' - lineno: 50 - all_metrics: - name: all_metrics - doc: '' - parameters: - - name: t - default: '' - - name: u - default: '' - outputs: - - default: '' - lineno: 56 - drift_magnitude: - name: drift_magnitude - doc: "Drift magnitude metrics\n Computes drift magnitude metrics between base\ - \ dataset t and dataset u.\n Metrics:\n - TVD (Total Variation Distance)\n\ - \ - Helinger\n - KL Divergence" - parameters: - - name: context - doc: MLRun context - default: '' - - name: t - type: DataFrame - doc: Base dataset for the drift metrics - default: '' - - name: u - type: DataFrame - doc: Test dataset for the drift metrics - default: '' - - name: label_col - doc: Label colum in t and u - default: null - - name: prediction_col - doc: Predictions column in t and u - default: null - - name: discretizers - type: dict - default: null - - name: n_bins - doc: Number of bins to be used for histrogram creation from continuous variables - default: 5 - - name: stream_name - type: str - doc: Output stream to push metrics to - default: some_stream - - name: results_tsdb_container - type: str - doc: TSDB table container to push metrics to - default: bigdata - - name: results_tsdb_table - type: str - doc: TSDB table to push metrics to - default: concept_drift/drift_magnitude - outputs: - - default: '' - lineno: 60 - description: Compute drift magnitude between Time-Samples T and U - build: - functionSourceCode: IyBHZW5lcmF0ZWQgYnkgbnVjbGlvLmV4cG9ydC5OdWNsaW9FeHBvcnRlcgoKaW1wb3J0IG9zCmltcG9ydCBwYW5kYXMgYXMgcGQKaW1wb3J0IG51bXB5IGFzIG5wCmltcG9ydCBzY2lweSBhcyBzcAppbXBvcnQgcGlja2xlCmltcG9ydCBkYXRldGltZQoKaW1wb3J0IHYzaW9fZnJhbWVzIGFzIHYzZgoKaW1wb3J0IG1hdHBsb3RsaWIucHlwbG90IGFzIHBsdApmcm9tIHNrbGVhcm4ucHJlcHJvY2Vzc2luZyBpbXBvcnQgS0JpbnNEaXNjcmV0aXplcgoKCmRlZiB0b19vYnNlcnZhdGlvbnMoY29udGV4dCwgdCwgdSwga2V5KToKICAgIHQgPSAoCiAgICAgICAgdC5hcHBseShsYW1iZGEgcm93OiBmInsnXycuam9pbihbc3RyKHJvd1t2YWxdKSBmb3IgdmFsIGluIHQuY29sdW1uc10pfSIsIGF4aXM9MSkKICAgICAgICAudmFsdWVfY291bnRzKCkKICAgICAgICAuc29ydF9pbmRleCgpCiAgICApCiAgICB1ID0gKAogICAgICAgIHUuYXBwbHkobGFtYmRhIHJvdzogZiJ7J18nLmpvaW4oW3N0cihyb3dbdmFsXSkgZm9yIHZhbCBpbiB1LmNvbHVtbnNdKX0iLCBheGlzPTEpCiAgICAgICAgLnZhbHVlX2NvdW50cygpCiAgICAgICAgLnNvcnRfaW5kZXgoKQogICAgKQoKICAgIGpvaW5lZF91bmlxdWVzID0gcGQuRGF0YUZyYW1lKFt0LCB1XSkuVC5maWxsbmEoMCkuc29ydF9pbmRleCgpCiAgICBqb2luZWRfdW5pcXVlcy5jb2x1bW5zID0gWyJ0IiwgInUiXQoKICAgIHRfb2JzID0gam9pbmVkX3VuaXF1ZXMubG9jWzosICJ0Il0KICAgIHVfb2JzID0gam9pbmVkX3VuaXF1ZXMubG9jWzosICJ1Il0KCiAgICB0X3BkZiA9IHRfb2JzIC8gdF9vYnMuc3VtKCkKICAgIHVfcGRmID0gdV9vYnMgLyB1X29icy5zdW0oKQoKICAgIGNvbnRleHQubG9nX2RhdGFzZXQoZiJ7a2V5fV90X3BkZiIsIHBkLkRhdGFGcmFtZSh0X3BkZiksIGZvcm1hdD0icGFycXVldCIpCiAgICBjb250ZXh0LmxvZ19kYXRhc2V0KGYie2tleX1fdV9wZGYiLCBwZC5EYXRhRnJhbWUodV9wZGYpLCBmb3JtYXQ9InBhcnF1ZXQiKQogICAgcmV0dXJuIHRfcGRmLCB1X3BkZgoKCmRlZiB0dmQodCwgdSk6CiAgICByZXR1cm4gc3VtKGFicyh0IC0gdSkpIC8gMgoKCmRlZiBoZWxpbmdlcih0LCB1KToKICAgIHJldHVybiAobnAuc3FydChucC5zdW0obnAucG93ZXIobnAuc3FydCh0KSAtIG5wLnNxcnQodSksIDIpKSkpIC8gbnAuc3FydCgyKQoKCmRlZiBrbF9kaXZlcmdlbmNlKHQsIHUpOgogICAgdF91ID0gbnAuc3VtKG5wLndoZXJlKHQgIT0gMCwgdCAqIG5wLmxvZyh0IC8gdSksIDApKQogICAgdV90ID0gbnAuc3VtKG5wLndoZXJlKHUgIT0gMCwgdSAqIG5wLmxvZyh1IC8gdCksIDApKQogICAgcmV0dXJuIHRfdSArIHVfdAoKCmRlZiBhbGxfbWV0cmljcyh0LCB1KToKICAgIHJldHVybiB0dmQodCwgdSksIGhlbGluZ2VyKHQsIHUpLCBrbF9kaXZlcmdlbmNlKHQsIHUpCgoKZGVmIGRyaWZ0X21hZ25pdHVkZSgKICAgIGNvbnRleHQsCiAgICB0OiBwZC5EYXRhRnJhbWUsCiAgICB1OiBwZC5EYXRhRnJhbWUsCiAgICBsYWJlbF9jb2w9Tm9uZSwKICAgIHByZWRpY3Rpb25fY29sPU5vbmUsCiAgICBkaXNjcmV0aXplcnM6IGRpY3QgPSBOb25lLAogICAgbl9iaW5zPTUsCiAgICBzdHJlYW1fbmFtZTogc3RyID0gInNvbWVfc3RyZWFtIiwKICAgIHJlc3VsdHNfdHNkYl9jb250YWluZXI6IHN0ciA9ICJiaWdkYXRhIiwKICAgIHJlc3VsdHNfdHNkYl90YWJsZTogc3RyID0gImNvbmNlcHRfZHJpZnQvZHJpZnRfbWFnbml0dWRlIiwKKToKICAgICIiIkRyaWZ0IG1hZ25pdHVkZSBtZXRyaWNzCiAgICAgICBDb21wdXRlcyBkcmlmdCBtYWduaXR1ZGUgbWV0cmljcyBiZXR3ZWVuIGJhc2UgZGF0YXNldCB0IGFuZCBkYXRhc2V0IHUuCiAgICAgICBNZXRyaWNzOgogICAgICAgIC0gVFZEIChUb3RhbCBWYXJpYXRpb24gRGlzdGFuY2UpCiAgICAgICAgLSBIZWxpbmdlcgogICAgICAgIC0gS0wgRGl2ZXJnZW5jZQoKICAgIDpwYXJhbSBjb250ZXh0OiBNTFJ1biBjb250ZXh0CiAgICA6cGFyYW0gdDogQmFzZSBkYXRhc2V0IGZvciB0aGUgZHJpZnQgbWV0cmljcwogICAgOnBhcmFtIHU6IFRlc3QgZGF0YXNldCBmb3IgdGhlIGRyaWZ0IG1ldHJpY3MKICAgIDpwYXJhbSBsYWJlbF9jb2w6IExhYmVsIGNvbHVtIGluIHQgYW5kIHUKICAgIDpwYXJhbSBwcmVkaWN0aW9uX2NvbDogUHJlZGljdGlvbnMgY29sdW1uIGluIHQgYW5kIHUKICAgIDpwYXJhbSBkaXNjcml0aXplcnM6IERpY3Rpb25hcnkgb2YgZGljc3JpdGl6ZXJzIGZvciB0aGUgZmVhdHVyZXMgaWYgYXZhaWxhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAoQ3JlYXRlZCBhdXRvbWF0aWNhbGx5IGlmIG5vdCBwcm92aWRlZCkKICAgIDpwYXJhbSBuX2JpbnM6IE51bWJlciBvZiBiaW5zIHRvIGJlIHVzZWQgZm9yIGhpc3Ryb2dyYW0gY3JlYXRpb24gZnJvbSBjb250aW51b3VzIHZhcmlhYmxlcwogICAgOnBhcmFtIHN0cmVhbV9uYW1lOiBPdXRwdXQgc3RyZWFtIHRvIHB1c2ggbWV0cmljcyB0bwogICAgOnBhcmFtIHJlc3VsdHNfdHNkYl9jb250YWluZXI6IFRTREIgdGFibGUgY29udGFpbmVyIHRvIHB1c2ggbWV0cmljcyB0bwogICAgOnBhcmFtIHJlc3VsdHNfdHNkYl90YWJsZTogVFNEQiB0YWJsZSB0byBwdXNoIG1ldHJpY3MgdG8KICAgICIiIgoKICAgIHYzaW9fY2xpZW50ID0gdjNmLkNsaWVudCgiZnJhbWVzZDo4MDgxIiwgY29udGFpbmVyPXJlc3VsdHNfdHNkYl9jb250YWluZXIpCiAgICB0cnk6CiAgICAgICAgdjNpb19jbGllbnQuY3JlYXRlKCJ0c2RiIiwgcmVzdWx0c190c2RiX3RhYmxlLCBpZl9leGlzdHM9MSwgcmF0ZT0iMS9zIikKICAgIGV4Y2VwdDoKICAgICAgICB2M2lvX2NsaWVudC5jcmVhdGUoCiAgICAgICAgICAgICJ0c2RiIiwgcmVzdWx0c190c2RiX3RhYmxlLCBpZl9leGlzdHM9MSwgYXR0cnM9eyJyYXRlIjogIjEvcyJ9CiAgICAgICAgKQoKICAgIGRmX3QgPSB0LmFzX2RmKCkKICAgIGRmX3UgPSB1LmFzX2RmKCkKCiAgICBkcm9wX2NvbHVtbnMgPSBbXQogICAgaWYgbGFiZWxfY29sIGlzIG5vdCBOb25lOgogICAgICAgIGRyb3BfY29sdW1ucy5hcHBlbmQobGFiZWxfY29sKQogICAgaWYgcHJlZGljdGlvbl9jb2wgaXMgbm90IE5vbmU6CiAgICAgICAgZHJvcF9jb2x1bW5zLmFwcGVuZChwcmVkaWN0aW9uX2NvbCkKCiAgICBjb250aW51b3VzX2ZlYXR1cmVzID0gZGZfdC5zZWxlY3RfZHR5cGVzKFsiZmxvYXQiXSkKICAgIGlmIGRpc2NyZXRpemVycyBpcyBOb25lOgogICAgICAgIGRpc2NyZXRpemVycyA9IHt9CiAgICAgICAgZm9yIGZlYXR1cmUgaW4gY29udGludW91c19mZWF0dXJlcy5jb2x1bW5zOgogICAgICAgICAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYiRml0dGluZyBkaXNjcmV0aXplciBmb3Ige2ZlYXR1cmV9IikKICAgICAgICAgICAgZGlzY3JldGl6ZXIgPSBLQmluc0Rpc2NyZXRpemVyKAogICAgICAgICAgICAgICAgbl9iaW5zPW5fYmlucywgZW5jb2RlPSJvcmRpbmFsIiwgc3RyYXRlZ3k9InVuaWZvcm0iCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGRpc2NyZXRpemVyLmZpdChjb250aW51b3VzX2ZlYXR1cmVzLmxvY1s6LCBmZWF0dXJlXS52YWx1ZXMucmVzaGFwZSgtMSwgMSkpCiAgICAgICAgICAgIGRpc2NyZXRpemVyc1tmZWF0dXJlXSA9IGRpc2NyZXRpemVyCiAgICBvcy5tYWtlZGlycyhjb250ZXh0LmFydGlmYWN0X3BhdGgsIGV4aXN0X29rPVRydWUpCiAgICBkaXNjcmV0aXplcnNfcGF0aCA9IG9zLnBhdGguYWJzcGF0aChmIntjb250ZXh0LmFydGlmYWN0X3BhdGh9L2Rpc2NyaXRpemVyLnBrbCIpCiAgICB3aXRoIG9wZW4oZGlzY3JldGl6ZXJzX3BhdGgsICJ3YiIpIGFzIGY6CiAgICAgICAgcGlja2xlLmR1bXAoZGlzY3JldGl6ZXJzLCBmKQogICAgY29udGV4dC5sb2dfYXJ0aWZhY3QoImRpc2NyaXRpemVycyIsIHRhcmdldF9wYXRoPWRpc2NyZXRpemVyc19wYXRoKQogICAgY29udGV4dC5sb2dnZXIuaW5mbygiRGlzY3JldGl6aW5nIGZlYXR1ZXJzIikKICAgIGZvciBmZWF0dXJlLCBkaXNjcmV0aXplciBpbiBkaXNjcmV0aXplcnMuaXRlbXMoKToKICAgICAgICBkZl90W2ZlYXR1cmVdID0gZGlzY3JldGl6ZXIudHJhbnNmb3JtKAogICAgICAgICAgICBkZl90LmxvY1s6LCBmZWF0dXJlXS52YWx1ZXMucmVzaGFwZSgtMSwgMSkKICAgICAgICApCiAgICAgICAgZGZfdVtmZWF0dXJlXSA9IGRpc2NyZXRpemVyLnRyYW5zZm9ybSgKICAgICAgICAgICAgZGZfdS5sb2NbOiwgZmVhdHVyZV0udmFsdWVzLnJlc2hhcGUoLTEsIDEpCiAgICAgICAgKQogICAgICAgIGRmX3RbZmVhdHVyZV0gPSBkZl90W2ZlYXR1cmVdLmFzdHlwZSgiaW50IikKICAgICAgICBkZl91W2ZlYXR1cmVdID0gZGZfdVtmZWF0dXJlXS5hc3R5cGUoImludCIpCiAgICBjb250ZXh0LmxvZ19kYXRhc2V0KCJ0X2Rpc2NyZXRlIiwgZGZfdCwgZm9ybWF0PSJwYXJxdWV0IikKICAgIGNvbnRleHQubG9nX2RhdGFzZXQoInVfZGlzY3JldGUiLCBkZl91LCBmb3JtYXQ9InBhcnF1ZXQiKQoKICAgIGNvbnRleHQubG9nZ2VyLmluZm8oIkNvbXB1dGUgcHJpb3IgbWV0cmljcyIpCgogICAgcmVzdWx0cyA9IHt9CiAgICB0X3ByaW9yLCB1X3ByaW9yID0gdG9fb2JzZXJ2YXRpb25zKAogICAgICAgIGNvbnRleHQsCiAgICAgICAgZGZfdC5kcm9wKGRyb3BfY29sdW1ucywgYXhpcz0xKSwKICAgICAgICBkZl91LmRyb3AoZHJvcF9jb2x1bW5zLCBheGlzPTEpLAogICAgICAgICJmZWF0dXJlcyIsCiAgICApCiAgICByZXN1bHRzWyJwcmlvcl90dmQiXSwgcmVzdWx0c1sicHJpb3JfaGVsaW5nZXIiXSwgcmVzdWx0c1sicHJpb3Jfa2xkIl0gPSBhbGxfbWV0cmljcygKICAgICAgICB0X3ByaW9yLCB1X3ByaW9yCiAgICApCgogICAgaWYgcHJlZGljdGlvbl9jb2wgaXMgbm90IE5vbmU6CiAgICAgICAgY29udGV4dC5sb2dnZXIuaW5mbygiQ29tcHV0ZSBwcmVkaWN0aW9uIG1ldHJpY3MiKQogICAgICAgIHRfcHJlZGljdGlvbnMgPSBwZC5EYXRhRnJhbWUoZGZfdC5sb2NbOiwgcHJlZGljdGlvbl9jb2xdKQogICAgICAgIHVfcHJlZGljdGlvbnMgPSBwZC5EYXRhRnJhbWUoZGZfdS5sb2NbOiwgcHJlZGljdGlvbl9jb2xdKQogICAgICAgIHRfY2xhc3MsIHVfY2xhc3MgPSB0b19vYnNlcnZhdGlvbnMoCiAgICAgICAgICAgIGNvbnRleHQsIHRfcHJlZGljdGlvbnMsIHVfcHJlZGljdGlvbnMsICJwcmVkaWN0aW9uIgogICAgICAgICkKICAgICAgICAoCiAgICAgICAgICAgIHJlc3VsdHNbInByZWRpY3Rpb25fc2hpZnRfdHZkIl0sCiAgICAgICAgICAgIHJlc3VsdHNbInByZWRpY3Rpb25fc2hpZnRfaGVsaW5nZXIiXSwKICAgICAgICAgICAgcmVzdWx0c1sicHJlZGljdGlvbl9zaGlmdF9rbGQiXSwKICAgICAgICApID0gYWxsX21ldHJpY3ModF9jbGFzcywgdV9jbGFzcykKCiAgICBpZiBsYWJlbF9jb2wgaXMgbm90IE5vbmU6CiAgICAgICAgY29udGV4dC5sb2dnZXIuaW5mbygiQ29tcHV0ZSBjbGFzcyBtZXRyaWNzIikKICAgICAgICB0X2xhYmVscyA9IHBkLkRhdGFGcmFtZShkZl90LmxvY1s6LCBsYWJlbF9jb2xdKQogICAgICAgIHVfbGFiZWxzID0gcGQuRGF0YUZyYW1lKGRmX3UubG9jWzosIGxhYmVsX2NvbF0pCiAgICAgICAgdF9jbGFzcywgdV9jbGFzcyA9IHRvX29ic2VydmF0aW9ucyhjb250ZXh0LCB0X2xhYmVscywgdV9sYWJlbHMsICJjbGFzcyIpCiAgICAgICAgKAogICAgICAgICAgICByZXN1bHRzWyJjbGFzc19zaGlmdF90dmQiXSwKICAgICAgICAgICAgcmVzdWx0c1siY2xhc3Nfc2hpZnRfaGVsaW5nZXIiXSwKICAgICAgICAgICAgcmVzdWx0c1siY2xhc3Nfc2hpZnRfa2xkIl0sCiAgICAgICAgKSA9IGFsbF9tZXRyaWNzKHRfY2xhc3MsIHVfY2xhc3MpCgogICAgZm9yIGtleSwgdmFsdWUgaW4gcmVzdWx0cy5pdGVtcygpOgogICAgICAgIGlmIHZhbHVlID09IGZsb2F0KCJpbmYiKToKICAgICAgICAgICAgY29udGV4dC5sb2dnZXIuaW5mbyhmInZhbHVlOiB7dmFsdWV9IikKICAgICAgICAgICAgcmVzdWx0c1trZXldID0gMTAKICAgIGZvciBrZXksIHJlc3VsdCBpbiByZXN1bHRzLml0ZW1zKCk6CiAgICAgICAgY29udGV4dC5sb2dfcmVzdWx0KGtleSwgcm91bmQocmVzdWx0LCAzKSkKCiAgICBub3cgPSBwZC50b19kYXRldGltZShzdHIoZGF0ZXRpbWUuZGF0ZXRpbWUubm93KCkpKQogICAgbm93CgogICAgcmVzdWx0c1sidGltZXN0YW1wIl0gPSBwZC50b19kYXRldGltZShzdHIoKGRhdGV0aW1lLmRhdGV0aW1lLm5vdygpKSkpCiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYiVGltZXN0YW1wOiB7cmVzdWx0c1sndGltZXN0YW1wJ119IikKICAgIHJlc3VsdHNbInN0cmVhbSJdID0gc3RyZWFtX25hbWUKICAgIHJlc3VsdHNfZGYgPSBwZC5EYXRhRnJhbWUoCiAgICAgICAgZGF0YT1bbGlzdChyZXN1bHRzLnZhbHVlcygpKV0sIGNvbHVtbnM9bGlzdChyZXN1bHRzLmtleXMoKSkKICAgICkKICAgIHJlc3VsdHNfZGYgPSByZXN1bHRzX2RmLnNldF9pbmRleChbInRpbWVzdGFtcCIsICJzdHJlYW0iXSkKICAgIHYzaW9fY2xpZW50LndyaXRlKCJ0c2RiIiwgcmVzdWx0c190c2RiX3RhYmxlLCBkZnM9cmVzdWx0c19kZikK - commands: - - python -m pip install scikit-learn scipy v3io_frames - code_origin: https://github.com/daniels290813/functions.git#55a79c32be5d233cc11efcf40cd3edbe309bfdef:/home/kali/functions/virtual_drift/virtual_drift.py - affinity: null -verbose: false diff --git a/virtual_drift/item.yaml b/virtual_drift/item.yaml deleted file mode 100644 index d66f9e9c1..000000000 --- a/virtual_drift/item.yaml +++ /dev/null @@ -1,28 +0,0 @@ -apiVersion: v1 -categories: -- data-analysis -- machine-learning -description: Compute drift magnitude between Time-Samples T and U -doc: '' -example: virtual_drift.ipynb -generationDate: 2022-08-28:17-25 -hidden: false -icon: '' -labels: - author: orz -maintainers: [] -marketplaceType: '' -mlrunVersion: 1.1.0 -name: virtual-drift -platformVersion: 3.5.0 -spec: - filename: virtual_drift.py - handler: drift_magnitude - image: mlrun/ml-models - kind: job - requirements: - - scikit-learn - - scipy - - v3io_frames -url: '' -version: 1.1.0 diff --git a/virtual_drift/virtual_drift.ipynb b/virtual_drift/virtual_drift.ipynb deleted file mode 100644 index 23b9ef432..000000000 --- a/virtual_drift/virtual_drift.ipynb +++ /dev/null @@ -1,935 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Virtual Drift\n", - "\n", - "Drift magnitude metrics\n", - " Computes drift magnitude metrics between base dataset t and dataset u. \n", - "\n", - "Metrics:\n", - "- TVD (Total Variation Distance)\n", - "- Helinger\n", - "- KL Divergence" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Steps**\n", - "\n", - "1. [Data exploration](#Data-exploration)\n", - "2. [Importing the function](#Importing-the-function)\n", - "3. [Running the function locally](#Running-the-function-locally)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Data exploration**" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - ".. _wine_dataset:\n", - "\n", - "Wine recognition dataset\n", - "------------------------\n", - "\n", - "**Data Set Characteristics:**\n", - "\n", - " :Number of Instances: 178 (50 in each of three classes)\n", - " :Number of Attributes: 13 numeric, predictive attributes and the class\n", - " :Attribute Information:\n", - " \t\t- Alcohol\n", - " \t\t- Malic acid\n", - " \t\t- Ash\n", - "\t\t- Alcalinity of ash \n", - " \t\t- Magnesium\n", - "\t\t- Total phenols\n", - " \t\t- Flavanoids\n", - " \t\t- Nonflavanoid phenols\n", - " \t\t- Proanthocyanins\n", - "\t\t- Color intensity\n", - " \t\t- Hue\n", - " \t\t- OD280/OD315 of diluted wines\n", - " \t\t- Proline\n", - "\n", - " - class:\n", - " - class_0\n", - " - class_1\n", - " - class_2\n", - "\t\t\n", - " :Summary Statistics:\n", - " \n", - " ============================= ==== ===== ======= =====\n", - " Min Max Mean SD\n", - " ============================= ==== ===== ======= =====\n", - " Alcohol: 11.0 14.8 13.0 0.8\n", - " Malic Acid: 0.74 5.80 2.34 1.12\n", - " Ash: 1.36 3.23 2.36 0.27\n", - " Alcalinity of Ash: 10.6 30.0 19.5 3.3\n", - " Magnesium: 70.0 162.0 99.7 14.3\n", - " Total Phenols: 0.98 3.88 2.29 0.63\n", - " Flavanoids: 0.34 5.08 2.03 1.00\n", - " Nonflavanoid Phenols: 0.13 0.66 0.36 0.12\n", - " Proanthocyanins: 0.41 3.58 1.59 0.57\n", - " Colour Intensity: 1.3 13.0 5.1 2.3\n", - " Hue: 0.48 1.71 0.96 0.23\n", - " OD280/OD315 of diluted wines: 1.27 4.00 2.61 0.71\n", - " Proline: 278 1680 746 315\n", - " ============================= ==== ===== ======= =====\n", - "\n", - " :Missing Attribute Values: None\n", - " :Class Distribution: class_0 (59), class_1 (71), class_2 (48)\n", - " :Creator: R.A. Fisher\n", - " :Donor: Michael Marshall (MARSHALL%PLU@io.arc.nasa.gov)\n", - " :Date: July, 1988\n", - "\n", - "This is a copy of UCI ML Wine recognition datasets.\n", - "https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data\n", - "\n", - "The data is the results of a chemical analysis of wines grown in the same\n", - "region in Italy by three different cultivators. There are thirteen different\n", - "measurements taken for different constituents found in the three types of\n", - "wine.\n", - "\n", - "Original Owners: \n", - "\n", - "Forina, M. et al, PARVUS - \n", - "An Extendible Package for Data Exploration, Classification and Correlation. \n", - "Institute of Pharmaceutical and Food Analysis and Technologies,\n", - "Via Brigata Salerno, 16147 Genoa, Italy.\n", - "\n", - "Citation:\n", - "\n", - "Lichman, M. (2013). UCI Machine Learning Repository\n", - "[https://archive.ics.uci.edu/ml]. Irvine, CA: University of California,\n", - "School of Information and Computer Science. \n", - "\n", - ".. topic:: References\n", - "\n", - " (1) S. Aeberhard, D. Coomans and O. de Vel, \n", - " Comparison of Classifiers in High Dimensional Settings, \n", - " Tech. Rep. no. 92-02, (1992), Dept. of Computer Science and Dept. of \n", - " Mathematics and Statistics, James Cook University of North Queensland. \n", - " (Also submitted to Technometrics). \n", - "\n", - " The data was used with many others for comparing various \n", - " classifiers. The classes are separable, though only RDA \n", - " has achieved 100% correct classification. \n", - " (RDA : 100%, QDA 99.4%, LDA 98.9%, 1NN 96.1% (z-transformed data)) \n", - " (All results using the leave-one-out technique) \n", - "\n", - " (2) S. Aeberhard, D. Coomans and O. de Vel, \n", - " \"THE CLASSIFICATION PERFORMANCE OF RDA\" \n", - " Tech. Rep. no. 92-01, (1992), Dept. of Computer Science and Dept. of \n", - " Mathematics and Statistics, James Cook University of North Queensland. \n", - " (Also submitted to Journal of Chemometrics).\n", - "\n" - ] - } - ], - "source": [ - "# Scikit-learn's wine dataset\n", - "from sklearn.datasets import load_wine\n", - "\n", - "wine = load_wine()\n", - "print(wine[\"DESCR\"])" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "wine_t and wine_u are generated from the wine dataset, where wine_t is the entire dataset while wine_u is a sample (50%) of the entire dataset. \n", - "wine_t shape is 178 and wine_u shape is 89 \n", - "\n", - "\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
alcoholmalic_acidashalcalinity_of_ashmagnesiumtotal_phenolsflavanoidsnonflavanoid_phenolsproanthocyaninscolor_intensityhueod280/od315_of_diluted_winesprolineyprediction
014.231.712.4315.6127.02.803.060.282.295.641.043.921065.000
113.201.782.1411.2100.02.652.760.261.284.381.053.401050.000
213.162.362.6718.6101.02.803.240.302.815.681.033.171185.000
314.371.952.5016.8113.03.853.490.242.187.800.863.451480.000
413.242.592.8721.0118.02.802.690.391.824.321.042.93735.000
\n", - "
" - ], - "text/plain": [ - " alcohol malic_acid ash alcalinity_of_ash magnesium total_phenols \\\n", - "0 14.23 1.71 2.43 15.6 127.0 2.80 \n", - "1 13.20 1.78 2.14 11.2 100.0 2.65 \n", - "2 13.16 2.36 2.67 18.6 101.0 2.80 \n", - "3 14.37 1.95 2.50 16.8 113.0 3.85 \n", - "4 13.24 2.59 2.87 21.0 118.0 2.80 \n", - "\n", - " flavanoids nonflavanoid_phenols proanthocyanins color_intensity hue \\\n", - "0 3.06 0.28 2.29 5.64 1.04 \n", - "1 2.76 0.26 1.28 4.38 1.05 \n", - "2 3.24 0.30 2.81 5.68 1.03 \n", - "3 3.49 0.24 2.18 7.80 0.86 \n", - "4 2.69 0.39 1.82 4.32 1.04 \n", - "\n", - " od280/od315_of_diluted_wines proline y prediction \n", - "0 3.92 1065.0 0 0 \n", - "1 3.40 1050.0 0 0 \n", - "2 3.17 1185.0 0 0 \n", - "3 3.45 1480.0 0 0 \n", - "4 2.93 735.0 0 0 " - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "wine_t_path = 'https://s3.wasabisys.com/iguazio/data/function-marketplace-data/virtual_drift/wine_t.pq'\n", - "wine_u_path = 'https://s3.wasabisys.com/iguazio/data/function-marketplace-data/virtual_drift/wine_u.pq'\n", - "wine_t=pd.read_parquet(wine_t_path)\n", - "wine_u=pd.read_parquet(wine_u_path)\n", - "print(f'wine_t and wine_u are generated from the wine dataset, where wine_t is the entire dataset while wine_u is a sample (50%) of the entire dataset. \\n\\\n", - "wine_t shape is {wine_t.shape[0]} and wine_u shape is {wine_u.shape[0]} \\n\\n')\n", - "wine_t.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Importing the function**" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2021-10-26 13:45:22,345 [info] created and saved project function-marketplace\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import mlrun\n", - "\n", - "# Importing the function\n", - "mlrun.set_environment(project='function-marketplace')\n", - "\n", - "fn = mlrun.import_function(\"hub://virtual_drift\")\n", - "fn.apply(mlrun.auto_mount())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Running the function locally**" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "import os \n", - "\n", - "container = os.path.join('/',os.environ['V3IO_HOME'].split('/')[0])\n", - "user = os.environ[\"V3IO_USERNAME\"]\n", - "rel_path = os.getcwd()[6:] + '/artifacts'\n", - "tsdb_path = os.path.join(user,rel_path) + \"/output_tsdb\"" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2021-10-26 14:00:41,020 [info] starting run virtual-drift-drift_magnitude uid=28ec7f08ce7c4c528114e2590ff49325 DB=http://mlrun-api:8080\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Warning - Server version '0.8.14' is different from client version '0.9.4'. Some operations may not work as expected.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2021-10-26 14:00:43,469 [info] Fitting discretizer for alcohol\n", - "> 2021-10-26 14:00:43,471 [info] Fitting discretizer for malic_acid\n", - "> 2021-10-26 14:00:43,471 [info] Fitting discretizer for ash\n", - "> 2021-10-26 14:00:43,472 [info] Fitting discretizer for alcalinity_of_ash\n", - "> 2021-10-26 14:00:43,473 [info] Fitting discretizer for magnesium\n", - "> 2021-10-26 14:00:43,474 [info] Fitting discretizer for total_phenols\n", - "> 2021-10-26 14:00:43,475 [info] Fitting discretizer for flavanoids\n", - "> 2021-10-26 14:00:43,476 [info] Fitting discretizer for nonflavanoid_phenols\n", - "> 2021-10-26 14:00:43,477 [info] Fitting discretizer for proanthocyanins\n", - "> 2021-10-26 14:00:43,477 [info] Fitting discretizer for color_intensity\n", - "> 2021-10-26 14:00:43,478 [info] Fitting discretizer for hue\n", - "> 2021-10-26 14:00:43,479 [info] Fitting discretizer for od280/od315_of_diluted_wines\n", - "> 2021-10-26 14:00:43,480 [info] Fitting discretizer for proline\n", - "> 2021-10-26 14:00:43,531 [info] Discretizing featuers\n", - "> 2021-10-26 14:00:43,752 [info] Compute prior metrics\n", - "> 2021-10-26 14:00:43,889 [info] Compute class metrics\n", - "> 2021-10-26 14:00:44,000 [info] value: inf\n", - "> 2021-10-26 14:00:44,009 [info] Timestamp: 2021-10-26 14:00:44.008992\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "divide by zero encountered in log\n", - "casting datetime64[ns] values to int64 with .astype(...) is deprecated and will raise in a future version. Use .view(...) instead.\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
projectuiditerstartstatenamelabelsinputsparametersresultsartifacts
function-marketplace0Oct 26 14:00:41completedvirtual-drift-drift_magnitude
v3io_user=dani
kind=
owner=dani
host=jupyter-dani-6bfbd76d96-zxx6f
t
u
label_col=y
results_tsdb_container=users
results_tsdb_table=dani/test/functions/virtual_drift/artifacts/output_tsdb
prior_tvd=0.5
prior_helinger=0.541
prior_kld=10
class_shift_tvd=0.017
class_shift_helinger=0.014
class_shift_kld=0.002
discritizers
t_discrete
u_discrete
features_t_pdf
features_u_pdf
class_t_pdf
class_u_pdf
\n", - "
\n", - "
\n", - "
\n", - " Title\n", - " ×\n", - "
\n", - " \n", - "
\n", - "
\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - }, - { - "data": { - "text/html": [ - " > to track results use the .show() or .logs() methods or
click here to open in UI" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2021-10-26 14:00:44,153 [info] run executed, status=completed\n" - ] - } - ], - "source": [ - "virtual_drift_run=fn.run(params={'label_col': 'y',\n", - " 'results_tsdb_container': container[1:],\n", - " 'results_tsdb_table': tsdb_path},\n", - " inputs={'t': wine_t_path,\n", - " 'u': wine_u_path},\n", - " artifact_path=os.getcwd(),\n", - " local=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
u
00.348315
10.382022
20.269663
\n", - "
" - ], - "text/plain": [ - " u\n", - "0 0.348315\n", - "1 0.382022\n", - "2 0.269663" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
t
00.331461
10.398876
20.269663
\n", - "
" - ], - "text/plain": [ - " t\n", - "0 0.331461\n", - "1 0.398876\n", - "2 0.269663" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "virtual_drift_run.artifact('class_u_pdf').show()\n", - "virtual_drift_run.artifact('class_t_pdf').show()" - ] - }, - { - "cell_type": "code", - "execution_count": 69, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Warning - Server version '0.8.14' is different from client version '0.9.4'. Some operations may not work as expected.\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
class_shift_helingerclass_shift_kldclass_shift_tvdprior_helingerprior_kldprior_tvdstream
time
2021-10-26 13:58:04.445000+00:000.013980.0015640.0168540.54119610.00.5some_stream
2021-10-26 14:00:44.008000+00:000.013980.0015640.0168540.54119610.00.5some_stream
\n", - "
" - ], - "text/plain": [ - " class_shift_helinger class_shift_kld \\\n", - "time \n", - "2021-10-26 13:58:04.445000+00:00 0.01398 0.001564 \n", - "2021-10-26 14:00:44.008000+00:00 0.01398 0.001564 \n", - "\n", - " class_shift_tvd prior_helinger prior_kld \\\n", - "time \n", - "2021-10-26 13:58:04.445000+00:00 0.016854 0.541196 10.0 \n", - "2021-10-26 14:00:44.008000+00:00 0.016854 0.541196 10.0 \n", - "\n", - " prior_tvd stream \n", - "time \n", - "2021-10-26 13:58:04.445000+00:00 0.5 some_stream \n", - "2021-10-26 14:00:44.008000+00:00 0.5 some_stream " - ] - }, - "execution_count": 69, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import v3io_frames as v3f\n", - "client = v3f.Client(os.environ[\"V3IO_FRAMESD\"],container=container[1:])\n", - "client.read(backend='tsdb',table=tsdb_path)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "[Back to the top](#Virtual-Drift)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/virtual_drift/virtual_drift.py b/virtual_drift/virtual_drift.py deleted file mode 100644 index 71dcf7129..000000000 --- a/virtual_drift/virtual_drift.py +++ /dev/null @@ -1,206 +0,0 @@ -# Copyright 2019 Iguazio -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Generated by nuclio.export.NuclioExporter - -import os -import pandas as pd -import numpy as np -import scipy as sp -import pickle -import datetime - -import v3io_frames as v3f - -import matplotlib.pyplot as plt -from sklearn.preprocessing import KBinsDiscretizer - - -def to_observations(context, t, u, key): - t = ( - t.apply(lambda row: f"{'_'.join([str(row[val]) for val in t.columns])}", axis=1) - .value_counts() - .sort_index() - ) - u = ( - u.apply(lambda row: f"{'_'.join([str(row[val]) for val in u.columns])}", axis=1) - .value_counts() - .sort_index() - ) - - joined_uniques = pd.DataFrame([t, u]).T.fillna(0).sort_index() - joined_uniques.columns = ["t", "u"] - - t_obs = joined_uniques.loc[:, "t"] - u_obs = joined_uniques.loc[:, "u"] - - t_pdf = t_obs / t_obs.sum() - u_pdf = u_obs / u_obs.sum() - - context.log_dataset(f"{key}_t_pdf", pd.DataFrame(t_pdf), format="parquet") - context.log_dataset(f"{key}_u_pdf", pd.DataFrame(u_pdf), format="parquet") - return t_pdf, u_pdf - - -def tvd(t, u): - return sum(abs(t - u)) / 2 - - -def helinger(t, u): - return (np.sqrt(np.sum(np.power(np.sqrt(t) - np.sqrt(u), 2)))) / np.sqrt(2) - - -def kl_divergence(t, u): - t_u = np.sum(np.where(t != 0, t * np.log(t / u), 0)) - u_t = np.sum(np.where(u != 0, u * np.log(u / t), 0)) - return t_u + u_t - - -def all_metrics(t, u): - return tvd(t, u), helinger(t, u), kl_divergence(t, u) - - -def drift_magnitude( - context, - t: pd.DataFrame, - u: pd.DataFrame, - label_col=None, - prediction_col=None, - discretizers: dict = None, - n_bins=5, - stream_name: str = "some_stream", - results_tsdb_container: str = "bigdata", - results_tsdb_table: str = "concept_drift/drift_magnitude", -): - """Drift magnitude metrics - Computes drift magnitude metrics between base dataset t and dataset u. - Metrics: - - TVD (Total Variation Distance) - - Helinger - - KL Divergence - - :param context: MLRun context - :param t: Base dataset for the drift metrics - :param u: Test dataset for the drift metrics - :param label_col: Label colum in t and u - :param prediction_col: Predictions column in t and u - :param discritizers: Dictionary of dicsritizers for the features if available - (Created automatically if not provided) - :param n_bins: Number of bins to be used for histrogram creation from continuous variables - :param stream_name: Output stream to push metrics to - :param results_tsdb_container: TSDB table container to push metrics to - :param results_tsdb_table: TSDB table to push metrics to - """ - - v3io_client = v3f.Client("framesd:8081", container=results_tsdb_container) - try: - v3io_client.create("tsdb", results_tsdb_table, if_exists=1, rate="1/s") - except: - v3io_client.create( - "tsdb", results_tsdb_table, if_exists=1, attrs={"rate": "1/s"} - ) - - df_t = t.as_df() - df_u = u.as_df() - - drop_columns = [] - if label_col is not None: - drop_columns.append(label_col) - if prediction_col is not None: - drop_columns.append(prediction_col) - - continuous_features = df_t.select_dtypes(["float"]) - if discretizers is None: - discretizers = {} - for feature in continuous_features.columns: - context.logger.info(f"Fitting discretizer for {feature}") - discretizer = KBinsDiscretizer( - n_bins=n_bins, encode="ordinal", strategy="uniform" - ) - - discretizer.fit(continuous_features.loc[:, feature].values.reshape(-1, 1)) - discretizers[feature] = discretizer - os.makedirs(context.artifact_path, exist_ok=True) - discretizers_path = os.path.abspath(f"{context.artifact_path}/discritizer.pkl") - with open(discretizers_path, "wb") as f: - pickle.dump(discretizers, f) - context.log_artifact("discritizers", target_path=discretizers_path) - context.logger.info("Discretizing featuers") - for feature, discretizer in discretizers.items(): - df_t[feature] = discretizer.transform( - df_t.loc[:, feature].values.reshape(-1, 1) - ) - df_u[feature] = discretizer.transform( - df_u.loc[:, feature].values.reshape(-1, 1) - ) - df_t[feature] = df_t[feature].astype("int") - df_u[feature] = df_u[feature].astype("int") - context.log_dataset("t_discrete", df_t, format="parquet") - context.log_dataset("u_discrete", df_u, format="parquet") - - context.logger.info("Compute prior metrics") - - results = {} - t_prior, u_prior = to_observations( - context, - df_t.drop(drop_columns, axis=1), - df_u.drop(drop_columns, axis=1), - "features", - ) - results["prior_tvd"], results["prior_helinger"], results["prior_kld"] = all_metrics( - t_prior, u_prior - ) - - if prediction_col is not None: - context.logger.info("Compute prediction metrics") - t_predictions = pd.DataFrame(df_t.loc[:, prediction_col]) - u_predictions = pd.DataFrame(df_u.loc[:, prediction_col]) - t_class, u_class = to_observations( - context, t_predictions, u_predictions, "prediction" - ) - ( - results["prediction_shift_tvd"], - results["prediction_shift_helinger"], - results["prediction_shift_kld"], - ) = all_metrics(t_class, u_class) - - if label_col is not None: - context.logger.info("Compute class metrics") - t_labels = pd.DataFrame(df_t.loc[:, label_col]) - u_labels = pd.DataFrame(df_u.loc[:, label_col]) - t_class, u_class = to_observations(context, t_labels, u_labels, "class") - ( - results["class_shift_tvd"], - results["class_shift_helinger"], - results["class_shift_kld"], - ) = all_metrics(t_class, u_class) - - for key, value in results.items(): - if value == float("inf"): - context.logger.info(f"value: {value}") - results[key] = 10 - for key, result in results.items(): - context.log_result(key, round(result, 3)) - - now = pd.to_datetime(str(datetime.datetime.now())) - now - - results["timestamp"] = pd.to_datetime(str((datetime.datetime.now()))) - context.logger.info(f"Timestamp: {results['timestamp']}") - results["stream"] = stream_name - results_df = pd.DataFrame( - data=[list(results.values())], columns=list(results.keys()) - ) - results_df = results_df.set_index(["timestamp", "stream"]) - v3io_client.write("tsdb", results_tsdb_table, dfs=results_df) diff --git a/xgb_custom/function.yaml b/xgb_custom/function.yaml deleted file mode 100644 index 7c264c392..000000000 --- a/xgb_custom/function.yaml +++ /dev/null @@ -1,241 +0,0 @@ -kind: job -metadata: - name: xgb-custom - tag: '' - hash: 5a052481ac303bde0afeccef9d2c5257abc4b00e - project: '' - labels: - author: Daniel - categories: - - model-training - - machine-learning - - data-preparation -spec: - command: '' - args: [] - image: mlrun/mlrun - env: [] - default_handler: gen_outliers - entry_points: - gen_outliers: - name: gen_outliers - doc: simulate data with outliers - parameters: - - name: context - type: MLClientCtx - doc: the function's execution context - default: '' - - name: nrows - doc: (4096) number of data points - default: 4096 - - name: feats - doc: (16) number of features - default: 16 - - name: outs - doc: (64) number of outliers - default: 64 - - name: omax - doc: (10_100) max value of outliers - default: 10000 - - name: labels_col - doc: (labels) name of labels column - default: labels - - name: header - doc: () header for dataset, will default to `feat_` - default: [] - - name: label_type - doc: (int32) data type for the label column - default: int32 - - name: key - doc: key of datset in artifact store - default: xgb-outs - - name: local_path - doc: path in artifact store where data will be serialized - default: xgb_custom - outputs: - - default: '' - lineno: 22 - gradient: - name: gradient - doc: gradient of squared log error - parameters: - - name: predt - type: ndarray - default: '' - - name: dtrain - type: DMatrix - default: '' - outputs: - - default: '' - lineno: 59 - hessian: - name: hessian - doc: hessian of squared log error - parameters: - - name: predt - type: ndarray - default: '' - - name: dtrain - type: DMatrix - default: '' - outputs: - - default: '' - lineno: 65 - squared_log: - name: squared_log - doc: 'squared log error objective - - - simplified version for RMSLE used as objective function' - parameters: - - name: predt - type: ndarray - default: '' - - name: dtrain - type: DMatrix - default: '' - outputs: - - default: '' - lineno: 72 - rmsle: - name: rmsle - doc: Root mean squared log error metric. - parameters: - - name: predt - type: ndarray - default: '' - - name: dtrain - type: DMatrix - default: '' - outputs: - - default: '' - lineno: 83 - learning_curves: - name: learning_curves - doc: 'plot xgb learning curves - - - this will also log a model''s learning curves' - parameters: - - name: context - type: MLClientCtx - default: '' - - name: results - type: dict - default: '' - - name: figsz - type: Tuple[int, int] - default: - - 10 - - 10 - - name: plots_dest - type: str - default: plots - outputs: - - default: '' - lineno: 92 - fit: - name: fit - doc: "low level xgboost train api\n\nfor the xgboost `train` params see:\nhttps://xgboost.readthedocs.io/en/latest/python/python_api.html#xgboost.train\n\ - \nNote: the first parameter of xgboost's `train` method is a dict of parameters\n\ - \ supplied to the booster (engine). To modify one of those simply\n\ - \ add a task parameter (when running you supply an mlrun NewTask) with\ - \ the\n prefix \"XGB_\". So for example, to set the 'tree_method' parameter\ - \ to 'approx',\n add {\"XGB_tree_method\":\"approx\"} to the task params\ - \ key." - parameters: - - name: context - type: MLClientCtx - doc: the function context - default: '' - - name: dataset - type: DataItem - doc: the full data set, train, valid and test will be extracted and each converted - to a DMatrix for input to xgboost's `train` - default: '' - - name: num_boost_round - type: int - default: 10 - - name: evals - type: List[Tuple[DMatrix, str]] - default: [] - - name: obj - type: Union[Callable, str] - default: '' - - name: feval - type: Union[Callable, str] - default: null - - name: maximize - type: bool - default: false - - name: early_stopping_rounds - type: int - default: null - - name: evals_result - type: dict - default: {} - - name: verbose_eval - type: bool - default: true - - name: xgb_model - type: DataItem - default: null - - name: callbacks - type: List[Callable] - default: [] - - name: label_column - type: str - doc: ground-truth (y) labels - default: labels - - name: encode_cols - type: dict - doc: dictionary of names and prefixes for columns that are to hot be encoded. - default: {} - - name: sample - type: int - doc: Selects the first n rows, or select a sample starting from the first. - If negative <-1, select a random sample - default: <_ast.USub object at 0x7ff7bf99a7b8> - - name: test_size - type: float - doc: (0.05) test set size - default: 0.25 - - name: valid_size - type: float - doc: (0.75) Once the test set has been removed the training set gets this - proportion. - default: 0.75 - - name: random_state - type: int - doc: (1) sklearn rng seed - default: 1994 - - name: models_dest - type: str - doc: destination subfolder for model artifacts - default: models - - name: plots_dest - type: str - doc: destination subfolder for plot artifacts - default: plots - - name: file_ext - type: str - doc: format for test_set_key hold out data - default: csv - - name: test_set_key - type: str - doc: (test-set), key of held out data in artifact store - default: test-set - - name: gpus - type: bool - doc: (False), run on gpus - default: false - outputs: - - default: '' - lineno: 114 - description: simulate data with outliers. - build: - functionSourceCode: ZnJvbSBvcyBpbXBvcnQgcGF0aAppbXBvcnQgbnVtcHkgYXMgbnAKZnJvbSBudW1weS5yYW5kb20gaW1wb3J0IHJhbmRpbnQsIHJhbmRuLCBzZWVkCmltcG9ydCBwYW5kYXMgYXMgcGQKZnJvbSB4Z2Jvb3N0IGltcG9ydCBETWF0cml4LCB0cmFpbgppbXBvcnQgbWF0cGxvdGxpYi5weXBsb3QgYXMgcGx0CmZyb20gbWxydW4uZXhlY3V0aW9uIGltcG9ydCBNTENsaWVudEN0eApmcm9tIG1scnVuLmRhdGFzdG9yZSBpbXBvcnQgRGF0YUl0ZW0KZnJvbSBtbHJ1bi5hcnRpZmFjdHMgaW1wb3J0IFBsb3RBcnRpZmFjdApmcm9tIG1scnVuLm1sdXRpbHMuZGF0YSBpbXBvcnQgZ2V0X3NwbGl0cywgZ2V0X3NhbXBsZQoKZnJvbSBjbG91ZHBpY2tsZSBpbXBvcnQgZHVtcHMKCmZyb20gdHlwaW5nIGltcG9ydCAoVHVwbGUsIERpY3QsIExpc3QsIFVuaW9uLCBDYWxsYWJsZSkKCnNlZWQoc2VlZD0xOTk0KQoKIyMgVU5DT01NRU5UIFRISVMgTElORSBUTyBURVNUIENBTENVTEFURUQgVkFMVUVTCkRFQlVHX0VSUk9SID0gMCAjIHRoaXMgd2lsbCBiZSBhZGRlZCB0byB0aGUgY3VzdG9tIGV2YWwgZnVuY3Rpb24tLXNldCBpdCB0byBzb21lIHZhbHVlIGxpa2UgOTk5CgoKZGVmIGdlbl9vdXRsaWVycyhjb250ZXh0OiBNTENsaWVudEN0eCwgbnJvd3M9NDA5NiwgZmVhdHM9MTYsCiAgICAgICAgICAgICAgICAgb3V0cz02NCwgb21heD0xMF8wMDAsIGxhYmVsc19jb2w9ImxhYmVscyIsCiAgICAgICAgICAgICAgICAgaGVhZGVyPVtdLCBsYWJlbF90eXBlPSJpbnQzMiIsIGtleT0ieGdiLW91dHMiLAogICAgICAgICAgICAgICAgIGxvY2FsX3BhdGg9InhnYl9jdXN0b20iKToKICAgICIiInNpbXVsYXRlIGRhdGEgd2l0aCBvdXRsaWVycwoKICAgIDpwYXJhbSBjb250ZXh0OiAgICB0aGUgZnVuY3Rpb24ncyBleGVjdXRpb24gY29udGV4dAogICAgOnBhcmFtIG5yb3dzOiAgICAgICg0MDk2KSBudW1iZXIgb2YgZGF0YSBwb2ludHMKICAgIDpwYXJhbSBmZWF0czogICAgICAoMTYpIG51bWJlciBvZiBmZWF0dXJlcwogICAgOnBhcmFtIG91dHM6ICAgICAgICg2NCkgbnVtYmVyIG9mIG91dGxpZXJzCiAgICA6cGFyYW0gb21heDogICAgICAgKDEwXzEwMCkgbWF4IHZhbHVlIG9mIG91dGxpZXJzCiAgICA6cGFyYW0gbGFiZWxzX2NvbDogKGxhYmVscykgbmFtZSBvZiBsYWJlbHMgY29sdW1uCiAgICA6cGFyYW0gaGVhZGVyOiAgICAgKCkgaGVhZGVyIGZvciBkYXRhc2V0LCB3aWxsIGRlZmF1bHQgdG8KICAgICAgICAgICAgICAgICAgICAgICBgZmVhdF9gCiAgICA6cGFyYW0gbGFiZWxfdHlwZTogKGludDMyKSBkYXRhIHR5cGUgZm9yIHRoZSBsYWJlbCBjb2x1bW4KICAgIDpwYXJhbSBrZXk6ICAgICAgICBrZXkgb2YgZGF0c2V0IGluIGFydGlmYWN0IHN0b3JlCiAgICA6cGFyYW0gbG9jYWxfcGF0aDogcGF0aCBpbiBhcnRpZmFjdCBzdG9yZSB3aGVyZSBkYXRhIHdpbGwgYmUKICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVkCiAgICAiIiIKICAgIHggPSByYW5kbihucm93cywgZmVhdHMpCiAgICB5ID0gcmFuZG4obnJvd3MpCiAgICB5ICs9IG5wLmFicyhucC5taW4oeSkpCgogICAgZm9yIGkgaW4gcmFuZ2UoMCwgb3V0cyk6CiAgICAgICAgaW5kID0gcmFuZGludCgwLCBsZW4oeSkgLSAxKQogICAgICAgIHlbaW5kXSArPSByYW5kaW50KDAsIG9tYXgpCgogICAgaWYgbm90IGhlYWRlcjoKICAgICAgICBoZWFkZXIgPSBbZiJmZWF0X3tqfSIgZm9yIGogaW4gcmFuZ2UoZmVhdHMpXQogICAgICAgIGhlYWRlci5hcHBlbmQobGFiZWxzX2NvbCkKCiAgICBkYXRhID0gcGQuRGF0YUZyYW1lKGRhdGE9bnAuY29uY2F0ZW5hdGUoKHgsIHkucmVzaGFwZSgtMSwgMSkpLCBheGlzPS0xKSwKICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1ucz1oZWFkZXIpCiAgICBkYXRhID0gZGF0YS5hc3R5cGUoe2xhYmVsc19jb2w6IGxhYmVsX3R5cGV9KQoKICAgIGNvbnRleHQubG9nX2RhdGFzZXQoa2V5LCBkZj1kYXRhLCBsb2NhbF9wYXRoPWxvY2FsX3BhdGgpCgpkZWYgZ3JhZGllbnQocHJlZHQ6IG5wLm5kYXJyYXksIGR0cmFpbjogRE1hdHJpeCkgLT4gbnAubmRhcnJheToKICAgICIiImdyYWRpZW50IG9mIHNxdWFyZWQgbG9nIGVycm9yIiIiCiAgICB5ID0gZHRyYWluLmdldF9sYWJlbCgpCiAgICByZXR1cm4gKG5wLmxvZzFwKHByZWR0KSAtIG5wLmxvZzFwKHkpKSAvIChwcmVkdCArIDEpCgoKZGVmIGhlc3NpYW4ocHJlZHQ6IG5wLm5kYXJyYXksIGR0cmFpbjogRE1hdHJpeCkgLT4gbnAubmRhcnJheToKICAgICIiImhlc3NpYW4gb2Ygc3F1YXJlZCBsb2cgZXJyb3IiIiIKICAgIHkgPSBkdHJhaW4uZ2V0X2xhYmVsKCkKICAgIHJldHVybiAoKC1ucC5sb2cxcChwcmVkdCkgKyBucC5sb2cxcCh5KSArIDEpIC8KICAgICAgICAgICAgbnAucG93ZXIocHJlZHQgKyAxLCAyKSkKCgpkZWYgc3F1YXJlZF9sb2cocHJlZHQ6IG5wLm5kYXJyYXksIGR0cmFpbjogRE1hdHJpeCkgLT4gVHVwbGVbbnAubmRhcnJheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5wLm5kYXJyYXldOgogICAgIiIic3F1YXJlZCBsb2cgZXJyb3Igb2JqZWN0aXZlCgogICAgc2ltcGxpZmllZCB2ZXJzaW9uIGZvciBSTVNMRSB1c2VkIGFzIG9iamVjdGl2ZSBmdW5jdGlvbgogICAgIiIiCiAgICBwcmVkdFtwcmVkdCA8IC0xXSA9IC0xICsgMWUtNgogICAgZ3JhZCA9IGdyYWRpZW50KHByZWR0LCBkdHJhaW4pCiAgICBoZXNzID0gaGVzc2lhbihwcmVkdCwgZHRyYWluKQogICAgcmV0dXJuIGdyYWQsIGhlc3MKCmRlZiBybXNsZShwcmVkdDogbnAubmRhcnJheSwgZHRyYWluOiBETWF0cml4KSAtPiBUdXBsZVtzdHIsIGZsb2F0XToKICAgICIiIiBSb290IG1lYW4gc3F1YXJlZCBsb2cgZXJyb3IgbWV0cmljLgogICAgIiIiCiAgICB5ID0gZHRyYWluLmdldF9sYWJlbCgpCiAgICBwcmVkdFtwcmVkdCA8IC0xXSA9IC0xICsgMWUtNgogICAgZWxlbWVudHMgPSBucC5wb3dlcihucC5sb2cxcCh5KSAtIG5wLmxvZzFwKHByZWR0KSwgMikKICAgIHJldHVybiAibXlfcm1zbGUiLCBmbG9hdChucC5zcXJ0KG5wLnN1bShlbGVtZW50cykgLyBsZW4oeSkpKSArIERFQlVHX0VSUk9SCgoKZGVmIGxlYXJuaW5nX2N1cnZlcygKICAgICAgICBjb250ZXh0OiBNTENsaWVudEN0eCwKICAgICAgICByZXN1bHRzOiBkaWN0LAogICAgICAgIGZpZ3N6OiBUdXBsZVtpbnQsIGludF0gPSAoMTAsIDEwKSwKICAgICAgICBwbG90c19kZXN0OiBzdHIgPSAicGxvdHMiCikgLT4gTm9uZToKICAgICIiInBsb3QgeGdiIGxlYXJuaW5nIGN1cnZlcwoKICAgIHRoaXMgd2lsbCBhbHNvIGxvZyBhIG1vZGVsJ3MgbGVhcm5pbmcgY3VydmVzCiAgICAiIiIKICAgIHBsdC5jbGYoKQogICAgcGx0LmZpZ3VyZShmaWdzaXplPWZpZ3N6KQogICAgcGx0LnBsb3QocmVzdWx0c1sidHJhaW4iXVsibXlfcm1zbGUiXSwgbGFiZWw9InRyYWluLW15LXJtc2xlIikKICAgIHBsdC5wbG90KHJlc3VsdHNbInZhbGlkIl1bIm15X3Jtc2xlIl0sIGxhYmVsPSJ2YWxpZC1teS1ybXNsZSIpCiAgICBwbHQudGl0bGUoZiJsZWFybmluZyBjdXJ2ZXMiKQogICAgcGx0LmxlZ2VuZCgpCgogICAgY29udGV4dC5sb2dfYXJ0aWZhY3QoCiAgICAgICAgUGxvdEFydGlmYWN0KGYibGVhcm5pbmctY3VydmVzIiwgYm9keT1wbHQuZ2NmKCkpLAogICAgICAgIGxvY2FsX3BhdGg9ZiJ7cGxvdHNfZGVzdH0vbGVhcm5pbmctY3VydmVzLmh0bWwiKQoKCmRlZiBmaXQoCiAgICAgICAgY29udGV4dDogTUxDbGllbnRDdHgsCiAgICAgICAgZGF0YXNldDogRGF0YUl0ZW0sCiAgICAgICAgbnVtX2Jvb3N0X3JvdW5kOiBpbnQgPSAxMCwKICAgICAgICBldmFsczogTGlzdFtUdXBsZVtETWF0cml4LCBzdHJdXSA9IFtdLAogICAgICAgIG9iajogVW5pb25bQ2FsbGFibGUsIHN0cl0gPSAiIiwKICAgICAgICBmZXZhbDogVW5pb25bQ2FsbGFibGUsIHN0cl0gPSBOb25lLAogICAgICAgIG1heGltaXplOiBib29sID0gRmFsc2UsCiAgICAgICAgZWFybHlfc3RvcHBpbmdfcm91bmRzOiBpbnQgPSBOb25lLAogICAgICAgIGV2YWxzX3Jlc3VsdDogZGljdCA9IHt9LAogICAgICAgIHZlcmJvc2VfZXZhbDogYm9vbCA9IFRydWUsCiAgICAgICAgeGdiX21vZGVsOiBEYXRhSXRlbSA9IE5vbmUsCiAgICAgICAgY2FsbGJhY2tzOiBMaXN0W0NhbGxhYmxlXSA9IFtdLAogICAgICAgIGxhYmVsX2NvbHVtbjogc3RyID0gImxhYmVscyIsCiAgICAgICAgZW5jb2RlX2NvbHM6IGRpY3QgPSB7fSwKICAgICAgICBzYW1wbGU6IGludCA9IC0xLAogICAgICAgIHRlc3Rfc2l6ZTogZmxvYXQgPSAwLjI1LAogICAgICAgIHZhbGlkX3NpemU6IGZsb2F0ID0gMC43NSwKICAgICAgICByYW5kb21fc3RhdGU6IGludCA9IDE5OTQsCiAgICAgICAgbW9kZWxzX2Rlc3Q6IHN0ciA9ICJtb2RlbHMiLAogICAgICAgIHBsb3RzX2Rlc3Q6IHN0ciA9ICJwbG90cyIsCiAgICAgICAgZmlsZV9leHQ6IHN0ciA9ICJjc3YiLAogICAgICAgIHRlc3Rfc2V0X2tleTogc3RyID0gInRlc3Qtc2V0IiwKICAgICAgICBncHVzOiBib29sID0gRmFsc2UKKSAtPiBOb25lOgogICAgIiIibG93IGxldmVsIHhnYm9vc3QgdHJhaW4gYXBpCgogICAgZm9yIHRoZSB4Z2Jvb3N0IGB0cmFpbmAgcGFyYW1zIHNlZToKICAgIGh0dHBzOi8veGdib29zdC5yZWFkdGhlZG9jcy5pby9lbi9sYXRlc3QvcHl0aG9uL3B5dGhvbl9hcGkuaHRtbCN4Z2Jvb3N0LnRyYWluCgogICAgTm90ZTogIHRoZSBmaXJzdCBwYXJhbWV0ZXIgb2YgeGdib29zdCdzIGB0cmFpbmAgbWV0aG9kIGlzIGEgZGljdCBvZiBwYXJhbWV0ZXJzCiAgICAgICAgICAgc3VwcGxpZWQgdG8gdGhlIGJvb3N0ZXIgKGVuZ2luZSkuICBUbyBtb2RpZnkgb25lIG9mIHRob3NlIHNpbXBseQogICAgICAgICAgIGFkZCBhIHRhc2sgcGFyYW1ldGVyICh3aGVuIHJ1bm5pbmcgeW91IHN1cHBseSBhbiBtbHJ1biBOZXdUYXNrKSB3aXRoIHRoZQogICAgICAgICAgIHByZWZpeCAiWEdCXyIuIFNvIGZvciBleGFtcGxlLCB0byBzZXQgdGhlICd0cmVlX21ldGhvZCcgcGFyYW1ldGVyIHRvICdhcHByb3gnLAogICAgICAgICAgIGFkZCB7IlhHQl90cmVlX21ldGhvZCI6ImFwcHJveCJ9IHRvIHRoZSB0YXNrIHBhcmFtcyBrZXkuCgogICAgOnBhcmFtIGNvbnRleHQ6ICAgICAgICAgICB0aGUgZnVuY3Rpb24gY29udGV4dAogICAgOnBhcmFtIGRhdGFzZXQ6ICAgICAgICAgICB0aGUgZnVsbCBkYXRhIHNldCwgdHJhaW4sIHZhbGlkIGFuZCB0ZXN0IHdpbGwgYmUgZXh0cmFjdGVkIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWNoIGNvbnZlcnRlZCB0byBhIERNYXRyaXggZm9yIGlucHV0IHRvIHhnYm9vc3QncyBgdHJhaW5gCiAgICA6cGFyYW0gbGFiZWxfY29sdW1uOiAgICAgIGdyb3VuZC10cnV0aCAoeSkgbGFiZWxzCiAgICA6cGFyYW0gZW5jb2RlX2NvbHM6ICAgICAgIGRpY3Rpb25hcnkgb2YgbmFtZXMgYW5kIHByZWZpeGVzIGZvciBjb2x1bW5zIHRoYXQgYXJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGhvdCBiZSBlbmNvZGVkLgogICAgOnBhcmFtIHNhbXBsZTogICAgICAgICAgICBTZWxlY3RzIHRoZSBmaXJzdCBuIHJvd3MsIG9yIHNlbGVjdCBhIHNhbXBsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGluZyBmcm9tIHRoZSBmaXJzdC4gSWYgbmVnYXRpdmUgPC0xLCBzZWxlY3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSByYW5kb20gc2FtcGxlCiAgICA6cGFyYW0gdGVzdF9zaXplOiAgICAgICAgICgwLjA1KSB0ZXN0IHNldCBzaXplCiAgICA6cGFyYW0gdmFsaWRfc2l6ZTogICAgICAgICgwLjc1KSBPbmNlIHRoZSB0ZXN0IHNldCBoYXMgYmVlbiByZW1vdmVkIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpbmluZyBzZXQgZ2V0cyB0aGlzIHByb3BvcnRpb24uCiAgICA6cGFyYW0gcmFuZG9tX3N0YXRlOiAgICAgICgxKSBza2xlYXJuIHJuZyBzZWVkCiAgICA6cGFyYW0gbW9kZWxzX2Rlc3Q6ICAgICAgIGRlc3RpbmF0aW9uIHN1YmZvbGRlciBmb3IgbW9kZWwgYXJ0aWZhY3RzCiAgICA6cGFyYW0gcGxvdHNfZGVzdDogICAgICAgIGRlc3RpbmF0aW9uIHN1YmZvbGRlciBmb3IgcGxvdCBhcnRpZmFjdHMKICAgIDpwYXJhbSBmaWxlX2V4dDogICAgICAgICAgZm9ybWF0IGZvciB0ZXN0X3NldF9rZXkgaG9sZCBvdXQgZGF0YQogICAgOnBhcmFtIHRlc3Rfc2V0X2tleTogICAgICAodGVzdC1zZXQpLCBrZXkgb2YgaGVsZCBvdXQgZGF0YSBpbiBhcnRpZmFjdCBzdG9yZQogICAgOnBhcmFtIGdwdXM6ICAgICAgICAgICAgICAoRmFsc2UpLCBydW4gb24gZ3B1cwogICAgIiIiCiAgICByYXcsIGxhYmVscywgaGVhZGVyID0gZ2V0X3NhbXBsZShkYXRhc2V0LCBzYW1wbGUsIGxhYmVsX2NvbHVtbikKCiAgICAjIGhvdC1lbmNvZGUKICAgIGlmIGVuY29kZV9jb2xzOgogICAgICAgIHJhdyA9IHBkLmdldF9kdW1taWVzKHJhdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zPWxpc3QoZW5jb2RlX2NvbHMua2V5cygpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXg9bGlzdChlbmNvZGVfY29scy52YWx1ZXMoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcF9maXJzdD1UcnVlKQoKICAgICMgc3BsaXQgdGhlIHNhbXBsZSBpbnRvIHRyYWluIHZhbGlkYXRlLCB0ZXN0IGFuZCBjYWxpYnJhdGlvbiBzZXRzOgogICAgKHh0cmFpbiwgeXRyYWluKSwgKHh2YWxpZCwgeXZhbGlkKSwgKHh0ZXN0LCB5dGVzdCkgPSBcCiAgICAgICAgZ2V0X3NwbGl0cyhyYXcsIGxhYmVscywgMywgdGVzdF9zaXplLCB2YWxpZF9zaXplLCByYW5kb21fc3RhdGUpCgogICAgIyBzYXZlIHRlc3QgZGF0YSBhcyByZWd1bGFyIGRhdGFmcmFtZSBhcyBpdCBtYXkgYmUgdXNlZCBieSBvdGhlciBwcm9jZXNzCiAgICBjb250ZXh0LmxvZ19kYXRhc2V0KHRlc3Rfc2V0X2tleSwgZGY9cGQuY29uY2F0KFt4dGVzdCwgeXRlc3RdLCBheGlzPTEpLAogICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ9ZmlsZV9leHQsIGluZGV4PUZhbHNlKQoKICAgICMgY29udmVydCB0byB4Z2Jvb3N0IERNYXRyaXggKHRvZG8gLSBkYXNrLCBncHUpCiAgICBkdHJhaW4gPSBETWF0cml4KHh0cmFpbiwgbGFiZWw9eXRyYWluKQogICAgZHZhbGlkID0gRE1hdHJpeCh4dmFsaWQsIGxhYmVsPXl2YWxpZCkKCiAgICBib29zdF9wYXJhbXMgPSB7CiAgICAgICAgInRyZWVfbWV0aG9kIjogImdwdV9oaXN0IiBpZiBncHVzIGVsc2UgImhpc3QiLAogICAgICAgICJzZWVkIjogcmFuZG9tX3N0YXRlLAogICAgICAgICJkaXNhYmxlX2RlZmF1bHRfZXZhbF9tZXRyaWMiOiAxLAogICAgICAgICJvYmplY3RpdmUiOiAicmVnOnNxdWFyZWRsb2dlcnJvciIsCiAgICAgICAgImV2YWxfbWV0cmljIjogInJtc2xlIn0KCiAgICAjIGVuYWJsZSB1c2VyIHRvIGN1c3RvbWl6ZSBgYm9vc3RlciBwYXJhbWAgcGFyYW1ldGVycwogICAgZm9yIGssIHYgaW4gY29udGV4dC5wYXJhbWV0ZXJzLml0ZW1zKCk6CiAgICAgICAgaWYgay5zdGFydHN3aXRoKCdYR0JfJyk6CiAgICAgICAgICAgIGJvb3N0X3BhcmFtc1trWzQ6XV0gPSB2CgogICAgIyBjb2xsZWN0IGxlYXJuaW5nIGN1cnZlcyAvIHRyYWluaW5nIGhpc3RvcnkKICAgIHJlc3VsdHMgPSBkaWN0KCkKCiAgICBib29zdGVyID0gdHJhaW4oCiAgICAgICAgYm9vc3RfcGFyYW1zLAogICAgICAgIGR0cmFpbj1kdHJhaW4sCiAgICAgICAgbnVtX2Jvb3N0X3JvdW5kPW51bV9ib29zdF9yb3VuZCwKICAgICAgICBldmFscz1bKGR0cmFpbiwgInRyYWluIiksIChkdmFsaWQsICJ2YWxpZCIpXSwKICAgICAgICBldmFsc19yZXN1bHQ9cmVzdWx0cywKICAgICAgICBvYmo9c3F1YXJlZF9sb2csCiAgICAgICAgZmV2YWw9cm1zbGUsCiAgICAgICAgbWF4aW1pemU9bWF4aW1pemUsCiAgICAgICAgZWFybHlfc3RvcHBpbmdfcm91bmRzPWVhcmx5X3N0b3BwaW5nX3JvdW5kcywKICAgICAgICB2ZXJib3NlX2V2YWw9dmVyYm9zZV9ldmFsLAogICAgICAgICMgeGdiX21vZGVsPXhnYl9tb2RlbCwKICAgICAgICAjIGNhbGxiYWNrczogTGlzdFtDYWxsYWJsZV0gPSBbXQogICAgKQoKICAgIGNvbnRleHQubG9nX21vZGVsKCJtb2RlbCIsCiAgICAgICAgICAgICAgICAgICAgICBib2R5PWR1bXBzKGJvb3N0ZXIpLAogICAgICAgICAgICAgICAgICAgICAgbW9kZWxfZmlsZT0ibW9kZWwucGtsIiwKICAgICAgICAgICAgICAgICAgICAgIGFydGlmYWN0X3BhdGg9J2FydGlmYWN0cy8nKQoKICAgIGxlYXJuaW5nX2N1cnZlcyhjb250ZXh0LCByZXN1bHRzKQ== - commands: [] - code_origin: https://github.com/daniels290813/functions.git#55a79c32be5d233cc11efcf40cd3edbe309bfdef:/home/kali/functions/xgb_custom/xgb_custom.py - affinity: null -verbose: false diff --git a/xgb_custom/item.yaml b/xgb_custom/item.yaml deleted file mode 100644 index 3decf0708..000000000 --- a/xgb_custom/item.yaml +++ /dev/null @@ -1,26 +0,0 @@ -apiVersion: v1 -categories: -- model-training -- machine-learning -- data-preparation -description: simulate data with outliers. -doc: '' -example: xgb_custom.ipynb -generationDate: 2022-08-28:17-25 -hidden: true -icon: '' -labels: - author: Daniel -maintainers: [] -marketplaceType: '' -mlrunVersion: 1.1.0 -name: xgb_custom -platformVersion: 3.5.0 -spec: - filename: xgb_custom.py - handler: gen_outliers - image: mlrun/mlrun - kind: job - requirements: [] -url: '' -version: 1.1.0 diff --git a/xgb_custom/requirements.txt b/xgb_custom/requirements.txt deleted file mode 100644 index 4441bae23..000000000 --- a/xgb_custom/requirements.txt +++ /dev/null @@ -1,7 +0,0 @@ -pandas -typing -xgboost -matplotlib -scikit-learn -seaborn -scikit-plot \ No newline at end of file diff --git a/xgb_custom/test_xgb_custom.py b/xgb_custom/test_xgb_custom.py deleted file mode 100644 index 81b77a2e0..000000000 --- a/xgb_custom/test_xgb_custom.py +++ /dev/null @@ -1,50 +0,0 @@ -# Copyright 2019 Iguazio -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -from mlrun import import_function -import os - - -ARTIFACT_PATH = "artifacts" -FUNCTION_PATH = "functions" -PLOTS_PATH = "plots" -RUNS_PATH = "runs" -SCHEDULES_PATH = "schedules" - - -def test_local_xgb_custom(): - fn = import_function("function.yaml") - run = fn.run( - params={ - "nrows": 8192, - "label_type": "float", - "local_path": "./artifacts/inputs/xgb_custom", - }, - handler="gen_outliers", - local=True, - ) - - run = fn.run( - params={ - "num_boost_round": 40, - "verbose_eval": False, - "XGB_max_depth": 2, - "XGB_subsample": 0.9, - "test_set_key": "test-set", - }, - inputs={"dataset": run.artifact('xgb-outs').url}, - handler="fit", - local=True, - ) - assert run.artifact('learning-curves').get() diff --git a/xgb_custom/xgb_custom.ipynb b/xgb_custom/xgb_custom.ipynb deleted file mode 100644 index fe3882ab8..000000000 --- a/xgb_custom/xgb_custom.ipynb +++ /dev/null @@ -1,922 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Custom Objective and Evaluation Functions\n", - "\n", - "This demo was adapted from **[xgboost's custom metric tutorial](https://xgboost.readthedocs.io/en/latest/tutorials/custom_metric_obj.html)**. We demonstrate how to use a custom objective and a custom evaluation function using an xgboost trainer.\n", - "\n", - "This function differs from `xgb_trainer` by exposing the low-level xgboost python api, `train`. " - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "# nuclio: ignore\n", - "import nuclio" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "from os import path\n", - "import numpy as np\n", - "from numpy.random import randint, randn, seed\n", - "import pandas as pd\n", - "from xgboost import DMatrix, train\n", - "import matplotlib.pyplot as plt\n", - "from mlrun.execution import MLClientCtx\n", - "from mlrun.datastore import DataItem\n", - "from mlrun.artifacts import PlotArtifact\n", - "from mlrun.mlutils.data import get_splits, get_sample\n", - "\n", - "from cloudpickle import dumps\n", - "\n", - "from typing import (Tuple, Dict, List, Union, Callable)\n", - "\n", - "seed(seed=1994)\n", - "\n", - "## UNCOMMENT THIS LINE TO TEST CALCULATED VALUES\n", - "DEBUG_ERROR = 0 # this will be added to the custom eval function--set it to some value like 999 " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### generate data with outliers" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "def gen_outliers(context: MLClientCtx, nrows=4096, feats=16, \n", - " outs=64, omax=10_000, labels_col=\"labels\",\n", - " header=[], label_type=\"int32\", key=\"xgb-outs\",\n", - " local_path=\"xgb_custom\"):\n", - " \"\"\"simulate data with outliers\n", - " \n", - " :param context: the function's execution context\n", - " :param nrows: (4096) number of data points\n", - " :param feats: (16) number of features\n", - " :param outs: (64) number of outliers\n", - " :param omax: (10_100) max value of outliers\n", - " :param labels_col: (labels) name of labels column\n", - " :param header: () header for dataset, will default to\n", - " `feat_`\n", - " :param label_type: (int32) data type for the label column\n", - " :param key: key of datset in artifact store\n", - " :param local_path: path in artifact store where data will be\n", - " serialized\n", - " \"\"\"\n", - " x = randn(nrows, feats)\n", - " y = randn(nrows)\n", - " y += np.abs(np.min(y))\n", - "\n", - " for i in range(0, outs):\n", - " ind = randint(0, len(y)-1)\n", - " y[ind] += randint(0, omax)\n", - " \n", - " if not header:\n", - " header = [f\"feat_{j}\" for j in range(feats)]\n", - " header.append(labels_col)\n", - "\n", - " data = pd.DataFrame(data=np.concatenate((x,y.reshape(-1,1)),axis=-1),\n", - " columns=header)\n", - " data = data.astype({labels_col: label_type})\n", - " \n", - " context.log_dataset(key, df=data, local_path=local_path)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## custom objective and eval" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "toc-hr-collapsed": true, - "toc-nb-collapsed": true - }, - "source": [ - "The following code was adapted from xgboost's documentation **[Custom Objective and Evaluation Metric](https://xgboost.readthedocs.io/en/latest/tutorials/custom_metric_obj.html?highlight=tree_method#custom-objective-and-evaluation-metric)**." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "def gradient(predt: np.ndarray, dtrain: DMatrix) -> np.ndarray:\n", - " \"\"\"gradient of squared log error\"\"\"\n", - " y = dtrain.get_label()\n", - " return (np.log1p(predt) - np.log1p(y)) / (predt + 1)\n", - "\n", - "\n", - "def hessian(predt: np.ndarray, dtrain: DMatrix) -> np.ndarray:\n", - " \"\"\"hessian of squared log error\"\"\"\n", - " y = dtrain.get_label()\n", - " return ((-np.log1p(predt) + np.log1p(y) + 1) /\n", - " np.power(predt + 1, 2))\n", - "\n", - "\n", - "def squared_log(predt: np.ndarray, dtrain: DMatrix) -> Tuple[np.ndarray,\n", - " np.ndarray]:\n", - " \"\"\"squared log error objective\n", - "\n", - " simplified version for RMSLE used as objective function\n", - " \"\"\"\n", - " predt[predt < -1] = -1 + 1e-6\n", - " grad = gradient(predt, dtrain)\n", - " hess = hessian(predt, dtrain)\n", - " return grad, hess\n", - "\n", - "def rmsle(predt: np.ndarray, dtrain: DMatrix) -> Tuple[str, float]:\n", - " \"\"\" Root mean squared log error metric.\n", - " \"\"\"\n", - " y = dtrain.get_label()\n", - " predt[predt < -1] = -1 + 1e-6\n", - " elements = np.power(np.log1p(y) - np.log1p(predt), 2)\n", - " return \"my_rmsle\", float(np.sqrt(np.sum(elements) / len(y))) + DEBUG_ERROR" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## learning curves" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "def learning_curves(\n", - " context: MLClientCtx,\n", - " results: dict,\n", - " figsz: Tuple[int,int]=(10,10),\n", - " plots_dest: str = \"plots\"\n", - ") -> None:\n", - " \"\"\"plot xgb learning curves\n", - " \n", - " this will also log a model's learning curves\n", - " \"\"\"\n", - " plt.clf()\n", - " plt.figure(figsize=figsz)\n", - " plt.plot(results[\"train\"][\"my_rmsle\"], label=\"train-my-rmsle\")\n", - " plt.plot(results[\"valid\"][\"my_rmsle\"], label=\"valid-my-rmsle\")\n", - " plt.title(f\"learning curves\")\n", - " plt.legend()\n", - " \n", - " context.log_artifact(\n", - " PlotArtifact(f\"learning-curves\", body=plt.gcf()),\n", - " local_path=f\"{plots_dest}/learning-curves.html\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## fit" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "def fit(\n", - " context: MLClientCtx,\n", - " dataset: DataItem,\n", - " num_boost_round: int = 10,\n", - " evals: List[Tuple[DMatrix, str]] = [],\n", - " obj: Union[Callable, str] = \"\",\n", - " feval: Union[Callable, str] = None,\n", - " maximize: bool = False,\n", - " early_stopping_rounds: int = None,\n", - " evals_result: dict = {},\n", - " verbose_eval: bool = True,\n", - " xgb_model: DataItem = None,\n", - " callbacks: List[Callable] = [],\n", - " label_column: str = \"labels\",\n", - " encode_cols: dict = {},\n", - " sample: int = -1,\n", - " test_size: float = 0.25,\n", - " valid_size: float = 0.75,\n", - " random_state: int = 1994,\n", - " models_dest: str = \"models\",\n", - " plots_dest: str = \"plots\",\n", - " file_ext: str = \"csv\",\n", - " test_set_key: str = \"test-set\",\n", - " gpus: bool = False\n", - ") -> None:\n", - " \"\"\"low level xgboost train api\n", - " \n", - " for the xgboost `train` params see:\n", - " https://xgboost.readthedocs.io/en/latest/python/python_api.html#xgboost.train\n", - "\n", - " Note: the first parameter of xgboost's `train` method is a dict of parameters\n", - " supplied to the booster (engine). To modify one of those simply\n", - " add a task parameter (when running you supply an mlrun NewTask) with the\n", - " prefix \"XGB_\". So for example, to set the 'tree_method' parameter to 'approx',\n", - " add {\"XGB_tree_method\":\"approx\"} to the task params key.\n", - " \n", - " :param context: the function context\n", - " :param dataset: the full data set, train, valid and test will be extracted and\n", - " each converted to a DMatrix for input to xgboost's `train`\n", - " :param label_column: ground-truth (y) labels\n", - " :param encode_cols: dictionary of names and prefixes for columns that are\n", - " to hot be encoded.\n", - " :param sample: Selects the first n rows, or select a sample\n", - " starting from the first. If negative <-1, select\n", - " a random sample\n", - " :param test_size: (0.05) test set size\n", - " :param valid_size: (0.75) Once the test set has been removed the\n", - " training set gets this proportion.\n", - " :param random_state: (1) sklearn rng seed\n", - " :param models_dest: destination subfolder for model artifacts\n", - " :param plots_dest: destination subfolder for plot artifacts\n", - " :param file_ext: format for test_set_key hold out data\n", - " :param test_set_key: (test-set), key of held out data in artifact store\n", - " :param gpus: (False), run on gpus\n", - " \"\"\"\n", - " raw, labels, header = get_sample(dataset, sample, label_column)\n", - " \n", - " # hot-encode\n", - " if encode_cols:\n", - " raw = pd.get_dummies(raw, \n", - " columns=list(encode_cols.keys()), \n", - " prefix=list(encode_cols.values()), \n", - " drop_first=True)\n", - " \n", - " # split the sample into train validate, test and calibration sets:\n", - " (xtrain, ytrain), (xvalid, yvalid), (xtest, ytest) = \\\n", - " get_splits(raw, labels, 3, test_size, valid_size, random_state)\n", - " \n", - " # save test data as regular dataframe as it may be used by other process\n", - " context.log_dataset(test_set_key, df=pd.concat([xtest, ytest], axis=1),\n", - " format=file_ext, index=False)\n", - " \n", - " # convert to xgboost DMatrix (todo - dask, gpu)\n", - " dtrain = DMatrix(xtrain, label=ytrain)\n", - " dvalid = DMatrix(xvalid, label=yvalid)\n", - " \n", - " boost_params = {\n", - " \"tree_method\": \"gpu_hist\" if gpus else \"hist\", \n", - " \"seed\": random_state,\n", - " \"disable_default_eval_metric\": 1,\n", - " \"objective\": \"reg:squaredlogerror\",\n", - " \"eval_metric\": \"rmsle\"}\n", - "\n", - " # enable user to customize `booster param` parameters\n", - " for k, v in context.parameters.items():\n", - " if k.startswith('XGB_'):\n", - " boost_params[k[4:]] = v\n", - " \n", - " # collect learning curves / training history\n", - " results = dict()\n", - " \n", - " booster = train(\n", - " boost_params,\n", - " dtrain=dtrain,\n", - " num_boost_round=num_boost_round,\n", - " evals=[(dtrain, \"train\"), (dvalid, \"valid\")],\n", - " evals_result=results,\n", - " obj=squared_log,\n", - " feval=rmsle,\n", - " maximize=maximize,\n", - " early_stopping_rounds=early_stopping_rounds,\n", - " verbose_eval=verbose_eval,\n", - " # xgb_model=xgb_model,\n", - " # callbacks: List[Callable] = []\n", - " )\n", - " \n", - " context.log_model(\"model\", \n", - " body=dumps(booster),\n", - " model_file = \"model.pkl\",\n", - " artifact_path='/User/artifacts/tttt')\n", - " \n", - " learning_curves(context, results)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "# nuclio: end-code" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### run locally" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "from mlrun import NewTask, run_local" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[mlrun] 2020-06-14 13:30:21,675 starting run gen_outliers uid=29ae7c944a184de881acc81206a92a48 -> http://mlrun-api:8080\n", - "[mlrun] 2020-06-14 13:30:22,141 log artifact xgb-outs at /User/artifacts/xgb_custom.csv, size: 2762858, db: Y\n", - "\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
projectuiditerstartstatenamelabelsinputsparametersresultsartifacts
default0Jun 14 13:30:21completedgen_outliers
v3io_user=admin
kind=handler
owner=admin
host=jupyter-7b44c8d958-kklf7
nrows=8192
label_type=float
xgb-outs
\n", - "
\n", - "
\n", - "
\n", - " Title\n", - " ×\n", - "
\n", - " \n", - "
\n", - "
\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "to track results use .show() or .logs() or in CLI: \n", - "!mlrun get run 29ae7c944a184de881acc81206a92a48 --project default , !mlrun logs 29ae7c944a184de881acc81206a92a48 --project default\n", - "[mlrun] 2020-06-14 13:30:22,218 run executed, status=completed\n" - ] - } - ], - "source": [ - "gen_outs_tsk = NewTask(name='gen_outliers',\n", - " handler=gen_outliers, \n", - " params={'nrows': 8192, 'label_type': 'float'})\n", - "\n", - "outliers_run = run_local(gen_outs_tsk)" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[mlrun] 2020-06-14 13:30:23,011 starting run fit model uid=489d2d26007e444cb81ffe7b6bc9d4a2 -> http://mlrun-api:8080\n", - "[mlrun] 2020-06-14 13:30:23,405 log artifact test-set at /User/artifacts/test-set.csv, size: 689366, db: Y\n", - "[mlrun] 2020-06-14 13:30:23,545 log artifact model at /User/artifacts/tttt/, size: 17052, db: Y\n", - "[mlrun] 2020-06-14 13:30:23,712 log artifact learning-curves at /User/artifacts/plots/learning-curves.html, size: 31641, db: Y\n", - "\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
projectuiditerstartstatenamelabelsinputsparametersresultsartifacts
default0Jun 14 13:30:23completedfit model
v3io_user=admin
kind=handler
owner=admin
host=jupyter-7b44c8d958-kklf7
dataset
num_boost_round=40
verbose_eval=False
XGB_max_depth=2
XGB_subsample=0.9
test-set
model
learning-curves
\n", - "
\n", - "
\n", - "
\n", - " Title\n", - " ×\n", - "
\n", - " \n", - "
\n", - "
\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "to track results use .show() or .logs() or in CLI: \n", - "!mlrun get run 489d2d26007e444cb81ffe7b6bc9d4a2 --project default , !mlrun logs 489d2d26007e444cb81ffe7b6bc9d4a2 --project default\n", - "[mlrun] 2020-06-14 13:30:23,790 run executed, status=completed\n" - ] - }, - { - "data": { - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# THIS IS SETUP SO THAT YOU CAN COMPARE THE RESULTS AND SEE THAT THEY ARE EXACT. \n", - "# UNCOMMENT LINE `DEBUG_ERROR` AT TOP OF THIS NOTEBOOK TO TEST THAT THESE ARE \n", - "# TRULY CALCULATED VALUES\n", - "\n", - "fit_tsk = NewTask(\n", - " name='fit model', \n", - " handler=fit,\n", - " params={\"num_boost_round\" : 40, \n", - " \"verbose_eval\" : False,\n", - " \"XGB_max_depth\" : 2,\n", - " \"XGB_subsample\" : 0.9}\n", - ")\n", - "\n", - "fit_run = run_local(fit_tsk, inputs={\"dataset\":outliers_run.outputs[\"xgb-outs\"]})" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# export" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[mlrun] 2020-06-14 13:30:50,033 function spec saved to path: function.yaml\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from mlrun import code_to_function\n", - "from mlrun.platforms.other import auto_mount\n", - "\n", - "gpus = False\n", - "\n", - "# create job function object from notebook code\n", - "fn_params = {\n", - " \"name\" : \"xgb_custom\",\n", - " \"handler\" : \"fit\",\n", - " \"kind\" : \"job\",\n", - " \"image\" : \"mlrun/ml-models\" if not gpus else \"mlrun/ml-models-gpu\",\n", - " \"description\" : \"train an xgboost model using the low-level api\",\n", - " \"categories\" : [\"analysis\"],\n", - " \"labels\" : {\"author\": \"yjb\"}\n", - "}\n", - "\n", - "xgb_fn = code_to_function(**fn_params)\n", - "\n", - "xgb_fn.export(\"function.yaml\")\n", - "xgb_fn.apply(auto_mount())" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.8" - }, - "toc-autonumbering": false, - "toc-showcode": false, - "toc-showmarkdowntxt": false, - "toc-showtags": false - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/xgb_custom/xgb_custom.py b/xgb_custom/xgb_custom.py deleted file mode 100644 index f80868e7e..000000000 --- a/xgb_custom/xgb_custom.py +++ /dev/null @@ -1,239 +0,0 @@ -# Copyright 2019 Iguazio -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -from os import path -import numpy as np -from numpy.random import randint, randn, seed -import pandas as pd -from xgboost import DMatrix, train -import matplotlib.pyplot as plt -from mlrun.execution import MLClientCtx -from mlrun.datastore import DataItem -from mlrun.artifacts import PlotArtifact -from mlrun.mlutils.data import get_splits, get_sample - -from cloudpickle import dumps - -from typing import (Tuple, Dict, List, Union, Callable) - -seed(seed=1994) - -## UNCOMMENT THIS LINE TO TEST CALCULATED VALUES -DEBUG_ERROR = 0 # this will be added to the custom eval function--set it to some value like 999 - - -def gen_outliers(context: MLClientCtx, nrows=4096, feats=16, - outs=64, omax=10_000, labels_col="labels", - header=[], label_type="int32", key="xgb-outs", - local_path="xgb_custom"): - """simulate data with outliers - - :param context: the function's execution context - :param nrows: (4096) number of data points - :param feats: (16) number of features - :param outs: (64) number of outliers - :param omax: (10_100) max value of outliers - :param labels_col: (labels) name of labels column - :param header: () header for dataset, will default to - `feat_` - :param label_type: (int32) data type for the label column - :param key: key of datset in artifact store - :param local_path: path in artifact store where data will be - serialized - """ - x = randn(nrows, feats) - y = randn(nrows) - y += np.abs(np.min(y)) - - for i in range(0, outs): - ind = randint(0, len(y) - 1) - y[ind] += randint(0, omax) - - if not header: - header = [f"feat_{j}" for j in range(feats)] - header.append(labels_col) - - data = pd.DataFrame(data=np.concatenate((x, y.reshape(-1, 1)), axis=-1), - columns=header) - data = data.astype({labels_col: label_type}) - - context.log_dataset(key, df=data, local_path=local_path) - -def gradient(predt: np.ndarray, dtrain: DMatrix) -> np.ndarray: - """gradient of squared log error""" - y = dtrain.get_label() - return (np.log1p(predt) - np.log1p(y)) / (predt + 1) - - -def hessian(predt: np.ndarray, dtrain: DMatrix) -> np.ndarray: - """hessian of squared log error""" - y = dtrain.get_label() - return ((-np.log1p(predt) + np.log1p(y) + 1) / - np.power(predt + 1, 2)) - - -def squared_log(predt: np.ndarray, dtrain: DMatrix) -> Tuple[np.ndarray, - np.ndarray]: - """squared log error objective - - simplified version for RMSLE used as objective function - """ - predt[predt < -1] = -1 + 1e-6 - grad = gradient(predt, dtrain) - hess = hessian(predt, dtrain) - return grad, hess - -def rmsle(predt: np.ndarray, dtrain: DMatrix) -> Tuple[str, float]: - """ Root mean squared log error metric. - """ - y = dtrain.get_label() - predt[predt < -1] = -1 + 1e-6 - elements = np.power(np.log1p(y) - np.log1p(predt), 2) - return "my_rmsle", float(np.sqrt(np.sum(elements) / len(y))) + DEBUG_ERROR - - -def learning_curves( - context: MLClientCtx, - results: dict, - figsz: Tuple[int, int] = (10, 10), - plots_dest: str = "plots" -) -> None: - """plot xgb learning curves - - this will also log a model's learning curves - """ - plt.clf() - plt.figure(figsize=figsz) - plt.plot(results["train"]["my_rmsle"], label="train-my-rmsle") - plt.plot(results["valid"]["my_rmsle"], label="valid-my-rmsle") - plt.title(f"learning curves") - plt.legend() - - context.log_artifact( - PlotArtifact(f"learning-curves", body=plt.gcf()), - local_path=f"{plots_dest}/learning-curves.html") - - -def fit( - context: MLClientCtx, - dataset: DataItem, - num_boost_round: int = 10, - evals: List[Tuple[DMatrix, str]] = [], - obj: Union[Callable, str] = "", - feval: Union[Callable, str] = None, - maximize: bool = False, - early_stopping_rounds: int = None, - evals_result: dict = {}, - verbose_eval: bool = True, - xgb_model: DataItem = None, - callbacks: List[Callable] = [], - label_column: str = "labels", - encode_cols: dict = {}, - sample: int = -1, - test_size: float = 0.25, - valid_size: float = 0.75, - random_state: int = 1994, - models_dest: str = "models", - plots_dest: str = "plots", - file_ext: str = "csv", - test_set_key: str = "test-set", - gpus: bool = False -) -> None: - """low level xgboost train api - - for the xgboost `train` params see: - https://xgboost.readthedocs.io/en/latest/python/python_api.html#xgboost.train - - Note: the first parameter of xgboost's `train` method is a dict of parameters - supplied to the booster (engine). To modify one of those simply - add a task parameter (when running you supply an mlrun NewTask) with the - prefix "XGB_". So for example, to set the 'tree_method' parameter to 'approx', - add {"XGB_tree_method":"approx"} to the task params key. - - :param context: the function context - :param dataset: the full data set, train, valid and test will be extracted and - each converted to a DMatrix for input to xgboost's `train` - :param label_column: ground-truth (y) labels - :param encode_cols: dictionary of names and prefixes for columns that are - to hot be encoded. - :param sample: Selects the first n rows, or select a sample - starting from the first. If negative <-1, select - a random sample - :param test_size: (0.05) test set size - :param valid_size: (0.75) Once the test set has been removed the - training set gets this proportion. - :param random_state: (1) sklearn rng seed - :param models_dest: destination subfolder for model artifacts - :param plots_dest: destination subfolder for plot artifacts - :param file_ext: format for test_set_key hold out data - :param test_set_key: (test-set), key of held out data in artifact store - :param gpus: (False), run on gpus - """ - raw, labels, header = get_sample(dataset, sample, label_column) - - # hot-encode - if encode_cols: - raw = pd.get_dummies(raw, - columns=list(encode_cols.keys()), - prefix=list(encode_cols.values()), - drop_first=True) - - # split the sample into train validate, test and calibration sets: - (xtrain, ytrain), (xvalid, yvalid), (xtest, ytest) = \ - get_splits(raw, labels, 3, test_size, valid_size, random_state) - - # save test data as regular dataframe as it may be used by other process - context.log_dataset(test_set_key, df=pd.concat([xtest, ytest], axis=1), - format=file_ext, index=False) - - # convert to xgboost DMatrix (todo - dask, gpu) - dtrain = DMatrix(xtrain, label=ytrain) - dvalid = DMatrix(xvalid, label=yvalid) - - boost_params = { - "tree_method": "gpu_hist" if gpus else "hist", - "seed": random_state, - "disable_default_eval_metric": 1, - "objective": "reg:squaredlogerror", - "eval_metric": "rmsle"} - - # enable user to customize `booster param` parameters - for k, v in context.parameters.items(): - if k.startswith('XGB_'): - boost_params[k[4:]] = v - - # collect learning curves / training history - results = dict() - - booster = train( - boost_params, - dtrain=dtrain, - num_boost_round=num_boost_round, - evals=[(dtrain, "train"), (dvalid, "valid")], - evals_result=results, - obj=squared_log, - feval=rmsle, - maximize=maximize, - early_stopping_rounds=early_stopping_rounds, - verbose_eval=verbose_eval, - # xgb_model=xgb_model, - # callbacks: List[Callable] = [] - ) - - context.log_model("model", - body=dumps(booster), - model_file="model.pkl", - artifact_path='artifacts/') - - learning_curves(context, results) \ No newline at end of file diff --git a/xgb_serving/function.yaml b/xgb_serving/function.yaml deleted file mode 100644 index 7073d8ba6..000000000 --- a/xgb_serving/function.yaml +++ /dev/null @@ -1,40 +0,0 @@ -kind: serving -metadata: - name: xgb-serving - tag: '' - hash: 200148a9a4815d8b0394038d973b59eda1776d36 - project: '' - labels: - author: Daniel - categories: - - model-serving - - machine-learning -spec: - command: '' - args: [] - image: mlrun/mlrun - build: - functionSourceCode: IyBDb3B5cmlnaHQgMjAxOSBJZ3VhemlvCiMKIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiMKaW1wb3J0IG9zCmltcG9ydCBqc29uCmltcG9ydCBudW1weSBhcyBucApmcm9tIGNsb3VkcGlja2xlIGltcG9ydCBsb2FkCmltcG9ydCBtbHJ1bgoKCmNsYXNzIFhHQm9vc3RNb2RlbChtbHJ1bi5zZXJ2aW5nLlYyTW9kZWxTZXJ2ZXIpOgogICAgZGVmIGxvYWQoc2VsZik6CiAgICAgICAgbW9kZWxfZmlsZSwgZXh0cmFfZGF0YSA9IHNlbGYuZ2V0X21vZGVsKCIucGtsIikKICAgICAgICBzZWxmLm1vZGVsID0gbG9hZChvcGVuKHN0cihtb2RlbF9maWxlKSwgInJiIikpCgogICAgZGVmIHByZWRpY3Qoc2VsZiwgYm9keSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBmZWF0cyA9IG5wLmFzYXJyYXkoYm9keVsiaW5wdXRzIl0sIGR0eXBlPW5wLmZsb2F0MzIpLnJlc2hhcGUoLTEsIDUpCiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYubW9kZWwucHJlZGljdChmZWF0cywgdmFsaWRhdGVfZmVhdHVyZXM9RmFsc2UpCiAgICAgICAgICAgIHJldHVybiByZXN1bHQudG9saXN0KCkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiRmFpbGVkIHRvIHByZWRpY3QgJXMiICUgZSkKZnJvbSBtbHJ1bi5ydW50aW1lcyBpbXBvcnQgbnVjbGlvX2luaXRfaG9vawpkZWYgaW5pdF9jb250ZXh0KGNvbnRleHQpOgogICAgbnVjbGlvX2luaXRfaG9vayhjb250ZXh0LCBnbG9iYWxzKCksICdzZXJ2aW5nX3YyJykKCmRlZiBoYW5kbGVyKGNvbnRleHQsIGV2ZW50KToKICAgIHJldHVybiBjb250ZXh0Lm1scnVuX2hhbmRsZXIoY29udGV4dCwgZXZlbnQpCg== - commands: [] - code_origin: https://github.com/daniels290813/functions.git#2675b0d235d93571a696296c93cfb2103cbf261f:/Users/Daniel_Sabba/functions/xgb_serving/xgb_serving.py - origin_filename: /Users/Daniel_Sabba/functions/xgb_serving/xgb_serving.py - requirements: [] - description: deploy an XGBoost model server. - default_handler: '' - disable_auto_mount: false - clone_target_dir: '' - env: [] - priority_class_name: '' - preemption_mode: prevent - min_replicas: 1 - max_replicas: 4 - source: '' - function_kind: serving_v2 - function_handler: xgb_serving:handler - base_image_pull: false - default_class: ClassifierModel - secret_sources: [] - affinity: null - tolerations: null - security_context: {} -verbose: false diff --git a/xgb_serving/item.yaml b/xgb_serving/item.yaml deleted file mode 100644 index 413e26bfa..000000000 --- a/xgb_serving/item.yaml +++ /dev/null @@ -1,29 +0,0 @@ -apiVersion: v1 -categories: -- model-serving -- machine-learning -description: deploy an XGBoost model server. -doc: '' -example: xgb_serving.ipynb -generationDate: 2022-08-28:17-25 -hidden: false -icon: '' -labels: - author: Daniel -maintainers: [] -marketplaceType: '' -mlrunVersion: 1.4.1 -name: xgb_serving -platformVersion: 3.5.3 -spec: - customFields: - default_class: ClassifierModel - filename: xgb_serving.py - handler: handler - image: mlrun/mlrun - kind: serving - requirements: [] -url: '' -version: 1.1.2 - - diff --git a/xgb_serving/requirements.txt b/xgb_serving/requirements.txt deleted file mode 100644 index a5bbcdde3..000000000 --- a/xgb_serving/requirements.txt +++ /dev/null @@ -1,7 +0,0 @@ -pandas -xgboost -cloudpickle -pygit2 -scikit-learn==1.0.2 -scikit-plot -seaborn diff --git a/xgb_serving/test_xgb_serving.py b/xgb_serving/test_xgb_serving.py deleted file mode 100644 index 52f6ccb6d..000000000 --- a/xgb_serving/test_xgb_serving.py +++ /dev/null @@ -1,67 +0,0 @@ -# Copyright 2019 Iguazio -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -import mlrun -import os -import pandas as pd -from xgb_serving import XGBoostModel - - -def get_class_data(): - fn = mlrun.import_function('../gen_class_data/function.yaml') - run = fn.run(params={'key': 'classifier-data', - 'n_samples': 10_000, - 'm_features': 5, - 'k_classes': 2, - 'header': None, - 'weight': [0.5, 0.5], - 'sk_params': {'n_informative': 2}, - 'file_ext': 'csv'}, local=True, artifact_path="./artifacts") - return run - - -def xgb_trainer(): - # running data preparation function locally - gen_data_run = get_class_data() - - fn = mlrun.import_function('../xgb_trainer/function.yaml') - run = fn.run(params={'model_type': 'classifier', - 'CLASS_tree_method': 'hist', - 'CLASS_objective': 'binary:logistic', - 'CLASS_booster': 'gbtree', - 'FIT_verbose': 0, - 'label_column': 'labels'}, - local=True, inputs={'dataset': gen_data_run.status.artifacts[0]['spec']['target_path']}) - - for artifact in run.status.artifacts: - if artifact['kind'] == 'model': - assert os.path.exists(artifact['spec']['target_path']), "Failed locating model file" # validating model exists - return artifact['spec']['target_path'] + artifact['spec']['model_file'], gen_data_run.status.artifacts[0]['spec']['target_path'] - assert False, "Failed creating model" - - -def test_local_xgb_serving(): - model_path, dataset_path = xgb_trainer() - fn = mlrun.import_function('function.yaml') - - fn.add_model(key='my_model', model_path=model_path, class_name='XGBoostModel') - server = fn.to_mock_server() - - # Testing the model - df = pd.read_csv(dataset_path) - x = df.drop(['labels'], axis=1).iloc[0].tolist() - y_true = df['labels'][0] - - y_pred = server.test(path='/v2/models/my_model/predict', body={"inputs": x})['outputs'][0] - assert y_true == y_pred diff --git a/xgb_serving/xgb_serving.ipynb b/xgb_serving/xgb_serving.ipynb deleted file mode 100644 index 6c605367e..000000000 --- a/xgb_serving/xgb_serving.ipynb +++ /dev/null @@ -1,421 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Deploy a Serverless XGBoost Model Server\n", - " --------------------------------------------------------------------\n", - "\n", - "The following notebook demonstrates how to deploy an XGBoost model server (a.k.a Nuclio-serving)\n", - "\n", - "#### **notebook how-to's**\n", - "* Write and test model serving class in a notebook.\n", - "* Deploy the model server function.\n", - "* Invoke and test the serving function." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "#### **steps**\n", - "**[define a new function and its dependencies](#define-function)**
\n", - "**[test the model serving class locally](#test-locally)**
\n", - "**[deploy our serving class using as a serverless function](#deploy)**
\n", - "**[test our model server using HTTP request](#test-model-server)**
" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# nuclio: ignore\n", - "import nuclio " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "### **define a new function and its dependencies**" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "%nuclio: setting kind to 'nuclio:serving'\n", - "%nuclio: setting 'MODEL_CLASS' environment variable\n", - "%nuclio: setting spec.build.baseImage to 'mlrun/ml-models'\n" - ] - } - ], - "source": [ - "%nuclio config kind=\"nuclio:serving\"\n", - "%nuclio env MODEL_CLASS=XGBoostModel\n", - "\n", - "%nuclio config spec.build.baseImage = \"mlrun/ml-models\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Function Code" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "# import kfserving\n", - "import os\n", - "import json\n", - "import numpy as np\n", - "import xgboost as xgb\n", - "from cloudpickle import load\n", - "\n", - "### Model Serving Class\n", - "\n", - "import mlrun\n", - "class XGBoostModel(mlrun.runtimes.MLModelServer):\n", - " def load(self):\n", - " model_file, extra_data = self.get_model(\".pkl\")\n", - " self.model = load(open(str(model_file), \"rb\"))\n", - " \n", - "\n", - " def predict(self, body):\n", - " try:\n", - " feats = np.asarray(body[\"instances\"], dtype=np.float32).reshape(-1, 5)\n", - " result = self.model.predict(feats, validate_features=False)\n", - " return result.tolist()\n", - " except Exception as e:\n", - " raise Exception(\"Failed to predict %s\" % e)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following end-code annotation tells ```nuclio``` to stop parsing the notebook from this cell. _**Please do not remove this cell**_:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "# nuclio: end-code" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "## Test the function locally\n", - "\n", - "The class above can be tested locally. Just instantiate the class, `.load()` will load the model to a local dir.\n", - "\n", - "> **Verify there is a model file in the model_dir path (generated by the training notebook)**" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [], - "source": [ - "from mlrun import mlconf\n", - "\n", - "model_dir = os.path.join(mlconf.artifact_path, \"xgb/models\")\n", - "\n", - "my_server = XGBoostModel(\"my-model\", model_dir=model_dir)\n", - "my_server.load()" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [], - "source": [ - "DATA_PATH = mlconf.artifact_path + \"/xgb/classifier-data.csv\"\n", - "MODEL_PATH = mlconf.artifact_path + \"/xgb/models/xgb_test\"" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "xtest = pd.read_csv(DATA_PATH)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use the `.predict(body)` method to test the model." - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [], - "source": [ - "import json, numpy as np\n", - "preds = my_server.predict({\"instances\":xtest.values[:10,:-1].tolist()})" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "predicted class: [1, 0, 0, 0, 0, 0, 1, 1, 0, 1]\n" - ] - } - ], - "source": [ - "print(\"predicted class:\", preds)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "### **deploy our serving class using as a serverless function**\n", - "in the following section we create a new model serving function which wraps our class , and specify model and other resources.\n", - "\n", - "the `models` dict store model names and the assosiated model **dir** URL (the URL can start with `S3://` and other blob store options), the faster way is to use a shared file volume, we use `.apply(mount_v3io())` to attach a v3io (iguazio data fabric) volume to our function. By default v3io will mount the current user home into the `\\User` function path.\n", - "\n", - "**verify the model dir does contain a valid `model.bst` file**" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [], - "source": [ - "from mlrun import new_model_server, mount_v3io\n", - "import requests" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[mlrun] 2020-06-14 12:49:05,013 function spec saved to path: function.yaml\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 42, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "fn = new_model_server(\"xgb-serving\",\n", - " model_class=\"XGBoostModel\",\n", - " models={\"xgb_serving_v2\": f\"{model_dir}\"})\n", - "fn.spec.description = \"xgboost test data classification server\"\n", - "fn.metadata.categories = [\"serving\", \"ml\"]\n", - "fn.metadata.labels = {\"author\": \"yaronh\", \"framework\": \"xgboost\"}\n", - "\n", - "fn.export(\"function.yaml\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## tests" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from mlrun.platforms.other import auto_mount\n", - "fn.apply(auto_mount())" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[mlrun] 2020-06-14 12:49:18,128 deploy started\n", - "[nuclio] 2020-06-14 12:49:19,213 (info) Build complete\n", - "[nuclio] 2020-06-14 12:49:27,347 (info) Function deploy complete\n", - "[nuclio] 2020-06-14 12:49:27,354 done updating default-xgb-test, function address: 3.23.82.202:30104\n" - ] - } - ], - "source": [ - "addr = fn.deploy()" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'http://3.23.82.202:30104'" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "addr" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "### **test our model server using HTTP request**\n", - "\n", - "\n", - "We invoke our model serving function using test data, the data vector is specified in the `instances` attribute." - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [], - "source": [ - "# KFServing protocol event\n", - "event_data = {\"instances\": xtest.values[:10,:-1].tolist()}" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'[1, 0, 0, 0, 0, 0, 1, 1, 0, 1]'" - ] - }, - "execution_count": 47, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import json\n", - "resp = requests.put(addr + \"/xgb_serving_v2/predict\", json=json.dumps(event_data))\n", - "resp.text" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[1, 0, 0, 0, 0, 0, 1, 1, 0, 1]" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "preds" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**[back to top](#top)**" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.8" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/xgb_serving/xgb_serving.py b/xgb_serving/xgb_serving.py deleted file mode 100644 index a4d095e57..000000000 --- a/xgb_serving/xgb_serving.py +++ /dev/null @@ -1,33 +0,0 @@ -# Copyright 2019 Iguazio -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -import os -import json -import numpy as np -from cloudpickle import load -import mlrun - - -class XGBoostModel(mlrun.serving.V2ModelServer): - def load(self): - model_file, extra_data = self.get_model(".pkl") - self.model = load(open(str(model_file), "rb")) - - def predict(self, body): - try: - feats = np.asarray(body["inputs"], dtype=np.float32).reshape(-1, 5) - result = self.model.predict(feats, validate_features=False) - return result.tolist() - except Exception as e: - raise Exception("Failed to predict %s" % e) \ No newline at end of file From 7f3403ced7d291e52305b272c185f7506c84cdca Mon Sep 17 00:00:00 2001 From: Avi Asulin <34214569+aviaIguazio@users.noreply.github.com> Date: Thu, 12 Sep 2024 08:42:06 +0300 Subject: [PATCH 19/38] Update feature_selection/test_feature_selection.py Co-authored-by: Eyal Danieli --- feature_selection/test_feature_selection.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature_selection/test_feature_selection.py b/feature_selection/test_feature_selection.py index d21e648ff..9cb5ca621 100644 --- a/feature_selection/test_feature_selection.py +++ b/feature_selection/test_feature_selection.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. # -from mlrun import code_to_function, get_dataitem +from mlrun import code_to_function from pathlib import Path import shutil From 75dbafd698c6cfe41aa59b9663b22c3ea2a2b64f Mon Sep 17 00:00:00 2001 From: Avi Asulin <34214569+aviaIguazio@users.noreply.github.com> Date: Thu, 12 Sep 2024 08:43:08 +0300 Subject: [PATCH 20/38] Update item.yaml --- feature_selection/item.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature_selection/item.yaml b/feature_selection/item.yaml index 1b25ec410..99675b4e8 100644 --- a/feature_selection/item.yaml +++ b/feature_selection/item.yaml @@ -22,4 +22,4 @@ spec: kind: job requirements: [] url: '' -version: 1.7.0 +version: 1.5.0 From 639bb270ac1a8f12f7d0d1222b94f0b213c2a0ac Mon Sep 17 00:00:00 2001 From: Eyal Danieli Date: Wed, 25 Sep 2024 09:41:02 +0300 Subject: [PATCH 21/38] Align to master branch (#826) * [Category] Fix and add categories to functions (#808) * [Category] Fix and add categories to functions * bump version in structured * test is not valid in huggingface_serving * Fix duplicated footer * Fix duplicated footer * revert python version change as it will be done in another PR * comments * comments * Bump python:3.6 to python:3.9 (#810) * [Describe] Align describe to new pandas version (#812) * [Describe] Align describe to new pandas version * minor test fix * update mlrun version * add dask to requirements * remove dask * update numpy version * debug * debug * debug * remove dask tests * remove debug code * [get_offline_features] Updated to mlrun 1.6.3 (#813) * [Feature-selection] Replace matplotlib with plotly (#815) * Iguazio-cicd user token updated Iguazio-cicd user token updated in repo secrets: https://github.com/mlrun/functions/settings/secrets/actions MARKETPLACE_ACCESS_TOKEN_V3 new token gh...Zmf was set around April * forcing iguazio-cicd auth forcing iguazio-cicd to deal with Author identity unknown * checkout@v3 to v4 and echo * [Mlflow_utils] - mlflow model server (#811) * mlflow server * small fix to test * small fixes to ms and nb * small fixes to mlrun version * update requirements lightgbm * added req * Added xgboost to req --------- Co-authored-by: Avi Asulin <34214569+aviaIguazio@users.noreply.github.com> * [Mlflow] Remove mlflow tag (#825) * remove mlflow tag * remove mlflow tag --------- Co-authored-by: Avi Asulin <34214569+aviaIguazio@users.noreply.github.com> * align feature_selection yaml --------- Co-authored-by: Avi Asulin <34214569+aviaIguazio@users.noreply.github.com> Co-authored-by: Yonatan Shelach <92271540+yonishelach@users.noreply.github.com> Co-authored-by: rokatyy Co-authored-by: Katerina Molchanova <35141662+rokatyy@users.noreply.github.com> Co-authored-by: nashpaz123 <44337075+nashpaz123@users.noreply.github.com> Co-authored-by: ZeevRispler <73653682+ZeevRispler@users.noreply.github.com> --- .github/workflows/test-all.yaml | 23 +- churn_server/churn_server.py | 10 - churn_server/function.yaml | 4 +- churn_server/item.yaml | 2 +- describe/describe.py | 39 +- describe/function.yaml | 96 +- describe/item.yaml | 4 +- describe/requirements.txt | 1 - describe/test_describe.py | 76 -- feature_selection/feature_selection.py | 52 +- feature_selection/function.yaml | 4 +- feature_selection/requirements.txt | 4 +- feature_selection/test_feature_selection.py | 57 +- hugging_face_serving/function.yaml | 41 +- hugging_face_serving/item.yaml | 5 +- mlflow_utils/function.yaml | 31 + mlflow_utils/item.yaml | 31 + mlflow_utils/mlflow_utils.ipynb | 1353 +++++++++++++++++++ mlflow_utils/mlflow_utils.py | 45 + mlflow_utils/requirements.txt | 3 + mlflow_utils/test_mlflow_utils.py | 179 +++ model_server/function.yaml | 2 +- pii_recognizer/function.yaml | 3 +- pii_recognizer/item.yaml | 3 +- pyannote_audio/function.yaml | 6 +- pyannote_audio/item.yaml | 6 +- question_answering/function.yaml | 4 +- question_answering/item.yaml | 4 +- silero_vad/function.yaml | 6 +- silero_vad/item.yaml | 6 +- structured_data_generator/function.yaml | 4 +- structured_data_generator/item.yaml | 4 +- text_to_audio_generator/function.yaml | 3 +- text_to_audio_generator/item.yaml | 3 +- tf2_serving/function.yaml | 2 +- transcribe/function.yaml | 5 +- transcribe/item.yaml | 4 +- translate/function.yaml | 24 +- translate/item.yaml | 3 +- v2_model_server/function.yaml | 4 +- v2_model_server/item.yaml | 2 +- v2_model_server/v2_model_server.py | 11 - 42 files changed, 1860 insertions(+), 309 deletions(-) create mode 100644 mlflow_utils/function.yaml create mode 100644 mlflow_utils/item.yaml create mode 100644 mlflow_utils/mlflow_utils.ipynb create mode 100644 mlflow_utils/mlflow_utils.py create mode 100644 mlflow_utils/requirements.txt create mode 100644 mlflow_utils/test_mlflow_utils.py diff --git a/.github/workflows/test-all.yaml b/.github/workflows/test-all.yaml index 4832c6456..a09ba17a2 100644 --- a/.github/workflows/test-all.yaml +++ b/.github/workflows/test-all.yaml @@ -15,7 +15,7 @@ jobs: run: echo "::set-output name=branch::${GITHUB_REF#refs/heads/}" id: myref - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - id: set-matrix # This is very hacky, but it goes like that: # 1) Associate base_ref with origin/base_ref since actions/checkout doesn't do it, if we don't do that we won't be able to check the actual diff @@ -63,7 +63,7 @@ jobs: steps: # Source - name: Checkout current repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: path: functions # Install python 3.9 @@ -106,11 +106,11 @@ jobs: run: echo "::set-output name=branch::${GITHUB_REF#refs/heads/}" id: branch - name: Checkout current repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: path: functions - name: Checkout Marketplace - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: repository: mlrun/marketplace path: marketplace @@ -136,6 +136,7 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.MARKETPLACE_ACCESS_TOKEN_V3 }} USERNAME: iguazio-cicd + USEREMAIL: iguaziocicd@gmail.com REPO_PATH: marketplace BASE_REPO: mlrun BASE_BRANCH: master @@ -153,24 +154,30 @@ jobs: exit 1; }; git config --local user.name $USERNAME + git config --local user.email $USEREMAIL git branch --set-upstream-to origin/master git remote -v - echo "Checking out [$BRANCH_NAME]..." + echo "1. Checking out [$BRANCH_NAME]..." git checkout -b $BRANCH_NAME - echo "Checking out [$BASE_BRANCH]..." + echo "2. Checking out [$BASE_BRANCH]..." git checkout $BASE_BRANCH git pull - echo "Checking out [$BRANCH_NAME]..." + echo "3. Checking out [$BRANCH_NAME]..." git checkout $BRANCH_NAME + echo "3a. merging" git merge $BASE_BRANCH + echo "3b. status" git status git status --ignored find . -type f | xargs ls -artl + echo "3b. add" git add --all git status git status --ignored - echo "Commiting changes..." + echo "4. Commiting changes..." + echo "4a. git rev-parse" git rev-parse --show-toplevel + echo "4b. git commit" git commit -a -m "Automatically generated by github-worflow[bot] for commit: $COMMIT_SHA" git status git status --ignored diff --git a/churn_server/churn_server.py b/churn_server/churn_server.py index 55f37f280..def2850da 100644 --- a/churn_server/churn_server.py +++ b/churn_server/churn_server.py @@ -43,13 +43,3 @@ def predict(self, body): except Exception as e: raise Exception("Failed to predict %s" % e) - -from mlrun.runtimes import nuclio_init_hook - - -def init_context(context): - nuclio_init_hook(context, globals(), "serving_v2") - - -def handler(context, event): - return context.mlrun_handler(context, event) diff --git a/churn_server/function.yaml b/churn_server/function.yaml index 7a73c11a4..14f6c8cef 100644 --- a/churn_server/function.yaml +++ b/churn_server/function.yaml @@ -29,14 +29,14 @@ spec: annotations: nuclio.io/generated_by: function generated from /User/functions/churn_server/churn_server.py spec: - runtime: python:3.6 + runtime: python:3.9 handler: churn_server:handler env: [] volumes: [] build: commands: [] noBaseImagesPull: true - functionSourceCode: IyBHZW5lcmF0ZWQgYnkgbnVjbGlvLmV4cG9ydC5OdWNsaW9FeHBvcnRlcgoKaW1wb3J0IG51bXB5IGFzIG5wCmZyb20gY2xvdWRwaWNrbGUgaW1wb3J0IGxvYWQKCgppbXBvcnQgbWxydW4KCgpjbGFzcyBDaHVybk1vZGVsKG1scnVuLnNlcnZpbmcuVjJNb2RlbFNlcnZlcik6CiAgICBkZWYgbG9hZChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBsb2FkIG11bHRpcGxlIG1vZGVscyBpbiBuZXN0ZWQgZm9sZGVycywgY2h1cm4gbW9kZWwgb25seQogICAgICAgICIiIgogICAgICAgIGNsZl9tb2RlbF9maWxlLCBleHRyYV9kYXRhID0gc2VsZi5nZXRfbW9kZWwoIi5wa2wiKQogICAgICAgIHNlbGYubW9kZWwgPSBsb2FkKG9wZW4oc3RyKGNsZl9tb2RlbF9maWxlKSwgInJiIikpCiAgICAgICAgaWYgImNveCIgaW4gZXh0cmFfZGF0YS5rZXlzKCk6CiAgICAgICAgICAgIGNveF9tb2RlbF9maWxlID0gZXh0cmFfZGF0YVsiY294Il0KICAgICAgICAgICAgc2VsZi5jb3hfbW9kZWwgPSBsb2FkKG9wZW4oc3RyKGNveF9tb2RlbF9maWxlKSwgInJiIikpCiAgICAgICAgICAgIGlmICJjb3gva20iIGluIGV4dHJhX2RhdGEua2V5cygpOgogICAgICAgICAgICAgICAga21fbW9kZWxfZmlsZSA9IGV4dHJhX2RhdGFbImNveC9rbSJdCiAgICAgICAgICAgICAgICBzZWxmLmttX21vZGVsID0gbG9hZChvcGVuKHN0cihrbV9tb2RlbF9maWxlKSwgInJiIikpCgogICAgZGVmIHByZWRpY3Qoc2VsZiwgYm9keSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBmZWF0cyA9IG5wLmFzYXJyYXkoYm9keVsiaW5wdXRzIl0sIGR0eXBlPW5wLmZsb2F0MzIpLnJlc2hhcGUoLTEsIDIzKQogICAgICAgICAgICByZXN1bHQgPSBzZWxmLm1vZGVsLnByZWRpY3QoZmVhdHMsIHZhbGlkYXRlX2ZlYXR1cmVzPUZhbHNlKQogICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRvbGlzdCgpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIkZhaWxlZCB0byBwcmVkaWN0ICVzIiAlIGUpCgoKZnJvbSBtbHJ1bi5ydW50aW1lcyBpbXBvcnQgbnVjbGlvX2luaXRfaG9vawoKCmRlZiBpbml0X2NvbnRleHQoY29udGV4dCk6CiAgICBudWNsaW9faW5pdF9ob29rKGNvbnRleHQsIGdsb2JhbHMoKSwgInNlcnZpbmdfdjIiKQoKCmRlZiBoYW5kbGVyKGNvbnRleHQsIGV2ZW50KToKICAgIHJldHVybiBjb250ZXh0Lm1scnVuX2hhbmRsZXIoY29udGV4dCwgZXZlbnQpCgpmcm9tIG1scnVuLnJ1bnRpbWVzIGltcG9ydCBudWNsaW9faW5pdF9ob29rCmRlZiBpbml0X2NvbnRleHQoY29udGV4dCk6CiAgICBudWNsaW9faW5pdF9ob29rKGNvbnRleHQsIGdsb2JhbHMoKSwgJ3NlcnZpbmdfdjInKQoKZGVmIGhhbmRsZXIoY29udGV4dCwgZXZlbnQpOgogICAgcmV0dXJuIGNvbnRleHQubWxydW5faGFuZGxlcihjb250ZXh0LCBldmVudCkK + functionSourceCode: IyBDb3B5cmlnaHQgMjAxOSBJZ3VhemlvCiMKIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiMKIyBHZW5lcmF0ZWQgYnkgbnVjbGlvLmV4cG9ydC5OdWNsaW9FeHBvcnRlcgoKaW1wb3J0IG51bXB5IGFzIG5wCmZyb20gY2xvdWRwaWNrbGUgaW1wb3J0IGxvYWQKCgppbXBvcnQgbWxydW4KCgpjbGFzcyBDaHVybk1vZGVsKG1scnVuLnNlcnZpbmcuVjJNb2RlbFNlcnZlcik6CiAgICBkZWYgbG9hZChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBsb2FkIG11bHRpcGxlIG1vZGVscyBpbiBuZXN0ZWQgZm9sZGVycywgY2h1cm4gbW9kZWwgb25seQogICAgICAgICIiIgogICAgICAgIGNsZl9tb2RlbF9maWxlLCBleHRyYV9kYXRhID0gc2VsZi5nZXRfbW9kZWwoIi5wa2wiKQogICAgICAgIHNlbGYubW9kZWwgPSBsb2FkKG9wZW4oc3RyKGNsZl9tb2RlbF9maWxlKSwgInJiIikpCiAgICAgICAgaWYgImNveCIgaW4gZXh0cmFfZGF0YS5rZXlzKCk6CiAgICAgICAgICAgIGNveF9tb2RlbF9maWxlID0gZXh0cmFfZGF0YVsiY294Il0KICAgICAgICAgICAgc2VsZi5jb3hfbW9kZWwgPSBsb2FkKG9wZW4oc3RyKGNveF9tb2RlbF9maWxlKSwgInJiIikpCiAgICAgICAgICAgIGlmICJjb3gva20iIGluIGV4dHJhX2RhdGEua2V5cygpOgogICAgICAgICAgICAgICAga21fbW9kZWxfZmlsZSA9IGV4dHJhX2RhdGFbImNveC9rbSJdCiAgICAgICAgICAgICAgICBzZWxmLmttX21vZGVsID0gbG9hZChvcGVuKHN0cihrbV9tb2RlbF9maWxlKSwgInJiIikpCgogICAgZGVmIHByZWRpY3Qoc2VsZiwgYm9keSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBmZWF0cyA9IG5wLmFzYXJyYXkoYm9keVsiaW5wdXRzIl0sIGR0eXBlPW5wLmZsb2F0MzIpLnJlc2hhcGUoLTEsIDIzKQogICAgICAgICAgICByZXN1bHQgPSBzZWxmLm1vZGVsLnByZWRpY3QoZmVhdHMsIHZhbGlkYXRlX2ZlYXR1cmVzPUZhbHNlKQogICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRvbGlzdCgpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIkZhaWxlZCB0byBwcmVkaWN0ICVzIiAlIGUpCgoKZnJvbSBtbHJ1bi5ydW50aW1lcyBpbXBvcnQgbnVjbGlvX2luaXRfaG9vawpkZWYgaW5pdF9jb250ZXh0KGNvbnRleHQpOgogICAgbnVjbGlvX2luaXRfaG9vayhjb250ZXh0LCBnbG9iYWxzKCksICdzZXJ2aW5nX3YyJykKCmRlZiBoYW5kbGVyKGNvbnRleHQsIGV2ZW50KToKICAgIHJldHVybiBjb250ZXh0Lm1scnVuX2hhbmRsZXIoY29udGV4dCwgZXZlbnQpCg== source: '' function_kind: serving_v2 default_class: ChurnModel diff --git a/churn_server/item.yaml b/churn_server/item.yaml index 3a3b4b6ba..09ba9b713 100644 --- a/churn_server/item.yaml +++ b/churn_server/item.yaml @@ -29,4 +29,4 @@ spec: - xgboost==1.3.1 - lifelines==0.22.8 url: '' -version: 1.1.0 +version: 1.2.0 diff --git a/describe/describe.py b/describe/describe.py index def92782b..27d789f5b 100644 --- a/describe/describe.py +++ b/describe/describe.py @@ -36,7 +36,7 @@ ) from mlrun.datastore import DataItem from mlrun.execution import MLClientCtx -from mlrun.feature_store import FeatureSet, FeatureVector +from mlrun.feature_store import FeatureSet from plotly.subplots import make_subplots pd.set_option("display.float_format", lambda x: "%.2f" % x) @@ -234,24 +234,24 @@ def _create_features_histogram_artifacts( if label_column is not None and problem_type == "classification": all_labels = df[label_column].unique() visible = True - for (columnName, _) in df.iteritems(): - if columnName == label_column: + for column_name in df.columns: + if column_name == label_column: continue if label_column is not None and problem_type == "classification": for label in all_labels: sub_fig = go.Histogram( histfunc="count", - x=df.loc[df[label_column] == label][columnName], + x=df.loc[df[label_column] == label][column_name], name=str(label), visible=visible, ) - figs[f"{columnName}@?@{label}"] = sub_fig + figs[f"{column_name}@?@{label}"] = sub_fig else: - sub_fig = go.Histogram(histfunc="count", x=df[columnName], visible=visible) - figs[f"{columnName}@?@{1}"] = sub_fig + sub_fig = go.Histogram(histfunc="count", x=df[column_name], visible=visible) + figs[f"{column_name}@?@{1}"] = sub_fig if visible: - first_feature_name = columnName + first_feature_name = column_name visible = False fig = go.Figure() @@ -338,7 +338,7 @@ def _create_features_2d_scatter_artifacts( Create and log a scatter-2d artifact for each couple of features """ features = [ - columnName for (columnName, _) in df.iteritems() if columnName != label_column + column_name for column_name in df.columns if column_name != label_column ] max_feature_len = float(max(len(elem) for elem in features)) if label_column is not None: @@ -450,11 +450,12 @@ def _create_violin_artifact( plot_num = 0 - for (columnName, columnData) in df.iteritems(): + for column_name in df.columns: + column_data = df[column_name] violin = go.Violin( - x=[columnName] * columnData.shape[0], - y=columnData, - name=columnName, + x=[column_name] * column_data.shape[0], + y=column_data, + name=column_name, ) fig.add_trace( @@ -491,15 +492,15 @@ def _create_imbalance_artifact( """ if label_column: if problem_type == "classification": + values_column = "count" labels_count = df[label_column].value_counts().sort_index() df_labels_count = pd.DataFrame(labels_count) - df_labels_count.rename(columns={label_column: "Total"}, inplace=True) df_labels_count[label_column] = labels_count.index - df_labels_count["weights"] = df_labels_count["Total"] / sum( - df_labels_count["Total"] + df_labels_count.rename(columns={"": values_column}, inplace=True) + df_labels_count[values_column] = df_labels_count[values_column] / sum( + df_labels_count[values_column] ) - - fig = px.pie(df_labels_count, names=label_column, values="Total") + fig = px.pie(df_labels_count, names=label_column, values=values_column) else: fig = px.histogram( histfunc="count", @@ -532,7 +533,7 @@ def _create_corr_artifact( """ if label_column is not None: df = df.drop([label_column], axis=1) - tblcorr = df.corr() + tblcorr = df.corr(numeric_only=True) extra_data["correlation-matrix-csv"] = context.log_artifact( TableArtifact("correlation-matrix-csv", df=tblcorr, visible=True), local_path=f"{plots_dest}/correlation-matrix.csv", diff --git a/describe/function.yaml b/describe/function.yaml index 6f518bbfa..f989c6ec7 100644 --- a/describe/function.yaml +++ b/describe/function.yaml @@ -1,54 +1,12 @@ +verbose: false kind: job -metadata: - name: describe - tag: '' - hash: 38ac49fa67c647c7defc230c9853a22657690a9e - project: '' - labels: - author: Davids - categories: - - data-analysis spec: - command: '' - args: [] - image: mlrun/mlrun - build: - functionSourceCode: IyBDb3B5cmlnaHQgMjAxOSBJZ3VhemlvCiMKIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiMKIyBHZW5lcmF0ZWQgYnkgbnVjbGlvLmV4cG9ydC5OdWNsaW9FeHBvcnRlcgoKaW1wb3J0IHdhcm5pbmdzCmZyb20gdHlwaW5nIGltcG9ydCBVbmlvbgoKaW1wb3J0IG1scnVuCmltcG9ydCBudW1weSBhcyBucAoKd2FybmluZ3Muc2ltcGxlZmlsdGVyKGFjdGlvbj0iaWdub3JlIiwgY2F0ZWdvcnk9RnV0dXJlV2FybmluZykKCmltcG9ydCBtbHJ1bi5mZWF0dXJlX3N0b3JlIGFzIGZzdG9yZQppbXBvcnQgcGFuZGFzIGFzIHBkCmltcG9ydCBwbG90bHkuZXhwcmVzcyBhcyBweAppbXBvcnQgcGxvdGx5LmZpZ3VyZV9mYWN0b3J5IGFzIGZmCmltcG9ydCBwbG90bHkuZ3JhcGhfb2JqZWN0cyBhcyBnbwpmcm9tIG1scnVuLmFydGlmYWN0cyBpbXBvcnQgKAogICAgQXJ0aWZhY3QsCiAgICBEYXRhc2V0QXJ0aWZhY3QsCiAgICBQbG90bHlBcnRpZmFjdCwKICAgIFRhYmxlQXJ0aWZhY3QsCiAgICB1cGRhdGVfZGF0YXNldF9tZXRhLAopCmZyb20gbWxydW4uZGF0YXN0b3JlIGltcG9ydCBEYXRhSXRlbQpmcm9tIG1scnVuLmV4ZWN1dGlvbiBpbXBvcnQgTUxDbGllbnRDdHgKZnJvbSBtbHJ1bi5mZWF0dXJlX3N0b3JlIGltcG9ydCBGZWF0dXJlU2V0LCBGZWF0dXJlVmVjdG9yCmZyb20gcGxvdGx5LnN1YnBsb3RzIGltcG9ydCBtYWtlX3N1YnBsb3RzCgpwZC5zZXRfb3B0aW9uKCJkaXNwbGF5LmZsb2F0X2Zvcm1hdCIsIGxhbWJkYSB4OiAiJS4yZiIgJSB4KQpNQVhfU0laRV9PRl9ERiA9IDUwMDAwMAoKCmRlZiBhbmFseXplKAogICAgY29udGV4dDogTUxDbGllbnRDdHgsCiAgICBuYW1lOiBzdHIgPSAiZGF0YXNldCIsCiAgICB0YWJsZTogVW5pb25bRmVhdHVyZVNldCwgRGF0YUl0ZW1dID0gTm9uZSwKICAgIGxhYmVsX2NvbHVtbjogc3RyID0gTm9uZSwKICAgIHBsb3RzX2Rlc3Q6IHN0ciA9ICJwbG90cyIsCiAgICByYW5kb21fc3RhdGU6IGludCA9IDEsCiAgICBwcm9ibGVtX3R5cGU6IHN0ciA9ICJjbGFzc2lmaWNhdGlvbiIsCiAgICBkYXNrX2tleTogc3RyID0gImRhc2tfa2V5IiwKICAgIGRhc2tfZnVuY3Rpb246IHN0ciA9IE5vbmUsCiAgICBkYXNrX2NsaWVudD1Ob25lLAopIC0+IE5vbmU6CiAgICAiIiIKICAgIFRoZSBmdW5jdGlvbiB3aWxsIG91dHB1dCB0aGUgZm9sbG93aW5nIGFydGlmYWN0cyBwZXIKICAgIGNvbHVtbiB3aXRoaW4gdGhlIGRhdGEgZnJhbWUgKGJhc2VkIG9uIGRhdGEgdHlwZXMpCiAgICBJZiB0aGUgZGF0YSBoYXMgbW9yZSB0aGFuIDUwMCwwMDAgc2FtcGxlIHdlCiAgICBzYW1wbGUgcmFuZG9tbHkgNTAwLDAwMCBzYW1wbGVzOgoKICAgIGRlc2NyaWJlIGNzdgogICAgaGlzdG9ncmFtcwogICAgc2NhdHRlci0yZAogICAgdmlvbGluIGNoYXJ0CiAgICBjb3JyZWxhdGlvbi1tYXRyaXggY2hhcnQKICAgIGNvcnJlbGF0aW9uLW1hdHJpeCBjc3YKICAgIGltYmFsYW5jZSBwaWUgY2hhcnQKICAgIGltYmFsYW5jZS13ZWlnaHRzLXZlYyBjc3YKCiAgICA6cGFyYW0gY29udGV4dDogICAgICAgICAgICAgICAgIFRoZSBmdW5jdGlvbiBjb250ZXh0CiAgICA6cGFyYW0gbmFtZTogICAgICAgICAgICAgICAgICAgIEtleSBvZiBkYXRhc2V0IHRvIGRhdGFiYXNlICgiZGF0YXNldCIgZm9yIGRlZmF1bHQpCiAgICA6cGFyYW0gdGFibGU6ICAgICAgICAgICAgICAgICAgIE1MUnVuIGlucHV0IHBvaW50aW5nIHRvIHBhbmRhcyBkYXRhZnJhbWUgKGNzdi9wYXJxdWV0IGZpbGUgcGF0aCkgb3IgRmVhdHVyZVNldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyBwYXJhbQogICAgOnBhcmFtIGxhYmVsX2NvbHVtbjogICAgICAgICAgICBHcm91bmQgdHJ1dGggY29sdW1uIGxhYmVsCiAgICA6cGFyYW0gcGxvdHNfZGVzdDogICAgICAgICAgICAgIERlc3RpbmF0aW9uIGZvbGRlciBvZiBzdW1tYXJ5IHBsb3RzIChyZWxhdGl2ZSB0byBhcnRpZmFjdF9wYXRoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoInBsb3RzIiBmb3IgZGVmYXVsdCkKICAgIDpwYXJhbSByYW5kb21fc3RhdGU6ICAgICAgICAgICAgV2hlbiB0aGUgdGFibGUgaGFzIG1vcmUgdGhhbiA1MDAsMDAwIHNhbXBsZXMsIHdlIHNhbXBsZSByYW5kb21seSA1MDAsMDAwIHNhbXBsZXMKICAgIDpwYXJhbSBwcm9ibGVtX3R5cGUgICAgICAgICAgICAgVGhlIHR5cGUgb2YgdGhlIE1MIHByb2JsZW0gdGhlIGRhdGEgZmFjaW5nIC0gcmVncmVzc2lvbiwgY2xhc3NpZmljYXRpb24gb3IgTm9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xhc3NpZmljYXRpb24gZm9yIGRlZmF1bHQpCiAgICA6cGFyYW0gZGFza19rZXk6ICAgICAgICAgICAgICAgIEtleSBvZiBkYXRhZnJhbWUgaW4gZGFzayBjbGllbnQgImRhdGFzZXRzIiBhdHRyaWJ1dGUKICAgIDpwYXJhbSBkYXNrX2Z1bmN0aW9uOiAgICAgICAgICAgRGFzayBmdW5jdGlvbiB1cmwgKGRiOi8vLi4pCiAgICA6cGFyYW0gZGFza19jbGllbnQ6ICAgICAgICAgICAgIERhc2sgY2xpZW50IG9iamVjdAogICAgIiIiCiAgICBkYXRhX2l0ZW0sIGZlYXR1cmVzZXQsIGNyZWF0LCB1cGRhdGUgPSBGYWxzZSwgRmFsc2UsIEZhbHNlLCBGYWxzZQogICAgZ2V0X2Zyb21fdGFibGUgPSBUcnVlCiAgICBpZiBkYXNrX2Z1bmN0aW9uIG9yIGRhc2tfY2xpZW50OgogICAgICAgIGRhdGFfaXRlbSwgY3JlYXQgPSBUcnVlLCBUcnVlCiAgICAgICAgaWYgZGFza19mdW5jdGlvbjoKICAgICAgICAgICAgY2xpZW50ID0gbWxydW4uaW1wb3J0X2Z1bmN0aW9uKGRhc2tfZnVuY3Rpb24pLmNsaWVudAogICAgICAgIGVsaWYgZGFza19jbGllbnQ6CiAgICAgICAgICAgIGNsaWVudCA9IGRhc2tfY2xpZW50CiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZGFzayBjbGllbnQgd2FzIG5vdCBwcm92aWRlZCIpCgogICAgICAgIGlmIGRhc2tfa2V5IGluIGNsaWVudC5kYXRhc2V0czoKICAgICAgICAgICAgZGYgPSBjbGllbnQuZ2V0X2RhdGFzZXQoZGFza19rZXkpCiAgICAgICAgICAgIGRhdGFfaXRlbSwgY3JlYXQsIGdldF9mcm9tX3RhYmxlID0gVHJ1ZSwgVHJ1ZSwgRmFsc2UKICAgICAgICBlbGlmIHRhYmxlOgogICAgICAgICAgICBnZXRfZnJvbV90YWJsZSA9IFRydWUKICAgICAgICBlbHNlOgogICAgICAgICAgICBjb250ZXh0LmxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgZiJvbmx5IHRoZXNlIGRhdGFzZXRzIGFyZSBhdmFpbGFibGUge2NsaWVudC5kYXRhc2V0c30gaW4gY2xpZW50IHtjbGllbnR9IgogICAgICAgICAgICApCiAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiZGF0YXNldCBub3QgZm91bmQgb24gZGFzayBjbHVzdGVyIikKCiAgICBpZiBnZXRfZnJvbV90YWJsZToKICAgICAgICBpZiB0eXBlKHRhYmxlKSA9PSBEYXRhSXRlbToKICAgICAgICAgICAgaWYgdGFibGUubWV0YSBpcyBOb25lOgogICAgICAgICAgICAgICAgZGF0YV9pdGVtLCBjcmVhdCwgdXBkYXRlID0gVHJ1ZSwgVHJ1ZSwgRmFsc2UKICAgICAgICAgICAgZWxpZiB0YWJsZS5tZXRhLmtpbmQgPT0gImRhdGFzZXQiOgogICAgICAgICAgICAgICAgZGF0YV9pdGVtLCBjcmVhdCwgdXBkYXRlID0gVHJ1ZSwgRmFsc2UsIFRydWUKICAgICAgICAgICAgZWxpZiB0YWJsZS5tZXRhLmtpbmQgPT0gIkZlYXR1cmVWZWN0b3IiOgogICAgICAgICAgICAgICAgZGF0YV9pdGVtLCBjcmVhdCwgdXBkYXRlID0gVHJ1ZSwgRmFsc2UsIEZhbHNlCiAgICAgICAgICAgIGVsaWYgdGFibGUubWV0YS5raW5kID09ICJGZWF0dXJlU2V0IjoKICAgICAgICAgICAgICAgIGZlYXR1cmVzZXQsIGNyZWF0LCB1cGRhdGUgPSBUcnVlLCBGYWxzZSwgRmFsc2UKCiAgICAgICAgaWYgZGF0YV9pdGVtOgogICAgICAgICAgICBkZiA9IHRhYmxlLmFzX2RmKCkKICAgICAgICBlbGlmIGZlYXR1cmVzZXQ6CiAgICAgICAgICAgIHByb2plY3RfbmFtZSwgc2V0X25hbWUgPSAoCiAgICAgICAgICAgICAgICB0YWJsZS5fcGF0aC5zcGxpdCgiLyIpWzJdLAogICAgICAgICAgICAgICAgdGFibGUuX3BhdGguc3BsaXQoIi8iKVs0XSwKICAgICAgICAgICAgKQogICAgICAgICAgICBmZWF0dXJlX3NldCA9IGZzdG9yZS5nZXRfZmVhdHVyZV9zZXQoCiAgICAgICAgICAgICAgICBmInN0b3JlOi8vZmVhdHVyZS1zZXRzL3twcm9qZWN0X25hbWV9L3tzZXRfbmFtZX0iCiAgICAgICAgICAgICkKICAgICAgICAgICAgZGYgPSBmZWF0dXJlX3NldC50b19kYXRhZnJhbWUoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNvbnRleHQubG9nZ2VyLmVycm9yKGYiV3JvbmcgdGFibGUgdHlwZS4iKQogICAgICAgICAgICByZXR1cm4KCiAgICBpZiBkZi5zaXplID4gTUFYX1NJWkVfT0ZfREY6CiAgICAgICAgZGYgPSBkZi5zYW1wbGUobj1pbnQoTUFYX1NJWkVfT0ZfREYgLyBkZi5zaGFwZVsxXSksIHJhbmRvbV9zdGF0ZT1yYW5kb21fc3RhdGUpCiAgICBleHRyYV9kYXRhID0ge30KCiAgICBpZiBsYWJlbF9jb2x1bW4gbm90IGluIGRmLmNvbHVtbnM6CiAgICAgICAgbGFiZWxfY29sdW1uID0gTm9uZQoKICAgIGV4dHJhX2RhdGFbImRlc2NyaWJlIGNzdiJdID0gY29udGV4dC5sb2dfYXJ0aWZhY3QoCiAgICAgICAgVGFibGVBcnRpZmFjdCgiZGVzY3JpYmUtY3N2IiwgZGY9ZGYuZGVzY3JpYmUoKSksCiAgICAgICAgbG9jYWxfcGF0aD1mIntwbG90c19kZXN0fS9kZXNjcmliZS5jc3YiLAogICAgKQoKICAgIHRyeToKICAgICAgICBfY3JlYXRlX2hpc3RvZ3JhbV9tYXRfYXJ0aWZhY3QoCiAgICAgICAgICAgIGNvbnRleHQsIGRmLCBleHRyYV9kYXRhLCBsYWJlbF9jb2x1bW4sIHBsb3RzX2Rlc3QKICAgICAgICApCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgY29udGV4dC5sb2dnZXIud2FybihmIkZhaWxlZCB0byBjcmVhdGUgaGlzdG9ncmFtIG1hdHJpeCBhcnRpZmFjdCBkdWUgdG86IHtlfSIpCiAgICB0cnk6CiAgICAgICAgX2NyZWF0ZV9mZWF0dXJlc19oaXN0b2dyYW1fYXJ0aWZhY3RzKAogICAgICAgICAgICBjb250ZXh0LCBkZiwgZXh0cmFfZGF0YSwgbGFiZWxfY29sdW1uLCBwbG90c19kZXN0LCBwcm9ibGVtX3R5cGUKICAgICAgICApCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgY29udGV4dC5sb2dnZXIud2FybihmIkZhaWxlZCB0byBjcmVhdGUgcGFpcnBsb3QgaGlzdG9ncmFtcyBkdWUgdG86IHtlfSIpCiAgICB0cnk6CiAgICAgICAgX2NyZWF0ZV9mZWF0dXJlc18yZF9zY2F0dGVyX2FydGlmYWN0cygKICAgICAgICAgICAgY29udGV4dCwgZGYsIGV4dHJhX2RhdGEsIGxhYmVsX2NvbHVtbiwgcGxvdHNfZGVzdCwgcHJvYmxlbV90eXBlCiAgICAgICAgKQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIGNvbnRleHQubG9nZ2VyLndhcm4oZiJGYWlsZWQgdG8gY3JlYXRlIHBhaXJwbG90IDJkX3NjYXR0ZXIgZHVlIHRvOiB7ZX0iKQogICAgdHJ5OgogICAgICAgIF9jcmVhdGVfdmlvbGluX2FydGlmYWN0KGNvbnRleHQsIGRmLCBleHRyYV9kYXRhLCBwbG90c19kZXN0KQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIGNvbnRleHQubG9nZ2VyLndhcm4oZiJGYWlsZWQgdG8gY3JlYXRlIHZpb2xpbiBkaXN0cmlidXRpb24gcGxvdHMgZHVlIHRvOiB7ZX0iKQogICAgdHJ5OgogICAgICAgIF9jcmVhdGVfaW1iYWxhbmNlX2FydGlmYWN0KAogICAgICAgICAgICBjb250ZXh0LCBkZiwgZXh0cmFfZGF0YSwgbGFiZWxfY29sdW1uLCBwbG90c19kZXN0LCBwcm9ibGVtX3R5cGUKICAgICAgICApCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgY29udGV4dC5sb2dnZXIud2FybihmIkZhaWxlZCB0byBjcmVhdGUgY2xhc3MgaW1iYWxhbmNlIHBsb3QgZHVlIHRvOiB7ZX0iKQogICAgdHJ5OgogICAgICAgIF9jcmVhdGVfY29ycl9hcnRpZmFjdChjb250ZXh0LCBkZiwgZXh0cmFfZGF0YSwgbGFiZWxfY29sdW1uLCBwbG90c19kZXN0KQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIGNvbnRleHQubG9nZ2VyLndhcm4oZiJGYWlsZWQgdG8gY3JlYXRlIGZlYXR1cmVzIGNvcnJlbGF0aW9uIHBsb3QgZHVlIHRvOiB7ZX0iKQoKICAgIGlmIG5vdCBkYXRhX2l0ZW06CiAgICAgICAgcmV0dXJuCgogICAgYXJ0aWZhY3QgPSB0YWJsZS5hcnRpZmFjdF91cmwKICAgIGlmIGNyZWF0OiAgIyBkYXRhc2V0IG5vdCBzdG9yZWQKICAgICAgICBhcnRpZmFjdCA9IERhdGFzZXRBcnRpZmFjdCgKICAgICAgICAgICAga2V5PSJkYXRhc2V0Iiwgc3RhdHM9VHJ1ZSwgZGY9ZGYsIGV4dHJhX2RhdGE9ZXh0cmFfZGF0YQogICAgICAgICkKICAgICAgICBhcnRpZmFjdCA9IGNvbnRleHQubG9nX2FydGlmYWN0KGFydGlmYWN0LCBkYl9rZXk9bmFtZSkKICAgICAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYiVGhlIGRhdGEgc2V0IGlzIGxvZ2dlZCB0byB0aGUgcHJvamVjdCB1bmRlciB7bmFtZX0gbmFtZSIpCgogICAgaWYgdXBkYXRlOgogICAgICAgIHVwZGF0ZV9kYXRhc2V0X21ldGEoYXJ0aWZhY3QsIGV4dHJhX2RhdGE9ZXh0cmFfZGF0YSkKICAgICAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYiVGhlIGRhdGEgc2V0IG5hbWVkIHtuYW1lfSBpcyB1cGRhdGVkIikKCiAgICAjIFRPRE8gOiAzLUQgcGxvdCBvbiBvbiBzZWxlY3RlZCBmZWF0dXJlcy4KICAgICMgVE9ETyA6IFJlaW50ZWdyYXRpb24gcGxvdCBvbiBvbiBzZWxlY3RlZCBmZWF0dXJlcy4KICAgICMgVE9ETyA6IFBDQSBwbG90ICh3aXRoIG9wdGlvbnMpCgoKZGVmIF9jcmVhdGVfaGlzdG9ncmFtX21hdF9hcnRpZmFjdCgKICAgIGNvbnRleHQ6IE1MQ2xpZW50Q3R4LAogICAgZGY6IHBkLkRhdGFGcmFtZSwKICAgIGV4dHJhX2RhdGE6IGRpY3QsCiAgICBsYWJlbF9jb2x1bW46IHN0ciwKICAgIHBsb3RzX2Rlc3Q6IHN0ciwKKToKICAgICIiIgogICAgQ3JlYXRlIGFuZCBsb2cgYSBoaXN0b2dyYW0gbWF0cml4IGFydGlmYWN0CiAgICAiIiIKICAgIGNvbnRleHQubG9nX2FydGlmYWN0KAogICAgICAgIGl0ZW09QXJ0aWZhY3QoCiAgICAgICAgICAgIGtleT0iaGlzdCIsCiAgICAgICAgICAgIGJvZHk9YiI8Yj4gRGVwcmVjYXRlZCwgc2VlIHRoZSBhcnRpZmFjdHMgc2NhdHRlci0yZCAiCiAgICAgICAgICAgIGIiYW5kIGhpc3RvZ3JhbXMgaW5zdGVhZDxiPiIsCiAgICAgICAgKSwKICAgICAgICBsb2NhbF9wYXRoPWYie3Bsb3RzX2Rlc3R9L2hpc3QuaHRtbCIsCiAgICApCgoKZGVmIF9jcmVhdGVfZmVhdHVyZXNfaGlzdG9ncmFtX2FydGlmYWN0cygKICAgIGNvbnRleHQ6IE1MQ2xpZW50Q3R4LAogICAgZGY6IHBkLkRhdGFGcmFtZSwKICAgIGV4dHJhX2RhdGE6IGRpY3QsCiAgICBsYWJlbF9jb2x1bW46IHN0ciwKICAgIHBsb3RzX2Rlc3Q6IHN0ciwKICAgIHByb2JsZW1fdHlwZTogc3RyLAopOgogICAgIiIiCiAgICBDcmVhdGUgYW5kIGxvZyBhIGhpc3RvZ3JhbSBhcnRpZmFjdCBmb3IgZWFjaCBmZWF0dXJlCiAgICAiIiIKCiAgICBmaWdzID0gZGljdCgpCiAgICBmaXJzdF9mZWF0dXJlX25hbWUgPSAiIgogICAgaWYgbGFiZWxfY29sdW1uIGlzIG5vdCBOb25lIGFuZCBwcm9ibGVtX3R5cGUgPT0gImNsYXNzaWZpY2F0aW9uIjoKICAgICAgICBhbGxfbGFiZWxzID0gZGZbbGFiZWxfY29sdW1uXS51bmlxdWUoKQogICAgdmlzaWJsZSA9IFRydWUKICAgIGZvciAoY29sdW1uTmFtZSwgXykgaW4gZGYuaXRlcml0ZW1zKCk6CiAgICAgICAgaWYgY29sdW1uTmFtZSA9PSBsYWJlbF9jb2x1bW46CiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIGlmIGxhYmVsX2NvbHVtbiBpcyBub3QgTm9uZSBhbmQgcHJvYmxlbV90eXBlID09ICJjbGFzc2lmaWNhdGlvbiI6CiAgICAgICAgICAgIGZvciBsYWJlbCBpbiBhbGxfbGFiZWxzOgogICAgICAgICAgICAgICAgc3ViX2ZpZyA9IGdvLkhpc3RvZ3JhbSgKICAgICAgICAgICAgICAgICAgICBoaXN0ZnVuYz0iY291bnQiLAogICAgICAgICAgICAgICAgICAgIHg9ZGYubG9jW2RmW2xhYmVsX2NvbHVtbl0gPT0gbGFiZWxdW2NvbHVtbk5hbWVdLAogICAgICAgICAgICAgICAgICAgIG5hbWU9c3RyKGxhYmVsKSwKICAgICAgICAgICAgICAgICAgICB2aXNpYmxlPXZpc2libGUsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBmaWdzW2Yie2NvbHVtbk5hbWV9QD9Ae2xhYmVsfSJdID0gc3ViX2ZpZwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHN1Yl9maWcgPSBnby5IaXN0b2dyYW0oaGlzdGZ1bmM9ImNvdW50IiwgeD1kZltjb2x1bW5OYW1lXSwgdmlzaWJsZT12aXNpYmxlKQogICAgICAgICAgICBmaWdzW2Yie2NvbHVtbk5hbWV9QD9AezF9Il0gPSBzdWJfZmlnCiAgICAgICAgaWYgdmlzaWJsZToKICAgICAgICAgICAgZmlyc3RfZmVhdHVyZV9uYW1lID0gY29sdW1uTmFtZQogICAgICAgIHZpc2libGUgPSBGYWxzZQoKICAgIGZpZyA9IGdvLkZpZ3VyZSgpCiAgICBmb3IgayBpbiBmaWdzLmtleXMoKToKICAgICAgICBmaWcuYWRkX3RyYWNlKGZpZ3Nba10pCgogICAgZmlnLnVwZGF0ZV9sYXlvdXQoCiAgICAgICAgdXBkYXRlbWVudXM9WwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiYnV0dG9ucyI6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCI6IGNvbHVtbl9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAibWV0aG9kIjogInVwZGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJhcmdzIjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aXNpYmxlIjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkuc3BsaXQoIkA/QCIpWzBdID09IGNvbHVtbl9uYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBrZXkgaW4gZmlncy5rZXlzKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ4YXhpcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJhbmdlIjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKGRmW2NvbHVtbl9uYW1lXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgoZGZbY29sdW1uX25hbWVdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJ0aXRsZSI6IGYiPGk+PGI+SGlzdG9ncmFtIG9mIHtjb2x1bW5fbmFtZX08L2I+PC9pPiJ9LAogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmb3IgY29sdW1uX25hbWUgaW4gZGYuY29sdW1ucwogICAgICAgICAgICAgICAgICAgIGlmIGNvbHVtbl9uYW1lICE9IGxhYmVsX2NvbHVtbgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJkaXJlY3Rpb24iOiAiZG93biIsCiAgICAgICAgICAgICAgICAicGFkIjogeyJyIjogMTAsICJ0IjogMTB9LAogICAgICAgICAgICAgICAgInNob3dhY3RpdmUiOiBUcnVlLAogICAgICAgICAgICAgICAgIngiOiAwLjI1LAogICAgICAgICAgICAgICAgInhhbmNob3IiOiAibGVmdCIsCiAgICAgICAgICAgICAgICAieSI6IDEuMSwKICAgICAgICAgICAgICAgICJ5YW5jaG9yIjogInRvcCIsCiAgICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgIGFubm90YXRpb25zPVsKICAgICAgICAgICAgZGljdCgKICAgICAgICAgICAgICAgIHRleHQ9IlNlbGVjdCBGZWF0dXJlIE5hbWUgIiwKICAgICAgICAgICAgICAgIHNob3dhcnJvdz1GYWxzZSwKICAgICAgICAgICAgICAgIHg9MCwKICAgICAgICAgICAgICAgIHk9MS4wNSwKICAgICAgICAgICAgICAgIHlyZWY9InBhcGVyIiwKICAgICAgICAgICAgICAgIHhyZWY9InBhcGVyIiwKICAgICAgICAgICAgICAgIGFsaWduPSJsZWZ0IiwKICAgICAgICAgICAgICAgIHhhbmNob3I9ImxlZnQiLAogICAgICAgICAgICAgICAgeWFuY2hvcj0idG9wIiwKICAgICAgICAgICAgICAgIGZvbnQ9ewogICAgICAgICAgICAgICAgICAgICJjb2xvciI6ICJibHVlIiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICkKICAgICAgICBdLAogICAgKQoKICAgIGZpZy51cGRhdGVfbGF5b3V0KAogICAgICAgIHdpZHRoPTYwMCwKICAgICAgICBoZWlnaHQ9NDAwLAogICAgICAgIGF1dG9zaXplPUZhbHNlLAogICAgICAgIG1hcmdpbj1kaWN0KHQ9MTAwLCBiPTAsIGw9MCwgcj0wKSwKICAgICAgICB0ZW1wbGF0ZT0icGxvdGx5X3doaXRlIiwKICAgICkKCiAgICBmaWcudXBkYXRlX2xheW91dCh0aXRsZV90ZXh0PWYiPGk+PGI+SGlzdG9ncmFtcyBvZiB7Zmlyc3RfZmVhdHVyZV9uYW1lfTwvYj48L2k+IikKICAgIGV4dHJhX2RhdGFbZiJoaXN0b2dyYW1zIl0gPSBjb250ZXh0LmxvZ19hcnRpZmFjdCgKICAgICAgICBQbG90bHlBcnRpZmFjdChrZXk9ZiJoaXN0b2dyYW1zIiwgZmlndXJlPWZpZyksCiAgICAgICAgbG9jYWxfcGF0aD1mIntwbG90c19kZXN0fS9oaXN0b2dyYW1zLmh0bWwiLAogICAgKQoKCmRlZiBfY3JlYXRlX2ZlYXR1cmVzXzJkX3NjYXR0ZXJfYXJ0aWZhY3RzKAogICAgY29udGV4dDogTUxDbGllbnRDdHgsCiAgICBkZjogcGQuRGF0YUZyYW1lLAogICAgZXh0cmFfZGF0YTogZGljdCwKICAgIGxhYmVsX2NvbHVtbjogc3RyLAogICAgcGxvdHNfZGVzdDogc3RyLAogICAgcHJvYmxlbV90eXBlOiBzdHIsCik6CiAgICAiIiIKICAgIENyZWF0ZSBhbmQgbG9nIGEgc2NhdHRlci0yZCBhcnRpZmFjdCBmb3IgZWFjaCBjb3VwbGUgb2YgZmVhdHVyZXMKICAgICIiIgogICAgZmVhdHVyZXMgPSBbCiAgICAgICAgY29sdW1uTmFtZSBmb3IgKGNvbHVtbk5hbWUsIF8pIGluIGRmLml0ZXJpdGVtcygpIGlmIGNvbHVtbk5hbWUgIT0gbGFiZWxfY29sdW1uCiAgICBdCiAgICBtYXhfZmVhdHVyZV9sZW4gPSBmbG9hdChtYXgobGVuKGVsZW0pIGZvciBlbGVtIGluIGZlYXR1cmVzKSkKICAgIGlmIGxhYmVsX2NvbHVtbiBpcyBub3QgTm9uZToKICAgICAgICBsYWJlbHMgPSBzb3J0ZWQoZGZbbGFiZWxfY29sdW1uXS51bmlxdWUoKSkKICAgIGVsc2U6CiAgICAgICAgbGFiZWxzID0gW05vbmVdCiAgICBmaWcgPSBnby5GaWd1cmUoKQogICAgaWYgbGFiZWxfY29sdW1uIGlzIG5vdCBOb25lIGFuZCBwcm9ibGVtX3R5cGUgPT0gImNsYXNzaWZpY2F0aW9uIjoKICAgICAgICBmb3IgbCBpbiBsYWJlbHM6CiAgICAgICAgICAgIGZpZy5hZGRfdHJhY2UoCiAgICAgICAgICAgICAgICBnby5TY2F0dGVyKAogICAgICAgICAgICAgICAgICAgIHg9ZGYubG9jW2RmW2xhYmVsX2NvbHVtbl0gPT0gbF1bZmVhdHVyZXNbMF1dLAogICAgICAgICAgICAgICAgICAgIHk9ZGYubG9jW2RmW2xhYmVsX2NvbHVtbl0gPT0gbF1bZmVhdHVyZXNbMF1dLAogICAgICAgICAgICAgICAgICAgIG1vZGU9Im1hcmtlcnMiLAogICAgICAgICAgICAgICAgICAgIHZpc2libGU9VHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzaG93bGVnZW5kPVRydWUsCiAgICAgICAgICAgICAgICAgICAgbmFtZT1zdHIobCksCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICkKICAgIGVsaWYgbGFiZWxfY29sdW1uIGlzIE5vbmU6CiAgICAgICAgZmlnLmFkZF90cmFjZSgKICAgICAgICAgICAgZ28uU2NhdHRlcigKICAgICAgICAgICAgICAgIHg9ZGZbZmVhdHVyZXNbMF1dLAogICAgICAgICAgICAgICAgeT1kZltmZWF0dXJlc1swXV0sCiAgICAgICAgICAgICAgICBtb2RlPSJtYXJrZXJzIiwKICAgICAgICAgICAgICAgIHZpc2libGU9VHJ1ZSwKICAgICAgICAgICAgKQogICAgICAgICkKICAgIGVsaWYgcHJvYmxlbV90eXBlID09ICJyZWdyZXNzaW9uIjoKICAgICAgICBmaWcuYWRkX3RyYWNlKAogICAgICAgICAgICBnby5TY2F0dGVyKAogICAgICAgICAgICAgICAgeD1kZltmZWF0dXJlc1swXV0sCiAgICAgICAgICAgICAgICB5PWRmW2ZlYXR1cmVzWzBdXSwKICAgICAgICAgICAgICAgIG1vZGU9Im1hcmtlcnMiLAogICAgICAgICAgICAgICAgbWFya2VyPWRpY3QoCiAgICAgICAgICAgICAgICAgICAgY29sb3I9ZGZbbGFiZWxfY29sdW1uXSwgY29sb3JzY2FsZT0iVmlyaWRpcyIsIHNob3dzY2FsZT1UcnVlCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgdmlzaWJsZT1UcnVlLAogICAgICAgICAgICApCiAgICAgICAgKQoKICAgIHhfYnV0dG9ucyA9IFtdCiAgICB5X2J1dHRvbnMgPSBbXQoKICAgIGZvciBuY29sIGluIGZlYXR1cmVzOgogICAgICAgIGlmIHByb2JsZW1fdHlwZSA9PSAiY2xhc3NpZmljYXRpb24iIGFuZCBsYWJlbF9jb2x1bW4gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHhfYnV0dG9ucy5hcHBlbmQoCiAgICAgICAgICAgICAgICBkaWN0KAogICAgICAgICAgICAgICAgICAgIG1ldGhvZD0idXBkYXRlIiwKICAgICAgICAgICAgICAgICAgICBsYWJlbD1uY29sLAogICAgICAgICAgICAgICAgICAgIGFyZ3M9WwogICAgICAgICAgICAgICAgICAgICAgICB7IngiOiBbZGYubG9jW2RmW2xhYmVsX2NvbHVtbl0gPT0gbF1bbmNvbF0gZm9yIGwgaW4gbGFiZWxzXX0sCiAgICAgICAgICAgICAgICAgICAgICAgIG5wLmFyYW5nZShsZW4obGFiZWxzKSkudG9saXN0KCksCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKQoKICAgICAgICAgICAgeV9idXR0b25zLmFwcGVuZCgKICAgICAgICAgICAgICAgIGRpY3QoCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kPSJ1cGRhdGUiLAogICAgICAgICAgICAgICAgICAgIGxhYmVsPW5jb2wsCiAgICAgICAgICAgICAgICAgICAgYXJncz1bCiAgICAgICAgICAgICAgICAgICAgICAgIHsieSI6IFtkZi5sb2NbZGZbbGFiZWxfY29sdW1uXSA9PSBsXVtuY29sXSBmb3IgbCBpbiBsYWJlbHNdfSwKICAgICAgICAgICAgICAgICAgICAgICAgbnAuYXJhbmdlKGxlbihsYWJlbHMpKS50b2xpc3QoKSwKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgeF9idXR0b25zLmFwcGVuZCgKICAgICAgICAgICAgICAgIGRpY3QobWV0aG9kPSJ1cGRhdGUiLCBsYWJlbD1uY29sLCBhcmdzPVt7IngiOiBbZGZbbmNvbF1dfV0pCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIHlfYnV0dG9ucy5hcHBlbmQoCiAgICAgICAgICAgICAgICBkaWN0KG1ldGhvZD0idXBkYXRlIiwgbGFiZWw9bmNvbCwgYXJncz1beyJ5IjogW2RmW25jb2xdXX1dKQogICAgICAgICAgICApCgogICAgIyBQYXNzIGJ1dHRvbnMgdG8gdGhlIHVwZGF0ZW1lbnVzIGFyZ3VtZW50CiAgICBmaWcudXBkYXRlX2xheW91dCgKICAgICAgICB1cGRhdGVtZW51cz1bCiAgICAgICAgICAgIGRpY3QoYnV0dG9ucz14X2J1dHRvbnMsIGRpcmVjdGlvbj0idXAiLCB4PTAuNSwgeT0tMC4xKSwKICAgICAgICAgICAgZGljdChidXR0b25zPXlfYnV0dG9ucywgZGlyZWN0aW9uPSJkb3duIiwgeD0tbWF4X2ZlYXR1cmVfbGVuIC8gMTAwLCB5PTAuNSksCiAgICAgICAgXQogICAgKQoKICAgIGZpZy51cGRhdGVfbGF5b3V0KAogICAgICAgIHdpZHRoPTYwMCwKICAgICAgICBoZWlnaHQ9NDAwLAogICAgICAgIGF1dG9zaXplPUZhbHNlLAogICAgICAgIG1hcmdpbj1kaWN0KHQ9MTAwLCBiPTAsIGw9MCwgcj0wKSwKICAgICAgICB0ZW1wbGF0ZT0icGxvdGx5X3doaXRlIiwKICAgICkKCiAgICBmaWcudXBkYXRlX2xheW91dCh0aXRsZV90ZXh0PWYiPGk+PGI+U2NhdHRlci0yZDwvYj48L2k+IikKICAgIGV4dHJhX2RhdGFbZiJzY2F0dGVyLTJkIl0gPSBjb250ZXh0LmxvZ19hcnRpZmFjdCgKICAgICAgICBQbG90bHlBcnRpZmFjdChrZXk9ZiJzY2F0dGVyLTJkIiwgZmlndXJlPWZpZyksCiAgICAgICAgbG9jYWxfcGF0aD1mIntwbG90c19kZXN0fS9zY2F0dGVyLTJkLmh0bWwiLAogICAgKQoKCmRlZiBfY3JlYXRlX3Zpb2xpbl9hcnRpZmFjdCgKICAgIGNvbnRleHQ6IE1MQ2xpZW50Q3R4LCBkZjogcGQuRGF0YUZyYW1lLCBleHRyYV9kYXRhOiBkaWN0LCBwbG90c19kZXN0OiBzdHIKKToKICAgICIiIgogICAgQ3JlYXRlIGFuZCBsb2cgYSB2aW9saW4gYXJ0aWZhY3QKICAgICIiIgogICAgY29scyA9IDUKICAgIHJvd3MgPSAoZGYuc2hhcGVbMV0gLy8gY29scykgKyAxCiAgICBmaWcgPSBtYWtlX3N1YnBsb3RzKHJvd3M9cm93cywgY29scz1jb2xzKQoKICAgIHBsb3RfbnVtID0gMAoKICAgIGZvciAoY29sdW1uTmFtZSwgY29sdW1uRGF0YSkgaW4gZGYuaXRlcml0ZW1zKCk6CiAgICAgICAgdmlvbGluID0gZ28uVmlvbGluKAogICAgICAgICAgICB4PVtjb2x1bW5OYW1lXSAqIGNvbHVtbkRhdGEuc2hhcGVbMF0sCiAgICAgICAgICAgIHk9Y29sdW1uRGF0YSwKICAgICAgICAgICAgbmFtZT1jb2x1bW5OYW1lLAogICAgICAgICkKCiAgICAgICAgZmlnLmFkZF90cmFjZSgKICAgICAgICAgICAgdmlvbGluLAogICAgICAgICAgICByb3c9KHBsb3RfbnVtIC8vIGNvbHMpICsgMSwKICAgICAgICAgICAgY29sPShwbG90X251bSAlIGNvbHMpICsgMSwKICAgICAgICApCgogICAgICAgIHBsb3RfbnVtICs9IDEKCiAgICBmaWdbImxheW91dCJdLnVwZGF0ZSgKICAgICAgICBoZWlnaHQ9KHJvd3MgKyAxKSAqIDIwMCwKICAgICAgICB3aWR0aD0oY29scyArIDEpICogMjAwLAogICAgICAgIHRpdGxlPSI8aT48Yj5WaW9saW4gUGxvdHM8L2I+PC9pPiIsCiAgICApCgogICAgZmlnLnVwZGF0ZV9sYXlvdXQoc2hvd2xlZ2VuZD1GYWxzZSkKICAgIGV4dHJhX2RhdGFbInZpb2xpbiJdID0gY29udGV4dC5sb2dfYXJ0aWZhY3QoCiAgICAgICAgUGxvdGx5QXJ0aWZhY3Qoa2V5PSJ2aW9saW4iLCBmaWd1cmU9ZmlnKSwKICAgICAgICBsb2NhbF9wYXRoPWYie3Bsb3RzX2Rlc3R9L3Zpb2xpbi5odG1sIiwKICAgICkKCgpkZWYgX2NyZWF0ZV9pbWJhbGFuY2VfYXJ0aWZhY3QoCiAgICBjb250ZXh0OiBNTENsaWVudEN0eCwKICAgIGRmOiBwZC5EYXRhRnJhbWUsCiAgICBleHRyYV9kYXRhOiBkaWN0LAogICAgbGFiZWxfY29sdW1uOiBzdHIsCiAgICBwbG90c19kZXN0OiBzdHIsCiAgICBwcm9ibGVtX3R5cGU6IHN0ciwKKToKICAgICIiIgogICAgQ3JlYXRlIGFuZCBsb2cgYW4gaW1iYWxhbmNlIGNsYXNzIGFydGlmYWN0IChjc3YgKyBwbG90KQogICAgIiIiCiAgICBpZiBsYWJlbF9jb2x1bW46CiAgICAgICAgaWYgcHJvYmxlbV90eXBlID09ICJjbGFzc2lmaWNhdGlvbiI6CiAgICAgICAgICAgIGxhYmVsc19jb3VudCA9IGRmW2xhYmVsX2NvbHVtbl0udmFsdWVfY291bnRzKCkuc29ydF9pbmRleCgpCiAgICAgICAgICAgIGRmX2xhYmVsc19jb3VudCA9IHBkLkRhdGFGcmFtZShsYWJlbHNfY291bnQpCiAgICAgICAgICAgIGRmX2xhYmVsc19jb3VudC5yZW5hbWUoY29sdW1ucz17bGFiZWxfY29sdW1uOiAiVG90YWwifSwgaW5wbGFjZT1UcnVlKQogICAgICAgICAgICBkZl9sYWJlbHNfY291bnRbbGFiZWxfY29sdW1uXSA9IGxhYmVsc19jb3VudC5pbmRleAogICAgICAgICAgICBkZl9sYWJlbHNfY291bnRbIndlaWdodHMiXSA9IGRmX2xhYmVsc19jb3VudFsiVG90YWwiXSAvIHN1bSgKICAgICAgICAgICAgICAgIGRmX2xhYmVsc19jb3VudFsiVG90YWwiXQogICAgICAgICAgICApCgogICAgICAgICAgICBmaWcgPSBweC5waWUoZGZfbGFiZWxzX2NvdW50LCBuYW1lcz1sYWJlbF9jb2x1bW4sIHZhbHVlcz0iVG90YWwiKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGZpZyA9IHB4Lmhpc3RvZ3JhbSgKICAgICAgICAgICAgICAgIGhpc3RmdW5jPSJjb3VudCIsCiAgICAgICAgICAgICAgICB4PWRmW2xhYmVsX2NvbHVtbl0sCiAgICAgICAgICAgICkKICAgICAgICAgICAgaGlzdCA9IG5wLmhpc3RvZ3JhbShkZltsYWJlbF9jb2x1bW5dKQogICAgICAgICAgICBkZl9sYWJlbHNfY291bnQgPSBwZC5EYXRhRnJhbWUoCiAgICAgICAgICAgICAgICB7Im1pbl92YWwiOiBoaXN0WzFdLCAiY291bnQiOiBoaXN0WzBdLnRvbGlzdCgpICsgWzBdfQogICAgICAgICAgICApCiAgICAgICAgZmlnLnVwZGF0ZV9sYXlvdXQodGl0bGVfdGV4dD0iPGk+PGI+TGFiZWxzIEltYmFsYW5jZTwvYj48L2k+IikKICAgICAgICBleHRyYV9kYXRhWyJpbWJhbGFuY2UiXSA9IGNvbnRleHQubG9nX2FydGlmYWN0KAogICAgICAgICAgICBQbG90bHlBcnRpZmFjdChrZXk9ImltYmFsYW5jZSIsIGZpZ3VyZT1maWcpLAogICAgICAgICAgICBsb2NhbF9wYXRoPWYie3Bsb3RzX2Rlc3R9L2ltYmFsYW5jZS5odG1sIiwKICAgICAgICApCiAgICAgICAgZXh0cmFfZGF0YVsiaW1iYWxhbmNlLWNzdiJdID0gY29udGV4dC5sb2dfYXJ0aWZhY3QoCiAgICAgICAgICAgIFRhYmxlQXJ0aWZhY3QoImltYmFsYW5jZS13ZWlnaHRzLXZlYyIsIGRmPWRmX2xhYmVsc19jb3VudCksCiAgICAgICAgICAgIGxvY2FsX3BhdGg9ZiJ7cGxvdHNfZGVzdH0vaW1iYWxhbmNlLXdlaWdodHMtdmVjLmNzdiIsCiAgICAgICAgKQoKCmRlZiBfY3JlYXRlX2NvcnJfYXJ0aWZhY3QoCiAgICBjb250ZXh0OiBNTENsaWVudEN0eCwKICAgIGRmOiBwZC5EYXRhRnJhbWUsCiAgICBleHRyYV9kYXRhOiBkaWN0LAogICAgbGFiZWxfY29sdW1uOiBzdHIsCiAgICBwbG90c19kZXN0OiBzdHIsCik6CiAgICAiIiIKICAgIENyZWF0ZSBhbmQgbG9nIGFuIGNvcnJlbGF0aW9uLW1hdHJpeCBhcnRpZmFjdCAoY3N2ICsgcGxvdCkKICAgICIiIgogICAgaWYgbGFiZWxfY29sdW1uIGlzIG5vdCBOb25lOgogICAgICAgIGRmID0gZGYuZHJvcChbbGFiZWxfY29sdW1uXSwgYXhpcz0xKQogICAgdGJsY29yciA9IGRmLmNvcnIoKQogICAgZXh0cmFfZGF0YVsiY29ycmVsYXRpb24tbWF0cml4LWNzdiJdID0gY29udGV4dC5sb2dfYXJ0aWZhY3QoCiAgICAgICAgVGFibGVBcnRpZmFjdCgiY29ycmVsYXRpb24tbWF0cml4LWNzdiIsIGRmPXRibGNvcnIsIHZpc2libGU9VHJ1ZSksCiAgICAgICAgbG9jYWxfcGF0aD1mIntwbG90c19kZXN0fS9jb3JyZWxhdGlvbi1tYXRyaXguY3N2IiwKICAgICkKCiAgICB6ID0gdGJsY29yci52YWx1ZXMudG9saXN0KCkKICAgIHpfdGV4dCA9IFtbIns6LjJmfSIuZm9ybWF0KHkpIGZvciB5IGluIHhdIGZvciB4IGluIHpdCiAgICBmaWcgPSBmZi5jcmVhdGVfYW5ub3RhdGVkX2hlYXRtYXAoCiAgICAgICAgeiwKICAgICAgICB4PWxpc3QodGJsY29yci5jb2x1bW5zKSwKICAgICAgICB5PWxpc3QodGJsY29yci5jb2x1bW5zKSwKICAgICAgICBhbm5vdGF0aW9uX3RleHQ9el90ZXh0LAogICAgICAgIGNvbG9yc2NhbGU9ImFnc3Vuc2V0IiwKICAgICkKICAgIGZpZ1sibGF5b3V0Il1bInlheGlzIl1bImF1dG9yYW5nZSJdID0gInJldmVyc2VkIiAgIyBsIC0+IHIKICAgIGZpZy51cGRhdGVfbGF5b3V0KHRpdGxlX3RleHQ9IjxpPjxiPkNvcnJlbGF0aW9uIG1hdHJpeDwvYj48L2k+IikKICAgIGZpZ1siZGF0YSJdWzBdWyJzaG93c2NhbGUiXSA9IFRydWUKCiAgICBleHRyYV9kYXRhWyJjb3JyZWxhdGlvbiJdID0gY29udGV4dC5sb2dfYXJ0aWZhY3QoCiAgICAgICAgUGxvdGx5QXJ0aWZhY3Qoa2V5PSJjb3JyZWxhdGlvbiIsIGZpZ3VyZT1maWcpLAogICAgICAgIGxvY2FsX3BhdGg9ZiJ7cGxvdHNfZGVzdH0vY29ycmVsYXRpb24uaHRtbCIsCiAgICApCg== - commands: [] - code_origin: https://github.com/davesh0812/functions.git#6c5f9ed5f39ccb1e0f478eee7b4aa10994dfd22b:/Users/davids/Projects/functions/describe/describe.py - origin_filename: /Users/davids/Projects/functions/describe/describe.py entry_points: analyze: - name: analyze - doc: 'The function will output the following artifacts per - - column within the data frame (based on data types) - - If the data has more than 500,000 sample we - - sample randomly 500,000 samples: - - - describe csv - - histograms - - scatter-2d - - violin chart - - correlation-matrix chart - - correlation-matrix csv - - imbalance pie chart - - imbalance-weights-vec csv' parameters: - name: context type: MLClientCtx doc: The function context - default: '' - name: name type: str doc: Key of dataset to database ("dataset" for default) @@ -86,15 +44,47 @@ spec: - name: dask_client doc: Dask client object default: null - outputs: - - default: '' + has_varargs: false lineno: 46 - description: describe and visualizes dataset stats - default_handler: analyze + outputs: + - type: None + name: analyze + has_kwargs: false + doc: 'The function will output the following artifacts per + + column within the data frame (based on data types) + + If the data has more than 500,000 sample we + + sample randomly 500,000 samples: + + + describe csv + + histograms + + scatter-2d + + violin chart + + correlation-matrix chart + + correlation-matrix csv + + imbalance pie chart + + imbalance-weights-vec csv' disable_auto_mount: false - env: [] - priority_class_name: '' - preemption_mode: prevent - affinity: null - tolerations: null -verbose: false + default_handler: analyze + description: describe and visualizes dataset stats + build: + functionSourceCode: IyBDb3B5cmlnaHQgMjAxOSBJZ3VhemlvCiMKIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiMKIyBHZW5lcmF0ZWQgYnkgbnVjbGlvLmV4cG9ydC5OdWNsaW9FeHBvcnRlcgoKaW1wb3J0IHdhcm5pbmdzCmZyb20gdHlwaW5nIGltcG9ydCBVbmlvbgoKaW1wb3J0IG1scnVuCmltcG9ydCBudW1weSBhcyBucAoKd2FybmluZ3Muc2ltcGxlZmlsdGVyKGFjdGlvbj0iaWdub3JlIiwgY2F0ZWdvcnk9RnV0dXJlV2FybmluZykKCmltcG9ydCBtbHJ1bi5mZWF0dXJlX3N0b3JlIGFzIGZzdG9yZQppbXBvcnQgcGFuZGFzIGFzIHBkCmltcG9ydCBwbG90bHkuZXhwcmVzcyBhcyBweAppbXBvcnQgcGxvdGx5LmZpZ3VyZV9mYWN0b3J5IGFzIGZmCmltcG9ydCBwbG90bHkuZ3JhcGhfb2JqZWN0cyBhcyBnbwpmcm9tIG1scnVuLmFydGlmYWN0cyBpbXBvcnQgKAogICAgQXJ0aWZhY3QsCiAgICBEYXRhc2V0QXJ0aWZhY3QsCiAgICBQbG90bHlBcnRpZmFjdCwKICAgIFRhYmxlQXJ0aWZhY3QsCiAgICB1cGRhdGVfZGF0YXNldF9tZXRhLAopCmZyb20gbWxydW4uZGF0YXN0b3JlIGltcG9ydCBEYXRhSXRlbQpmcm9tIG1scnVuLmV4ZWN1dGlvbiBpbXBvcnQgTUxDbGllbnRDdHgKZnJvbSBtbHJ1bi5mZWF0dXJlX3N0b3JlIGltcG9ydCBGZWF0dXJlU2V0CmZyb20gcGxvdGx5LnN1YnBsb3RzIGltcG9ydCBtYWtlX3N1YnBsb3RzCgpwZC5zZXRfb3B0aW9uKCJkaXNwbGF5LmZsb2F0X2Zvcm1hdCIsIGxhbWJkYSB4OiAiJS4yZiIgJSB4KQpNQVhfU0laRV9PRl9ERiA9IDUwMDAwMAoKCmRlZiBhbmFseXplKAogICAgY29udGV4dDogTUxDbGllbnRDdHgsCiAgICBuYW1lOiBzdHIgPSAiZGF0YXNldCIsCiAgICB0YWJsZTogVW5pb25bRmVhdHVyZVNldCwgRGF0YUl0ZW1dID0gTm9uZSwKICAgIGxhYmVsX2NvbHVtbjogc3RyID0gTm9uZSwKICAgIHBsb3RzX2Rlc3Q6IHN0ciA9ICJwbG90cyIsCiAgICByYW5kb21fc3RhdGU6IGludCA9IDEsCiAgICBwcm9ibGVtX3R5cGU6IHN0ciA9ICJjbGFzc2lmaWNhdGlvbiIsCiAgICBkYXNrX2tleTogc3RyID0gImRhc2tfa2V5IiwKICAgIGRhc2tfZnVuY3Rpb246IHN0ciA9IE5vbmUsCiAgICBkYXNrX2NsaWVudD1Ob25lLAopIC0+IE5vbmU6CiAgICAiIiIKICAgIFRoZSBmdW5jdGlvbiB3aWxsIG91dHB1dCB0aGUgZm9sbG93aW5nIGFydGlmYWN0cyBwZXIKICAgIGNvbHVtbiB3aXRoaW4gdGhlIGRhdGEgZnJhbWUgKGJhc2VkIG9uIGRhdGEgdHlwZXMpCiAgICBJZiB0aGUgZGF0YSBoYXMgbW9yZSB0aGFuIDUwMCwwMDAgc2FtcGxlIHdlCiAgICBzYW1wbGUgcmFuZG9tbHkgNTAwLDAwMCBzYW1wbGVzOgoKICAgIGRlc2NyaWJlIGNzdgogICAgaGlzdG9ncmFtcwogICAgc2NhdHRlci0yZAogICAgdmlvbGluIGNoYXJ0CiAgICBjb3JyZWxhdGlvbi1tYXRyaXggY2hhcnQKICAgIGNvcnJlbGF0aW9uLW1hdHJpeCBjc3YKICAgIGltYmFsYW5jZSBwaWUgY2hhcnQKICAgIGltYmFsYW5jZS13ZWlnaHRzLXZlYyBjc3YKCiAgICA6cGFyYW0gY29udGV4dDogICAgICAgICAgICAgICAgIFRoZSBmdW5jdGlvbiBjb250ZXh0CiAgICA6cGFyYW0gbmFtZTogICAgICAgICAgICAgICAgICAgIEtleSBvZiBkYXRhc2V0IHRvIGRhdGFiYXNlICgiZGF0YXNldCIgZm9yIGRlZmF1bHQpCiAgICA6cGFyYW0gdGFibGU6ICAgICAgICAgICAgICAgICAgIE1MUnVuIGlucHV0IHBvaW50aW5nIHRvIHBhbmRhcyBkYXRhZnJhbWUgKGNzdi9wYXJxdWV0IGZpbGUgcGF0aCkgb3IgRmVhdHVyZVNldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyBwYXJhbQogICAgOnBhcmFtIGxhYmVsX2NvbHVtbjogICAgICAgICAgICBHcm91bmQgdHJ1dGggY29sdW1uIGxhYmVsCiAgICA6cGFyYW0gcGxvdHNfZGVzdDogICAgICAgICAgICAgIERlc3RpbmF0aW9uIGZvbGRlciBvZiBzdW1tYXJ5IHBsb3RzIChyZWxhdGl2ZSB0byBhcnRpZmFjdF9wYXRoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoInBsb3RzIiBmb3IgZGVmYXVsdCkKICAgIDpwYXJhbSByYW5kb21fc3RhdGU6ICAgICAgICAgICAgV2hlbiB0aGUgdGFibGUgaGFzIG1vcmUgdGhhbiA1MDAsMDAwIHNhbXBsZXMsIHdlIHNhbXBsZSByYW5kb21seSA1MDAsMDAwIHNhbXBsZXMKICAgIDpwYXJhbSBwcm9ibGVtX3R5cGUgICAgICAgICAgICAgVGhlIHR5cGUgb2YgdGhlIE1MIHByb2JsZW0gdGhlIGRhdGEgZmFjaW5nIC0gcmVncmVzc2lvbiwgY2xhc3NpZmljYXRpb24gb3IgTm9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xhc3NpZmljYXRpb24gZm9yIGRlZmF1bHQpCiAgICA6cGFyYW0gZGFza19rZXk6ICAgICAgICAgICAgICAgIEtleSBvZiBkYXRhZnJhbWUgaW4gZGFzayBjbGllbnQgImRhdGFzZXRzIiBhdHRyaWJ1dGUKICAgIDpwYXJhbSBkYXNrX2Z1bmN0aW9uOiAgICAgICAgICAgRGFzayBmdW5jdGlvbiB1cmwgKGRiOi8vLi4pCiAgICA6cGFyYW0gZGFza19jbGllbnQ6ICAgICAgICAgICAgIERhc2sgY2xpZW50IG9iamVjdAogICAgIiIiCiAgICBkYXRhX2l0ZW0sIGZlYXR1cmVzZXQsIGNyZWF0LCB1cGRhdGUgPSBGYWxzZSwgRmFsc2UsIEZhbHNlLCBGYWxzZQogICAgZ2V0X2Zyb21fdGFibGUgPSBUcnVlCiAgICBpZiBkYXNrX2Z1bmN0aW9uIG9yIGRhc2tfY2xpZW50OgogICAgICAgIGRhdGFfaXRlbSwgY3JlYXQgPSBUcnVlLCBUcnVlCiAgICAgICAgaWYgZGFza19mdW5jdGlvbjoKICAgICAgICAgICAgY2xpZW50ID0gbWxydW4uaW1wb3J0X2Z1bmN0aW9uKGRhc2tfZnVuY3Rpb24pLmNsaWVudAogICAgICAgIGVsaWYgZGFza19jbGllbnQ6CiAgICAgICAgICAgIGNsaWVudCA9IGRhc2tfY2xpZW50CiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZGFzayBjbGllbnQgd2FzIG5vdCBwcm92aWRlZCIpCgogICAgICAgIGlmIGRhc2tfa2V5IGluIGNsaWVudC5kYXRhc2V0czoKICAgICAgICAgICAgZGYgPSBjbGllbnQuZ2V0X2RhdGFzZXQoZGFza19rZXkpCiAgICAgICAgICAgIGRhdGFfaXRlbSwgY3JlYXQsIGdldF9mcm9tX3RhYmxlID0gVHJ1ZSwgVHJ1ZSwgRmFsc2UKICAgICAgICBlbGlmIHRhYmxlOgogICAgICAgICAgICBnZXRfZnJvbV90YWJsZSA9IFRydWUKICAgICAgICBlbHNlOgogICAgICAgICAgICBjb250ZXh0LmxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgZiJvbmx5IHRoZXNlIGRhdGFzZXRzIGFyZSBhdmFpbGFibGUge2NsaWVudC5kYXRhc2V0c30gaW4gY2xpZW50IHtjbGllbnR9IgogICAgICAgICAgICApCiAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiZGF0YXNldCBub3QgZm91bmQgb24gZGFzayBjbHVzdGVyIikKCiAgICBpZiBnZXRfZnJvbV90YWJsZToKICAgICAgICBpZiB0eXBlKHRhYmxlKSA9PSBEYXRhSXRlbToKICAgICAgICAgICAgaWYgdGFibGUubWV0YSBpcyBOb25lOgogICAgICAgICAgICAgICAgZGF0YV9pdGVtLCBjcmVhdCwgdXBkYXRlID0gVHJ1ZSwgVHJ1ZSwgRmFsc2UKICAgICAgICAgICAgZWxpZiB0YWJsZS5tZXRhLmtpbmQgPT0gImRhdGFzZXQiOgogICAgICAgICAgICAgICAgZGF0YV9pdGVtLCBjcmVhdCwgdXBkYXRlID0gVHJ1ZSwgRmFsc2UsIFRydWUKICAgICAgICAgICAgZWxpZiB0YWJsZS5tZXRhLmtpbmQgPT0gIkZlYXR1cmVWZWN0b3IiOgogICAgICAgICAgICAgICAgZGF0YV9pdGVtLCBjcmVhdCwgdXBkYXRlID0gVHJ1ZSwgRmFsc2UsIEZhbHNlCiAgICAgICAgICAgIGVsaWYgdGFibGUubWV0YS5raW5kID09ICJGZWF0dXJlU2V0IjoKICAgICAgICAgICAgICAgIGZlYXR1cmVzZXQsIGNyZWF0LCB1cGRhdGUgPSBUcnVlLCBGYWxzZSwgRmFsc2UKCiAgICAgICAgaWYgZGF0YV9pdGVtOgogICAgICAgICAgICBkZiA9IHRhYmxlLmFzX2RmKCkKICAgICAgICBlbGlmIGZlYXR1cmVzZXQ6CiAgICAgICAgICAgIHByb2plY3RfbmFtZSwgc2V0X25hbWUgPSAoCiAgICAgICAgICAgICAgICB0YWJsZS5fcGF0aC5zcGxpdCgiLyIpWzJdLAogICAgICAgICAgICAgICAgdGFibGUuX3BhdGguc3BsaXQoIi8iKVs0XSwKICAgICAgICAgICAgKQogICAgICAgICAgICBmZWF0dXJlX3NldCA9IGZzdG9yZS5nZXRfZmVhdHVyZV9zZXQoCiAgICAgICAgICAgICAgICBmInN0b3JlOi8vZmVhdHVyZS1zZXRzL3twcm9qZWN0X25hbWV9L3tzZXRfbmFtZX0iCiAgICAgICAgICAgICkKICAgICAgICAgICAgZGYgPSBmZWF0dXJlX3NldC50b19kYXRhZnJhbWUoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNvbnRleHQubG9nZ2VyLmVycm9yKGYiV3JvbmcgdGFibGUgdHlwZS4iKQogICAgICAgICAgICByZXR1cm4KCiAgICBpZiBkZi5zaXplID4gTUFYX1NJWkVfT0ZfREY6CiAgICAgICAgZGYgPSBkZi5zYW1wbGUobj1pbnQoTUFYX1NJWkVfT0ZfREYgLyBkZi5zaGFwZVsxXSksIHJhbmRvbV9zdGF0ZT1yYW5kb21fc3RhdGUpCiAgICBleHRyYV9kYXRhID0ge30KCiAgICBpZiBsYWJlbF9jb2x1bW4gbm90IGluIGRmLmNvbHVtbnM6CiAgICAgICAgbGFiZWxfY29sdW1uID0gTm9uZQoKICAgIGV4dHJhX2RhdGFbImRlc2NyaWJlIGNzdiJdID0gY29udGV4dC5sb2dfYXJ0aWZhY3QoCiAgICAgICAgVGFibGVBcnRpZmFjdCgiZGVzY3JpYmUtY3N2IiwgZGY9ZGYuZGVzY3JpYmUoKSksCiAgICAgICAgbG9jYWxfcGF0aD1mIntwbG90c19kZXN0fS9kZXNjcmliZS5jc3YiLAogICAgKQoKICAgIHRyeToKICAgICAgICBfY3JlYXRlX2hpc3RvZ3JhbV9tYXRfYXJ0aWZhY3QoCiAgICAgICAgICAgIGNvbnRleHQsIGRmLCBleHRyYV9kYXRhLCBsYWJlbF9jb2x1bW4sIHBsb3RzX2Rlc3QKICAgICAgICApCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgY29udGV4dC5sb2dnZXIud2FybihmIkZhaWxlZCB0byBjcmVhdGUgaGlzdG9ncmFtIG1hdHJpeCBhcnRpZmFjdCBkdWUgdG86IHtlfSIpCiAgICB0cnk6CiAgICAgICAgX2NyZWF0ZV9mZWF0dXJlc19oaXN0b2dyYW1fYXJ0aWZhY3RzKAogICAgICAgICAgICBjb250ZXh0LCBkZiwgZXh0cmFfZGF0YSwgbGFiZWxfY29sdW1uLCBwbG90c19kZXN0LCBwcm9ibGVtX3R5cGUKICAgICAgICApCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgY29udGV4dC5sb2dnZXIud2FybihmIkZhaWxlZCB0byBjcmVhdGUgcGFpcnBsb3QgaGlzdG9ncmFtcyBkdWUgdG86IHtlfSIpCiAgICB0cnk6CiAgICAgICAgX2NyZWF0ZV9mZWF0dXJlc18yZF9zY2F0dGVyX2FydGlmYWN0cygKICAgICAgICAgICAgY29udGV4dCwgZGYsIGV4dHJhX2RhdGEsIGxhYmVsX2NvbHVtbiwgcGxvdHNfZGVzdCwgcHJvYmxlbV90eXBlCiAgICAgICAgKQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIGNvbnRleHQubG9nZ2VyLndhcm4oZiJGYWlsZWQgdG8gY3JlYXRlIHBhaXJwbG90IDJkX3NjYXR0ZXIgZHVlIHRvOiB7ZX0iKQogICAgdHJ5OgogICAgICAgIF9jcmVhdGVfdmlvbGluX2FydGlmYWN0KGNvbnRleHQsIGRmLCBleHRyYV9kYXRhLCBwbG90c19kZXN0KQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIGNvbnRleHQubG9nZ2VyLndhcm4oZiJGYWlsZWQgdG8gY3JlYXRlIHZpb2xpbiBkaXN0cmlidXRpb24gcGxvdHMgZHVlIHRvOiB7ZX0iKQogICAgdHJ5OgogICAgICAgIF9jcmVhdGVfaW1iYWxhbmNlX2FydGlmYWN0KAogICAgICAgICAgICBjb250ZXh0LCBkZiwgZXh0cmFfZGF0YSwgbGFiZWxfY29sdW1uLCBwbG90c19kZXN0LCBwcm9ibGVtX3R5cGUKICAgICAgICApCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgY29udGV4dC5sb2dnZXIud2FybihmIkZhaWxlZCB0byBjcmVhdGUgY2xhc3MgaW1iYWxhbmNlIHBsb3QgZHVlIHRvOiB7ZX0iKQogICAgdHJ5OgogICAgICAgIF9jcmVhdGVfY29ycl9hcnRpZmFjdChjb250ZXh0LCBkZiwgZXh0cmFfZGF0YSwgbGFiZWxfY29sdW1uLCBwbG90c19kZXN0KQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIGNvbnRleHQubG9nZ2VyLndhcm4oZiJGYWlsZWQgdG8gY3JlYXRlIGZlYXR1cmVzIGNvcnJlbGF0aW9uIHBsb3QgZHVlIHRvOiB7ZX0iKQoKICAgIGlmIG5vdCBkYXRhX2l0ZW06CiAgICAgICAgcmV0dXJuCgogICAgYXJ0aWZhY3QgPSB0YWJsZS5hcnRpZmFjdF91cmwKICAgIGlmIGNyZWF0OiAgIyBkYXRhc2V0IG5vdCBzdG9yZWQKICAgICAgICBhcnRpZmFjdCA9IERhdGFzZXRBcnRpZmFjdCgKICAgICAgICAgICAga2V5PSJkYXRhc2V0Iiwgc3RhdHM9VHJ1ZSwgZGY9ZGYsIGV4dHJhX2RhdGE9ZXh0cmFfZGF0YQogICAgICAgICkKICAgICAgICBhcnRpZmFjdCA9IGNvbnRleHQubG9nX2FydGlmYWN0KGFydGlmYWN0LCBkYl9rZXk9bmFtZSkKICAgICAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYiVGhlIGRhdGEgc2V0IGlzIGxvZ2dlZCB0byB0aGUgcHJvamVjdCB1bmRlciB7bmFtZX0gbmFtZSIpCgogICAgaWYgdXBkYXRlOgogICAgICAgIHVwZGF0ZV9kYXRhc2V0X21ldGEoYXJ0aWZhY3QsIGV4dHJhX2RhdGE9ZXh0cmFfZGF0YSkKICAgICAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYiVGhlIGRhdGEgc2V0IG5hbWVkIHtuYW1lfSBpcyB1cGRhdGVkIikKCiAgICAjIFRPRE8gOiAzLUQgcGxvdCBvbiBvbiBzZWxlY3RlZCBmZWF0dXJlcy4KICAgICMgVE9ETyA6IFJlaW50ZWdyYXRpb24gcGxvdCBvbiBvbiBzZWxlY3RlZCBmZWF0dXJlcy4KICAgICMgVE9ETyA6IFBDQSBwbG90ICh3aXRoIG9wdGlvbnMpCgoKZGVmIF9jcmVhdGVfaGlzdG9ncmFtX21hdF9hcnRpZmFjdCgKICAgIGNvbnRleHQ6IE1MQ2xpZW50Q3R4LAogICAgZGY6IHBkLkRhdGFGcmFtZSwKICAgIGV4dHJhX2RhdGE6IGRpY3QsCiAgICBsYWJlbF9jb2x1bW46IHN0ciwKICAgIHBsb3RzX2Rlc3Q6IHN0ciwKKToKICAgICIiIgogICAgQ3JlYXRlIGFuZCBsb2cgYSBoaXN0b2dyYW0gbWF0cml4IGFydGlmYWN0CiAgICAiIiIKICAgIGNvbnRleHQubG9nX2FydGlmYWN0KAogICAgICAgIGl0ZW09QXJ0aWZhY3QoCiAgICAgICAgICAgIGtleT0iaGlzdCIsCiAgICAgICAgICAgIGJvZHk9YiI8Yj4gRGVwcmVjYXRlZCwgc2VlIHRoZSBhcnRpZmFjdHMgc2NhdHRlci0yZCAiCiAgICAgICAgICAgIGIiYW5kIGhpc3RvZ3JhbXMgaW5zdGVhZDxiPiIsCiAgICAgICAgKSwKICAgICAgICBsb2NhbF9wYXRoPWYie3Bsb3RzX2Rlc3R9L2hpc3QuaHRtbCIsCiAgICApCgoKZGVmIF9jcmVhdGVfZmVhdHVyZXNfaGlzdG9ncmFtX2FydGlmYWN0cygKICAgIGNvbnRleHQ6IE1MQ2xpZW50Q3R4LAogICAgZGY6IHBkLkRhdGFGcmFtZSwKICAgIGV4dHJhX2RhdGE6IGRpY3QsCiAgICBsYWJlbF9jb2x1bW46IHN0ciwKICAgIHBsb3RzX2Rlc3Q6IHN0ciwKICAgIHByb2JsZW1fdHlwZTogc3RyLAopOgogICAgIiIiCiAgICBDcmVhdGUgYW5kIGxvZyBhIGhpc3RvZ3JhbSBhcnRpZmFjdCBmb3IgZWFjaCBmZWF0dXJlCiAgICAiIiIKCiAgICBmaWdzID0gZGljdCgpCiAgICBmaXJzdF9mZWF0dXJlX25hbWUgPSAiIgogICAgaWYgbGFiZWxfY29sdW1uIGlzIG5vdCBOb25lIGFuZCBwcm9ibGVtX3R5cGUgPT0gImNsYXNzaWZpY2F0aW9uIjoKICAgICAgICBhbGxfbGFiZWxzID0gZGZbbGFiZWxfY29sdW1uXS51bmlxdWUoKQogICAgdmlzaWJsZSA9IFRydWUKICAgIGZvciBjb2x1bW5fbmFtZSBpbiBkZi5jb2x1bW5zOgogICAgICAgIGlmIGNvbHVtbl9uYW1lID09IGxhYmVsX2NvbHVtbjoKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgaWYgbGFiZWxfY29sdW1uIGlzIG5vdCBOb25lIGFuZCBwcm9ibGVtX3R5cGUgPT0gImNsYXNzaWZpY2F0aW9uIjoKICAgICAgICAgICAgZm9yIGxhYmVsIGluIGFsbF9sYWJlbHM6CiAgICAgICAgICAgICAgICBzdWJfZmlnID0gZ28uSGlzdG9ncmFtKAogICAgICAgICAgICAgICAgICAgIGhpc3RmdW5jPSJjb3VudCIsCiAgICAgICAgICAgICAgICAgICAgeD1kZi5sb2NbZGZbbGFiZWxfY29sdW1uXSA9PSBsYWJlbF1bY29sdW1uX25hbWVdLAogICAgICAgICAgICAgICAgICAgIG5hbWU9c3RyKGxhYmVsKSwKICAgICAgICAgICAgICAgICAgICB2aXNpYmxlPXZpc2libGUsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBmaWdzW2Yie2NvbHVtbl9uYW1lfUA/QHtsYWJlbH0iXSA9IHN1Yl9maWcKICAgICAgICBlbHNlOgogICAgICAgICAgICBzdWJfZmlnID0gZ28uSGlzdG9ncmFtKGhpc3RmdW5jPSJjb3VudCIsIHg9ZGZbY29sdW1uX25hbWVdLCB2aXNpYmxlPXZpc2libGUpCiAgICAgICAgICAgIGZpZ3NbZiJ7Y29sdW1uX25hbWV9QD9AezF9Il0gPSBzdWJfZmlnCiAgICAgICAgaWYgdmlzaWJsZToKICAgICAgICAgICAgZmlyc3RfZmVhdHVyZV9uYW1lID0gY29sdW1uX25hbWUKICAgICAgICB2aXNpYmxlID0gRmFsc2UKCiAgICBmaWcgPSBnby5GaWd1cmUoKQogICAgZm9yIGsgaW4gZmlncy5rZXlzKCk6CiAgICAgICAgZmlnLmFkZF90cmFjZShmaWdzW2tdKQoKICAgIGZpZy51cGRhdGVfbGF5b3V0KAogICAgICAgIHVwZGF0ZW1lbnVzPVsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgImJ1dHRvbnMiOiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiBjb2x1bW5fbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgIm1ldGhvZCI6ICJ1cGRhdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiYXJncyI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlzaWJsZSI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LnNwbGl0KCJAP0AiKVswXSA9PSBjb2x1bW5fbmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Iga2V5IGluIGZpZ3Mua2V5cygpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieGF4aXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyYW5nZSI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbihkZltjb2x1bW5fbmFtZV0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4KGRmW2NvbHVtbl9uYW1lXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsidGl0bGUiOiBmIjxpPjxiPkhpc3RvZ3JhbSBvZiB7Y29sdW1uX25hbWV9PC9iPjwvaT4ifSwKICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZm9yIGNvbHVtbl9uYW1lIGluIGRmLmNvbHVtbnMKICAgICAgICAgICAgICAgICAgICBpZiBjb2x1bW5fbmFtZSAhPSBsYWJlbF9jb2x1bW4KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAiZGlyZWN0aW9uIjogImRvd24iLAogICAgICAgICAgICAgICAgInBhZCI6IHsiciI6IDEwLCAidCI6IDEwfSwKICAgICAgICAgICAgICAgICJzaG93YWN0aXZlIjogVHJ1ZSwKICAgICAgICAgICAgICAgICJ4IjogMC4yNSwKICAgICAgICAgICAgICAgICJ4YW5jaG9yIjogImxlZnQiLAogICAgICAgICAgICAgICAgInkiOiAxLjEsCiAgICAgICAgICAgICAgICAieWFuY2hvciI6ICJ0b3AiLAogICAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICBhbm5vdGF0aW9ucz1bCiAgICAgICAgICAgIGRpY3QoCiAgICAgICAgICAgICAgICB0ZXh0PSJTZWxlY3QgRmVhdHVyZSBOYW1lICIsCiAgICAgICAgICAgICAgICBzaG93YXJyb3c9RmFsc2UsCiAgICAgICAgICAgICAgICB4PTAsCiAgICAgICAgICAgICAgICB5PTEuMDUsCiAgICAgICAgICAgICAgICB5cmVmPSJwYXBlciIsCiAgICAgICAgICAgICAgICB4cmVmPSJwYXBlciIsCiAgICAgICAgICAgICAgICBhbGlnbj0ibGVmdCIsCiAgICAgICAgICAgICAgICB4YW5jaG9yPSJsZWZ0IiwKICAgICAgICAgICAgICAgIHlhbmNob3I9InRvcCIsCiAgICAgICAgICAgICAgICBmb250PXsKICAgICAgICAgICAgICAgICAgICAiY29sb3IiOiAiYmx1ZSIsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApCiAgICAgICAgXSwKICAgICkKCiAgICBmaWcudXBkYXRlX2xheW91dCgKICAgICAgICB3aWR0aD02MDAsCiAgICAgICAgaGVpZ2h0PTQwMCwKICAgICAgICBhdXRvc2l6ZT1GYWxzZSwKICAgICAgICBtYXJnaW49ZGljdCh0PTEwMCwgYj0wLCBsPTAsIHI9MCksCiAgICAgICAgdGVtcGxhdGU9InBsb3RseV93aGl0ZSIsCiAgICApCgogICAgZmlnLnVwZGF0ZV9sYXlvdXQodGl0bGVfdGV4dD1mIjxpPjxiPkhpc3RvZ3JhbXMgb2Yge2ZpcnN0X2ZlYXR1cmVfbmFtZX08L2I+PC9pPiIpCiAgICBleHRyYV9kYXRhW2YiaGlzdG9ncmFtcyJdID0gY29udGV4dC5sb2dfYXJ0aWZhY3QoCiAgICAgICAgUGxvdGx5QXJ0aWZhY3Qoa2V5PWYiaGlzdG9ncmFtcyIsIGZpZ3VyZT1maWcpLAogICAgICAgIGxvY2FsX3BhdGg9ZiJ7cGxvdHNfZGVzdH0vaGlzdG9ncmFtcy5odG1sIiwKICAgICkKCgpkZWYgX2NyZWF0ZV9mZWF0dXJlc18yZF9zY2F0dGVyX2FydGlmYWN0cygKICAgIGNvbnRleHQ6IE1MQ2xpZW50Q3R4LAogICAgZGY6IHBkLkRhdGFGcmFtZSwKICAgIGV4dHJhX2RhdGE6IGRpY3QsCiAgICBsYWJlbF9jb2x1bW46IHN0ciwKICAgIHBsb3RzX2Rlc3Q6IHN0ciwKICAgIHByb2JsZW1fdHlwZTogc3RyLAopOgogICAgIiIiCiAgICBDcmVhdGUgYW5kIGxvZyBhIHNjYXR0ZXItMmQgYXJ0aWZhY3QgZm9yIGVhY2ggY291cGxlIG9mIGZlYXR1cmVzCiAgICAiIiIKICAgIGZlYXR1cmVzID0gWwogICAgICAgIGNvbHVtbl9uYW1lIGZvciBjb2x1bW5fbmFtZSBpbiBkZi5jb2x1bW5zIGlmIGNvbHVtbl9uYW1lICE9IGxhYmVsX2NvbHVtbgogICAgXQogICAgbWF4X2ZlYXR1cmVfbGVuID0gZmxvYXQobWF4KGxlbihlbGVtKSBmb3IgZWxlbSBpbiBmZWF0dXJlcykpCiAgICBpZiBsYWJlbF9jb2x1bW4gaXMgbm90IE5vbmU6CiAgICAgICAgbGFiZWxzID0gc29ydGVkKGRmW2xhYmVsX2NvbHVtbl0udW5pcXVlKCkpCiAgICBlbHNlOgogICAgICAgIGxhYmVscyA9IFtOb25lXQogICAgZmlnID0gZ28uRmlndXJlKCkKICAgIGlmIGxhYmVsX2NvbHVtbiBpcyBub3QgTm9uZSBhbmQgcHJvYmxlbV90eXBlID09ICJjbGFzc2lmaWNhdGlvbiI6CiAgICAgICAgZm9yIGwgaW4gbGFiZWxzOgogICAgICAgICAgICBmaWcuYWRkX3RyYWNlKAogICAgICAgICAgICAgICAgZ28uU2NhdHRlcigKICAgICAgICAgICAgICAgICAgICB4PWRmLmxvY1tkZltsYWJlbF9jb2x1bW5dID09IGxdW2ZlYXR1cmVzWzBdXSwKICAgICAgICAgICAgICAgICAgICB5PWRmLmxvY1tkZltsYWJlbF9jb2x1bW5dID09IGxdW2ZlYXR1cmVzWzBdXSwKICAgICAgICAgICAgICAgICAgICBtb2RlPSJtYXJrZXJzIiwKICAgICAgICAgICAgICAgICAgICB2aXNpYmxlPVRydWUsCiAgICAgICAgICAgICAgICAgICAgc2hvd2xlZ2VuZD1UcnVlLAogICAgICAgICAgICAgICAgICAgIG5hbWU9c3RyKGwpLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICBlbGlmIGxhYmVsX2NvbHVtbiBpcyBOb25lOgogICAgICAgIGZpZy5hZGRfdHJhY2UoCiAgICAgICAgICAgIGdvLlNjYXR0ZXIoCiAgICAgICAgICAgICAgICB4PWRmW2ZlYXR1cmVzWzBdXSwKICAgICAgICAgICAgICAgIHk9ZGZbZmVhdHVyZXNbMF1dLAogICAgICAgICAgICAgICAgbW9kZT0ibWFya2VycyIsCiAgICAgICAgICAgICAgICB2aXNpYmxlPVRydWUsCiAgICAgICAgICAgICkKICAgICAgICApCiAgICBlbGlmIHByb2JsZW1fdHlwZSA9PSAicmVncmVzc2lvbiI6CiAgICAgICAgZmlnLmFkZF90cmFjZSgKICAgICAgICAgICAgZ28uU2NhdHRlcigKICAgICAgICAgICAgICAgIHg9ZGZbZmVhdHVyZXNbMF1dLAogICAgICAgICAgICAgICAgeT1kZltmZWF0dXJlc1swXV0sCiAgICAgICAgICAgICAgICBtb2RlPSJtYXJrZXJzIiwKICAgICAgICAgICAgICAgIG1hcmtlcj1kaWN0KAogICAgICAgICAgICAgICAgICAgIGNvbG9yPWRmW2xhYmVsX2NvbHVtbl0sIGNvbG9yc2NhbGU9IlZpcmlkaXMiLCBzaG93c2NhbGU9VHJ1ZQogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIHZpc2libGU9VHJ1ZSwKICAgICAgICAgICAgKQogICAgICAgICkKCiAgICB4X2J1dHRvbnMgPSBbXQogICAgeV9idXR0b25zID0gW10KCiAgICBmb3IgbmNvbCBpbiBmZWF0dXJlczoKICAgICAgICBpZiBwcm9ibGVtX3R5cGUgPT0gImNsYXNzaWZpY2F0aW9uIiBhbmQgbGFiZWxfY29sdW1uIGlzIG5vdCBOb25lOgogICAgICAgICAgICB4X2J1dHRvbnMuYXBwZW5kKAogICAgICAgICAgICAgICAgZGljdCgKICAgICAgICAgICAgICAgICAgICBtZXRob2Q9InVwZGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgbGFiZWw9bmNvbCwKICAgICAgICAgICAgICAgICAgICBhcmdzPVsKICAgICAgICAgICAgICAgICAgICAgICAgeyJ4IjogW2RmLmxvY1tkZltsYWJlbF9jb2x1bW5dID09IGxdW25jb2xdIGZvciBsIGluIGxhYmVsc119LAogICAgICAgICAgICAgICAgICAgICAgICBucC5hcmFuZ2UobGVuKGxhYmVscykpLnRvbGlzdCgpLAogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIHlfYnV0dG9ucy5hcHBlbmQoCiAgICAgICAgICAgICAgICBkaWN0KAogICAgICAgICAgICAgICAgICAgIG1ldGhvZD0idXBkYXRlIiwKICAgICAgICAgICAgICAgICAgICBsYWJlbD1uY29sLAogICAgICAgICAgICAgICAgICAgIGFyZ3M9WwogICAgICAgICAgICAgICAgICAgICAgICB7InkiOiBbZGYubG9jW2RmW2xhYmVsX2NvbHVtbl0gPT0gbF1bbmNvbF0gZm9yIGwgaW4gbGFiZWxzXX0sCiAgICAgICAgICAgICAgICAgICAgICAgIG5wLmFyYW5nZShsZW4obGFiZWxzKSkudG9saXN0KCksCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHhfYnV0dG9ucy5hcHBlbmQoCiAgICAgICAgICAgICAgICBkaWN0KG1ldGhvZD0idXBkYXRlIiwgbGFiZWw9bmNvbCwgYXJncz1beyJ4IjogW2RmW25jb2xdXX1dKQogICAgICAgICAgICApCgogICAgICAgICAgICB5X2J1dHRvbnMuYXBwZW5kKAogICAgICAgICAgICAgICAgZGljdChtZXRob2Q9InVwZGF0ZSIsIGxhYmVsPW5jb2wsIGFyZ3M9W3sieSI6IFtkZltuY29sXV19XSkKICAgICAgICAgICAgKQoKICAgICMgUGFzcyBidXR0b25zIHRvIHRoZSB1cGRhdGVtZW51cyBhcmd1bWVudAogICAgZmlnLnVwZGF0ZV9sYXlvdXQoCiAgICAgICAgdXBkYXRlbWVudXM9WwogICAgICAgICAgICBkaWN0KGJ1dHRvbnM9eF9idXR0b25zLCBkaXJlY3Rpb249InVwIiwgeD0wLjUsIHk9LTAuMSksCiAgICAgICAgICAgIGRpY3QoYnV0dG9ucz15X2J1dHRvbnMsIGRpcmVjdGlvbj0iZG93biIsIHg9LW1heF9mZWF0dXJlX2xlbiAvIDEwMCwgeT0wLjUpLAogICAgICAgIF0KICAgICkKCiAgICBmaWcudXBkYXRlX2xheW91dCgKICAgICAgICB3aWR0aD02MDAsCiAgICAgICAgaGVpZ2h0PTQwMCwKICAgICAgICBhdXRvc2l6ZT1GYWxzZSwKICAgICAgICBtYXJnaW49ZGljdCh0PTEwMCwgYj0wLCBsPTAsIHI9MCksCiAgICAgICAgdGVtcGxhdGU9InBsb3RseV93aGl0ZSIsCiAgICApCgogICAgZmlnLnVwZGF0ZV9sYXlvdXQodGl0bGVfdGV4dD1mIjxpPjxiPlNjYXR0ZXItMmQ8L2I+PC9pPiIpCiAgICBleHRyYV9kYXRhW2Yic2NhdHRlci0yZCJdID0gY29udGV4dC5sb2dfYXJ0aWZhY3QoCiAgICAgICAgUGxvdGx5QXJ0aWZhY3Qoa2V5PWYic2NhdHRlci0yZCIsIGZpZ3VyZT1maWcpLAogICAgICAgIGxvY2FsX3BhdGg9ZiJ7cGxvdHNfZGVzdH0vc2NhdHRlci0yZC5odG1sIiwKICAgICkKCgpkZWYgX2NyZWF0ZV92aW9saW5fYXJ0aWZhY3QoCiAgICBjb250ZXh0OiBNTENsaWVudEN0eCwgZGY6IHBkLkRhdGFGcmFtZSwgZXh0cmFfZGF0YTogZGljdCwgcGxvdHNfZGVzdDogc3RyCik6CiAgICAiIiIKICAgIENyZWF0ZSBhbmQgbG9nIGEgdmlvbGluIGFydGlmYWN0CiAgICAiIiIKICAgIGNvbHMgPSA1CiAgICByb3dzID0gKGRmLnNoYXBlWzFdIC8vIGNvbHMpICsgMQogICAgZmlnID0gbWFrZV9zdWJwbG90cyhyb3dzPXJvd3MsIGNvbHM9Y29scykKCiAgICBwbG90X251bSA9IDAKCiAgICBmb3IgY29sdW1uX25hbWUgaW4gZGYuY29sdW1uczoKICAgICAgICBjb2x1bW5fZGF0YSA9IGRmW2NvbHVtbl9uYW1lXQogICAgICAgIHZpb2xpbiA9IGdvLlZpb2xpbigKICAgICAgICAgICAgeD1bY29sdW1uX25hbWVdICogY29sdW1uX2RhdGEuc2hhcGVbMF0sCiAgICAgICAgICAgIHk9Y29sdW1uX2RhdGEsCiAgICAgICAgICAgIG5hbWU9Y29sdW1uX25hbWUsCiAgICAgICAgKQoKICAgICAgICBmaWcuYWRkX3RyYWNlKAogICAgICAgICAgICB2aW9saW4sCiAgICAgICAgICAgIHJvdz0ocGxvdF9udW0gLy8gY29scykgKyAxLAogICAgICAgICAgICBjb2w9KHBsb3RfbnVtICUgY29scykgKyAxLAogICAgICAgICkKCiAgICAgICAgcGxvdF9udW0gKz0gMQoKICAgIGZpZ1sibGF5b3V0Il0udXBkYXRlKAogICAgICAgIGhlaWdodD0ocm93cyArIDEpICogMjAwLAogICAgICAgIHdpZHRoPShjb2xzICsgMSkgKiAyMDAsCiAgICAgICAgdGl0bGU9IjxpPjxiPlZpb2xpbiBQbG90czwvYj48L2k+IiwKICAgICkKCiAgICBmaWcudXBkYXRlX2xheW91dChzaG93bGVnZW5kPUZhbHNlKQogICAgZXh0cmFfZGF0YVsidmlvbGluIl0gPSBjb250ZXh0LmxvZ19hcnRpZmFjdCgKICAgICAgICBQbG90bHlBcnRpZmFjdChrZXk9InZpb2xpbiIsIGZpZ3VyZT1maWcpLAogICAgICAgIGxvY2FsX3BhdGg9ZiJ7cGxvdHNfZGVzdH0vdmlvbGluLmh0bWwiLAogICAgKQoKCmRlZiBfY3JlYXRlX2ltYmFsYW5jZV9hcnRpZmFjdCgKICAgIGNvbnRleHQ6IE1MQ2xpZW50Q3R4LAogICAgZGY6IHBkLkRhdGFGcmFtZSwKICAgIGV4dHJhX2RhdGE6IGRpY3QsCiAgICBsYWJlbF9jb2x1bW46IHN0ciwKICAgIHBsb3RzX2Rlc3Q6IHN0ciwKICAgIHByb2JsZW1fdHlwZTogc3RyLAopOgogICAgIiIiCiAgICBDcmVhdGUgYW5kIGxvZyBhbiBpbWJhbGFuY2UgY2xhc3MgYXJ0aWZhY3QgKGNzdiArIHBsb3QpCiAgICAiIiIKICAgIGlmIGxhYmVsX2NvbHVtbjoKICAgICAgICBpZiBwcm9ibGVtX3R5cGUgPT0gImNsYXNzaWZpY2F0aW9uIjoKICAgICAgICAgICAgdmFsdWVzX2NvbHVtbiA9ICJjb3VudCIKICAgICAgICAgICAgbGFiZWxzX2NvdW50ID0gZGZbbGFiZWxfY29sdW1uXS52YWx1ZV9jb3VudHMoKS5zb3J0X2luZGV4KCkKICAgICAgICAgICAgZGZfbGFiZWxzX2NvdW50ID0gcGQuRGF0YUZyYW1lKGxhYmVsc19jb3VudCkKICAgICAgICAgICAgZGZfbGFiZWxzX2NvdW50W2xhYmVsX2NvbHVtbl0gPSBsYWJlbHNfY291bnQuaW5kZXgKICAgICAgICAgICAgZGZfbGFiZWxzX2NvdW50LnJlbmFtZShjb2x1bW5zPXsiIjogdmFsdWVzX2NvbHVtbn0sIGlucGxhY2U9VHJ1ZSkKICAgICAgICAgICAgZGZfbGFiZWxzX2NvdW50W3ZhbHVlc19jb2x1bW5dID0gZGZfbGFiZWxzX2NvdW50W3ZhbHVlc19jb2x1bW5dIC8gc3VtKAogICAgICAgICAgICAgICAgZGZfbGFiZWxzX2NvdW50W3ZhbHVlc19jb2x1bW5dCiAgICAgICAgICAgICkKICAgICAgICAgICAgZmlnID0gcHgucGllKGRmX2xhYmVsc19jb3VudCwgbmFtZXM9bGFiZWxfY29sdW1uLCB2YWx1ZXM9dmFsdWVzX2NvbHVtbikKICAgICAgICBlbHNlOgogICAgICAgICAgICBmaWcgPSBweC5oaXN0b2dyYW0oCiAgICAgICAgICAgICAgICBoaXN0ZnVuYz0iY291bnQiLAogICAgICAgICAgICAgICAgeD1kZltsYWJlbF9jb2x1bW5dLAogICAgICAgICAgICApCiAgICAgICAgICAgIGhpc3QgPSBucC5oaXN0b2dyYW0oZGZbbGFiZWxfY29sdW1uXSkKICAgICAgICAgICAgZGZfbGFiZWxzX2NvdW50ID0gcGQuRGF0YUZyYW1lKAogICAgICAgICAgICAgICAgeyJtaW5fdmFsIjogaGlzdFsxXSwgImNvdW50IjogaGlzdFswXS50b2xpc3QoKSArIFswXX0KICAgICAgICAgICAgKQogICAgICAgIGZpZy51cGRhdGVfbGF5b3V0KHRpdGxlX3RleHQ9IjxpPjxiPkxhYmVscyBJbWJhbGFuY2U8L2I+PC9pPiIpCiAgICAgICAgZXh0cmFfZGF0YVsiaW1iYWxhbmNlIl0gPSBjb250ZXh0LmxvZ19hcnRpZmFjdCgKICAgICAgICAgICAgUGxvdGx5QXJ0aWZhY3Qoa2V5PSJpbWJhbGFuY2UiLCBmaWd1cmU9ZmlnKSwKICAgICAgICAgICAgbG9jYWxfcGF0aD1mIntwbG90c19kZXN0fS9pbWJhbGFuY2UuaHRtbCIsCiAgICAgICAgKQogICAgICAgIGV4dHJhX2RhdGFbImltYmFsYW5jZS1jc3YiXSA9IGNvbnRleHQubG9nX2FydGlmYWN0KAogICAgICAgICAgICBUYWJsZUFydGlmYWN0KCJpbWJhbGFuY2Utd2VpZ2h0cy12ZWMiLCBkZj1kZl9sYWJlbHNfY291bnQpLAogICAgICAgICAgICBsb2NhbF9wYXRoPWYie3Bsb3RzX2Rlc3R9L2ltYmFsYW5jZS13ZWlnaHRzLXZlYy5jc3YiLAogICAgICAgICkKCgpkZWYgX2NyZWF0ZV9jb3JyX2FydGlmYWN0KAogICAgY29udGV4dDogTUxDbGllbnRDdHgsCiAgICBkZjogcGQuRGF0YUZyYW1lLAogICAgZXh0cmFfZGF0YTogZGljdCwKICAgIGxhYmVsX2NvbHVtbjogc3RyLAogICAgcGxvdHNfZGVzdDogc3RyLAopOgogICAgIiIiCiAgICBDcmVhdGUgYW5kIGxvZyBhbiBjb3JyZWxhdGlvbi1tYXRyaXggYXJ0aWZhY3QgKGNzdiArIHBsb3QpCiAgICAiIiIKICAgIGlmIGxhYmVsX2NvbHVtbiBpcyBub3QgTm9uZToKICAgICAgICBkZiA9IGRmLmRyb3AoW2xhYmVsX2NvbHVtbl0sIGF4aXM9MSkKICAgIHRibGNvcnIgPSBkZi5jb3JyKG51bWVyaWNfb25seT1UcnVlKQogICAgZXh0cmFfZGF0YVsiY29ycmVsYXRpb24tbWF0cml4LWNzdiJdID0gY29udGV4dC5sb2dfYXJ0aWZhY3QoCiAgICAgICAgVGFibGVBcnRpZmFjdCgiY29ycmVsYXRpb24tbWF0cml4LWNzdiIsIGRmPXRibGNvcnIsIHZpc2libGU9VHJ1ZSksCiAgICAgICAgbG9jYWxfcGF0aD1mIntwbG90c19kZXN0fS9jb3JyZWxhdGlvbi1tYXRyaXguY3N2IiwKICAgICkKCiAgICB6ID0gdGJsY29yci52YWx1ZXMudG9saXN0KCkKICAgIHpfdGV4dCA9IFtbIns6LjJmfSIuZm9ybWF0KHkpIGZvciB5IGluIHhdIGZvciB4IGluIHpdCiAgICBmaWcgPSBmZi5jcmVhdGVfYW5ub3RhdGVkX2hlYXRtYXAoCiAgICAgICAgeiwKICAgICAgICB4PWxpc3QodGJsY29yci5jb2x1bW5zKSwKICAgICAgICB5PWxpc3QodGJsY29yci5jb2x1bW5zKSwKICAgICAgICBhbm5vdGF0aW9uX3RleHQ9el90ZXh0LAogICAgICAgIGNvbG9yc2NhbGU9ImFnc3Vuc2V0IiwKICAgICkKICAgIGZpZ1sibGF5b3V0Il1bInlheGlzIl1bImF1dG9yYW5nZSJdID0gInJldmVyc2VkIiAgIyBsIC0+IHIKICAgIGZpZy51cGRhdGVfbGF5b3V0KHRpdGxlX3RleHQ9IjxpPjxiPkNvcnJlbGF0aW9uIG1hdHJpeDwvYj48L2k+IikKICAgIGZpZ1siZGF0YSJdWzBdWyJzaG93c2NhbGUiXSA9IFRydWUKCiAgICBleHRyYV9kYXRhWyJjb3JyZWxhdGlvbiJdID0gY29udGV4dC5sb2dfYXJ0aWZhY3QoCiAgICAgICAgUGxvdGx5QXJ0aWZhY3Qoa2V5PSJjb3JyZWxhdGlvbiIsIGZpZ3VyZT1maWcpLAogICAgICAgIGxvY2FsX3BhdGg9ZiJ7cGxvdHNfZGVzdH0vY29ycmVsYXRpb24uaHRtbCIsCiAgICApCg== + origin_filename: '' + code_origin: '' + image: mlrun/mlrun + command: '' +metadata: + tag: '' + name: describe + categories: + - data-analysis diff --git a/describe/item.yaml b/describe/item.yaml index 4703771b7..47f36787f 100644 --- a/describe/item.yaml +++ b/describe/item.yaml @@ -11,7 +11,7 @@ labels: author: Davids maintainers: [] marketplaceType: '' -mlrunVersion: 1.4.1 +mlrunVersion: 1.6.0 name: describe platformVersion: 3.5.3 spec: @@ -21,4 +21,4 @@ spec: kind: job requirements: [] url: '' -version: 1.2.0 +version: 1.3.0 diff --git a/describe/requirements.txt b/describe/requirements.txt index 8dbc3e68b..a96b6ff1b 100644 --- a/describe/requirements.txt +++ b/describe/requirements.txt @@ -1,6 +1,5 @@ scikit-learn~=1.0.2 plotly~=5.16.1 pytest~=7.0.1 -pandas~=1.3.5 matplotlib~=3.5.1 seaborn~=0.11.2 diff --git a/describe/test_describe.py b/describe/test_describe.py index 1a2270a86..9ffe39abb 100644 --- a/describe/test_describe.py +++ b/describe/test_describe.py @@ -271,79 +271,3 @@ def _create_data(n_samples, n_features, n_classes, n_informative, reg=False): df["timestamp"] = [pd.Timestamp("2022").now()] * n_samples df.to_parquet("artifacts/random_dataset.parquet") return df - - -def _create_dask_func(uri): - dask_cluster_name = "dask-cluster" - dask_cluster = new_function(dask_cluster_name, kind="dask", image="mlrun/ml-models") - dask_cluster.spec.remote = False - dask_uri = uri - dask_cluster.export(dask_uri) - - -def test_import_function_describe_dask(): - dask_uri = "dask_func.yaml" - _create_dask_func(dask_uri) - describe_func = import_function("function.yaml") - is_test_passed = True - _create_data(n_samples=100, n_features=5, n_classes=3, n_informative=3) - describe_func.spec.command = "describe_dask.py" - - try: - describe_run = describe_func.run( - name="task-describe", - handler="analyze", - inputs={"table": DATA_PATH}, - params={ - "label_column": "label", - "dask_function": dask_uri, - "dask_flag": True, - }, - artifact_path=os.path.abspath("./artifacts"), - local=True, - ) - - except Exception as exception: - print(f"- The test failed - raised the following error:\n- {exception}") - is_test_passed = False - _validate_paths( - { - "imbalance.html", - "imbalance-weights-vec.csv", - } - ) - assert is_test_passed - - -def test_code_to_function_describe_dask(): - dask_uri = "dask_func.yaml" - _create_dask_func(dask_uri) - describe_func = code_to_function(filename="describe.py", kind="local") - is_test_passed = True - _create_data(n_samples=100, n_features=5, n_classes=3, n_informative=3) - describe_func.spec.command = "describe_dask.py" - - try: - describe_run = describe_func.run( - name="task-describe", - handler="analyze", - inputs={"table": DATA_PATH}, - params={ - "label_column": "label", - "dask_function": dask_uri, - "dask_flag": True, - }, - artifact_path=os.path.abspath("./artifacts"), - local=True, - ) - - except Exception as exception: - print(f"- The test failed - raised the following error:\n- {exception}") - is_test_passed = False - _validate_paths( - { - "imbalance.html", - "imbalance-weights-vec.csv", - } - ) - assert is_test_passed diff --git a/feature_selection/feature_selection.py b/feature_selection/feature_selection.py index 630a09694..30fa8f904 100644 --- a/feature_selection/feature_selection.py +++ b/feature_selection/feature_selection.py @@ -13,17 +13,15 @@ # limitations under the License. # import json -import os -import matplotlib.pyplot as plt import mlrun import mlrun.datastore -import mlrun.utils import mlrun.feature_store as fs +import mlrun.utils import numpy as np import pandas as pd -import seaborn as sns -from mlrun.artifacts import PlotArtifact +import plotly.express as px +from mlrun.artifacts import PlotlyArtifact from mlrun.datastore.targets import ParquetTarget # MLRun utils from mlrun.utils.helpers import create_class @@ -42,15 +40,6 @@ } -def _clear_current_figure(): - """ - Clear matplotlib current figure. - """ - plt.cla() - plt.clf() - plt.close() - - def show_values_on_bars(axs, h_v="v", space=0.4): def _show_on_single_plot(ax_): if h_v == "v": @@ -74,33 +63,18 @@ def _show_on_single_plot(ax_): def plot_stat(context, stat_name, stat_df): - _clear_current_figure() - - # Add chart - ax = plt.axes() - stat_chart = sns.barplot( + sorted_df = stat_df.sort_values(stat_name) + fig = px.bar( + data_frame=sorted_df, x=stat_name, - y="index", - data=stat_df.sort_values(stat_name, ascending=False).reset_index(), - ax=ax, + y=sorted_df.index, + title=f"{stat_name} feature scores", + color=stat_name, ) - plt.tight_layout() - - for p in stat_chart.patches: - width = p.get_width() - plt.text( - 5 + p.get_width(), - p.get_y() + 0.55 * p.get_height(), - "{:1.2f}".format(width), - ha="center", - va="center", - ) - context.log_artifact( - PlotArtifact(f"{stat_name}", body=plt.gcf()), - local_path=os.path.join("plots", "feature_selection", f"{stat_name}.html"), + item=PlotlyArtifact(key=stat_name, figure=fig), + local_path=f"{stat_name}.html", ) - _clear_current_figure() def feature_selection( @@ -115,7 +89,6 @@ def feature_selection( sample_ratio: float = None, output_vector_name: float = None, ignore_type_errors: bool = False, - is_feature_vector: bool = False, ): """ Applies selected feature selection statistical functions or models on our 'df_artifact'. @@ -138,10 +111,9 @@ def feature_selection( model name (ex. LinearSVC), formalized json (contains 'CLASS', 'FIT', 'META') or a path to such json file. :param max_scaled_scores: produce feature scores table scaled with max_scaler. - :param sample_ratio: percentage of the dataset the user whishes to compute the feature selection process on. + :param sample_ratio: percentage of the dataset the user wishes to compute the feature selection process on. :param output_vector_name: creates a new feature vector containing only the identifies features. :param ignore_type_errors: skips datatypes that are neither float nor int within the feature vector. - :param is_feature_vector: bool stating if the data is passed as a feature vector. """ stat_filters = stat_filters or DEFAULT_STAT_FILTERS model_filters = model_filters or DEFAULT_MODEL_FILTERS diff --git a/feature_selection/function.yaml b/feature_selection/function.yaml index f1bf53b8a..44cdd9894 100644 --- a/feature_selection/function.yaml +++ b/feature_selection/function.yaml @@ -73,7 +73,7 @@ spec: default: true - name: sample_ratio type: float - doc: percentage of the dataset the user whishes to compute the feature selection + doc: percentage of the dataset the user wishes to compute the feature selection process on. default: null - name: output_vector_name @@ -95,7 +95,7 @@ spec: command: '' build: origin_filename: '' - functionSourceCode: IyBDb3B5cmlnaHQgMjAxOSBJZ3VhemlvCiMKIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiMKaW1wb3J0IGpzb24KaW1wb3J0IG9zCgppbXBvcnQgbWF0cGxvdGxpYi5weXBsb3QgYXMgcGx0CmltcG9ydCBtbHJ1bgppbXBvcnQgbWxydW4uZGF0YXN0b3JlCmltcG9ydCBtbHJ1bi51dGlscwppbXBvcnQgbWxydW4uZmVhdHVyZV9zdG9yZSBhcyBmcwppbXBvcnQgbnVtcHkgYXMgbnAKaW1wb3J0IHBhbmRhcyBhcyBwZAppbXBvcnQgc2VhYm9ybiBhcyBzbnMKZnJvbSBtbHJ1bi5hcnRpZmFjdHMgaW1wb3J0IFBsb3RBcnRpZmFjdApmcm9tIG1scnVuLmRhdGFzdG9yZS50YXJnZXRzIGltcG9ydCBQYXJxdWV0VGFyZ2V0CiMgTUxSdW4gdXRpbHMKZnJvbSBtbHJ1bi51dGlscy5oZWxwZXJzIGltcG9ydCBjcmVhdGVfY2xhc3MKIyBGZWF0dXJlIHNlbGVjdGlvbiBzdHJhdGVnaWVzCmZyb20gc2tsZWFybi5mZWF0dXJlX3NlbGVjdGlvbiBpbXBvcnQgU2VsZWN0RnJvbU1vZGVsLCBTZWxlY3RLQmVzdAojIFNjYWxlIGZlYXR1cmUgc2NvcmVzZ2l0IHN0CmZyb20gc2tsZWFybi5wcmVwcm9jZXNzaW5nIGltcG9ydCBNaW5NYXhTY2FsZXIKIyBTS0xlYXJuIGVzdGltYXRvcnMgbGlzdApmcm9tIHNrbGVhcm4udXRpbHMgaW1wb3J0IGFsbF9lc3RpbWF0b3JzCgpERUZBVUxUX1NUQVRfRklMVEVSUyA9IFsiZl9jbGFzc2lmIiwgIm11dHVhbF9pbmZvX2NsYXNzaWYiLCAiY2hpMiIsICJmX3JlZ3Jlc3Npb24iXQpERUZBVUxUX01PREVMX0ZJTFRFUlMgPSB7CiAgICAiTGluZWFyU1ZDIjogIkxpbmVhclNWQyIsCiAgICAiTG9naXN0aWNSZWdyZXNzaW9uIjogIkxvZ2lzdGljUmVncmVzc2lvbiIsCiAgICAiRXh0cmFUcmVlc0NsYXNzaWZpZXIiOiAiRXh0cmFUcmVlc0NsYXNzaWZpZXIiLAp9CgoKZGVmIF9jbGVhcl9jdXJyZW50X2ZpZ3VyZSgpOgogICAgIiIiCiAgICBDbGVhciBtYXRwbG90bGliIGN1cnJlbnQgZmlndXJlLgogICAgIiIiCiAgICBwbHQuY2xhKCkKICAgIHBsdC5jbGYoKQogICAgcGx0LmNsb3NlKCkKCgpkZWYgc2hvd192YWx1ZXNfb25fYmFycyhheHMsIGhfdj0idiIsIHNwYWNlPTAuNCk6CiAgICBkZWYgX3Nob3dfb25fc2luZ2xlX3Bsb3QoYXhfKToKICAgICAgICBpZiBoX3YgPT0gInYiOgogICAgICAgICAgICBmb3IgcCBpbiBheF8ucGF0Y2hlczoKICAgICAgICAgICAgICAgIF94ID0gcC5nZXRfeCgpICsgcC5nZXRfd2lkdGgoKSAvIDIKICAgICAgICAgICAgICAgIF95ID0gcC5nZXRfeSgpICsgcC5nZXRfaGVpZ2h0KCkKICAgICAgICAgICAgICAgIHZhbHVlID0gaW50KHAuZ2V0X2hlaWdodCgpKQogICAgICAgICAgICAgICAgYXhfLnRleHQoX3gsIF95LCB2YWx1ZSwgaGE9ImNlbnRlciIpCiAgICAgICAgZWxpZiBoX3YgPT0gImgiOgogICAgICAgICAgICBmb3IgcCBpbiBheF8ucGF0Y2hlczoKICAgICAgICAgICAgICAgIF94ID0gcC5nZXRfeCgpICsgcC5nZXRfd2lkdGgoKSArIGZsb2F0KHNwYWNlKQogICAgICAgICAgICAgICAgX3kgPSBwLmdldF95KCkgKyBwLmdldF9oZWlnaHQoKQogICAgICAgICAgICAgICAgdmFsdWUgPSBpbnQocC5nZXRfd2lkdGgoKSkKICAgICAgICAgICAgICAgIGF4Xy50ZXh0KF94LCBfeSwgdmFsdWUsIGhhPSJsZWZ0IikKCiAgICBpZiBpc2luc3RhbmNlKGF4cywgbnAubmRhcnJheSk6CiAgICAgICAgZm9yIGlkeCwgYXggaW4gbnAubmRlbnVtZXJhdGUoYXhzKToKICAgICAgICAgICAgX3Nob3dfb25fc2luZ2xlX3Bsb3QoYXgpCiAgICBlbHNlOgogICAgICAgIF9zaG93X29uX3NpbmdsZV9wbG90KGF4cykKCgpkZWYgcGxvdF9zdGF0KGNvbnRleHQsIHN0YXRfbmFtZSwgc3RhdF9kZik6CiAgICBfY2xlYXJfY3VycmVudF9maWd1cmUoKQoKICAgICMgQWRkIGNoYXJ0CiAgICBheCA9IHBsdC5heGVzKCkKICAgIHN0YXRfY2hhcnQgPSBzbnMuYmFycGxvdCgKICAgICAgICB4PXN0YXRfbmFtZSwKICAgICAgICB5PSJpbmRleCIsCiAgICAgICAgZGF0YT1zdGF0X2RmLnNvcnRfdmFsdWVzKHN0YXRfbmFtZSwgYXNjZW5kaW5nPUZhbHNlKS5yZXNldF9pbmRleCgpLAogICAgICAgIGF4PWF4LAogICAgKQogICAgcGx0LnRpZ2h0X2xheW91dCgpCgogICAgZm9yIHAgaW4gc3RhdF9jaGFydC5wYXRjaGVzOgogICAgICAgIHdpZHRoID0gcC5nZXRfd2lkdGgoKQogICAgICAgIHBsdC50ZXh0KAogICAgICAgICAgICA1ICsgcC5nZXRfd2lkdGgoKSwKICAgICAgICAgICAgcC5nZXRfeSgpICsgMC41NSAqIHAuZ2V0X2hlaWdodCgpLAogICAgICAgICAgICAiezoxLjJmfSIuZm9ybWF0KHdpZHRoKSwKICAgICAgICAgICAgaGE9ImNlbnRlciIsCiAgICAgICAgICAgIHZhPSJjZW50ZXIiLAogICAgICAgICkKCiAgICBjb250ZXh0LmxvZ19hcnRpZmFjdCgKICAgICAgICBQbG90QXJ0aWZhY3QoZiJ7c3RhdF9uYW1lfSIsIGJvZHk9cGx0LmdjZigpKSwKICAgICAgICBsb2NhbF9wYXRoPW9zLnBhdGguam9pbigicGxvdHMiLCAiZmVhdHVyZV9zZWxlY3Rpb24iLCBmIntzdGF0X25hbWV9Lmh0bWwiKSwKICAgICkKICAgIF9jbGVhcl9jdXJyZW50X2ZpZ3VyZSgpCgoKZGVmIGZlYXR1cmVfc2VsZWN0aW9uKAogICAgY29udGV4dCwKICAgIGRmX2FydGlmYWN0LAogICAgazogaW50ID0gNSwKICAgIG1pbl92b3RlczogZmxvYXQgPSAwLjUsCiAgICBsYWJlbF9jb2x1bW46IHN0ciA9IE5vbmUsCiAgICBzdGF0X2ZpbHRlcnM6IGxpc3QgPSBOb25lLAogICAgbW9kZWxfZmlsdGVyczogZGljdCA9IE5vbmUsCiAgICBtYXhfc2NhbGVkX3Njb3JlczogYm9vbCA9IFRydWUsCiAgICBzYW1wbGVfcmF0aW86IGZsb2F0ID0gTm9uZSwKICAgIG91dHB1dF92ZWN0b3JfbmFtZTogZmxvYXQgPSBOb25lLAogICAgaWdub3JlX3R5cGVfZXJyb3JzOiBib29sID0gRmFsc2UsCiAgICBpc19mZWF0dXJlX3ZlY3RvcjogYm9vbCA9IEZhbHNlLAopOgogICAgIiIiCiAgICBBcHBsaWVzIHNlbGVjdGVkIGZlYXR1cmUgc2VsZWN0aW9uIHN0YXRpc3RpY2FsIGZ1bmN0aW9ucyBvciBtb2RlbHMgb24gb3VyICdkZl9hcnRpZmFjdCcuCgogICAgRWFjaCBzdGF0aXN0aWNhbCBmdW5jdGlvbiBvciBtb2RlbCB3aWxsIHZvdGUgZm9yIGl0J3MgYmVzdCBLIHNlbGVjdGVkIGZlYXR1cmVzLgogICAgSWYgYSBmZWF0dXJlIGhhcyA+PSAnbWluX3ZvdGVzJyB2b3RlcywgaXQgd2lsbCBiZSBzZWxlY3RlZC4KCiAgICA6cGFyYW0gY29udGV4dDogICAgICAgICAgICAgdGhlIGZ1bmN0aW9uIGNvbnRleHQuCiAgICA6cGFyYW0gZGZfYXJ0aWZhY3Q6ICAgICAgICAgZGF0YWZyYW1lIHRvIHBhc3MgYXMgaW5wdXQuCiAgICA6cGFyYW0gazogICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIHRvcCBmZWF0dXJlcyB0byBzZWxlY3QgZnJvbSBlYWNoIHN0YXRpc3RpY2FsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gb3IgbW9kZWwuCiAgICA6cGFyYW0gbWluX3ZvdGVzOiAgICAgICAgICAgbWluaW1hbCBudW1iZXIgb2Ygdm90ZXMgKGZyb20gYSBtb2RlbCBvciBieSBzdGF0aXN0aWNhbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKSBuZWVkZWQgZm9yIGEgZmVhdHVyZSB0byBiZSBzZWxlY3RlZC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW4gYmUgc3BlY2lmaWVkIGJ5IHBlcmNlbnRhZ2Ugb2Ygdm90ZXMgb3IgYWJzb2x1dGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2Ygdm90ZXMuCiAgICA6cGFyYW0gbGFiZWxfY29sdW1uOiAgICAgICAgZ3JvdW5kLXRydXRoICh5KSBsYWJlbHMuCiAgICA6cGFyYW0gc3RhdF9maWx0ZXJzOiAgICAgICAgc3RhdGlzdGljYWwgZnVuY3Rpb25zIHRvIGFwcGx5IHRvIHRoZSBmZWF0dXJlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmcm9tIHNrbGVhcm4uZmVhdHVyZV9zZWxlY3Rpb24pLgogICAgOnBhcmFtIG1vZGVsX2ZpbHRlcnM6ICAgICAgIG1vZGVscyB0byB1c2UgZm9yIGZlYXR1cmUgZXZhbHVhdGlvbiwgY2FuIGJlIHNwZWNpZmllZCBieQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsIG5hbWUgKGV4LiBMaW5lYXJTVkMpLCBmb3JtYWxpemVkIGpzb24gKGNvbnRhaW5zICdDTEFTUycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ZJVCcsICdNRVRBJykgb3IgYSBwYXRoIHRvIHN1Y2gganNvbiBmaWxlLgogICAgOnBhcmFtIG1heF9zY2FsZWRfc2NvcmVzOiAgIHByb2R1Y2UgZmVhdHVyZSBzY29yZXMgdGFibGUgc2NhbGVkIHdpdGggbWF4X3NjYWxlci4KICAgIDpwYXJhbSBzYW1wbGVfcmF0aW86ICAgICAgICBwZXJjZW50YWdlIG9mIHRoZSBkYXRhc2V0IHRoZSB1c2VyIHdoaXNoZXMgdG8gY29tcHV0ZSB0aGUgZmVhdHVyZSBzZWxlY3Rpb24gcHJvY2VzcyBvbi4KICAgIDpwYXJhbSBvdXRwdXRfdmVjdG9yX25hbWU6ICBjcmVhdGVzIGEgbmV3IGZlYXR1cmUgdmVjdG9yIGNvbnRhaW5pbmcgb25seSB0aGUgaWRlbnRpZmllcyBmZWF0dXJlcy4KICAgIDpwYXJhbSBpZ25vcmVfdHlwZV9lcnJvcnM6ICBza2lwcyBkYXRhdHlwZXMgdGhhdCBhcmUgbmVpdGhlciBmbG9hdCBub3IgaW50IHdpdGhpbiB0aGUgZmVhdHVyZSB2ZWN0b3IuCiAgICA6cGFyYW0gaXNfZmVhdHVyZV92ZWN0b3I6ICAgYm9vbCBzdGF0aW5nIGlmIHRoZSBkYXRhIGlzIHBhc3NlZCBhcyBhIGZlYXR1cmUgdmVjdG9yLgogICAgIiIiCiAgICBzdGF0X2ZpbHRlcnMgPSBzdGF0X2ZpbHRlcnMgb3IgREVGQVVMVF9TVEFUX0ZJTFRFUlMKICAgIG1vZGVsX2ZpbHRlcnMgPSBtb2RlbF9maWx0ZXJzIG9yIERFRkFVTFRfTU9ERUxfRklMVEVSUwogICAgIyBDaGVjayBpZiBkZi5tZXRhIGlzIHZhbGlkLCBpZiBpdCBpcywgbG9vayBmb3IgYSBmZWF0dXJlIHZlY3RvcgogICAgc3RvcmVfdXJpX3ByZWZpeCwgXyA9IG1scnVuLmRhdGFzdG9yZS5wYXJzZV9zdG9yZV91cmkoZGZfYXJ0aWZhY3QuYXJ0aWZhY3RfdXJsKQogICAgaXNfZmVhdHVyZV92ZWN0b3IgPSBtbHJ1bi51dGlscy5TdG9yZVByZWZpeC5GZWF0dXJlVmVjdG9yID09IHN0b3JlX3VyaV9wcmVmaXgKCiAgICAjIExvb2sgaW5zaWRlIG1ldGEuc3BlYy5sYWJlbF9mZWF0dXJlIHRvIGlkZW50aWZ5IHRoZSBsYWJlbF9jb2x1bW4gaWYgdGhlIHVzZXIgZGlkIG5vdCBzcGVjaWZ5IGl0CiAgICBpZiBsYWJlbF9jb2x1bW4gaXMgTm9uZToKICAgICAgICBpZiBpc19mZWF0dXJlX3ZlY3RvcjoKICAgICAgICAgICAgbGFiZWxfY29sdW1uID0gZGZfYXJ0aWZhY3QubWV0YS5zcGVjLmxhYmVsX2ZlYXR1cmUuc3BsaXQoIi4iKVsxXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIk5vIGxhYmVsX2NvbHVtbiB3YXMgZ2l2ZW4sIHBsZWFzZSBhZGQgYSBsYWJlbF9jb2x1bW4uIikKCiAgICAjIFVzZSB0aGUgZmVhdHVyZSB2ZWN0b3IgYXMgZGF0YWZyYW1lCiAgICBkZiA9IGRmX2FydGlmYWN0LmFzX2RmKCkKCiAgICAjIEVuc3VyZSBrIGlzIG5vdCBiaWdnZXIgdGhhbiB0aGUgdG90YWwgbnVtYmVyIG9mIGZlYXR1cmVzCiAgICBpZiBrID4gZGYuc2hhcGVbMV06CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgZiJLIGNhbm5vdCBiZSBiaWdnZXIgdGhhbiB0aGUgdG90YWwgbnVtYmVyIG9mIGZlYXR1cmVzICh7ZGYuc2hhcGVbMV19KS4gUGxlYXNlIGNob29zZSBhIHNtYWxsZXIgSy4iCiAgICAgICAgKQogICAgZWxpZiBrIDwgMToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJLIGNhbm5vdCBiZSBzbWFsbGVyIHRoYW4gMS4gUGxlYXNlIGNob29zZSBhIGJpZ2dlciBLLiIpCgogICAgIyBDcmVhdGUgYSBzYW1wbGUgZGF0YWZyYW1lIG9mIHRoZSBvcmlnaW5hbCBmZWF0dXJlIHZlY3RvcgogICAgaWYgc2FtcGxlX3JhdGlvOgogICAgICAgIGRmID0gKAogICAgICAgICAgICBkZi5ncm91cGJ5KGxhYmVsX2NvbHVtbikKICAgICAgICAgICAgLmFwcGx5KGxhbWJkYSB4OiB4LnNhbXBsZShmcmFjPXNhbXBsZV9yYXRpbykpCiAgICAgICAgICAgIC5yZXNldF9pbmRleChkcm9wPVRydWUpCiAgICAgICAgKQogICAgICAgIGRmID0gZGYuZHJvcG5hKCkKCiAgICAjIFNldCBmZWF0dXJlIHZlY3RvciBhbmQgbGFiZWxzCiAgICB5ID0gZGYucG9wKGxhYmVsX2NvbHVtbikKICAgIFggPSBkZgoKICAgIGlmIG5wLm9iamVjdF8gaW4gbGlzdChYLmR0eXBlcykgYW5kIGlnbm9yZV90eXBlX2Vycm9ycyBpcyBGYWxzZToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICBmIntkZi5zZWxlY3RfZHR5cGVzKGluY2x1ZGU9WydvYmplY3QnXSkuY29sdW1ucy50b2xpc3QoKX0gYXJlIG5laXRoZXIgZmxvYXQgb3IgaW50LiIKICAgICAgICApCgogICAgIyBDcmVhdGUgc2VsZWN0ZWQgc3RhdGlzdGljYWwgZXN0aW1hdG9ycwogICAgc3RhdF9mdW5jdGlvbnNfbGlzdCA9IHsKICAgICAgICBzdGF0X25hbWU6IFNlbGVjdEtCZXN0KAogICAgICAgICAgICBzY29yZV9mdW5jPWNyZWF0ZV9jbGFzcyhmInNrbGVhcm4uZmVhdHVyZV9zZWxlY3Rpb24ue3N0YXRfbmFtZX0iKSwgaz1rCiAgICAgICAgKQogICAgICAgIGZvciBzdGF0X25hbWUgaW4gc3RhdF9maWx0ZXJzCiAgICB9CiAgICByZXF1aXJlc19hYnMgPSBbImNoaTIiXQoKICAgICMgUnVuIHN0YXRpc3RpYyBmaWx0ZXJzCiAgICBzZWxlY3RlZF9mZWF0dXJlc19hZ2cgPSB7fQogICAgc3RhdHNfZGYgPSBwZC5EYXRhRnJhbWUoaW5kZXg9WC5jb2x1bW5zKS5kcm9wbmEoKQoKICAgIGZvciBzdGF0X25hbWUsIHN0YXRfZnVuYyBpbiBzdGF0X2Z1bmN0aW9uc19saXN0Lml0ZW1zKCk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBwYXJhbXMgPSAoWCwgeSkgaWYgc3RhdF9uYW1lIGluIHJlcXVpcmVzX2FicyBlbHNlIChhYnMoWCksIHkpCiAgICAgICAgICAgIHN0YXQgPSBzdGF0X2Z1bmMuZml0KCpwYXJhbXMpCgogICAgICAgICAgICAjIENvbGxlY3Qgc3RhdCBmdW5jdGlvbiByZXN1bHRzCiAgICAgICAgICAgIHN0YXRfZGYgPSBwZC5EYXRhRnJhbWUoCiAgICAgICAgICAgICAgICBpbmRleD1YLmNvbHVtbnMsIGNvbHVtbnM9W3N0YXRfbmFtZV0sIGRhdGE9c3RhdC5zY29yZXNfCiAgICAgICAgICAgICkKICAgICAgICAgICAgcGxvdF9zdGF0KGNvbnRleHQsIHN0YXRfbmFtZSwgc3RhdF9kZikKICAgICAgICAgICAgc3RhdHNfZGYgPSBzdGF0c19kZi5qb2luKHN0YXRfZGYpCgogICAgICAgICAgICAjIFNlbGVjdCBLIEJlc3QgZmVhdHVyZXMKICAgICAgICAgICAgc2VsZWN0ZWRfZmVhdHVyZXMgPSBYLmNvbHVtbnNbc3RhdF9mdW5jLmdldF9zdXBwb3J0KCldCiAgICAgICAgICAgIHNlbGVjdGVkX2ZlYXR1cmVzX2FnZ1tzdGF0X25hbWVdID0gc2VsZWN0ZWRfZmVhdHVyZXMKCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYiQ291bGRuJ3QgY2FsY3VsYXRlIHtzdGF0X25hbWV9IGJlY2F1c2Ugb2Y6IHtlfSIpCgogICAgIyBDcmVhdGUgbW9kZWxzIGZyb20gY2xhc3MgbmFtZSAvIGpzb24gZmlsZSAvIGpzb24gcGFyYW1zCiAgICBhbGxfc2tsZWFybl9lc3RpbWF0b3JzID0gZGljdChhbGxfZXN0aW1hdG9ycygpKSBpZiBsZW4obW9kZWxfZmlsdGVycykgPiAwIGVsc2Uge30KICAgIHNlbGVjdGVkX21vZGVscyA9IHt9CiAgICBmb3IgbW9kZWxfbmFtZSwgbW9kZWwgaW4gbW9kZWxfZmlsdGVycy5pdGVtcygpOgogICAgICAgIGlmICIuanNvbiIgaW4gbW9kZWw6CiAgICAgICAgICAgIGN1cnJlbnRfbW9kZWwgPSBqc29uLmxvYWQob3Blbihtb2RlbCwgInIiKSkKICAgICAgICAgICAgY2xhc3NpZmllcl9jbGFzcyA9IGNyZWF0ZV9jbGFzcyhjdXJyZW50X21vZGVsWyJNRVRBIl1bImNsYXNzIl0pCiAgICAgICAgICAgIHNlbGVjdGVkX21vZGVsc1ttb2RlbF9uYW1lXSA9IGNsYXNzaWZpZXJfY2xhc3MoKipjdXJyZW50X21vZGVsWyJDTEFTUyJdKQogICAgICAgIGVsaWYgbW9kZWwgaW4gYWxsX3NrbGVhcm5fZXN0aW1hdG9yczoKICAgICAgICAgICAgc2VsZWN0ZWRfbW9kZWxzW21vZGVsX25hbWVdID0gYWxsX3NrbGVhcm5fZXN0aW1hdG9yc1ttb2RlbF9uYW1lXSgpCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGN1cnJlbnRfbW9kZWwgPSBqc29uLmxvYWRzKG1vZGVsKQogICAgICAgICAgICAgICAgY2xhc3NpZmllcl9jbGFzcyA9IGNyZWF0ZV9jbGFzcyhjdXJyZW50X21vZGVsWyJNRVRBIl1bImNsYXNzIl0pCiAgICAgICAgICAgICAgICBzZWxlY3RlZF9tb2RlbHNbbW9kZWxfbmFtZV0gPSBjbGFzc2lmaWVyX2NsYXNzKCoqY3VycmVudF9tb2RlbFsiQ0xBU1MiXSkKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICAgICAgY29udGV4dC5sb2dnZXIuaW5mbyhmInVuYWJsZSB0byBsb2FkIHttb2RlbH0gYmVjYXVzZSBvZjoge2V9IikKCiAgICAjIFJ1biBtb2RlbCBmaWx0ZXJzCiAgICBtb2RlbHNfZGYgPSBwZC5EYXRhRnJhbWUoaW5kZXg9WC5jb2x1bW5zKQogICAgZm9yIG1vZGVsX25hbWUsIG1vZGVsIGluIHNlbGVjdGVkX21vZGVscy5pdGVtcygpOgoKICAgICAgICBpZiBtb2RlbF9uYW1lID09ICJMb2dpc3RpY1JlZ3Jlc3Npb24iOgogICAgICAgICAgICBtb2RlbC5zZXRfcGFyYW1zKHNvbHZlcj0ibGlibGluZWFyIikKCiAgICAgICAgIyBUcmFpbiBtb2RlbCBhbmQgZ2V0IGZlYXR1cmUgaW1wb3J0YW5jZQogICAgICAgIHNlbGVjdF9mcm9tX21vZGVsID0gU2VsZWN0RnJvbU1vZGVsKG1vZGVsKS5maXQoWCwgeSkKICAgICAgICBmZWF0dXJlX2lkeCA9IHNlbGVjdF9mcm9tX21vZGVsLmdldF9zdXBwb3J0KCkKICAgICAgICBmZWF0dXJlX25hbWVzID0gWC5jb2x1bW5zW2ZlYXR1cmVfaWR4XQogICAgICAgIHNlbGVjdGVkX2ZlYXR1cmVzX2FnZ1ttb2RlbF9uYW1lXSA9IGZlYXR1cmVfbmFtZXMudG9saXN0KCkKCiAgICAgICAgIyBDb2xsZWN0IG1vZGVsIGZlYXR1cmUgaW1wb3J0YW5jZQogICAgICAgIGlmIGhhc2F0dHIoc2VsZWN0X2Zyb21fbW9kZWwuZXN0aW1hdG9yXywgImNvZWZfIik6CiAgICAgICAgICAgIHN0YXRfZGYgPSBzZWxlY3RfZnJvbV9tb2RlbC5lc3RpbWF0b3JfLmNvZWZfCiAgICAgICAgZWxpZiBoYXNhdHRyKHNlbGVjdF9mcm9tX21vZGVsLmVzdGltYXRvcl8sICJmZWF0dXJlX2ltcG9ydGFuY2VzXyIpOgogICAgICAgICAgICBzdGF0X2RmID0gc2VsZWN0X2Zyb21fbW9kZWwuZXN0aW1hdG9yXy5mZWF0dXJlX2ltcG9ydGFuY2VzXwoKICAgICAgICBzdGF0X2RmID0gcGQuRGF0YUZyYW1lKGluZGV4PVguY29sdW1ucywgY29sdW1ucz1bbW9kZWxfbmFtZV0sIGRhdGE9c3RhdF9kZlswXSkKICAgICAgICBtb2RlbHNfZGYgPSBtb2RlbHNfZGYuam9pbihzdGF0X2RmKQoKICAgICAgICBwbG90X3N0YXQoY29udGV4dCwgbW9kZWxfbmFtZSwgc3RhdF9kZikKCiAgICAjIENyZWF0ZSBmZWF0dXJlX3Njb3JlcyBERiB3aXRoIHN0YXQgJiBtb2RlbCBmaWx0ZXJzIHNjb3JlcwogICAgcmVzdWx0X21hdHJpeF9kZiA9IHBkLmNvbmNhdChbc3RhdHNfZGYsIG1vZGVsc19kZl0sIGF4aXM9MSwgc29ydD1GYWxzZSkKICAgIGNvbnRleHQubG9nX2RhdGFzZXQoCiAgICAgICAga2V5PSJmZWF0dXJlX3Njb3JlcyIsCiAgICAgICAgZGY9cmVzdWx0X21hdHJpeF9kZiwKICAgICAgICBsb2NhbF9wYXRoPSJmZWF0dXJlX3Njb3Jlcy5wYXJxdWV0IiwKICAgICAgICBmb3JtYXQ9InBhcnF1ZXQiLAogICAgKQogICAgaWYgbWF4X3NjYWxlZF9zY29yZXM6CiAgICAgICAgbm9ybWFsaXplZF9kZiA9IHJlc3VsdF9tYXRyaXhfZGYucmVwbGFjZShbbnAuaW5mLCAtbnAuaW5mXSwgbnAubmFuKS52YWx1ZXMKICAgICAgICBtaW5fbWF4X3NjYWxlciA9IE1pbk1heFNjYWxlcigpCiAgICAgICAgbm9ybWFsaXplZF9kZiA9IG1pbl9tYXhfc2NhbGVyLmZpdF90cmFuc2Zvcm0obm9ybWFsaXplZF9kZikKICAgICAgICBub3JtYWxpemVkX2RmID0gcGQuRGF0YUZyYW1lKAogICAgICAgICAgICBkYXRhPW5vcm1hbGl6ZWRfZGYsCiAgICAgICAgICAgIGNvbHVtbnM9cmVzdWx0X21hdHJpeF9kZi5jb2x1bW5zLAogICAgICAgICAgICBpbmRleD1yZXN1bHRfbWF0cml4X2RmLmluZGV4LAogICAgICAgICkKICAgICAgICBjb250ZXh0LmxvZ19kYXRhc2V0KAogICAgICAgICAgICBrZXk9Im1heF9zY2FsZWRfc2NvcmVzX2ZlYXR1cmVfc2NvcmVzIiwKICAgICAgICAgICAgZGY9bm9ybWFsaXplZF9kZiwKICAgICAgICAgICAgbG9jYWxfcGF0aD0ibWF4X3NjYWxlZF9zY29yZXNfZmVhdHVyZV9zY29yZXMucGFycXVldCIsCiAgICAgICAgICAgIGZvcm1hdD0icGFycXVldCIsCiAgICAgICAgKQoKICAgICMgQ3JlYXRlIGZlYXR1cmUgY291bnQgRGF0YUZyYW1lCiAgICBmb3IgdGVzdF9uYW1lIGluIHNlbGVjdGVkX2ZlYXR1cmVzX2FnZzoKICAgICAgICByZXN1bHRfbWF0cml4X2RmW3Rlc3RfbmFtZV0gPSBbCiAgICAgICAgICAgIDEgaWYgeCBpbiBzZWxlY3RlZF9mZWF0dXJlc19hZ2dbdGVzdF9uYW1lXSBlbHNlIDAgZm9yIHggaW4gWC5jb2x1bW5zCiAgICAgICAgXQogICAgcmVzdWx0X21hdHJpeF9kZi5sb2NbOiwgIm51bV92b3RlcyJdID0gcmVzdWx0X21hdHJpeF9kZi5zdW0oYXhpcz0xKQogICAgY29udGV4dC5sb2dfZGF0YXNldCgKICAgICAgICBrZXk9InNlbGVjdGVkX2ZlYXR1cmVzX2NvdW50IiwKICAgICAgICBkZj1yZXN1bHRfbWF0cml4X2RmLAogICAgICAgIGxvY2FsX3BhdGg9InNlbGVjdGVkX2ZlYXR1cmVzX2NvdW50LnBhcnF1ZXQiLAogICAgICAgIGZvcm1hdD0icGFycXVldCIsCiAgICApCgogICAgIyBIb3cgbWFueSB2b3RlcyBhcmUgbmVlZGVkIGZvciBhIGZlYXR1cmUgdG8gYmUgc2VsZWN0ZWQ/CiAgICBpZiBpc2luc3RhbmNlKG1pbl92b3RlcywgaW50KToKICAgICAgICB2b3Rlc19uZWVkZWQgPSBtaW5fdm90ZXMKICAgIGVsc2U6CiAgICAgICAgbnVtX2ZpbHRlcnMgPSBsZW4oc3RhdF9maWx0ZXJzKSArIGxlbihtb2RlbF9maWx0ZXJzKQogICAgICAgIHZvdGVzX25lZWRlZCA9IGludChucC5mbG9vcihudW1fZmlsdGVycyAqIG1heChtaW4obWluX3ZvdGVzLCAxKSwgMCkpKQogICAgY29udGV4dC5sb2dnZXIuaW5mbyhmInZvdGVzIG5lZWRlZCB0byBiZSBzZWxlY3RlZDoge3ZvdGVzX25lZWRlZH0iKQoKICAgICMgQ3JlYXRlIGZpbmFsIGZlYXR1cmUgZGF0YWZyYW1lCiAgICBzZWxlY3RlZF9mZWF0dXJlcyA9IHJlc3VsdF9tYXRyaXhfZGZbCiAgICAgICAgcmVzdWx0X21hdHJpeF9kZi5udW1fdm90ZXMgPj0gdm90ZXNfbmVlZGVkCiAgICBdLmluZGV4LnRvbGlzdCgpCiAgICBnb29kX2ZlYXR1cmVfZGYgPSBkZi5sb2NbOiwgc2VsZWN0ZWRfZmVhdHVyZXNdCiAgICBmaW5hbF9kZiA9IHBkLmNvbmNhdChbZ29vZF9mZWF0dXJlX2RmLCB5XSwgYXhpcz0xKQogICAgY29udGV4dC5sb2dfZGF0YXNldCgKICAgICAgICBrZXk9InNlbGVjdGVkX2ZlYXR1cmVzIiwKICAgICAgICBkZj1maW5hbF9kZiwKICAgICAgICBsb2NhbF9wYXRoPSJzZWxlY3RlZF9mZWF0dXJlcy5wYXJxdWV0IiwKICAgICAgICBmb3JtYXQ9InBhcnF1ZXQiLAogICAgKQoKICAgICMgQ3JlYXRpbmcgYSBuZXcgZmVhdHVyZSB2ZWN0b3IgY29udGFpbmluZyBvbmx5IHRoZSBpZGVudGlmaWVkIHRvcCBmZWF0dXJlcwogICAgaWYgaXNfZmVhdHVyZV92ZWN0b3IgYW5kIGRmX2FydGlmYWN0Lm1ldGEuc3BlYy5mZWF0dXJlcyBhbmQgb3V0cHV0X3ZlY3Rvcl9uYW1lOgogICAgICAgICMgU2VsZWN0aW5nIHRoZSB0b3AgSyBmZWF0dXJlcyBmcm9tIG91ciB0b3AgZmVhdHVyZSBkYXRhZnJhbWUKICAgICAgICBzZWxlY3RlZF9mZWF0dXJlcyA9IHJlc3VsdF9tYXRyaXhfZGYuaGVhZChrKS5pbmRleAoKICAgICAgICAjIE1hdGNoIHRoZSBzZWxlY3RlZCBmZWF0dXJlIG5hbWVzIHRvIHRoZSBGUyBGZWF0dXJlIGFubm90YXRpb25zCiAgICAgICAgbWF0Y2hlZF9zZWxlY3Rpb25zID0gWwogICAgICAgICAgICBmZWF0dXJlCiAgICAgICAgICAgIGZvciBmZWF0dXJlIGluIGxpc3QoZGZfYXJ0aWZhY3QubWV0YS5zcGVjLmZlYXR1cmVzKQogICAgICAgICAgICBmb3Igc2VsZWN0ZWQgaW4gbGlzdChzZWxlY3RlZF9mZWF0dXJlcykKICAgICAgICAgICAgaWYgZmVhdHVyZS5lbmRzd2l0aChzZWxlY3RlZCkKICAgICAgICBdCgogICAgICAgICMgRGVmaW5pbmcgb3VyIG5ldyBmZWF0dXJlIHZlY3RvcgogICAgICAgIHRvcF9mZWF0dXJlc19mdiA9IGZzLkZlYXR1cmVWZWN0b3IoCiAgICAgICAgICAgIG91dHB1dF92ZWN0b3JfbmFtZSwKICAgICAgICAgICAgbWF0Y2hlZF9zZWxlY3Rpb25zLAogICAgICAgICAgICBsYWJlbF9mZWF0dXJlPSJsYWJlbHMubGFiZWwiLAogICAgICAgICAgICBkZXNjcmlwdGlvbj0iZmVhdHVyZSB2ZWN0b3IgY29tcG9zZWQgc3RyaWN0bHkgb2Ygb3VyIHRvcCBmZWF0dXJlcyIsCiAgICAgICAgKQoKICAgICAgICAjIFNhdmluZwogICAgICAgIHRvcF9mZWF0dXJlc19mdi5zYXZlKCkKICAgICAgICBmcy5nZXRfb2ZmbGluZV9mZWF0dXJlcyh0b3BfZmVhdHVyZXNfZnYsIHRhcmdldD1QYXJxdWV0VGFyZ2V0KCkpCgogICAgICAgICMgTG9nZ2luZyBvdXIgbmV3IGZlYXR1cmUgdmVjdG9yIFVSSQogICAgICAgIGNvbnRleHQubG9nX3Jlc3VsdCgidG9wX2ZlYXR1cmVzX3ZlY3RvciIsIHRvcF9mZWF0dXJlc19mdi51cmkpCg== + functionSourceCode: IyBDb3B5cmlnaHQgMjAxOSBJZ3VhemlvCiMKIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiMKaW1wb3J0IGpzb24KCmltcG9ydCBtbHJ1bgppbXBvcnQgbWxydW4uZGF0YXN0b3JlCmltcG9ydCBtbHJ1bi5mZWF0dXJlX3N0b3JlIGFzIGZzCmltcG9ydCBtbHJ1bi51dGlscwppbXBvcnQgbnVtcHkgYXMgbnAKaW1wb3J0IHBhbmRhcyBhcyBwZAppbXBvcnQgcGxvdGx5LmV4cHJlc3MgYXMgcHgKZnJvbSBtbHJ1bi5hcnRpZmFjdHMgaW1wb3J0IFBsb3RseUFydGlmYWN0CmZyb20gbWxydW4uZGF0YXN0b3JlLnRhcmdldHMgaW1wb3J0IFBhcnF1ZXRUYXJnZXQKIyBNTFJ1biB1dGlscwpmcm9tIG1scnVuLnV0aWxzLmhlbHBlcnMgaW1wb3J0IGNyZWF0ZV9jbGFzcwojIEZlYXR1cmUgc2VsZWN0aW9uIHN0cmF0ZWdpZXMKZnJvbSBza2xlYXJuLmZlYXR1cmVfc2VsZWN0aW9uIGltcG9ydCBTZWxlY3RGcm9tTW9kZWwsIFNlbGVjdEtCZXN0CiMgU2NhbGUgZmVhdHVyZSBzY29yZXNnaXQgc3QKZnJvbSBza2xlYXJuLnByZXByb2Nlc3NpbmcgaW1wb3J0IE1pbk1heFNjYWxlcgojIFNLTGVhcm4gZXN0aW1hdG9ycyBsaXN0CmZyb20gc2tsZWFybi51dGlscyBpbXBvcnQgYWxsX2VzdGltYXRvcnMKCkRFRkFVTFRfU1RBVF9GSUxURVJTID0gWyJmX2NsYXNzaWYiLCAibXV0dWFsX2luZm9fY2xhc3NpZiIsICJjaGkyIiwgImZfcmVncmVzc2lvbiJdCkRFRkFVTFRfTU9ERUxfRklMVEVSUyA9IHsKICAgICJMaW5lYXJTVkMiOiAiTGluZWFyU1ZDIiwKICAgICJMb2dpc3RpY1JlZ3Jlc3Npb24iOiAiTG9naXN0aWNSZWdyZXNzaW9uIiwKICAgICJFeHRyYVRyZWVzQ2xhc3NpZmllciI6ICJFeHRyYVRyZWVzQ2xhc3NpZmllciIsCn0KCgpkZWYgc2hvd192YWx1ZXNfb25fYmFycyhheHMsIGhfdj0idiIsIHNwYWNlPTAuNCk6CiAgICBkZWYgX3Nob3dfb25fc2luZ2xlX3Bsb3QoYXhfKToKICAgICAgICBpZiBoX3YgPT0gInYiOgogICAgICAgICAgICBmb3IgcCBpbiBheF8ucGF0Y2hlczoKICAgICAgICAgICAgICAgIF94ID0gcC5nZXRfeCgpICsgcC5nZXRfd2lkdGgoKSAvIDIKICAgICAgICAgICAgICAgIF95ID0gcC5nZXRfeSgpICsgcC5nZXRfaGVpZ2h0KCkKICAgICAgICAgICAgICAgIHZhbHVlID0gaW50KHAuZ2V0X2hlaWdodCgpKQogICAgICAgICAgICAgICAgYXhfLnRleHQoX3gsIF95LCB2YWx1ZSwgaGE9ImNlbnRlciIpCiAgICAgICAgZWxpZiBoX3YgPT0gImgiOgogICAgICAgICAgICBmb3IgcCBpbiBheF8ucGF0Y2hlczoKICAgICAgICAgICAgICAgIF94ID0gcC5nZXRfeCgpICsgcC5nZXRfd2lkdGgoKSArIGZsb2F0KHNwYWNlKQogICAgICAgICAgICAgICAgX3kgPSBwLmdldF95KCkgKyBwLmdldF9oZWlnaHQoKQogICAgICAgICAgICAgICAgdmFsdWUgPSBpbnQocC5nZXRfd2lkdGgoKSkKICAgICAgICAgICAgICAgIGF4Xy50ZXh0KF94LCBfeSwgdmFsdWUsIGhhPSJsZWZ0IikKCiAgICBpZiBpc2luc3RhbmNlKGF4cywgbnAubmRhcnJheSk6CiAgICAgICAgZm9yIGlkeCwgYXggaW4gbnAubmRlbnVtZXJhdGUoYXhzKToKICAgICAgICAgICAgX3Nob3dfb25fc2luZ2xlX3Bsb3QoYXgpCiAgICBlbHNlOgogICAgICAgIF9zaG93X29uX3NpbmdsZV9wbG90KGF4cykKCgpkZWYgcGxvdF9zdGF0KGNvbnRleHQsIHN0YXRfbmFtZSwgc3RhdF9kZik6CiAgICBzb3J0ZWRfZGYgPSBzdGF0X2RmLnNvcnRfdmFsdWVzKHN0YXRfbmFtZSkKICAgIGZpZyA9IHB4LmJhcigKICAgICAgICBkYXRhX2ZyYW1lPXNvcnRlZF9kZiwKICAgICAgICB4PXN0YXRfbmFtZSwKICAgICAgICB5PXNvcnRlZF9kZi5pbmRleCwKICAgICAgICB0aXRsZT1mIntzdGF0X25hbWV9IGZlYXR1cmUgc2NvcmVzIiwKICAgICAgICBjb2xvcj1zdGF0X25hbWUsCiAgICApCiAgICBjb250ZXh0LmxvZ19hcnRpZmFjdCgKICAgICAgICBpdGVtPVBsb3RseUFydGlmYWN0KGtleT1zdGF0X25hbWUsIGZpZ3VyZT1maWcpLAogICAgICAgIGxvY2FsX3BhdGg9ZiJ7c3RhdF9uYW1lfS5odG1sIiwKICAgICkKCgpkZWYgZmVhdHVyZV9zZWxlY3Rpb24oCiAgICBjb250ZXh0LAogICAgZGZfYXJ0aWZhY3QsCiAgICBrOiBpbnQgPSA1LAogICAgbWluX3ZvdGVzOiBmbG9hdCA9IDAuNSwKICAgIGxhYmVsX2NvbHVtbjogc3RyID0gTm9uZSwKICAgIHN0YXRfZmlsdGVyczogbGlzdCA9IE5vbmUsCiAgICBtb2RlbF9maWx0ZXJzOiBkaWN0ID0gTm9uZSwKICAgIG1heF9zY2FsZWRfc2NvcmVzOiBib29sID0gVHJ1ZSwKICAgIHNhbXBsZV9yYXRpbzogZmxvYXQgPSBOb25lLAogICAgb3V0cHV0X3ZlY3Rvcl9uYW1lOiBmbG9hdCA9IE5vbmUsCiAgICBpZ25vcmVfdHlwZV9lcnJvcnM6IGJvb2wgPSBGYWxzZSwKKToKICAgICIiIgogICAgQXBwbGllcyBzZWxlY3RlZCBmZWF0dXJlIHNlbGVjdGlvbiBzdGF0aXN0aWNhbCBmdW5jdGlvbnMgb3IgbW9kZWxzIG9uIG91ciAnZGZfYXJ0aWZhY3QnLgoKICAgIEVhY2ggc3RhdGlzdGljYWwgZnVuY3Rpb24gb3IgbW9kZWwgd2lsbCB2b3RlIGZvciBpdCdzIGJlc3QgSyBzZWxlY3RlZCBmZWF0dXJlcy4KICAgIElmIGEgZmVhdHVyZSBoYXMgPj0gJ21pbl92b3Rlcycgdm90ZXMsIGl0IHdpbGwgYmUgc2VsZWN0ZWQuCgogICAgOnBhcmFtIGNvbnRleHQ6ICAgICAgICAgICAgIHRoZSBmdW5jdGlvbiBjb250ZXh0LgogICAgOnBhcmFtIGRmX2FydGlmYWN0OiAgICAgICAgIGRhdGFmcmFtZSB0byBwYXNzIGFzIGlucHV0LgogICAgOnBhcmFtIGs6ICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiB0b3AgZmVhdHVyZXMgdG8gc2VsZWN0IGZyb20gZWFjaCBzdGF0aXN0aWNhbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG9yIG1vZGVsLgogICAgOnBhcmFtIG1pbl92b3RlczogICAgICAgICAgIG1pbmltYWwgbnVtYmVyIG9mIHZvdGVzIChmcm9tIGEgbW9kZWwgb3IgYnkgc3RhdGlzdGljYWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbikgbmVlZGVkIGZvciBhIGZlYXR1cmUgdG8gYmUgc2VsZWN0ZWQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuIGJlIHNwZWNpZmllZCBieSBwZXJjZW50YWdlIG9mIHZvdGVzIG9yIGFic29sdXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIHZvdGVzLgogICAgOnBhcmFtIGxhYmVsX2NvbHVtbjogICAgICAgIGdyb3VuZC10cnV0aCAoeSkgbGFiZWxzLgogICAgOnBhcmFtIHN0YXRfZmlsdGVyczogICAgICAgIHN0YXRpc3RpY2FsIGZ1bmN0aW9ucyB0byBhcHBseSB0byB0aGUgZmVhdHVyZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnJvbSBza2xlYXJuLmZlYXR1cmVfc2VsZWN0aW9uKS4KICAgIDpwYXJhbSBtb2RlbF9maWx0ZXJzOiAgICAgICBtb2RlbHMgdG8gdXNlIGZvciBmZWF0dXJlIGV2YWx1YXRpb24sIGNhbiBiZSBzcGVjaWZpZWQgYnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCBuYW1lIChleC4gTGluZWFyU1ZDKSwgZm9ybWFsaXplZCBqc29uIChjb250YWlucyAnQ0xBU1MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGSVQnLCAnTUVUQScpIG9yIGEgcGF0aCB0byBzdWNoIGpzb24gZmlsZS4KICAgIDpwYXJhbSBtYXhfc2NhbGVkX3Njb3JlczogICBwcm9kdWNlIGZlYXR1cmUgc2NvcmVzIHRhYmxlIHNjYWxlZCB3aXRoIG1heF9zY2FsZXIuCiAgICA6cGFyYW0gc2FtcGxlX3JhdGlvOiAgICAgICAgcGVyY2VudGFnZSBvZiB0aGUgZGF0YXNldCB0aGUgdXNlciB3aXNoZXMgdG8gY29tcHV0ZSB0aGUgZmVhdHVyZSBzZWxlY3Rpb24gcHJvY2VzcyBvbi4KICAgIDpwYXJhbSBvdXRwdXRfdmVjdG9yX25hbWU6ICBjcmVhdGVzIGEgbmV3IGZlYXR1cmUgdmVjdG9yIGNvbnRhaW5pbmcgb25seSB0aGUgaWRlbnRpZmllcyBmZWF0dXJlcy4KICAgIDpwYXJhbSBpZ25vcmVfdHlwZV9lcnJvcnM6ICBza2lwcyBkYXRhdHlwZXMgdGhhdCBhcmUgbmVpdGhlciBmbG9hdCBub3IgaW50IHdpdGhpbiB0aGUgZmVhdHVyZSB2ZWN0b3IuCiAgICAiIiIKICAgIHN0YXRfZmlsdGVycyA9IHN0YXRfZmlsdGVycyBvciBERUZBVUxUX1NUQVRfRklMVEVSUwogICAgbW9kZWxfZmlsdGVycyA9IG1vZGVsX2ZpbHRlcnMgb3IgREVGQVVMVF9NT0RFTF9GSUxURVJTCiAgICAjIENoZWNrIGlmIGRmLm1ldGEgaXMgdmFsaWQsIGlmIGl0IGlzLCBsb29rIGZvciBhIGZlYXR1cmUgdmVjdG9yCiAgICBzdG9yZV91cmlfcHJlZml4LCBfID0gbWxydW4uZGF0YXN0b3JlLnBhcnNlX3N0b3JlX3VyaShkZl9hcnRpZmFjdC5hcnRpZmFjdF91cmwpCiAgICBpc19mZWF0dXJlX3ZlY3RvciA9IG1scnVuLnV0aWxzLlN0b3JlUHJlZml4LkZlYXR1cmVWZWN0b3IgPT0gc3RvcmVfdXJpX3ByZWZpeAoKICAgICMgTG9vayBpbnNpZGUgbWV0YS5zcGVjLmxhYmVsX2ZlYXR1cmUgdG8gaWRlbnRpZnkgdGhlIGxhYmVsX2NvbHVtbiBpZiB0aGUgdXNlciBkaWQgbm90IHNwZWNpZnkgaXQKICAgIGlmIGxhYmVsX2NvbHVtbiBpcyBOb25lOgogICAgICAgIGlmIGlzX2ZlYXR1cmVfdmVjdG9yOgogICAgICAgICAgICBsYWJlbF9jb2x1bW4gPSBkZl9hcnRpZmFjdC5tZXRhLnNwZWMubGFiZWxfZmVhdHVyZS5zcGxpdCgiLiIpWzFdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiTm8gbGFiZWxfY29sdW1uIHdhcyBnaXZlbiwgcGxlYXNlIGFkZCBhIGxhYmVsX2NvbHVtbi4iKQoKICAgICMgVXNlIHRoZSBmZWF0dXJlIHZlY3RvciBhcyBkYXRhZnJhbWUKICAgIGRmID0gZGZfYXJ0aWZhY3QuYXNfZGYoKQoKICAgICMgRW5zdXJlIGsgaXMgbm90IGJpZ2dlciB0aGFuIHRoZSB0b3RhbCBudW1iZXIgb2YgZmVhdHVyZXMKICAgIGlmIGsgPiBkZi5zaGFwZVsxXToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICBmIksgY2Fubm90IGJlIGJpZ2dlciB0aGFuIHRoZSB0b3RhbCBudW1iZXIgb2YgZmVhdHVyZXMgKHtkZi5zaGFwZVsxXX0pLiBQbGVhc2UgY2hvb3NlIGEgc21hbGxlciBLLiIKICAgICAgICApCiAgICBlbGlmIGsgPCAxOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIksgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAxLiBQbGVhc2UgY2hvb3NlIGEgYmlnZ2VyIEsuIikKCiAgICAjIENyZWF0ZSBhIHNhbXBsZSBkYXRhZnJhbWUgb2YgdGhlIG9yaWdpbmFsIGZlYXR1cmUgdmVjdG9yCiAgICBpZiBzYW1wbGVfcmF0aW86CiAgICAgICAgZGYgPSAoCiAgICAgICAgICAgIGRmLmdyb3VwYnkobGFiZWxfY29sdW1uKQogICAgICAgICAgICAuYXBwbHkobGFtYmRhIHg6IHguc2FtcGxlKGZyYWM9c2FtcGxlX3JhdGlvKSkKICAgICAgICAgICAgLnJlc2V0X2luZGV4KGRyb3A9VHJ1ZSkKICAgICAgICApCiAgICAgICAgZGYgPSBkZi5kcm9wbmEoKQoKICAgICMgU2V0IGZlYXR1cmUgdmVjdG9yIGFuZCBsYWJlbHMKICAgIHkgPSBkZi5wb3AobGFiZWxfY29sdW1uKQogICAgWCA9IGRmCgogICAgaWYgbnAub2JqZWN0XyBpbiBsaXN0KFguZHR5cGVzKSBhbmQgaWdub3JlX3R5cGVfZXJyb3JzIGlzIEZhbHNlOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgIGYie2RmLnNlbGVjdF9kdHlwZXMoaW5jbHVkZT1bJ29iamVjdCddKS5jb2x1bW5zLnRvbGlzdCgpfSBhcmUgbmVpdGhlciBmbG9hdCBvciBpbnQuIgogICAgICAgICkKCiAgICAjIENyZWF0ZSBzZWxlY3RlZCBzdGF0aXN0aWNhbCBlc3RpbWF0b3JzCiAgICBzdGF0X2Z1bmN0aW9uc19saXN0ID0gewogICAgICAgIHN0YXRfbmFtZTogU2VsZWN0S0Jlc3QoCiAgICAgICAgICAgIHNjb3JlX2Z1bmM9Y3JlYXRlX2NsYXNzKGYic2tsZWFybi5mZWF0dXJlX3NlbGVjdGlvbi57c3RhdF9uYW1lfSIpLCBrPWsKICAgICAgICApCiAgICAgICAgZm9yIHN0YXRfbmFtZSBpbiBzdGF0X2ZpbHRlcnMKICAgIH0KICAgIHJlcXVpcmVzX2FicyA9IFsiY2hpMiJdCgogICAgIyBSdW4gc3RhdGlzdGljIGZpbHRlcnMKICAgIHNlbGVjdGVkX2ZlYXR1cmVzX2FnZyA9IHt9CiAgICBzdGF0c19kZiA9IHBkLkRhdGFGcmFtZShpbmRleD1YLmNvbHVtbnMpLmRyb3BuYSgpCgogICAgZm9yIHN0YXRfbmFtZSwgc3RhdF9mdW5jIGluIHN0YXRfZnVuY3Rpb25zX2xpc3QuaXRlbXMoKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHBhcmFtcyA9IChYLCB5KSBpZiBzdGF0X25hbWUgaW4gcmVxdWlyZXNfYWJzIGVsc2UgKGFicyhYKSwgeSkKICAgICAgICAgICAgc3RhdCA9IHN0YXRfZnVuYy5maXQoKnBhcmFtcykKCiAgICAgICAgICAgICMgQ29sbGVjdCBzdGF0IGZ1bmN0aW9uIHJlc3VsdHMKICAgICAgICAgICAgc3RhdF9kZiA9IHBkLkRhdGFGcmFtZSgKICAgICAgICAgICAgICAgIGluZGV4PVguY29sdW1ucywgY29sdW1ucz1bc3RhdF9uYW1lXSwgZGF0YT1zdGF0LnNjb3Jlc18KICAgICAgICAgICAgKQogICAgICAgICAgICBwbG90X3N0YXQoY29udGV4dCwgc3RhdF9uYW1lLCBzdGF0X2RmKQogICAgICAgICAgICBzdGF0c19kZiA9IHN0YXRzX2RmLmpvaW4oc3RhdF9kZikKCiAgICAgICAgICAgICMgU2VsZWN0IEsgQmVzdCBmZWF0dXJlcwogICAgICAgICAgICBzZWxlY3RlZF9mZWF0dXJlcyA9IFguY29sdW1uc1tzdGF0X2Z1bmMuZ2V0X3N1cHBvcnQoKV0KICAgICAgICAgICAgc2VsZWN0ZWRfZmVhdHVyZXNfYWdnW3N0YXRfbmFtZV0gPSBzZWxlY3RlZF9mZWF0dXJlcwoKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIGNvbnRleHQubG9nZ2VyLmluZm8oZiJDb3VsZG4ndCBjYWxjdWxhdGUge3N0YXRfbmFtZX0gYmVjYXVzZSBvZjoge2V9IikKCiAgICAjIENyZWF0ZSBtb2RlbHMgZnJvbSBjbGFzcyBuYW1lIC8ganNvbiBmaWxlIC8ganNvbiBwYXJhbXMKICAgIGFsbF9za2xlYXJuX2VzdGltYXRvcnMgPSBkaWN0KGFsbF9lc3RpbWF0b3JzKCkpIGlmIGxlbihtb2RlbF9maWx0ZXJzKSA+IDAgZWxzZSB7fQogICAgc2VsZWN0ZWRfbW9kZWxzID0ge30KICAgIGZvciBtb2RlbF9uYW1lLCBtb2RlbCBpbiBtb2RlbF9maWx0ZXJzLml0ZW1zKCk6CiAgICAgICAgaWYgIi5qc29uIiBpbiBtb2RlbDoKICAgICAgICAgICAgY3VycmVudF9tb2RlbCA9IGpzb24ubG9hZChvcGVuKG1vZGVsLCAiciIpKQogICAgICAgICAgICBjbGFzc2lmaWVyX2NsYXNzID0gY3JlYXRlX2NsYXNzKGN1cnJlbnRfbW9kZWxbIk1FVEEiXVsiY2xhc3MiXSkKICAgICAgICAgICAgc2VsZWN0ZWRfbW9kZWxzW21vZGVsX25hbWVdID0gY2xhc3NpZmllcl9jbGFzcygqKmN1cnJlbnRfbW9kZWxbIkNMQVNTIl0pCiAgICAgICAgZWxpZiBtb2RlbCBpbiBhbGxfc2tsZWFybl9lc3RpbWF0b3JzOgogICAgICAgICAgICBzZWxlY3RlZF9tb2RlbHNbbW9kZWxfbmFtZV0gPSBhbGxfc2tsZWFybl9lc3RpbWF0b3JzW21vZGVsX25hbWVdKCkKCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgY3VycmVudF9tb2RlbCA9IGpzb24ubG9hZHMobW9kZWwpCiAgICAgICAgICAgICAgICBjbGFzc2lmaWVyX2NsYXNzID0gY3JlYXRlX2NsYXNzKGN1cnJlbnRfbW9kZWxbIk1FVEEiXVsiY2xhc3MiXSkKICAgICAgICAgICAgICAgIHNlbGVjdGVkX21vZGVsc1ttb2RlbF9uYW1lXSA9IGNsYXNzaWZpZXJfY2xhc3MoKipjdXJyZW50X21vZGVsWyJDTEFTUyJdKQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgICAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYidW5hYmxlIHRvIGxvYWQge21vZGVsfSBiZWNhdXNlIG9mOiB7ZX0iKQoKICAgICMgUnVuIG1vZGVsIGZpbHRlcnMKICAgIG1vZGVsc19kZiA9IHBkLkRhdGFGcmFtZShpbmRleD1YLmNvbHVtbnMpCiAgICBmb3IgbW9kZWxfbmFtZSwgbW9kZWwgaW4gc2VsZWN0ZWRfbW9kZWxzLml0ZW1zKCk6CgogICAgICAgIGlmIG1vZGVsX25hbWUgPT0gIkxvZ2lzdGljUmVncmVzc2lvbiI6CiAgICAgICAgICAgIG1vZGVsLnNldF9wYXJhbXMoc29sdmVyPSJsaWJsaW5lYXIiKQoKICAgICAgICAjIFRyYWluIG1vZGVsIGFuZCBnZXQgZmVhdHVyZSBpbXBvcnRhbmNlCiAgICAgICAgc2VsZWN0X2Zyb21fbW9kZWwgPSBTZWxlY3RGcm9tTW9kZWwobW9kZWwpLmZpdChYLCB5KQogICAgICAgIGZlYXR1cmVfaWR4ID0gc2VsZWN0X2Zyb21fbW9kZWwuZ2V0X3N1cHBvcnQoKQogICAgICAgIGZlYXR1cmVfbmFtZXMgPSBYLmNvbHVtbnNbZmVhdHVyZV9pZHhdCiAgICAgICAgc2VsZWN0ZWRfZmVhdHVyZXNfYWdnW21vZGVsX25hbWVdID0gZmVhdHVyZV9uYW1lcy50b2xpc3QoKQoKICAgICAgICAjIENvbGxlY3QgbW9kZWwgZmVhdHVyZSBpbXBvcnRhbmNlCiAgICAgICAgaWYgaGFzYXR0cihzZWxlY3RfZnJvbV9tb2RlbC5lc3RpbWF0b3JfLCAiY29lZl8iKToKICAgICAgICAgICAgc3RhdF9kZiA9IHNlbGVjdF9mcm9tX21vZGVsLmVzdGltYXRvcl8uY29lZl8KICAgICAgICBlbGlmIGhhc2F0dHIoc2VsZWN0X2Zyb21fbW9kZWwuZXN0aW1hdG9yXywgImZlYXR1cmVfaW1wb3J0YW5jZXNfIik6CiAgICAgICAgICAgIHN0YXRfZGYgPSBzZWxlY3RfZnJvbV9tb2RlbC5lc3RpbWF0b3JfLmZlYXR1cmVfaW1wb3J0YW5jZXNfCgogICAgICAgIHN0YXRfZGYgPSBwZC5EYXRhRnJhbWUoaW5kZXg9WC5jb2x1bW5zLCBjb2x1bW5zPVttb2RlbF9uYW1lXSwgZGF0YT1zdGF0X2RmWzBdKQogICAgICAgIG1vZGVsc19kZiA9IG1vZGVsc19kZi5qb2luKHN0YXRfZGYpCgogICAgICAgIHBsb3Rfc3RhdChjb250ZXh0LCBtb2RlbF9uYW1lLCBzdGF0X2RmKQoKICAgICMgQ3JlYXRlIGZlYXR1cmVfc2NvcmVzIERGIHdpdGggc3RhdCAmIG1vZGVsIGZpbHRlcnMgc2NvcmVzCiAgICByZXN1bHRfbWF0cml4X2RmID0gcGQuY29uY2F0KFtzdGF0c19kZiwgbW9kZWxzX2RmXSwgYXhpcz0xLCBzb3J0PUZhbHNlKQogICAgY29udGV4dC5sb2dfZGF0YXNldCgKICAgICAgICBrZXk9ImZlYXR1cmVfc2NvcmVzIiwKICAgICAgICBkZj1yZXN1bHRfbWF0cml4X2RmLAogICAgICAgIGxvY2FsX3BhdGg9ImZlYXR1cmVfc2NvcmVzLnBhcnF1ZXQiLAogICAgICAgIGZvcm1hdD0icGFycXVldCIsCiAgICApCiAgICBpZiBtYXhfc2NhbGVkX3Njb3JlczoKICAgICAgICBub3JtYWxpemVkX2RmID0gcmVzdWx0X21hdHJpeF9kZi5yZXBsYWNlKFtucC5pbmYsIC1ucC5pbmZdLCBucC5uYW4pLnZhbHVlcwogICAgICAgIG1pbl9tYXhfc2NhbGVyID0gTWluTWF4U2NhbGVyKCkKICAgICAgICBub3JtYWxpemVkX2RmID0gbWluX21heF9zY2FsZXIuZml0X3RyYW5zZm9ybShub3JtYWxpemVkX2RmKQogICAgICAgIG5vcm1hbGl6ZWRfZGYgPSBwZC5EYXRhRnJhbWUoCiAgICAgICAgICAgIGRhdGE9bm9ybWFsaXplZF9kZiwKICAgICAgICAgICAgY29sdW1ucz1yZXN1bHRfbWF0cml4X2RmLmNvbHVtbnMsCiAgICAgICAgICAgIGluZGV4PXJlc3VsdF9tYXRyaXhfZGYuaW5kZXgsCiAgICAgICAgKQogICAgICAgIGNvbnRleHQubG9nX2RhdGFzZXQoCiAgICAgICAgICAgIGtleT0ibWF4X3NjYWxlZF9zY29yZXNfZmVhdHVyZV9zY29yZXMiLAogICAgICAgICAgICBkZj1ub3JtYWxpemVkX2RmLAogICAgICAgICAgICBsb2NhbF9wYXRoPSJtYXhfc2NhbGVkX3Njb3Jlc19mZWF0dXJlX3Njb3Jlcy5wYXJxdWV0IiwKICAgICAgICAgICAgZm9ybWF0PSJwYXJxdWV0IiwKICAgICAgICApCgogICAgIyBDcmVhdGUgZmVhdHVyZSBjb3VudCBEYXRhRnJhbWUKICAgIGZvciB0ZXN0X25hbWUgaW4gc2VsZWN0ZWRfZmVhdHVyZXNfYWdnOgogICAgICAgIHJlc3VsdF9tYXRyaXhfZGZbdGVzdF9uYW1lXSA9IFsKICAgICAgICAgICAgMSBpZiB4IGluIHNlbGVjdGVkX2ZlYXR1cmVzX2FnZ1t0ZXN0X25hbWVdIGVsc2UgMCBmb3IgeCBpbiBYLmNvbHVtbnMKICAgICAgICBdCiAgICByZXN1bHRfbWF0cml4X2RmLmxvY1s6LCAibnVtX3ZvdGVzIl0gPSByZXN1bHRfbWF0cml4X2RmLnN1bShheGlzPTEpCiAgICBjb250ZXh0LmxvZ19kYXRhc2V0KAogICAgICAgIGtleT0ic2VsZWN0ZWRfZmVhdHVyZXNfY291bnQiLAogICAgICAgIGRmPXJlc3VsdF9tYXRyaXhfZGYsCiAgICAgICAgbG9jYWxfcGF0aD0ic2VsZWN0ZWRfZmVhdHVyZXNfY291bnQucGFycXVldCIsCiAgICAgICAgZm9ybWF0PSJwYXJxdWV0IiwKICAgICkKCiAgICAjIEhvdyBtYW55IHZvdGVzIGFyZSBuZWVkZWQgZm9yIGEgZmVhdHVyZSB0byBiZSBzZWxlY3RlZD8KICAgIGlmIGlzaW5zdGFuY2UobWluX3ZvdGVzLCBpbnQpOgogICAgICAgIHZvdGVzX25lZWRlZCA9IG1pbl92b3RlcwogICAgZWxzZToKICAgICAgICBudW1fZmlsdGVycyA9IGxlbihzdGF0X2ZpbHRlcnMpICsgbGVuKG1vZGVsX2ZpbHRlcnMpCiAgICAgICAgdm90ZXNfbmVlZGVkID0gaW50KG5wLmZsb29yKG51bV9maWx0ZXJzICogbWF4KG1pbihtaW5fdm90ZXMsIDEpLCAwKSkpCiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYidm90ZXMgbmVlZGVkIHRvIGJlIHNlbGVjdGVkOiB7dm90ZXNfbmVlZGVkfSIpCgogICAgIyBDcmVhdGUgZmluYWwgZmVhdHVyZSBkYXRhZnJhbWUKICAgIHNlbGVjdGVkX2ZlYXR1cmVzID0gcmVzdWx0X21hdHJpeF9kZlsKICAgICAgICByZXN1bHRfbWF0cml4X2RmLm51bV92b3RlcyA+PSB2b3Rlc19uZWVkZWQKICAgIF0uaW5kZXgudG9saXN0KCkKICAgIGdvb2RfZmVhdHVyZV9kZiA9IGRmLmxvY1s6LCBzZWxlY3RlZF9mZWF0dXJlc10KICAgIGZpbmFsX2RmID0gcGQuY29uY2F0KFtnb29kX2ZlYXR1cmVfZGYsIHldLCBheGlzPTEpCiAgICBjb250ZXh0LmxvZ19kYXRhc2V0KAogICAgICAgIGtleT0ic2VsZWN0ZWRfZmVhdHVyZXMiLAogICAgICAgIGRmPWZpbmFsX2RmLAogICAgICAgIGxvY2FsX3BhdGg9InNlbGVjdGVkX2ZlYXR1cmVzLnBhcnF1ZXQiLAogICAgICAgIGZvcm1hdD0icGFycXVldCIsCiAgICApCgogICAgIyBDcmVhdGluZyBhIG5ldyBmZWF0dXJlIHZlY3RvciBjb250YWluaW5nIG9ubHkgdGhlIGlkZW50aWZpZWQgdG9wIGZlYXR1cmVzCiAgICBpZiBpc19mZWF0dXJlX3ZlY3RvciBhbmQgZGZfYXJ0aWZhY3QubWV0YS5zcGVjLmZlYXR1cmVzIGFuZCBvdXRwdXRfdmVjdG9yX25hbWU6CiAgICAgICAgIyBTZWxlY3RpbmcgdGhlIHRvcCBLIGZlYXR1cmVzIGZyb20gb3VyIHRvcCBmZWF0dXJlIGRhdGFmcmFtZQogICAgICAgIHNlbGVjdGVkX2ZlYXR1cmVzID0gcmVzdWx0X21hdHJpeF9kZi5oZWFkKGspLmluZGV4CgogICAgICAgICMgTWF0Y2ggdGhlIHNlbGVjdGVkIGZlYXR1cmUgbmFtZXMgdG8gdGhlIEZTIEZlYXR1cmUgYW5ub3RhdGlvbnMKICAgICAgICBtYXRjaGVkX3NlbGVjdGlvbnMgPSBbCiAgICAgICAgICAgIGZlYXR1cmUKICAgICAgICAgICAgZm9yIGZlYXR1cmUgaW4gbGlzdChkZl9hcnRpZmFjdC5tZXRhLnNwZWMuZmVhdHVyZXMpCiAgICAgICAgICAgIGZvciBzZWxlY3RlZCBpbiBsaXN0KHNlbGVjdGVkX2ZlYXR1cmVzKQogICAgICAgICAgICBpZiBmZWF0dXJlLmVuZHN3aXRoKHNlbGVjdGVkKQogICAgICAgIF0KCiAgICAgICAgIyBEZWZpbmluZyBvdXIgbmV3IGZlYXR1cmUgdmVjdG9yCiAgICAgICAgdG9wX2ZlYXR1cmVzX2Z2ID0gZnMuRmVhdHVyZVZlY3RvcigKICAgICAgICAgICAgb3V0cHV0X3ZlY3Rvcl9uYW1lLAogICAgICAgICAgICBtYXRjaGVkX3NlbGVjdGlvbnMsCiAgICAgICAgICAgIGxhYmVsX2ZlYXR1cmU9ImxhYmVscy5sYWJlbCIsCiAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJmZWF0dXJlIHZlY3RvciBjb21wb3NlZCBzdHJpY3RseSBvZiBvdXIgdG9wIGZlYXR1cmVzIiwKICAgICAgICApCgogICAgICAgICMgU2F2aW5nCiAgICAgICAgdG9wX2ZlYXR1cmVzX2Z2LnNhdmUoKQogICAgICAgIGZzLmdldF9vZmZsaW5lX2ZlYXR1cmVzKHRvcF9mZWF0dXJlc19mdiwgdGFyZ2V0PVBhcnF1ZXRUYXJnZXQoKSkKCiAgICAgICAgIyBMb2dnaW5nIG91ciBuZXcgZmVhdHVyZSB2ZWN0b3IgVVJJCiAgICAgICAgY29udGV4dC5sb2dfcmVzdWx0KCJ0b3BfZmVhdHVyZXNfdmVjdG9yIiwgdG9wX2ZlYXR1cmVzX2Z2LnVyaSkK code_origin: '' default_handler: feature_selection image: mlrun/mlrun diff --git a/feature_selection/requirements.txt b/feature_selection/requirements.txt index 70a079c7d..e4d79d180 100644 --- a/feature_selection/requirements.txt +++ b/feature_selection/requirements.txt @@ -1,5 +1,3 @@ scikit-learn -matplotlib -seaborn scikit-plot - +plotly~=5.4.0 diff --git a/feature_selection/test_feature_selection.py b/feature_selection/test_feature_selection.py index 9cb5ca621..6ae949aab 100644 --- a/feature_selection/test_feature_selection.py +++ b/feature_selection/test_feature_selection.py @@ -12,14 +12,31 @@ # See the License for the specific language governing permissions and # limitations under the License. # -from mlrun import code_to_function -from pathlib import Path +import os import shutil +from pathlib import Path + +import mlrun -METRICS_PATH = 'data/metrics.pq' -ARTIFACTS_PATH = 'artifacts' -RUNS_PATH = 'runs' -SCHEDULES_PATH = 'schedules' +METRICS_PATH = "data/metrics.pq" +ARTIFACTS_PATH = "artifacts" +RUNS_PATH = "runs" +SCHEDULES_PATH = "schedules" +PLOTS_PATH = os.path.abspath("./artifacts/feature-selection-feature-selection/0") + + +def _validate_paths(paths): + """ + Check if all the expected plot are saved + """ + base_folder = PLOTS_PATH + for path in paths: + full_path = os.path.join(base_folder, path) + if Path(full_path).is_file(): + print(f"{path} exist") + else: + raise FileNotFoundError(f"{path} not found!") + return True def _delete_outputs(paths): @@ -29,20 +46,24 @@ def _delete_outputs(paths): def test_run_local_feature_selection(): - fn = code_to_function(name='test_run_local_feature_selection', - filename="feature_selection.py", - handler="feature_selection", - kind="local", - ) - fn.spec.command = "feature_selection.py" + fn = mlrun.import_function("function.yaml") run = fn.run( params={ - 'k': 2, - 'min_votes': 0.3, - 'label_column': 'is_error', + "k": 2, + "min_votes": 0.3, + "label_column": "is_error", }, - inputs={'df_artifact': 'data/metrics.pq'}, - artifact_path='artifacts/', + inputs={"df_artifact": "data/metrics.pq"}, + artifact_path="artifacts/", + local=True, + ) + assert _validate_paths( + [ + "chi2.html", + "f_classif.html", + "f_regression.html", + "mutual_info_classif.html", + ] ) - assert run.outputs['feature_scores'] and run.outputs['selected_features'] _delete_outputs({ARTIFACTS_PATH, RUNS_PATH, SCHEDULES_PATH}) + assert run.outputs['feature_scores'] and run.outputs['selected_features'] diff --git a/hugging_face_serving/function.yaml b/hugging_face_serving/function.yaml index e1bb3b0ce..764fc1cfe 100644 --- a/hugging_face_serving/function.yaml +++ b/hugging_face_serving/function.yaml @@ -2,11 +2,13 @@ kind: serving metadata: name: hugging-face-serving tag: '' - hash: 39bfca7b639022fa03f5ca87f85f9e17fc837b70 + hash: 1a489a57da861f129eb26e933f34e58927e41195 project: '' labels: author: yonish categories: + - huggingface + - genai - model-serving - machine-learning spec: @@ -14,37 +16,28 @@ spec: args: [] image: mlrun/ml-models build: - commands: - - python -m pip install transformers==4.21.3 tensorflow==2.9.2 - code_origin: https://github.com/mlrun/functions.git#250244b2527c5ce8a82438b4340df34de6e19dc3:/Users/yonatanshelach/yoni/projects/functions/hugging_face_serving/hugging_face_serving.py - origin_filename: /Users/yonatanshelach/yoni/projects/functions/hugging_face_serving/hugging_face_serving.py + functionSourceCode: IyBDb3B5cmlnaHQgMjAxOSBJZ3VhemlvCiMKIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiMKCmZyb20gYWJjIGltcG9ydCBBQkMKZnJvbSBpbXBvcnRsaWIgaW1wb3J0IGltcG9ydF9tb2R1bGUKZnJvbSB0eXBpbmcgaW1wb3J0IExpc3QKCmZyb20gdHJhbnNmb3JtZXJzIGltcG9ydCBwaXBlbGluZQoKaW1wb3J0IG1scnVuLnNlcnZpbmcKClBBQ0tBR0VfTU9EVUxFID0gInRyYW5zZm9ybWVycyIKU0VSSUFMSVpBQkxFX1RZUEVTID0gW2RpY3QsIGxpc3QsIHR1cGxlLCBzdHIsIGludCwgZmxvYXRdCgoKY2xhc3MgSHVnZ2luZ0ZhY2VNb2RlbFNlcnZlcihtbHJ1bi5zZXJ2aW5nLlYyTW9kZWxTZXJ2ZXIsIEFCQyk6CiAgICAiIiIKICAgIEh1Z2dpbmcgRmFjZSBNb2RlbCBzZXJ2aW5nIGNsYXNzLCBpbmhlcml0aW5nIHRoZSBWMk1vZGVsU2VydmVyIGNsYXNzIGZvciBiZWluZyBpbml0aWFsaXplZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZQogICAgbW9kZWwgc2VydmVyIGFuZCBiZSBhYmxlIHRvIHJ1biBsb2NhbGx5IGFzIHBhcnQgb2YgYSBudWNsaW8gc2VydmVybGVzcyBmdW5jdGlvbiwgb3IgYXMgcGFydCBvZiBhIHJlYWwtdGltZSBwaXBlbGluZS4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXygKICAgICAgICBzZWxmLAogICAgICAgIGNvbnRleHQ6IG1scnVuLk1MQ2xpZW50Q3R4LAogICAgICAgIG5hbWU6IHN0ciwKICAgICAgICB0YXNrOiBzdHIsCiAgICAgICAgbW9kZWxfcGF0aDogc3RyID0gTm9uZSwKICAgICAgICBtb2RlbF9uYW1lOiBzdHIgPSBOb25lLAogICAgICAgIG1vZGVsX2NsYXNzOiBzdHIgPSBOb25lLAogICAgICAgIHRva2VuaXplcl9uYW1lOiBzdHIgPSBOb25lLAogICAgICAgIHRva2VuaXplcl9jbGFzczogc3RyID0gTm9uZSwKICAgICAgICBmcmFtZXdvcms6IHN0ciA9IE5vbmUsCiAgICAgICAgKipjbGFzc19hcmdzLAogICAgKToKICAgICAgICAiIiIKICAgICAgICBJbml0aWFsaXplIGEgc2VydmluZyBjbGFzcyBmb3IgYSBIdWdnaW5nIGZhY2UgbW9kZWwuCgogICAgICAgIDpwYXJhbSBjb250ZXh0OiAgICAgICAgIFRoZSBtbHJ1biBjb250ZXh0IHRvIHdvcmsgd2l0aAogICAgICAgIDpwYXJhbSBuYW1lOiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoaXMgc2VydmVyIHRvIGJlIGluaXRpYWxpemVkCiAgICAgICAgOnBhcmFtIG1vZGVsX3BhdGg6ICAgICAgTm90IGluIHVzZS4gV2hlbiBhZGRpbmcgYSBtb2RlbCBwYXNzIGFueSBzdHJpbmcgdmFsdWUKICAgICAgICA6cGFyYW0gbW9kZWxfbmFtZTogICAgICBUaGUgbW9kZWwncyBuYW1lIGluIHRoZSBIdWdnaW5nIEZhY2UgaHViCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nLiwgYG5scHRvd24vYmVydC1iYXNlLW11bHRpbGluZ3VhbC11bmNhc2VkLXNlbnRpbWVudGAKICAgICAgICA6cGFyYW0gbW9kZWxfY2xhc3M6ICAgICBUaGUgbW9kZWwncyBjbGFzcyB0eXBlIG9iamVjdCB3aGljaCBjYW4gYmUgcGFzc2VkIGFzIHRoZSBjbGFzcydzIG5hbWUgKHN0cmluZykuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVzdCBiZSBwcm92aWRlZCBhbmQgdG8gYmUgbWF0Y2hlZCB3aXRoIGBtb2RlbF9uYW1lYC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmcuLCBgQXV0b01vZGVsRm9yU2VxdWVuY2VDbGFzc2lmaWNhdGlvbmAKICAgICAgICA6cGFyYW0gdG9rZW5pemVyX25hbWU6ICBUaGUgdG9rZW5pemVyJ3MgbmFtZSBpbiB0aGUgSHVnZ2luZyBGYWNlIGh1YgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZy4sIGBubHB0b3duL2JlcnQtYmFzZS1tdWx0aWxpbmd1YWwtdW5jYXNlZC1zZW50aW1lbnRgCiAgICAgICAgOnBhcmFtIHRva2VuaXplcl9jbGFzczogVGhlIG1vZGVsJ3MgY2xhc3MgdHlwZSBvYmplY3Qgd2hpY2ggY2FuIGJlIHBhc3NlZCBhcyB0aGUgY2xhc3MncyBuYW1lIChzdHJpbmcpLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11c3QgYmUgcHJvdmlkZWQgYW5kIHRvIGJlIG1hdGNoZWQgd2l0aCBgbW9kZWxfbmFtZWAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nLiwgYEF1dG9Ub2tlbml6ZXJgCiAgICAgICAgOnBhcmFtIGZyYW1ld29yazogICAgICAgVGhlIGZyYW1ld29yayB0byB1c2UsIGVpdGhlciBgInB0ImAgZm9yIFB5VG9yY2ggb3IgYCJ0ZiJgIGZvciBUZW5zb3JGbG93LiBUaGUgc3BlY2lmaWVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWV3b3JrIG11c3QgYmUgaW5zdGFsbGVkLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIG5vIGZyYW1ld29yayBpcyBzcGVjaWZpZWQsIHdpbGwgZGVmYXVsdCB0byB0aGUgb25lIGN1cnJlbnRseSBpbnN0YWxsZWQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgbm8gZnJhbWV3b3JrIGlzIHNwZWNpZmllZCBhbmQgYm90aCBmcmFtZXdvcmtzIGFyZSBpbnN0YWxsZWQsIHdpbGwgZGVmYXVsdCB0byB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXdvcmsgb2YgdGhlIGBtb2RlbGAsIG9yIHRvIFB5VG9yY2ggaWYgbm8gbW9kZWwgaXMgcHJvdmlkZWQuCiAgICAgICAgOnBhcmFtIGNsYXNzX2FyZ3M6ICAgICAgLQogICAgICAgICIiIgogICAgICAgIHN1cGVyKEh1Z2dpbmdGYWNlTW9kZWxTZXJ2ZXIsIHNlbGYpLl9faW5pdF9fKAogICAgICAgICAgICBjb250ZXh0PWNvbnRleHQsCiAgICAgICAgICAgIG5hbWU9bmFtZSwKICAgICAgICAgICAgbW9kZWxfcGF0aD1tb2RlbF9wYXRoLAogICAgICAgICAgICAqKmNsYXNzX2FyZ3MsCiAgICAgICAgKQogICAgICAgIHNlbGYudGFzayA9IHRhc2sKICAgICAgICBzZWxmLm1vZGVsID0gTm9uZQogICAgICAgIHNlbGYudG9rZW5pemVyID0gTm9uZQogICAgICAgIHNlbGYubW9kZWxfbmFtZSA9IG1vZGVsX25hbWUKICAgICAgICBzZWxmLnRva2VuaXplcl9uYW1lID0gdG9rZW5pemVyX25hbWUKICAgICAgICBzZWxmLm1vZGVsX2NsYXNzID0gbW9kZWxfY2xhc3MKICAgICAgICBzZWxmLnRva2VuaXplcl9jbGFzcyA9IHRva2VuaXplcl9jbGFzcwogICAgICAgIHNlbGYuZnJhbWV3b3JrID0gZnJhbWV3b3JrCiAgICAgICAgc2VsZi5waXBlID0gTm9uZQoKICAgIGRlZiBsb2FkKHNlbGYpOgogICAgICAgICIiImxvYWQgYW5kIGluaXRpYWxpemUgdGhlIG1vZGVsIGFuZC9vciBvdGhlciBlbGVtZW50cyIiIgogICAgICAgIGlmIHNlbGYubW9kZWxfY2xhc3M6CiAgICAgICAgICAgIG1vZGVsX29iamVjdCA9IGdldGF0dHIoaW1wb3J0X21vZHVsZShQQUNLQUdFX01PRFVMRSksIHNlbGYubW9kZWxfY2xhc3MpCiAgICAgICAgICAgIHNlbGYubW9kZWwgPSBtb2RlbF9vYmplY3QuZnJvbV9wcmV0cmFpbmVkKHNlbGYubW9kZWxfbmFtZSkKICAgICAgICBpZiBzZWxmLnRva2VuaXplcl9jbGFzczoKICAgICAgICAgICAgdG9rZW5pemVyX29iamVjdCA9IGdldGF0dHIoCiAgICAgICAgICAgICAgICBpbXBvcnRfbW9kdWxlKFBBQ0tBR0VfTU9EVUxFKSwgc2VsZi50b2tlbml6ZXJfY2xhc3MKICAgICAgICAgICAgKQogICAgICAgICAgICBzZWxmLnRva2VuaXplciA9IHRva2VuaXplcl9vYmplY3QuZnJvbV9wcmV0cmFpbmVkKHNlbGYudG9rZW5pemVyX25hbWUpCiAgICAgICAgc2VsZi5waXBlID0gcGlwZWxpbmUoCiAgICAgICAgICAgIHRhc2s9c2VsZi50YXNrLAogICAgICAgICAgICBtb2RlbD1zZWxmLm1vZGVsIG9yIHNlbGYubW9kZWxfbmFtZSwKICAgICAgICAgICAgdG9rZW5pemVyPXNlbGYudG9rZW5pemVyLAogICAgICAgICAgICBmcmFtZXdvcms9c2VsZi5mcmFtZXdvcmssCiAgICAgICAgKQoKICAgIGRlZiBwcmVkaWN0KHNlbGYsIGJvZHk6IGRpY3QpIC0+IExpc3Q6CiAgICAgICAgIiIiR2VuZXJhdGUgbW9kZWwgcHJlZGljdGlvbnMgZnJvbSBzYW1wbGUuIiIiCiAgICAgICAgaWYgc2VsZi5waXBlIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlBsZWFzZSB1c2UgYC5sb2FkKClgIikKICAgICAgICB0cnk6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYm9keVsiaW5wdXRzIl1bMF0sIGRpY3QpOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gW3NlbGYucGlwZSgqKl9pbnB1dCkgZm9yIF9pbnB1dCBpbiBib2R5WyJpbnB1dHMiXV0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYucGlwZShib2R5WyJpbnB1dHMiXSkKICAgICAgICAgICAgIyByZXBsYWNlIGxpc3Qgb2YgbGlzdHMgb2YgZGljdHMgaW50byBhIGxpc3Qgb2YgZGljdHM6CiAgICAgICAgICAgIGlmIGFsbChpc2luc3RhbmNlKHJlcywgbGlzdCkgZm9yIHJlcyBpbiByZXN1bHQpOgogICAgICAgICAgICAgICAgbmV3X3Jlc3VsdCA9IFtyZXNbMF0gZm9yIHJlcyBpbiByZXN1bHRdCiAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXdfcmVzdWx0CgogICAgICAgICAgICBub25fc2VyaWFsaXphYmxlX3R5cGVzID0gW10KICAgICAgICAgICAgZm9yIHJlcyBpbiByZXN1bHQ6CiAgICAgICAgICAgICAgICBmb3Iga2V5LCB2YWwgaW4gcmVzLml0ZW1zKCk6CiAgICAgICAgICAgICAgICAgICAgaWYgdHlwZSh2YWwpIG5vdCBpbiBTRVJJQUxJWkFCTEVfVFlQRVM6CiAgICAgICAgICAgICAgICAgICAgICAgIG5vbl9zZXJpYWxpemFibGVfdHlwZXMuYXBwZW5kKHN0cih0eXBlKHZhbCkpKQogICAgICAgICAgICAgICAgICAgICAgICByZXNba2V5XSA9IHN0cih2YWwpCiAgICAgICAgICAgIGlmIG5vbl9zZXJpYWxpemFibGVfdHlwZXM6CiAgICAgICAgICAgICAgICBzZWxmLmNvbnRleHQubG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAgICAgZiJOb24tc2VyaWFsaXphYmxlIHR5cGVzOiB7bm9uX3NlcmlhbGl6YWJsZV90eXBlc30gd2VyZSBjYXN0ZWQgdG8gc3RyaW5ncyIKICAgICAgICAgICAgICAgICkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiRmFpbGVkIHRvIHByZWRpY3QgJXMiICUgZSkKICAgICAgICByZXR1cm4gcmVzdWx0Cgpmcm9tIG1scnVuLnJ1bnRpbWVzIGltcG9ydCBudWNsaW9faW5pdF9ob29rCmRlZiBpbml0X2NvbnRleHQoY29udGV4dCk6CiAgICBudWNsaW9faW5pdF9ob29rKGNvbnRleHQsIGdsb2JhbHMoKSwgJ3NlcnZpbmdfdjInKQoKZGVmIGhhbmRsZXIoY29udGV4dCwgZXZlbnQpOgogICAgcmV0dXJuIGNvbnRleHQubWxydW5faGFuZGxlcihjb250ZXh0LCBldmVudCkK + commands: [] + code_origin: '' + origin_filename: '' + requirements: + - transformers==4.21.3 + - tensorflow==2.9.2 description: Generic Hugging Face model server. - default_handler: handler + default_handler: '' disable_auto_mount: false - env: [] + clone_target_dir: '' + env: + - name: MLRUN_HTTPDB__NUCLIO__EXPLICIT_ACK + value: enabled priority_class_name: '' preemption_mode: prevent min_replicas: 1 max_replicas: 4 - base_spec: - apiVersion: nuclio.io/v1 - kind: Function - metadata: - name: hugging-face-serving - labels: {} - annotations: - nuclio.io/generated_by: function generated from /Users/yonatanshelach/yoni/projects/functions/hugging_face_serving/hugging_face_serving.py - spec: - runtime: python - handler: hugging_face_serving:handler - env: [] - volumes: [] - build: - commands: [] - noBaseImagesPull: true - functionSourceCode: IyBDb3B5cmlnaHQgMjAxOSBJZ3VhemlvCiMKIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiMKCmZyb20gYWJjIGltcG9ydCBBQkMKZnJvbSBpbXBvcnRsaWIgaW1wb3J0IGltcG9ydF9tb2R1bGUKZnJvbSB0eXBpbmcgaW1wb3J0IExpc3QKCmZyb20gdHJhbnNmb3JtZXJzIGltcG9ydCBwaXBlbGluZQoKaW1wb3J0IG1scnVuLnNlcnZpbmcKClBBQ0tBR0VfTU9EVUxFID0gInRyYW5zZm9ybWVycyIKU0VSSUFMSVpBQkxFX1RZUEVTID0gW2RpY3QsIGxpc3QsIHR1cGxlLCBzdHIsIGludCwgZmxvYXRdCgoKY2xhc3MgSHVnZ2luZ0ZhY2VNb2RlbFNlcnZlcihtbHJ1bi5zZXJ2aW5nLlYyTW9kZWxTZXJ2ZXIsIEFCQyk6CiAgICAiIiIKICAgIEh1Z2dpbmcgRmFjZSBNb2RlbCBzZXJ2aW5nIGNsYXNzLCBpbmhlcml0aW5nIHRoZSBWMk1vZGVsU2VydmVyIGNsYXNzIGZvciBiZWluZyBpbml0aWFsaXplZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZQogICAgbW9kZWwgc2VydmVyIGFuZCBiZSBhYmxlIHRvIHJ1biBsb2NhbGx5IGFzIHBhcnQgb2YgYSBudWNsaW8gc2VydmVybGVzcyBmdW5jdGlvbiwgb3IgYXMgcGFydCBvZiBhIHJlYWwtdGltZSBwaXBlbGluZS4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXygKICAgICAgICBzZWxmLAogICAgICAgIGNvbnRleHQ6IG1scnVuLk1MQ2xpZW50Q3R4LAogICAgICAgIG5hbWU6IHN0ciwKICAgICAgICB0YXNrOiBzdHIsCiAgICAgICAgbW9kZWxfcGF0aDogc3RyID0gTm9uZSwKICAgICAgICBtb2RlbF9uYW1lOiBzdHIgPSBOb25lLAogICAgICAgIG1vZGVsX2NsYXNzOiBzdHIgPSBOb25lLAogICAgICAgIHRva2VuaXplcl9uYW1lOiBzdHIgPSBOb25lLAogICAgICAgIHRva2VuaXplcl9jbGFzczogc3RyID0gTm9uZSwKICAgICAgICBmcmFtZXdvcms6IHN0ciA9IE5vbmUsCiAgICAgICAgKipjbGFzc19hcmdzLAogICAgKToKICAgICAgICAiIiIKICAgICAgICBJbml0aWFsaXplIGEgc2VydmluZyBjbGFzcyBmb3IgYSBIdWdnaW5nIGZhY2UgbW9kZWwuCgogICAgICAgIDpwYXJhbSBjb250ZXh0OiAgICAgICAgIFRoZSBtbHJ1biBjb250ZXh0IHRvIHdvcmsgd2l0aAogICAgICAgIDpwYXJhbSBuYW1lOiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoaXMgc2VydmVyIHRvIGJlIGluaXRpYWxpemVkCiAgICAgICAgOnBhcmFtIG1vZGVsX3BhdGg6ICAgICAgTm90IGluIHVzZS4gV2hlbiBhZGRpbmcgYSBtb2RlbCBwYXNzIGFueSBzdHJpbmcgdmFsdWUKICAgICAgICA6cGFyYW0gbW9kZWxfbmFtZTogICAgICBUaGUgbW9kZWwncyBuYW1lIGluIHRoZSBIdWdnaW5nIEZhY2UgaHViCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nLiwgYG5scHRvd24vYmVydC1iYXNlLW11bHRpbGluZ3VhbC11bmNhc2VkLXNlbnRpbWVudGAKICAgICAgICA6cGFyYW0gbW9kZWxfY2xhc3M6ICAgICBUaGUgbW9kZWwncyBjbGFzcyB0eXBlIG9iamVjdCB3aGljaCBjYW4gYmUgcGFzc2VkIGFzIHRoZSBjbGFzcydzIG5hbWUgKHN0cmluZykuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVzdCBiZSBwcm92aWRlZCBhbmQgdG8gYmUgbWF0Y2hlZCB3aXRoIGBtb2RlbF9uYW1lYC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmcuLCBgQXV0b01vZGVsRm9yU2VxdWVuY2VDbGFzc2lmaWNhdGlvbmAKICAgICAgICA6cGFyYW0gdG9rZW5pemVyX25hbWU6ICBUaGUgdG9rZW5pemVyJ3MgbmFtZSBpbiB0aGUgSHVnZ2luZyBGYWNlIGh1YgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZy4sIGBubHB0b3duL2JlcnQtYmFzZS1tdWx0aWxpbmd1YWwtdW5jYXNlZC1zZW50aW1lbnRgCiAgICAgICAgOnBhcmFtIHRva2VuaXplcl9jbGFzczogVGhlIG1vZGVsJ3MgY2xhc3MgdHlwZSBvYmplY3Qgd2hpY2ggY2FuIGJlIHBhc3NlZCBhcyB0aGUgY2xhc3MncyBuYW1lIChzdHJpbmcpLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11c3QgYmUgcHJvdmlkZWQgYW5kIHRvIGJlIG1hdGNoZWQgd2l0aCBgbW9kZWxfbmFtZWAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nLiwgYEF1dG9Ub2tlbml6ZXJgCiAgICAgICAgOnBhcmFtIGZyYW1ld29yazogICAgICAgVGhlIGZyYW1ld29yayB0byB1c2UsIGVpdGhlciBgInB0ImAgZm9yIFB5VG9yY2ggb3IgYCJ0ZiJgIGZvciBUZW5zb3JGbG93LiBUaGUgc3BlY2lmaWVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWV3b3JrIG11c3QgYmUgaW5zdGFsbGVkLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIG5vIGZyYW1ld29yayBpcyBzcGVjaWZpZWQsIHdpbGwgZGVmYXVsdCB0byB0aGUgb25lIGN1cnJlbnRseSBpbnN0YWxsZWQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgbm8gZnJhbWV3b3JrIGlzIHNwZWNpZmllZCBhbmQgYm90aCBmcmFtZXdvcmtzIGFyZSBpbnN0YWxsZWQsIHdpbGwgZGVmYXVsdCB0byB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXdvcmsgb2YgdGhlIGBtb2RlbGAsIG9yIHRvIFB5VG9yY2ggaWYgbm8gbW9kZWwgaXMgcHJvdmlkZWQuCiAgICAgICAgOnBhcmFtIGNsYXNzX2FyZ3M6ICAgICAgLQogICAgICAgICIiIgogICAgICAgIHN1cGVyKEh1Z2dpbmdGYWNlTW9kZWxTZXJ2ZXIsIHNlbGYpLl9faW5pdF9fKAogICAgICAgICAgICBjb250ZXh0PWNvbnRleHQsCiAgICAgICAgICAgIG5hbWU9bmFtZSwKICAgICAgICAgICAgbW9kZWxfcGF0aD1tb2RlbF9wYXRoLAogICAgICAgICAgICAqKmNsYXNzX2FyZ3MsCiAgICAgICAgKQogICAgICAgIHNlbGYudGFzayA9IHRhc2sKICAgICAgICBzZWxmLm1vZGVsID0gTm9uZQogICAgICAgIHNlbGYudG9rZW5pemVyID0gTm9uZQogICAgICAgIHNlbGYubW9kZWxfbmFtZSA9IG1vZGVsX25hbWUKICAgICAgICBzZWxmLnRva2VuaXplcl9uYW1lID0gdG9rZW5pemVyX25hbWUKICAgICAgICBzZWxmLm1vZGVsX2NsYXNzID0gbW9kZWxfY2xhc3MKICAgICAgICBzZWxmLnRva2VuaXplcl9jbGFzcyA9IHRva2VuaXplcl9jbGFzcwogICAgICAgIHNlbGYuZnJhbWV3b3JrID0gZnJhbWV3b3JrCiAgICAgICAgc2VsZi5waXBlID0gTm9uZQoKICAgIGRlZiBsb2FkKHNlbGYpOgogICAgICAgICIiImxvYWQgYW5kIGluaXRpYWxpemUgdGhlIG1vZGVsIGFuZC9vciBvdGhlciBlbGVtZW50cyIiIgogICAgICAgIGlmIHNlbGYubW9kZWxfY2xhc3M6CiAgICAgICAgICAgIG1vZGVsX29iamVjdCA9IGdldGF0dHIoaW1wb3J0X21vZHVsZShQQUNLQUdFX01PRFVMRSksIHNlbGYubW9kZWxfY2xhc3MpCiAgICAgICAgICAgIHNlbGYubW9kZWwgPSBtb2RlbF9vYmplY3QuZnJvbV9wcmV0cmFpbmVkKHNlbGYubW9kZWxfbmFtZSkKICAgICAgICBpZiBzZWxmLnRva2VuaXplcl9jbGFzczoKICAgICAgICAgICAgdG9rZW5pemVyX29iamVjdCA9IGdldGF0dHIoCiAgICAgICAgICAgICAgICBpbXBvcnRfbW9kdWxlKFBBQ0tBR0VfTU9EVUxFKSwgc2VsZi50b2tlbml6ZXJfY2xhc3MKICAgICAgICAgICAgKQogICAgICAgICAgICBzZWxmLnRva2VuaXplciA9IHRva2VuaXplcl9vYmplY3QuZnJvbV9wcmV0cmFpbmVkKHNlbGYudG9rZW5pemVyX25hbWUpCiAgICAgICAgc2VsZi5waXBlID0gcGlwZWxpbmUoCiAgICAgICAgICAgIHRhc2s9c2VsZi50YXNrLAogICAgICAgICAgICBtb2RlbD1zZWxmLm1vZGVsIG9yIHNlbGYubW9kZWxfbmFtZSwKICAgICAgICAgICAgdG9rZW5pemVyPXNlbGYudG9rZW5pemVyLAogICAgICAgICAgICBmcmFtZXdvcms9c2VsZi5mcmFtZXdvcmssCiAgICAgICAgKQoKICAgIGRlZiBwcmVkaWN0KHNlbGYsIGJvZHk6IGRpY3QpIC0+IExpc3Q6CiAgICAgICAgIiIiR2VuZXJhdGUgbW9kZWwgcHJlZGljdGlvbnMgZnJvbSBzYW1wbGUuIiIiCiAgICAgICAgaWYgc2VsZi5waXBlIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlBsZWFzZSB1c2UgYC5sb2FkKClgIikKICAgICAgICB0cnk6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYm9keVsiaW5wdXRzIl1bMF0sIGRpY3QpOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gW3NlbGYucGlwZSgqKl9pbnB1dCkgZm9yIF9pbnB1dCBpbiBib2R5WyJpbnB1dHMiXV0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYucGlwZShib2R5WyJpbnB1dHMiXSkKICAgICAgICAgICAgIyByZXBsYWNlIGxpc3Qgb2YgbGlzdHMgb2YgZGljdHMgaW50byBhIGxpc3Qgb2YgZGljdHM6CiAgICAgICAgICAgIGlmIGFsbChpc2luc3RhbmNlKHJlcywgbGlzdCkgZm9yIHJlcyBpbiByZXN1bHQpOgogICAgICAgICAgICAgICAgbmV3X3Jlc3VsdCA9IFtyZXNbMF0gZm9yIHJlcyBpbiByZXN1bHRdCiAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXdfcmVzdWx0CgogICAgICAgICAgICBub25fc2VyaWFsaXphYmxlX3R5cGVzID0gW10KICAgICAgICAgICAgZm9yIHJlcyBpbiByZXN1bHQ6CiAgICAgICAgICAgICAgICBmb3Iga2V5LCB2YWwgaW4gcmVzLml0ZW1zKCk6CiAgICAgICAgICAgICAgICAgICAgaWYgdHlwZSh2YWwpIG5vdCBpbiBTRVJJQUxJWkFCTEVfVFlQRVM6CiAgICAgICAgICAgICAgICAgICAgICAgIG5vbl9zZXJpYWxpemFibGVfdHlwZXMuYXBwZW5kKHN0cih0eXBlKHZhbCkpKQogICAgICAgICAgICAgICAgICAgICAgICByZXNba2V5XSA9IHN0cih2YWwpCiAgICAgICAgICAgIGlmIG5vbl9zZXJpYWxpemFibGVfdHlwZXM6CiAgICAgICAgICAgICAgICBzZWxmLmNvbnRleHQubG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAgICAgZiJOb24tc2VyaWFsaXphYmxlIHR5cGVzOiB7bm9uX3NlcmlhbGl6YWJsZV90eXBlc30gd2VyZSBjYXN0ZWQgdG8gc3RyaW5ncyIKICAgICAgICAgICAgICAgICkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiRmFpbGVkIHRvIHByZWRpY3QgJXMiICUgZSkKICAgICAgICByZXR1cm4gcmVzdWx0Cgpmcm9tIG1scnVuLnJ1bnRpbWVzIGltcG9ydCBudWNsaW9faW5pdF9ob29rCmRlZiBpbml0X2NvbnRleHQoY29udGV4dCk6CiAgICBudWNsaW9faW5pdF9ob29rKGNvbnRleHQsIGdsb2JhbHMoKSwgJ3NlcnZpbmdfdjInKQoKZGVmIGhhbmRsZXIoY29udGV4dCwgZXZlbnQpOgogICAgcmV0dXJuIGNvbnRleHQubWxydW5faGFuZGxlcihjb250ZXh0LCBldmVudCkK source: '' function_kind: serving_v2 + function_handler: hugging_face_serving:handler + base_image_pull: false default_class: HuggingFaceModelServer secret_sources: [] affinity: null diff --git a/hugging_face_serving/item.yaml b/hugging_face_serving/item.yaml index f7fa92637..d1f78769d 100644 --- a/hugging_face_serving/item.yaml +++ b/hugging_face_serving/item.yaml @@ -1,5 +1,7 @@ apiVersion: v1 categories: +- huggingface +- genai - model-serving - machine-learning description: Generic Hugging Face model server. @@ -26,4 +28,5 @@ spec: - transformers==4.21.3 - tensorflow==2.9.2 url: '' -version: 1.0.0 +version: 1.1.0 +test_valid: false \ No newline at end of file diff --git a/mlflow_utils/function.yaml b/mlflow_utils/function.yaml new file mode 100644 index 000000000..d2e2bffec --- /dev/null +++ b/mlflow_utils/function.yaml @@ -0,0 +1,31 @@ +metadata: + name: mlflow-utils + categories: + - genai + - model-serving + - machine-learning + tag: '' +spec: + default_handler: '' + image: mlrun/mlrun + command: '' + base_image_pull: false + default_class: MLFlowModelServer + function_handler: mlflow-utils:handler + disable_auto_mount: false + build: + origin_filename: '' + code_origin: '' + requirements: + - mlflow==2.12.2 + functionSourceCode: aW1wb3J0IHppcGZpbGUKZnJvbSB0eXBpbmcgaW1wb3J0IEFueSwgRGljdAppbXBvcnQgbWxmbG93CmZyb20gbWxydW4uc2VydmluZy52Ml9zZXJ2aW5nIGltcG9ydCBWMk1vZGVsU2VydmVyCmltcG9ydCBwYW5kYXMgYXMgcGQKCgpjbGFzcyBNTEZsb3dNb2RlbFNlcnZlcihWMk1vZGVsU2VydmVyKToKICAgICIiIgogICAgTUxGbG93IHRyYWNrZXIgTW9kZWwgc2VydmluZyBjbGFzcywgaW5oZXJpdGluZyB0aGUgVjJNb2RlbFNlcnZlciBjbGFzcyBmb3IgYmVpbmcgaW5pdGlhbGl6ZWQgYXV0b21hdGljYWxseSBieSB0aGUgbW9kZWwKICAgIHNlcnZlciBhbmQgYmUgYWJsZSB0byBydW4gbG9jYWxseSBhcyBwYXJ0IG9mIGEgbnVjbGlvIHNlcnZlcmxlc3MgZnVuY3Rpb24sIG9yIGFzIHBhcnQgb2YgYSByZWFsLXRpbWUgcGlwZWxpbmUuCiAgICAiIiIKCiAgICBkZWYgbG9hZChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBsb2FkcyBhbiBtb2RlbCB0aGF0IHdhcyBsb2dnZWQgYnkgdGhlIE1MRmxvdyB0cmFja2VyIG1vZGVsCiAgICAgICAgIiIiCiAgICAgICAgIyBVbnppcCB0aGUgbW9kZWwgZGlyIGFuZCB0aGVuIHVzZSBtbGZsb3cncyBsb2FkIGZ1bmN0aW9uCiAgICAgICAgbW9kZWxfZmlsZSwgXyA9IHNlbGYuZ2V0X21vZGVsKCIuemlwIikKICAgICAgICBtb2RlbF9wYXRoX3VuemlwID0gbW9kZWxfZmlsZS5yZXBsYWNlKCIuemlwIiwgIiIpCgogICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKG1vZGVsX2ZpbGUsICJyIikgYXMgemlwX3JlZjoKICAgICAgICAgICAgemlwX3JlZi5leHRyYWN0YWxsKG1vZGVsX3BhdGhfdW56aXApCgogICAgICAgIHNlbGYubW9kZWwgPSBtbGZsb3cucHlmdW5jLmxvYWRfbW9kZWwobW9kZWxfcGF0aF91bnppcCkKCiAgICBkZWYgcHJlZGljdChzZWxmLCByZXF1ZXN0OiBEaWN0W3N0ciwgQW55XSkgLT4gbGlzdDoKICAgICAgICAiIiIKICAgICAgICBJbmZlciB0aGUgaW5wdXRzIHRocm91Z2ggdGhlIG1vZGVsLiBUaGUgaW5mZXJyZWQgZGF0YSB3aWxsCiAgICAgICAgYmUgcmVhZCBmcm9tIHRoZSAiaW5wdXRzIiBrZXkgb2YgdGhlIHJlcXVlc3QuCgogICAgICAgIDpwYXJhbSByZXF1ZXN0OiBUaGUgcmVxdWVzdCB0byB0aGUgbW9kZWwgdXNpbmcgeGdib29zdCdzIHByZWRpY3QuCiAgICAgICAgICAgICAgICBUaGUgaW5wdXQgdG8gdGhlIG1vZGVsIHdpbGwgYmUgcmVhZCBmcm9tIHRoZSAiaW5wdXRzIiBrZXkuCgogICAgICAgIDpyZXR1cm46IFRoZSBtb2RlbCdzIHByZWRpY3Rpb24gb24gdGhlIGdpdmVuIGlucHV0LgogICAgICAgICIiIgoKICAgICAgICAjIEdldCB0aGUgaW5wdXRzIGFuZCBzZXQgdG8gYWNjZXB0ZWQgdHlwZToKICAgICAgICBpbnB1dHMgPSBwZC5EYXRhRnJhbWUocmVxdWVzdFsiaW5wdXRzIl0pCgogICAgICAgICMgUHJlZGljdCB1c2luZyB0aGUgbW9kZWwncyBwcmVkaWN0IGZ1bmN0aW9uOgogICAgICAgIHByZWRpY3Rpb25zID0gc2VsZi5tb2RlbC5wcmVkaWN0KGlucHV0cykKCiAgICAgICAgIyBSZXR1cm4gYXMgbGlzdDoKICAgICAgICByZXR1cm4gcHJlZGljdGlvbnMudG9saXN0KCkKCmZyb20gbWxydW4ucnVudGltZXMgaW1wb3J0IG51Y2xpb19pbml0X2hvb2sKZGVmIGluaXRfY29udGV4dChjb250ZXh0KToKICAgIG51Y2xpb19pbml0X2hvb2soY29udGV4dCwgZ2xvYmFscygpLCAnc2VydmluZ192MicpCgpkZWYgaGFuZGxlcihjb250ZXh0LCBldmVudCk6CiAgICByZXR1cm4gY29udGV4dC5tbHJ1bl9oYW5kbGVyKGNvbnRleHQsIGV2ZW50KQo= + min_replicas: 1 + description: Mlflow model server, and additional utils. + max_replicas: 4 + source: '' + function_kind: serving_v2 + env: + - name: MLRUN_HTTPDB__NUCLIO__EXPLICIT_ACK + value: enabled +verbose: false +kind: serving diff --git a/mlflow_utils/item.yaml b/mlflow_utils/item.yaml new file mode 100644 index 000000000..bda09c5bb --- /dev/null +++ b/mlflow_utils/item.yaml @@ -0,0 +1,31 @@ +apiVersion: v1 +categories: +- genai +- model-serving +- machine-learning +description: Mlflow model server, and additional utils. +doc: '' +example: mlflow_utils.ipynb +generationDate: 2024-05-23:12-00 +hidden: false +icon: '' +labels: + author: zeevr +maintainers: [] +marketplaceType: '' +mlrunVersion: 1.7.0-rc17 +name: mlflow_utils +platformVersion: '' +spec: + customFields: + default_class: MLFlowModelServer + filename: mlflow_utils.py + handler: handler + image: mlrun/mlrun + kind: serving + requirements: + - mlflow==2.12.2 + - lightgbm + - xgboost +url: '' +version: 1.0.0 diff --git a/mlflow_utils/mlflow_utils.ipynb b/mlflow_utils/mlflow_utils.ipynb new file mode 100644 index 000000000..165dafc6f --- /dev/null +++ b/mlflow_utils/mlflow_utils.ipynb @@ -0,0 +1,1353 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "c478ebb2", + "metadata": {}, + "source": [ + "# MLflow tracker demo\n", + "\n", + "This demo demonstrates how to seamlessly integrate and transfer logs from MLflow to MLRun,
\n", + "creating a unified and powerful platform for your machine learning experiments.\n", + "\n", + "You can combine MLflow and MLRun for a comprehensive solution for managing, tracking, and deploying machine learning models. \n", + "\n", + "This notebook guides you through the process of:\n", + "\n", + "1. Setting up the integration between MLflow and MLRun.\n", + "2. Extracting data, metrics, and artifacts from MLflow experiments.\n", + "3. Creating MLRun artifacts and projects to organize and manage the transferred data.\n", + "4. Leveraging MLRun's capabilities for model deployment and data processing.\n", + "\n", + "By the end of this demo, you will have a understanding of how to establish a smooth flow of data between MLflow and MLRun.\n", + "\n", + "## MLRun installation and configuration\n", + "Before running this notebook make sure the mlrun package is installed (pip install mlrun) and that you have configured the access to MLRun service." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "ab49e1f1", + "metadata": {}, + "outputs": [], + "source": [ + "# Install MLRun and scikit-learn if not already installed. Run this only once. Restart the notebook after the install!\n", + "# %pip install mlrun scikit-learn~=1.3.0" + ] + }, + { + "cell_type": "markdown", + "id": "1770566a", + "metadata": {}, + "source": [ + "Then you can import the necessary packages." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "0d2dfd8b-65c4-417b-b66e-99f44b015ee7", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import os\n", + "import mlrun\n", + "from mlrun.datastore.targets import ParquetTarget\n", + "import mlrun.feature_store as fstore" + ] + }, + { + "cell_type": "markdown", + "id": "7c4513d4", + "metadata": {}, + "source": [ + "Create a project for this demo:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "43ea863f-02d5-45f2-8143-306ce3bb6c58", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> 2024-03-27 15:34:40,940 [info] Project loaded successfully: {'project_name': 'mlflow-tracking-example-guy'}\n" + ] + } + ], + "source": [ + "# Create a project for this demo:\n", + "project = mlrun.get_or_create_project(name=\"mlflow-tracking-example\", context=\"./\")" + ] + }, + { + "cell_type": "markdown", + "id": "94413ee8", + "metadata": {}, + "source": [ + "Set all the necessary environment variables for the Databricks cluster:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "22f94f89-acce-442d-93ff-b2d08d3a35a4", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "DATABRICKS_HOST=\"add your host\"\n", + "DATABRICKS_TOKEN=\"add your token\"\n", + "DATABRICKS_CLUSTER_ID=\"add your cluster id\"" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "7af310da-fd02-444e-8619-43ba6dcdb0a4", + "metadata": {}, + "outputs": [], + "source": [ + "os.environ[\"DATABRICKS_HOST\"] = DATABRICKS_HOST\n", + "os.environ[\"DATABRICKS_TOKEN\"] = DATABRICKS_TOKEN\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "d98e823c-3a27-4532-9a2d-6398ea4e1778", + "metadata": {}, + "outputs": [], + "source": [ + "# Set the Databricks environment variables\n", + "job_env = {\n", + " \"DATABRICKS_HOST\": DATABRICKS_HOST,\n", + " \"DATABRICKS_CLUSTER_ID\": DATABRICKS_CLUSTER_ID\n", + "}\n", + "secrets = {\"DATABRICKS_TOKEN\": DATABRICKS_TOKEN}\n", + "\n", + "# Set the secrets in the project\n", + "project.set_secrets(secrets)" + ] + }, + { + "cell_type": "markdown", + "id": "37d75366", + "metadata": {}, + "source": [ + "## Create a feature set and ingest data\n", + "\n", + "This is a short example of how to create a feature set about music preferences." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "5701c04a-8442-4958-8f4c-265bf4c9b06a", + "metadata": {}, + "outputs": [], + "source": [ + "# create df\n", + "columns = [\"id\", \"name\", \"age\", \"gender\", \"favorite_music_type\"]\n", + "data = [\n", + " (1, \"Alice\", 20, \"f\", \"Pop\"),\n", + " (2, \"Bob\", 30, \"m\", \"Rock\"),\n", + " (3, \"Charlie\", 25, \"m\", \"Pop\"),\n", + " (4, \"David\", 40, \"m\", \"Classical\"),\n", + " (5, \"Eva\", 18, \"f\", \"Pop\"),\n", + " (6, \"Frank\", 32, \"m\", \"Rock\"),\n", + " (7, \"Grace\", 28, \"f\", \"Pop\"),\n", + " (8, \"Henry\", 45, \"m\", \"Classical\"),\n", + " (9, \"Ivy\", 22, \"f\", \"Pop\"),\n", + " (10, \"Jack\", 38, \"m\", \"Classical\"),\n", + " (11, \"Karen\", 27, \"f\", \"Pop\"),\n", + " (12, \"Liam\", 19, \"m\", \"Pop\"),\n", + " (13, \"Mia\", 27, \"f\", \"Rock\"),\n", + " (14, \"Nora\", 31, \"f\", \"Rock\"),\n", + " (15, \"Oliver\", 29, \"m\", \"Pop\"),\n", + " (16, \"Ben\", 38, \"m\", \"Pop\"),\n", + " (17, \"Alicia\", 20, \"f\", \"Pop\"),\n", + " (18, \"Bobby\", 30, \"m\", \"Rock\"),\n", + " (19, \"Charlien\", 22, \"f\", \"Pop\"),\n", + " (20, \"Davide\", 40, \"m\", \"Classical\"),\n", + " (21, \"Evans\", 19, \"m\", \"Pop\"),\n", + " (22, \"Franklin\", 34, \"m\", \"Rock\"),\n", + " (23, \"Grace\", 22, \"f\", \"Pop\"),\n", + " (24, \"Henrik\", 48, \"m\", \"Classical\"),\n", + " (25, \"eevee\", 29, \"f\", \"Pop\"),\n", + " (26, \"Jack\", 75, \"m\", \"Classical\"),\n", + " (27, \"Karen\", 26, \"f\", \"Pop\"),\n", + " (28, \"Lian\", 21, \"f\", \"Pop\"),\n", + " (29, \"kia\", 27, \"f\", \"Rock\"),\n", + " (30, \"Novak\", 30, \"m\", \"Rock\"),\n", + " (31, \"Olivia\", 29, \"f\", \"Pop\"),\n", + " (32, \"Benjamin\", 18, \"m\", \"Pop\")\n", + "]\n", + "df = pd.DataFrame(data, columns=columns)" + ] + }, + { + "cell_type": "markdown", + "id": "4b91576b", + "metadata": {}, + "source": [ + "Transfer the data to DataBricks." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "8679b0bb-0da6-4c35-9345-6cf0e83e19b2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'dbfs:///demos/mlrun_databricks_demo/1711553684480_33/music.parquet'" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Where to save the data in DataBricks\n", + "target_path = f\"dbfs:///demos/mlrun_databricks_demo/music.parquet\"\n", + "output_path = f\"dbfs:///demos/mlrun_databricks_demo/music_output_new.parquet\"\n", + "\n", + "targets = [ParquetTarget(path=target_path)]\n", + "\n", + "# Create a feature set and ingest the data\n", + "fset = fstore.FeatureSet(name=\"music_fset\", entities=[fstore.Entity(\"name\")])\n", + "fstore.ingest(fset, df, targets=targets, overwrite=True)\n", + "\n", + "# Get the target path and check it\n", + "dbfs_data_path = fset.get_target_path()\n", + "dbfs_data_path" + ] + }, + { + "cell_type": "markdown", + "id": "fe173be8-18eb-40ec-9662-6639b0deaedb", + "metadata": {}, + "source": [ + "We can look and see how how our data is logged in the DataBricks cluster:\n", + "(only top 20 rows)" + ] + }, + { + "attachments": { + "f7ad0425-26fe-482c-b97c-c9493b05fbf2.png": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAzcAAAJMCAYAAADHQ1hsAAABU2lDQ1BJQ0MgUHJvZmlsZQAAGJVtkE1LAlEUhh9LEcPIoFW0cJGtNMKEaFkSEoSJfVAtonH8CvwYxpHoH1Q/IILqL0QtomUuWrcpomWuCtpF2KJkOqOVWp3Ly3l473svhwNdKJqWswP5gqHHI9PeldU1r/NJLhy48OBS1JI2FYvNSYTv3lm1O2xWvwlYf81UT8LPgd1ib/U4en+efPib76ieZKqkSv8QjaiaboBtWDi2ZWgWixjQZSjhHYszTT6yONHk00ZmMR4WvhL2qFklKXwr7E+0+Zk2zufK6tcM1vTuVGFpwZpHNMQyEYJMMCV7+T8XauTCFNHYRmeTDFkMvPJGk5MjJTxLAZVR/MJBxkQha7+/99by9D2YTAs8trz1Q7goQ/9by/OdQZ8PKvOaois/27TV7KX0eLDJ7kFwVEzzxQTnBtSvTfP9wDTr+9D9CpfRT9xxYozukjtkAAAAVmVYSWZNTQAqAAAACAABh2kABAAAAAEAAAAaAAAAAAADkoYABwAAABIAAABEoAIABAAAAAEAAAM3oAMABAAAAAEAAAJMAAAAAEFTQ0lJAAAAU2NyZWVuc2hvdBIyf/QAAAHWaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjU4ODwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj44MjM8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpVc2VyQ29tbWVudD5TY3JlZW5zaG90PC9leGlmOlVzZXJDb21tZW50PgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KyQQwEgAAQABJREFUeAHsnQeYFEXTgOvIOeecMwIiQRERBUVEFMWIip9ZUcAsBkRBEQQxoiBiBDEgKphRMiJIVHLOOedw3N9vH73M7W2649LyVz3P7s5Mx3mnZ6arq7o3Js6IqCgBJaAElIASUAJKQAkoASWgBKKcQKYor79WXwkoASWgBJSAElACSkAJKAElYAmocqMNQQkoASWgBJSAElACSkAJKIGzgoAqN2fFZdSTUAJKQAkoASWgBJSAElACSkCVG20DSkAJKAEloASUgBJQAkpACZwVBFS5OSsuo56EElACSkAJKAEloASUgBJQAqrcaBtQAkpACSgBJaAElIASUAJK4KwgoMrNWXEZ9SSUgBJQAkpACSgBJaAElIASUOVG24ASUAJKQAkoASWgBJSAElACZwUBVW7OisuoJ6EElIASUAJKQAkoASWgBJSAKjfaBpSAElACSkAJKAEloASUgBI4KwiocnNWXEY9CSWgBJSAElACSkAJKAEloARUudE2oASUgBJQAkpACSgBJaAElMBZQUCVm7PiMupJKAEloASUgBJQAkpACSgBJaDKjbYBJaAElIASUAJKQAkoASWgBM4KAqrcnBWXUU9CCSgBJaAElIASUAJKQAkoAVVutA0oASWgBJSAElACSkAJKAElcFYQUOXmrLiMehJKQAkoASWgBJSAElACSkAJZIkEQWxsrJw4cULi4uIiia5xlIASUAJKQAkoASWgBJSAElACaU4gIuUGxSYmJsZ+0ryGWqASUAJKQAkoASWgBJSAElACSiACAhG5panFJgKSGkUJKAEloASUgBJQAkpACSiBdCUQkXKTrjXUwpWAElACSkAJKAEloASUgBJQAhEQUOUmAkgaRQkoASWgBJSAElACSkAJKIGMT0CVmzO4RmvWrJHRo0fL77//HnEuP/30k3zyySf2s3LlypDpDh8+LF9++aXs3bs3ZLxIA0+ePCnuE2maSONt2LDBsog0fkrGiz18SLaOHS2H1sTz3D1jiuya/EfQImIPHZKNIz+S43v32DiH16+VTV99FjS+N+DYrh2y5buvbPqTx455g1Ju21wns3pH8PzChMedjA2aFkabvxkZNDy9A0LV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yhvWo0BhxMXawwICWJr8BXc00lJvFSWgBJSAElACSkAJKAElcDYRiNx8ko5nTSf+2muvjWjZaKrJEs7Mwwml2BAP6wruWV7FhuNewTITSLEhDspDSis25Mv5Yq0JprxwXsHCSE+dAyk2hDHXSRUbSKgoASWgBJSAElACSkAJnG0EosJyA3SsDf/995+13NB5DyZYNRYuXBg2XrD0HMeis2DBAqlWrZoqAqFAaZgSUAJKQAkoASWgBJSAEshABKJGuclAzLQqSkAJKAEloASUgBJQAkpACWRAAsFNIBmwslolJaAElIASUAJKQAkoASWgBJRAMAKq3AQjo8eVgBJQAkpACSgBJaAElIASiCoCqtxE1eXSyioBJaAElIASUAJKQAkoASUQjIAqN8HI6HEloASUgBJQAkpACSgBJaAEooqAKjdRdbm0skpACSgBJaAElIASUAJKQAkEI6DKTTAyelwJKAEloASUgBJQAkpACSiBqCKgyk1UXS6trBJQAkpACSgBJaAElIASUALBCKhyE4yMHlcCSkAJKAEloASUgBJQAkogqgiochNVl0srqwSUgBJQAkpACSgBJaAElEAwAqrcBCOjx5WAElACSkAJKAEloASUgBKIKgKq3ETV5dLKKgEloASUgBJQAkpACSgBJRCMgCo3wcjocSWgBJSAElACSkAJKAEloASiioAqN1F1ubSySkAJKAEloASUgBJQAkpACQQjkCVYQEY8vnPnTtm/f39EVcubN68ULlw4orgaSQkoASWgBJSAElACSkAJKIHoJxA1ys2CBQtk8ODBEhcXFxH1mJgYefDBB+Wcc86JKL5/pNjYWPnggw/kuuuuk6JFi9rgadOmydy5c6VRo0bSpEkT/yRRv79t2zb59ttv5d5775VMmVLPqDd06FBp166dlCpVKiyzWbNmyY4dO+SKK64IGzepEZYvXy4TJ06UAgUKyPXXX5/U5KkWf8+ePbJx40Zf/rQ/PrTp1JBjx44JLPylSJEiUrx4cf/DUbM/efJkWbRoka3vVVddJUePHpUffvhB7r//fsmRI0ei89iwYYP88ssvcvfddycK8z/w008/WTYNGzb0Dzrr96P13Pft2ycrV6607aB8+fJSsmTJqLhW3vcOz4FQbdh7QuGu03fffSeVKlUK+Y6cMWOGzJs3z2bbpk0bqVChgrcI3VYCSkAJ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BQsOuq9QoUIgUxhWGxJZRENw6yKNO8/xrbfeGiiS+KBw4tvilzzXZFrz9SHTGjE3wcK53mU1eH/wOi57KDekhEaRYTCGJAfE7nlXN87v2LGju4z3DIMl3bt3NzK5oeAgWIlJfCARAREQAREQARGITOCIw1mLshU6w0lM4Hng8NeeQ2m2Y3+abdp3yOqm7baqlSpEvMOLL77oJvHkH3Y0hZnGycpEZ6h48eJhiyY4GaVnxowZbgLOsCflYiejqAQr06khJXSkzg0ucn7CwFzcJqEvSeW2JTT4JK0cVlbiaFBkvPJAU6688krXqadjj1Uj9Lhvbl7fI6SExtqKu5d3JfVlZ7VkAk6ui4fyj0WHiUBRBokhCmZHvWP1jsuKiY6LgAiIgAiIQKISSErLDTDxY88qxWusoDP6HK97x6pNKlcEYkmAeWsym7uG5zlayUDCtQP3tNxO8BvLeoWra/A+Bk7ief/gumhdBERABERABJKBQFLG3CQDWNVRBEQgawKNGjXSQEHWmHSGCIiACIiACIhANgnE3C3NB8wGp07NZt3yfBoed7ijZJXNKM83ilAA96bd8XBniVClqO1O5bZFDZIKihqBeL5HotaIGBQU73dcDJqkIkVABERABEQgTwRi7pZGUC+feAj+6fFSbGhvbt1g4sEqp/dM5bbllIXOjz2BeL5HYt+63N8h3u+43NdcV4qACIiACIhAbAjILS02XFWqCIiACIiACIiACIiACIhAPhOQcpPPwHU7ERABERABERABERABERCB2BCQchMbripVBERABERABERABERABEQgnwlIucln4LqdCIiACIiACIiACIiACIhAbAjEXLn54osv7I033ohN7f9XKhPdhZuLlEk+J0yY4GYFz20FKDdc2ZTH7OKHDh2KWPRTTz1lmzdvjng8mQ+kctvi+bv8+uuvtn79emOSWi+bNm0yePNhMst4CRNGfvDBB1G9/SeffBJo20cffRSx7Px4j4TenOeed0usJTtcmQB12rRp9ssvv6SrTjTecekK1IYIiIAIiIAIJDmBmCs3q1evtnfeeSdmmKZPn26XXHKJTZ48OcM9+Mf/9ttvZ6qAZLgoaMdvv/1ml112mbVv3z6dgvTtt9/a5Zdfbj169LAOHTrYK6+8EnTVH6sodVu3bv1jRwqtpXLb4vEz/fDDD9azZ0/r1q2b3X777e7vjo4/cvDgQTdL/ccff2yvvvpqPKrn7rl48WLXwY5mBUgp/uOPP9qsWbNs/vz5EYuO9Xsk3I157nm3XHrppXbDDTfYzJkzIw50hLs+u/uyw3X37t1Osd25c2e6YvP6jktXmDZEQAREQAREIAUIxDwVdCwZrVu3zl5++eWY3eKJJ55Ip9RwI0ZyBwwYYLVq1bK+ffvas88+a1OmTLF69epZ3bp1Y1YXFZy6BJjD5c4777SyZcs6S2Pp0qXt008/dXMk0eqaNWva/fffb6+99po9//zzcQOBIt+qVauo3v+8884zPrQvEaVNmzauzV9++aU9/fTTbrDilltuiWpVY8E1qhVUYSIgAiIgAiKQRASSVrnBHWzIkCF27bXXGtabaMu8efOM0eKuXbumG63+/PPP3cSg119/vZUpU8a2bNnibv3Pf/4z6ZUbOtj79+83rAhnnnmmffXVV06Z69evn1Peos1Y5f2XwOzZs93fFMp05cqV3c6zzjor23iWLVtmEydOtO3bt7trULzvuuuuQFlYIMePH+8UJiwlKFGDBw+2qlWruvO/++47p6DTgUeqVatmo0ePdut8ffbZZ4FtruHaYMGqgPvn0qVL3d9PxYoVnbJCOVnVLbicRFw//vjj7c9//rP74BqG5QzrWokSJdzAyptvvulcxZist2nTpnbHHXdY4cKFXbvHjh1rY8aMsWLFirmm4X72yCOP2GOPPWbly5fPlCsucQycYPVmQIXnUSICIiACIiACIpA1gZi7pWVdhdydwT/+Y445xjp16pS7AjK56ueff7Ynn3zS7r77bjvuuOPSnemVmerVq9tbb71l27ZtM9ZRCJJdiA+iLV26dLEFCxZY586drUqVKhHd7pK9vYlS/++//95Zabxik9N6oejzHIwbN86GDRtm+/bts/79+weKmTp1qlM8HnroIee+icJ+5JF/PPrDhw93SgkdcTrkZ5xxRuBaVmrXru2slVgnN2zYkO4YnXCsLliaunfv7pSciy++2Pbs2ePOy6pu6QpL8I2GDRu6Gvo4uj/96U9266232qRJk5wVd8mSJa79nFS/fn3btWuXzZkzJ9AqXGS5BsUGyYwrAwszZsxwbq/8lsQcSURABERABERABLIm8EcPJ+tzE+YMRkCJ+eCfPjN0R1tGjBhhp512mhuJDS2bUXAEBYgA7wceeMBwIyIQPBWkcePGxgdp0aKFnXLKKRbq558K7UykNsA3VInOSf2aN29uF154ofsb3Lhxo51wwgnu79MHw/uEGLi/8bfKuSitXjjv999/d88S16LcBgt1q1Gjhrs2eD/rJD/gc/XVV1u7du1cubhZ0blHsqqbOylJvrwFhmcfIR6vUaNGLmkIiky5cuVszZo17hiWHKwt7777rtuGPQMG//d//+e2+cqMK3E4WI3g2qRJE7viiisC12lFBERABERABEQgMoGkVG4YaSa+hWxluL3QMcOigtKTV6EDsmrVKsMtiLKJ60GWL19uKDbFixd32yg1dFQYzWaU2u93B5P466ijjrKjjz7atYBloUKFXEB7Ejcp4auOe6O3dOSmslgHsNzg7sTfLNZEhEQEyJVXXml16tQx3AtRPLDuBCvjuLBxf2JJKOeZZ55x12Xny1ssGQwIJ1nVLdw1ibrPM0NBREaNGuXYEnOH6x5ua8FZ7rBg8V4i292iRYvce6p169bZah6WGqyoXrDySERABERABERABLImkJQxN7ijkYWMzgWCcoNbDCPUgwYNcvty+0XMCSOmBA8jdFgQ3NTuvfdeq1SpkttmJJYMSggj16noE49VLBaWMQdNXwECdFzff/995/J14oknBvaHrqBs8ncXKrijnXvuudanTx93iPgbb0FgBzE2Q4cOdcoOFgGUIO5D7AiCdQ7XKmJnsIiS/Q+LC7EmWQmKGcLAQrA1yF+XVd38eTzTuNMlsvjsdVi3sJCRFvuee+6xc845x1WbbHfBqeGxXmHtIRMcrocNGjRw75bstBH2ZMfzEuoO6PdrKQIiIAIiIAIikJ5AUlpu6Lwx54P/0OkjbWteFRvQMLLqy2VJHAHC6CydlVNPPdXFR5QsWdJ1xggoRiFq27atO09fIpBTAmQgK1KkiAs2p9NMJ5+0yCtWrEhXFO5JKPK4OuEa5a0EKC9scx2WGxSlYJl3ODkG5WKVI/MacR/BShKxY7hVYX3E/QwJ7qSzzvncGxc21v31nF+qVCmX1IP6cg5WTq9cZVU3X89mzZo5i+nKlSvTudT54/FawpVEC8T4wYnU0CgsPP8IVjKefwL/fTxecF2x7hJrgzUYt71gyYwryiWWaX47yiUNtUQEREAEREAERCBrAklpucm6WbE7g0BsArMJoiYwG2GZCmmg6fRK8p8ASgdWSJRzAtS9DBw40K+6JYHoxGDQ0cYi0qtXL9dhvvHGG41MaySAQHCpXLhwoVvnC4vD448/HthGQcdVzctLL73ksq2xzUABHXisOV5uuukm19H22x07dnSrWHvIjIZV6OGHH3ZJBzjA3xGuo0hWdXMnHf5q2bKlUwB4rlCQGMDIbYIFX2Zel7QDRXHu3LkungbLjFdQUHCuuuoql5r7ueeec8opLqo+Hsffm0EP+MIVBS5YMuMKf2Lf/O+GUioRAREQAREQARHImsARh125/pP1aWaclHb468Dhrz2H0mzH/jTbtO+Q1U3bbVUrVYhYBDOq43dPRyi/BVcZ5qIh6xBuL9EUsDFqi/89HZdwQkeIDiopYlNNUrlt8fytSNXsg9Mj/V1Fqh/xLwS1h1NSca9kwkfcKomjChVmvifuBoUit66IxKTh2lahQoUM98isbqF1Cbcdz/dIuPr4fVhfSAjhM6D5/dFa8rvwrvGWotByY/mOC72XtkVABERABEQgGQhk7OUkQ60ToI50ABm1lohANAngnsYnN5LZ3yOZufy8NuHKJs6MT14EawafcJJZ3cKdnyz7UBRjpdjAIK+/SbJwVD1FQAREQAREIFoEkjLmJlqNVzkiIAIiIAIiIAIiIAIiIAKpQyDmbmk+EJl5H/JbcOfAzado0aL5fWt3P+5Nu8O5CcWlQlG8aSq3LYqYVFSUCMTzPRKlJsSkmHi/42LSKBUqAiIgAiIgAnkgEHO3NIKl+cRDcB2Ll2JDe3PrXhQPVjm9Zyq3LacsdH7sCcTzPRL71uX+DvF+x+W+5rpSBERABERABGJDQG5pseGqUkVABERABERABERABERABPKZgJSbfAau24mACIiACIiACIiACIiACMSGgJSb2HBVqSIgAiIgAiIgAiIgAiIgAvlMQMpNPgPX7URABERABERABERABERABGJDIObKzRdffGFvvPFG1GuflpZmwR+yBoUKkxZOmDDBzXgeeiwa20xMyCR+keSpp56yzZs3Rzqc0Pv379/vZmefNm1a2DYkc9sSGnwSVs4/h+GewWg1J1bvkWjVL1w58PBs/DLajGL9jgvXLu0TAREQAREQgUQmEPNsaatXr7Y5c+ZYhw4dosZhxYoVNmDAgHTlNWjQwB555JF0+/jH//bbb1uPHj1ylI6ZNMdvvvmmzZgxw+jkv/rqqy6lsy989uzZ9txzzxmzh5PmuWXLlnb33XdnmNkdpY56ValSxV+aFMt9+/ZZly5djIkfmdG+YcOGGdqQrG1Lih8giSq5YMECGzFiRKDG/K1fcMEF7nmPZpbEWLxHApWO0QrvHd5BwcL7YubMmcG78rSe23dcnm6qi0VABERABEQggQnEXLmJZdsfe+wxK1y4sLtFNFMT33fffbZ9+3arWbOmrVq1yoJHW3fu3Gljxoyx1q1b28033+yODxo0yJo3b24tWrSIZXPzrexFixa5e2G1ScU5evINZAG4kX82hg0b5gYAFi9ebFOmTDGek169ehUAApk38dRTT7WbbropcNKRR8bcWB64l1ZEQAREQAREoCASSGrlhlFilJpodxjuuusuq1q1qr333ntOeQn+w9izZ4/bbNKkiVOssGqgAKxZsybplZulS5c6xY02/v77787iRWN79+5tp59+ejAGrYtAOgIVK1a0MmXK2EknnWRz5841rKsIk2/iGjp//ny3XqtWLevbt69xPtKnTx+rXLmy4Xa2e/duq1evnvXr189KlCjhjif7V/Hixa1atWoZmsHAwcqVK2348OGBY1hDsXIzeMLgCpbodevWuWexfPnyTlnkvSMRAREQAREQARGITCCplZuuXbu6ltE5opN08sknR25pDo6ceOKJEc/mWOPGje0f//iHbdq0yXVQUG7atm0b8ZpkOXDKKafY0KFD7Z///Kfhesc6UrZs2WRpguoZZwK4SfE5//zzXU2mT5/u/pauv/565+KIooNl9Omnn3ZunFu3brXvvvvObrzxRitdurSNHj3aXnjhhZSx+nz22WeGZdcLik737t0Ni86LL75oGzZsMP++wf3VKy8ohQwo3HHHHW7whGODBw+2qVOnWqlSpXxxWoqACIiACIiACIQQSErlpkKFCm70t0aNGvbVV18ZHSg6TMTBRNM9LYRVYBMlatmyZfbaa68Z8Tl05IoWLRo4nqwrxx57rJ1wwgmu80S8BOsSEcgOgYEDBzoLw5YtW6xYsWJ21VVXucvmzZtndevWtU6dOrlt4tTGjh1rnOdj0erUqROIyfv6669t4cKFKaPc8Ex55QUAvLsQBhLgNGvWLOvZs6fRbti0a9fOHWfA5pprrrGNGzfaN99846xbHGBbyo1DpC8REAEREAERCEsgKZUbXFq8WwvuY8TdPProo0bQsR/5DNvaKOzE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ERABERABEShIBJJSudmwYYNVqFDB7r77bhcXQ4erY8eOdu6550btt6PzxmfJkiXG7OiXXHJJ2LI//vhjt/+0004LezyZdhK71KRJE9dpnT59ut1yyy22cOFCe+WVV6TcJNMPGaO6ony8//77rvTTTz/dLYmFIa4NVzUsmlgxcRd99tlnrUyZMq5j36dPHzvhhBOsf//+7rl95513XBxcsHKzb98+dxwF6fHHH08YxYZGDh8+3A2msI7F6sEHH2TVyZYtW+yTTz4xnn+sybSDc5A//elPduuttzrlh3fWo48+6hQ6ePz+++/OtfXdd9+13r1729atW+3pp592DGvUqOGu918okyNGjLDrrrtOio2HoqUIiIAIiIAIRCCQlMrNrl273Egpo55YG+gs0SFq1KiRFS9ePEJTc7abZAEfffSRuw9WC2J6QoUOy/jx4619+/bONS70eDJuM+LOSDXKTYsWLezXX3+1RYsWJWNTVOcoErjiiiucSyZFXnnllc4KwTpxKXTi//KXvziLQ7ly5Zz1YfHixe654DgdeTr+PvYMy06w8Dd2++23u/PGjh2bUIoN9cQyc9xxx7kqYykOFazIWHBCLS6XXXaZs4RideGdBRuSlARL586drXnz5m4XCQRWrFhhwcoNsW2ff/6544NlRyICIiACIiACIpA5gaRUbrwC06tXL+cyduONNzrXMJSRdu3aZd7ibB5FYeHz73//242Y/v3vf7f7778/cDVWDkZgUQZuvvnmwP5kX2E0nc4awpJRaOKMJAWbAJ13OugTJ040rJW4YyIk3sBlzXfsGQRA2dm+fbs7jkUClyyv2LidIV+4aCG4ZpGFsGjRoiFnxHcTZS6SWxo1a9asWaD9wTUdNWqUffjhh85qBSPad8wxxwSfks7FlXaj6AUL1mN4ouBIuQkmo3UREAEREAERCE8g4zBk+PMSai8uaQj/9BHfscJ9LNpSpEgRI0MUI6peUGywGDVs2NApPP7+/niqLGlXqrYtVX6j/GrHySefbC1btnSxMMSXEfeG0Onftm1boBooJ1hqSpcu7fYRg0PmL+JoIgnua1gtsBg+8MADgQyIkc5PtP3hlDFicIilueuuuwxrFC55xNoQw5YT4XoyNeKahgubRAREQAREQAREIHMCSanc4N+P0CHCR5/AXSQaMTc//vijizHBl56OGm41zMXhg6cJtkexIXtSly5d3Fw3uJrs3LnT1UFfIpDKBIhvO+uss1xMDUoLLlVY9ojL4nkhqyDiY3LOPvtst00Hnw4/80KhGAXPD4U1g4EKkgiQkY0Yl2QXb+lB8YMTrrO8U3IquMNhHSamkKQM3333XU6L0PkiIAIiIAIiUKAIJKVbGj7wzEXzzDPP2IwZM9wPhn+771Dk5Reko0Z6Z99JwzWLDlr37t1dsatWrXKdFTosjKp6ufjii10Avt9OxqW3hCVj3VXn/CPAs0CiCeJBUPCZ84XnxT8zpEwngQBSsWJFZ40hJo7geqRYsWIuAYHbOPzlrYOlSpVyVgosFZQd7bmx/P2iuaTu4eJwaCNzXz3//PP23HPPGRZgYvdQAIPFt519lBO8zT6/ff311xvJG7BskawBK5BEBERABERABEQgI4EjDs+2/Z+MuzPu4aS0w18HDn/tOZRmO/an2aZ9h6xu2m6rWum/bmIZrzKXIpZJPCdNmhTucJ72kb2JkVHcWvDrD5Wvv/7a+vbt6xSgUF/30HNDt+mE4CMfHE8Qek5W28T/MOFnNNNUZ3XP/Dqeym3LL4apdB/veobLqM8WFto+XNNwWSOw3nfaQ8+JtE2q6Vi9RyLdMxr7eUdh1Q2XkCQa5eflHReN+6sMERABERABEUg0AklpufEQ6URlFqjsz8vNklFkPhIREIGsCWSVNIASGIQoaMI7KlaKTUFjqfaKgAiIgAiIQHYIJGXMTXYapnNEQAREQAREQAREQAREQAQKFoGYu6WRwQxXlHBuY7FGjccdqZzDZTOK9b0pn3vT7lSMZUnltuXH34bukTMC8XyP5Kym+Xt2vN9x+dta3U0EREAEREAEsiYQc7c05k0Jnok86ypF7wz8+uOl2NAKgohTVVK5ban6myVzu+L5HklkbvF+xyUyG9VNBERABESgYBKQW1rB/N3VahEQAREQAREQAREQARFIOQJSblLuJ1WDREAEREAEREAEREAERKBgEpByUzB/d7VaBERABERABERABERABFKOgJSblPtJ1SAREAEREAEREAEREAERKJgEYq7cMKs2s41HU8gQlJaWluETOh8pkwZOmDDBZWvL6f3JBrZ27Vr77bffIl76ww8/GJP0RZKnnnrKNm/eHOlwQu9nUsb333/fpk2bFrYNydy2hAafhJXzz2Lo8xfNpsTiPZLd+tG+jRs32q5du7J7Sb6dl5d3XL5VUjcSAREQAREQgXwkEPNsaatXr3Yzi3fo0CFqzerfv7+tXLkyQ3k9e/a09u3bB/bzj//tt9+2Hj16ZDsdM2mr77rrLluzZk2gnMaNGxv3POaYY9y+2bNn23PPPWe//PKLK7dly5Z29913Z5h1HaWuQYMGMZtoNFDBKK/s27fPunTpYscdd5xVqlTJGjZsmKENydq2KKMq8MUtWLDARowYEeDApLoXXHCB8bxHM0tiLN4jgUpnsvLKK6/YlClTAmfUrFnTRo0aleFZD5yQzyu5ecflcxV1OxEQAREQARHIVwIxV25i0RoUCSwrXj788EObMWOGnXHGGX5XrpeMPp9wwgmGokTHftmyZa4zQwfn5ptvtp07d9qYMWOsdevWbnvVqlU2aNAga968ubVo0SLX902kCxctWuSqg9UmFefoSSTWyV4Xb60ZNmyYm9Np8eLFThngOenVq1dSN4+BEZ572nH++ec7y80LL7yQ1G1S5UVABERABEQg1QkkpXJTtmxZ4+Pl448/tvr161uZMmX8rlwvCxUqZH379g1c36pVK5s6daqtX7/e7duzZ49bNmnSxAoXLuysGigAWHqSXblZunSpU9xoIxYsLF5I79697fTTT3fr+hKBcAQqVqzonr+TTjrJ5s6daytWrHCnMfkmrqHz58831mvVquWeL85H+vTpY5UrVzbcznbv3m316tWzfv36WYkSJdzxeH5hncVq265dO1cNLJnB7wZ2DhkyxKpXr+7c1pYvX+7Ou++++9x1L7/8sr355pvOwstkvk2bNrU77rjDvTc4EZfWF1980WbNmuXOKVasmBtUOffcc105S5YssUmTJtmPP/5oxx9/vF1zzTXWpk0bd0xfIiACIiACIiAC4QkkpXIT3JTvvvvOxYTccMMNwbujtk7MzM8//+zcbCj0xBNPdB2Xf/zjH7Zp0ybnHody07Zt26jdM14FnXLKKTZ06FD75z//abjesY4EK5LxqpvumxwEcJPig6UDmT59uvtbuv76650lFEWHzv/TTz/tXLu2bt1qPMM33nijlS5d2kaPHm1YR+Jt9cEyzAeXzMxky5Yt9sknn9hpp51m9957r+HSyQAJwnvh1ltvdcrPhg0b7NFHH3Wueih0yLPPPuviES+77DLHi7J41yC44T388MNOmUGh4R5YjBs1aqTn0RHSlwiIgAiIgAiEJ5D0ys2rr75qjHgywhptoaMyYMAAq1q1akC54R4nn3yyc1d77bXXXAeIjlzRokWjfft8L4/RZVzySpUq5TphrEtEIDsEBg4c6Kx9dNB5Hq+66ip32bx586xu3brWqVMnt02c2tixY43ziM9B6tSpE3i+vv76a1u4cGHclRuvZBQvXtzVEVdNLDEIAykMBHg5+uijnQXniCOO8LvcEqWFxBxffvmlc2krV65culi+t956y7AAewspAydeeLegHNWuXdvWrVvnFBru42MI/XlaioAIiIAIiIAIpCeQ1MrNr7/+6jpCdKRCOxbpm5nzLTol99xzjxFTQMD0kUf+N7Ec7mfEojD6SuA0nbXrrrvO6AQx+iwRgYJIgKQaKMW4h+Jm5oUMY8HumritITt27AgoN3TgvRCwP3PmTNu7d69LaOH35/fSu7jyjkFo0znnnGOTJ092cXfB9WnWrFnY9w+JB4gHZJCA62mTT0rCOq6fkdw9sWiRkOHTTz8N3ApFCPc0iQiIgAiIgAiIQGQCSa3cvPPOO65lF110UeQW5uKIV2yIPaGDwki0F+9Xj/88QmejWrVqRryKlBtPScuCRoAEG14hCG47zw4uWV78esmSJf2udMdx9eQa4lviKcTTFSlSxHjeyfyGVaV8+fJOuQmtVzirLamjP/jgAzdAglKEkKTEp46nfVhmSEjiY3qCy8XKs23bNpelMXi/1kVABERABERABDInEPN5bjK/fe6PYlEhHTFKRjRHM+l8EDRM5+T22293o7RYa/x8NSgyCHEBzIFD4HQqJBNwjdKXCESZAM8nyQIIjucZev31153S4F3SuB0dfAYHmFdqzpw5hiUkEYQAfp5v3MdwUcWVLrvilTcUFAZLGIgJvf6ss84y3N2YT+rAgQPunYNLHnLhhRfawYMH7fnnn3fWYcogKcO3336b3SroPBEQAREQAREokASS1nJDhjQCfjt27BjVHw43M58ZjRTPXsjuROYiOmvdunVzGY7IhMToK52Uyy+/3J+a9Mtou/glPRA1ICKBrP5WiCchZoTgeIS4rsGDBweC7tlXoUIFt491rDadO3dmNe6CRYV3DBPWTpw40dWHbG+43nmh/d5l1e9jSTtwl0U5IesaViAywflYHs5h8ASlhiQKfBCfGOXMM8+07t27u2spAyHm5sEH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bvF+xyUyG9VNBERABESgYBJIPzNlwWSgVouACIiACIiACIiACIiACKQAASk3KfAjqgkiIAIiIAIiIAIiIAIiIAJmUm70VyACIiACIiACIiACIiACIpASBKTcpMTPqEaIgAiIgAiIgAiIgAiIgAjEXLn54osv7I033ogJabKw/fjjjxYp4dtPP/1kEyZMcNnacloBZhQnFSuTD0aSH374wQ4dOhTpsD311FPGJHypKKnctnj+Xr/++qsxx8mBAwcC1di0aZP7W4L5iy++GNif3ytff/21ffDBB1G97SeffBJo20cffRSx7Fi+RyLeNBsHePekpaUFPtm4JFunHDx40KZNm2a8YzKTvLzjMitXx0RABERABEQgWQnEPFva6tWrbc6cOdahQ4ccMeKfOh25efPmuVnLJ06cmO76d99918aNG+f2HX300fbggw/aqaeemu4c/vEzCV6PHj1ylI6Z83fs2BEoi3IHDBgQSGc9e/Zse+655wwFiDTPzNB+9913Z5h5HaWuQYMGVqVKlUBZqbKSym2Lx2/E3/ugQYNsy5YtgdsPHDjQmjZtanR0UeJRenbt2mVdunQJnJOfK4sXL7b58+dbq1atonZbUorTthUrVriO/Nlnnx227Ny+R8IWFsWd/fr1M+rmhfdU5cqV/Waul/v373fvvzp16mQ6uWlu33G5rpguFAEREAEREIEEJxBzy01u2s9o6E033WRr1661MmXKZLCOYA1BsaGTh2WmQoUKRkcweLQ7N/f111x77bWu3BdeeMHuu+8++/zzz23KlCnu8M6dO23MmDHWpEkTe+WVV5zSgwK2cOFCf7mWIpAjAszhcuedd7qU6fw983fVv3//gDJds2ZNu//+++2iiy7KUbnRPpkBioceeiiqxZ533nmubXTik1HuueceGzt2rHtfJWP9VWcREAEREAERSDUCMbfc5AYYczfQYahWrZoNGzbMvv/++3TFzJo1y1lMmLl77969tm3bNud6tmjRIqOzlFcJLuOMM85wnUysNMiePXvcEuWmcOHC1rBhQ1cXXNhatGjhjiXrFx1sRoyxIpx55pn21VdfOXcbRqfr1auXrM1K+HpjCcSC8cQTTwRG/c8666xs13vZsmWGxYBZ7ZFatWrZXXfdFSjrt99+s/Hjx9unn37q7lO2bFkbPHiwVa1a1Z3/3XffOeX9yy+/dNs8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Uh5FQAREQAREQAREQAREQARyJBB35WbhwoVutfEcc5KPABkZGRZqLVIWwBs5cqRbODC30W/ZssWWLVtmW7duze2pgfDPP/+8rV69OvA/lTZYlPGDDz6wl19+OWQZUrlsqXQdEp1Xniuer3DPWH7zN2/ePPv3v/+dYzQFUY/kmIkkDJCfOi4Ji6MsiYAIiIAIiEC+CcRduVm8eLG9/fbbuc7ounXr7G9/+5tdcskl1r1797Dnjx8/3i6++GIbM2bMfmF48U+dOtX27du337FIO7p27WrXXHON9erVy66++mrr16+f0dj3Em3eJk2aZGvXrvWnpczvrl27rEOHDvaPf/zD5s+fbyh62SVVy5a9HPofmcDkyZPd88UzdtFFF9m9995r06ZNi3xSLo5+/PHHNnHixBzPyGs9kmPEeQxAvdS2bVv74YcfAjG89NJLbt/vv/8e2BfvjbzWcfHOl+IXAREQAREQgUQRiPtU0HkpGL3F3bp1sxo1arhVzcMpJz/++KO99tpreUki4jmdO3e22rVr2+GHH25ff/21DR482MaOHeuUrGjzFjGBJD/46aefuhxitUnHNXqSHH9SZm/48OG2Y8cO11lAp0PRokXt9NNPT8q8FkSmvAIzevRoe/zxx12Sfl8oK3JB5ElpiIAIiIAIiIAImCWlcsPaDcOGDbPq1avbkCFDbOnSpftdKxSeBx980FBEsN7EUs4888xAdKeccopbiNNbL6LJW+DkFNuYO3euPfvss64RS0MNCxaCBatJkyYpVhplN5YEKleu7BSamjVr2qxZs2zRokUB5Qbr6L/+9S9n4TvyyCPtlltusaZNmwaSX758uaEc+ee4bt269sgjj+y3/hXP9BNPPGFYIwYNGpTQNaoCmY+wQecLFqUlS5bYcccdt19IyvHkk0+643QStGjRwm699VZXnxCY8l5//fXWqVMne++994zOGjpUnn76aXeMThX28SweddRR1qNHD2vWrNl+6WiHCIiACIiACIjAXwTi7pb2V1K520KxiSQvvviiFS9e3C677LJIwfJ8jMYbDbY777zTWB0dtxwvOeXNh0u134YNG7pGZ5s2baxYsWJum0Zo/fr1U60oym8cCNAYZxwW4pVdxsIwro1GNx0RFStWtIEDBzoFhXB0CvAM7dmzx/r27WtDhw61o48+er9xcLhC9u7d27777jsX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kG4E4q7c5AUYPcDdunWzGjVquFXN9+3bFzKaJ554wg455BB3LFZTE5N21apVrXv37lapUiWbN2+ePf3000Yj6KabbnKWHBSbK664wtq1a2fvv/++jRs3zho3bmz16tULmU/tFIF0JeCtNUOGDHFrOs2ePds9K1gzevTokdTFppMExebCCy+0888/38aMGWP/+7//6zokypUrZzVr1rR+/frZG2+8Yf/85z/DlqVu3bo2dOjQhE47HzZzOiACIiACIiAChYxAUio3rN0wbNgwq169utFoWrp0acjLQi8xSk2RIrHzritatKj17t07kN4555zjlBdc0BAsSQi9uCzQiZKDsvPBBx+kvHJzxx13GO52WM1atGhhS5Ysca5/ffr0sfr167ty60sEQhGoWLGi64ioXbu2ffTRR4bigOCqhWvojBkz3HatWrXc80V45M4777TKlSsbbmdbt2519xn32+GHH+6Ox/Prvffec/XHzTff7JK59957rUOHDvbhhx+635zS3rVrl/Xs2TMQbPjw4VaiRAn3n04R6rBnn33WSpYs6fZ9++23zrpMp8xRRx1lK1eudEoR9RtWLuqaG2+80aiDkG+++cZZxW644QZXB2FF4jkMtpS5gPoSAREQAREQAREIEIidVhCIMjYbKDY5yVVXXWUXX3yxs7LQcIiH4HLyyy+/GK5pSKlSpdwvDRsE1xVc2Wh4pLpQVqxlKG64G1155ZWGAhnstpPqZVT+40sANyk+WDMQFH+sm7ht4tqJRee+++4zb/FZu3at6zC47LLLnNLz/fffG26fBSHr16931lmfFh0ldFiwPxoh7IABA6x9+/a2adOmLGN2GjRoYLiy4ZLrBRfZAw880Ck2jOmjMwF5+OGHDQXr3XffdUqgD79z505X94wYMcIpPig1WIglIiACIiACIiAC4QkkrXITPsvmxuBgXeGlf9tttxmKBg0mGgyxFOJlbE+1atUCY4ZOOukklwQ9sgsWLHA9r+wIN/FALPNTEHGhxHlFrmXLltawYUPXIC2ItJVG6hKgkY8rZ5cuXZyl4uqrr3aFwdKJuybKy8knn+wUZxSBNWvWBAqLIsSYvFatWrlxK3PmzAkci+fGtm3bApYWnw4WlGifZSzMdAbgvppdUHywfqKwIFiw6DC44IIL3P+ZM2e6jpEmTZoYCh6ut9Qzb775pjse/AVLOnKw2vArEQEREAEREAERCE8gKd3Swmf3zyO4tHi3FhoEjLt5/PHHjUHHzZo1y+n0qI7jnnXPPfe4HmZ6TL3rG42WRx55xCZPnmwPPvigHXvssYYrTkG40USV8XwGonFXrFgxFwu/uMhEmhEun8np9DQhgGJStmxZw2KBm5kXrBcoyV54VhAUHD/RRp06dfxhN86FZwurhXfxChyM8QZWWNIJFmZO89bZ4P152WYsD65uzLrGzItYeFu3bu2i8sods7TxQVCSqF+yyymnnJJ9l/6LgAiIgAiIgAiEIZCSyk32svgGAY2HWIhXbHbs2OEmE/A+8z7uRo0aGR+EHlfcuJitLd2Enmk+EhHIiQCN9iOOOGK/YDw7vvHOQb9dpkyZQFi/jx0oApwTb8WGtFAm5s6dy6YTLDko8r7jxO9Hyc/LNM8oepSFsT2Mq6GOKF26tIu2fPny7veaa65xE5j4tEL9Zq9/QoXRPhEQAREQAREQgT8JJK1bGn77TMfMIGN6U9lmoDuCH/uiRYuMxggDd5nlCF/2WMxWhrKCyxuDfW+99VbnkkXawevV4DbDOBzG2WDVQRm65JJL/iSqbxEQgQCB5s2bu8kCeGZ4hnC7YmyLt9oQkIHzKBlYN3i2vetnIJI4bTB1M88u05rTkfHCCy+4lJjKOliwBtNxgosZzz31EcL6Pig9XvHx2348EWFwQ2OsDWVs27Ytu5zgskadRZrUNdQ71Gm4rklEQAREQAREQATyTiBpLTcoLMEv+l69ejmfdMbZMLNS8EBdejZxEYuFO8mWLVvcuhYgHThwYIAsvbmjR492/5n6mQYJ4t3UcMlJdaGxJRGB3BDIybLHGlM//vijGzRPvDwvgwYNCswIxj7WsWIfwrPMRBYFIQzOZ7ZDFunkw/1Px0b2Z5mZzbCwvJi5lg0zojHFNYoK20yW4KVz585u85ZbbnFTS/PnvPPOs1dffdW5egYrbVi5qF8effTRLDOuXXvttT46WU0DJLQhAiIgAiIgAtETOCCzl/GPaIITKCPza0/m1459GbZpd4at2rXP6mVstWqVKoSNgpW9UUS8YhA2YC4PMOiXmZdoDLEmRShhBjUaKxMnTgwswBkqXG73gYwZlRiPcuSRR4Y9nQYQA63pvU43Seeypdu1SobyYIFlfAuKTLBCxNTLrBfFB6tI9uM+7/GqR4gfi8vGjRudO5ofW+fTLYhf6jEsSChRfhroaNONVx0XbfoKJwIiIAIiIALJRiBpLTc5gUKp4ZMIoXGW3S8/EflQmiKQKgSYcCPSpBvFixdP2DPFJBrBkyAUNNNwnTMFnQ+lJwIiIAIiIALpQCBpx9ykA1yVQQREIDKBE088MaGKReTc6agIiIAIiIAIiECqEYi7WxouHwzG9TOaFSQg3MdY++awww4ryGQDaZE25U7HsSzpXLbABdRG0hBIZD2SNBBCZCTRdVyILGmXCIiACIiACCSUQNzd0nD54JMIwX0sUYoN5WVWqHSVdC5bul6zVC5XIuuRZOaW6DoumdkobyIgAiIgAoWTgNzSCud1V6lFQAREQAREQAREQAREIO0ISLlJu0uqAomACIiACIiACIiACIhA4SQg5aZwXneVWgREQAREQAREQAREQATSjoCUm7S7pCqQCIiACIiACIiACIiACBROAnFXbhYuXGiTJk2KG91169bZ6tWrLdRapP/9739t5MiRbra23GZgy5YttmzZMmPxwXBC2vv27Qt32K16Tt7SUVjRPV3Llo7XK55lysjIMD6hnsFYpRvveiRW+QyOBx6eTfD+WG7np46LZT4UlwiIgAiIgAgkC4G4z5a2ePFimzZtml166aW5KjOKA6uST58+3a1aPmrUqCznL1q0yAYOHOhW9uYAq3uPGTMmSxhe/FOnTrWuXbvmajpmwm/atCkQV6NGjax///6B6azff/99e+mllwwFiGmeW7VqZXfffXeWldc5GaXu+OOPtypVqgTiSpeNdC5bulyjgijHrFmz7LHHHgskxb1+9tlnu+c9lrMk5rUeCWSsgDfo9Aiu85gS/tRTT7XOnTtbLBftzGsdV8A4lJwIiIAIiIAIFBiBuCs3eSkJPZ7dunWzGjVq2BFHHLGfdQRryr333mu1a9e2a665xmrWrGnff/99XpIKeQ4NEOJmRfWvv/7aBg8ebGPHjrXu3bvbzz//bM8++6y1bt3abrrpJvvmm2+cknXyySdby5YtQ8annSKQrgS8tWbIkCFO+Z89e7Z7VnhOevToka7Fjrpcl112mZ177rnOyjl06FDbu3ev9enTJ+rzFVAEREAEREAERCB3BJJSuWHthmHDhln16tWNRtPSpUuzlGrKlClWrFgxe+KJJ6xIkSLu07x58yxh8vPnzDPPDJx+yimnuEYb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65H+97//tZEjR7rZ2nKbPrOBLV++3LZv3x721E2bNhkLiYaT559/3lavXh3ucFLvZ1HBDz74wF5++eWQZUjlsiU1+BTMnH8Wsz9/sSxKPOoRnz9fn/j//nfVqlXGfc6HRUTDCYtwvv7668aMbnkRFuL88MMP83Kq5aeOy1OCOkkEREAEREAEkpxA3GdLW7x4sU2bNs0uvfTSXKFYt26da1BMnz7drVo+atSowPl9+/a1RYsWBf77je7du9tFF13k/7oX/9SpU61r165RT8fMtNV33XWXLVu2LBBP06ZNjTRZaBD5/vvv7b777nOrivP/uuuusyuvvJLNLDJp0iQ7/vjj47bQaJbEYvhn165d1rFjRytRooRVqlTJGjduvF8ZUrVsMcSkqDIJzJo1yx577LEACxbVPfvss93zHstZEvNajwQyFmHj8ccfd+Xo0qWLXXHFFYGQe/futQ0bNthPP/1kmzdvds9E4GDQBh0YL774orVp0yZPM0POnj3bZsyYYeecc05QrNFtotzkto6LLmaFEgEREAEREIHUJBB35SYvWOhJ7datm9WoUcOOOOKI/awjd999t1u/xsf9n//8xyZOnGinnHKK35XnX9KuWrWqoSjRsJ83b549/fTTNnbsWLvpppuctah///5Wq1Yt6927t2vUcKx+/fpWr169PKebTCd++umnLjtYbdJxjZ5kYp3qefHWmiFDhrg1nWio8zxgzejRo0fSFw+r02effebu848++iiLclOzZk3r16+fvfHGG/bPf/4zbFnq1q1rQ4cOzfO083T85EWxCZshHRABERABERCBQkwgKZUb1m4YNmyYVa9e3Wg0LV26NMslOvLII42PFxonDRo0cIqQ35fX36JFizqlxZ9Po2PcuHGu95Z9X331lVOsrr/+epfemjVrXNB33nkn5ZWbuXPn2rPPPms7duxwrnxYvJBevXpZkyZN3La+RCAUgYoVK7rnoXbt2oaSMH/+fBcMVy1cQ7FMsO07BQiP3HnnnVa5cmXD7Wzr1q2uk6BPnz52+OGHu+Px/uJ5xkJz6623ujrnl19+sbJly0aVLBbOnj17BsIOHz7cWTsDOzI3sGxh1cECVKxYMTv//PNdxw1hFixY4JQitqtVq2aDBg1i08nGjRtt8ODB9uOPP7pn8aijjnLKYrNmzXwQ/YqACIiACIiACIQgEPcx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pZdemiswrOjNquTTp093q5aPGjUqy/nDhw938e7du9fNStapUye75JJLsoThxT916lTr2rVrrqZjJjyKi5dGjRpZ//79A6uEf//993bfffcZDRTkuuuusyuvvNIHD/yi1B1//PFWpUqVwL502UjnsqXLNYpFOSZPnuyUdB9XgwYNrHXr1nb22Wf7Xfn6/fjjj23JkiV27rnnRownr/VIxEhzOHjzzTcHOieYzv2EE06w9u3bW7169XI488/Dr776ql1wwQUhw+/cudPVb02aNLGyZctGFV+oQHmt40LFpX0iIAIiIAIikA4E4m65yQskeky7detmy5cvN1bozm4doUH07rvv2i233GKvv/66nXfeeTZ69Oh894L6vHbu3NlZfF555RWnxHz11Vc2duxYd5gebBSdWrVq2YsvvmhnnHGGOxauh9bHqV8RSGUCdCY89thjVqZMGfvb3/5mM2bMSOXiRJ33unXrurrgwQcfNBSSwYMHOytW1BEooAiIgAiIgAiIQIESiLvlJi+lYe2GYcOGWfXq1W3IkCG2dOnSLNHQW4mccsopzppy0kkn2cSJE23NmjX56gX1iZx55pl+M5AGbmoIig4LWF5//fVO8SJN5J133gnZQ+sOpsjXHXfc4axRWM1atGjhetRR5vr06WP169dPkVIom/EgULlyZStatKjVrFnTZs2aZYsWLbLTTz/dJYV1FCsrz8iRRx7pOh2aNm0ayAadFChH/jlGYXjkkUf2W/+KTownnnjCeL4HDRqU0DWqfOZLlCjhLK9YX3/88UdnxSJ/5cuXd/l88skn3XOCZYdn5tZbbw1YeIkDTl26dLHNmzfbsccea/fee69TEH38WEAHDhxoLFJKvYO1CM7sq1ChgvXo0cMHdQx//vlnGzBgQGCfNkRABERABERABLISSErLDVlEsQknNAKw6PCSf+2111xPcsWKFQ2XmVgJjRIabHfeeadreFx88cUuaq/M1KhRw/CpX79+vbGNQpDqwvglytKxY0fXgMXVjkbdhAkTUr1oyn8MCKB8fPDBBy4m3KkQxsIwrq1Zs2auI4LnkIa574BA4eEZ2rNnj/Xt29eGDh1qRx999H7j4Hbt2mW9e/e27777zoVL5OK7rmD//4ULKorYbbfdZi+88IJzP0WxQR566CFbsWKF3XPPPa6zA6Uvu/ssfHCXJcxPP/1k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+ZBxfP755+4Z51mYOXNmyDDsZAFPFuFkxrdYS37quFjnRfGJgAiIgAiIQDIQiPtsaYsXL7Zp06bZpZdemqvyrlu3zliVfPr06W5l71GjRgXOZ2rpAQMG2FdffeX2MdXywIED7YQTTgiEYYMXP4vgde3aNerpmIn7rrvucmtM+MiaNm1qffv2teLFixuL65E2yo0X1qG4+uqr/d/A76RJk+z444+3KlWqBPalwsauXbusY8eOVqJECatUqZI1btx4vzKkatlSgX8q5XHWrFn22GOPBbLMvX722We75z2WsySGq0dQap544gn77LPPAnm4/PLL3TNP58T48ePjtk4MHSAbNmyw+fPnG/XVaaedFshD8AYdHC+++KK1adMm5jNH5qWOC86btkVABERABEQg3QjEXbnJCzB6gLt162Y1atRwq5rv27cvSzRz5851is39999vderUsWHDhjnl5rXXXnMKSJbAufxD2lWrVrXu3bu7hv28efPs6aeftrFjx9pNN91ke/futbPOOst9DjnkEHv11Vdd73DdunUNJSgd5NNPP3XFwGqTjmv0pMM1SpYyeGvNkCFD3JpOs2fPds8K1ooePXrEPZuPPvqoLVq0yB555BHjGaTzAYtNQciZZ55pfPr16xcxOfI1dOjQhE5LHzGDOigCIiACIiACaUQgKZUb1m5AYalevbrRaFq6dGkW5O+9955VrlzZTj75ZLcfqwkuInxatWqVJWxu/xQtWtR69+4dOO2cc86xcePGuUYTO1Gm+Hi55pprjPzQqEp15Qal8dlnn7UdO3Y4Vz4sXkivXr2sSZMmvsj6FYH9CFSsWNF1RNSuXds++ugjZ80gEK5YuIbOmDHDbdeqVcs9X4RH7rzzTvcs43a2detWq1+/vvXp08cOP/xwdzzSFxYROh9uvvlma9SokQt67LHHGp9geemll2zy5MlOubj22mudZYnjGzdutMGDBzt3Niy2Rx11lFPImjVrFjh9woQJTnlCQZkyZYrt3LnTrrzySuO5z0mwgPbs2TMQbPjw4c4a6neghKH0UL9h5aKuufHGG406iGeR8FjBQuXdx6FfERABERABERCBrATiPuYma3LR/0OxCSc0fGg4eKExjuAiEmuhAYULWjjFxbvDZHeJi3U+CiK+hg0buh5w3GeKFSvmtukRp8EpEYFoCOAmxQdlAMEt7P33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K0Q07jp37uw+t912m11++eU2fvz4LHG8++67dskll9gNN9zgjn/11VdZjvOHF//UqVMjKiD7nRS0Y/v27S7uiy66KIuCRAPkiiuusK5du9qll15qEyZMCDrrr02UurVr1/61I4220rlsibhM69ats+7du1unTp3s1ltvdfcdDX9k7969Ton/7LPPXCM5EfkjzdmzZ9vLL78c0+SZUpwOivfee89mzJgRNu681CNhI/v/A3369LGLL77YeL6pb4YPH267du3K6bRcH6eD48UXX7Tdu3dHPPef//ynharHIp2U3zouUtw6JgIiIAIiIAKpSCDuyk1eoNCYO+uss2zEiBH2wgsv2HnnnWevvPKKzZs3z0VHY4GGSMeOHZ1lpkKFCjZgwIAsvd15STf7OU899VQWpYbj9PT279/fatWq5RosZ5xxho0dO9ZofElEIC8E6NG/44473JTpWBpRlvv27RtYG6pmzZrWr18/O//88/MSfczOQZF/6KGHYhYfEZ155pmubHXr1o1pvNFGVqVKFRs6dKhdd9119vHHH9vtt98ec0sOZSONRE5LHy0PhRMBERABERCBVCcQ93Vu8gKoTp06xsfLNddc43p2seg0bdrUbbMw5lVXXWU7d+609evXOyXk008/dY0lf15+fqdPn+4UFtII7q2mZ5Xe5uuvv96OOOIIW7NmjUvmnXfesXr16uUnyYSfSwOb3mWsCC1atLAlS5Y4ZY4e7vr16yc8f+magffff9/dUyjTlStXdsU89dRToy4uSv+oUaNs48aN7hwU77vuuisQFxZIOgq+/PJLl86RRx5pgwYNsmrVqrnwP/zwg1PQv/76a/e/evXqrjHuM7BgwYLAf87h3GDZunWr62SYO3euu38qVqzoFBbiySlvwfEkYptFdlEe+cDlvvvucxYq7v9IeefYsGHD7Nlnn7WSJUu6rOO2N3jwYHviiSfsqKOOclagnj17BopFh0yJEiUC/z/55BN77rnnjOvTpEmT/dzW5syZY6NHj3aWrdKlS9u1115rbdq0CZyvDREQAREQAREQgf0JJKXlJns2ccdBTjjhBPeLqxfWGhQcGoSNGzcO7Hcb+fxirM8zzzxjd999d5bGCNF6ZaZGjRo2ZcoUp1ixjUKQ6oJFjLJgEZs1a5ZdeeWVRs92OLe7VC9vsuR/6dKlzkrjFZvc5otxX5dd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2GEFnbRLj7Qpdyg3oYRkKIaJpnPZYohJUcWIQCLrkRgVIS7RJLqOi0uhFKkIiIAIiIAI5INA3N3SGCzNJxGC61iiFBvKm1f3okSwym2a6Vy23LJQ+PgTSGQ9Ev/S5T2FRNdxec+5zhQBERABERCB+BCQW1p8uCpWERABERABERABERABERCBAiYg5aaAgSs5ERABERABERABERABERCB+BCQchMfropVBERABERABERABERABESggAlIuSlg4EpOBERABERABERABERABEQgPgSk3MSHq2IVAREQAREQAREQAREQAREoYAJSbgoYuJITAREQAREQAREQAREQARGID4G4KzebN2+2n3/+OT65zyHW3bt325o1a3IIFZ/DrD+xcuVK27dvX3wSSGCs6Vy2BGJV0hEIJLIeiZCthB9KZB2X8MIrAyIgAiIgAiIQgkDclZtx48bZ8OHDQyQd/11z5861Xr16xT+hECns2LHDevbsaevXrw9xNLV3pXPZUvvKpG/uE1mPJDPVRNZxycxFeRMBERABESi8BOKu3BRetCq5CIiACIiACIiACIiACIhAQRIoGo/Evv32W5s2bZqLesGCBfbbb78FrDennnqqbdu2zVasWBEy6QsvvNAWLVoU8Thx446RXVjF/IILLrCXXnrJHcItjHDecnT00Udby5YtbcqUKdlPdf+rVq1qlSpVss8++yzk8aZNm9qmTZsi5m3q1Km2fft227Nnj4tj/Pjxdthhh1nRokWte/fuNmHChLB5P++88/KVtwMPPDBfeY/EtWPHjkbvebiydejQIWnznhPXxo0b5yvvOd0T+bmf0znvOT1rBxxwQL7qkZzu51R9FnOq49q2bRuy/tJOERABERABESgMBOKi3DDOZNeuXY7f77//bnz8fxQdXLWWLl0aki9KQU7Hly9fbjt37tzv/GLFihnjQXxae/fudWGC/5N+uLRRQEqUKBH2eO3atXPMG2nx8coN2ygdfJBIec9v3ooUKZKvvEfKG3mPVLZkzntOeatfv35YbrG4J/JzP6dz3nN61ugU4J5D8lKP5HQ/RzqeE/ec8h7PZzGnOs4B05cIiIAIiIAIFFICB2S+KP+IpuwEysj82pP5tWNfhm3anWGrdu2zehlbrVqlCmGjGDp0qG3dutUGDBgQNky8DsyaNctI//XXX49XEmHjxcJx1VVX2ciRI61KlSphw6XigXQuWypej8KQ50TWI8nMN5F1XDJzUd5EQAREQAQKLwGNuSm8114lFwEREAEREAEREAEREIG0IhB3y826deucS0kirBdYGEi/Tp06BX7RMjIybMmSJYYrG+5y6STpXLZ0uk7pVJZE1iPJzDGRdVwyc1HeREAEREAECi+BuCs3hRetSi4CIiACIiACIiACIiACIlCQBOSWVpC0lZYIiIAIiIAIiIAIiIAIiEDcCEi5iRtaRSwCIiACIiACIiACIiACIlCQBKTcFCRtpSUCIiACIiACIiACIiACIhA3AlJu4oZWEYuACIiACIiACIiACIiACBQkASk3BUlbaYmACIiACIiACIiACIiACMSNgJSbuKFVxCIgAiIgAiIgAiIgAiIgAgVJQMpNQdJWWiIgAiIgAiIgAiIgAiIgAnEjIOUmbmgVsQiIgAiIgAiIgAiIgAiIQEESKFqQieUmrcmTJ9umTZvcKaeffrrVrl07N6fnK+zUqVPtmGOOsXr16uUrnpxOnjVrlpUqVcoaNWqUU9C0Of7rr7/ahg0b7Mgjj7SSJUuGLNeWLVvsoIMOskMPPTTkce0UAREQAREQAREQAREQgVAEkla5+eWXX1wjePbs2VaxYsUCVW5ee+01a926ddyVG9KpVatWgSs37777rm3evNk6deoU6p6Iy77ff//d7rrrLlu2bFkg/qZNm1rfvn2tePHibt+2bdvs3nvvtZUrV7r/zZs3t/vuu8+KFk3a2zRQFm2IgAiIgAiIgAiIgAgknkDSuqV17drV+vXrZwceeGDiKcUpBzTcr7766jjFHj7ab775xubOnRs+QByO/PHHH1a1alV7/PHH7eWXX7Y77rjD5s2bZ2PHjg2k9vTTTzula+TIkXbLLbfY559/bq+++mrguDZEQAREQAREQAREQAREIBKBuHWJ//e//7Unn3zSlixZ4hSUFi1a2K233moHH3ywbd++3TVezznnHPvwww9t586ddt5559kNN9xgBxxwQKT8umMDBw60ChUqWI8ePQJhhw8fbj///LMNGDAgsC/SxgsvvGAff/yxsw7hHtW9e3c744wzAqesXbvWevbsaWvWrLGTTz7ZpVWmTBl3HOXgmWeesfXr11uJEiWsXbt21r59e5s0aZLNmTPHHn300UA8bOzbt8+6devmyoy14l//+pe9//77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LNz0yDNWC5Qar9gwvia76xvWlS6ZkzEgWNC8pc7tCPOFAkhZESYp8MKkBczAhlA2XNaYHQ5B4Qhm5XZG+Armlj0YU4szUQGTNCAwg6NfQwfLGpYYriVjdbh2wco4kzww+58Xrmtu8ubP068IiIAIiIAIiIAIiED8CByQaT34c6R0DmkQKCPza0/m1459GbZpd4at2rXP6mVstWqVKoQ9m/Ea9HZ7t62wAfNwgBmsmPUMhYc0ciP0ujNTGQ3z7DOlRRMP1g4a+Sg7jAEqaMHqhMJFA5spjJn8IFaC+xhWKabb9o1/4sZt69lnn3VKAOyweMWj7Fh1UC5CuZflt4xMg82sapQtkjIUKh3Og0ulSpWycAkVVvtEQAREQAREQAREQAQKnkDcLDe+KExpHGvBAsAMafS0X3zxxblWbMgPypB3ScpL/nBLys/5eUmTc3D1w60K1ygsR1iCsLjEUrBq5FQ2rEbxkuxjfGKZDhMX+MkLchsvroZY+SQiIAIiIAIiIAIiIALJSSAuY27iXVSsQYzXYOFM3I0Kk9C4ZvpiBrZjfWLdlWjcwmLBCIUmeOxQLOJUHCIgAiIgAiIgAiIgAiIQKwJxd0uLVUYVjwiIgAiIgAiIgAiIgAiIgAhEIpCSlptIBdIxERABERABERABERABERCBwklAyk3hvO4qtQiIgAiIgAiIgAiIgAikHQEpN2l3SVUgERABERABERABERABESicBKTcFM7rrlKLgAiIgAiIgAiIgAiIQNoRkHKTdpdUBRIBERABERABERABERCBwklAyk3hvO4qtQiIgAiIgAiIgAiIgAikHQEpN2l3SVUgERABERABERABERABESicBKTcFM7rrlKLgAiIgAiIgAiIgAiIQNoRkHKTdpdUBRIBERABERABERABERCBwklAyk3hvO4qtQiIgAiIgAiIgAiIgAikHQEpN2l3SVUgERABERABERABERABESicBKTcFM7rrlKLgAiIgAiIgAiIgAiIQNoRkHKTdpdUBRIBERABERABERABERCBwklAyk3hvO4qtQiIgAiIgAiIgAiIgAikHQEpN2l3SVUgERABERABERABERABESicBPKl3BxQOJmp1CIgAiIgAiIgAiIgAiIgAklIIE/KjVNqpNkk4eVUlkRABERABERABERABESg8BLItXLjdRpOLOL/FF5+KrkI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" + } + }, + "cell_type": "markdown", + "id": "c303d698-2f44-4f6f-8ce5-6a4f9f13534a", + "metadata": {}, + "source": [ + "![image.png](attachment:f7ad0425-26fe-482c-b97c-c9493b05fbf2.png)" + ] + }, + { + "cell_type": "markdown", + "id": "abd854e5", + "metadata": {}, + "source": [ + "## Create a data processing function\n", + "\n", + "The following code demonstrates how to create a simple data processing function using MLRun.
\n", + "The function will process the data and show some statistics.
\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b4e759f9-7154-4397-8db3-93b808426bd1", + "metadata": {}, + "outputs": [], + "source": [ + "%%writefile process_data.py\n", + "\n", + "\n", + "# Here is an example of Spark processing.\n", + "from pyspark.sql import SparkSession\n", + "from pyspark.sql.functions import avg, min, max\n", + "import pandas as pd\n", + "import json\n", + "import fsspec\n", + "\n", + "def process_data(data_path: str, data_output_path: str):\n", + " spark = SparkSession.builder.appName(\"MusicDemo\").getOrCreate()\n", + " spark_df = spark.read.parquet(data_path, header=True)\n", + " spark_df = spark_df.drop(\"name\", \"id\")\n", + " \n", + " music_stats = spark_df.groupBy(\"favorite_music_type\").agg(\n", + " avg(\"age\").alias(\"avg_age\"),\n", + " min(\"age\").alias(\"min_age\"),\n", + " max(\"age\").alias(\"max_age\")\n", + " )\n", + " music_stats.show()\n", + " pandas_df = spark_df.toPandas()\n", + " pandas_df.to_parquet(data_output_path)\n", + " # spark_df.write.mode(\"overwrite\").parquet(data_output_path)\n", + "\n", + " return {\"music_data\": data_output_path}" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "13748b64-6a48-4500-a2a8-d9290dd082c5", + "metadata": {}, + "outputs": [], + "source": [ + "process_data_function = project.set_function(\n", + " func=\"./zeev-demos/mlflow-databricks/process_data.py\",\n", + " name=\"process-data\",\n", + " kind=\"databricks\",\n", + " image=\"mlrun/mlrun\",\n", + ")\n", + " " + ] + }, + { + "cell_type": "markdown", + "id": "2dbadf07-a32a-40da-b9bc-609070e4392d", + "metadata": {}, + "source": [ + "Set all parameters necessary for the function and run it." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "5642aa15-e8c0-4a72-a0a8-4cacd34fb63c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> 2024-03-27 15:34:45,422 [info] Storing function: {'name': 'process-data-process-data', 'uid': 'a9c770f8377046bda3061e61a5c015c2', 'db': 'http://mlrun-api:8080'}\n", + "> 2024-03-27 15:34:45,675 [info] Job is running in the background, pod: process-data-process-data-89bhh\n", + "> 2024-03-27 15:34:49,272 [info] Running with an existing cluster: {'cluster_id': '0327-134616-43m7kfxk'}\n", + "> 2024-03-27 15:34:49,492 [info] Starting to poll: 493449112310004\n", + "> 2024-03-27 15:34:49,539 [info] Workflow intermediate status: mlrun_task__15_34_48_703046: RunLifeCycleState.PENDING\n", + "> 2024-03-27 15:34:50,947 [info] Workflow intermediate status: mlrun_task__15_34_48_703046: RunLifeCycleState.PENDING\n", + "> 2024-03-27 15:34:53,063 [info] Workflow intermediate status: mlrun_task__15_34_48_703046: RunLifeCycleState.RUNNING\n", + "> 2024-03-27 15:34:56,737 [info] Workflow intermediate status: mlrun_task__15_34_48_703046: RunLifeCycleState.RUNNING\n", + "> 2024-03-27 15:35:00,947 [info] Artifacts found. Run name: mlrun_task__15_34_48_703046\n", + "> 2024-03-27 15:35:01,881 [info] Job finished: https://dbc-94c947ab-feb9.cloud.databricks.com/?o=4658245941722457#job/499259196347814/run/493449112310004\n", + "> 2024-03-27 15:35:01,881 [info] Logs:\n", + "+-------------------+------------------+-------+-------+\n", + "|favorite_music_type| avg_age|min_age|max_age|\n", + "+-------------------+------------------+-------+-------+\n", + "| Rock| 30.125| 27| 34|\n", + "| Classical|47.666666666666664| 38| 75|\n", + "| Pop| 24.0| 18| 38|\n", + "+-------------------+------------------+-------+-------+\n", + "\n", + "2024-03-27 15:34:54,980 - mlrun_logger - INFO - successfully wrote artifact details to the artifact JSON file in DBFS - music_data : /dbfs/demos/mlrun_databricks_demo/music_output_new.parquet\n", + "> 2024-03-27 15:35:02,182 [info] To track results use the CLI: {'info_cmd': 'mlrun get run a9c770f8377046bda3061e61a5c015c2 -p mlflow-tracking-example-guy', 'logs_cmd': 'mlrun logs a9c770f8377046bda3061e61a5c015c2 -p mlflow-tracking-example-guy'}\n", + "> 2024-03-27 15:35:02,182 [info] Or click for UI: {'ui_url': 'https://dashboard.default-tenant.app.llm-dev.iguazio-cd1.com/mlprojects/mlflow-tracking-example-guy/jobs/monitor/a9c770f8377046bda3061e61a5c015c2/overview'}\n", + "> 2024-03-27 15:35:02,182 [info] Run execution finished: {'status': 'completed', 'name': 'process-data-process-data'}\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
projectuiditerstartstatenamelabelsinputsparametersresultsartifacts
mlflow-tracking-example-guy0Mar 27 15:34:48completedprocess-data-process-data
v3io_user=zeevr
kind=databricks
owner=zeevr
mlrun/client_version=1.6.1
mlrun/client_python_version=3.9.16
host=process-data-process-data-89bhh
task_parameters={'timeout_minutes': 15, 'spark_app_code': 'IAoKaW1wb3J0IG9zCmltcG9ydCBsb2dnaW5nCm1scnVuX2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCdtbHJ1bl9sb2dnZXInKQptbHJ1bl9sb2dnZXIuc2V0TGV2ZWwobG9nZ2luZy5ERUJVRykKCm1scnVuX2NvbnNvbGVfaGFuZGxlciA9IGxvZ2dpbmcuU3RyZWFtSGFuZGxlcigpCm1scnVuX2NvbnNvbGVfaGFuZGxlci5zZXRMZXZlbChsb2dnaW5nLkRFQlVHKQptbHJ1bl9mb3JtYXR0ZXIgPSBsb2dnaW5nLkZvcm1hdHRlcignJShhc2N0aW1lKXMgLSAlKG5hbWUpcyAtICUobGV2ZWxuYW1lKXMgLSAlKG1lc3NhZ2UpcycpCm1scnVuX2NvbnNvbGVfaGFuZGxlci5zZXRGb3JtYXR0ZXIobWxydW5fZm9ybWF0dGVyKQptbHJ1bl9sb2dnZXIuYWRkSGFuZGxlcihtbHJ1bl9jb25zb2xlX2hhbmRsZXIpCgptbHJ1bl9kZWZhdWx0X2FydGlmYWN0X3RlbXBsYXRlID0gJ21scnVuX3JldHVybl92YWx1ZV8nCm1scnVuX2FydGlmYWN0X2luZGV4ID0gMAoKCmRlZiBtbHJ1bl9sb2dfYXJ0aWZhY3QobmFtZT0nJywgcGF0aD0nJyk6CiAgICBnbG9iYWwgbWxydW5fYXJ0aWZhY3RfaW5kZXgKICAgIG1scnVuX2FydGlmYWN0X2luZGV4Kz0xICAjICBieSBob3cgbWFueSBhcnRpZmFjdHMgd2UgdHJpZWQgdG8gbG9nLCBub3QgaG93IG1hbnkgc3VjY2VlZC4KICAgIGlmIG5hbWUgaXMgTm9uZSBvciBuYW1lID09ICcnOgogICAgICAgIG5hbWUgPSBmJ3ttbHJ1bl9kZWZhdWx0X2FydGlmYWN0X3RlbXBsYXRlfXttbHJ1bl9hcnRpZmFjdF9pbmRleH0nCiAgICBpZiBub3QgcGF0aDoKICAgICAgICBtbHJ1bl9sb2dnZXIuZXJyb3IoZidwYXRoIHJlcXVpcmVkIGZvciBsb2dnaW5nIGFuIG1scnVuIGFydGlmYWN0IC0ge25hbWV9IDoge3BhdGh9JykKICAgICAgICByZXR1cm4KICAgIGlmIG5vdCBpc2luc3RhbmNlKG5hbWUsIHN0cikgb3Igbm90IGlzaW5zdGFuY2UocGF0aCwgc3RyKToKICAgICAgICBtbHJ1bl9sb2dnZXIuZXJyb3IoZiduYW1lIGFuZCBwYXRoIG11c3QgYmUgaW4gc3RyaW5nIHR5cGUgZm9yIGxvZ2dpbmcgYW4gbWxydW4gYXJ0aWZhY3QgLSB7bmFtZX0gOiB7cGF0aH0nKQogICAgICAgIHJldHVybgogICAgaWYgbm90IHBhdGguc3RhcnRzd2l0aCgnL2RiZnMnKSBhbmQgbm90IHBhdGguc3RhcnRzd2l0aCgnZGJmczovJyk6CiAgICAgICAgbWxydW5fbG9nZ2VyLmVycm9yKGYncGF0aCBmb3IgYW4gbWxydW4gYXJ0aWZhY3QgbXVzdCBzdGFydCB3aXRoIC9kYmZzIG9yIGRiZnM6LyAtIHtuYW1lfSA6IHtwYXRofScpCiAgICAgICAgcmV0dXJuCiAgICBtbHJ1bl9hcnRpZmFjdHNfcGF0aCA9ICcvZGJmcy9tbHJ1bl9kYXRhYnJpY2tzX3J1bnRpbWUvYXJ0aWZhY3RzX2RpY3Rpb25hcmllcy9tbHJ1bl9hcnRpZmFjdF9hOWM3NzBmODM3NzA0NmJkYTMwNjFlNjFhNWMwMTVjMi5qc29uJwogICAgdHJ5OgogICAgICAgIG5ld19kYXRhID0ge25hbWU6cGF0aH0KICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhtbHJ1bl9hcnRpZmFjdHNfcGF0aCk6CiAgICAgICAgICAgIHdpdGggb3BlbihtbHJ1bl9hcnRpZmFjdHNfcGF0aCwgJ3IrJykgYXMganNvbl9maWxlOgogICAgICAgICAgICAgICAgZXhpc3RpbmdfZGF0YSA9IGpzb24ubG9hZChqc29uX2ZpbGUpCiAgICAgICAgICAgICAgICBleGlzdGluZ19kYXRhLnVwZGF0ZShuZXdfZGF0YSkKICAgICAgICAgICAgICAgIGpzb25fZmlsZS5zZWVrKDApCiAgICAgICAgICAgICAgICBqc29uLmR1bXAoZXhpc3RpbmdfZGF0YSwganNvbl9maWxlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHBhcmVudF9kaXIgPSBvcy5wYXRoLmRpcm5hbWUobWxydW5fYXJ0aWZhY3RzX3BhdGgpCiAgICAgICAgICAgIGlmIHBhcmVudF9kaXIgIT0gJy9kYmZzJzoKICAgICAgICAgICAgICAgIG9zLm1ha2VkaXJzKHBhcmVudF9kaXIsIGV4aXN0X29rPVRydWUpCiAgICAgICAgICAgIHdpdGggb3BlbihtbHJ1bl9hcnRpZmFjdHNfcGF0aCwgJ3cnKSBhcyBqc29uX2ZpbGU6CiAgICAgICAgICAgICAgICBqc29uLmR1bXAobmV3X2RhdGEsIGpzb25fZmlsZSkKICAgICAgICBzdWNjZXNzX2xvZyA9IGYnc3VjY2Vzc2Z1bGx5IHdyb3RlIGFydGlmYWN0IGRldGFpbHMgdG8gdGhlIGFydGlmYWN0IEpTT04gZmlsZSBpbiBEQkZTIC0ge25hbWV9IDoge3BhdGh9JwogICAgICAgIG1scnVuX2xvZ2dlci5pbmZvKHN1Y2Nlc3NfbG9nKQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB1bmtub3duX2V4Y2VwdGlvbjoKICAgICAgICBtbHJ1bl9sb2dnZXIuZXJyb3IoZidsb2cgbWxydW4gYXJ0aWZhY3QgZmFpbGVkIC0ge25hbWV9IDoge3BhdGh9LiBlcnJvcjoge3Vua25vd25fZXhjZXB0aW9ufScpCgoKCgppbXBvcnQgYXJncGFyc2UKaW1wb3J0IGpzb24KcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQpwYXJzZXIuYWRkX2FyZ3VtZW50KCdoYW5kbGVyX2FyZ3VtZW50cycpCmhhbmRsZXJfYXJndW1lbnRzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKS5oYW5kbGVyX2FyZ3VtZW50cwpoYW5kbGVyX2FyZ3VtZW50cyA9IGpzb24ubG9hZHMoaGFuZGxlcl9hcmd1bWVudHMpCgoKZnJvbSBweXNwYXJrLnNxbCBpbXBvcnQgU3BhcmtTZXNzaW9uCmZyb20gcHlzcGFyay5zcWwuZnVuY3Rpb25zIGltcG9ydCBhdmcsIG1pbiwgbWF4CmltcG9ydCBwYW5kYXMgYXMgcGQKaW1wb3J0IGpzb24KaW1wb3J0IGZzc3BlYwoKZGVmIHByb2Nlc3NfZGF0YShkYXRhX3BhdGg6IHN0ciwgZGF0YV9vdXRwdXRfcGF0aDogc3RyKToKICAgIHNwYXJrID0gU3BhcmtTZXNzaW9uLmJ1aWxkZXIuYXBwTmFtZSgnTXVzaWNEZW1vJykuZ2V0T3JDcmVhdGUoKQogICAgc3BhcmtfZGYgPSBzcGFyay5yZWFkLnBhcnF1ZXQoZGF0YV9wYXRoLCBoZWFkZXI9VHJ1ZSkKICAgIHNwYXJrX2RmID0gc3BhcmtfZGYuZHJvcCgnbmFtZScsICdpZCcpCiAgICBtdXNpY19zdGF0cyA9IHNwYXJrX2RmLmdyb3VwQnkoJ2Zhdm9yaXRlX211c2ljX3R5cGUnKS5hZ2coYXZnKCdhZ2UnKS5hbGlhcygnYXZnX2FnZScpLCBtaW4oJ2FnZScpLmFsaWFzKCdtaW5fYWdlJyksIG1heCgnYWdlJykuYWxpYXMoJ21heF9hZ2UnKSkKICAgIG11c2ljX3N0YXRzLnNob3coKQogICAgcGFuZGFzX2RmID0gc3BhcmtfZGYudG9QYW5kYXMoKQogICAgcGFuZGFzX2RmLnRvX3BhcnF1ZXQoZGF0YV9vdXRwdXRfcGF0aCkKICAgIHJldHVybiB7J211c2ljX2RhdGEnOiBkYXRhX291dHB1dF9wYXRofQpyZXN1bHQgPSBwcm9jZXNzX2RhdGEoKipoYW5kbGVyX2FyZ3VtZW50cykKCgppZiByZXN1bHQ6CiAgICBpZiBpc2luc3RhbmNlKHJlc3VsdCwgZGljdCk6CiAgICAgICAgZm9yIGtleSwgcGF0aCBpbiByZXN1bHQuaXRlbXMoKToKICAgICAgICAgICAgbWxydW5fbG9nX2FydGlmYWN0KG5hbWU9a2V5LCBwYXRoPXBhdGgpCiAgICBlbGlmIGlzaW5zdGFuY2UocmVzdWx0LCAobGlzdCwgdHVwbGUsIHNldCkpOgogICAgICAgIGZvciBhcnRpZmFjdF9wYXRoIGluIHJlc3VsdDoKICAgICAgICAgICAgbWxydW5fbG9nX2FydGlmYWN0KHBhdGg9YXJ0aWZhY3RfcGF0aCkKICAgIGVsaWYgaXNpbnN0YW5jZShyZXN1bHQsIHN0cik6CiAgICAgICAgbWxydW5fbG9nX2FydGlmYWN0KHBhdGg9cmVzdWx0KQogICAgZWxzZToKICAgICAgICBtbHJ1bl9sb2dnZXIud2FybmluZyhmJ2NhbiBub3QgbG9nIGFydGlmYWN0cyB3aXRoIHRoZSByZXN1bHQgb2YgaGFuZGxlciBmdW5jdGlvbiAtIHJlc3VsdCBpbiB1bnN1cHBvcnRlZCB0eXBlLiB7dHlwZShyZXN1bHQpfScpCg==', 'original_handler': 'process_data', 'artifact_json_path': '/mlrun_databricks_runtime/artifacts_dictionaries/mlrun_artifact_a9c770f8377046bda3061e61a5c015c2.json'}
data_path=dbfs:///demos/mlrun_databricks_demo/1711553684480_33/music.parquet
data_output_path=/dbfs/demos/mlrun_databricks_demo/music_output_new.parquet
music_data
databricks_run_metadata
\n", + "
\n", + "
\n", + "
\n", + " Title\n", + " ×\n", + "
\n", + " \n", + "
\n", + "
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "data": { + "text/html": [ + " > to track results use the .show() or .logs() methods or click here to open in UI" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> 2024-03-27 15:35:07,910 [info] Run execution finished: {'status': 'completed', 'name': 'process-data-process-data'}\n" + ] + } + ], + "source": [ + "for name, val in job_env.items():\n", + " process_data_function.spec.env.append({\"name\": name, \"value\": val})\n", + "params = {\n", + " \"task_parameters\": {\"timeout_minutes\": 15},\n", + " \"data_path\": dbfs_data_path,\n", + " \"data_output_path\": output_path.replace(\"dbfs://\", \"/dbfs\"),\n", + "}\n", + "run = process_data_function.run(\n", + " handler=\"process_data\",\n", + " params=params,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "9a8db175-51f4-4218-afd1-752cc0e65216", + "metadata": { + "tags": [] + }, + "source": [ + "## Create an MLflow Xgboost function\n", + "\n", + "The following code demonstrates how to create a simple Xgboost model using MLflow and log the results.
\n", + "MLflow will log the model, parameters, metrics, and artifacts, and MLRun will track the run and collect the data." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "44a1e133-954d-47a3-9b0f-6e181fe12ea7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Overwriting training.py\n" + ] + } + ], + "source": [ + "%%writefile training.py\n", + "\n", + "import mlflow\n", + "import mlflow.xgboost\n", + "import xgboost as xgb\n", + "from mlflow import log_metric\n", + "from sklearn import datasets\n", + "from sklearn.metrics import accuracy_score, log_loss\n", + "from sklearn.model_selection import train_test_split\n", + "import pandas as pd\n", + "\n", + "def example_xgb_run(df: str):\n", + " df = pd.read_parquet(df)\n", + " \n", + " df = df.replace([\"f\", \"m\"], [0, 1])\n", + " df = df.replace([\"Pop\", \"Rock\", \"Classical\"], [0, 1, 2])\n", + " \n", + " # Prepare, train, and test data\n", + " y = df.pop('favorite_music_type')\n", + " X = df\n", + "\n", + " X_train, X_test, y_train, y_test = train_test_split(\n", + " X, y, test_size=0.2, random_state=42\n", + " )\n", + "\n", + " # Enable auto logging\n", + " mlflow.xgboost.autolog()\n", + "\n", + " dtrain = xgb.DMatrix(X_train, label=y_train)\n", + " dtest = xgb.DMatrix(X_test, label=y_test)\n", + "\n", + " with mlflow.start_run():\n", + " # Train model\n", + " params = {\n", + " \"objective\": \"multi:softprob\",\n", + " \"num_class\": 3,\n", + " \"learning_rate\": 0.3,\n", + " \"eval_metric\": \"mlogloss\",\n", + " \"colsample_bytree\": 1.0,\n", + " \"subsample\": 1.0,\n", + " \"seed\": 42,\n", + " }\n", + " model = xgb.train(params, dtrain, evals=[(dtrain, \"train\")])\n", + " \n", + " # Evaluate model\n", + " y_proba = model.predict(dtest)\n", + " y_pred = y_proba.argmax(axis=1)\n", + " loss = log_loss(y_test, y_proba)\n", + " acc = accuracy_score(y_test, y_pred)\n", + " \n", + " # Log metrics by hand\n", + " mlflow.log_metrics({\"log_loss\": loss, \"accuracy\": acc})" + ] + }, + { + "cell_type": "markdown", + "id": "1cf984c9-78a9-443f-9465-111263101dcd", + "metadata": {}, + "source": [ + "## Log the data from MLflow in MLRun " + ] + }, + { + "cell_type": "markdown", + "id": "365e4b39-9f39-40ae-aac4-7c4f42bce9bd", + "metadata": {}, + "source": [ + "### Change the MLRun configuration to use the tracker\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "0b194d04-e08f-4161-a65b-4f18d10fdbf0", + "metadata": {}, + "outputs": [], + "source": [ + "import mlrun\n", + "\n", + "mlrun.mlconf.external_platform_tracking.enabled = True" + ] + }, + { + "cell_type": "markdown", + "id": "b16bb4db-8a2a-4453-a42e-0e8e74ab8f53", + "metadata": {}, + "source": [ + "These are the three options to run tracking:\n", + "- Set: `mlrun.mlconf.external_platform_tracking.mlflow.match_experiment_to_runtime` to True. This determines the run id and is the safest method\n", + "- Set the experiment name at: `mlflow.environment_variables.MLFLOW_EXPERIMENT_NAME.set`. This determines the experiment mlrun will track and find the run added to it.\n", + "- Just run it, mlrun will look across all experiments and search for added run, this is not recomended." + ] + }, + { + "cell_type": "markdown", + "id": "8b7bc72a-bd1b-408a-afa8-e474d91c4a20", + "metadata": {}, + "source": [ + "### Create the mlrun function" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "3382b909-a8dc-41a3-afb1-b64df9bb7318", + "metadata": {}, + "outputs": [], + "source": [ + "# Use the first run option from above\n", + "mlrun.mlconf.external_platform_tracking.mlflow.match_experiment_to_runtime = True\n", + "\n", + "# Create a MLRun function using the example train file (all the functions must be located in it):\n", + "training_func = project.set_function(\n", + " func=\"training.py\",\n", + " name=\"example-xgb-run\",\n", + " kind=\"job\",\n", + " image=\"mlrun/mlrun\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "91597f57-364d-4d2a-b926-97b9d8afc81b", + "metadata": {}, + "source": [ + "### Run the function\n", + "\n", + "Run the function using MLRun. This will log the data from MLflow in MLRun.
\n", + "After running the function, you can look at the UI and see that all metrics and parameters are logged in MLRun." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "5a726ca8-8057-41ed-be4e-35e5e0582de9", + "metadata": {}, + "outputs": [], + "source": [ + "import mlrun.feature_store as fstore\n", + "\n", + "feature_set = fstore.get_feature_set(\"music_fset\", \"mlflow-tracking-example\")" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "4de1229a-cc59-4846-8473-3178e682efa6", + "metadata": {}, + "outputs": [], + "source": [ + "df = feature_set.to_dataframe()\n", + "df = df.drop(['id'], axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "8249a933-031c-4f2e-88c2-161dd4cfb7ed", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# df = project.list_().to_objects()[0].to_dataitem().as_df()\n", + "df_path = \"./music.parquet\"\n", + "df.to_parquet(df_path)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "8ba452dd-1756-4bfb-af64-d741e234dba3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> 2024-03-27 15:37:22,829 [info] Storing function: {'name': 'example-xgb-run-example-xgb-run', 'uid': '6ff324dd21d64b6290d45a001957dda2', 'db': 'http://mlrun-api:8080'}\n", + "> 2024-03-27 15:37:22,912 [warning] `mlconf.external_platform_tracking.mlflow.match_experiment_to_runtime` is set to True but the MLFlow experiment name environment variable ('MLFLOW_EXPERIMENT_NAME') is set for using the name: 'example-xgb-run-example-xgb-run'. This name will be overriden with MLRun's runtime name as set in the MLRun configuration: 'example-xgb-run-example-xgb-run'.\n", + "[0]\ttrain-mlogloss:0.82467\n", + "[1]\ttrain-mlogloss:0.64706\n", + "[2]\ttrain-mlogloss:0.52480\n", + "[3]\ttrain-mlogloss:0.43768\n", + "[4]\ttrain-mlogloss:0.37410\n", + "[5]\ttrain-mlogloss:0.32686\n", + "[6]\ttrain-mlogloss:0.29057\n", + "[7]\ttrain-mlogloss:0.26192\n", + "[8]\ttrain-mlogloss:0.23885\n", + "[9]\ttrain-mlogloss:0.22004\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024/03/27 15:37:23 WARNING mlflow.utils.autologging_utils: MLflow autologging encountered a warning: \"/User/.pythonlibs/mlrun-base/lib/python3.9/site-packages/mlflow/types/utils.py:393: UserWarning: Hint: Inferred schema contains integer column(s). Integer columns in Python cannot represent missing values. If your input data contains missing values at inference time, it will be encoded as floats and will cause a schema enforcement error. The best way to avoid this problem is to infer the model schema based on a realistic data sample (training dataset) that includes missing values. Alternatively, you can declare integer columns as doubles (float64) whenever these columns may have missing values. See `Handling Integers With Missing Values `_ for more details.\"\n", + "2024/03/27 15:37:23 WARNING mlflow.utils.autologging_utils: MLflow autologging encountered a warning: \"/User/.pythonlibs/mlrun-base/lib/python3.9/site-packages/xgboost/core.py:160: UserWarning: [15:37:23] WARNING: /workspace/src/c_api/c_api.cc:1240: Saving into deprecated binary model format, please consider using `json` or `ubj`. Model format will default to JSON in XGBoost 2.2 if not specified.\"\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
projectuiditerstartstatenamelabelsinputsparametersresultsartifacts
mlflow-tracking-example-guy0Mar 27 15:37:22completedexample-xgb-run-example-xgb-run
v3io_user=zeevr
kind=local
owner=zeevr
host=jupyter-zeevr-9f4ffb7bb-8c4mf
mlflow-user=iguazio
mlflow-run-name=stately-cow-437
mlflow-run-id=f66d6149d54c4958a2485c941d86a538
mlflow-experiment-id=608717337209571124
df
colsample_bytree=1.0
custom_metric=None
early_stopping_rounds=None
eval_metric=mlogloss
learning_rate=0.3
maximize=None
num_boost_round=10
num_class=3
objective=multi:softprob
seed=42
subsample=1.0
verbose_eval=True
accuracy=0.7142857142857143
log_loss=0.9622776094122579
train-mlogloss=0.2200447738170624
feature_importance_weight_json
feature_importance_weight_png
model
\n", + "
\n", + "
\n", + "
\n", + " Title\n", + " ×\n", + "
\n", + " \n", + "
\n", + "
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "data": { + "text/html": [ + " > to track results use the .show() or .logs() methods or click here to open in UI" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> 2024-03-27 15:37:31,415 [info] Run execution finished: {'status': 'completed', 'name': 'example-xgb-run-example-xgb-run'}\n" + ] + } + ], + "source": [ + "# Run the example code using mlrun\n", + "train_run = training_func.run(\n", + " local=True,\n", + " handler=\"example_xgb_run\",\n", + " inputs={\"df\": df_path},\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "655d5c46-2c0a-46f2-bbec-a58853260476", + "metadata": {}, + "source": [ + "### Examine the results\n", + "\n", + "You can examine the results using the UI or by looking at the outputs of the run.
\n", + "The outputs include the model, the metrics, and the artifacts, and are completely independent of MLflow." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "d23beb02-e455-48dc-9d9f-9e3d4549ec71", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'accuracy': 0.7142857142857143,\n", + " 'log_loss': 0.9622776094122579,\n", + " 'train-mlogloss': 0.2200447738170624,\n", + " 'feature_importance_weight_json': 'store://artifacts/mlflow-tracking-example-guy/example-xgb-run-example-xgb-run_feature_importance_weight_json@6ff324dd21d64b6290d45a001957dda2',\n", + " 'feature_importance_weight_png': 'store://artifacts/mlflow-tracking-example-guy/example-xgb-run-example-xgb-run_feature_importance_weight_png@6ff324dd21d64b6290d45a001957dda2',\n", + " 'model': 'store://artifacts/mlflow-tracking-example-guy/example-xgb-run-example-xgb-run_model@6ff324dd21d64b6290d45a001957dda2'}" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "train_run.outputs" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "b05f4c2a-5f2d-4d7c-9c21-39c0a949cfc3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'accuracy': 0.7142857142857143,\n", + " 'log_loss': 0.9622776094122579,\n", + " 'train-mlogloss': 0.2200447738170624}" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "train_run.status.results" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "925b3445-18b4-4497-9783-52b4cd069401", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "train_run.artifact(\"feature_importance_weight_png\").show()" + ] + }, + { + "cell_type": "markdown", + "id": "227c4358-4c34-4d1c-acb4-e37ca110b8bf", + "metadata": {}, + "source": [ + "### You can also examine the results using the UI" + ] + }, + { + "cell_type": "markdown", + "id": "dde00fd1-a1f0-4c56-80c2-c5d36a9062a1", + "metadata": {}, + "source": [ + "Look at collected artifacts: " + ] + }, + { + "attachments": { + "95b9b198-55c9-4a67-b0bf-103c9ae0272e.png": { + "image/png": "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/LapWpuGkpN9+/WySy4/1+rWreOXpbk2qU8994A94I71/bcjffhO4bX2HdrauRecZv136eu306+99tnd/hw30ac41WI1JSW/vepxJxxhTZo0smefftlmu6pzCtVpdOna0c44+2QbsOuWOfwKfiGAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggIAXOOb4wyqtRGpqqp125km+46Sea3Tr3tl3o1yxfGWh99WgYX07+7wRvgDYTj26+qJcKhQW7Fdo4xi+SLYkq5tSrVBVuKdWTLKv1y2IyVGWZW+0W5eMsfMb9rA9a23JdemYOnY8RpJr07l18b14nE2Uc+rDXrZ0uW87qgptRcdjrtXpyy+86Rffdtf1EROSa9dk2MaNG30Ft6L7h79W4E4htnr161p1F5AraWRlZflzUkW4lJTCfWw3b8701eAaupauNWpUL2kKliOAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggEApAh+9/7mtW7feb1G7dk078JB9S9l6+1r1xqvv2pTJ0wudVNdunezo4yom9Lc5L8dmbF7jzycjN8vOmPu1xTpIpvaoz7Tey9QyVaNDtToltkz1G2zDr/wjbMMEFbGrWqG2at3CV4QLP35GxjqbO2e+jfrp19BiBdMijfQ6tcsMwWm/5OQka96iaakhOG2nFGbzFs2KheC0rlq1qtbalTgkBCcNBgIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACWyegYlbTp830P/VdS9HKNOo3qFfsdFURrqKGQmoNquQXBluYtT7mITi9L4XtZmdm+LeoY+mY8RrFy6nF60gJmPeu2x607775KXSk1q1bWtt2rUKveYIAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAKVV2DQbgOse48uvrlmep30SvVGBg/ZxTp2al/onBs3aVTodaJfNKlSw9bnZsf1sJkuDJeWXMV0rHiOHSoIFw6lCmw33HR5sapx4dvwHAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBCqXQJ1KFoALdNPS0nxXyeD19vLYIrWmTdy0Mm6no7aoOka8R1KeG/E+SKLmX7lilS1cuNjq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QAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEiJAEC4hzBwEAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAgXgIE4eIly7wIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIJESAIlxBmDoIAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIBAvAYJw8ZJlXgQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgYQIEIRLCDMHQQABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQiJcAQbh4yTIvAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIBAQgSqJOQoHAQBBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQ2A4EJm5aZY8uH28j1y+2TXk528EZ7finkJaUYoNqNrVzG/aw7mn14vKGkzIyMvLiMnMFTpqxdr01a96kAs+AQyOAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggMD2JqAQ3ClzviAAV0EfjAJxz7cZFpcwHK1RK+hD5bAIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCQWAFVgqMKXGLNw48me30G8RgE4eKhypwIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCw3QmoHSqjYgXi9RkQhKvYz5WjI4AAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAQIIEqAaXIOhSDhOvz4AgXCnorEIAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEENj+BQjCbf+fEWeIAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCBQigBBuFJwWIUAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIILD9CxCE2/4/I84QAQQQQAABBBBAAAEEEEAA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AggggAACCCCAAAIIIIAAAggggEB8BAjCxceVWRFAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBIkQBAuQdAcBgEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAID4CBOHi48qsCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCRIgCJcgaA6DAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCAQHwGCcPFxZVYEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAIEECRCESxA0h0EAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEIiPQJX4TFvxsy5buqLiT4IzQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQiLvADhuEa9S4QdzxOAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggEDFC9AateI/A84AAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEBgGwRiWhFu/uK1Ns/9lHcM6tOyvLuwPQIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAJeIGZBuJFj59so97M1o1XTdGvpfhgIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIlFcgZkG44MADXXU3BduiGaoep/CcHgnCRSPGNggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAkUFYh6EK6m6m9qmfvrDDB94239Ih9B5jAo94wkCCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAAC5RdILv8uW7fHhOnLbO26zTbRPSoUx0AAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAgFgIJC8Ip/JZeq5o/55GuHSoDAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgVgIJCQI9/vExb4aXL/uzax7x0axOG/mQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQMALVIm1w+c/zrTU1BSrVjXFjj2gu59+6cr11qh+Tevbval9+sMM3xr1hff+tKysnFgfnvkQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQT+YgIxrwhXJz3Nhd5q+LCbQm8ay1Zu8Mv0fP8hHXxVOG2jbRkIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIbItAzCvC7dKzubVsmu5boerE1BZ1masIt1NYS1SF4TTmL15rcxas9s/5hQACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggMDWCMQ8CBd+EhOnL7P5tdZaeq1qvi1q+DqeI4AAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIBALgZi3Rg1OalCflv7p2nWbfYW4YDmPCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCMRSIG5BOLVH7e7aoaoaXHhb1FiePHMhgAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgggEPPWqPMWrw2pKgAXhODmhy0PNgjfNljGIwIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAALlEYhZEK6VqwA3yh151Nj5/rE8J8G2CCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCGytQMyCcGqFOrBPy3KfhwJ02peBAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAwNYIxCwIp4MP2oog3NacNPsggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgggEAgkB094RAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQKAyChCE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QAABBBBAAAEEEEAAAQQQQAABBBBAAIFsIEBFuGzwELkFBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQCAnC4RFREScym4AEeGHpGKl8tnttpJ1PwcOipw4ke0ebbIM6IwAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAQE4QyJ1bJFeuMMmfTyR/3pxwx3HvkalR45pkiy0agitdIixb3As3gQACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgkLHDkqcvSY6WNqZ2kgLqc1pkbNaU+c+0UAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAIFsJ1CwgEg+UxbtWGS2u7Uk3RBBuCQx0QkBBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQyNoCGoY7dcqUhMuBjSBcDnzo3DICCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAghkT4ETJ7PnfSV2VwThEhNiPwIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAQJYWIAiXpR8PF4cAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIJCYAEG4xITYjwACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgggkKUFCMJl6cfDxSGAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCQmQBAuMSH2I4AAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIZGkBgnBZ+vFwcQgggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAokJEIRLTIj9CCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACWVqAIFyWfjxcHAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAQGICeRLrkJz9cxZuDtm9Q4sqdvvm7eGyyfwFN7c/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AAEEAiFAEC4QyuwDAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEDAbwIE4fxGy4YRQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQCIUAQLhDK7AMBBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQMBvAgTh/EbLhhFAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBAIhQBAuEMrsAwEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAwG8CBOH8RsuGEUAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEAiFAEC4QyuwDAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEDAbwIE4fxGy4YRQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQCIUAQLhDK7AMBBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQMBvAgTh/EbLhhFAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBAIhQBAuEMrsAwEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAwG8CBOH8RsuGEUAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEAiFAEC4QyuwDAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEDAbwIE4fxGy4YRQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQCIUAQLhDK7AMBBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQMBvAgTh/EbLhhFAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBAIhQBAuEMrsAwEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEE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wYzp80XPU18TatepLnffe3OK7H7ZOYcrvS9XoYz7GnlNq6byynNvi1aG026BDx08bF5nCttNX+71ytm3PocmT5huw3TnTbez2r2xvgarvXZn6jxndHl9zdTnrzZ93um6GTJmkEf79bbTPG+c56ZWg9Om918MGCjOa552navPzy3mMXnKPL7y5csjterUkBatm6W7LlTVZ/3aDbLSdDus10yD46XN76LOXdtLvvx5dbbblv+7WubNXmBfwwoVKmCu1VVmfKGd365jS6lWo4oddq5bWn+tc2EYQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQACBVCPgsyCcc8ZNTHU3DbYlpGn1OA3P6T1BuISIsYwKnDdhmOPHTlgMDWU4ITidoOGKFq2vlt+GR3SlqOEl/fBeA3F2vqkk5wThNMTkTO/aPSK4pgGMhf8stcvqjVaW27tnv6xauVaeNl2tatemGvjR4IWzri4XagIeB/YftIGR3bv2ShcT6tFl163Z4C5XxVS70qZdDWo7f/68vdeblcvXyLDBEaEhZ6KGDFaacNWzL/aVvCbI4exv7Zr/bBBOK98521q1Yo1oQG7r5u3ucm3at3A2labuz549557jzqER19U5QQ2q6WOj39MPS5gJ7zhmzr0udyok1AYg9+3dL/c9eIdddbOx1KCPBmicFnLylLt+pcrlZYux9Zyvw874UhP6ch5zzvonjp+U/0wXvXf3vlVq1qrmTE719xPGT3fPodet3eS3X/6y4xp0e/KZh9x5B/Yfsl0U64S33/jMnX7k6DF3ujNRuzLWcFmhwgXdeTVrVZWM5jmk8zybjuvzXNtH738jE03gybMdOnRE5s9dLD8OHmCCVRFhuPff+VKmTJ7tLqbXbY95Xs804bbhv34VK9i3betO+/wNN6XhnnnyDVljgrFO0+Cerjt92lz5aehnUtSEJ9NqU+ccJuyrQThtmTNntvfxvV5pwEpDuZ9++I1d3rnZaex2Dh1lQqW7pLsJAesyznNTw8VO27J5mw0dOuMx77VanbOeM0/Hy1csa5/fH77zhX2NdubtM6/XGo7W437i2UfcULMzPy3fL5i/xA30OuepYeIVJnTdp9/9Uq58GTt5zsx/ZNyYSc4issNcK+f3i07UdbSlp9c6e8LcIIAAAggggAACCCCAAAIIIIAAAggggAACCCCA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CCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggEB8AgTh4hNiPgIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAQIoWIAiXoi8PB4cAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIBCfAEG4+ISYjwACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgggkKIFCMKl6MvDwSGAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCMQnQBAuPiHmI4AAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIpGgBgnAp+vJwcAgggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAvEJEISLT4j5CCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACKVqAIFyKvjwcHAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAQHwCBOHiE2I+AggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIBAihYITtFHx8GlSoGTp1LlYXPQCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAulIoEDedHSy6eBUCcKlg4sc6FMsVzIo0LtkfwgggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIJCOBegaNR1ffE4dAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEgLAgTh0sJV5BwQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgXQsQBAuHV98Th0BBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQSAsCBOHSwlXkHBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQACBdCxAEC4dX3xOHQEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAA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1TmSXSj2BHjeiT3TUClC6J6cAS+eFC9RLDmzCJn22c4/ZOG4kwRIgARIgARIgARIgARIIM0ToIAtzTchK5BIAjEXwq0Sq28IELhB+OYMdpsVv0Ew16HRLc4o/E4CJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACqZYA3HGu+WetidbyGo5jIAESSD4CYhcltgHuTyF0g7U3/IcYzgrisA9uUrG9pMRBsPtiWwqmRgIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAKxJ1ClRkUTragN8XEcAwmQQPIRiLlFOGv1DUXeEGcRzlqAC7Uv+arIlEmABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEggNgQgaruoLa27xYYmUyGB2BFId+DAgTOxS85n4Q0uT214pPqVaiEOv2H9Da5TrRU4ax3Oxo3V54H9h0yxC4rEKrk0mc6uvWdMgbzp0mTZWWgSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIIHEEThfdUMxF8JZ/BC7WUtwdpv9DLXPxknKJ4VwxpyvHTop/YbHkgAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkEBaJ3C+6obSJ1fDBRPBIb9Q+5KrPEyXBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEjg3CSQbEK4cxMXa0UCJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJJDaCFAIl9pahOUhARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARKIigCFcFHhYmQSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIIHURoBCuNTWIiwPCZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZBAVAQohIsKFyOTAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmkNgIUwqW2FmF5SIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAEoiJAIVxUuBiZBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEggtRGgEC61tQjLQwIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkEBUBCuGiwsXIJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACqY0AhXCprUVYHhIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIggagIZIwqNiOTQAQE1m48E0EsRiEBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiCBs0egbIl0Zy9z5hxzAhTCxRwpE+QkwT5AAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiSQkgToGjUlaTMvEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiCBmBOgEC7mSJkgCZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZBAShKgEC4laTMvEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiCBmBOgEC7mSJkgCZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZBAShKgEC4laTMvEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiCBmBOgEC7mSJkgCZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZBAShKgEC4laTMvEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiCBmBOgEC7mSJkgCZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZBAShKgEC4laTMvEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiCBmBOgEC7mSJkgCZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZBAShKgEC4laTMvEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiCBmBOgEC7mSJkgCZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZBAShLI6JXZpu3pzS//pDfrt6Q3ew+mM6dPe8VKuW3pRa6XN+cZU6rYaXPVxadN8cJnuUApV3XmRAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkEIZAAiHce19kND/8mSHMYSm7G0K83fvTyf8MWrbrLjtlqt12MmULwdxIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARSJYEA16ivv58p1YngvKhBqIeyMpAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZCA3yIcLMGt3RSgi0vVdFBWlJmW4VJ1M7FwJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJJCmCaz5Z61ZvnSFwWc0YfiY/tFEZ1wSIIEkElAh3Kbt6dOEJTh3XWEZ7qqLT5vihcV3KgMJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJxJhAYkRwMS5CVMl1adcnqvjBIlPIF4wMt6dWAiqE++WftGMJzg0SZacQzk2Fv0mABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiA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iIAIiMC/h4AEbP+etlBJKpZAuQjhKDKit3G/mJuVIssmbGN532HzMkKkZksb9qVPERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABEfg3ECAc5w/fj3Ol9bzGdjIREIElR6DchHAUUYK2JddQ2rMIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiMDSJ9CiVXPnnnJeDFdoaRDB+e0K3UDpREAESk2gXIVwheZ+0mHVMjzCEVY1VxjVQverdCIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiKwJAkgatugq7y7LUnG2rcIlIVAhQvh9t6xqhfB4T1uvP1he+1QxYdVlUe5sjShthEBERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERCB5ZtAhQnh1ltrBYcnuGAvvbPAh1JlOUI4mQiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiUhUCFKNAQvWGI3viTiYAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiEB5ESh20VZee0zYDyFP+w6b59cQGhUPcOs1QYO3sOgzYSMtEgEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREIECCFSIEC5ajnG/LPRCOMRw0ZCoiOVkIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIlBaAhUvhDPB20vvLswoJ+I4mQiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiUhUCFC+Eo5IvvLChLWbWNCIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACJQgUKXEEi0QAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQgUpEQEK4StRYKqoIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiEBJAhLClWSiJSIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgApWIgIRwlaixVFQREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREIGSBCSEK8lES0RABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABCoRAQnhKlFjqagiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIlCVQruUhLRGDxCIz7ZdHi7UBbi4AIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiMASJrBekxWWcA7afUUS8EK4KuYXbuHCisy2/PKi7LJ/FwENEv+u9lBpREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAERGBZJ+BlZHVrV14PXpW57Mt651L9REAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAERKAiCHghXNPGldQdnBGqzGWviAZWHiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiKwrBPwQrgtNqy8QrjKXPZlvXOpfiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiJQEQS8EG6t1Re6bTZZUBH5lWselJmyy0RABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABJZfAl4IR/X332W+W2+tyiMqo6yUWSYCIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIrB8E0gL4cDQdr95lcIzHJ7gKKtMBERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABKrFEeBlbYsNF7rPv6/ifppQxf09fQW3cCk7iqticr26tRe5po0X+rIpHGq81fRbBERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABJZfAiWEcKBAaCax2fLbKVRzERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABEahMBDJCo1amgqusIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIgABCeHUD0RABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABCo1AQnhKnXzqfAiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAISwqkPiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIVGoCEsJV6uZT4UVABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABCSEUx8QAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQARGo1AQkhKvUzafCi4AIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIVBMCERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERCBZAI/fD/OPffUy47P0tjgoQNKk1xpRUAEFpOAhHCLCVCbi4AIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAILLsEyiKCW5o0zu3Wr1yyl5CvXDBqJxVIQEK4CoStrERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABCoXgeAJTsKwim23IOgT94rlXplzq1KZC6+yi8CyQODZ1/5xX343e6lU5avvZ7unX/lnqeS9LGa6NNvy9fenu/c/m7ksYi11nRYsWOSeeOkf9+NPcwradvwvc336efMWFZReiURABERABP4dBD587xP32stvZRRm/vz57r13PnK3jbjLPTT6cffBex+76dNmZKSpzD8WLFjgnnjsWffjD+MrczUqvOxJfaXCC1EOGU6c8Lu7/56H3dNPPF8Oe1u+dzFt2nR/LP0+cdJSAfHGq2/78WmpZL6MZTp+3E++LefNm1fhNQtj8rgf/lfheS9LGf4xabJvw3+mTiuoWs89/ZL78vOvC0qrRCIgAiIgAiKwpAmE89jUvzXHvqRZa/+FE/jqy29131g4LqUUAREQAREQARFYBgnII9wy2KiqUuUiMOqhv9wu29Vym21Uo8IL/sb7M9yLb01zLfdctcLzXhYzXJpt+cDYv13dVau67besuSyiLVWd5sxd5O5+5E93WMu6bv2mK+Xd9pOvZrn7x/7ldt++lltxxap50yuBCIjAskPg5Rded/fcOdr98vNvboedt3N77bO72735zq5KlSpu4cJF7qT2nV3zfXZzJ57SbrEqvWjRIscbS/u33tu1aLmX39frr7zt7hk1xl034gqfX1Kaxco0YeNZs2a744/q5I7rcJQ7+NBWCSlKt4gyL1y40FWtWrax85Yb73SzZs52XXucWrqMi1I//sjT7qf//ezbLOzgjJPPdt9+84PbYMN1HfX97deJ7rze3Vzrg1qEJEv0E1EE/WeFFVZYIvnMmzvPDb70Wtele0e3/gbrlsjj5//94s7s1Mv16tfd7bjz9iXWL68LkvpKPhb075eef819/NFn7tuvv3fDbrrCrhNWLLFZ/FgukaCABYw3ixYVH0tJ489br7/rzj9ngKtZc2W3/wH7uJYH7FvAnnMn4fh1bgXrs6XvrwjILrDy9Lukp1tn3bVzZ/QvXDt50hR/LF06pJ9rtMbqFV7CUSPvd/Ub1HfbNdumwvNe1jL89KMv3FVXXO/PBUnH6JKs75w5c30/OvPs09x6G6yzJLMq1b7j4xLCsdH3PuKvd5qu28Qdd+JRbtc9diqxz4q4FimRqS0Y9+P/PMeNNtnArVpnlaQkGcuuvuIGd9AhLd1mW/wnY/nSKn9GIfRDBERABERgqRCYMWOm4/z31Njn7P7vTLfmWo3T5UAs/8A9j3hR0JTJf7o99trV7d1id7fDTtul08S/vPrSG/5+/afxv7it/ruFnyvYa9/dXPXq1eNJ3fhxP6fOYxuv7+rULTnHfu+oB93zz7yU3m6lGjXczrs1c3vvu4dbq0lxOdMJ9EUEjAAvc10/9OZEFiecfIzvx4krixa+/spb7u47Rpf6vrHQ++CkvHMdh6Qv9JqUtPPmzXf33TXGjunn/bxRczv+9tlvT7fFlpuy2h9zX5vYL8lI1+74I0us+uSjz921V95YYnnnbh3dts229sv7977czzNFE61px+nFl/WOLirxfdhVI9wXn3/lrr3x8hLjRN9eA91vv0xwZ513httiq81KbMtLNZdcONjVql3Lb18igRaIgAj86wngIS5fuFSeCezXKvVc4F9fIRVQBJYRAhLCLSMNqWqIgAiIgAiIgAiIgAgUTgCPWhf1vsyLhdocfoD77JMv3IUXDHI8zD7syIO8MOS/22/lmpaDwOOzT75077/7kTv3gjPTBcRb2YYbr+dFUyxMSpNOXE5fqlWr5kUX5TXZ/s6b77teZ/d3t919XaIoK1exEandNfIB1+/i83IlK9U62hQRXK++3f1kLw85Dj/w+FLtY3ES42HqoBZH+8nNNoe1XpxdlXlbJk6322Eb16BhgzLvQxs6N3v2HDfwoiHe4+BOuzZzO++6Q/pYjfOJH8vx9YX8vnn4SPfog0+6J18c7ZMjTIuPP88+9ZI90FvD3Xn/jY5juTysU4ezHJP6Fw3sVerdPWvCGo7jpus0KfW22kAERGDJEoiOS++89b6NZ1d6gfiJHdu7xx9+yvU+7xI3/NYr3aabb5JRkIq4FsnIsJx/VPbylzMO7U4EREAElgsCiNIRSEc9Js+fvyCj7jcOu909+MBj9vB5bxOhbOq4rj6v+4WOFyJ22W2HjLT8ePXlN12/8we5bbbd0nXqcpL77NMv3aABV7kf7SH36WeeXCJ9vgVTpvzpfvh+vO2rg0/6k728dO+dY9ytN45y9zx4c4ZoL9++tH75IYCojH5z6JEHukaNGmZUfK0ma2b8Lq8fpbkPjuZZyHFYmmtS9v3U48+5W2+6yx18WCu38SYb2nH7ont49Fg3YuQ1buP/bOiPXT6j9vuESV7Aeljbg6KL0995CRamRx5ziL0OVmx16tVJ/6Cc666/jgnuil+4qLdavfT6pC94g2SMwd5+470SIsWf//erCWZ/co/YPX+SEO5JE/BSLl56k4mACFROAvlEcNQKMTC2NMVwZQ0pGkKS+gronwhUIgLlM4NeiSqsoi4fBKZOW+D+nLrANVljRbditdRl7YyZC91cC32I16zgpGO6LSMcYnTZ7DkL3a8T57mma1Y3rw/Fl8Qsx9NUnVWqut8nz3ezZi/0aczph7fffp/natSo4larU+wVZb6FaJw2faHfP2Wa/Od8t7btd6XqxfvN1iITJs0zzxDONV59xXR542nZJ3VZtXZxnn//gyeS4mULzMPEz7/Ncytb2Ro1qOZYX2OlFewvMzIydaKOTRqv6Krm8Arxl3GtuXIVN8fSTv5rvve49c/0BX6bWjWL9xnNJ8ruz7+N3ZxFbq1GJT1qxOvH7yQOhdSbbUM/WHet6hkMo+UptC3ZZq61/yrGetKUecZqkVu7cXXPmryyGW047uc5rm6dahl9I56+kDoV0pak+WWC9UVrX9o7l8Xbcr21V/L9g/YNfZT9/TNtoatdq4o/lqbNsP5lnY40v1qfr21tzvFTiIVta9RYwR9j5NGoQaofkM9P1k8bN6xWom+ybzj+9Ntcn2/D1UrWK8qGMiVZoW2RtK2WiYAIVD4Cs02gMXuOjb91iye0CJuJWGmVVWrbm6UP+Ummiy+/wL+tecDB+7lPP/7C4SUOIRx24snt3EorZb7xzduxTFzXqlXTxEb1M8Aw+Tff3jZHjBQ1JuWb7bSteR1KTV7+9usE9+H7n7hTOh2XThZP89dff/s88Az1q03WrW7bUu5g1I/8Vlm1tuMt9dXq10t7UeGN959som31Rg0ytllxxWquU9cOdr2S6YWWPP5nk3J1bfKv3mp1QxbpT7xGkceaTdZIv9lKuNF//kmFMGPSj0lamASD87R/pnvhTlgW/XzNHi4wybfL7jv6xaTHk1qNGiv5N2WrG/fgpQkva0wcrrFmI78+up/wfebMWY63e7F11mvq2zmsi39ma0PqZH65MpjRDnAPwqPAPf6mPxPGf//5t8/Ks7Hwbni18fWy82Y18ySG97p1rWzBYxEetSjLGo0bxYvof9O+E8yjHWLMXB67ECPNnj3bl5Nyde5+iqtdO9VXAldY4x2vVu2aGcdEyJhwdH/8McU1WTs1oT5r1qzEdCE9n5SPieTG1i5hwpZ+MHfuXL9t8Io3Y/oMuwafl7EMXr/aG9FN11krzYN98tb39OnTXZ06q/o+NWniH65J07XSx+Hff091M6bPzPCcEI7rOnXqWJ+b5iZTj8g27DebUe8/p/zl1rJ6c3wEe/ShJ70IbuDgvm7Xoj4a1kU/k45l1merX+g/0eN2oXmCmzljlqMP099q1qzp6xvGH47PqVOnuo8//MyL42hT2jeU1x8fP/1q3sVWy+i70XJSz+nWDgjpsMBsrnkYpKzkC3OOQYx++b/xP1vbrpFm71cU/WNMeOyhp/xYGdo5rJ/w2+/pfk2/Je3Uqf/4cWfllVNjD2Vm/FjZxqIaRcvYPtsxEfpxacYHtsFbJWP4z8Zn5ZVXTo/BoaxJn0n9Op6u0Dr5flA0fnOMUOdVV10lw4smLDiOGJfDOSKeH79Dm7E94bfgvlr91dLHS2g7yj9z5kxXr15qLA99ivW/GAeEj/HzWlJ+SeeFQuudq09SHs4V/txmY0DD1et7JpQBXox566zHmFd8Pb8k2zLwqm3n7TA2Fy8rPs4KGSNDeze0cy/tlM2SxoGVrX+EsS/UPZSjtG0ZH5cQ2XLs33znMH8uOfSIA1yb/du5sY8+U0IIl/NapMD2CvXmXPj773+4tZuumb52COv4jPKKLo9+h0H8PBNdH/8eL398vX6LgAiIgAgsewTm2D3/+HH/c93PPd1fgw4dkuntiXtjBCp4Qr3gwh4ewJ7mEa5Ny3bmQe6tRCHcI2Oe8Pc3g4de7K+5EeJwv4yArlAhHNcvXL+F8zgZH33s4ekGwPM8Yrx33vrAHXrEgenl+iICcQL7t9rH/WezjeKLM37H78EyVtqP3+2+mjkD7vdzefQv9D44vv98xyHpC7km5d6cuS3uJ26/+W5/fPY4r7PPDg+Obduc6N4yoRkCuCTvxiOuH+mP3X32a+634f6L+7Awn8PLkvzu3O0Uvz7+j/kI7stbHbiv9z4cX5/t90svvOZXrW3zEE889lwJIVzY7vlnXnZdzuqYMdfCNfETdl0uEwERqNwE8AiHZROaBSHZv0EMV7lJq/QiUDoCxbP9pdtOqUXgX0lg5qyF7pLrJrrxv8z15UPQdeaJDV2zrWu6l9+Z7sMlnnjEam6/3Vd1iLc69/3F1TPh2tX91nL2DMrdfO8U99p709N1++/mNd05HVf3Iqo7H/rTvfbuDBOmVXO/mFAOQyjX5biG7ub7J7vpMwgt5Ny6Taq7Czqv4QVCH3w20w29/Q+34Torue//N8ev59/pxzZwuzcrfpidXmFfxlnZB90wMb2/VU1417frGonCsetHTXaffzPLXd5rTS/K+vTrWe6y4b+7PXes7U5r18D9YHkOvP53L3AjD8oGmzYt6rijDix+k6Xn5b+ZWC7FDAFVvzPX8Gmj5eI7fDv3+9k1rF/N/TFlvhe/jbp6HXfeZb/58lHOYGf0/dk136m2O/WYBu6uh/9yrxj/jddfyX31/WyfhH2cd2ojt5aJFZMsF4d89UYEOfim393/fk3ViXY6xOp86P6pB0JlactQh9VNXIY4D0MMRp3XMaFdkhF29o4H//RiS9b/Z4Ma7rzTVk8UeuWrUyFt+ZuVq2Ovn9PtjeiS8iUJw5Laclj/Jr59jz6onjt435RwZPzPc13fqya4rnYc7fzfWq734AluBXsuhSj0HxNihnr17tzIbqRzCzzPv2KCT0/eCAsxytjKQvPeev8Uh5gN29VClHa24yrYc69Pc3dZqFNEqxh9p1enRl4kyu8ff5pjx31xPw/iOtYFK01bhG30KQIiULkJ4K3oqsuvd3ePuTktmnnmyRcsfMIwN+r+G20C+yT/F0KbIPxgQjA8gKb2xxx2sp/8CpPdz9mk1Q3X3OJFI6wnJFe/i89NC5l6n3ux++G7ce7hp+5itTdEQE/am6xRj0tMoDNBFjyxxNMw8XZoq2O9tzreRg3W/oQjXcfTT/A/CatHmIuNLYwYXtCYHDzo0JZu+LW3ugcs/FkwBH5de5zmBWRMJh7Ssr3fB/vCXrTQj8OuvCldJybke/XpnhanPDxmrLv5hjv8ZCAThvu2bO5OPf1E16fnJV6Ywz7O6nyB23f/5q5P/3O8QOMKC9353tsfssoLv44/6WgLPbOH/x3+Pfbw0z68I8IW7Owuvf3nX39N9fvgx/Y7/Ncd2GZ/d8XAoT5/lvHmbtKk5fXX3GwTjs+SxJ1+Ug/PZdCVF/rf0X+52nD4sFvdm6+9m24/3sg9+dgu7pzzu/pysJ8rrU998dlX9ub+LdHdWsi5h/3byiy8efgd1jYPeO9e53br64VbTLjSrrfffb2dz+Z5b4QI0zDCuNJGeBzAaKcrL7vO9xt+N1y9gT0cOcAdc9wR/MwwxGRdOp7rQ/AMszC7hHvsYCF9g3cD8q9SpaoJrWb6N5DZmDbuO+Bc398Ro9x03W3u/nseTu932+239kLNl98em14W/3LT9bc7QvwEO/WME3zoEYSkhG7tfdHZDpf/PAA6qk0HE/M1cdffPMQ/nGJyOt5HYYyw58P3P3Y9z7rIT2q/8erbYffecyCTxm9aeFAMZj37nuXbGVEpD5GYCI9uc8nlfdxue+6U3kf0C21ByJNwfNG3+w+6wDXb8b9ejHfHLff4hw07mICVhwaIdaJjQ9hX/FjmYVeu+sWP2+7nnO6uGTI87M4f96G/hfHnEHswxnfsxede9X+XWd/GUx0TaHh6Cobgtqcdvw1MFIf9ZeLMvr0udZ+bFwuMByiERKxt4s5up/fyy3gznfHmjvuG+xCn9931oLv/7ofTYwLHdrdzOmWI7BDlIcZqYeNBsPE//mR5DfSiM5Yh+rx0SF8v1up8yjm+v+E9ErERQmSOk1APQs/ioTPbMVGW8YG+v3DBQivnlHRdCBfc75LzMkS7ofx8ZuvX0TR8R0CYr06MrQP6XJ7eFG8j9N/ht13lNt1sY7983A/j3dGHnpwx5vW/tFcJMTWJQz/HgwDtSSjvffff03v2GnnPDea1oKnf55OPP+t4ADz2uftdlapVfNtyzL9rD1np9/R1wgQde2Jbnz7pX7bzAjfF+eqdq09yrqOv0U/DOYL8KQsPp0bacYfxwPiMbif7MYTfS7ItEd6d2O4Mx7kyeG3lXP7l519774uIDQsZI1987jULs3QTxfXWzsbrjjYuMq7FLT4OcP6u36BeubVlfFziGN/exrYgqOYYxHPoODtmoxa/Filre7HdRdb3o20cvO2G/F558Q3vhTf8joc4ZXmhx2PYR7z8Ybk+RUAEREAElm0CiM9vvO1qX0nOL3Hz120metlmu9S9FutXsW24JkIIn2SEVTz8qIO9CC6s52UC7tMKMa75LjhngHkp38dfmydtE15OyyVKStpOy0QgSiDbPVg0NPA5Z/b1EQrYjrkFRBrcq8UNEVih98HxbfMdh6TPd036uc2zMLfBNTnX5jeZ57datYo9pIVr2fAZLwMvYdwzaow78ZR2fv6LF/QO3u8Yf0/B/AQ2eXLq5T/m//62uSdeBo1er/9tL+1gDRvW9y/mVeVlzciLW35lwj88Lu/efGe30y7N/HwI98qwjlqYZ3nO5gOZ1wrGS6Lcp3GP9MWnX4XF+hQBEViGCfybxHDxkK4bbLieW9/mXJem17pluOlVtaVAoPg126WQubIUgfImMPD6id5LFeKr3iZGQ7R07cg/vKisdfNVvehm1EN/+d8jx/zphTdnnbK6F3Q9b2IbRHCIpa7u28R/fvTFTPfh5zPTxUSog3Bn0HlruhMOX80Lc66+bZLbYuOV3cU9GrsjW9f1QrN3PpqR3oYv00wkd2G3NdzJbet78dTwuyZ7b2UZiewHXsEuvnai997W6/RGrvPxDb3nuaGWR5J1Pq6BLzv7w/vcDfaJOIuy2fW8G3zzJF9GykX54l7gwj7r1K7i1x/Rqq5Pf9UtyfmF9IjgENL17LR6WJT3E3bz5y9y/c9q7Dq1b+CFdC+9nfIkE984H4dc9WZft9w32YvgeljbDrlgLbfZhjXc6Cf/tnYonrAoS1v6bcxj3iVnN3YH7l3HCwOvujWZ1effzrZyTLG+UcOzbXtAPff1D7PdmKdSN1TxOueqU6FticBs391W8fkhtETceN9jf8WzyvhdlrZkm522qeUGnrumF5VSry++SwkcM3ae8AOPgPSzS23bUMYR9052bQ9M9dHttqjp3njfvAeYh0Ls4y9NNDB6imtq3vcQaJ53WiPvtW7QDXgbSXmKG1LUz+mT9HPErVErbVtEt9V3ERCByktgj7128YXnLe9gL9vEOEKQtS2UHw/a+ZtsAiUm3IZdNcILOLK9jY23sYEXDjHx2sZ+on3o8Mu85xrEG4iJMMJhdrCwY1F75aXg+WwHv5jJc96EPfjQVukJt3iasD3hWnkLnbwQSSF8++C9j8Nq/4lXOsQku+yxo7vHwqsgMDqq3aHurtEjfIhQxGF33JoSF2RsaD+oN0KNnXdr5m696zr/Fj1CpjH3p0I6IBJCULHbnjubJ5mhPuQnXqBGDB/p+l96fnpSnzIilMFuun6kn7y77ubBfp9MLA7oe0VaiEKan82jHkKOlq334WfaEPTBb+S9N7i2NjFIOFn4nmEPLigforjRVr9Jv09ObxO+dOp6kuvSvaP/ecMtQ9wVNrkbt3xtuOPO2/lyUj7szdff8Z+vvZzqQ0yWvv/OR4lvHh9+VBsvcmODk0871o16oFgQgTeqg61vXDVsoBdNEpIOz1jU6dZRw7xA6BYLixOM8B+IJ9kPLFqYEGmEiRFfMmFN1Jhc7X7G+W7lmjXclcMuyRAqRdMh6EAIg1iGSWHa+MvPv/FJXn/1LS+CQ0QGNwSbCG5yGX0MERyCRIRNeEigfISka31QCy9gJDwRE9G3jbjLT+r26nOWrydiNranrR54dKT/pI/G80TQQJ+jXkwg04eYHCaUH/2dN97HPvp0RjHxTEiYFMLt4v0IsSZenJKM/SG+oh9T7w03Xt9deP6lvsyTzIMRef0+4Q/XYvdD3VGHdHAH7ntUWoQX9pd0LBdav3Dc7maT5WPG3pl+23zM43d4UWnIg0+8hLGc8QpRGt+3bba196iHCI4HbAgzYYXwhEl4jHHp/HP6e4+ShAuGZ13bB/2Pt+zZD4JcxGF8xzvAN19952687na31767+32yHXUaddt9fp/h39NPvODfzg9eMeF8bvd+/qHisJuu8EJM2mPIoOv8Q4heJlrkOHjQxhbaDhEcoakQ81HOfMcE+ZZlfAjbUHf6KWPa/Xc/FKqR8ZmrX2cktB8IeHPVCa+EjK0pMWA/x3hI/eOG8I9QR4wFjNuMeTy8yWVTzStiv0t6uhNOOSZXsox1HPMILMkHAdQtN97pvXFlJCr6keu8kK/eCHNz9cmQ3/ff/OjHQ45XHvgQJpvz4uVXX+SPx8Z2/OIBImpLqi0REJ7S6XgvpGashBXt0OWsU73X10LHSM5piG8ZTxA90o7vvZMShEfrEf0exgHO34VavrZMGpfoZ4wfUcNbLueQqGW7Filte114wWX+OqDb2Z3cvQ/d6h/0IRIkTBTGdReh6BE0D7KQdBwf08xbR9RKczyG7bKVP6zXpwiIgAiIwPJJAE+0iE422niDNIC33njXX+9zLZpkiHCiXqF5MYZz8O7NU3MMSduEZR++94kXwXF/haAnKrJhHX+EMOflIe5zdrN0MhHIRWD+/Hn2vKb4Lwgyc92DRffHnAz3AVybcZ992cUp4Wg0Dd8LvQ+Ob1fo73zXpE1tno6XKMMLgkQ4INoC9xhcR15uL0giYN27xZ6JWT7x2DN++UGHtPSfvPR6WucOrtUB+6bT8+Ig9xWHtT7OHdr6WHfAPm3dC8++kl6PRzqMFyBZ13KvI1yvs/tnzGelExd9+e7bH3xY0/1a7m2e4FJjRBC5RNNSH+4TeNmUuaVgD5sHSl52QnwiEwERWH4IME7wEtvSMgRweKkjfDzfGYN4odkL46xsrOP70jbKl4sT60gjE4FsBCSEy0ZGyysdAcKOjjPvVfvvsar3RLa5CZCOPcRcKdvDlY+/mmk3ns5179DQ/x5wrV1Am1gNMdN65iUN22KTlR3iM0RjhJQ8vGVdLzJ79d3pGSy6mDgND2Dk06BeNZ8G72sbmNc3RHR4H3vv02LxHBuf1q6+22T9Gm6fXVdx7dukPLG983FmGtIhusNTVsejG7it/rOy23W7Wm7vnVfxHuj+/HuB9/6GBzj+CBNJmNaOx9T34rveQyZ4D114wEPwhgc6PHbttXNtXy7K1+PkZOHaueaZjfWHWZ13a1bLhzwl7CVeyEJ+wZMb5WxpHrzwKgez0hie8jZadyW3xw613ZoWGvWDz2bZwy97EF9Up1CvXBwIuZqr3pQHb2YIorbfsqbPhzbF3vskk3lZ2rJbh9V9ONh21o47mhgMUVjwEOczKfr3whvTfN/oekJDz/aQ/ep4D2avm8gLQV60zojDctWp0LZEpNnu4Ho+P7wOrla3mnvt/emJjENZy9KWtB2eFTl2jj4oxTYqGA37TvrcoOlKrvVeq3qPg8cdlvJWgsfEg/ap48t9tJUfe/+zVFvBEePYxKPeNput7BC1Epb3M+s33423UHTWJxAA0ifpx2ed3NBvE/7laouQRp8iIALLHgEe8jL5HCa1CImASGT/mPhqyKBh/q1TJqO54QsTV3EiYSKrt3k9Q0y39X+3sNAmh7mvv/zOREWptzZ5AxSxRdQee/hJd4AJuILnuQ/f/9RPovGWebB4mrD8RBOF4aGKvPqYBy8Mj1BRQxDBBD4eoB558AnvpQ4PdohaWtqEHyIXREt4qorb80+/7CcSzzRvZDyQPuTwA9xW22zuhS+kDcIrJvB5cAAfPMkx4UoIzrr2hyGqCWFbJ06Y5CcrmzZt4vd5Xu8z3fn9elhY7eLbjmeeetELRDbZdCO/ffjHpCBCKsQjJ5ycEnnQhgjgKF+744/wSZPEBeQfwpXWb1A/I9RE2H++NvyveULDPrEQudhrJmJEKIR4BlEXYQUJ60dIjokTfvdCQkQj/OEtrMHq9f12eBggTGUwJnI7dengxUsrVq/mPecNuvIiX6cNNlrP6tfSCwODKOEpE8HRbsd1ONqzONlC6PJ7ooVSDfanefrqYV705ttb21eawC6aX0gTPskfARyCjxCOJwgq00zsDWk88iCYw5NRMLzihTp+9eW3fvEjNnGLeIUHSutvsK6fXGbFq/YmMw96zjm/i3+w1M+EZQ+PHuvwFhe8VW259eYOodQRR7fxoXsPa3uQ74OvvPRGyNJ/nm7CRvrcds22sWN2b78MQSReFOnve1g4I/pv1BDXESIF74OnnnGiX0XbxQ0RBhPpR7Y7xO25966+3ggwEb998lHK01nYBlHdgMsusLI29A+0EDgFSzqWC61f9Ljl2GWCn0l9hDHBS2LIx/ctW17NQrcioCQN4wlhbhHJ4k0Q4R+s8BIW2nTCbxP9+HRU+0P9WADPribuoZ15yJHaz4peSMl3vFEQdhbD4wUhexlDqP+Ou2wfiuO9/D1rx3Drg/ZLL0PISP/Fi9eWW2/mJ/gPMS+GLEcQx7hyeNuDvcgOoRSiHELCYAsXLsh7TJCuLOMDfYUxmbrjdQtOT419nt2VsFz9On68E74mV52CeLZrj1N9ubfYctNET5Z4veR4Y3xj3MbD55MWSgdPiuG44zM8kKHQCNr2NqFikheHEpUqWoColuOCfI4w0S725WdflxjHqFe+80Kueufrk0XF8WM5Yk6O17bHHOoXtzevcIxz9E9E5TwoC6JkEizJtuRcDvsrBl7rxd+Mb4RDwsLxhBeJpDHSJ7J/eGvFAyVpzi8Ku4aXuFxtGR0Hwn7yfWZry7Bd0rjEurhHS453zh9Ry3Ytwrm30PYivDFCQsThiDwJnc05AAsi+1eLxnvEhjvbeT/p+Mh1PEbLHP2erfzRNPouAiIgAiIgApyreMGNe1s8NOUzvGRd3G+wvy9say8u5LIv7PqqR9fefr/cR8S9vbGOPwTivCTB/Xe91TLF6rn2r3XLJ4Eup57nX9DiJS3++ve5woPIdw8WaPXs083fB3Bt1ubw1v4e8bdfU1FbQho+w3wE33PdB7O+rJbrmhSvciedemw6okPIo/0RHb0Yjfm8znbPv5bdq8YN7294HUfEGp0bOea4w/11bEjPfT3X6x1Obe+FgYgEOb6Z98DwqM0c0B4meuUlQV7eYu7g2iE3+fVJ/5558kV/L7/jLtv5eTHmVMZaqNPwwmzYZs5si9Jk/LnP4SVN7McfxntP1G3snnXunLkhqT5FQASWEwLMN+QSeS1JDFHxWKeuHVyLVs19dnwPFkRy4XdFfyLEC8K8JE4sg2FIV9HlU36Vg0C1ylFMlVIE8hP4dtwcn+iZV/9xLxd5GkNkhU0q8i7VePUVHZ65HnjiL1d31arm1az4ZrOJhej8btxsN3jEJB++M4RunF/sRMzvKxrdpMFq1bwntpWqm8quyOrUtvBT5pkralGXzVtvVtNWTXGTpsyLJvHfv/kxVYdrRxY/6Jwzd5Ff98vEuT7sadgIT2MIyxCVvfz2dO9tjNCVCOiwUOctI2I1iziTaIj3guHdjjCmbI8nLgRHGGFmb7p0bf+9Vs3ih9l+QYH/opzgT4jZWbMXukvNu1cw6oWAC0vi8IcJHtk2W73ZrqkJwginSQjUH3+amw65OX9BiiVpsLK0ZXSbrTdd2b3z8QxHmehbUfvmx9k+3zP7/5JePGvWIr/sS/OeRsjcYMeY+AshWLY6FdqWK0XakX1vvlEN7+WQMMBxxt1PSokiy9KWNWsUtz+iS/rGjFifD3WLf5pOIG2EbGXbKLu6Ju7EwvH3jR2ThDqNlhOB46PPTXW/Wv8Jy+k3wdhn1HK1RTSdvouACCx7BBDQ9LOwgEzyMSmN7WkCmqjxcJu3Qt9+830fhotJM0RLcWOiirc0eaM82PY7buvcsNvcLz//5teF5eGTMBUI5c7u1SUsMpHDsz5kAuIxLClNSFytWmpM5DdiGSbk8KYUtSCaIQQiE5dM/EVtp12390Iu3mJfo3Fq7A/r8TiH+KfjCd3CIhdCeLIAZogPVjQBTrAQmjX8jn926NjOnd21jzt4/2O8WAphDgKMUE7eXn7i0Wf9m77xbatG6huEQWuZcCVYHRM3YnPmpK6XwvJCPwtpQ0QePMRHgMibwniqITwHy2bMmOGzIs0dt95rHvhGp7MmrGRo0/TCoi/UJRjh/xqaYA4hEfskxGSw+XbRCX/EdnhtCsYDFDwlYbNnzfafIW8EXAgNclk0f9oBwdUMC5WK/WZvVyPsZFmwqpELxsGXDvV9mHWkue+R2/zELWFEjmt7WtjEfyIWwhBQdT/XQn4OHu4n3I9qf5hfzj8mrb8zrnhAeNcmssNk+4LYBTecgoWQImusUdx/YU3fjVrVasUXGYhHMfp93L4zT3DY6HsecYgOsfBWPd4G6xWJQy6wsYF+gHHc06/fM4+AQSATP5ZJV2j9wvHANmU1xL6/VP3V3WVhkgl7GSbvA6/vv/3R73qbbbdKZ0H58FiVzbbcJiViu+7qEd5zGt4IEe0i2AyGQJa+EBXHfW2e5LDLL74mJPPiUX5MmvSHF6mecvrxXiyJ56wBg853POj4f3v3Am9rPecP/CkplIqQKJVckv+Qexn+GlOjXCb8ZZjM5Doj1y6US0aiRJIkKaWUIpV7ynUMk5oMuYYhGoV0Ux1JRef/fH57/3bPWWfttdbeZ53dOue8f6/XOevy3N/PWmuv9Tyf5/tLG/aeKCO1/83n86H35GPWOeHMur/rvBOUzgmJ2V7X6cq5vucyTe1GdrZtSggxbcvpLlBzv/u+yuO0taa7hp561JTqB6mE9f02jJvuOWtL+C0VBNLu1OkeqA4fdtv9DKiB4bx/+m3XsL8LWdZs2z3sNVnXM6HO2tIlaFr3c2z9u0yFrP/U+axf3vsyXS2nK+y017R/sxPqTRv2GVlGav9LZc7aEsxO6DDfPVJlLt0915Z9Wdt8Pgdm25d1nv0+lzLslnpgZHrEWxbfUsK1dbqB30XmsL9+2XbDmvawTvdz6Yo14eUfTIfM815Lq10E535OOtY27P1Yx+veDlr/7njuEyBAgMCqLZC/MekmMr/599znZUMxEmR5Z1uFKt9fU1Gr+5up38SHH/qB8nSqWq211tSF993xvvrNz5SHucgh4ZlUSV53vTvPVIfujus+gSqQ6vubbjp1TibPrdeGt9KG/QYrI7X/5btYbTmm1TRnlCr73e5TMzy/hdKG/Q4uI83zv2HfSfvN9hNnnlS+V+eCphxHSHg0F0l1Wy4YzXGUdGk8qOU4RbflWMjuL9q7SU8S+f6eC6i61f0TasuFXf/+lW+0F7vsOXOBa51HAnj5/v3otneB6677Q3k6AdtUkMznRo4d1ZbjWLkQKr/XE5TLBYvpCSCfK6k2md+AGgECq55AglwL3Q1pN1RWqsD97OKZiwC3uP8L2s/DzUu4LHvjS2d9rdnilbceE1zIPZT1SDAvgbw4/eLnF88svhvSyziqas7QuNMjcOsRyJ4BHhJY0QRuunkq5PTItmvF+7ZVobpty/ve+rgG0BLcueHGxc06d5o6yP3ltvLUhz5+Vemu8WVtl6P3vPvtmze+6zfd2Yzl/o1txbe0qaUuOcu6DTu1FdfWXPPWg8EZa5O2a8iT3r3pzAT14Hwq3l3VVhRLSyCrtvac6bzajTdNr1+7gof9273bvidvnU0N5d36zLLfS5Cpd7ved+LUSct+DqnClzbbdmfYB06+slQUSyW4BB9vbrtkfefRSwYHMt6ytptuXjLw2J1fQncJie28w61hywzPfn/0Q9dut/nWIEUNSs62TfPdlzVM1s+4Duuu86Te74bnso5536YlwHm72/V7J5XBM/8N2hczI7lDgMBKKZDqMjmo9I3/OK8cVEqoqzeslBPW+bf5FpuWCjxfaLv8+9eXP3/mJHgXpn5e1+duuGEqiNM9sFiH5fYLZ32lVJnJwbS0egAtXYHV1jtOfb7fbar19F5B2zte/X5Qn79hOjjVDRbVYTfddHM5CFerhNXnu/NY3H7PmEtLVarPfuljzTe/cX4JveTEwRmnfrp5/3HvLicDchVvDlD+zQ6Pn8tsxzbusH2YCnQfPvaU5qFb/59ik0o1CfOd843/Kt1XZHhOaqQrvVTmqS0hjVT+GdYSZHv5i1/brHPntUsYMBW6vt1WzXr/4ceWSav9LW1gcFDL6/q+7QGBdB/42Mc/uhywHTT+bMOy3quvPvuXxiM/uGRoqh4cf/BDHtRs98THLTHbBPxqu3w6gHb1VdeU8F4Nb6RCY664Tte36XYzobkEDcfd8l5Jq57d+ed1n5buP7sBrzyX4NK10ycA/tKpovjALe+fwW2XflMV4fq9lzN8obYvy0pQM9UB8rn2gpc8r7nPZhs3xx9zcvkcy/B68UYqro3a8ll24CFvan7+s1+0JwPOKwfm08VjKgIk0Jr2uU+d3VZZe/ISAdkaTk2Fv1r9si4z1ebSEr5MVzxpl7fh49qGvSfqeOO4ne0q+5unXxOzva4f+eiHL/V+z/rMtk3187bf62/QdtTg16PakPVXzvn0zKirtRU1//v878w8Htedfp9jo/xdmG27h70mx7Xemc+49+WVV1w5s3q/v/ratkviqeDtsM/ImYl67uRvb6qDpoJo77487ugTe8Yez8PZPpdysi3Dui2VXWsIMc/P5btIdz6z3e997ef7Ug1A3q73x13PTIa9H3tGLw/Hvf79luE5AgQIEFixBfL74A2veWu5WOPI9sKQYaG2bO3R7/tQOfF68KFvLiGZYQIJ0iQMk+n6PB0AADrBSURBVN/AH/zw4aXqc3ea+ls+349Tqer0j326fOeuXTl2x3WfQBV40FYPLBev1cf1dpTfYHXcenvjgN/J9UKlQb+D63zmczvKd9J+880xvPxLjwK5KCv/ukG4BFZP/vBp5ULMVKyfS3vggx5QRk/F9NlaLo5LpfkEWHP8otvO/c9vlQv0EnzLv247+8wvLxGEu6XtDjW/LVIJMiHYVL9LiC6/rXOBTG9IsDsv9wkQWPEFDjn8gKU2It2P3hatGyjL/VSD+9LZU2ty0c8ubo83bzYThMv9hWo1oNcNBibgFrtu8C3rkypwNSjXu3795tM7jserjoAg3Kqzr1f6Ld1ko9uXbVyzrc72lLbrxdrSPei601WmUokr1dMe9ZA7le5Lj24DU3u/ZOogdyqIJVjz0l3vVk4cjTP01a1E9v2fTJ0036jtXrK3ZRvOu6CtpNGG8LZ9+Nozg1PRa9220ly/dvrn2wowbfecf/3ItZtz2m43sx07tN1E1ipb32uX96iHToWu/vin/iezr//jLTOVtX74P1OVRjJ9b2WtJVJxnZW5S1uh7XfTVffy9FztesNMozjMtt252D3daqYyXrqqTUsXr+NqCatVl+/9eHpf9lSDy7LSfej/tBX+0r1tKtilJXyWkwI5Mdm7zRk+2zaNui8XXd9ufKf9+KI/lTDe7dcYHhbLZGvfcSp8edkVUyeI81wq9t2WLQHQdMub7mTvvPaU4wU/+mNZpQdsvlYbiJxau7yvHtFWikvrDfkN2hdTU/ufAIGVVSCBpe133K75dNtlaCqQJMxR20tfuGdzS/shckx7gLq2GpJqj0/NhEjqsPvd/77lKtCEnRKcS7ugDTClpUu13pYuVD59xufb6nIvnBn01S9/vXQJmG7X0vqNMzNyhk+HM/Jc1j/Vs7oH/Lrj5qrYHMw/95zzZ7oVzfBUisrzG96z7R6+J1y1eXuQMF2UPa4Nd9UqQTlBUE9g1+E3tl001Cva07VZuofsVzUv0x595PFtFa2Hl+4sU5HvzPbAXq7a/UnbrWaqdJ352S+WYFkqBy10G2Uf5iDnUe89rhyYzAHJtMf/zWObA/Z7R3F8+R4vLs9NvVb6fzdbnBfQLC3VchIE/Jc2bJmr7tK+31bmq63ux1RLqwHF7Ld0n/OgBz9gJnyWblOf+vQnNS/c9RXNm1//9uaDJ753iWqFdX7Dbu+z2SalK9wElGpY7Y/T1eIybQ7UdlsOQOf1lLBYt/pgqivUA+epgJTwVLqk/MwnzmqOaqsm1ipIuYo73WKmG8i8znIF9bhat5u/VLVK26hTUbAuZ+O2smLaWndYs+821Cp12QcJmaX99Cc/K7e1Kl3ve7kMbP9blu3rrXBX5znb7QXf/n4ZlDBl7R7mL52qT/feZGo701Viun9JS4W8444+qT34/uSZ57pdtqR721yJnq4ME+BNNYtnPXW3tnLYWSUId9HPflkCeOnuuNvus+nG5eFG7YmBapYnup+X6YY6Ld3LpOLcNm11tnThPOw9USaa53/d10RmkX2a7lHn87pu3w1LrcVs23TvTTYq46aqZq0qWIPT3Zn0hpMuaPdVThCtuebSvxO709X7tRrE7353+Uz3wzf0VEqs4/a77fc5Vj/3Z/u7kPnMtt3DXpP91mHU55bnvszr9OAD3lO6MftDe//A/d/VVn05ooQ6h31G1vXv7st0v5y/2QmG53Ou9/VWp+neLuu+zLxm+1zatP2c71YfzUm2vDZThSJt2HeRMtKI/6Vb9LRUz3zYIx5S7ue7QULw9W/evdv3fdqP2r8VMUqr1U5zf5S/MxmvtnGuf52nWwIECBBYuQTyeyoX4/yiPWmait/5PjispUrvqad8skkF+e7320HTpRL8am3ge/cX7tUc+o4jlzj+0DtdLizI78JRAnm903pMIAKj/AbLeHmt1Z4NftBWKUvrDXTluU02nfr9OOh3cMabbxv2nbQ733w/f9oOzynHRG499jR1fqMer6rj/9c3v1W6Gn7V3i+tT/W9zTz/YecXlOrWz9zlaWWcS351ablNl6lpqfz/qdPPbD76yeNmejWolffyHbW3paJbfr8d9K43LTHojPa4WYalK9dqX0d40lP+thxv2nfPN5cQ3ZOftkMd5JYAAQILIpDg20VH/LIsK4GyHZrtyu/1Le6/WXkuobPauqG0+tzyuk3Vt7R+y6yV4bK+abOF4DJs0HwyXFu1BKZSD6vWNtvalVRgi7YK3Kb3XrN063nsqVc1F7bhmY9+5vfNS/e7pPnFr24s4az3HH95s87aqzev+Oe7l5DUt3/4x+Zb35sK1aS7xZvbqnKnff73zX/+9x+a/d/z2/L4muv+vMxi7z/pyuaCH93QfPYr1zantOuUIFW6Me1tf/vXdy7DPvixq0rXjwmlpZLZHgf8um+47H9/fVMZ7xFtFbyX/9Pdmy3us1Zz4hlXl+5MY5EA1Ve/uah0cZrtPOjIy3oXWR4fcMRlxSFu511wfXHc8G6j52Qfs/XazdVtVbpPffHaEkI78H39l9N34X2eHOYwaLtzgXkcftTapcpfgoFvP2qqGtw1141eEaPPapWnDjn68jLvWGWfbrbxms3d2y5ye9szp0N4bzn8stI9afz3eftv2q53+1emG7RNo+7L3115c3PECVeUfZl9/Yc2GLd9G4octSUIuuUWd2jO+fb1zdfP/0P5994PXzHq5MtlvFT1S9vv0N82537n+vL+/uLXFzWbb7JmqZK4eeuf13n28wmnX1W2/cAjlzSe675YLhtipgQI3GYC2//dduWEdFZg2073Cds89lEl0HHMkSeUCko50P2Nr53b7LrbLm2FrKUDxM953jPLNqSLs/PO+VYJkH30pDPKQfEaOEno66TjP1bGO7+9YjTBlu22f1x5nP8SjHvy3+9QugLM437j5PnachDuP756TlneAW96R3l6x/ag2WwtV5SmK9a3vfldpRuGU0/+RDn5ndBUv/bs5+5cnn7jPm8rV6LnxPUeL3td8463vac8///a6k5p6V72/PO+3XyqDRQmwFKvZN/oXlMnEBKm+3XbxWauYv1+24XsIQe+t1wNm0DUee1BybQcWMwVtDHe6Wnbl+cW+r9R9uHm9920BLWy72ro8NHpArdteS5dWczWcoAzJzJywv+n011F9o6b+WecvFa++Z/nlyoAh7/rA2W0BClyUDcBuO+0Ict0rZPwwvve88Hm05/4fOkCpM4v3dUmkPnWg99YXt+HvfP9ddCcbp+685PK+Pvu9ZZS9e4Tp322OePjn5l1Hlm/5z3/2eW9c9Bb3t2ku9l0Q/Kcp7+w+WxbKSyhybcfcFjpxjcBrVe0B37T7UdeW2mPabsMyQmf09rqB+d8/bwmr708vqp9bSxri0G8sryj3vuh4rztdJCtO+9UakgYNe/fYz9wYvPjH/203P/7v3tu84uLLi4HshPWikUOnuQ9eMS7jynzS5XJtN73cp3/fLevnozL+yMhmlHa1tPdv5784Y+XK9QTlsx7MUG+BF2ynQm6pEvPbOu3v/XdEkpNt7z3artITbtP28VOtj/htwRREthJZYq85vL+zbZn/9QTJWd//iulGkEqaHbb9k/arvjkhF9eqz/8wY+bg9tuUhPUzGsiy8zn5p77vrxJ1z4JQ2Z41nPYe6K7nLnez5X72fYffO/C8rkYm52nA67deQ17XXfHrfcHbVO6gcz7PNVAzvzMF8p+OewdS79H011O9lveH/ncvuRXv26esctT6yKG3qZrySyn7t8s65j3f3jodINGGPZ3YdB2D3tNDlrusGHLc18m/JzXeU5e77XvK8p+OPFDU3/LR/2MzN/rT57+ufK3dL993lo2Jye5Rm3j2JezfS49ue0y/eI2hJ0Konmvv6n9m573Qj7n0oZ9Fxl1GzLeZve9T/nbmc+d8vnahuDfc8jUa79Wu0k1zrxu8xmQE4T5nDnsnUfNLGau78dxrv/MSrhDgAABAiuVQL5v5bfHP+z6zCZVUfObof5LFdef/c9FJeh/zTXXlu3O75tU7E4ALiGXOm5u60Uz/YBSFTh/01+197+W30j5fdRt+T6cf/m+/NpXTwVn6m/U7njuExhFYNhvsDqPXDiX3xv5bvbJ0z5XfgvnQsneltf6sN/B+7/x4PKdt3faUR4P+056Vfs7OBfcpMv7HOtIN66fad8reb/k91yOReWYzLN6uj89+cTTy/GHeoFFXZdcoHhk+z5OpfO0zPMp7fGPkz50avmdn98Xhx78vjLscU/YttxmeH4X5PtrjnWcdMKp5cLB9BLQW/n88t9dWX6H5/dCLiLr/qu/Ob/+798s8+3+d7e2a+Z0uZrffvm9XgON3XHcJ0CAwPIU6A2R1eBbukGt97P8hM8mqdUuUHvXf5LW0bpMnsDS6Y3JW0drRGBkgX1fumGTbjUT/sq/BHv+cee7NPdtg1HHtd2eJhi0z79uWJ5/5pPWa/793EXN+066ojl6y02adMOZymEJc6UlTJVKXt1KZ70r0p4L7Nt6n0/FtBqAyjrt+9J7NHe8w6051Dp+qr7tv8c9m8OPv6I59XNTJwRTze41/3KPZq220l1ve/dxl5fg3IufM9XlULp03fvAXxeD/V+9UdnWg95/WQkJJSh0v+kuY+vy0k9nQnlZv8M+dHmZ/d03WKPZ68X36F1UeVyn612T//uYdZqftNXHPn7m1DonpFSrpk1NuPTs+mQMZkYa5jBsu5//rLs2x7RhwnR1m1ar5f36sptnltF7p27bsOdTIe3A6UDhhne7fbPXi5a0qvNJRbpUF8zr7qiPTHW1k0Dby9rAYr82bJvyuh24L9uZpvLZzy6+sTm3DTOmPezBd2p22WkqSFae6PxX17N3Xz77Kes3x59+deleNqMnGJd92x2vTtuZXbmboGGqF/Zr92hfV9nnbc9OA1udd11elv/yNrh6zEevbI5oQ3l5XT3ofms1e7buddzXte/7t7X75IvfWFT+Zbt/e/nNM8OH7Ys6nyU2cuBaGkiAwIokkINnOaD3iEc9tLnjHe8ws+q77vbscmVsKlflX9qOT9m+qSe964i5ojst3TAc1HZpmpDX6/Z+SzmJ+9jHP6acOK/BuRxcz8nmBM8SdMqByVolK8GoDDvg4DfUWS81zsyA6TsP2PJ+JZSWg31pe+7zsrYq2APL/Zwo7m3pljCVV3KA88tf+FoJm7zgJbuWbld6x83j2GR9EtDYb9+3lVESEEqAKS0V3HIFfAJGOUiYtkvbpeUL/2XXcj8nvEtXom0A4OdtpagD37lf8/ZD928OesuhTQ6QpmUZbzno9c1G99qwOa0NGyYA03uAMuOtfrvV28/tpf9IdLez3m9rq2aSWdvMeNNG9fEo+zDjPuGJf12COw/+qy3LMtKNaU6CXPab3810l9dv4QkIZt+nKl5Cbl8773NltPr6yIOEBffdb48SSHjDaw4or6McJM3B3d/8+rclZPTcf3pWk+pRCbfkQHXM0o1oQlgzVXOmt23Lre5fTrTk5M4jH711s+V01x5doe7ye9c7B15zoibTv/G1F5ZlZZ4JVM7WcgIpFXgSqkgoJoGGBD5yJfMJx360HNA9/KiD2+/bty+hnrM+96XmoP0PbT76iWObnZ66Q3ui6RczXcEmbJjA1q8uvmTJxXVe3zP7u7NRncEz06WLoT1e9vryOGbvbEvnd9/zMyO2d/bb/zUlaPiREz7e5F/Gf+0bXtnUrlT2eO3uJaR1YLveaQmqZX7rrnfnEnLsfS+Xkdr/hm1ffS3W8ettAnubbX6fNqByYNkf9Qr1+vlTx1ut8wU6r+fnv/gfSygvYZJM//jtti1h0yuvuLoNn96tVKHIyYS8JtMyztHHH9bUioypKpgTeq966b5tVcHDm79uP9Ne3V5Jn65aUs0v+zaV/168+z+X6n1ntiHDWhWxrlNuc1LhiGMOaYN2h5fPizyXZR3w9tc3qTD4nkOOKtW2tv+7J5Sw55777N78W3tCJq/7ZzzrqUPfE/P9fNikrf73hTa8V7c/25LPybTVpl9E9WU16HVdJuj89/urc3Jk8Da9ve1Ca/83HNyaTFXCy2drQrIzr+d2fnn/Xfijn5TQZWaf9dvlOTt3lnTr3X6fjwkuJlx4YvsZvPcr9yv7K59VOcGazbt1G+tWdp679albF9LeG/R3YZTtHvSaXHudqerN3QVWj7quGda9X8cdtC/rn4Q63Vz2ZU4K5v2Trq5rZcW8//K5kL8Fwz4j6zJz0vDE4z5WTpxlnRP4TNfa/VqdpjtsWfdlv+8Ydf7pxvpXL76k/Xw+pVS5yPOpylmrFfZ+X6nTlRfRzIOpO6Psr9e/ea8mAe/6+ZrP+IS2H7L1g8tM8nlx8Lv3L9VMExZNi1/+ntTP9lH2Yf18nHX9y5z9R4AAAQKrkkD9O9L7NadWBsnvl9523Efe11aK+99yMc3ObdXkfE9OleS0GlzrTpO/8fn+2m0zv7emVyDDUyk3IZu/euhWM99tchyhtlSVz2/tfKfXCPQTqN8Z6+u6d5xBv8FS0T/T5/dcKpnV4GUqhe/7xlf3zmrm8aDfwamsmB4HUtV7UKvr2/s+HPadNN2T5qK2hz/yoeXiiv0P3Ld5d3uhVfeiv91f+cImx8lq+3F70UUuLsoxlpn34fTAm2++ucnv13Qh+7gnbFOefW570WHa+w+fuhAmxwH2P/B15ZhEnk9ILcev8jv11bu/Lk81ucgpLr3tq1/6j/LUE9uLPHrblm0gNscQ8j11p6dOXQi6eoVpR/77p+9ULh5NN6m11f1dH7slQIDA8hRImCxdjqYb0XSPWr8r5flUjMvtJLZJC+dNopF1WlJgtUWLFi1e8qkV/9Gi664vJ9tW/C2Z/xZcdc3iZoP1e79uzn9+K9qUN/95cZPuPmuXlHNZ/3SrmF6F7jTdTeRcpu0d97++e30Jte2/x0ZtsG7N5tq2m9a7rj9a/vSPN9zSpGette+09Enh3uXM9jjdwq7TdieZbiUTpPvOD28oIbmXtMG5v9n2zktMlu2+6abFM93ILjFwxAcxTw9ad1hr/uvcu6hlcUgoK4HDUbsG7V129/GxbbDuq21w8pTDNytdb87FKgGxrEe/MGN3GYPuz2VfZrvXvP1qy7Qfss6pnrjG7Ub/HEmVvARQ+7VX7nb3Jbr77TfOsOd+f226CF69fY31X6e8v/LaG+Q8jn0xbD0NJ0BgxRLIwbzft908rrfeum1wZ7S/0blCNAG33u7O0sXg4sW3lIDdbv/QBj3ets9M12CpFnPhD3/avOOw/QtQupLsHafKJfj25CfuUgIxOYieSmrr32W9pZZXx++9zXpc065jb9cNf/7zn9tKoU9vXrL7bqXyXXe6VCO7453usNRVrnWcrEO6T+3d5gzvN22qQKXbyxycre01r3pTCRWkotht3Wbbh+NYr3Q9ktbbBUbvvLMO66233lIHbOt4eW3Gtnc/1uHjuq0WdVkvet4r2iDen5pTzjh24CLyOru2rZqwXnuyqPeg88AJ24EJbKYaWA7ML2tLtcJ99nhzCXIlyFa3Y5T5JtB3/fXXzwTDeqfJ6zjhw9p1cIb3vpd7p8nj+W5froJP97i16mK/efc+F8d8ntRwW+/wPM523NiaJ8jX2/K5kG5ichKg2xJ66u7bBIYSWjn+5CObhENna/n8ytX3w17//aYf9p7oN81sz6X76w3utkEJ6Kbyx5rtyaAEUYe1ZXldd+edbYlp9mk+vz941InNxz5yRnP6504sJ1i648Y/wdFR1q87Xfd+PqPz2hnnCZR+n+3dZc52f5TX5GzT9nt+EvZl/ubXz5ZBn5GD/lb227Z+z81nX47yuZT9cnX7vr7rXe8y85k96LtIv3Wby3M5+XjDH//U93OnzmeY17D34/Jc/7qObgkQIEBg1RDI3618H9MIrIgCw36D5fdpjs/UCzWHbWO/38Hf+db3mr1e+cbmwEPeVC6gGjaP2Yb3+05ax+33Psy65PdS9ztsHX/YbX7v9zvOl2Mt+Y2Y30+ztXzPzO+z3kpws43veQIEVi2B177638oGJ0yW1vu4PDnkv/lMM2SWsw5e1mUt6/SzrlhnwLiWMa75dFZtpbi7quaGRjvbt1LsYhuxKgkk+DSfEFyMxhni6ponvDNqCC7TjSOI96bDftus2wbhntFWv7vy939pPvGFa0pFra23Wvpq/Gz3COeGupu01P1lCe0tNbPpJ5bFIZXllkebq9V8X4vddZ/LvhzHds9nnXdtqy+m0mK/ducx7Iu7rDd4f67XVk8c1uazXcPmaTgBAiu2QIJduepzLq03MFKnnQoD3a4cXPzkWR+pT5fb3V703CUe5wBk7zhLjDD9IKGGDea4flmP3vBUTuD/9/kXlLn2dmuYJ7tBn+lFL3HTO7/uwH7T5grk/Ou2d733rd2Ht+n92fbhOFZq1ADQsHXIa3OQ+zjWNd1lppLUXm1VqVTwSlDnovZKwN7Xa79l5XU26MBxv2nqc8sS+Knz6Hc7V7McFB8UIOv3Oh7FZr7bN9f3egwSmhu0DRmn33bk+bR04dTvtdi7b1M96rTPnFCmGfTfsoQb+63HoGWNOqxfAHC2aZfldV3nmc/bZ+z0vOYf2+qOj338o5uvtN1rpVufVFvboK3I0Nu6geHeYaM+Xh6fFf0+20dZn1Fek6PMp984C70v5/oZOY79MJ95jPK5lP3S+31n1O8i/fbFsOcSJrj9eoMDBcO2ddj7cXmu/7DtM5wAAQIEVi4BIbiVa3+ualsz7DdYfp/O5Tdqv9+Pv7jo4nJh4zaPfeQy8fb7Tlpn2O99OLUucztmd+v8+p/+znGD3t+7dZp6O2posI7vlgCBVUugBuBWra1evlubKnQX/fyXM6HC5bs0c19VBPp/E1hVtt52EljJBdJt53tPuKJ51wenuj1NN6v77r5hMyxQtJKzrJCbtyLsy1S963b5u0JCW2kCBAispAKnnvLJ5pQTTytdbz7sEQ9ZSbfSZs1VIK+FdAl4/DEnz3Tpl+5vd91tl7nOyvgECEwLJECWSgkfOOJDM11vp8vSvdvA6TgrtgFf/gI+I5e/sSUQIECAAAECBAhMvsCznrNzs3PblWdCZBoBAgQIrJgCtVraJK59umRtzmpKGG5Z1q9277os8zDtyiOga9SVZ18usSWraonDJRAm4EG6WL3p5lvarhpXb0963HYrdGPb5elf/rJ4LFXmbrutuG2X/OfWr62aPbDbzYVYQ/tyIZQtgwABAre9QLquSLWqcR1kTHedf2i7k9jwnve47TfOGkykQLoGWaftyjYVeFaklq5Vbrrp5lL1TMhoRdpzy3dd061O06zWtyuc5bvkJed+/R+ub7tlXes2X48l12rFejQp+3JF/Yxcsfa2tSVAgAABAgQIECBAgAABAiuWQA2YzaVS3Hymma9KXdZ8p6/TzWX76jRuJ0NgVc0Njb0i3KWXXdec+91Ly17d+J7rNttuvfESe/i0sy+cddgSI3pAYCUQaHsfWW5drc6FZ601c0JzxTqpOZftW4hx12i7tl1jAi54si8XYm9bBgECBG57gbl0WzHK2qa7zlG77BxlfsZZ+QTm0uXgJG19ulYZ9/tlkrbPusxPoF+3OvOb07JNtfY6ay/bDEzdhggHd6+5UEQr6mfkQvlYDgECBAgQIECAAAECBAgQIDB5AgJsk7dPrNHCCIw9CFeDbln9hOI2acNwCcTVx3mu3j+vDcztsuNWM8PLAP8RIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQmFCBdMd50c9/2cy18lqm0wgQWH4CYw3C1Upws4XbEojb8/nblK1JIC6huUyT8TUCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECky6ww07bNc1ZTQnDjbquCcGV6UadwHgECMxZYKxBuFrtrVaAG7Q2o4wzaHrDCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECCy0QEJtW7xSdbeFdrc8AsMEVh82guEECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGCSBcYWhEs3p6kIt83WG4+8vakKl2lql6ojT2hEAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAwLTCWIFzCbPmXYNu200G4BONqqyG5PE7orQbfdtlxqxKcO699LtNrBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgrgJjCcLVhSYIl9Ybasvzl8wSdOsdt87LLQECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQGEVgtUWLFi0eZcRh46TKWyq7JfSWSm+jtPlMM8p8F113fbPRvTYcZdSVdpyrrlncbLD+aivt9tkwAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSWFlhVc0NjqwiXLlETgptLhbe5BueW3m2eIUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFVXWBsQbhVHdL2EyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMBtI7BcgnCjVIWr46SKnEaAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBOYrsMZ8J+w3XbpHPe3sC8u/OnyXHbcqXabmccJvGd5tmUYjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLzFRhrEC7V3fZ8/jbNud+9tITeslLdim+5v00bfKvV4ITg5rvbTEeAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECVWCsQbg600EBt0HD6vRuCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAqAKrjzqi8QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwCQKCMJN4l6xTgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAwssBy6Rp15KUbcaUU+OWli1fK7bJRBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECK4/A5huvtvJsjC1pBOG8CMYu4ENi7KRmSIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAAAFdow7AMYgAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEJl9AEG7y95E1JECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIEBAoJwA3AMIkCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIHJFxCEm/x9ZA0JECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYICAINwAHIMIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYPIFBOEmfx9ZQwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAYICAINwDHIAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBCYfAFBuMnfR9aQAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAYICMINwDGIAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBCZfQBBu8veRNSRAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBAQKCcANwDCJAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACByRcQhJv8fWQNCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGCAgCDcAByDCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGDyBQThJn8fWUMCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQGCAgCDcAxyACBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQmHwBQbjJ30fWkAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQGCAjCDcAxiAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQmX0AQbvL3kTUkQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgQECgnADcAwiQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgckXEISb/H1kDQkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBggIAg3AAcgwgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBg8gUE4SZ/H1lDAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEBggIAg3AMcgAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEJh8AUG4yd9H1pAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBggIwg3AMYgAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEJl9AEG7y95E1JECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIEBAoJwA3AMIkCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIHJFxCEm/x9ZA0JECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYICAINwAHIMIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYPIFBOEmfx9ZQwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAYICAINwDHIAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBCYfAFBuMnfR9aQAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAYICMINwDGIAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBCZfQBBu8veRNSRAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBAQKCcANwDCJAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACByRcQhJv8fWQNCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGCAgCDcAByDCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGDyBRYkCHfpZdc1+acRIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFxC6wx7hnW+Z373UtL+K03ALfxPddt8m/brTeuo7olQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLzFhh7RbgE3047+8LmvDYIl5bQ2zbTobd6m2EZpzckN++tMCEBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIrLICqy1atGjxuLa+huAyv4TeatW3VIdL6z6uQblddtyqhOXKCGP6b9F11zcb3WvDMc1txZzNVdcsbjZYf7UVc+WtNQECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEC8xJYVXNDY60IVwNvCbfV0Fv2Ru73Ps44aXWa8sB/BAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgjgJjC8Il0JaKcKkEl+5Qh7XaZWqmEYYbpmU4AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECMwmMLYgXAJtCbd1K7/1W2jtPjW3GTfT5L5GgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTmIzD2INygleiG4LpV4wThBqkZRoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQKDBMYShKtBtvPa7lFrN6f1ti68huDyeJcdtypPZ5waiKvzqOO7JUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECowiMJQhXF7RN29VpWkJtCcWddvaFM4/r/YTgavgtAzOeRoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE5iuwxnwn7E5Xg20JwNVqbwnF1TBcrfbWG4Lbdjo4l/HqPLrzdZ8AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECAwTGEsQLgvpDbJ1Q24Z3huCy3NpCcn1Tjs1xP8ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGC4wNi6Rk2YLaG2cztdnSYMl8pws4XgMq4g3PCdZAwCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQmF1gbEG4hN4Shks3p7Ur1Cy2Pt+7Chmndolaq8f1juMxAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAYJjC2IFwWVANtp5194RKV4VL5rVspLvczTnea8sB/BAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgjgKrLVq0aPEcpxk4eu0etXZ5WqvEpYvUWimuDputWtzABYwwcNF11zcb3WvDEcZceUe56prFzQbrr7bybqAtI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgKYFVNTc09iBclU3VtwTeavitPp9gXP7V6nH1+XHeCsI1zar6gh7n68i8CBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKxoAqtqbmiN5bWjukG3GoZLAE4jQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLjFFhuQbjuSgrAdTXcJ0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFxCqw+zpmZFwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQWGgBQbiFFrc8AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEBirgCDcWDnNjAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQWWkAQbqHFLY8AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIExiogCDdWTjMjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgYUWEIRbaHHLI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGxCgjCjZXTzAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgoQUE4RZa3PIIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYKwCgnBj5TQzAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEFhoAUG4hRa3PAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAYq4Ag3Fg5zYwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEFlpAEG6hxS2PAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBMYqIAg3Vk4zI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGFFhCEW2hxyyNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBsQoIwo2V08wIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYKEFBOEWWtzyCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGCsAoJwY+U0MwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBYaAFBuIUWtzwCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQGKuAINxYOc2MAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBBZaQBBuocUtjwABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTGKiAIN1ZOMyNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBhRYQhFtoccsjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbEKCMKNldPMCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGChBQThFlrc8ggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgrAKCcGPlNDMCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQWGgBQbiFFrc8AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEBirgCDcWDnNjAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQWWkAQbqHFLY8AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIExiogCDdWTjMjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgYUWEIRbaHHLI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGxCgjCjZXTzAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgoQUE4RZa3PIIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYKwCgnBj5TQzAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEFhoAUG4hRa3PAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAYq4Ag3Fg5zYwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEFlpAEG6hxS2PAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBMYqIAg3Vk4zI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGFFhCEW2hxyyNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBsQrcpkG4Sy+7bqwbY2YECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgsOoJ3GZBuITgTjv7wubc71666qnbYgIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAYm8Aa45hTrex2ySwV3ja557rNxu2/bsvj/DtvOgi37dYbdwe7T4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIERhIYSxAuld0GtU123KoMroG5Om7Cb5lWGK6KuCVAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBuQoscxCuhtu2aUNtqfzWr6XyW+0Ktd/wPJcwXL/KcbON73kCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIBCBZQ7CdRl7uz/tHZawXG+r1eBqV6m9wz0mQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQKDBMYahOsuqFaAS/gtXaCm1ds63rltFbi0hOB2me4+tQ5zS4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIERhFYfZSR5jpODcFlutm6S804qQYnBDdXXeMTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQFdg7BXhuiG42lVqnqutPlcDcPVxHe6WAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAjMRWDsQbja3WlWohuK667Uns/fpjwUguuquE+AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEC8xEYexAu4bZaAS73hd3ms1tMQ4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQKjCow9CLft1huXZZ/33UtLIC6PB4XhEpobNHzUDTEeAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKyaAqsvj81O+G2b6UDcJW3QbbZWu07tdqc627ieJ0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEC/QTGXhGuLiRhuE3arlE1AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECCwPAWWOQhXuzWtXaEuz5U1bwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0CuwzEG4zDDdoKab027rfVyH1eBc93Gqx2kECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGA+AmMJwvUG2RKCO+3sC/uuT4JwveP3HdGTBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgBIGxBOF6l5OwW6rE9WtCcP1UPEeAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEC8xVYLkG4rIzA23x3iekIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYC4Cq89lZOMSIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFJExCEm7Q9Yn0IECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYE4CgnBz4jIyAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECEyagCDcpO0R60OAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECcxIQhJsTl5EJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYNIE/j9yNTMvnqDOLAAAAABJRU5ErkJggg==" + } + }, + "cell_type": "markdown", + "id": "8cda6c13-7fee-4284-aacf-81a506a426da", + "metadata": {}, + "source": [ + "![image.png](attachment:95b9b198-55c9-4a67-b0bf-103c9ae0272e.png)" + ] + }, + { + "cell_type": "markdown", + "id": "e1525230-e10c-4f48-b951-bc73642bb3e4", + "metadata": {}, + "source": [ + "And at results:" + ] + }, + { + "attachments": { + "66422f79-9b46-4e07-9796-c1b350c26c9c.png": { + "image/png": "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XMhths8cRdqiAnD5heDCl1deafiIweGTyvR9vAulbbeCA3FLXGvUP7atsYlb19j0HRsszYXiIo346Bjrl9DYdq+VZP3da0J0wXE07bu8R8FHUN57L8L29xjc3xq49qVKPn73zU/WpEkjGzFyqL379kc24beJfgs9e3X37Ujz29wBB+3jA3Gaf88dD9uJo4/2lebmuxKDTzzyX+vdZzcfXNP8fffby17476u+fepN191po089zla4dqpPPPqcKezWqXOHUBhOZQlV9U1Bu6+++M61VO1izVs08+1R16/b4N4n2RPP3G/16idapy7t/ZdNX1gF7RgIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCQV0DBNhW/Ku7QOtFu3SOPOaS4q5bJ8soI7TFkgO8mWZoNahvaVnmN2tGxtsFVe4s0lqZusefWzbBJ29ZGmp1n2vaMdBu7ZaX/iY2KtlF1W9noBp0tLp/gm/Zd3qPKB+Jq16ltF1xypt32r3/bdtfG9MUX3vA/AUx8fJz9/fJzC0x26ib/wbUuVYBusSs9eM+dDwer+9cU13p13dr1prarJ59yrH3+6TcuBLfSr6P1gqH05Sljjg8+uvDcnqaqdRo333iPJTVraq+/86yNdtt45MGnbfmylXbkISdb06SmtnLFKl8dTpXoDjviwNA2eIMAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAI7BaZOmbHzQzHfad3KCsTpUIeN2MMmT5zqCmylWq/e3a1121a+CJiySZFGo0YNXXGwIT7TNGXyNKtZs6bfRqRly2pa3RgXSkvNubVUVwHu5fWz7dPkRa6dqpqiFn9oG59sWmTjt662sxv1sD4JjfJsxO87z9SynVDlA3E63f0OGOkrwz3w78dt4YJFlpGR6VuZ9urTwy6/6kJr1bpFgSoqg3jP/f+y119511575R1T9TYNJSn79e9tl15xntWvX89Pi3ftU59+/kF70O3rh+/G+hCeQmwdOraz8y483Qbu3s8vp1977zvC/pw0zac61Xo1Jiar7erxJx5pSUlN7LlnXrEFrgqdwnUaXbt1sjPPOcUG7bFzG34GvxBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQMALHHvC4dVW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ECi1AIG4UhOyAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgaogQCCuKlwFjgEBBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQKDUAgTiSk3IBhBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBKqCAIG4qnAVOAYEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAIFSCxCIKzUhG0AAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEKgKAjVWr1pbFY6DY0AAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEECgVAI1EmrFlWoDVW3l5E1brHmLpKp2WBwPAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIBAOQvQMrWcgdk8AggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIBAxQgQiKsYZ/aCAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCBQzgIE4soZmM0jgAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAghUjACBuIpxZi8IIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAALlLEAgrpyB2TwCCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggEDFCBCIqxhn9oIAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIFDOAgTiyhmYzSOAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCFSMAIG4inFmLwgggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAuUsQCCunIHZPAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAQMUIEIirGGf2ggACCCCAAAII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EUAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEylyAQFyZk7JBBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQqGoC8VExVe2Q/nLHUxHXgEDcX+624oQRQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEPjrCQyp3eyvd9JV7Iwr4hoQiKtiF53DQQABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgbIXOK9xT6uICmVlf+S7xhZlr2tQ3oNAXHkLs30EEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBCodIEe8Q3shbajbO86LQnGVeDVUBBO5rLXNSjvEZWcnJxZ3jupyO0nb9pizVskVeQu2RcCCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggEAVEKBCXBW4CBwCAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIBA6QUIxJXekC0ggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAghUAQECcVXgInAICCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACpRcgEFd6Q7aAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCBQBQQIxFWBi8AhIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIlF6AQFzpDdkCAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIBAFRAgEFcFLgKHgAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgggUHoBAnGlN2QLCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACVUCAQFwVuAgcAgIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAQOkFCMSV3pAtIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIVAEBAnFV4CJwCAgggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAqUXIBBXekO2gAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgggUAUECMRVgYvAISCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCJReoEbpN1H1trB61dqqd1AcEQIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAQLkK7JKBuCZNG5UrGhtHAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBCoegK0TK1614QjQgABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQKIFAmVWIW7Jiky12P8UdQ/q2Ku4qLI8AAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIBAHoEyCcSNnbjExrmfkozWzRKtlfthIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIFAagTIJxAUHMNhVe1PArShD1eQUotMrgbiiiLEMAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIBAQQJlGojLr9qb2ql+9uNcH3w7YHjH0PGMC73jDQIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAKlE4gu3epFW3vqnNW2afMOm+ZeFY5jIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIFDWAhUSiFMILrFOnD/2sa5NKgMBBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQACBshYo90DcH9NW+Opw/Xs0tx6dmpT18bM9BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBLxAjbJ0+OKneRYbG2NxNWPsuAN7+E2vWrfFmjSsbf16NLPPfpzrW6a+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CCCAAAISFhERcSozOUSEHxKtSkNLH4E9u/fJ4cNHpIIJ9WiAKC2bTjF63EyHqlXjgs91+NAR2bFzl5QvXzZOUC+l16RTmW7ftlM0DJc3KLASauykmugUnPv27ZeKFcrFuS//+Hr/Ou2gVsfLnSe3f1emXj5x4oSZlnGvnUYybzKm60wKjla52rVztw3waBjM306ZuXf1GWhQsUiR6OqA/v0ZYTk9rVJyv+EHIuxUpjqlpgs+pWS8UMeePHnSVvvTKV4LFiqQZucJde6UbNPv+KFDh8w7WCSgEluoMSMjI011tP1SomQx816mzjTVeh59j3RcDSnmSeC3Rn8bI8IP2mp+p3uOEREHzVSvR2xff7At1H0ltE2rZep/B3T62NOdM6Fx2IcAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgggkHkFCMRl3mfLnSGAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACWUogdv6xLHXb3CwCCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggEBmEyAQl9meKPeDAAIIIH/cUGUAAEAASURBVIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCGRRAQJxWfTBc9sIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAQGYTIBCX2Z4o94MAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIZFEBAnFZ9MFz2wgggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIBAZhMgEJfZnij3gwACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAghkUYEcWfS+M/Vt97tnfaa+P27u9AJfvFHl9J3ogQACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIBAJhOgQlwme6DcDgIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCQVQXCIiIiTmWmm48IPyRly5XOTLeU5Hs5cFDkxIlM9ViTbMABCCCAAAIIIIAAAggggAACCCCAAAIIIIAA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AQQQQAABBBBAIKkCZcuWlRUroguA6DINgTMhoGG47du3S+3a0f+7+5m4Bs6JAAJpI5DmgTidQlWnU3XNLbtKcW7d7eczawi89/ZI+XJ0bFWyW001tX7XXeXd/PQps2T4K+956/36X2krroWFhXnb3MLkCVNtCO2a66+SoyYcF3UyKmB6Utcv1OcNN/fzNut0qcFNA3vatNKba42a1LeLW7dss4G4of/3tKxZtU5+mPSZdOvZSc41gbTSZUq67nYaVl3RKU21nTTXpwFAd75cuXLZ7RqO0/bVZ2PslKujv35XKlauYMNqLVo1tWE43a/ToDY/p4msW7tRV+X48RPyyYdfSJ16NeWc1s1MlbpdUrJU8dNWiPtr7j/W7aHH7pUh9z0pkydMCxmIa9aisWgo74abr7GBPj1nVFSUfP/tT9LSnG+eGed0benRffLO7sUy59B227VN/jJye4kGUi9P0dMdyn4EEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEMhkAvny5bMhJA0kLViwwP7vj5nsFrmdDC6gM65pZTgNw+n7SEMAgcwlkOaBOK0QF1/TKnG0zClwylQ5O26qpvlbjhw5RANt33w51obh7rjnZhvs0ipl74/4xITO6kv1mlXtIYv/XSrPvPCIFCteRD4b9Y18MXqMNGne0AS+mvuHtMsrlq22n2+99oFs2rjFLrfr2EaGPHqv5M+fsv9w7d2zz45X0FehrkDBAnab23fJ5RfIvr377TatEvf/7N0HmBXV/TfwA4KoINUCCoq9oRJ7b4i9xxo1xpLYS2wx+k815jXNEjUaNXaNscceewd7711QUQGRqoDwzu8sc70LS5PdZYFQThH1AABAAElEQVTPybN7p56Z+cy9S57xe38nfqIqXAxd+sxTz+dhRXfdc8dcDS42itBchPj+8se/pw03Xjfdc/cDed9NNt8wv6693ppp9OgxRWW8mlDdJx8PqFSLyxsUv9q3b5cr18X85599kYNtn336Req94c55kwjc/d/vT0jrbbBWnq/r1x233pOrwy23wjJpmx16p6svvz4detSBlfMs99l6+97puWdeTI8XFezKKnnPP/tS+uLzgenQIw+YaiAuwnA//vC+9PX4b8su04PDP87huCsW31worqJiggABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMCc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HEK1nPdKgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQaQ6B5YxzEMQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEMLCMQ1tLD+CRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKBRBATiGoXZQQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgoQUE4hpaWP8ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0CgCAnGNwuwgBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINDQAgJxDS2sfwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBoFAGBuEZhdhACBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQaGgBgbiGFtY/AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECDSKgEBcozA7CAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAg0tIBAXEML658AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEGkVAIK5RmB2EAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBBpaQCCuoYX1T4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQKNIiAQ1yjMDkKAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECDS0gENfQwvonQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgUYREIhrFGYHIUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGGFhCIa2hh/RMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAowgIxDUKs4MQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEMLCMQ1tLD+CRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKBRBATiGoXZQQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgoQUE4hpaWP8ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0CgCAnGNwuwgBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINDQAgJxDS2sfwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBoFAGBuEZhdhACBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQaGgBgbiGFtY/AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECDSKgEBcozA7CAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAg0tIBAXEML658AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEGkVAIK5RmB2EAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBBpaQCCuoYX1T4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQKNIiAQ1yjMDkKAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECDS0gENfQwvonQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgUYREIhrFGYHIUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGGFhCIa2hh/RMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAowgIxDUKs4MQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEMLCMQ1tLD+CRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKBRBATiGoXZQQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgoQUE4hpaWP8ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg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gAABAgQIECBAgAABAgQIECBAgAABAgQIECBQPwJyQynVS4W4uB3r9uxaP3dFLwQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBA4HsINP8e+9iFAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAg0OQGBuCZ3S5wQAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECHwfAYG476NmHwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBocgItmtwZOSECBAgQIEAg/ejoDyjMYgLXnN19Fjtjp0uAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIHZT0CFuNnvnroiAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIzJECKsTNkbfdRRMgQIBAUxdQbayp3yHnR4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJNUUCFuKZ4V5wTAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECEy3gEDcdJPZgQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSaooBAXFO8K86JAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBKZbQCBuusnsQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJNUUAgrineFedEgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAtMtIBA33WR2IECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGmKCAQ1xTvinMiQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgekWEIibbjI7ECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBTFBCIa4p3xTkRIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwHQLCMRNN5kdCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKApCgjENcW74pwIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYLoFBOKmm8wOBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINAUBQTimuJdcU4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgMN0CAnHTTWYHAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEGiKAgJxTfGuOCcCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQmG4BgbjpJrMDAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECDRFAYG4pnhXnBMBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQITLeAQNx0k9mBAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBJqigEBcU7wrzokAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEpltAIG66yexAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAk1RQCCuKd4V50SAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEC0y0gEDfdZHYgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgaYoIBDXFO+KcyJAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACB6RYQiJtuMjsQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQFMUEIhrinfFOREgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAdAsIxE03mR0IECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoCkKCMQ1xbvinAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgugUE4qabzA4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0BQFBOKa4l1xTgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAw3QItpnsPOxCYisDoMSl9M3p8GjM2pfHjp7Kx1QQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQaQaDV3Cm1mrtZaikx1QjaM+8QKsTNPPvZ8sgRhhv19fgUr8Jws+UtdlEECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgVlS4JvRKY0YWZNrmSUvwElPk4BA3DQx2WhaBaIy3Nhvp3Vr2xEgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBoPIFvx6Wi0JMhDxtPvPGPJBDX+Oaz7RHHFX8wYphUjQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBTFRgr39JUb029nJdAXL0w6iQEmhfvJsOkei8QIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAg0ZYGoEqfNvgIt6vvS+g8YOtkuu3ZuO9l1VhAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgRkRqLdAXAThrr/7tSmeyzo9u6Z1ix+NAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAjUt0C9BeL6vNA/n9tuW604yTn2K8JyfYv18RNNKG4SIgsIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYAYF6i0QV57H5IZF7TthA6G4UsorAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECNSnQPP67Gxa+4pQXFlRblr3sR0BAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEJiSwEwJxMUJCcVN6bZYR4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLTK1DvQ6bWdQIxjOpuW62Y+g0YWlldDp1aWWCCAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAjMgECDBOLe+mBQevuDwfm0luneMb9Wzy/bvVOuENe/KiA3A9dgVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkBokEBeuEYqLVgbiJp7PK/0iQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQL1JNBggbh6Oj/dEJgmgW+//TZ9NeSrvG2Hjh1Ss2bN8vS4cePSkC+HTLJ8mjq1EQECBAgQIECAAAECBAgQIEBgNhUYPGhwat68WWrfoUOtKxw6dGgaO2ZsatWqVWrdpnWtddUzLz77fHrkoYfTsssvl7bcduvqVaYJECBAgAABAgQIECBAgAABAgQIzFSBBgnExZCoy/6kU60Lm3i+1kozBGZQ4ON+/dPPDzki93L0icemjTbbNE8P/GJgOnS/A/P0VTf9J80733wzeCS7EyBAgAABAgQIECBAgAABAgRmfYGf7r1fvohL/3NVatuuXZ6OLxYett9BadSoUWnPffdOu+2952QvtH+/fumhe+9P474dJxA3WSUrCBAgQIAAAQIECBAgQIAAAQIEZoZAgwTiYnjUtz8YnK+nHDK1ej4CcxqBhhK48Jzz02prrZnatGnTUIfQLwECBAgQIECAAAECBAgQIEBgthB4oaj0ttFmm+Rreeett3MYLmbW3XD9vMwvAgQIECBAgAABAgQIECBAgAABArOaQIME4gIhQnHRykDcxPN5pV8EGkAgvsV87RVXp4MOO7jO3ocPH54euf/B9MF776dFu3VLa66zVlqk66J527tuuyMNHjgorbnu2unZJ59OXw4enFZbc430gzVWS3ffflf6uPj281rrrZvn55prrrzP5599np7p+2R67513U+dFuqTeW2+V2rWv+WZ1nSdgIQECBAgQIECAAAECBAgQIEBgJgtsuOnG6dEHH05PF880ykDcc089k89q8SW6p66LdUtRMe6xYljUt954K80zzzz5GcoyxRCpzZs3n+Tsb7vpljT0q6HFc5Et00KdF05vvvZ6eqZ4trL4kt3TBhtvlLf3DGUSNgsIECBAgAABAgQIECBAgAABAgQaQKDBAnENcK66JDDNAnfdenvadPPN0vwThvwod4ww3LGHHJkGDRxYLkpXXHxJOvrE4/LD3wf+d28Ott30n+sr6+8vlnVaYIHKPjH/44P2TzvuuksaE8+BkQAAQABJREFU8Mmn6fjDj658ezp2uuW6G9M/LruoMtxIpSMTBAgQIECAAAECBAgQIECAAIEmIhAhtQjEPfHIY+moE45NLVu2TH0eezyf3aa9e+XXv5z6x/RUnycrZ3zzdTfkwNshRx9RWVZOxJcMP/t0QPHFwtVzIC6+OBjPV+I48eMZSinllQABAgQIECBAgAABAgQIECBAoKEFJv06Zz0cMYZE/flP1sk/MT3xfD0cQhcEJiuw13775HUX/P28NO7bb2tt997b7+TqbWsXVd6u+e8Nade99sjrHy4qxlW3WP+Xc89Ky6+0Ql7comWLdMYF56Td9t4zzz874RvTl1xwUQ7Dbdxr03TG+eek1YuhWqNC3Z1FIE8jQIAAAQIECBAgQIAAAQIECDRVgVVX65nmnXfefHpvvPp6DrP1/6hfnl9ng/XSsKHD0sAvBqYll14qXXDFv9Ipp/42r7v3rv+lbyd63pJXTOWXZyhTAbKaAAECBAgQIECAAAECBAgQIECg3gTqrUJc185tU/8BQ/NPvZ2djgh8D4Htd94xPXzfg7nS2//uuKtWD6v8oGfxAPc36fVXXktX/uuy9P677+b1MTRqddu8GN4jHvj2XG21FA+FY9jUxbt3LwJ249L1V1+bIlg3fvz49NrLr+TdxowZkx4thhAZP35cnv+wGI5VI0CAAAECBAgQIECAAAECBAg0VYGWc8+d1ttogxSV8J996unUeZEu+VTjy4ELLrRQnj71L6cXw6W+ke67657Uv19NWC5WxJcBp6d5hjI9WrYlQIAAAQIECBAgQIAAAQIECBCYUYF6C8SVJ3L93a+Vk1N9Xbdn16luYwMC0yvQohji4+CjDku/+cUp6dYbb661ewzdcdj+P83LVlpl5dSqVata6yeead68poji+HE1QbdyPrb7unj4Wz4AjuFFym9Vx+vYsWMn7so8AQIECBAgQIAAAQIECBAgQKBJCWywyUY5EBfPNbouVvOcbuNem+VzHDVyZDru8KNz5biui3VLSyy15Pc+d89QvjedHQkQIECAAAECBAgQIECAAAECBL6HQL0F4iLc1q2oEjetLSrKaQQaSqDHqqukjTbbND3yQO2hUO+58+58yA023ij9/JcnpCef6JNefO6F73Ua8843Xx5+9ashX6VDjjo89d5mq9zPqy+9nCJspxEgQIAAAQIECBAgQIAAAQIEmrJAPL+IL/YNGjgw/8S5rr3euvmU33r9zRyGa9e+XTrj/HPS8GHD06MPPjzZy2ndunVeN+TLIfl18KDvqvF7hjJZNisIECBAgAABAgQIECBAgAABAgQaQKDeAnFxbkJuDXCHdPm9BX580E/S0336Vqq4RUfLLLds7i+GArng7HPTYw89kueHfPllfp3eXzvt9sN0+UWXpAv+fl56/JFH0zdff1MMJfJmOuznR6VeW/ae3u5sT4AAAQIECBAgQIAAAQIECBBoNIG55porbbbF5umO/96Wj7namqvnL//FTLfui+Vl8UXA8886J7395lt5Pn6NKMJxE7c111k7vffOu+mi885PN/3n+jxdvY1nKNUapgkQIECAAAECBAgQIECAAAECBBpSoGY8yIY8gr4JNIJAs2bNJjlKh44d094H7Pfd8mKbNdddO/XeesscknuqCMtt0rtXXh8Pd0cMH/HdtuXUhG6bTRg6NU10mG132iHtUxwjvk398gsv5TDcxr02TetttEHZg1cCBAgQIECAAAECBAgQIECAQJMVWH/jDSvntuGmG1emO3bqlA467OAckHvw3vvTSiv3yM8/YoP+/fqliZ/FbLL5ZmmNddZK8YwlgnE9V18t99Wsec3DFM9QKrQmCBAgQIAAAQIECBAgQIAAAQIEGlig2bBhw8Y38DEatfthQ0ekLoss3KjHbGoHGzRkfOrUfqLkViOdZBx7VmhjRo9OEXJr0aJ+iiSOHz8+DRs6NLVu0ybFt6s1AgQIECBAgAABAgQIECBAgMDsIBDPPEZ/801qNc8803Q5I0eMyNtO7vmIZyjTxGgjAgQIECBAgAABAgQIECBAoBEEZla2pqEvbWbmhhr62qa1//pJA03r0WxHoIkItJx77no9k/hWdNt27eq1T50RIECAAAECBAgQIECAAAECBGa2QDzzmNYwXJzrfK1bT/GUPUOZIo+VBAgQIECAAAECBAgQIECAAAEC9SBgyNR6QNQFAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECMx8AYG4mX8PnAEBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI1IOAQFw9IOqCAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBGa+gEDczL8HzoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE6kFAIK4eEHVBgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAjNfQCBu5t8DZ0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEC9SAgEFcPiLogQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgZkvIBA38++BMyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBehAQiKsHRF0QIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwMwXEIib+ffAGRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAPQgIxNUDoi4IECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYOYLCMTN/HvgDAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgHgRa1EMfuiBQERg6vDJpggABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgECTFOjUvkmelpOqBwGBuHpA1MV3Akt0bfbdjCkCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAg0ooAhUxsR26EIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoOEEBOIazlbPBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINCIAgJxjYjtUAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDQcAICcQ1nq2cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQaEQBgbhGxHYoAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEGg4AYG4hrPVMwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAg0ooBAXCNiOxQBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQINJyAQFzD2eqZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBBpRQCCuEbEdigABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQaTkAgruFs9UyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECjSggENeI2A5FgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAg0nIBDXcLZ6JkCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFGFBCIa0RshyJAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBhhMQiGs4Wz0TIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQCMKCMQ1IrZDESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEDDCQjENZytngkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgEQUE4hoR26EIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoOEEBOIazlbPBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINCIAi0a8VgORYAAAQIECBAgQIAAAQIECBAgQIBAExF464130gXnXpreeO2t1GmBjmnLbXqlH/1419S8+aTfof3LH/+et6vr1HttsXGx326VVW+/9W66564H01xzzZUOOWL/yvKJJx6479F09WX/Sfvuv2fapNcGefWYMWPSddfcku6+4740aODgtNGm66fNem+Y1lpn9cru7779frr7zvvTfXc/lJZdfum0+ZYbF/tvmFq2rHnUOWL4iHTUIb+obF9O9Npyk7THj3ZOP9vv6HLRJK+HHX1QWn3Nnnn5iBEj02MP90133X5vOvGUo9Iii3aZZPtYMHr06HTy8aemr7/+Jp174Z8r28R5XnTBFeml519JXbstksKp91abpo6dOuRtYvsH7n0k3fe/h1K/jz5OvYvz23LbXmnx7t0qffznmpvTPcW1TtzOOv/09ND9j6Vbbrh94lV5vvMindNpf/6/yroZuydj07VX3VA43JdGjfw6bbL5Bvlaeqy8QqV/EwQIECBAgAABAgQIECBAgACBpiQgENeU7oZzIUCA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ECBAgAABAgQIzEyBBq0Qd/3dr6UyELdOz65p3eJHI9AQAuPGfZv+73fHpy6LdM4P6eIY2+24VTrjz+floSWiGtxdRRhu7XXXSPvuv2c+hQMP2TfFsBYDiiFWP/1kQH6AecgR+6ettt08rz/y5z9LMZTpJx9/muen5VdUo4s+osWDzimdU3zrOb59PLljlkORPPzgE/lhad8naoa82HizDablVGxDgAABAgQIECBAgAABAgQIEJiswLffjisq0jertb6sojZu3LhayyeeGT16dLr2qpvStjtskauwTbx+SvPx5cRoPz10vzSuOIcptc+KZzan/eavqfdWm+YqbLFth47t08FH/KQYkvWsSpX/CJnFuZRt/rZtUrfFFs3PeCLMddstd+ehSrt06ZyDeOV28RrPhmKY0VN+e9wkobbq7SaejudF5519cTr0yAPSol27TLx6kvl//fPK/BwovshZtj323iXdfcd96ZILryoXpb+d84c0T/GFz2jx7CiGhe20QIe0SfE86L13P0g3X397OuWEU9OV1/2zVnW52P4/19ycq/6tu8FaMTvNbVrvyd67/rTS5wknHzVN113ZwQQBAgQIECBAgAABAgQIECBAoBEFGiwQ1+eF/jkMt9tWK6Z+RZW4vsV8t85tU9fiRyNQ3wItWrQovkHbKd1z1wPpmaeeTzHURdnGjv02D5UR1dZWX6tnuThXkPvTmb/N8+XwFz1X++6byfEw8x8X/zWvf/yRvpX9pjQR35Yt29TO6Z233subTu6YsXLTXhum++5+KD9cjSFLYhjXaXnIWp6DVwIECBAgQIAAAQIECBAgQIBAXQLNijBcOfxoub4MwjVvPuVBJR6495Fc1f6He+xQ7jpNry8+/0r67013plNPPyXNP3+bPJzp5HYcOnRYOv6oX+XA3c9PPKyyWfQRYbgddtk6RXW6d99+P/39b/9Mf/rD2enk3xybt4svO5ZfeIwFG2+2ftppq73Tffc8NEkg7vp/35Irzm3Sa9q/gBiV2/76/85Nyy63VNp1zx0r5za5iTKQd8LJR+ZKdOV2EWwbNfLrFEPHLtxloXTd1Ten4478v3TJ1eemJZfqnlq1mrvybCr26ZU2TlHF7/xzLklRDa66ol3/YtSDqJgXVlO7f+Xx43V67slNd1yZvzh61+33FUPF/j2HE9ebzvBd9bFNEyBAgAABAgQIECBAgAABAgQaSqDBAnFxwhF+K3+iUlwE4wTiGupWztn9fj3q63T4QSekNvO3Tj8+YM8U1d2efebF9I/im7rRmjWr+cbzuMkMjTFhdfEguO6hM76P7tTPqabXKR0zhkd98P5H01N9ns3fVj76+EO+z6nYhwABAgQIECBAgAABAgQIECBQS6BTpw7pow/61VoWIbRo7Tu0q7W8eiZCdFdffn1asxi6NEJb09PO/PM/8uYRioufqDQX7dqrb0zPP/tS+s1pv8jzX3/9TTr5+FPT8GEj0nnFlxXnm2/evDx+3X/vw3n+8KN/mgNjyyy7VPqwuI4Y9vTo4w7OQ3tWNp4wMffcc6eo6v/2hC8nlus/G/BFrtD2s8N/klq2bFkunurrYw/3Tc8Vz51iRIJf/Py3efsI5o0cOSqH+Hbba8c8SkGsiC9Z/u30c9OPfrxbUcVuy7xt/Pr8s4H5S52HHnVgKsN4x5xwaH4OFMG2ydmWIbiBXwyq9BUTN1z73+yyxdab1Vo+tZlpvSfRT8fiPRM/y62wTHrwvkfzj0Dc1IStJ0CAAAECBAgQIECAAAECBGaGwJS/7jkDZxTV4CIEF5XiqodOnYEu7UpgsgLvv/9R/mZyPFyMYTSWWmaJ4kHmd3nPGE4jHp4+1fe5Sh/fFuG4eOgXQ1Ms2m3RvPy5Z16qrI+Hon/83RnptVfeSO0mPAj+7LPPK+tHFQ85p9Smdk5TO2b0vcbaP8jnHd9yjrbhJuvlV78IECBAgAABAgQIECBAgAABAjMiEBXoP/l4QPpy8JBKN2+89lZ+DjHvhCE7KyuqJp584unU76OP0+577Vy1dNomt9q2VzrgZ/ukVXqulH96rLxC3rHbYl2LoUGXy9PxvObUX/8lvffO++lv5/4hDwFa3fuwr4bn2fLLjTHTrPhftFFFkC7aUYf8Iv3qpNPydPyKynevv/pW6rLIwpVlMXHzDbfn+e2qgmq1NpjMTATh4jqiQl15LQt3WTBvHfMRGvv/7N1nmFXV1QDgDWJv2Bui2EWMPWJvsX4aoxFjjyVq7DXYxUbEgiVij733HrsYjd3Ye0w0iqLGggyogMJ31h7O9c44Q5kZ5KLvfjL3nrLPOfu+h/hjP2uvFe2Vl15LR/Q8IffbdY8d8rHyY+iQoXmzXMQZO5G1L1pdXf1vfO6ZF9Oa3TdOb73xdj4eH2+9+e+8HWMo2+effZFuvemutPmWm6Qxvbuyf/X32N5JjCXGcF6/S6ouqx9n9dirTtokQIAAAQIECBAgQIAAAQIECEx0ge8jhlo5lAh8K9tKS3fKmeC6F99RKjValE4ts8M17lte55tASwW6LDBfnrC96/b70owdZ0gfDhiY+p1xYb7dl4MG5wnPrbb7bbr4givTmX3PS2ustUr6e//H8mrklVf7ZS5XESuFr778hlxKdZHFFswri6P86p777ZLLeERAXaw2jlKoHw38OF1wzmVjHO7YxhTlT8f0zLh5rE6OEh8333BHWnb5pdKss848xmc6SYAAAQIECBAgQIAAAQIECBAYF4F11lszz22cWmQv23aHLXK5zXvuejBtv9NWlcsvufCq1GneufPiw/LgVZffmObtPE9aboWly0Pj/B1zM9Ut5myuvuLGtMpqK1ZKmUb508iqttOu26bBX9alF557uXJJZCZbadUVcha1M045N8+ZvFsskoxgsAjsKudNIljvyENOyPdeotti6b67H8oLKXfabdvKvSLQ69orb0qb9dg4zTDj9JXj47IRczrxV93ifu+9OyBXLojjkbWu5/69cha5yAAXpUnLFs/rPF+nHOx3TeE5wwzTpTnmnD3PU0WfFbsvl7sus/wv8pzVGaeel36/y1Y5ePGyi67J91ys6yLl7dLtt9ydtzfdfKPKsXHdGJd30u0XXdPtRUa/CCiMzHUP3Ptwzoa3xXiWzB3XMelHgAABAgQIECBAgAABAgQIEGitQJsExEWAWwS+RcBbZIWLFkFx8VfuVwfDVfeN8xEspxFojcBUU02ZDjly/xQTtYcffFwOjotJwCi/8eEHA/Mk5dbbb5G+/vrrHNR2yw13pplm6pgOPWr/SgmLo4/vmU498ax0/tn1K17n79I5nX/J6aljx/oyIQccsle6vJh0PGifI/P9u6+yQnrysWeKcqzfj7z96JW8cWRcxjS2Z8Z91vrVajkgLjLfaQQIECBAgAABAgQIECBAgACBthCYY87ZUu+Tj0y9j+mbA9DinlFuc9vf98i3HzVqVBEEdXdaatlulYC414sMcpH1LOZgqudAmhvP2DKIVc5Xza3cf0//fLuY42ncLrqyXx5LlAuNhYp/u+P+3CXKt+6y+/aV7rH4cdc9fp/u+9tD6YKzL83Hd9h5q6Jk6XqVPuW1m2+xceVYUxvlvE/VEJvqNjpH3fenIpAvSqjGX8wlVbfVi4Wax514WDqxb690yp/PSn2OPyOfjsWYB/TcM8WcU7TwCevrr7m1Upp1wYXmT4f3OijPO0WfKC97/dW35HdXnTUuzjXVKuZNnSyOVc5X/eBjilK2p510dq60UF62xz47p0UWW6jc9U2AAAECBAgQIECAAAECBAgQqCmBdnV1daNaM6IIaIuSqJENLgLgYjtaGeTW1H4Ex5XBcnG+Ontca8YS19YNHvqD8getveekdv1ng0alWTpWzVpNaj+gleP94otBacYZZ2x2YjZKb8QK5LJ8RePHDRs2PA0rJhObWx0cZSiiBGtlgrDxDZrYH9uYxvTMKOkaE6O333dNsWJ4/FYsNzEUhwgQIECAAAECBAgQIECAAAECDQSibOp0009XZKpvuHb222+/zZn0x2cOpMGNJ+DOyJGj0ueff5Gmm27aSnBYU4+LeZyOM8U8UfumTtfEsa+//iZ9XQTOjWm+6ZuiT8xpTVv83onVYv4qMuHNPPNMzc67TayxeS4BAgQIECBAgAABAgQIECDwvcDPPW4oJBrOcn1vM85bZea38oLYjwxwp1/6ZA6Si4C5OBbfkUkuvsv2/ujtxvcoz/sm0BKByPw2pjbZZJM1GwwX10055RT5r7l7NBdI11z/OD62MTX1zJhgfO2VN9L5/S7NZUMEw41J2DkCBAgQIECAAAECBAgQIECgpQIRiNVU69Ch1VOHTd22TY5FhrqyROqYbtiSeZwx3W9CnJt66qlS/I2pTTWW82O6tq3O1c9fzdxWt3MfAgQIECBAgAABAgQIECBAgMAEE2h1hrgYWVkytRxlZIuLFoFx1S0C38qAufJ4mVmu3G/ttwxxKYn0bO2/otq4/sbrbk/9Tr8gLbLogqlvv95p+mKltkaAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgOQFxQ22QIS5wo/xp2eYdHfRW7pdBcREIV5ZRjT6RHa5x3/Ia3wQIpLTRJuumVVZb8WdfAti/BQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLjKtBmdQ+qg+Li4VEaNYLhqrPFleVTy0xx4zpI/Qj8HAWmmWbqFH8aAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLjJtBmAXHl426457VyM5dHLQPlIhguzkUwXLQ4Xm5XLrBBgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgRaKNC+hdc1edkTRUa4aE0FupXH4jv+qgPnmryZgwQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYDwE2jQgLkqkRrBbZH+Lv8gKF3/RyvKpcXze0VniynPjMV5dCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAkwJtGhAXwXBlkNv7owPh4li0MZ1rcmQOEiBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACB8RBoV1dXN2o8+o+xawTDVZdC7bFB10r51DgXJVXLgLnuo7PIjfGGLThZN3hommvuOVpw5U/nks8GjUqzdGz30/lBfgkBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAmMVEDeUUpsGxJXiEfRWZoYrj5XfYzpX9mnNt4C4lPzDbs2/INcSIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQmDQFxA2l1KYlU8t/Bs0Fw8X5MZ0rr/dNgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTGV2CCBMSN7yD0J0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECrRUQENdaQdcTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQE0ICIiriddgEAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDQWgEBca0VdD0BAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI1ISAgLiaeA0GQYAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQKtFRAQ11pB1xMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBATQgIiKuJ12AQBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINBagQ6tvYHrCVQLvDNgVPWubQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQI1J9ClU7uaG5MBtY2AgLi2cXSX0QL+Y+GfAgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECE0tAydSJJe+5BAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINCmAgLi2pTTzQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgYgkIiJtY8p5LgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAm0qICCuTTndjAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQmloCAuIkl77kECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0KYCAuLalNPNCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGBiCQiIm1jynkuAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECbSogIK5NOd2MAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBCaWgIC4iSXvuQQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDQpgIC4tqU080IECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYGIJCIibWPKeS4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJtKiAgrk053YwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEJpaAgLiJJe+5BAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINCmAgLi2pTTzQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgYgkIiJtY8p5LgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAm0q0KHx3T74pH165e326b2B7dOgIe3SyJGNe/y4++2LkL2O041KnecambotNDLNM/tEHtCP+/M9jQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTGUaBBQNy9j3dIL7w52The+uN0i4C8zwe3K/4my2NbetHv0vorf/vjPNxTCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGCSEaiUTL3+vslrLhiuKcUI2IuxagQaC9x/T//02itvND48Qfbffee9dNft96URI0ZMkPu7KQECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEC4y+QM8RFZrh3PqjExo3/XX7kK2KsMWaZ4n5k+Bp/3Oknn5M2+c0GqWu3xSb4SF96/tV02slnp9XWXClNPrkAzQkO7gEECBAgQIAAAQIECBAgQIBAmwu89cbb6bx+l6Q3XnsrzTLrzGn9jdZJ2+ywRWrfvul5woEffpwuvuDK9OxTz6fppp82bbzp+mnLbTZL7dq1azC2Dz/4KNUvXHwzdV9l+bTZFhtXzv/7X++kC8+7PL30/Cup07xzp3XWWyOtu8FaaeZZZsp9YvHh9Vffmu6564H02aefp9XXWiWtve5q6Zfdl0vfffdd2u33+1Xu1Xhjz/3+kOLZt954Z+NTeX/OuedMvU8+snLu66+/SXfddm969eU30pRTTZkOPWr/yrkvvhiUzjrtgvT8sy/lYyutukLac98/5N9ddrr1prvSfXf3T+/+57/pF8t0S/scsFuap9Nc5ekG3w898Gi66tLr0vY7bZXWXGfVyrn4Tf985oXi9z6YVl1jpbT2r1arnIuNR/o/lq6+4sb03rsD8jPWWme1tNavVk1TTDFF7vfF54PSRedfkZ564p95f93110zrFH8LLjR/3o+PY484Kb333/cr+7ExdzHO4/sckU7581/y+29wcvROvJttduiR98bntzZ1L8cIECBAgAABAgQIECBAgAABAj+mQIcPPmk/SWSGa4wSmeK6LTQyzTN7UVNVI0CAAAECBAgQIECAAAECBAgQIEBgnAUi4Gu3HfdPM83UMW230+/Sc8+8mP5aBKpNPsXk6XdFkFvjNqRuaOq5/9E5SC2CpCIQ69yzLk7fjRyZttl+i0r3p554NgdgTTnllGmNtVdJCy28QOXcRwM/Trtsv0+ae5450w47b5UGf1mX7/HgfX9P511yRhGI1y6dd9Yl6abrb0/rbbh26vaL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AAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGWCrQ6Q1xzD45yqdUlU6u3m7vGcQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0FKBNssQFyVSu3RKaf7R5U/fLQLiHnrqu7Tz5vWPiHKqUV419hv3bengXUeAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBEqBVgfERea3/k/Xl0ktbxrHIhiuuVZdSjX6yh7XnJTjBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIDCuAq0OiIsHRfDbOwNGVp7ZXIBbHD/qrBE5U1zZubm+5XnfBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgXATaJCAuHiSwbVy49SFAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBCSXQZgFx4zrAnTfv0CBDXJRbHVN51XG9r34ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg8PMW+FED4tZecbIcDBfZ5N4t/qKt9cv2udyqDHM/73+Ifj0BAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgRaK/CjBMR1maddisxwZev/1He5xGocj4A4jQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQItFZggkejRfBbtAh+iz+NAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAhMCIHv07ZNiLsX94xSqEedNSLfPUqmRka4Lp0iDm/k6O8J9GC3JUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGflcAED4ir1nxnwMgcEBdBcdWlUiNoTiNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAq0R+HED4orAt/5Pj2ww3giS0wgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQGsFftSAuBjsQ09919oxu54AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECPxA4EcPiPvBCBz4SQm8M0D525/UC/VjCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQI/QYEundr9BH+VnxQCAuL8O2hTAf+xaFNONyNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYDwE2o9HX10JECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEDNCgiIq9lXY2AECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgMD4CAuLGR0tfAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEKhZAQFxNftqDIwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIExkdAQNz4aOlLgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAjUr0L79JBwSNymPvWb/RRgYAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEJlGB9h2nGzWJDj2lSXnskyy6gRMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKBGBdp3nmtkjQ5t7MOalMc+9l+nBwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAiMj0D7bgtNugFxk/LYx+cl6UuAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECYxdoP8/sI9PSi3439p411iPGHGPXCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBACLSPj/VX/jZ1mWfSCS6LscaYNQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUArkgLjY2XK9EZNEprjIDBdj1QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQLVAh+qdyLrWbaGR6ZW326f3BrZPg4a0SyMncuK49kXIXsfpRqXOc43MY1MmtfqN2SZAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBUqBBQFwcjIAzQWclj28C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L5oIB4cNG54iY9qYxhnZ8uK3lkFqE2KYkfU/5pGqF0w2fk6UTY1seB06NHzPjfvZJ0CAAAECBAgQIECAAAECBCZtgZ973FC8PbMfk/a/YaNvQmCWRqtsm+iSg8xqPRguxt3cpPAVl1yb+j/waC55OvkUHXLGu+hflsOI7aZaBLnNPMtMTZ2qHJtp5o6V7cYbEZw3ponVxv3tEyBAgAABAgQIECBAgAABArUv0NxcwIQMnJpu+mnHCBNzEI0zqY3xgol0csopp0hTTtkw41vjoTRXkrVxv9bsTzHFFCn+xtTGNic0pmudI0CAAAECBAgQIECAAAECBAhMSgIC4ialt2WsBEYLbLn1ZumjgZ+kIw85IR+JMqs9j9gvLbfC0owIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI/GwFlEz9Cb56qQ9/gi+1mZ8U5UOGDBmaZphh+mZ6OEyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIPBzERA3lFL7n8vL9jsJ/BQFonyIYLif4pv1mwgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBFoiICCuJWquIUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGaExAQV3OvxIAIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoCUCAuJaouYaAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEKg5AQFxNfdKDIgAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEWiIgIK4laq4hQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgZoTEBBXc6/EgAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgJQIdWnJRc9cM+GhweuKFAfl0pzlnSCst3alB1xvuea3Zcw062iFAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAuMp0KYBcWXAW4whguPmLYLiIjCu3I9j5faTReBcjw26Vs7nEz4IECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEALBdosIK7MDNdckFsExh2wY/c8zAiMi+C5uCb6awQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoLUC7Vt7g/L6MvtbmRGuPN7U97j0aeo6xwgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQHMCbRYQ19wDHCdAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAj+GQJsExEX508gQ133pTuM85sgSF9eUpVbH+UIdCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAEwKtDoiLoLb4iwC3lUYHxEWAXNnKYLnYj+C3MgCuxwZdcwDdk8WxuF4jQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQKtEWh1QFz58AiIi9Y4uC2Ov99MwFvjvuW9fBMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgfEVaFdXVzdqfC9q3D+yvkWmtwh+i8xv49Jacs243Ldu8NA019xzjEvXn2yfzwaNSrN0bDdRft87A1r9z2mijNtDCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEfj4CXTpNnNiaCS08MeOGJvRvG9f7dxjXjmPqF6VSI9vb+GR8G98AujE937naEfip/seidoSNhAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACB5gTarGRqcw9wnAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI/BgCbR4QNy5Z4so+UWJVI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECbSHQJiVTYyBRNvWGe17Lf+XAemzQNZVBbxEEF+erW1yjESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBthBos4C4CHw7YMfu6YkXBqSmMsDF+e5FAFx5TjBcW7w+9yBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBUqDNAuLKG44p0G1M58rrfRMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgZYItG/JRa4hQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQK1JiAgrtbeiPEQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQIsEBMS1iM1FBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIFBrAgLiau2NGA8BAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQItEhAQFyL2FxEgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABArUmICCu1t6I8RAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAiwQExLWIzUUECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUGsCAuJq7Y0YDwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0SEBAXIvYXESAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECtSYgIK7W3ojxECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgECLBATEtYjNRQQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQawIC4mrtjRgPAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECLRIQEBci9hcRIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQK1JiAgrtbeiPEQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQIsEBMS1iM1FBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIFBrAgLiau2NGA8BAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQItEhAQFyL2FxEgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABArUmICCu1t6I8RAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAiwQExLWIzUUECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUGsCAuJq7Y0YDwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0SEBAXIvYXESAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECtSYgIK7W3ojxECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgECLBATEtYjNRQQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQawIC4mrtjRgPAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECLRIQEBci9hcRIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQK1JiAgrtbeiPEQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQIsEBMS1iM1FBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIFBrAgLiau2NGA8BAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQItEhAQFyL2FxEgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABArUmICCu1t6I8RAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAiwQExLWIzUUECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUGsCAuJq7Y0YDwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0SEBAXIvYXESAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECtSYgIK7W3ojxECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgECLBATEtYjNRQQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQawIC4mrtjRgPAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECLRIQEBci9hcRIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQK1JiAgrtbeiPEQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQIsEBMS1iM1FBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIFBrAgLiau2NGA8BAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQItEhAQFyL2FxEgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABArUmMMED4gZ8NDjFn0aAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBCakQIcJcfMnXhiQg+AaB8J1mnOGFH8rLd1pQjzWPQkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEDgZyzQphniIgDuhnteS08WAXHRIvit++jgt/I7zkWfxsFyP+N34KcTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQBsItKurqxvVBvfJAW4R6BYtgt/KLHCRLS5a9X4ZMNdjg645aC53aKOPusFD01xzz9FGd5s0b/PZoFFplo7tJs3BGzUBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAi0SEDeUUptliCsD3yLIrQx+i7cS2433o0+08pq844MAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECLRCoE0C4iKwLUqgRma4KJM6tlaWUo1rBMWNTct5AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEBgXgTYJiIvAtghyq84E19TDo1+UVY3v6BvXxLZGgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgRaK9CmAXFjGkx1MFx1FjkBcWNSc44AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIExlWg1QFxZUDbk0XZ1LL8afldDqIMhov9Hht0zYejTxkYV96j7O+bAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAiMr0CrA+LKB3YvSqBGi+C2CI6L0qjlfrkdwXBlEFyci34aAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBoC4EOrb1JGeAWgXBl9rcIjiuD4srsb42D4VYaHUAX/cp7tHYsridAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBn69AqwPigq5xQFt1sFucbxwMF8eiRbBc42vrz/gkQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLjJ9AmJVMjqC2C256oKoEaQXGRKa65YLjoKyBu/F6W3gQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDQvECbBMRF8FsExUX507JEajyyPN748dGnLJVaZpNr3Mc+AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAYH4E2CYiLB5aBbTfc81qDTHGRCa46c1xsR5/qa/KODwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0AqBdnV1daNacX2DS8uyqWUp1DJrXJROLTPHleeayx7X4IYt2KkbPDTNNfccLbjyp3PJZ4NGpVk6tvvp/CC/hAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBsQqIG0qpTQPiSvHIAheBb2UQXHk8AuTir8wmVx5vy28BcSn5h92W/6LciwABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMCkISBuKKUOE+JVVQe8lUFxEQinESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBCSUwQQLiqgcrEK5awzYBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQITCiB9hPqxu5LgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgR+TAEBcT+mtmcRIECAAAECBAgQIPD/7d2xbVxHFIVhgXDs2AHZgCOFVAduwLlbcF1qQB1IoSI1IAaOXYE5BAdYLJYSj9/O6AD6FhCo5V69d/VN+uMtAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLLBARxy2hdmAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgR2Cgjidmq7FwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgsExDELaN1YQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBDYKSCI26ntXgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECCwTEAQt4zWhQkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgp4Agbqe2exEgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAMgFB3DJaFyZAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBnQKCuJ3a7kWAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECywQEcctoXZgAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEdgoI4nZquxcBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQILBMQxC2jdWECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQ2CkgiNup7V4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgsExAELeM1oUJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYKeAIG6ntnsRIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwDIBQdwyWhcmQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgZ0Cgrid2u5FgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAssEBHHLaF2YAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBHYKCOJ2arsXAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECCwTEMQto3VhAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIENgpIIjbqe1eBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQILBMQBC3jNaFCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGCngCBup7Z7ESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMAyAUHcMloXJkCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGdAoK4ndruRYAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLLBARxy2hdmAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgR2Cgjidmq7FwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgsExDELaN1YQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBDYKSCI26ntXgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECCwTEAQt4zWhQkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgp4Agbqe2exEgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAMgFB3DJaFyZAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBnQKCuJ3a7kWAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECywQEcctoXZgAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEdgoI4nZquxcBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQILBMQxC2jdWECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQ2CkgiNup7V4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgsEzghwVxD//8u+w/5cIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg8PMJ/JAgbsRw7z98efPx88PPJ+5/TIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJLBH45etX5pLevLzzx7e63X9/cPv45fY3348+n5yDu3dvb04/9nQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIxAKHg7jxpLdvve7++P3p4xnOzdkRwY1/K4qbIn4SIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwBGBQ0HcjNzuH+O28SS4S6/xJLj5FamXPh+/G1HcpSfJvTTv9wQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBA4FzgUBB3erHzr0U9/2xEc+ev+XS4+RWq5597T4AAAQIECBAgQIAAAQIECBAgQIDmXgZvAAAaGklEQVQAAQIECBAgQIAAAQIECBAgQIAAAQIEXitwtSDu9IbziXAjghtfjTpe8+ec+/j4VLjxGjHcn89fqzo/85MAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQCN+k/+N78jOHG3EtfozpmxtPhxHDf0/Q5AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECLxW4KpPiDuN4eZXqI7fzdf83Qzh5vv5uZ8ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQOD/Clw1iJtfgzqWOY3jTpf7+6/7p7diuFMVfydAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBowJXDeJG5DafCDf+Lno7ejz+PQECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi8VuCqQdy7t7dP9/30+eEpjBvvvxXFjXjuW5+/9j9hjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI3FybYERw989h3NfH4O2l1/xK1dOvWX1p1u8JECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMD3BK76hLh5sxHF3T1+ZaoXAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBDYJXAoiJtfdzq/InXX0u5DgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTOBQ4FceNi4+tRx9efnr7O38/PZkB3+n48Tc6LAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgcFTgcxJ0HbSOGe//hy8W9RhB3Pn9x0C8JECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAocDiIO7/fiN7GU+MuvcRwl1T8jgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSuIXD1IG4sJXy7xtG4BgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgkAjfJsFkCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINAqIIhrPRl7ESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAkIIiLuAwTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQKuAIK71ZOxFgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABApGAIC7iMkyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECrQKCuNaTsRcBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIRAKCuIjLMAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0CgjiWk/GXgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAQCQjiIi7DBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINAqIIhrPRl7ESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAkIIiLuAwTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQKuAIK71ZOxFgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABApGAIC7iMkyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECrQKCuNaTsRcBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIRAKCuIjLMAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0CgjiWk/GXgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAQCQjiIi7DBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINAqIIhrPRl7ESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAkIIiLuAwTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQKuAIK71ZOxFgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABApGAIC7iMkyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECrQKCuNaTsRcBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIRAKCuIjLMAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0CgjiWk/GXgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAQCQjiIi7DBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINAqIIhrPRl7ESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAkIIiLuAwTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQKuAIK71ZOxFgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABApGAIC7iMkyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECrQKCuNaTsRcBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIRAKCuIjLMAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0CgjiWk/GXgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAQCQjiIi7DBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINAqIIhrPRl7ESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAkIIiLuAwTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQKuAIK71ZOxFgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABApGAIC7iMkyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECrQKCuNaTsRcBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIRAKCuIjLMAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0CgjiWk/GXgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAQCQjiIi7DBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINAqIIhrPRl7ESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAkIIiLuAwTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQKuAIK71ZOxFgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABApGAIC7iMkyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECrQKCuNaTsRcBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIRAKCuIjLMAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0CgjiWk/GXgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAQCQjiIi7DBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINAqIIhrPRl7ESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAkIIiLuAwTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQKuAIK71ZOxFgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABApGAIC7iMkyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECrQKCuNaTsRcBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIRAKCuIjLMAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0CgjiWk/GXgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAQCQjiIi7DBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINAqIIhrPRl7ESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAkIIiLuAwTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQKuAIK71ZOxFgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABApGAIC7iMkyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECrQKCuNaTsRcBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIRAKCuIjLMAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0CgjiWk/GXgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAQCQjiIi7DBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINAqIIhrPRl7ESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAkIIiLuAwTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQKuAIK71ZOxFgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABApGAIC7iMkyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECrQKCuNaTsRcBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIRAKCuIjLMAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0CgjiWk/GXgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAQCQjiIi7DBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINAqIIhrPRl7ESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAkIIiLuAwTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQKuAIK71ZOxFgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABApGAIC7iMkyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECrQKCuNaTsRcBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIRAKCuIjLMAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0CgjiWk/GXgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAQCQjiIi7DBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINAqIIhrPRl7ESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAkIIiLuAwTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQKuAIK71ZOxFgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABApGAIC7iMkyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECrQKCuNaTsRcBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIRAKCuIjLMAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0CgjiWk/GXgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAQCQjiIi7DBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINAqIIhrPRl7ESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAkIIiLuAwTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQKuAIK71ZOxFgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABApGAIC7iMkyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECrQKCuNaTsRcBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIRAKCuIjLMAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0CgjiWk/GXgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAQCQjiIi7DBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINAqIIhrPRl7ESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAkIIiLuAwTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQKuAIK71ZOxFgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABApGAIC7iMkyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECrQKCuNaTsRcBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIRAKCuIjLMAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0CgjiWk/GXgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAQCQjiIi7DBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINAqIIhrPRl7ESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAkIIiLuAwTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQKuAIK71ZOxFgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABApGAIC7iMkyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECrQKCuNaTsRcBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIRAKCuIjLMAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0CgjiWk/GXgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAQCQjiIi7DBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINAqIIhrPRl7ESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAkIIiLuAwTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQKuAIK71ZOxFgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABApGAIC7iMkyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECrQKCuNaTsRcBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIRAKCuIjLMAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0CgjiWk/GXgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAQCQjiIi7DBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINAqIIhrPRl7ESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAk8B+LnGlaFZbbmAAAAABJRU5ErkJggg==" + } + }, + "cell_type": "markdown", + "id": "217279f8-6af1-4209-b0ec-3d3d829ceed9", + "metadata": {}, + "source": [ + "![image.png](attachment:66422f79-9b46-4e07-9796-c1b350c26c9c.png)" + ] + }, + { + "cell_type": "markdown", + "id": "844edc05-0b6a-4e84-9213-1d3cbf6f833e", + "metadata": {}, + "source": [ + "## Use the function for model serving" + ] + }, + { + "cell_type": "markdown", + "id": "40182a6f-fc46-4a33-a7f5-7ee8ee171966", + "metadata": {}, + "source": [ + "### Create the server and serving function\n", + "\n", + "Create a serving function that uses the model from the previous run and serves it using MLRun.
\n", + "We will create a mock server to test the model in a local environment." + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "f5fe910b-e177-4af7-84de-41a571d1774c", + "metadata": {}, + "outputs": [], + "source": [ + "serving_func = project.set_function(\n", + " func=\"function.yaml\",\n", + " name=\"example-xgb-server\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "ddbfd48f-a90e-4fe6-9caa-ddffeacf63d1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Add the model\n", + "serving_func.add_model(\n", + " \"mlflow_xgb_model\",\n", + " class_name=\"MLFlowModelServer\",\n", + " model_path=train_run.outputs[\"model\"],\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "2298d111-2f53-4b84-be9e-e4e8a228dcc4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> 2024-03-27 15:37:31,627 [info] model mlflow_xgb_model was loaded\n", + "> 2024-03-27 15:37:31,628 [info] Loaded ['mlflow_xgb_model']\n" + ] + } + ], + "source": [ + "# Create a mock server\n", + "server = serving_func.to_mock_server()" + ] + }, + { + "cell_type": "markdown", + "id": "f54d7c06-4972-4881-9bc9-fba7db0adbe4", + "metadata": {}, + "source": [ + "### Test the model " + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "4f256490-f225-4bd6-ac8a-5fc12a0f335d", + "metadata": {}, + "outputs": [], + "source": [ + "# An example taken randomly \n", + "result = server.test(\"/v2/models/mlflow_xgb_model/predict\", {\"inputs\":[{\"age\": 20, \"gender\": 0}]})" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "47839f4b-bb2d-4341-99c5-e34fa31270c9", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'id': '43a61d06f2694fa695bdd6561b487131',\n", + " 'model_name': 'mlflow_xgb_model',\n", + " 'outputs': [[0.9242361187934875, 0.0418272465467453, 0.033936627209186554]]}" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Look at the result, it shows the probability of the given example to be each of the \n", + "# irises featured in the dataset\n", + "result" + ] + }, + { + "cell_type": "markdown", + "id": "d4fc6c73-0963-4814-bd5f-2d27b464823e", + "metadata": {}, + "source": [ + "We predicted that a 20 year old female would like pop!" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "mlrun-base", + "language": "python", + "name": "conda-env-mlrun-base-py" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.16" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/mlflow_utils/mlflow_utils.py b/mlflow_utils/mlflow_utils.py new file mode 100644 index 000000000..fb6124bef --- /dev/null +++ b/mlflow_utils/mlflow_utils.py @@ -0,0 +1,45 @@ +import zipfile +from typing import Any, Dict +import mlflow +from mlrun.serving.v2_serving import V2ModelServer +import pandas as pd + + +class MLFlowModelServer(V2ModelServer): + """ + MLFlow tracker Model serving class, inheriting the V2ModelServer class for being initialized automatically by the model + server and be able to run locally as part of a nuclio serverless function, or as part of a real-time pipeline. + """ + + def load(self): + """ + loads a model that was logged by the MLFlow tracker model + """ + # Unzip the model dir and then use mlflow's load function + model_file, _ = self.get_model(".zip") + model_path_unzip = model_file.replace(".zip", "") + + with zipfile.ZipFile(model_file, "r") as zip_ref: + zip_ref.extractall(model_path_unzip) + + self.model = mlflow.pyfunc.load_model(model_path_unzip) + + def predict(self, request: Dict[str, Any]) -> list: + """ + Infer the inputs through the model. The inferred data will + be read from the "inputs" key of the request. + + :param request: The request to the model using xgboost's predict. + The input to the model will be read from the "inputs" key. + + :return: The model's prediction on the given input. + """ + + # Get the inputs and set to accepted type: + inputs = pd.DataFrame(request["inputs"]) + + # Predict using the model's predict function: + predictions = self.model.predict(inputs) + + # Return as list: + return predictions.tolist() diff --git a/mlflow_utils/requirements.txt b/mlflow_utils/requirements.txt new file mode 100644 index 000000000..2ecc4ff91 --- /dev/null +++ b/mlflow_utils/requirements.txt @@ -0,0 +1,3 @@ +mlflow==2.12.2 +lightgbm +xgboost \ No newline at end of file diff --git a/mlflow_utils/test_mlflow_utils.py b/mlflow_utils/test_mlflow_utils.py new file mode 100644 index 000000000..70d6ce03f --- /dev/null +++ b/mlflow_utils/test_mlflow_utils.py @@ -0,0 +1,179 @@ +# Copyright 2018 Iguazio +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +import tempfile + +import lightgbm as lgb +import mlflow +import mlflow.environment_variables +import mlflow.xgboost +import pytest +import xgboost as xgb +from sklearn import datasets +from sklearn.metrics import accuracy_score, log_loss +from sklearn.model_selection import train_test_split + +import os +# os.environ["MLRUN_IGNORE_ENV_FILE"] = "True" #TODO remove before push + +import mlrun +import mlrun.launcher.local +# Important: +# unlike mlconf which resets back to default after each test run, the mlflow configurations +# and env vars don't, so at the end of each test we need to redo anything we set in that test. +# what we cover in these tests: logging "regular" runs with, experiment name, run id and context +# name (last two using mlconf), failing run mid-way, and a run with no handler. +# we also test here importing of runs, artifacts and models from a previous run. + +# simple mlflow example of lgb logging +def lgb_run(): + # prepare train and test data + iris = datasets.load_iris() + X = iris.data + y = iris.target + X_train, X_test, y_train, y_test = train_test_split( + X, y, test_size=0.2, random_state=42 + ) + + # enable auto logging + mlflow.lightgbm.autolog() + + train_set = lgb.Dataset(X_train, label=y_train) + + with mlflow.start_run(): + # train model + params = { + "objective": "multiclass", + "num_class": 3, + "learning_rate": 0.1, + "metric": "multi_logloss", + "colsample_bytree": 1.0, + "subsample": 1.0, + "seed": 42, + } + # model and training data are being logged automatically + model = lgb.train( + params, + train_set, + num_boost_round=10, + valid_sets=[train_set], + valid_names=["train"], + ) + + # evaluate model + y_proba = model.predict(X_test) + y_pred = y_proba.argmax(axis=1) + loss = log_loss(y_test, y_proba) + acc = accuracy_score(y_test, y_pred) + + # log metrics + mlflow.log_metrics({"log_loss": loss, "accuracy": acc}) + + +# simple mlflow example of xgb logging +def xgb_run(): + # prepare train and test data + iris = datasets.load_iris() + x = iris.data + y = iris.target + x_train, x_test, y_train, y_test = train_test_split( + x, y, test_size=0.2, random_state=42 + ) + + # enable auto logging + mlflow.xgboost.autolog() + + dtrain = xgb.DMatrix(x_train, label=y_train) + dtest = xgb.DMatrix(x_test, label=y_test) + + with mlflow.start_run(): + # train model + params = { + "objective": "multi:softprob", + "num_class": 3, + "learning_rate": 0.3, + "eval_metric": "mlogloss", + "colsample_bytree": 1.0, + "subsample": 1.0, + "seed": 42, + } + # model and training data are being logged automatically + model = xgb.train(params, dtrain, evals=[(dtrain, "train")]) + # evaluate model + y_proba = model.predict(dtest) + y_pred = y_proba.argmax(axis=1) + loss = log_loss(y_test, y_proba) + acc = accuracy_score(y_test, y_pred) + # log metrics + mlflow.log_metrics({"log_loss": loss, "accuracy": acc}) + + +@pytest.mark.parametrize("handler", ["xgb_run", "lgb_run"]) +def test_track_run_with_experiment_name(handler): + """ + This test is for tracking a run logged by mlflow into mlrun while it's running using the experiment name. + first activate the tracking option in mlconf, then we name the mlflow experiment, + then we run some code that is being logged by mlflow using mlrun, + and finally compare the mlrun we tracked with the original mlflow run using the validate func + """ + # Enable general tracking + mlrun.mlconf.external_platform_tracking.enabled = True + # Set the mlflow experiment name + mlflow.environment_variables.MLFLOW_EXPERIMENT_NAME.set(f"{handler}_test_track") + with tempfile.TemporaryDirectory() as test_directory: + mlflow.set_tracking_uri(test_directory) # Tell mlflow where to save logged data + + # Create a project for this tester: + project = mlrun.get_or_create_project(name="default", context=test_directory) + + # Create a MLRun function using the tester source file (all the functions must be located in it): + func = project.set_function( + func=__file__, + name=f"{handler}-test", + kind="job", + image="mlrun/mlrun", + requirements=["mlflow"], + ) + # mlflow creates a dir to log the run, this makes it in the tmpdir we create + trainer_run = func.run( + local=True, + handler=handler, + artifact_path=test_directory, + ) + + serving_func = project.set_function( + func=os.path.abspath("function.yaml"), + name=f"{handler}-server", + ) + model_name = f"{handler}-model" + # Add the model + upper_handler = handler.replace("_", "-") + model_path = test_directory + f"/{upper_handler}-test-{upper_handler}/0/model/" + serving_func.add_model( + model_name, + class_name="MLFlowModelServer", + model_path=model_path, + ) + + # Create a mock server + server = serving_func.to_mock_server() + + # An example taken randomly + result = server.test(f"/v2/models/{model_name}/predict", {"inputs": [[5.1, 3.5, 1.4, 0.2]]}) + print(result) + assert result + # unset mlflow experiment name to default + mlflow.environment_variables.MLFLOW_EXPERIMENT_NAME.unset() + + diff --git a/model_server/function.yaml b/model_server/function.yaml index 1539a3810..cb082c184 100644 --- a/model_server/function.yaml +++ b/model_server/function.yaml @@ -44,7 +44,7 @@ spec: - name: MODEL_CLASS value: ClassifierModel handler: model_server:handler - runtime: python:3.6 + runtime: python:3.9 volumes: [] source: '' function_kind: serving diff --git a/pii_recognizer/function.yaml b/pii_recognizer/function.yaml index 54b448d9c..069fa1ffe 100644 --- a/pii_recognizer/function.yaml +++ b/pii_recognizer/function.yaml @@ -2,13 +2,14 @@ kind: job metadata: name: pii-recognizer tag: '' - hash: b09b7b9a4ffd55088d665a0191055411e9198a2f + hash: 818930645d33704e9cada919769ee9d93cbb9434 project: '' labels: author: pgw categories: - machine-learning - data-preparation + - NLP spec: command: '' args: [] diff --git a/pii_recognizer/item.yaml b/pii_recognizer/item.yaml index 2f618febc..41ead33b6 100644 --- a/pii_recognizer/item.yaml +++ b/pii_recognizer/item.yaml @@ -2,6 +2,7 @@ apiVersion: v1 categories: - machine-learning - data-preparation + - NLP description: This function is used to recognize PII in a directory of text files doc: '' example: pii_recognizer.ipynb @@ -30,5 +31,5 @@ spec: - st-annotated-text - https://huggingface.co/beki/en_spacy_pii_distilbert/resolve/main/en_spacy_pii_distilbert-any-py3-none-any.whl url: '' -version: 0.2.0 +version: 0.3.0 test_valid: False diff --git a/pyannote_audio/function.yaml b/pyannote_audio/function.yaml index 2e84fbd92..30870afa2 100644 --- a/pyannote_audio/function.yaml +++ b/pyannote_audio/function.yaml @@ -2,14 +2,14 @@ kind: job metadata: name: pyannote-audio tag: '' - hash: c45be8d7f51f0b2203155b08c307814a2cb0ac78 + hash: aed670a0534ebf30690dd2af7acad35595c7d5b1 project: '' labels: author: guyl categories: - deep-learning - - Huggingface - - Audio + - huggingface + - audio spec: command: '' args: [] diff --git a/pyannote_audio/item.yaml b/pyannote_audio/item.yaml index 7133ceb41..b69add9e6 100644 --- a/pyannote_audio/item.yaml +++ b/pyannote_audio/item.yaml @@ -1,8 +1,8 @@ apiVersion: v1 categories: - deep-learning -- Huggingface -- Audio +- huggingface +- audio description: pyannote's speech diarization of audio files doc: '' example: pyannote_audio.ipynb @@ -27,4 +27,4 @@ spec: - torchaudio - tqdm url: '' -version: 1.1.0 +version: 1.2.0 diff --git a/question_answering/function.yaml b/question_answering/function.yaml index a33614153..7491b17e9 100644 --- a/question_answering/function.yaml +++ b/question_answering/function.yaml @@ -2,11 +2,13 @@ kind: job metadata: name: question-answering tag: '' - hash: 90e67d116b256a98da7d5819724e43df01d8b4eb + hash: aed62db95f17576c69b457767e3595c2de1d5465 project: '' labels: author: yonish categories: + - genai + - huggingface - machine-learning spec: command: '' diff --git a/question_answering/item.yaml b/question_answering/item.yaml index 58ab5cc36..56fc5a5ec 100755 --- a/question_answering/item.yaml +++ b/question_answering/item.yaml @@ -1,5 +1,7 @@ apiVersion: v1 categories: +- genai +- huggingface - machine-learning description: GenAI approach of question answering on a given data doc: '' @@ -24,4 +26,4 @@ spec: - torch - tqdm url: '' -version: 0.3.1 +version: 0.4.0 diff --git a/silero_vad/function.yaml b/silero_vad/function.yaml index 0b4ad422b..8ec121a6b 100644 --- a/silero_vad/function.yaml +++ b/silero_vad/function.yaml @@ -2,14 +2,14 @@ kind: job metadata: name: silero-vad tag: '' - hash: 61b7a70c167b7819481fdabf9350fc6fa344d2f5 + hash: 59336f808643a74f3a2c5d506977387010427208 project: '' labels: author: guyl categories: - deep-learning - - PyTorch - - Audio + - pytorch + - audio spec: command: '' args: [] diff --git a/silero_vad/item.yaml b/silero_vad/item.yaml index 17c8eb62c..9ce9a5d2e 100644 --- a/silero_vad/item.yaml +++ b/silero_vad/item.yaml @@ -1,8 +1,8 @@ apiVersion: v1 categories: - deep-learning -- PyTorch -- Audio +- pytorch +- audio description: Silero VAD (Voice Activity Detection) functions. doc: '' example: silero_vad.ipynb @@ -27,4 +27,4 @@ spec: - tqdm - onnxruntime url: '' -version: 1.2.0 +version: 1.3.0 diff --git a/structured_data_generator/function.yaml b/structured_data_generator/function.yaml index 6f2039e4b..1093e178b 100644 --- a/structured_data_generator/function.yaml +++ b/structured_data_generator/function.yaml @@ -2,7 +2,7 @@ kind: job metadata: name: structured-data-generator tag: '' - hash: ac969f46aae91804024ea736856267c26578864b + hash: 44bb39f4bc55b38fc7ead1df24cb02bcf7f05bc9 project: '' labels: author: zeevr @@ -10,7 +10,7 @@ metadata: - machine-learning - data-preparation - data-generation - - GenAI + - genai spec: command: '' args: [] diff --git a/structured_data_generator/item.yaml b/structured_data_generator/item.yaml index 27e0e3fab..be2a2a948 100755 --- a/structured_data_generator/item.yaml +++ b/structured_data_generator/item.yaml @@ -3,7 +3,7 @@ categories: - machine-learning - data-preparation - data-generation -- GenAI +- genai description: GenAI approach of generating structured data according to a given schema doc: '' example: structured_data_generator.ipynb @@ -26,4 +26,4 @@ spec: - langchain - tqdm url: '' -version: 1.4.0 +version: 1.5.0 diff --git a/text_to_audio_generator/function.yaml b/text_to_audio_generator/function.yaml index df142d2ef..88ef9cb89 100644 --- a/text_to_audio_generator/function.yaml +++ b/text_to_audio_generator/function.yaml @@ -2,13 +2,14 @@ kind: job metadata: name: text-to-audio-generator tag: '' - hash: 534e34d316098dcb345860a786ea013102150e67 + hash: 89fcaf3fab53e7b7fbba448a5e65c253d7fa66ed project: '' labels: author: yonatans categories: - data-preparation - machine-learning + - pytorch spec: command: '' args: [] diff --git a/text_to_audio_generator/item.yaml b/text_to_audio_generator/item.yaml index 4784a80d2..efa8afc90 100644 --- a/text_to_audio_generator/item.yaml +++ b/text_to_audio_generator/item.yaml @@ -2,6 +2,7 @@ apiVersion: v1 categories: - data-preparation - machine-learning +- pytorch description: Generate audio file from text using different speakers doc: '' example: text_to_audio_generator.ipynb @@ -24,5 +25,5 @@ spec: - bark - torchaudio url: '' -version: 1.1.0 +version: 1.2.0 test_valid: True diff --git a/tf2_serving/function.yaml b/tf2_serving/function.yaml index a8fa7ce66..c755263ae 100644 --- a/tf2_serving/function.yaml +++ b/tf2_serving/function.yaml @@ -46,7 +46,7 @@ spec: - name: MODEL_CLASS value: TF2Model handler: tf2_serving:handler - runtime: python:3.6 + runtime: python:3.9 volumes: [] source: '' function_kind: serving \ No newline at end of file diff --git a/transcribe/function.yaml b/transcribe/function.yaml index 40dd2f0e6..d72751ad6 100644 --- a/transcribe/function.yaml +++ b/transcribe/function.yaml @@ -2,12 +2,14 @@ kind: job metadata: name: transcribe tag: '' - hash: 5cd620de67a936ee8a87cfc1f0b97e19730d0a69 + hash: 8810ac74045bd15cee15a2e4e89563e8e29908d3 project: '' labels: author: yonatans categories: - data-preparation + - genai + - huggingface - machine-learning spec: command: '' @@ -24,6 +26,7 @@ spec: - tqdm - torchaudio - torch + - accelerate entry_points: do_task: name: do_task diff --git a/transcribe/item.yaml b/transcribe/item.yaml index d53341ff2..7fddcf95e 100644 --- a/transcribe/item.yaml +++ b/transcribe/item.yaml @@ -1,6 +1,8 @@ apiVersion: v1 categories: - data-preparation +- genai +- huggingface - machine-learning description: Transcribe audio files into text files doc: '' @@ -27,4 +29,4 @@ spec: - torch - accelerate url: '' -version: 1.0.0 \ No newline at end of file +version: 1.1.0 \ No newline at end of file diff --git a/translate/function.yaml b/translate/function.yaml index 1a3fd7a88..bb1656103 100644 --- a/translate/function.yaml +++ b/translate/function.yaml @@ -2,13 +2,16 @@ kind: job metadata: name: translate tag: '' - hash: bc26313449cd13554a18106ed9893535fb79dd6e + hash: 7eedf684bcebfbfd964e5503afbb56335c8f4097 project: '' labels: author: guyl categories: - data-preparation + - huggingface - machine-learning + - deep-learning + - NLP spec: command: '' args: [] @@ -34,24 +37,27 @@ spec: - name: root_worker_inputs type: Dict[str, Any] default: null - outputs: - - default: '' + outputs: [] lineno: 56 + has_varargs: false + has_kwargs: false decorator: name: decorator doc: '' parameters: - name: handler - outputs: - - default: '' + outputs: [] lineno: 68 + has_varargs: false + has_kwargs: false wrapper: name: wrapper doc: '' parameters: [] - outputs: - - default: '' + outputs: [] lineno: 73 + has_varargs: false + has_kwargs: true translate: name: translate doc: 'Translate text files using a transformer model from Huggingface''s hub @@ -112,8 +118,10 @@ spec: default: false outputs: - doc: 'A tuple of:' - default: '' + type: Tuple[str, pd.DataFrame, dict] lineno: 135 + has_varargs: false + has_kwargs: false description: Translate text files from one language to another default_handler: translate disable_auto_mount: false diff --git a/translate/item.yaml b/translate/item.yaml index f85a55990..e63947349 100644 --- a/translate/item.yaml +++ b/translate/item.yaml @@ -1,6 +1,7 @@ apiVersion: v1 categories: - data-preparation +- huggingface - machine-learning - deep-learning - NLP @@ -28,5 +29,5 @@ spec: - torch - tqdm url: '' -version: 0.0.2 +version: 0.1.0 test_valid: True diff --git a/v2_model_server/function.yaml b/v2_model_server/function.yaml index 53fb00ea1..45d261b6a 100644 --- a/v2_model_server/function.yaml +++ b/v2_model_server/function.yaml @@ -70,14 +70,14 @@ spec: annotations: nuclio.io/generated_by: function generated from /home/michaell/projects/functions/v2_model_server/v2_model_server.py spec: - runtime: python:3.6 + runtime: python:3.9 handler: v2_model_server:handler env: [] volumes: [] build: commands: [] noBaseImagesPull: true - functionSourceCode: IyBHZW5lcmF0ZWQgYnkgbnVjbGlvLmV4cG9ydC5OdWNsaW9FeHBvcnRlcgoKaW1wb3J0IG1scnVuCgpmcm9tIGNsb3VkcGlja2xlIGltcG9ydCBsb2FkCmZyb20gdHlwaW5nIGltcG9ydCBMaXN0CmZyb20gc2tsZWFybi5kYXRhc2V0cyBpbXBvcnQgbG9hZF9pcmlzCmltcG9ydCBudW1weSBhcyBucAoKaW1wb3J0IHdhcm5pbmdzCgp3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIikKCgpjbGFzcyBDbGFzc2lmaWVyTW9kZWwobWxydW4uc2VydmluZy5WMk1vZGVsU2VydmVyKToKICAgIGRlZiBsb2FkKHNlbGYpOgogICAgICAgICIiImxvYWQgYW5kIGluaXRpYWxpemUgdGhlIG1vZGVsIGFuZC9vciBvdGhlciBlbGVtZW50cyIiIgogICAgICAgIG1vZGVsX2ZpbGUsIGV4dHJhX2RhdGEgPSBzZWxmLmdldF9tb2RlbCgiLnBrbCIpCiAgICAgICAgc2VsZi5tb2RlbCA9IGxvYWQob3Blbihtb2RlbF9maWxlLCAicmIiKSkKCiAgICBkZWYgcHJlZGljdChzZWxmLCBib2R5OiBkaWN0KSAtPiBMaXN0OgogICAgICAgICIiIkdlbmVyYXRlIG1vZGVsIHByZWRpY3Rpb25zIGZyb20gc2FtcGxlLiIiIgogICAgICAgIGZlYXRzID0gbnAuYXNhcnJheShib2R5WyJpbnB1dHMiXSkKICAgICAgICByZXN1bHQ6IG5wLm5kYXJyYXkgPSBzZWxmLm1vZGVsLnByZWRpY3QoZmVhdHMpCiAgICAgICAgcmV0dXJuIHJlc3VsdC50b2xpc3QoKQoKCmZyb20gbWxydW4ucnVudGltZXMgaW1wb3J0IG51Y2xpb19pbml0X2hvb2sKCgpkZWYgaW5pdF9jb250ZXh0KGNvbnRleHQpOgogICAgbnVjbGlvX2luaXRfaG9vayhjb250ZXh0LCBnbG9iYWxzKCksICJzZXJ2aW5nX3YyIikKCgpkZWYgaGFuZGxlcihjb250ZXh0LCBldmVudCk6CiAgICByZXR1cm4gY29udGV4dC5tbHJ1bl9oYW5kbGVyKGNvbnRleHQsIGV2ZW50KQoKZnJvbSBtbHJ1bi5ydW50aW1lcyBpbXBvcnQgbnVjbGlvX2luaXRfaG9vawpkZWYgaW5pdF9jb250ZXh0KGNvbnRleHQpOgogICAgbnVjbGlvX2luaXRfaG9vayhjb250ZXh0LCBnbG9iYWxzKCksICdzZXJ2aW5nX3YyJykKCmRlZiBoYW5kbGVyKGNvbnRleHQsIGV2ZW50KToKICAgIHJldHVybiBjb250ZXh0Lm1scnVuX2hhbmRsZXIoY29udGV4dCwgZXZlbnQpCg== + functionSourceCode: IyBDb3B5cmlnaHQgMjAxOSBJZ3VhemlvCiMKIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiMKIyBHZW5lcmF0ZWQgYnkgbnVjbGlvLmV4cG9ydC5OdWNsaW9FeHBvcnRlcgoKaW1wb3J0IG1scnVuCgpmcm9tIGNsb3VkcGlja2xlIGltcG9ydCBsb2FkCmZyb20gdHlwaW5nIGltcG9ydCBMaXN0CmZyb20gc2tsZWFybi5kYXRhc2V0cyBpbXBvcnQgbG9hZF9pcmlzCmltcG9ydCBudW1weSBhcyBucAoKaW1wb3J0IHdhcm5pbmdzCgp3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIikKCgpjbGFzcyBDbGFzc2lmaWVyTW9kZWwobWxydW4uc2VydmluZy5WMk1vZGVsU2VydmVyKToKICAgIGRlZiBsb2FkKHNlbGYpOgogICAgICAgICIiImxvYWQgYW5kIGluaXRpYWxpemUgdGhlIG1vZGVsIGFuZC9vciBvdGhlciBlbGVtZW50cyIiIgogICAgICAgIG1vZGVsX2ZpbGUsIGV4dHJhX2RhdGEgPSBzZWxmLmdldF9tb2RlbCgiLnBrbCIpCiAgICAgICAgc2VsZi5tb2RlbCA9IGxvYWQob3Blbihtb2RlbF9maWxlLCAicmIiKSkKCiAgICBkZWYgcHJlZGljdChzZWxmLCBib2R5OiBkaWN0KSAtPiBMaXN0OgogICAgICAgICIiIkdlbmVyYXRlIG1vZGVsIHByZWRpY3Rpb25zIGZyb20gc2FtcGxlLiIiIgogICAgICAgIGZlYXRzID0gbnAuYXNhcnJheShib2R5WyJpbnB1dHMiXSkKICAgICAgICByZXN1bHQ6IG5wLm5kYXJyYXkgPSBzZWxmLm1vZGVsLnByZWRpY3QoZmVhdHMpCiAgICAgICAgcmV0dXJuIHJlc3VsdC50b2xpc3QoKQpmcm9tIG1scnVuLnJ1bnRpbWVzIGltcG9ydCBudWNsaW9faW5pdF9ob29rCmRlZiBpbml0X2NvbnRleHQoY29udGV4dCk6CiAgICBudWNsaW9faW5pdF9ob29rKGNvbnRleHQsIGdsb2JhbHMoKSwgJ3NlcnZpbmdfdjInKQoKZGVmIGhhbmRsZXIoY29udGV4dCwgZXZlbnQpOgogICAgcmV0dXJuIGNvbnRleHQubWxydW5faGFuZGxlcihjb250ZXh0LCBldmVudCkK source: '' function_kind: serving_v2 default_class: ClassifierModel diff --git a/v2_model_server/item.yaml b/v2_model_server/item.yaml index e0d6b0f96..7bde91a64 100644 --- a/v2_model_server/item.yaml +++ b/v2_model_server/item.yaml @@ -25,4 +25,4 @@ spec: kind: serving requirements: [] url: '' -version: 1.1.0 +version: 1.2.0 diff --git a/v2_model_server/v2_model_server.py b/v2_model_server/v2_model_server.py index dbaa72ef2..572f1680d 100644 --- a/v2_model_server/v2_model_server.py +++ b/v2_model_server/v2_model_server.py @@ -37,14 +37,3 @@ def predict(self, body: dict) -> List: feats = np.asarray(body["inputs"]) result: np.ndarray = self.model.predict(feats) return result.tolist() - - -from mlrun.runtimes import nuclio_init_hook - - -def init_context(context): - nuclio_init_hook(context, globals(), "serving_v2") - - -def handler(context, event): - return context.mlrun_handler(context, event) From 6ded2af5f12705afbb5c8070052894c9bb76e4c9 Mon Sep 17 00:00:00 2001 From: Eyal Danieli Date: Wed, 25 Sep 2024 15:53:08 +0300 Subject: [PATCH 22/38] set `navigation_with_keys` to False (#829) --- cli/marketplace/conf.template | 1 + 1 file changed, 1 insertion(+) diff --git a/cli/marketplace/conf.template b/cli/marketplace/conf.template index 8c6e9f344..f78fde1e6 100644 --- a/cli/marketplace/conf.template +++ b/cli/marketplace/conf.template @@ -93,6 +93,7 @@ html_theme_options = { "path_to_docs": "docs", "repository_branch": "{{repository_branch}}", "single_page": True, + "navigation_with_keys": False, } html_title = "{{html_title}}" From 60c5349153f0c7207a46b55a99f1250c1eee54c5 Mon Sep 17 00:00:00 2001 From: Eyal Danieli Date: Wed, 25 Sep 2024 16:38:10 +0300 Subject: [PATCH 23/38] remove xgb and churn functions (#830) --- catalog.yaml | 180 --- churn_server/README.md | 15 - churn_server/churn_server.ipynb | 503 -------- churn_server/churn_server.py | 45 - churn_server/function.yaml | 51 - churn_server/item.yaml | 32 - churn_server/requirements.txt | 2 - churn_server/test_churn_server.py | 67 - coxph_test/coxph_test.ipynb | 969 --------------- coxph_test/coxph_test.py | 75 -- coxph_test/function.yaml | 63 - coxph_test/item.yaml | 26 - coxph_trainer/coxph_trainer.ipynb | 1799 --------------------------- coxph_trainer/coxph_trainer.py | 201 --- coxph_trainer/function.yaml | 108 -- coxph_trainer/item.yaml | 26 - coxph_trainer/requirements.txt | 6 - coxph_trainer/test_coxph_trainer.py | 136 -- xgb_test/function.yaml | 63 - xgb_test/item.yaml | 25 - xgb_test/requirements.txt | 8 - xgb_test/test_xgb_test.py | 148 --- xgb_test/xgb_test.ipynb | 708 ----------- xgb_test/xgb_test.py | 61 - xgb_trainer/function.yaml | 102 -- xgb_trainer/item.yaml | 24 - xgb_trainer/requirements.txt | 8 - xgb_trainer/test_xgb_trainer.py | 50 - xgb_trainer/xgb_trainer.ipynb | 1013 --------------- xgb_trainer/xgb_trainer.py | 160 --- 30 files changed, 6674 deletions(-) delete mode 100644 churn_server/README.md delete mode 100644 churn_server/churn_server.ipynb delete mode 100644 churn_server/churn_server.py delete mode 100644 churn_server/function.yaml delete mode 100644 churn_server/item.yaml delete mode 100644 churn_server/requirements.txt delete mode 100644 churn_server/test_churn_server.py delete mode 100644 coxph_test/coxph_test.ipynb delete mode 100644 coxph_test/coxph_test.py delete mode 100644 coxph_test/function.yaml delete mode 100644 coxph_test/item.yaml delete mode 100644 coxph_trainer/coxph_trainer.ipynb delete mode 100644 coxph_trainer/coxph_trainer.py delete mode 100644 coxph_trainer/function.yaml delete mode 100644 coxph_trainer/item.yaml delete mode 100644 coxph_trainer/requirements.txt delete mode 100644 coxph_trainer/test_coxph_trainer.py delete mode 100644 xgb_test/function.yaml delete mode 100644 xgb_test/item.yaml delete mode 100644 xgb_test/requirements.txt delete mode 100644 xgb_test/test_xgb_test.py delete mode 100644 xgb_test/xgb_test.ipynb delete mode 100644 xgb_test/xgb_test.py delete mode 100644 xgb_trainer/function.yaml delete mode 100644 xgb_trainer/item.yaml delete mode 100644 xgb_trainer/requirements.txt delete mode 100644 xgb_trainer/test_xgb_trainer.py delete mode 100644 xgb_trainer/xgb_trainer.ipynb delete mode 100644 xgb_trainer/xgb_trainer.py diff --git a/catalog.yaml b/catalog.yaml index c3364fefa..f603b1b9b 100644 --- a/catalog.yaml +++ b/catalog.yaml @@ -15,62 +15,6 @@ arc-to-parquet: kind: job versions: latest: arc_to_parquet/function.yaml -bert-embeddings: - categories: - - NLP - - BERT - - embeddings - description: Get BERT based embeddings for given text - docfile: bert_embeddings/bert_embeddings.ipynb - kind: remote - versions: - latest: bert_embeddings/function.yaml -churn-server: - categories: - - serving - - ml - description: churn classification and predictor - docfile: churn_server/churn_server.ipynb - kind: serving - versions: - latest: churn_server/function.yaml -concept-drift: - categories: - - ml - - serve - description: Deploy a streaming Concept Drift detector on a labeled stream - docfile: concept_drift/concept_drift.ipynb - kind: job - versions: - latest: concept_drift/function.yaml -concept-drift-streaming: - categories: - - ml - - serve - description: Deploy a streaming Concept Drift detector on a labeled stream. the - nuclio part of the concept_drift function - docfile: concept_drift_streaming/concept_drift_streaming.ipynb - kind: remote - versions: - latest: concept_drift_streaming/function.yaml -coxph-test: - categories: - - ml - - test - description: Test cox proportional hazards model - docfile: coxph_test/coxph_test.ipynb - kind: job - versions: - latest: coxph_test/function.yaml -coxph-trainer: - categories: - - training - - ml - description: cox proportional hazards, kaplan meier plots - docfile: coxph_trainer/coxph_trainer.ipynb - kind: job - versions: - latest: coxph_trainer/function.yaml describe: categories: - analysis @@ -94,14 +38,6 @@ describe-spark: kind: job versions: latest: describe_spark/function.yaml -feature-perms: - categories: - - analysis - description: estimate feature importances using permutations - docfile: feature_perms/feature_perms.ipynb - kind: job - versions: - latest: feature_perms/function.yaml feature-selection: categories: - data-prep @@ -144,13 +80,6 @@ model-monitoring-batch: kind: job versions: latest: model_monitoring_batch/function.yaml -model-monitoring-stream: - categories: [] - description: '' - docfile: model_monitoring_stream/model_monitoring_stream.ipynb - kind: remote - versions: - latest: model_monitoring_stream/function.yaml model-server: categories: - serving @@ -178,30 +107,6 @@ open-archive: kind: job versions: latest: open_archive/function.yaml -pandas-profiling-report: - categories: - - analysis - description: Create Pandas Profiling Report from Dataset - docfile: pandas_profiling_report/pandas_profiling_report.ipynb - kind: job - versions: - latest: pandas_profiling_report/function.yaml -project-runner: - categories: - - utils - description: Nuclio based - Cron scheduler for running your MLRun projects - docfile: project_runner/project_runner.ipynb - kind: remote - versions: - latest: project_runner/function.yaml -rnn-serving: - categories: - - model-serving - description: deploy an rnn based stock analysis model server. - docfile: rnn_serving/rnn_serving.ipynb - kind: serving - versions: - latest: rnn_serving/function.yaml send-email: categories: - notifications @@ -240,14 +145,6 @@ sklearn-classifier-dask: kind: job versions: latest: sklearn_classifier_dask/function.yaml -slack-notify: - categories: - - ops - description: Send Slack notification - docfile: slack_notify/slack_notify.ipynb - kind: job - versions: - latest: slack_notify/function.yaml spark-submit: categories: [] description: '' @@ -255,23 +152,6 @@ spark-submit: kind: job versions: latest: spark_submit/function.yaml -sql-to-file: - categories: - - data-prep - description: SQL To File - Ingest data using SQL query - docfile: sql_to_file/sql_to_file.ipynb - kind: job - versions: - latest: sql_to_file/function.yaml -stream-to-parquet: - categories: - - ml - - serve - description: Saves a stream to Parquet and can lunch drift detection task on it - docfile: stream_to_parquet/stream_to_parquet.ipynb - kind: remote - versions: - latest: stream_to_parquet/function.yaml test-classifier: categories: - ml @@ -281,15 +161,6 @@ test-classifier: kind: job versions: latest: test_classifier/function.yaml -tf1-serving: - categories: - - serving - - dl - description: tf1 image classification server - docfile: tf1_serving/tf1_serving.ipynb - kind: remote - versions: - latest: tf1_serving/function.yaml tf2-serving: categories: - serving @@ -299,15 +170,6 @@ tf2-serving: kind: remote versions: latest: tf2_serving/function.yaml -tf2-serving-v2: - categories: - - serving - - dl - description: tf2 image classification server v2 - docfile: tf2_serving_v2/tf2_serving_v2.ipynb - kind: serving - versions: - latest: tf2_serving_v2/function.yaml v2-model-server: categories: - serving @@ -326,45 +188,3 @@ v2-model-tester: kind: job versions: latest: v2_model_tester/function.yaml -virtual-drift: - categories: - - ml - - serve - - concept-drift - description: Compute drift magnitude between Time-Samples T and U - docfile: virtual_drift/virtual_drift.ipynb - kind: job - versions: - latest: virtual_drift/function.yaml -xgb-custom: - categories: - - model-testing - description: simulate data with outliers. - docfile: xgb_custom/xgb_custom.ipynb - kind: job - versions: - latest: xgb_custom/function.yaml -xgb-serving: - categories: - - model-serving - description: deploy an XGBoost model server. - docfile: xgb_serving/xgb_serving.ipynb - kind: remote - versions: - latest: xgb_serving/function.yaml -xgb-test: - categories: - - model-test - description: Test one or more classifier models against held-out dataset. - docfile: xgb_test/xgb_test.ipynb - kind: job - versions: - latest: xgb_test/function.yaml -xgb-trainer: - categories: - - model-prep - description: train multiple model types using xgboost. - docfile: xgb_trainer/xgb_trainer.ipynb - kind: job - versions: - latest: xgb_trainer/function.yaml diff --git a/churn_server/README.md b/churn_server/README.md deleted file mode 100644 index b6a517a5a..000000000 --- a/churn_server/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# churn server - -the `churn-server` function was created as part of the **[churn demo](https://github.com/yjb-ds/demo-churn)**. A model server was needed that could combine the static model which answers the binary classification question "is this client churned or not-churned?" and the more dynamic model, which tries to add a time dimension to the prediction by providing an esdtimate of when and with what certainty churn events are likely to occur. - -the function `coxph_trainer` will output multiple models within a nested directory structire starting at `models_dest`: -* the coxph model is stored at `models_dest/cox` -* the [kaplan-meier](https://en.wikipedia.org/wiki/Kaplan%E2%80%93Meier_estimator) model at `models_dest/cox/km` - -each one of these pickled models stores all of the meta-data, vector and table estimates, including projections and scenarios - -with only slight modification, a more generic version of this server would enable its application in the domains of **[predictive maintenance](https://docs.microsoft.com/en-us/archive/msdn-magazine/2019/may/machine-learning-using-survival-analysis-for-predictive-maintenance)**, **[health](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3227332/)**, **finance** and **insurance** to name a few. - -**note** - -a small file `encode-data.csv` can be find in the root of this function folder, it is used to test the server. \ No newline at end of file diff --git a/churn_server/churn_server.ipynb b/churn_server/churn_server.ipynb deleted file mode 100644 index b8a962772..000000000 --- a/churn_server/churn_server.ipynb +++ /dev/null @@ -1,503 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "pycharm": { - "name": "#%% md\n" - } - }, - "source": [ - "# **Churn Server**\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "in the following section we create a new model serving function which wraps our class , and specify model and other resources.\n", - "Deploying the serving function will provide us an http endpoint that can handle requests in real time.\n", - "This function is part of the [customer-churn-prediction demo](https://github.com/mlrun/demos/tree/master/customer-churn-prediction).
\n", - "To see how the model is trained or how the data-set is generated, check out `coxph_trainer` and `xgb_trainer` functions from the function marketplace repository." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Steps**\n", - "1. [Setup function parameters](#Setup-function-parameters)\n", - "2. [Importing the function](#Importing-the-function)\n", - "3. [Testing the function locally](#Testing-the-function-locally)\n", - "4. [Testing the function remotely](#Testing-the-function-remotely)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import warnings\n", - "warnings.filterwarnings(\"ignore\")" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "# Following packages are required, make sure to install\n", - "# !pip install xgboost==1.3.1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Setup function parameters**" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "# Setting up models path\n", - "xgb_model_path = 'https://s3.wasabisys.com/iguazio/models/function-marketplace-models/churn_server/xgb_model.pkl'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Importing the function**" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2021-10-14 06:10:16,104 [info] loaded project function-marketplace from MLRun DB\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import mlrun\n", - "mlrun.set_environment(project='function-marketplace')\n", - "\n", - "# Importing the function from the hub\n", - "fn = mlrun.import_function(\"hub://churn_server:development\")\n", - "fn.apply(mlrun.auto_mount())\n", - "\n", - "# Manually specifying needed packages \n", - "fn.spec.build.commands = ['pip install lifelines==0.22.8', 'pip install xgboost==1.3.1']\n", - "\n", - "# Adding the model \n", - "fn.add_model(key='xgb_model', model_path=xgb_model_path ,class_name='ChurnModel')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Testing the function locally**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "> Note that this function is a serving function, hence not needs to run, but deployed.
\n", - "\n", - "in order to test locally without deploying to server, mlrun provides mocking api that simulate the action." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2021-10-14 06:10:19,145 [info] model xgb_model was loaded\n", - "> 2021-10-14 06:10:19,145 [info] Initializing endpoint records\n", - "> 2021-10-14 06:10:19,164 [info] Loaded ['xgb_model']\n" - ] - } - ], - "source": [ - "# When mocking, class has to be present\n", - "from churn_server import *\n", - "\n", - "# Mocking function\n", - "server = fn.to_mock_server()" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
genderseniorpartnerdepstenurePhoneServiceMultipleLinesOnlineSecurityOnlineBackupDeviceProtection...PaperlessBillingMonthlyChargestenure_mapISP_1ISP_2Contract_1Contract_2Payment_1Payment_2Payment_3
000102710100...1101.902.01010100
10100111000...185.700.01000010
21000110000...169.550.01000010
300005311011...0105.554.01001010
400004311011...1104.603.01001010
\n", - "

5 rows × 23 columns

\n", - "
" - ], - "text/plain": [ - " gender senior partner deps tenure PhoneService MultipleLines \\\n", - "0 0 0 1 0 27 1 0 \n", - "1 0 1 0 0 1 1 1 \n", - "2 1 0 0 0 1 1 0 \n", - "3 0 0 0 0 53 1 1 \n", - "4 0 0 0 0 43 1 1 \n", - "\n", - " OnlineSecurity OnlineBackup DeviceProtection ... PaperlessBilling \\\n", - "0 1 0 0 ... 1 \n", - "1 0 0 0 ... 1 \n", - "2 0 0 0 ... 1 \n", - "3 0 1 1 ... 0 \n", - "4 0 1 1 ... 1 \n", - "\n", - " MonthlyCharges tenure_map ISP_1 ISP_2 Contract_1 Contract_2 \\\n", - "0 101.90 2.0 1 0 1 0 \n", - "1 85.70 0.0 1 0 0 0 \n", - "2 69.55 0.0 1 0 0 0 \n", - "3 105.55 4.0 1 0 0 1 \n", - "4 104.60 3.0 1 0 0 1 \n", - "\n", - " Payment_1 Payment_2 Payment_3 \n", - "0 1 0 0 \n", - "1 0 1 0 \n", - "2 0 1 0 \n", - "3 0 1 0 \n", - "4 0 1 0 \n", - "\n", - "[5 rows x 23 columns]" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import pandas as pd\n", - "\n", - "#declaring test_set path\n", - "test_set_path = \"https://s3.wasabisys.com/iguazio/data/function-marketplace-data/churn_server/test_set.csv\"\n", - "\n", - "# Getting the data\n", - "x_test = pd.read_csv(test_set_path)\n", - "y_test = x_test['labels']\n", - "x_test.drop(['labels'],axis=1,inplace=True)\n", - "x_test.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "# KFServing protocol event\n", - "event_data = {\"inputs\": x_test.values.tolist()}" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "response = server.test(path='/v2/models/xgb_model/predict',body=event_data)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "When mocking to server, returned dict has the following fields : id, model_name, outputs\n" - ] - } - ], - "source": [ - "print(f'When mocking to server, returned dict has the following fields : {\", \".join([x for x in response.keys()])}')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Testing the function remotely**" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2021-10-14 06:10:20,163 [info] Starting remote function deploy\n", - "2021-10-14 06:10:20 (info) Deploying function\n", - "2021-10-14 06:10:20 (info) Building\n", - "2021-10-14 06:10:20 (info) Staging files and preparing base images\n", - "2021-10-14 06:10:20 (info) Building processor image\n", - "2021-10-14 06:10:21 (info) Build complete\n", - "2021-10-14 06:10:29 (info) Function deploy complete\n", - "> 2021-10-14 06:10:30,408 [info] successfully deployed function: {'internal_invocation_urls': ['nuclio-function-marketplace-churn-server.default-tenant.svc.cluster.local:8080'], 'external_invocation_urls': ['default-tenant.app.dev39.lab.iguazeng.com:31984']}\n" - ] - } - ], - "source": [ - "address = fn.deploy()" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "model's accuracy : 0.7913907284768212\n" - ] - } - ], - "source": [ - "import json\n", - "import requests\n", - "\n", - "# using requests to predict\n", - "response = requests.put(address + \"/v2/models/xgb_model/predict\", json=json.dumps(event_data))\n", - "\n", - "# returned data is a string \n", - "y_predict = json.loads(response.text)['outputs']\n", - "accuracy = sum(1 for x,y in zip(y_predict,y_test) if x == y) / len(y_test)\n", - "print(f\"model's accuracy : {accuracy}\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "[Back to the top](#Churn-Server)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/churn_server/churn_server.py b/churn_server/churn_server.py deleted file mode 100644 index def2850da..000000000 --- a/churn_server/churn_server.py +++ /dev/null @@ -1,45 +0,0 @@ -# Copyright 2019 Iguazio -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Generated by nuclio.export.NuclioExporter - -import numpy as np -from cloudpickle import load - - -import mlrun - - -class ChurnModel(mlrun.serving.V2ModelServer): - def load(self): - """ - load multiple models in nested folders, churn model only - """ - clf_model_file, extra_data = self.get_model(".pkl") - self.model = load(open(str(clf_model_file), "rb")) - if "cox" in extra_data.keys(): - cox_model_file = extra_data["cox"] - self.cox_model = load(open(str(cox_model_file), "rb")) - if "cox/km" in extra_data.keys(): - km_model_file = extra_data["cox/km"] - self.km_model = load(open(str(km_model_file), "rb")) - - def predict(self, body): - try: - feats = np.asarray(body["inputs"], dtype=np.float32).reshape(-1, 23) - result = self.model.predict(feats, validate_features=False) - return result.tolist() - except Exception as e: - raise Exception("Failed to predict %s" % e) - diff --git a/churn_server/function.yaml b/churn_server/function.yaml deleted file mode 100644 index 14f6c8cef..000000000 --- a/churn_server/function.yaml +++ /dev/null @@ -1,51 +0,0 @@ -kind: serving -metadata: - name: churn-server - tag: '' - hash: 805b4583ab8fa8df90c71d97eef54bbccf8729e8 - project: '' - labels: - author: Iguazio - framework: churn - categories: - - model-serving - - machine-learning -spec: - command: '' - args: [] - image: mlrun/ml-models - description: churn classification and predictor - min_replicas: 1 - max_replicas: 4 - env: - - name: ENABLE_EXPLAINER - value: 'False' - base_spec: - apiVersion: nuclio.io/v1 - kind: Function - metadata: - name: churn-server - labels: {} - annotations: - nuclio.io/generated_by: function generated from /User/functions/churn_server/churn_server.py - spec: - runtime: python:3.9 - handler: churn_server:handler - env: [] - volumes: [] - build: - commands: [] - noBaseImagesPull: true - functionSourceCode: IyBDb3B5cmlnaHQgMjAxOSBJZ3VhemlvCiMKIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiMKIyBHZW5lcmF0ZWQgYnkgbnVjbGlvLmV4cG9ydC5OdWNsaW9FeHBvcnRlcgoKaW1wb3J0IG51bXB5IGFzIG5wCmZyb20gY2xvdWRwaWNrbGUgaW1wb3J0IGxvYWQKCgppbXBvcnQgbWxydW4KCgpjbGFzcyBDaHVybk1vZGVsKG1scnVuLnNlcnZpbmcuVjJNb2RlbFNlcnZlcik6CiAgICBkZWYgbG9hZChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBsb2FkIG11bHRpcGxlIG1vZGVscyBpbiBuZXN0ZWQgZm9sZGVycywgY2h1cm4gbW9kZWwgb25seQogICAgICAgICIiIgogICAgICAgIGNsZl9tb2RlbF9maWxlLCBleHRyYV9kYXRhID0gc2VsZi5nZXRfbW9kZWwoIi5wa2wiKQogICAgICAgIHNlbGYubW9kZWwgPSBsb2FkKG9wZW4oc3RyKGNsZl9tb2RlbF9maWxlKSwgInJiIikpCiAgICAgICAgaWYgImNveCIgaW4gZXh0cmFfZGF0YS5rZXlzKCk6CiAgICAgICAgICAgIGNveF9tb2RlbF9maWxlID0gZXh0cmFfZGF0YVsiY294Il0KICAgICAgICAgICAgc2VsZi5jb3hfbW9kZWwgPSBsb2FkKG9wZW4oc3RyKGNveF9tb2RlbF9maWxlKSwgInJiIikpCiAgICAgICAgICAgIGlmICJjb3gva20iIGluIGV4dHJhX2RhdGEua2V5cygpOgogICAgICAgICAgICAgICAga21fbW9kZWxfZmlsZSA9IGV4dHJhX2RhdGFbImNveC9rbSJdCiAgICAgICAgICAgICAgICBzZWxmLmttX21vZGVsID0gbG9hZChvcGVuKHN0cihrbV9tb2RlbF9maWxlKSwgInJiIikpCgogICAgZGVmIHByZWRpY3Qoc2VsZiwgYm9keSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBmZWF0cyA9IG5wLmFzYXJyYXkoYm9keVsiaW5wdXRzIl0sIGR0eXBlPW5wLmZsb2F0MzIpLnJlc2hhcGUoLTEsIDIzKQogICAgICAgICAgICByZXN1bHQgPSBzZWxmLm1vZGVsLnByZWRpY3QoZmVhdHMsIHZhbGlkYXRlX2ZlYXR1cmVzPUZhbHNlKQogICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRvbGlzdCgpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIkZhaWxlZCB0byBwcmVkaWN0ICVzIiAlIGUpCgoKZnJvbSBtbHJ1bi5ydW50aW1lcyBpbXBvcnQgbnVjbGlvX2luaXRfaG9vawpkZWYgaW5pdF9jb250ZXh0KGNvbnRleHQpOgogICAgbnVjbGlvX2luaXRfaG9vayhjb250ZXh0LCBnbG9iYWxzKCksICdzZXJ2aW5nX3YyJykKCmRlZiBoYW5kbGVyKGNvbnRleHQsIGV2ZW50KToKICAgIHJldHVybiBjb250ZXh0Lm1scnVuX2hhbmRsZXIoY29udGV4dCwgZXZlbnQpCg== - source: '' - function_kind: serving_v2 - default_class: ChurnModel - build: - commands: - - python -m pip install xgboost==1.3.1 lifelines==0.22.8 - code_origin: https://github.com/daniels290813/functions.git#34d1b0d7e26924d931c2df2869425d01df21a23c:/User/functions/churn_server/churn_server.py - origin_filename: /User/functions/churn_server/churn_server.py - secret_sources: [] - disable_auto_mount: false - affinity: null -verbose: false diff --git a/churn_server/item.yaml b/churn_server/item.yaml deleted file mode 100644 index 09ba9b713..000000000 --- a/churn_server/item.yaml +++ /dev/null @@ -1,32 +0,0 @@ -apiVersion: v1 -categories: -- model-serving -- machine-learning -description: churn classification and predictor -doc: '' -example: churn_server.ipynb -generationDate: 2022-08-28:17-25 -hidden: false -icon: '' -labels: - author: Iguazio - framework: churn -maintainers: [] -marketplaceType: '' -mlrunVersion: 1.1.0 -name: churn-server -platformVersion: 3.5.0 -spec: - customFields: - default_class: ChurnModel - env: - ENABLE_EXPLAINER: 'False' - filename: churn_server.py - handler: handler - image: mlrun/ml-models - kind: serving - requirements: - - xgboost==1.3.1 - - lifelines==0.22.8 -url: '' -version: 1.2.0 diff --git a/churn_server/requirements.txt b/churn_server/requirements.txt deleted file mode 100644 index eb8827c5c..000000000 --- a/churn_server/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -wget -pygit2 \ No newline at end of file diff --git a/churn_server/test_churn_server.py b/churn_server/test_churn_server.py deleted file mode 100644 index 64d1b8490..000000000 --- a/churn_server/test_churn_server.py +++ /dev/null @@ -1,67 +0,0 @@ -# Copyright 2019 Iguazio -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -import os -import wget -from mlrun import import_function -import os.path -from os import path -import mlrun -from pygit2 import Repository - - -MODEL_PATH = os.path.join(os.path.abspath("./"), "models") -MODEL = MODEL_PATH + "model.pt" - - -def set_mlrun_hub_url(): - branch = Repository(".").head.shorthand - hub_url = "https://raw.githubusercontent.com/mlrun/functions/{}/churn_server/function.yaml".format( - branch - ) - mlrun.mlconf.hub_url = hub_url - - -def download_pretrained_model(model_path): - # Run this to download the pre-trained model to your `models` directory - import os - - model_location = None - saved_models_directory = model_path - # Create paths - os.makedirs(saved_models_directory, exist_ok=1) - model_filepath = os.path.join( - saved_models_directory, os.path.basename(model_location) - ) - wget.download(model_location, model_filepath) - - -def test_local_churn_server(): - # set_mlrun_hub_url() - # model_path = os.path.join(os.path.abspath("./"), "models") - # model = model_path + "/model.pt" - # if not path.exists(model): - # download_pretrained_model(model_path) - # fn = import_function("hub://churn_server") - # fn.add_model("mymodel", model_path=model, class_name="ChurnModel") - # # create an emulator (mock server) from the function configuration) - # server = fn.to_mock_server() - # - # instances = [ - # "I had a pleasure to work with such dedicated team. Looking forward to \ - # cooperate with each and every one of them again." - # ] - # result = server.test("/v2/models/mymodel/infer", {"instances": instances}) - # assert result[0] == 2 - print("we need to download churn model") diff --git a/coxph_test/coxph_test.ipynb b/coxph_test/coxph_test.ipynb deleted file mode 100644 index 0ee0b29c9..000000000 --- a/coxph_test/coxph_test.ipynb +++ /dev/null @@ -1,969 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# **CoxPH test**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This function handles evaluating Cox proportional hazards model performance, test one or more classifier models against held-out dataset Using held-out test features,
and evaluates the peformance of the estimated model.
\n", - "Can be part of a kubeflow pipeline as a test step that is run post EDA and training/validation cycles.
\n", - "This function is part of the [customer-churn-prediction](https://github.com/mlrun/demos/tree/master/customer-churn-prediction) demo.
\n", - "To see how the model is trained or how the data-set is generated, check out `coxph_trainer` function from the function marketplace repository" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Steps**\n", - "1. [Setup function parameters](#Setup-function-parameters)\n", - "2. [Importing the function](#Importing-the-function)\n", - "3. [Running the function locally](#Running-the-function-locally)\n", - "4. [Running the function remotely](#Running-the-function-remotely)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import warnings\n", - "warnings.filterwarnings(\"ignore\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Setup function parameters**" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "test_set = \"https://s3.wasabisys.com/iguazio/data/function-marketplace-data/xgb_test/test_set.csv\"\n", - "models_path = \"https://s3.wasabisys.com/iguazio/models/function-marketplace-models/coxph_test/cx-model.pkl\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Importing the function**" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2021-10-17 13:38:44,758 [info] loaded project function-marketplace from MLRun DB\n" - ] - } - ], - "source": [ - "import mlrun\n", - "mlrun.set_environment(project='function-marketplace')\n", - "\n", - "fn = mlrun.import_function(\"hub://coxph_test\")\n", - "fn.apply(mlrun.auto_mount())\n", - "\n", - "fn.spec.build.image=\"mlrun/ml-models\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Running the function locally**" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2021-10-17 13:38:45,149 [info] starting run tasks_coxph_test uid=be4bd195e5c146a69ecdee3b6a631569 DB=http://mlrun-api:8080\n", - "> 2021-10-17 13:38:49,428 [info] cox tester not implemented\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
projectuiditerstartstatenamelabelsinputsparametersresultsartifacts
function-marketplace0Oct 17 13:38:45completedtasks_coxph_test
v3io_user=dani
kind=
owner=dani
host=jupyter-dani-6bfbd76d96-zxx6f
test_set
models_path
label_column=labels
plots_dest=plots/xgb_test
cox-test-summary
\n", - "
\n", - "
\n", - "
\n", - " Title\n", - " ×\n", - "
\n", - " \n", - "
\n", - "
\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - }, - { - "data": { - "text/html": [ - " > to track results use the .show() or .logs() methods or click here to open in UI" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2021-10-17 13:38:49,497 [info] run executed, status=completed\n" - ] - } - ], - "source": [ - "coxph_run = fn.run(name='tasks_coxph_test',\n", - " params = {\"label_column\" : \"labels\",\n", - " \"plots_dest\" : \"plots/xgb_test\"},\n", - " inputs = {\"test_set\" : test_set,\n", - " \"models_path\" : models_path},\n", - " local=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
covariatecoefexp(coef)se(coef)coef lower 95%coef upper 95%exp(coef) lower 95%exp(coef) upper 95%zp-log2(p)
0gender0.7129862.040073e+000.3434710.0397951.3861761.0405983.9995282.0758260.0379104.721274
1senior-0.3301377.188252e-010.444705-1.2017430.5414680.3006701.718528-0.7423740.4578611.127018
2partner-0.3944496.740516e-010.432243-1.2416300.4527320.2889131.572603-0.9125620.3614731.468041
3deps0.6163731.852199e+000.499075-0.3617971.5945430.6964244.9260801.2350310.2168192.205436
4MultipleLines-0.7878854.548059e-011.087536-2.9194171.3436480.0539653.832999-0.7244670.4687791.093020
5OnlineSecurity-0.7666834.645512e-011.299746-3.3141391.7807720.0363655.934435-0.5898720.5552770.848721
6OnlineBackup-0.4666916.270740e-010.949068-2.3268291.3934480.0976054.028715-0.4917360.6229060.682914
7DeviceProtection-0.4126206.619136e-011.083731-2.5366941.7114530.0791285.537002-0.3807410.7033960.507591
8TechSupport0.5097561.664885e+001.168080-1.7796382.7991500.16869916.4306750.4364050.6625430.593915
9PaperlessBilling0.3499701.419025e+000.408827-0.4513171.1512570.6367893.1621650.8560330.3919801.351150
10MonthlyCharges-0.0783999.245958e-010.194463-0.4595390.3027420.6315741.353566-0.4031540.6868350.541965
11Contract_1-2.1882791.121096e-010.712197-3.584159-0.7923980.0277600.452758-3.0725750.0021228.880219
12Contract_2-19.9407672.186930e-093478.684973-6838.0380276798.1564930.000000inf-0.0057320.9954260.006614
13Payment_1-0.8654244.208732e-010.615020-2.0708400.3399930.1260801.404937-1.4071480.1593832.649426
14Payment_20.4583631.581483e+000.446978-0.4176971.3344230.6585623.7978051.0254720.3051411.712453
15Payment_30.2325191.261774e+000.641176-1.0241621.4892000.3590974.4335470.3626440.7168700.480216
\n", - "
" - ], - "text/plain": [ - " covariate coef exp(coef) se(coef) coef lower 95% \\\n", - "0 gender 0.712986 2.040073e+00 0.343471 0.039795 \n", - "1 senior -0.330137 7.188252e-01 0.444705 -1.201743 \n", - "2 partner -0.394449 6.740516e-01 0.432243 -1.241630 \n", - "3 deps 0.616373 1.852199e+00 0.499075 -0.361797 \n", - "4 MultipleLines -0.787885 4.548059e-01 1.087536 -2.919417 \n", - "5 OnlineSecurity -0.766683 4.645512e-01 1.299746 -3.314139 \n", - "6 OnlineBackup -0.466691 6.270740e-01 0.949068 -2.326829 \n", - "7 DeviceProtection -0.412620 6.619136e-01 1.083731 -2.536694 \n", - "8 TechSupport 0.509756 1.664885e+00 1.168080 -1.779638 \n", - "9 PaperlessBilling 0.349970 1.419025e+00 0.408827 -0.451317 \n", - "10 MonthlyCharges -0.078399 9.245958e-01 0.194463 -0.459539 \n", - "11 Contract_1 -2.188279 1.121096e-01 0.712197 -3.584159 \n", - "12 Contract_2 -19.940767 2.186930e-09 3478.684973 -6838.038027 \n", - "13 Payment_1 -0.865424 4.208732e-01 0.615020 -2.070840 \n", - "14 Payment_2 0.458363 1.581483e+00 0.446978 -0.417697 \n", - "15 Payment_3 0.232519 1.261774e+00 0.641176 -1.024162 \n", - "\n", - " coef upper 95% exp(coef) lower 95% exp(coef) upper 95% z \\\n", - "0 1.386176 1.040598 3.999528 2.075826 \n", - "1 0.541468 0.300670 1.718528 -0.742374 \n", - "2 0.452732 0.288913 1.572603 -0.912562 \n", - "3 1.594543 0.696424 4.926080 1.235031 \n", - "4 1.343648 0.053965 3.832999 -0.724467 \n", - "5 1.780772 0.036365 5.934435 -0.589872 \n", - "6 1.393448 0.097605 4.028715 -0.491736 \n", - "7 1.711453 0.079128 5.537002 -0.380741 \n", - "8 2.799150 0.168699 16.430675 0.436405 \n", - "9 1.151257 0.636789 3.162165 0.856033 \n", - "10 0.302742 0.631574 1.353566 -0.403154 \n", - "11 -0.792398 0.027760 0.452758 -3.072575 \n", - "12 6798.156493 0.000000 inf -0.005732 \n", - "13 0.339993 0.126080 1.404937 -1.407148 \n", - "14 1.334423 0.658562 3.797805 1.025472 \n", - "15 1.489200 0.359097 4.433547 0.362644 \n", - "\n", - " p -log2(p) \n", - "0 0.037910 4.721274 \n", - "1 0.457861 1.127018 \n", - "2 0.361473 1.468041 \n", - "3 0.216819 2.205436 \n", - "4 0.468779 1.093020 \n", - "5 0.555277 0.848721 \n", - "6 0.622906 0.682914 \n", - "7 0.703396 0.507591 \n", - "8 0.662543 0.593915 \n", - "9 0.391980 1.351150 \n", - "10 0.686835 0.541965 \n", - "11 0.002122 8.880219 \n", - "12 0.995426 0.006614 \n", - "13 0.159383 2.649426 \n", - "14 0.305141 1.712453 \n", - "15 0.716870 0.480216 " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "coxph_run.artifact('cox-test-summary').show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Running the function remotely**" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2021-10-17 13:38:49,644 [info] starting run tasks_coxph_test uid=c28d05f0261b4c60956eee528bf68e96 DB=http://mlrun-api:8080\n", - "> 2021-10-17 13:38:49,776 [info] Job is running in the background, pod: tasks-coxph-test-hfj9b\n", - "> 2021-10-17 13:38:59,015 [info] cox tester not implemented\n", - "> 2021-10-17 13:38:59,049 [info] run executed, status=completed\n", - "final state: completed\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
projectuiditerstartstatenamelabelsinputsparametersresultsartifacts
function-marketplace0Oct 17 13:38:56completedtasks_coxph_test
v3io_user=dani
kind=job
owner=dani
host=tasks-coxph-test-hfj9b
test_set
models_path
label_column=labels
plots_dest=plots/xgb_test
cox-test-summary
\n", - "
\n", - "
\n", - "
\n", - " Title\n", - " ×\n", - "
\n", - " \n", - "
\n", - "
\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - }, - { - "data": { - "text/html": [ - " > to track results use the .show() or .logs() methods or click here to open in UI" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2021-10-17 13:39:08,990 [info] run executed, status=completed\n" - ] - } - ], - "source": [ - "fn.deploy(with_mlrun=False, # mlrun is included in our image (mlrun/ml-models) therefore no mlrun installation is needed.\n", - " skip_deployed=True) # because no new packages or upgrade is required, we can use the original image and not build another one.\n", - "\n", - "coxph_run = fn.run(name='tasks_coxph_test',\n", - " params = {\"label_column\" : \"labels\",\n", - " \"plots_dest\" : \"plots/xgb_test\"},\n", - " inputs = {\"test_set\" : test_set,\n", - " \"models_path\" : models_path},\n", - " local=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "[Back to the top](#CoxPH-test)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/coxph_test/coxph_test.py b/coxph_test/coxph_test.py deleted file mode 100644 index f635fbdf3..000000000 --- a/coxph_test/coxph_test.py +++ /dev/null @@ -1,75 +0,0 @@ -# Copyright 2019 Iguazio -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Generated by nuclio.export.NuclioExporter - -import warnings - -warnings.simplefilter(action="ignore", category=FutureWarning) - -import os -import pandas as pd -from mlrun.datastore import DataItem -from mlrun.artifacts import get_model -from cloudpickle import load -from mlrun.mlutils.models import eval_class_model - - -def cox_test( - context, - models_path: DataItem, - test_set: DataItem, - label_column: str, - plots_dest: str = "plots", - model_evaluator=None, -) -> None: - """Test one or more classifier models against held-out dataset - - Using held-out test features, evaluates the peformance of the estimated model - - Can be part of a kubeflow pipeline as a test step that is run post EDA and - training/validation cycles - - :param context: the function context - :param model_file: model artifact to be tested - :param test_set: test features and labels - :param label_column: column name for ground truth labels - :param score_method: for multiclass classification - :param plots_dest: dir for test plots - :param model_evaluator: WIP: specific method to generate eval, passed in as string - or available in this folder - """ - xtest = test_set.as_df() - ytest = xtest.pop(label_column) - - model_file, model_obj, _ = get_model(models_path.url, suffix=".pkl") - model_obj = load(open(str(model_file), "rb")) - - try: - if not model_evaluator: - eval_metrics = eval_class_model(context, xtest, ytest, model_obj) - - model_plots = eval_metrics.pop("plots") - model_tables = eval_metrics.pop("tables") - for plot in model_plots: - context.log_artifact(plot, local_path=f"{plots_dest}/{plot.key}.html") - for tbl in model_tables: - context.log_artifact(tbl, local_path=f"{plots_dest}/{plot.key}.csv") - - context.log_results(eval_metrics) - except: - context.log_dataset( - "cox-test-summary", df=model_obj.summary, index=True, format="csv" - ) - context.logger.info("cox tester not implemented") diff --git a/coxph_test/function.yaml b/coxph_test/function.yaml deleted file mode 100644 index e09fb90a0..000000000 --- a/coxph_test/function.yaml +++ /dev/null @@ -1,63 +0,0 @@ -kind: job -metadata: - name: coxph-test - tag: '' - hash: 1edbfe55668a7dcfaa59a6aeb5b3b1bd3f594aab - project: '' - labels: - author: Iguazio - framework: survival - categories: - - machine-learning - - model-testing -spec: - command: '' - args: [] - image: mlrun/ml-models - env: [] - default_handler: cox_test - entry_points: - cox_test: - name: cox_test - doc: 'Test one or more classifier models against held-out dataset - - - Using held-out test features, evaluates the peformance of the estimated model - - - Can be part of a kubeflow pipeline as a test step that is run post EDA and - - training/validation cycles' - parameters: - - name: context - doc: the function context - default: '' - - name: models_path - type: DataItem - default: '' - - name: test_set - type: DataItem - doc: test features and labels - default: '' - - name: label_column - type: str - doc: column name for ground truth labels - default: '' - - name: plots_dest - type: str - doc: dir for test plots - default: plots - - name: model_evaluator - doc: 'WIP: specific method to generate eval, passed in as string or available - in this folder' - default: null - outputs: - - default: '' - lineno: 15 - description: Test cox proportional hazards model - build: - functionSourceCode: IyBHZW5lcmF0ZWQgYnkgbnVjbGlvLmV4cG9ydC5OdWNsaW9FeHBvcnRlcgoKaW1wb3J0IHdhcm5pbmdzCgp3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoYWN0aW9uPSJpZ25vcmUiLCBjYXRlZ29yeT1GdXR1cmVXYXJuaW5nKQoKaW1wb3J0IG9zCmltcG9ydCBwYW5kYXMgYXMgcGQKZnJvbSBtbHJ1bi5kYXRhc3RvcmUgaW1wb3J0IERhdGFJdGVtCmZyb20gbWxydW4uYXJ0aWZhY3RzIGltcG9ydCBnZXRfbW9kZWwKZnJvbSBjbG91ZHBpY2tsZSBpbXBvcnQgbG9hZApmcm9tIG1scnVuLm1sdXRpbHMubW9kZWxzIGltcG9ydCBldmFsX2NsYXNzX21vZGVsCgoKZGVmIGNveF90ZXN0KAogICAgY29udGV4dCwKICAgIG1vZGVsc19wYXRoOiBEYXRhSXRlbSwKICAgIHRlc3Rfc2V0OiBEYXRhSXRlbSwKICAgIGxhYmVsX2NvbHVtbjogc3RyLAogICAgcGxvdHNfZGVzdDogc3RyID0gInBsb3RzIiwKICAgIG1vZGVsX2V2YWx1YXRvcj1Ob25lLAopIC0+IE5vbmU6CiAgICAiIiJUZXN0IG9uZSBvciBtb3JlIGNsYXNzaWZpZXIgbW9kZWxzIGFnYWluc3QgaGVsZC1vdXQgZGF0YXNldAoKICAgIFVzaW5nIGhlbGQtb3V0IHRlc3QgZmVhdHVyZXMsIGV2YWx1YXRlcyB0aGUgcGVmb3JtYW5jZSBvZiB0aGUgZXN0aW1hdGVkIG1vZGVsCgogICAgQ2FuIGJlIHBhcnQgb2YgYSBrdWJlZmxvdyBwaXBlbGluZSBhcyBhIHRlc3Qgc3RlcCB0aGF0IGlzIHJ1biBwb3N0IEVEQSBhbmQKICAgIHRyYWluaW5nL3ZhbGlkYXRpb24gY3ljbGVzCgogICAgOnBhcmFtIGNvbnRleHQ6ICAgICAgICAgdGhlIGZ1bmN0aW9uIGNvbnRleHQKICAgIDpwYXJhbSBtb2RlbF9maWxlOiAgICAgIG1vZGVsIGFydGlmYWN0IHRvIGJlIHRlc3RlZAogICAgOnBhcmFtIHRlc3Rfc2V0OiAgICAgICAgdGVzdCBmZWF0dXJlcyBhbmQgbGFiZWxzCiAgICA6cGFyYW0gbGFiZWxfY29sdW1uOiAgICBjb2x1bW4gbmFtZSBmb3IgZ3JvdW5kIHRydXRoIGxhYmVscwogICAgOnBhcmFtIHNjb3JlX21ldGhvZDogICAgZm9yIG11bHRpY2xhc3MgY2xhc3NpZmljYXRpb24KICAgIDpwYXJhbSBwbG90c19kZXN0OiAgICAgIGRpciBmb3IgdGVzdCBwbG90cwogICAgOnBhcmFtIG1vZGVsX2V2YWx1YXRvcjogV0lQOiBzcGVjaWZpYyBtZXRob2QgdG8gZ2VuZXJhdGUgZXZhbCwgcGFzc2VkIGluIGFzIHN0cmluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYXZhaWxhYmxlIGluIHRoaXMgZm9sZGVyCiAgICAiIiIKICAgIHh0ZXN0ID0gdGVzdF9zZXQuYXNfZGYoKQogICAgeXRlc3QgPSB4dGVzdC5wb3AobGFiZWxfY29sdW1uKQoKICAgIG1vZGVsX2ZpbGUsIG1vZGVsX29iaiwgXyA9IGdldF9tb2RlbChtb2RlbHNfcGF0aC51cmwsIHN1ZmZpeD0iLnBrbCIpCiAgICBtb2RlbF9vYmogPSBsb2FkKG9wZW4oc3RyKG1vZGVsX2ZpbGUpLCAicmIiKSkKCiAgICB0cnk6CiAgICAgICAgaWYgbm90IG1vZGVsX2V2YWx1YXRvcjoKICAgICAgICAgICAgZXZhbF9tZXRyaWNzID0gZXZhbF9jbGFzc19tb2RlbChjb250ZXh0LCB4dGVzdCwgeXRlc3QsIG1vZGVsX29iaikKCiAgICAgICAgbW9kZWxfcGxvdHMgPSBldmFsX21ldHJpY3MucG9wKCJwbG90cyIpCiAgICAgICAgbW9kZWxfdGFibGVzID0gZXZhbF9tZXRyaWNzLnBvcCgidGFibGVzIikKICAgICAgICBmb3IgcGxvdCBpbiBtb2RlbF9wbG90czoKICAgICAgICAgICAgY29udGV4dC5sb2dfYXJ0aWZhY3QocGxvdCwgbG9jYWxfcGF0aD1mIntwbG90c19kZXN0fS97cGxvdC5rZXl9Lmh0bWwiKQogICAgICAgIGZvciB0YmwgaW4gbW9kZWxfdGFibGVzOgogICAgICAgICAgICBjb250ZXh0LmxvZ19hcnRpZmFjdCh0YmwsIGxvY2FsX3BhdGg9ZiJ7cGxvdHNfZGVzdH0ve3Bsb3Qua2V5fS5jc3YiKQoKICAgICAgICBjb250ZXh0LmxvZ19yZXN1bHRzKGV2YWxfbWV0cmljcykKICAgIGV4Y2VwdDoKICAgICAgICBjb250ZXh0LmxvZ19kYXRhc2V0KAogICAgICAgICAgICAiY294LXRlc3Qtc3VtbWFyeSIsIGRmPW1vZGVsX29iai5zdW1tYXJ5LCBpbmRleD1UcnVlLCBmb3JtYXQ9ImNzdiIKICAgICAgICApCiAgICAgICAgY29udGV4dC5sb2dnZXIuaW5mbygiY294IHRlc3RlciBub3QgaW1wbGVtZW50ZWQiKQo= - commands: [] - code_origin: https://github.com/daniels290813/functions.git#55a79c32be5d233cc11efcf40cd3edbe309bfdef:/home/kali/functions/coxph_test/coxph_test.py - affinity: null -verbose: false diff --git a/coxph_test/item.yaml b/coxph_test/item.yaml deleted file mode 100644 index 241e6d560..000000000 --- a/coxph_test/item.yaml +++ /dev/null @@ -1,26 +0,0 @@ -apiVersion: v1 -categories: -- machine-learning -- model-testing -description: Test cox proportional hazards model -doc: '' -example: coxph_test.ipynb -generationDate: 2022-08-28:17-25 -hidden: false -icon: '' -labels: - author: Iguazio - framework: survival -maintainers: [] -marketplaceType: '' -mlrunVersion: 1.1.0 -name: coxph-test -platformVersion: 3.5.0 -spec: - filename: coxph_test.py - handler: cox_test - image: mlrun/ml-models - kind: job - requirements: [] -url: '' -version: 1.1.0 diff --git a/coxph_trainer/coxph_trainer.ipynb b/coxph_trainer/coxph_trainer.ipynb deleted file mode 100644 index d49d6ccf8..000000000 --- a/coxph_trainer/coxph_trainer.ipynb +++ /dev/null @@ -1,1799 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# **Coxph trainer - Survival analysis**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following function provides both [Cox proprotional hazards modelling](https://en.wikipedia.org/wiki/Proportional_hazards_model)\n", - "and [Kaplan-Meier](https://en.wikipedia.org/wiki/Kaplan%E2%80%93Meier_estimator) plots." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Basics of the Cox proportional hazards model**\n", - "The purpose of the model is to evaluate simultaneously the effect of several factors on survival.
In other words, it allows us to examine how specified factors influence the rate of a particular event happening (e.g., infection, death) at a particular point in time.
This rate is commonly referred as the hazard rate ([link](http://www.sthda.com/english/wiki/cox-proportional-hazards-model)).\n", - "\n", - "### **Kaplan-Meier survival estimate**\n", - "The Kaplan-Meier (KM) method is a non-parametric method used to estimate the survival probability from observed survival times (Kaplan and Meier, 1958)([link](http://www.sthda.com/english/wiki/survival-analysis-basics))." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **The function**\n", - "train models to predict the timing of events.
\n", - "Although identical in structure to other training functions, this one\n", - "requires generating a 'Y' that represents the age/duration/tenure of\n", - "the obervation, designated 'tenure' here, and a binary labels columns that\n", - "represents the event of interest, churned/not-churned.
\n", - "In addition, there is a strata_cols parameter, representing a list of\n", - "stratification (aka grouping) variables." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following example covers:\n", - "\n", - "- [Data exploration](#Data-exploration)\n", - "- [Training Cox proprotional hazards and Kaplan-Meier model](#Training-Cox-proprotional-hazards-and-Kaplan-Meier-model)\n", - "- - [Importing the function](#Importing-the-function)\n", - "- - [Setup function parameters](#Setup-function-parameters)\n", - "- - [Running the function locally](#Running-the-function-locally)\n", - "- [A peek at a pickled kaplan-meier model](#A-peek-at-a-pickled-kaplan-meier-model)\n", - "- [A peek at a pickeld cox hazards default model](#A-peek-at-a-pickeld-cox-hazards-default-model)\n", - "- [Some potential default analyses of coxph](#Some-potential-default-analyses-of-coxph)\n", - "- - [Running the function remotely](#Running-the-function-remotely)\n", - "\n", - "We will train on [Telco Customer Churn dataset](https://www.kaggle.com/blastchar/telco-customer-churn) from kaggle, click the link for context.
\n", - "The dataset is transformed using [one-hot-encoding](https://en.wikipedia.org/wiki/One-hot), check out [customer-churn-prediction demo](https://github.com/mlrun/demos/tree/master/customer-churn-prediction) in the clean_data section for further information." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import warnings\n", - "warnings.filterwarnings(\"ignore\")" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "# Make sure the following libraries are installed \n", - "# !pip install lifelines" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Data exploration**" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "raw dataset\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
customerIDgenderSeniorCitizenPartnerDependentstenurePhoneServiceMultipleLinesInternetServiceOnlineSecurity...DeviceProtectionTechSupportStreamingTVStreamingMoviesContractPaperlessBillingPaymentMethodMonthlyChargesTotalChargesChurn
07590-VHVEGFemale0YesNo1NoNo phone serviceDSLNo...NoNoNoNoMonth-to-monthYesElectronic check29.8529.85No
15575-GNVDEMale0NoNo34YesNoDSLYes...YesNoNoNoOne yearNoMailed check56.951889.5No
23668-QPYBKMale0NoNo2YesNoDSLYes...NoNoNoNoMonth-to-monthYesMailed check53.85108.15Yes
37795-CFOCWMale0NoNo45NoNo phone serviceDSLYes...YesYesNoNoOne yearNoBank transfer (automatic)42.301840.75No
49237-HQITUFemale0NoNo2YesNoFiber opticNo...NoNoNoNoMonth-to-monthYesElectronic check70.70151.65Yes
\n", - "

5 rows × 21 columns

\n", - "
" - ], - "text/plain": [ - " customerID gender SeniorCitizen Partner Dependents tenure PhoneService \\\n", - "0 7590-VHVEG Female 0 Yes No 1 No \n", - "1 5575-GNVDE Male 0 No No 34 Yes \n", - "2 3668-QPYBK Male 0 No No 2 Yes \n", - "3 7795-CFOCW Male 0 No No 45 No \n", - "4 9237-HQITU Female 0 No No 2 Yes \n", - "\n", - " MultipleLines InternetService OnlineSecurity ... DeviceProtection \\\n", - "0 No phone service DSL No ... No \n", - "1 No DSL Yes ... Yes \n", - "2 No DSL Yes ... No \n", - "3 No phone service DSL Yes ... Yes \n", - "4 No Fiber optic No ... No \n", - "\n", - " TechSupport StreamingTV StreamingMovies Contract PaperlessBilling \\\n", - "0 No No No Month-to-month Yes \n", - "1 No No No One year No \n", - "2 No No No Month-to-month Yes \n", - "3 Yes No No One year No \n", - "4 No No No Month-to-month Yes \n", - "\n", - " PaymentMethod MonthlyCharges TotalCharges Churn \n", - "0 Electronic check 29.85 29.85 No \n", - "1 Mailed check 56.95 1889.5 No \n", - "2 Mailed check 53.85 108.15 Yes \n", - "3 Bank transfer (automatic) 42.30 1840.75 No \n", - "4 Electronic check 70.70 151.65 Yes \n", - "\n", - "[5 rows x 21 columns]" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Getting raw data as - downloaded from kaggle\n", - "import pandas as pd\n", - "\n", - "df = pd.read_csv(\"https://s3.wasabisys.com/iguazio/data/function-marketplace-data/coxph_trainer/WA_Fn-UseC_-Telco-Customer-Churn.csv\")\n", - "print('raw dataset')\n", - "df.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "encoded dataset\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
genderseniorpartnerdepstenurePhoneServiceMultipleLinesInternetServiceOnlineSecurityOnlineBackupDeviceProtectionTechSupportStreamingTVStreamingMoviesContractPaperlessBillingPaymentMethodMonthlyChargeslabelstenure_map
00010100001000001229.8500.0
110003410010100010356.9502.0
21000210011000001353.8510.0
310004500010110010042.3003.0
40000210100000001270.7010.0
\n", - "
" - ], - "text/plain": [ - " gender senior partner deps tenure PhoneService MultipleLines \\\n", - "0 0 0 1 0 1 0 0 \n", - "1 1 0 0 0 34 1 0 \n", - "2 1 0 0 0 2 1 0 \n", - "3 1 0 0 0 45 0 0 \n", - "4 0 0 0 0 2 1 0 \n", - "\n", - " InternetService OnlineSecurity OnlineBackup DeviceProtection \\\n", - "0 0 0 1 0 \n", - "1 0 1 0 1 \n", - "2 0 1 1 0 \n", - "3 0 1 0 1 \n", - "4 1 0 0 0 \n", - "\n", - " TechSupport StreamingTV StreamingMovies Contract PaperlessBilling \\\n", - "0 0 0 0 0 1 \n", - "1 0 0 0 1 0 \n", - "2 0 0 0 0 1 \n", - "3 1 0 0 1 0 \n", - "4 0 0 0 0 1 \n", - "\n", - " PaymentMethod MonthlyCharges labels tenure_map \n", - "0 2 29.85 0 0.0 \n", - "1 3 56.95 0 2.0 \n", - "2 3 53.85 1 0.0 \n", - "3 0 42.30 0 3.0 \n", - "4 2 70.70 1 0.0 " - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df = pd.read_csv(\"https://s3.wasabisys.com/iguazio/data/function-marketplace-data/coxph_trainer/encoded-data.csv\")\n", - "print('encoded dataset')\n", - "df.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## **Training Cox proprotional hazards and Kaplan-Meier model**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Importing the function**" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2021-10-13 13:22:07,678 [info] loaded project function-marketplace from MLRun DB\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import mlrun\n", - "mlrun.set_environment(project='function-marketplace')\n", - "\n", - "fn = mlrun.import_function(\"hub://coxph_trainer\")\n", - "fn.image='mlrun/mlrun'\n", - "fn.apply(mlrun.auto_mount())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Setup function parameters**" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "task = mlrun.new_task(name = \"tasks-survive-trainer\",\n", - " params = {\"event_column\" : \"labels\", \n", - " \"strata_cols\" : ['InternetService', 'StreamingMovies', 'StreamingTV', 'PhoneService'],\n", - " \"p_value\" : 0.005,\n", - " \"encode_cols\" : {\"Contract\" : \"Contract\",\n", - " \"PaymentMethod\" : \"Payment\"},\n", - " \"models_dest\" : 'models/cox',\n", - " \"file_ext\" : \"csv\"})" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Running the function locally**" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2021-10-13 13:18:36,975 [info] starting run tasks-survive-trainer uid=c525c7402c7e4188b0e22996e8fc682c DB=http://mlrun-api:8080\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
projectuiditerstartstatenamelabelsinputsparametersresultsartifacts
default0Oct 13 13:18:37completedtasks-survive-trainer
v3io_user=dani
kind=
owner=dani
host=jupyter-dani-5bbd9959b7-tsgh8
dataset
event_column=labels
strata_cols=['InternetService', 'StreamingMovies', 'StreamingTV', 'PhoneService']
p_value=0.005
encode_cols={'Contract': 'Contract', 'PaymentMethod': 'Payment'}
models_dest=models/cox
file_ext=csv
tenured-test-set
km-timelines
km-survival
km-model
coxhazard-summary
cx-model
\n", - "
\n", - "
\n", - "
\n", - " Title\n", - " ×\n", - "
\n", - " \n", - "
\n", - "
\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - }, - { - "data": { - "text/html": [ - " > to track results use the .show() or .logs() methods or click here to open in UI" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2021-10-13 13:18:41,277 [info] run executed, status=completed\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAEGCAYAAAB1iW6ZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAZZ0lEQVR4nO3de5BU5ZnH8e8jjo7AAApoKZcMiyReE0xmBcPGTVQUjTDRzZYoW7msSqgVK8lu3AU3iTc2hUVK11Q0LOWFSrSkDEaZWCwQiQbX0ggkJHLROF7QlqwCCSphB0Ge/aPPjE3T0Kd7+nLO279P1dT0ucyZp2bgN6ef8573mLsjIiLpd1i9CxARkcpQoIuIBEKBLiISCAW6iEggFOgiIoE4vF7feMiQId7a2lqvby8ikkpr167d5u5DC22rW6C3trayZs2aen17EZFUMrPNB9umlouISCAU6CIigVCgi4gEom49dBFJnj179pDJZOjq6qp3KQ2vubmZ4cOH09TUFPtrFOgi0iOTydDS0kJraytmVu9yGpa7s337djKZDKNGjYr9dUVbLmZ2r5m9bWbrD7LdzOwHZtZpZr83s0+WULeIJEhXVxeDBw9WmNeZmTF48OCS3ynF6aEvBCYdYvuFwJjoYzrwo5IqEJFEUZgnQzm/h6ItF3dfZWath9ilHfixZ+fhfdbMBpnZ8e7+x5KrieGmn29g45Z3Dyxi7DCuGDeyGt9SRCQVKtFDHwa8kbOcidYdEOhmNp3sWTwjR5Yfvu927dlvefP2XbzbtUeBLiINrRLDFgu9Lyj41Ax3X+Dube7eNnRowTtXi7ph8qn899fP3u/j9GEDyzqWiCRP//79e14vXbqUMWPG8Prrr3PjjTdiZnR2dvZsv/322zGzit11/uijj7Jx48ae5e9+97s8/vjjvT7ujh07uOuuu3p9nGIqEegZYETO8nBgSwWOKyINbOXKlVx77bUsW7as5x396aefzqJFi3r2Wbx4MaecckrFvmd+oN98882cd955vT5urQK9Ei2XDmCmmS0CxgHvVKt/LiK1c7DrVb1xygkDuGHyqUX3e+qpp7j66qtZunQpo0eP7ln/hS98gSVLlvDtb3+bV155hYEDBxYdp71ixQpuuOEGdu/ezejRo7nvvvvo378/s2bNoqOjg8MPP5zzzz+fSy+9lI6ODn71q18xZ84cHn74YW655RYuvvhivvjFL9La2soVV1zBE088wZ49e1iwYAGzZ8+ms7OT6667jhkzZrBz507a29v585//zJ49e5gzZw7t7e3MmjWLl19+mbFjxzJx4kTmzZvHvHnzeOihh9i9ezeXXHIJN910U69/vkUD3cweBD4LDDGzDHAD0ATg7vOBpcBFQCewC/hqr6sSkYa1e/du2tvbefLJJznppJP22zZgwABGjBjB+vXrWbJkCZdddhn33XffQY+1bds25syZw+OPP06/fv249dZbue2225g5cyaPPPIIL7zwAmbGjh07GDRoEFOmTOkJ8EJGjBjBM888wze/+U2+8pWv8PTTT9PV1cWpp57KjBkzaG5u5pFHHmHAgAFs27aN8ePHM2XKFObOncv69etZt24dkP0j89JLL/Hcc8/h7kyZMoVVq1Zx9tln9+pnF2eUy+VFtjtwTa+qEJHEiXMmXQ1NTU18+tOf5p577uGOO+44YPvUqVNZtGgRy5cvZ+XKlYcM9GeffZaNGzcyYcIEAN5//33OOussBgwYQHNzM1dddRWf//znufjii2PVNmXKFCDb+tm5cyctLS20tLTQ3NzMjh076NevH9dffz2rVq3isMMO48033+Stt9464DgrVqxgxYoVnHHGGQDs3LmTl156qfqBLiJSS4cddhgPPfQQ5513Ht/73ve4/vrr99s+efJkrrvuOtra2hgwYMAhj+XuTJw4kQcffPCAbc899xwrV65k0aJF/PCHP+SXv/xl0dqOPPLInhq7X3cv7927lwceeICtW7eydu1ampqaaG1tLXhzkLsze/Zsvva1rxX9nqUIJtA/2Od0rHuzZ7nlqCY+97Fj61iRiJSrb9++PPbYY3zmM5/huOOO48orr+zZdtRRR3Hrrbfy0Y9+tOhxxo8fzzXXXENnZycnnngiu3btIpPJcMIJJ7Br1y4uuugixo8fz4knnghAS0sL7733Xtl1v/POOxx77LE0NTXxxBNPsHnz5oLHveCCC/jOd77DtGnT6N+/P2+++SZNTU0ce2zvMiuYQN+3zxna0tyzvPU9TS4kkmbHHHMMy5Yt4+yzz2bIkCH7bZs6dWqsYwwdOpSFCxdy+eWXs3v3bgDmzJlDS0sL7e3tdHV14e7cfvvtPce9+uqr+cEPfsDixYtLrnnatGlMnjyZ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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# running the function with the task provided\n", - "coxph_run = fn.run(task,\n", - " local=True,\n", - " inputs={\"dataset\" : \"https://s3.wasabisys.com/iguazio/data/function-marketplace-data/coxph_trainer/encoded-data.csv\"})" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **A peek at a pickled kaplan-meier model**" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "# loading the model trained\n", - "from mlrun.artifacts import get_model\n", - "import pickle\n", - "model_file, model_obj, _ = get_model(coxph_run.artifact('km-model'))\n", - "model = pickle.load(open(model_file,'rb'))" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1 0.969027\n", - "10 0.869452\n", - "30 0.781377\n", - "100 0.668167\n", - "200 0.668167\n", - "Name: KM_estimate, dtype: float64" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "model.predict([1,10,30,100,200])" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAosAAAFzCAYAAABWw0P+AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAfcUlEQVR4nO3df7DdZX0n8PdHSA1CECXgtAQNzVAFfzS2WX80O67WX1glUdeOgJ1Wp9UyK07b3bqLtlt/0a4OO1o7almmIm1lZShWRYcFKv7AYVSEllZ+aI3YaKArSVqQNBsk8Owf94DXkO89595z7j333PN6zWRyvj/u9z48ucZ3vs/zfJ5qrQUAAA7mEeNuAAAAy5ewCABAJ2ERAIBOwiIAAJ2ERQAAOgmLAAB0OnRc33jt2rVt/fr14/r2AAD03HDDDbtaa8cc7NrYwuL69etz/fXXj+vbAwDQU1Xbu64ZhgYAoJOwCABAJ2ERAIBOY5uzCABMh/vuuy87duzIvn37xt2Uqbd69eqsW7cuq1atGvhrhEUAYFHt2LEja9asyfr161NV427O1GqtZffu3dmxY0dOOOGEgb/OMDQAsKj27duXo48+WlAcs6rK0UcfPe83vMIiALDoBMXlYSF/DsIiAACdhEUAYMU74ogjHvp8+eWX58QTT8x3v/vdvP3tb09VZdu2bQ9df9/73peqGtnmIZ/85Cdzyy23PHT8B3/wB/nsZz879HPvuuuufOhDHxr6Of30DYtVdUFV3VlVN3Vcr6r6k6raVlX/UFU/N/pmAgAM7+qrr86b3vSmXHHFFXn84x+fJHnqU5+aiy+++KF7Lr300px88skj+54HhsV3vvOdecELXjD0c5cqLA6yGvrCJB9I8hcd11+S5MTer2cm+dPe7wAAP+Ydn745t9zxg5E+8+SfOjJvO/XJfe/70pe+lNe//vW5/PLLs2HDhofOv/zlL8+nPvWp/P7v/35uu+22PPrRj+5bWuaqq67K2972ttx7773ZsGFDPvKRj+SII47I2WefncsuuyyHHnpoXvSiF+WVr3xlLrvssnzxi1/MOeeck49//ON517velZe97GV51atelfXr1+eMM87I5z//+dx33305//zz85a3vCXbtm3Lm9/85px55pnZs2dPtm7dmn/913/Nfffdl3POOSdbt27N2WefnW9/+9vZuHFjXvjCF+bcc8/Nueeem0suuST33ntvXvGKV+Qd73jH0P3bNyy21q6pqvVz3LI1yV+01lqSr1TVUVX1k621fx66dSMyyA/m1o3H5YxnPn6JWgQALKV77703W7duzRe+8IU86UlP+rFrRx55ZI4//vjcdNNN+dSnPpVXv/rV+chHPtL5rF27duWcc87JZz/72Rx++OF5z3vek/e+970566yz8olPfCLf+MY3UlW56667ctRRR2XLli0PhcODOf744/PlL385v/M7v5PXvva1ufbaa7Nv3748+clPzplnnpnVq1fnE5/4RI488sjs2rUrz3rWs7Jly5a8+93vzk033ZQbb7wxyUyA/da3vpXrrrsurbVs2bIl11xzTZ7znOcM1XejqLN4XJLvzTre0Tv3sLBYVW9I8oYkD736XSo/2Hdf57Xtu/fmB/vuExYBYJEN8gZwMaxatSq/8Au/kA9/+MN5//vf/7Drp512Wi6++OJceeWVufrqq+cMi1/5yldyyy23ZPPmzUmSH/7wh3n2s5+dI488MqtXr85v/MZv5KUvfWle9rKXDdS2LVu2JJkZDt+zZ0/WrFmTNWvWZPXq1bnrrrty+OGH561vfWuuueaaPOIRj8jtt9+e73//+w97zlVXXZWrrroqT3/605Mke/bsybe+9a1lERYPtga7HezG1tr5Sc5Pkk2bNh30nsXQ7wfz1f/ry3OGSQBgsj3iEY/IJZdckhe84AX5oz/6o7z1rW/9seunnnpq3vzmN2fTpk058sgj53xWay0vfOEL87GPfexh16677rpcffXVufjii/OBD3wgn/vc5/q27ZGPfORDbXzw84PH+/fvz0UXXZSdO3fmhhtuyKpVq7J+/fqD1kpsreUtb3lLfvM3f7Pv95yPUayG3pHk+FnH65LcMYLnAgCMzKMe9ah85jOfyUUXXZQPf/jDP3btsMMOy3ve85783u/9Xt/nPOtZz8q111770ArqvXv35h//8R+zZ8+e3H333fmlX/ql/PEf//FDw8Nr1qzJPffcs+B233333Tn22GOzatWqfP7zn8/27dsP+twXv/jFueCCC7Jnz54kye23354777xzwd/3QaN4s3hZkrOq6uLMLGy5eznNVwQAeNBjH/vYXHHFFXnOc56TtWvX/ti10047baBnHHPMMbnwwgtz+umn5957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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "m = model.plot(figsize=(11,6))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **A peek at a pickeld cox hazards default model**" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "# loading the model trained\n", - "from mlrun.artifacts import get_model\n", - "import pickle\n", - "model_file, model_obj, _ = get_model(coxph_run.artifact('cx-model'))\n", - "model = pickle.load(open(model_file,'rb'))" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
modellifelines.CoxPHFitter
duration col'tenure'
event col'labels'
strata[InternetService, StreamingMovies, StreamingTV...
baseline estimationbreslow
number of observations226
number of events observed55
partial log-likelihood-102.57
time fit was run2021-10-13 13:18:38 UTC
\n", - "
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
coefexp(coef)se(coef)coef lower 95%coef upper 95%exp(coef) lower 95%exp(coef) upper 95%zp-log2(p)
gender0.712.040.340.041.391.044.002.080.044.72
senior-0.330.720.44-1.200.540.301.72-0.740.461.13
partner-0.390.670.43-1.240.450.291.57-0.910.361.47
deps0.621.850.50-0.361.590.704.931.240.222.21
MultipleLines-0.790.451.09-2.921.340.053.83-0.720.471.09
OnlineSecurity-0.770.461.30-3.311.780.045.93-0.590.560.85
OnlineBackup-0.470.630.95-2.331.390.104.03-0.490.620.68
DeviceProtection-0.410.661.08-2.541.710.085.54-0.380.700.51
TechSupport0.511.661.17-1.782.800.1716.430.440.660.59
PaperlessBilling0.351.420.41-0.451.150.643.160.860.391.35
MonthlyCharges-0.080.920.19-0.460.300.631.35-0.400.690.54
Contract_1-2.190.110.71-3.58-0.790.030.45-3.07<0.0058.88
Contract_2-19.940.003478.68-6838.046798.160.00inf-0.011.000.01
Payment_1-0.870.420.62-2.070.340.131.40-1.410.162.65
Payment_20.461.580.45-0.421.330.663.801.030.311.71
Payment_30.231.260.64-1.021.490.364.430.360.720.48

\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Concordance0.88
Partial AIC237.14
log-likelihood ratio test106.72 on 16 df
-log2(p) of ll-ratio test48.92
\n", - "
" - ], - "text/latex": [ - "\\begin{tabular}{lrrrrrrrrrr}\n", - "\\toprule\n", - "{} & coef & exp(coef) & se(coef) & coef lower 95\\% & coef upper 95\\% & exp(coef) lower 95\\% & exp(coef) upper 95\\% & z & p & -log2(p) \\\\\n", - "covariate & & & & & & & & & & \\\\\n", - "\\midrule\n", - "gender & 0.71 & 2.04 & 0.34 & 0.04 & 1.39 & 1.04 & 4.00 & 2.08 & 0.04 & 4.72 \\\\\n", - "senior & -0.33 & 0.72 & 0.44 & -1.20 & 0.54 & 0.30 & 1.72 & -0.74 & 0.46 & 1.13 \\\\\n", - "partner & -0.39 & 0.67 & 0.43 & -1.24 & 0.45 & 0.29 & 1.57 & -0.91 & 0.36 & 1.47 \\\\\n", - "deps & 0.62 & 1.85 & 0.50 & -0.36 & 1.59 & 0.70 & 4.93 & 1.24 & 0.22 & 2.21 \\\\\n", - "MultipleLines & -0.79 & 0.45 & 1.09 & -2.92 & 1.34 & 0.05 & 3.83 & -0.72 & 0.47 & 1.09 \\\\\n", - "OnlineSecurity & -0.77 & 0.46 & 1.30 & -3.31 & 1.78 & 0.04 & 5.93 & -0.59 & 0.56 & 0.85 \\\\\n", - "OnlineBackup & -0.47 & 0.63 & 0.95 & -2.33 & 1.39 & 0.10 & 4.03 & -0.49 & 0.62 & 0.68 \\\\\n", - "DeviceProtection & -0.41 & 0.66 & 1.08 & -2.54 & 1.71 & 0.08 & 5.54 & -0.38 & 0.70 & 0.51 \\\\\n", - "TechSupport & 0.51 & 1.66 & 1.17 & -1.78 & 2.80 & 0.17 & 16.43 & 0.44 & 0.66 & 0.59 \\\\\n", - "PaperlessBilling & 0.35 & 1.42 & 0.41 & -0.45 & 1.15 & 0.64 & 3.16 & 0.86 & 0.39 & 1.35 \\\\\n", - "MonthlyCharges & -0.08 & 0.92 & 0.19 & -0.46 & 0.30 & 0.63 & 1.35 & -0.40 & 0.69 & 0.54 \\\\\n", - "Contract\\_1 & -2.19 & 0.11 & 0.71 & -3.58 & -0.79 & 0.03 & 0.45 & -3.07 & 0.00 & 8.88 \\\\\n", - "Contract\\_2 & -19.94 & 0.00 & 3478.68 & -6838.04 & 6798.16 & 0.00 & inf & -0.01 & 1.00 & 0.01 \\\\\n", - "Payment\\_1 & -0.87 & 0.42 & 0.62 & -2.07 & 0.34 & 0.13 & 1.40 & -1.41 & 0.16 & 2.65 \\\\\n", - "Payment\\_2 & 0.46 & 1.58 & 0.45 & -0.42 & 1.33 & 0.66 & 3.80 & 1.03 & 0.31 & 1.71 \\\\\n", - "Payment\\_3 & 0.23 & 1.26 & 0.64 & -1.02 & 1.49 & 0.36 & 4.43 & 0.36 & 0.72 & 0.48 \\\\\n", - "\\bottomrule\n", - "\\end{tabular}\n" - ], - "text/plain": [ - "\n", - " duration col = 'tenure'\n", - " event col = 'labels'\n", - " strata = ['InternetService', 'StreamingMovies', 'StreamingTV', 'PhoneService']\n", - " baseline estimation = breslow\n", - " number of observations = 226\n", - "number of events observed = 55\n", - " partial log-likelihood = -102.57\n", - " time fit was run = 2021-10-13 13:18:38 UTC\n", - "\n", - "---\n", - " coef exp(coef) se(coef) coef lower 95% coef upper 95% exp(coef) lower 95% exp(coef) upper 95%\n", - "covariate \n", - "gender 0.71 2.04 0.34 0.04 1.39 1.04 4.00\n", - "senior -0.33 0.72 0.44 -1.20 0.54 0.30 1.72\n", - "partner -0.39 0.67 0.43 -1.24 0.45 0.29 1.57\n", - "deps 0.62 1.85 0.50 -0.36 1.59 0.70 4.93\n", - "MultipleLines -0.79 0.45 1.09 -2.92 1.34 0.05 3.83\n", - "OnlineSecurity -0.77 0.46 1.30 -3.31 1.78 0.04 5.93\n", - "OnlineBackup -0.47 0.63 0.95 -2.33 1.39 0.10 4.03\n", - "DeviceProtection -0.41 0.66 1.08 -2.54 1.71 0.08 5.54\n", - "TechSupport 0.51 1.66 1.17 -1.78 2.80 0.17 16.43\n", - "PaperlessBilling 0.35 1.42 0.41 -0.45 1.15 0.64 3.16\n", - "MonthlyCharges -0.08 0.92 0.19 -0.46 0.30 0.63 1.35\n", - "Contract_1 -2.19 0.11 0.71 -3.58 -0.79 0.03 0.45\n", - "Contract_2 -19.94 0.00 3478.68 -6838.04 6798.16 0.00 inf\n", - "Payment_1 -0.87 0.42 0.62 -2.07 0.34 0.13 1.40\n", - "Payment_2 0.46 1.58 0.45 -0.42 1.33 0.66 3.80\n", - "Payment_3 0.23 1.26 0.64 -1.02 1.49 0.36 4.43\n", - "\n", - " z p -log2(p)\n", - "covariate \n", - "gender 2.08 0.04 4.72\n", - "senior -0.74 0.46 1.13\n", - "partner -0.91 0.36 1.47\n", - "deps 1.24 0.22 2.21\n", - "MultipleLines -0.72 0.47 1.09\n", - "OnlineSecurity -0.59 0.56 0.85\n", - "OnlineBackup -0.49 0.62 0.68\n", - "DeviceProtection -0.38 0.70 0.51\n", - "TechSupport 0.44 0.66 0.59\n", - "PaperlessBilling 0.86 0.39 1.35\n", - "MonthlyCharges -0.40 0.69 0.54\n", - "Contract_1 -3.07 <0.005 8.88\n", - "Contract_2 -0.01 1.00 0.01\n", - "Payment_1 -1.41 0.16 2.65\n", - "Payment_2 1.03 0.31 1.71\n", - "Payment_3 0.36 0.72 0.48\n", - "---\n", - "Concordance = 0.88\n", - "Partial AIC = 237.14\n", - "log-likelihood ratio test = 106.72 on 16 df\n", - "-log2(p) of ll-ratio test = 48.92" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "model.print_summary()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Some potential default analyses of coxph**" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "model.baseline_survival_.plot()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "* run the following for each of the lines that passes some test (p < 0.005,for example):
\n", - " `model.plot_covariate_groups('Contract_1', values=[0, 1]);`
\n", - " the plot needs to have the strata decoded\n", - " \n", - " In the train_model above, set param `plot_cov_groups=True` and produce the following set of artifacts by selecting only those covariates whose p-values\n", - " are below some threshold `p_value`" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Running the function remotely**\n" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2021-10-13 13:18:42,095 [info] Started building image: .mlrun/func-default-coxph-trainer:latest\n", - "\u001b[36mINFO\u001b[0m[0000] Retrieving image manifest mlrun/mlrun:0.7.1 \n", - "\u001b[36mINFO\u001b[0m[0000] Retrieving image manifest mlrun/mlrun:0.7.1 \n", - "\u001b[36mINFO\u001b[0m[0000] Built cross stage deps: map[] \n", - "\u001b[36mINFO\u001b[0m[0000] Retrieving image manifest mlrun/mlrun:0.7.1 \n", - "\u001b[36mINFO\u001b[0m[0000] Retrieving image manifest mlrun/mlrun:0.7.1 \n", - "\u001b[36mINFO\u001b[0m[0001] Executing 0 build triggers \n", - "\u001b[36mINFO\u001b[0m[0001] Unpacking rootfs as cmd RUN pip install lifelines requires it. \n", - "\u001b[36mINFO\u001b[0m[0015] RUN pip install lifelines \n", - "\u001b[36mINFO\u001b[0m[0015] Taking snapshot of full filesystem... \n", - "\u001b[36mINFO\u001b[0m[0026] cmd: /bin/sh \n", - "\u001b[36mINFO\u001b[0m[0026] args: [-c pip install lifelines] \n", - "\u001b[36mINFO\u001b[0m[0026] Running: [/bin/sh -c pip install lifelines] \n", - "Collecting lifelines\n", - " Downloading lifelines-0.26.3-py3-none-any.whl (348 kB)\n", - "Requirement already satisfied: numpy>=1.14.0 in /usr/local/lib/python3.7/site-packages (from lifelines) (1.19.5)\n", - "Collecting autograd-gamma>=0.3\n", - " Downloading autograd-gamma-0.5.0.tar.gz (4.0 kB)\n", - "Collecting autograd>=1.3\n", - " Downloading autograd-1.3.tar.gz (38 kB)\n", - "Requirement already satisfied: matplotlib>=3.0 in /usr/local/lib/python3.7/site-packages (from lifelines) (3.4.3)\n", - "Collecting formulaic<0.3,>=0.2.2\n", - " Downloading formulaic-0.2.4-py3-none-any.whl (55 kB)\n", - "Requirement already satisfied: pandas>=0.23.0 in /usr/local/lib/python3.7/site-packages (from lifelines) (1.3.2)\n", - "Requirement already satisfied: scipy>=1.2.0 in /usr/local/lib/python3.7/site-packages (from lifelines) (1.7.1)\n", - "Requirement already satisfied: future>=0.15.2 in /usr/local/lib/python3.7/site-packages (from autograd>=1.3->lifelines) (0.18.2)\n", - "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/site-packages (from matplotlib>=3.0->lifelines) (0.10.0)\n", - "Requirement already satisfied: pillow>=6.2.0 in /usr/local/lib/python3.7/site-packages (from matplotlib>=3.0->lifelines) (8.3.2)\n", - "Requirement already satisfied: pyparsing>=2.2.1 in /usr/local/lib/python3.7/site-packages (from matplotlib>=3.0->lifelines) (2.4.7)\n", - "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/site-packages (from matplotlib>=3.0->lifelines) (1.3.2)\n", - "Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.7/site-packages (from matplotlib>=3.0->lifelines) (2.8.2)\n", - "Collecting interface-meta>=1.2\n", - " Downloading interface_meta-1.2.4-py2.py3-none-any.whl (14 kB)\n", - "Requirement already satisfied: wrapt in /usr/local/lib/python3.7/site-packages (from formulaic<0.3,>=0.2.2->lifelines) (1.12.1)\n", - "Collecting astor\n", - " Downloading astor-0.8.1-py2.py3-none-any.whl (27 kB)\n", - "Requirement already satisfied: pytz>=2017.3 in /usr/local/lib/python3.7/site-packages (from pandas>=0.23.0->lifelines) (2021.1)\n", - "Requirement already satisfied: six in /usr/local/lib/python3.7/site-packages (from cycler>=0.10->matplotlib>=3.0->lifelines) (1.16.0)\n", - "Building wheels for collected packages: autograd-gamma, autograd\n", - " Building wheel for autograd-gamma (setup.py): started\n", - " Building wheel for autograd-gamma (setup.py): finished with status 'done'\n", - " Created wheel for autograd-gamma: filename=autograd_gamma-0.5.0-py3-none-any.whl size=4034 sha256=5211d5dddff0a9102583375dc2c468962b66b424d3fc0c75437b2d2f0d7e2576\n", - " Stored in directory: /tmp/pip-ephem-wheel-cache-vbqa_7jp/wheels/9f/01/ee/1331593abb5725ff7d8c1333aee93a50a1c29d6ddda9665c9f\n", - " Building wheel for autograd (setup.py): started\n", - " Building wheel for autograd (setup.py): finished with status 'done'\n", - " Created wheel for autograd: filename=autograd-1.3-py3-none-any.whl size=47989 sha256=f7fbf41d442f597b0969c5314cbdbda143f3bd2da827efc46f58d03ca6373e55\n", - " Stored in directory: /tmp/pip-ephem-wheel-cache-vbqa_7jp/wheels/ef/32/31/0e87227cd0ca1d99ad51fbe4b54c6fa02afccf7e483d045e04\n", - "Successfully built autograd-gamma autograd\n", - "Installing collected packages: autograd, autograd-gamma, interface-meta, astor, formulaic, lifelines\n", - "Successfully installed astor-0.8.1 autograd-1.3 autograd-gamma-0.5.0 formulaic-0.2.4 interface-meta-1.2.4 lifelines-0.26.3\n", - "WARNING: You are using pip version 20.2.4; however, version 21.3 is available.\n", - "You should consider upgrading via the '/usr/local/bin/python -m pip install --upgrade pip' command.\n", - "\u001b[36mINFO\u001b[0m[0029] Taking snapshot of full filesystem... \n" - ] - }, - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "fn.spec.build.commands=['pip install lifelines']\n", - "fn.deploy(with_mlrun=False)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2021-10-13 13:19:41,275 [info] starting run tasks-survive-trainer uid=8b4ee122120645be9eb29a646ef6e562 DB=http://mlrun-api:8080\n", - "> 2021-10-13 13:19:41,455 [info] Job is running in the background, pod: tasks-survive-trainer-swjkk\n", - "> 2021-10-13 13:19:50,461 [info] run executed, status=completed\n", - "\n", - "A value is trying to be set on a copy of a slice from a DataFrame\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - "Column Contract_2 have very low variance when conditioned on death event present or not. This may harm convergence. This could be a form of 'complete separation'. For example, try the following code:\n", - "\n", - ">>> events = df['labels'].astype(bool)\n", - ">>> print(df.loc[events, 'Contract_2'].var())\n", - ">>> print(df.loc[~events, 'Contract_2'].var())\n", - "\n", - "A very low variance means that the column Contract_2 completely determines whether a subject dies or not. See https://stats.stackexchange.com/questions/11109/how-to-deal-with-perfect-separation-in-logistic-regression.\n", - "\n", - "Newton-Rhaphson convergence completed successfully but norm(delta) is still high, 0.443. This may imply non-unique solutions to the maximum likelihood. Perhaps there is collinearity or complete separation in the dataset?\n", - "\n", - "final state: completed\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
projectuiditerstartstatenamelabelsinputsparametersresultsartifacts
default0Oct 13 13:19:47completedtasks-survive-trainer
v3io_user=dani
kind=job
owner=dani
host=tasks-survive-trainer-swjkk
dataset
event_column=labels
strata_cols=['InternetService', 'StreamingMovies', 'StreamingTV', 'PhoneService']
p_value=0.005
encode_cols={'Contract': 'Contract', 'PaymentMethod': 'Payment'}
models_dest=models/cox
file_ext=csv
tenured-test-set
km-timelines
km-survival
km-model
coxhazard-summary
cx-model
\n", - "
\n", - "
\n", - "
\n", - " Title\n", - " ×\n", - "
\n", - " \n", - "
\n", - "
\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - }, - { - "data": { - "text/html": [ - " > to track results use the .show() or .logs() methods or click here to open in UI" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2021-10-13 13:19:50,645 [info] run executed, status=completed\n" - ] - } - ], - "source": [ - "coxph_run = fn.run(task,\n", - " local=False,\n", - " inputs={\"dataset\" : \"https://s3.wasabisys.com/iguazio/data/function-marketplace-data/coxph_trainer/encoded-data.csv\"})" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "[Back to the top](#Coxph-trainer---Survival-analysis)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/coxph_trainer/coxph_trainer.py b/coxph_trainer/coxph_trainer.py deleted file mode 100644 index 42c443ad3..000000000 --- a/coxph_trainer/coxph_trainer.py +++ /dev/null @@ -1,201 +0,0 @@ -# Copyright 2019 Iguazio -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Generated by nuclio.export.NuclioExporter - -import warnings - -warnings.simplefilter(action="ignore", category=FutureWarning) - -from mlrun.mlutils.data import get_sample, get_splits -from mlrun.mlutils.plots import gcf_clear - -from mlrun.execution import MLClientCtx -from mlrun.datastore import DataItem -from mlrun.artifacts import PlotArtifact, TableArtifact - -from cloudpickle import dumps -import pandas as pd -import os - -from lifelines import CoxPHFitter, KaplanMeierFitter - - -def _coxph_log_model( - context, - model, - dataset_key: str = "coxhazard-summary", - models_dest: str = "models", - plot_cov_groups: bool = False, - p_value: float = 0.005, - plot_key: str = "km-cx", - plots_dest: str = "plots", - file_ext="csv", - extra_data: dict = {}, -): - """log a coxph model (and submodel locations) - - :param model: estimated coxph model - :param extra_data: if this model wants to store the locations of submodels - use this - """ - import matplotlib.pyplot as plt - - sumtbl = model.summary - - context.log_dataset(dataset_key, df=sumtbl, index=True, format=file_ext) - - model_bin = dumps(model) - context.log_model( - "cx-model", - body=model_bin, - artifact_path=os.path.join(context.artifact_path, models_dest), - model_file="model.pkl", - ) - if plot_cov_groups: - select_covars = summary[summary.p <= p_value].index.values - for group in select_covars: - axs = model.plot_covariate_groups(group, values=[0, 1]) - for ix, ax in enumerate(axs): - f = ax.get_figure() - context.log_artifact( - PlotArtifact(f"cx-{group}-{ix}", body=plt.gcf()), - local_path=f"{plots_dest}/cx-{group}-{ix}.html", - ) - gcf_clear(plt) - - -def _kaplan_meier_log_model( - context, - model, - time_column: str = "tenure", - dataset_key: str = "km-timelines", - plot_key: str = "km-survival", - plots_dest: str = "plots", - models_dest: str = "models", - file_ext: str = "csv", -): - import matplotlib.pyplot as plt - - o = [] - for obj in model.__dict__.keys(): - if isinstance(model.__dict__[obj], pd.DataFrame): - o.append(model.__dict__[obj]) - df = pd.concat(o, axis=1) - df.index.name = time_column - context.log_dataset(dataset_key, df=df, index=True, format=file_ext) - model.plot() - context.log_artifact( - PlotArtifact(plot_key, body=plt.gcf()), - local_path=f"{plots_dest}/{plot_key}.html", - ) - context.log_model( - "km-model", - body=dumps(model), - model_dir=f"{models_dest}/km", - model_file="model.pkl", - ) - - -def train_model( - context: MLClientCtx, - dataset: DataItem, - event_column: str = "labels", - time_column: str = "tenure", - encode_cols: dict = {}, - strata_cols: list = [], - plot_cov_groups: bool = False, - p_value: float = 0.005, - sample: int = -1, - test_size: float = 0.25, - valid_size: float = 0.75, # (after test removed) - random_state: int = 1, - models_dest: str = "", - plots_dest: str = "", - file_ext: str = "csv", -) -> None: - """train models to predict the timing of events - - Although identical in structure to other training functions, this one - requires generating a 'Y' that represents the age/duration/tenure of - the obervation, designated 'tenure' here, and a binary labels columns that - represents the event of interest, churned/not-churned. - - In addition, there is a strata_cols parameter, representing a list of - stratification (aka grouping) variables. - - :param context: the function context - :param dataset: ("data") name of raw data file - :param event_column: ground-truth (y) labels (considered as events in this model) - :param time_column: age or tenure column - :param encode_cols: dictionary of names and prefixes for columns that are - to hot be encoded. - :param strata_cols: columns used to stratify predictors - :param plot_cov_groups: - :param p_value: (0.005) max p value for coeffcients selected - :param sample: Selects the first n rows, or select a sample - starting from the first. If negative <-1, select - a random sample - :param test_size: (0.25) test set size - :param valid_size: (0.75) Once the test set has been removed the - training set gets this proportion. - :param random_state: (1) sklearn rng seed - :param models_dest: destination subfolder for model artifacts - :param plots_dest: destination subfolder for plot artifacts - :param file_ext: format for test_set_key hold out data - """ - from lifelines.plotting import plot_lifetimes - import matplotlib.pyplot as plt - - models_dest = models_dest or "models" - plots_dest = plots_dest or f"plots/{context.name}" - - raw, tenure, header = get_sample(dataset, sample, time_column) - - if encode_cols: - raw = pd.get_dummies( - raw, - columns=list(encode_cols.keys()), - prefix=list(encode_cols.values()), - drop_first=True, - ) - - (xtrain, ytrain), (xvalid, yvalid), (xtest, ytest) = get_splits( - raw, tenure, 3, test_size, valid_size, random_state - ) - for X in [xtrain, xvalid, xtest]: - drop_cols = X.columns.str.startswith(time_column) - X.drop(X.columns[drop_cols], axis=1, inplace=True) - for Y in [ytrain, yvalid, ytest]: - Y.name = time_column - - context.log_dataset( - "tenured-test-set", - df=pd.concat([xtest, ytest.to_frame()], axis=1), - format=file_ext, - index=False, - ) - - km_model = KaplanMeierFitter().fit(ytrain, xtrain.labels) - _kaplan_meier_log_model(context, km_model, models_dest=models_dest) - - coxdata = pd.concat([xtrain, ytrain.to_frame()], axis=1) - cx_model = CoxPHFitter().fit(coxdata, time_column, event_column, strata=strata_cols) - _coxph_log_model( - context, - cx_model, - models_dest=models_dest, - plot_cov_groups=plot_cov_groups, - extra_data={"km": f"{models_dest}/km"}, - ) diff --git a/coxph_trainer/function.yaml b/coxph_trainer/function.yaml deleted file mode 100644 index 5033b87ba..000000000 --- a/coxph_trainer/function.yaml +++ /dev/null @@ -1,108 +0,0 @@ -kind: job -metadata: - name: coxph-trainer - tag: '' - hash: 65292d47d13eba9327a2b402066d9d76408a7985 - project: '' - labels: - author: yjb - framework: survival - categories: - - model-training - - machine-learning -spec: - command: '' - args: [] - image: mlrun/ml-models - env: [] - default_handler: train_model - entry_points: - train_model: - name: train_model - doc: 'train models to predict the timing of events - - - Although identical in structure to other training functions, this one - - requires generating a ''Y'' that represents the age/duration/tenure of - - the obervation, designated ''tenure'' here, and a binary labels columns that - - represents the event of interest, churned/not-churned. - - - In addition, there is a strata_cols parameter, representing a list of - - stratification (aka grouping) variables.' - parameters: - - name: context - type: MLClientCtx - doc: the function context - default: '' - - name: dataset - type: DataItem - doc: ("data") name of raw data file - default: '' - - name: event_column - type: str - doc: ground-truth (y) labels (considered as events in this model) - default: labels - - name: time_column - type: str - doc: age or tenure column - default: tenure - - name: encode_cols - type: dict - doc: dictionary of names and prefixes for columns that are to hot be encoded. - default: {} - - name: strata_cols - type: list - doc: columns used to stratify predictors - default: [] - - name: plot_cov_groups - type: bool - default: false - - name: p_value - type: float - doc: (0.005) max p value for coeffcients selected - default: 0.005 - - name: sample - type: int - doc: Selects the first n rows, or select a sample starting from the first. - If negative <-1, select a random sample - default: <_ast.USub object at 0x7f3b619b97b8> - - name: test_size - type: float - doc: (0.25) test set size - default: 0.25 - - name: valid_size - type: float - doc: (0.75) Once the test set has been removed the training set gets this - proportion. - default: 0.75 - - name: random_state - type: int - doc: (1) sklearn rng seed - default: 1 - - name: models_dest - type: str - doc: destination subfolder for model artifacts - default: '' - - name: plots_dest - type: str - doc: destination subfolder for plot artifacts - default: '' - - name: file_ext - type: str - doc: format for test_set_key hold out data - default: csv - outputs: - - default: '' - lineno: 97 - description: cox proportional hazards, kaplan meier plots - build: - functionSourceCode: IyBHZW5lcmF0ZWQgYnkgbnVjbGlvLmV4cG9ydC5OdWNsaW9FeHBvcnRlcgoKaW1wb3J0IHdhcm5pbmdzCgp3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoYWN0aW9uPSJpZ25vcmUiLCBjYXRlZ29yeT1GdXR1cmVXYXJuaW5nKQoKZnJvbSBtbHJ1bi5tbHV0aWxzLmRhdGEgaW1wb3J0IGdldF9zYW1wbGUsIGdldF9zcGxpdHMKZnJvbSBtbHJ1bi5tbHV0aWxzLnBsb3RzIGltcG9ydCBnY2ZfY2xlYXIKCmZyb20gbWxydW4uZXhlY3V0aW9uIGltcG9ydCBNTENsaWVudEN0eApmcm9tIG1scnVuLmRhdGFzdG9yZSBpbXBvcnQgRGF0YUl0ZW0KZnJvbSBtbHJ1bi5hcnRpZmFjdHMgaW1wb3J0IFBsb3RBcnRpZmFjdCwgVGFibGVBcnRpZmFjdAoKZnJvbSBjbG91ZHBpY2tsZSBpbXBvcnQgZHVtcHMKaW1wb3J0IHBhbmRhcyBhcyBwZAppbXBvcnQgb3MKCmZyb20gbGlmZWxpbmVzIGltcG9ydCBDb3hQSEZpdHRlciwgS2FwbGFuTWVpZXJGaXR0ZXIKCgpkZWYgX2NveHBoX2xvZ19tb2RlbCgKICAgIGNvbnRleHQsCiAgICBtb2RlbCwKICAgIGRhdGFzZXRfa2V5OiBzdHIgPSAiY294aGF6YXJkLXN1bW1hcnkiLAogICAgbW9kZWxzX2Rlc3Q6IHN0ciA9ICJtb2RlbHMiLAogICAgcGxvdF9jb3ZfZ3JvdXBzOiBib29sID0gRmFsc2UsCiAgICBwX3ZhbHVlOiBmbG9hdCA9IDAuMDA1LAogICAgcGxvdF9rZXk6IHN0ciA9ICJrbS1jeCIsCiAgICBwbG90c19kZXN0OiBzdHIgPSAicGxvdHMiLAogICAgZmlsZV9leHQ9ImNzdiIsCiAgICBleHRyYV9kYXRhOiBkaWN0ID0ge30sCik6CiAgICAiIiJsb2cgYSBjb3hwaCBtb2RlbCAoYW5kIHN1Ym1vZGVsIGxvY2F0aW9ucykKCiAgICA6cGFyYW0gbW9kZWw6ICAgICAgICBlc3RpbWF0ZWQgY294cGggbW9kZWwKICAgIDpwYXJhbSBleHRyYV9kYXRhOiAgIGlmIHRoaXMgbW9kZWwgd2FudHMgdG8gc3RvcmUgdGhlIGxvY2F0aW9ucyBvZiBzdWJtb2RlbHMKICAgICAgICAgICAgICAgICAgICAgICAgIHVzZSB0aGlzCiAgICAiIiIKICAgIGltcG9ydCBtYXRwbG90bGliLnB5cGxvdCBhcyBwbHQKCiAgICBzdW10YmwgPSBtb2RlbC5zdW1tYXJ5CgogICAgY29udGV4dC5sb2dfZGF0YXNldChkYXRhc2V0X2tleSwgZGY9c3VtdGJsLCBpbmRleD1UcnVlLCBmb3JtYXQ9ZmlsZV9leHQpCgogICAgbW9kZWxfYmluID0gZHVtcHMobW9kZWwpCiAgICBjb250ZXh0LmxvZ19tb2RlbCgKICAgICAgICAiY3gtbW9kZWwiLAogICAgICAgIGJvZHk9bW9kZWxfYmluLAogICAgICAgIGFydGlmYWN0X3BhdGg9b3MucGF0aC5qb2luKGNvbnRleHQuYXJ0aWZhY3RfcGF0aCwgbW9kZWxzX2Rlc3QpLAogICAgICAgIG1vZGVsX2ZpbGU9Im1vZGVsLnBrbCIsCiAgICApCiAgICBpZiBwbG90X2Nvdl9ncm91cHM6CiAgICAgICAgc2VsZWN0X2NvdmFycyA9IHN1bW1hcnlbc3VtbWFyeS5wIDw9IHBfdmFsdWVdLmluZGV4LnZhbHVlcwogICAgICAgIGZvciBncm91cCBpbiBzZWxlY3RfY292YXJzOgogICAgICAgICAgICBheHMgPSBtb2RlbC5wbG90X2NvdmFyaWF0ZV9ncm91cHMoZ3JvdXAsIHZhbHVlcz1bMCwgMV0pCiAgICAgICAgICAgIGZvciBpeCwgYXggaW4gZW51bWVyYXRlKGF4cyk6CiAgICAgICAgICAgICAgICBmID0gYXguZ2V0X2ZpZ3VyZSgpCiAgICAgICAgICAgICAgICBjb250ZXh0LmxvZ19hcnRpZmFjdCgKICAgICAgICAgICAgICAgICAgICBQbG90QXJ0aWZhY3QoZiJjeC17Z3JvdXB9LXtpeH0iLCBib2R5PXBsdC5nY2YoKSksCiAgICAgICAgICAgICAgICAgICAgbG9jYWxfcGF0aD1mIntwbG90c19kZXN0fS9jeC17Z3JvdXB9LXtpeH0uaHRtbCIsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBnY2ZfY2xlYXIocGx0KQoKCmRlZiBfa2FwbGFuX21laWVyX2xvZ19tb2RlbCgKICAgIGNvbnRleHQsCiAgICBtb2RlbCwKICAgIHRpbWVfY29sdW1uOiBzdHIgPSAidGVudXJlIiwKICAgIGRhdGFzZXRfa2V5OiBzdHIgPSAia20tdGltZWxpbmVzIiwKICAgIHBsb3Rfa2V5OiBzdHIgPSAia20tc3Vydml2YWwiLAogICAgcGxvdHNfZGVzdDogc3RyID0gInBsb3RzIiwKICAgIG1vZGVsc19kZXN0OiBzdHIgPSAibW9kZWxzIiwKICAgIGZpbGVfZXh0OiBzdHIgPSAiY3N2IiwKKToKICAgIGltcG9ydCBtYXRwbG90bGliLnB5cGxvdCBhcyBwbHQKCiAgICBvID0gW10KICAgIGZvciBvYmogaW4gbW9kZWwuX19kaWN0X18ua2V5cygpOgogICAgICAgIGlmIGlzaW5zdGFuY2UobW9kZWwuX19kaWN0X19bb2JqXSwgcGQuRGF0YUZyYW1lKToKICAgICAgICAgICAgby5hcHBlbmQobW9kZWwuX19kaWN0X19bb2JqXSkKICAgIGRmID0gcGQuY29uY2F0KG8sIGF4aXM9MSkKICAgIGRmLmluZGV4Lm5hbWUgPSB0aW1lX2NvbHVtbgogICAgY29udGV4dC5sb2dfZGF0YXNldChkYXRhc2V0X2tleSwgZGY9ZGYsIGluZGV4PVRydWUsIGZvcm1hdD1maWxlX2V4dCkKICAgIG1vZGVsLnBsb3QoKQogICAgY29udGV4dC5sb2dfYXJ0aWZhY3QoCiAgICAgICAgUGxvdEFydGlmYWN0KHBsb3Rfa2V5LCBib2R5PXBsdC5nY2YoKSksCiAgICAgICAgbG9jYWxfcGF0aD1mIntwbG90c19kZXN0fS97cGxvdF9rZXl9Lmh0bWwiLAogICAgKQogICAgY29udGV4dC5sb2dfbW9kZWwoCiAgICAgICAgImttLW1vZGVsIiwKICAgICAgICBib2R5PWR1bXBzKG1vZGVsKSwKICAgICAgICBtb2RlbF9kaXI9ZiJ7bW9kZWxzX2Rlc3R9L2ttIiwKICAgICAgICBtb2RlbF9maWxlPSJtb2RlbC5wa2wiLAogICAgKQoKCmRlZiB0cmFpbl9tb2RlbCgKICAgIGNvbnRleHQ6IE1MQ2xpZW50Q3R4LAogICAgZGF0YXNldDogRGF0YUl0ZW0sCiAgICBldmVudF9jb2x1bW46IHN0ciA9ICJsYWJlbHMiLAogICAgdGltZV9jb2x1bW46IHN0ciA9ICJ0ZW51cmUiLAogICAgZW5jb2RlX2NvbHM6IGRpY3QgPSB7fSwKICAgIHN0cmF0YV9jb2xzOiBsaXN0ID0gW10sCiAgICBwbG90X2Nvdl9ncm91cHM6IGJvb2wgPSBGYWxzZSwKICAgIHBfdmFsdWU6IGZsb2F0ID0gMC4wMDUsCiAgICBzYW1wbGU6IGludCA9IC0xLAogICAgdGVzdF9zaXplOiBmbG9hdCA9IDAuMjUsCiAgICB2YWxpZF9zaXplOiBmbG9hdCA9IDAuNzUsICAjIChhZnRlciB0ZXN0IHJlbW92ZWQpCiAgICByYW5kb21fc3RhdGU6IGludCA9IDEsCiAgICBtb2RlbHNfZGVzdDogc3RyID0gIiIsCiAgICBwbG90c19kZXN0OiBzdHIgPSAiIiwKICAgIGZpbGVfZXh0OiBzdHIgPSAiY3N2IiwKKSAtPiBOb25lOgogICAgIiIidHJhaW4gbW9kZWxzIHRvIHByZWRpY3QgdGhlIHRpbWluZyBvZiBldmVudHMKCiAgICBBbHRob3VnaCBpZGVudGljYWwgaW4gc3RydWN0dXJlIHRvIG90aGVyIHRyYWluaW5nIGZ1bmN0aW9ucywgdGhpcyBvbmUKICAgIHJlcXVpcmVzIGdlbmVyYXRpbmcgYSAnWScgdGhhdCByZXByZXNlbnRzIHRoZSBhZ2UvZHVyYXRpb24vdGVudXJlIG9mCiAgICB0aGUgb2JlcnZhdGlvbiwgZGVzaWduYXRlZCAndGVudXJlJyBoZXJlLCBhbmQgYSBiaW5hcnkgbGFiZWxzIGNvbHVtbnMgdGhhdAogICAgcmVwcmVzZW50cyB0aGUgZXZlbnQgb2YgaW50ZXJlc3QsIGNodXJuZWQvbm90LWNodXJuZWQuCgogICAgSW4gYWRkaXRpb24sIHRoZXJlIGlzIGEgc3RyYXRhX2NvbHMgcGFyYW1ldGVyLCByZXByZXNlbnRpbmcgYSBsaXN0IG9mCiAgICBzdHJhdGlmaWNhdGlvbiAoYWthIGdyb3VwaW5nKSB2YXJpYWJsZXMuCgogICAgOnBhcmFtIGNvbnRleHQ6ICAgICAgICAgICB0aGUgZnVuY3Rpb24gY29udGV4dAogICAgOnBhcmFtIGRhdGFzZXQ6ICAgICAgICAgICAoImRhdGEiKSBuYW1lIG9mIHJhdyBkYXRhIGZpbGUKICAgIDpwYXJhbSBldmVudF9jb2x1bW46ICAgICAgZ3JvdW5kLXRydXRoICh5KSBsYWJlbHMgKGNvbnNpZGVyZWQgYXMgZXZlbnRzIGluIHRoaXMgbW9kZWwpCiAgICA6cGFyYW0gdGltZV9jb2x1bW46ICAgICAgIGFnZSBvciB0ZW51cmUgY29sdW1uCiAgICA6cGFyYW0gZW5jb2RlX2NvbHM6ICAgICAgIGRpY3Rpb25hcnkgb2YgbmFtZXMgYW5kIHByZWZpeGVzIGZvciBjb2x1bW5zIHRoYXQgYXJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGhvdCBiZSBlbmNvZGVkLgogICAgOnBhcmFtIHN0cmF0YV9jb2xzOiAgICAgICBjb2x1bW5zIHVzZWQgdG8gc3RyYXRpZnkgcHJlZGljdG9ycwogICAgOnBhcmFtIHBsb3RfY292X2dyb3VwczoKICAgIDpwYXJhbSBwX3ZhbHVlOiAgICAgICAgICAgKDAuMDA1KSBtYXggcCB2YWx1ZSBmb3IgY29lZmZjaWVudHMgc2VsZWN0ZWQKICAgIDpwYXJhbSBzYW1wbGU6ICAgICAgICAgICAgU2VsZWN0cyB0aGUgZmlyc3QgbiByb3dzLCBvciBzZWxlY3QgYSBzYW1wbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRpbmcgZnJvbSB0aGUgZmlyc3QuIElmIG5lZ2F0aXZlIDwtMSwgc2VsZWN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcmFuZG9tIHNhbXBsZQogICAgOnBhcmFtIHRlc3Rfc2l6ZTogICAgICAgICAoMC4yNSkgdGVzdCBzZXQgc2l6ZQogICAgOnBhcmFtIHZhbGlkX3NpemU6ICAgICAgICAoMC43NSkgT25jZSB0aGUgdGVzdCBzZXQgaGFzIGJlZW4gcmVtb3ZlZCB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaW5pbmcgc2V0IGdldHMgdGhpcyBwcm9wb3J0aW9uLgogICAgOnBhcmFtIHJhbmRvbV9zdGF0ZTogICAgICAoMSkgc2tsZWFybiBybmcgc2VlZAogICAgOnBhcmFtIG1vZGVsc19kZXN0OiAgICAgICBkZXN0aW5hdGlvbiBzdWJmb2xkZXIgZm9yIG1vZGVsIGFydGlmYWN0cwogICAgOnBhcmFtIHBsb3RzX2Rlc3Q6ICAgICAgICBkZXN0aW5hdGlvbiBzdWJmb2xkZXIgZm9yIHBsb3QgYXJ0aWZhY3RzCiAgICA6cGFyYW0gZmlsZV9leHQ6ICAgICAgICAgIGZvcm1hdCBmb3IgdGVzdF9zZXRfa2V5IGhvbGQgb3V0IGRhdGEKICAgICIiIgogICAgZnJvbSBsaWZlbGluZXMucGxvdHRpbmcgaW1wb3J0IHBsb3RfbGlmZXRpbWVzCiAgICBpbXBvcnQgbWF0cGxvdGxpYi5weXBsb3QgYXMgcGx0CgogICAgbW9kZWxzX2Rlc3QgPSBtb2RlbHNfZGVzdCBvciAibW9kZWxzIgogICAgcGxvdHNfZGVzdCA9IHBsb3RzX2Rlc3Qgb3IgZiJwbG90cy97Y29udGV4dC5uYW1lfSIKCiAgICByYXcsIHRlbnVyZSwgaGVhZGVyID0gZ2V0X3NhbXBsZShkYXRhc2V0LCBzYW1wbGUsIHRpbWVfY29sdW1uKQoKICAgIGlmIGVuY29kZV9jb2xzOgogICAgICAgIHJhdyA9IHBkLmdldF9kdW1taWVzKAogICAgICAgICAgICByYXcsCiAgICAgICAgICAgIGNvbHVtbnM9bGlzdChlbmNvZGVfY29scy5rZXlzKCkpLAogICAgICAgICAgICBwcmVmaXg9bGlzdChlbmNvZGVfY29scy52YWx1ZXMoKSksCiAgICAgICAgICAgIGRyb3BfZmlyc3Q9VHJ1ZSwKICAgICAgICApCgogICAgKHh0cmFpbiwgeXRyYWluKSwgKHh2YWxpZCwgeXZhbGlkKSwgKHh0ZXN0LCB5dGVzdCkgPSBnZXRfc3BsaXRzKAogICAgICAgIHJhdywgdGVudXJlLCAzLCB0ZXN0X3NpemUsIHZhbGlkX3NpemUsIHJhbmRvbV9zdGF0ZQogICAgKQogICAgZm9yIFggaW4gW3h0cmFpbiwgeHZhbGlkLCB4dGVzdF06CiAgICAgICAgZHJvcF9jb2xzID0gWC5jb2x1bW5zLnN0ci5zdGFydHN3aXRoKHRpbWVfY29sdW1uKQogICAgICAgIFguZHJvcChYLmNvbHVtbnNbZHJvcF9jb2xzXSwgYXhpcz0xLCBpbnBsYWNlPVRydWUpCiAgICBmb3IgWSBpbiBbeXRyYWluLCB5dmFsaWQsIHl0ZXN0XToKICAgICAgICBZLm5hbWUgPSB0aW1lX2NvbHVtbgoKICAgIGNvbnRleHQubG9nX2RhdGFzZXQoCiAgICAgICAgInRlbnVyZWQtdGVzdC1zZXQiLAogICAgICAgIGRmPXBkLmNvbmNhdChbeHRlc3QsIHl0ZXN0LnRvX2ZyYW1lKCldLCBheGlzPTEpLAogICAgICAgIGZvcm1hdD1maWxlX2V4dCwKICAgICAgICBpbmRleD1GYWxzZSwKICAgICkKCiAgICBrbV9tb2RlbCA9IEthcGxhbk1laWVyRml0dGVyKCkuZml0KHl0cmFpbiwgeHRyYWluLmxhYmVscykKICAgIF9rYXBsYW5fbWVpZXJfbG9nX21vZGVsKGNvbnRleHQsIGttX21vZGVsLCBtb2RlbHNfZGVzdD1tb2RlbHNfZGVzdCkKCiAgICBjb3hkYXRhID0gcGQuY29uY2F0KFt4dHJhaW4sIHl0cmFpbi50b19mcmFtZSgpXSwgYXhpcz0xKQogICAgY3hfbW9kZWwgPSBDb3hQSEZpdHRlcigpLmZpdChjb3hkYXRhLCB0aW1lX2NvbHVtbiwgZXZlbnRfY29sdW1uLCBzdHJhdGE9c3RyYXRhX2NvbHMpCiAgICBfY294cGhfbG9nX21vZGVsKAogICAgICAgIGNvbnRleHQsCiAgICAgICAgY3hfbW9kZWwsCiAgICAgICAgbW9kZWxzX2Rlc3Q9bW9kZWxzX2Rlc3QsCiAgICAgICAgcGxvdF9jb3ZfZ3JvdXBzPXBsb3RfY292X2dyb3VwcywKICAgICAgICBleHRyYV9kYXRhPXsia20iOiBmInttb2RlbHNfZGVzdH0va20ifSwKICAgICkK - commands: [] - code_origin: https://github.com/daniels290813/functions.git#55a79c32be5d233cc11efcf40cd3edbe309bfdef:/home/kali/functions/coxph_trainer/coxph_trainer.py - affinity: null -verbose: false diff --git a/coxph_trainer/item.yaml b/coxph_trainer/item.yaml deleted file mode 100644 index 2b4cca63d..000000000 --- a/coxph_trainer/item.yaml +++ /dev/null @@ -1,26 +0,0 @@ -apiVersion: v1 -categories: -- model-training -- machine-learning -description: cox proportional hazards, kaplan meier plots -doc: '' -example: coxph_trainer.ipynb -generationDate: 2022-08-28:17-25 -hidden: true -icon: '' -labels: - author: yjb - framework: survival -maintainers: [] -marketplaceType: '' -mlrunVersion: 1.1.0 -name: coxph-trainer -platformVersion: 3.5.0 -spec: - filename: coxph_trainer.py - handler: train_model - image: mlrun/ml-models - kind: job - requirements: [] -url: '' -version: 1.1.0 diff --git a/coxph_trainer/requirements.txt b/coxph_trainer/requirements.txt deleted file mode 100644 index ca8c96f68..000000000 --- a/coxph_trainer/requirements.txt +++ /dev/null @@ -1,6 +0,0 @@ -scikit-learn -seaborn -scikit-plot -pandas -lifelines -matplotlib \ No newline at end of file diff --git a/coxph_trainer/test_coxph_trainer.py b/coxph_trainer/test_coxph_trainer.py deleted file mode 100644 index 8d1344668..000000000 --- a/coxph_trainer/test_coxph_trainer.py +++ /dev/null @@ -1,136 +0,0 @@ -# Copyright 2019 Iguazio -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -from mlrun import get_or_create_ctx, import_function -import os -import json -import pandas as pd -import numpy as np -from collections import defaultdict -from cloudpickle import dumps, load -from sklearn.preprocessing import LabelEncoder -from mlrun.execution import MLClientCtx -from mlrun.datastore import DataItem -import mlrun - -ARTIFACT_PATH = "artifacts" -FUNCTION_PATH = "functions" -MODELS_PATH = "models" -PLOTS_PATH = "plots" -RUNS_PATH = "runs" -SCHEDULES_PATH = "schedules" -DATA_URL = "https://raw.githubusercontent.com/mlrun/demos/0.6.x/customer-churn-prediction/WA_Fn-UseC_-Telco-Customer-Churn.csv" - - -def data_clean( - context: MLClientCtx, - src: DataItem, - file_ext: str = "csv", - models_dest: str = "models/encoders", - cleaned_key: str = "cleaned-data", - encoded_key: str = "encoded-data" -): - df = src.as_df() - - # drop columns - drop_cols_list = ["customerID", "TotalCharges"] - df.drop(drop_cols_list, axis=1, inplace=True) - - # header transformations - old_cols = df.columns - rename_cols_map = { - "SeniorCitizen": "senior", - "Partner": "partner", - "Dependents": "deps", - "Churn": "labels" - } - df.rename(rename_cols_map, axis=1, inplace=True) - - # add drop column to logs: - for col in drop_cols_list: - rename_cols_map.update({col: "_DROPPED_"}) - - # log the op - tp = os.path.join(models_dest, "preproc-column_map.json") - context.log_artifact("preproc-column_map.json", - body=json.dumps(rename_cols_map), - local_path=tp) - df = df.applymap(lambda x: "No" if str(x).startswith("No ") else x) - - # encode numerical type as category bins (ordinal) - bins = [0, 12, 24, 36, 48, 60, np.inf] - labels = [0, 1, 2, 3, 4, 5] - tenure = df.tenure.copy(deep=True) - df["tenure_map"] = pd.cut(df.tenure, bins, labels=False) - tenure_map = dict(zip(bins, labels)) - # save this transformation - tp = os.path.join(models_dest, "preproc-numcat_map.json") - context.log_artifact("preproc-numcat_map.json", - body=bytes(json.dumps(tenure_map).encode("utf-8")), - local_path=tp) - - context.log_dataset(cleaned_key, df=df, format=file_ext, index=False) - fix_cols = ["gender", "partner", "deps", "OnlineSecurity", - "OnlineBackup", "DeviceProtection", "TechSupport", - "StreamingTV", "StreamingMovies", "PhoneService", - "MultipleLines", "PaperlessBilling", "InternetService", - "Contract", "PaymentMethod", "labels"] - - d = defaultdict(LabelEncoder) - df[fix_cols] = df[fix_cols].apply(lambda x: d[x.name].fit_transform(x.astype(str))) - context.log_dataset(encoded_key, df=df, format=file_ext, index=False) - - model_bin = dumps(d) - context.log_model("model", - body=model_bin, - artifact_path=os.path.join(context.artifact_path, - models_dest), - model_file="model.pkl") - - -def test_local_coxph_train(): - # ctx = get_or_create_ctx(name="tasks survive trainer") - # src = mlrun.get_dataitem(DATA_URL) - data_clean_function = mlrun.code_to_function( - filename="test_coxph_trainer.py", - name="data_clean", - kind="job", - image="mlrun/mlrun", - ) - data_clean_run = data_clean_function.run( - handler="data_clean", - inputs={"src": DATA_URL}, - params={ - "cleaned_key": "cleaned-data", - "encoded_key": "encoded-data", - }, - local=True, - artifact_path='./' - ) - - trainer_fn = import_function("function.yaml") - trainer_run = trainer_fn.run( - params={ - "strata_cols": ['InternetService', 'StreamingMovies', 'StreamingTV', 'PhoneService'], - "encode_cols": {"Contract": "Contract", "PaymentMethod": "Payment"}, - "models_dest": 'models/cox' - }, - inputs={"dataset": data_clean_run.artifact("encoded-data").url}, - local=True, - artifact_path='./' - ) - - model = load(open(f"{trainer_run.artifact('km-model').url}model.pkl", "rb")) - ans = model.predict([1, 10, 30, 100, 200]) - assert(sum([abs(x-y) for x, y in zip(list(np.around(ans, 2)), [0.95, 0.85, 0.77, 0.58, 0.58])]) < 0.5) \ No newline at end of file diff --git a/xgb_test/function.yaml b/xgb_test/function.yaml deleted file mode 100644 index 1ba562a9e..000000000 --- a/xgb_test/function.yaml +++ /dev/null @@ -1,63 +0,0 @@ -kind: job -metadata: - name: xgb-test - tag: '' - hash: 3f3368b15f934eba5f6f6b23972da804b6eb88d4 - project: '' - labels: - author: Daniel - framework: xgboost - categories: - - model-testing -spec: - command: '' - args: [] - image: mlrun/mlrun - env: [] - default_handler: xgb_test - entry_points: - xgb_test: - name: xgb_test - doc: 'Test one or more classifier models against held-out dataset - - - Using held-out test features, evaluates the peformance of the estimated model - - - Can be part of a kubeflow pipeline as a test step that is run post EDA and - - training/validation cycles' - parameters: - - name: context - doc: the function context - default: '' - - name: models_path - type: DataItem - doc: model artifact to be tested - default: '' - - name: test_set - type: DataItem - doc: test features and labels - default: '' - - name: label_column - type: str - doc: column name for ground truth labels - default: '' - - name: plots_dest - type: str - doc: dir for test plots - default: plots - - name: default_model - type: str - doc: '''model.pkl'', default model artifact file name' - default: model.pkl - outputs: - - default: '' - lineno: 16 - description: Test one or more classifier models against held-out dataset. - build: - functionSourceCode: IyBHZW5lcmF0ZWQgYnkgbnVjbGlvLmV4cG9ydC5OdWNsaW9FeHBvcnRlcgoKaW1wb3J0IHdhcm5pbmdzCgp3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoYWN0aW9uPSJpZ25vcmUiLCBjYXRlZ29yeT1GdXR1cmVXYXJuaW5nKQoKaW1wb3J0IG9zCmltcG9ydCBwYW5kYXMgYXMgcGQKZnJvbSBtbHJ1bi5kYXRhc3RvcmUgaW1wb3J0IERhdGFJdGVtCmZyb20gbWxydW4uYXJ0aWZhY3RzIGltcG9ydCBnZXRfbW9kZWwKZnJvbSBjbG91ZHBpY2tsZSBpbXBvcnQgbG9hZAoKZnJvbSBtbHJ1bi5tbHV0aWxzLm1vZGVscyBpbXBvcnQgZXZhbF9tb2RlbF92MgoKCmRlZiB4Z2JfdGVzdCgKICAgIGNvbnRleHQsCiAgICBtb2RlbHNfcGF0aDogRGF0YUl0ZW0sCiAgICB0ZXN0X3NldDogRGF0YUl0ZW0sCiAgICBsYWJlbF9jb2x1bW46IHN0ciwKICAgIHBsb3RzX2Rlc3Q6IHN0ciA9ICJwbG90cyIsCiAgICBkZWZhdWx0X21vZGVsOiBzdHIgPSAibW9kZWwucGtsIiwKKSAtPiBOb25lOgogICAgIiIiVGVzdCBvbmUgb3IgbW9yZSBjbGFzc2lmaWVyIG1vZGVscyBhZ2FpbnN0IGhlbGQtb3V0IGRhdGFzZXQKCiAgICBVc2luZyBoZWxkLW91dCB0ZXN0IGZlYXR1cmVzLCBldmFsdWF0ZXMgdGhlIHBlZm9ybWFuY2Ugb2YgdGhlIGVzdGltYXRlZCBtb2RlbAoKICAgIENhbiBiZSBwYXJ0IG9mIGEga3ViZWZsb3cgcGlwZWxpbmUgYXMgYSB0ZXN0IHN0ZXAgdGhhdCBpcyBydW4gcG9zdCBFREEgYW5kCiAgICB0cmFpbmluZy92YWxpZGF0aW9uIGN5Y2xlcwoKICAgIDpwYXJhbSBjb250ZXh0OiAgICAgICAgIHRoZSBmdW5jdGlvbiBjb250ZXh0CiAgICA6cGFyYW0gbW9kZWxzX3BhdGg6ICAgICBtb2RlbCBhcnRpZmFjdCB0byBiZSB0ZXN0ZWQKICAgIDpwYXJhbSB0ZXN0X3NldDogICAgICAgIHRlc3QgZmVhdHVyZXMgYW5kIGxhYmVscwogICAgOnBhcmFtIGxhYmVsX2NvbHVtbjogICAgY29sdW1uIG5hbWUgZm9yIGdyb3VuZCB0cnV0aCBsYWJlbHMKICAgIDpwYXJhbSBwbG90c19kZXN0OiAgICAgIGRpciBmb3IgdGVzdCBwbG90cwogICAgOnBhcmFtIGRlZmF1bHRfbW9kZWw6ICAgJ21vZGVsLnBrbCcsIGRlZmF1bHQgbW9kZWwgYXJ0aWZhY3QgZmlsZSBuYW1lCiAgICAiIiIKICAgIHh0ZXN0ID0gdGVzdF9zZXQuYXNfZGYoKQogICAgeXRlc3QgPSB4dGVzdC5wb3AobGFiZWxfY29sdW1uKQoKICAgIHRyeToKICAgICAgICBtb2RlbF9maWxlLCBtb2RlbF9vYmosIF8gPSBnZXRfbW9kZWwobW9kZWxzX3BhdGgudXJsLCBzdWZmaXg9Ii5wa2wiKQogICAgICAgIG1vZGVsX29iaiA9IGxvYWQob3Blbihtb2RlbF9maWxlLCAicmIiKSkKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgYToKICAgICAgICByYWlzZSBFeGNlcHRpb24oIm1vZGVsIGxvY2F0aW9uIGxpa2VseSBtaXNzcGVjaWZpZWQiKQoKICAgIGV2YWxfbWV0cmljcyA9IGV2YWxfbW9kZWxfdjIoY29udGV4dCwgeHRlc3QsIHl0ZXN0LnZhbHVlcywgbW9kZWxfb2JqKQo= - commands: [] - code_origin: https://github.com/daniels290813/functions.git#55a79c32be5d233cc11efcf40cd3edbe309bfdef:/home/kali/functions/xgb_test/xgb_test.py - affinity: null -verbose: false diff --git a/xgb_test/item.yaml b/xgb_test/item.yaml deleted file mode 100644 index cc376e9f7..000000000 --- a/xgb_test/item.yaml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: v1 -categories: -- model-testing -description: Test one or more classifier models against held-out dataset. -doc: '' -example: xgb_test.ipynb -generationDate: 2022-08-28:17-25 -hidden: true -icon: '' -labels: - author: Daniel - framework: xgboost -maintainers: [] -marketplaceType: '' -mlrunVersion: 1.4.1 -name: xgb_test -platformVersion: 3.5.3 -spec: - filename: xgb_test.py - handler: xgb_test - image: mlrun/mlrun - kind: job - requirements: [] -url: '' -version: 1.1.1 diff --git a/xgb_test/requirements.txt b/xgb_test/requirements.txt deleted file mode 100644 index fc5c36f78..000000000 --- a/xgb_test/requirements.txt +++ /dev/null @@ -1,8 +0,0 @@ -pandas -xgboost -cloudpickle -pygit2 -matplotlib -seaborn -scikit-plot -scikit-learn==1.0.2 diff --git a/xgb_test/test_xgb_test.py b/xgb_test/test_xgb_test.py deleted file mode 100644 index a2f92746a..000000000 --- a/xgb_test/test_xgb_test.py +++ /dev/null @@ -1,148 +0,0 @@ -# Copyright 2019 Iguazio -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -from mlrun import code_to_function, import_function -import os -import pandas as pd - - -def get_class_data(): - fn = import_function("hub://gen_class_data") - run = fn.run( - params={ - "n_samples": 10_000, - "m_features": 5, - "k_classes": 2, - "header": None, - "weight": [0.5, 0.5], - "sk_params": {"n_informative": 2}, - "file_ext": "csv", - }, - local=True, - artifact_path="./artifacts/inputs", - ) - return run.status.artifacts[0]['spec']['target_path'] - - -def xgb_trainer(): - data = get_class_data() - fn = code_to_function( - name='xgb_trainer', - filename="../xgb_trainer/xgb_trainer.py", - handler="train_model", - kind="job", - ) - run = fn.run( - params={ - "model_type": "classifier", - "CLASS_tree_method": "hist", - "CLASS_objective": "binary:logistic", - "CLASS_booster": "gbtree", - "FIT_verbose": 0, - "label_column": "labels", - }, - local=True, - inputs={"dataset": data}, - ) - - for artifact in run.status.artifacts: - if artifact['kind'] == 'model': - assert os.path.exists(artifact['spec']['target_path']), "Failed locating model file" # validating model exists - break - return data, artifact['spec']['target_path'] + artifact['spec']['model_file'] - - -def test_xgb_test_code_to_function(): - data, model = xgb_trainer() - fn = code_to_function( - name='test_xgb_test', - filename="../xgb_test/xgb_test.py", - handler="xgb_test", - kind="job", - ) - run = fn.run( - params={ - "label_column": "labels", - "plots_dest": "plots/xgb_test", - }, - local=True, - inputs={ - "test_set": data, - "models_path": model, - } - ) - - assert run.outputs['accuracy'] and run.state() == 'completed' - - -def test_local_xgb_test_import_local_function(): - # importing data preparation function (gen_class_data) locally - fn = import_function("../gen_class_data/function.yaml") - run = fn.run( - params={ - "n_samples": 10_000, - "m_features": 5, - "k_classes": 2, - "header": None, - "weight": [0.5, 0.5], - "sk_params": {"n_informative": 2}, - "file_ext": "csv", - }, - local=True, - artifact_path="./artifacts/inputs", - ) - data = run.status.artifacts[0]['spec']['target_path'] - - # importing model training function (xgb_trainer) locally - fn = import_function("../xgb_trainer/function.yaml") - run = fn.run( - params={ - "model_type": "classifier", - "CLASS_tree_method": "hist", - "CLASS_objective": "binary:logistic", - "CLASS_booster": "gbtree", - "FIT_verbose": 0, - "label_column": "labels", - }, - local=True, - inputs={"dataset": data}, - ) - for artifact in run.status.artifacts: - if artifact['kind'] == 'model': - assert os.path.exists(artifact['spec']['target_path']), "Failed locating model file" # validating model exists - break - - model = artifact['spec']['target_path'] + artifact['spec']['model_file'] - - # importing xgb_test function.yaml and running tests - fn = import_function("function.yaml") - run = fn.run( - params={ - "label_column": "labels", - "plots_dest": "plots/xgb_test", - }, - local=True, - inputs={ - "test_set": data, - "models_path": model, - } - ) - - # tests for gen_class_data - assert data - df = pd.read_csv(data) - assert (True if df["labels"].sum() == 5008 else False) - # tests for xgb_trainer - assert model - # no tests for xgb_test (it is a test already) diff --git a/xgb_test/xgb_test.ipynb b/xgb_test/xgb_test.ipynb deleted file mode 100644 index f404cab3a..000000000 --- a/xgb_test/xgb_test.ipynb +++ /dev/null @@ -1,708 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# **XGBoost test**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This function handles evaluating XGBoost model performance, test one or more classifier models against held-out dataset
\n", - "Using held-out test features, evaluates the peformance of the estimated model.
\n", - "Can be part of a kubeflow pipeline as a test step that is run post EDA and training/validation cycles.
\n", - "This function is part of the [customer-churn-prediction](https://github.com/mlrun/demos/tree/master/customer-churn-prediction) demo.
\n", - "To see how the model is trained or how the data-set is generated, check out `xgb_trainer` function from the function marketplace repository" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Steps\n", - "1. [Setup function parameters](#Setup-function-parameters)\n", - "2. [Importing the function](#Importing-the-function)\n", - "3. [Running the function locally](#Running-the-function-locally)\n", - "4. [Running the function remotely](#Running-the-function-remotely)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import warnings\n", - "warnings.filterwarnings(\"ignore\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Setup function parameters** " - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - }, - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [], - "source": [ - "test_set = \"https://s3.wasabisys.com/iguazio/data/function-marketplace-data/xgb_test/test_set.csv\"\n", - "models_path = \"https://s3.wasabisys.com/iguazio/models/function-marketplace-models/xgb_test/xgb_model.pkl\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Importing the function**" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2021-10-17 13:24:42,721 [info] loaded project function-marketplace from MLRun DB\n" - ] - } - ], - "source": [ - "import mlrun\n", - "mlrun.set_environment(project='function-marketplace')\n", - "\n", - "fn = mlrun.import_function('hub://xgb_test')\n", - "fn.apply(mlrun.auto_mount())\n", - "fn.image = \"mlrun/ml-models\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Running the function locally**" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2021-10-17 13:24:43,112 [info] starting run tasks_xgb_test uid=1259c7c9bd0e4b0895be4f5e2fbb65c4 DB=http://mlrun-api:8080\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
projectuiditerstartstatenamelabelsinputsparametersresultsartifacts
function-marketplace0Oct 17 13:24:43completedtasks_xgb_test
v3io_user=dani
kind=
owner=dani
host=jupyter-dani-6bfbd76d96-zxx6f
test_set
models_path
label_column=labels
plots_dest=plots/xgb_test
accuracy=0.9632
test-error=0.0368
rocauc=0.984364949478981
brier_score=0.03287091841943238
f1-score=0.9624796084828712
precision_score=0.9744013212221305
recall_score=0.9508460918614021
probability-calibration
confusion-matrix
feature-importances
precision-recall-binary
roc-binary
\n", - "
\n", - "
\n", - "
\n", - " Title\n", - " ×\n", - "
\n", - " \n", - "
\n", - "
\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - }, - { - "data": { - "text/html": [ - " > to track results use the .show() or .logs() methods or click here to open in UI" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2021-10-17 13:24:48,490 [info] run executed, status=completed\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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y0Jx9e3bFzc3t9gBZl9//TVZsmTh/fffd3JkhtOoqt1uQFPgFHAW+Cie17sCh623P4BKSR2zatWqaiRfYGCgTp8+XaOjo1VV9datWw6P4datW/r++++ri4uL5suXT6dPn67u7u6KpXvyAzcXFxfNkSOH/vTTTw6PMznat2+vBQoU0Hv37jk7lGRxc3OL9313d3d3dmiGnQD7NKHv6oReSOkNcAH+xjIYLRtwCCj30Da1gCet918D9iR1XJMIHs93332nWbJk0f379zu87MjISJ05c6bmz59fs2TJov369dMbN24kus+NGzf05ZdfVkC//PLL2ASWlty8eVOzZcumAwcOdHYoyRZfEoi5GRmTsxJBTeDnOI8/Bj5OZPsngctJHdckAttdv3499os/MjJSDx8+7PAYtm3bpp6engpo3bp19eDBgzbvGx4erl27dlVAe/bsmebOumfOnKmAU5JrSplEkPkklgjseXG4CHAxzuNL1ucS8jawKb4XROQdEdknIvtu3LiRiiFmbO3ataNTp06xk8Q5cnqI8+fP06FDB+rXr8+dO3dYtmwZ27ZtS9ZEddmzZ8fHx4cxY8awYMECGjduzK1bt+wYdfJ4e3tToUIFqlSp4uxQDCNlEsoQKb0BHYDv4zzuBnyTwLb1gRNA/qSOa2oEibt06ZLev39fVVX379+vR48edWj5ISEhOmrUKM2RI4e6ubnp2LFj9e7duyk+7qJFizRbtmxaunRpPXPmTCpEmjInT55UQCdNmuTsUB4LpkaQ6eCkGsEloFicx0WBKw9vJCKewPdAK1W9acd4MryYSeImTZoEwIsvvkj58uUdUraq8uOPP1KmTBk+//xz2rRpw6lTpxg1ahRubm4pPn7Xrl35v//7P27dukWNGjXYsWNHKkT9+Ly9vcmSJQtdu3Z1ahyGkSoSyhApvQGuwD9ACf7XWFz+oW2ewdKjqJatxzU1gkfFPeMeN26c/v333w4tf//+/Vq7dm0FtEqVKrpjxw67lXX27Fl94YUXNGvWrOrt7W23chITFRWlxYoV06ZNmzql/NSQUG8t02so48IZjcWWcmkGnMbSe+g/1uf6An2t978HbgMHrbcEA425mUTwoJ9++kk9PDz00qVLDi/b399fe/furSKiBQoU0Dlz5mhkZKTdy71165bWr19fAR01apTDexT5+fkpoEuXLnVo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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "fn.run(name='tasks_xgb_test',\n", - " params = {\"label_column\" : \"labels\",\n", - " \"plots_dest\" : \"plots/xgb_test\"},\n", - " inputs = {\"test_set\" : test_set,\n", - " \"models_path\" : models_path},\n", - " local=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Running the function remotely**" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2021-10-17 13:24:48,946 [info] starting run tasks_xgb_test uid=550a773aeb7e4754b4652772d205365a DB=http://mlrun-api:8080\n", - "> 2021-10-17 13:24:49,084 [info] Job is running in the background, pod: tasks-xgb-test-gj7q4\n", - "> 2021-10-17 13:24:59,214 [info] run executed, status=completed\n", - "final state: completed\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
projectuiditerstartstatenamelabelsinputsparametersresultsartifacts
function-marketplace0Oct 17 13:24:55completedtasks_xgb_test
v3io_user=dani
kind=job
owner=dani
host=tasks-xgb-test-gj7q4
test_set
models_path
label_column=labels
plots_dest=plots/xgb_test
accuracy=0.9632
test-error=0.0368
rocauc=0.984364949478981
brier_score=0.03287091841943238
f1-score=0.9624796084828712
precision_score=0.9744013212221305
recall_score=0.9508460918614021
probability-calibration
confusion-matrix
feature-importances
precision-recall-binary
roc-binary
\n", - "
\n", - "
\n", - "
\n", - " Title\n", - " ×\n", - "
\n", - " \n", - "
\n", - "
\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - }, - { - "data": { - "text/html": [ - " > to track results use the .show() or .logs() methods or click here to open in UI" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2021-10-17 13:25:08,339 [info] run executed, status=completed\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "fn.deploy(with_mlrun=False, # mlrun is included in our image (mlrun/ml-models) therefore no mlrun installation is needed.\n", - " skip_deployed=True) # because no new packages or upgrade is required, we can use the original image and not build another one.\n", - "\n", - "fn.run(name='tasks_xgb_test',\n", - " params = {\"label_column\" : \"labels\",\n", - " \"plots_dest\" : \"plots/xgb_test\"},\n", - " inputs = {\"test_set\" : test_set,\n", - " \"models_path\" : models_path},\n", - " local=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "[Back to the top](#XGBoost-test)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/xgb_test/xgb_test.py b/xgb_test/xgb_test.py deleted file mode 100644 index 8ad3a6a1c..000000000 --- a/xgb_test/xgb_test.py +++ /dev/null @@ -1,61 +0,0 @@ -# Copyright 2019 Iguazio -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Generated by nuclio.export.NuclioExporter - -import warnings - -warnings.simplefilter(action="ignore", category=FutureWarning) - -import os -import pandas as pd -from mlrun.datastore import DataItem -from mlrun.artifacts import get_model -from cloudpickle import load - -from mlrun.mlutils.models import eval_model_v2 - - -def xgb_test( - context, - models_path: DataItem, - test_set: DataItem, - label_column: str, - plots_dest: str = "plots", - default_model: str = "model.pkl", -) -> None: - """Test one or more classifier models against held-out dataset - - Using held-out test features, evaluates the peformance of the estimated model - - Can be part of a kubeflow pipeline as a test step that is run post EDA and - training/validation cycles - - :param context: the function context - :param models_path: model artifact to be tested - :param test_set: test features and labels - :param label_column: column name for ground truth labels - :param plots_dest: dir for test plots - :param default_model: 'model.pkl', default model artifact file name - """ - xtest = test_set.as_df() - ytest = xtest.pop(label_column) - - try: - model_file, model_obj, _ = get_model(models_path.url, suffix=".pkl") - model_obj = load(open(model_file, "rb")) - except Exception as a: - raise Exception("model location likely misspecified") - - eval_metrics = eval_model_v2(context, xtest, ytest.values, model_obj) diff --git a/xgb_trainer/function.yaml b/xgb_trainer/function.yaml deleted file mode 100644 index 425e61c54..000000000 --- a/xgb_trainer/function.yaml +++ /dev/null @@ -1,102 +0,0 @@ -kind: job -metadata: - name: xgb-trainer - tag: '' - hash: 74f26135df3322a88554136c4c5dbe8d95a5fadc - project: '' - labels: - author: Daniel - categories: - - model-training -spec: - command: '' - args: [] - image: mlrun/mlrun - env: [] - default_handler: train_model - entry_points: - train_model: - name: train_model - doc: 'train an xgboost model. - - - Note on imabalanced data: the `imbal_vec` parameter represents the measured - - class representations in the sample and can be used as a first step in tuning - - an XGBoost model. This isn''t a hyperparamter, merely an estimate that should - - be set as ''constant'' throughout tuning process.' - parameters: - - name: context - type: MLClientCtx - doc: the function context - default: '' - - name: model_type - type: str - doc: the model type to train, "classifier", "regressor"... - default: '' - - name: dataset - type: Union[DataItem, DataFrame] - doc: ("data") name of raw data file - default: '' - - name: label_column - type: str - doc: ground-truth (y) labels - default: labels - - name: encode_cols - type: dict - doc: dictionary of names and prefixes for columns that are to hot be encoded. - default: {} - - name: sample - type: int - doc: Selects the first n rows, or select a sample starting from the first. - If negative <-1, select a random sample - default: <_ast.USub object at 0x7f66a8fbc7b8> - - name: imbal_vec - doc: ([]) vector of class weights seen in sample - default: [] - - name: test_size - type: float - doc: (0.05) test set size - default: 0.25 - - name: valid_size - type: float - doc: (0.75) Once the test set has been removed the training set gets this - proportion. - default: 0.75 - - name: random_state - type: int - doc: (1) sklearn rng seed - default: 1 - - name: models_dest - type: str - doc: destination subfolder for model artifacts - default: models - - name: plots_dest - type: str - doc: destination subfolder for plot artifacts - default: plots - - name: eval_metrics - type: list - doc: (["error", "auc"]) learning curve metrics - default: - - error - - auc - - name: file_ext - type: str - doc: format for test_set_key hold out data - default: parquet - - name: test_set - type: str - default: test_set - outputs: - - default: '' - lineno: 57 - description: train multiple model types using xgboost. - build: - functionSourceCode: IyBHZW5lcmF0ZWQgYnkgbnVjbGlvLmV4cG9ydC5OdWNsaW9FeHBvcnRlcgoKaW1wb3J0IHdhcm5pbmdzCgp3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoYWN0aW9uPSJpZ25vcmUiLCBjYXRlZ29yeT1GdXR1cmVXYXJuaW5nKQoKZnJvbSBtbHJ1bi5tbHV0aWxzLmRhdGEgaW1wb3J0IGdldF9zYW1wbGUsIGdldF9zcGxpdHMKZnJvbSBtbHJ1bi5tbHV0aWxzLm1vZGVscyBpbXBvcnQgZ2VuX3NrbGVhcm5fbW9kZWwsIGV2YWxfbW9kZWxfdjIKZnJvbSBtbHJ1bi51dGlscy5oZWxwZXJzIGltcG9ydCBjcmVhdGVfY2xhc3MKCmZyb20gbWxydW4uZXhlY3V0aW9uIGltcG9ydCBNTENsaWVudEN0eApmcm9tIG1scnVuLmRhdGFzdG9yZSBpbXBvcnQgRGF0YUl0ZW0KCmZyb20gY2xvdWRwaWNrbGUgaW1wb3J0IGR1bXBzCmltcG9ydCBwYW5kYXMgYXMgcGQKaW1wb3J0IG9zCmZyb20gdHlwaW5nIGltcG9ydCBVbmlvbgoKCmRlZiBfZ2VuX3hnYl9tb2RlbChtb2RlbF90eXBlOiBzdHIsIHhnYl9wYXJhbXM6IGRpY3QpOgogICAgIiIiZ2VuZXJhdGUgYW4geGdib29zdCBtb2RlbAoKICAgIE11bHRpcGxlIG1vZGVsIHR5cGVzIHRoYXQgY2FuIGJlIGVzdGltYXRlZCB1c2luZwogICAgdGhlIFhHQm9vc3QgU2Npa2l0LUxlYXJuIEFQSS4KCiAgICBJbnB1dCBjYW4gZWl0aGVyIGJlIGEgcHJlZGVmaW5lZCBqc29uIG1vZGVsIGNvbmZpZ3VyYXRpb24gb3Igb25lCiAgICBvZiB0aGUgZml2ZSB4Z2Jvb3N0IG1vZGVsIHR5cGVzOiAiY2xhc3NpZmllciIsICJyZWdyZXNzb3IiLCAicmFua2VyIiwKICAgICJyZl9jbGFzc2lmaWVyIiwgb3IgInJmX3JlZ3Jlc3NvciIuCgogICAgSW4gZWl0aGVyIGNhc2Ugb25lIGNhbiBwYXNzIGluIGEgcGFyYW1zIGRpY3QgdG8gbW9kaWZ5IGRlZmF1bHRzIHZhbHVlcy4KCiAgICBCYXNlZCBvbiBgbWx1dGlscy5tb2RlbHMuZ2VuX3NrbGVhcm5fbW9kZWxgLCBzZWUgdGhlIGZ1bmN0aW9uCiAgICBgc2tsZWFybl9jbGFzc2lmaWVyYCBpbiB0aGlzIHJlcG9zaXRvcnkuCgogICAgOnBhcmFtIG1vZGVsX3R5cGU6IG9uZSBvZiAiY2xhc3NpZmllciIsICJyZWdyZXNzb3IiLAogICAgICAgICAgICAgICAgICAgICAgICJyYW5rZXIiLCAicmZfY2xhc3NpZmllciIsIG9yCiAgICAgICAgICAgICAgICAgICAgICAicmZfcmVncmVzc29yIgogICAgOnBhcmFtIHhnYl9wYXJhbXM6IGNsYXNzIGluaXQgcGFyYW1ldGVycwogICAgIiIiCiAgICBtdHlwZXMgPSB7CiAgICAgICAgImNsYXNzaWZpZXIiOiAieGdib29zdC5YR0JDbGFzc2lmaWVyIiwKICAgICAgICAicmVncmVzc29yIjogInhnYm9vc3QuWEdCUmVncmVzc29yIiwKICAgICAgICAicmFua2VyIjogInhnYm9vc3QuWEdCUmFua2VyIiwKICAgICAgICAicmZfY2xhc3NpZmllciI6ICJ4Z2Jvb3N0LlhHQlJGQ2xhc3NpZmllciIsCiAgICAgICAgInJmX3JlZ3Jlc3NvciI6ICJ4Z2Jvb3N0LlhHQlJGUmVncmVzc29yIiwKICAgIH0KICAgIGlmIG1vZGVsX3R5cGUuZW5kc3dpdGgoImpzb24iKToKICAgICAgICBtb2RlbF9jb25maWcgPSBtb2RlbF90eXBlCiAgICBlbGlmIG1vZGVsX3R5cGUgaW4gbXR5cGVzLmtleXMoKToKICAgICAgICBtb2RlbF9jb25maWcgPSBtdHlwZXNbbW9kZWxfdHlwZV0KICAgIGVsc2U6CiAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJ1bnJlY29nbml6ZWQgbW9kZWwgdHlwZSwgc2VlIGhlbHAgZG9jdW1lbnRhdGlvbiIpCgogICAgcmV0dXJuIGdlbl9za2xlYXJuX21vZGVsKG1vZGVsX2NvbmZpZywgeGdiX3BhcmFtcykKCgpkZWYgdHJhaW5fbW9kZWwoCiAgICBjb250ZXh0OiBNTENsaWVudEN0eCwKICAgIG1vZGVsX3R5cGU6IHN0ciwKICAgIGRhdGFzZXQ6IFVuaW9uW0RhdGFJdGVtLCBwZC5jb3JlLmZyYW1lLkRhdGFGcmFtZV0sCiAgICBsYWJlbF9jb2x1bW46IHN0ciA9ICJsYWJlbHMiLAogICAgZW5jb2RlX2NvbHM6IGRpY3QgPSB7fSwKICAgIHNhbXBsZTogaW50ID0gLTEsCiAgICBpbWJhbF92ZWM9W10sCiAgICB0ZXN0X3NpemU6IGZsb2F0ID0gMC4yNSwKICAgIHZhbGlkX3NpemU6IGZsb2F0ID0gMC43NSwKICAgIHJhbmRvbV9zdGF0ZTogaW50ID0gMSwKICAgIG1vZGVsc19kZXN0OiBzdHIgPSAibW9kZWxzIiwKICAgIHBsb3RzX2Rlc3Q6IHN0ciA9ICJwbG90cyIsCiAgICBldmFsX21ldHJpY3M6IGxpc3QgPSBbImVycm9yIiwgImF1YyJdLAogICAgZmlsZV9leHQ6IHN0ciA9ICJwYXJxdWV0IiwKICAgIHRlc3Rfc2V0OiBzdHIgPSAidGVzdF9zZXQiLAopIC0+IE5vbmU6CiAgICAiIiJ0cmFpbiBhbiB4Z2Jvb3N0IG1vZGVsLgoKICAgIE5vdGUgb24gaW1hYmFsYW5jZWQgZGF0YTogIHRoZSBgaW1iYWxfdmVjYCBwYXJhbWV0ZXIgcmVwcmVzZW50cyB0aGUgbWVhc3VyZWQKICAgIGNsYXNzIHJlcHJlc2VudGF0aW9ucyBpbiB0aGUgc2FtcGxlIGFuZCBjYW4gYmUgdXNlZCBhcyBhIGZpcnN0IHN0ZXAgaW4gdHVuaW5nCiAgICBhbiBYR0Jvb3N0IG1vZGVsLiAgVGhpcyBpc24ndCBhIGh5cGVycGFyYW10ZXIsIG1lcmVseSBhbiBlc3RpbWF0ZSB0aGF0IHNob3VsZAogICAgYmUgc2V0IGFzICdjb25zdGFudCcgdGhyb3VnaG91dCB0dW5pbmcgcHJvY2Vzcy4KCiAgICA6cGFyYW0gY29udGV4dDogICAgICAgICAgIHRoZSBmdW5jdGlvbiBjb250ZXh0CiAgICA6cGFyYW0gbW9kZWxfdHlwZTogICAgICAgIHRoZSBtb2RlbCB0eXBlIHRvIHRyYWluLCAiY2xhc3NpZmllciIsICJyZWdyZXNzb3IiLi4uCiAgICA6cGFyYW0gZGF0YXNldDogICAgICAgICAgICgiZGF0YSIpIG5hbWUgb2YgcmF3IGRhdGEgZmlsZQogICAgOnBhcmFtIGxhYmVsX2NvbHVtbjogICAgICBncm91bmQtdHJ1dGggKHkpIGxhYmVscwogICAgOnBhcmFtIGVuY29kZV9jb2xzOiAgICAgICBkaWN0aW9uYXJ5IG9mIG5hbWVzIGFuZCBwcmVmaXhlcyBmb3IgY29sdW1ucyB0aGF0IGFyZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBob3QgYmUgZW5jb2RlZC4KICAgIDpwYXJhbSBzYW1wbGU6ICAgICAgICAgICAgU2VsZWN0cyB0aGUgZmlyc3QgbiByb3dzLCBvciBzZWxlY3QgYSBzYW1wbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRpbmcgZnJvbSB0aGUgZmlyc3QuIElmIG5lZ2F0aXZlIDwtMSwgc2VsZWN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcmFuZG9tIHNhbXBsZQogICAgOnBhcmFtIGltYmFsX3ZlYzogICAgICAgICAoW10pIHZlY3RvciBvZiBjbGFzcyB3ZWlnaHRzIHNlZW4gaW4gc2FtcGxlCiAgICA6cGFyYW0gdGVzdF9zaXplOiAgICAgICAgICgwLjA1KSB0ZXN0IHNldCBzaXplCiAgICA6cGFyYW0gdmFsaWRfc2l6ZTogICAgICAgICgwLjc1KSBPbmNlIHRoZSB0ZXN0IHNldCBoYXMgYmVlbiByZW1vdmVkIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpbmluZyBzZXQgZ2V0cyB0aGlzIHByb3BvcnRpb24uCiAgICA6cGFyYW0gcmFuZG9tX3N0YXRlOiAgICAgICgxKSBza2xlYXJuIHJuZyBzZWVkCiAgICA6cGFyYW0gbW9kZWxzX2Rlc3Q6ICAgICAgIGRlc3RpbmF0aW9uIHN1YmZvbGRlciBmb3IgbW9kZWwgYXJ0aWZhY3RzCiAgICA6cGFyYW0gcGxvdHNfZGVzdDogICAgICAgIGRlc3RpbmF0aW9uIHN1YmZvbGRlciBmb3IgcGxvdCBhcnRpZmFjdHMKICAgIDpwYXJhbSBldmFsX21ldHJpY3M6ICAgICAgKFsiZXJyb3IiLCAiYXVjIl0pIGxlYXJuaW5nIGN1cnZlIG1ldHJpY3MKICAgIDpwYXJhbSBmaWxlX2V4dDogICAgICAgICAgZm9ybWF0IGZvciB0ZXN0X3NldF9rZXkgaG9sZCBvdXQgZGF0YQogICAgOnBhcmFtIHRlc3Qtc2V0OiAgICAgICAgICAodGVzdF9zZXQpIGtleSBvZiBoZWxkIG91dCBkYXRhIGluIGFydGlmYWN0IHN0b3JlCiAgICAiIiIKICAgIG1vZGVsc19kZXN0ID0gbW9kZWxzX2Rlc3Qgb3IgIm1vZGVscyIKICAgIHBsb3RzX2Rlc3QgPSBwbG90c19kZXN0IG9yIGYicGxvdHMve2NvbnRleHQubmFtZX0iCgogICAgcmF3LCBsYWJlbHMsIGhlYWRlciA9IGdldF9zYW1wbGUoZGF0YXNldCwgc2FtcGxlLCBsYWJlbF9jb2x1bW4pCgogICAgaWYgZW5jb2RlX2NvbHM6CiAgICAgICAgcmF3ID0gcGQuZ2V0X2R1bW1pZXMoCiAgICAgICAgICAgIHJhdywKICAgICAgICAgICAgY29sdW1ucz1saXN0KGVuY29kZV9jb2xzLmtleXMoKSksCiAgICAgICAgICAgIHByZWZpeD1saXN0KGVuY29kZV9jb2xzLnZhbHVlcygpKSwKICAgICAgICAgICAgZHJvcF9maXJzdD1UcnVlLAogICAgICAgICkKCiAgICAoeHRyYWluLCB5dHJhaW4pLCAoeHZhbGlkLCB5dmFsaWQpLCAoeHRlc3QsIHl0ZXN0KSA9IGdldF9zcGxpdHMoCiAgICAgICAgcmF3LCBsYWJlbHMsIDMsIHRlc3Rfc2l6ZSwgdmFsaWRfc2l6ZSwgcmFuZG9tX3N0YXRlCiAgICApCgogICAgY29udGV4dC5sb2dfZGF0YXNldCgKICAgICAgICB0ZXN0X3NldCwgZGY9cGQuY29uY2F0KFt4dGVzdCwgeXRlc3RdLCBheGlzPTEpLCBmb3JtYXQ9ZmlsZV9leHQsIGluZGV4PUZhbHNlCiAgICApCgogICAgbW9kZWxfY29uZmlnID0gX2dlbl94Z2JfbW9kZWwobW9kZWxfdHlwZSwgY29udGV4dC5wYXJhbWV0ZXJzLml0ZW1zKCkpCgogICAgWEdCQm9vc3RDbGFzcyA9IGNyZWF0ZV9jbGFzcyhtb2RlbF9jb25maWdbIk1FVEEiXVsiY2xhc3MiXSkKICAgIG1vZGVsID0gWEdCQm9vc3RDbGFzcygqKm1vZGVsX2NvbmZpZ1siQ0xBU1MiXSkKCiAgICBtb2RlbF9jb25maWdbIkZJVCJdLnVwZGF0ZSgKICAgICAgICB7CiAgICAgICAgICAgICJYIjogeHRyYWluLAogICAgICAgICAgICAieSI6IHl0cmFpbi52YWx1ZXMsCiAgICAgICAgICAgICJldmFsX3NldCI6IFsoeHRyYWluLCB5dHJhaW4pLCAoeHZhbGlkLCB5dmFsaWQpXSwKICAgICAgICAgICAgImV2YWxfbWV0cmljIjogZXZhbF9tZXRyaWNzLAogICAgICAgIH0KICAgICkKCiAgICBtb2RlbC5maXQoKiptb2RlbF9jb25maWdbIkZJVCJdKQoKICAgIGV2YWxfbWV0cmljcyA9IGV2YWxfbW9kZWxfdjIoY29udGV4dCwgeHZhbGlkLCB5dmFsaWQsIG1vZGVsKQoKICAgIG1vZGVsX2JpbiA9IGR1bXBzKG1vZGVsKQogICAgY29udGV4dC5sb2dfbW9kZWwoCiAgICAgICAgIm1vZGVsIiwKICAgICAgICBib2R5PW1vZGVsX2JpbiwKICAgICAgICBhcnRpZmFjdF9wYXRoPW9zLnBhdGguam9pbihjb250ZXh0LmFydGlmYWN0X3BhdGgsIG1vZGVsc19kZXN0KSwKICAgICAgICBtb2RlbF9maWxlPSJtb2RlbC5wa2wiLAogICAgKQo= - commands: [] - code_origin: https://github.com/daniels290813/functions.git#55a79c32be5d233cc11efcf40cd3edbe309bfdef:/home/kali/functions/xgb_trainer/xgb_trainer.py - affinity: null -verbose: false diff --git a/xgb_trainer/item.yaml b/xgb_trainer/item.yaml deleted file mode 100644 index 5c910a0c8..000000000 --- a/xgb_trainer/item.yaml +++ /dev/null @@ -1,24 +0,0 @@ -apiVersion: v1 -categories: -- model-training -description: train multiple model types using xgboost. -doc: '' -example: xgb_trainer.ipynb -generationDate: 2022-08-28:17-25 -hidden: true -icon: '' -labels: - author: Daniel -maintainers: [] -marketplaceType: '' -mlrunVersion: 1.4.1 -name: xgb_trainer -platformVersion: 3.5.4 -spec: - filename: xgb_trainer.py - handler: train_model - image: mlrun/mlrun - kind: job - requirements: [] -url: '' -version: 1.1.1 diff --git a/xgb_trainer/requirements.txt b/xgb_trainer/requirements.txt deleted file mode 100644 index 644bcc710..000000000 --- a/xgb_trainer/requirements.txt +++ /dev/null @@ -1,8 +0,0 @@ -pandas -xgboost -cloudpickle -pygit2 -scikit-learn==1.0.2 -matplotlib -seaborn -scikit-plot diff --git a/xgb_trainer/test_xgb_trainer.py b/xgb_trainer/test_xgb_trainer.py deleted file mode 100644 index e9119e307..000000000 --- a/xgb_trainer/test_xgb_trainer.py +++ /dev/null @@ -1,50 +0,0 @@ -# Copyright 2019 Iguazio -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -import mlrun -import os - - -def get_class_data(): - fn = mlrun.import_function('../gen_class_data/function.yaml') - run = fn.run(params={'key': 'classifier-data', - 'n_samples': 10_000, - 'm_features': 5, - 'k_classes': 2, - 'header': None, - 'weight': [0.5, 0.5], - 'sk_params': {'n_informative': 2}, - 'file_ext': 'csv'}, local=True, artifact_path="./artifacts") - - return run - - -def test_local_xgb_trainer_import_function(): - # running data preparation function locally - gen_data_run = get_class_data() - - fn = mlrun.import_function('function.yaml') - run = fn.run(params={'model_type': 'classifier', - 'CLASS_tree_method': 'hist', - 'CLASS_objective': 'binary:logistic', - 'CLASS_booster': 'gbtree', - 'FIT_verbose': 0, - 'label_column': 'labels'}, - local=True, inputs={'dataset': gen_data_run.status.artifacts[0]['spec']['target_path']}) # only one dataset artifact created - - for artifact in run.status.artifacts: - if artifact['kind'] == 'model': - assert os.path.exists(artifact['spec']['target_path']) # validating model exists - return - assert False, "Model artifact is unavailable or miss-predicted" diff --git a/xgb_trainer/xgb_trainer.ipynb b/xgb_trainer/xgb_trainer.ipynb deleted file mode 100644 index 444d40400..000000000 --- a/xgb_trainer/xgb_trainer.ipynb +++ /dev/null @@ -1,1013 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# XGBoost trainer" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This notebook function handles training and logging of xgboost models **only**, exposing both the sklearn and low level api\"s.
\n", - "More information about XGBoost - [here](https://en.wikipedia.org/wiki/XGBoost)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Multiple model types that can be estimated using the XGBoost Scikit-Learn API.
\n", - "Input can either be a predefined json model configuration or one\n", - "of the five xgboost model types.
\n", - "In either case one can pass in a params dict to modify defaults values.
\n", - "Based on `mlutils.models.gen_sklearn_model`, see the function\n", - "`sklearn_classifier` in the function-marketplace repository.
\n", - "> **param model_type:**\n", - " one of \"classifier\", \"regressor\",\n", - " \"ranker\", \"rf_classifier\", or\n", - " \"rf_regressor\"
\n", - "> **param xgb_params:** class init parameters" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Steps\n", - "1. [Data Exploration](#Data-Exploration)\n", - "2. [Importing the function](#Importing-the-function)\n", - "3. [Setup XGBoost parameters](#Setup-XGBoost-parameters)\n", - "4. [Running the function locally](#Running-the-function-locally)\n", - "5. [Getting the model](#Getting-the-model)\n", - "6. [Some plotting](#Some-plotting)\n", - "7. [Running the function remotely](#Running-the-function-remotely)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Data Exploration**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To generate the dataset we used the \"gen_class_data\" function from the hub, \n", - "which wraps scikit-learn's [make_classification](https://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_classification.html#sklearn-datasets-make-classification).
\n", - "See the link for a description of all parameters." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import warnings\n", - "warnings.filterwarnings(\"ignore\")" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "# make sure proper xgboost version installed, uncomment to install\n", - "# !pip install xgboost==1.3.1" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Data set containing 10000 instances, with 2 labels.\n", - "Number of instances labeled 1 : 5008\n", - "Number of instances labeled 0 : 4992\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
feat_0feat_1feat_2feat_3feat_4labels
0-0.265115-1.9322600.303992-1.863833-1.0456351
1-3.135479-2.8355481.338381-1.385303-2.2764560
2-1.519005-1.8075490.697304-1.1188601.1049000
3-0.632087-0.3456590.244329-0.0460660.4472800
4-1.405883-1.7460450.653617-1.110985-1.6754660
\n", - "
" - ], - "text/plain": [ - " feat_0 feat_1 feat_2 feat_3 feat_4 labels\n", - "0 -0.265115 -1.932260 0.303992 -1.863833 -1.045635 1\n", - "1 -3.135479 -2.835548 1.338381 -1.385303 -2.276456 0\n", - "2 -1.519005 -1.807549 0.697304 -1.118860 1.104900 0\n", - "3 -0.632087 -0.345659 0.244329 -0.046066 0.447280 0\n", - "4 -1.405883 -1.746045 0.653617 -1.110985 -1.675466 0" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Getting the data from wasabi\n", - "import pandas as pd\n", - "\n", - "df = pd.read_csv('https://s3.wasabisys.com/iguazio/data/function-marketplace-data/xgb_trainer/classifier-data.csv')\n", - "print(f'Data set containing {df.shape[0]} instances, with {len(df[\"labels\"].unique())} labels.')\n", - "\n", - "print(f\"Number of instances labeled {df['labels'].unique()[0]} : {df.groupby('labels').count()[df.columns[0]][df['labels'].unique()[0]]}\")\n", - "print(f\"Number of instances labeled {df['labels'].unique()[1]} : {df.groupby('labels').count()[df.columns[0]][df['labels'].unique()[1]]}\")\n", - "\n", - "df.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Importing the function**" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2021-10-13 10:10:21,588 [info] loaded project function-marketplace from MLRun DB\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import mlrun\n", - "mlrun.set_environment(project='function-marketplace')\n", - "# If GPU is available - set to True\n", - "GPU = False\n", - "\n", - "\n", - "fn = mlrun.import_function(\"hub://xgb_trainer\")\n", - "fn.image = \"mlrun/ml-models\" if not GPU else \"mlrun/ml-models-gpu\"\n", - "fn.apply(mlrun.auto_mount())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Setup XGBoost parameters**" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "task_params = {\"model_type\": \"classifier\",\n", - " \"CLASS_tree_method\": \"hist\",\n", - " \"CLASS_objective\": \"binary:logistic\",\n", - " \"CLASS_booster\": \"gbtree\",\n", - " \"FIT_verbose\": 0,\n", - " \"label_column\": \"labels\"}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Running the function locally**" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2021-10-13 10:10:21,807 [info] starting run xgb-trainer-train_model uid=5ec8a83eb65b46dc9b7f9dd654cd1b31 DB=http://mlrun-api:8080\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
projectuiditerstartstatenamelabelsinputsparametersresultsartifacts
function-marketplace0Oct 13 10:10:22completedxgb-trainer-train_model
v3io_user=dani
kind=
owner=dani
host=jupyter-dani-5bbd9959b7-tsgh8
dataset
model_type=classifier
CLASS_tree_method=hist
CLASS_objective=binary:logistic
CLASS_booster=gbtree
FIT_verbose=0
label_column=labels
accuracy=0.9552
test-error=0.0448
rocauc=0.9799618829687036
brier_score=0.038984999293145965
f1-score=0.954983922829582
precision_score=0.965679190751445
recall_score=0.9445229681978798
test_set
probability-calibration
confusion-matrix
feature-importances
precision-recall-binary
roc-binary
model
\n", - "
\n", - "
\n", - "
\n", - " Title\n", - " ×\n", - "
\n", - " \n", - "
\n", - "
\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - }, - { - "data": { - "text/html": [ - " > to track results use the .show() or .logs() methods or click here to open in UI" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2021-10-13 10:10:24,178 [info] run executed, status=completed\n" - ] - }, - { - "data": { - "image/png": "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e+65Jz1DNsYYj8p2LYLkxD9H+caFJvXq1aNFixa2KpgxJsvKdi0CV4wcOZIXX3wRgPvvv5+5c+dSvHhxL0dlzO0rWbIkInLLzdWpJLzldqd5jm/58uWMHz8egDNnztCgQQNq165NYGAgTzzxBBcvXnRLPZmJtQgSERUVRVRUFDExMXZGkMlSkuoaTerxrKh169a0bt0agB9//JGqVavGTUbXqFGjVJWVVb4jrEUQz41L2ceNG8dXX32VJT5gk70MHDiQJk2aJHlLTlL7DBw4MNn9jhw5QtWqVenduzc1atSgS5curFu3jocffphKlSqxdetWYmNjqVSpUtxaurGxsVSsWPGWo/zEpppOqG3bttSpUwdfX1+mT58OOL6QX3jhBWrUqEHNmjXjruydPHky1atXx8/PL26511mzZvHyyy+za9cuBg8ezMqVK6lVqxZXr169qeXx9ddfU79+fWrVqsW//vWvuCuBCxYsyKhRo2jQoAGbNm1K4RPJHLJdiyCpqZ5z5MjBhg0bqFWrlk0LYUwqHTp0iG+//TZuapVvvvmGX375heXLl/Pee++xdOlSunbtSkBAAAMHDmTdunX4+/tTrFixm8pJbKrphGbMmMFdd93F1atXqVevHh06dODIkSOcOHGCffv2AcR174wfP56///6bPHny3NLlU6tWrVumf74hKCiIBQsWsHHjRnLlysVLL71EQEAA3bt3JyIigho1ajBmzBi3vX/elu0SwY2pns+dO8eMGTN44403EBHCw8MpVKiQl6Mz5vbcmGAtKckd5Lgyw2ZSKlSoQM2aNQHH5G6PP/44IkLNmjU5cuQIAD179qRNmzYMHDiQGTNmJDr/jytTTU+ePDludt/jx4/z559/UqVKFf766y9eeeUVnnzySZo3bw4QNwdR27Ztadu2rcuv58cff2THjh3Uq1cPcEyzfWOc0MfHhw4dOrhcVmbg0a4hEWkpIn+IyCERGZrI8yIik53P7xER96yy4ILFixczfPjwuO4gSwLGpF2ePHnifs+RI0fc/Rw5csQt0ViuXDlKlCjBf//7X7Zs2UKrVq1uKSelqabXr1/PunXr2LRpE7t376Z27dpERkZy5513snv3bpo0acKnn35K7969AVixYgX9+/dnx44d1KlTJ9nlIhPG8fzzz7Nr1y527drFH3/8wejRowHHNUdZrdvYY4lA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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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VcYY//JPInBfK/q4m5OTw2233cbAgQNRVY444gheeOEFDjvssIoNxBhjSuGbRLBPxWWCJUuW0KVLF+69915SU1OtSJwxplLyTSLQChyjcs+ePVx33XWccMIJ7N27l4ULFzJz5kwrEmeMqZT8kwjc14poGsrLy+PVV19l5MiRfPfdd5x++uneb9QYY8rINw+U4XFn8Y4dO5g0aRK33347derUYdWqVdSsWdOjrRljTPnx0RVB4cA05Z8KXnvtNdLS0pgwYUJRkThLAsaYaOGbRFCoPNPA5s2bGTBgAAMHDqRx48YsX77cisQZY6KOb5qGvOgrvvjii1m2bBn3338///jHP4iL882v0xhThfjmyLWv1tChrWfdunXUqVOH1NRUJk+eTFJSEm3btj30AI0xZZKfn8/GjRvJycmJdCiVQmJiIk2bNj2o6sX+SQTua1kHpiksEnfrrbcyZMgQHnvsMY4++ujyC9AYUyYbN24kNTWVli1b+v5JfVVl+/btbNy4kVatWoX9Pf/1EZTh7+T777+nT58+XHfddfTu3Zsbbrih/AMzxpRJTk4OdevW9X0SAOdmmLp16x701ZFvEkFZHyibNWsWnTt3ZtWqVTz77LPMnz+fFi1alHN0xphDYUlgn7L8LvyTCA5y+WAwCED37t256KKLSE9P57LLLrM/OGNMleOfRBBmZ3F2djZjxoxhwIABRUXinnvuORo2bOh9kMaYKqlv374sX758v8u0bNmSbdu2hb3OmTNnMmrUqEMNDfBRIii0v87ijz/+mKOPPpoHHniAunXrkp+fX4GRGWNMZPjmrqH9NQ5lZmYyZswYpk6dSqtWrXj33Xc55ZRTKjA2Y0x5GP/mStI3ZZTrOtMa1+DOczuU+nn//v3ZsGEDOTk5XH/99QwdOnS/67vmmmtYtmwZ2dnZDBw4kPHjxxd99tBDD/H+++8D8MILL3DkkUeydetWhg8fzvr16wF47LHHOP7448thz/bxTSLYX9NQfn4+r7/+OqNHj2bChAmkpKRUbHDGmKj1zDPPUKdOHbKzs+nevTsDBgygbt26pS5/zz33UKdOHQKBAP369WPFihV06tQJgBo1avDFF1/w7LPPMnr0aObNm8f111/PDTfcwAknnMD69es5/fTTWbVqVbnug38SgftamAi2b9/O448/ztixY6lTpw7ff/89qampEYvP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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "train_run = fn.run(params = task_params, \n", - " inputs={\"dataset\" : 'https://s3.wasabisys.com/iguazio/data/function-marketplace-data/xgb_trainer/classifier-data.csv'},\n", - " local=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Getting the model**" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "from mlrun.artifacts import get_model\n", - "import pickle\n", - "\n", - "model_file, model_obj, _ = get_model(train_run.artifact('model'))\n", - "model = pickle.load(open(model_file,'rb'))" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "model score : 0.9632\n" - ] - } - ], - "source": [ - "print(f\"model score : {model.score(train_run.artifact('test_set').as_df().drop(['labels'],axis=1),train_run.artifact('test_set').as_df()['labels'])}\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Some plotting**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Display the probability calibration" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "

probability calibration plot

\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "train_run.artifact('probability-calibration').show()" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "

Feature Importances

\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "train_run.artifact('feature-importances').show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### **Running the function remotely**" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2021-10-13 10:10:24,882 [info] Started building image: .mlrun/func-function-marketplace-xgb-trainer:latest\n", - "\u001b[36mINFO\u001b[0m[0000] Retrieving image manifest mlrun/mlrun:0.7.1 \n", - "\u001b[36mINFO\u001b[0m[0000] Retrieving image manifest mlrun/mlrun:0.7.1 \n", - "\u001b[36mINFO\u001b[0m[0000] Built cross stage deps: map[] \n", - "\u001b[36mINFO\u001b[0m[0000] Retrieving image manifest mlrun/mlrun:0.7.1 \n", - "\u001b[36mINFO\u001b[0m[0001] Retrieving image manifest mlrun/mlrun:0.7.1 \n", - "\u001b[36mINFO\u001b[0m[0002] Executing 0 build triggers \n", - "\u001b[36mINFO\u001b[0m[0002] Unpacking rootfs as cmd RUN pip install xgboost==1.3.1 requires it. \n", - "\u001b[36mINFO\u001b[0m[0024] RUN pip install xgboost==1.3.1 \n", - "\u001b[36mINFO\u001b[0m[0024] Taking snapshot of full filesystem... \n", - "\u001b[36mINFO\u001b[0m[0035] cmd: /bin/sh \n", - "\u001b[36mINFO\u001b[0m[0035] args: [-c pip install xgboost==1.3.1] \n", - "\u001b[36mINFO\u001b[0m[0035] Running: [/bin/sh -c pip install xgboost==1.3.1] \n", - "Collecting xgboost==1.3.1\n", - " Downloading xgboost-1.3.1-py3-none-manylinux2010_x86_64.whl (157.5 MB)\n", - "Requirement already satisfied: scipy in /usr/local/lib/python3.7/site-packages (from xgboost==1.3.1) (1.7.1)\n", - "Requirement already satisfied: numpy in /usr/local/lib/python3.7/site-packages (from xgboost==1.3.1) (1.19.5)\n", - "Installing collected packages: xgboost\n", - "Successfully installed xgboost-1.3.1\n", - "WARNING: You are using pip version 20.2.4; however, version 21.3 is available.\n", - "You should consider upgrading via the '/usr/local/bin/python -m pip install --upgrade pip' command.\n", - "\u001b[36mINFO\u001b[0m[0042] Taking snapshot of full filesystem... \n" - ] - }, - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "fn.spec.build.commands=['pip install xgboost==1.3.1']\n", - "fn.deploy(with_mlrun=False)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2021-10-13 10:11:39,577 [info] starting run xgb-trainer-train_model uid=7332ff5d727948c89221d4645b84d028 DB=http://mlrun-api:8080\n", - "> 2021-10-13 10:11:39,764 [info] Job is running in the background, pod: xgb-trainer-train-model-4scfq\n", - "> 2021-10-13 10:11:55,207 [info] run executed, status=completed\n", - "The use of label encoder in XGBClassifier is deprecated and will be removed in a future release. To remove this warning, do the following: 1) Pass option use_label_encoder=False when constructing XGBClassifier object; and 2) Encode your labels (y) as integers starting with 0, i.e. 0, 1, 2, ..., [num_class - 1].\n", - "final state: completed\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
projectuiditerstartstatenamelabelsinputsparametersresultsartifacts
function-marketplace0Oct 13 10:11:51completedxgb-trainer-train_model
v3io_user=dani
kind=job
owner=dani
host=xgb-trainer-train-model-4scfq
dataset
model_type=classifier
CLASS_tree_method=hist
CLASS_objective=binary:logistic
CLASS_booster=gbtree
FIT_verbose=0
label_column=labels
accuracy=0.9552
test-error=0.0448
rocauc=0.9799618829687036
brier_score=0.038984999293145965
f1-score=0.954983922829582
precision_score=0.965679190751445
recall_score=0.9445229681978798
test_set
probability-calibration
confusion-matrix
feature-importances
precision-recall-binary
roc-binary
model
\n", - "
\n", - "
\n", - "
\n", - " Title\n", - " ×\n", - "
\n", - " \n", - "
\n", - "
\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - }, - { - "data": { - "text/html": [ - " > to track results use the .show() or .logs() methods or click here to open in UI" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2021-10-13 10:11:58,969 [info] run executed, status=completed\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "fn.run(inputs={\"dataset\" : 'https://s3.wasabisys.com/iguazio/data/function-marketplace-data/xgb_trainer/classifier-data.csv'},\n", - " params=task_params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "[Back to the top](#XGBoost-trainer)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/xgb_trainer/xgb_trainer.py b/xgb_trainer/xgb_trainer.py deleted file mode 100644 index 4754aae26..000000000 --- a/xgb_trainer/xgb_trainer.py +++ /dev/null @@ -1,160 +0,0 @@ -# Copyright 2019 Iguazio -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Generated by nuclio.export.NuclioExporter - -import warnings - -warnings.simplefilter(action="ignore", category=FutureWarning) - -from mlrun.mlutils.data import get_sample, get_splits -from mlrun.mlutils.models import gen_sklearn_model, eval_model_v2 -from mlrun.utils.helpers import create_class - -from mlrun.execution import MLClientCtx -from mlrun.datastore import DataItem - -from cloudpickle import dumps -import pandas as pd -import os -from typing import Union - - -def _gen_xgb_model(model_type: str, xgb_params: dict): - """generate an xgboost model - - Multiple model types that can be estimated using - the XGBoost Scikit-Learn API. - - Input can either be a predefined json model configuration or one - of the five xgboost model types: "classifier", "regressor", "ranker", - "rf_classifier", or "rf_regressor". - - In either case one can pass in a params dict to modify defaults values. - - Based on `mlutils.models.gen_sklearn_model`, see the function - `sklearn_classifier` in this repository. - - :param model_type: one of "classifier", "regressor", - "ranker", "rf_classifier", or - "rf_regressor" - :param xgb_params: class init parameters - """ - mtypes = { - "classifier": "xgboost.XGBClassifier", - "regressor": "xgboost.XGBRegressor", - "ranker": "xgboost.XGBRanker", - "rf_classifier": "xgboost.XGBRFClassifier", - "rf_regressor": "xgboost.XGBRFRegressor", - } - if model_type.endswith("json"): - model_config = model_type - elif model_type in mtypes.keys(): - model_config = mtypes[model_type] - else: - raise Exception("unrecognized model type, see help documentation") - - return gen_sklearn_model(model_config, xgb_params) - - -def train_model( - context: MLClientCtx, - model_type: str, - dataset: Union[DataItem, pd.core.frame.DataFrame], - label_column: str = "labels", - encode_cols: dict = {}, - sample: int = -1, - imbal_vec=[], - test_size: float = 0.25, - valid_size: float = 0.75, - random_state: int = 1, - models_dest: str = "models", - plots_dest: str = "plots", - eval_metrics: list = ["error", "auc"], - file_ext: str = "parquet", - test_set: str = "test_set", -) -> None: - """train an xgboost model. - - Note on imabalanced data: the `imbal_vec` parameter represents the measured - class representations in the sample and can be used as a first step in tuning - an XGBoost model. This isn't a hyperparamter, merely an estimate that should - be set as 'constant' throughout tuning process. - - :param context: the function context - :param model_type: the model type to train, "classifier", "regressor"... - :param dataset: ("data") name of raw data file - :param label_column: ground-truth (y) labels - :param encode_cols: dictionary of names and prefixes for columns that are - to hot be encoded. - :param sample: Selects the first n rows, or select a sample - starting from the first. If negative <-1, select - a random sample - :param imbal_vec: ([]) vector of class weights seen in sample - :param test_size: (0.05) test set size - :param valid_size: (0.75) Once the test set has been removed the - training set gets this proportion. - :param random_state: (1) sklearn rng seed - :param models_dest: destination subfolder for model artifacts - :param plots_dest: destination subfolder for plot artifacts - :param eval_metrics: (["error", "auc"]) learning curve metrics - :param file_ext: format for test_set_key hold out data - :param test-set: (test_set) key of held out data in artifact store - """ - models_dest = models_dest or "models" - plots_dest = plots_dest or f"plots/{context.name}" - - raw, labels, header = get_sample(dataset, sample, label_column) - - if encode_cols: - raw = pd.get_dummies( - raw, - columns=list(encode_cols.keys()), - prefix=list(encode_cols.values()), - drop_first=True, - ) - - (xtrain, ytrain), (xvalid, yvalid), (xtest, ytest) = get_splits( - raw, labels, 3, test_size, valid_size, random_state - ) - - context.log_dataset( - test_set, df=pd.concat([xtest, ytest], axis=1), format=file_ext, index=False - ) - - model_config = _gen_xgb_model(model_type, context.parameters.items()) - - XGBBoostClass = create_class(model_config["META"]["class"]) - model = XGBBoostClass(**model_config["CLASS"]) - - model_config["FIT"].update( - { - "X": xtrain, - "y": ytrain.values, - "eval_set": [(xtrain, ytrain), (xvalid, yvalid)], - "eval_metric": eval_metrics, - } - ) - - model.fit(**model_config["FIT"]) - - eval_metrics = eval_model_v2(context, xvalid, yvalid, model) - - model_bin = dumps(model) - context.log_model( - "model", - body=model_bin, - artifact_path=os.path.join(context.artifact_path, models_dest), - model_file="model.pkl", - ) From 6dd4dedcc601826684499e366cb45bcc6bbd9697 Mon Sep 17 00:00:00 2001 From: Eyal Danieli Date: Tue, 8 Oct 2024 15:26:40 +0300 Subject: [PATCH 24/38] [Batch Infer V2] Adjust function to 1.7 (#832) * adjust batch infer v2 * update docs in NB --- batch_inference_v2/batch_inference_v2.ipynb | 1826 +++++++++-------- batch_inference_v2/batch_inference_v2.py | 37 +- batch_inference_v2/function.yaml | 106 +- batch_inference_v2/item.yaml | 6 +- batch_inference_v2/test_batch_inference_v2.py | 71 +- 5 files changed, 1108 insertions(+), 938 deletions(-) diff --git a/batch_inference_v2/batch_inference_v2.ipynb b/batch_inference_v2/batch_inference_v2.ipynb index bb59221fd..7f369fa51 100644 --- a/batch_inference_v2/batch_inference_v2.ipynb +++ b/batch_inference_v2/batch_inference_v2.ipynb @@ -10,14 +10,14 @@ "source": [ "# Batch Inference V2\n", "\n", - "A function for inferring given input through a given model while producing a **Result Set** and performing **Data Drift Analysis**.\n", + "A function for inferring given input through a given model while producing a **Result Set** and applying monitoring analysis.\n", "\n", "In this notebook we will go over the function's docs and outputs and see an end-to-end example of running it.\n", "\n", "1. [Documentation](#chapter1)\n", "2. [Results Prediction](#chapter2)\n", - "3. [Data Drift Analysis](#chapter3)\n", - "4. [End-to-end Demo](#chapter4)" + "3. [End-to-end Demo](#chapter3)\n", + "4. [Data Drift Analysis](#chapter4)" ] }, { @@ -31,9 +31,9 @@ "\n", "## 1. Documentation\n", "\n", - "Perform a prediction on a given dataset with the given model. Can perform drift analysis between the sample set\n", - "statistics stored in the model to the current input data. The drift rule is the value per-feature mean of the TVD\n", - "and Hellinger scores according to the thresholds configures here. When performing drift analysis, this function\n", + "Perform a prediction on a given dataset with the given model. Using the default histogram data drift application, can perform drift analysis between the sample set\n", + "statistics stored in the model to the current input data. The drift rule in this case is the value per-feature mean of the TVD\n", + "and Hellinger scores. When §, this function\n", "either creates or update an existing model endpoint record (depends on the provided `endpoint_id`).\n", "\n", "At the moment, this function is supported for `mlrun>=1.5.0` versions." @@ -104,19 +104,7 @@ " dataset given. By default, None, which means it will perform drift analysis if the\n", " model already has feature stats that are considered as a reference sample set.\n", " Performing drift analysis on a new endpoint id will generate a new model endpoint\n", - " record. Please note that in order to trigger the drift analysis job, you need to\n", - " set `trigger_monitoring_job=True`. Otherwise, the drift analysis will be triggered\n", - " only as part the scheduled monitoring job (if exist in the current project) or\n", - " if triggered manually by the user.\n", - " \n", - "* **trigger_monitoring_job**: `bool` = `False`\n", - "\n", - " Whether to trigger the batch drift analysis after the infer job.\n", - "\n", - "* **batch_image_job**: `str` = `mlrun/mlrun`\n", - "\n", - " The image that will be used for the monitoring batch job analysis. By default,\n", - " the image is mlrun/mlrun\n", + " record.\n", "\n", "* **endpoint_id**: `str` = `\"\"`\n", " \n", @@ -130,13 +118,6 @@ " \n", " If a new model endpoint is generated, the model name will be presented under this endpoint.\n", "\n", - "* **model_endpoint_drift_threshold**: `float` = `0.7`\n", - " \n", - " The threshold of which to mark drifts. Defaulted to 0.7.\n", - "\n", - "* **model_endpoint_possible_drift_threshold**: `float` = `0.5`\n", - " \n", - " The threshold of which to mark possible drifts. Defaulted to 0.5.\n", " \n", "* **model_endpoint_sample_set**: `Union[mlrun.DataItem, list, dict, pd.DataFrame, pd.Series, np.ndarray]` = `None`\n", " \n", @@ -155,15 +136,13 @@ "### 1.2. Outputs\n", "\n", "The outputs are split to two actions the functions can perform:\n", - "* [**Results Prediction**](#chapter2) - Will log:\n", + "* [**Results Prediction**](#chapter3) - Will log:\n", " * A dataset artifact named by the `result_set_name` parameter.\n", " * A `str` result named `\"batch_id\"` of the given / generated batch ID.\n", "\n", - "* [**Data Drift Analysis**](#chapter3) - Will log:\n", + "* [**Data Drift Analysis**](#chapter4) - Will log:\n", " * A `plotly` artifact named `\"data_drift_table\"` with a visualization of the drifts results and histograms.\n", " * A json artifact named `\"features_drift_results\"` with all the features metric values.\n", - " * A `bool` result named `\"drift_status\"` of the overall drift status (`True` if there was a drift and `False` otherwise).\n", - " * A `float` result named `\"drift_score\"` of the overall drift metric score.\n", "\n", "For more details, see the next chapters." ] @@ -225,62 +204,7 @@ }, "source": [ "\n", - "## 3. Data Drift Analysis\n", - "\n", - "The data drift analysis is done per feature using two distance measure metrics for probability distributions.\n", - "\n", - "Let us mark our sample set as $S$ and our inputs as $I$. We will look at one feature $x$ out of $n$ features. Assuming the histograms of feature $x$ is split into 20 bins: $b_1,b_2,...,b_{20}$, we will match the feature $x$ histogram of the inputs $I$ ($x_I$) into the same bins (meaning to $x_S$) and compare their distributions using:\n", - "\n", - "* Total Variance Distance: $TVD(x_S,x_I) = \\frac{1}{2}\\sum_{b_1}^{b_{20}} {|x_S - x_I|}$\n", - "* Hellinger Distance: $H(x_S,x_I) = \\sqrt{1-{\\sum_{b_1}^{b_{20}}\\sqrt{x_S \\cdot x_I}}}$\n", - "\n", - "Our **rule** then is calculating for each $x\\in S: \\frac{H(x_S,x_I)+TVD(x_S,x_I)}{2} < $ given thresholds.\n", - "\n", - "The outputs of the analysis will be:\n", - "* **Drift table plot** - The results are presented in a `plotly` table artifact named `\"drift_table_plot\"` that shows each feature's statistics and its TVD, Hellinger and KLD (Kullback–Leibler divergence) results as follows:\n", - "\n", - "| | Count | | Mean | | Std | | Min | | Max | | Tvd | Hellinger | Kld | Histograms |\n", - "| ------ | ---------- | ---------- | ---------- | ---------- | ---------- | ---------- | ---------- | ---------- | ---------- | ---------- | --- | --------- | --- |------------|\n", - "| | **Sample** | **Input** | **Sample** | **Input** | **Sample** | **Input** | **Sample** | **Input** | **Sample** | **Input** | | | | |\n", - "| **x1** | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |\n", - "| **x2** | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |\n", - "| **x3** | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |\n", - "\n", - "* **Features drift results** - A rule metric per feature dictionary is saved in a json file named `\"features_drift_results\"` where each key is a feature and its value is the feature's metric value: `Dict[str, float]`\n", - "\n", - " ```python\n", - " {\n", - " \"x1\": 0.12,\n", - " \"x2\": 0.345,\n", - " \"x3\": 0.00678,\n", - " ...\n", - " }\n", - " ```\n", - "\n", - "* In addition, two results are being added to summarize the drift analysis:\n", - "\n", - " * `drift_status`: `bool` - A boolean value indicating whether a drift was found.\n", - " * `drift_metric`: `float` - The mean of all the features drift metric value (the rule above):\n", - " for $n$ features and metric rule $M(x_S,x_I)=\\frac{H(x_S,x_I)+TVD(x_S,x_I)}{2}$, `drift_metric` $=\\frac{1}{n}\\sum_{x\\in S}M(x_S,x_I)$\n", - "\n", - " ```python\n", - " {\n", - " \"drift_status\": True,\n", - " \"drift_metric\": 0.81234\n", - " }\n", - " ```" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": { - "name": "#%% md\n" - } - }, - "source": [ - "\n", - "## 4. End-to-end Demo\n", + "## 3. End-to-end Demo\n", "\n", "We will see an end-to-end example that follows the steps below:\n", "1. Generate data.\n", @@ -296,7 +220,7 @@ } }, "source": [ - "### 4.1. Code review\n", + "### 3.1. Code review\n", "\n", "We are using a very simple example of training a decision tree on a binary classification problem. For that we wrote two functions:\n", "* `generate_data` - Generate a binary classification data. The data will be split into a *training set* and *data for prediction*. The data for prediction will be drifted in half of its features to showcase the plot later on.\n", @@ -312,10 +236,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "> 2023-08-29 11:13:44,649 [warning] Failed resolving version info. Ignoring and using defaults\n", - "> 2023-08-29 11:13:46,598 [warning] Server or client version is unstable. Assuming compatible: {'server_version': '0.0.0+image-test', 'client_version': '0.0.0+unstable'}\n", - "> 2023-08-29 11:13:46,667 [info] Loading project from path: {'project_name': 'batch-infer-demo', 'path': './'}\n", - "> 2023-08-29 11:14:02,192 [info] Project loaded successfully: {'project_name': 'batch-infer-demo', 'path': './', 'stored_in_db': True}\n" + "> 2024-10-08 10:23:13,060 [info] Loading project from path: {\"path\":\"./\",\"project_name\":\"batch-infer-demo\",\"user_project\":false}\n", + "> 2024-10-08 10:23:28,490 [info] Project loaded successfully: {\"path\":\"./\",\"project_name\":\"batch-infer-demo\",\"stored_in_db\":true}\n" ] } ], @@ -332,6 +254,9 @@ "execution_count": 2, "metadata": { "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, "pycharm": { "name": "#%%\n" } @@ -346,6 +271,9 @@ "execution_count": 3, "metadata": { "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, "pycharm": { "name": "#%%\n" } @@ -367,6 +295,9 @@ "execution_count": 4, "metadata": { "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, "pycharm": { "name": "#%%\n" } @@ -429,6 +360,9 @@ "execution_count": 5, "metadata": { "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, "pycharm": { "name": "#%%\n" } @@ -446,7 +380,7 @@ } }, "source": [ - "### 4.2. Run the Example with MLRun\n", + "### 3.2. Run the Example with MLRun\n", "\n", "First, we will prepare our MLRun functions:\n", "1. We will use `mlrun.code_to_function` to turn this demo notebook into an MLRun function we can run.\n", @@ -458,19 +392,14 @@ "execution_count": 6, "metadata": { "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, "pycharm": { "name": "#%%\n" } }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2023-08-29 11:14:04,182 [warning] Failed to add git metadata, ignore if path is not part of a git repo.: {'path': './', 'error': '/User/EYAL'}\n" - ] - } - ], + "outputs": [], "source": [ "# Create an MLRun function to run the notebook:\n", "demo_function = mlrun.code_to_function(name=\"batch-inference-demo\", kind=\"job\")\n", @@ -494,9 +423,12 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "metadata": { "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, "pycharm": { "name": "#%%\n" } @@ -506,8 +438,12 @@ "name": "stdout", "output_type": "stream", "text": [ - "> 2023-08-29 11:14:42,198 [warning] artifact/output path is not defined or is local and relative, artifacts will not be visible in the UI: {'output_path': './'}\n", - "> 2023-08-29 11:14:42,198 [info] Storing function: {'name': 'batch-inference-demo-generate-data', 'uid': 'd04e9f978132472695774f01b2becb6c', 'db': None}\n" + "> 2024-10-08 10:23:40,584 [error] error getting build status: details: MLRunNotFoundError('Function tag not found batch-infer-demo/batch-inference-demo'), caused by: 404 Client Error: Not Found for url: http://mlrun-api:8080/api/v1/build/status?name=batch-inference-demo&project=batch-infer-demo&tag=&logs=no&offset=0&last_log_timestamp=0.0&verbose=no\n", + "> 2024-10-08 10:23:40,586 [info] Storing function: {\"db\":\"http://mlrun-api:8080\",\"name\":\"batch-inference-demo-generate-data\",\"uid\":\"4f68ba3fd9084e3e941ab3872ceb3635\"}\n", + "> 2024-10-08 10:23:40,881 [info] Job is running in the background, pod: batch-inference-demo-generate-data-52w8s\n", + "> 2024-10-08 10:23:46,954 [info] To track results use the CLI: {\"info_cmd\":\"mlrun get run 4f68ba3fd9084e3e941ab3872ceb3635 -p batch-infer-demo\",\"logs_cmd\":\"mlrun logs 4f68ba3fd9084e3e941ab3872ceb3635 -p batch-infer-demo\"}\n", + "> 2024-10-08 10:23:46,954 [info] Or click for UI: {\"ui_url\":\"https://dashboard.default-tenant.app.vmdev57.lab.iguazeng.com/mlprojects/batch-infer-demo/jobs/monitor/4f68ba3fd9084e3e941ab3872ceb3635/overview\"}\n", + "> 2024-10-08 10:23:46,955 [info] Run execution finished: {\"name\":\"batch-inference-demo-generate-data\",\"status\":\"completed\"}\n" ] }, { @@ -602,9 +538,14 @@ "}\n", "function expandPanel(el) {\n", " const panelName = \"#\" + el.getAttribute('paneName');\n", - " console.log(el.title);\n", "\n", - " document.querySelector(panelName + \"-title\").innerHTML = el.title\n", + " // Get the base URL of the current notebook\n", + " var baseUrl = window.location.origin;\n", + "\n", + " // Construct the full URL\n", + " var fullUrl = new URL(el.title, baseUrl).href;\n", + "\n", + " document.querySelector(panelName + \"-title\").innerHTML = fullUrl\n", " iframe = document.querySelector(panelName + \"-body\");\n", "\n", " const tblcss = `\n", "
\n", + "/*! For license information please see plotly.min.js.LICENSE.txt */\n", + "!function(t,e){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define([],e):\"object\"==typeof exports?exports.Plotly=e():t.Plotly=e()}(self,(function(){return function(){var t={6713:function(t,e,r){\"use strict\";var n=r(34809),i={\"X,X div\":'direction:ltr;font-family:\"Open Sans\",verdana,arial,sans-serif;margin:0;padding:0;',\"X input,X button\":'font-family:\"Open Sans\",verdana,arial,sans-serif;',\"X input:focus,X button:focus\":\"outline:none;\",\"X a\":\"text-decoration:none;\",\"X a:hover\":\"text-decoration:none;\",\"X .crisp\":\"shape-rendering:crispEdges;\",\"X .user-select-none\":\"-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;\",\"X svg\":\"overflow:hidden;\",\"X svg a\":\"fill:#447adb;\",\"X svg a:hover\":\"fill:#3c6dc5;\",\"X .main-svg\":\"position:absolute;top:0;left:0;pointer-events:none;\",\"X .main-svg .draglayer\":\"pointer-events:all;\",\"X .cursor-default\":\"cursor:default;\",\"X .cursor-pointer\":\"cursor:pointer;\",\"X .cursor-crosshair\":\"cursor:crosshair;\",\"X .cursor-move\":\"cursor:move;\",\"X .cursor-col-resize\":\"cursor:col-resize;\",\"X .cursor-row-resize\":\"cursor:row-resize;\",\"X .cursor-ns-resize\":\"cursor:ns-resize;\",\"X .cursor-ew-resize\":\"cursor:ew-resize;\",\"X .cursor-sw-resize\":\"cursor:sw-resize;\",\"X .cursor-s-resize\":\"cursor:s-resize;\",\"X .cursor-se-resize\":\"cursor:se-resize;\",\"X .cursor-w-resize\":\"cursor:w-resize;\",\"X .cursor-e-resize\":\"cursor:e-resize;\",\"X .cursor-nw-resize\":\"cursor:nw-resize;\",\"X .cursor-n-resize\":\"cursor:n-resize;\",\"X .cursor-ne-resize\":\"cursor:ne-resize;\",\"X .cursor-grab\":\"cursor:-webkit-grab;cursor:grab;\",\"X .modebar\":\"position:absolute;top:2px;right:2px;\",\"X .ease-bg\":\"-webkit-transition:background-color .3s ease 0s;-moz-transition:background-color .3s ease 0s;-ms-transition:background-color .3s ease 0s;-o-transition:background-color .3s ease 0s;transition:background-color .3s ease 0s;\",\"X .modebar--hover>:not(.watermark)\":\"opacity:0;-webkit-transition:opacity .3s ease 0s;-moz-transition:opacity .3s ease 0s;-ms-transition:opacity .3s ease 0s;-o-transition:opacity .3s ease 0s;transition:opacity .3s ease 0s;\",\"X:hover .modebar--hover .modebar-group\":\"opacity:1;\",\"X .modebar-group\":\"float:left;display:inline-block;box-sizing:border-box;padding-left:8px;position:relative;vertical-align:middle;white-space:nowrap;\",\"X .modebar-btn\":\"position:relative;font-size:16px;padding:3px 4px;height:22px;cursor:pointer;line-height:normal;box-sizing:border-box;\",\"X .modebar-btn svg\":\"position:relative;top:2px;\",\"X .modebar.vertical\":\"display:flex;flex-direction:column;flex-wrap:wrap;align-content:flex-end;max-height:100%;\",\"X .modebar.vertical svg\":\"top:-1px;\",\"X .modebar.vertical .modebar-group\":\"display:block;float:none;padding-left:0px;padding-bottom:8px;\",\"X .modebar.vertical .modebar-group .modebar-btn\":\"display:block;text-align:center;\",\"X [data-title]:before,X [data-title]:after\":\"position:absolute;-webkit-transform:translate3d(0, 0, 0);-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-o-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);display:none;opacity:0;z-index:1001;pointer-events:none;top:110%;right:50%;\",\"X [data-title]:hover:before,X [data-title]:hover:after\":\"display:block;opacity:1;\",\"X [data-title]:before\":'content:\"\";position:absolute;background:rgba(0,0,0,0);border:6px solid rgba(0,0,0,0);z-index:1002;margin-top:-12px;border-bottom-color:#69738a;margin-right:-6px;',\"X [data-title]:after\":\"content:attr(data-title);background:#69738a;color:#fff;padding:8px 10px;font-size:12px;line-height:12px;white-space:nowrap;margin-right:-18px;border-radius:2px;\",\"X .vertical [data-title]:before,X .vertical [data-title]:after\":\"top:0%;right:200%;\",\"X .vertical [data-title]:before\":\"border:6px solid rgba(0,0,0,0);border-left-color:#69738a;margin-top:8px;margin-right:-30px;\",Y:'font-family:\"Open Sans\",verdana,arial,sans-serif;position:fixed;top:50px;right:20px;z-index:10000;font-size:10pt;max-width:180px;',\"Y p\":\"margin:0;\",\"Y .notifier-note\":\"min-width:180px;max-width:250px;border:1px solid #fff;z-index:3000;margin:0;background-color:#8c97af;background-color:rgba(140,151,175,.9);color:#fff;padding:10px;overflow-wrap:break-word;word-wrap:break-word;-ms-hyphens:auto;-webkit-hyphens:auto;hyphens:auto;\",\"Y .notifier-close\":\"color:#fff;opacity:.8;float:right;padding:0 5px;background:none;border:none;font-size:20px;font-weight:bold;line-height:20px;\",\"Y .notifier-close:hover\":\"color:#444;text-decoration:none;cursor:pointer;\"};for(var a in i){var o=a.replace(/^,/,\" ,\").replace(/X/g,\".js-plotly-plot .plotly\").replace(/Y/g,\".plotly-notifier\");n.addStyleRule(o,i[a])}},14187:function(t,e,r){\"use strict\";t.exports=r(47908)},20273:function(t,e,r){\"use strict\";t.exports=r(58218)},6457:function(t,e,r){\"use strict\";t.exports=r(89362)},15849:function(t,e,r){\"use strict\";t.exports=r(53794)},38847:function(t,e,r){\"use strict\";t.exports=r(29698)},7659:function(t,e,r){\"use strict\";t.exports=r(51252)},60089:function(t,e,r){\"use strict\";t.exports=r(48050)},22084:function(t,e,r){\"use strict\";t.exports=r(58075)},35892:function(t,e,r){\"use strict\";t.exports=r(9419)},81204:function(t,e,r){\"use strict\";t.exports=r(28128)},55857:function(t,e,r){\"use strict\";t.exports=r(47050)},12862:function(t,e,r){\"use strict\";t.exports=r(91405)},97629:function(t,e,r){\"use strict\";t.exports=r(34406)},67549:function(t,e,r){\"use strict\";t.exports=r(17430)},2660:function(t,e,r){\"use strict\";t.exports=r(91995)},86071:function(t,e,r){\"use strict\";t.exports=r(81264)},66200:function(t,e,r){\"use strict\";t.exports=r(42849)},53446:function(t,e,r){\"use strict\";t.exports=r(52213)},86899:function(t,e,r){\"use strict\";t.exports=r(91132)},13430:function(t,e,r){\"use strict\";t.exports=r(50453)},21548:function(t,e,r){\"use strict\";t.exports=r(29251)},53939:function(t,e,r){\"use strict\";t.exports=r(72892)},1902:function(t,e,r){\"use strict\";t.exports=r(74461)},29096:function(t,e,r){\"use strict\";t.exports=r(66143)},23820:function(t,e,r){\"use strict\";t.exports=r(81955)},82017:function(t,e,r){\"use strict\";t.exports=r(36858)},113:function(t,e,r){\"use strict\";t.exports=r(92106)},20260:function(t,e,r){\"use strict\";var n=r(67549);n.register([r(20273),r(15849),r(21548),r(1902),r(29096),r(23820),r(12862),r(1639),r(10067),r(53446),r(31014),r(113),r(78170),r(8202),r(92382),r(82017),r(86899),r(54357),r(66903),r(90594),r(71680),r(7412),r(55857),r(784),r(74221),r(22084),r(44001),r(97281),r(12345),r(53939),r(29117),r(5410),r(5057),r(81204),r(86071),r(14226),r(35892),r(2660),r(96599),r(28573),r(76832),r(60089),r(51469),r(97629),r(27700),r(7659),r(11780),r(27195),r(6457),r(84639),r(14187),r(66200),r(13430),r(90590),r(38847)]),t.exports=n},28573:function(t,e,r){\"use strict\";t.exports=r(25638)},90594:function(t,e,r){\"use strict\";t.exports=r(75297)},7412:function(t,e,r){\"use strict\";t.exports=r(58859)},27700:function(t,e,r){\"use strict\";t.exports=r(12683)},5410:function(t,e,r){\"use strict\";t.exports=r(6305)},29117:function(t,e,r){\"use strict\";t.exports=r(83910)},78170:function(t,e,r){\"use strict\";t.exports=r(49913)},12345:function(t,e,r){\"use strict\";t.exports=r(15186)},96599:function(t,e,r){\"use strict\";t.exports=r(71760)},54357:function(t,e,r){\"use strict\";t.exports=r(17822)},51469:function(t,e,r){\"use strict\";t.exports=r(56534)},74221:function(t,e,r){\"use strict\";t.exports=r(18070)},44001:function(t,e,r){\"use strict\";t.exports=r(52378)},14226:function(t,e,r){\"use strict\";t.exports=r(30929)},5057:function(t,e,r){\"use strict\";t.exports=r(83866)},11780:function(t,e,r){\"use strict\";t.exports=r(66939)},27195:function(t,e,r){\"use strict\";t.exports=r(23748)},84639:function(t,e,r){\"use strict\";t.exports=r(73304)},1639:function(t,e,r){\"use strict\";t.exports=r(12864)},90590:function(t,e,r){\"use strict\";t.exports=r(99855)},97281:function(t,e,r){\"use strict\";t.exports=r(91450)},784:function(t,e,r){\"use strict\";t.exports=r(51943)},8202:function(t,e,r){\"use strict\";t.exports=r(80809)},66903:function(t,e,r){\"use strict\";t.exports=r(95984)},76832:function(t,e,r){\"use strict\";t.exports=r(51671)},92382:function(t,e,r){\"use strict\";t.exports=r(47181)},10067:function(t,e,r){\"use strict\";t.exports=r(37276)},71680:function(t,e,r){\"use strict\";t.exports=r(75703)},31014:function(t,e,r){\"use strict\";t.exports=r(38261)},11645:function(t){\"use strict\";t.exports=[{path:\"\",backoff:0},{path:\"M-2.4,-3V3L0.6,0Z\",backoff:.6},{path:\"M-3.7,-2.5V2.5L1.3,0Z\",backoff:1.3},{path:\"M-4.45,-3L-1.65,-0.2V0.2L-4.45,3L1.55,0Z\",backoff:1.55},{path:\"M-2.2,-2.2L-0.2,-0.2V0.2L-2.2,2.2L-1.4,3L1.6,0L-1.4,-3Z\",backoff:1.6},{path:\"M-4.4,-2.1L-0.6,-0.2V0.2L-4.4,2.1L-4,3L2,0L-4,-3Z\",backoff:2},{path:\"M2,0A2,2 0 1,1 0,-2A2,2 0 0,1 2,0Z\",backoff:0,noRotate:!0},{path:\"M2,2V-2H-2V2Z\",backoff:0,noRotate:!0}]},50222:function(t,e,r){\"use strict\";var n=r(11645),i=r(80337),a=r(54826),o=r(78032).templatedArray;r(35081),t.exports=o(\"annotation\",{visible:{valType:\"boolean\",dflt:!0,editType:\"calc+arraydraw\"},text:{valType:\"string\",editType:\"calc+arraydraw\"},textangle:{valType:\"angle\",dflt:0,editType:\"calc+arraydraw\"},font:i({editType:\"calc+arraydraw\",colorEditType:\"arraydraw\"}),width:{valType:\"number\",min:1,dflt:null,editType:\"calc+arraydraw\"},height:{valType:\"number\",min:1,dflt:null,editType:\"calc+arraydraw\"},opacity:{valType:\"number\",min:0,max:1,dflt:1,editType:\"arraydraw\"},align:{valType:\"enumerated\",values:[\"left\",\"center\",\"right\"],dflt:\"center\",editType:\"arraydraw\"},valign:{valType:\"enumerated\",values:[\"top\",\"middle\",\"bottom\"],dflt:\"middle\",editType:\"arraydraw\"},bgcolor:{valType:\"color\",dflt:\"rgba(0,0,0,0)\",editType:\"arraydraw\"},bordercolor:{valType:\"color\",dflt:\"rgba(0,0,0,0)\",editType:\"arraydraw\"},borderpad:{valType:\"number\",min:0,dflt:1,editType:\"calc+arraydraw\"},borderwidth:{valType:\"number\",min:0,dflt:1,editType:\"calc+arraydraw\"},showarrow:{valType:\"boolean\",dflt:!0,editType:\"calc+arraydraw\"},arrowcolor:{valType:\"color\",editType:\"arraydraw\"},arrowhead:{valType:\"integer\",min:0,max:n.length,dflt:1,editType:\"arraydraw\"},startarrowhead:{valType:\"integer\",min:0,max:n.length,dflt:1,editType:\"arraydraw\"},arrowside:{valType:\"flaglist\",flags:[\"end\",\"start\"],extras:[\"none\"],dflt:\"end\",editType:\"arraydraw\"},arrowsize:{valType:\"number\",min:.3,dflt:1,editType:\"calc+arraydraw\"},startarrowsize:{valType:\"number\",min:.3,dflt:1,editType:\"calc+arraydraw\"},arrowwidth:{valType:\"number\",min:.1,editType:\"calc+arraydraw\"},standoff:{valType:\"number\",min:0,dflt:0,editType:\"calc+arraydraw\"},startstandoff:{valType:\"number\",min:0,dflt:0,editType:\"calc+arraydraw\"},ax:{valType:\"any\",editType:\"calc+arraydraw\"},ay:{valType:\"any\",editType:\"calc+arraydraw\"},axref:{valType:\"enumerated\",dflt:\"pixel\",values:[\"pixel\",a.idRegex.x.toString()],editType:\"calc\"},ayref:{valType:\"enumerated\",dflt:\"pixel\",values:[\"pixel\",a.idRegex.y.toString()],editType:\"calc\"},xref:{valType:\"enumerated\",values:[\"paper\",a.idRegex.x.toString()],editType:\"calc\"},x:{valType:\"any\",editType:\"calc+arraydraw\"},xanchor:{valType:\"enumerated\",values:[\"auto\",\"left\",\"center\",\"right\"],dflt:\"auto\",editType:\"calc+arraydraw\"},xshift:{valType:\"number\",dflt:0,editType:\"calc+arraydraw\"},yref:{valType:\"enumerated\",values:[\"paper\",a.idRegex.y.toString()],editType:\"calc\"},y:{valType:\"any\",editType:\"calc+arraydraw\"},yanchor:{valType:\"enumerated\",values:[\"auto\",\"top\",\"middle\",\"bottom\"],dflt:\"auto\",editType:\"calc+arraydraw\"},yshift:{valType:\"number\",dflt:0,editType:\"calc+arraydraw\"},clicktoshow:{valType:\"enumerated\",values:[!1,\"onoff\",\"onout\"],dflt:!1,editType:\"arraydraw\"},xclick:{valType:\"any\",editType:\"arraydraw\"},yclick:{valType:\"any\",editType:\"arraydraw\"},hovertext:{valType:\"string\",editType:\"arraydraw\"},hoverlabel:{bgcolor:{valType:\"color\",editType:\"arraydraw\"},bordercolor:{valType:\"color\",editType:\"arraydraw\"},font:i({editType:\"arraydraw\"}),editType:\"arraydraw\"},captureevents:{valType:\"boolean\",editType:\"arraydraw\"},editType:\"calc\",_deprecated:{ref:{valType:\"string\",editType:\"calc\"}}})},60317:function(t,e,r){\"use strict\";var n=r(34809),i=r(29714),a=r(3377).draw;function o(t){var e=t._fullLayout;n.filterVisible(e.annotations).forEach((function(e){var r=i.getFromId(t,e.xref),n=i.getFromId(t,e.yref),a=i.getRefType(e.xref),o=i.getRefType(e.yref);e._extremes={},\"range\"===a&&s(e,r),\"range\"===o&&s(e,n)}))}function s(t,e){var r,n=e._id,a=n.charAt(0),o=t[a],s=t[\"a\"+a],l=t[a+\"ref\"],c=t[\"a\"+a+\"ref\"],u=t[\"_\"+a+\"padplus\"],h=t[\"_\"+a+\"padminus\"],f={x:1,y:-1}[a]*t[a+\"shift\"],p=3*t.arrowsize*t.arrowwidth||0,d=p+f,m=p-f,g=3*t.startarrowsize*t.arrowwidth||0,y=g+f,v=g-f;if(c===l){var x=i.findExtremes(e,[e.r2c(o)],{ppadplus:d,ppadminus:m}),_=i.findExtremes(e,[e.r2c(s)],{ppadplus:Math.max(u,y),ppadminus:Math.max(h,v)});r={min:[x.min[0],_.min[0]],max:[x.max[0],_.max[0]]}}else y=s?y+s:y,v=s?v-s:v,r=i.findExtremes(e,[e.r2c(o)],{ppadplus:Math.max(u,d,y),ppadminus:Math.max(h,m,v)});t._extremes[n]=r}t.exports=function(t){var e=t._fullLayout;if(n.filterVisible(e.annotations).length&&t._fullData.length)return n.syncOrAsync([a,o],t)}},6035:function(t,e,r){\"use strict\";var n=r(34809),i=r(33626),a=r(78032).arrayEditor;function o(t,e){var r,n,i,a,o,l,c,u=t._fullLayout.annotations,h=[],f=[],p=[],d=(e||[]).length;for(r=0;r0||r.explicitOff.length>0},onClick:function(t,e){var r,s,l=o(t,e),c=l.on,u=l.off.concat(l.explicitOff),h={},f=t._fullLayout.annotations;if(c.length||u.length){for(r=0;r2/3?\"right\":\"center\"),{center:0,middle:0,left:.5,bottom:-.5,right:-.5,top:.5}[e]}for(var W=!1,Y=[\"x\",\"y\"],X=0;X1)&&(nt===rt?((pt=it.r2fraction(e[\"a\"+et]))<0||pt>1)&&(W=!0):W=!0),$=it._offset+it.r2p(e[et]),Q=.5}else{var dt=\"domain\"===ft;\"x\"===et?(K=e[et],$=dt?it._offset+it._length*K:$=T.l+T.w*K):(K=1-e[et],$=dt?it._offset+it._length*K:$=T.t+T.h*K),Q=e.showarrow?.5:K}if(e.showarrow){ht.head=$;var mt=e[\"a\"+et];if(tt=ot*H(.5,e.xanchor)-st*H(.5,e.yanchor),nt===rt){var gt=l.getRefType(nt);\"domain\"===gt?(\"y\"===et&&(mt=1-mt),ht.tail=it._offset+it._length*mt):\"paper\"===gt?\"y\"===et?(mt=1-mt,ht.tail=T.t+T.h*mt):ht.tail=T.l+T.w*mt:ht.tail=it._offset+it.r2p(mt),J=tt}else ht.tail=$+mt,J=tt+mt;ht.text=ht.tail+tt;var yt=w[\"x\"===et?\"width\":\"height\"];if(\"paper\"===rt&&(ht.head=o.constrain(ht.head,1,yt-1)),\"pixel\"===nt){var vt=-Math.max(ht.tail-3,ht.text),xt=Math.min(ht.tail+3,ht.text)-yt;vt>0?(ht.tail+=vt,ht.text+=vt):xt>0&&(ht.tail-=xt,ht.text-=xt)}ht.tail+=ut,ht.head+=ut}else J=tt=lt*H(Q,ct),ht.text=$+tt;ht.text+=ut,tt+=ut,J+=ut,e[\"_\"+et+\"padplus\"]=lt/2+J,e[\"_\"+et+\"padminus\"]=lt/2-J,e[\"_\"+et+\"size\"]=lt,e[\"_\"+et+\"shift\"]=tt}if(W)R.remove();else{var _t=0,bt=0;if(\"left\"!==e.align&&(_t=(A-_)*(\"center\"===e.align?.5:1)),\"top\"!==e.valign&&(bt=(D-b)*(\"middle\"===e.valign?.5:1)),h)n.select(\"svg\").attr({x:N+_t-1,y:N+bt}).call(u.setClipUrl,U?C:null,t);else{var wt=N+bt-m.top,Tt=N+_t-m.left;G.call(f.positionText,Tt,wt).call(u.setClipUrl,U?C:null,t)}V.select(\"rect\").call(u.setRect,N,N,A,D),j.call(u.setRect,F/2,F/2,B-F,q-F),R.call(u.setTranslate,Math.round(L.x.text-B/2),Math.round(L.y.text-q/2)),z.attr({transform:\"rotate(\"+I+\",\"+L.x.text+\",\"+L.y.text+\")\"});var kt,At=function(r,n){P.selectAll(\".annotation-arrow-g\").remove();var l=L.x.head,h=L.y.head,f=L.x.tail+r,p=L.y.tail+n,m=L.x.text+r,_=L.y.text+n,b=o.rotationXYMatrix(I,m,_),w=o.apply2DTransform(b),A=o.apply2DTransform2(b),C=+j.attr(\"width\"),O=+j.attr(\"height\"),D=m-.5*C,F=D+C,B=_-.5*O,N=B+O,U=[[D,B,D,N],[D,N,F,N],[F,N,F,B],[F,B,D,B]].map(A);if(!U.reduce((function(t,e){return t^!!o.segmentsIntersect(l,h,l+1e6,h+1e6,e[0],e[1],e[2],e[3])}),!1)){U.forEach((function(t){var e=o.segmentsIntersect(f,p,l,h,t[0],t[1],t[2],t[3]);e&&(f=e.x,p=e.y)}));var V=e.arrowwidth,q=e.arrowcolor,H=e.arrowside,G=P.append(\"g\").style({opacity:c.opacity(q)}).classed(\"annotation-arrow-g\",!0),Z=G.append(\"path\").attr(\"d\",\"M\"+f+\",\"+p+\"L\"+l+\",\"+h).style(\"stroke-width\",V+\"px\").call(c.stroke,c.rgb(q));if(g(Z,H,e),k.annotationPosition&&Z.node().parentNode&&!a){var W=l,Y=h;if(e.standoff){var X=Math.sqrt(Math.pow(l-f,2)+Math.pow(h-p,2));W+=e.standoff*(f-l)/X,Y+=e.standoff*(p-h)/X}var $,J,K=G.append(\"path\").classed(\"annotation-arrow\",!0).classed(\"anndrag\",!0).classed(\"cursor-move\",!0).attr({d:\"M3,3H-3V-3H3ZM0,0L\"+(f-W)+\",\"+(p-Y),transform:s(W,Y)}).style(\"stroke-width\",V+6+\"px\").call(c.stroke,\"rgba(0,0,0,0)\").call(c.fill,\"rgba(0,0,0,0)\");d.init({element:K.node(),gd:t,prepFn:function(){var t=u.getTranslate(R);$=t.x,J=t.y,y&&y.autorange&&M(y._name+\".autorange\",!0),x&&x.autorange&&M(x._name+\".autorange\",!0)},moveFn:function(t,r){var n=w($,J),i=n[0]+t,a=n[1]+r;R.call(u.setTranslate,i,a),S(\"x\",v(y,t,\"x\",T,e)),S(\"y\",v(x,r,\"y\",T,e)),e.axref===e.xref&&S(\"ax\",v(y,t,\"ax\",T,e)),e.ayref===e.yref&&S(\"ay\",v(x,r,\"ay\",T,e)),G.attr(\"transform\",s(t,r)),z.attr({transform:\"rotate(\"+I+\",\"+i+\",\"+a+\")\"})},doneFn:function(){i.call(\"_guiRelayout\",t,E());var e=document.querySelector(\".js-notes-box-panel\");e&&e.redraw(e.selectedObj)}})}}};e.showarrow&&At(0,0),O&&d.init({element:R.node(),gd:t,prepFn:function(){kt=z.attr(\"transform\")},moveFn:function(t,r){var n=\"pointer\";if(e.showarrow)e.axref===e.xref?S(\"ax\",v(y,t,\"ax\",T,e)):S(\"ax\",e.ax+t),e.ayref===e.yref?S(\"ay\",v(x,r,\"ay\",T.w,e)):S(\"ay\",e.ay+r),At(t,r);else{if(a)return;var i,o;if(y)i=v(y,t,\"x\",T,e);else{var l=e._xsize/T.w,c=e.x+(e._xshift-e.xshift)/T.w-l/2;i=d.align(c+t/T.w,l,0,1,e.xanchor)}if(x)o=v(x,r,\"y\",T,e);else{var u=e._ysize/T.h,h=e.y-(e._yshift+e.yshift)/T.h-u/2;o=d.align(h-r/T.h,u,0,1,e.yanchor)}S(\"x\",i),S(\"y\",o),y&&x||(n=d.getCursor(y?.5:i,x?.5:o,e.xanchor,e.yanchor))}z.attr({transform:s(t,r)+kt}),p(R,n)},clickFn:function(r,n){e.captureevents&&t.emit(\"plotly_clickannotation\",Z(n))},doneFn:function(){p(R),i.call(\"_guiRelayout\",t,E());var e=document.querySelector(\".js-notes-box-panel\");e&&e.redraw(e.selectedObj)}})}}}t.exports={draw:function(t){var e=t._fullLayout;e._infolayer.selectAll(\".annotation\").remove();for(var r=0;r=0,x=e.indexOf(\"end\")>=0,_=d.backoff*g+r.standoff,b=m.backoff*y+r.startstandoff;if(\"line\"===p.nodeName){o={x:+t.attr(\"x1\"),y:+t.attr(\"y1\")},u={x:+t.attr(\"x2\"),y:+t.attr(\"y2\")};var w=o.x-u.x,T=o.y-u.y;if(f=(h=Math.atan2(T,w))+Math.PI,_&&b&&_+b>Math.sqrt(w*w+T*T))return void O();if(_){if(_*_>w*w+T*T)return void O();var k=_*Math.cos(h),A=_*Math.sin(h);u.x+=k,u.y+=A,t.attr({x2:u.x,y2:u.y})}if(b){if(b*b>w*w+T*T)return void O();var M=b*Math.cos(h),S=b*Math.sin(h);o.x-=M,o.y-=S,t.attr({x1:o.x,y1:o.y})}}else if(\"path\"===p.nodeName){var E=p.getTotalLength(),C=\"\";if(E<_+b)return void O();var L=p.getPointAtLength(0),I=p.getPointAtLength(.1);h=Math.atan2(L.y-I.y,L.x-I.x),o=p.getPointAtLength(Math.min(b,E)),C=\"0px,\"+b+\"px,\";var P=p.getPointAtLength(E),z=p.getPointAtLength(E-.1);f=Math.atan2(P.y-z.y,P.x-z.x),u=p.getPointAtLength(Math.max(0,E-_)),C+=E-(C?b+_:_)+\"px,\"+E+\"px\",t.style(\"stroke-dasharray\",C)}function O(){t.style(\"stroke-dasharray\",\"0px,100px\")}function D(e,a,o,u){e.path&&(e.noRotate&&(o=0),n.select(p.parentNode).append(\"path\").attr({class:t.attr(\"class\"),d:e.path,transform:c(a.x,a.y)+l(180*o/Math.PI)+s(u)}).style({fill:i.rgb(r.arrowcolor),\"stroke-width\":0}))}v&&D(m,o,h,y),x&&D(d,u,f,g)}},3599:function(t,e,r){\"use strict\";var n=r(3377),i=r(6035);t.exports={moduleType:\"component\",name:\"annotations\",layoutAttributes:r(50222),supplyLayoutDefaults:r(63737),includeBasePlot:r(20706)(\"annotations\"),calcAutorange:r(60317),draw:n.draw,drawOne:n.drawOne,drawRaw:n.drawRaw,hasClickToShow:i.hasClickToShow,onClick:i.onClick,convertCoords:r(59741)}},38239:function(t,e,r){\"use strict\";var n=r(50222),i=r(13582).overrideAll,a=r(78032).templatedArray;t.exports=i(a(\"annotation\",{visible:n.visible,x:{valType:\"any\"},y:{valType:\"any\"},z:{valType:\"any\"},ax:{valType:\"number\"},ay:{valType:\"number\"},xanchor:n.xanchor,xshift:n.xshift,yanchor:n.yanchor,yshift:n.yshift,text:n.text,textangle:n.textangle,font:n.font,width:n.width,height:n.height,opacity:n.opacity,align:n.align,valign:n.valign,bgcolor:n.bgcolor,bordercolor:n.bordercolor,borderpad:n.borderpad,borderwidth:n.borderwidth,showarrow:n.showarrow,arrowcolor:n.arrowcolor,arrowhead:n.arrowhead,startarrowhead:n.startarrowhead,arrowside:n.arrowside,arrowsize:n.arrowsize,startarrowsize:n.startarrowsize,arrowwidth:n.arrowwidth,standoff:n.standoff,startstandoff:n.startstandoff,hovertext:n.hovertext,hoverlabel:n.hoverlabel,captureevents:n.captureevents}),\"calc\",\"from-root\")},47979:function(t,e,r){\"use strict\";var n=r(34809),i=r(29714);function a(t,e){var r=e.fullSceneLayout.domain,a=e.fullLayout._size,o={pdata:null,type:\"linear\",autorange:!1,range:[-1/0,1/0]};t._xa={},n.extendFlat(t._xa,o),i.setConvert(t._xa),t._xa._offset=a.l+r.x[0]*a.w,t._xa.l2p=function(){return.5*(1+t._pdata[0]/t._pdata[3])*a.w*(r.x[1]-r.x[0])},t._ya={},n.extendFlat(t._ya,o),i.setConvert(t._ya),t._ya._offset=a.t+(1-r.y[1])*a.h,t._ya.l2p=function(){return.5*(1-t._pdata[1]/t._pdata[3])*a.h*(r.y[1]-r.y[0])}}t.exports=function(t){for(var e=t.fullSceneLayout.annotations,r=0;r1){c=!0;break}}c?t.fullLayout._infolayer.select(\".annotation-\"+t.id+'[data-index=\"'+s+'\"]').remove():(l._pdata=i(t.glplot.cameraParams,[e.xaxis.r2l(l.x)*r[0],e.yaxis.r2l(l.y)*r[1],e.zaxis.r2l(l.z)*r[2]]),n(t.graphDiv,l,s,t.id,l._xa,l._ya))}}},83348:function(t,e,r){\"use strict\";var n=r(33626),i=r(34809);t.exports={moduleType:\"component\",name:\"annotations3d\",schema:{subplots:{scene:{annotations:r(38239)}}},layoutAttributes:r(38239),handleDefaults:r(34232),includeBasePlot:function(t,e){var r=n.subplotsRegistry.gl3d;if(r)for(var a=r.attrRegex,o=Object.keys(t),s=0;s=0))return t;if(3===o)n[o]>1&&(n[o]=1);else if(n[o]>=1)return t}var s=Math.round(255*n[0])+\", \"+Math.round(255*n[1])+\", \"+Math.round(255*n[2]);return a?\"rgba(\"+s+\", \"+n[3]+\")\":\"rgb(\"+s+\")\"}o.tinyRGB=function(t){var e=t.toRgb();return\"rgb(\"+Math.round(e.r)+\", \"+Math.round(e.g)+\", \"+Math.round(e.b)+\")\"},o.rgb=function(t){return o.tinyRGB(n(t))},o.opacity=function(t){return t?n(t).getAlpha():0},o.addOpacity=function(t,e){var r=n(t).toRgb();return\"rgba(\"+Math.round(r.r)+\", \"+Math.round(r.g)+\", \"+Math.round(r.b)+\", \"+e+\")\"},o.combine=function(t,e){var r=n(t).toRgb();if(1===r.a)return n(t).toRgbString();var i=n(e||c).toRgb(),a=1===i.a?i:{r:255*(1-i.a)+i.r*i.a,g:255*(1-i.a)+i.g*i.a,b:255*(1-i.a)+i.b*i.a},o={r:a.r*(1-r.a)+r.r*r.a,g:a.g*(1-r.a)+r.g*r.a,b:a.b*(1-r.a)+r.b*r.a};return n(o).toRgbString()},o.interpolate=function(t,e,r){var i=n(t).toRgb(),a=n(e).toRgb(),o={r:r*i.r+(1-r)*a.r,g:r*i.g+(1-r)*a.g,b:r*i.b+(1-r)*a.b};return n(o).toRgbString()},o.contrast=function(t,e,r){var i=n(t);return 1!==i.getAlpha()&&(i=n(o.combine(t,c))),(i.isDark()?e?i.lighten(e):c:r?i.darken(r):l).toString()},o.stroke=function(t,e){var r=n(e);t.style({stroke:o.tinyRGB(r),\"stroke-opacity\":r.getAlpha()})},o.fill=function(t,e){var r=n(e);t.style({fill:o.tinyRGB(r),\"fill-opacity\":r.getAlpha()})},o.clean=function(t){if(t&&\"object\"==typeof t){var e,r,n,i,s=Object.keys(t);for(e=0;e0?n>=l:n<=l));i++)n>u&&n0?n>=l:n<=l));i++)n>r[0]&&n1){var pt=Math.pow(10,Math.floor(Math.log(ft)/Math.LN10));ut*=pt*c.roundUp(ft/pt,[2,5,10]),(Math.abs(Z.start)/Z.size+1e-6)%1<2e-6&&(lt.tick0=0)}lt.dtick=ut}lt.domain=o?[ot+P/B.h,ot+Q-P/B.h]:[ot+I/B.w,ot+Q-I/B.w],lt.setScale(),t.attr(\"transform\",u(Math.round(B.l),Math.round(B.t)));var dt,mt=t.select(\".\"+A.cbtitleunshift).attr(\"transform\",u(-Math.round(B.l),-Math.round(B.t))),gt=lt.ticklabelposition,yt=lt.title.font.size,vt=t.select(\".\"+A.cbaxis),xt=0,_t=0;function bt(n,i){var a={propContainer:lt,propName:e._propPrefix+\"title\",traceIndex:e._traceIndex,_meta:e._meta,placeholder:F._dfltTitle.colorbar,containerGroup:t.select(\".\"+A.cbtitle)},o=\"h\"===n.charAt(0)?n.substr(1):\"h\"+n;t.selectAll(\".\"+o+\",.\"+o+\"-math-group\").remove(),m.draw(r,n,h(a,i||{}))}return c.syncOrAsync([a.previousPromises,function(){var t,e;(o&&ct||!o&&!ct)&&(\"top\"===V&&(t=I+B.l+tt*z,e=P+B.t+et*(1-ot-Q)+3+.75*yt),\"bottom\"===V&&(t=I+B.l+tt*z,e=P+B.t+et*(1-ot)-3-.25*yt),\"right\"===V&&(e=P+B.t+et*O+3+.75*yt,t=I+B.l+tt*ot),bt(lt._id+\"title\",{attributes:{x:t,y:e,\"text-anchor\":o?\"start\":\"middle\"}}))},function(){if(!o&&!ct||o&&ct){var a,l=t.select(\".\"+A.cbtitle),h=l.select(\"text\"),f=[-M/2,M/2],d=l.select(\".h\"+lt._id+\"title-math-group\").node(),m=15.6;if(h.node()&&(m=parseInt(h.node().style.fontSize,10)*w),d?(a=p.bBox(d),_t=a.width,(xt=a.height)>m&&(f[1]-=(xt-m)/2)):h.node()&&!h.classed(A.jsPlaceholder)&&(a=p.bBox(h.node()),_t=a.width,xt=a.height),o){if(xt){if(xt+=5,\"top\"===V)lt.domain[1]-=xt/B.h,f[1]*=-1;else{lt.domain[0]+=xt/B.h;var y=g.lineCount(h);f[1]+=(1-y)*m}l.attr(\"transform\",u(f[0],f[1])),lt.setScale()}}else _t&&(\"right\"===V&&(lt.domain[0]+=(_t+yt/2)/B.w),l.attr(\"transform\",u(f[0],f[1])),lt.setScale())}t.selectAll(\".\"+A.cbfills+\",.\"+A.cblines).attr(\"transform\",o?u(0,Math.round(B.h*(1-lt.domain[1]))):u(Math.round(B.w*lt.domain[0]),0)),vt.attr(\"transform\",o?u(0,Math.round(-B.t)):u(Math.round(-B.l),0));var v=t.select(\".\"+A.cbfills).selectAll(\"rect.\"+A.cbfill).attr(\"style\",\"\").data(Y);v.enter().append(\"rect\").classed(A.cbfill,!0).attr(\"style\",\"\"),v.exit().remove();var x=q.map(lt.c2p).map(Math.round).sort((function(t,e){return t-e}));v.each((function(t,a){var s=[0===a?q[0]:(Y[a]+Y[a-1])/2,a===Y.length-1?q[1]:(Y[a]+Y[a+1])/2].map(lt.c2p).map(Math.round);o&&(s[1]=c.constrain(s[1]+(s[1]>s[0])?1:-1,x[0],x[1]));var l=n.select(this).attr(o?\"x\":\"y\",rt).attr(o?\"y\":\"x\",n.min(s)).attr(o?\"width\":\"height\",Math.max($,2)).attr(o?\"height\":\"width\",Math.max(n.max(s)-n.min(s),2));if(e._fillgradient)p.gradient(l,r,e._id,o?\"vertical\":\"horizontalreversed\",e._fillgradient,\"fill\");else{var u=G(t).replace(\"e-\",\"\");l.attr(\"fill\",i(u).toHexString())}}));var _=t.select(\".\"+A.cblines).selectAll(\"path.\"+A.cbline).data(j.color&&j.width?X:[]);_.enter().append(\"path\").classed(A.cbline,!0),_.exit().remove(),_.each((function(t){var e=rt,r=Math.round(lt.c2p(t))+j.width/2%1;n.select(this).attr(\"d\",\"M\"+(o?e+\",\"+r:r+\",\"+e)+(o?\"h\":\"v\")+$).call(p.lineGroupStyle,j.width,H(t),j.dash)})),vt.selectAll(\"g.\"+lt._id+\"tick,path\").remove();var b=rt+$+(M||0)/2-(\"outside\"===e.ticks?1:0),T=s.calcTicks(lt),k=s.getTickSigns(lt)[2];return s.drawTicks(r,lt,{vals:\"inside\"===lt.ticks?s.clipEnds(lt,T):T,layer:vt,path:s.makeTickPath(lt,b,k),transFn:s.makeTransTickFn(lt)}),s.drawLabels(r,lt,{vals:T,layer:vt,transFn:s.makeTransTickLabelFn(lt),labelFns:s.makeLabelFns(lt,b)})},function(){if(o&&!ct||!o&&ct){var t,i,a=lt.position||0,s=lt._offset+lt._length/2;if(\"right\"===V)i=s,t=B.l+tt*a+10+yt*(lt.showticklabels?1:.5);else if(t=s,\"bottom\"===V&&(i=B.t+et*a+10+(-1===gt.indexOf(\"inside\")?lt.tickfont.size:0)+(\"intside\"!==lt.ticks&&e.ticklen||0)),\"top\"===V){var l=U.text.split(\"
\").length;i=B.t+et*a+10-$-w*yt*l}bt((o?\"h\":\"v\")+lt._id+\"title\",{avoid:{selection:n.select(r).selectAll(\"g.\"+lt._id+\"tick\"),side:V,offsetTop:o?0:B.t,offsetLeft:o?B.l:0,maxShift:o?F.width:F.height},attributes:{x:t,y:i,\"text-anchor\":\"middle\"},transform:{rotate:o?-90:0,offset:0}})}},a.previousPromises,function(){var n,s=$+M/2;-1===gt.indexOf(\"inside\")&&(n=p.bBox(vt.node()),s+=o?n.width:n.height),dt=mt.select(\"text\");var c=0,h=o&&\"top\"===V,m=!o&&\"right\"===V,g=0;if(dt.node()&&!dt.classed(A.jsPlaceholder)){var v,x=mt.select(\".h\"+lt._id+\"title-math-group\").node();x&&(o&&ct||!o&&!ct)?(c=(n=p.bBox(x)).width,v=n.height):(c=(n=p.bBox(mt.node())).right-B.l-(o?rt:st),v=n.bottom-B.t-(o?st:rt),o||\"top\"!==V||(s+=n.height,g=n.height)),m&&(dt.attr(\"transform\",u(c/2+yt/2,0)),c*=2),s=Math.max(s,o?c:v)}var _=2*(o?I:P)+s+S+M/2,w=0;!o&&U.text&&\"bottom\"===L&&O<=0&&(_+=w=_/2,g+=w),F._hColorbarMoveTitle=w,F._hColorbarMoveCBTitle=g;var N=S+M,j=(o?rt:st)-N/2-(o?I:0),q=(o?st:rt)-(o?K:P+g-w);t.select(\".\"+A.cbbg).attr(\"x\",j).attr(\"y\",q).attr(o?\"width\":\"height\",Math.max(_-w,2)).attr(o?\"height\":\"width\",Math.max(K+N,2)).call(d.fill,E).call(d.stroke,e.bordercolor).style(\"stroke-width\",S);var H=m?Math.max(c-10,0):0;t.selectAll(\".\"+A.cboutline).attr(\"x\",(o?rt:st+I)+H).attr(\"y\",(o?st+P-K:rt)+(h?xt:0)).attr(o?\"width\":\"height\",Math.max($,2)).attr(o?\"height\":\"width\",Math.max(K-(o?2*P+xt:2*I+H),2)).call(d.stroke,e.outlinecolor).style({fill:\"none\",\"stroke-width\":M});var G=o?nt*_:0,Z=o?0:(1-it)*_-g;if(G=R?B.l-G:-G,Z=D?B.t-Z:-Z,t.attr(\"transform\",u(G,Z)),!o&&(S||i(E).getAlpha()&&!i.equals(F.paper_bgcolor,E))){var W=vt.selectAll(\"text\"),Y=W[0].length,X=t.select(\".\"+A.cbbg).node(),J=p.bBox(X),Q=p.getTranslate(t);W.each((function(t,e){var r=Y-1;if(0===e||e===r){var n,i=p.bBox(this),a=p.getTranslate(this);if(e===r){var o=i.right+a.x;(n=J.right+Q.x+st-S-2+z-o)>0&&(n=0)}else if(0===e){var s=i.left+a.x;(n=J.left+Q.x+st+S+2-s)<0&&(n=0)}n&&(Y<3?this.setAttribute(\"transform\",\"translate(\"+n+\",0) \"+this.getAttribute(\"transform\")):this.setAttribute(\"visibility\",\"hidden\"))}}))}var tt={},et=T[C],at=k[C],ot=T[L],ut=k[L],ht=_-$;o?(\"pixels\"===f?(tt.y=O,tt.t=K*ot,tt.b=K*ut):(tt.t=tt.b=0,tt.yt=O+l*ot,tt.yb=O-l*ut),\"pixels\"===b?(tt.x=z,tt.l=_*et,tt.r=_*at):(tt.l=ht*et,tt.r=ht*at,tt.xl=z-y*et,tt.xr=z+y*at)):(\"pixels\"===f?(tt.x=z,tt.l=K*et,tt.r=K*at):(tt.l=tt.r=0,tt.xl=z+l*et,tt.xr=z-l*at),\"pixels\"===b?(tt.y=1-O,tt.t=_*ot,tt.b=_*ut):(tt.t=ht*ot,tt.b=ht*ut,tt.yt=O-y*ot,tt.yb=O+y*ut));var ft=e.y<.5?\"b\":\"t\",pt=e.x<.5?\"l\":\"r\";r._fullLayout._reservedMargin[e._id]={};var _t={r:F.width-j-G,l:j+tt.r,b:F.height-q-Z,t:q+tt.b};R&&D?a.autoMargin(r,e._id,tt):R?r._fullLayout._reservedMargin[e._id][ft]=_t[ft]:D||o?r._fullLayout._reservedMargin[e._id][pt]=_t[pt]:r._fullLayout._reservedMargin[e._id][ft]=_t[ft]}],r)}(r,e,t);y&&y.then&&(t._promises||[]).push(y),t._context.edits.colorbarPosition&&function(t,e,r){var n,i,a,s=\"v\"===e.orientation,c=r._fullLayout._size;l.init({element:t.node(),gd:r,prepFn:function(){n=t.attr(\"transform\"),f(t)},moveFn:function(r,o){t.attr(\"transform\",n+u(r,o)),i=l.align((s?e._uFrac:e._vFrac)+r/c.w,s?e._thickFrac:e._lenFrac,0,1,e.xanchor),a=l.align((s?e._vFrac:1-e._uFrac)-o/c.h,s?e._lenFrac:e._thickFrac,0,1,e.yanchor);var h=l.getCursor(i,a,e.xanchor,e.yanchor);f(t,h)},doneFn:function(){if(f(t),void 0!==i&&void 0!==a){var n={};n[e._propPrefix+\"x\"]=i,n[e._propPrefix+\"y\"]=a,void 0!==e._traceIndex?o.call(\"_guiRestyle\",r,n,e._traceIndex):o.call(\"_guiRelayout\",r,n)}}})}(r,e,t)})),e.exit().each((function(e){a.autoMargin(t,e._id)})).remove(),e.order()}}},91362:function(t,e,r){\"use strict\";var n=r(34809);t.exports=function(t){return n.isPlainObject(t.colorbar)}},96919:function(t,e,r){\"use strict\";t.exports={moduleType:\"component\",name:\"colorbar\",attributes:r(25158),supplyDefaults:r(42097),draw:r(5881).draw,hasColorbar:r(91362)}},87163:function(t,e,r){\"use strict\";var n=r(25158),i=r(90694).counter,a=r(62994),o=r(19017).scales;function s(t){return\"`\"+t+\"`\"}a(o),t.exports=function(t,e){t=t||\"\";var r,a=(e=e||{}).cLetter||\"c\",l=(\"onlyIfNumerical\"in e?e.onlyIfNumerical:Boolean(t),\"noScale\"in e?e.noScale:\"marker.line\"===t),c=\"showScaleDflt\"in e?e.showScaleDflt:\"z\"===a,u=\"string\"==typeof e.colorscaleDflt?o[e.colorscaleDflt]:null,h=e.editTypeOverride||\"\",f=t?t+\".\":\"\";\"colorAttr\"in e?(r=e.colorAttr,e.colorAttr):s(f+(r={z:\"z\",c:\"color\"}[a]));var p=a+\"auto\",d=a+\"min\",m=a+\"max\",g=a+\"mid\",y=(s(f+p),s(f+d),s(f+m),{});y[d]=y[m]=void 0;var v={};v[p]=!1;var x={};return\"color\"===r&&(x.color={valType:\"color\",arrayOk:!0,editType:h||\"style\"},e.anim&&(x.color.anim=!0)),x[p]={valType:\"boolean\",dflt:!0,editType:\"calc\",impliedEdits:y},x[d]={valType:\"number\",dflt:null,editType:h||\"plot\",impliedEdits:v},x[m]={valType:\"number\",dflt:null,editType:h||\"plot\",impliedEdits:v},x[g]={valType:\"number\",dflt:null,editType:\"calc\",impliedEdits:y},x.colorscale={valType:\"colorscale\",editType:\"calc\",dflt:u,impliedEdits:{autocolorscale:!1}},x.autocolorscale={valType:\"boolean\",dflt:!1!==e.autoColorDflt,editType:\"calc\",impliedEdits:{colorscale:void 0}},x.reversescale={valType:\"boolean\",dflt:!1,editType:\"plot\"},l||(x.showscale={valType:\"boolean\",dflt:c,editType:\"calc\"},x.colorbar=n),e.noColorAxis||(x.coloraxis={valType:\"subplotid\",regex:i(\"coloraxis\"),dflt:null,editType:\"calc\"}),x}},28379:function(t,e,r){\"use strict\";var n=r(10721),i=r(34809),a=r(65477).extractOpts;t.exports=function(t,e,r){var o,s=t._fullLayout,l=r.vals,c=r.containerStr,u=c?i.nestedProperty(e,c).get():e,h=a(u),f=!1!==h.auto,p=h.min,d=h.max,m=h.mid,g=function(){return i.aggNums(Math.min,null,l)},y=function(){return i.aggNums(Math.max,null,l)};void 0===p?p=g():f&&(p=u._colorAx&&n(p)?Math.min(p,g()):g()),void 0===d?d=y():f&&(d=u._colorAx&&n(d)?Math.max(d,y()):y()),f&&void 0!==m&&(d-m>m-p?p=m-(d-m):d-m=0?s.colorscale.sequential:s.colorscale.sequentialminus,h._sync(\"colorscale\",o))}},67623:function(t,e,r){\"use strict\";var n=r(34809),i=r(65477).hasColorscale,a=r(65477).extractOpts;t.exports=function(t,e){function r(t,e){var r=t[\"_\"+e];void 0!==r&&(t[e]=r)}function o(t,i){var o=i.container?n.nestedProperty(t,i.container).get():t;if(o)if(o.coloraxis)o._colorAx=e[o.coloraxis];else{var s=a(o),l=s.auto;(l||void 0===s.min)&&r(o,i.min),(l||void 0===s.max)&&r(o,i.max),s.autocolorscale&&r(o,\"colorscale\")}}for(var s=0;s=0;n--,i++){var a=t[n];r[i]=[1-a[0],a[1]]}return r}function d(t,e){e=e||{};for(var r=t.domain,o=t.range,l=o.length,c=new Array(l),u=0;u4/3-s?o:s}},4001:function(t,e,r){\"use strict\";var n=r(34809),i=[[\"sw-resize\",\"s-resize\",\"se-resize\"],[\"w-resize\",\"move\",\"e-resize\"],[\"nw-resize\",\"n-resize\",\"ne-resize\"]];t.exports=function(t,e,r,a){return t=\"left\"===r?0:\"center\"===r?1:\"right\"===r?2:n.constrain(Math.floor(3*t),0,2),e=\"bottom\"===a?0:\"middle\"===a?1:\"top\"===a?2:n.constrain(Math.floor(3*e),0,2),i[e][t]}},70414:function(t,e){\"use strict\";e.selectMode=function(t){return\"lasso\"===t||\"select\"===t},e.drawMode=function(t){return\"drawclosedpath\"===t||\"drawopenpath\"===t||\"drawline\"===t||\"drawrect\"===t||\"drawcircle\"===t},e.openMode=function(t){return\"drawline\"===t||\"drawopenpath\"===t},e.rectMode=function(t){return\"select\"===t||\"drawline\"===t||\"drawrect\"===t||\"drawcircle\"===t},e.freeMode=function(t){return\"lasso\"===t||\"drawclosedpath\"===t||\"drawopenpath\"===t},e.selectingOrDrawing=function(t){return e.freeMode(t)||e.rectMode(t)}},14751:function(t,e,r){\"use strict\";var n=r(44039),i=r(39784),a=r(74043),o=r(34809).removeElement,s=r(54826),l=t.exports={};l.align=r(53770),l.getCursor=r(4001);var c=r(60148);function u(){var t=document.createElement(\"div\");t.className=\"dragcover\";var e=t.style;return e.position=\"fixed\",e.left=0,e.right=0,e.top=0,e.bottom=0,e.zIndex=999999999,e.background=\"none\",document.body.appendChild(t),t}function h(t){return n(t.changedTouches?t.changedTouches[0]:t,document.body)}l.unhover=c.wrapped,l.unhoverRaw=c.raw,l.init=function(t){var e,r,n,c,f,p,d,m,g=t.gd,y=1,v=g._context.doubleClickDelay,x=t.element;g._mouseDownTime||(g._mouseDownTime=0),x.style.pointerEvents=\"all\",x.onmousedown=b,a?(x._ontouchstart&&x.removeEventListener(\"touchstart\",x._ontouchstart),x._ontouchstart=b,x.addEventListener(\"touchstart\",b,{passive:!1})):x.ontouchstart=b;var _=t.clampFn||function(t,e,r){return Math.abs(t)v&&(y=Math.max(y-1,1)),g._dragged)t.doneFn&&t.doneFn();else if(t.clickFn&&t.clickFn(y,p),!m){var r;try{r=new MouseEvent(\"click\",e)}catch(t){var n=h(e);(r=document.createEvent(\"MouseEvents\")).initMouseEvent(\"click\",e.bubbles,e.cancelable,e.view,e.detail,e.screenX,e.screenY,n[0],n[1],e.ctrlKey,e.altKey,e.shiftKey,e.metaKey,e.button,e.relatedTarget)}d.dispatchEvent(r)}g._dragging=!1,g._dragged=!1}else g._dragged=!1}},l.coverSlip=u},60148:function(t,e,r){\"use strict\";var n=r(68596),i=r(64025),a=r(95425).getGraphDiv,o=r(85988),s=t.exports={};s.wrapped=function(t,e,r){(t=a(t))._fullLayout&&i.clear(t._fullLayout._uid+o.HOVERID),s.raw(t,e,r)},s.raw=function(t,e){var r=t._fullLayout,i=t._hoverdata;e||(e={}),e.target&&!t._dragged&&!1===n.triggerHandler(t,\"plotly_beforehover\",e)||(r._hoverlayer.selectAll(\"g\").remove(),r._hoverlayer.selectAll(\"line\").remove(),r._hoverlayer.selectAll(\"circle\").remove(),t._hoverdata=void 0,e.target&&i&&t.emit(\"plotly_unhover\",{event:e,points:i}))}},94850:function(t,e){\"use strict\";e.T={valType:\"string\",values:[\"solid\",\"dot\",\"dash\",\"longdash\",\"dashdot\",\"longdashdot\"],dflt:\"solid\",editType:\"style\"},e.k={shape:{valType:\"enumerated\",values:[\"\",\"/\",\"\\\\\",\"x\",\"-\",\"|\",\"+\",\".\"],dflt:\"\",arrayOk:!0,editType:\"style\"},fillmode:{valType:\"enumerated\",values:[\"replace\",\"overlay\"],dflt:\"replace\",editType:\"style\"},bgcolor:{valType:\"color\",arrayOk:!0,editType:\"style\"},fgcolor:{valType:\"color\",arrayOk:!0,editType:\"style\"},fgopacity:{valType:\"number\",editType:\"style\",min:0,max:1},size:{valType:\"number\",min:0,dflt:8,arrayOk:!0,editType:\"style\"},solidity:{valType:\"number\",min:0,max:1,dflt:.3,arrayOk:!0,editType:\"style\"},editType:\"style\"}},62203:function(t,e,r){\"use strict\";var n=r(45568),i=r(34809),a=i.numberFormat,o=r(10721),s=r(65657),l=r(33626),c=r(78766),u=r(88856),h=i.strTranslate,f=r(30635),p=r(62972),d=r(4530).LINE_SPACING,m=r(20438).DESELECTDIM,g=r(64726),y=r(92527),v=r(36040).appendArrayPointValue,x=t.exports={};function _(t){return\"none\"===t?void 0:t}x.font=function(t,e){var r=e.variant,n=e.style,i=e.weight,a=e.color,o=e.size,s=e.family,l=e.shadow,u=e.lineposition,h=e.textcase;s&&t.style(\"font-family\",s),o+1&&t.style(\"font-size\",o+\"px\"),a&&t.call(c.fill,a),i&&t.style(\"font-weight\",i),n&&t.style(\"font-style\",n),r&&t.style(\"font-variant\",r),h&&t.style(\"text-transform\",_(function(t){return b[t]}(h))),l&&t.style(\"text-shadow\",\"auto\"===l?f.makeTextShadow(c.contrast(a)):_(l)),u&&t.style(\"text-decoration-line\",_(function(t){return t.replace(\"under\",\"underline\").replace(\"over\",\"overline\").replace(\"through\",\"line-through\").split(\"+\").join(\" \")}(u)))};var b={normal:\"none\",lower:\"lowercase\",upper:\"uppercase\",\"word caps\":\"capitalize\"};function w(t,e,r,n){var i=e.fillpattern,a=e.fillgradient,o=i&&x.getPatternAttr(i.shape,0,\"\");if(o){var s=x.getPatternAttr(i.bgcolor,0,null),l=x.getPatternAttr(i.fgcolor,0,null),u=i.fgopacity,h=x.getPatternAttr(i.size,0,8),f=x.getPatternAttr(i.solidity,0,.3),p=e.uid;x.pattern(t,\"point\",r,p,o,h,f,void 0,i.fillmode,s,l,u)}else if(a&&\"none\"!==a.type){var d,m,g=a.type,y=\"scatterfill-\"+e.uid;n&&(y=\"legendfill-\"+e.uid),n||void 0===a.start&&void 0===a.stop?(\"horizontal\"===g&&(g+=\"reversed\"),t.call(x.gradient,r,y,g,a.colorscale,\"fill\")):(\"horizontal\"===g?(d={x:a.start,y:0},m={x:a.stop,y:0}):\"vertical\"===g&&(d={x:0,y:a.start},m={x:0,y:a.stop}),d.x=e._xA.c2p(void 0===d.x?e._extremes.x.min[0].val:d.x,!0),d.y=e._yA.c2p(void 0===d.y?e._extremes.y.min[0].val:d.y,!0),m.x=e._xA.c2p(void 0===m.x?e._extremes.x.max[0].val:m.x,!0),m.y=e._yA.c2p(void 0===m.y?e._extremes.y.max[0].val:m.y,!0),t.call(E,r,y,\"linear\",a.colorscale,\"fill\",d,m,!0,!1))}else e.fillcolor&&t.call(c.fill,e.fillcolor)}x.setPosition=function(t,e,r){t.attr(\"x\",e).attr(\"y\",r)},x.setSize=function(t,e,r){t.attr(\"width\",e).attr(\"height\",r)},x.setRect=function(t,e,r,n,i){t.call(x.setPosition,e,r).call(x.setSize,n,i)},x.translatePoint=function(t,e,r,n){var i=r.c2p(t.x),a=n.c2p(t.y);return!!(o(i)&&o(a)&&e.node())&&(\"text\"===e.node().nodeName?e.attr(\"x\",i).attr(\"y\",a):e.attr(\"transform\",h(i,a)),!0)},x.translatePoints=function(t,e,r){t.each((function(t){var i=n.select(this);x.translatePoint(t,i,e,r)}))},x.hideOutsideRangePoint=function(t,e,r,n,i,a){e.attr(\"display\",r.isPtWithinRange(t,i)&&n.isPtWithinRange(t,a)?null:\"none\")},x.hideOutsideRangePoints=function(t,e){if(e._hasClipOnAxisFalse){var r=e.xaxis,i=e.yaxis;t.each((function(e){var a=e[0].trace,o=a.xcalendar,s=a.ycalendar,c=l.traceIs(a,\"bar-like\")?\".bartext\":\".point,.textpoint\";t.selectAll(c).each((function(t){x.hideOutsideRangePoint(t,n.select(this),r,i,o,s)}))}))}},x.crispRound=function(t,e,r){return e&&o(e)?t._context.staticPlot?e:e<1?1:Math.round(e):r||0},x.singleLineStyle=function(t,e,r,n,i){e.style(\"fill\",\"none\");var a=(((t||[])[0]||{}).trace||{}).line||{},o=r||a.width||0,s=i||a.dash||\"\";c.stroke(e,n||a.color),x.dashLine(e,s,o)},x.lineGroupStyle=function(t,e,r,i){t.style(\"fill\",\"none\").each((function(t){var a=(((t||[])[0]||{}).trace||{}).line||{},o=e||a.width||0,s=i||a.dash||\"\";n.select(this).call(c.stroke,r||a.color).call(x.dashLine,s,o)}))},x.dashLine=function(t,e,r){r=+r||0,e=x.dashStyle(e,r),t.style({\"stroke-dasharray\":e,\"stroke-width\":r+\"px\"})},x.dashStyle=function(t,e){e=+e||1;var r=Math.max(e,3);return\"solid\"===t?t=\"\":\"dot\"===t?t=r+\"px,\"+r+\"px\":\"dash\"===t?t=3*r+\"px,\"+3*r+\"px\":\"longdash\"===t?t=5*r+\"px,\"+5*r+\"px\":\"dashdot\"===t?t=3*r+\"px,\"+r+\"px,\"+r+\"px,\"+r+\"px\":\"longdashdot\"===t&&(t=5*r+\"px,\"+2*r+\"px,\"+r+\"px,\"+2*r+\"px\"),t},x.singleFillStyle=function(t,e){var r=n.select(t.node());w(t,((r.data()[0]||[])[0]||{}).trace||{},e,!1)},x.fillGroupStyle=function(t,e,r){t.style(\"stroke-width\",0).each((function(t){var i=n.select(this);t[0].trace&&w(i,t[0].trace,e,r)}))};var T=r(38882);x.symbolNames=[],x.symbolFuncs=[],x.symbolBackOffs=[],x.symbolNeedLines={},x.symbolNoDot={},x.symbolNoFill={},x.symbolList=[],Object.keys(T).forEach((function(t){var e=T[t],r=e.n;x.symbolList.push(r,String(r),t,r+100,String(r+100),t+\"-open\"),x.symbolNames[r]=t,x.symbolFuncs[r]=e.f,x.symbolBackOffs[r]=e.backoff||0,e.needLine&&(x.symbolNeedLines[r]=!0),e.noDot?x.symbolNoDot[r]=!0:x.symbolList.push(r+200,String(r+200),t+\"-dot\",r+300,String(r+300),t+\"-open-dot\"),e.noFill&&(x.symbolNoFill[r]=!0)}));var k=x.symbolNames.length;function A(t,e,r,n){var i=t%100;return x.symbolFuncs[i](e,r,n)+(t>=200?\"M0,0.5L0.5,0L0,-0.5L-0.5,0Z\":\"\")}x.symbolNumber=function(t){if(o(t))t=+t;else if(\"string\"==typeof t){var e=0;t.indexOf(\"-open\")>0&&(e=100,t=t.replace(\"-open\",\"\")),t.indexOf(\"-dot\")>0&&(e+=200,t=t.replace(\"-dot\",\"\")),(t=x.symbolNames.indexOf(t))>=0&&(t+=e)}return t%100>=k||t>=400?0:Math.floor(Math.max(t,0))};var M=a(\"~f\"),S={radial:{type:\"radial\"},radialreversed:{type:\"radial\",reversed:!0},horizontal:{type:\"linear\",start:{x:1,y:0},stop:{x:0,y:0}},horizontalreversed:{type:\"linear\",start:{x:1,y:0},stop:{x:0,y:0},reversed:!0},vertical:{type:\"linear\",start:{x:0,y:1},stop:{x:0,y:0}},verticalreversed:{type:\"linear\",start:{x:0,y:1},stop:{x:0,y:0},reversed:!0}};function E(t,e,r,a,o,l,u,h,f,p){var d,m=o.length;\"linear\"===a?d={node:\"linearGradient\",attrs:{x1:u.x,y1:u.y,x2:h.x,y2:h.y,gradientUnits:f?\"userSpaceOnUse\":\"objectBoundingBox\"},reversed:p}:\"radial\"===a&&(d={node:\"radialGradient\",reversed:p});for(var g=new Array(m),y=0;y=0&&void 0===t.i&&(t.i=o.i),e.style(\"opacity\",n.selectedOpacityFn?n.selectedOpacityFn(t):void 0===t.mo?s.opacity:t.mo),n.ms2mrc){var u;u=\"various\"===t.ms||\"various\"===s.size?3:n.ms2mrc(t.ms),t.mrc=u,n.selectedSizeFn&&(u=t.mrc=n.selectedSizeFn(t));var h=x.symbolNumber(t.mx||s.symbol)||0;t.om=h%200>=100;var f=nt(t,r),p=Z(t,r);e.attr(\"d\",A(h,u,f,p))}var d,m,g,y=!1;if(t.so)g=l.outlierwidth,m=l.outliercolor,d=s.outliercolor;else{var v=(l||{}).width;g=(t.mlw+1||v+1||(t.trace?(t.trace.marker.line||{}).width:0)+1)-1||0,m=\"mlc\"in t?t.mlcc=n.lineScale(t.mlc):i.isArrayOrTypedArray(l.color)?c.defaultLine:l.color,i.isArrayOrTypedArray(s.color)&&(d=c.defaultLine,y=!0),d=\"mc\"in t?t.mcc=n.markerScale(t.mc):s.color||s.colors||\"rgba(0,0,0,0)\",n.selectedColorFn&&(d=n.selectedColorFn(t))}if(t.om)e.call(c.stroke,d).style({\"stroke-width\":(g||1)+\"px\",fill:\"none\"});else{e.style(\"stroke-width\",(t.isBlank?0:g)+\"px\");var _=s.gradient,b=t.mgt;b?y=!0:b=_&&_.type,i.isArrayOrTypedArray(b)&&(b=b[0],S[b]||(b=0));var w=s.pattern,T=w&&x.getPatternAttr(w.shape,t.i,\"\");if(b&&\"none\"!==b){var k=t.mgc;k?y=!0:k=_.color;var M=r.uid;y&&(M+=\"-\"+t.i),x.gradient(e,a,M,b,[[0,k],[1,d]],\"fill\")}else if(T){var E=!1,C=w.fgcolor;!C&&o&&o.color&&(C=o.color,E=!0);var L=x.getPatternAttr(C,t.i,o&&o.color||null),I=x.getPatternAttr(w.bgcolor,t.i,null),P=w.fgopacity,z=x.getPatternAttr(w.size,t.i,8),O=x.getPatternAttr(w.solidity,t.i,.3);E=E||t.mcc||i.isArrayOrTypedArray(w.shape)||i.isArrayOrTypedArray(w.bgcolor)||i.isArrayOrTypedArray(w.fgcolor)||i.isArrayOrTypedArray(w.size)||i.isArrayOrTypedArray(w.solidity);var D=r.uid;E&&(D+=\"-\"+t.i),x.pattern(e,\"point\",a,D,T,z,O,t.mcc,w.fillmode,I,L,P)}else i.isArrayOrTypedArray(d)?c.fill(e,d[t.i]):c.fill(e,d);g&&c.stroke(e,m)}},x.makePointStyleFns=function(t){var e={},r=t.marker;return e.markerScale=x.tryColorscale(r,\"\"),e.lineScale=x.tryColorscale(r,\"line\"),l.traceIs(t,\"symbols\")&&(e.ms2mrc=g.isBubble(t)?y(t):function(){return(r.size||6)/2}),t.selectedpoints&&i.extendFlat(e,x.makeSelectedPointStyleFns(t)),e},x.makeSelectedPointStyleFns=function(t){var e={},r=t.selected||{},n=t.unselected||{},a=t.marker||{},o=r.marker||{},s=n.marker||{},c=a.opacity,u=o.opacity,h=s.opacity,f=void 0!==u,p=void 0!==h;(i.isArrayOrTypedArray(c)||f||p)&&(e.selectedOpacityFn=function(t){var e=void 0===t.mo?a.opacity:t.mo;return t.selected?f?u:e:p?h:m*e});var d=a.color,g=o.color,y=s.color;(g||y)&&(e.selectedColorFn=function(t){var e=t.mcc||d;return t.selected?g||e:y||e});var v=a.size,x=o.size,_=s.size,b=void 0!==x,w=void 0!==_;return l.traceIs(t,\"symbols\")&&(b||w)&&(e.selectedSizeFn=function(t){var e=t.mrc||v/2;return t.selected?b?x/2:e:w?_/2:e}),e},x.makeSelectedTextStyleFns=function(t){var e={},r=t.selected||{},n=t.unselected||{},i=t.textfont||{},a=r.textfont||{},o=n.textfont||{},s=i.color,l=a.color,u=o.color;return e.selectedTextColorFn=function(t){var e=t.tc||s;return t.selected?l||e:u||(l?e:c.addOpacity(e,m))},e},x.selectedPointStyle=function(t,e){if(t.size()&&e.selectedpoints){var r=x.makeSelectedPointStyleFns(e),i=e.marker||{},a=[];r.selectedOpacityFn&&a.push((function(t,e){t.style(\"opacity\",r.selectedOpacityFn(e))})),r.selectedColorFn&&a.push((function(t,e){c.fill(t,r.selectedColorFn(e))})),r.selectedSizeFn&&a.push((function(t,n){var a=n.mx||i.symbol||0,o=r.selectedSizeFn(n);t.attr(\"d\",A(x.symbolNumber(a),o,nt(n,e),Z(n,e))),n.mrc2=o})),a.length&&t.each((function(t){for(var e=n.select(this),r=0;r0?r:0}function O(t,e,r){return r&&(t=j(t)),e?R(t[1]):D(t[0])}function D(t){var e=n.round(t,2);return C=e,e}function R(t){var e=n.round(t,2);return L=e,e}function F(t,e,r,n){var i=t[0]-e[0],a=t[1]-e[1],o=r[0]-e[0],s=r[1]-e[1],l=Math.pow(i*i+a*a,.25),c=Math.pow(o*o+s*s,.25),u=(c*c*i-l*l*o)*n,h=(c*c*a-l*l*s)*n,f=3*c*(l+c),p=3*l*(l+c);return[[D(e[0]+(f&&u/f)),R(e[1]+(f&&h/f))],[D(e[0]-(p&&u/p)),R(e[1]-(p&&h/p))]]}x.textPointStyle=function(t,e,r){if(t.size()){var a;if(e.selectedpoints){var o=x.makeSelectedTextStyleFns(e);a=o.selectedTextColorFn}var s=e.texttemplate,l=r._fullLayout;t.each((function(t){var o=n.select(this),c=s?i.extractOption(t,e,\"txt\",\"texttemplate\"):i.extractOption(t,e,\"tx\",\"text\");if(c||0===c){if(s){var u=e._module.formatLabels,h=u?u(t,e,l):{},p={};v(p,e,t.i);var d=e._meta||{};c=i.texttemplateString(c,h,l._d3locale,p,t,d)}var m=t.tp||e.textposition,g=z(t,e),y=a?a(t):t.tc||e.textfont.color;o.call(x.font,{family:t.tf||e.textfont.family,weight:t.tw||e.textfont.weight,style:t.ty||e.textfont.style,variant:t.tv||e.textfont.variant,textcase:t.tC||e.textfont.textcase,lineposition:t.tE||e.textfont.lineposition,shadow:t.tS||e.textfont.shadow,size:g,color:y}).text(c).call(f.convertToTspans,r).call(P,m,g,t.mrc)}else o.remove()}))}},x.selectedTextStyle=function(t,e){if(t.size()&&e.selectedpoints){var r=x.makeSelectedTextStyleFns(e);t.each((function(t){var i=n.select(this),a=r.selectedTextColorFn(t),o=t.tp||e.textposition,s=z(t,e);c.fill(i,a);var u=l.traceIs(e,\"bar-like\");P(i,o,s,t.mrc2||t.mrc,u)}))}},x.smoothopen=function(t,e){if(t.length<3)return\"M\"+t.join(\"L\");var r,n=\"M\"+t[0],i=[];for(r=1;r=c||w>=h&&w<=c)&&(T<=f&&T>=u||T>=f&&T<=u)&&(t=[w,T])}return t}x.steps=function(t){var e=B[t]||N;return function(t){for(var r=\"M\"+D(t[0][0])+\",\"+R(t[0][1]),n=t.length,i=1;i=1e4&&(x.savedBBoxes={},U=0),r&&(x.savedBBoxes[r]=g),U++,i.extendFlat({},g)},x.setClipUrl=function(t,e,r){t.attr(\"clip-path\",q(e,r))},x.getTranslate=function(t){var e=(t[t.attr?\"attr\":\"getAttribute\"](\"transform\")||\"\").replace(/.*\\btranslate\\((-?\\d*\\.?\\d*)[^-\\d]*(-?\\d*\\.?\\d*)[^\\d].*/,(function(t,e,r){return[e,r].join(\" \")})).split(\" \");return{x:+e[0]||0,y:+e[1]||0}},x.setTranslate=function(t,e,r){var n=t.attr?\"attr\":\"getAttribute\",i=t.attr?\"attr\":\"setAttribute\",a=t[n](\"transform\")||\"\";return e=e||0,r=r||0,a=a.replace(/(\\btranslate\\(.*?\\);?)/,\"\").trim(),a=(a+=h(e,r)).trim(),t[i](\"transform\",a),a},x.getScale=function(t){var e=(t[t.attr?\"attr\":\"getAttribute\"](\"transform\")||\"\").replace(/.*\\bscale\\((\\d*\\.?\\d*)[^\\d]*(\\d*\\.?\\d*)[^\\d].*/,(function(t,e,r){return[e,r].join(\" \")})).split(\" \");return{x:+e[0]||1,y:+e[1]||1}},x.setScale=function(t,e,r){var n=t.attr?\"attr\":\"getAttribute\",i=t.attr?\"attr\":\"setAttribute\",a=t[n](\"transform\")||\"\";return e=e||1,r=r||1,a=a.replace(/(\\bscale\\(.*?\\);?)/,\"\").trim(),a=(a+=\"scale(\"+e+\",\"+r+\")\").trim(),t[i](\"transform\",a),a};var H=/\\s*sc.*/;x.setPointGroupScale=function(t,e,r){if(e=e||1,r=r||1,t){var n=1===e&&1===r?\"\":\"scale(\"+e+\",\"+r+\")\";t.each((function(){var t=(this.getAttribute(\"transform\")||\"\").replace(H,\"\");t=(t+=n).trim(),this.setAttribute(\"transform\",t)}))}};var G=/translate\\([^)]*\\)\\s*$/;function Z(t,e){var r;return t&&(r=t.mf),void 0===r&&(r=e.marker&&e.marker.standoff||0),e._geo||e._xA?r:-r}x.setTextPointsScale=function(t,e,r){t&&t.each((function(){var t,i=n.select(this),a=i.select(\"text\");if(a.node()){var o=parseFloat(a.attr(\"x\")||0),s=parseFloat(a.attr(\"y\")||0),l=(i.attr(\"transform\")||\"\").match(G);t=1===e&&1===r?[]:[h(o,s),\"scale(\"+e+\",\"+r+\")\",h(-o,-s)],l&&t.push(l),i.attr(\"transform\",t.join(\"\"))}}))},x.getMarkerStandoff=Z;var W,Y,X,$,J,K,Q=Math.atan2,tt=Math.cos,et=Math.sin;function rt(t,e){var r=e[0],n=e[1];return[r*tt(t)-n*et(t),r*et(t)+n*tt(t)]}function nt(t,e){var r,n,a=t.ma;void 0===a&&((a=e.marker.angle)&&!i.isArrayOrTypedArray(a)||(a=0));var s=e.marker.angleref;if(\"previous\"===s||\"north\"===s){if(e._geo){var l=e._geo.project(t.lonlat);r=l[0],n=l[1]}else{var c=e._xA,u=e._yA;if(!c||!u)return 90;r=c.c2p(t.x),n=u.c2p(t.y)}if(e._geo){var h,f=t.lonlat[0],p=t.lonlat[1],d=e._geo.project([f,p+1e-5]),m=e._geo.project([f+1e-5,p]),g=Q(m[1]-n,m[0]-r),y=Q(d[1]-n,d[0]-r);if(\"north\"===s)h=a/180*Math.PI;else if(\"previous\"===s){var v=f/180*Math.PI,x=p/180*Math.PI,_=W/180*Math.PI,b=Y/180*Math.PI,w=_-v,T=tt(b)*et(w),k=et(b)*tt(x)-tt(b)*et(x)*tt(w);h=-Q(T,k)-Math.PI,W=f,Y=p}var A=rt(g,[tt(h),0]),M=rt(y,[et(h),0]);a=Q(A[1]+M[1],A[0]+M[0])/Math.PI*180,\"previous\"!==s||K===e.uid&&t.i===J+1||(a=null)}if(\"previous\"===s&&!e._geo)if(K===e.uid&&t.i===J+1&&o(r)&&o(n)){var S=r-X,E=n-$,C=e.line&&e.line.shape||\"\",L=C.slice(C.length-1);\"h\"===L&&(E=0),\"v\"===L&&(S=0),a+=Q(E,S)/Math.PI*180+90}else a=null}return X=r,$=n,J=t.i,K=e.uid,a}x.getMarkerAngle=nt},38882:function(t,e,r){\"use strict\";var n,i,a,o,s=r(26953),l=r(45568).round,c=\"M0,0Z\",u=Math.sqrt(2),h=Math.sqrt(3),f=Math.PI,p=Math.cos,d=Math.sin;function m(t){return null===t}function g(t,e,r){if(!(t&&t%360!=0||e))return r;if(a===t&&o===e&&n===r)return i;function l(t,r){var n=p(t),i=d(t),a=r[0],o=r[1]+(e||0);return[a*n-o*i,a*i+o*n]}a=t,o=e,n=r;for(var c=t/180*f,u=0,h=0,m=s(r),g=\"\",y=0;y0,h=t._context.staticPlot;e.each((function(e){var f,p=e[0].trace,d=p.error_x||{},m=p.error_y||{};p.ids&&(f=function(t){return t.id});var g=o.hasMarkers(p)&&p.marker.maxdisplayed>0;m.visible||d.visible||(e=[]);var y=n.select(this).selectAll(\"g.errorbar\").data(e,f);if(y.exit().remove(),e.length){d.visible||y.selectAll(\"path.xerror\").remove(),m.visible||y.selectAll(\"path.yerror\").remove(),y.style(\"opacity\",1);var v=y.enter().append(\"g\").classed(\"errorbar\",!0);u&&v.style(\"opacity\",0).transition().duration(s.duration).style(\"opacity\",1),a.setClipUrl(y,r.layerClipId,t),y.each((function(t){var e=n.select(this),r=function(t,e,r){var n={x:e.c2p(t.x),y:r.c2p(t.y)};return void 0!==t.yh&&(n.yh=r.c2p(t.yh),n.ys=r.c2p(t.ys),i(n.ys)||(n.noYS=!0,n.ys=r.c2p(t.ys,!0))),void 0!==t.xh&&(n.xh=e.c2p(t.xh),n.xs=e.c2p(t.xs),i(n.xs)||(n.noXS=!0,n.xs=e.c2p(t.xs,!0))),n}(t,l,c);if(!g||t.vis){var a,o=e.select(\"path.yerror\");if(m.visible&&i(r.x)&&i(r.yh)&&i(r.ys)){var f=m.width;a=\"M\"+(r.x-f)+\",\"+r.yh+\"h\"+2*f+\"m-\"+f+\",0V\"+r.ys,r.noYS||(a+=\"m-\"+f+\",0h\"+2*f),o.size()?u&&(o=o.transition().duration(s.duration).ease(s.easing)):o=e.append(\"path\").style(\"vector-effect\",h?\"none\":\"non-scaling-stroke\").classed(\"yerror\",!0),o.attr(\"d\",a)}else o.remove();var p=e.select(\"path.xerror\");if(d.visible&&i(r.y)&&i(r.xh)&&i(r.xs)){var y=(d.copy_ystyle?m:d).width;a=\"M\"+r.xh+\",\"+(r.y-y)+\"v\"+2*y+\"m0,-\"+y+\"H\"+r.xs,r.noXS||(a+=\"m0,-\"+y+\"v\"+2*y),p.size()?u&&(p=p.transition().duration(s.duration).ease(s.easing)):p=e.append(\"path\").style(\"vector-effect\",h?\"none\":\"non-scaling-stroke\").classed(\"xerror\",!0),p.attr(\"d\",a)}else p.remove()}}))}}))}},22800:function(t,e,r){\"use strict\";var n=r(45568),i=r(78766);t.exports=function(t){t.each((function(t){var e=t[0].trace,r=e.error_y||{},a=e.error_x||{},o=n.select(this);o.selectAll(\"path.yerror\").style(\"stroke-width\",r.thickness+\"px\").call(i.stroke,r.color),a.copy_ystyle&&(a=r),o.selectAll(\"path.xerror\").style(\"stroke-width\",a.thickness+\"px\").call(i.stroke,a.color)}))}},70192:function(t,e,r){\"use strict\";var n=r(80337),i=r(6811).hoverlabel,a=r(93049).extendFlat;t.exports={hoverlabel:{bgcolor:a({},i.bgcolor,{arrayOk:!0}),bordercolor:a({},i.bordercolor,{arrayOk:!0}),font:n({arrayOk:!0,editType:\"none\"}),align:a({},i.align,{arrayOk:!0}),namelength:a({},i.namelength,{arrayOk:!0}),editType:\"none\"}}},83552:function(t,e,r){\"use strict\";var n=r(34809),i=r(33626);function a(t,e,r,i){i=i||n.identity,Array.isArray(t)&&(e[0][r]=i(t))}t.exports=function(t){var e=t.calcdata,r=t._fullLayout;function o(t){return function(e){return n.coerceHoverinfo({hoverinfo:e},{_module:t._module},r)}}for(var s=0;s=0&&r.index$[0]._length||bt<0||bt>J[0]._length)return m.unhoverRaw(t,e)}else _t=\"xpx\"in e?e.xpx:$[0]._length/2,bt=\"ypx\"in e?e.ypx:J[0]._length/2;if(e.pointerX=_t+$[0]._offset,e.pointerY=bt+J[0]._offset,nt=\"xval\"in e?x.flat(_,e.xval):x.p2c($,_t),it=\"yval\"in e?x.flat(_,e.yval):x.p2c(J,bt),!i(nt[0])||!i(it[0]))return o.warn(\"Fx.hover failed\",e,t),m.unhoverRaw(t,e)}var At=1/0;function Mt(r,n){for(ot=0;otmt&&(gt.splice(0,mt),At=gt[0].distance),M&&0!==rt&&0===gt.length){dt.distance=rt,dt.index=!1;var u=lt._module.hoverPoints(dt,ft,pt,\"closest\",{hoverLayer:b._hoverlayer});if(u&&(u=u.filter((function(t){return t.spikeDistance<=rt}))),u&&u.length){var h,f=u.filter((function(t){return t.xa.showspikes&&\"hovered data\"!==t.xa.spikesnap}));if(f.length){var p=f[0];i(p.x0)&&i(p.y0)&&(h=Et(p),(!vt.vLinePoint||vt.vLinePoint.spikeDistance>h.spikeDistance)&&(vt.vLinePoint=h))}var m=u.filter((function(t){return t.ya.showspikes&&\"hovered data\"!==t.ya.spikesnap}));if(m.length){var g=m[0];i(g.x0)&&i(g.y0)&&(h=Et(g),(!vt.hLinePoint||vt.hLinePoint.spikeDistance>h.spikeDistance)&&(vt.hLinePoint=h))}}}}}function St(t,e,r){for(var n,i=null,a=1/0,o=0;o0&&Math.abs(t.distance)Nt-1;jt--)Ht(gt[jt]);gt=Ut,Pt()}var Gt=t._hoverdata,Zt=[],Wt=H(t),Yt=G(t);for(at=0;at1||gt.length>1)||\"closest\"===S&&xt&>.length>1,se=d.combine(b.plot_bgcolor||d.background,b.paper_bgcolor),le=D(gt,{gd:t,hovermode:S,rotateLabels:oe,bgColor:se,container:b._hoverlayer,outerContainer:b._paper.node(),commonLabelOpts:b.hoverlabel,hoverdistance:b.hoverdistance}),ce=le.hoverLabels;if(x.isUnifiedHover(S)||(function(t,e,r,n){var i,a,o,s,l,c,u,h=e?\"xa\":\"ya\",f=e?\"ya\":\"xa\",p=0,d=1,m=t.size(),g=new Array(m),y=0,v=n.minX,x=n.maxX,_=n.minY,b=n.maxY,w=function(t){return t*r._invScaleX},T=function(t){return t*r._invScaleY};function k(t){var e=t[0],r=t[t.length-1];if(a=e.pmin-e.pos-e.dp+e.size,o=r.pos+r.dp+r.size-e.pmax,a>.01){for(l=t.length-1;l>=0;l--)t[l].dp+=a;i=!1}if(!(o<.01)){if(a<-.01){for(l=t.length-1;l>=0;l--)t[l].dp-=o;i=!1}if(i){var n=0;for(s=0;se.pmax&&n++;for(s=t.length-1;s>=0&&!(n<=0);s--)(c=t[s]).pos>e.pmax-1&&(c.del=!0,n--);for(s=0;s=0;l--)t[l].dp-=o;for(s=t.length-1;s>=0&&!(n<=0);s--)(c=t[s]).pos+c.dp+c.size>e.pmax&&(c.del=!0,n--)}}}for(t.each((function(t){var n=t[h],i=t[f],a=\"x\"===n._id.charAt(0),o=n.range;0===y&&o&&o[0]>o[1]!==a&&(d=-1);var s=0,l=a?r.width:r.height;if(\"x\"===r.hovermode||\"y\"===r.hovermode){var c,u,p=F(t,e),m=t.anchor,k=\"end\"===m?-1:1;if(\"middle\"===m)u=(c=t.crossPos+(a?T(p.y-t.by/2):w(t.bx/2+t.tx2width/2)))+(a?T(t.by):w(t.bx));else if(a)u=(c=t.crossPos+T(E+p.y)-T(t.by/2-E))+T(t.by);else{var M=w(k*E+p.x),S=M+w(k*t.bx);c=t.crossPos+Math.min(M,S),u=t.crossPos+Math.max(M,S)}a?void 0!==_&&void 0!==b&&Math.min(u,b)-Math.max(c,_)>1&&(\"left\"===i.side?(s=i._mainLinePosition,l=r.width):l=i._mainLinePosition):void 0!==v&&void 0!==x&&Math.min(u,x)-Math.max(c,v)>1&&(\"top\"===i.side?(s=i._mainLinePosition,l=r.height):l=i._mainLinePosition)}g[y++]=[{datum:t,traceIndex:t.trace.index,dp:0,pos:t.pos,posref:t.posref,size:t.by*(a?A:1)/2,pmin:s,pmax:l}]})),g.sort((function(t,e){return t[0].posref-e[0].posref||d*(e[0].traceIndex-t[0].traceIndex)}));!i&&p<=m;){for(p++,i=!0,s=0;s.01){for(l=S.length-1;l>=0;l--)S[l].dp+=a;for(M.push.apply(M,S),g.splice(s+1,1),u=0,l=M.length-1;l>=0;l--)u+=M[l].dp;for(o=u/M.length,l=M.length-1;l>=0;l--)M[l].dp-=o;i=!1}else s++}g.forEach(k)}for(s=g.length-1;s>=0;s--){var I=g[s];for(l=I.length-1;l>=0;l--){var P=I[l],z=P.datum;z.offset=P.dp,z.del=P.del}}}(ce,oe,b,le.commonLabelBoundingBox),B(ce,oe,b._invScaleX,b._invScaleY)),l&&l.tagName){var ue=v.getComponentMethod(\"annotations\",\"hasClickToShow\")(t,Zt);f(n.select(l),ue?\"pointer\":\"\")}l&&!a&&function(t,e,r){if(!r||r.length!==t._hoverdata.length)return!0;for(var n=r.length-1;n>=0;n--){var i=r[n],a=t._hoverdata[n];if(i.curveNumber!==a.curveNumber||String(i.pointNumber)!==String(a.pointNumber)||String(i.pointNumbers)!==String(a.pointNumbers))return!0}return!1}(t,0,Gt)&&(Gt&&t.emit(\"plotly_unhover\",{event:e,points:Gt}),t.emit(\"plotly_hover\",{event:e,points:t._hoverdata,xaxes:$,yaxes:J,xvals:nt,yvals:it}))}(t,e,r,a,l)}))},e.loneHover=function(t,e){var r=!0;Array.isArray(t)||(r=!1,t=[t]);var i=e.gd,a=H(i),o=G(i),s=D(t.map((function(t){var r=t._x0||t.x0||t.x||0,n=t._x1||t.x1||t.x||0,s=t._y0||t.y0||t.y||0,l=t._y1||t.y1||t.y||0,c=t.eventData;if(c){var u=Math.min(r,n),h=Math.max(r,n),f=Math.min(s,l),p=Math.max(s,l),m=t.trace;if(v.traceIs(m,\"gl3d\")){var g=i._fullLayout[m.scene]._scene.container,y=g.offsetLeft,x=g.offsetTop;u+=y,h+=y,f+=x,p+=x}c.bbox={x0:u+o,x1:h+o,y0:f+a,y1:p+a},e.inOut_bbox&&e.inOut_bbox.push(c.bbox)}else c=!1;return{color:t.color||d.defaultLine,x0:t.x0||t.x||0,x1:t.x1||t.x||0,y0:t.y0||t.y||0,y1:t.y1||t.y||0,xLabel:t.xLabel,yLabel:t.yLabel,zLabel:t.zLabel,text:t.text,name:t.name,idealAlign:t.idealAlign,borderColor:t.borderColor,fontFamily:t.fontFamily,fontSize:t.fontSize,fontColor:t.fontColor,fontWeight:t.fontWeight,fontStyle:t.fontStyle,fontVariant:t.fontVariant,nameLength:t.nameLength,textAlign:t.textAlign,trace:t.trace||{index:0,hoverinfo:\"\"},xa:{_offset:0},ya:{_offset:0},index:0,hovertemplate:t.hovertemplate||!1,hovertemplateLabels:t.hovertemplateLabels||!1,eventData:c}})),{gd:i,hovermode:\"closest\",rotateLabels:!1,bgColor:e.bgColor||d.background,container:n.select(e.container),outerContainer:e.outerContainer||e.container}).hoverLabels,l=0,c=0;return s.sort((function(t,e){return t.y0-e.y0})).each((function(t,r){var n=t.y0-t.by/2;t.offset=n-5([\\s\\S]*)<\\/extra>/;function D(t,e){var r=e.gd,i=r._fullLayout,a=e.hovermode,s=e.rotateLabels,u=e.bgColor,f=e.container,m=e.outerContainer,g=e.commonLabelOpts||{};if(0===t.length)return[[]];var y=e.fontFamily||_.HOVERFONT,k=e.fontSize||_.HOVERFONTSIZE,A=e.fontWeight||i.font.weight,M=e.fontStyle||i.font.style,S=e.fontVariant||i.font.variant,L=e.fontTextcase||i.font.textcase,I=e.fontLineposition||i.font.lineposition,P=e.fontShadow||i.font.shadow,O=t[0],D=O.xa,F=O.ya,B=a.charAt(0),N=B+\"Label\",j=O[N];if(void 0===j&&\"multicategory\"===D.type)for(var U=0;Ui.width-T&&(z=i.width-T),e.attr(\"d\",\"M\"+(x-z)+\",0L\"+(x-z+E)+\",\"+w+E+\"H\"+T+\"v\"+w+(2*C+b.height)+\"H\"+-T+\"V\"+w+E+\"H\"+(x-z-E)+\"Z\"),x=z,Q.minX=x-T,Q.maxX=x+T,\"top\"===D.side?(Q.minY=_-(2*C+b.height),Q.maxY=_-C):(Q.minY=_+C,Q.maxY=_+(2*C+b.height))}else{var R,B,N;\"right\"===F.side?(R=\"start\",B=1,N=\"\",x=D._offset+D._length):(R=\"end\",B=-1,N=\"-\",x=D._offset),_=F._offset+(O.y0+O.y1)/2,s.attr(\"text-anchor\",R),e.attr(\"d\",\"M0,0L\"+N+E+\",\"+E+\"V\"+(C+b.height/2)+\"h\"+N+(2*C+b.width)+\"V-\"+(C+b.height/2)+\"H\"+N+E+\"V-\"+E+\"Z\"),Q.minY=_-(C+b.height/2),Q.maxY=_+(C+b.height/2),\"right\"===F.side?(Q.minX=x+E,Q.maxX=x+E+(2*C+b.width)):(Q.minX=x-E-(2*C+b.width),Q.maxX=x-E);var U,V=b.height/2,H=q-b.top-V,G=\"clip\"+i._uid+\"commonlabel\"+F._id;if(x=0?dt:mt+vt=0?mt:Mt+vt=0?ft:pt+xt=0?pt:St+xt=0,\"top\"!==t.idealAlign&&J||!K?J?(N+=V/2,t.anchor=\"start\"):t.anchor=\"middle\":(N-=V/2,t.anchor=\"end\"),t.crossPos=N;else{if(t.pos=N,J=B+U/2+Q<=H,K=B-U/2-Q>=0,\"left\"!==t.idealAlign&&J||!K)if(J)B+=U/2,t.anchor=\"start\";else{t.anchor=\"middle\";var tt=Q/2,et=B+tt-H,rt=B-tt;et>0&&(B-=et),rt<0&&(B+=-rt)}else B-=U/2,t.anchor=\"end\";t.crossPos=B}w.attr(\"text-anchor\",t.anchor),O&&z.attr(\"text-anchor\",t.anchor),e.attr(\"transform\",l(B,N)+(s?c(T):\"\"))})),{hoverLabels:Et,commonLabelBoundingBox:Q}}function R(t,e,r,n,i,a){var s=\"\",l=\"\";void 0!==t.nameOverride&&(t.name=t.nameOverride),t.name&&(t.trace._meta&&(t.name=o.templateString(t.name,t.trace._meta)),s=V(t.name,t.nameLength));var c=r.charAt(0),u=\"x\"===c?\"y\":\"x\";void 0!==t.zLabel?(void 0!==t.xLabel&&(l+=\"x: \"+t.xLabel+\"
\"),void 0!==t.yLabel&&(l+=\"y: \"+t.yLabel+\"
\"),\"choropleth\"!==t.trace.type&&\"choroplethmapbox\"!==t.trace.type&&\"choroplethmap\"!==t.trace.type&&(l+=(l?\"z: \":\"\")+t.zLabel)):e&&t[c+\"Label\"]===i?l=t[u+\"Label\"]||\"\":void 0===t.xLabel?void 0!==t.yLabel&&\"scattercarpet\"!==t.trace.type&&(l=t.yLabel):l=void 0===t.yLabel?t.xLabel:\"(\"+t.xLabel+\", \"+t.yLabel+\")\",!t.text&&0!==t.text||Array.isArray(t.text)||(l+=(l?\"
\":\"\")+t.text),void 0!==t.extraText&&(l+=(l?\"
\":\"\")+t.extraText),a&&\"\"===l&&!t.hovertemplate&&(\"\"===s&&a.remove(),l=s);var h=t.hovertemplate||!1;if(h){var f=t.hovertemplateLabels||t;t[c+\"Label\"]!==i&&(f[c+\"other\"]=f[c+\"Val\"],f[c+\"otherLabel\"]=f[c+\"Label\"]),l=(l=o.hovertemplateString(h,f,n._d3locale,t.eventData[0]||{},t.trace._meta)).replace(O,(function(e,r){return s=V(r,t.nameLength),\"\"}))}return[l,s]}function F(t,e){var r=0,n=t.offset;return e&&(n*=-S,r=t.offset*M),{x:r,y:n}}function B(t,e,r,i){var a=function(t){return t*r},o=function(t){return t*i};t.each((function(t){var r=n.select(this);if(t.del)return r.remove();var i,s,l,c,u=r.select(\"text.nums\"),f=t.anchor,d=\"end\"===f?-1:1,m=(c=(l=(s={start:1,end:-1,middle:0}[(i=t).anchor])*(E+C))+s*(i.txwidth+C),\"middle\"===i.anchor&&(l-=i.tx2width/2,c+=i.txwidth/2+C),{alignShift:s,textShiftX:l,text2ShiftX:c}),g=F(t,e),y=g.x,v=g.y,x=\"middle\"===f;r.select(\"path\").attr(\"d\",x?\"M-\"+a(t.bx/2+t.tx2width/2)+\",\"+o(v-t.by/2)+\"h\"+a(t.bx)+\"v\"+o(t.by)+\"h-\"+a(t.bx)+\"Z\":\"M0,0L\"+a(d*E+y)+\",\"+o(E+v)+\"v\"+o(t.by/2-E)+\"h\"+a(d*t.bx)+\"v-\"+o(t.by)+\"H\"+a(d*E+y)+\"V\"+o(v-E)+\"Z\");var _=y+m.textShiftX,b=v+t.ty0-t.by/2+C,w=t.textAlign||\"auto\";\"auto\"!==w&&(\"left\"===w&&\"start\"!==f?(u.attr(\"text-anchor\",\"start\"),_=x?-t.bx/2-t.tx2width/2+C:-t.bx-C):\"right\"===w&&\"end\"!==f&&(u.attr(\"text-anchor\",\"end\"),_=x?t.bx/2-t.tx2width/2-C:t.bx+C)),u.call(h.positionText,a(_),o(b)),t.tx2width&&(r.select(\"text.name\").call(h.positionText,a(m.text2ShiftX+m.alignShift*C+y),o(v+t.ty0-t.by/2+C)),r.select(\"rect\").call(p.setRect,a(m.text2ShiftX+(m.alignShift-1)*t.tx2width/2+y),o(v-t.by/2-1),a(t.tx2width),o(t.by+2)))}))}function N(t,e){var r=t.index,n=t.trace||{},a=t.cd[0],s=t.cd[r]||{};function l(t){return t||i(t)&&0===t}var c=Array.isArray(r)?function(t,e){var i=o.castOption(a,r,t);return l(i)?i:o.extractOption({},n,\"\",e)}:function(t,e){return o.extractOption(s,n,t,e)};function u(e,r,n){var i=c(r,n);l(i)&&(t[e]=i)}if(u(\"hoverinfo\",\"hi\",\"hoverinfo\"),u(\"bgcolor\",\"hbg\",\"hoverlabel.bgcolor\"),u(\"borderColor\",\"hbc\",\"hoverlabel.bordercolor\"),u(\"fontFamily\",\"htf\",\"hoverlabel.font.family\"),u(\"fontSize\",\"hts\",\"hoverlabel.font.size\"),u(\"fontColor\",\"htc\",\"hoverlabel.font.color\"),u(\"fontWeight\",\"htw\",\"hoverlabel.font.weight\"),u(\"fontStyle\",\"hty\",\"hoverlabel.font.style\"),u(\"fontVariant\",\"htv\",\"hoverlabel.font.variant\"),u(\"nameLength\",\"hnl\",\"hoverlabel.namelength\"),u(\"textAlign\",\"hta\",\"hoverlabel.align\"),t.posref=\"y\"===e||\"closest\"===e&&\"h\"===n.orientation?t.xa._offset+(t.x0+t.x1)/2:t.ya._offset+(t.y0+t.y1)/2,t.x0=o.constrain(t.x0,0,t.xa._length),t.x1=o.constrain(t.x1,0,t.xa._length),t.y0=o.constrain(t.y0,0,t.ya._length),t.y1=o.constrain(t.y1,0,t.ya._length),void 0!==t.xLabelVal&&(t.xLabel=\"xLabel\"in t?t.xLabel:g.hoverLabelText(t.xa,t.xLabelVal,n.xhoverformat),t.xVal=t.xa.c2d(t.xLabelVal)),void 0!==t.yLabelVal&&(t.yLabel=\"yLabel\"in t?t.yLabel:g.hoverLabelText(t.ya,t.yLabelVal,n.yhoverformat),t.yVal=t.ya.c2d(t.yLabelVal)),void 0!==t.zLabelVal&&void 0===t.zLabel&&(t.zLabel=String(t.zLabelVal)),!(isNaN(t.xerr)||\"log\"===t.xa.type&&t.xerr<=0)){var h=g.tickText(t.xa,t.xa.c2l(t.xerr),\"hover\").text;void 0!==t.xerrneg?t.xLabel+=\" +\"+h+\" / -\"+g.tickText(t.xa,t.xa.c2l(t.xerrneg),\"hover\").text:t.xLabel+=\" ± \"+h,\"x\"===e&&(t.distance+=1)}if(!(isNaN(t.yerr)||\"log\"===t.ya.type&&t.yerr<=0)){var f=g.tickText(t.ya,t.ya.c2l(t.yerr),\"hover\").text;void 0!==t.yerrneg?t.yLabel+=\" +\"+f+\" / -\"+g.tickText(t.ya,t.ya.c2l(t.yerrneg),\"hover\").text:t.yLabel+=\" ± \"+f,\"y\"===e&&(t.distance+=1)}var p=t.hoverinfo||t.trace.hoverinfo;return p&&\"all\"!==p&&(-1===(p=Array.isArray(p)?p:p.split(\"+\")).indexOf(\"x\")&&(t.xLabel=void 0),-1===p.indexOf(\"y\")&&(t.yLabel=void 0),-1===p.indexOf(\"z\")&&(t.zLabel=void 0),-1===p.indexOf(\"text\")&&(t.text=void 0),-1===p.indexOf(\"name\")&&(t.name=void 0)),t}function j(t,e,r){var n,i,o=r.container,s=r.fullLayout,l=s._size,c=r.event,u=!!e.hLinePoint,h=!!e.vLinePoint;if(o.selectAll(\".spikeline\").remove(),h||u){var f=d.combine(s.plot_bgcolor,s.paper_bgcolor);if(u){var m,y,v=e.hLinePoint;n=v&&v.xa,\"cursor\"===(i=v&&v.ya).spikesnap?(m=c.pointerX,y=c.pointerY):(m=n._offset+v.x,y=i._offset+v.y);var x,_,b=a.readability(v.color,f)<1.5?d.contrast(f):v.color,w=i.spikemode,T=i.spikethickness,k=i.spikecolor||b,A=g.getPxPosition(t,i);if(-1!==w.indexOf(\"toaxis\")||-1!==w.indexOf(\"across\")){if(-1!==w.indexOf(\"toaxis\")&&(x=A,_=m),-1!==w.indexOf(\"across\")){var M=i._counterDomainMin,S=i._counterDomainMax;\"free\"===i.anchor&&(M=Math.min(M,i.position),S=Math.max(S,i.position)),x=l.l+M*l.w,_=l.l+S*l.w}o.insert(\"line\",\":first-child\").attr({x1:x,x2:_,y1:y,y2:y,\"stroke-width\":T,stroke:k,\"stroke-dasharray\":p.dashStyle(i.spikedash,T)}).classed(\"spikeline\",!0).classed(\"crisp\",!0),o.insert(\"line\",\":first-child\").attr({x1:x,x2:_,y1:y,y2:y,\"stroke-width\":T+2,stroke:f}).classed(\"spikeline\",!0).classed(\"crisp\",!0)}-1!==w.indexOf(\"marker\")&&o.insert(\"circle\",\":first-child\").attr({cx:A+(\"right\"!==i.side?T:-T),cy:y,r:T,fill:k}).classed(\"spikeline\",!0)}if(h){var E,C,L=e.vLinePoint;n=L&&L.xa,i=L&&L.ya,\"cursor\"===n.spikesnap?(E=c.pointerX,C=c.pointerY):(E=n._offset+L.x,C=i._offset+L.y);var I,P,z=a.readability(L.color,f)<1.5?d.contrast(f):L.color,O=n.spikemode,D=n.spikethickness,R=n.spikecolor||z,F=g.getPxPosition(t,n);if(-1!==O.indexOf(\"toaxis\")||-1!==O.indexOf(\"across\")){if(-1!==O.indexOf(\"toaxis\")&&(I=F,P=C),-1!==O.indexOf(\"across\")){var B=n._counterDomainMin,N=n._counterDomainMax;\"free\"===n.anchor&&(B=Math.min(B,n.position),N=Math.max(N,n.position)),I=l.t+(1-N)*l.h,P=l.t+(1-B)*l.h}o.insert(\"line\",\":first-child\").attr({x1:E,x2:E,y1:I,y2:P,\"stroke-width\":D,stroke:R,\"stroke-dasharray\":p.dashStyle(n.spikedash,D)}).classed(\"spikeline\",!0).classed(\"crisp\",!0),o.insert(\"line\",\":first-child\").attr({x1:E,x2:E,y1:I,y2:P,\"stroke-width\":D+2,stroke:f}).classed(\"spikeline\",!0).classed(\"crisp\",!0)}-1!==O.indexOf(\"marker\")&&o.insert(\"circle\",\":first-child\").attr({cx:E,cy:F-(\"top\"!==n.side?D:-D),r:D,fill:R}).classed(\"spikeline\",!0)}}}function U(t,e){return!e||e.vLinePoint!==t._spikepoints.vLinePoint||e.hLinePoint!==t._spikepoints.hLinePoint}function V(t,e){return h.plainText(t||\"\",{len:e,allowedTags:[\"br\",\"sub\",\"sup\",\"b\",\"i\",\"em\",\"s\",\"u\"]})}function q(t,e,r){var n=e[t+\"a\"],i=e[t+\"Val\"],a=e.cd[0];if(\"category\"===n.type||\"multicategory\"===n.type)i=n._categoriesMap[i];else if(\"date\"===n.type){var o=e.trace[t+\"periodalignment\"];if(o){var s=e.cd[e.index],l=s[t+\"Start\"];void 0===l&&(l=s[t]);var c=s[t+\"End\"];void 0===c&&(c=s[t]);var u=c-l;\"end\"===o?i+=u:\"middle\"===o&&(i+=u/2)}i=n.d2c(i)}return a&&a.t&&a.t.posLetter===n._id&&(\"group\"!==r.boxmode&&\"group\"!==r.violinmode||(i+=a.t.dPos)),i}function H(t){return t.offsetTop+t.clientTop}function G(t){return t.offsetLeft+t.clientLeft}function Z(t,e){var r=t._fullLayout,n=e.getBoundingClientRect(),i=n.left,a=n.top,s=i+n.width,l=a+n.height,c=o.apply3DTransform(r._invTransform)(i,a),u=o.apply3DTransform(r._invTransform)(s,l),h=c[0],f=c[1],p=u[0],d=u[1];return{x:h,y:f,width:p-h,height:d-f,top:Math.min(f,d),left:Math.min(h,p),right:Math.max(h,p),bottom:Math.max(f,d)}}},26430:function(t,e,r){\"use strict\";var n=r(34809),i=r(78766),a=r(36040).isUnifiedHover;t.exports=function(t,e,r,o){o=o||{};var s=e.legend;function l(t){o.font[t]||(o.font[t]=s?e.legend.font[t]:e.font[t])}e&&a(e.hovermode)&&(o.font||(o.font={}),l(\"size\"),l(\"family\"),l(\"color\"),l(\"weight\"),l(\"style\"),l(\"variant\"),s?(o.bgcolor||(o.bgcolor=i.combine(e.legend.bgcolor,e.paper_bgcolor)),o.bordercolor||(o.bordercolor=e.legend.bordercolor)):o.bgcolor||(o.bgcolor=e.paper_bgcolor)),r(\"hoverlabel.bgcolor\",o.bgcolor),r(\"hoverlabel.bordercolor\",o.bordercolor),r(\"hoverlabel.namelength\",o.namelength),n.coerceFont(r,\"hoverlabel.font\",o.font),r(\"hoverlabel.align\",o.align)}},45265:function(t,e,r){\"use strict\";var n=r(34809),i=r(6811);t.exports=function(t,e){function r(r,a){return void 0!==e[r]?e[r]:n.coerce(t,e,i,r,a)}return r(\"clickmode\"),r(\"hoversubplots\"),r(\"hovermode\")}},32141:function(t,e,r){\"use strict\";var n=r(45568),i=r(34809),a=r(14751),o=r(36040),s=r(6811),l=r(38103);t.exports={moduleType:\"component\",name:\"fx\",constants:r(85988),schema:{layout:s},attributes:r(70192),layoutAttributes:s,supplyLayoutGlobalDefaults:r(5358),supplyDefaults:r(3239),supplyLayoutDefaults:r(8412),calc:r(83552),getDistanceFunction:o.getDistanceFunction,getClosest:o.getClosest,inbox:o.inbox,quadrature:o.quadrature,appendArrayPointValue:o.appendArrayPointValue,castHoverOption:function(t,e,r){return i.castOption(t,e,\"hoverlabel.\"+r)},castHoverinfo:function(t,e,r){return i.castOption(t,r,\"hoverinfo\",(function(r){return i.coerceHoverinfo({hoverinfo:r},{_module:t._module},e)}))},hover:l.hover,unhover:a.unhover,loneHover:l.loneHover,loneUnhover:function(t){var e=i.isD3Selection(t)?t:n.select(t);e.selectAll(\"g.hovertext\").remove(),e.selectAll(\".spikeline\").remove()},click:r(94225)}},6811:function(t,e,r){\"use strict\";var n=r(85988),i=r(80337),a=i({editType:\"none\"});a.family.dflt=n.HOVERFONT,a.size.dflt=n.HOVERFONTSIZE,t.exports={clickmode:{valType:\"flaglist\",flags:[\"event\",\"select\"],dflt:\"event\",editType:\"plot\",extras:[\"none\"]},dragmode:{valType:\"enumerated\",values:[\"zoom\",\"pan\",\"select\",\"lasso\",\"drawclosedpath\",\"drawopenpath\",\"drawline\",\"drawrect\",\"drawcircle\",\"orbit\",\"turntable\",!1],dflt:\"zoom\",editType:\"modebar\"},hovermode:{valType:\"enumerated\",values:[\"x\",\"y\",\"closest\",!1,\"x unified\",\"y unified\"],dflt:\"closest\",editType:\"modebar\"},hoversubplots:{valType:\"enumerated\",values:[\"single\",\"overlaying\",\"axis\"],dflt:\"overlaying\",editType:\"none\"},hoverdistance:{valType:\"integer\",min:-1,dflt:20,editType:\"none\"},spikedistance:{valType:\"integer\",min:-1,dflt:-1,editType:\"none\"},hoverlabel:{bgcolor:{valType:\"color\",editType:\"none\"},bordercolor:{valType:\"color\",editType:\"none\"},font:a,grouptitlefont:i({editType:\"none\"}),align:{valType:\"enumerated\",values:[\"left\",\"right\",\"auto\"],dflt:\"auto\",editType:\"none\"},namelength:{valType:\"integer\",min:-1,dflt:15,editType:\"none\"},editType:\"none\"},selectdirection:{valType:\"enumerated\",values:[\"h\",\"v\",\"d\",\"any\"],dflt:\"any\",editType:\"none\"}}},8412:function(t,e,r){\"use strict\";var n=r(34809),i=r(6811),a=r(45265),o=r(26430);t.exports=function(t,e){function r(r,a){return n.coerce(t,e,i,r,a)}a(t,e)&&(r(\"hoverdistance\"),r(\"spikedistance\")),\"select\"===r(\"dragmode\")&&r(\"selectdirection\");var s=e._has(\"mapbox\"),l=e._has(\"map\"),c=e._has(\"geo\"),u=e._basePlotModules.length;\"zoom\"===e.dragmode&&((s||l||c)&&1===u||(s||l)&&c&&2===u)&&(e.dragmode=\"pan\"),o(t,e,r),n.coerceFont(r,\"hoverlabel.grouptitlefont\",e.hoverlabel.font)}},5358:function(t,e,r){\"use strict\";var n=r(34809),i=r(26430),a=r(6811);t.exports=function(t,e){i(t,e,(function(r,i){return n.coerce(t,e,a,r,i)}))}},83595:function(t,e,r){\"use strict\";var n=r(34809),i=r(90694).counter,a=r(13792).u,o=r(54826).idRegex,s=r(78032),l={rows:{valType:\"integer\",min:1,editType:\"plot\"},roworder:{valType:\"enumerated\",values:[\"top to bottom\",\"bottom to top\"],dflt:\"top to bottom\",editType:\"plot\"},columns:{valType:\"integer\",min:1,editType:\"plot\"},subplots:{valType:\"info_array\",freeLength:!0,dimensions:2,items:{valType:\"enumerated\",values:[i(\"xy\").toString(),\"\"],editType:\"plot\"},editType:\"plot\"},xaxes:{valType:\"info_array\",freeLength:!0,items:{valType:\"enumerated\",values:[o.x.toString(),\"\"],editType:\"plot\"},editType:\"plot\"},yaxes:{valType:\"info_array\",freeLength:!0,items:{valType:\"enumerated\",values:[o.y.toString(),\"\"],editType:\"plot\"},editType:\"plot\"},pattern:{valType:\"enumerated\",values:[\"independent\",\"coupled\"],dflt:\"coupled\",editType:\"plot\"},xgap:{valType:\"number\",min:0,max:1,editType:\"plot\"},ygap:{valType:\"number\",min:0,max:1,editType:\"plot\"},domain:a({name:\"grid\",editType:\"plot\",noGridCell:!0},{}),xside:{valType:\"enumerated\",values:[\"bottom\",\"bottom plot\",\"top plot\",\"top\"],dflt:\"bottom plot\",editType:\"plot\"},yside:{valType:\"enumerated\",values:[\"left\",\"left plot\",\"right plot\",\"right\"],dflt:\"left plot\",editType:\"plot\"},editType:\"plot\"};function c(t,e,r){var n=e[r+\"axes\"],i=Object.keys((t._splomAxes||{})[r]||{});return Array.isArray(n)?n:i.length?i:void 0}function u(t,e,r,n,i,a){var o=e(t+\"gap\",r),s=e(\"domain.\"+t);e(t+\"side\",n);for(var l=new Array(i),c=s[0],u=(s[1]-c)/(i-o),h=u*(1-o),f=0;f1){f||p||d||\"independent\"===k(\"pattern\")&&(f=!0),g._hasSubplotGrid=f;var x,_,b=\"top to bottom\"===k(\"roworder\"),w=f?.2:.1,T=f?.3:.1;m&&e._splomGridDflt&&(x=e._splomGridDflt.xside,_=e._splomGridDflt.yside),g._domains={x:u(\"x\",k,w,x,v),y:u(\"y\",k,T,_,y,b)}}else delete e.grid}function k(t,e){return n.coerce(r,g,l,t,e)}},contentDefaults:function(t,e){var r=e.grid;if(r&&r._domains){var n,i,a,o,s,l,u,f=t.grid||{},p=e._subplots,d=r._hasSubplotGrid,m=r.rows,g=r.columns,y=\"independent\"===r.pattern,v=r._axisMap={};if(d){var x=f.subplots||[];l=r.subplots=new Array(m);var _=1;for(n=0;n(\"legend\"===t?1:0));if(!1===M&&(r[t]=void 0),(!1!==M||h.uirevision)&&(p(\"uirevision\",r.uirevision),!1!==M)){p(\"borderwidth\");var S,E,C,L=\"h\"===p(\"orientation\"),I=\"paper\"===p(\"yref\"),P=\"paper\"===p(\"xref\"),z=\"left\";if(L?(S=0,n.getComponentMethod(\"rangeslider\",\"isVisible\")(e.xaxis)?I?(E=1.1,C=\"bottom\"):(E=1,C=\"top\"):I?(E=-.1,C=\"top\"):(E=0,C=\"bottom\")):(E=1,C=\"auto\",P?S=1.02:(S=1,z=\"right\")),i.coerce(h,f,{x:{valType:\"number\",editType:\"legend\",min:P?-2:0,max:P?3:1,dflt:S}},\"x\"),i.coerce(h,f,{y:{valType:\"number\",editType:\"legend\",min:I?-2:0,max:I?3:1,dflt:E}},\"y\"),p(\"traceorder\",b),c.isGrouped(r[t])&&p(\"tracegroupgap\"),p(\"entrywidth\"),p(\"entrywidthmode\"),p(\"indentation\"),p(\"itemsizing\"),p(\"itemwidth\"),p(\"itemclick\"),p(\"itemdoubleclick\"),p(\"groupclick\"),p(\"xanchor\",z),p(\"yanchor\",C),p(\"valign\"),i.noneOrAll(h,f,[\"x\",\"y\"]),p(\"title.text\")){p(\"title.side\",L?\"left\":\"top\");var O=i.extendFlat({},d,{size:i.bigFont(d.size)});i.coerceFont(p,\"title.font\",O)}}}}t.exports=function(t,e,r){var n,a=r.slice(),o=e.shapes;if(o)for(n=0;n1)}var B=d.hiddenlabels||[];if(!(T||d.showlegend&&S.length))return s.selectAll(\".\"+w).remove(),d._topdefs.select(\"#\"+r).remove(),a.autoMargin(t,w);var N=i.ensureSingle(s,\"g\",w,(function(t){T||t.attr(\"pointer-events\",\"all\")})),j=i.ensureSingleById(d._topdefs,\"clipPath\",r,(function(t){t.append(\"rect\")})),U=i.ensureSingle(N,\"rect\",\"bg\",(function(t){t.attr(\"shape-rendering\",\"crispEdges\")}));U.call(u.stroke,f.bordercolor).call(u.fill,f.bgcolor).style(\"stroke-width\",f.borderwidth+\"px\");var V,q=i.ensureSingle(N,\"g\",\"scrollbox\"),H=f.title;f._titleWidth=0,f._titleHeight=0,H.text?((V=i.ensureSingle(q,\"text\",w+\"titletext\")).attr(\"text-anchor\",\"start\").call(c.font,H.font).text(H.text),C(V,q,t,f,b)):q.selectAll(\".\"+w+\"titletext\").remove();var G=i.ensureSingle(N,\"rect\",\"scrollbar\",(function(t){t.attr(p.scrollBarEnterAttrs).call(u.fill,p.scrollBarColor)})),Z=q.selectAll(\"g.groups\").data(S);Z.enter().append(\"g\").attr(\"class\",\"groups\"),Z.exit().remove();var W=Z.selectAll(\"g.traces\").data(i.identity);W.enter().append(\"g\").attr(\"class\",\"traces\"),W.exit().remove(),W.style(\"opacity\",(function(t){var e=t[0].trace;return o.traceIs(e,\"pie-like\")?-1!==B.indexOf(t[0].label)?.5:1:\"legendonly\"===e.visible?.5:1})).each((function(){n.select(this).call(M,t,f)})).call(x,t,f).each((function(){T||n.select(this).call(E,t,w)})),i.syncOrAsync([a.previousPromises,function(){return function(t,e,r,i){var a=t._fullLayout,o=P(i);i||(i=a[o]);var s=a._size,l=_.isVertical(i),u=_.isGrouped(i),h=\"fraction\"===i.entrywidthmode,f=i.borderwidth,d=2*f,m=p.itemGap,g=i.indentation+i.itemwidth+2*m,y=2*(f+m),v=I(i),x=i.y<0||0===i.y&&\"top\"===v,b=i.y>1||1===i.y&&\"bottom\"===v,w=i.tracegroupgap,T={};i._maxHeight=Math.max(x||b?a.height/2:s.h,30);var A=0;i._width=0,i._height=0;var M=function(t){var e=0,r=0,n=t.title.side;return n&&(-1!==n.indexOf(\"left\")&&(e=t._titleWidth),-1!==n.indexOf(\"top\")&&(r=t._titleHeight)),[e,r]}(i);if(l)r.each((function(t){var e=t[0].height;c.setTranslate(this,f+M[0],f+M[1]+i._height+e/2+m),i._height+=e,i._width=Math.max(i._width,t[0].width)})),A=g+i._width,i._width+=m+g+d,i._height+=y,u&&(e.each((function(t,e){c.setTranslate(this,0,e*i.tracegroupgap)})),i._height+=(i._lgroupsLength-1)*i.tracegroupgap);else{var S=L(i),E=i.x<0||0===i.x&&\"right\"===S,C=i.x>1||1===i.x&&\"left\"===S,z=b||x,O=a.width/2;i._maxWidth=Math.max(E?z&&\"left\"===S?s.l+s.w:O:C?z&&\"right\"===S?s.r+s.w:O:s.w,2*g);var D=0,R=0;r.each((function(t){var e=k(t,i,g);D=Math.max(D,e),R+=e})),A=null;var F=0;if(u){var B=0,N=0,j=0;e.each((function(){var t=0,e=0;n.select(this).selectAll(\"g.traces\").each((function(r){var n=k(r,i,g),a=r[0].height;c.setTranslate(this,M[0],M[1]+f+m+a/2+e),e+=a,t=Math.max(t,n),T[r[0].trace.legendgroup]=t}));var r=t+m;N>0&&r+f+N>i._maxWidth?(F=Math.max(F,N),N=0,j+=B+w,B=e):B=Math.max(B,e),c.setTranslate(this,N,j),N+=r})),i._width=Math.max(F,N)+f,i._height=j+B+y}else{var U=r.size(),V=R+d+(U-1)*m=i._maxWidth&&(F=Math.max(F,Z),H=0,G+=q,i._height+=q,q=0),c.setTranslate(this,M[0]+f+H,M[1]+f+G+e/2+m),Z=H+r+m,H+=n,q=Math.max(q,e)})),V?(i._width=H+d,i._height=q+y):(i._width=Math.max(F,Z)+d,i._height+=q+y)}}i._width=Math.ceil(Math.max(i._width+M[0],i._titleWidth+2*(f+p.titlePad))),i._height=Math.ceil(Math.max(i._height+M[1],i._titleHeight+2*(f+p.itemGap))),i._effHeight=Math.min(i._height,i._maxHeight);var W=t._context.edits,Y=W.legendText||W.legendPosition;r.each((function(t){var e=n.select(this).select(\".\"+o+\"toggle\"),r=t[0].height,a=t[0].trace.legendgroup,s=k(t,i,g);u&&\"\"!==a&&(s=T[a]);var f=Y?g:A||s;l||h||(f+=m/2),c.setRect(e,0,-r/2,f,r)}))}(t,Z,W,f)},function(){var e,u,v,x,_=d._size,b=f.borderwidth,k=\"paper\"===f.xref,M=\"paper\"===f.yref;if(H.text&&function(t,e,r){if(\"top center\"===e.title.side||\"top right\"===e.title.side){var n=e.title.font.size*m,i=0,a=t.node(),o=c.bBox(a).width;\"top center\"===e.title.side?i=.5*(e._width-2*r-2*p.titlePad-o):\"top right\"===e.title.side&&(i=e._width-2*r-2*p.titlePad-o),h.positionText(t,r+p.titlePad+i,r+n)}}(V,f,b),!T){var S,E;S=k?_.l+_.w*f.x-g[L(f)]*f._width:d.width*f.x-g[L(f)]*f._width,E=M?_.t+_.h*(1-f.y)-g[I(f)]*f._effHeight:d.height*(1-f.y)-g[I(f)]*f._effHeight;var C=function(t,e,r,n){var i=t._fullLayout,o=i[e],s=L(o),l=I(o),c=\"paper\"===o.xref,u=\"paper\"===o.yref;t._fullLayout._reservedMargin[e]={};var h=o.y<.5?\"b\":\"t\",f=o.x<.5?\"l\":\"r\",p={r:i.width-r,l:r+o._width,b:i.height-n,t:n+o._effHeight};if(c&&u)return a.autoMargin(t,e,{x:o.x,y:o.y,l:o._width*g[s],r:o._width*y[s],b:o._effHeight*y[l],t:o._effHeight*g[l]});c?t._fullLayout._reservedMargin[e][h]=p[h]:u||\"v\"===o.orientation?t._fullLayout._reservedMargin[e][f]=p[f]:t._fullLayout._reservedMargin[e][h]=p[h]}(t,w,S,E);if(C)return;if(d.margin.autoexpand){var P=S,z=E;S=k?i.constrain(S,0,d.width-f._width):P,E=M?i.constrain(E,0,d.height-f._effHeight):z,S!==P&&i.log(\"Constrain \"+w+\".x to make legend fit inside graph\"),E!==z&&i.log(\"Constrain \"+w+\".y to make legend fit inside graph\")}c.setTranslate(N,S,E)}if(G.on(\".drag\",null),N.on(\"wheel\",null),T||f._height<=f._maxHeight||t._context.staticPlot){var O=f._effHeight;T&&(O=f._height),U.attr({width:f._width-b,height:O-b,x:b/2,y:b/2}),c.setTranslate(q,0,0),j.select(\"rect\").attr({width:f._width-2*b,height:O-2*b,x:b,y:b}),c.setClipUrl(q,r,t),c.setRect(G,0,0,0,0),delete f._scrollY}else{var D,R,F,B=Math.max(p.scrollBarMinHeight,f._effHeight*f._effHeight/f._height),Z=f._effHeight-B-2*p.scrollBarMargin,W=f._height-f._effHeight,Y=Z/W,X=Math.min(f._scrollY||0,W);U.attr({width:f._width-2*b+p.scrollBarWidth+p.scrollBarMargin,height:f._effHeight-b,x:b/2,y:b/2}),j.select(\"rect\").attr({width:f._width-2*b+p.scrollBarWidth+p.scrollBarMargin,height:f._effHeight-2*b,x:b,y:b+X}),c.setClipUrl(q,r,t),K(X,B,Y),N.on(\"wheel\",(function(){K(X=i.constrain(f._scrollY+n.event.deltaY/Z*W,0,W),B,Y),0!==X&&X!==W&&n.event.preventDefault()}));var $=n.behavior.drag().on(\"dragstart\",(function(){var t=n.event.sourceEvent;D=\"touchstart\"===t.type?t.changedTouches[0].clientY:t.clientY,F=X})).on(\"drag\",(function(){var t=n.event.sourceEvent;2===t.buttons||t.ctrlKey||(R=\"touchmove\"===t.type?t.changedTouches[0].clientY:t.clientY,X=function(t,e,r){var n=(r-e)/Y+t;return i.constrain(n,0,W)}(F,D,R),K(X,B,Y))}));G.call($);var J=n.behavior.drag().on(\"dragstart\",(function(){var t=n.event.sourceEvent;\"touchstart\"===t.type&&(D=t.changedTouches[0].clientY,F=X)})).on(\"drag\",(function(){var t=n.event.sourceEvent;\"touchmove\"===t.type&&(R=t.changedTouches[0].clientY,X=function(t,e,r){var n=(e-r)/Y+t;return i.constrain(n,0,W)}(F,D,R),K(X,B,Y))}));q.call(J)}function K(e,r,n){f._scrollY=t._fullLayout[w]._scrollY=e,c.setTranslate(q,0,-e),c.setRect(G,f._width,p.scrollBarMargin+e*n,p.scrollBarWidth,r),j.select(\"rect\").attr(\"y\",b+e)}t._context.edits.legendPosition&&(N.classed(\"cursor-move\",!0),l.init({element:N.node(),gd:t,prepFn:function(t){if(t.target!==G.node()){var e=c.getTranslate(N);v=e.x,x=e.y}},moveFn:function(t,r){if(void 0!==v&&void 0!==x){var n=v+t,i=x+r;c.setTranslate(N,n,i),e=l.align(n,f._width,_.l,_.l+_.w,f.xanchor),u=l.align(i+f._height,-f._height,_.t+_.h,_.t,f.yanchor)}},doneFn:function(){if(void 0!==e&&void 0!==u){var r={};r[w+\".x\"]=e,r[w+\".y\"]=u,o.call(\"_guiRelayout\",t,r)}},clickFn:function(e,r){var n=s.selectAll(\"g.traces\").filter((function(){var t=this.getBoundingClientRect();return r.clientX>=t.left&&r.clientX<=t.right&&r.clientY>=t.top&&r.clientY<=t.bottom}));n.size()>0&&A(t,N,n,e,r)}}))}],t)}}function k(t,e,r){var n=t[0],i=n.width,a=e.entrywidthmode,o=n.trace.legendwidth||e.entrywidth;return\"fraction\"===a?e._maxWidth*o:r+(o||i)}function A(t,e,r,n,i){var a=r.data()[0][0].trace,l={event:i,node:r.node(),curveNumber:a.index,expandedIndex:a._expandedIndex,data:t.data,layout:t.layout,frames:t._transitionData._frames,config:t._context,fullData:t._fullData,fullLayout:t._fullLayout};a._group&&(l.group=a._group),o.traceIs(a,\"pie-like\")&&(l.label=r.datum()[0].label);var c=s.triggerHandler(t,\"plotly_legendclick\",l);if(1===n){if(!1===c)return;e._clickTimeout=setTimeout((function(){t._fullLayout&&f(r,t,n)}),t._context.doubleClickDelay)}else 2===n&&(e._clickTimeout&&clearTimeout(e._clickTimeout),t._legendMouseDownTime=0,!1!==s.triggerHandler(t,\"plotly_legenddoubleclick\",l)&&!1!==c&&f(r,t,n))}function M(t,e,r){var n,a,s=P(r),l=t.data()[0][0],u=l.trace,f=o.traceIs(u,\"pie-like\"),d=!r._inHover&&e._context.edits.legendText&&!f,m=r._maxNameLength;l.groupTitle?(n=l.groupTitle.text,a=l.groupTitle.font):(a=r.font,r.entries?n=l.text:(n=f?l.label:u.name,u._meta&&(n=i.templateString(n,u._meta))));var g=i.ensureSingle(t,\"text\",s+\"text\");g.attr(\"text-anchor\",\"start\").call(c.font,a).text(d?S(n,m):n);var y=r.indentation+r.itemwidth+2*p.itemGap;h.positionText(g,y,0),d?g.call(h.makeEditable,{gd:e,text:n}).call(C,t,e,r).on(\"edit\",(function(n){this.text(S(n,m)).call(C,t,e,r);var a=l.trace._fullInput||{},s={};if(o.hasTransform(a,\"groupby\")){var c=o.getTransformIndices(a,\"groupby\"),h=c[c.length-1],f=i.keyedContainer(a,\"transforms[\"+h+\"].styles\",\"target\",\"value.name\");f.set(l.trace._group,n),s=f.constructUpdate()}else s.name=n;return a._isShape?o.call(\"_guiRelayout\",e,\"shapes[\"+u.index+\"].name\",s.name):o.call(\"_guiRestyle\",e,s,u.index)})):C(g,t,e,r)}function S(t,e){var r=Math.max(4,e);if(t&&t.trim().length>=r/2)return t;for(var n=r-(t=t||\"\").length;n>0;n--)t+=\" \";return t}function E(t,e,r){var a,o=e._context.doubleClickDelay,s=1,l=i.ensureSingle(t,\"rect\",r+\"toggle\",(function(t){e._context.staticPlot||t.style(\"cursor\",\"pointer\").attr(\"pointer-events\",\"all\"),t.call(u.fill,\"rgba(0,0,0,0)\")}));e._context.staticPlot||(l.on(\"mousedown\",(function(){(a=(new Date).getTime())-e._legendMouseDownTimeo&&(s=Math.max(s-1,1)),A(e,i,t,s,n.event)}})))}function C(t,e,r,n,i){n._inHover&&t.attr(\"data-notex\",!0),h.convertToTspans(t,r,(function(){!function(t,e,r,n){var i=t.data()[0][0];if(r._inHover||!i||i.trace.showlegend){var a=t.select(\"g[class*=math-group]\"),o=a.node(),s=P(r);r||(r=e._fullLayout[s]);var l,u,f=r.borderwidth,d=(n===b?r.title.font:i.groupTitle?i.groupTitle.font:r.font).size*m;if(o){var g=c.bBox(o);l=g.height,u=g.width,n===b?c.setTranslate(a,f,f+.75*l):c.setTranslate(a,0,.25*l)}else{var y=\".\"+s+(n===b?\"title\":\"\")+\"text\",v=t.select(y),x=h.lineCount(v),_=v.node();if(l=d*x,u=_?c.bBox(_).width:0,n===b)\"left\"===r.title.side&&(u+=2*p.itemGap),h.positionText(v,f+p.titlePad,f+d);else{var w=2*p.itemGap+r.indentation+r.itemwidth;i.groupTitle&&(w=p.itemGap,u-=r.indentation+r.itemwidth),h.positionText(v,w,-d*((x-1)/2-.3))}}n===b?(r._titleWidth=u,r._titleHeight=l):(i.lineHeight=d,i.height=Math.max(l,16)+3,i.width=u)}else t.remove()}(e,r,n,i)}))}function L(t){return i.isRightAnchor(t)?\"right\":i.isCenterAnchor(t)?\"center\":\"left\"}function I(t){return i.isBottomAnchor(t)?\"bottom\":i.isMiddleAnchor(t)?\"middle\":\"top\"}function P(t){return t._id||\"legend\"}t.exports=function(t,e){if(e)T(t,e);else{var r=t._fullLayout,i=r._legends;r._infolayer.selectAll('[class^=\"legend\"]').each((function(){var t=n.select(this),e=t.attr(\"class\").split(\" \")[0];e.match(w)&&-1===i.indexOf(e)&&t.remove()}));for(var a=0;aS&&(M=S)}k[a][0]._groupMinRank=M,k[a][0]._preGroupSort=a}var E=function(t,e){return t.trace.legendrank-e.trace.legendrank||t._preSort-e._preSort};for(k.forEach((function(t,e){t[0]._preGroupSort=e})),k.sort((function(t,e){return t[0]._groupMinRank-e[0]._groupMinRank||t[0]._preGroupSort-e[0]._preGroupSort})),a=0;ar?r:t}t.exports=function(t,e,r){var y=e._fullLayout;r||(r=y.legend);var v=\"constant\"===r.itemsizing,x=r.itemwidth,_=(x+2*p.itemGap)/2,b=o(_,0),w=function(t,e,r,n){var i;if(t+1)i=t;else{if(!(e&&e.width>0))return 0;i=e.width}return v?n:Math.min(i,r)};function T(t,a,o){var u=t[0].trace,h=u.marker||{},f=h.line||{},p=h.cornerradius?\"M6,3a3,3,0,0,1-3,3H-3a3,3,0,0,1-3-3V-3a3,3,0,0,1,3-3H3a3,3,0,0,1,3,3Z\":\"M6,6H-6V-6H6Z\",d=o?u.visible&&u.type===o:i.traceIs(u,\"bar\"),m=n.select(a).select(\"g.legendpoints\").selectAll(\"path.legend\"+o).data(d?[t]:[]);m.enter().append(\"path\").classed(\"legend\"+o,!0).attr(\"d\",p).attr(\"transform\",b),m.exit().remove(),m.each((function(t){var i=n.select(this),a=t[0],o=w(a.mlw,h.line,5,2);i.style(\"stroke-width\",o+\"px\");var p=a.mcc;if(!r._inHover&&\"mc\"in a){var d=c(h),m=d.mid;void 0===m&&(m=(d.max+d.min)/2),p=s.tryColorscale(h,\"\")(m)}var y=p||a.mc||h.color,v=h.pattern,x=v&&s.getPatternAttr(v.shape,0,\"\");if(x){var _=s.getPatternAttr(v.bgcolor,0,null),b=s.getPatternAttr(v.fgcolor,0,null),T=v.fgopacity,k=g(v.size,8,10),A=g(v.solidity,.5,1),M=\"legend-\"+u.uid;i.call(s.pattern,\"legend\",e,M,x,k,A,p,v.fillmode,_,b,T)}else i.call(l.fill,y);o&&l.stroke(i,a.mlc||f.color)}))}function k(t,r,o){var s=t[0],l=s.trace,c=o?l.visible&&l.type===o:i.traceIs(l,o),u=n.select(r).select(\"g.legendpoints\").selectAll(\"path.legend\"+o).data(c?[t]:[]);if(u.enter().append(\"path\").classed(\"legend\"+o,!0).attr(\"d\",\"M6,6H-6V-6H6Z\").attr(\"transform\",b),u.exit().remove(),u.size()){var p=l.marker||{},d=w(f(p.line.width,s.pts),p.line,5,2),m=\"pieLike\",g=a.minExtend(l,{marker:{line:{width:d}}},m),y=a.minExtend(s,{trace:g},m);h(u,y,g,e)}}t.each((function(t){var e=n.select(this),i=a.ensureSingle(e,\"g\",\"layers\");i.style(\"opacity\",t[0].trace.opacity);var s=r.indentation,l=r.valign,c=t[0].lineHeight,u=t[0].height;if(\"middle\"===l&&0===s||!c||!u)i.attr(\"transform\",null);else{var h={top:1,bottom:-1}[l]*(.5*(c-u+3))||0,f=r.indentation;i.attr(\"transform\",o(f,h))}i.selectAll(\"g.legendfill\").data([t]).enter().append(\"g\").classed(\"legendfill\",!0),i.selectAll(\"g.legendlines\").data([t]).enter().append(\"g\").classed(\"legendlines\",!0);var p=i.selectAll(\"g.legendsymbols\").data([t]);p.enter().append(\"g\").classed(\"legendsymbols\",!0),p.selectAll(\"g.legendpoints\").data([t]).enter().append(\"g\").classed(\"legendpoints\",!0)})).each((function(t){var r,i=t[0].trace,o=[];if(i.visible)switch(i.type){case\"histogram2d\":case\"heatmap\":o=[[\"M-15,-2V4H15V-2Z\"]],r=!0;break;case\"choropleth\":case\"choroplethmapbox\":case\"choroplethmap\":o=[[\"M-6,-6V6H6V-6Z\"]],r=!0;break;case\"densitymapbox\":case\"densitymap\":o=[[\"M-6,0 a6,6 0 1,0 12,0 a 6,6 0 1,0 -12,0\"]],r=\"radial\";break;case\"cone\":o=[[\"M-6,2 A2,2 0 0,0 -6,6 V6L6,4Z\"],[\"M-6,-6 A2,2 0 0,0 -6,-2 L6,-4Z\"],[\"M-6,-2 A2,2 0 0,0 -6,2 L6,0Z\"]],r=!1;break;case\"streamtube\":o=[[\"M-6,2 A2,2 0 0,0 -6,6 H6 A2,2 0 0,1 6,2 Z\"],[\"M-6,-6 A2,2 0 0,0 -6,-2 H6 A2,2 0 0,1 6,-6 Z\"],[\"M-6,-2 A2,2 0 0,0 -6,2 H6 A2,2 0 0,1 6,-2 Z\"]],r=!1;break;case\"surface\":o=[[\"M-6,-6 A2,3 0 0,0 -6,0 H6 A2,3 0 0,1 6,-6 Z\"],[\"M-6,1 A2,3 0 0,1 -6,6 H6 A2,3 0 0,0 6,0 Z\"]],r=!0;break;case\"mesh3d\":o=[[\"M-6,6H0L-6,-6Z\"],[\"M6,6H0L6,-6Z\"],[\"M-6,-6H6L0,6Z\"]],r=!1;break;case\"volume\":o=[[\"M-6,6H0L-6,-6Z\"],[\"M6,6H0L6,-6Z\"],[\"M-6,-6H6L0,6Z\"]],r=!0;break;case\"isosurface\":o=[[\"M-6,6H0L-6,-6Z\"],[\"M6,6H0L6,-6Z\"],[\"M-6,-6 A12,24 0 0,0 6,-6 L0,6Z\"]],r=!1}var u=n.select(this).select(\"g.legendpoints\").selectAll(\"path.legend3dandfriends\").data(o);u.enter().append(\"path\").classed(\"legend3dandfriends\",!0).attr(\"transform\",b).style(\"stroke-miterlimit\",1),u.exit().remove(),u.each((function(t,o){var u,h=n.select(this),f=c(i),p=f.colorscale,m=f.reversescale;if(p){if(!r){var g=p.length;u=0===o?p[m?g-1:0][1]:1===o?p[m?0:g-1][1]:p[Math.floor((g-1)/2)][1]}}else{var y=i.vertexcolor||i.facecolor||i.color;u=a.isArrayOrTypedArray(y)?y[o]||y[0]:y}h.attr(\"d\",t[0]),u?h.call(l.fill,u):h.call((function(t){if(t.size()){var n=\"legendfill-\"+i.uid;s.gradient(t,e,n,d(m,\"radial\"===r),p,\"fill\")}}))}))})).each((function(t){var e=t[0].trace,r=\"waterfall\"===e.type;if(t[0]._distinct&&r){var i=t[0].trace[t[0].dir].marker;return t[0].mc=i.color,t[0].mlw=i.line.width,t[0].mlc=i.line.color,T(t,this,\"waterfall\")}var a=[];e.visible&&r&&(a=t[0].hasTotals?[[\"increasing\",\"M-6,-6V6H0Z\"],[\"totals\",\"M6,6H0L-6,-6H-0Z\"],[\"decreasing\",\"M6,6V-6H0Z\"]]:[[\"increasing\",\"M-6,-6V6H6Z\"],[\"decreasing\",\"M6,6V-6H-6Z\"]]);var o=n.select(this).select(\"g.legendpoints\").selectAll(\"path.legendwaterfall\").data(a);o.enter().append(\"path\").classed(\"legendwaterfall\",!0).attr(\"transform\",b).style(\"stroke-miterlimit\",1),o.exit().remove(),o.each((function(t){var r=n.select(this),i=e[t[0]].marker,a=w(void 0,i.line,5,2);r.attr(\"d\",t[1]).style(\"stroke-width\",a+\"px\").call(l.fill,i.color),a&&r.call(l.stroke,i.line.color)}))})).each((function(t){T(t,this,\"funnel\")})).each((function(t){T(t,this)})).each((function(t){var r=t[0].trace,o=n.select(this).select(\"g.legendpoints\").selectAll(\"path.legendbox\").data(r.visible&&i.traceIs(r,\"box-violin\")?[t]:[]);o.enter().append(\"path\").classed(\"legendbox\",!0).attr(\"d\",\"M6,6H-6V-6H6Z\").attr(\"transform\",b),o.exit().remove(),o.each((function(){var t=n.select(this);if(\"all\"!==r.boxpoints&&\"all\"!==r.points||0!==l.opacity(r.fillcolor)||0!==l.opacity((r.line||{}).color)){var i=w(void 0,r.line,5,2);t.style(\"stroke-width\",i+\"px\").call(l.fill,r.fillcolor),i&&l.stroke(t,r.line.color)}else{var c=a.minExtend(r,{marker:{size:v?12:a.constrain(r.marker.size,2,16),sizeref:1,sizemin:1,sizemode:\"diameter\"}});o.call(s.pointStyle,c,e)}}))})).each((function(t){k(t,this,\"funnelarea\")})).each((function(t){k(t,this,\"pie\")})).each((function(t){var r,i,o=m(t),l=o.showFill,h=o.showLine,f=o.showGradientLine,p=o.showGradientFill,g=o.anyFill,y=o.anyLine,v=t[0],_=v.trace,b=c(_),T=b.colorscale,k=b.reversescale,A=u.hasMarkers(_)||!g?\"M5,0\":y?\"M5,-2\":\"M5,-3\",M=n.select(this),S=M.select(\".legendfill\").selectAll(\"path\").data(l||p?[t]:[]);if(S.enter().append(\"path\").classed(\"js-fill\",!0),S.exit().remove(),S.attr(\"d\",A+\"h\"+x+\"v6h-\"+x+\"z\").call((function(t){if(t.size())if(l)s.fillGroupStyle(t,e,!0);else{var r=\"legendfill-\"+_.uid;s.gradient(t,e,r,d(k),T,\"fill\")}})),h||f){var E=w(void 0,_.line,10,5);i=a.minExtend(_,{line:{width:E}}),r=[a.minExtend(v,{trace:i})]}var C=M.select(\".legendlines\").selectAll(\"path\").data(h||f?[r]:[]);C.enter().append(\"path\").classed(\"js-line\",!0),C.exit().remove(),C.attr(\"d\",A+(f?\"l\"+x+\",0.0001\":\"h\"+x)).call(h?s.lineGroupStyle:function(t){if(t.size()){var r=\"legendline-\"+_.uid;s.lineGroupStyle(t),s.gradient(t,e,r,d(k),T,\"stroke\")}})})).each((function(t){var r,i,o=m(t),l=o.anyFill,c=o.anyLine,h=o.showLine,f=o.showMarker,p=t[0],d=p.trace,g=!f&&!c&&!l&&u.hasText(d);function y(t,e,r,n){var i=a.nestedProperty(d,t).get(),o=a.isArrayOrTypedArray(i)&&e?e(i):i;if(v&&o&&void 0!==n&&(o=n),r){if(or[1])return r[1]}return o}function x(t){return p._distinct&&p.index&&t[p.index]?t[p.index]:t[0]}if(f||g||h){var _={},w={};if(f){_.mc=y(\"marker.color\",x),_.mx=y(\"marker.symbol\",x),_.mo=y(\"marker.opacity\",a.mean,[.2,1]),_.mlc=y(\"marker.line.color\",x),_.mlw=y(\"marker.line.width\",a.mean,[0,5],2),w.marker={sizeref:1,sizemin:1,sizemode:\"diameter\"};var T=y(\"marker.size\",a.mean,[2,16],12);_.ms=T,w.marker.size=T}h&&(w.line={width:y(\"line.width\",x,[0,10],5)}),g&&(_.tx=\"Aa\",_.tp=y(\"textposition\",x),_.ts=10,_.tc=y(\"textfont.color\",x),_.tf=y(\"textfont.family\",x),_.tw=y(\"textfont.weight\",x),_.ty=y(\"textfont.style\",x),_.tv=y(\"textfont.variant\",x),_.tC=y(\"textfont.textcase\",x),_.tE=y(\"textfont.lineposition\",x),_.tS=y(\"textfont.shadow\",x)),r=[a.minExtend(p,_)],(i=a.minExtend(d,w)).selectedpoints=null,i.texttemplate=null}var k=n.select(this).select(\"g.legendpoints\"),A=k.selectAll(\"path.scatterpts\").data(f?r:[]);A.enter().insert(\"path\",\":first-child\").classed(\"scatterpts\",!0).attr(\"transform\",b),A.exit().remove(),A.call(s.pointStyle,i,e),f&&(r[0].mrc=3);var M=k.selectAll(\"g.pointtext\").data(g?r:[]);M.enter().append(\"g\").classed(\"pointtext\",!0).append(\"text\").attr(\"transform\",b),M.exit().remove(),M.selectAll(\"text\").call(s.textPointStyle,i,e)})).each((function(t){var e=t[0].trace,r=n.select(this).select(\"g.legendpoints\").selectAll(\"path.legendcandle\").data(e.visible&&\"candlestick\"===e.type?[t,t]:[]);r.enter().append(\"path\").classed(\"legendcandle\",!0).attr(\"d\",(function(t,e){return e?\"M-15,0H-8M-8,6V-6H8Z\":\"M15,0H8M8,-6V6H-8Z\"})).attr(\"transform\",b).style(\"stroke-miterlimit\",1),r.exit().remove(),r.each((function(t,r){var i=n.select(this),a=e[r?\"increasing\":\"decreasing\"],o=w(void 0,a.line,5,2);i.style(\"stroke-width\",o+\"px\").call(l.fill,a.fillcolor),o&&l.stroke(i,a.line.color)}))})).each((function(t){var e=t[0].trace,r=n.select(this).select(\"g.legendpoints\").selectAll(\"path.legendohlc\").data(e.visible&&\"ohlc\"===e.type?[t,t]:[]);r.enter().append(\"path\").classed(\"legendohlc\",!0).attr(\"d\",(function(t,e){return e?\"M-15,0H0M-8,-6V0\":\"M15,0H0M8,6V0\"})).attr(\"transform\",b).style(\"stroke-miterlimit\",1),r.exit().remove(),r.each((function(t,r){var i=n.select(this),a=e[r?\"increasing\":\"decreasing\"],o=w(void 0,a.line,5,2);i.style(\"fill\",\"none\").call(s.dashLine,a.line.dash,o),o&&l.stroke(i,a.line.color)}))}))}},50308:function(t,e,r){\"use strict\";r(87632),t.exports={editType:\"modebar\",orientation:{valType:\"enumerated\",values:[\"v\",\"h\"],dflt:\"h\",editType:\"modebar\"},bgcolor:{valType:\"color\",editType:\"modebar\"},color:{valType:\"color\",editType:\"modebar\"},activecolor:{valType:\"color\",editType:\"modebar\"},uirevision:{valType:\"any\",editType:\"none\"},add:{valType:\"string\",arrayOk:!0,dflt:\"\",editType:\"modebar\"},remove:{valType:\"string\",arrayOk:!0,dflt:\"\",editType:\"modebar\"}}},5832:function(t,e,r){\"use strict\";var n=r(33626),i=r(44122),a=r(5975),o=r(35188),s=r(28231).eraseActiveShape,l=r(34809),c=l._,u=t.exports={};function h(t,e){var r,i,o=e.currentTarget,s=o.getAttribute(\"data-attr\"),l=o.getAttribute(\"data-val\")||!0,c=t._fullLayout,u={},h=a.list(t,null,!0),f=c._cartesianSpikesEnabled;if(\"zoom\"===s){var p,d=\"in\"===l?.5:2,m=(1+d)/2,g=(1-d)/2;for(i=0;i1?(z=[\"toggleHover\"],O=[\"resetViews\"]):y?(P=[\"zoomInGeo\",\"zoomOutGeo\"],z=[\"hoverClosestGeo\"],O=[\"resetGeo\"]):g?(z=[\"hoverClosest3d\"],O=[\"resetCameraDefault3d\",\"resetCameraLastSave3d\"]):w?(P=[\"zoomInMapbox\",\"zoomOutMapbox\"],z=[\"toggleHover\"],O=[\"resetViewMapbox\"]):T?(P=[\"zoomInMap\",\"zoomOutMap\"],z=[\"toggleHover\"],O=[\"resetViewMap\"]):_?z=[\"hoverClosestGl2d\"]:v?z=[\"hoverClosestPie\"]:M?(z=[\"hoverClosestCartesian\",\"hoverCompareCartesian\"],O=[\"resetViewSankey\"]):z=[\"toggleHover\"],m&&z.push(\"toggleSpikelines\",\"hoverClosestCartesian\",\"hoverCompareCartesian\"),(function(t){for(var e=0;e0)){var m=function(t,e,r){for(var n=r.filter((function(r){return e[r].anchor===t._id})),i=0,a=0;a0?t.touches[0].clientX:0}function y(t,e,r,n){var i=o.ensureSingle(t,\"rect\",m.bgClassName,(function(t){t.attr({x:0,y:0,\"shape-rendering\":\"crispEdges\"})})),a=n.borderwidth%2==0?n.borderwidth:n.borderwidth-1,u=-n._offsetShift,h=l.crispRound(e,n.borderwidth);i.attr({width:n._width+a,height:n._height+a,transform:s(u,u),\"stroke-width\":h}).call(c.stroke,n.bordercolor).call(c.fill,n.bgcolor)}function v(t,e,r,n){var i=e._fullLayout;o.ensureSingleById(i._topdefs,\"clipPath\",n._clipId,(function(t){t.append(\"rect\").attr({x:0,y:0})})).select(\"rect\").attr({width:n._width,height:n._height})}function x(t,e,r,i){var s,c=e.calcdata,u=t.selectAll(\"g.\"+m.rangePlotClassName).data(r._subplotsWith,o.identity);u.enter().append(\"g\").attr(\"class\",(function(t){return m.rangePlotClassName+\" \"+t})).call(l.setClipUrl,i._clipId,e),u.order(),u.exit().remove(),u.each((function(t,o){var l=n.select(this),u=0===o,p=f.getFromId(e,t,\"y\"),d=p._name,m=i[d],g={data:[],layout:{xaxis:{type:r.type,domain:[0,1],range:i.range.slice(),calendar:r.calendar},width:i._width,height:i._height,margin:{t:0,b:0,l:0,r:0}},_context:e._context};r.rangebreaks&&(g.layout.xaxis.rangebreaks=r.rangebreaks),g.layout[d]={type:p.type,domain:[0,1],range:\"match\"!==m.rangemode?m.range.slice():p.range.slice(),calendar:p.calendar},p.rangebreaks&&(g.layout[d].rangebreaks=p.rangebreaks),a.supplyDefaults(g);var y=g._fullLayout.xaxis,v=g._fullLayout[d];y.clearCalc(),y.setScale(),v.clearCalc(),v.setScale();var x={id:t,plotgroup:l,xaxis:y,yaxis:v,isRangePlot:!0};u?s=x:(x.mainplot=\"xy\",x.mainplotinfo=s),h.rangePlot(e,x,function(t,e){for(var r=[],n=0;n=n.max)e=B[r+1];else if(t=n.pmax)e=B[r+1];else if(tr._length||v+b<0)return;u=y+b,p=v+b;break;case l:if(_=\"col-resize\",y+b>r._length)return;u=y+b,p=v;break;case c:if(_=\"col-resize\",v+b<0)return;u=y,p=v+b;break;default:_=\"ew-resize\",u=m,p=m+b}if(p=0;k--){var A=r.append(\"path\").attr(g).style(\"opacity\",k?.1:y).call(o.stroke,x).call(o.fill,v).call(s.dashLine,k?\"solid\":b,k?4+_:_);if(d(A,t,a),w){var M=l(t.layout,\"selections\",a);A.style({cursor:\"move\"});var S={element:A.node(),plotinfo:p,gd:t,editHelpers:M,isActiveSelection:!0},E=n(c,t);i(E,A,S)}else A.style(\"pointer-events\",k?\"all\":\"none\");T[k]=A}var C=T[0];T[1].node().addEventListener(\"click\",(function(){return function(t,e){if(f(t)){var r=+e.node().getAttribute(\"data-index\");if(r>=0){if(r===t._fullLayout._activeSelectionIndex)return void m(t);t._fullLayout._activeSelectionIndex=r,t._fullLayout._deactivateSelection=m,h(t)}}}(t,C)}))}(t._fullLayout._selectionLayer)}function d(t,e,r){var n=r.xref+r.yref;s.setClipUrl(t,\"clip\"+e._fullLayout._uid+n,e)}function m(t){f(t)&&t._fullLayout._activeSelectionIndex>=0&&(a(t),delete t._fullLayout._activeSelectionIndex,h(t))}t.exports={draw:h,drawOne:p,activateLastSelection:function(t){if(f(t)){var e=t._fullLayout.selections.length-1;t._fullLayout._activeSelectionIndex=e,t._fullLayout._deactivateSelection=m,h(t)}}}},52307:function(t,e,r){\"use strict\";var n=r(94850).T,i=r(93049).extendFlat;t.exports={newselection:{mode:{valType:\"enumerated\",values:[\"immediate\",\"gradual\"],dflt:\"immediate\",editType:\"none\"},line:{color:{valType:\"color\",editType:\"none\"},width:{valType:\"number\",min:1,dflt:1,editType:\"none\"},dash:i({},n,{dflt:\"dot\",editType:\"none\"}),editType:\"none\"},editType:\"none\"},activeselection:{fillcolor:{valType:\"color\",dflt:\"rgba(0,0,0,0)\",editType:\"none\"},opacity:{valType:\"number\",min:0,max:1,dflt:.5,editType:\"none\"},editType:\"none\"}}},43028:function(t){\"use strict\";t.exports=function(t,e,r){r(\"newselection.mode\"),r(\"newselection.line.width\")&&(r(\"newselection.line.color\"),r(\"newselection.line.dash\")),r(\"activeselection.fillcolor\"),r(\"activeselection.opacity\")}},51817:function(t,e,r){\"use strict\";var n=r(70414).selectMode,i=r(78534).clearOutline,a=r(81055),o=a.readPaths,s=a.writePaths,l=a.fixDatesForPaths;t.exports=function(t,e){if(t.length){var r=t[0][0];if(r){var a=r.getAttribute(\"d\"),c=e.gd,u=c._fullLayout.newselection,h=e.plotinfo,f=h.xaxis,p=h.yaxis,d=e.isActiveSelection,m=e.dragmode,g=(c.layout||{}).selections||[];if(!n(m)&&void 0!==d){var y=c._fullLayout._activeSelectionIndex;if(y-1,_=[];if(function(t){return t&&Array.isArray(t)&&!0!==t[0].hoverOnBox}(y)){Z(t,e,a);var b=function(t,e){var r,n,i=t[0],a=-1,o=[];for(n=0;n0?function(t,e){var r,n,i,a=[];for(i=0;i0&&a.push(r);if(1===a.length&&a[0]===e.searchInfo&&(n=e.searchInfo.cd[0].trace).selectedpoints.length===e.pointNumbers.length){for(i=0;i1)return!1;if((n+=e.selectedpoints.length)>1)return!1}return 1===n}(s)&&(f=J(b))){for(o&&o.remove(),g=0;g=0})(i)&&i._fullLayout._deactivateShape(i),function(t){return t._fullLayout._activeSelectionIndex>=0}(i)&&i._fullLayout._deactivateSelection(i);var o=i._fullLayout._zoomlayer,s=p(r),l=m(r);if(s||l){var c,u,h=o.selectAll(\".select-outline-\"+n.id);h&&i._fullLayout._outlining&&(s&&(c=T(h,t)),c&&a.call(\"_guiRelayout\",i,{shapes:c}),l&&!U(t)&&(u=k(h,t)),u&&(i._fullLayout._noEmitSelectedAtStart=!0,a.call(\"_guiRelayout\",i,{selections:u}).then((function(){e&&A(i)}))),i._fullLayout._outlining=!1)}n.selection={},n.selection.selectionDefs=t.selectionDefs=[],n.selection.mergedPolygons=t.mergedPolygons=[]}function Y(t){return t._id}function X(t,e,r,n){if(!t.calcdata)return[];var i,a,o,s=[],l=e.map(Y),c=r.map(Y);for(o=0;o0?n[0]:r;return!!e.selectedpoints&&e.selectedpoints.indexOf(i)>-1}function K(t,e,r){var n,i;for(n=0;n-1&&e;if(!a&&e){var et=ot(t,!0);if(et.length){var nt=et[0].xref,pt=et[0].yref;if(nt&&pt){var dt=ct(et);ut([L(t,nt,\"x\"),L(t,pt,\"y\")])(Q,dt)}}t._fullLayout._noEmitSelectedAtStart?t._fullLayout._noEmitSelectedAtStart=!1:tt&&ht(t,Q),f._reselect=!1}if(!a&&f._deselect){var mt=f._deselect;(function(t,e,r){for(var n=0;n=0)k._fullLayout._deactivateShape(k);else if(!x){var r=A.clickmode;C.done(Mt).then((function(){if(C.clear(Mt),2===t){for(_t.remove(),J=0;J-1&&V(e,k,n.xaxes,n.yaxes,n.subplot,n,_t),\"event\"===r&&ht(k,void 0);l.click(k,e,I.id)})).catch(M.error)}},n.doneFn=function(){kt.remove(),C.done(Mt).then((function(){C.clear(Mt),!S&&$&&n.selectionDefs&&($.subtract=xt,n.selectionDefs.push($),n.mergedPolygons.length=0,[].push.apply(n.mergedPolygons,Y)),(S||x)&&W(n,S),n.doneFnCompleted&&n.doneFnCompleted(St),_&&ht(k,at)})).catch(M.error)}},clearOutline:x,clearSelectionsCache:W,selectOnClick:V}},43144:function(t,e,r){\"use strict\";var n=r(50222),i=r(80337),a=r(36640).line,o=r(94850).T,s=r(93049).extendFlat,l=r(78032).templatedArray,c=(r(35081),r(9829)),u=r(3208).LF,h=r(41235);t.exports=l(\"shape\",{visible:s({},c.visible,{editType:\"calc+arraydraw\"}),showlegend:{valType:\"boolean\",dflt:!1,editType:\"calc+arraydraw\"},legend:s({},c.legend,{editType:\"calc+arraydraw\"}),legendgroup:s({},c.legendgroup,{editType:\"calc+arraydraw\"}),legendgrouptitle:{text:s({},c.legendgrouptitle.text,{editType:\"calc+arraydraw\"}),font:i({editType:\"calc+arraydraw\"}),editType:\"calc+arraydraw\"},legendrank:s({},c.legendrank,{editType:\"calc+arraydraw\"}),legendwidth:s({},c.legendwidth,{editType:\"calc+arraydraw\"}),type:{valType:\"enumerated\",values:[\"circle\",\"rect\",\"path\",\"line\"],editType:\"calc+arraydraw\"},layer:{valType:\"enumerated\",values:[\"below\",\"above\",\"between\"],dflt:\"above\",editType:\"arraydraw\"},xref:s({},n.xref,{}),xsizemode:{valType:\"enumerated\",values:[\"scaled\",\"pixel\"],dflt:\"scaled\",editType:\"calc+arraydraw\"},xanchor:{valType:\"any\",editType:\"calc+arraydraw\"},x0:{valType:\"any\",editType:\"calc+arraydraw\"},x1:{valType:\"any\",editType:\"calc+arraydraw\"},x0shift:{valType:\"number\",dflt:0,min:-1,max:1,editType:\"calc\"},x1shift:{valType:\"number\",dflt:0,min:-1,max:1,editType:\"calc\"},yref:s({},n.yref,{}),ysizemode:{valType:\"enumerated\",values:[\"scaled\",\"pixel\"],dflt:\"scaled\",editType:\"calc+arraydraw\"},yanchor:{valType:\"any\",editType:\"calc+arraydraw\"},y0:{valType:\"any\",editType:\"calc+arraydraw\"},y1:{valType:\"any\",editType:\"calc+arraydraw\"},y0shift:{valType:\"number\",dflt:0,min:-1,max:1,editType:\"calc\"},y1shift:{valType:\"number\",dflt:0,min:-1,max:1,editType:\"calc\"},path:{valType:\"string\",editType:\"calc+arraydraw\"},opacity:{valType:\"number\",min:0,max:1,dflt:1,editType:\"arraydraw\"},line:{color:s({},a.color,{editType:\"arraydraw\"}),width:s({},a.width,{editType:\"calc+arraydraw\"}),dash:s({},o,{editType:\"arraydraw\"}),editType:\"calc+arraydraw\"},fillcolor:{valType:\"color\",dflt:\"rgba(0,0,0,0)\",editType:\"arraydraw\"},fillrule:{valType:\"enumerated\",values:[\"evenodd\",\"nonzero\"],dflt:\"evenodd\",editType:\"arraydraw\"},editable:{valType:\"boolean\",dflt:!1,editType:\"calc+arraydraw\"},label:{text:{valType:\"string\",dflt:\"\",editType:\"arraydraw\"},texttemplate:u({},{keys:Object.keys(h)}),font:i({editType:\"calc+arraydraw\",colorEditType:\"arraydraw\"}),textposition:{valType:\"enumerated\",values:[\"top left\",\"top center\",\"top right\",\"middle left\",\"middle center\",\"middle right\",\"bottom left\",\"bottom center\",\"bottom right\",\"start\",\"middle\",\"end\"],editType:\"arraydraw\"},textangle:{valType:\"angle\",dflt:\"auto\",editType:\"calc+arraydraw\"},xanchor:{valType:\"enumerated\",values:[\"auto\",\"left\",\"center\",\"right\"],dflt:\"auto\",editType:\"calc+arraydraw\"},yanchor:{valType:\"enumerated\",values:[\"top\",\"middle\",\"bottom\"],editType:\"calc+arraydraw\"},padding:{valType:\"number\",dflt:3,min:0,editType:\"arraydraw\"},editType:\"arraydraw\"},editType:\"arraydraw\"})},44959:function(t,e,r){\"use strict\";var n=r(34809),i=r(29714),a=r(2956),o=r(49728);function s(t){return c(t.line.width,t.xsizemode,t.x0,t.x1,t.path,!1)}function l(t){return c(t.line.width,t.ysizemode,t.y0,t.y1,t.path,!0)}function c(t,e,r,i,s,l){var c=t/2,u=l;if(\"pixel\"===e){var h=s?o.extractPathCoords(s,l?a.paramIsY:a.paramIsX):[r,i],f=n.aggNums(Math.max,null,h),p=n.aggNums(Math.min,null,h),d=p<0?Math.abs(p)+c:c,m=f>0?f+c:c;return{ppad:c,ppadplus:u?d:m,ppadminus:u?m:d}}return{ppad:c}}function u(t,e,r){var n,i,s=\"x\"===t._id.charAt(0)?\"x\":\"y\",l=\"category\"===t.type||\"multicategory\"===t.type,c=0,u=0,h=l?t.r2c:t.d2c;if(\"scaled\"===e[s+\"sizemode\"]?(n=e[s+\"0\"],i=e[s+\"1\"],l&&(c=e[s+\"0shift\"],u=e[s+\"1shift\"])):(n=e[s+\"anchor\"],i=e[s+\"anchor\"]),void 0!==n)return[h(n)+c,h(i)+u];if(e.path){var f,p,d,m,g=1/0,y=-1/0,v=e.path.match(a.segmentRE);for(\"date\"===t.type&&(h=o.decodeDate(h)),f=0;fy&&(y=m)));return y>=g?[g,y]:void 0}}t.exports=function(t){var e=t._fullLayout,r=n.filterVisible(e.shapes);if(r.length&&t._fullData.length)for(var o=0;o=t?e-n:n-e,-180/Math.PI*Math.atan2(i,a)}(x,b,_,w):0),A.call((function(e){return e.call(o.font,k).attr({}),a.convertToTspans(e,t),e}));var G=function(t,e,r,n,i,a,o){var s,l,c,u,f=i.label.textposition,p=i.label.textangle,d=i.label.padding,m=i.type,g=Math.PI/180*a,y=Math.sin(g),v=Math.cos(g),x=i.label.xanchor,_=i.label.yanchor;if(\"line\"===m){\"start\"===f?(s=t,l=e):\"end\"===f?(s=r,l=n):(s=(t+r)/2,l=(e+n)/2),\"auto\"===x&&(x=\"start\"===f?\"auto\"===p?r>t?\"left\":rt?\"right\":rt?\"right\":rt?\"left\":r1&&(2!==t.length||\"Z\"!==t[1][0])&&(0===L&&(t[0][0]=\"M\"),e[C]=t,A(),M())}}()}}function V(t,r){!function(t,r){if(e.length)for(var n=0;nb?(M=p,L=\"y0\",S=b,I=\"y1\"):(M=b,L=\"y1\",S=p,I=\"y0\"),it(n),st(l,r),function(t,e,r){var n=e.xref,i=e.yref,a=o.getFromId(r,n),s=o.getFromId(r,i),l=\"\";\"paper\"===n||a.autorange||(l+=n),\"paper\"===i||s.autorange||(l+=i),f.setClipUrl(t,l?\"clip\"+r._fullLayout._uid+l:null,r)}(e,r,t),nt.moveFn=\"move\"===D?at:ot,nt.altKey=n.altKey)},doneFn:function(){_(t)||(m(e),lt(l),T(e,t,r),i.call(\"_guiRelayout\",t,u.getUpdateObj()))},clickFn:function(){_(t)||lt(l)}};function it(r){if(_(t))D=null;else if(j)D=\"path\"===r.target.tagName?\"move\":\"start-point\"===r.target.attributes[\"data-line-point\"].value?\"resize-over-start-point\":\"resize-over-end-point\";else{var n=nt.element.getBoundingClientRect(),i=n.right-n.left,a=n.bottom-n.top,o=r.clientX-n.left,s=r.clientY-n.top,l=!U&&i>R&&a>F&&!r.shiftKey?d.getCursor(o/i,1-s/a):\"move\";m(e,l),D=l.split(\"-\")[0]}}function at(n,i){if(\"path\"===r.type){var a=function(t){return t},o=a,u=a;B?V(\"xanchor\",r.xanchor=tt(w+n)):(o=function(t){return tt(K(t)+n)},H&&\"date\"===H.type&&(o=y.encodeDate(o))),N?V(\"yanchor\",r.yanchor=et(A+i)):(u=function(t){return et(Q(t)+i)},Z&&\"date\"===Z.type&&(u=y.encodeDate(u))),V(\"path\",r.path=k(O,o,u))}else B?V(\"xanchor\",r.xanchor=tt(w+n)):(V(\"x0\",r.x0=tt(h+n)),V(\"x1\",r.x1=tt(x+n))),N?V(\"yanchor\",r.yanchor=et(A+i)):(V(\"y0\",r.y0=et(p+i)),V(\"y1\",r.y1=et(b+i)));e.attr(\"d\",v(t,r)),st(l,r),c(t,s,r,q)}function ot(n,i){if(U){var a=function(t){return t},o=a,u=a;B?V(\"xanchor\",r.xanchor=tt(w+n)):(o=function(t){return tt(K(t)+n)},H&&\"date\"===H.type&&(o=y.encodeDate(o))),N?V(\"yanchor\",r.yanchor=et(A+i)):(u=function(t){return et(Q(t)+i)},Z&&\"date\"===Z.type&&(u=y.encodeDate(u))),V(\"path\",r.path=k(O,o,u))}else if(j){if(\"resize-over-start-point\"===D){var f=h+n,d=N?p-i:p+i;V(\"x0\",r.x0=B?f:tt(f)),V(\"y0\",r.y0=N?d:et(d))}else if(\"resize-over-end-point\"===D){var m=x+n,g=N?b-i:b+i;V(\"x1\",r.x1=B?m:tt(m)),V(\"y1\",r.y1=N?g:et(g))}}else{var _=function(t){return-1!==D.indexOf(t)},T=_(\"n\"),G=_(\"s\"),W=_(\"w\"),Y=_(\"e\"),X=T?M+i:M,$=G?S+i:S,J=W?E+n:E,rt=Y?C+n:C;N&&(T&&(X=M-i),G&&($=S-i)),(!N&&$-X>F||N&&X-$>F)&&(V(L,r[L]=N?X:et(X)),V(I,r[I]=N?$:et($))),rt-J>R&&(V(P,r[P]=B?J:tt(J)),V(z,r[z]=B?rt:tt(rt)))}e.attr(\"d\",v(t,r)),st(l,r),c(t,s,r,q)}function st(t,e){(B||N)&&function(){var r=\"path\"!==e.type,n=t.selectAll(\".visual-cue\").data([0]);n.enter().append(\"path\").attr({fill:\"#fff\",\"fill-rule\":\"evenodd\",stroke:\"#000\",\"stroke-width\":1}).classed(\"visual-cue\",!0);var i=K(B?e.xanchor:a.midRange(r?[e.x0,e.x1]:y.extractPathCoords(e.path,g.paramIsX))),o=Q(N?e.yanchor:a.midRange(r?[e.y0,e.y1]:y.extractPathCoords(e.path,g.paramIsY)));if(i=y.roundPositionForSharpStrokeRendering(i,1),o=y.roundPositionForSharpStrokeRendering(o,1),B&&N){var s=\"M\"+(i-1-1)+\",\"+(o-1-1)+\"h-8v2h8 v8h2v-8 h8v-2h-8 v-8h-2 Z\";n.attr(\"d\",s)}else if(B){var l=\"M\"+(i-1-1)+\",\"+(o-9-1)+\"v18 h2 v-18 Z\";n.attr(\"d\",l)}else{var c=\"M\"+(i-9-1)+\",\"+(o-1-1)+\"h18 v2 h-18 Z\";n.attr(\"d\",c)}}()}function lt(t){t.selectAll(\".visual-cue\").remove()}d.init(nt),rt.node().onmousemove=it}(t,F,u,e,r,D):!0===u.editable&&F.style(\"pointer-events\",z||h.opacity(C)*E<=.5?\"stroke\":\"all\");F.node().addEventListener(\"click\",(function(){return function(t,e){if(b(t)){var r=+e.node().getAttribute(\"data-index\");if(r>=0){if(r===t._fullLayout._activeShapeIndex)return void A(t);t._fullLayout._activeShapeIndex=r,t._fullLayout._deactivateShape=A,x(t)}}}(t,F)}))}u._input&&!0===u.visible&&(\"above\"===u.layer?M(t._fullLayout._shapeUpperLayer):\"paper\"===u.xref||\"paper\"===u.yref?M(t._fullLayout._shapeLowerLayer):\"between\"===u.layer?M(w.shapelayerBetween):w._hadPlotinfo?M((w.mainplotinfo||w).shapelayer):M(t._fullLayout._shapeLowerLayer))}function T(t,e,r){var n=(r.xref+r.yref).replace(/paper/g,\"\").replace(/[xyz][1-9]* *domain/g,\"\");f.setClipUrl(t,n?\"clip\"+e._fullLayout._uid+n:null,e)}function k(t,e,r){return t.replace(g.segmentRE,(function(t){var n=0,i=t.charAt(0),a=g.paramIsX[i],o=g.paramIsY[i],s=g.numParams[i];return i+t.substr(1).replace(g.paramRE,(function(t){return n>=s||(a[n]?t=e(t):o[n]&&(t=r(t)),n++),t}))}))}function A(t){b(t)&&t._fullLayout._activeShapeIndex>=0&&(u(t),delete t._fullLayout._activeShapeIndex,x(t))}t.exports={draw:x,drawOne:w,eraseActiveShape:function(t){if(b(t)){u(t);var e=t._fullLayout._activeShapeIndex,r=(t.layout||{}).shapes||[];if(e0&&lp&&(t=\"X\"),t}));return a>p&&(d=d.replace(/[\\s,]*X.*/,\"\"),i.log(\"Ignoring extra params in segment \"+t)),u+d}))}(r,l,u);if(\"pixel\"===r.xsizemode){var A=l(r.xanchor);h=A+r.x0+b,f=A+r.x1+w}else h=l(r.x0)+b,f=l(r.x1)+w;if(\"pixel\"===r.ysizemode){var M=u(r.yanchor);p=M-r.y0+T,d=M-r.y1+k}else p=u(r.y0)+T,d=u(r.y1)+k;if(\"line\"===m)return\"M\"+h+\",\"+p+\"L\"+f+\",\"+d;if(\"rect\"===m)return\"M\"+h+\",\"+p+\"H\"+f+\"V\"+d+\"H\"+h+\"Z\";var S=(h+f)/2,E=(p+d)/2,C=Math.abs(S-h),L=Math.abs(E-p),I=\"A\"+C+\",\"+L,P=S+C+\",\"+E;return\"M\"+P+I+\" 0 1,1 \"+S+\",\"+(E-L)+I+\" 0 0,1 \"+P+\"Z\"}},43701:function(t,e,r){\"use strict\";var n=r(28231);t.exports={moduleType:\"component\",name:\"shapes\",layoutAttributes:r(43144),supplyLayoutDefaults:r(74367),supplyDrawNewShapeDefaults:r(85522),includeBasePlot:r(20706)(\"shapes\"),calcAutorange:r(44959),draw:n.draw,drawOne:n.drawOne}},41235:function(t){\"use strict\";function e(t,e){return e?e.d2l(t):t}function r(t,e){return e?e.l2d(t):t}function n(t){return t.x0shift||0}function i(t){return t.x1shift||0}function a(t){return t.y0shift||0}function o(t){return t.y1shift||0}function s(t,r){return e(t.x1,r)+i(t)-e(t.x0,r)-n(t)}function l(t,r,n){return e(t.y1,n)+o(t)-e(t.y0,n)-a(t)}t.exports={x0:function(t){return t.x0},x1:function(t){return t.x1},y0:function(t){return t.y0},y1:function(t){return t.y1},slope:function(t,e,r){return\"line\"!==t.type?void 0:l(t,0,r)/s(t,e)},dx:s,dy:l,width:function(t,e){return Math.abs(s(t,e))},height:function(t,e,r){return Math.abs(l(t,0,r))},length:function(t,e,r){return\"line\"!==t.type?void 0:Math.sqrt(Math.pow(s(t,e),2)+Math.pow(l(t,0,r),2))},xcenter:function(t,a){return r((e(t.x1,a)+i(t)+e(t.x0,a)+n(t))/2,a)},ycenter:function(t,n,i){return r((e(t.y1,i)+o(t)+e(t.y0,i)+a(t))/2,i)}}},8606:function(t,e,r){\"use strict\";var n=r(80337),i=r(57891),a=r(93049).extendDeepAll,o=r(13582).overrideAll,s=r(49722),l=r(78032).templatedArray,c=r(64194),u=l(\"step\",{visible:{valType:\"boolean\",dflt:!0},method:{valType:\"enumerated\",values:[\"restyle\",\"relayout\",\"animate\",\"update\",\"skip\"],dflt:\"restyle\"},args:{valType:\"info_array\",freeLength:!0,items:[{valType:\"any\"},{valType:\"any\"},{valType:\"any\"}]},label:{valType:\"string\"},value:{valType:\"string\"},execute:{valType:\"boolean\",dflt:!0}});t.exports=o(l(\"slider\",{visible:{valType:\"boolean\",dflt:!0},active:{valType:\"number\",min:0,dflt:0},steps:u,lenmode:{valType:\"enumerated\",values:[\"fraction\",\"pixels\"],dflt:\"fraction\"},len:{valType:\"number\",min:0,dflt:1},x:{valType:\"number\",min:-2,max:3,dflt:0},pad:a(i({editType:\"arraydraw\"}),{},{t:{dflt:20}}),xanchor:{valType:\"enumerated\",values:[\"auto\",\"left\",\"center\",\"right\"],dflt:\"left\"},y:{valType:\"number\",min:-2,max:3,dflt:0},yanchor:{valType:\"enumerated\",values:[\"auto\",\"top\",\"middle\",\"bottom\"],dflt:\"top\"},transition:{duration:{valType:\"number\",min:0,dflt:150},easing:{valType:\"enumerated\",values:s.transition.easing.values,dflt:\"cubic-in-out\"}},currentvalue:{visible:{valType:\"boolean\",dflt:!0},xanchor:{valType:\"enumerated\",values:[\"left\",\"center\",\"right\"],dflt:\"left\"},offset:{valType:\"number\",dflt:10},prefix:{valType:\"string\"},suffix:{valType:\"string\"},font:n({})},font:n({}),activebgcolor:{valType:\"color\",dflt:c.gripBgActiveColor},bgcolor:{valType:\"color\",dflt:c.railBgColor},bordercolor:{valType:\"color\",dflt:c.railBorderColor},borderwidth:{valType:\"number\",min:0,dflt:c.railBorderWidth},ticklen:{valType:\"number\",min:0,dflt:c.tickLength},tickcolor:{valType:\"color\",dflt:c.tickColor},tickwidth:{valType:\"number\",min:0,dflt:1},minorticklen:{valType:\"number\",min:0,dflt:c.minorTickLength}}),\"arraydraw\",\"from-root\")},64194:function(t){\"use strict\";t.exports={name:\"sliders\",containerClassName:\"slider-container\",groupClassName:\"slider-group\",inputAreaClass:\"slider-input-area\",railRectClass:\"slider-rail-rect\",railTouchRectClass:\"slider-rail-touch-rect\",gripRectClass:\"slider-grip-rect\",tickRectClass:\"slider-tick-rect\",inputProxyClass:\"slider-input-proxy\",labelsClass:\"slider-labels\",labelGroupClass:\"slider-label-group\",labelClass:\"slider-label\",currentValueClass:\"slider-current-value\",railHeight:5,menuIndexAttrName:\"slider-active-index\",autoMarginIdRoot:\"slider-\",minWidth:30,minHeight:30,textPadX:40,arrowOffsetX:4,railRadius:2,railWidth:5,railBorder:4,railBorderWidth:1,railBorderColor:\"#bec8d9\",railBgColor:\"#f8fafc\",railInset:8,stepInset:10,gripRadius:10,gripWidth:20,gripHeight:20,gripBorder:20,gripBorderWidth:1,gripBorderColor:\"#bec8d9\",gripBgColor:\"#f6f8fa\",gripBgActiveColor:\"#dbdde0\",labelPadding:8,labelOffset:0,tickWidth:1,tickColor:\"#333\",tickOffset:25,tickLength:7,minorTickOffset:25,minorTickColor:\"#333\",minorTickLength:4,currentValuePadding:8,currentValueInset:0}},74537:function(t,e,r){\"use strict\";var n=r(34809),i=r(59008),a=r(8606),o=r(64194).name,s=a.steps;function l(t,e,r){function o(r,i){return n.coerce(t,e,a,r,i)}for(var s=i(t,e,{name:\"steps\",handleItemDefaults:c}),l=0,u=0;u0&&(s=s.transition().duration(e.transition.duration).ease(e.transition.easing)),s.attr(\"transform\",l(o-.5*h.gripWidth,e._dims.currentValueTotalHeight))}}function E(t,e){var r=t._dims;return r.inputAreaStart+h.stepInset+(r.inputAreaLength-2*h.stepInset)*Math.min(1,Math.max(0,e))}function C(t,e){var r=t._dims;return Math.min(1,Math.max(0,(e-h.stepInset-r.inputAreaStart)/(r.inputAreaLength-2*h.stepInset-2*r.inputAreaStart)))}function L(t,e,r){var n=r._dims,i=s.ensureSingle(t,\"rect\",h.railTouchRectClass,(function(n){n.call(A,e,t,r).style(\"pointer-events\",\"all\")}));i.attr({width:n.inputAreaLength,height:Math.max(n.inputAreaWidth,h.tickOffset+r.ticklen+n.labelHeight)}).call(a.fill,r.bgcolor).attr(\"opacity\",0),o.setTranslate(i,0,n.currentValueTotalHeight)}function I(t,e){var r=e._dims,n=r.inputAreaLength-2*h.railInset,i=s.ensureSingle(t,\"rect\",h.railRectClass);i.attr({width:n,height:h.railWidth,rx:h.railRadius,ry:h.railRadius,\"shape-rendering\":\"crispEdges\"}).call(a.stroke,e.bordercolor).call(a.fill,e.bgcolor).style(\"stroke-width\",e.borderwidth+\"px\"),o.setTranslate(i,h.railInset,.5*(r.inputAreaWidth-h.railWidth)+r.currentValueTotalHeight)}t.exports=function(t){var e=t._context.staticPlot,r=t._fullLayout,a=function(t,e){for(var r=t[h.name],n=[],i=0;i0?[0]:[]);function l(e){e._commandObserver&&(e._commandObserver.remove(),delete e._commandObserver),i.autoMargin(t,g(e))}if(s.enter().append(\"g\").classed(h.containerClassName,!0).style(\"cursor\",e?null:\"ew-resize\"),s.exit().each((function(){n.select(this).selectAll(\"g.\"+h.groupClassName).each(l)})).remove(),0!==a.length){var c=s.selectAll(\"g.\"+h.groupClassName).data(a,y);c.enter().append(\"g\").classed(h.groupClassName,!0),c.exit().each(l).remove();for(var u=0;u0||T<0){var E={left:[-k,0],right:[k,0],top:[0,-k],bottom:[0,k]}[b.side];a.attr(\"transform\",l(E[0],E[1]))}}}function ft(t,e){t.text(e).on(\"mouseover.opacity\",(function(){n.select(this).transition().duration(f.SHOW_PLACEHOLDER).style(\"opacity\",1)})).on(\"mouseout.opacity\",(function(){n.select(this).transition().duration(f.HIDE_PLACEHOLDER).style(\"opacity\",0)}))}if(at.call(ct,ot),et&&(S?at.on(\".opacity\",null):(ft(at,x),E=!0),at.call(h.makeEditable,{gd:t}).on(\"edit\",(function(e){void 0!==_?o.call(\"_guiRestyle\",t,v,e,_):o.call(\"_guiRelayout\",t,v,e)})).on(\"cancel\",(function(){this.text(this.attr(\"data-unformatted\")).call(ct)})).on(\"input\",(function(t){this.text(t||\" \").call(h.positionText,w.x,w.y)})),N)){if(N&&!S){var pt=at.node().getBBox(),dt=pt.y+pt.height+1.6*W;ot.attr(\"y\",dt)}V?ot.on(\".opacity\",null):(ft(ot,j),q=!0),ot.call(h.makeEditable,{gd:t}).on(\"edit\",(function(e){o.call(\"_guiRelayout\",t,\"title.subtitle.text\",e)})).on(\"cancel\",(function(){this.text(this.attr(\"data-unformatted\")).call(ct)})).on(\"input\",(function(t){this.text(t||\" \").call(h.positionText,ot.attr(\"x\"),ot.attr(\"y\"))}))}return at.classed(\"js-placeholder\",E),ot&&ot.classed(\"js-placeholder\",q),k},SUBTITLE_PADDING_EM:1.6,SUBTITLE_PADDING_MATHJAX_EM:1.6}},85389:function(t,e,r){\"use strict\";var n=r(80337),i=r(10229),a=r(93049).extendFlat,o=r(13582).overrideAll,s=r(57891),l=r(78032).templatedArray,c=l(\"button\",{visible:{valType:\"boolean\"},method:{valType:\"enumerated\",values:[\"restyle\",\"relayout\",\"animate\",\"update\",\"skip\"],dflt:\"restyle\"},args:{valType:\"info_array\",freeLength:!0,items:[{valType:\"any\"},{valType:\"any\"},{valType:\"any\"}]},args2:{valType:\"info_array\",freeLength:!0,items:[{valType:\"any\"},{valType:\"any\"},{valType:\"any\"}]},label:{valType:\"string\",dflt:\"\"},execute:{valType:\"boolean\",dflt:!0}});t.exports=o(l(\"updatemenu\",{_arrayAttrRegexps:[/^updatemenus\\[(0|[1-9][0-9]+)\\]\\.buttons/],visible:{valType:\"boolean\"},type:{valType:\"enumerated\",values:[\"dropdown\",\"buttons\"],dflt:\"dropdown\"},direction:{valType:\"enumerated\",values:[\"left\",\"right\",\"up\",\"down\"],dflt:\"down\"},active:{valType:\"integer\",min:-1,dflt:0},showactive:{valType:\"boolean\",dflt:!0},buttons:c,x:{valType:\"number\",min:-2,max:3,dflt:-.05},xanchor:{valType:\"enumerated\",values:[\"auto\",\"left\",\"center\",\"right\"],dflt:\"right\"},y:{valType:\"number\",min:-2,max:3,dflt:1},yanchor:{valType:\"enumerated\",values:[\"auto\",\"top\",\"middle\",\"bottom\"],dflt:\"top\"},pad:a(s({editType:\"arraydraw\"}),{}),font:n({}),bgcolor:{valType:\"color\"},bordercolor:{valType:\"color\",dflt:i.borderLine},borderwidth:{valType:\"number\",min:0,dflt:1,editType:\"arraydraw\"}}),\"arraydraw\",\"from-root\")},71559:function(t){\"use strict\";t.exports={name:\"updatemenus\",containerClassName:\"updatemenu-container\",headerGroupClassName:\"updatemenu-header-group\",headerClassName:\"updatemenu-header\",headerArrowClassName:\"updatemenu-header-arrow\",dropdownButtonGroupClassName:\"updatemenu-dropdown-button-group\",dropdownButtonClassName:\"updatemenu-dropdown-button\",buttonClassName:\"updatemenu-button\",itemRectClassName:\"updatemenu-item-rect\",itemTextClassName:\"updatemenu-item-text\",menuIndexAttrName:\"updatemenu-active-index\",autoMarginIdRoot:\"updatemenu-\",blankHeaderOpts:{label:\" \"},minWidth:30,minHeight:30,textPadX:24,arrowPadX:16,rx:2,ry:2,textOffsetX:12,textOffsetY:3,arrowOffsetX:4,gapButtonHeader:5,gapButton:2,activeColor:\"#F4FAFF\",hoverColor:\"#F4FAFF\",arrowSymbol:{left:\"◄\",right:\"►\",up:\"▲\",down:\"▼\"}}},42746:function(t,e,r){\"use strict\";var n=r(34809),i=r(59008),a=r(85389),o=r(71559).name,s=a.buttons;function l(t,e,r){function o(r,i){return n.coerce(t,e,a,r,i)}o(\"visible\",i(t,e,{name:\"buttons\",handleItemDefaults:c}).length>0)&&(o(\"active\"),o(\"direction\"),o(\"type\"),o(\"showactive\"),o(\"x\"),o(\"y\"),n.noneOrAll(t,e,[\"x\",\"y\"]),o(\"xanchor\"),o(\"yanchor\"),o(\"pad.t\"),o(\"pad.r\"),o(\"pad.b\"),o(\"pad.l\"),n.coerceFont(o,\"font\",r.font),o(\"bgcolor\",r.paper_bgcolor),o(\"bordercolor\"),o(\"borderwidth\"))}function c(t,e){function r(r,i){return n.coerce(t,e,s,r,i)}r(\"visible\",\"skip\"===t.method||Array.isArray(t.args))&&(r(\"method\"),r(\"args\"),r(\"args2\"),r(\"label\"),r(\"execute\"))}t.exports=function(t,e){i(t,e,{name:o,handleItemDefaults:l})}},40974:function(t,e,r){\"use strict\";var n=r(45568),i=r(44122),a=r(78766),o=r(62203),s=r(34809),l=r(30635),c=r(78032).arrayEditor,u=r(4530).LINE_SPACING,h=r(71559),f=r(21736);function p(t){return t._index}function d(t,e){return+t.attr(h.menuIndexAttrName)===e._index}function m(t,e,r,n,i,a,o,s){e.active=o,c(t.layout,h.name,e).applyUpdate(\"active\",o),\"buttons\"===e.type?y(t,n,null,null,e):\"dropdown\"===e.type&&(i.attr(h.menuIndexAttrName,\"-1\"),g(t,n,i,a,e),s||y(t,n,i,a,e))}function g(t,e,r,n,i){var a=s.ensureSingle(e,\"g\",h.headerClassName,(function(t){t.style(\"pointer-events\",\"all\")})),l=i._dims,c=i.active,u=i.buttons[c]||h.blankHeaderOpts,f={y:i.pad.t,yPad:0,x:i.pad.l,xPad:0,index:0},p={width:l.headerWidth,height:l.headerHeight};a.call(v,i,u,t).call(M,i,f,p),s.ensureSingle(e,\"text\",h.headerArrowClassName,(function(t){t.attr(\"text-anchor\",\"end\").call(o.font,i.font).text(h.arrowSymbol[i.direction])})).attr({x:l.headerWidth-h.arrowOffsetX+i.pad.l,y:l.headerHeight/2+h.textOffsetY+i.pad.t}),a.on(\"click\",(function(){r.call(S,String(d(r,i)?-1:i._index)),y(t,e,r,n,i)})),a.on(\"mouseover\",(function(){a.call(w)})),a.on(\"mouseout\",(function(){a.call(T,i)})),o.setTranslate(e,l.lx,l.ly)}function y(t,e,r,a,o){r||(r=e).attr(\"pointer-events\",\"all\");var l=function(t){return-1==+t.attr(h.menuIndexAttrName)}(r)&&\"buttons\"!==o.type?[]:o.buttons,c=\"dropdown\"===o.type?h.dropdownButtonClassName:h.buttonClassName,u=r.selectAll(\"g.\"+c).data(s.filterVisible(l)),f=u.enter().append(\"g\").classed(c,!0),p=u.exit();\"dropdown\"===o.type?(f.attr(\"opacity\",\"0\").transition().attr(\"opacity\",\"1\"),p.transition().attr(\"opacity\",\"0\").remove()):p.remove();var d=0,g=0,y=o._dims,x=-1!==[\"up\",\"down\"].indexOf(o.direction);\"dropdown\"===o.type&&(x?g=y.headerHeight+h.gapButtonHeader:d=y.headerWidth+h.gapButtonHeader),\"dropdown\"===o.type&&\"up\"===o.direction&&(g=-h.gapButtonHeader+h.gapButton-y.openHeight),\"dropdown\"===o.type&&\"left\"===o.direction&&(d=-h.gapButtonHeader+h.gapButton-y.openWidth);var _={x:y.lx+d+o.pad.l,y:y.ly+g+o.pad.t,yPad:h.gapButton,xPad:h.gapButton,index:0},k={l:_.x+o.borderwidth,t:_.y+o.borderwidth};u.each((function(s,l){var c=n.select(this);c.call(v,o,s,t).call(M,o,_),c.on(\"click\",(function(){n.event.defaultPrevented||(s.execute&&(s.args2&&o.active===l?(m(t,o,0,e,r,a,-1),i.executeAPICommand(t,s.method,s.args2)):(m(t,o,0,e,r,a,l),i.executeAPICommand(t,s.method,s.args))),t.emit(\"plotly_buttonclicked\",{menu:o,button:s,active:o.active}))})),c.on(\"mouseover\",(function(){c.call(w)})),c.on(\"mouseout\",(function(){c.call(T,o),u.call(b,o)}))})),u.call(b,o),x?(k.w=Math.max(y.openWidth,y.headerWidth),k.h=_.y-k.t):(k.w=_.x-k.l,k.h=Math.max(y.openHeight,y.headerHeight)),k.direction=o.direction,a&&(u.size()?function(t,e,r,n,i,a){var o,s,l,c=i.direction,u=\"up\"===c||\"down\"===c,f=i._dims,p=i.active;if(u)for(s=0,l=0;l0?[0]:[]);if(o.enter().append(\"g\").classed(h.containerClassName,!0).style(\"cursor\",\"pointer\"),o.exit().each((function(){n.select(this).selectAll(\"g.\"+h.headerGroupClassName).each(a)})).remove(),0!==r.length){var l=o.selectAll(\"g.\"+h.headerGroupClassName).data(r,p);l.enter().append(\"g\").classed(h.headerGroupClassName,!0);for(var c=s.ensureSingle(o,\"g\",h.dropdownButtonGroupClassName,(function(t){t.style(\"pointer-events\",\"all\")})),u=0;uw,A=s.barLength+2*s.barPad,M=s.barWidth+2*s.barPad,S=d,E=g+y;E+M>c&&(E=c-M);var C=this.container.selectAll(\"rect.scrollbar-horizontal\").data(k?[0]:[]);C.exit().on(\".drag\",null).remove(),C.enter().append(\"rect\").classed(\"scrollbar-horizontal\",!0).call(i.fill,s.barColor),k?(this.hbar=C.attr({rx:s.barRadius,ry:s.barRadius,x:S,y:E,width:A,height:M}),this._hbarXMin=S+A/2,this._hbarTranslateMax=w-A):(delete this.hbar,delete this._hbarXMin,delete this._hbarTranslateMax);var L=y>T,I=s.barWidth+2*s.barPad,P=s.barLength+2*s.barPad,z=d+m,O=g;z+I>l&&(z=l-I);var D=this.container.selectAll(\"rect.scrollbar-vertical\").data(L?[0]:[]);D.exit().on(\".drag\",null).remove(),D.enter().append(\"rect\").classed(\"scrollbar-vertical\",!0).call(i.fill,s.barColor),L?(this.vbar=D.attr({rx:s.barRadius,ry:s.barRadius,x:z,y:O,width:I,height:P}),this._vbarYMin=O+P/2,this._vbarTranslateMax=T-P):(delete this.vbar,delete this._vbarYMin,delete this._vbarTranslateMax);var R=this.id,F=u-.5,B=L?h+I+.5:h+.5,N=f-.5,j=k?p+M+.5:p+.5,U=o._topdefs.selectAll(\"#\"+R).data(k||L?[0]:[]);if(U.exit().remove(),U.enter().append(\"clipPath\").attr(\"id\",R).append(\"rect\"),k||L?(this._clipRect=U.select(\"rect\").attr({x:Math.floor(F),y:Math.floor(N),width:Math.ceil(B)-Math.floor(F),height:Math.ceil(j)-Math.floor(N)}),this.container.call(a.setClipUrl,R,this.gd),this.bg.attr({x:d,y:g,width:m,height:y})):(this.bg.attr({width:0,height:0}),this.container.on(\"wheel\",null).on(\".drag\",null).call(a.setClipUrl,null),delete this._clipRect),k||L){var V=n.behavior.drag().on(\"dragstart\",(function(){n.event.sourceEvent.preventDefault()})).on(\"drag\",this._onBoxDrag.bind(this));this.container.on(\"wheel\",null).on(\"wheel\",this._onBoxWheel.bind(this)).on(\".drag\",null).call(V);var q=n.behavior.drag().on(\"dragstart\",(function(){n.event.sourceEvent.preventDefault(),n.event.sourceEvent.stopPropagation()})).on(\"drag\",this._onBarDrag.bind(this));k&&this.hbar.on(\".drag\",null).call(q),L&&this.vbar.on(\".drag\",null).call(q)}this.setTranslate(e,r)},s.prototype.disable=function(){(this.hbar||this.vbar)&&(this.bg.attr({width:0,height:0}),this.container.on(\"wheel\",null).on(\".drag\",null).call(a.setClipUrl,null),delete this._clipRect),this.hbar&&(this.hbar.on(\".drag\",null),this.hbar.remove(),delete this.hbar,delete this._hbarXMin,delete this._hbarTranslateMax),this.vbar&&(this.vbar.on(\".drag\",null),this.vbar.remove(),delete this.vbar,delete this._vbarYMin,delete this._vbarTranslateMax)},s.prototype._onBoxDrag=function(){var t=this.translateX,e=this.translateY;this.hbar&&(t-=n.event.dx),this.vbar&&(e-=n.event.dy),this.setTranslate(t,e)},s.prototype._onBoxWheel=function(){var t=this.translateX,e=this.translateY;this.hbar&&(t+=n.event.deltaY),this.vbar&&(e+=n.event.deltaY),this.setTranslate(t,e)},s.prototype._onBarDrag=function(){var t=this.translateX,e=this.translateY;if(this.hbar){var r=t+this._hbarXMin,i=r+this._hbarTranslateMax;t=(o.constrain(n.event.x,r,i)-r)/(i-r)*(this.position.w-this._box.w)}if(this.vbar){var a=e+this._vbarYMin,s=a+this._vbarTranslateMax;e=(o.constrain(n.event.y,a,s)-a)/(s-a)*(this.position.h-this._box.h)}this.setTranslate(t,e)},s.prototype.setTranslate=function(t,e){var r=this.position.w-this._box.w,n=this.position.h-this._box.h;if(t=o.constrain(t||0,0,r),e=o.constrain(e||0,0,n),this.translateX=t,this.translateY=e,this.container.call(a.setTranslate,this._box.l-this.position.l-t,this._box.t-this.position.t-e),this._clipRect&&this._clipRect.attr({x:Math.floor(this.position.l+t-.5),y:Math.floor(this.position.t+e-.5)}),this.hbar){var i=t/r;this.hbar.call(a.setTranslate,t+i*this._hbarTranslateMax,e)}if(this.vbar){var s=e/n;this.vbar.call(a.setTranslate,t,e+s*this._vbarTranslateMax)}}},4530:function(t){\"use strict\";t.exports={FROM_BL:{left:0,center:.5,right:1,bottom:0,middle:.5,top:1},FROM_TL:{left:0,center:.5,right:1,bottom:1,middle:.5,top:0},FROM_BR:{left:1,center:.5,right:0,bottom:0,middle:.5,top:1},LINE_SPACING:1.3,CAP_SHIFT:.7,MID_SHIFT:.35,OPPOSITE_SIDE:{left:\"right\",right:\"left\",top:\"bottom\",bottom:\"top\"}}},35081:function(t){\"use strict\";t.exports={axisRefDescription:function(t,e,r){return[\"If set to a\",t,\"axis id (e.g. *\"+t+\"* or\",\"*\"+t+\"2*), the `\"+t+\"` position refers to a\",t,\"coordinate. If set to *paper*, the `\"+t+\"`\",\"position refers to the distance from the\",e,\"of the plotting\",\"area in normalized coordinates where *0* (*1*) corresponds to the\",e,\"(\"+r+\"). If set to a\",t,\"axis ID followed by\",\"*domain* (separated by a space), the position behaves like for\",\"*paper*, but refers to the distance in fractions of the domain\",\"length from the\",e,\"of the domain of that axis: e.g.,\",\"*\"+t+\"2 domain* refers to the domain of the second\",t,\" axis and a\",t,\"position of 0.5 refers to the\",\"point between the\",e,\"and the\",r,\"of the domain of the\",\"second\",t,\"axis.\"].join(\" \")}}},20909:function(t){\"use strict\";t.exports={INCREASING:{COLOR:\"#3D9970\",SYMBOL:\"▲\"},DECREASING:{COLOR:\"#FF4136\",SYMBOL:\"▼\"}}},87296:function(t){\"use strict\";t.exports={FORMAT_LINK:\"https://github.com/d3/d3-format/tree/v1.4.5#d3-format\",DATE_FORMAT_LINK:\"https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format\"}},20726:function(t){\"use strict\";t.exports={COMPARISON_OPS:[\"=\",\"!=\",\"<\",\">=\",\">\",\"<=\"],COMPARISON_OPS2:[\"=\",\"<\",\">=\",\">\",\"<=\"],INTERVAL_OPS:[\"[]\",\"()\",\"[)\",\"(]\",\"][\",\")(\",\"](\",\")[\"],SET_OPS:[\"{}\",\"}{\"],CONSTRAINT_REDUCTION:{\"=\":\"=\",\"<\":\"<\",\"<=\":\"<\",\">\":\">\",\">=\":\">\",\"[]\":\"[]\",\"()\":\"[]\",\"[)\":\"[]\",\"(]\":\"[]\",\"][\":\"][\",\")(\":\"][\",\"](\":\"][\",\")[\":\"][\"}}},84770:function(t){\"use strict\";t.exports={solid:[[],0],dot:[[.5,1],200],dash:[[.5,1],50],longdash:[[.5,1],10],dashdot:[[.5,.625,.875,1],50],longdashdot:[[.5,.7,.8,1],10]}},49467:function(t){\"use strict\";t.exports={circle:\"●\",\"circle-open\":\"○\",square:\"■\",\"square-open\":\"□\",diamond:\"◆\",\"diamond-open\":\"◇\",cross:\"+\",x:\"❌\"}},20438:function(t){\"use strict\";t.exports={SHOW_PLACEHOLDER:100,HIDE_PLACEHOLDER:1e3,DESELECTDIM:.2}},63821:function(t){\"use strict\";t.exports={BADNUM:void 0,FP_SAFE:1e-4*Number.MAX_VALUE,ONEMAXYEAR:316224e5,ONEAVGYEAR:315576e5,ONEMINYEAR:31536e6,ONEMAXQUARTER:79488e5,ONEAVGQUARTER:78894e5,ONEMINQUARTER:76896e5,ONEMAXMONTH:26784e5,ONEAVGMONTH:26298e5,ONEMINMONTH:24192e5,ONEWEEK:6048e5,ONEDAY:864e5,ONEHOUR:36e5,ONEMIN:6e4,ONESEC:1e3,ONEMILLI:1,ONEMICROSEC:.001,EPOCHJD:2440587.5,ALMOST_EQUAL:.999999,LOG_CLIP:10,MINUS_SIGN:\"−\"}},1837:function(t,e){\"use strict\";e.CSS_DECLARATIONS=[[\"image-rendering\",\"optimizeSpeed\"],[\"image-rendering\",\"-moz-crisp-edges\"],[\"image-rendering\",\"-o-crisp-edges\"],[\"image-rendering\",\"-webkit-optimize-contrast\"],[\"image-rendering\",\"optimize-contrast\"],[\"image-rendering\",\"crisp-edges\"],[\"image-rendering\",\"pixelated\"]],e.STYLE=e.CSS_DECLARATIONS.map((function(t){return t.join(\": \")+\"; \"})).join(\"\")},62972:function(t,e){\"use strict\";e.xmlns=\"http://www.w3.org/2000/xmlns/\",e.svg=\"http://www.w3.org/2000/svg\",e.xlink=\"http://www.w3.org/1999/xlink\",e.svgAttrs={xmlns:e.svg,\"xmlns:xlink\":e.xlink}},17430:function(t,e,r){\"use strict\";e.version=r(29697).version,r(71116),r(6713);for(var n=r(33626),i=e.register=n.register,a=r(90742),o=Object.keys(a),s=0;s\",\"\",\" \",\"\",\" plotly-logomark\",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\"\"].join(\"\")}}},32546:function(t,e){\"use strict\";e.isLeftAnchor=function(t){return\"left\"===t.xanchor||\"auto\"===t.xanchor&&t.x<=1/3},e.isCenterAnchor=function(t){return\"center\"===t.xanchor||\"auto\"===t.xanchor&&t.x>1/3&&t.x<2/3},e.isRightAnchor=function(t){return\"right\"===t.xanchor||\"auto\"===t.xanchor&&t.x>=2/3},e.isTopAnchor=function(t){return\"top\"===t.yanchor||\"auto\"===t.yanchor&&t.y>=2/3},e.isMiddleAnchor=function(t){return\"middle\"===t.yanchor||\"auto\"===t.yanchor&&t.y>1/3&&t.y<2/3},e.isBottomAnchor=function(t){return\"bottom\"===t.yanchor||\"auto\"===t.yanchor&&t.y<=1/3}},44313:function(t,e,r){\"use strict\";var n=r(98953),i=n.mod,a=n.modHalf,o=Math.PI,s=2*o;function l(t){return Math.abs(t[1]-t[0])>s-1e-14}function c(t,e){return a(e-t,s)}function u(t,e){if(l(e))return!0;var r,n;e[0](n=i(n,s))&&(n+=s);var a=i(t,s),o=a+s;return a>=r&&a<=n||o>=r&&o<=n}function h(t,e,r,n,i,a,c){i=i||0,a=a||0;var u,h,f,p,d,m=l([r,n]);function g(t,e){return[t*Math.cos(e)+i,a-t*Math.sin(e)]}m?(u=0,h=o,f=s):r=i&&t<=a);var i,a},pathArc:function(t,e,r,n,i){return h(null,t,e,r,n,i,0)},pathSector:function(t,e,r,n,i){return h(null,t,e,r,n,i,1)},pathAnnulus:function(t,e,r,n,i,a){return h(t,e,r,n,i,a,1)}}},87800:function(t,e,r){\"use strict\";var n=r(93229).decode,i=r(56174),a=Array.isArray,o=ArrayBuffer,s=DataView;function l(t){return o.isView(t)&&!(t instanceof s)}function c(t){return a(t)||l(t)}e.isTypedArray=l,e.isArrayOrTypedArray=c,e.isArray1D=function(t){return!c(t[0])},e.ensureArray=function(t,e){return a(t)||(t=[]),t.length=e,t};var u={u1c:\"undefined\"==typeof Uint8ClampedArray?void 0:Uint8ClampedArray,i1:\"undefined\"==typeof Int8Array?void 0:Int8Array,u1:\"undefined\"==typeof Uint8Array?void 0:Uint8Array,i2:\"undefined\"==typeof Int16Array?void 0:Int16Array,u2:\"undefined\"==typeof Uint16Array?void 0:Uint16Array,i4:\"undefined\"==typeof Int32Array?void 0:Int32Array,u4:\"undefined\"==typeof Uint32Array?void 0:Uint32Array,f4:\"undefined\"==typeof Float32Array?void 0:Float32Array,f8:\"undefined\"==typeof Float64Array?void 0:Float64Array};function h(t){return t.constructor===ArrayBuffer}function f(t,e,r){if(c(t)){if(c(t[0])){for(var n=r,i=0;ii.max?e.set(r):e.set(+t)}},integer:{coerceFunction:function(t,e,r,i){-1===(i.extras||[]).indexOf(t)?(d(t)&&(t=m(t)),t%1||!n(t)||void 0!==i.min&&ti.max?e.set(r):e.set(+t)):e.set(t)}},string:{coerceFunction:function(t,e,r,n){if(\"string\"!=typeof t){var i=\"number\"==typeof t;!0!==n.strict&&i?e.set(String(t)):e.set(r)}else n.noBlank&&!t?e.set(r):e.set(t)}},color:{coerceFunction:function(t,e,r){d(t)&&(t=m(t)),i(t).isValid()?e.set(t):e.set(r)}},colorlist:{coerceFunction:function(t,e,r){Array.isArray(t)&&t.length&&t.every((function(t){return i(t).isValid()}))?e.set(t):e.set(r)}},colorscale:{coerceFunction:function(t,e,r){e.set(s.get(t,r))}},angle:{coerceFunction:function(t,e,r){d(t)&&(t=m(t)),\"auto\"===t?e.set(\"auto\"):n(t)?e.set(f(+t,360)):e.set(r)}},subplotid:{coerceFunction:function(t,e,r,n){var i=n.regex||h(r);\"string\"==typeof t&&i.test(t)?e.set(t):e.set(r)},validateFunction:function(t,e){var r=e.dflt;return t===r||\"string\"==typeof t&&!!h(r).test(t)}},flaglist:{coerceFunction:function(t,e,r,n){if(-1===(n.extras||[]).indexOf(t))if(\"string\"==typeof t){for(var i=t.split(\"+\"),a=0;a=n&&t<=i?t:u}if(\"string\"!=typeof t&&\"number\"!=typeof t)return u;t=String(t);var c=b(r),y=t.charAt(0);!c||\"G\"!==y&&\"g\"!==y||(t=t.substr(1),r=\"\");var w=c&&\"chinese\"===r.substr(0,7),T=t.match(w?x:v);if(!T)return u;var k=T[1],A=T[3]||\"1\",M=Number(T[5]||1),S=Number(T[7]||0),E=Number(T[9]||0),C=Number(T[11]||0);if(c){if(2===k.length)return u;var L;k=Number(k);try{var I=g.getComponentMethod(\"calendars\",\"getCal\")(r);if(w){var P=\"i\"===A.charAt(A.length-1);A=parseInt(A,10),L=I.newDate(k,I.toMonthIndex(k,A,P),M)}else L=I.newDate(k,Number(A),M)}catch(t){return u}return L?(L.toJD()-m)*h+S*f+E*p+C*d:u}k=2===k.length?(Number(k)+2e3-_)%100+_:Number(k),A-=1;var z=new Date(Date.UTC(2e3,A,M,S,E));return z.setUTCFullYear(k),z.getUTCMonth()!==A||z.getUTCDate()!==M?u:z.getTime()+C*d},n=e.MIN_MS=e.dateTime2ms(\"-9999\"),i=e.MAX_MS=e.dateTime2ms(\"9999-12-31 23:59:59.9999\"),e.isDateTime=function(t,r){return e.dateTime2ms(t,r)!==u};var T=90*h,k=3*f,A=5*p;function M(t,e,r,n,i){if((e||r||n||i)&&(t+=\" \"+w(e,2)+\":\"+w(r,2),(n||i)&&(t+=\":\"+w(n,2),i))){for(var a=4;i%10==0;)a-=1,i/=10;t+=\".\"+w(i,a)}return t}e.ms2DateTime=function(t,e,r){if(\"number\"!=typeof t||!(t>=n&&t<=i))return u;e||(e=0);var a,o,s,c,v,x,_=Math.floor(10*l(t+.05,1)),w=Math.round(t-_/10);if(b(r)){var S=Math.floor(w/h)+m,E=Math.floor(l(t,h));try{a=g.getComponentMethod(\"calendars\",\"getCal\")(r).fromJD(S).formatDate(\"yyyy-mm-dd\")}catch(t){a=y(\"G%Y-%m-%d\")(new Date(w))}if(\"-\"===a.charAt(0))for(;a.length<11;)a=\"-0\"+a.substr(1);else for(;a.length<10;)a=\"0\"+a;o=e=n+h&&t<=i-h))return u;var e=Math.floor(10*l(t+.05,1)),r=new Date(Math.round(t-e/10));return M(a(\"%Y-%m-%d\")(r),r.getHours(),r.getMinutes(),r.getSeconds(),10*r.getUTCMilliseconds()+e)},e.cleanDate=function(t,r,n){if(t===u)return r;if(e.isJSDate(t)||\"number\"==typeof t&&isFinite(t)){if(b(n))return s.error(\"JS Dates and milliseconds are incompatible with world calendars\",t),r;if(!(t=e.ms2DateTimeLocal(+t))&&void 0!==r)return r}else if(!e.isDateTime(t,n))return s.error(\"unrecognized date\",t),r;return t};var S=/%\\d?f/g,E=/%h/g,C={1:\"1\",2:\"1\",3:\"2\",4:\"2\"};function L(t,e,r,n){t=t.replace(S,(function(t){var r=Math.min(+t.charAt(1)||6,6);return(e/1e3%1+2).toFixed(r).substr(2).replace(/0+$/,\"\")||\"0\"}));var i=new Date(Math.floor(e+.05));if(t=t.replace(E,(function(){return C[r(\"%q\")(i)]})),b(n))try{t=g.getComponentMethod(\"calendars\",\"worldCalFmt\")(t,e,n)}catch(t){return\"Invalid\"}return r(t)(i)}var I=[59,59.9,59.99,59.999,59.9999];e.formatDate=function(t,e,r,n,i,a){if(i=b(i)&&i,!e)if(\"y\"===r)e=a.year;else if(\"m\"===r)e=a.month;else{if(\"d\"!==r)return function(t,e){var r=l(t+.05,h),n=w(Math.floor(r/f),2)+\":\"+w(l(Math.floor(r/p),60),2);if(\"M\"!==e){o(e)||(e=0);var i=(100+Math.min(l(t/d,60),I[e])).toFixed(e).substr(1);e>0&&(i=i.replace(/0+$/,\"\").replace(/[\\.]$/,\"\")),n+=\":\"+i}return n}(t,r)+\"\\n\"+L(a.dayMonthYear,t,n,i);e=a.dayMonth+\"\\n\"+a.year}return L(e,t,n,i)};var P=3*h;e.incrementMonth=function(t,e,r){r=b(r)&&r;var n=l(t,h);if(t=Math.round(t-n),r)try{var i=Math.round(t/h)+m,a=g.getComponentMethod(\"calendars\",\"getCal\")(r),o=a.fromJD(i);return e%12?a.add(o,e,\"m\"):a.add(o,e/12,\"y\"),(o.toJD()-m)*h+n}catch(e){s.error(\"invalid ms \"+t+\" in calendar \"+r)}var c=new Date(t+P);return c.setUTCMonth(c.getUTCMonth()+e)+n-P},e.findExactDates=function(t,e){for(var r,n,i=0,a=0,s=0,l=0,c=b(e)&&g.getComponentMethod(\"calendars\",\"getCal\")(e),u=0;u0&&t[e+1][0]<0)return e;return null}switch(e=\"RUS\"===s||\"FJI\"===s?function(t){var e;if(null===c(t))e=t;else for(e=new Array(t.length),i=0;ie?r[n++]=[t[i][0]+360,t[i][1]]:i===e?(r[n++]=t[i],r[n++]=[t[i][0],-90]):r[n++]=t[i];var a=f.tester(r);a.pts.pop(),l.push(a)}:function(t){l.push(f.tester(t))},a.type){case\"MultiPolygon\":for(r=0;r0?u.properties.ct=function(t){var e,r=t.geometry;if(\"MultiPolygon\"===r.type)for(var n=r.coordinates,i=0,s=0;si&&(i=c,e=l)}else e=r;return o(e).geometry.coordinates}(u):u.properties.ct=[NaN,NaN],n.fIn=t,n.fOut=u,s.push(u)}else c.log([\"Location\",n.loc,\"does not have a valid GeoJSON geometry.\",\"Traces with locationmode *geojson-id* only support\",\"*Polygon* and *MultiPolygon* geometries.\"].join(\" \"))}delete i[r]}switch(r.type){case\"FeatureCollection\":var f=r.features;for(n=0;n100?(clearInterval(a),n(\"Unexpected error while fetching from \"+t)):void i++}),50)}))}for(var o=0;o0&&(r.push(i),i=[])}return i.length>0&&r.push(i),r},e.makeLine=function(t){return 1===t.length?{type:\"LineString\",coordinates:t[0]}:{type:\"MultiLineString\",coordinates:t}},e.makePolygon=function(t){if(1===t.length)return{type:\"Polygon\",coordinates:t};for(var e=new Array(t.length),r=0;r1||m<0||m>1?null:{x:t+l*m,y:e+h*m}}function l(t,e,r,n,i){var a=n*t+i*e;if(a<0)return n*n+i*i;if(a>r){var o=n-t,s=i-e;return o*o+s*s}var l=n*e-i*t;return l*l/r}e.segmentsIntersect=s,e.segmentDistance=function(t,e,r,n,i,a,o,c){if(s(t,e,r,n,i,a,o,c))return 0;var u=r-t,h=n-e,f=o-i,p=c-a,d=u*u+h*h,m=f*f+p*p,g=Math.min(l(u,h,d,i-t,a-e),l(u,h,d,o-t,c-e),l(f,p,m,t-i,e-a),l(f,p,m,r-i,n-a));return Math.sqrt(g)},e.getTextLocation=function(t,e,r,s){if(t===i&&s===a||(n={},i=t,a=s),n[r])return n[r];var l=t.getPointAtLength(o(r-s/2,e)),c=t.getPointAtLength(o(r+s/2,e)),u=Math.atan((c.y-l.y)/(c.x-l.x)),h=t.getPointAtLength(o(r,e)),f={x:(4*h.x+l.x+c.x)/6,y:(4*h.y+l.y+c.y)/6,theta:u};return n[r]=f,f},e.clearLocationCache=function(){i=null},e.getVisibleSegment=function(t,e,r){var n,i,a=e.left,o=e.right,s=e.top,l=e.bottom,c=0,u=t.getTotalLength(),h=u;function f(e){var r=t.getPointAtLength(e);0===e?n=r:e===u&&(i=r);var c=r.xo?r.x-o:0,h=r.yl?r.y-l:0;return Math.sqrt(c*c+h*h)}for(var p=f(c);p;){if((c+=p+r)>h)return;p=f(c)}for(p=f(h);p;){if(c>(h-=p+r))return;p=f(h)}return{min:c,max:h,len:h-c,total:u,isClosed:0===c&&h===u&&Math.abs(n.x-i.x)<.1&&Math.abs(n.y-i.y)<.1}},e.findPointOnPath=function(t,e,r,n){for(var i,a,o,s=(n=n||{}).pathLength||t.getTotalLength(),l=n.tolerance||.001,c=n.iterationLimit||30,u=t.getPointAtLength(0)[r]>t.getPointAtLength(s)[r]?-1:1,h=0,f=0,p=s;h0?p=i:f=i,h++}return a}},46998:function(t,e,r){\"use strict\";var n=r(10721),i=r(65657),a=r(162),o=r(88856),s=r(10229).defaultLine,l=r(87800).isArrayOrTypedArray,c=a(s);function u(t,e){var r=t;return r[3]*=e,r}function h(t){if(n(t))return c;var e=a(t);return e.length?e:c}function f(t){return n(t)?t:1}t.exports={formatColor:function(t,e,r){var n=t.color;n&&n._inputArray&&(n=n._inputArray);var i,s,p,d,m,g=l(n),y=l(e),v=o.extractOpts(t),x=[];if(i=void 0!==v.colorscale?o.makeColorScaleFuncFromTrace(t):h,s=g?function(t,e){return void 0===t[e]?c:a(i(t[e]))}:h,p=y?function(t,e){return void 0===t[e]?1:f(t[e])}:f,g||y)for(var _=0;_1?(r*t+r*e)/r:t+e,i=String(n).length;if(i>16){var a=String(e).length;if(i>=String(t).length+a){var o=parseFloat(n).toPrecision(12);-1===o.indexOf(\"e+\")&&(n=+o)}}return n}},34809:function(t,e,r){\"use strict\";var n=r(45568),i=r(42696).aL,a=r(36464).GP,o=r(10721),s=r(63821),l=s.FP_SAFE,c=-l,u=s.BADNUM,h=t.exports={};h.adjustFormat=function(t){return!t||/^\\d[.]\\df/.test(t)||/[.]\\d%/.test(t)?t:\"0.f\"===t?\"~f\":/^\\d%/.test(t)?\"~%\":/^\\ds/.test(t)?\"~s\":!/^[~,.0$]/.test(t)&&/[&fps]/.test(t)?\"~\"+t:t};var f={};h.warnBadFormat=function(t){var e=String(t);f[e]||(f[e]=1,h.warn('encountered bad format: \"'+e+'\"'))},h.noFormat=function(t){return String(t)},h.numberFormat=function(t){var e;try{e=a(h.adjustFormat(t))}catch(e){return h.warnBadFormat(t),h.noFormat}return e},h.nestedProperty=r(35632),h.keyedContainer=r(34967),h.relativeAttr=r(82047),h.isPlainObject=r(56174),h.toLogRange=r(8083),h.relinkPrivateKeys=r(80428);var p=r(87800);h.isArrayBuffer=p.isArrayBuffer,h.isTypedArray=p.isTypedArray,h.isArrayOrTypedArray=p.isArrayOrTypedArray,h.isArray1D=p.isArray1D,h.ensureArray=p.ensureArray,h.concat=p.concat,h.maxRowLength=p.maxRowLength,h.minRowLength=p.minRowLength;var d=r(98953);h.mod=d.mod,h.modHalf=d.modHalf;var m=r(34220);h.valObjectMeta=m.valObjectMeta,h.coerce=m.coerce,h.coerce2=m.coerce2,h.coerceFont=m.coerceFont,h.coercePattern=m.coercePattern,h.coerceHoverinfo=m.coerceHoverinfo,h.coerceSelectionMarkerOpacity=m.coerceSelectionMarkerOpacity,h.validate=m.validate;var g=r(92596);h.dateTime2ms=g.dateTime2ms,h.isDateTime=g.isDateTime,h.ms2DateTime=g.ms2DateTime,h.ms2DateTimeLocal=g.ms2DateTimeLocal,h.cleanDate=g.cleanDate,h.isJSDate=g.isJSDate,h.formatDate=g.formatDate,h.incrementMonth=g.incrementMonth,h.dateTick0=g.dateTick0,h.dfltRange=g.dfltRange,h.findExactDates=g.findExactDates,h.MIN_MS=g.MIN_MS,h.MAX_MS=g.MAX_MS;var y=r(98813);h.findBin=y.findBin,h.sorterAsc=y.sorterAsc,h.sorterDes=y.sorterDes,h.distinctVals=y.distinctVals,h.roundUp=y.roundUp,h.sort=y.sort,h.findIndexOfMin=y.findIndexOfMin,h.sortObjectKeys=r(62994);var v=r(89258);h.aggNums=v.aggNums,h.len=v.len,h.mean=v.mean,h.geometricMean=v.geometricMean,h.median=v.median,h.midRange=v.midRange,h.variance=v.variance,h.stdev=v.stdev,h.interp=v.interp;var x=r(15236);h.init2dArray=x.init2dArray,h.transposeRagged=x.transposeRagged,h.dot=x.dot,h.translationMatrix=x.translationMatrix,h.rotationMatrix=x.rotationMatrix,h.rotationXYMatrix=x.rotationXYMatrix,h.apply3DTransform=x.apply3DTransform,h.apply2DTransform=x.apply2DTransform,h.apply2DTransform2=x.apply2DTransform2,h.convertCssMatrix=x.convertCssMatrix,h.inverseTransformMatrix=x.inverseTransformMatrix;var _=r(44313);h.deg2rad=_.deg2rad,h.rad2deg=_.rad2deg,h.angleDelta=_.angleDelta,h.angleDist=_.angleDist,h.isFullCircle=_.isFullCircle,h.isAngleInsideSector=_.isAngleInsideSector,h.isPtInsideSector=_.isPtInsideSector,h.pathArc=_.pathArc,h.pathSector=_.pathSector,h.pathAnnulus=_.pathAnnulus;var b=r(32546);h.isLeftAnchor=b.isLeftAnchor,h.isCenterAnchor=b.isCenterAnchor,h.isRightAnchor=b.isRightAnchor,h.isTopAnchor=b.isTopAnchor,h.isMiddleAnchor=b.isMiddleAnchor,h.isBottomAnchor=b.isBottomAnchor;var w=r(3447);h.segmentsIntersect=w.segmentsIntersect,h.segmentDistance=w.segmentDistance,h.getTextLocation=w.getTextLocation,h.clearLocationCache=w.clearLocationCache,h.getVisibleSegment=w.getVisibleSegment,h.findPointOnPath=w.findPointOnPath;var T=r(93049);h.extendFlat=T.extendFlat,h.extendDeep=T.extendDeep,h.extendDeepAll=T.extendDeepAll,h.extendDeepNoArrays=T.extendDeepNoArrays;var k=r(48636);h.log=k.log,h.warn=k.warn,h.error=k.error;var A=r(90694);h.counterRegex=A.counter;var M=r(64025);h.throttle=M.throttle,h.throttleDone=M.done,h.clearThrottle=M.clear;var S=r(95425);function E(t){var e={};for(var r in t)for(var n=t[r],i=0;il||t=e)&&o(t)&&t>=0&&t%1==0},h.noop=r(4969),h.identity=r(29527),h.repeat=function(t,e){for(var r=new Array(e),n=0;nr?Math.max(r,Math.min(e,t)):Math.max(e,Math.min(r,t))},h.bBoxIntersect=function(t,e,r){return r=r||0,t.left<=e.right+r&&e.left<=t.right+r&&t.top<=e.bottom+r&&e.top<=t.bottom+r},h.simpleMap=function(t,e,r,n,i){for(var a=t.length,o=new Array(a),s=0;s=Math.pow(2,r)?i>10?(h.warn(\"randstr failed uniqueness\"),l):t(e,r,n,(i||0)+1):l},h.OptionControl=function(t,e){t||(t={}),e||(e=\"opt\");var r={optionList:[],_newoption:function(n){n[e]=t,r[n.name]=n,r.optionList.push(n)}};return r[\"_\"+e]=t,r},h.smooth=function(t,e){if((e=Math.round(e)||0)<2)return t;var r,n,i,a,o=t.length,s=2*o,l=2*e-1,c=new Array(l),u=new Array(o);for(r=0;r=s&&(i-=s*Math.floor(i/s)),i<0?i=-1-i:i>=o&&(i=s-1-i),a+=t[i]*c[n];u[r]=a}return u},h.syncOrAsync=function(t,e,r){var n;function i(){return h.syncOrAsync(t,e,r)}for(;t.length;)if((n=(0,t.splice(0,1)[0])(e))&&n.then)return n.then(i);return r&&r(e)},h.stripTrailingSlash=function(t){return\"/\"===t.substr(-1)?t.substr(0,t.length-1):t},h.noneOrAll=function(t,e,r){if(t){var n,i=!1,a=!0;for(n=0;n0?e:0}))},h.fillArray=function(t,e,r,n){if(n=n||h.identity,h.isArrayOrTypedArray(t))for(var i=0;i1?i+o[1]:\"\";if(a&&(o.length>1||s.length>4||r))for(;n.test(s);)s=s.replace(n,\"$1\"+a+\"$2\");return s+l},h.TEMPLATE_STRING_REGEX=/%{([^\\s%{}:]*)([:|\\|][^}]*)?}/g;var D=/^\\w*$/;h.templateString=function(t,e){var r={};return t.replace(h.TEMPLATE_STRING_REGEX,(function(t,n){var i;return D.test(n)?i=e[n]:(r[n]=r[n]||h.nestedProperty(e,n).get,i=r[n]()),h.isValidTextValue(i)?i:\"\"}))};var R={max:10,count:0,name:\"hovertemplate\"};h.hovertemplateString=function(){return U.apply(R,arguments)};var F={max:10,count:0,name:\"texttemplate\"};h.texttemplateString=function(){return U.apply(F,arguments)};var B=/^(\\S+)([\\*\\/])(-?\\d+(\\.\\d+)?)$/,N={max:10,count:0,name:\"texttemplate\",parseMultDiv:!0};h.texttemplateStringForShapes=function(){return U.apply(N,arguments)};var j=/^[:|\\|]/;function U(t,e,r){var n=this,a=arguments;e||(e={});var o={};return t.replace(h.TEMPLATE_STRING_REGEX,(function(t,s,l){var c=\"_xother\"===s||\"_yother\"===s,u=\"_xother_\"===s||\"_yother_\"===s,f=\"xother_\"===s||\"yother_\"===s,p=\"xother\"===s||\"yother\"===s||c||f||u,d=s;(c||u)&&(d=d.substring(1)),(f||u)&&(d=d.substring(0,d.length-1));var m,g,y,v=null,x=null;if(n.parseMultDiv){var _=function(t){var e=t.match(B);return e?{key:e[1],op:e[2],number:Number(e[3])}:{key:t,op:null,number:null}}(d);d=_.key,v=_.op,x=_.number}if(p){if(void 0===(m=e[d]))return\"\"}else for(y=3;y=48&&o<=57,c=s>=48&&s<=57;if(l&&(n=10*n+o-48),c&&(i=10*i+s-48),!l||!c){if(n!==i)return n-i;if(o!==s)return o-s}}return i-n};var V=2e9;h.seedPseudoRandom=function(){V=2e9},h.pseudoRandom=function(){var t=V;return V=(69069*V+1)%4294967296,Math.abs(V-t)<429496729?h.pseudoRandom():V/4294967296},h.fillText=function(t,e,r){var n=Array.isArray(r)?function(t){r.push(t)}:function(t){r.text=t},i=h.extractOption(t,e,\"htx\",\"hovertext\");if(h.isValidTextValue(i))return n(i);var a=h.extractOption(t,e,\"tx\",\"text\");return h.isValidTextValue(a)?n(a):void 0},h.isValidTextValue=function(t){return t||0===t},h.formatPercent=function(t,e){e=e||0;for(var r=(Math.round(100*t*Math.pow(10,e))*Math.pow(.1,e)).toFixed(e)+\"%\",n=0;n1&&(c=1):c=0,h.strTranslate(i-c*(r+o),a-c*(n+s))+h.strScale(c)+(l?\"rotate(\"+l+(e?\"\":\" \"+r+\" \"+n)+\")\":\"\")},h.setTransormAndDisplay=function(t,e){t.attr(\"transform\",h.getTextTransform(e)),t.style(\"display\",e.scale?null:\"none\")},h.ensureUniformFontSize=function(t,e){var r=h.extendFlat({},e);return r.size=Math.max(e.size,t._fullLayout.uniformtext.minsize||0),r},h.join2=function(t,e,r){var n=t.length;return n>1?t.slice(0,-1).join(e)+r+t[n-1]:t.join(e)},h.bigFont=function(t){return Math.round(1.2*t)};var q=h.getFirefoxVersion(),H=null!==q&&q<86;h.getPositionFromD3Event=function(){return H?[n.event.layerX,n.event.layerY]:[n.event.offsetX,n.event.offsetY]}},56174:function(t){\"use strict\";t.exports=function(t){return window&&window.process&&window.process.versions?\"[object Object]\"===Object.prototype.toString.call(t):\"[object Object]\"===Object.prototype.toString.call(t)&&Object.getPrototypeOf(t).hasOwnProperty(\"hasOwnProperty\")}},34967:function(t,e,r){\"use strict\";var n=r(35632),i=/^\\w*$/;t.exports=function(t,e,r,a){var o,s,l;r=r||\"name\",a=a||\"value\";var c={};e&&e.length?(l=n(t,e),s=l.get()):s=t,e=e||\"\";var u={};if(s)for(o=0;o2)return c[e]=2|c[e],f.set(t,null);if(h){for(o=e;o1){var e=[\"LOG:\"];for(t=0;t1){var r=[];for(t=0;t\"),\"long\")}},a.warn=function(){var t;if(n.logging>0){var e=[\"WARN:\"];for(t=0;t0){var r=[];for(t=0;t\"),\"stick\")}},a.error=function(){var t;if(n.logging>0){var e=[\"ERROR:\"];for(t=0;t0){var r=[];for(t=0;t\"),\"stick\")}}},75944:function(t,e,r){\"use strict\";var n=r(45568);t.exports=function(t,e,r){var i=t.selectAll(\"g.\"+r.replace(/\\s/g,\".\")).data(e,(function(t){return t[0].trace.uid}));i.exit().remove(),i.enter().append(\"g\").attr(\"class\",r),i.order();var a=t.classed(\"rangeplot\")?\"nodeRangePlot3\":\"node3\";return i.each((function(t){t[0][a]=n.select(this)})),i}},15236:function(t,e,r){\"use strict\";var n=r(11191);e.init2dArray=function(t,e){for(var r=new Array(t),n=0;ne/2?t-Math.round(t/e)*e:t}}},35632:function(t,e,r){\"use strict\";var n=r(10721),i=r(87800).isArrayOrTypedArray;function a(t,e){return function(){var r,n,o,s,l,c=t;for(s=0;s/g),l=0;la||c===i||cs||e&&l(t))}:function(t,e){var l=t[0],c=t[1];if(l===i||la||c===i||cs)return!1;var u,h,f,p,d,m=r.length,g=r[0][0],y=r[0][1],v=0;for(u=1;uMath.max(h,g)||c>Math.max(f,y)))if(cu||Math.abs(n(o,f))>i)return!0;return!1},a.filter=function(t,e){var r=[t[0]],n=0,i=0;function o(o){t.push(o);var s=r.length,l=n;r.splice(i+1);for(var c=l+1;c1&&o(t.pop()),{addPt:o,raw:t,filtered:r}}},22459:function(t,e,r){\"use strict\";var n=r(97464),i=r(81330);t.exports=function(t,e,a){var o=t._fullLayout,s=!0;return o._glcanvas.each((function(n){if(n.regl)n.regl.preloadCachedCode(a);else if(!n.pick||o._has(\"parcoords\")){try{n.regl=i({canvas:this,attributes:{antialias:!n.pick,preserveDrawingBuffer:!0},pixelRatio:t._context.plotGlPixelRatio||r.g.devicePixelRatio,extensions:e||[],cachedCode:a||{}})}catch(t){s=!1}n.regl||(s=!1),s&&this.addEventListener(\"webglcontextlost\",(function(e){t&&t.emit&&t.emit(\"plotly_webglcontextlost\",{event:e,layer:n.key})}),!1)}})),s||n({container:o._glcontainer.node()}),s}},32521:function(t,e,r){\"use strict\";var n=r(10721),i=r(13087);t.exports=function(t){var e;if(\"string\"!=typeof(e=t&&t.hasOwnProperty(\"userAgent\")?t.userAgent:function(){var t;return\"undefined\"!=typeof navigator&&(t=navigator.userAgent),t&&t.headers&&\"string\"==typeof t.headers[\"user-agent\"]&&(t=t.headers[\"user-agent\"]),t}()))return!0;var r=i({ua:{headers:{\"user-agent\":e}},tablet:!0,featureDetect:!1});if(!r)for(var a=e.split(\" \"),o=1;o-1;s--){var l=a[s];if(\"Version/\"===l.substr(0,8)){var c=l.substr(8).split(\".\")[0];if(n(c)&&(c=+c),c>=13)return!0}}return r}},36539:function(t){\"use strict\";t.exports=function(t,e){if(e instanceof RegExp){for(var r=e.toString(),n=0;ni.queueLength&&(t.undoQueue.queue.shift(),t.undoQueue.index--))},startSequence:function(t){t.undoQueue=t.undoQueue||{index:0,queue:[],sequence:!1},t.undoQueue.sequence=!0,t.undoQueue.beginSequence=!0},stopSequence:function(t){t.undoQueue=t.undoQueue||{index:0,queue:[],sequence:!1},t.undoQueue.sequence=!1,t.undoQueue.beginSequence=!1},undo:function(t){var e,r;if(!(void 0===t.undoQueue||isNaN(t.undoQueue.index)||t.undoQueue.index<=0)){for(t.undoQueue.index--,e=t.undoQueue.queue[t.undoQueue.index],t.undoQueue.inSequence=!0,r=0;r=t.undoQueue.queue.length)){for(e=t.undoQueue.queue[t.undoQueue.index],t.undoQueue.inSequence=!0,r=0;re}function h(t,e){return t>=e}e.findBin=function(t,e,r){if(n(e.start))return r?Math.ceil((t-e.start)/e.size-s)-1:Math.floor((t-e.start)/e.size+s);var a,o,f=0,p=e.length,d=0,m=p>1?(e[p-1]-e[0])/(p-1):1;for(o=m>=0?r?l:c:r?h:u,t+=m*s*(r?-1:1)*(m>=0?1:-1);f90&&i.log(\"Long binary search...\"),f-1},e.sorterAsc=function(t,e){return t-e},e.sorterDes=function(t,e){return e-t},e.distinctVals=function(t){var r,n=t.slice();for(n.sort(e.sorterAsc),r=n.length-1;r>-1&&n[r]===o;r--);for(var i,a=n[r]-n[0]||1,s=a/(r||1)/1e4,l=[],c=0;c<=r;c++){var u=n[c],h=u-i;void 0===i?(l.push(u),i=u):h>s&&(a=Math.min(a,h),l.push(u),i=u)}return{vals:l,minDiff:a}},e.roundUp=function(t,e,r){for(var n,i=0,a=e.length-1,o=0,s=r?0:1,l=r?1:0,c=r?Math.ceil:Math.floor;i0&&(n=1),r&&n)return t.sort(e)}return n?t:t.reverse()},e.findIndexOfMin=function(t,e){e=e||a;for(var r,n=1/0,i=0;ia.length)&&(o=a.length),n(r)||(r=!1),i(a[0])){for(l=new Array(o),s=0;st.length-1)return t[t.length-1];var r=e%1;return r*t[Math.ceil(e)]+(1-r)*t[Math.floor(e)]}},55010:function(t,e,r){\"use strict\";var n=r(162);t.exports=function(t){return t?n(t):[0,0,0,1]}},95544:function(t,e,r){\"use strict\";var n=r(1837),i=r(62203),a=r(34809),o=null;t.exports=function(){if(null!==o)return o;o=!1;var t=a.isIE()||a.isSafari()||a.isIOS();if(window.navigator.userAgent&&!t){var e=Array.from(n.CSS_DECLARATIONS).reverse(),r=window.CSS&&window.CSS.supports||window.supportsCSS;if(\"function\"==typeof r)o=e.some((function(t){return r.apply(null,t)}));else{var s=i.tester.append(\"image\").attr(\"style\",n.STYLE),l=window.getComputedStyle(s.node()).imageRendering;o=e.some((function(t){var e=t[1];return l===e||l===e.toLowerCase()})),s.remove()}}return o}},30635:function(t,e,r){\"use strict\";var n=r(45568),i=r(34809),a=i.strTranslate,o=r(62972),s=r(4530).LINE_SPACING,l=/([^$]*)([$]+[^$]*[$]+)([^$]*)/;e.convertToTspans=function(t,r,g){var S=t.text(),E=!t.attr(\"data-notex\")&&r&&r._context.typesetMath&&\"undefined\"!=typeof MathJax&&S.match(l),I=n.select(t.node().parentNode);if(!I.empty()){var P=t.attr(\"class\")?t.attr(\"class\").split(\" \")[0]:\"text\";return P+=\"-math\",I.selectAll(\"svg.\"+P).remove(),I.selectAll(\"g.\"+P+\"-group\").remove(),t.style(\"display\",null).attr({\"data-unformatted\":S,\"data-math\":\"N\"}),E?(r&&r._promises||[]).push(new Promise((function(e){t.style(\"display\",\"none\");var r=parseInt(t.node().style.fontSize,10),o={fontSize:r};!function(t,e,r){var a,o,s,l,f=parseInt((MathJax.version||\"\").split(\".\")[0]);if(2===f||3===f){var p=function(){var r=\"math-output-\"+i.randstr({},64),a=(l=n.select(\"body\").append(\"div\").attr({id:r}).style({visibility:\"hidden\",position:\"absolute\",\"font-size\":e.fontSize+\"px\"}).text(t.replace(c,\"\\\\lt \").replace(u,\"\\\\gt \"))).node();return 2===f?MathJax.Hub.Typeset(a):MathJax.typeset([a])},d=function(){var e=l.select(2===f?\".MathJax_SVG\":\".MathJax\"),a=!e.empty()&&l.select(\"svg\").node();if(a){var o,s=a.getBoundingClientRect();o=2===f?n.select(\"body\").select(\"#MathJax_SVG_glyphs\"):e.select(\"defs\"),r(e,o,s)}else i.log(\"There was an error in the tex syntax.\",t),r();l.remove()};2===f?MathJax.Hub.Queue((function(){return o=i.extendDeepAll({},MathJax.Hub.config),s=MathJax.Hub.processSectionDelay,void 0!==MathJax.Hub.processSectionDelay&&(MathJax.Hub.processSectionDelay=0),MathJax.Hub.Config({messageStyle:\"none\",tex2jax:{inlineMath:h},displayAlign:\"left\"})}),(function(){if(\"SVG\"!==(a=MathJax.Hub.config.menuSettings.renderer))return MathJax.Hub.setRenderer(\"SVG\")}),p,d,(function(){if(\"SVG\"!==a)return MathJax.Hub.setRenderer(a)}),(function(){return void 0!==s&&(MathJax.Hub.processSectionDelay=s),MathJax.Hub.Config(o)})):3===f&&(o=i.extendDeepAll({},MathJax.config),MathJax.config.tex||(MathJax.config.tex={}),MathJax.config.tex.inlineMath=h,\"svg\"!==(a=MathJax.config.startup.output)&&(MathJax.config.startup.output=\"svg\"),MathJax.startup.defaultReady(),MathJax.startup.promise.then((function(){p(),d(),\"svg\"!==a&&(MathJax.config.startup.output=a),MathJax.config=o})))}else i.warn(\"No MathJax version:\",MathJax.version)}(E[2],o,(function(n,i,o){I.selectAll(\"svg.\"+P).remove(),I.selectAll(\"g.\"+P+\"-group\").remove();var s=n&&n.select(\"svg\");if(!s||!s.node())return z(),void e();var l=I.append(\"g\").classed(P+\"-group\",!0).attr({\"pointer-events\":\"none\",\"data-unformatted\":S,\"data-math\":\"Y\"});l.node().appendChild(s.node()),i&&i.node()&&s.node().insertBefore(i.node().cloneNode(!0),s.node().firstChild);var c=o.width,u=o.height;s.attr({class:P,height:u,preserveAspectRatio:\"xMinYMin meet\"}).style({overflow:\"visible\",\"pointer-events\":\"none\"});var h=t.node().style.fill||\"black\",f=s.select(\"g\");f.attr({fill:h,stroke:h});var p=f.node().getBoundingClientRect(),d=p.width,m=p.height;(d>c||m>u)&&(s.style(\"overflow\",\"hidden\"),d=(p=s.node().getBoundingClientRect()).width,m=p.height);var y=+t.attr(\"x\"),v=+t.attr(\"y\"),x=-(r||t.node().getBoundingClientRect().height)/4;if(\"y\"===P[0])l.attr({transform:\"rotate(\"+[-90,y,v]+\")\"+a(-d/2,x-m/2)});else if(\"l\"===P[0])v=x-m/2;else if(\"a\"===P[0]&&0!==P.indexOf(\"atitle\"))y=0,v=x;else{var _=t.attr(\"text-anchor\");y-=d*(\"middle\"===_?.5:\"end\"===_?1:0),v=v+x-m/2}s.attr({x:y,y:v}),g&&g.call(t,l),e(l)}))}))):z(),t}function z(){I.empty()||(P=t.attr(\"class\")+\"-math\",I.select(\"svg.\"+P).remove()),t.text(\"\").style(\"white-space\",\"pre\");var r=function(t,e){e=e.replace(y,\" \");var r,a=!1,l=[],c=-1;function u(){c++;var e=document.createElementNS(o.svg,\"tspan\");n.select(e).attr({class:\"line\",dy:c*s+\"em\"}),t.appendChild(e),r=e;var i=l;if(l=[{node:e}],i.length>1)for(var a=1;a doesnt match end tag <\"+t+\">. Pretending it did match.\",e),r=l[l.length-1].node}else i.log(\"Ignoring unexpected end tag .\",e)}_.test(e)?u():(r=t,l=[{node:t}]);for(var E=e.split(v),I=0;I|>|>)/g,h=[[\"$\",\"$\"],[\"\\\\(\",\"\\\\)\"]],f={sup:\"font-size:70%\",sub:\"font-size:70%\",s:\"text-decoration:line-through\",u:\"text-decoration:underline\",b:\"font-weight:bold\",i:\"font-style:italic\",a:\"cursor:pointer\",span:\"\",em:\"font-style:italic;font-weight:bold\"},p={sub:\"0.3em\",sup:\"-0.6em\"},d={sub:\"-0.21em\",sup:\"0.42em\"},m=\"​\",g=[\"http:\",\"https:\",\"mailto:\",\"\",void 0,\":\"],y=e.NEWLINES=/(\\r\\n?|\\n)/g,v=/(<[^<>]*>)/,x=/<(\\/?)([^ >]*)(\\s+(.*))?>/i,_=//i;e.BR_TAG_ALL=//gi;var b=/(^|[\\s\"'])style\\s*=\\s*(\"([^\"]*);?\"|'([^']*);?')/i,w=/(^|[\\s\"'])href\\s*=\\s*(\"([^\"]*)\"|'([^']*)')/i,T=/(^|[\\s\"'])target\\s*=\\s*(\"([^\"\\s]*)\"|'([^'\\s]*)')/i,k=/(^|[\\s\"'])popup\\s*=\\s*(\"([\\w=,]*)\"|'([\\w=,]*)')/i;function A(t,e){if(!t)return null;var r=t.match(e),n=r&&(r[3]||r[4]);return n&&C(n)}var M=/(^|;)\\s*color:/;e.plainText=function(t,e){for(var r=void 0!==(e=e||{}).len&&-1!==e.len?e.len:1/0,n=void 0!==e.allowedTags?e.allowedTags:[\"br\"],i=t.split(v),a=[],o=\"\",s=0,l=0;l3?a.push(c.substr(0,p-3)+\"...\"):a.push(c.substr(0,p));break}o=\"\"}}return a.join(\"\")};var S={mu:\"μ\",amp:\"&\",lt:\"<\",gt:\">\",nbsp:\" \",times:\"×\",plusmn:\"±\",deg:\"°\"},E=/&(#\\d+|#x[\\da-fA-F]+|[a-z]+);/g;function C(t){return t.replace(E,(function(t,e){return(\"#\"===e.charAt(0)?function(t){if(!(t>1114111)){var e=String.fromCodePoint;if(e)return e(t);var r=String.fromCharCode;return t<=65535?r(t):r(55232+(t>>10),t%1024+56320)}}(\"x\"===e.charAt(1)?parseInt(e.substr(2),16):parseInt(e.substr(1),10)):S[e])||t}))}function L(t){var e=encodeURI(decodeURI(t)),r=document.createElement(\"a\"),n=document.createElement(\"a\");r.href=t,n.href=e;var i=r.protocol,a=n.protocol;return-1!==g.indexOf(i)&&-1!==g.indexOf(a)?e:\"\"}function I(t,e,r){var n,a,o,s=r.horizontalAlign,l=r.verticalAlign||\"top\",c=t.node().getBoundingClientRect(),u=e.node().getBoundingClientRect();return a=\"bottom\"===l?function(){return c.bottom-n.height}:\"middle\"===l?function(){return c.top+(c.height-n.height)/2}:function(){return c.top},o=\"right\"===s?function(){return c.right-n.width}:\"center\"===s?function(){return c.left+(c.width-n.width)/2}:function(){return c.left},function(){n=this.node().getBoundingClientRect();var t=o()-u.left,e=a()-u.top,s=r.gd||{};if(r.gd){s._fullLayout._calcInverseTransform(s);var l=i.apply3DTransform(s._fullLayout._invTransform)(t,e);t=l[0],e=l[1]}return this.style({top:e+\"px\",left:t+\"px\",\"z-index\":1e3}),this}}e.convertEntities=C,e.sanitizeHTML=function(t){t=t.replace(y,\" \");for(var e=document.createElement(\"p\"),r=e,i=[],a=t.split(v),o=0;oa.ts+e?l():a.timer=setTimeout((function(){l(),a.timer=null}),e)},e.done=function(t){var e=r[t];return e&&e.timer?new Promise((function(t){var r=e.onDone;e.onDone=function(){r&&r(),t(),e.onDone=null}})):Promise.resolve()},e.clear=function(t){if(t)n(r[t]),delete r[t];else for(var i in r)e.clear(i)}},8083:function(t,e,r){\"use strict\";var n=r(10721);t.exports=function(t,e){if(t>0)return Math.log(t)/Math.LN10;var r=Math.log(Math.min(e[0],e[1]))/Math.LN10;return n(r)||(r=Math.log(Math.max(e[0],e[1]))/Math.LN10-6),r}},11577:function(t,e,r){\"use strict\";var n=t.exports={},i=r(74285).locationmodeToLayer,a=r(48640).N4;n.getTopojsonName=function(t){return[t.scope.replace(/ /g,\"-\"),\"_\",t.resolution.toString(),\"m\"].join(\"\")},n.getTopojsonPath=function(t,e){return t+e+\".json\"},n.getTopojsonFeatures=function(t,e){var r=i[t.locationmode],n=e.objects[r];return a(e,n).features}},44611:function(t){\"use strict\";t.exports={moduleType:\"locale\",name:\"en-US\",dictionary:{\"Click to enter Colorscale title\":\"Click to enter Colorscale title\"},format:{date:\"%m/%d/%Y\"}}},30227:function(t){\"use strict\";t.exports={moduleType:\"locale\",name:\"en\",dictionary:{\"Click to enter Colorscale title\":\"Click to enter Colourscale title\"},format:{days:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],shortDays:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],months:[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],shortMonths:[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],periods:[\"AM\",\"PM\"],dateTime:\"%a %b %e %X %Y\",date:\"%d/%m/%Y\",time:\"%H:%M:%S\",decimal:\".\",thousands:\",\",grouping:[3],currency:[\"$\",\"\"],year:\"%Y\",month:\"%b %Y\",dayMonth:\"%b %-d\",dayMonthYear:\"%b %-d, %Y\"}}},56037:function(t,e,r){\"use strict\";var n=r(33626);t.exports=function(t){for(var e,r,i=n.layoutArrayContainers,a=n.layoutArrayRegexes,o=t.split(\"[\")[0],s=0;s0&&o.log(\"Clearing previous rejected promises from queue.\"),t._promises=[]},e.cleanLayout=function(t){var r,n;t||(t={}),t.xaxis1&&(t.xaxis||(t.xaxis=t.xaxis1),delete t.xaxis1),t.yaxis1&&(t.yaxis||(t.yaxis=t.yaxis1),delete t.yaxis1),t.scene1&&(t.scene||(t.scene=t.scene1),delete t.scene1);var a=(s.subplotsRegistry.cartesian||{}).attrRegex,l=(s.subplotsRegistry.polar||{}).attrRegex,h=(s.subplotsRegistry.ternary||{}).attrRegex,f=(s.subplotsRegistry.gl3d||{}).attrRegex,m=Object.keys(t);for(r=0;r3?(z.x=1.02,z.xanchor=\"left\"):z.x<-2&&(z.x=-.02,z.xanchor=\"right\"),z.y>3?(z.y=1.02,z.yanchor=\"bottom\"):z.y<-2&&(z.y=-.02,z.yanchor=\"top\")),d(t),\"rotate\"===t.dragmode&&(t.dragmode=\"orbit\"),c.clean(t),t.template&&t.template.layout&&e.cleanLayout(t.template.layout),t},e.cleanData=function(t){for(var r=0;r0)return t.substr(0,e)}e.hasParent=function(t,e){for(var r=_(e);r;){if(r in t)return!0;r=_(r)}return!1};var b=[\"x\",\"y\",\"z\"];e.clearAxisTypes=function(t,e,r){for(var n=0;n1&&a.warn(\"Full array edits are incompatible with other edits\",h);var v=r[\"\"][\"\"];if(c(v))e.set(null);else{if(!Array.isArray(v))return a.warn(\"Unrecognized full array edit value\",h,v),!0;e.set(v)}return!m&&(f(g,y),p(t),!0)}var x,_,b,w,T,k,A,M,S=Object.keys(r).map(Number).sort(o),E=e.get(),C=E||[],L=u(y,h).get(),I=[],P=-1,z=C.length;for(x=0;xC.length-(A?0:1))a.warn(\"index out of range\",h,b);else if(void 0!==k)T.length>1&&a.warn(\"Insertion & removal are incompatible with edits to the same index.\",h,b),c(k)?I.push(b):A?(\"add\"===k&&(k={}),C.splice(b,0,k),L&&L.splice(b,0,{})):a.warn(\"Unrecognized full object edit value\",h,b,k),-1===P&&(P=b);else for(_=0;_=0;x--)C.splice(I[x],1),L&&L.splice(I[x],1);if(C.length?E||e.set(C):e.set(null),m)return!1;if(f(g,y),d!==i){var O;if(-1===P)O=S;else{for(z=Math.max(C.length,z),O=[],x=0;x=P);x++)O.push(b);for(x=P;x=t.data.length||i<-t.data.length)throw new Error(r+\" must be valid indices for gd.data.\");if(e.indexOf(i,n+1)>-1||i>=0&&e.indexOf(-t.data.length+i)>-1||i<0&&e.indexOf(t.data.length+i)>-1)throw new Error(\"each index in \"+r+\" must be unique.\")}}function O(t,e,r){if(!Array.isArray(t.data))throw new Error(\"gd.data must be an array.\");if(void 0===e)throw new Error(\"currentIndices is a required argument.\");if(Array.isArray(e)||(e=[e]),z(t,e,\"currentIndices\"),void 0===r||Array.isArray(r)||(r=[r]),void 0!==r&&z(t,r,\"newIndices\"),void 0!==r&&e.length!==r.length)throw new Error(\"current and new indices must be of equal length.\")}function D(t,e,r,n,a){!function(t,e,r,n){var i=o.isPlainObject(n);if(!Array.isArray(t.data))throw new Error(\"gd.data must be an array\");if(!o.isPlainObject(e))throw new Error(\"update must be a key:value object\");if(void 0===r)throw new Error(\"indices must be an integer or array of integers\");for(var a in z(t,r,\"indices\"),e){if(!Array.isArray(e[a])||e[a].length!==r.length)throw new Error(\"attribute \"+a+\" must be an array of length equal to indices array length\");if(i&&(!(a in n)||!Array.isArray(n[a])||n[a].length!==e[a].length))throw new Error(\"when maxPoints is set as a key:value object it must contain a 1:1 corrispondence with the keys and number of traces in the update object\")}}(t,e,r,n);for(var l=function(t,e,r,n){var a,l,c,u,h,f=o.isPlainObject(n),p=[];for(var d in Array.isArray(r)||(r=[r]),r=P(r,t.data.length-1),e)for(var m=0;m-1&&-1===r.indexOf(\"grouptitlefont\")?l(r,r.replace(\"titlefont\",\"title.font\")):r.indexOf(\"titleposition\")>-1?l(r,r.replace(\"titleposition\",\"title.position\")):r.indexOf(\"titleside\")>-1?l(r,r.replace(\"titleside\",\"title.side\")):r.indexOf(\"titleoffset\")>-1&&l(r,r.replace(\"titleoffset\",\"title.offset\")):l(r,r.replace(\"title\",\"title.text\"));function l(e,r){t[r]=t[e],delete t[e]}}function q(t,e,r){t=o.getGraphDiv(t),T.clearPromiseQueue(t);var n={};if(\"string\"==typeof e)n[e]=r;else{if(!o.isPlainObject(e))return o.warn(\"Relayout fail.\",e,r),Promise.reject();n=o.extendFlat({},e)}Object.keys(n).length&&(t.changed=!0);var i=X(t,n),a=i.flags;a.calc&&(t.calcdata=void 0);var s=[f.previousPromises];a.layoutReplot?s.push(k.layoutReplot):Object.keys(n).length&&(H(t,a,i)||f.supplyDefaults(t),a.legend&&s.push(k.doLegend),a.layoutstyle&&s.push(k.layoutStyles),a.axrange&&G(s,i.rangesAltered),a.ticks&&s.push(k.doTicksRelayout),a.modebar&&s.push(k.doModeBar),a.camera&&s.push(k.doCamera),a.colorbars&&s.push(k.doColorBars),s.push(E)),s.push(f.rehover,f.redrag,f.reselect),c.add(t,q,[t,i.undoit],q,[t,i.redoit]);var l=o.syncOrAsync(s,t);return l&&l.then||(l=Promise.resolve(t)),l.then((function(){return t.emit(\"plotly_relayout\",i.eventData),t}))}function H(t,e,r){var n,i,a=t._fullLayout;if(!e.axrange)return!1;for(var s in e)if(\"axrange\"!==s&&e[s])return!1;var l=function(t,e){return o.coerce(n,i,m,t,e)},c={};for(var u in r.rangesAltered){var h=p.id2name(u);if(n=t.layout[h],i=a[h],d(n,i,l,c),i._matchGroup)for(var f in i._matchGroup)if(f!==u){var g=a[p.id2name(f)];g.autorange=i.autorange,g.range=i.range.slice(),g._input.range=i.range.slice()}}return!0}function G(t,e){var r=e?function(t){var r=[];for(var n in e){var i=p.getFromId(t,n);if(r.push(n),-1!==(i.ticklabelposition||\"\").indexOf(\"inside\")&&i._anchorAxis&&r.push(i._anchorAxis._id),i._matchGroup)for(var a in i._matchGroup)e[a]||r.push(a)}return p.draw(t,r,{skipTitle:!0})}:function(t){return p.draw(t,\"redraw\")};t.push(_,k.doAutoRangeAndConstraints,r,k.drawData,k.finalDraw)}var Z=/^[xyz]axis[0-9]*\\.range(\\[[0|1]\\])?$/,W=/^[xyz]axis[0-9]*\\.autorange$/,Y=/^[xyz]axis[0-9]*\\.domain(\\[[0|1]\\])?$/;function X(t,e){var r,n,i,a=t.layout,l=t._fullLayout,c=l._guiEditing,f=N(l._preGUI,c),d=Object.keys(e),m=p.list(t),g=o.extendDeepAll({},e),y={};for(V(e),d=Object.keys(e),n=0;n0&&\"string\"!=typeof z.parts[D];)D--;var R=z.parts[D],F=z.parts[D-1]+\".\"+R,j=z.parts.slice(0,D).join(\".\"),U=s(t.layout,j).get(),q=s(l,j).get(),H=z.get();if(void 0!==O){k[P]=O,S[P]=\"reverse\"===R?O:B(H);var G=h.getLayoutValObject(l,z.parts);if(G&&G.impliedEdits&&null!==O)for(var X in G.impliedEdits)E(o.relativeAttr(P,X),G.impliedEdits[X]);if(-1!==[\"width\",\"height\"].indexOf(P))if(O){E(\"autosize\",null);var J=\"height\"===P?\"width\":\"height\";E(J,l[J])}else l[P]=t._initialAutoSize[P];else if(\"autosize\"===P)E(\"width\",O?null:l.width),E(\"height\",O?null:l.height);else if(F.match(Z))I(F),s(l,j+\"._inputRange\").set(null);else if(F.match(W)){I(F),s(l,j+\"._inputRange\").set(null);var K=s(l,j).get();K._inputDomain&&(K._input.domain=K._inputDomain.slice())}else F.match(Y)&&s(l,j+\"._inputDomain\").set(null);if(\"type\"===R){C=U;var Q=\"linear\"===q.type&&\"log\"===O,tt=\"log\"===q.type&&\"linear\"===O;if(Q||tt){if(C&&C.range)if(q.autorange)Q&&(C.range=C.range[1]>C.range[0]?[1,2]:[2,1]);else{var et=C.range[0],rt=C.range[1];Q?(et<=0&&rt<=0&&E(j+\".autorange\",!0),et<=0?et=rt/1e6:rt<=0&&(rt=et/1e6),E(j+\".range[0]\",Math.log(et)/Math.LN10),E(j+\".range[1]\",Math.log(rt)/Math.LN10)):(E(j+\".range[0]\",Math.pow(10,et)),E(j+\".range[1]\",Math.pow(10,rt)))}else E(j+\".autorange\",!0);Array.isArray(l._subplots.polar)&&l._subplots.polar.length&&l[z.parts[0]]&&\"radialaxis\"===z.parts[1]&&delete l[z.parts[0]]._subplot.viewInitial[\"radialaxis.range\"],u.getComponentMethod(\"annotations\",\"convertCoords\")(t,q,O,E),u.getComponentMethod(\"images\",\"convertCoords\")(t,q,O,E)}else E(j+\".autorange\",!0),E(j+\".range\",null);s(l,j+\"._inputRange\").set(null)}else if(R.match(M)){var nt=s(l,P).get(),it=(O||{}).type;it&&\"-\"!==it||(it=\"linear\"),u.getComponentMethod(\"annotations\",\"convertCoords\")(t,nt,it,E),u.getComponentMethod(\"images\",\"convertCoords\")(t,nt,it,E)}var at=w.containerArrayMatch(P);if(at){r=at.array,n=at.index;var ot=at.property,st=G||{editType:\"calc\"};\"\"!==n&&\"\"===ot&&(w.isAddVal(O)?S[P]=null:w.isRemoveVal(O)?S[P]=(s(a,r).get()||[])[n]:o.warn(\"unrecognized full object value\",e)),A.update(b,st),y[r]||(y[r]={});var lt=y[r][n];lt||(lt=y[r][n]={}),lt[ot]=O,delete e[P]}else\"reverse\"===R?(U.range?U.range.reverse():(E(j+\".autorange\",!0),U.range=[1,0]),q.autorange?b.calc=!0:b.plot=!0):(\"dragmode\"===P&&(!1===O&&!1!==H||!1!==O&&!1===H)||l._has(\"scatter-like\")&&l._has(\"regl\")&&\"dragmode\"===P&&(\"lasso\"===O||\"select\"===O)&&\"lasso\"!==H&&\"select\"!==H||l._has(\"gl2d\")?b.plot=!0:G?A.update(b,G):b.calc=!0,z.set(O))}}for(r in y)w.applyContainerArrayChanges(t,f(a,r),y[r],b,f)||(b.plot=!0);for(var ct in L){var ut=(C=p.getFromId(t,ct))&&C._constraintGroup;if(ut)for(var ht in b.calc=!0,ut)L[ht]||(p.getFromId(t,ht)._constraintShrinkable=!0)}($(t)||e.height||e.width)&&(b.plot=!0);var ft=l.shapes;for(n=0;n1;)if(n.pop(),void 0!==(r=s(e,n.join(\".\")+\".uirevision\").get()))return r;return e.uirevision}function nt(t,e){for(var r=0;r=i.length?i[0]:i[t]:i}function l(t){return Array.isArray(a)?t>=a.length?a[0]:a[t]:a}function c(t,e){var r=0;return function(){if(t&&++r===e)return t()}}return void 0===n._frameWaitingCnt&&(n._frameWaitingCnt=0),new Promise((function(a,u){function h(){t.emit(\"plotly_animating\"),n._lastFrameAt=-1/0,n._timeToNext=0,n._runningTransitions=0,n._currentFrame=null;var e=function(){n._animationRaf=window.requestAnimationFrame(e),Date.now()-n._lastFrameAt>n._timeToNext&&function(){n._currentFrame&&n._currentFrame.onComplete&&n._currentFrame.onComplete();var e=n._currentFrame=n._frameQueue.shift();if(e){var r=e.name?e.name.toString():null;t._fullLayout._currentFrame=r,n._lastFrameAt=Date.now(),n._timeToNext=e.frameOpts.duration,f.transition(t,e.frame.data,e.frame.layout,T.coerceTraceIndices(t,e.frame.traces),e.frameOpts,e.transitionOpts).then((function(){e.onComplete&&e.onComplete()})),t.emit(\"plotly_animatingframe\",{name:r,frame:e.frame,animation:{frame:e.frameOpts,transition:e.transitionOpts}})}else t.emit(\"plotly_animated\"),window.cancelAnimationFrame(n._animationRaf),n._animationRaf=null}()};e()}var p,d,m=0;function g(t){return Array.isArray(i)?m>=i.length?t.transitionOpts=i[m]:t.transitionOpts=i[0]:t.transitionOpts=i,m++,t}var y=[],v=null==e,x=Array.isArray(e);if(v||x||!o.isPlainObject(e)){if(v||-1!==[\"string\",\"number\"].indexOf(typeof e))for(p=0;p0&&ww)&&k.push(d);y=k}}y.length>0?function(e){if(0!==e.length){for(var i=0;i=0;n--)if(o.isPlainObject(e[n])){var m=e[n].name,g=(u[m]||d[m]||{}).name,y=e[n].name,v=u[g]||d[g];g&&y&&\"number\"==typeof y&&v&&S<5&&(S++,o.warn('addFrames: overwriting frame \"'+(u[g]||d[g]).name+'\" with a frame whose name of type \"number\" also equates to \"'+g+'\". This is valid but may potentially lead to unexpected behavior since all plotly.js frame names are stored internally as strings.'),5===S&&o.warn(\"addFrames: This API call has yielded too many of these warnings. For the rest of this call, further warnings about numeric frame names will be suppressed.\")),d[m]={name:m},p.push({frame:f.supplyFrameDefaults(e[n]),index:r&&void 0!==r[n]&&null!==r[n]?r[n]:h+n})}p.sort((function(t,e){return t.index>e.index?-1:t.index=0;n--){if(\"number\"==typeof(i=p[n].frame).name&&o.warn(\"Warning: addFrames accepts frames with numeric names, but the numbers areimplicitly cast to strings\"),!i.name)for(;u[i.name=\"frame \"+t._transitionData._counter++];);if(u[i.name]){for(a=0;a=0;r--)n=e[r],a.push({type:\"delete\",index:n}),s.unshift({type:\"insert\",index:n,value:i[n]});var l=f.modifyFrames,u=f.modifyFrames,h=[t,s],p=[t,a];return c&&c.add(t,l,h,u,p),f.modifyFrames(t,a)},e.addTraces=function t(r,n,i){r=o.getGraphDiv(r);var a,s,l=[],u=e.deleteTraces,h=t,f=[r,l],p=[r,n];for(function(t,e,r){var n,i;if(!Array.isArray(t.data))throw new Error(\"gd.data must be an array.\");if(void 0===e)throw new Error(\"traces must be defined.\");for(Array.isArray(e)||(e=[e]),n=0;n=0&&r=0&&r=a.length)return!1;if(2===t.dimensions){if(r++,e.length===r)return t;var o=e[r];if(!b(o))return!1;t=a[i][o]}else t=a[i]}else t=a}}return t}function b(t){return t===Math.round(t)&&t>=0}function w(){var t,e,r={};for(t in h(r,o),n.subplotsRegistry)if((e=n.subplotsRegistry[t]).layoutAttributes)if(Array.isArray(e.attr))for(var i=0;i=l.length)return!1;i=(r=(n.transformsRegistry[l[c].type]||{}).attributes)&&r[e[2]],s=3}else{var u=t._module;if(u||(u=(n.modules[t.type||a.type.dflt]||{})._module),!u)return!1;if(!(i=(r=u.attributes)&&r[o])){var h=u.basePlotModule;h&&h.attributes&&(i=h.attributes[o])}i||(i=a[o])}return _(i,e,s)},e.getLayoutValObject=function(t,e){var r=function(t,e){var r,i,a,s,l=t._basePlotModules;if(l){var c;for(r=0;r=i&&(r._input||{})._templateitemname;s&&(o=i);var l,c=e+\"[\"+o+\"]\";function u(){l={},s&&(l[c]={},l[c][a]=s)}function h(t,e){s?n.nestedProperty(l[c],t).set(e):l[c+\".\"+t]=e}function f(){var t=l;return u(),t}return u(),{modifyBase:function(t,e){l[t]=e},modifyItem:h,getUpdateObj:f,applyUpdate:function(e,r){e&&h(e,r);var i=f();for(var a in i)n.nestedProperty(t,a).set(i[a])}}}},71817:function(t,e,r){\"use strict\";var n=r(45568),i=r(33626),a=r(44122),o=r(34809),s=r(30635),l=r(34823),c=r(78766),u=r(62203),h=r(17240),f=r(95433),p=r(29714),d=r(4530),m=r(84391),g=m.enforce,y=m.clean,v=r(32919).doAutoRange,x=\"start\",_=r(54826).zindexSeparator;function b(t,e,r){for(var n=0;n=t[1]||i[1]<=t[0])&&a[0]e[0])return!0}return!1}function w(t){var r,i,s,l,h,m,g=t._fullLayout,y=g._size,v=y.p,x=p.list(t,\"\",!0);if(g._paperdiv.style({width:t._context.responsive&&g.autosize&&!t._context._hasZeroWidth&&!t.layout.width?\"100%\":g.width+\"px\",height:t._context.responsive&&g.autosize&&!t._context._hasZeroHeight&&!t.layout.height?\"100%\":g.height+\"px\"}).selectAll(\".main-svg\").call(u.setSize,g.width,g.height),t._context.setBackground(t,g.paper_bgcolor),e.drawMainTitle(t),f.manage(t),!g._has(\"cartesian\"))return a.previousPromises(t);function w(t,e,r){var n=t._lw/2;return\"x\"===t._id.charAt(0)?e?\"top\"===r?e._offset-v-n:e._offset+e._length+v+n:y.t+y.h*(1-(t.position||0))+n%1:e?\"right\"===r?e._offset+e._length+v+n:e._offset-v-n:y.l+y.w*(t.position||0)+n%1}for(r=0;r.5?\"t\":\"b\",o=t._fullLayout.margin[a],s=0;return\"paper\"===e.yref?s=r+e.pad.t+e.pad.b:\"container\"===e.yref&&(s=function(t,e,r,n,i){var a=0;return\"middle\"===r&&(a+=i/2),\"t\"===t?(\"top\"===r&&(a+=i),a+=n-e*n):(\"bottom\"===r&&(a+=i),a+=e*n),a}(a,n,i,t._fullLayout.height,r)+e.pad.t+e.pad.b),s>o?s:0}(t,e,m);if(g>0){!function(t,e,r,n){var i=\"title.automargin\",s=t._fullLayout.title,l=s.y>.5?\"t\":\"b\",c={x:s.x,y:s.y,t:0,b:0},u={};\"paper\"===s.yref&&function(t,e,r,n,i){var a=\"paper\"===e.yref?t._fullLayout._size.h:t._fullLayout.height,s=o.isTopAnchor(e)?n:n-i,l=\"b\"===r?a-s:s;return!(o.isTopAnchor(e)&&\"t\"===r||o.isBottomAnchor(e)&&\"b\"===r)&&lT?u.push({code:\"unused\",traceType:v,templateCount:w,dataCount:T}):T>w&&u.push({code:\"reused\",traceType:v,templateCount:w,dataCount:T})}}else u.push({code:\"data\"});if(function t(e,r){for(var n in e)if(\"_\"!==n.charAt(0)){var a=e[n],o=m(e,n,r);i(a)?(Array.isArray(e)&&!1===a._template&&a.templateitemname&&u.push({code:\"missing\",path:o,templateitemname:a.templateitemname}),t(a,o)):Array.isArray(a)&&g(a)&&t(a,o)}}({data:p,layout:f},\"\"),u.length)return u.map(y)}},80491:function(t,e,r){\"use strict\";var n=r(10721),i=r(31420),a=r(44122),o=r(34809),s=r(84619),l=r(6243),c=r(72914),u=r(29697).version,h={format:{valType:\"enumerated\",values:[\"png\",\"jpeg\",\"webp\",\"svg\",\"full-json\"],dflt:\"png\"},width:{valType:\"number\",min:1},height:{valType:\"number\",min:1},scale:{valType:\"number\",min:0,dflt:1},setBackground:{valType:\"any\",dflt:!1},imageDataOnly:{valType:\"boolean\",dflt:!1}};t.exports=function(t,e){var r,f,p,d;function m(t){return!(t in e)||o.validate(e[t],h[t])}if(e=e||{},o.isPlainObject(t)?(r=t.data||[],f=t.layout||{},p=t.config||{},d={}):(t=o.getGraphDiv(t),r=o.extendDeep([],t.data),f=o.extendDeep({},t.layout),p=t._context,d=t._fullLayout||{}),!m(\"width\")&&null!==e.width||!m(\"height\")&&null!==e.height)throw new Error(\"Height and width should be pixel values.\");if(!m(\"format\"))throw new Error(\"Export format is not \"+o.join2(h.format.values,\", \",\" or \")+\".\");var g={};function y(t,r){return o.coerce(e,g,h,t,r)}var v=y(\"format\"),x=y(\"width\"),_=y(\"height\"),b=y(\"scale\"),w=y(\"setBackground\"),T=y(\"imageDataOnly\"),k=document.createElement(\"div\");k.style.position=\"absolute\",k.style.left=\"-5000px\",document.body.appendChild(k);var A=o.extendFlat({},f);x?A.width=x:null===e.width&&n(d.width)&&(A.width=d.width),_?A.height=_:null===e.height&&n(d.height)&&(A.height=d.height);var M=o.extendFlat({},p,{_exportedPlot:!0,staticPlot:!0,setBackground:w}),S=s.getRedrawFunc(k);function E(){return new Promise((function(t){setTimeout(t,s.getDelay(k._fullLayout))}))}function C(){return new Promise((function(t,e){var r=l(k,v,b),n=k._fullLayout.width,h=k._fullLayout.height;function f(){i.purge(k),document.body.removeChild(k)}if(\"full-json\"===v){var p=a.graphJson(k,!1,\"keepdata\",\"object\",!0,!0);return p.version=u,p=JSON.stringify(p),f(),t(T?p:s.encodeJSON(p))}if(f(),\"svg\"===v)return t(T?r:s.encodeSVG(r));var d=document.createElement(\"canvas\");d.id=o.randstr(),c({format:v,width:n,height:h,scale:b,canvas:d,svg:r,promise:!0}).then(t).catch(e)}))}return new Promise((function(t,e){i.newPlot(k,r,A,M).then(S).then(E).then(C).then((function(e){t(function(t){return T?t.replace(s.IMAGE_URL_PREFIX,\"\"):t}(e))})).catch((function(t){e(t)}))}))}},2466:function(t,e,r){\"use strict\";var n=r(34809),i=r(44122),a=r(57297),o=r(24452).dfltConfig,s=n.isPlainObject,l=Array.isArray,c=n.isArrayOrTypedArray;function u(t,e,r,i,a,o){o=o||[];for(var h=Object.keys(t),f=0;fx.length&&i.push(p(\"unused\",a,y.concat(x.length)));var A,M,S,E,C,L=x.length,I=Array.isArray(k);if(I&&(L=Math.min(L,k.length)),2===_.dimensions)for(M=0;Mx[M].length&&i.push(p(\"unused\",a,y.concat(M,x[M].length)));var P=x[M].length;for(A=0;A<(I?Math.min(P,k[M].length):P);A++)S=I?k[M][A]:k,E=v[M][A],C=x[M][A],n.validate(E,S)?C!==E&&C!==+E&&i.push(p(\"dynamic\",a,y.concat(M,A),E,C)):i.push(p(\"value\",a,y.concat(M,A),E))}else i.push(p(\"array\",a,y.concat(M),v[M]));else for(M=0;M1&&f.push(p(\"object\",\"layout\"))),i.supplyDefaults(d);for(var m=d._fullData,g=r.length,y=0;y0&&Math.round(h)===h))return{vals:i};c=h}for(var f=e.calendar,p=\"start\"===l,d=\"end\"===l,m=t[r+\"period0\"],g=a(m,f)||0,y=[],v=[],x=[],_=i.length,b=0;b<_;b++){var w,T,k,A=i[b];if(c){for(w=Math.round((A-g)/(c*s)),k=o(g,c*w,f);k>A;)k=o(k,-c,f);for(;k<=A;)k=o(k,c,f);T=o(k,-c,f)}else{for(k=g+(w=Math.round((A-g)/u))*u;k>A;)k-=u;for(;k<=A;)k+=u;T=k-u}y[b]=p?T:d?k:(T+k)/2,v[b]=T,x[b]=k}return{vals:y,starts:v,ends:x}}},55126:function(t){\"use strict\";t.exports={xaxis:{valType:\"subplotid\",dflt:\"x\",editType:\"calc+clearAxisTypes\"},yaxis:{valType:\"subplotid\",dflt:\"y\",editType:\"calc+clearAxisTypes\"}}},32919:function(t,e,r){\"use strict\";var n=r(45568),i=r(10721),a=r(34809),o=r(63821).FP_SAFE,s=r(33626),l=r(62203),c=r(5975),u=c.getFromId,h=c.isLinked;function f(t,e){var r,n,i=[],o=t._fullLayout,s=d(o,e,0),l=d(o,e,1),c=g(t,e),u=c.min,h=c.max;if(0===u.length||0===h.length)return a.simpleMap(e.range,e.r2l);var f=u[0].val,m=h[0].val;for(r=1;r0&&((A=L-s(_)-l(b))>I?M/A>P&&(w=_,T=b,P=M/A):M/L>P&&(w={val:_.val,nopad:1},T={val:b.val,nopad:1},P=M/L));if(f===m){var z=f-1,O=f+1;if(E)if(0===f)i=[0,1];else{var D=(f>0?h:u).reduce((function(t,e){return Math.max(t,l(e))}),0),R=f/(1-Math.min(.5,D/L));i=f>0?[0,R]:[R,0]}else i=C?[Math.max(0,z),Math.max(1,O)]:[z,O]}else E?(w.val>=0&&(w={val:0,nopad:1}),T.val<=0&&(T={val:0,nopad:1})):C&&(w.val-P*s(w)<0&&(w={val:0,nopad:1}),T.val<=0&&(T={val:1,nopad:1})),P=(T.val-w.val-p(e,_.val,b.val))/(L-s(w)-l(T)),i=[w.val-P*s(w),T.val+P*l(T)];return i=k(i,e),e.limitRange&&e.limitRange(),v&&i.reverse(),a.simpleMap(i,e.l2r||Number)}function p(t,e,r){var n=0;if(t.rangebreaks)for(var i=t.locateBreaks(e,r),a=0;a0?r.ppadplus:r.ppadminus)||r.ppad||0),S=A((t._m>0?r.ppadminus:r.ppadplus)||r.ppad||0),E=A(r.vpadplus||r.vpad),C=A(r.vpadminus||r.vpad);if(!T){if(f=1/0,p=-1/0,w)for(n=0;n0&&(f=a),a>p&&a-o&&(f=a),a>p&&a=P;n--)I(n);return{min:d,max:m,opts:r}},concatExtremes:g};var m=3;function g(t,e,r){var n,i,a,o=e._id,s=t._fullData,l=t._fullLayout,c=[],h=[];function f(t,e){for(n=0;n=r&&(c.extrapad||!o)){s=!1;break}i(e,c.val)&&c.pad<=r&&(o||!c.extrapad)&&(t.splice(l,1),l--)}if(s){var u=a&&0===e;t.push({val:e,pad:u?0:r,extrapad:!u&&o})}}function _(t){return i(t)&&Math.abs(t)=e}function T(t,e,r){return void 0===e||void 0===r||(e=t.d2l(e))=c&&(o=c,r=c),s<=c&&(s=c,n=c)}}return r=function(t,e){var r=e.autorangeoptions;return r&&void 0!==r.minallowed&&T(e,r.minallowed,r.maxallowed)?r.minallowed:r&&void 0!==r.clipmin&&T(e,r.clipmin,r.clipmax)?Math.max(t,e.d2l(r.clipmin)):t}(r,e),n=function(t,e){var r=e.autorangeoptions;return r&&void 0!==r.maxallowed&&T(e,r.minallowed,r.maxallowed)?r.maxallowed:r&&void 0!==r.clipmax&&T(e,r.clipmin,r.clipmax)?Math.min(t,e.d2l(r.clipmax)):t}(n,e),[r,n]}},75511:function(t){\"use strict\";t.exports=function(t,e,r){var n,i;if(r){var a=\"reversed\"===e||\"min reversed\"===e||\"max reversed\"===e;n=r[a?1:0],i=r[a?0:1]}var o=t(\"autorangeoptions.minallowed\",null===i?n:void 0),s=t(\"autorangeoptions.maxallowed\",null===n?i:void 0);void 0===o&&t(\"autorangeoptions.clipmin\"),void 0===s&&t(\"autorangeoptions.clipmax\"),t(\"autorangeoptions.include\")}},29714:function(t,e,r){\"use strict\";var n=r(45568),i=r(10721),a=r(44122),o=r(33626),s=r(34809),l=s.strTranslate,c=r(30635),u=r(17240),h=r(78766),f=r(62203),p=r(25829),d=r(68599),m=r(63821),g=m.ONEMAXYEAR,y=m.ONEAVGYEAR,v=m.ONEMINYEAR,x=m.ONEMAXQUARTER,_=m.ONEAVGQUARTER,b=m.ONEMINQUARTER,w=m.ONEMAXMONTH,T=m.ONEAVGMONTH,k=m.ONEMINMONTH,A=m.ONEWEEK,M=m.ONEDAY,S=M/2,E=m.ONEHOUR,C=m.ONEMIN,L=m.ONESEC,I=m.ONEMILLI,P=m.ONEMICROSEC,z=m.MINUS_SIGN,O=m.BADNUM,D={K:\"zeroline\"},R={K:\"gridline\",L:\"path\"},F={K:\"minor-gridline\",L:\"path\"},B={K:\"tick\",L:\"path\"},N={K:\"tick\",L:\"text\"},j={width:[\"x\",\"r\",\"l\",\"xl\",\"xr\"],height:[\"y\",\"t\",\"b\",\"yt\",\"yb\"],right:[\"r\",\"xr\"],left:[\"l\",\"xl\"],top:[\"t\",\"yt\"],bottom:[\"b\",\"yb\"]},U=r(4530),V=U.MID_SHIFT,q=U.CAP_SHIFT,H=U.LINE_SPACING,G=U.OPPOSITE_SIDE,Z=t.exports={};Z.setConvert=r(19091);var W=r(9666),Y=r(5975),X=Y.idSort,$=Y.isLinked;Z.id2name=Y.id2name,Z.name2id=Y.name2id,Z.cleanId=Y.cleanId,Z.list=Y.list,Z.listIds=Y.listIds,Z.getFromId=Y.getFromId,Z.getFromTrace=Y.getFromTrace;var J=r(32919);Z.getAutoRange=J.getAutoRange,Z.findExtremes=J.findExtremes;var K=1e-4;function Q(t){var e=(t[1]-t[0])*K;return[t[0]-e,t[1]+e]}Z.coerceRef=function(t,e,r,n,i,a){var o=n.charAt(n.length-1),l=r._fullLayout._subplots[o+\"axis\"],c=n+\"ref\",u={};return i||(i=l[0]||(\"string\"==typeof a?a:a[0])),a||(a=i),l=l.concat(l.map((function(t){return t+\" domain\"}))),u[c]={valType:\"enumerated\",values:l.concat(a?\"string\"==typeof a?[a]:a:[]),dflt:i},s.coerce(t,e,u,c)},Z.getRefType=function(t){return void 0===t?t:\"paper\"===t?\"paper\":\"pixel\"===t?\"pixel\":/( domain)$/.test(t)?\"domain\":\"range\"},Z.coercePosition=function(t,e,r,n,i,a){var o,l;if(\"range\"!==Z.getRefType(n))o=s.ensureNumber,l=r(i,a);else{var c=Z.getFromId(e,n);l=r(i,a=c.fraction2r(a)),o=c.cleanPos}t[i]=o(l)},Z.cleanPosition=function(t,e,r){return(\"paper\"===r||\"pixel\"===r?s.ensureNumber:Z.getFromId(e,r).cleanPos)(t)},Z.redrawComponents=function(t,e){e=e||Z.listIds(t);var r=t._fullLayout;function n(n,i,a,s){for(var l=o.getComponentMethod(n,i),c={},u=0;un&&f2e-6||((r-t._forceTick0)/t._minDtick%1+1.000001)%1>2e-6)&&(t._minDtick=0)):t._minDtick=0},Z.saveRangeInitial=function(t,e){for(var r=Z.list(t,\"\",!0),n=!1,i=0;i.3*f||u(n)||u(a))){var p=r.dtick/2;t+=t+p.8){var o=Number(r.substr(1));a.exactYears>.8&&o%12==0?t=Z.tickIncrement(t,\"M6\",\"reverse\")+1.5*M:a.exactMonths>.8?t=Z.tickIncrement(t,\"M1\",\"reverse\")+15.5*M:t-=S;var l=Z.tickIncrement(t,r);if(l<=n)return l}return t}(v,t,y,c,a)),g=v;g<=u;)g=Z.tickIncrement(g,y,!1,a);return{start:e.c2r(v,0,a),end:e.c2r(g,0,a),size:y,_dataSpan:u-c}},Z.prepMinorTicks=function(t,e,r){if(!e.minor.dtick){delete t.dtick;var n,a=e.dtick&&i(e._tmin);if(a){var o=Z.tickIncrement(e._tmin,e.dtick,!0);n=[e._tmin,.99*o+.01*e._tmin]}else{var l=s.simpleMap(e.range,e.r2l);n=[l[0],.8*l[0]+.2*l[1]]}if(t.range=s.simpleMap(n,e.l2r),t._isMinor=!0,Z.prepTicks(t,r),a){var c=i(e.dtick),u=i(t.dtick),h=c?e.dtick:+e.dtick.substring(1),f=u?t.dtick:+t.dtick.substring(1);c&&u?nt(h,f)?h===2*A&&f===2*M&&(t.dtick=A):h===2*A&&f===3*M?t.dtick=A:h!==A||(e._input.minor||{}).nticks?it(h/f,2.5)?t.dtick=h/2:t.dtick=h:t.dtick=M:\"M\"===String(e.dtick).charAt(0)?u?t.dtick=\"M1\":nt(h,f)?h>=12&&2===f&&(t.dtick=\"M3\"):t.dtick=e.dtick:\"L\"===String(t.dtick).charAt(0)?\"L\"===String(e.dtick).charAt(0)?nt(h,f)||(t.dtick=it(h/f,2.5)?e.dtick/2:e.dtick):t.dtick=\"D1\":\"D2\"===t.dtick&&+e.dtick>1&&(t.dtick=1)}t.range=e.range}void 0===e.minor._tick0Init&&(t.tick0=e.tick0)},Z.prepTicks=function(t,e){var r=s.simpleMap(t.range,t.r2l,void 0,void 0,e);if(\"auto\"===t.tickmode||!t.dtick){var n,a=t.nticks;a||(\"category\"===t.type||\"multicategory\"===t.type?(n=t.tickfont?s.bigFont(t.tickfont.size||12):15,a=t._length/n):(n=\"y\"===t._id.charAt(0)?40:80,a=s.constrain(t._length/n,4,9)+1),\"radialaxis\"===t._name&&(a*=2)),t.minor&&\"array\"!==t.minor.tickmode||\"array\"===t.tickmode&&(a*=100),t._roughDTick=Math.abs(r[1]-r[0])/a,Z.autoTicks(t,t._roughDTick),t._minDtick>0&&t.dtick<2*t._minDtick&&(t.dtick=t._minDtick,t.tick0=t.l2r(t._forceTick0))}\"period\"===t.ticklabelmode&&function(t){var e;function r(){return!(i(t.dtick)||\"M\"!==t.dtick.charAt(0))}var n=r(),a=Z.getTickFormat(t);if(a){var o=t._dtickInit!==t.dtick;/%[fLQsSMX]/.test(a)||(/%[HI]/.test(a)?(e=E,o&&!n&&t.dtickt.range[1],p=!t.ticklabelindex||s.isArrayOrTypedArray(t.ticklabelindex)?t.ticklabelindex:[t.ticklabelindex],d=s.simpleMap(t.range,t.r2l,void 0,void 0,e),m=d[1]=(V?0:1);q--){var H=!q;q?(t._dtickInit=t.dtick,t._tick0Init=t.tick0):(t.minor._dtickInit=t.minor.dtick,t.minor._tick0Init=t.minor.tick0);var G=q?t:s.extendFlat({},t,t.minor);if(H?Z.prepMinorTicks(G,t,e):Z.prepTicks(G,e),\"array\"!==G.tickmode)if(\"sync\"!==G.tickmode){var W=Q(d),Y=W[0],X=W[1],$=i(G.dtick),J=\"log\"===l&&!($||\"L\"===G.dtick.charAt(0)),K=Z.tickFirst(G,e);if(q){if(t._tmin=K,K=X:nt<=X;nt=Z.tickIncrement(nt,it,m,c)){if(q&&tt++,G.rangebreaks&&!m){if(nt=D)break}if(N.length>R||nt===rt)break;rt=nt;var at={value:nt};q?(J&&nt!==(0|nt)&&(at.simpleLabel=!0),u>1&&tt%u&&(at.skipLabel=!0),N.push(at)):(at.minor=!0,j.push(at))}}else N=[],F=st(t);else q?(N=[],F=lt(t,!H)):(j=[],B=lt(t,!H))}!j||j.length<2?p=!1:(r=(j[1].value-j[0].value)*(f?-1:1),n=t.tickformat,(/%f/.test(n)?r>=P:/%L/.test(n)?r>=I:/%[SX]/.test(n)?r>=L:/%M/.test(n)?r>=C:/%[HI]/.test(n)?r>=E:/%p/.test(n)?r>=S:/%[Aadejuwx]/.test(n)?r>=M:/%[UVW]/.test(n)?r>=A:/%[Bbm]/.test(n)?r>=k:/%[q]/.test(n)?r>=b:!/%[Yy]/.test(n)||r>=v)||(p=!1));if(p){var ot=N.concat(j);h&&N.length&&(ot=ot.slice(1)),(ot=ot.sort((function(t,e){return t.value-e.value})).filter((function(t,e,r){return 0===e||t.value!==r[e-1].value}))).map((function(t,e){return void 0!==t.minor||t.skipLabel?null:e})).filter((function(t){return null!==t})).forEach((function(t){p.map((function(e){var r=t+e;r>=0&&r0?(a=n-1,o=n):(a=n,o=n);var s,l=t[a].value,c=t[o].value,u=Math.abs(c-l),h=r||u,f=0;h>=v?f=u>=v&&u<=g?u:y:r===_&&h>=b?f=u>=b&&u<=x?u:_:h>=k?f=u>=k&&u<=w?u:T:r===A&&h>=A?f=A:h>=M?f=M:r===S&&h>=S?f=S:r===E&&h>=E&&(f=E),f>=u&&(f=u,s=!0);var p=i+f;if(e.rangebreaks&&f>0){for(var d=0,m=0;m<84;m++){var C=(m+.5)/84;e.maskBreaks(i*(1-C)+C*p)!==O&&d++}(f*=d/84)||(t[n].drop=!0),s&&u>A&&(f=u)}(f>0||0===n)&&(t[n].periodX=i+f/2)}}(U,t,t._definedDelta),t.rangebreaks){var gt=\"y\"===t._id.charAt(0),yt=1;\"auto\"===t.tickmode&&(yt=t.tickfont?t.tickfont.size:12);var vt=NaN;for(a=N.length-1;a>-1;a--)if(N[a].drop)N.splice(a,1);else{N[a].value=Ft(N[a].value,t);var xt=t.c2p(N[a].value);(gt?vt>xt-yt:vtD||nD&&(r.periodX=D),n10||\"01-01\"!==n.substr(5)?t._tickround=\"d\":t._tickround=+e.substr(1)%12==0?\"y\":\"m\";else if(e>=M&&a<=10||e>=15*M)t._tickround=\"d\";else if(e>=C&&a<=16||e>=E)t._tickround=\"M\";else if(e>=L&&a<=19||e>=C)t._tickround=\"S\";else{var o=t.l2r(r+e).replace(/^-/,\"\").length;t._tickround=Math.max(a,o)-20,t._tickround<0&&(t._tickround=4)}}else if(i(e)||\"L\"===e.charAt(0)){var s=t.range.map(t.r2d||Number);i(e)||(e=Number(e.substr(1))),t._tickround=2-Math.floor(Math.log(e)/Math.LN10+.01);var l=Math.max(Math.abs(s[0]),Math.abs(s[1])),c=Math.floor(Math.log(l)/Math.LN10+.01),u=void 0===t.minexponent?3:t.minexponent;Math.abs(c)>u&&(_t(t.exponentformat)&&!bt(c)?t._tickexponent=3*Math.round((c-1)/3):t._tickexponent=c)}else t._tickround=null}function vt(t,e,r){var n=t.tickfont||{};return{x:e,dx:0,dy:0,text:r||\"\",fontSize:n.size,font:n.family,fontWeight:n.weight,fontStyle:n.style,fontVariant:n.variant,fontTextcase:n.textcase,fontLineposition:n.lineposition,fontShadow:n.shadow,fontColor:n.color}}Z.autoTicks=function(t,e,r){var n;function a(t){return Math.pow(t,Math.floor(Math.log(e)/Math.LN10))}if(\"date\"===t.type){t.tick0=s.dateTick0(t.calendar,0);var o=2*e;if(o>y)e/=y,n=a(10),t.dtick=\"M\"+12*gt(e,n,ct);else if(o>T)e/=T,t.dtick=\"M\"+gt(e,1,ut);else if(o>M){if(t.dtick=gt(e,M,t._hasDayOfWeekBreaks?[1,2,7,14]:ft),!r){var l=Z.getTickFormat(t),c=\"period\"===t.ticklabelmode;c&&(t._rawTick0=t.tick0),/%[uVW]/.test(l)?t.tick0=s.dateTick0(t.calendar,2):t.tick0=s.dateTick0(t.calendar,1),c&&(t._dowTick0=t.tick0)}}else o>E?t.dtick=gt(e,E,ut):o>C?t.dtick=gt(e,C,ht):o>L?t.dtick=gt(e,L,ht):(n=a(10),t.dtick=gt(e,n,ct))}else if(\"log\"===t.type){t.tick0=0;var u=s.simpleMap(t.range,t.r2l);if(t._isMinor&&(e*=1.5),e>.7)t.dtick=Math.ceil(e);else if(Math.abs(u[1]-u[0])<1){var h=1.5*Math.abs((u[1]-u[0])/e);e=Math.abs(Math.pow(10,u[1])-Math.pow(10,u[0]))/h,n=a(10),t.dtick=\"L\"+gt(e,n,ct)}else t.dtick=e>.3?\"D2\":\"D1\"}else\"category\"===t.type||\"multicategory\"===t.type?(t.tick0=0,t.dtick=Math.ceil(Math.max(e,1))):Rt(t)?(t.tick0=0,n=1,t.dtick=gt(e,n,mt)):(t.tick0=0,n=a(10),t.dtick=gt(e,n,ct));if(0===t.dtick&&(t.dtick=1),!i(t.dtick)&&\"string\"!=typeof t.dtick){var f=t.dtick;throw t.dtick=1,\"ax.dtick error: \"+String(f)}},Z.tickIncrement=function(t,e,r,a){var o=r?-1:1;if(i(e))return s.increment(t,o*e);var l=e.charAt(0),c=o*Number(e.substr(1));if(\"M\"===l)return s.incrementMonth(t,c,a);if(\"L\"===l)return Math.log(Math.pow(10,t)+c)/Math.LN10;if(\"D\"===l){var u=\"D2\"===e?dt:pt,h=t+.01*o,f=s.roundUp(s.mod(h,1),u,r);return Math.floor(h)+Math.log(n.round(Math.pow(10,f),1))/Math.LN10}throw\"unrecognized dtick \"+String(e)},Z.tickFirst=function(t,e){var r=t.r2l||Number,a=s.simpleMap(t.range,r,void 0,void 0,e),o=a[1]=0&&r<=t._length?e:null};if(l&&s.isArrayOrTypedArray(t.ticktext)){var p=s.simpleMap(t.range,t.r2l),d=(Math.abs(p[1]-p[0])-(t._lBreaks||0))/1e4;for(a=0;a \")}else t._prevDateHead=l,c+=\"
\"+l;e.text=c}(t,o,r,c):\"log\"===u?function(t,e,r,n,a){var o=t.dtick,l=e.x,c=t.tickformat,u=\"string\"==typeof o&&o.charAt(0);if(\"never\"===a&&(a=\"\"),n&&\"L\"!==u&&(o=\"L3\",u=\"L\"),c||\"L\"===u)e.text=wt(Math.pow(10,l),t,a,n);else if(i(o)||\"D\"===u&&s.mod(l+.01,1)<.1){var h=Math.round(l),f=Math.abs(h),p=t.exponentformat;\"power\"===p||_t(p)&&bt(h)?(e.text=0===h?1:1===h?\"10\":\"10\"+(h>1?\"\":z)+f+\"\",e.fontSize*=1.25):(\"e\"===p||\"E\"===p)&&f>2?e.text=\"1\"+p+(h>0?\"+\":z)+f:(e.text=wt(Math.pow(10,l),t,\"\",\"fakehover\"),\"D1\"===o&&\"y\"===t._id.charAt(0)&&(e.dy-=e.fontSize/6))}else{if(\"D\"!==u)throw\"unrecognized dtick \"+String(o);e.text=String(Math.round(Math.pow(10,s.mod(l,1)))),e.fontSize*=.75}if(\"D1\"===t.dtick){var d=String(e.text).charAt(0);\"0\"!==d&&\"1\"!==d||(\"y\"===t._id.charAt(0)?e.dx-=e.fontSize/4:(e.dy+=e.fontSize/2,e.dx+=(t.range[1]>t.range[0]?1:-1)*e.fontSize*(l<0?.5:.25)))}}(t,o,0,c,g):\"category\"===u?function(t,e){var r=t._categories[Math.round(e.x)];void 0===r&&(r=\"\"),e.text=String(r)}(t,o):\"multicategory\"===u?function(t,e,r){var n=Math.round(e.x),i=t._categories[n]||[],a=void 0===i[1]?\"\":String(i[1]),o=void 0===i[0]?\"\":String(i[0]);r?e.text=o+\" - \"+a:(e.text=a,e.text2=o)}(t,o,r):Rt(t)?function(t,e,r,n,i){if(\"radians\"!==t.thetaunit||r)e.text=wt(e.x,t,i,n);else{var a=e.x/180;if(0===a)e.text=\"0\";else{var o=function(t){function e(t,e){return Math.abs(t-e)<=1e-6}var r=function(t){for(var r=1;!e(Math.round(t*r)/r,t);)r*=10;return r}(t),n=t*r,i=Math.abs(function t(r,n){return e(n,0)?r:t(n,r%n)}(n,r));return[Math.round(n/i),Math.round(r/i)]}(a);if(o[1]>=100)e.text=wt(s.deg2rad(e.x),t,i,n);else{var l=e.x<0;1===o[1]?1===o[0]?e.text=\"π\":e.text=o[0]+\"π\":e.text=[\"\",o[0],\"\",\"⁄\",\"\",o[1],\"\",\"π\"].join(\"\"),l&&(e.text=z+e.text)}}}}(t,o,r,c,g):function(t,e,r,n,i){\"never\"===i?i=\"\":\"all\"===t.showexponent&&Math.abs(e.x/t.dtick)<1e-6&&(i=\"hide\"),e.text=wt(e.x,t,i,n)}(t,o,0,c,g),n||(t.tickprefix&&!m(t.showtickprefix)&&(o.text=t.tickprefix+o.text),t.ticksuffix&&!m(t.showticksuffix)&&(o.text+=t.ticksuffix)),t.labelalias&&t.labelalias.hasOwnProperty(o.text)){var y=t.labelalias[o.text];\"string\"==typeof y&&(o.text=y)}return(\"boundaries\"===t.tickson||t.showdividers)&&(o.xbnd=[f(o.x-.5),f(o.x+t.dtick-.5)]),o},Z.hoverLabelText=function(t,e,r){r&&(t=s.extendFlat({},t,{hoverformat:r}));var n=s.isArrayOrTypedArray(e)?e[0]:e,i=s.isArrayOrTypedArray(e)?e[1]:void 0;if(void 0!==i&&i!==n)return Z.hoverLabelText(t,n,r)+\" - \"+Z.hoverLabelText(t,i,r);var a=\"log\"===t.type&&n<=0,o=Z.tickText(t,t.c2l(a?-n:n),\"hover\").text;return a?0===n?\"0\":z+o:o};var xt=[\"f\",\"p\",\"n\",\"μ\",\"m\",\"\",\"k\",\"M\",\"G\",\"T\"];function _t(t){return\"SI\"===t||\"B\"===t}function bt(t){return t>14||t<-15}function wt(t,e,r,n){var a=t<0,o=e._tickround,l=r||e.exponentformat||\"B\",c=e._tickexponent,u=Z.getTickFormat(e),h=e.separatethousands;if(n){var f={exponentformat:l,minexponent:e.minexponent,dtick:\"none\"===e.showexponent?e.dtick:i(t)&&Math.abs(t)||1,range:\"none\"===e.showexponent?e.range.map(e.r2d):[0,t||1]};yt(f),o=(Number(f._tickround)||0)+4,c=f._tickexponent,e.hoverformat&&(u=e.hoverformat)}if(u)return e._numFormat(u)(t).replace(/-/g,z);var p,d=Math.pow(10,-o)/2;if(\"none\"===l&&(c=0),(t=Math.abs(t))\"+p+\"\":\"B\"===l&&9===c?t+=\"B\":_t(l)&&(t+=xt[c/3+5])),a?z+t:t}function Tt(t,e){if(t){var r=Object.keys(j).reduce((function(t,r){return-1!==e.indexOf(r)&&j[r].forEach((function(e){t[e]=1})),t}),{});Object.keys(t).forEach((function(e){r[e]||(1===e.length?t[e]=0:delete t[e])}))}}function kt(t,e){for(var r=[],n={},i=0;i1&&r=i.min&&t=0,a=u(t,e[1])<=0;return(r||i)&&(n||a)}if(t.tickformatstops&&t.tickformatstops.length>0)switch(t.type){case\"date\":case\"linear\":for(e=0;e=o(i)))){r=n;break}break;case\"log\":for(e=0;e=0&&i.unshift(i.splice(n,1).shift())}}));var o={false:{left:0,right:0}};return s.syncOrAsync(i.map((function(e){return function(){if(e){var n=Z.getFromId(t,e);r||(r={}),r.axShifts=o,r.overlayingShiftedAx=a;var i=Z.drawOne(t,n,r);return n._shiftPusher&&jt(n,n._fullDepth||0,o,!0),n._r=n.range.slice(),n._rl=s.simpleMap(n._r,n.r2l),i}}})))},Z.drawOne=function(t,e,r){var n,i,l,p=(r=r||{}).axShifts||{},d=r.overlayingShiftedAx||[];e.setScale();var m=t._fullLayout,g=e._id,y=g.charAt(0),v=Z.counterLetter(g),x=m._plots[e._mainSubplot];if(x){if(e._shiftPusher=e.autoshift||-1!==d.indexOf(e._id)||-1!==d.indexOf(e.overlaying),e._shiftPusher&\"free\"===e.anchor){var _=e.linewidth/2||0;\"inside\"===e.ticks&&(_+=e.ticklen),jt(e,_,p,!0),jt(e,e.shift||0,p,!1)}!0===r.skipTitle&&void 0!==e._shift||(e._shift=function(t,e){return t.autoshift?e[t.overlaying][t.side]:t.shift||0}(e,p));var b=x[y+\"axislayer\"],w=e._mainLinePosition,T=w+=e._shift,k=e._mainMirrorPosition,A=e._vals=Z.calcTicks(e),M=[e.mirror,T,k].join(\"_\");for(n=0;n0?r.bottom-u:0,h))));var f=0,p=0;if(e._shiftPusher&&(f=Math.max(h,r.height>0?\"l\"===l?u-r.left:r.right-u:0),e.title.text!==m._dfltTitle[y]&&(p=(e._titleStandoff||0)+(e._titleScoot||0),\"l\"===l&&(p+=St(e))),e._fullDepth=Math.max(f,p)),e.automargin){n={x:0,y:0,r:0,l:0,t:0,b:0};var d=[0,1],g=\"number\"==typeof e._shift?e._shift:0;if(\"x\"===y){if(\"b\"===l?n[l]=e._depth:(n[l]=e._depth=Math.max(r.width>0?u-r.top:0,h),d.reverse()),r.width>0){var x=r.right-(e._offset+e._length);x>0&&(n.xr=1,n.r=x);var _=e._offset-r.left;_>0&&(n.xl=0,n.l=_)}}else if(\"l\"===l?(e._depth=Math.max(r.height>0?u-r.left:0,h),n[l]=e._depth-g):(e._depth=Math.max(r.height>0?r.right-u:0,h),n[l]=e._depth+g,d.reverse()),r.height>0){var b=r.bottom-(e._offset+e._length);b>0&&(n.yb=0,n.b=b);var w=e._offset-r.top;w>0&&(n.yt=1,n.t=w)}n[v]=\"free\"===e.anchor?e.position:e._anchorAxis.domain[d[0]],e.title.text!==m._dfltTitle[y]&&(n[l]+=St(e)+(e.title.standoff||0)),e.mirror&&\"free\"!==e.anchor&&((i={x:0,y:0,r:0,l:0,t:0,b:0})[c]=e.linewidth,e.mirror&&!0!==e.mirror&&(i[c]+=h),!0===e.mirror||\"ticks\"===e.mirror?i[v]=e._anchorAxis.domain[d[1]]:\"all\"!==e.mirror&&\"allticks\"!==e.mirror||(i[v]=[e._counterDomainMin,e._counterDomainMax][d[1]]))}ht&&(s=o.getComponentMethod(\"rangeslider\",\"autoMarginOpts\")(t,e)),\"string\"==typeof e.automargin&&(Tt(n,e.automargin),Tt(i,e.automargin)),a.autoMargin(t,Lt(e),n),a.autoMargin(t,It(e),i),a.autoMargin(t,Pt(e),s)})),s.syncOrAsync(ct)}}function ft(t){var r=g+(t||\"tick\");return S[r]||(S[r]=function(t,e,r){var n,i,a,o;if(t._selections[e].size())n=1/0,i=-1/0,a=1/0,o=-1/0,t._selections[e].each((function(){var t=Ct(this),e=f.bBox(t.node().parentNode);n=Math.min(n,e.top),i=Math.max(i,e.bottom),a=Math.min(a,e.left),o=Math.max(o,e.right)}));else{var s=Z.makeLabelFns(t,r);n=i=s.yFn({dx:0,dy:0,fontSize:0}),a=o=s.xFn({dx:0,dy:0,fontSize:0})}return{top:n,bottom:i,left:a,right:o,height:i-n,width:o-a}}(e,r,T)),S[r]}},Z.getTickSigns=function(t,e){var r=t._id.charAt(0),n={x:\"top\",y:\"right\"}[r],i=t.side===n?1:-1,a=[-1,1,i,-i];return\"inside\"!==(e?(t.minor||{}).ticks:t.ticks)==(\"x\"===r)&&(a=a.map((function(t){return-t}))),t.side&&a.push({l:-1,t:-1,r:1,b:1}[t.side.charAt(0)]),a},Z.makeTransTickFn=function(t){return\"x\"===t._id.charAt(0)?function(e){return l(t._offset+t.l2p(e.x),0)}:function(e){return l(0,t._offset+t.l2p(e.x))}},Z.makeTransTickLabelFn=function(t){var e=function(t){var e=t.ticklabelposition||\"\",r=function(t){return-1!==e.indexOf(t)},n=r(\"top\"),i=r(\"left\"),a=r(\"right\"),o=r(\"bottom\"),s=r(\"inside\"),l=o||i||n||a;if(!l&&!s)return[0,0];var c=t.side,u=l?(t.tickwidth||0)/2:0,h=3,f=t.tickfont?t.tickfont.size:12;return(o||n)&&(u+=f*q,h+=(t.linewidth||0)/2),(i||a)&&(u+=(t.linewidth||0)/2,h+=3),s&&\"top\"===c&&(h-=f*(1-q)),(i||n)&&(u=-u),\"bottom\"!==c&&\"right\"!==c||(h=-h),[l?u:0,s?h:0]}(t),r=t.ticklabelshift||0,n=t.ticklabelstandoff||0,i=e[0],a=e[1],o=t.range[0]>t.range[1],s=t.ticklabelposition&&-1!==t.ticklabelposition.indexOf(\"inside\"),c=!s;if(r&&(r*=o?-1:1),n){var u=t.side;n*=s&&(\"top\"===u||\"left\"===u)||c&&(\"bottom\"===u||\"right\"===u)?1:-1}return\"x\"===t._id.charAt(0)?function(e){return l(i+t._offset+t.l2p(At(e))+r,a+n)}:function(e){return l(a+n,i+t._offset+t.l2p(At(e))+r)}},Z.makeTickPath=function(t,e,r,n){n||(n={});var i=n.minor;if(i&&!t.minor)return\"\";var a=void 0!==n.len?n.len:i?t.minor.ticklen:t.ticklen,o=t._id.charAt(0),s=(t.linewidth||1)/2;return\"x\"===o?\"M0,\"+(e+s*r)+\"v\"+a*r:\"M\"+(e+s*r)+\",0h\"+a*r},Z.makeLabelFns=function(t,e,r){var n=t.ticklabelposition||\"\",a=function(t){return-1!==n.indexOf(t)},o=a(\"top\"),l=a(\"left\"),c=a(\"right\"),u=a(\"bottom\")||l||o||c,h=a(\"inside\"),f=\"inside\"===n&&\"inside\"===t.ticks||!h&&\"outside\"===t.ticks&&\"boundaries\"!==t.tickson,p=0,d=0,m=f?t.ticklen:0;if(h?m*=-1:u&&(m=0),f&&(p+=m,r)){var g=s.deg2rad(r);p=m*Math.cos(g)+1,d=m*Math.sin(g)}t.showticklabels&&(f||t.showline)&&(p+=.2*t.tickfont.size);var y,v,x,_,b,w={labelStandoff:p+=(t.linewidth||1)/2*(h?-1:1),labelShift:d},T=0,k=t.side,A=t._id.charAt(0),M=t.tickangle;if(\"x\"===A)_=(b=!h&&\"bottom\"===k||h&&\"top\"===k)?1:-1,h&&(_*=-1),y=d*_,v=e+p*_,x=b?1:-.2,90===Math.abs(M)&&(h?x+=V:x=-90===M&&\"bottom\"===k?q:90===M&&\"top\"===k?V:.5,T=V/2*(M/90)),w.xFn=function(t){return t.dx+y+T*t.fontSize},w.yFn=function(t){return t.dy+v+t.fontSize*x},w.anchorFn=function(t,e){if(u){if(l)return\"end\";if(c)return\"start\"}return i(e)&&0!==e&&180!==e?e*_<0!==h?\"end\":\"start\":\"middle\"},w.heightFn=function(e,r,n){return r<-60||r>60?-.5*n:\"top\"===t.side!==h?-n:0};else if(\"y\"===A){if(_=(b=!h&&\"left\"===k||h&&\"right\"===k)?1:-1,h&&(_*=-1),y=p,v=d*_,x=0,h||90!==Math.abs(M)||(x=-90===M&&\"left\"===k||90===M&&\"right\"===k?q:.5),h){var S=i(M)?+M:0;if(0!==S){var E=s.deg2rad(S);T=Math.abs(Math.sin(E))*q*_,x=0}}w.xFn=function(t){return t.dx+e-(y+t.fontSize*x)*_+T*t.fontSize},w.yFn=function(t){return t.dy+v+t.fontSize*V},w.anchorFn=function(t,e){return i(e)&&90===Math.abs(e)?\"middle\":b?\"end\":\"start\"},w.heightFn=function(e,r,n){return\"right\"===t.side&&(r*=-1),r<-30?-n:r<30?-.5*n:0}}return w},Z.drawTicks=function(t,e,r){r=r||{};var i=e._id+\"tick\",a=[].concat(e.minor&&e.minor.ticks?r.vals.filter((function(t){return t.minor&&!t.noTick})):[]).concat(e.ticks?r.vals.filter((function(t){return!t.minor&&!t.noTick})):[]),o=r.layer.selectAll(\"path.\"+i).data(a,Mt);o.exit().remove(),o.enter().append(\"path\").classed(i,1).classed(\"ticks\",1).classed(\"crisp\",!1!==r.crisp).each((function(t){return h.stroke(n.select(this),t.minor?e.minor.tickcolor:e.tickcolor)})).style(\"stroke-width\",(function(r){return f.crispRound(t,r.minor?e.minor.tickwidth:e.tickwidth,1)+\"px\"})).attr(\"d\",r.path).style(\"display\",null),Nt(e,[B]),o.attr(\"transform\",r.transFn)},Z.drawGrid=function(t,e,r){if(r=r||{},\"sync\"!==e.tickmode){var i=e._id+\"grid\",a=e.minor&&e.minor.showgrid,o=a?r.vals.filter((function(t){return t.minor})):[],s=e.showgrid?r.vals.filter((function(t){return!t.minor})):[],l=r.counterAxis;if(l&&Z.shouldShowZeroLine(t,e,l))for(var c=\"array\"===e.tickmode,u=0;u=0;y--){var v=y?m:g;if(v){var x=v.selectAll(\"path.\"+i).data(y?s:o,Mt);x.exit().remove(),x.enter().append(\"path\").classed(i,1).classed(\"crisp\",!1!==r.crisp),x.attr(\"transform\",r.transFn).attr(\"d\",r.path).each((function(t){return h.stroke(n.select(this),t.minor?e.minor.gridcolor:e.gridcolor||\"#ddd\")})).style(\"stroke-dasharray\",(function(t){return f.dashStyle(t.minor?e.minor.griddash:e.griddash,t.minor?e.minor.gridwidth:e.gridwidth)})).style(\"stroke-width\",(function(t){return(t.minor?d:e._gw)+\"px\"})).style(\"display\",null),\"function\"==typeof r.path&&x.attr(\"d\",r.path)}}Nt(e,[R,F])}},Z.drawZeroLine=function(t,e,r){r=r||r;var n=e._id+\"zl\",i=Z.shouldShowZeroLine(t,e,r.counterAxis),a=r.layer.selectAll(\"path.\"+n).data(i?[{x:0,id:e._id}]:[]);a.exit().remove(),a.enter().append(\"path\").classed(n,1).classed(\"zl\",1).classed(\"crisp\",!1!==r.crisp).each((function(){r.layer.selectAll(\"path\").sort((function(t,e){return X(t.id,e.id)}))})),a.attr(\"transform\",r.transFn).attr(\"d\",r.path).call(h.stroke,e.zerolinecolor||h.defaultLine).style(\"stroke-width\",f.crispRound(t,e.zerolinewidth,e._gw||1)+\"px\").style(\"display\",null),Nt(e,[D])},Z.drawLabels=function(t,e,r){r=r||{};var a=t._fullLayout,o=e._id,u=r.cls||o+\"tick\",h=r.vals.filter((function(t){return t.text})),p=r.labelFns,d=r.secondary?0:e.tickangle,m=(e._prevTickAngles||{})[u],g=r.layer.selectAll(\"g.\"+u).data(e.showticklabels?h:[],Mt),y=[];function v(t,a){t.each((function(t){var o=n.select(this),s=o.select(\".text-math-group\"),u=p.anchorFn(t,a),h=r.transFn.call(o.node(),t)+(i(a)&&0!=+a?\" rotate(\"+a+\",\"+p.xFn(t)+\",\"+(p.yFn(t)-t.fontSize/2)+\")\":\"\"),d=c.lineCount(o),m=H*t.fontSize,g=p.heightFn(t,i(a)?+a:0,(d-1)*m);if(g&&(h+=l(0,g)),s.empty()){var y=o.select(\"text\");y.attr({transform:h,\"text-anchor\":u}),y.style(\"opacity\",1),e._adjustTickLabelsOverflow&&e._adjustTickLabelsOverflow()}else{var v=f.bBox(s.node()).width*{end:-.5,start:.5}[u];s.attr(\"transform\",h+l(v,0))}}))}g.enter().append(\"g\").classed(u,1).append(\"text\").attr(\"text-anchor\",\"middle\").each((function(e){var r=n.select(this),i=t._promises.length;r.call(c.positionText,p.xFn(e),p.yFn(e)).call(f.font,{family:e.font,size:e.fontSize,color:e.fontColor,weight:e.fontWeight,style:e.fontStyle,variant:e.fontVariant,textcase:e.fontTextcase,lineposition:e.fontLineposition,shadow:e.fontShadow}).text(e.text).call(c.convertToTspans,t),t._promises[i]?y.push(t._promises.pop().then((function(){v(r,d)}))):v(r,d)})),Nt(e,[N]),g.exit().remove(),r.repositionOnUpdate&&g.each((function(t){n.select(this).select(\"text\").call(c.positionText,p.xFn(t),p.yFn(t))})),e._adjustTickLabelsOverflow=function(){var r=e.ticklabeloverflow;if(r&&\"allow\"!==r){var i=-1!==r.indexOf(\"hide\"),o=\"x\"===e._id.charAt(0),l=0,c=o?t._fullLayout.width:t._fullLayout.height;if(-1!==r.indexOf(\"domain\")){var u=s.simpleMap(e.range,e.r2l);l=e.l2p(u[0])+e._offset,c=e.l2p(u[1])+e._offset}var h=Math.min(l,c),p=Math.max(l,c),d=e.side,m=1/0,y=-1/0;for(var v in g.each((function(t){var r=n.select(this);if(r.select(\".text-math-group\").empty()){var a=f.bBox(r.node()),s=0;o?(a.right>p||a.leftp||a.top+(e.tickangle?0:t.fontSize/4)e[\"_visibleLabelMin_\"+r._id]?l.style(\"display\",\"none\"):\"tick\"!==t.K||i||l.style(\"display\",null)}))}))}))}))},v(g,m+1?m:d);var x=null;e._selections&&(e._selections[u]=g);var _=[function(){return y.length&&Promise.all(y)}];e.automargin&&a._redrawFromAutoMarginCount&&90===m?(x=m,_.push((function(){v(g,m)}))):_.push((function(){if(v(g,d),h.length&&e.autotickangles&&(\"log\"!==e.type||\"D\"!==String(e.dtick).charAt(0))){x=e.autotickangles[0];var t,n=0,i=[],a=1;g.each((function(t){n=Math.max(n,t.fontSize);var r=e.l2p(t.x),o=Ct(this),s=f.bBox(o.node());a=Math.max(a,c.lineCount(o)),i.push({top:0,bottom:10,height:10,left:r-s.width/2,right:r+s.width/2+2,width:s.width+2})}));var o=(\"boundaries\"===e.tickson||e.showdividers)&&!r.secondary,l=h.length,u=Math.abs((h[l-1].x-h[0].x)*e._m)/(l-1),p=o?u/2:u,m=o?e.ticklen:1.25*n*a,y=p/Math.sqrt(Math.pow(p,2)+Math.pow(m,2)),_=e.autotickangles.map((function(t){return t*Math.PI/180})),b=_.find((function(t){return Math.abs(Math.cos(t))<=y}));void 0===b&&(b=_.reduce((function(t,e){return Math.abs(Math.cos(t))j*O&&(I=O,E[S]=C[S]=P[S])}var U=Math.abs(I-L);U-k>0?k*=1+k/(U-=k):k=0,\"y\"!==e._id.charAt(0)&&(k=-k),E[M]=w.p2r(w.r2p(C[M])+A*k),\"min\"===w.autorange||\"max reversed\"===w.autorange?(E[0]=null,w._rangeInitial0=void 0,w._rangeInitial1=void 0):\"max\"!==w.autorange&&\"min reversed\"!==w.autorange||(E[1]=null,w._rangeInitial0=void 0,w._rangeInitial1=void 0),a._insideTickLabelsUpdaterange[w._name+\".range\"]=E}var V=s.syncOrAsync(_);return V&&V.then&&t._promises.push(V),V},Z.getPxPosition=function(t,e){var r,n=t._fullLayout._size,i=e._id.charAt(0),a=e.side;return\"free\"!==e.anchor?r=e._anchorAxis:\"x\"===i?r={_offset:n.t+(1-(e.position||0))*n.h,_length:0}:\"y\"===i&&(r={_offset:n.l+(e.position||0)*n.w+e._shift,_length:0}),\"top\"===a||\"left\"===a?r._offset:\"bottom\"===a||\"right\"===a?r._offset+r._length:void 0},Z.shouldShowZeroLine=function(t,e,r){var n=s.simpleMap(e.range,e.r2l);return n[0]*n[1]<=0&&e.zeroline&&(\"linear\"===e.type||\"-\"===e.type)&&!(e.rangebreaks&&e.maskBreaks(0)===O)&&(Et(e,0)||!function(t,e,r,n){var i=r._mainAxis;if(i){var a=t._fullLayout,o=e._id.charAt(0),s=Z.counterLetter(e._id),l=e._offset+(Math.abs(n[0])1)for(n=1;n2*o}(i,e))return\"date\";var g=\"strict\"!==r.autotypenumbers;return function(t,e){for(var r=t.length,n=h(r),i=0,o=0,s={},u=0;u2*i}(i,g)?\"category\":function(t,e){for(var r=t.length,n=0;n=2){var s,c,u=\"\";if(2===o.length)for(s=0;s<2;s++)if(c=b(o[s])){u=y;break}var h=i(\"pattern\",u);if(h===y)for(s=0;s<2;s++)(c=b(o[s]))&&(e.bounds[s]=o[s]=c-1);if(h)for(s=0;s<2;s++)switch(c=o[s],h){case y:if(!n(c))return void(e.enabled=!1);if((c=+c)!==Math.floor(c)||c<0||c>=7)return void(e.enabled=!1);e.bounds[s]=o[s]=c;break;case v:if(!n(c))return void(e.enabled=!1);if((c=+c)<0||c>24)return void(e.enabled=!1);e.bounds[s]=o[s]=c}if(!1===r.autorange){var f=r.range;if(f[0]f[1])return void(e.enabled=!1)}else if(o[0]>f[0]&&o[1]n?1:-1:+(t.substr(1)||1)-+(e.substr(1)||1)},e.ref2id=function(t){return!!/^[xyz]/.test(t)&&t.split(\" \")[0]},e.isLinked=function(t,e){return a(e,t._axisMatchGroups)||a(e,t._axisConstraintGroups)}},46473:function(t,e,r){\"use strict\";var n=r(87800).isTypedArraySpec;t.exports=function(t,e,r,i){if(\"category\"===e.type){var a,o=t.categoryarray,s=Array.isArray(o)&&o.length>0||n(o);s&&(a=\"array\");var l,c=r(\"categoryorder\",a);\"array\"===c&&(l=r(\"categoryarray\")),s||\"array\"!==c||(c=e.categoryorder=\"trace\"),\"trace\"===c?e._initialCategories=[]:\"array\"===c?e._initialCategories=l.slice():(l=function(t,e){var r,n,i,a=e.dataAttr||t._id.charAt(0),o={};if(e.axData)r=e.axData;else for(r=[],n=0;nn?i.substr(n):a.substr(r))+o:i+a+t*e:o}function g(t,e){for(var r=e._size,n=r.h/r.w,i={},a=Object.keys(t),o=0;oc*x)||T)for(r=0;rz&&FI&&(I=F);f/=(I-L)/(2*P),L=l.l2r(L),I=l.l2r(I),l.range=l._input.range=S=0?Math.min(t,.9):1/(1/Math.max(t,-.3)+3.222))}function N(t,e,r,n,i){return t.append(\"path\").attr(\"class\",\"zoombox\").style({fill:e>.2?\"rgba(0,0,0,0)\":\"rgba(255,255,255,0)\",\"stroke-width\":0}).attr(\"transform\",c(r,n)).attr(\"d\",i+\"Z\")}function j(t,e,r){return t.append(\"path\").attr(\"class\",\"zoombox-corners\").style({fill:h.background,stroke:h.defaultLine,\"stroke-width\":1,opacity:0}).attr(\"transform\",c(e,r)).attr(\"d\",\"M0,0Z\")}function U(t,e,r,n,i,a){t.attr(\"d\",n+\"M\"+r.l+\",\"+r.t+\"v\"+r.h+\"h\"+r.w+\"v-\"+r.h+\"h-\"+r.w+\"Z\"),V(t,e,i,a)}function V(t,e,r,n){r||(t.transition().style(\"fill\",n>.2?\"rgba(0,0,0,0.4)\":\"rgba(255,255,255,0.3)\").duration(200),e.transition().style(\"opacity\",1).duration(200))}function q(t){n.select(t).selectAll(\".zoombox,.js-zoombox-backdrop,.js-zoombox-menu,.zoombox-corners\").remove()}function H(t){P&&t.data&&t._context.showTips&&(i.notifier(i._(t,\"Double-click to zoom back out\"),\"long\"),P=!1)}function G(t){var e=Math.floor(Math.min(t.b-t.t,t.r-t.l,I)/2);return\"M\"+(t.l-3.5)+\",\"+(t.t-.5+e)+\"h3v\"+-e+\"h\"+e+\"v-3h-\"+(e+3)+\"ZM\"+(t.r+3.5)+\",\"+(t.t-.5+e)+\"h-3v\"+-e+\"h\"+-e+\"v-3h\"+(e+3)+\"ZM\"+(t.r+3.5)+\",\"+(t.b+.5-e)+\"h-3v\"+e+\"h\"+-e+\"v3h\"+(e+3)+\"ZM\"+(t.l-3.5)+\",\"+(t.b+.5-e)+\"h3v\"+e+\"h\"+e+\"v3h-\"+(e+3)+\"Z\"}function Z(t,e,r,n,a){for(var o,s,l,c,u=!1,h={},f={},p=(a||{}).xaHash,d=(a||{}).yaHash,m=0;m=0)i._fullLayout._deactivateShape(i);else{var o=i._fullLayout.clickmode;if(q(i),2!==t||yt||Ht(),gt)o.indexOf(\"select\")>-1&&S(r,i,$,J,e.id,It),o.indexOf(\"event\")>-1&&p.click(i,r,e.id);else if(1===t&&yt){var s=m?z:P,c=\"s\"===m||\"w\"===y?0:1,h=s._name+\".range[\"+c+\"]\",f=function(t,e){var r,n=t.range[e],i=Math.abs(n-t.range[1-e]);return\"date\"===t.type?n:\"log\"===t.type?(r=Math.ceil(Math.max(0,-Math.log(i)/Math.LN10))+3,a(\".\"+r+\"g\")(Math.pow(10,n))):(r=Math.floor(Math.log(Math.abs(n))/Math.LN10)-Math.floor(Math.log(i)/Math.LN10)+4,a(\".\"+String(r)+\"g\")(n))}(s,c),d=\"left\",g=\"middle\";if(s.fixedrange)return;m?(g=\"n\"===m?\"top\":\"bottom\",\"right\"===s.side&&(d=\"right\")):\"e\"===y&&(d=\"right\"),i._context.showAxisRangeEntryBoxes&&n.select(_t).call(u.makeEditable,{gd:i,immediate:!0,background:i._fullLayout.paper_bgcolor,text:String(f),fill:s.tickfont?s.tickfont.color:\"#444\",horizontalAlign:d,verticalAlign:g}).on(\"edit\",(function(t){var e=s.d2r(t);void 0!==e&&l.call(\"_guiRelayout\",i,h,e)}))}}}function Ot(e,r){if(t._transitioningWithDuration)return!1;var n=Math.max(0,Math.min(tt,pt*e+bt)),i=Math.max(0,Math.min(et,dt*r+wt)),a=Math.abs(n-bt),o=Math.abs(i-wt);function s(){St=\"\",Tt.r=Tt.l,Tt.t=Tt.b,Ct.attr(\"d\",\"M0,0Z\")}if(Tt.l=Math.min(bt,n),Tt.r=Math.max(bt,n),Tt.t=Math.min(wt,i),Tt.b=Math.max(wt,i),rt.isSubplotConstrained)a>I||o>I?(St=\"xy\",a/tt>o/et?(o=a*et/tt,wt>i?Tt.t=wt-o:Tt.b=wt+o):(a=o*tt/et,bt>n?Tt.l=bt-a:Tt.r=bt+a),Ct.attr(\"d\",G(Tt))):s();else if(nt.isSubplotConstrained)if(a>I||o>I){St=\"xy\";var l=Math.min(Tt.l/tt,(et-Tt.b)/et),c=Math.max(Tt.r/tt,(et-Tt.t)/et);Tt.l=l*tt,Tt.r=c*tt,Tt.b=(1-l)*et,Tt.t=(1-c)*et,Ct.attr(\"d\",G(Tt))}else s();else!at||o0){var u;if(nt.isSubplotConstrained||!it&&1===at.length){for(u=0;u<$.length;u++)$[u].range=$[u]._r.slice(),E($[u],1-r/et);o=(e=r*tt/et)/2}if(nt.isSubplotConstrained||!at&&1===it.length){for(u=0;u1&&(void 0!==a.maxallowed&&st===(a.range[0]1&&(void 0!==o.maxallowed&<===(o.range[0]1)if(l)e.xlines=f(n,\"path\",\"xlines-above\"),e.ylines=f(n,\"path\",\"ylines-above\"),e.xaxislayer=f(n,\"g\",\"xaxislayer-above\"),e.yaxislayer=f(n,\"g\",\"yaxislayer-above\");else{if(!a){var h=f(n,\"g\",\"layer-subplot\");e.shapelayer=f(h,\"g\",\"shapelayer\"),e.imagelayer=f(h,\"g\",\"imagelayer\"),e.minorGridlayer=f(n,\"g\",\"minor-gridlayer\"),e.gridlayer=f(n,\"g\",\"gridlayer\"),e.zerolinelayer=f(n,\"g\",\"zerolinelayer\");var m=f(n,\"g\",\"layer-between\");e.shapelayerBetween=f(m,\"g\",\"shapelayer\"),e.imagelayerBetween=f(m,\"g\",\"imagelayer\"),f(n,\"path\",\"xlines-below\"),f(n,\"path\",\"ylines-below\"),e.overlinesBelow=f(n,\"g\",\"overlines-below\"),f(n,\"g\",\"xaxislayer-below\"),f(n,\"g\",\"yaxislayer-below\"),e.overaxesBelow=f(n,\"g\",\"overaxes-below\")}e.overplot=f(n,\"g\",\"overplot\"),e.plot=f(e.overplot,\"g\",i),a||(e.xlines=f(n,\"path\",\"xlines-above\"),e.ylines=f(n,\"path\",\"ylines-above\"),e.overlinesAbove=f(n,\"g\",\"overlines-above\"),f(n,\"g\",\"xaxislayer-above\"),f(n,\"g\",\"yaxislayer-above\"),e.overaxesAbove=f(n,\"g\",\"overaxes-above\"),e.xlines=n.select(\".xlines-\"+o),e.ylines=n.select(\".ylines-\"+s),e.xaxislayer=n.select(\".xaxislayer-\"+o),e.yaxislayer=n.select(\".yaxislayer-\"+s))}else{var g=e.mainplotinfo,y=g.plotgroup,v=i+\"-x\",x=i+\"-y\";e.minorGridlayer=g.minorGridlayer,e.gridlayer=g.gridlayer,e.zerolinelayer=g.zerolinelayer,f(g.overlinesBelow,\"path\",v),f(g.overlinesBelow,\"path\",x),f(g.overaxesBelow,\"g\",v),f(g.overaxesBelow,\"g\",x),e.plot=f(g.overplot,\"g\",i),f(g.overlinesAbove,\"path\",v),f(g.overlinesAbove,\"path\",x),f(g.overaxesAbove,\"g\",v),f(g.overaxesAbove,\"g\",x),e.xlines=y.select(\".overlines-\"+o).select(\".\"+v),e.ylines=y.select(\".overlines-\"+s).select(\".\"+x),e.xaxislayer=y.select(\".overaxes-\"+o).select(\".\"+v),e.yaxislayer=y.select(\".overaxes-\"+s).select(\".\"+x)}a||(l||(p(e.minorGridlayer,\"g\",e.xaxis._id),p(e.minorGridlayer,\"g\",e.yaxis._id),e.minorGridlayer.selectAll(\"g\").map((function(t){return t[0]})).sort(c.idSort),p(e.gridlayer,\"g\",e.xaxis._id),p(e.gridlayer,\"g\",e.yaxis._id),e.gridlayer.selectAll(\"g\").map((function(t){return t[0]})).sort(c.idSort)),e.xlines.style(\"fill\",\"none\").classed(\"crisp\",!0),e.ylines.style(\"fill\",\"none\").classed(\"crisp\",!0))}function y(t,e){if(t){var r={};for(var i in t.each((function(t){var i=t[0];n.select(this).remove(),v(i,e),r[i]=!0})),e._plots)for(var a=e._plots[i].overlays||[],o=0;o0){var g=p.id;if(-1!==g.indexOf(d))continue;g+=d+(u+1),p=a.extendFlat({},p,{id:g,plot:o._cartesianlayer.selectAll(\".subplot\").select(\".\"+g)})}for(var y,v=[],x=0;x1&&(w+=d+b),_.push(n+w),r=0;r_[1]-1/4096&&(e.domain=s),i.noneOrAll(t.domain,e.domain,s),\"sync\"===e.tickmode&&(e.tickmode=\"auto\")}return r(\"layer\"),e}},54616:function(t,e,r){\"use strict\";var n=r(87703);t.exports=function(t,e,r,i,a){a||(a={});var o=a.tickSuffixDflt,s=n(t);r(\"tickprefix\")&&r(\"showtickprefix\",s),r(\"ticksuffix\",o)&&r(\"showticksuffix\",s)}},90259:function(t,e,r){\"use strict\";var n=r(75511);t.exports=function(t,e,r,i){var a=e._template||{},o=e.type||a.type||\"-\";r(\"minallowed\"),r(\"maxallowed\");var s,l=r(\"range\");l||i.noInsiderange||\"log\"===o||(!(s=r(\"insiderange\"))||null!==s[0]&&null!==s[1]||(e.insiderange=!1,s=void 0),s&&(l=r(\"range\",s)));var c,u=e.getAutorangeDflt(l,i),h=r(\"autorange\",u);!l||(null!==l[0]||null!==l[1])&&(null!==l[0]&&null!==l[1]||\"reversed\"!==h&&!0!==h)&&(null===l[0]||\"min\"!==h&&\"max reversed\"!==h)&&(null===l[1]||\"max\"!==h&&\"min reversed\"!==h)||(l=void 0,delete e.range,e.autorange=!0,c=!0),c||(h=r(\"autorange\",u=e.getAutorangeDflt(l,i))),h&&(n(r,h,l),\"linear\"!==o&&\"-\"!==o||r(\"rangemode\")),e.cleanRange()}},67611:function(t,e,r){\"use strict\";var n=r(4530).FROM_BL;t.exports=function(t,e,r){void 0===r&&(r=n[t.constraintoward||\"center\"]);var i=[t.r2l(t.range[0]),t.r2l(t.range[1])],a=i[0]+(i[1]-i[0])*r;t.range=t._input.range=[t.l2r(a+(i[0]-a)*e),t.l2r(a+(i[1]-a)*e)],t.setScale()}},19091:function(t,e,r){\"use strict\";var n=r(45568),i=r(42696).aL,a=r(34809),o=a.numberFormat,s=r(10721),l=a.cleanNumber,c=a.ms2DateTime,u=a.dateTime2ms,h=a.ensureNumber,f=a.isArrayOrTypedArray,p=r(63821),d=p.FP_SAFE,m=p.BADNUM,g=p.LOG_CLIP,y=p.ONEWEEK,v=p.ONEDAY,x=p.ONEHOUR,_=p.ONEMIN,b=p.ONESEC,w=r(5975),T=r(54826),k=T.HOUR_PATTERN,A=T.WEEKDAY_PATTERN;function M(t){return Math.pow(10,t)}function S(t){return null!=t}t.exports=function(t,e){e=e||{};var r=t._id||\"x\",p=r.charAt(0);function E(e,r){if(e>0)return Math.log(e)/Math.LN10;if(e<=0&&r&&t.range&&2===t.range.length){var n=t.range[0],i=t.range[1];return.5*(n+i-2*g*Math.abs(n-i))}return m}function C(e,r,n,i){if((i||{}).msUTC&&s(e))return+e;var o=u(e,n||t.calendar);if(o===m){if(!s(e))return m;e=+e;var l=Math.floor(10*a.mod(e+.05,1)),c=Math.round(e-l/10);o=u(new Date(c))+l/10}return o}function L(e,r,n){return c(e,r,n||t.calendar)}function I(e){return t._categories[Math.round(e)]}function P(e){if(S(e)){if(void 0===t._categoriesMap&&(t._categoriesMap={}),void 0!==t._categoriesMap[e])return t._categoriesMap[e];t._categories.push(\"number\"==typeof e?String(e):e);var r=t._categories.length-1;return t._categoriesMap[e]=r,r}return m}function z(e){if(t._categoriesMap)return t._categoriesMap[e]}function O(t){var e=z(t);return void 0!==e?e:s(t)?+t:void 0}function D(t){return s(t)?+t:z(t)}function R(t,e,r){return n.round(r+e*t,2)}function F(t,e,r){return(t-r)/e}var B=function(e){return s(e)?R(e,t._m,t._b):m},N=function(e){return F(e,t._m,t._b)};if(t.rangebreaks){var j=\"y\"===p;B=function(e){if(!s(e))return m;var r=t._rangebreaks.length;if(!r)return R(e,t._m,t._b);var n=j;t.range[0]>t.range[1]&&(n=!n);for(var i=n?-1:1,a=i*e,o=0,l=0;lu)){o=a<(c+u)/2?l:l+1;break}o=l+1}var h=t._B[o]||0;return isFinite(h)?R(e,t._m2,h):0},N=function(e){var r=t._rangebreaks.length;if(!r)return F(e,t._m,t._b);for(var n=0,i=0;it._rangebreaks[i].pmax&&(n=i+1);return F(e,t._m2,t._B[n])}}t.c2l=\"log\"===t.type?E:h,t.l2c=\"log\"===t.type?M:h,t.l2p=B,t.p2l=N,t.c2p=\"log\"===t.type?function(t,e){return B(E(t,e))}:B,t.p2c=\"log\"===t.type?function(t){return M(N(t))}:N,-1!==[\"linear\",\"-\"].indexOf(t.type)?(t.d2r=t.r2d=t.d2c=t.r2c=t.d2l=t.r2l=l,t.c2d=t.c2r=t.l2d=t.l2r=h,t.d2p=t.r2p=function(e){return t.l2p(l(e))},t.p2d=t.p2r=N,t.cleanPos=h):\"log\"===t.type?(t.d2r=t.d2l=function(t,e){return E(l(t),e)},t.r2d=t.r2c=function(t){return M(l(t))},t.d2c=t.r2l=l,t.c2d=t.l2r=h,t.c2r=E,t.l2d=M,t.d2p=function(e,r){return t.l2p(t.d2r(e,r))},t.p2d=function(t){return M(N(t))},t.r2p=function(e){return t.l2p(l(e))},t.p2r=N,t.cleanPos=h):\"date\"===t.type?(t.d2r=t.r2d=a.identity,t.d2c=t.r2c=t.d2l=t.r2l=C,t.c2d=t.c2r=t.l2d=t.l2r=L,t.d2p=t.r2p=function(e,r,n){return t.l2p(C(e,0,n))},t.p2d=t.p2r=function(t,e,r){return L(N(t),e,r)},t.cleanPos=function(e){return a.cleanDate(e,m,t.calendar)}):\"category\"===t.type?(t.d2c=t.d2l=P,t.r2d=t.c2d=t.l2d=I,t.d2r=t.d2l_noadd=O,t.r2c=function(e){var r=D(e);return void 0!==r?r:t.fraction2r(.5)},t.l2r=t.c2r=h,t.r2l=D,t.d2p=function(e){return t.l2p(t.r2c(e))},t.p2d=function(t){return I(N(t))},t.r2p=t.d2p,t.p2r=N,t.cleanPos=function(t){return\"string\"==typeof t&&\"\"!==t?t:h(t)}):\"multicategory\"===t.type&&(t.r2d=t.c2d=t.l2d=I,t.d2r=t.d2l_noadd=O,t.r2c=function(e){var r=O(e);return void 0!==r?r:t.fraction2r(.5)},t.r2c_just_indices=z,t.l2r=t.c2r=h,t.r2l=O,t.d2p=function(e){return t.l2p(t.r2c(e))},t.p2d=function(t){return I(N(t))},t.r2p=t.d2p,t.p2r=N,t.cleanPos=function(t){return Array.isArray(t)||\"string\"==typeof t&&\"\"!==t?t:h(t)},t.setupMultiCategory=function(n){var i,o,s=t._traceIndices,l=t._matchGroup;if(l&&0===t._categories.length)for(var c in l)if(c!==r){var u=e[w.id2name(c)];s=s.concat(u._traceIndices)}var h=[[0,{}],[0,{}]],d=[];for(i=0;il[1]&&(i[s?0:1]=n),i[0]===i[1]){var c=t.l2r(r),u=t.l2r(n);if(void 0!==r){var h=c+1;void 0!==n&&(h=Math.min(h,u)),i[s?1:0]=h}if(void 0!==n){var f=u+1;void 0!==r&&(f=Math.max(f,c)),i[s?0:1]=f}}}},t.cleanRange=function(e,r){t._cleanRange(e,r),t.limitRange(e)},t._cleanRange=function(e,r){r||(r={}),e||(e=\"range\");var n,i,o=a.nestedProperty(t,e).get();if(i=(i=\"date\"===t.type?a.dfltRange(t.calendar):\"y\"===p?T.DFLTRANGEY:\"realaxis\"===t._name?[0,1]:r.dfltRange||T.DFLTRANGEX).slice(),\"tozero\"!==t.rangemode&&\"nonnegative\"!==t.rangemode||(i[0]=0),o&&2===o.length){var l=null===o[0],c=null===o[1];for(\"date\"!==t.type||t.autorange||(o[0]=a.cleanDate(o[0],m,t.calendar),o[1]=a.cleanDate(o[1],m,t.calendar)),n=0;n<2;n++)if(\"date\"===t.type){if(!a.isDateTime(o[n],t.calendar)){t[e]=i;break}if(t.r2l(o[0])===t.r2l(o[1])){var u=a.constrain(t.r2l(o[0]),a.MIN_MS+1e3,a.MAX_MS-1e3);o[0]=t.l2r(u-1e3),o[1]=t.l2r(u+1e3);break}}else{if(!s(o[n])){if(l||c||!s(o[1-n])){t[e]=i;break}o[n]=o[1-n]*(n?10:.1)}if(o[n]<-d?o[n]=-d:o[n]>d&&(o[n]=d),o[0]===o[1]){var h=Math.max(1,Math.abs(1e-6*o[0]));o[0]-=h,o[1]+=h}}}else a.nestedProperty(t,e).set(i)},t.setScale=function(r){var n=e._size;if(t.overlaying){var i=w.getFromId({_fullLayout:e},t.overlaying);t.domain=i.domain}var a=r&&t._r?\"_r\":\"range\",o=t.calendar;t.cleanRange(a);var s,l,c=t.r2l(t[a][0],o),u=t.r2l(t[a][1],o),h=\"y\"===p;if(h?(t._offset=n.t+(1-t.domain[1])*n.h,t._length=n.h*(t.domain[1]-t.domain[0]),t._m=t._length/(c-u),t._b=-t._m*u):(t._offset=n.l+t.domain[0]*n.w,t._length=n.w*(t.domain[1]-t.domain[0]),t._m=t._length/(u-c),t._b=-t._m*c),t._rangebreaks=[],t._lBreaks=0,t._m2=0,t._B=[],t.rangebreaks&&(t._rangebreaks=t.locateBreaks(Math.min(c,u),Math.max(c,u)),t._rangebreaks.length)){for(s=0;su&&(f=!f),f&&t._rangebreaks.reverse();var d=f?-1:1;for(t._m2=d*t._length/(Math.abs(u-c)-t._lBreaks),t._B.push(-t._m2*(h?u:c)),s=0;si&&(i+=7,oi&&(i+=24,o=n&&o=n&&e=s.min&&(ts.max&&(s.max=n),i=!1)}i&&c.push({min:t,max:n})}};for(n=0;nr.duration?(function(){for(var r={},n=0;n rect\").call(o.setTranslate,0,0).call(o.setScale,1,1),t.plot.call(o.setTranslate,e._offset,r._offset).call(o.setScale,1,1);var n=t.plot.selectAll(\".scatterlayer .trace\");n.selectAll(\".point\").call(o.setPointGroupScale,1,1),n.selectAll(\".textpoint\").call(o.setTextPointsScale,1,1),n.call(o.hideOutsideRangePoints,t)}function g(e,r){var n=e.plotinfo,i=n.xaxis,l=n.yaxis,c=i._length,u=l._length,h=!!e.xr1,f=!!e.yr1,p=[];if(h){var d=a.simpleMap(e.xr0,i.r2l),m=a.simpleMap(e.xr1,i.r2l),g=d[1]-d[0],y=m[1]-m[0];p[0]=(d[0]*(1-r)+r*m[0]-d[0])/(d[1]-d[0])*c,p[2]=c*(1-r+r*y/g),i.range[0]=i.l2r(d[0]*(1-r)+r*m[0]),i.range[1]=i.l2r(d[1]*(1-r)+r*m[1])}else p[0]=0,p[2]=c;if(f){var v=a.simpleMap(e.yr0,l.r2l),x=a.simpleMap(e.yr1,l.r2l),_=v[1]-v[0],b=x[1]-x[0];p[1]=(v[1]*(1-r)+r*x[1]-v[1])/(v[0]-v[1])*u,p[3]=u*(1-r+r*b/_),l.range[0]=i.l2r(v[0]*(1-r)+r*x[0]),l.range[1]=l.l2r(v[1]*(1-r)+r*x[1])}else p[1]=0,p[3]=u;s.drawOne(t,i,{skipTitle:!0}),s.drawOne(t,l,{skipTitle:!0}),s.redrawComponents(t,[i._id,l._id]);var w=h?c/p[2]:1,T=f?u/p[3]:1,k=h?p[0]:0,A=f?p[1]:0,M=h?p[0]/p[2]*c:0,S=f?p[1]/p[3]*u:0,E=i._offset-M,C=l._offset-S;n.clipRect.call(o.setTranslate,k,A).call(o.setScale,1/w,1/T),n.plot.call(o.setTranslate,E,C).call(o.setScale,w,T),o.setPointGroupScale(n.zoomScalePts,1/w,1/T),o.setTextPointsScale(n.zoomScaleTxt,1/w,1/T)}s.redrawComponents(t)}},4392:function(t,e,r){\"use strict\";var n=r(33626).traceIs,i=r(9666);function a(t){return{v:\"x\",h:\"y\"}[t.orientation||\"v\"]}function o(t,e){var r=a(t),i=n(t,\"box-violin\"),o=n(t._fullInput||{},\"candlestick\");return i&&!o&&e===r&&void 0===t[r]&&void 0===t[r+\"0\"]}t.exports=function(t,e,r,s){r(\"autotypenumbers\",s.autotypenumbersDflt),\"-\"===r(\"type\",(s.splomStash||{}).type)&&(function(t,e){if(\"-\"===t.type){var r,s=t._id,l=s.charAt(0);-1!==s.indexOf(\"scene\")&&(s=l);var c=function(t,e,r){for(var n=0;n0&&(i[\"_\"+r+\"axes\"]||{})[e])return i;if((i[r+\"axis\"]||r)===e){if(o(i,r))return i;if((i[r]||[]).length||i[r+\"0\"])return i}}}(e,s,l);if(c)if(\"histogram\"!==c.type||l!=={v:\"y\",h:\"x\"}[c.orientation||\"v\"]){var u=l+\"calendar\",h=c[u],f={noMultiCategory:!n(c,\"cartesian\")||n(c,\"noMultiCategory\")};if(\"box\"===c.type&&c._hasPreCompStats&&l==={h:\"x\",v:\"y\"}[c.orientation||\"v\"]&&(f.noMultiCategory=!0),f.autotypenumbers=t.autotypenumbers,o(c,l)){var p=a(c),d=[];for(r=0;r0?\".\":\"\")+a;i.isPlainObject(o)?l(o,e,s,n+1):e(s,a,o)}}))}e.manageCommandObserver=function(t,r,n,o){var s={},l=!0;r&&r._commandObserver&&(s=r._commandObserver),s.cache||(s.cache={}),s.lookupTable={};var c=e.hasSimpleAPICommandBindings(t,n,s.lookupTable);if(r&&r._commandObserver){if(c)return s;if(r._commandObserver.remove)return r._commandObserver.remove(),r._commandObserver=null,s}if(c){a(t,c,s.cache),s.check=function(){if(l){var e=a(t,c,s.cache);return e.changed&&o&&void 0!==s.lookupTable[e.value]&&(s.disable(),Promise.resolve(o({value:e.value,type:c.type,prop:c.prop,traces:c.traces,index:s.lookupTable[e.value]})).then(s.enable,s.enable)),e.changed}};for(var u=[\"plotly_relayout\",\"plotly_redraw\",\"plotly_restyle\",\"plotly_update\",\"plotly_animatingframe\",\"plotly_afterplot\"],h=0;h0&&i<0&&(i+=360);var s=(i-n)/4;return{type:\"Polygon\",coordinates:[[[n,a],[n,o],[n+s,o],[n+2*s,o],[n+3*s,o],[i,o],[i,a],[i-s,a],[i-2*s,a],[i-3*s,a],[n,a]]]}}t.exports=function(t){return new M(t)},S.plot=function(t,e,r,n){var i=this;if(n)return i.update(t,e,!0);i._geoCalcData=t,i._fullLayout=e;var a=e[this.id],o=[],s=!1;for(var l in w.layerNameToAdjective)if(\"frame\"!==l&&a[\"show\"+l]){s=!0;break}for(var c=!1,u=0;u0&&o._module.calcGeoJSON(a,e)}if(!r){if(this.updateProjection(t,e))return;this.viewInitial&&this.scope===n.scope||this.saveViewInitial(n)}this.scope=n.scope,this.updateBaseLayers(e,n),this.updateDims(e,n),this.updateFx(e,n),d.generalUpdatePerTraceModule(this.graphDiv,this,t,n);var s=this.layers.frontplot.select(\".scatterlayer\");this.dataPoints.point=s.selectAll(\".point\"),this.dataPoints.text=s.selectAll(\"text\"),this.dataPaths.line=s.selectAll(\".js-line\");var l=this.layers.backplot.select(\".choroplethlayer\");this.dataPaths.choropleth=l.selectAll(\"path\"),this._render()},S.updateProjection=function(t,e){var r=this.graphDiv,n=e[this.id],l=e._size,u=n.domain,h=n.projection,f=n.lonaxis,p=n.lataxis,d=f._ax,m=p._ax,y=this.projection=function(t){var e=t.projection,r=e.type,n=w.projNames[r];n=\"geo\"+c.titleCase(n);for(var l=(i[n]||s[n])(),u=t._isSatellite?180*Math.acos(1/e.distance)/Math.PI:t._isClipped?w.lonaxisSpan[r]/2:null,h=[\"center\",\"rotate\",\"parallels\",\"clipExtent\"],f=function(t){return t?l:[]},p=0;pu*Math.PI/180}return!1},l.getPath=function(){return a().projection(l)},l.getBounds=function(t){return l.getPath().bounds(t)},l.precision(w.precision),t._isSatellite&&l.tilt(e.tilt).distance(e.distance),u&&l.clipAngle(u-w.clipPad),l}(n),v=[[l.l+l.w*u.x[0],l.t+l.h*(1-u.y[1])],[l.l+l.w*u.x[1],l.t+l.h*(1-u.y[0])]],x=n.center||{},_=h.rotation||{},b=f.range||[],T=p.range||[];if(n.fitbounds){d._length=v[1][0]-v[0][0],m._length=v[1][1]-v[0][1],d.range=g(r,d),m.range=g(r,m);var k=(d.range[0]+d.range[1])/2,A=(m.range[0]+m.range[1])/2;if(n._isScoped)x={lon:k,lat:A};else if(n._isClipped){x={lon:k,lat:A},_={lon:k,lat:A,roll:_.roll};var M=h.type,S=w.lonaxisSpan[M]/2||180,C=w.lataxisSpan[M]/2||90;b=[k-S,k+S],T=[A-C,A+C]}else x={lon:k,lat:A},_={lon:k,lat:_.lat,roll:_.roll}}y.center([x.lon-_.lon,x.lat-_.lat]).rotate([-_.lon,-_.lat,_.roll]).parallels(h.parallels);var L=E(b,T);y.fitExtent(v,L);var I=this.bounds=y.getBounds(L),P=this.fitScale=y.scale(),z=y.translate();if(n.fitbounds){var O=y.getBounds(E(d.range,m.range)),D=Math.min((I[1][0]-I[0][0])/(O[1][0]-O[0][0]),(I[1][1]-I[0][1])/(O[1][1]-O[0][1]));isFinite(D)?y.scale(D*P):c.warn(\"Something went wrong during\"+this.id+\"fitbounds computations.\")}else y.scale(h.scale*P);var R=this.midPt=[(I[0][0]+I[1][0])/2,(I[0][1]+I[1][1])/2];if(y.translate([z[0]+(R[0]-z[0]),z[1]+(R[1]-z[1])]).clipExtent(I),n._isAlbersUsa){var F=y([x.lon,x.lat]),B=y.translate();y.translate([B[0]-(F[0]-B[0]),B[1]-(F[1]-B[1])])}},S.updateBaseLayers=function(t,e){var r=this,i=r.topojson,a=r.layers,o=r.basePaths;function s(t){return\"lonaxis\"===t||\"lataxis\"===t}function l(t){return Boolean(w.lineLayers[t])}function c(t){return Boolean(w.fillLayers[t])}var u=(this.hasChoropleth?w.layersForChoropleth:w.layers).filter((function(t){return l(t)||c(t)?e[\"show\"+t]:!s(t)||e[t].showgrid})),p=r.framework.selectAll(\".layer\").data(u,String);p.exit().each((function(t){delete a[t],delete o[t],n.select(this).remove()})),p.enter().append(\"g\").attr(\"class\",(function(t){return\"layer \"+t})).each((function(t){var e=a[t]=n.select(this);\"bg\"===t?r.bgRect=e.append(\"rect\").style(\"pointer-events\",\"all\"):s(t)?o[t]=e.append(\"path\").style(\"fill\",\"none\"):\"backplot\"===t?e.append(\"g\").classed(\"choroplethlayer\",!0):\"frontplot\"===t?e.append(\"g\").classed(\"scatterlayer\",!0):l(t)?o[t]=e.append(\"path\").style(\"fill\",\"none\").style(\"stroke-miterlimit\",2):c(t)&&(o[t]=e.append(\"path\").style(\"stroke\",\"none\"))})),p.order(),p.each((function(r){var n=o[r],a=w.layerNameToAdjective[r];\"frame\"===r?n.datum(w.sphereSVG):l(r)||c(r)?n.datum(A(i,i.objects[r])):s(r)&&n.datum(function(t,e,r){var n,i,a,o=e[t],s=w.scopeDefaults[e.scope];\"lonaxis\"===t?(n=s.lonaxisRange,i=s.lataxisRange,a=function(t,e){return[t,e]}):\"lataxis\"===t&&(n=s.lataxisRange,i=s.lonaxisRange,a=function(t,e){return[e,t]});var l={type:\"linear\",range:[n[0],n[1]-1e-6],tick0:o.tick0,dtick:o.dtick};m.setConvert(l,r);var c=m.calcTicks(l);e.isScoped||\"lonaxis\"!==t||c.pop();for(var u=c.length,h=new Array(u),f=0;f-1&&_(n.event,i,[r.xaxis],[r.yaxis],r.id,u),s.indexOf(\"event\")>-1&&p.click(i,n.event))}))}function h(t){return r.projection.invert([t[0]+r.xaxis._offset,t[1]+r.yaxis._offset])}},S.makeFramework=function(){var t=this,e=t.graphDiv,r=e._fullLayout,i=\"clip\"+r._uid+t.id;t.clipDef=r._clips.append(\"clipPath\").attr(\"id\",i),t.clipRect=t.clipDef.append(\"rect\"),t.framework=n.select(t.container).append(\"g\").attr(\"class\",\"geo \"+t.id).call(f.setClipUrl,i,e),t.project=function(e){var r=t.projection(e);return r?[r[0]-t.xaxis._offset,r[1]-t.yaxis._offset]:[null,null]},t.xaxis={_id:\"x\",c2p:function(e){return t.project(e)[0]}},t.yaxis={_id:\"y\",c2p:function(e){return t.project(e)[1]}},t.mockAxis={type:\"linear\",showexponent:\"all\",exponentformat:\"B\"},m.setConvert(t.mockAxis,r)},S.saveViewInitial=function(t){var e,r=t.center||{},n=t.projection,i=n.rotation||{};this.viewInitial={fitbounds:t.fitbounds,\"projection.scale\":n.scale},e=t._isScoped?{\"center.lon\":r.lon,\"center.lat\":r.lat}:t._isClipped?{\"projection.rotation.lon\":i.lon,\"projection.rotation.lat\":i.lat}:{\"center.lon\":r.lon,\"center.lat\":r.lat,\"projection.rotation.lon\":i.lon},c.extendFlat(this.viewInitial,e)},S.render=function(t){this._hasMarkerAngles&&t?this.plot(this._geoCalcData,this._fullLayout,[],!0):this._render()},S._render=function(){var t,e=this.projection,r=e.getPath();function n(t){var r=e(t.lonlat);return r?u(r[0],r[1]):null}function i(t){return e.isLonLatOverEdges(t.lonlat)?\"none\":null}for(t in this.basePaths)this.basePaths[t].attr(\"d\",r);for(t in this.dataPaths)this.dataPaths[t].attr(\"d\",(function(t){return r(t.geojson)}));for(t in this.dataPoints)this.dataPoints[t].attr(\"display\",i).attr(\"transform\",n)}},47544:function(t,e,r){\"use strict\";var n=r(4173).fX,i=r(34809).counterRegex,a=r(6493),o=\"geo\",s=i(o),l={};l[o]={valType:\"subplotid\",dflt:o,editType:\"calc\"},t.exports={attr:o,name:o,idRoot:o,idRegex:s,attrRegex:s,attributes:l,layoutAttributes:r(42194),supplyLayoutDefaults:r(31653),plot:function(t){for(var e=t._fullLayout,r=t.calcdata,i=e._subplots[o],s=0;s0&&I<0&&(I+=360);var P,z,O,D=(L+I)/2;if(!p){var R=d?h.projRotate:[D,0,0];P=r(\"projection.rotation.lon\",R[0]),r(\"projection.rotation.lat\",R[1]),r(\"projection.rotation.roll\",R[2]),r(\"showcoastlines\",!d&&x)&&(r(\"coastlinecolor\"),r(\"coastlinewidth\")),r(\"showocean\",!!x&&void 0)&&r(\"oceancolor\")}p?(z=-96.6,O=38.7):(z=d?D:P,O=(C[0]+C[1])/2),r(\"center.lon\",z),r(\"center.lat\",O),m&&(r(\"projection.tilt\"),r(\"projection.distance\")),g&&r(\"projection.parallels\",h.projParallels||[0,60]),r(\"projection.scale\"),r(\"showland\",!!x&&void 0)&&r(\"landcolor\"),r(\"showlakes\",!!x&&void 0)&&r(\"lakecolor\"),r(\"showrivers\",!!x&&void 0)&&(r(\"rivercolor\"),r(\"riverwidth\")),r(\"showcountries\",d&&\"usa\"!==u&&x)&&(r(\"countrycolor\"),r(\"countrywidth\")),(\"usa\"===u||\"north america\"===u&&50===c)&&(r(\"showsubunits\",x),r(\"subunitcolor\"),r(\"subunitwidth\")),d||r(\"showframe\",x)&&(r(\"framecolor\"),r(\"framewidth\")),r(\"bgcolor\"),r(\"fitbounds\")&&(delete e.projection.scale,d?(delete e.center.lon,delete e.center.lat):y?(delete e.center.lon,delete e.center.lat,delete e.projection.rotation.lon,delete e.projection.rotation.lat,delete e.lonaxis.range,delete e.lataxis.range):(delete e.center.lon,delete e.center.lat,delete e.projection.rotation.lon))}t.exports=function(t,e,r){i(t,e,r,{type:\"geo\",attributes:s,handleDefaults:c,fullData:r,partition:\"y\"})}},14309:function(t,e,r){\"use strict\";var n=r(45568),i=r(34809),a=r(33626),o=Math.PI/180,s=180/Math.PI,l={cursor:\"pointer\"},c={cursor:\"auto\"};function u(t,e){return n.behavior.zoom().translate(e.translate()).scale(e.scale())}function h(t,e,r){var n=t.id,o=t.graphDiv,s=o.layout,l=s[n],c=o._fullLayout,u=c[n],h={},f={};function p(t,e){h[n+\".\"+t]=i.nestedProperty(l,t).get(),a.call(\"_storeDirectGUIEdit\",s,c._preGUI,h);var r=i.nestedProperty(u,t);r.get()!==e&&(r.set(e),i.nestedProperty(l,t).set(e),f[n+\".\"+t]=e)}r(p),p(\"projection.scale\",e.scale()/t.fitScale),p(\"fitbounds\",!1),o.emit(\"plotly_relayout\",f)}function f(t,e){var r=u(0,e);function i(r){var n=e.invert(t.midPt);r(\"center.lon\",n[0]),r(\"center.lat\",n[1])}return r.on(\"zoomstart\",(function(){n.select(this).style(l)})).on(\"zoom\",(function(){e.scale(n.event.scale).translate(n.event.translate),t.render(!0);var r=e.invert(t.midPt);t.graphDiv.emit(\"plotly_relayouting\",{\"geo.projection.scale\":e.scale()/t.fitScale,\"geo.center.lon\":r[0],\"geo.center.lat\":r[1]})})).on(\"zoomend\",(function(){n.select(this).style(c),h(t,e,i)})),r}function p(t,e){var r,i,a,o,s,f,p,d,m,g=u(0,e);function y(t){return e.invert(t)}function v(r){var n=e.rotate(),i=e.invert(t.midPt);r(\"projection.rotation.lon\",-n[0]),r(\"center.lon\",i[0]),r(\"center.lat\",i[1])}return g.on(\"zoomstart\",(function(){n.select(this).style(l),r=n.mouse(this),i=e.rotate(),a=e.translate(),o=i,s=y(r)})).on(\"zoom\",(function(){if(f=n.mouse(this),function(t){var r=y(t);if(!r)return!0;var n=e(r);return Math.abs(n[0]-t[0])>2||Math.abs(n[1]-t[1])>2}(r))return g.scale(e.scale()),void g.translate(e.translate());e.scale(n.event.scale),e.translate([a[0],n.event.translate[1]]),s?y(f)&&(d=y(f),p=[o[0]+(d[0]-s[0]),i[1],i[2]],e.rotate(p),o=p):s=y(r=f),m=!0,t.render(!0);var l=e.rotate(),c=e.invert(t.midPt);t.graphDiv.emit(\"plotly_relayouting\",{\"geo.projection.scale\":e.scale()/t.fitScale,\"geo.center.lon\":c[0],\"geo.center.lat\":c[1],\"geo.projection.rotation.lon\":-l[0]})})).on(\"zoomend\",(function(){n.select(this).style(c),m&&h(t,e,v)})),g}function d(t,e){var r,i={r:e.rotate(),k:e.scale()},a=u(0,e),f=function(t){for(var e=0,r=arguments.length,i=[];++ed?(a=(h>0?90:-90)-p,i=0):(a=Math.asin(h/d)*s-p,i=Math.sqrt(d*d-h*h));var m=180-a-2*p,y=(Math.atan2(f,u)-Math.atan2(c,i))*s,x=(Math.atan2(f,u)-Math.atan2(c,-i))*s;return g(r[0],r[1],a,y)<=g(r[0],r[1],m,x)?[a,y,r[2]]:[m,x,r[2]]}(T,r,E);isFinite(k[0])&&isFinite(k[1])&&isFinite(k[2])||(k=E),e.rotate(k),E=k}}else r=m(e,M=_);f.of(this,arguments)({type:\"zoom\"})})),A=f.of(this,arguments),p++||A({type:\"zoomstart\"})})).on(\"zoomend\",(function(){var r;n.select(this).style(c),d.call(a,\"zoom\",null),r=f.of(this,arguments),--p||r({type:\"zoomend\"}),h(t,e,y)})).on(\"zoom.redraw\",(function(){t.render(!0);var r=e.rotate();t.graphDiv.emit(\"plotly_relayouting\",{\"geo.projection.scale\":e.scale()/t.fitScale,\"geo.projection.rotation.lon\":-r[0],\"geo.projection.rotation.lat\":-r[1]})})),n.rebind(a,f,\"on\")}function m(t,e){var r=t.invert(e);return r&&isFinite(r[0])&&isFinite(r[1])&&function(t){var e=t[0]*o,r=t[1]*o,n=Math.cos(r);return[n*Math.cos(e),n*Math.sin(e),Math.sin(r)]}(r)}function g(t,e,r,n){var i=y(r-t),a=y(n-e);return Math.sqrt(i*i+a*a)}function y(t){return(t%360+540)%360-180}function v(t,e,r){var n=r*o,i=t.slice(),a=0===e?1:0,s=2===e?1:2,l=Math.cos(n),c=Math.sin(n);return i[a]=t[a]*l-t[s]*c,i[s]=t[s]*l+t[a]*c,i}function x(t,e){for(var r=0,n=0,i=t.length;nMath.abs(s)?(c.boxEnd[1]=c.boxStart[1]+Math.abs(a)*b*(s>=0?1:-1),c.boxEnd[1]l[3]&&(c.boxEnd[1]=l[3],c.boxEnd[0]=c.boxStart[0]+(l[3]-c.boxStart[1])/Math.abs(b))):(c.boxEnd[0]=c.boxStart[0]+Math.abs(s)/b*(a>=0?1:-1),c.boxEnd[0]l[2]&&(c.boxEnd[0]=l[2],c.boxEnd[1]=c.boxStart[1]+(l[2]-c.boxStart[0])*Math.abs(b)))}}else c.boxEnabled?(a=c.boxStart[0]!==c.boxEnd[0],s=c.boxStart[1]!==c.boxEnd[1],a||s?(a&&(g(0,c.boxStart[0],c.boxEnd[0]),t.xaxis.autorange=!1),s&&(g(1,c.boxStart[1],c.boxEnd[1]),t.yaxis.autorange=!1),t.relayoutCallback()):t.glplot.setDirty(),c.boxEnabled=!1,c.boxInited=!1):c.boxInited&&(c.boxInited=!1);break;case\"pan\":c.boxEnabled=!1,c.boxInited=!1,e?(c.panning||(c.dragStart[0]=n,c.dragStart[1]=i),Math.abs(c.dragStart[0]-n).999&&(g=\"turntable\"):g=\"turntable\")}else g=\"turntable\";r(\"dragmode\",g),r(\"hovermode\",n.getDfltFromLayout(\"hovermode\"))}t.exports=function(t,e,r){var i=e._basePlotModules.length>1;o(t,e,r,{type:u,attributes:l,handleDefaults:h,fullLayout:e,font:e.font,fullData:r,getDfltFromLayout:function(e){if(!i)return n.validate(t[e],l[e])?t[e]:void 0},autotypenumbersDflt:e.autotypenumbers,paper_bgcolor:e.paper_bgcolor,calendar:e.calendar})}},77168:function(t,e,r){\"use strict\";var n=r(63397),i=r(13792).u,a=r(93049).extendFlat,o=r(34809).counterRegex;function s(t,e,r){return{x:{valType:\"number\",dflt:t,editType:\"camera\"},y:{valType:\"number\",dflt:e,editType:\"camera\"},z:{valType:\"number\",dflt:r,editType:\"camera\"},editType:\"camera\"}}t.exports={_arrayAttrRegexps:[o(\"scene\",\".annotations\",!0)],bgcolor:{valType:\"color\",dflt:\"rgba(0,0,0,0)\",editType:\"plot\"},camera:{up:a(s(0,0,1),{}),center:a(s(0,0,0),{}),eye:a(s(1.25,1.25,1.25),{}),projection:{type:{valType:\"enumerated\",values:[\"perspective\",\"orthographic\"],dflt:\"perspective\",editType:\"calc\"},editType:\"calc\"},editType:\"camera\"},domain:i({name:\"scene\",editType:\"plot\"}),aspectmode:{valType:\"enumerated\",values:[\"auto\",\"cube\",\"data\",\"manual\"],dflt:\"auto\",editType:\"plot\",impliedEdits:{\"aspectratio.x\":void 0,\"aspectratio.y\":void 0,\"aspectratio.z\":void 0}},aspectratio:{x:{valType:\"number\",min:0,editType:\"plot\",impliedEdits:{\"^aspectmode\":\"manual\"}},y:{valType:\"number\",min:0,editType:\"plot\",impliedEdits:{\"^aspectmode\":\"manual\"}},z:{valType:\"number\",min:0,editType:\"plot\",impliedEdits:{\"^aspectmode\":\"manual\"}},editType:\"plot\",impliedEdits:{aspectmode:\"manual\"}},xaxis:n,yaxis:n,zaxis:n,dragmode:{valType:\"enumerated\",values:[\"orbit\",\"turntable\",\"zoom\",\"pan\",!1],editType:\"plot\"},hovermode:{valType:\"enumerated\",values:[\"closest\",!1],dflt:\"closest\",editType:\"modebar\"},uirevision:{valType:\"any\",editType:\"none\"},editType:\"plot\",_deprecated:{cameraposition:{valType:\"info_array\",editType:\"camera\"}}}},64087:function(t,e,r){\"use strict\";var n=r(55010),i=[\"xaxis\",\"yaxis\",\"zaxis\"];function a(){this.enabled=[!0,!0,!0],this.colors=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.drawSides=[!0,!0,!0],this.lineWidth=[1,1,1]}a.prototype.merge=function(t){for(var e=0;e<3;++e){var r=t[i[e]];r.visible?(this.enabled[e]=r.showspikes,this.colors[e]=n(r.spikecolor),this.drawSides[e]=r.spikesides,this.lineWidth[e]=r.spikethickness):(this.enabled[e]=!1,this.drawSides[e]=!1)}},t.exports=function(t){var e=new a;return e.merge(t),e}},32412:function(t,e,r){\"use strict\";t.exports=function(t){for(var e=t.axesOptions,r=t.glplot.axesPixels,s=t.fullSceneLayout,l=[[],[],[]],c=0;c<3;++c){var u=s[a[c]];if(u._length=(r[c].hi-r[c].lo)*r[c].pixelsPerDataUnit/t.dataScale[c],Math.abs(u._length)===1/0||isNaN(u._length))l[c]=[];else{u._input_range=u.range.slice(),u.range[0]=r[c].lo/t.dataScale[c],u.range[1]=r[c].hi/t.dataScale[c],u._m=1/(t.dataScale[c]*r[c].pixelsPerDataUnit),u.range[0]===u.range[1]&&(u.range[0]-=1,u.range[1]+=1);var h=u.tickmode;if(\"auto\"===u.tickmode){u.tickmode=\"linear\";var f=u.nticks||i.constrain(u._length/40,4,9);n.autoTicks(u,Math.abs(u.range[1]-u.range[0])/f)}for(var p=n.calcTicks(u,{msUTC:!0}),d=0;d/g,\" \"));l[c]=p,u.tickmode=h}}for(e.ticks=l,c=0;c<3;++c)for(o[c]=.5*(t.glplot.bounds[0][c]+t.glplot.bounds[1][c]),d=0;d<2;++d)e.bounds[d][c]=t.glplot.bounds[d][c];t.contourLevels=function(t){for(var e=new Array(3),r=0;r<3;++r){for(var n=t[r],i=new Array(n.length),a=0;ar.deltaY?1.1:1/1.1,a=t.glplot.getAspectratio();t.glplot.setAspectratio({x:n*a.x,y:n*a.y,z:n*a.z})}i(t)}}),!!c&&{passive:!1}),t.glplot.canvas.addEventListener(\"mousemove\",(function(){if(!1!==t.fullSceneLayout.dragmode&&0!==t.camera.mouseListener.buttons){var e=n();t.graphDiv.emit(\"plotly_relayouting\",e)}})),t.staticMode||t.glplot.canvas.addEventListener(\"webglcontextlost\",(function(r){e&&e.emit&&e.emit(\"plotly_webglcontextlost\",{event:r,layer:t.id})}),!1)),t.glplot.oncontextloss=function(){t.recoverContext()},t.glplot.onrender=function(){t.render()},!0},k.render=function(){var t,e=this,r=e.graphDiv,n=e.svgContainer,i=e.container.getBoundingClientRect();r._fullLayout._calcInverseTransform(r);var a=r._fullLayout._invScaleX,o=r._fullLayout._invScaleY,s=i.width*a,l=i.height*o;n.setAttributeNS(null,\"viewBox\",\"0 0 \"+s+\" \"+l),n.setAttributeNS(null,\"width\",s),n.setAttributeNS(null,\"height\",l),_(e),e.glplot.axes.update(e.axesOptions);for(var c=Object.keys(e.traces),u=null,f=e.glplot.selection,m=0;m\")):\"isosurface\"===t.type||\"volume\"===t.type?(k.valueLabel=p.hoverLabelText(e._mockAxis,e._mockAxis.d2l(f.traceCoordinate[3]),t.valuehoverformat),E.push(\"value: \"+k.valueLabel),f.textLabel&&E.push(f.textLabel),x=E.join(\"
\")):x=f.textLabel;var C={x:f.traceCoordinate[0],y:f.traceCoordinate[1],z:f.traceCoordinate[2],data:b._input,fullData:b,curveNumber:b.index,pointNumber:T};d.appendArrayPointValue(C,b,T),t._module.eventData&&(C=b._module.eventData(C,f,b,{},T));var L={points:[C]};if(e.fullSceneLayout.hovermode){var I=[];d.loneHover({trace:b,x:(.5+.5*v[0]/v[3])*s,y:(.5-.5*v[1]/v[3])*l,xLabel:k.xLabel,yLabel:k.yLabel,zLabel:k.zLabel,text:x,name:u.name,color:d.castHoverOption(b,T,\"bgcolor\")||u.color,borderColor:d.castHoverOption(b,T,\"bordercolor\"),fontFamily:d.castHoverOption(b,T,\"font.family\"),fontSize:d.castHoverOption(b,T,\"font.size\"),fontColor:d.castHoverOption(b,T,\"font.color\"),nameLength:d.castHoverOption(b,T,\"namelength\"),textAlign:d.castHoverOption(b,T,\"align\"),hovertemplate:h.castOption(b,T,\"hovertemplate\"),hovertemplateLabels:h.extendFlat({},C,k),eventData:[C]},{container:n,gd:r,inOut_bbox:I}),C.bbox=I[0]}f.distance<5&&(f.buttons||w)?r.emit(\"plotly_click\",L):r.emit(\"plotly_hover\",L),this.oldEventData=L}else d.loneUnhover(n),this.oldEventData&&r.emit(\"plotly_unhover\",this.oldEventData),this.oldEventData=void 0;e.drawAnnotations(e)},k.recoverContext=function(){var t=this;t.glplot.dispose();var e=function(){t.glplot.gl.isContextLost()?requestAnimationFrame(e):t.initializeGLPlot()?t.plot.apply(t,t.plotArgs):h.error(\"Catastrophic and unrecoverable WebGL error. Context lost.\")};requestAnimationFrame(e)};var M=[\"xaxis\",\"yaxis\",\"zaxis\"];function S(t,e,r){for(var n=t.fullSceneLayout,i=0;i<3;i++){var a=M[i],o=a.charAt(0),s=n[a],l=e[o],c=e[o+\"calendar\"],u=e[\"_\"+o+\"length\"];if(h.isArrayOrTypedArray(l))for(var f,p=0;p<(u||l.length);p++)if(h.isArrayOrTypedArray(l[p]))for(var d=0;dy[1][o])y[0][o]=-1,y[1][o]=1;else{var P=y[1][o]-y[0][o];y[0][o]-=P/32,y[1][o]+=P/32}if(_=[y[0][o],y[1][o]],_=b(_,l),y[0][o]=_[0],y[1][o]=_[1],l.isReversed()){var z=y[0][o];y[0][o]=y[1][o],y[1][o]=z}}else _=l.range,y[0][o]=l.r2l(_[0]),y[1][o]=l.r2l(_[1]);y[0][o]===y[1][o]&&(y[0][o]-=1,y[1][o]+=1),v[o]=y[1][o]-y[0][o],l.range=[y[0][o],y[1][o]],l.limitRange(),n.glplot.setBounds(o,{min:l.range[0]*p[o],max:l.range[1]*p[o]})}var O=u.aspectmode;if(\"cube\"===O)g=[1,1,1];else if(\"manual\"===O){var D=u.aspectratio;g=[D.x,D.y,D.z]}else{if(\"auto\"!==O&&\"data\"!==O)throw new Error(\"scene.js aspectRatio was not one of the enumerated types\");var R=[1,1,1];for(o=0;o<3;++o){var F=x[c=(l=u[M[o]]).type];R[o]=Math.pow(F.acc,1/F.count)/p[o]}g=\"data\"===O||Math.max.apply(null,R)/Math.min.apply(null,R)<=4?R:[1,1,1]}u.aspectratio.x=h.aspectratio.x=g[0],u.aspectratio.y=h.aspectratio.y=g[1],u.aspectratio.z=h.aspectratio.z=g[2],n.glplot.setAspectratio(u.aspectratio),n.viewInitial.aspectratio||(n.viewInitial.aspectratio={x:u.aspectratio.x,y:u.aspectratio.y,z:u.aspectratio.z}),n.viewInitial.aspectmode||(n.viewInitial.aspectmode=u.aspectmode);var B=u.domain||null,N=e._size||null;if(B&&N){var j=n.container.style;j.position=\"absolute\",j.left=N.l+B.x[0]*N.w+\"px\",j.top=N.t+(1-B.y[1])*N.h+\"px\",j.width=N.w*(B.x[1]-B.x[0])+\"px\",j.height=N.h*(B.y[1]-B.y[0])+\"px\"}n.glplot.redraw()}},k.destroy=function(){var t=this;t.glplot&&(t.camera.mouseListener.enabled=!1,t.container.removeEventListener(\"wheel\",t.camera.wheelListener),t.camera=null,t.glplot.dispose(),t.container.parentNode.removeChild(t.container),t.glplot=null)},k.getCamera=function(){var t,e=this;return e.camera.view.recalcMatrix(e.camera.view.lastT()),{up:{x:(t=e.camera).up[0],y:t.up[1],z:t.up[2]},center:{x:t.center[0],y:t.center[1],z:t.center[2]},eye:{x:t.eye[0],y:t.eye[1],z:t.eye[2]},projection:{type:!0===t._ortho?\"orthographic\":\"perspective\"}}},k.setViewport=function(t){var e,r=this,n=t.camera;r.camera.lookAt.apply(this,[[(e=n).eye.x,e.eye.y,e.eye.z],[e.center.x,e.center.y,e.center.z],[e.up.x,e.up.y,e.up.z]]),r.glplot.setAspectratio(t.aspectratio),\"orthographic\"===n.projection.type!==r.camera._ortho&&(r.glplot.redraw(),r.glplot.clearRGBA(),r.glplot.dispose(),r.initializeGLPlot())},k.isCameraChanged=function(t){var e=this.getCamera(),r=h.nestedProperty(t,this.id+\".camera\").get();function n(t,e,r,n){var i=[\"up\",\"center\",\"eye\"],a=[\"x\",\"y\",\"z\"];return e[i[r]]&&t[i[r]][a[n]]===e[i[r]][a[n]]}var i=!1;if(void 0===r)i=!0;else{for(var a=0;a<3;a++)for(var o=0;o<3;o++)if(!n(e,r,a,o)){i=!0;break}(!r.projection||e.projection&&e.projection.type!==r.projection.type)&&(i=!0)}return i},k.isAspectChanged=function(t){var e=this.glplot.getAspectratio(),r=h.nestedProperty(t,this.id+\".aspectratio\").get();return void 0===r||r.x!==e.x||r.y!==e.y||r.z!==e.z},k.saveLayout=function(t){var e,r,n,i,a,o,s=this,l=s.fullLayout,c=s.isCameraChanged(t),f=s.isAspectChanged(t),p=c||f;if(p){var d={};c&&(e=s.getCamera(),n=(r=h.nestedProperty(t,s.id+\".camera\")).get(),d[s.id+\".camera\"]=n),f&&(i=s.glplot.getAspectratio(),o=(a=h.nestedProperty(t,s.id+\".aspectratio\")).get(),d[s.id+\".aspectratio\"]=o),u.call(\"_storeDirectGUIEdit\",t,l._preGUI,d),c&&(r.set(e),h.nestedProperty(l,s.id+\".camera\").set(e)),f&&(a.set(i),h.nestedProperty(l,s.id+\".aspectratio\").set(i),s.glplot.redraw())}return p},k.updateFx=function(t,e){var r=this,n=r.camera;if(n)if(\"orbit\"===t)n.mode=\"orbit\",n.keyBindingMode=\"rotate\";else if(\"turntable\"===t){n.up=[0,0,1],n.mode=\"turntable\",n.keyBindingMode=\"rotate\";var i=r.graphDiv,a=i._fullLayout,o=r.fullSceneLayout.camera,s=o.up.x,l=o.up.y,c=o.up.z;if(c/Math.sqrt(s*s+l*l+c*c)<.999){var f=r.id+\".camera.up\",p={x:0,y:0,z:1},d={};d[f]=p;var m=i.layout;u.call(\"_storeDirectGUIEdit\",m,a._preGUI,d),o.up=p,h.nestedProperty(m,f).set(p)}}else n.keyBindingMode=t;r.fullSceneLayout.hovermode=e},k.toImage=function(t){var e=this;t||(t=\"png\"),e.staticMode&&e.container.appendChild(n),e.glplot.redraw();var r=e.glplot.gl,i=r.drawingBufferWidth,a=r.drawingBufferHeight;r.bindFramebuffer(r.FRAMEBUFFER,null);var o=new Uint8Array(i*a*4);r.readPixels(0,0,i,a,r.RGBA,r.UNSIGNED_BYTE,o),function(t,e,r){for(var n=0,i=r-1;n0)for(var s=255/o,l=0;l<3;++l)t[a+l]=Math.min(s*t[a+l],255)}}(o,i,a);var s=document.createElement(\"canvas\");s.width=i,s.height=a;var l,c=s.getContext(\"2d\",{willReadFrequently:!0}),u=c.createImageData(i,a);switch(u.data.set(o),c.putImageData(u,0,0),t){case\"jpeg\":l=s.toDataURL(\"image/jpeg\");break;case\"webp\":l=s.toDataURL(\"image/webp\");break;default:l=s.toDataURL(\"image/png\")}return e.staticMode&&e.container.removeChild(n),l},k.setConvert=function(){for(var t=0;t<3;t++){var e=this.fullSceneLayout[M[t]];p.setConvert(e,this.fullLayout),e.setScale=h.noop}},k.make4thDimension=function(){var t=this,e=t.graphDiv._fullLayout;t._mockAxis={type:\"linear\",showexponent:\"all\",exponentformat:\"B\"},p.setConvert(t._mockAxis,e)},t.exports=T},88239:function(t){\"use strict\";t.exports=function(t,e,r,n){n=n||t.length;for(var i=new Array(n),a=0;aOpenStreetMap contributors',tiles:[\"https://tile.openstreetmap.org/{z}/{x}/{y}.png\"],tileSize:256}},layers:[{id:\"plotly-osm-tiles\",type:\"raster\",source:\"plotly-osm-tiles\",minzoom:0,maxzoom:22}],glyphs:\"https://fonts.openmaptiles.org/{fontstack}/{range}.pbf\"},\"white-bg\":{id:\"white-bg\",version:8,sources:{},layers:[{id:\"white-bg\",type:\"background\",paint:{\"background-color\":\"#FFFFFF\"},minzoom:0,maxzoom:22}],glyphs:\"https://fonts.openmaptiles.org/{fontstack}/{range}.pbf\"},\"carto-positron\":a,\"carto-darkmatter\":o,\"carto-voyager\":s,\"carto-positron-nolabels\":\"https://basemaps.cartocdn.com/gl/positron-nolabels-gl-style/style.json\",\"carto-darkmatter-nolabels\":\"https://basemaps.cartocdn.com/gl/dark-matter-nolabels-gl-style/style.json\",\"carto-voyager-nolabels\":\"https://basemaps.cartocdn.com/gl/voyager-nolabels-gl-style/style.json\"},c=n(l);t.exports={styleValueDflt:\"basic\",stylesMap:l,styleValuesMap:c,traceLayerPrefix:\"plotly-trace-layer-\",layoutLayerPrefix:\"plotly-layout-layer-\",missingStyleErrorMsg:[\"No valid maplibre style found, please set `map.style` to one of:\",c.join(\", \"),\"or use a tile service.\"].join(\"\\n\"),mapOnErrorMsg:\"Map error.\"}},4657:function(t,e,r){\"use strict\";var n=r(34809);t.exports=function(t,e){var r=t.split(\" \"),i=r[0],a=r[1],o=n.isArrayOrTypedArray(e)?n.mean(e):e,s=.5+o/100,l=1.5+o/100,c=[\"\",\"\"],u=[0,0];switch(i){case\"top\":c[0]=\"top\",u[1]=-l;break;case\"bottom\":c[0]=\"bottom\",u[1]=l}switch(a){case\"left\":c[1]=\"right\",u[0]=-s;break;case\"right\":c[1]=\"left\",u[0]=s}return{anchor:c[0]&&c[1]?c.join(\"-\"):c[0]?c[0]:c[1]?c[1]:\"center\",offset:u}}},34091:function(t,e,r){\"use strict\";var n=r(34809),i=n.strTranslate,a=n.strScale,o=r(4173).fX,s=r(62972),l=r(45568),c=r(62203),u=r(30635),h=r(38793),f=\"map\";e.name=f,e.attr=\"subplot\",e.idRoot=f,e.idRegex=e.attrRegex=n.counterRegex(f),e.attributes={subplot:{valType:\"subplotid\",dflt:\"map\",editType:\"calc\"}},e.layoutAttributes=r(8257),e.supplyLayoutDefaults=r(97446),e.plot=function(t){for(var e=t._fullLayout,r=t.calcdata,i=e._subplots[f],a=0;ax/2){var _=m.split(\"|\").join(\"
\");y.text(_).attr(\"data-unformatted\",_).call(u.convertToTspans,t),v=c.bBox(y.node())}y.attr(\"transform\",i(-3,8-v.height)),g.insert(\"rect\",\".static-attribution\").attr({x:-v.width-6,y:-v.height-3,width:v.width+6,height:v.height+3,fill:\"rgba(255, 255, 255, 0.75)\"});var b=1;v.width+6>x&&(b=x/(v.width+6));var w=[n.l+n.w*p.x[1],n.t+n.h*(1-p.y[0])];g.attr(\"transform\",i(w[0],w[1])+a(b))}},e.updateFx=function(t){for(var e=t._fullLayout,r=e._subplots[f],n=0;n0){for(var r=0;r0}function u(t){var e={},r={};switch(t.type){case\"circle\":n.extendFlat(r,{\"circle-radius\":t.circle.radius,\"circle-color\":t.color,\"circle-opacity\":t.opacity});break;case\"line\":n.extendFlat(r,{\"line-width\":t.line.width,\"line-color\":t.color,\"line-opacity\":t.opacity,\"line-dasharray\":t.line.dash});break;case\"fill\":n.extendFlat(r,{\"fill-color\":t.color,\"fill-outline-color\":t.fill.outlinecolor,\"fill-opacity\":t.opacity});break;case\"symbol\":var i=t.symbol,o=a(i.textposition,i.iconsize);n.extendFlat(e,{\"icon-image\":i.icon+\"-15\",\"icon-size\":i.iconsize/10,\"text-field\":i.text,\"text-size\":i.textfont.size,\"text-anchor\":o.anchor,\"text-offset\":o.offset,\"symbol-placement\":i.placement}),n.extendFlat(r,{\"icon-color\":t.color,\"text-color\":i.textfont.color,\"text-opacity\":t.opacity});break;case\"raster\":n.extendFlat(r,{\"raster-fade-duration\":0,\"raster-opacity\":t.opacity})}return{layout:e,paint:r}}l.update=function(t){this.visible?this.needsNewImage(t)?this.updateImage(t):this.needsNewSource(t)?(this.removeLayer(),this.updateSource(t),this.updateLayer(t)):this.needsNewLayer(t)?this.updateLayer(t):this.updateStyle(t):(this.updateSource(t),this.updateLayer(t)),this.visible=c(t)},l.needsNewImage=function(t){return this.subplot.map.getSource(this.idSource)&&\"image\"===this.sourceType&&\"image\"===t.sourcetype&&(this.source!==t.source||JSON.stringify(this.coordinates)!==JSON.stringify(t.coordinates))},l.needsNewSource=function(t){return this.sourceType!==t.sourcetype||JSON.stringify(this.source)!==JSON.stringify(t.source)||this.layerType!==t.type},l.needsNewLayer=function(t){return this.layerType!==t.type||this.below!==this.subplot.belowLookup[\"layout-\"+this.index]},l.lookupBelow=function(){return this.subplot.belowLookup[\"layout-\"+this.index]},l.updateImage=function(t){this.subplot.map.getSource(this.idSource).updateImage({url:t.source,coordinates:t.coordinates});var e=this.findFollowingMapLayerId(this.lookupBelow());null!==e&&this.subplot.map.moveLayer(this.idLayer,e)},l.updateSource=function(t){var e=this.subplot.map;if(e.getSource(this.idSource)&&e.removeSource(this.idSource),this.sourceType=t.sourcetype,this.source=t.source,c(t)){var r=function(t){var e,r=t.sourcetype,n=t.source,a={type:r};return\"geojson\"===r?e=\"data\":\"vector\"===r?e=\"string\"==typeof n?\"url\":\"tiles\":\"raster\"===r?(e=\"tiles\",a.tileSize=256):\"image\"===r&&(e=\"url\",a.coordinates=t.coordinates),a[e]=n,t.sourceattribution&&(a.attribution=i(t.sourceattribution)),a}(t);e.addSource(this.idSource,r)}},l.findFollowingMapLayerId=function(t){if(\"traces\"===t)for(var e=this.subplot.getMapLayers(),r=0;r1)for(r=0;r-1&&g(e.originalEvent,n,[r.xaxis],[r.yaxis],r.id,t),i.indexOf(\"event\")>-1&&c.click(n,e.originalEvent)}}},_.updateFx=function(t){var e=this,r=e.map,n=e.gd;if(!e.isStatic){var a,o=t.dragmode;a=function(t,r){r.isRect?(t.range={})[e.id]=[c([r.xmin,r.ymin]),c([r.xmax,r.ymax])]:(t.lassoPoints={})[e.id]=r.map(c)};var s=e.dragOptions;e.dragOptions=i.extendDeep(s||{},{dragmode:t.dragmode,element:e.div,gd:n,plotinfo:{id:e.id,domain:t[e.id].domain,xaxis:e.xaxis,yaxis:e.yaxis,fillRangeItems:a},xaxes:[e.xaxis],yaxes:[e.yaxis],subplot:e.id}),r.off(\"click\",e.onClickInPanHandler),f(o)||h(o)?(r.dragPan.disable(),r.on(\"zoomstart\",e.clearOutline),e.dragOptions.prepFn=function(t,r,n){p(t,r,n,e.dragOptions,o)},l.init(e.dragOptions)):(r.dragPan.enable(),r.off(\"zoomstart\",e.clearOutline),e.div.onmousedown=null,e.div.ontouchstart=null,e.div.removeEventListener(\"touchstart\",e.div._ontouchstart),e.onClickInPanHandler=e.onClickInPanFn(e.dragOptions),r.on(\"click\",e.onClickInPanHandler))}function c(t){var r=e.map.unproject(t);return[r.lng,r.lat]}},_.updateFramework=function(t){var e=t[this.id].domain,r=t._size,n=this.div.style;n.width=r.w*(e.x[1]-e.x[0])+\"px\",n.height=r.h*(e.y[1]-e.y[0])+\"px\",n.left=r.l+e.x[0]*r.w+\"px\",n.top=r.t+(1-e.y[1])*r.h+\"px\",this.xaxis._offset=r.l+e.x[0]*r.w,this.xaxis._length=r.w*(e.x[1]-e.x[0]),this.yaxis._offset=r.t+(1-e.y[1])*r.h,this.yaxis._length=r.h*(e.y[1]-e.y[0])},_.updateLayers=function(t){var e,r=t[this.id].layers,n=this.layerList;if(r.length!==n.length){for(e=0;eOpenStreetMap contributors',o=['© Carto',a].join(\" \"),s=['Map tiles by Stamen Design','under CC BY 3.0',\"|\",'Data by OpenStreetMap contributors','under ODbL'].join(\" \"),l={\"open-street-map\":{id:\"osm\",version:8,sources:{\"plotly-osm-tiles\":{type:\"raster\",attribution:a,tiles:[\"https://a.tile.openstreetmap.org/{z}/{x}/{y}.png\",\"https://b.tile.openstreetmap.org/{z}/{x}/{y}.png\"],tileSize:256}},layers:[{id:\"plotly-osm-tiles\",type:\"raster\",source:\"plotly-osm-tiles\",minzoom:0,maxzoom:22}],glyphs:\"https://fonts.openmaptiles.org/{fontstack}/{range}.pbf\"},\"white-bg\":{id:\"white-bg\",version:8,sources:{},layers:[{id:\"white-bg\",type:\"background\",paint:{\"background-color\":\"#FFFFFF\"},minzoom:0,maxzoom:22}],glyphs:\"https://fonts.openmaptiles.org/{fontstack}/{range}.pbf\"},\"carto-positron\":{id:\"carto-positron\",version:8,sources:{\"plotly-carto-positron\":{type:\"raster\",attribution:o,tiles:[\"https://cartodb-basemaps-c.global.ssl.fastly.net/light_all/{z}/{x}/{y}.png\"],tileSize:256}},layers:[{id:\"plotly-carto-positron\",type:\"raster\",source:\"plotly-carto-positron\",minzoom:0,maxzoom:22}],glyphs:\"https://fonts.openmaptiles.org/{fontstack}/{range}.pbf\"},\"carto-darkmatter\":{id:\"carto-darkmatter\",version:8,sources:{\"plotly-carto-darkmatter\":{type:\"raster\",attribution:o,tiles:[\"https://cartodb-basemaps-c.global.ssl.fastly.net/dark_all/{z}/{x}/{y}.png\"],tileSize:256}},layers:[{id:\"plotly-carto-darkmatter\",type:\"raster\",source:\"plotly-carto-darkmatter\",minzoom:0,maxzoom:22}],glyphs:\"https://fonts.openmaptiles.org/{fontstack}/{range}.pbf\"},\"stamen-terrain\":{id:\"stamen-terrain\",version:8,sources:{\"plotly-stamen-terrain\":{type:\"raster\",attribution:s,tiles:[\"https://tiles.stadiamaps.com/tiles/stamen_terrain/{z}/{x}/{y}.png?api_key=\"],tileSize:256}},layers:[{id:\"plotly-stamen-terrain\",type:\"raster\",source:\"plotly-stamen-terrain\",minzoom:0,maxzoom:22}],glyphs:\"https://fonts.openmaptiles.org/{fontstack}/{range}.pbf\"},\"stamen-toner\":{id:\"stamen-toner\",version:8,sources:{\"plotly-stamen-toner\":{type:\"raster\",attribution:s,tiles:[\"https://tiles.stadiamaps.com/tiles/stamen_toner/{z}/{x}/{y}.png?api_key=\"],tileSize:256}},layers:[{id:\"plotly-stamen-toner\",type:\"raster\",source:\"plotly-stamen-toner\",minzoom:0,maxzoom:22}],glyphs:\"https://fonts.openmaptiles.org/{fontstack}/{range}.pbf\"},\"stamen-watercolor\":{id:\"stamen-watercolor\",version:8,sources:{\"plotly-stamen-watercolor\":{type:\"raster\",attribution:['Map tiles by Stamen Design','under CC BY 3.0',\"|\",'Data by OpenStreetMap contributors','under CC BY SA'].join(\" \"),tiles:[\"https://tiles.stadiamaps.com/tiles/stamen_watercolor/{z}/{x}/{y}.jpg?api_key=\"],tileSize:256}},layers:[{id:\"plotly-stamen-watercolor\",type:\"raster\",source:\"plotly-stamen-watercolor\",minzoom:0,maxzoom:22}],glyphs:\"https://fonts.openmaptiles.org/{fontstack}/{range}.pbf\"}},c=n(l);t.exports={requiredVersion:i,styleUrlPrefix:\"mapbox://styles/mapbox/\",styleUrlSuffix:\"v9\",styleValuesMapbox:[\"basic\",\"streets\",\"outdoors\",\"light\",\"dark\",\"satellite\",\"satellite-streets\"],styleValueDflt:\"basic\",stylesNonMapbox:l,styleValuesNonMapbox:c,traceLayerPrefix:\"plotly-trace-layer-\",layoutLayerPrefix:\"plotly-layout-layer-\",wrongVersionErrorMsg:[\"Your custom plotly.js bundle is not using the correct mapbox-gl version\",\"Please install @plotly/mapbox-gl@\"+i+\".\"].join(\"\\n\"),noAccessTokenErrorMsg:[\"Missing Mapbox access token.\",\"Mapbox trace type require a Mapbox access token to be registered.\",\"For example:\",\" Plotly.newPlot(gd, data, layout, { mapboxAccessToken: 'my-access-token' });\",\"More info here: https://www.mapbox.com/help/define-access-token/\"].join(\"\\n\"),missingStyleErrorMsg:[\"No valid mapbox style found, please set `mapbox.style` to one of:\",c.join(\", \"),\"or register a Mapbox access token to use a Mapbox-served style.\"].join(\"\\n\"),multipleTokensErrorMsg:[\"Set multiple mapbox access token across different mapbox subplot,\",\"using first token found as mapbox-gl does not allow multipleaccess tokens on the same page.\"].join(\"\\n\"),mapOnErrorMsg:\"Mapbox error.\",mapboxLogo:{path0:\"m 10.5,1.24 c -5.11,0 -9.25,4.15 -9.25,9.25 0,5.1 4.15,9.25 9.25,9.25 5.1,0 9.25,-4.15 9.25,-9.25 0,-5.11 -4.14,-9.25 -9.25,-9.25 z m 4.39,11.53 c -1.93,1.93 -4.78,2.31 -6.7,2.31 -0.7,0 -1.41,-0.05 -2.1,-0.16 0,0 -1.02,-5.64 2.14,-8.81 0.83,-0.83 1.95,-1.28 3.13,-1.28 1.27,0 2.49,0.51 3.39,1.42 1.84,1.84 1.89,4.75 0.14,6.52 z\",path1:\"M 10.5,-0.01 C 4.7,-0.01 0,4.7 0,10.49 c 0,5.79 4.7,10.5 10.5,10.5 5.8,0 10.5,-4.7 10.5,-10.5 C 20.99,4.7 16.3,-0.01 10.5,-0.01 Z m 0,19.75 c -5.11,0 -9.25,-4.15 -9.25,-9.25 0,-5.1 4.14,-9.26 9.25,-9.26 5.11,0 9.25,4.15 9.25,9.25 0,5.13 -4.14,9.26 -9.25,9.26 z\",path2:\"M 14.74,6.25 C 12.9,4.41 9.98,4.35 8.23,6.1 5.07,9.27 6.09,14.91 6.09,14.91 c 0,0 5.64,1.02 8.81,-2.14 C 16.64,11 16.59,8.09 14.74,6.25 Z m -2.27,4.09 -0.91,1.87 -0.9,-1.87 -1.86,-0.91 1.86,-0.9 0.9,-1.87 0.91,1.87 1.86,0.9 z\",polygon:\"11.56,12.21 10.66,10.34 8.8,9.43 10.66,8.53 11.56,6.66 12.47,8.53 14.33,9.43 12.47,10.34\"},styleRules:{map:\"overflow:hidden;position:relative;\",\"missing-css\":\"display:none;\",canary:\"background-color:salmon;\",\"ctrl-bottom-left\":\"position: absolute; pointer-events: none; z-index: 2; bottom: 0; left: 0;\",\"ctrl-bottom-right\":\"position: absolute; pointer-events: none; z-index: 2; right: 0; bottom: 0;\",ctrl:\"clear: both; pointer-events: auto; transform: translate(0, 0);\",\"ctrl-attrib.mapboxgl-compact .mapboxgl-ctrl-attrib-inner\":\"display: none;\",\"ctrl-attrib.mapboxgl-compact:hover .mapboxgl-ctrl-attrib-inner\":\"display: block; margin-top:2px\",\"ctrl-attrib.mapboxgl-compact:hover\":\"padding: 2px 24px 2px 4px; visibility: visible; margin-top: 6px;\",\"ctrl-attrib.mapboxgl-compact::after\":'content: \"\"; cursor: pointer; position: absolute; background-image: url(\\'data:image/svg+xml;charset=utf-8,%3Csvg viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"%3E %3Cpath fill=\"%23333333\" fill-rule=\"evenodd\" d=\"M4,10a6,6 0 1,0 12,0a6,6 0 1,0 -12,0 M9,7a1,1 0 1,0 2,0a1,1 0 1,0 -2,0 M9,10a1,1 0 1,1 2,0l0,3a1,1 0 1,1 -2,0\"/%3E %3C/svg%3E\\'); background-color: rgba(255, 255, 255, 0.5); width: 24px; height: 24px; box-sizing: border-box; border-radius: 12px;',\"ctrl-attrib.mapboxgl-compact\":\"min-height: 20px; padding: 0; margin: 10px; position: relative; background-color: #fff; border-radius: 3px 12px 12px 3px;\",\"ctrl-bottom-right > .mapboxgl-ctrl-attrib.mapboxgl-compact::after\":\"bottom: 0; right: 0\",\"ctrl-bottom-left > .mapboxgl-ctrl-attrib.mapboxgl-compact::after\":\"bottom: 0; left: 0\",\"ctrl-bottom-left .mapboxgl-ctrl\":\"margin: 0 0 10px 10px; float: left;\",\"ctrl-bottom-right .mapboxgl-ctrl\":\"margin: 0 10px 10px 0; float: right;\",\"ctrl-attrib\":\"color: rgba(0, 0, 0, 0.75); text-decoration: none; font-size: 12px\",\"ctrl-attrib a\":\"color: rgba(0, 0, 0, 0.75); text-decoration: none; font-size: 12px\",\"ctrl-attrib a:hover\":\"color: inherit; text-decoration: underline;\",\"ctrl-attrib .mapbox-improve-map\":\"font-weight: bold; margin-left: 2px;\",\"attrib-empty\":\"display: none;\",\"ctrl-logo\":'display:block; width: 21px; height: 21px; background-image: url(\\'data:image/svg+xml;charset=utf-8,%3C?xml version=\"1.0\" encoding=\"utf-8\"?%3E %3Csvg version=\"1.1\" id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" viewBox=\"0 0 21 21\" style=\"enable-background:new 0 0 21 21;\" xml:space=\"preserve\"%3E%3Cg transform=\"translate(0,0.01)\"%3E%3Cpath d=\"m 10.5,1.24 c -5.11,0 -9.25,4.15 -9.25,9.25 0,5.1 4.15,9.25 9.25,9.25 5.1,0 9.25,-4.15 9.25,-9.25 0,-5.11 -4.14,-9.25 -9.25,-9.25 z m 4.39,11.53 c -1.93,1.93 -4.78,2.31 -6.7,2.31 -0.7,0 -1.41,-0.05 -2.1,-0.16 0,0 -1.02,-5.64 2.14,-8.81 0.83,-0.83 1.95,-1.28 3.13,-1.28 1.27,0 2.49,0.51 3.39,1.42 1.84,1.84 1.89,4.75 0.14,6.52 z\" style=\"opacity:0.9;fill:%23ffffff;enable-background:new\" class=\"st0\"/%3E%3Cpath d=\"M 10.5,-0.01 C 4.7,-0.01 0,4.7 0,10.49 c 0,5.79 4.7,10.5 10.5,10.5 5.8,0 10.5,-4.7 10.5,-10.5 C 20.99,4.7 16.3,-0.01 10.5,-0.01 Z m 0,19.75 c -5.11,0 -9.25,-4.15 -9.25,-9.25 0,-5.1 4.14,-9.26 9.25,-9.26 5.11,0 9.25,4.15 9.25,9.25 0,5.13 -4.14,9.26 -9.25,9.26 z\" style=\"opacity:0.35;enable-background:new\" class=\"st1\"/%3E%3Cpath d=\"M 14.74,6.25 C 12.9,4.41 9.98,4.35 8.23,6.1 5.07,9.27 6.09,14.91 6.09,14.91 c 0,0 5.64,1.02 8.81,-2.14 C 16.64,11 16.59,8.09 14.74,6.25 Z m -2.27,4.09 -0.91,1.87 -0.9,-1.87 -1.86,-0.91 1.86,-0.9 0.9,-1.87 0.91,1.87 1.86,0.9 z\" style=\"opacity:0.35;enable-background:new\" class=\"st1\"/%3E%3Cpolygon points=\"11.56,12.21 10.66,10.34 8.8,9.43 10.66,8.53 11.56,6.66 12.47,8.53 14.33,9.43 12.47,10.34 \" style=\"opacity:0.9;fill:%23ffffff;enable-background:new\" class=\"st0\"/%3E%3C/g%3E%3C/svg%3E\\')'}}},2178:function(t,e,r){\"use strict\";var n=r(34809);t.exports=function(t,e){var r=t.split(\" \"),i=r[0],a=r[1],o=n.isArrayOrTypedArray(e)?n.mean(e):e,s=.5+o/100,l=1.5+o/100,c=[\"\",\"\"],u=[0,0];switch(i){case\"top\":c[0]=\"top\",u[1]=-l;break;case\"bottom\":c[0]=\"bottom\",u[1]=l}switch(a){case\"left\":c[1]=\"right\",u[0]=-s;break;case\"right\":c[1]=\"left\",u[0]=s}return{anchor:c[0]&&c[1]?c.join(\"-\"):c[0]?c[0]:c[1]?c[1]:\"center\",offset:u}}},68192:function(t,e,r){\"use strict\";var n=r(32280),i=r(34809),a=i.strTranslate,o=i.strScale,s=r(4173).fX,l=r(62972),c=r(45568),u=r(62203),h=r(30635),f=r(5417),p=\"mapbox\",d=e.constants=r(44245);e.name=p,e.attr=\"subplot\",e.idRoot=p,e.idRegex=e.attrRegex=i.counterRegex(p);var m=[\"mapbox subplots and traces are deprecated!\",\"Please consider switching to `map` subplots and traces.\",\"Learn more at: https://plotly.com/javascript/maplibre-migration/\"].join(\" \");e.attributes={subplot:{valType:\"subplotid\",dflt:\"mapbox\",editType:\"calc\"}},e.layoutAttributes=r(67514),e.supplyLayoutDefaults=r(86989);var g=!0;function y(t){return\"string\"==typeof t&&(-1!==d.styleValuesMapbox.indexOf(t)||0===t.indexOf(\"mapbox://\")||0===t.indexOf(\"stamen\"))}e.plot=function(t){g&&(g=!1,i.warn(m));var e=t._fullLayout,r=t.calcdata,a=e._subplots[p];if(n.version!==d.requiredVersion)throw new Error(d.wrongVersionErrorMsg);var o=function(t,e){var r=t._fullLayout;if(\"\"===t._context.mapboxAccessToken)return\"\";for(var n=[],a=[],o=!1,s=!1,l=0;l1&&i.warn(d.multipleTokensErrorMsg),n[0]):(a.length&&i.log([\"Listed mapbox access token(s)\",a.join(\",\"),\"but did not use a Mapbox map style, ignoring token(s).\"].join(\" \")),\"\")}(t,a);n.accessToken=o;for(var l=0;lw/2){var T=v.split(\"|\").join(\"
\");_.text(T).attr(\"data-unformatted\",T).call(h.convertToTspans,t),b=u.bBox(_.node())}_.attr(\"transform\",a(-3,8-b.height)),x.insert(\"rect\",\".static-attribution\").attr({x:-b.width-6,y:-b.height-3,width:b.width+6,height:b.height+3,fill:\"rgba(255, 255, 255, 0.75)\"});var k=1;b.width+6>w&&(k=w/(b.width+6));var A=[n.l+n.w*f.x[1],n.t+n.h*(1-f.y[0])];x.attr(\"transform\",a(A[0],A[1])+o(k))}},e.updateFx=function(t){for(var e=t._fullLayout,r=e._subplots[p],n=0;n0){for(var r=0;r0}function u(t){var e={},r={};switch(t.type){case\"circle\":n.extendFlat(r,{\"circle-radius\":t.circle.radius,\"circle-color\":t.color,\"circle-opacity\":t.opacity});break;case\"line\":n.extendFlat(r,{\"line-width\":t.line.width,\"line-color\":t.color,\"line-opacity\":t.opacity,\"line-dasharray\":t.line.dash});break;case\"fill\":n.extendFlat(r,{\"fill-color\":t.color,\"fill-outline-color\":t.fill.outlinecolor,\"fill-opacity\":t.opacity});break;case\"symbol\":var i=t.symbol,o=a(i.textposition,i.iconsize);n.extendFlat(e,{\"icon-image\":i.icon+\"-15\",\"icon-size\":i.iconsize/10,\"text-field\":i.text,\"text-size\":i.textfont.size,\"text-anchor\":o.anchor,\"text-offset\":o.offset,\"symbol-placement\":i.placement}),n.extendFlat(r,{\"icon-color\":t.color,\"text-color\":i.textfont.color,\"text-opacity\":t.opacity});break;case\"raster\":n.extendFlat(r,{\"raster-fade-duration\":0,\"raster-opacity\":t.opacity})}return{layout:e,paint:r}}l.update=function(t){this.visible?this.needsNewImage(t)?this.updateImage(t):this.needsNewSource(t)?(this.removeLayer(),this.updateSource(t),this.updateLayer(t)):this.needsNewLayer(t)?this.updateLayer(t):this.updateStyle(t):(this.updateSource(t),this.updateLayer(t)),this.visible=c(t)},l.needsNewImage=function(t){return this.subplot.map.getSource(this.idSource)&&\"image\"===this.sourceType&&\"image\"===t.sourcetype&&(this.source!==t.source||JSON.stringify(this.coordinates)!==JSON.stringify(t.coordinates))},l.needsNewSource=function(t){return this.sourceType!==t.sourcetype||JSON.stringify(this.source)!==JSON.stringify(t.source)||this.layerType!==t.type},l.needsNewLayer=function(t){return this.layerType!==t.type||this.below!==this.subplot.belowLookup[\"layout-\"+this.index]},l.lookupBelow=function(){return this.subplot.belowLookup[\"layout-\"+this.index]},l.updateImage=function(t){this.subplot.map.getSource(this.idSource).updateImage({url:t.source,coordinates:t.coordinates});var e=this.findFollowingMapboxLayerId(this.lookupBelow());null!==e&&this.subplot.map.moveLayer(this.idLayer,e)},l.updateSource=function(t){var e=this.subplot.map;if(e.getSource(this.idSource)&&e.removeSource(this.idSource),this.sourceType=t.sourcetype,this.source=t.source,c(t)){var r=function(t){var e,r=t.sourcetype,n=t.source,a={type:r};return\"geojson\"===r?e=\"data\":\"vector\"===r?e=\"string\"==typeof n?\"url\":\"tiles\":\"raster\"===r?(e=\"tiles\",a.tileSize=256):\"image\"===r&&(e=\"url\",a.coordinates=t.coordinates),a[e]=n,t.sourceattribution&&(a.attribution=i(t.sourceattribution)),a}(t);e.addSource(this.idSource,r)}},l.findFollowingMapboxLayerId=function(t){if(\"traces\"===t)for(var e=this.subplot.getMapLayers(),r=0;r1)for(r=0;r-1&&g(e.originalEvent,n,[r.xaxis],[r.yaxis],r.id,t),i.indexOf(\"event\")>-1&&c.click(n,e.originalEvent)}}},_.updateFx=function(t){var e=this,r=e.map,n=e.gd;if(!e.isStatic){var a,o=t.dragmode;a=function(t,r){r.isRect?(t.range={})[e.id]=[c([r.xmin,r.ymin]),c([r.xmax,r.ymax])]:(t.lassoPoints={})[e.id]=r.map(c)};var s=e.dragOptions;e.dragOptions=i.extendDeep(s||{},{dragmode:t.dragmode,element:e.div,gd:n,plotinfo:{id:e.id,domain:t[e.id].domain,xaxis:e.xaxis,yaxis:e.yaxis,fillRangeItems:a},xaxes:[e.xaxis],yaxes:[e.yaxis],subplot:e.id}),r.off(\"click\",e.onClickInPanHandler),f(o)||h(o)?(r.dragPan.disable(),r.on(\"zoomstart\",e.clearOutline),e.dragOptions.prepFn=function(t,r,n){p(t,r,n,e.dragOptions,o)},l.init(e.dragOptions)):(r.dragPan.enable(),r.off(\"zoomstart\",e.clearOutline),e.div.onmousedown=null,e.div.ontouchstart=null,e.div.removeEventListener(\"touchstart\",e.div._ontouchstart),e.onClickInPanHandler=e.onClickInPanFn(e.dragOptions),r.on(\"click\",e.onClickInPanHandler))}function c(t){var r=e.map.unproject(t);return[r.lng,r.lat]}},_.updateFramework=function(t){var e=t[this.id].domain,r=t._size,n=this.div.style;n.width=r.w*(e.x[1]-e.x[0])+\"px\",n.height=r.h*(e.y[1]-e.y[0])+\"px\",n.left=r.l+e.x[0]*r.w+\"px\",n.top=r.t+(1-e.y[1])*r.h+\"px\",this.xaxis._offset=r.l+e.x[0]*r.w,this.xaxis._length=r.w*(e.x[1]-e.x[0]),this.yaxis._offset=r.t+(1-e.y[1])*r.h,this.yaxis._length=r.h*(e.y[1]-e.y[0])},_.updateLayers=function(t){var e,r=t[this.id].layers,n=this.layerList;if(r.length!==n.length){for(e=0;e=e.width-20?(a[\"text-anchor\"]=\"start\",a.x=5):(a[\"text-anchor\"]=\"end\",a.x=e._paper.attr(\"width\")-7),r.attr(a);var o=r.select(\".js-link-to-tool\"),s=r.select(\".js-link-spacer\"),l=r.select(\".js-sourcelinks\");t._context.showSources&&t._context.showSources(t),t._context.showLink&&function(t,e){e.text(\"\");var r=e.append(\"a\").attr({\"xlink:xlink:href\":\"#\",class:\"link--impt link--embedview\",\"font-weight\":\"bold\"}).text(t._context.linkText+\" \"+String.fromCharCode(187));if(t._context.sendData)r.on(\"click\",(function(){w.sendDataToCloud(t)}));else{var n=window.location.pathname.split(\"/\"),i=window.location.search;r.attr({\"xlink:xlink:show\":\"new\",\"xlink:xlink:href\":\"/\"+n[2].split(\".\")[0]+\"/\"+n[1]+i})}}(t,o),s.text(o.text()&&l.text()?\" - \":\"\")}},w.sendDataToCloud=function(t){var e=(window.PLOTLYENV||{}).BASE_URL||t._context.plotlyServerURL;if(e){t.emit(\"plotly_beforeexport\");var r=n.select(t).append(\"div\").attr(\"id\",\"hiddenform\").style(\"display\",\"none\"),i=r.append(\"form\").attr({action:e+\"/external\",method:\"post\",target:\"_blank\"});return i.append(\"input\").attr({type:\"text\",name:\"data\"}).node().value=w.graphJson(t,!1,\"keepdata\"),i.node().submit(),r.remove(),t.emit(\"plotly_afterexport\"),!1}};var A=[\"days\",\"shortDays\",\"months\",\"shortMonths\",\"periods\",\"dateTime\",\"date\",\"time\",\"decimal\",\"thousands\",\"grouping\",\"currency\"],M=[\"year\",\"month\",\"dayMonth\",\"dayMonthYear\"];function S(t,e){var r=t._context.locale;r||(r=\"en-US\");var n=!1,i={};function a(t){for(var r=!0,a=0;a1&&O.length>1){for(l.getComponentMethod(\"grid\",\"sizeDefaults\")(c,s),o=0;o15&&O.length>15&&0===s.shapes.length&&0===s.images.length,w.linkSubplots(f,s,u,n),w.cleanPlot(f,s,u,n);var N=!(!n._has||!n._has(\"gl2d\")),j=!(!s._has||!s._has(\"gl2d\")),U=!(!n._has||!n._has(\"cartesian\"))||N,V=!(!s._has||!s._has(\"cartesian\"))||j;U&&!V?n._bgLayer.remove():V&&!U&&(s._shouldCreateBgLayer=!0),n._zoomlayer&&!t._dragging&&m({_fullLayout:n}),function(t,e){var r,n=[];e.meta&&(r=e._meta={meta:e.meta,layout:{meta:e.meta}});for(var i=0;i0){var u=1-2*s;n=Math.round(u*n),i=Math.round(u*i)}}var f=w.layoutAttributes.width.min,p=w.layoutAttributes.height.min;n1,m=!e.height&&Math.abs(r.height-i)>1;(m||d)&&(d&&(r.width=n),m&&(r.height=i)),t._initialAutoSize||(t._initialAutoSize={width:n,height:i}),w.sanitizeMargins(r)},w.supplyLayoutModuleDefaults=function(t,e,r,n){var i,a,o,s=l.componentsRegistry,c=e._basePlotModules,u=l.subplotsRegistry.cartesian;for(i in s)(o=s[i]).includeBasePlot&&o.includeBasePlot(t,e);for(var f in c.length||c.push(u),e._has(\"cartesian\")&&(l.getComponentMethod(\"grid\",\"contentDefaults\")(t,e),u.finalizeSubplots(t,e)),e._subplots)e._subplots[f].sort(h.subplotSort);for(a=0;a1&&(r.l/=y,r.r/=y)}if(p){var v=(r.t+r.b)/p;v>1&&(r.t/=v,r.b/=v)}var x=void 0!==r.xl?r.xl:r.x,_=void 0!==r.xr?r.xr:r.x,b=void 0!==r.yt?r.yt:r.y,T=void 0!==r.yb?r.yb:r.y;d[e]={l:{val:x,size:r.l+g},r:{val:_,size:r.r+g},b:{val:T,size:r.b+g},t:{val:b,size:r.t+g}},m[e]=1}else delete d[e],delete m[e];if(!n._replotting)return w.doAutoMargin(t)}},w.doAutoMargin=function(t){var e=t._fullLayout,r=e.width,n=e.height;e._size||(e._size={}),P(e);var i=e._size,a=e.margin,s={t:0,b:0,l:0,r:0},c=h.extendFlat({},i),u=a.l,f=a.r,p=a.t,m=a.b,g=e._pushmargin,y=e._pushmarginIds,v=e.minreducedwidth,x=e.minreducedheight;if(!1!==a.autoexpand){for(var _ in g)y[_]||delete g[_];var b=t._fullLayout._reservedMargin;for(var T in b)for(var k in b[T]){var A=b[T][k];s[k]=Math.max(s[k],A)}for(var M in g.base={l:{val:0,size:u},r:{val:1,size:f},t:{val:1,size:p},b:{val:0,size:m}},s){var S=0;for(var E in g)\"base\"!==E&&o(g[E][M].size)&&(S=g[E][M].size>S?g[E][M].size:S);var C=Math.max(0,a[M]-S);s[M]=Math.max(0,s[M]-C)}for(var L in g){var I=g[L].l||{},z=g[L].b||{},O=I.val,D=I.size,R=z.val,F=z.size,B=r-s.r-s.l,N=n-s.t-s.b;for(var j in g){if(o(D)&&g[j].r){var U=g[j].r.val,V=g[j].r.size;if(U>O){var q=(D*U+(V-B)*O)/(U-O),H=(V*(1-O)+(D-B)*(1-U))/(U-O);q+H>u+f&&(u=q,f=H)}}if(o(F)&&g[j].t){var G=g[j].t.val,Z=g[j].t.size;if(G>R){var W=(F*G+(Z-N)*R)/(G-R),Y=(Z*(1-R)+(F-N)*(1-G))/(G-R);W+Y>m+p&&(m=W,p=Y)}}}}}var X=h.constrain(r-a.l-a.r,2,v),$=h.constrain(n-a.t-a.b,2,x),J=Math.max(0,r-X),K=Math.max(0,n-$);if(J){var Q=(u+f)/J;Q>1&&(u/=Q,f/=Q)}if(K){var tt=(m+p)/K;tt>1&&(m/=tt,p/=tt)}if(i.l=Math.round(u)+s.l,i.r=Math.round(f)+s.r,i.t=Math.round(p)+s.t,i.b=Math.round(m)+s.b,i.p=Math.round(a.pad),i.w=Math.round(r)-i.l-i.r,i.h=Math.round(n)-i.t-i.b,!e._replotting&&(w.didMarginChange(c,i)||function(t){if(\"_redrawFromAutoMarginCount\"in t._fullLayout)return!1;var e=d.list(t,\"\",!0);for(var r in e)if(e[r].autoshift||e[r].shift)return!0;return!1}(t))){\"_redrawFromAutoMarginCount\"in e?e._redrawFromAutoMarginCount++:e._redrawFromAutoMarginCount=1;var et=3*(1+Object.keys(y).length);if(e._redrawFromAutoMarginCount0&&(t._transitioningWithDuration=!0),t._transitionData._interruptCallbacks.push((function(){n=!0})),r.redraw&&t._transitionData._interruptCallbacks.push((function(){return l.call(\"redraw\",t)})),t._transitionData._interruptCallbacks.push((function(){t.emit(\"plotly_transitioninterrupted\",[])}));var a=0,o=0;function s(){return a++,function(){var e;o++,n||o!==a||(e=i,t._transitionData&&(function(t){if(t)for(;t.length;)t.shift()}(t._transitionData._interruptCallbacks),Promise.resolve().then((function(){if(r.redraw)return l.call(\"redraw\",t)})).then((function(){t._transitioning=!1,t._transitioningWithDuration=!1,t.emit(\"plotly_transitioned\",[])})).then(e)))}}r.runFn(s),setTimeout(s())}))}],a=h.syncOrAsync(i,t);return a&&a.then||(a=Promise.resolve()),a.then((function(){return t}))}w.didMarginChange=function(t,e){for(var r=0;r1)return!0}return!1},w.graphJson=function(t,e,r,n,i,a){(i&&e&&!t._fullData||i&&!e&&!t._fullLayout)&&w.supplyDefaults(t);var o=i?t._fullData:t.data,l=i?t._fullLayout:t.layout,c=(t._transitionData||{})._frames;function u(t,e){if(\"function\"==typeof t)return e?\"_function_\":null;if(h.isPlainObject(t)){var n,i={};return Object.keys(t).sort().forEach((function(a){if(-1===[\"_\",\"[\"].indexOf(a.charAt(0)))if(\"function\"!=typeof t[a]){if(\"keepdata\"===r){if(\"src\"===a.substr(a.length-3))return}else if(\"keepstream\"===r){if(\"string\"==typeof(n=t[a+\"src\"])&&n.indexOf(\":\")>0&&!h.isPlainObject(t.stream))return}else if(\"keepall\"!==r&&\"string\"==typeof(n=t[a+\"src\"])&&n.indexOf(\":\")>0)return;i[a]=u(t[a],e)}else e&&(i[a]=\"_function\")})),i}var a=Array.isArray(t),o=h.isTypedArray(t);if((a||o)&&t.dtype&&t.shape){var l=t.bdata;return u({dtype:t.dtype,shape:t.shape,bdata:h.isArrayBuffer(l)?s.encode(l):l},e)}return a?t.map((function(t){return u(t,e)})):o?h.simpleMap(t,h.identity):h.isJSDate(t)?h.ms2DateTimeLocal(+t):t}var f={data:(o||[]).map((function(t){var r=u(t);return e&&delete r.fit,r}))};if(!e&&(f.layout=u(l),i)){var p=l._size;f.layout.computed={margin:{b:p.b,l:p.l,r:p.r,t:p.t}}}return c&&(f.frames=u(c)),a&&(f.config=u(t._context,!0)),\"object\"===n?f:JSON.stringify(f)},w.modifyFrames=function(t,e){var r,n,i,a=t._transitionData._frames,o=t._transitionData._frameHash;for(r=0;r=0;a--)if(l[a].enabled){r._indexToPoints=l[a]._indexToPoints;break}n&&n.calc&&(o=n.calc(t,r))}Array.isArray(o)&&o[0]||(o=[{x:p,y:p}]),o[0].t||(o[0].t={}),o[0].trace=r,f[e]=o}}for(R(o,s,u),i=0;i1e-10?t:0}function f(t,e,r){e=e||0,r=r||0;for(var n=t.length,i=new Array(n),a=0;a0?r:1/0})),i=n.mod(r+1,e.length);return[e[r],e[i]]},findIntersectionXY:c,findXYatLength:function(t,e,r,n){var i=-e*r,a=e*e+1,o=2*(e*i-r),s=i*i+r*r-t*t,l=Math.sqrt(o*o-4*a*s),c=(-o+l)/(2*a),u=(-o-l)/(2*a);return[[c,e*c+i+n],[u,e*u+i+n]]},clampTiny:h,pathPolygon:function(t,e,r,n,i,a){return\"M\"+f(u(t,e,r,n),i,a).join(\"L\")},pathPolygonAnnulus:function(t,e,r,n,i,a,o){var s,l;t=90||i>90&&a>=450?1:s<=0&&c<=0?0:Math.max(s,c),[i<=180&&a>=180||i>180&&a>=540?-1:o>=0&&l>=0?0:Math.min(o,l),i<=270&&a>=270||i>270&&a>=630?-1:s>=0&&c>=0?0:Math.min(s,c),a>=360?1:o<=0&&l<=0?0:Math.max(o,l),e]}(d),b=_[2]-_[0],w=_[3]-_[1],T=p/f,k=Math.abs(w/b);T>k?(m=f,x=(p-(g=f*k))/i.h/2,y=[s[0],s[1]],v=[h[0]+x,h[1]-x]):(g=p,x=(f-(m=p/k))/i.w/2,y=[s[0]+x,s[1]-x],v=[h[0],h[1]]),r.xLength2=m,r.yLength2=g,r.xDomain2=y,r.yDomain2=v;var A,M=r.xOffset2=i.l+i.w*y[0],S=r.yOffset2=i.t+i.h*(1-v[1]),E=r.radius=m/b,C=r.innerRadius=r.getHole(e)*E,L=r.cx=M-E*_[0],I=r.cy=S+E*_[3],P=r.cxx=L-M,z=r.cyy=I-S,O=a.side;\"counterclockwise\"===O?(A=O,O=\"top\"):\"clockwise\"===O&&(A=O,O=\"bottom\"),r.radialAxis=r.mockAxis(t,e,a,{_id:\"x\",side:O,_trueSide:A,domain:[C/i.w,E/i.w]}),r.angularAxis=r.mockAxis(t,e,o,{side:\"right\",domain:[0,Math.PI],autorange:!1}),r.doAutoRange(t,e),r.updateAngularAxis(t,e),r.updateRadialAxis(t,e),r.updateRadialAxisTitle(t,e),r.xaxis=r.mockCartesianAxis(t,e,{_id:\"x\",domain:y}),r.yaxis=r.mockCartesianAxis(t,e,{_id:\"y\",domain:v});var F=r.pathSubplot();r.clipPaths.forTraces.select(\"path\").attr(\"d\",F).attr(\"transform\",l(P,z)),n.frontplot.attr(\"transform\",l(M,S)).call(u.setClipUrl,r._hasClipOnAxisFalse?null:r.clipIds.forTraces,r.gd),n.bg.attr(\"d\",F).attr(\"transform\",l(L,I)).call(c.fill,e.bgcolor)},N.mockAxis=function(t,e,r,n){var i=o.extendFlat({},r,n);return d(i,e,t),i},N.mockCartesianAxis=function(t,e,r){var n=this,i=n.isSmith,a=r._id,s=o.extendFlat({type:\"linear\"},r);p(s,t);var l={x:[0,2],y:[1,3]};return s.setRange=function(){var t=n.sectorBBox,r=l[a],i=n.radialAxis._rl,o=(i[1]-i[0])/(1-n.getHole(e));s.range=[t[r[0]]*o,t[r[1]]*o]},s.isPtWithinRange=\"x\"!==a||i?function(){return!0}:function(t){return n.isPtInside(t)},s.setRange(),s.setScale(),s},N.doAutoRange=function(t,e){var r=this,n=r.gd,i=r.radialAxis,a=r.getRadial(e);m(n,i);var o=i.range;if(a.range=o.slice(),a._input.range=o.slice(),i._rl=[i.r2l(o[0],null,\"gregorian\"),i.r2l(o[1],null,\"gregorian\")],void 0!==i.minallowed){var s=i.r2l(i.minallowed);i._rl[0]>i._rl[1]?i._rl[1]=Math.max(i._rl[1],s):i._rl[0]=Math.max(i._rl[0],s)}if(void 0!==i.maxallowed){var l=i.r2l(i.maxallowed);i._rl[0]90&&m<=270&&(g.tickangle=180);var x=v?function(t){var e=z(r,L([t.x,0]));return l(e[0]-h,e[1]-p)}:function(t){return l(g.l2p(t.x)+u,0)},_=v?function(t){return P(r,t.x,-1/0,1/0)}:function(t){return r.pathArc(g.r2p(t.x)+u)},b=j(d);if(r.radialTickLayout!==b&&(i[\"radial-axis\"].selectAll(\".xtick\").remove(),r.radialTickLayout=b),y){g.setScale();var w=0,T=v?(g.tickvals||[]).filter((function(t){return t>=0})).map((function(t){return f.tickText(g,t,!0,!1)})):f.calcTicks(g),k=v?T:f.clipEnds(g,T),A=f.getTickSigns(g)[2];v&&((\"top\"===g.ticks&&\"bottom\"===g.side||\"bottom\"===g.ticks&&\"top\"===g.side)&&(A=-A),\"top\"===g.ticks&&\"top\"===g.side&&(w=-g.ticklen),\"bottom\"===g.ticks&&\"bottom\"===g.side&&(w=g.ticklen)),f.drawTicks(n,g,{vals:T,layer:i[\"radial-axis\"],path:f.makeTickPath(g,0,A),transFn:x,crisp:!1}),f.drawGrid(n,g,{vals:k,layer:i[\"radial-grid\"],path:_,transFn:o.noop,crisp:!1}),f.drawLabels(n,g,{vals:T,layer:i[\"radial-axis\"],transFn:x,labelFns:f.makeLabelFns(g,w)})}var M=r.radialAxisAngle=r.vangles?F(U(R(d.angle),r.vangles)):d.angle,S=l(h,p),E=S+s(-M);V(i[\"radial-axis\"],y&&(d.showticklabels||d.ticks),{transform:E}),V(i[\"radial-grid\"],y&&d.showgrid,{transform:v?\"\":S}),V(i[\"radial-line\"].select(\"line\"),y&&d.showline,{x1:v?-a:u,y1:0,x2:a,y2:0,transform:E}).attr(\"stroke-width\",d.linewidth).call(c.stroke,d.linecolor)},N.updateRadialAxisTitle=function(t,e,r){if(!this.isSmith){var n=this,i=n.gd,a=n.radius,o=n.cx,s=n.cy,l=n.getRadial(e),c=n.id+\"title\",h=0;if(l.title){var f=u.bBox(n.layers[\"radial-axis\"].node()).height,p=l.title.font.size,d=l.side;h=\"top\"===d?p:\"counterclockwise\"===d?-(f+.4*p):f+.8*p}var m=void 0!==r?r:n.radialAxisAngle,g=R(m),y=Math.cos(g),v=Math.sin(g),_=o+a/2*y+h*v,b=s-a/2*v+h*y;n.layers[\"radial-axis-title\"]=x.draw(i,c,{propContainer:l,propName:n.id+\".radialaxis.title\",placeholder:O(i,\"Click to enter radial axis title\"),attributes:{x:_,y:b,\"text-anchor\":\"middle\"},transform:{rotate:-m}})}},N.updateAngularAxis=function(t,e){var r=this,n=r.gd,i=r.layers,a=r.radius,u=r.innerRadius,h=r.cx,p=r.cy,d=r.getAngular(e),m=r.angularAxis,g=r.isSmith;g||(r.fillViewInitialKey(\"angularaxis.rotation\",d.rotation),m.setGeometry(),m.setScale());var y=g?function(t){var e=z(r,L([0,t.x]));return Math.atan2(e[0]-h,e[1]-p)-Math.PI/2}:function(t){return m.t2g(t.x)};\"linear\"===m.type&&\"radians\"===m.thetaunit&&(m.tick0=F(m.tick0),m.dtick=F(m.dtick));var v=function(t){return l(h+a*Math.cos(t),p-a*Math.sin(t))},x=g?function(t){var e=z(r,L([0,t.x]));return l(e[0],e[1])}:function(t){return v(y(t))},_=g?function(t){var e=z(r,L([0,t.x])),n=Math.atan2(e[0]-h,e[1]-p)-Math.PI/2;return l(e[0],e[1])+s(-F(n))}:function(t){var e=y(t);return v(e)+s(-F(e))},b=g?function(t){return I(r,t.x,0,1/0)}:function(t){var e=y(t),r=Math.cos(e),n=Math.sin(e);return\"M\"+[h+u*r,p-u*n]+\"L\"+[h+a*r,p-a*n]},w=f.makeLabelFns(m,0).labelStandoff,T={xFn:function(t){var e=y(t);return Math.cos(e)*w},yFn:function(t){var e=y(t),r=Math.sin(e)>0?.2:1;return-Math.sin(e)*(w+t.fontSize*r)+Math.abs(Math.cos(e))*(t.fontSize*M)},anchorFn:function(t){var e=y(t),r=Math.cos(e);return Math.abs(r)<.1?\"middle\":r>0?\"start\":\"end\"},heightFn:function(t,e,r){var n=y(t);return-.5*(1+Math.sin(n))*r}},k=j(d);r.angularTickLayout!==k&&(i[\"angular-axis\"].selectAll(\".\"+m._id+\"tick\").remove(),r.angularTickLayout=k);var A,S=g?[1/0].concat(m.tickvals||[]).map((function(t){return f.tickText(m,t,!0,!1)})):f.calcTicks(m);if(g&&(S[0].text=\"∞\",S[0].fontSize*=1.75),\"linear\"===e.gridshape?(A=S.map(y),o.angleDelta(A[0],A[1])<0&&(A=A.slice().reverse())):A=null,r.vangles=A,\"category\"===m.type&&(S=S.filter((function(t){return o.isAngleInsideSector(y(t),r.sectorInRad)}))),m.visible){var E=\"inside\"===m.ticks?-1:1,C=(m.linewidth||1)/2;f.drawTicks(n,m,{vals:S,layer:i[\"angular-axis\"],path:\"M\"+E*C+\",0h\"+E*m.ticklen,transFn:_,crisp:!1}),f.drawGrid(n,m,{vals:S,layer:i[\"angular-grid\"],path:b,transFn:o.noop,crisp:!1}),f.drawLabels(n,m,{vals:S,layer:i[\"angular-axis\"],repositionOnUpdate:!0,transFn:x,labelFns:T})}V(i[\"angular-line\"].select(\"path\"),d.showline,{d:r.pathSubplot(),transform:l(h,p)}).attr(\"stroke-width\",d.linewidth).call(c.stroke,d.linecolor)},N.updateFx=function(t,e){this.gd._context.staticPlot||(!this.isSmith&&(this.updateAngularDrag(t),this.updateRadialDrag(t,e,0),this.updateRadialDrag(t,e,1)),this.updateHoverAndMainDrag(t))},N.updateHoverAndMainDrag=function(t){var e,r,s=this,c=s.isSmith,u=s.gd,h=s.layers,f=t._zoomlayer,p=S.MINZOOM,d=S.OFFEDGE,m=s.radius,x=s.innerRadius,T=s.cx,k=s.cy,A=s.cxx,M=s.cyy,C=s.sectorInRad,L=s.vangles,I=s.radialAxis,P=E.clampTiny,z=E.findXYatLength,O=E.findEnclosingVertexAngles,D=S.cornerHalfWidth,R=S.cornerLen/2,F=g.makeDragger(h,\"path\",\"maindrag\",!1===t.dragmode?\"none\":\"crosshair\");n.select(F).attr(\"d\",s.pathSubplot()).attr(\"transform\",l(T,k)),F.onmousemove=function(t){v.hover(u,t,s.id),u._fullLayout._lasthover=F,u._fullLayout._hoversubplot=s.id},F.onmouseout=function(t){u._dragging||y.unhover(u,t)};var B,N,j,U,V,q,H,G,Z,W={element:F,gd:u,subplot:s.id,plotinfo:{id:s.id,xaxis:s.xaxis,yaxis:s.yaxis},xaxes:[s.xaxis],yaxes:[s.yaxis]};function Y(t,e){return Math.sqrt(t*t+e*e)}function X(t,e){return Y(t-A,e-M)}function $(t,e){return Math.atan2(M-e,t-A)}function J(t,e){return[t*Math.cos(e),t*Math.sin(-e)]}function K(t,e){if(0===t)return s.pathSector(2*D);var r=R/t,n=e-r,i=e+r,a=Math.max(0,Math.min(t,m)),o=a-D,l=a+D;return\"M\"+J(o,n)+\"A\"+[o,o]+\" 0,0,0 \"+J(o,i)+\"L\"+J(l,i)+\"A\"+[l,l]+\" 0,0,1 \"+J(l,n)+\"Z\"}function Q(t,e,r){if(0===t)return s.pathSector(2*D);var n,i,a=J(t,e),o=J(t,r),l=P((a[0]+o[0])/2),c=P((a[1]+o[1])/2);if(l&&c){var u=c/l,h=-1/u,f=z(D,u,l,c);n=z(R,h,f[0][0],f[0][1]),i=z(R,h,f[1][0],f[1][1])}else{var p,d;c?(p=R,d=D):(p=D,d=R),n=[[l-p,c-d],[l+p,c-d]],i=[[l-p,c+d],[l+p,c+d]]}return\"M\"+n.join(\"L\")+\"L\"+i.reverse().join(\"L\")+\"Z\"}function tt(t,e){return e=Math.max(Math.min(e,m),x),tp?(t-1&&1===t&&b(e,u,[s.xaxis],[s.yaxis],s.id,W),r.indexOf(\"event\")>-1&&v.click(u,e,s.id)}W.prepFn=function(t,n,a){var l=u._fullLayout.dragmode,h=F.getBoundingClientRect();u._fullLayout._calcInverseTransform(u);var p=u._fullLayout._invTransform;e=u._fullLayout._invScaleX,r=u._fullLayout._invScaleY;var d=o.apply3DTransform(p)(n-h.left,a-h.top);if(B=d[0],N=d[1],L){var y=E.findPolygonOffset(m,C[0],C[1],L);B+=A+y[0],N+=M+y[1]}switch(l){case\"zoom\":W.clickFn=st,c||(W.moveFn=L?it:rt,W.doneFn=at,function(){j=null,U=null,V=s.pathSubplot(),q=!1;var t=u._fullLayout[s.id];H=i(t.bgcolor).getLuminance(),(G=g.makeZoombox(f,H,T,k,V)).attr(\"fill-rule\",\"evenodd\"),Z=g.makeCorners(f,T,k),w(u)}());break;case\"select\":case\"lasso\":_(t,n,a,W,l)}},y.init(W)},N.updateRadialDrag=function(t,e,r){var i=this,c=i.gd,u=i.layers,h=i.radius,f=i.innerRadius,p=i.cx,d=i.cy,m=i.radialAxis,v=S.radialDragBoxSize,x=v/2;if(m.visible){var _,b,T,M=R(i.radialAxisAngle),E=m._rl,C=E[0],L=E[1],I=E[r],P=.75*(E[1]-E[0])/(1-i.getHole(e))/h;r?(_=p+(h+x)*Math.cos(M),b=d-(h+x)*Math.sin(M),T=\"radialdrag\"):(_=p+(f-x)*Math.cos(M),b=d-(f-x)*Math.sin(M),T=\"radialdrag-inner\");var z,O,D,B=g.makeRectDragger(u,T,\"crosshair\",-x,-x,v,v),N={element:B,gd:c};!1===t.dragmode&&(N.dragmode=!1),V(n.select(B),m.visible&&f0==(r?D>C:Dn?function(t){return t<=0}:function(t){return t>=0};t.c2g=function(r){var n=t.c2l(r)-e;return(s(n)?n:0)+o},t.g2c=function(r){return t.l2c(r+e-o)},t.g2p=function(t){return t*a},t.c2p=function(e){return t.g2p(t.c2g(e))}}}(t,e);break;case\"angularaxis\":!function(t,e){var r=t.type;if(\"linear\"===r){var i=t.d2c,s=t.c2d;t.d2c=function(t,e){return function(t,e){return\"degrees\"===e?a(t):t}(i(t),e)},t.c2d=function(t,e){return s(function(t,e){return\"degrees\"===e?o(t):t}(t,e))}}t.makeCalcdata=function(e,r){var n,i,a=e[r],o=e._length,s=function(r){return t.d2c(r,e.thetaunit)};if(a)for(n=new Array(o),i=0;i0?1:0}function r(t){var e=t[0],r=t[1];if(!isFinite(e)||!isFinite(r))return[1,0];var n=(e+1)*(e+1)+r*r;return[(e*e+r*r-1)/n,2*r/n]}function n(t,e){var r=e[0],n=e[1];return[r*t.radius+t.cx,-n*t.radius+t.cy]}function i(t,e){return e*t.radius}t.exports={smith:r,reactanceArc:function(t,e,a,o){var s=n(t,r([a,e])),l=s[0],c=s[1],u=n(t,r([o,e])),h=u[0],f=u[1];if(0===e)return[\"M\"+l+\",\"+c,\"L\"+h+\",\"+f].join(\" \");var p=i(t,1/Math.abs(e));return[\"M\"+l+\",\"+c,\"A\"+p+\",\"+p+\" 0 0,\"+(e<0?1:0)+\" \"+h+\",\"+f].join(\" \")},resistanceArc:function(t,a,o,s){var l=i(t,1/(a+1)),c=n(t,r([a,o])),u=c[0],h=c[1],f=n(t,r([a,s])),p=f[0],d=f[1];if(e(o)!==e(s)){var m=n(t,r([a,0]));return[\"M\"+u+\",\"+h,\"A\"+l+\",\"+l+\" 0 0,\"+(00){for(var n=[],i=0;i=u&&(f.min=0,d.min=0,g.min=0,t.aaxis&&delete t.aaxis.min,t.baxis&&delete t.baxis.min,t.caxis&&delete t.caxis.min)}function m(t,e,r,n){var i=f[e._name];function o(r,n){return a.coerce(t,e,i,r,n)}o(\"uirevision\",n.uirevision),e.type=\"linear\";var p=o(\"color\"),d=p!==i.color.dflt?p:r.font.color,m=e._name.charAt(0).toUpperCase(),g=\"Component \"+m,y=o(\"title.text\",g);e._hovertitle=y===g?y:m,a.coerceFont(o,\"title.font\",r.font,{overrideDflt:{size:a.bigFont(r.font.size),color:d}}),o(\"min\"),u(t,e,o,\"linear\"),l(t,e,o,\"linear\"),s(t,e,o,\"linear\",{noAutotickangles:!0,noTicklabelshift:!0,noTicklabelstandoff:!0}),c(t,e,o,{outerTicks:!0}),o(\"showticklabels\")&&(a.coerceFont(o,\"tickfont\",r.font,{overrideDflt:{color:d}}),o(\"tickangle\"),o(\"tickformat\")),h(t,e,o,{dfltColor:p,bgColor:r.bgColor,blend:60,showLine:!0,showGrid:!0,noZeroLine:!0,attributes:i}),o(\"hoverformat\"),o(\"layer\")}t.exports=function(t,e,r){o(t,e,r,{type:\"ternary\",attributes:f,handleDefaults:d,font:e.font,paper_bgcolor:e.paper_bgcolor})}},83637:function(t,e,r){\"use strict\";var n=r(45568),i=r(65657),a=r(33626),o=r(34809),s=o.strTranslate,l=o._,c=r(78766),u=r(62203),h=r(19091),f=r(93049).extendFlat,p=r(44122),d=r(29714),m=r(14751),g=r(32141),y=r(70414),v=y.freeMode,x=y.rectMode,_=r(17240),b=r(44844).prepSelect,w=r(44844).selectOnClick,T=r(44844).clearOutline,k=r(44844).clearSelectionsCache,A=r(54826);function M(t,e){this.id=t.id,this.graphDiv=t.graphDiv,this.init(e),this.makeFramework(e),this.updateFx(e),this.aTickLayout=null,this.bTickLayout=null,this.cTickLayout=null}t.exports=M;var S=M.prototype;S.init=function(t){this.container=t._ternarylayer,this.defs=t._defs,this.layoutId=t._uid,this.traceHash={},this.layers={}},S.plot=function(t,e){var r=this,n=e[r.id],i=e._size;r._hasClipOnAxisFalse=!1;for(var a=0;aE*_?i=(a=_)*E:a=(i=x)/E,o=y*i/x,l=v*a/_,r=e.l+e.w*m-i/2,n=e.t+e.h*(1-g)-a/2,p.x0=r,p.y0=n,p.w=i,p.h=a,p.sum=b,p.xaxis={type:\"linear\",range:[w+2*k-b,b-w-2*T],domain:[m-o/2,m+o/2],_id:\"x\"},h(p.xaxis,p.graphDiv._fullLayout),p.xaxis.setScale(),p.xaxis.isPtWithinRange=function(t){return t.a>=p.aaxis.range[0]&&t.a<=p.aaxis.range[1]&&t.b>=p.baxis.range[1]&&t.b<=p.baxis.range[0]&&t.c>=p.caxis.range[1]&&t.c<=p.caxis.range[0]},p.yaxis={type:\"linear\",range:[w,b-T-k],domain:[g-l/2,g+l/2],_id:\"y\"},h(p.yaxis,p.graphDiv._fullLayout),p.yaxis.setScale(),p.yaxis.isPtWithinRange=function(){return!0};var A=p.yaxis.domain[0],M=p.aaxis=f({},t.aaxis,{range:[w,b-T-k],side:\"left\",tickangle:(+t.aaxis.tickangle||0)-30,domain:[A,A+l*E],anchor:\"free\",position:0,_id:\"y\",_length:i});h(M,p.graphDiv._fullLayout),M.setScale();var S=p.baxis=f({},t.baxis,{range:[b-w-k,T],side:\"bottom\",domain:p.xaxis.domain,anchor:\"free\",position:0,_id:\"x\",_length:i});h(S,p.graphDiv._fullLayout),S.setScale();var C=p.caxis=f({},t.caxis,{range:[b-w-T,k],side:\"right\",tickangle:(+t.caxis.tickangle||0)+30,domain:[A,A+l*E],anchor:\"free\",position:0,_id:\"y\",_length:i});h(C,p.graphDiv._fullLayout),C.setScale();var L=\"M\"+r+\",\"+(n+a)+\"h\"+i+\"l-\"+i/2+\",-\"+a+\"Z\";p.clipDef.select(\"path\").attr(\"d\",L),p.layers.plotbg.select(\"path\").attr(\"d\",L);var I=\"M0,\"+a+\"h\"+i+\"l-\"+i/2+\",-\"+a+\"Z\";p.clipDefRelative.select(\"path\").attr(\"d\",I);var P=s(r,n);p.plotContainer.selectAll(\".scatterlayer,.maplayer\").attr(\"transform\",P),p.clipDefRelative.select(\"path\").attr(\"transform\",null);var z=s(r-S._offset,n+a);p.layers.baxis.attr(\"transform\",z),p.layers.bgrid.attr(\"transform\",z);var O=s(r+i/2,n)+\"rotate(30)\"+s(0,-M._offset);p.layers.aaxis.attr(\"transform\",O),p.layers.agrid.attr(\"transform\",O);var D=s(r+i/2,n)+\"rotate(-30)\"+s(0,-C._offset);p.layers.caxis.attr(\"transform\",D),p.layers.cgrid.attr(\"transform\",D),p.drawAxes(!0),p.layers.aline.select(\"path\").attr(\"d\",M.showline?\"M\"+r+\",\"+(n+a)+\"l\"+i/2+\",-\"+a:\"M0,0\").call(c.stroke,M.linecolor||\"#000\").style(\"stroke-width\",(M.linewidth||0)+\"px\"),p.layers.bline.select(\"path\").attr(\"d\",S.showline?\"M\"+r+\",\"+(n+a)+\"h\"+i:\"M0,0\").call(c.stroke,S.linecolor||\"#000\").style(\"stroke-width\",(S.linewidth||0)+\"px\"),p.layers.cline.select(\"path\").attr(\"d\",C.showline?\"M\"+(r+i/2)+\",\"+n+\"l\"+i/2+\",\"+a:\"M0,0\").call(c.stroke,C.linecolor||\"#000\").style(\"stroke-width\",(C.linewidth||0)+\"px\"),p.graphDiv._context.staticPlot||p.initInteractions(),u.setClipUrl(p.layers.frontplot,p._hasClipOnAxisFalse?null:p.clipId,p.graphDiv)},S.drawAxes=function(t){var e=this,r=e.graphDiv,n=e.id.substr(7)+\"title\",i=e.layers,a=e.aaxis,o=e.baxis,s=e.caxis;if(e.drawAx(a),e.drawAx(o),e.drawAx(s),t){var c=Math.max(a.showticklabels?a.tickfont.size/2:0,(s.showticklabels?.75*s.tickfont.size:0)+(\"outside\"===s.ticks?.87*s.ticklen:0)),u=(o.showticklabels?o.tickfont.size:0)+(\"outside\"===o.ticks?o.ticklen:0)+3;i[\"a-title\"]=_.draw(r,\"a\"+n,{propContainer:a,propName:e.id+\".aaxis.title\",placeholder:l(r,\"Click to enter Component A title\"),attributes:{x:e.x0+e.w/2,y:e.y0-a.title.font.size/3-c,\"text-anchor\":\"middle\"}}),i[\"b-title\"]=_.draw(r,\"b\"+n,{propContainer:o,propName:e.id+\".baxis.title\",placeholder:l(r,\"Click to enter Component B title\"),attributes:{x:e.x0-u,y:e.y0+e.h+.83*o.title.font.size+u,\"text-anchor\":\"middle\"}}),i[\"c-title\"]=_.draw(r,\"c\"+n,{propContainer:s,propName:e.id+\".caxis.title\",placeholder:l(r,\"Click to enter Component C title\"),attributes:{x:e.x0+e.w+u,y:e.y0+e.h+.83*s.title.font.size+u,\"text-anchor\":\"middle\"}})}},S.drawAx=function(t){var e,r=this,n=r.graphDiv,i=t._name,a=i.charAt(0),s=t._id,l=r.layers[i],c=a+\"tickLayout\",u=(e=t).ticks+String(e.ticklen)+String(e.showticklabels);r[c]!==u&&(l.selectAll(\".\"+s+\"tick\").remove(),r[c]=u),t.setScale();var h=d.calcTicks(t),f=d.clipEnds(t,h),p=d.makeTransTickFn(t),m=d.getTickSigns(t)[2],g=o.deg2rad(30),y=m*(t.linewidth||1)/2,v=m*t.ticklen,x=r.w,_=r.h,b=\"b\"===a?\"M0,\"+y+\"l\"+Math.sin(g)*v+\",\"+Math.cos(g)*v:\"M\"+y+\",0l\"+Math.cos(g)*v+\",\"+-Math.sin(g)*v,w={a:\"M0,0l\"+_+\",-\"+x/2,b:\"M0,0l-\"+x/2+\",-\"+_,c:\"M0,0l-\"+_+\",\"+x/2}[a];d.drawTicks(n,t,{vals:\"inside\"===t.ticks?f:h,layer:l,path:b,transFn:p,crisp:!1}),d.drawGrid(n,t,{vals:f,layer:r.layers[a+\"grid\"],path:w,transFn:p,crisp:!1}),d.drawLabels(n,t,{vals:h,layer:l,transFn:p,labelFns:d.makeLabelFns(t,0,30)})};var C=A.MINZOOM/2+.87,L=\"m-0.87,.5h\"+C+\"v3h-\"+(C+5.2)+\"l\"+(C/2+2.6)+\",-\"+(.87*C+4.5)+\"l2.6,1.5l-\"+C/2+\",\"+.87*C+\"Z\",I=\"m0.87,.5h-\"+C+\"v3h\"+(C+5.2)+\"l-\"+(C/2+2.6)+\",-\"+(.87*C+4.5)+\"l-2.6,1.5l\"+C/2+\",\"+.87*C+\"Z\",P=\"m0,1l\"+C/2+\",\"+.87*C+\"l2.6,-1.5l-\"+(C/2+2.6)+\",-\"+(.87*C+4.5)+\"l-\"+(C/2+2.6)+\",\"+(.87*C+4.5)+\"l2.6,1.5l\"+C/2+\",-\"+.87*C+\"Z\",z=!0;function O(t){n.select(t).selectAll(\".zoombox,.js-zoombox-backdrop,.js-zoombox-menu,.zoombox-corners\").remove()}S.clearOutline=function(){k(this.dragOptions),T(this.dragOptions.gd)},S.initInteractions=function(){var t,e,r,n,h,f,p,d,y,_,T,k,M=this,S=M.layers.plotbg.select(\"path\").node(),C=M.graphDiv,D=C._fullLayout._zoomlayer;function R(t){var e={};return e[M.id+\".aaxis.min\"]=t.a,e[M.id+\".baxis.min\"]=t.b,e[M.id+\".caxis.min\"]=t.c,e}function F(t,e){var r=C._fullLayout.clickmode;O(C),2===t&&(C.emit(\"plotly_doubleclick\",null),a.call(\"_guiRelayout\",C,R({a:0,b:0,c:0}))),r.indexOf(\"select\")>-1&&1===t&&w(e,C,[M.xaxis],[M.yaxis],M.id,M.dragOptions),r.indexOf(\"event\")>-1&&g.click(C,e,M.id)}function B(t,e){return 1-e/M.h}function N(t,e){return 1-(t+(M.h-e)/Math.sqrt(3))/M.w}function j(t,e){return(t-(M.h-e)/Math.sqrt(3))/M.w}function U(i,a){var o=r+i*t,s=n+a*e,l=Math.max(0,Math.min(1,B(0,n),B(0,s))),c=Math.max(0,Math.min(1,N(r,n),N(o,s))),u=Math.max(0,Math.min(1,j(r,n),j(o,s))),m=(l/2+u)*M.w,g=(1-l/2-c)*M.w,v=(m+g)/2,x=g-m,b=(1-l)*M.h,w=b-x/E;x.2?\"rgba(0,0,0,0.4)\":\"rgba(255,255,255,0.3)\").duration(200),k.transition().style(\"opacity\",1).duration(200),_=!0),C.emit(\"plotly_relayouting\",R(p))}function V(){O(C),p!==h&&(a.call(\"_guiRelayout\",C,R(p)),z&&C.data&&C._context.showTips&&(o.notifier(l(C,\"Double-click to zoom back out\"),\"long\"),z=!1))}function q(t,e){var r=t/M.xaxis._m,n=e/M.yaxis._m,i=[(p={a:h.a-n,b:h.b+(r+n)/2,c:h.c-(r-n)/2}).a,p.b,p.c].sort(o.sorterAsc),a=i.indexOf(p.a),l=i.indexOf(p.b),c=i.indexOf(p.c);i[0]<0&&(i[1]+i[0]/2<0?(i[2]+=i[0]+i[1],i[0]=i[1]=0):(i[2]+=i[0]/2,i[1]+=i[0]/2,i[0]=0),p={a:i[a],b:i[l],c:i[c]},e=(h.a-p.a)*M.yaxis._m,t=(h.c-p.c-h.b+p.b)*M.xaxis._m);var f=s(M.x0+t,M.y0+e);M.plotContainer.selectAll(\".scatterlayer,.maplayer\").attr(\"transform\",f);var d=s(-t,-e);M.clipDefRelative.select(\"path\").attr(\"transform\",d),M.aaxis.range=[p.a,M.sum-p.b-p.c],M.baxis.range=[M.sum-p.a-p.c,p.b],M.caxis.range=[M.sum-p.a-p.b,p.c],M.drawAxes(!1),M._hasClipOnAxisFalse&&M.plotContainer.select(\".scatterlayer\").selectAll(\".trace\").call(u.hideOutsideRangePoints,M),C.emit(\"plotly_relayouting\",R(p))}function H(){a.call(\"_guiRelayout\",C,R(p))}this.dragOptions={element:S,gd:C,plotinfo:{id:M.id,domain:C._fullLayout[M.id].domain,xaxis:M.xaxis,yaxis:M.yaxis},subplot:M.id,prepFn:function(a,l,u){M.dragOptions.xaxes=[M.xaxis],M.dragOptions.yaxes=[M.yaxis],t=C._fullLayout._invScaleX,e=C._fullLayout._invScaleY;var m=M.dragOptions.dragmode=C._fullLayout.dragmode;v(m)?M.dragOptions.minDrag=1:M.dragOptions.minDrag=void 0,\"zoom\"===m?(M.dragOptions.moveFn=U,M.dragOptions.clickFn=F,M.dragOptions.doneFn=V,function(t,e,a){var l=S.getBoundingClientRect();r=e-l.left,n=a-l.top,C._fullLayout._calcInverseTransform(C);var u=C._fullLayout._invTransform,m=o.apply3DTransform(u)(r,n);r=m[0],n=m[1],h={a:M.aaxis.range[0],b:M.baxis.range[1],c:M.caxis.range[1]},p=h,f=M.aaxis.range[1]-h.a,d=i(M.graphDiv._fullLayout[M.id].bgcolor).getLuminance(),y=\"M0,\"+M.h+\"L\"+M.w/2+\", 0L\"+M.w+\",\"+M.h+\"Z\",_=!1,T=D.append(\"path\").attr(\"class\",\"zoombox\").attr(\"transform\",s(M.x0,M.y0)).style({fill:d>.2?\"rgba(0,0,0,0)\":\"rgba(255,255,255,0)\",\"stroke-width\":0}).attr(\"d\",y),k=D.append(\"path\").attr(\"class\",\"zoombox-corners\").attr(\"transform\",s(M.x0,M.y0)).style({fill:c.background,stroke:c.defaultLine,\"stroke-width\":1,opacity:0}).attr(\"d\",\"M0,0Z\"),M.clearOutline(C)}(0,l,u)):\"pan\"===m?(M.dragOptions.moveFn=q,M.dragOptions.clickFn=F,M.dragOptions.doneFn=H,h={a:M.aaxis.range[0],b:M.baxis.range[1],c:M.caxis.range[1]},p=h,M.clearOutline(C)):(x(m)||v(m))&&b(a,l,u,M.dragOptions,m)}},S.onmousemove=function(t){g.hover(C,t,M.id),C._fullLayout._lasthover=S,C._fullLayout._hoversubplot=M.id},S.onmouseout=function(t){C._dragging||m.unhover(C,t)},m.init(this.dragOptions)}},33626:function(t,e,r){\"use strict\";var n=r(48636),i=r(4969),a=r(36539),o=r(56174),s=r(95425).addStyleRule,l=r(93049),c=r(9829),u=r(6704),h=l.extendFlat,f=l.extendDeepAll;function p(t){var i=t.name,a=t.categories,o=t.meta;if(e.modules[i])n.log(\"Type \"+i+\" already registered\");else{e.subplotsRegistry[t.basePlotModule.name]||function(t){var r=t.name;if(e.subplotsRegistry[r])n.log(\"Plot type \"+r+\" already registered.\");else for(var i in y(t),e.subplotsRegistry[r]=t,e.componentsRegistry)_(i,t.name)}(t.basePlotModule);for(var l={},c=0;c-1&&(h[p[r]].title={text:\"\"});for(r=0;r\")?\"\":e.html(t).text()}));return e.remove(),r}(w)).replace(/&(?!\\w+;|\\#[0-9]+;| \\#x[0-9A-F]+;)/g,\"&\")).replace(u,\"'\"),i.isIE()&&(w=(w=(w=w.replace(/\"/gi,\"'\")).replace(/(\\('#)([^']*)('\\))/gi,'(\"#$2\")')).replace(/(\\\\')/gi,'\"')),w}},35374:function(t,e,r){\"use strict\";var n=r(34809);t.exports=function(t,e){for(var r=0;rh+c||!n(u))}for(var p=0;p=0)return t}else if(\"string\"==typeof t&&\"%\"===(t=t.trim()).slice(-1)&&n(t.slice(0,-1))&&(t=+t.slice(0,-1))>=0)return t+\"%\"}function d(t,e,r,n,a,o){var s=!(!1===(o=o||{}).moduleHasSelected),l=!(!1===o.moduleHasUnselected),c=!(!1===o.moduleHasConstrain),u=!(!1===o.moduleHasCliponaxis),h=!(!1===o.moduleHasTextangle),p=!(!1===o.moduleHasInsideanchor),d=!!o.hasPathbar,m=Array.isArray(a)||\"auto\"===a,g=m||\"inside\"===a,y=m||\"outside\"===a;if(g||y){var v=f(n,\"textfont\",r.font),x=i.extendFlat({},v),_=!(t.textfont&&t.textfont.color);if(_&&delete x.color,f(n,\"insidetextfont\",x),d){var b=i.extendFlat({},v);_&&delete b.color,f(n,\"pathbar.textfont\",b)}y&&f(n,\"outsidetextfont\",v),s&&n(\"selected.textfont.color\"),l&&n(\"unselected.textfont.color\"),c&&n(\"constraintext\"),u&&n(\"cliponaxis\"),h&&n(\"textangle\"),n(\"texttemplate\")}g&&p&&n(\"insidetextanchor\")}t.exports={supplyDefaults:function(t,e,r,n){function u(r,n){return i.coerce(t,e,h,r,n)}if(s(t,e,n,u)){l(t,e,n,u),u(\"xhoverformat\"),u(\"yhoverformat\"),u(\"zorder\"),u(\"orientation\",e.x&&!e.y?\"h\":\"v\"),u(\"base\"),u(\"offset\"),u(\"width\"),u(\"text\"),u(\"hovertext\"),u(\"hovertemplate\");var f=u(\"textposition\");d(t,0,n,u,f,{moduleHasSelected:!0,moduleHasUnselected:!0,moduleHasConstrain:!0,moduleHasCliponaxis:!0,moduleHasTextangle:!0,moduleHasInsideanchor:!0}),c(t,e,u,r,n);var p=(e.marker.line||{}).color,m=o.getComponentMethod(\"errorbars\",\"supplyDefaults\");m(t,e,p||a.defaultLine,{axis:\"y\"}),m(t,e,p||a.defaultLine,{axis:\"x\",inherit:\"y\"}),i.coerceSelectionMarkerOpacity(e,u)}else e.visible=!1},crossTraceDefaults:function(t,e){var r,n;function a(t,e){return i.coerce(n._input,n,h,t,e)}for(var o=0;oa))return e}return void 0!==r?r:t.dflt},e.coerceColor=function(t,e,r){return i(e).isValid()?e:void 0!==r?r:t.dflt},e.coerceEnumerated=function(t,e,r){return t.coerceNumber&&(e=+e),-1!==t.values.indexOf(e)?e:void 0!==r?r:t.dflt},e.getValue=function(t,e){var r;return a(t)?e0?e+=r:u<0&&(e-=r)}return e}function O(t){var e=u,r=t.b,i=z(t);return n.inbox(r-e,i-e,b+(i-e)/(i-r)-1)}var D=t[h+\"a\"],R=t[f+\"a\"];m=Math.abs(D.r2c(D.range[1])-D.r2c(D.range[0]));var F=n.getDistanceFunction(i,p,d,(function(t){return(p(t)+d(t))/2}));if(n.getClosest(g,F,t),!1!==t.index&&g[t.index].p!==c){k||(C=function(t){return Math.min(A(t),t.p-v.bargroupwidth/2)},L=function(t){return Math.max(M(t),t.p+v.bargroupwidth/2)});var B=g[t.index],N=y.base?B.b+B.s:B.s;t[f+\"0\"]=t[f+\"1\"]=R.c2p(B[f],!0),t[f+\"LabelVal\"]=N;var j=v.extents[v.extents.round(B.p)];t[h+\"0\"]=D.c2p(x?C(B):j[0],!0),t[h+\"1\"]=D.c2p(x?L(B):j[1],!0);var U=void 0!==B.orig_p;return t[h+\"LabelVal\"]=U?B.orig_p:B.p,t.labelLabel=l(D,t[h+\"LabelVal\"],y[h+\"hoverformat\"]),t.valueLabel=l(R,t[f+\"LabelVal\"],y[f+\"hoverformat\"]),t.baseLabel=l(R,B.b,y[f+\"hoverformat\"]),t.spikeDistance=(function(t){var e=u,r=t.b,i=z(t);return n.inbox(r-e,i-e,w+(i-e)/(i-r)-1)}(B)+function(t){return I(A(t),M(t),w)}(B))/2,t[h+\"Spike\"]=D.c2p(B.p,!0),o(B,y,t),t.hovertemplate=y.hovertemplate,t}}function h(t,e){var r=e.mcc||t.marker.color,n=e.mlcc||t.marker.line.color,i=s(t,e);return a.opacity(r)?r:a.opacity(n)&&i?n:void 0}t.exports={hoverPoints:function(t,e,r,n,a){var o=u(t,e,r,n,a);if(o){var s=o.cd,l=s[0].trace,c=s[o.index];return o.color=h(l,c),i.getComponentMethod(\"errorbars\",\"hoverInfo\")(c,l,o),[o]}},hoverOnBars:u,getTraceColor:h}},58218:function(t,e,r){\"use strict\";t.exports={attributes:r(81481),layoutAttributes:r(25412),supplyDefaults:r(17550).supplyDefaults,crossTraceDefaults:r(17550).crossTraceDefaults,supplyLayoutDefaults:r(78931),calc:r(67565),crossTraceCalc:r(24782).crossTraceCalc,colorbar:r(21146),arraysToCalcdata:r(35374),plot:r(32995).plot,style:r(6851).style,styleOnSelect:r(6851).styleOnSelect,hoverPoints:r(91664).hoverPoints,eventData:r(59541),selectPoints:r(88384),moduleType:\"trace\",name:\"bar\",basePlotModule:r(37703),categories:[\"bar-like\",\"cartesian\",\"svg\",\"bar\",\"oriented\",\"errorBarsOK\",\"showLegend\",\"zoomScale\"],animatable:!0,meta:{}}},25412:function(t){\"use strict\";t.exports={barmode:{valType:\"enumerated\",values:[\"stack\",\"group\",\"overlay\",\"relative\"],dflt:\"group\",editType:\"calc\"},barnorm:{valType:\"enumerated\",values:[\"\",\"fraction\",\"percent\"],dflt:\"\",editType:\"calc\"},bargap:{valType:\"number\",min:0,max:1,editType:\"calc\"},bargroupgap:{valType:\"number\",min:0,max:1,dflt:0,editType:\"calc\"},barcornerradius:{valType:\"any\",editType:\"calc\"}}},78931:function(t,e,r){\"use strict\";var n=r(33626),i=r(29714),a=r(34809),o=r(25412),s=r(17550).validateCornerradius;t.exports=function(t,e,r){function l(r,n){return a.coerce(t,e,o,r,n)}for(var c=!1,u=!1,h=!1,f={},p=l(\"barmode\"),d=0;d0)-(t<0)}function A(t,e){return t0}function E(t,e,r,n,i){return!(t<0||e<0)&&(r<=t&&n<=e||r<=e&&n<=t||(i?t>=r*(e/n):e>=n*(t/r)))}function C(t){return\"auto\"===t?0:t}function L(t,e){var r=Math.PI/180*e,n=Math.abs(Math.sin(r)),i=Math.abs(Math.cos(r));return{x:t.width*i+t.height*n,y:t.width*n+t.height*i}}function I(t,e,r,n,i,a){var o=!!a.isHorizontal,s=!!a.constrained,l=a.angle||0,c=a.anchor,u=\"end\"===c,h=\"start\"===c,f=((a.leftToRight||0)+1)/2,p=1-f,d=a.hasB,m=a.r,g=a.overhead,y=i.width,v=i.height,x=Math.abs(e-t),_=Math.abs(n-r),w=x>2*b&&_>2*b?b:0;x-=2*w,_-=2*w;var T=C(l);\"auto\"!==l||y<=x&&v<=_||!(y>x||v>_)||(y>_||v>x)&&yb){var E=function(t,e,r,n,i,a,o,s,l){var c,u,h,f,p=Math.max(0,Math.abs(e-t)-2*b),d=Math.max(0,Math.abs(n-r)-2*b),m=a-b,g=o?m-Math.sqrt(m*m-(m-o)*(m-o)):m,y=l?2*m:s?m-o:2*g,v=l?2*m:s?2*g:m-o;return i.y/i.x>=d/(p-y)?f=d/i.y:i.y/i.x<=(d-v)/p?f=p/i.x:!l&&s?(c=i.x*i.x+i.y*i.y/4,h=(p-m)*(p-m)+(d/2-m)*(d/2-m)-m*m,f=(-(u=-2*i.x*(p-m)-i.y*(d/2-m))+Math.sqrt(u*u-4*c*h))/(2*c)):l?(c=(i.x*i.x+i.y*i.y)/4,h=(p/2-m)*(p/2-m)+(d/2-m)*(d/2-m)-m*m,f=(-(u=-i.x*(p/2-m)-i.y*(d/2-m))+Math.sqrt(u*u-4*c*h))/(2*c)):(c=i.x*i.x/4+i.y*i.y,h=(p/2-m)*(p/2-m)+(d-m)*(d-m)-m*m,f=(-(u=-i.x*(p/2-m)-2*i.y*(d-m))+Math.sqrt(u*u-4*c*h))/(2*c)),{scale:f=Math.min(1,f),pad:s?Math.max(0,m-Math.sqrt(Math.max(0,m*m-(m-(d-i.y*f)/2)*(m-(d-i.y*f)/2)))-o):Math.max(0,m-Math.sqrt(Math.max(0,m*m-(m-(p-i.x*f)/2)*(m-(p-i.x*f)/2)))-o)}}(t,e,r,n,S,m,g,o,d);k=E.scale,M=E.pad}else k=1,s&&(k=Math.min(1,x/S.x,_/S.y)),M=0;var I=i.left*p+i.right*f,P=(i.top+i.bottom)/2,z=(t+b)*p+(e-b)*f,O=(r+n)/2,D=0,R=0;if(h||u){var F=(o?S.x:S.y)/2;m&&(u||d)&&(w+=M);var B=o?A(t,e):A(r,n);o?h?(z=t+B*w,D=-B*F):(z=e-B*w,D=B*F):h?(O=r+B*w,R=-B*F):(O=n-B*w,R=B*F)}return{textX:I,textY:P,targetX:z,targetY:O,anchorX:D,anchorY:R,scale:k,rotate:T}}t.exports={plot:function(t,e,r,h,g,y){var w=e.xaxis,P=e.yaxis,z=t._fullLayout,O=t._context.staticPlot;g||(g={mode:z.barmode,norm:z.barmode,gap:z.bargap,groupgap:z.bargroupgap},p(\"bar\",z));var D=a.makeTraceGroups(h,r,\"trace bars\").each((function(r){var c=n.select(this),h=r[0].trace,p=r[0].t,D=\"waterfall\"===h.type,R=\"funnel\"===h.type,F=\"histogram\"===h.type,B=\"bar\"===h.type,N=B||R,j=0;D&&h.connector.visible&&\"between\"===h.connector.mode&&(j=h.connector.line.width/2);var U=\"h\"===h.orientation,V=S(g),q=a.ensureSingle(c,\"g\",\"points\"),H=T(h),G=q.selectAll(\"g.point\").data(a.identity,H);G.enter().append(\"g\").classed(\"point\",!0),G.exit().remove(),G.each((function(c,T){var S,D,R=n.select(this),q=function(t,e,r,n){var i=[],a=[],o=n?e:r,s=n?r:e;return i[0]=o.c2p(t.s0,!0),a[0]=s.c2p(t.p0,!0),i[1]=o.c2p(t.s1,!0),a[1]=s.c2p(t.p1,!0),n?[i,a]:[a,i]}(c,w,P,U),H=q[0][0],G=q[0][1],Z=q[1][0],W=q[1][1],Y=0==(U?G-H:W-Z);if(Y&&N&&m.getLineWidth(h,c)&&(Y=!1),Y||(Y=!(i(H)&&i(G)&&i(Z)&&i(W))),c.isBlank=Y,Y&&(U?G=H:W=Z),j&&!Y&&(U?(H-=A(H,G)*j,G+=A(H,G)*j):(Z-=A(Z,W)*j,W+=A(Z,W)*j)),\"waterfall\"===h.type){if(!Y){var X=h[c.dir].marker;S=X.line.width,D=X.color}}else S=m.getLineWidth(h,c),D=c.mc||h.marker.color;function $(t){var e=n.round(S/2%1,2);return 0===g.gap&&0===g.groupgap?n.round(Math.round(t)-e,2):t}var J=s.opacity(D)<1||S>.01?$:function(t,e,r){return r&&t===e?t:Math.abs(t-e)>=2?$(t):t>e?Math.ceil(t):Math.floor(t)};t._context.staticPlot||(H=J(H,G,U),G=J(G,H,U),Z=J(Z,W,!U),W=J(W,Z,!U));var K,Q=U?w.c2p:P.c2p;K=c.s0>0?c._sMax:c.s0<0?c._sMin:c.s1>0?c._sMax:c._sMin;var tt,et,rt=B||F?function(t,e){if(!t)return 0;var r,n=U?Math.abs(W-Z):Math.abs(G-H),i=U?Math.abs(G-H):Math.abs(W-Z),a=J(Math.abs(Q(K,!0)-Q(0,!0))),o=c.hasB?Math.min(n/2,i/2):Math.min(n/2,a);return r=\"%\"===e?n*(Math.min(50,t)/100):t,J(Math.max(Math.min(r,o),0))}(p.cornerradiusvalue,p.cornerradiusform):0,nt=\"M\"+H+\",\"+Z+\"V\"+W+\"H\"+G+\"V\"+Z+\"Z\",it=0;if(rt&&c.s){var at=0===k(c.s0)||k(c.s)===k(c.s0)?c.s1:c.s0;if((it=J(c.hasB?0:Math.abs(Q(K,!0)-Q(at,!0))))0?Math.sqrt(it*(2*rt-it)):0,ht=ot>0?Math.max:Math.min;tt=\"M\"+H+\",\"+Z+\"V\"+(W-ct*st)+\"H\"+ht(G-(rt-it)*ot,H)+\"A \"+rt+\",\"+rt+\" 0 0 \"+lt+\" \"+G+\",\"+(W-rt*st-ut)+\"V\"+(Z+rt*st+ut)+\"A \"+rt+\",\"+rt+\" 0 0 \"+lt+\" \"+ht(G-(rt-it)*ot,H)+\",\"+(Z+ct*st)+\"Z\"}else if(c.hasB)tt=\"M\"+(H+rt*ot)+\",\"+Z+\"A \"+rt+\",\"+rt+\" 0 0 \"+lt+\" \"+H+\",\"+(Z+rt*st)+\"V\"+(W-rt*st)+\"A \"+rt+\",\"+rt+\" 0 0 \"+lt+\" \"+(H+rt*ot)+\",\"+W+\"H\"+(G-rt*ot)+\"A \"+rt+\",\"+rt+\" 0 0 \"+lt+\" \"+G+\",\"+(W-rt*st)+\"V\"+(Z+rt*st)+\"A \"+rt+\",\"+rt+\" 0 0 \"+lt+\" \"+(G-rt*ot)+\",\"+Z+\"Z\";else{var ft=(et=Math.abs(W-Z)+it)0?Math.sqrt(it*(2*rt-it)):0,dt=st>0?Math.max:Math.min;tt=\"M\"+(H+ft*ot)+\",\"+Z+\"V\"+dt(W-(rt-it)*st,Z)+\"A \"+rt+\",\"+rt+\" 0 0 \"+lt+\" \"+(H+rt*ot-pt)+\",\"+W+\"H\"+(G-rt*ot+pt)+\"A \"+rt+\",\"+rt+\" 0 0 \"+lt+\" \"+(G-ft*ot)+\",\"+dt(W-(rt-it)*st,Z)+\"V\"+Z+\"Z\"}}else tt=nt}else tt=nt;var mt=M(a.ensureSingle(R,\"path\"),z,g,y);if(mt.style(\"vector-effect\",O?\"none\":\"non-scaling-stroke\").attr(\"d\",isNaN((G-H)*(W-Z))||Y&&t._context.staticPlot?\"M0,0Z\":tt).call(l.setClipUrl,e.layerClipId,t),!z.uniformtext.mode&&V){var gt=l.makePointStyleFns(h);l.singlePointStyle(c,mt,h,gt,t)}!function(t,e,r,n,i,s,c,h,p,g,y,w,T){var k,S=e.xaxis,P=e.yaxis,z=t._fullLayout;function O(e,r,n){return a.ensureSingle(e,\"text\").text(r).attr({class:\"bartext bartext-\"+k,\"text-anchor\":\"middle\",\"data-notex\":1}).call(l.font,n).call(o.convertToTspans,t)}var D=n[0].trace,R=\"h\"===D.orientation,F=function(t,e,r,n,i){var o,s=e[0].trace;return o=s.texttemplate?function(t,e,r,n,i){var o=e[0].trace,s=a.castOption(o,r,\"texttemplate\");if(!s)return\"\";var l,c,h,f,p=\"histogram\"===o.type,d=\"waterfall\"===o.type,m=\"funnel\"===o.type,g=\"h\"===o.orientation;function y(t){return u(f,f.c2l(t),!0).text}g?(l=\"y\",c=i,h=\"x\",f=n):(l=\"x\",c=n,h=\"y\",f=i);var v,x=e[r],b={};b.label=x.p,b.labelLabel=b[l+\"Label\"]=(v=x.p,u(c,c.c2l(v),!0).text);var w=a.castOption(o,x.i,\"text\");(0===w||w)&&(b.text=w),b.value=x.s,b.valueLabel=b[h+\"Label\"]=y(x.s);var T={};_(T,o,x.i),(p||void 0===T.x)&&(T.x=g?b.value:b.label),(p||void 0===T.y)&&(T.y=g?b.label:b.value),(p||void 0===T.xLabel)&&(T.xLabel=g?b.valueLabel:b.labelLabel),(p||void 0===T.yLabel)&&(T.yLabel=g?b.labelLabel:b.valueLabel),d&&(b.delta=+x.rawS||x.s,b.deltaLabel=y(b.delta),b.final=x.v,b.finalLabel=y(b.final),b.initial=b.final-b.delta,b.initialLabel=y(b.initial)),m&&(b.value=x.s,b.valueLabel=y(b.value),b.percentInitial=x.begR,b.percentInitialLabel=a.formatPercent(x.begR),b.percentPrevious=x.difR,b.percentPreviousLabel=a.formatPercent(x.difR),b.percentTotal=x.sumR,b.percenTotalLabel=a.formatPercent(x.sumR));var k=a.castOption(o,x.i,\"customdata\");return k&&(b.customdata=k),a.texttemplateString(s,b,t._d3locale,T,b,o._meta||{})}(t,e,r,n,i):s.textinfo?function(t,e,r,n){var i=t[0].trace,o=\"h\"===i.orientation,s=\"waterfall\"===i.type,l=\"funnel\"===i.type;function c(t){return u(o?r:n,+t,!0).text}var h,f,p=i.textinfo,d=t[e],m=p.split(\"+\"),g=[],y=function(t){return-1!==m.indexOf(t)};if(y(\"label\")&&g.push((f=t[e].p,u(o?n:r,f,!0).text)),y(\"text\")&&(0===(h=a.castOption(i,d.i,\"text\"))||h)&&g.push(h),s){var v=+d.rawS||d.s,x=d.v,_=x-v;y(\"initial\")&&g.push(c(_)),y(\"delta\")&&g.push(c(v)),y(\"final\")&&g.push(c(x))}if(l){y(\"value\")&&g.push(c(d.s));var b=0;y(\"percent initial\")&&b++,y(\"percent previous\")&&b++,y(\"percent total\")&&b++;var w=b>1;y(\"percent initial\")&&(h=a.formatPercent(d.begR),w&&(h+=\" of initial\"),g.push(h)),y(\"percent previous\")&&(h=a.formatPercent(d.difR),w&&(h+=\" of previous\"),g.push(h)),y(\"percent total\")&&(h=a.formatPercent(d.sumR),w&&(h+=\" of total\"),g.push(h))}return g.join(\"
\")}(e,r,n,i):m.getValue(s.text,r),m.coerceString(v,o)}(z,n,i,S,P);k=function(t,e){var r=m.getValue(t.textposition,e);return m.coerceEnumerated(x,r)}(D,i);var B=\"stack\"===w.mode||\"relative\"===w.mode,N=n[i],j=!B||N._outmost,U=N.hasB,V=g&&g-y>b;if(F&&\"none\"!==k&&(!N.isBlank&&s!==c&&h!==p||\"auto\"!==k&&\"inside\"!==k)){var q=z.font,H=d.getBarColor(n[i],D),G=d.getInsideTextFont(D,i,q,H),Z=d.getOutsideTextFont(D,i,q),W=D.insidetextanchor||\"end\",Y=r.datum();R?\"log\"===S.type&&Y.s0<=0&&(s=S.range[0]0&&K>0;it=V?U?E(rt-2*g,nt,J,K,R)||E(rt,nt-2*g,J,K,R):R?E(rt-(g-y),nt,J,K,R)||E(rt,nt-2*(g-y),J,K,R):E(rt,nt-(g-y),J,K,R)||E(rt-2*(g-y),nt,J,K,R):E(rt,nt,J,K,R),at&&it?k=\"inside\":(k=\"outside\",X.remove(),X=null)}else k=\"inside\";if(!X){var ot=(X=O(r,F,Q=a.ensureUniformFontSize(t,\"outside\"===k?Z:G))).attr(\"transform\");if(X.attr(\"transform\",\"\"),J=($=l.bBox(X.node())).width,K=$.height,X.attr(\"transform\",ot),J<=0||K<=0)return void X.remove()}var st,lt=D.textangle;st=\"outside\"===k?function(t,e,r,n,i,a){var o,s=!!a.isHorizontal,l=!!a.constrained,c=a.angle||0,u=i.width,h=i.height,f=Math.abs(e-t),p=Math.abs(n-r);o=s?p>2*b?b:0:f>2*b?b:0;var d=1;l&&(d=s?Math.min(1,p/h):Math.min(1,f/u));var m=C(c),g=L(i,m),y=(s?g.x:g.y)/2,v=(i.left+i.right)/2,x=(i.top+i.bottom)/2,_=(t+e)/2,w=(r+n)/2,T=0,k=0,M=s?A(e,t):A(r,n);return s?(_=e-M*o,T=M*y):(w=n+M*o,k=-M*y),{textX:v,textY:x,targetX:_,targetY:w,anchorX:T,anchorY:k,scale:d,rotate:m}}(s,c,h,p,$,{isHorizontal:R,constrained:\"both\"===D.constraintext||\"outside\"===D.constraintext,angle:lt}):I(s,c,h,p,$,{isHorizontal:R,constrained:\"both\"===D.constraintext||\"inside\"===D.constraintext,angle:lt,anchor:W,hasB:U,r:g,overhead:y}),st.fontSize=Q.size,f(\"histogram\"===D.type?\"bar\":D.type,st,z),N.transform=st;var ct=M(X,z,w,T);a.setTransormAndDisplay(ct,st)}else r.select(\"text\").remove()}(t,e,R,r,T,H,G,Z,W,rt,it,g,y),e.layerClipId&&l.hideOutsideRangePoint(c,R.select(\"text\"),w,P,h.xcalendar,h.ycalendar)}));var Z=!1===h.cliponaxis;l.setClipUrl(c,Z?null:e.layerClipId,t)}));c.getComponentMethod(\"errorbars\",\"plot\")(t,D,e,g)},toMoveInsideBar:I}},88384:function(t){\"use strict\";function e(t,e,r,n,i){var a=e.c2p(n?t.s0:t.p0,!0),o=e.c2p(n?t.s1:t.p1,!0),s=r.c2p(n?t.p0:t.s0,!0),l=r.c2p(n?t.p1:t.s1,!0);return i?[(a+o)/2,(s+l)/2]:n?[o,(s+l)/2]:[(a+o)/2,l]}t.exports=function(t,r){var n,i=t.cd,a=t.xaxis,o=t.yaxis,s=i[0].trace,l=\"funnel\"===s.type,c=\"h\"===s.orientation,u=[];if(!1===r)for(n=0;n1||0===i.bargap&&0===i.bargroupgap&&!t[0].trace.marker.line.width)&&n.select(this).attr(\"shape-rendering\",\"crispEdges\")})),e.selectAll(\"g.points\").each((function(e){d(n.select(this),e[0].trace,t)})),s.getComponentMethod(\"errorbars\",\"style\")(e)},styleTextPoints:m,styleOnSelect:function(t,e,r){var i=e[0].trace;i.selectedpoints?function(t,e,r){a.selectedPointStyle(t.selectAll(\"path\"),e),function(t,e,r){t.each((function(t){var i,s=n.select(this);if(t.selected){i=o.ensureUniformFontSize(r,g(s,t,e,r));var l=e.selected.textfont&&e.selected.textfont.color;l&&(i.color=l),a.font(s,i)}else a.selectedTextStyle(s,e)}))}(t.selectAll(\"text\"),e,r)}(r,i,t):(d(r,i,t),s.getComponentMethod(\"errorbars\",\"style\")(r))},getInsideTextFont:v,getOutsideTextFont:x,getBarColor:b,resizeText:l}},59760:function(t,e,r){\"use strict\";var n=r(78766),i=r(65477).hasColorscale,a=r(39356),o=r(34809).coercePattern;t.exports=function(t,e,r,s,l){var c=r(\"marker.color\",s),u=i(t,\"marker\");u&&a(t,e,l,r,{prefix:\"marker.\",cLetter:\"c\"}),r(\"marker.line.color\",n.defaultLine),i(t,\"marker.line\")&&a(t,e,l,r,{prefix:\"marker.line.\",cLetter:\"c\"}),r(\"marker.line.width\"),r(\"marker.opacity\"),o(r,\"marker.pattern\",c,u),r(\"selected.marker.color\"),r(\"unselected.marker.color\")}},84102:function(t,e,r){\"use strict\";var n=r(45568),i=r(34809);function a(t){return\"_\"+t+\"Text_minsize\"}t.exports={recordMinTextSize:function(t,e,r){if(r.uniformtext.mode){var n=a(t),i=r.uniformtext.minsize,o=e.scale*e.fontSize;e.hide=o g.point\"}e.selectAll(s).each((function(t){var e=t.transform;if(e){e.scale=l&&e.hide?0:o/e.fontSize;var r=n.select(this).select(\"text\");i.setTransormAndDisplay(r,e)}}))}}}},32225:function(t,e,r){\"use strict\";var n,i=r(3208).rb,a=r(93049).extendFlat,o=r(8738),s=r(81481);t.exports={r:o.r,theta:o.theta,r0:o.r0,dr:o.dr,theta0:o.theta0,dtheta:o.dtheta,thetaunit:o.thetaunit,base:a({},s.base,{}),offset:a({},s.offset,{}),width:a({},s.width,{}),text:a({},s.text,{}),hovertext:a({},s.hovertext,{}),marker:(n=a({},s.marker),delete n.cornerradius,n),hoverinfo:o.hoverinfo,hovertemplate:i(),selected:s.selected,unselected:s.unselected}},27941:function(t,e,r){\"use strict\";var n=r(65477).hasColorscale,i=r(28379),a=r(34809).isArrayOrTypedArray,o=r(35374),s=r(24782).setGroupPositions,l=r(48861),c=r(33626).traceIs,u=r(34809).extendFlat;t.exports={calc:function(t,e){for(var r=t._fullLayout,s=e.subplot,c=r[s].radialaxis,u=r[s].angularaxis,h=c.makeCalcdata(e,\"r\"),f=u.makeCalcdata(e,\"theta\"),p=e._length,d=new Array(p),m=h,g=f,y=0;yf.range[1]&&(x+=Math.PI),n.getClosest(c,(function(t){return m(v,x,[t.rp0,t.rp1],[t.thetag0,t.thetag1],d)?g+Math.min(1,Math.abs(t.thetag1-t.thetag0)/y)-1+(t.rp1-v)/(t.rp1-t.rp0)-1:1/0}),t),!1!==t.index){var _=c[t.index];t.x0=t.x1=_.ct[0],t.y0=t.y1=_.ct[1];var b=i.extendFlat({},_,{r:_.s,theta:_.p});return o(_,u,t),s(b,u,h,t),t.hovertemplate=u.hovertemplate,t.color=a(u,_),t.xLabelVal=t.yLabelVal=void 0,_.s<0&&(t.idealAlign=\"left\"),[t]}}},89362:function(t,e,r){\"use strict\";t.exports={moduleType:\"trace\",name:\"barpolar\",basePlotModule:r(31645),categories:[\"polar\",\"bar\",\"showLegend\"],attributes:r(32225),layoutAttributes:r(42956),supplyDefaults:r(77318),supplyLayoutDefaults:r(60507),calc:r(27941).calc,crossTraceCalc:r(27941).crossTraceCalc,plot:r(11627),colorbar:r(21146),formatLabels:r(33368),style:r(6851).style,styleOnSelect:r(6851).styleOnSelect,hoverPoints:r(83080),selectPoints:r(88384),meta:{}}},42956:function(t){\"use strict\";t.exports={barmode:{valType:\"enumerated\",values:[\"stack\",\"overlay\"],dflt:\"stack\",editType:\"calc\"},bargap:{valType:\"number\",dflt:.1,min:0,max:1,editType:\"calc\"}}},60507:function(t,e,r){\"use strict\";var n=r(34809),i=r(42956);t.exports=function(t,e,r){var a,o={};function s(r,o){return n.coerce(t[a]||{},e[a],i,r,o)}for(var l=0;l0?(c=o,u=l):(c=l,u=o);var h=[s.findEnclosingVertexAngles(c,t.vangles)[0],(c+u)/2,s.findEnclosingVertexAngles(u,t.vangles)[1]];return s.pathPolygonAnnulus(n,i,c,u,h,e,r)}:function(t,n,i,o){return a.pathAnnulus(t,n,i,o,e,r)}}(e),d=e.layers.frontplot.select(\"g.barlayer\");a.makeTraceGroups(d,r,\"trace bars\").each((function(){var r=n.select(this),s=a.ensureSingle(r,\"g\",\"points\").selectAll(\"g.point\").data(a.identity);s.enter().append(\"g\").style(\"vector-effect\",l?\"none\":\"non-scaling-stroke\").style(\"stroke-miterlimit\",2).classed(\"point\",!0),s.exit().remove(),s.each((function(t){var e,r=n.select(this),o=t.rp0=h.c2p(t.s0),s=t.rp1=h.c2p(t.s1),l=t.thetag0=f.c2g(t.p0),d=t.thetag1=f.c2g(t.p1);if(i(o)&&i(s)&&i(l)&&i(d)&&o!==s&&l!==d){var m=h.c2g(t.s1),g=(l+d)/2;t.ct=[c.c2p(m*Math.cos(g)),u.c2p(m*Math.sin(g))],e=p(o,s,l,d)}else e=\"M0,0Z\";a.ensureSingle(r,\"path\").attr(\"d\",e)})),o.setClipUrl(r,e._hasClipOnAxisFalse?e.clipIds.forTraces:null,t)}))}},64625:function(t,e,r){\"use strict\";var n=r(19326),i=r(36640),a=r(81481),o=r(10229),s=r(80712).axisHoverFormat,l=r(3208).rb,c=r(93049).extendFlat,u=i.marker,h=u.line;t.exports={y:{valType:\"data_array\",editType:\"calc+clearAxisTypes\"},x:{valType:\"data_array\",editType:\"calc+clearAxisTypes\"},x0:{valType:\"any\",editType:\"calc+clearAxisTypes\"},y0:{valType:\"any\",editType:\"calc+clearAxisTypes\"},dx:{valType:\"number\",editType:\"calc\"},dy:{valType:\"number\",editType:\"calc\"},xperiod:i.xperiod,yperiod:i.yperiod,xperiod0:i.xperiod0,yperiod0:i.yperiod0,xperiodalignment:i.xperiodalignment,yperiodalignment:i.yperiodalignment,xhoverformat:s(\"x\"),yhoverformat:s(\"y\"),name:{valType:\"string\",editType:\"calc+clearAxisTypes\"},q1:{valType:\"data_array\",editType:\"calc+clearAxisTypes\"},median:{valType:\"data_array\",editType:\"calc+clearAxisTypes\"},q3:{valType:\"data_array\",editType:\"calc+clearAxisTypes\"},lowerfence:{valType:\"data_array\",editType:\"calc\"},upperfence:{valType:\"data_array\",editType:\"calc\"},notched:{valType:\"boolean\",editType:\"calc\"},notchwidth:{valType:\"number\",min:0,max:.5,dflt:.25,editType:\"calc\"},notchspan:{valType:\"data_array\",editType:\"calc\"},boxpoints:{valType:\"enumerated\",values:[\"all\",\"outliers\",\"suspectedoutliers\",!1],editType:\"calc\"},jitter:{valType:\"number\",min:0,max:1,editType:\"calc\"},pointpos:{valType:\"number\",min:-2,max:2,editType:\"calc\"},sdmultiple:{valType:\"number\",min:0,editType:\"calc\",dflt:1},sizemode:{valType:\"enumerated\",values:[\"quartiles\",\"sd\"],editType:\"calc\",dflt:\"quartiles\"},boxmean:{valType:\"enumerated\",values:[!0,\"sd\",!1],editType:\"calc\"},mean:{valType:\"data_array\",editType:\"calc\"},sd:{valType:\"data_array\",editType:\"calc\"},orientation:{valType:\"enumerated\",values:[\"v\",\"h\"],editType:\"calc+clearAxisTypes\"},quartilemethod:{valType:\"enumerated\",values:[\"linear\",\"exclusive\",\"inclusive\"],dflt:\"linear\",editType:\"calc\"},width:{valType:\"number\",min:0,dflt:0,editType:\"calc\"},marker:{outliercolor:{valType:\"color\",dflt:\"rgba(0, 0, 0, 0)\",editType:\"style\"},symbol:c({},u.symbol,{arrayOk:!1,editType:\"plot\"}),opacity:c({},u.opacity,{arrayOk:!1,dflt:1,editType:\"style\"}),angle:c({},u.angle,{arrayOk:!1,editType:\"calc\"}),size:c({},u.size,{arrayOk:!1,editType:\"calc\"}),color:c({},u.color,{arrayOk:!1,editType:\"style\"}),line:{color:c({},h.color,{arrayOk:!1,dflt:o.defaultLine,editType:\"style\"}),width:c({},h.width,{arrayOk:!1,dflt:0,editType:\"style\"}),outliercolor:{valType:\"color\",editType:\"style\"},outlierwidth:{valType:\"number\",min:0,dflt:1,editType:\"style\"},editType:\"style\"},editType:\"plot\"},line:{color:{valType:\"color\",editType:\"style\"},width:{valType:\"number\",min:0,dflt:2,editType:\"style\"},editType:\"plot\"},fillcolor:n(),whiskerwidth:{valType:\"number\",min:0,max:1,dflt:.5,editType:\"calc\"},showwhiskers:{valType:\"boolean\",editType:\"calc\"},offsetgroup:a.offsetgroup,alignmentgroup:a.alignmentgroup,selected:{marker:i.selected.marker,editType:\"style\"},unselected:{marker:i.unselected.marker,editType:\"style\"},text:c({},i.text,{}),hovertext:c({},i.hovertext,{}),hovertemplate:l({}),hoveron:{valType:\"flaglist\",flags:[\"boxes\",\"points\"],dflt:\"boxes+points\",editType:\"style\"},zorder:i.zorder}},89429:function(t,e,r){\"use strict\";var n=r(10721),i=r(29714),a=r(40528),o=r(34809),s=r(63821).BADNUM,l=o._;t.exports=function(t,e){var r,c,v,x,_,b,w,T=t._fullLayout,k=i.getFromId(t,e.xaxis||\"x\"),A=i.getFromId(t,e.yaxis||\"y\"),M=[],S=\"violin\"===e.type?\"_numViolins\":\"_numBoxes\";\"h\"===e.orientation?(v=k,x=\"x\",_=A,b=\"y\",w=!!e.yperiodalignment):(v=A,x=\"y\",_=k,b=\"x\",w=!!e.xperiodalignment);var E,C,L,I,P,z,O=function(t,e,r,i){var s,l=e+\"0\"in t;if(e in t||l&&\"d\"+e in t){var c=r.makeCalcdata(t,e);return[a(t,r,e,c).vals,c]}s=l?t[e+\"0\"]:\"name\"in t&&(\"category\"===r.type||n(t.name)&&-1!==[\"linear\",\"log\"].indexOf(r.type)||o.isDateTime(t.name)&&\"date\"===r.type)?t.name:i;for(var u=\"multicategory\"===r.type?r.r2c_just_indices(s):r.d2c(s,0,t[e+\"calendar\"]),h=t._length,f=new Array(h),p=0;pE.uf};if(e._hasPreCompStats){var U=e[x],V=function(t){return v.d2c((e[t]||[])[r])},q=1/0,H=-1/0;for(r=0;r=E.q1&&E.q3>=E.med){var Z=V(\"lowerfence\");E.lf=Z!==s&&Z<=E.q1?Z:p(E,L,I);var W=V(\"upperfence\");E.uf=W!==s&&W>=E.q3?W:d(E,L,I);var Y=V(\"mean\");E.mean=Y!==s?Y:I?o.mean(L,I):(E.q1+E.q3)/2;var X=V(\"sd\");E.sd=Y!==s&&X>=0?X:I?o.stdev(L,I,E.mean):E.q3-E.q1,E.lo=m(E),E.uo=g(E);var $=V(\"notchspan\");$=$!==s&&$>0?$:y(E,I),E.ln=E.med-$,E.un=E.med+$;var J=E.lf,K=E.uf;e.boxpoints&&L.length&&(J=Math.min(J,L[0]),K=Math.max(K,L[I-1])),e.notched&&(J=Math.min(J,E.ln),K=Math.max(K,E.un)),E.min=J,E.max=K}else{var Q;o.warn([\"Invalid input - make sure that q1 <= median <= q3\",\"q1 = \"+E.q1,\"median = \"+E.med,\"q3 = \"+E.q3].join(\"\\n\")),Q=E.med!==s?E.med:E.q1!==s?E.q3!==s?(E.q1+E.q3)/2:E.q1:E.q3!==s?E.q3:0,E.med=Q,E.q1=E.q3=Q,E.lf=E.uf=Q,E.mean=E.sd=Q,E.ln=E.un=Q,E.min=E.max=Q}q=Math.min(q,E.min),H=Math.max(H,E.max),E.pts2=C.filter(j),M.push(E)}}e._extremes[v._id]=i.findExtremes(v,[q,H],{padded:!0})}else{var tt=v.makeCalcdata(e,x),et=function(t,e){for(var r=t.length,n=new Array(r+1),i=0;i=0&&it0){var ut,ht;(E={}).pos=E[b]=B[r],C=E.pts=nt[r].sort(h),I=(L=E[x]=C.map(f)).length,E.min=L[0],E.max=L[I-1],E.mean=o.mean(L,I),E.sd=o.stdev(L,I,E.mean)*e.sdmultiple,E.med=o.interp(L,.5),I%2&&(lt||ct)?(lt?(ut=L.slice(0,I/2),ht=L.slice(I/2+1)):ct&&(ut=L.slice(0,I/2+1),ht=L.slice(I/2)),E.q1=o.interp(ut,.5),E.q3=o.interp(ht,.5)):(E.q1=o.interp(L,.25),E.q3=o.interp(L,.75)),E.lf=p(E,L,I),E.uf=d(E,L,I),E.lo=m(E),E.uo=g(E);var ft=y(E,I);E.ln=E.med-ft,E.un=E.med+ft,at=Math.min(at,E.ln),ot=Math.max(ot,E.un),E.pts2=C.filter(j),M.push(E)}e.notched&&o.isTypedArray(tt)&&(tt=Array.from(tt)),e._extremes[v._id]=i.findExtremes(v,e.notched?tt.concat([at,ot]):tt,{padded:!0})}return function(t,e){if(o.isArrayOrTypedArray(e.selectedpoints))for(var r=0;r0?(M[0].t={num:T[S],dPos:N,posLetter:b,valLetter:x,labels:{med:l(t,\"median:\"),min:l(t,\"min:\"),q1:l(t,\"q1:\"),q3:l(t,\"q3:\"),max:l(t,\"max:\"),mean:\"sd\"===e.boxmean||\"sd\"===e.sizemode?l(t,\"mean ± σ:\").replace(\"σ\",1===e.sdmultiple?\"σ\":e.sdmultiple+\"σ\"):l(t,\"mean:\"),lf:l(t,\"lower fence:\"),uf:l(t,\"upper fence:\")}},T[S]++,M):[{t:{empty:!0}}]};var c={text:\"tx\",hovertext:\"htx\"};function u(t,e,r){for(var n in c)o.isArrayOrTypedArray(e[n])&&(Array.isArray(r)?o.isArrayOrTypedArray(e[n][r[0]])&&(t[c[n]]=e[n][r[0]][r[1]]):t[c[n]]=e[n][r])}function h(t,e){return t.v-e.v}function f(t){return t.v}function p(t,e,r){return 0===r?t.q1:Math.min(t.q1,e[Math.min(o.findBin(2.5*t.q1-1.5*t.q3,e,!0)+1,r-1)])}function d(t,e,r){return 0===r?t.q3:Math.max(t.q3,e[Math.max(o.findBin(2.5*t.q3-1.5*t.q1,e),0)])}function m(t){return 4*t.q1-3*t.q3}function g(t){return 4*t.q3-3*t.q1}function y(t,e){return 0===e?0:1.57*(t.q3-t.q1)/Math.sqrt(e)}},81606:function(t,e,r){\"use strict\";var n=r(29714),i=r(34809),a=r(84391).getAxisGroup,o=[\"v\",\"h\"];function s(t,e,r,o){var s,l,c,u=e.calcdata,h=e._fullLayout,f=o._id,p=f.charAt(0),d=[],m=0;for(s=0;s1,_=1-h[t+\"gap\"],b=1-h[t+\"groupgap\"];for(s=0;s0){var H=E.pointpos,G=E.jitter,Z=E.marker.size/2,W=0;H+G>=0&&((W=V*(H+G))>M?(q=!0,j=Z,B=W):W>R&&(j=Z,B=M)),W<=M&&(B=M);var Y=0;H-G<=0&&((Y=-V*(H-G))>S?(q=!0,U=Z,N=Y):Y>F&&(U=Z,N=S)),Y<=S&&(N=S)}else B=M,N=S;var X=new Array(c.length);for(l=0;l0?(g=\"v\",y=x>0?Math.min(b,_):Math.min(_)):x>0?(g=\"h\",y=Math.min(b)):y=0;if(y){e._length=y;var S=r(\"orientation\",g);e._hasPreCompStats?\"v\"===S&&0===x?(r(\"x0\",0),r(\"dx\",1)):\"h\"===S&&0===v&&(r(\"y0\",0),r(\"dy\",1)):\"v\"===S&&0===x?r(\"x0\"):\"h\"===S&&0===v&&r(\"y0\"),i.getComponentMethod(\"calendars\",\"handleTraceDefaults\")(t,e,[\"x\",\"y\"],a)}else e.visible=!1}function h(t,e,r,i){var a=i.prefix,o=n.coerce2(t,e,c,\"marker.outliercolor\"),s=r(\"marker.line.outliercolor\"),l=\"outliers\";e._hasPreCompStats?l=\"all\":(o||s)&&(l=\"suspectedoutliers\");var u=r(a+\"points\",l);u?(r(\"jitter\",\"all\"===u?.3:0),r(\"pointpos\",\"all\"===u?-1.5:0),r(\"marker.symbol\"),r(\"marker.opacity\"),r(\"marker.size\"),r(\"marker.angle\"),r(\"marker.color\",e.line.color),r(\"marker.line.color\"),r(\"marker.line.width\"),\"suspectedoutliers\"===u&&(r(\"marker.line.outliercolor\",e.marker.color),r(\"marker.line.outlierwidth\")),r(\"selected.marker.color\"),r(\"unselected.marker.color\"),r(\"selected.marker.size\"),r(\"unselected.marker.size\"),r(\"text\"),r(\"hovertext\")):delete e.marker;var h=r(\"hoveron\");\"all\"!==h&&-1===h.indexOf(\"points\")||r(\"hovertemplate\"),n.coerceSelectionMarkerOpacity(e,r)}t.exports={supplyDefaults:function(t,e,r,i){function s(r,i){return n.coerce(t,e,c,r,i)}if(u(t,e,s,i),!1!==e.visible){o(t,e,i,s),s(\"xhoverformat\"),s(\"yhoverformat\");var l=e._hasPreCompStats;l&&(s(\"lowerfence\"),s(\"upperfence\")),s(\"line.color\",(t.marker||{}).color||r),s(\"line.width\"),s(\"fillcolor\",a.addOpacity(e.line.color,.5));var f=!1;if(l){var p=s(\"mean\"),d=s(\"sd\");p&&p.length&&(f=!0,d&&d.length&&(f=\"sd\"))}s(\"whiskerwidth\");var m,g=s(\"sizemode\");\"quartiles\"===g&&(m=s(\"boxmean\",f)),s(\"showwhiskers\",\"quartiles\"===g),\"sd\"!==g&&\"sd\"!==m||s(\"sdmultiple\"),s(\"width\"),s(\"quartilemethod\");var y=!1;if(l){var v=s(\"notchspan\");v&&v.length&&(y=!0)}else n.validate(t.notchwidth,c.notchwidth)&&(y=!0);s(\"notched\",y)&&s(\"notchwidth\"),h(t,e,s,{prefix:\"box\"}),s(\"zorder\")}},crossTraceDefaults:function(t,e){var r,i;function a(t){return n.coerce(i._input,i,c,t)}for(var o=0;ot.lo&&(x.so=!0)}return a}));f.enter().append(\"path\").classed(\"point\",!0),f.exit().remove(),f.call(a.translatePoints,o,s)}function l(t,e,r,a){var o,s,l=e.val,c=e.pos,u=!!c.rangebreaks,h=a.bPos,f=a.bPosPxOffset||0,p=r.boxmean||(r.meanline||{}).visible;Array.isArray(a.bdPos)?(o=a.bdPos[0],s=a.bdPos[1]):(o=a.bdPos,s=a.bdPos);var d=t.selectAll(\"path.mean\").data(\"box\"===r.type&&r.boxmean||\"violin\"===r.type&&r.box.visible&&r.meanline.visible?i.identity:[]);d.enter().append(\"path\").attr(\"class\",\"mean\").style({fill:\"none\",\"vector-effect\":\"non-scaling-stroke\"}),d.exit().remove(),d.each((function(t){var e=c.c2l(t.pos+h,!0),i=c.l2p(e-o)+f,a=c.l2p(e+s)+f,d=u?(i+a)/2:c.l2p(e)+f,m=l.c2p(t.mean,!0),g=l.c2p(t.mean-t.sd,!0),y=l.c2p(t.mean+t.sd,!0);\"h\"===r.orientation?n.select(this).attr(\"d\",\"M\"+m+\",\"+i+\"V\"+a+(\"sd\"===p?\"m0,0L\"+g+\",\"+d+\"L\"+m+\",\"+i+\"L\"+y+\",\"+d+\"Z\":\"\")):n.select(this).attr(\"d\",\"M\"+i+\",\"+m+\"H\"+a+(\"sd\"===p?\"m0,0L\"+d+\",\"+g+\"L\"+i+\",\"+m+\"L\"+d+\",\"+y+\"Z\":\"\"))}))}t.exports={plot:function(t,e,r,a){var c=t._context.staticPlot,u=e.xaxis,h=e.yaxis;i.makeTraceGroups(a,r,\"trace boxes\").each((function(t){var e,r,i=n.select(this),a=t[0],f=a.t,p=a.trace;f.wdPos=f.bdPos*p.whiskerwidth,!0!==p.visible||f.empty?i.remove():(\"h\"===p.orientation?(e=h,r=u):(e=u,r=h),o(i,{pos:e,val:r},p,f,c),s(i,{x:u,y:h},p,f),l(i,{pos:e,val:r},p,f))}))},plotBoxAndWhiskers:o,plotPoints:s,plotBoxMean:l}},72488:function(t){\"use strict\";t.exports=function(t,e){var r,n,i=t.cd,a=t.xaxis,o=t.yaxis,s=[];if(!1===e)for(r=0;r=10)return null;for(var r=1/0,a=-1/0,o=t.length,s=0;s0?Math.floor:Math.ceil,P=C>0?Math.ceil:Math.floor,z=C>0?Math.min:Math.max,O=C>0?Math.max:Math.min,D=I(S+L),R=P(E-L),F=[[h=M(S)]];for(a=D;a*C=0;i--)a[u-i]=t[h][i],o[u-i]=e[h][i];for(s.push({x:a,y:o,bicubic:l}),i=h,a=[],o=[];i>=0;i--)a[h-i]=t[i][0],o[h-i]=e[i][0];return s.push({x:a,y:o,bicubic:c}),s}},4753:function(t,e,r){\"use strict\";var n=r(29714),i=r(93049).extendFlat;t.exports=function(t,e,r){var a,o,s,l,c,u,h,f,p,d,m,g,y,v,x=t[\"_\"+e],_=t[e+\"axis\"],b=_._gridlines=[],w=_._minorgridlines=[],T=_._boundarylines=[],k=t[\"_\"+r],A=t[r+\"axis\"];\"array\"===_.tickmode&&(_.tickvals=x.slice());var M=t._xctrl,S=t._yctrl,E=M[0].length,C=M.length,L=t._a.length,I=t._b.length;n.prepTicks(_),\"array\"===_.tickmode&&delete _.tickvals;var P=_.smoothing?3:1;function z(n){var i,a,o,s,l,c,u,h,p,d,m,g,y=[],v=[],x={};if(\"b\"===e)for(a=t.b2j(n),o=Math.floor(Math.max(0,Math.min(I-2,a))),s=a-o,x.length=I,x.crossLength=L,x.xy=function(e){return t.evalxy([],e,a)},x.dxy=function(e,r){return t.dxydi([],e,o,r,s)},i=0;i0&&(p=t.dxydi([],i-1,o,0,s),y.push(l[0]+p[0]/3),v.push(l[1]+p[1]/3),d=t.dxydi([],i-1,o,1,s),y.push(h[0]-d[0]/3),v.push(h[1]-d[1]/3)),y.push(h[0]),v.push(h[1]),l=h;else for(i=t.a2i(n),c=Math.floor(Math.max(0,Math.min(L-2,i))),u=i-c,x.length=L,x.crossLength=I,x.xy=function(e){return t.evalxy([],i,e)},x.dxy=function(e,r){return t.dxydj([],c,e,u,r)},a=0;a0&&(m=t.dxydj([],c,a-1,u,0),y.push(l[0]+m[0]/3),v.push(l[1]+m[1]/3),g=t.dxydj([],c,a-1,u,1),y.push(h[0]-g[0]/3),v.push(h[1]-g[1]/3)),y.push(h[0]),v.push(h[1]),l=h;return x.axisLetter=e,x.axis=_,x.crossAxis=A,x.value=n,x.constvar=r,x.index=f,x.x=y,x.y=v,x.smoothing=A.smoothing,x}function O(n){var i,a,o,s,l,c=[],u=[],h={};if(h.length=x.length,h.crossLength=k.length,\"b\"===e)for(o=Math.max(0,Math.min(I-2,n)),l=Math.min(1,Math.max(0,n-o)),h.xy=function(e){return t.evalxy([],e,n)},h.dxy=function(e,r){return t.dxydi([],e,o,r,l)},i=0;ix.length-1||b.push(i(O(o),{color:_.gridcolor,width:_.gridwidth,dash:_.griddash}));for(f=u;fx.length-1||m<0||m>x.length-1))for(g=x[s],y=x[m],a=0;a<_.minorgridcount;a++)(v=m-s)<=0||(d=g+(y-g)*(a+1)/(_.minorgridcount+1)*(_.arraydtick/v))x[x.length-1]||w.push(i(z(d),{color:_.minorgridcolor,width:_.minorgridwidth,dash:_.minorgriddash}));_.startline&&T.push(i(O(0),{color:_.startlinecolor,width:_.startlinewidth})),_.endline&&T.push(i(O(x.length-1),{color:_.endlinecolor,width:_.endlinewidth}))}else{for(l=5e-15,u=(c=[Math.floor((x[x.length-1]-_.tick0)/_.dtick*(1+l)),Math.ceil((x[0]-_.tick0)/_.dtick/(1+l))].sort((function(t,e){return t-e})))[0],h=c[1],f=u;f<=h;f++)p=_.tick0+_.dtick*f,b.push(i(z(p),{color:_.gridcolor,width:_.gridwidth,dash:_.griddash}));for(f=u-1;fx[x.length-1]||w.push(i(z(d),{color:_.minorgridcolor,width:_.minorgridwidth,dash:_.minorgriddash}));_.startline&&T.push(i(z(x[0]),{color:_.startlinecolor,width:_.startlinewidth})),_.endline&&T.push(i(z(x[x.length-1]),{color:_.endlinecolor,width:_.endlinewidth}))}}},93923:function(t,e,r){\"use strict\";var n=r(29714),i=r(93049).extendFlat;t.exports=function(t,e){var r,a,o,s=e._labels=[],l=e._gridlines;for(r=0;re.length&&(t=t.slice(0,e.length)):t=[],i=0;i90&&(p-=180,l=-l),{angle:p,flip:l,p:t.c2p(n,e,r),offsetMultplier:c}}},87947:function(t,e,r){\"use strict\";var n=r(45568),i=r(62203),a=r(6720),o=r(3685),s=r(33163),l=r(30635),c=r(34809),u=c.strRotate,h=c.strTranslate,f=r(4530);function p(t,e,r,s,l,c,u){var h=\"const-\"+l+\"-lines\",f=r.selectAll(\".\"+h).data(c);f.enter().append(\"path\").classed(h,!0).style(\"vector-effect\",u?\"none\":\"non-scaling-stroke\"),f.each((function(r){var s=r,l=s.x,c=s.y,u=a([],l,t.c2p),h=a([],c,e.c2p),f=\"M\"+o(u,h,s.smoothing);n.select(this).attr(\"d\",f).style(\"stroke-width\",s.width).style(\"stroke\",s.color).style(\"stroke-dasharray\",i.dashStyle(s.dash,s.width)).style(\"fill\",\"none\")})),f.exit().remove()}function d(t,e,r,a,o,c,f,p){var d=c.selectAll(\"text.\"+p).data(f);d.enter().append(\"text\").classed(p,!0);var m=0,g={};return d.each((function(o,c){var f;if(\"auto\"===o.axis.tickangle)f=s(a,e,r,o.xy,o.dxy);else{var p=(o.axis.tickangle+180)*Math.PI/180;f=s(a,e,r,o.xy,[Math.cos(p),Math.sin(p)])}c||(g={angle:f.angle,flip:f.flip});var d=(o.endAnchor?-1:1)*f.flip,y=n.select(this).attr({\"text-anchor\":d>0?\"start\":\"end\",\"data-notex\":1}).call(i.font,o.font).text(o.text).call(l.convertToTspans,t),v=i.bBox(this);y.attr(\"transform\",h(f.p[0],f.p[1])+u(f.angle)+h(o.axis.labelpadding*d,.3*v.height)),m=Math.max(m,v.width+o.axis.labelpadding)})),d.exit().remove(),g.maxExtent=m,g}t.exports=function(t,e,r,i){var l=t._context.staticPlot,u=e.xaxis,h=e.yaxis,f=t._fullLayout._clips;c.makeTraceGroups(i,r,\"trace\").each((function(e){var r=n.select(this),i=e[0],m=i.trace,g=m.aaxis,v=m.baxis,x=c.ensureSingle(r,\"g\",\"minorlayer\"),_=c.ensureSingle(r,\"g\",\"majorlayer\"),b=c.ensureSingle(r,\"g\",\"boundarylayer\"),w=c.ensureSingle(r,\"g\",\"labellayer\");r.style(\"opacity\",m.opacity),p(u,h,_,0,\"a\",g._gridlines,!0),p(u,h,_,0,\"b\",v._gridlines,!0),p(u,h,x,0,\"a\",g._minorgridlines,!0),p(u,h,x,0,\"b\",v._minorgridlines,!0),p(u,h,b,0,\"a-boundary\",g._boundarylines,l),p(u,h,b,0,\"b-boundary\",v._boundarylines,l);var T=d(t,u,h,m,0,w,g._labels,\"a-label\"),k=d(t,u,h,m,0,w,v._labels,\"b-label\");!function(t,e,r,n,i,a,o,l){var u,h,f,p,d=c.aggNums(Math.min,null,r.a),m=c.aggNums(Math.max,null,r.a),g=c.aggNums(Math.min,null,r.b),v=c.aggNums(Math.max,null,r.b);u=.5*(d+m),h=g,f=r.ab2xy(u,h,!0),p=r.dxyda_rough(u,h),void 0===o.angle&&c.extendFlat(o,s(r,i,a,f,r.dxydb_rough(u,h))),y(t,e,r,0,f,p,r.aaxis,i,a,o,\"a-title\"),u=d,h=.5*(g+v),f=r.ab2xy(u,h,!0),p=r.dxydb_rough(u,h),void 0===l.angle&&c.extendFlat(l,s(r,i,a,f,r.dxyda_rough(u,h))),y(t,e,r,0,f,p,r.baxis,i,a,l,\"b-title\")}(t,w,m,0,u,h,T,k),function(t,e,r,n,i){var s,l,u,h,f=r.select(\"#\"+t._clipPathId);f.size()||(f=r.append(\"clipPath\").classed(\"carpetclip\",!0));var p=c.ensureSingle(f,\"path\",\"carpetboundary\"),d=e.clipsegments,m=[];for(h=0;h90&&v<270,_=n.select(this);_.text(f.title.text).call(l.convertToTspans,t),x&&(b=(-l.lineCount(_)+g)*m*a-b),_.attr(\"transform\",h(e.p[0],e.p[1])+u(e.angle)+h(0,b)).attr(\"text-anchor\",\"middle\").call(i.font,f.title.font)})),_.exit().remove()}},76842:function(t,e,r){\"use strict\";var n=r(45923),i=r(98813).findBin,a=r(57075),o=r(13828),s=r(39848),l=r(41839);t.exports=function(t){var e=t._a,r=t._b,c=e.length,u=r.length,h=t.aaxis,f=t.baxis,p=e[0],d=e[c-1],m=r[0],g=r[u-1],y=e[e.length-1]-e[0],v=r[r.length-1]-r[0],x=y*n.RELATIVE_CULL_TOLERANCE,_=v*n.RELATIVE_CULL_TOLERANCE;p-=x,d+=x,m-=_,g+=_,t.isVisible=function(t,e){return t>p&&tm&&ed||eg},t.setScale=function(){var e=t._x,r=t._y,n=a(t._xctrl,t._yctrl,e,r,h.smoothing,f.smoothing);t._xctrl=n[0],t._yctrl=n[1],t.evalxy=o([t._xctrl,t._yctrl],c,u,h.smoothing,f.smoothing),t.dxydi=s([t._xctrl,t._yctrl],h.smoothing,f.smoothing),t.dxydj=l([t._xctrl,t._yctrl],h.smoothing,f.smoothing)},t.i2a=function(t){var r=Math.max(0,Math.floor(t[0]),c-2),n=t[0]-r;return(1-n)*e[r]+n*e[r+1]},t.j2b=function(t){var e=Math.max(0,Math.floor(t[1]),c-2),n=t[1]-e;return(1-n)*r[e]+n*r[e+1]},t.ij2ab=function(e){return[t.i2a(e[0]),t.j2b(e[1])]},t.a2i=function(t){var r=Math.max(0,Math.min(i(t,e),c-2)),n=e[r],a=e[r+1];return Math.max(0,Math.min(c-1,r+(t-n)/(a-n)))},t.b2j=function(t){var e=Math.max(0,Math.min(i(t,r),u-2)),n=r[e],a=r[e+1];return Math.max(0,Math.min(u-1,e+(t-n)/(a-n)))},t.ab2ij=function(e){return[t.a2i(e[0]),t.b2j(e[1])]},t.i2c=function(e,r){return t.evalxy([],e,r)},t.ab2xy=function(n,i,a){if(!a&&(ne[c-1]|ir[u-1]))return[!1,!1];var o=t.a2i(n),s=t.b2j(i),l=t.evalxy([],o,s);if(a){var h,f,p,d,m=0,g=0,y=[];ne[c-1]?(h=c-2,f=1,m=(n-e[c-1])/(e[c-1]-e[c-2])):f=o-(h=Math.max(0,Math.min(c-2,Math.floor(o)))),ir[u-1]?(p=u-2,d=1,g=(i-r[u-1])/(r[u-1]-r[u-2])):d=s-(p=Math.max(0,Math.min(u-2,Math.floor(s)))),m&&(t.dxydi(y,h,p,f,d),l[0]+=y[0]*m,l[1]+=y[1]*m),g&&(t.dxydj(y,h,p,f,d),l[0]+=y[0]*g,l[1]+=y[1]*g)}return l},t.c2p=function(t,e,r){return[e.c2p(t[0]),r.c2p(t[1])]},t.p2x=function(t,e,r){return[e.p2c(t[0]),r.p2c(t[1])]},t.dadi=function(t){var r=Math.max(0,Math.min(e.length-2,t));return e[r+1]-e[r]},t.dbdj=function(t){var e=Math.max(0,Math.min(r.length-2,t));return r[e+1]-r[e]},t.dxyda=function(e,r,n,i){var a=t.dxydi(null,e,r,n,i),o=t.dadi(e,n);return[a[0]/o,a[1]/o]},t.dxydb=function(e,r,n,i){var a=t.dxydj(null,e,r,n,i),o=t.dbdj(r,i);return[a[0]/o,a[1]/o]},t.dxyda_rough=function(e,r,n){var i=y*(n||.1),a=t.ab2xy(e+i,r,!0),o=t.ab2xy(e-i,r,!0);return[.5*(a[0]-o[0])/i,.5*(a[1]-o[1])/i]},t.dxydb_rough=function(e,r,n){var i=v*(n||.1),a=t.ab2xy(e,r+i,!0),o=t.ab2xy(e,r-i,!0);return[.5*(a[0]-o[0])/i,.5*(a[1]-o[1])/i]},t.dpdx=function(t){return t._m},t.dpdy=function(t){return t._m}}},13007:function(t,e,r){\"use strict\";var n=r(34809);t.exports=function(t,e,r){var i,a,o,s=[],l=[],c=t[0].length,u=t.length;function h(e,r){var n,i=0,a=0;return e>0&&void 0!==(n=t[r][e-1])&&(a++,i+=n),e0&&void 0!==(n=t[r-1][e])&&(a++,i+=n),r0&&a0&&i1e-5);return n.log(\"Smoother converged to\",k,\"after\",A,\"iterations\"),t}},10820:function(t,e,r){\"use strict\";var n=r(34809).isArray1D;t.exports=function(t,e,r){var i=r(\"x\"),a=i&&i.length,o=r(\"y\"),s=o&&o.length;if(!a&&!s)return!1;if(e._cheater=!i,a&&!n(i)||s&&!n(o))e._length=null;else{var l=a?i.length:1/0;s&&(l=Math.min(l,o.length)),e.a&&e.a.length&&(l=Math.min(l,e.a.length)),e.b&&e.b.length&&(l=Math.min(l,e.b.length)),e._length=l}return!0}},92802:function(t,e,r){\"use strict\";var n=r(3208).rb,i=r(6893),a=r(87163),o=r(9829),s=r(10229).defaultLine,l=r(93049).extendFlat,c=i.marker.line;t.exports=l({locations:{valType:\"data_array\",editType:\"calc\"},locationmode:i.locationmode,z:{valType:\"data_array\",editType:\"calc\"},geojson:l({},i.geojson,{}),featureidkey:i.featureidkey,text:l({},i.text,{}),hovertext:l({},i.hovertext,{}),marker:{line:{color:l({},c.color,{dflt:s}),width:l({},c.width,{dflt:1}),editType:\"calc\"},opacity:{valType:\"number\",arrayOk:!0,min:0,max:1,dflt:1,editType:\"style\"},editType:\"calc\"},selected:{marker:{opacity:i.selected.marker.opacity,editType:\"plot\"},editType:\"plot\"},unselected:{marker:{opacity:i.unselected.marker.opacity,editType:\"plot\"},editType:\"plot\"},hoverinfo:l({},o.hoverinfo,{editType:\"calc\",flags:[\"location\",\"z\",\"text\",\"name\"]}),hovertemplate:n(),showlegend:l({},o.showlegend,{dflt:!1})},a(\"\",{cLetter:\"z\",editTypeOverride:\"calc\"}))},12702:function(t,e,r){\"use strict\";var n=r(10721),i=r(63821).BADNUM,a=r(28379),o=r(99203),s=r(48861);function l(t){return t&&\"string\"==typeof t}t.exports=function(t,e){var r,c=e._length,u=new Array(c);r=e.geojson?function(t){return l(t)||n(t)}:l;for(var h=0;h\")}}(t,h,o),[t]}},58075:function(t,e,r){\"use strict\";t.exports={attributes:r(92802),supplyDefaults:r(51893),colorbar:r(12431),calc:r(12702),calcGeoJSON:r(4700).calcGeoJSON,plot:r(4700).plot,style:r(59342).style,styleOnSelect:r(59342).styleOnSelect,hoverPoints:r(94125),eventData:r(38414),selectPoints:r(43727),moduleType:\"trace\",name:\"choropleth\",basePlotModule:r(47544),categories:[\"geo\",\"noOpacity\",\"showLegend\"],meta:{}}},4700:function(t,e,r){\"use strict\";var n=r(45568),i=r(34809),a=r(3994),o=r(11577).getTopojsonFeatures,s=r(32919).findExtremes,l=r(59342).style;t.exports={calcGeoJSON:function(t,e){for(var r=t[0].trace,n=e[r.geo],i=n._subplot,l=r.locationmode,c=r._length,u=\"geojson-id\"===l?a.extractTraceFeature(t):o(r,i.topojson),h=[],f=[],p=0;p=0;n--){var i=r[n].id;if(\"string\"==typeof i&&0===i.indexOf(\"water\"))for(var a=n+1;a=0;r--)t.removeLayer(e[r][1])},s.dispose=function(){var t=this.subplot.map;this._removeLayers(),t.removeSource(this.sourceId)},t.exports=function(t,e){var r=e[0].trace,i=new o(t,r.uid),a=i.sourceId,s=n(e),l=i.below=t.belowLookup[\"trace-\"+r.uid];return t.map.addSource(a,{type:\"geojson\",data:s.geojson}),i._addLayers(s,l),e[0].trace._glTrace=i,i}},86227:function(t,e,r){\"use strict\";var n=r(92802),i=r(87163),a=r(3208).rb,o=r(9829),s=r(93049).extendFlat;t.exports=s({locations:{valType:\"data_array\",editType:\"calc\"},z:{valType:\"data_array\",editType:\"calc\"},geojson:{valType:\"any\",editType:\"calc\"},featureidkey:s({},n.featureidkey,{}),below:{valType:\"string\",editType:\"plot\"},text:n.text,hovertext:n.hovertext,marker:{line:{color:s({},n.marker.line.color,{editType:\"plot\"}),width:s({},n.marker.line.width,{editType:\"plot\"}),editType:\"calc\"},opacity:s({},n.marker.opacity,{editType:\"plot\"}),editType:\"calc\"},selected:{marker:{opacity:s({},n.selected.marker.opacity,{editType:\"plot\"}),editType:\"plot\"},editType:\"plot\"},unselected:{marker:{opacity:s({},n.unselected.marker.opacity,{editType:\"plot\"}),editType:\"plot\"},editType:\"plot\"},hoverinfo:n.hoverinfo,hovertemplate:a({},{keys:[\"properties\"]}),showlegend:s({},o.showlegend,{dflt:!1})},i(\"\",{cLetter:\"z\",editTypeOverride:\"calc\"}))},51335:function(t,e,r){\"use strict\";var n=r(10721),i=r(34809),a=r(88856),o=r(62203),s=r(39532).makeBlank,l=r(3994);function c(t){var e,r=t[0].trace,n=r._opts;if(r.selectedpoints){for(var a=o.makeSelectedPointStyleFns(r),s=0;s=0;n--){var i=r[n].id;if(\"string\"==typeof i&&0===i.indexOf(\"water\"))for(var a=n+1;a=0;r--)t.removeLayer(e[r][1])},s.dispose=function(){var t=this.subplot.map;this._removeLayers(),t.removeSource(this.sourceId)},t.exports=function(t,e){var r=e[0].trace,i=new o(t,r.uid),a=i.sourceId,s=n(e),l=i.below=t.belowLookup[\"trace-\"+r.uid];return t.map.addSource(a,{type:\"geojson\",data:s.geojson}),i._addLayers(s,l),e[0].trace._glTrace=i,i}},49865:function(t,e,r){\"use strict\";var n=r(87163),i=r(80712).axisHoverFormat,a=r(3208).rb,o=r(42450),s=r(9829),l=r(93049).extendFlat,c={x:{valType:\"data_array\",editType:\"calc+clearAxisTypes\"},y:{valType:\"data_array\",editType:\"calc+clearAxisTypes\"},z:{valType:\"data_array\",editType:\"calc+clearAxisTypes\"},u:{valType:\"data_array\",editType:\"calc\"},v:{valType:\"data_array\",editType:\"calc\"},w:{valType:\"data_array\",editType:\"calc\"},sizemode:{valType:\"enumerated\",values:[\"scaled\",\"absolute\",\"raw\"],editType:\"calc\",dflt:\"scaled\"},sizeref:{valType:\"number\",editType:\"calc\",min:0},anchor:{valType:\"enumerated\",editType:\"calc\",values:[\"tip\",\"tail\",\"cm\",\"center\"],dflt:\"cm\"},text:{valType:\"string\",dflt:\"\",arrayOk:!0,editType:\"calc\"},hovertext:{valType:\"string\",dflt:\"\",arrayOk:!0,editType:\"calc\"},hovertemplate:a({editType:\"calc\"},{keys:[\"norm\"]}),uhoverformat:i(\"u\",1),vhoverformat:i(\"v\",1),whoverformat:i(\"w\",1),xhoverformat:i(\"x\"),yhoverformat:i(\"y\"),zhoverformat:i(\"z\"),showlegend:l({},s.showlegend,{dflt:!1})};l(c,n(\"\",{colorAttr:\"u/v/w norm\",showScaleDflt:!0,editTypeOverride:\"calc\"})),[\"opacity\",\"lightposition\",\"lighting\"].forEach((function(t){c[t]=o[t]})),c.hoverinfo=l({},s.hoverinfo,{editType:\"calc\",flags:[\"x\",\"y\",\"z\",\"u\",\"v\",\"w\",\"norm\",\"text\",\"name\"],dflt:\"x+y+z+norm+text+name\"}),c.transforms=void 0,t.exports=c},93805:function(t,e,r){\"use strict\";var n=r(28379);t.exports=function(t,e){for(var r=e.u,i=e.v,a=e.w,o=Math.min(e.x.length,e.y.length,e.z.length,r.length,i.length,a.length),s=-1/0,l=1/0,c=0;co.level||o.starts.length&&a===o.level)}break;case\"constraint\":if(n.prefixBoundary=!1,n.edgepaths.length)return;var s=n.x.length,l=n.y.length,c=-1/0,u=1/0;for(r=0;r\":p>c&&(n.prefixBoundary=!0);break;case\"<\":(pc||n.starts.length&&f===u)&&(n.prefixBoundary=!0);break;case\"][\":h=Math.min(p[0],p[1]),f=Math.max(p[0],p[1]),hc&&(n.prefixBoundary=!0)}}}},92697:function(t,e,r){\"use strict\";var n=r(88856),i=r(16438),a=r(48715);t.exports={min:\"zmin\",max:\"zmax\",calc:function(t,e,r){var o=e.contours,s=e.line,l=o.size||1,c=o.coloring,u=i(e,{isColorbar:!0});if(\"heatmap\"===c){var h=n.extractOpts(e);r._fillgradient=h.reversescale?n.flipScale(h.colorscale):h.colorscale,r._zrange=[h.min,h.max]}else\"fill\"===c&&(r._fillcolor=u);r._line={color:\"lines\"===c?u:s.color,width:!1!==o.showlines?s.width:0,dash:s.dash},r._levels={start:o.start,end:a(o),size:l}}}},53156:function(t){\"use strict\";t.exports={BOTTOMSTART:[1,9,13,104,713],TOPSTART:[4,6,7,104,713],LEFTSTART:[8,12,14,208,1114],RIGHTSTART:[2,3,11,208,1114],NEWDELTA:[null,[-1,0],[0,-1],[-1,0],[1,0],null,[0,-1],[-1,0],[0,1],[0,1],null,[0,1],[1,0],[1,0],[0,-1]],CHOOSESADDLE:{104:[4,1],208:[2,8],713:[7,13],1114:[11,14]},SADDLEREMAINDER:{1:4,2:8,4:1,7:13,8:2,11:14,13:7,14:11},LABELDISTANCE:2,LABELINCREASE:10,LABELMIN:3,LABELMAX:10,LABELOPTIMIZER:{EDGECOST:1,ANGLECOST:1,NEIGHBORCOST:5,SAMELEVELFACTOR:10,SAMELEVELDISTANCE:5,MAXCOST:100,INITIALSEARCHPOINTS:10,ITERATIONS:5}}},29503:function(t,e,r){\"use strict\";var n=r(10721),i=r(20576),a=r(78766),o=a.addOpacity,s=a.opacity,l=r(20726),c=r(34809).isArrayOrTypedArray,u=l.CONSTRAINT_REDUCTION,h=l.COMPARISON_OPS2;t.exports=function(t,e,r,a,l,f){var p,d,m,g=e.contours,y=r(\"contours.operation\");g._operation=u[y],function(t,e){var r;-1===h.indexOf(e.operation)?(t(\"contours.value\",[0,1]),c(e.value)?e.value.length>2?e.value=e.value.slice(2):0===e.length?e.value=[0,1]:e.length<2?(r=parseFloat(e.value[0]),e.value=[r,r+1]):e.value=[parseFloat(e.value[0]),parseFloat(e.value[1])]:n(e.value)&&(r=parseFloat(e.value),e.value=[r,r+1])):(t(\"contours.value\",0),n(e.value)||(c(e.value)?e.value=parseFloat(e.value[0]):e.value=0))}(r,g),\"=\"===y?p=g.showlines=!0:(p=r(\"contours.showlines\"),m=r(\"fillcolor\",o((t.line||{}).color||l,.5))),p&&(d=r(\"line.color\",m&&s(m)?o(e.fillcolor,1):l),r(\"line.width\",2),r(\"line.dash\")),r(\"line.smoothing\"),i(r,a,d,f)}},22783:function(t,e,r){\"use strict\";var n=r(20726),i=r(10721);function a(t,e){var r,a=Array.isArray(e);function o(t){return i(t)?+t:null}return-1!==n.COMPARISON_OPS2.indexOf(t)?r=o(a?e[0]:e):-1!==n.INTERVAL_OPS.indexOf(t)?r=a?[o(e[0]),o(e[1])]:[o(e),o(e)]:-1!==n.SET_OPS.indexOf(t)&&(r=a?e.map(o):[o(e)]),r}function o(t){return function(e){e=a(t,e);var r=Math.min(e[0],e[1]),n=Math.max(e[0],e[1]);return{start:r,end:n,size:n-r}}}function s(t){return function(e){return{start:e=a(t,e),end:1/0,size:1/0}}}t.exports={\"[]\":o(\"[]\"),\"][\":o(\"][\"),\">\":s(\">\"),\"<\":s(\"<\"),\"=\":s(\"=\")}},47495:function(t){\"use strict\";t.exports=function(t,e,r,n){var i=n(\"contours.start\"),a=n(\"contours.end\"),o=!1===i||!1===a,s=r(\"contours.size\");!(o?e.autocontour=!0:r(\"autocontour\",!1))&&s||r(\"ncontours\")}},1999:function(t,e,r){\"use strict\";var n=r(34809);function i(t){return n.extendFlat({},t,{edgepaths:n.extendDeep([],t.edgepaths),paths:n.extendDeep([],t.paths),starts:n.extendDeep([],t.starts)})}t.exports=function(t,e){var r,a,o,s=function(t){return t.reverse()},l=function(t){return t};switch(e){case\"=\":case\"<\":return t;case\">\":for(1!==t.length&&n.warn(\"Contour data invalid for the specified inequality operation.\"),a=t[0],r=0;r1e3){n.warn(\"Too many contours, clipping at 1000\",t);break}return l}},48715:function(t){\"use strict\";t.exports=function(t){return t.end+t.size/1e6}},27657:function(t,e,r){\"use strict\";var n=r(34809),i=r(53156);function a(t,e,r,n){return Math.abs(t[0]-e[0])20&&e?208===t||1114===t?n=0===r[0]?1:-1:a=0===r[1]?1:-1:-1!==i.BOTTOMSTART.indexOf(t)?a=1:-1!==i.LEFTSTART.indexOf(t)?n=1:-1!==i.TOPSTART.indexOf(t)?a=-1:n=-1,[n,a]}(h,r,e),p=[s(t,e,[-f[0],-f[1]])],d=t.z.length,m=t.z[0].length,g=e.slice(),y=f.slice();for(c=0;c<1e4;c++){if(h>20?(h=i.CHOOSESADDLE[h][(f[0]||f[1])<0?0:1],t.crossings[u]=i.SADDLEREMAINDER[h]):delete t.crossings[u],!(f=i.NEWDELTA[h])){n.log(\"Found bad marching index:\",h,e,t.level);break}p.push(s(t,e,f)),e[0]+=f[0],e[1]+=f[1],u=e.join(\",\"),a(p[p.length-1],p[p.length-2],o,l)&&p.pop();var v=f[0]&&(e[0]<0||e[0]>m-2)||f[1]&&(e[1]<0||e[1]>d-2);if(e[0]===g[0]&&e[1]===g[1]&&f[0]===y[0]&&f[1]===y[1]||r&&v)break;h=t.crossings[u]}1e4===c&&n.log(\"Infinite loop in contour?\");var x,_,b,w,T,k,A,M,S,E,C,L,I,P,z,O=a(p[0],p[p.length-1],o,l),D=0,R=.2*t.smoothing,F=[],B=0;for(c=1;c=B;c--)if((x=F[c])=B&&x+F[_]M&&S--,t.edgepaths[S]=C.concat(p,E));break}V||(t.edgepaths[M]=p.concat(E))}for(M=0;M=v)&&(r<=y&&(r=y),o>=v&&(o=v),l=Math.floor((o-r)/s)+1,c=0),f=0;fy&&(m.unshift(y),g.unshift(g[0])),m[m.length-1]t?0:1)+(e[0][1]>t?0:2)+(e[1][1]>t?0:4)+(e[1][0]>t?0:8);return 5===r||10===r?t>(e[0][0]+e[0][1]+e[1][0]+e[1][1])/4?5===r?713:1114:5===r?104:208:15===r?0:r}t.exports=function(t){var e,r,a,o,s,l,c,u,h,f=t[0].z,p=f.length,d=f[0].length,m=2===p||2===d;for(r=0;r=0&&(n=v,s=l):Math.abs(r[1]-n[1])<.01?Math.abs(r[1]-v[1])<.01&&(v[0]-r[0])*(n[0]-v[0])>=0&&(n=v,s=l):i.log(\"endpt to newendpt is not vert. or horz.\",r,n,v)}if(r=n,s>=0)break;h+=\"L\"+n}if(s===t.edgepaths.length){i.log(\"unclosed perimeter path\");break}f=s,(d=-1===p.indexOf(f))&&(f=p[0],h+=\"Z\")}for(f=0;fn.center?n.right-s:s-n.left)/(u+Math.abs(Math.sin(c)*o)),p=(l>n.middle?n.bottom-l:l-n.top)/(Math.abs(h)+Math.cos(c)*o);if(f<1||p<1)return 1/0;var d=y.EDGECOST*(1/(f-1)+1/(p-1));d+=y.ANGLECOST*c*c;for(var m=s-u,g=l-h,v=s+u,x=l+h,_=0;_2*y.MAXCOST)break;p&&(s/=2),l=(o=c-s/2)+1.5*s}if(f<=y.MAXCOST)return u},e.addLabelData=function(t,e,r,n){var i=e.fontSize,a=e.width+i/3,o=Math.max(0,e.height-i/3),s=t.x,l=t.y,c=t.theta,u=Math.sin(c),h=Math.cos(c),f=function(t,e){return[s+t*h-e*u,l+t*u+e*h]},p=[f(-a/2,-o/2),f(-a/2,o/2),f(a/2,o/2),f(a/2,-o/2)];r.push({text:e.text,x:s,y:l,dy:e.dy,theta:c,level:e.level,width:a,height:o}),n.push(p)},e.drawLabels=function(t,e,r,a,o){var l=t.selectAll(\"text\").data(e,(function(t){return t.text+\",\"+t.x+\",\"+t.y+\",\"+t.theta}));if(l.exit().remove(),l.enter().append(\"text\").attr({\"data-notex\":1,\"text-anchor\":\"middle\"}).each((function(t){var e=t.x+Math.sin(t.theta)*t.dy,i=t.y-Math.cos(t.theta)*t.dy;n.select(this).text(t.text).attr({x:e,y:i,transform:\"rotate(\"+180*t.theta/Math.PI+\" \"+e+\" \"+i+\")\"}).call(s.convertToTspans,r)})),o){for(var c=\"\",u=0;ur.end&&(r.start=r.end=(r.start+r.end)/2),t._input.contours||(t._input.contours={}),i.extendFlat(t._input.contours,{start:r.start,end:r.end,size:r.size}),t._input.autocontour=!0}else if(\"constraint\"!==r.type){var c,u=r.start,h=r.end,f=t._input.contours;u>h&&(r.start=f.start=h,h=r.end=f.end=u,u=r.start),r.size>0||(c=u===h?1:a(u,h,t.ncontours).dtick,f.size=r.size=c)}}},1328:function(t,e,r){\"use strict\";var n=r(45568),i=r(62203),a=r(12774),o=r(16438);t.exports=function(t){var e=n.select(t).selectAll(\"g.contour\");e.style(\"opacity\",(function(t){return t[0].trace.opacity})),e.each((function(t){var e=n.select(this),r=t[0].trace,a=r.contours,s=r.line,l=a.size||1,c=a.start,u=\"constraint\"===a.type,h=!u&&\"lines\"===a.coloring,f=!u&&\"fill\"===a.coloring,p=h||f?o(r):null;e.selectAll(\"g.contourlevel\").each((function(t){n.select(this).selectAll(\"path\").call(i.lineGroupStyle,s.width,h?p(t.level):s.color,s.dash)}));var d=a.labelfont;if(e.selectAll(\"g.contourlabels text\").each((function(t){i.font(n.select(this),{weight:d.weight,style:d.style,variant:d.variant,textcase:d.textcase,lineposition:d.lineposition,shadow:d.shadow,family:d.family,size:d.size,color:d.color||(h?p(t.level):s.color)})})),u)e.selectAll(\"g.contourfill path\").style(\"fill\",r.fillcolor);else if(f){var m;e.selectAll(\"g.contourfill path\").style(\"fill\",(function(t){return void 0===m&&(m=t.level),p(t.level+.5*l)})),void 0===m&&(m=c),e.selectAll(\"g.contourbg path\").style(\"fill\",p(m-.5*l))}})),a(t)}},39889:function(t,e,r){\"use strict\";var n=r(39356),i=r(20576);t.exports=function(t,e,r,a,o){var s,l=r(\"contours.coloring\"),c=\"\";\"fill\"===l&&(s=r(\"contours.showlines\")),!1!==s&&(\"lines\"!==l&&(c=r(\"line.color\",\"#000\")),r(\"line.width\",.5),r(\"line.dash\")),\"none\"!==l&&(!0!==t.showlegend&&(e.showlegend=!1),e._dfltShowLegend=!1,n(t,e,a,r,{prefix:\"\",cLetter:\"z\"})),r(\"line.smoothing\"),i(r,a,c,o)}},66365:function(t,e,r){\"use strict\";var n=r(81658),i=r(52240),a=r(87163),o=r(93049).extendFlat,s=i.contours;t.exports=o({carpet:{valType:\"string\",editType:\"calc\"},z:n.z,a:n.x,a0:n.x0,da:n.dx,b:n.y,b0:n.y0,db:n.dy,text:n.text,hovertext:n.hovertext,transpose:n.transpose,atype:n.xtype,btype:n.ytype,fillcolor:i.fillcolor,autocontour:i.autocontour,ncontours:i.ncontours,contours:{type:s.type,start:s.start,end:s.end,size:s.size,coloring:{valType:\"enumerated\",values:[\"fill\",\"lines\",\"none\"],dflt:\"fill\",editType:\"calc\"},showlines:s.showlines,showlabels:s.showlabels,labelfont:s.labelfont,labelformat:s.labelformat,operation:s.operation,value:s.value,editType:\"calc\",impliedEdits:{autocontour:!1}},line:{color:i.line.color,width:i.line.width,dash:i.line.dash,smoothing:i.line.smoothing,editType:\"plot\"},zorder:i.zorder,transforms:void 0},a(\"\",{cLetter:\"z\",autoColorDflt:!1}))},80849:function(t,e,r){\"use strict\";var n=r(28379),i=r(34809),a=r(87869),o=r(93877),s=r(69295),l=r(78106),c=r(80924),u=r(50538),h=r(26571),f=r(62475);t.exports=function(t,e){var r=e._carpetTrace=h(t,e);if(r&&r.visible&&\"legendonly\"!==r.visible){if(!e.a||!e.b){var p=t.data[r.index],d=t.data[e.index];d.a||(d.a=p.a),d.b||(d.b=p.b),u(d,e,e._defaultColor,t._fullLayout)}var m=function(t,e){var r,u,h,f,p,d,m,g=e._carpetTrace,y=g.aaxis,v=g.baxis;y._minDtick=0,v._minDtick=0,i.isArray1D(e.z)&&a(e,y,v,\"a\",\"b\",[\"z\"]),r=e._a=e._a||e.a,f=e._b=e._b||e.b,r=r?y.makeCalcdata(e,\"_a\"):[],f=f?v.makeCalcdata(e,\"_b\"):[],u=e.a0||0,h=e.da||1,p=e.b0||0,d=e.db||1,m=e._z=o(e._z||e.z,e.transpose),e._emptypoints=l(m),s(m,e._emptypoints);var x=i.maxRowLength(m),_=\"scaled\"===e.xtype?\"\":r,b=c(e,_,u,h,x,y),w=\"scaled\"===e.ytype?\"\":f,T={a:b,b:c(e,w,p,d,m.length,v),z:m};return\"levels\"===e.contours.type&&\"none\"!==e.contours.coloring&&n(t,e,{vals:m,containerStr:\"\",cLetter:\"z\"}),[T]}(t,e);return f(e,e._z),m}}},50538:function(t,e,r){\"use strict\";var n=r(34809),i=r(86073),a=r(66365),o=r(29503),s=r(47495),l=r(39889);t.exports=function(t,e,r,c){function u(r,i){return n.coerce(t,e,a,r,i)}if(u(\"carpet\"),t.a&&t.b){if(!i(t,e,u,c,\"a\",\"b\"))return void(e.visible=!1);u(\"text\"),\"constraint\"===u(\"contours.type\")?o(t,e,u,c,r,{hasHover:!1}):(s(t,e,u,(function(r){return n.coerce2(t,e,a,r)})),l(t,e,u,c,{hasHover:!1}))}else e._defaultColor=r,e._length=null;u(\"zorder\")}},34406:function(t,e,r){\"use strict\";t.exports={attributes:r(66365),supplyDefaults:r(50538),colorbar:r(92697),calc:r(80849),plot:r(71815),style:r(1328),moduleType:\"trace\",name:\"contourcarpet\",basePlotModule:r(37703),categories:[\"cartesian\",\"svg\",\"carpet\",\"contour\",\"symbols\",\"showLegend\",\"hasLines\",\"carpetDependent\",\"noHover\",\"noSortingByValue\"],meta:{}}},71815:function(t,e,r){\"use strict\";var n=r(45568),i=r(6720),a=r(3685),o=r(62203),s=r(34809),l=r(83545),c=r(27657),u=r(8850),h=r(53156),f=r(1999),p=r(86828),d=r(49886),m=r(26571),g=r(94903);function y(t,e,r){var n=t.getPointAtLength(e),i=t.getPointAtLength(r),a=i.x-n.x,o=i.y-n.y,s=Math.sqrt(a*a+o*o);return[a/s,o/s]}function v(t){var e=Math.sqrt(t[0]*t[0]+t[1]*t[1]);return[t[0]/e,t[1]/e]}function x(t,e){var r=Math.abs(t[0]*e[0]+t[1]*e[1]);return Math.sqrt(1-r*r)/r}t.exports=function(t,e,r,_){var b=e.xaxis,w=e.yaxis;s.makeTraceGroups(_,r,\"contour\").each((function(r){var _=n.select(this),T=r[0],k=T.trace,A=k._carpetTrace=m(t,k),M=t.calcdata[A.index][0];if(A.visible&&\"legendonly\"!==A.visible){var S=T.a,E=T.b,C=k.contours,L=p(C,e,T),I=\"constraint\"===C.type,P=C._operation,z=I?\"=\"===P?\"lines\":\"fill\":C.coloring,O=[[S[0],E[E.length-1]],[S[S.length-1],E[E.length-1]],[S[S.length-1],E[0]],[S[0],E[0]]];l(L);var D=1e-8*(S[S.length-1]-S[0]),R=1e-8*(E[E.length-1]-E[0]);c(L,D,R);var F,B,N,j,U=L;\"constraint\"===C.type&&(U=f(L,P)),function(t,e){var r,n,i,a,o,s,l,c,u;for(r=0;r=0;j--)F=M.clipsegments[j],B=i([],F.x,b.c2p),N=i([],F.y,w.c2p),B.reverse(),N.reverse(),V.push(a(B,N,F.bicubic));var q=\"M\"+V.join(\"L\")+\"Z\";!function(t,e,r,n,o,l){var c,u,h,f,p=s.ensureSingle(t,\"g\",\"contourbg\").selectAll(\"path\").data(\"fill\"!==l||o?[]:[0]);p.enter().append(\"path\"),p.exit().remove();var d=[];for(f=0;f=0&&(f=C,d=m):Math.abs(h[1]-f[1])=0&&(f=C,d=m):s.log(\"endpt to newendpt is not vert. or horz.\",h,f,C)}if(d>=0)break;v+=S(h,f),h=f}if(d===e.edgepaths.length){s.log(\"unclosed perimeter path\");break}u=d,(_=-1===x.indexOf(u))&&(u=x[0],v+=S(h,f)+\"Z\",h=null)}for(u=0;um&&(n.max=m),n.len=n.max-n.min}function g(t,e){var r,n=0,o=.1;return(Math.abs(t[0]-l)0?+p[u]:0),h.push({type:\"Feature\",geometry:{type:\"Point\",coordinates:y},properties:v})}}var _=o.extractOpts(e),b=_.reversescale?o.flipScale(_.colorscale):_.colorscale,w=b[0][1],T=[\"interpolate\",[\"linear\"],[\"heatmap-density\"],0,a.opacity(w)<1?w:a.addOpacity(w,0)];for(u=1;u=0;r--)t.removeLayer(e[r][1])},o.dispose=function(){var t=this.subplot.map;this._removeLayers(),t.removeSource(this.sourceId)},t.exports=function(t,e){var r=e[0].trace,i=new a(t,r.uid),o=i.sourceId,s=n(e),l=i.below=t.belowLookup[\"trace-\"+r.uid];return t.map.addSource(o,{type:\"geojson\",data:s.geojson}),i._addLayers(s,l),i}},17347:function(t,e,r){\"use strict\";var n=r(87163),i=r(3208).rb,a=r(9829),o=r(95833),s=r(93049).extendFlat;t.exports=s({lon:o.lon,lat:o.lat,z:{valType:\"data_array\",editType:\"calc\"},radius:{valType:\"number\",editType:\"plot\",arrayOk:!0,min:1,dflt:30},below:{valType:\"string\",editType:\"plot\"},text:o.text,hovertext:o.hovertext,hoverinfo:s({},a.hoverinfo,{flags:[\"lon\",\"lat\",\"z\",\"text\",\"name\"]}),hovertemplate:i(),showlegend:s({},a.showlegend,{dflt:!1})},n(\"\",{cLetter:\"z\",editTypeOverride:\"calc\"}))},60675:function(t,e,r){\"use strict\";var n=r(10721),i=r(34809).isArrayOrTypedArray,a=r(63821).BADNUM,o=r(28379),s=r(34809)._;t.exports=function(t,e){for(var r=e._length,l=new Array(r),c=e.z,u=i(c)&&c.length,h=0;h0?+p[u]:0),h.push({type:\"Feature\",geometry:{type:\"Point\",coordinates:y},properties:v})}}var _=o.extractOpts(e),b=_.reversescale?o.flipScale(_.colorscale):_.colorscale,w=b[0][1],T=[\"interpolate\",[\"linear\"],[\"heatmap-density\"],0,a.opacity(w)<1?w:a.addOpacity(w,0)];for(u=1;u=0;r--)t.removeLayer(e[r][1])},o.dispose=function(){var t=this.subplot.map;this._removeLayers(),t.removeSource(this.sourceId)},t.exports=function(t,e){var r=e[0].trace,i=new a(t,r.uid),o=i.sourceId,s=n(e),l=i.below=t.belowLookup[\"trace-\"+r.uid];return t.map.addSource(o,{type:\"geojson\",data:s.geojson}),i._addLayers(s,l),i}},43179:function(t,e,r){\"use strict\";var n=r(34809);t.exports=function(t,e){for(var r=0;r\"),l.color=function(t,e){var r=t.marker,i=e.mc||r.color,a=e.mlc||r.line.color,o=e.mlw||r.line.width;return n(i)?i:n(a)&&o?a:void 0}(u,f),[l]}}},52213:function(t,e,r){\"use strict\";t.exports={attributes:r(62824),layoutAttributes:r(93795),supplyDefaults:r(30495).supplyDefaults,crossTraceDefaults:r(30495).crossTraceDefaults,supplyLayoutDefaults:r(34980),calc:r(28152),crossTraceCalc:r(82539),plot:r(83482),style:r(7240).style,hoverPoints:r(27759),eventData:r(29412),selectPoints:r(88384),moduleType:\"trace\",name:\"funnel\",basePlotModule:r(37703),categories:[\"bar-like\",\"cartesian\",\"svg\",\"oriented\",\"showLegend\",\"zoomScale\"],meta:{}}},93795:function(t){\"use strict\";t.exports={funnelmode:{valType:\"enumerated\",values:[\"stack\",\"group\",\"overlay\"],dflt:\"stack\",editType:\"calc\"},funnelgap:{valType:\"number\",min:0,max:1,editType:\"calc\"},funnelgroupgap:{valType:\"number\",min:0,max:1,dflt:0,editType:\"calc\"}}},34980:function(t,e,r){\"use strict\";var n=r(34809),i=r(93795);t.exports=function(t,e,r){var a=!1;function o(r,a){return n.coerce(t,e,i,r,a)}for(var s=0;s path\").each((function(t){if(!t.isBlank){var e=s.marker;n.select(this).call(a.fill,t.mc||e.color).call(a.stroke,t.mlc||e.line.color).call(i.dashLine,e.line.dash,t.mlw||e.line.width).style(\"opacity\",s.selectedpoints&&!t.selected?o:1)}})),c(r,s,t),r.selectAll(\".regions\").each((function(){n.select(this).selectAll(\"path\").style(\"stroke-width\",0).call(a.fill,s.connector.fillcolor)})),r.selectAll(\".lines\").each((function(){var t=s.connector.line;i.lineGroupStyle(n.select(this).selectAll(\"path\"),t.width,t.color,t.dash)}))}))}}},63447:function(t,e,r){\"use strict\";var n=r(55412),i=r(9829),a=r(13792).u,o=r(3208).rb,s=r(3208).ay,l=r(93049).extendFlat;t.exports={labels:n.labels,label0:n.label0,dlabel:n.dlabel,values:n.values,marker:{colors:n.marker.colors,line:{color:l({},n.marker.line.color,{dflt:null}),width:l({},n.marker.line.width,{dflt:1}),editType:\"calc\"},pattern:n.marker.pattern,editType:\"calc\"},text:n.text,hovertext:n.hovertext,scalegroup:l({},n.scalegroup,{}),textinfo:l({},n.textinfo,{flags:[\"label\",\"text\",\"value\",\"percent\"]}),texttemplate:s({editType:\"plot\"},{keys:[\"label\",\"color\",\"value\",\"text\",\"percent\"]}),hoverinfo:l({},i.hoverinfo,{flags:[\"label\",\"text\",\"value\",\"percent\",\"name\"]}),hovertemplate:o({},{keys:[\"label\",\"color\",\"value\",\"text\",\"percent\"]}),textposition:l({},n.textposition,{values:[\"inside\",\"none\"],dflt:\"inside\"}),textfont:n.textfont,insidetextfont:n.insidetextfont,title:{text:n.title.text,font:n.title.font,position:l({},n.title.position,{values:[\"top left\",\"top center\",\"top right\"],dflt:\"top center\"}),editType:\"plot\"},domain:a({name:\"funnelarea\",trace:!0,editType:\"calc\"}),aspectratio:{valType:\"number\",min:0,dflt:1,editType:\"plot\"},baseratio:{valType:\"number\",min:0,max:1,dflt:.333,editType:\"plot\"}}},86817:function(t,e,r){\"use strict\";var n=r(44122);e.name=\"funnelarea\",e.plot=function(t,r,i,a){n.plotBasePlot(e.name,t,r,i,a)},e.clean=function(t,r,i,a){n.cleanBasePlot(e.name,t,r,i,a)}},2807:function(t,e,r){\"use strict\";var n=r(44148);t.exports={calc:function(t,e){return n.calc(t,e)},crossTraceCalc:function(t){n.crossTraceCalc(t,{type:\"funnelarea\"})}}},79824:function(t,e,r){\"use strict\";var n=r(34809),i=r(63447),a=r(13792).N,o=r(17550).handleText,s=r(46979).handleLabelsAndValues,l=r(46979).handleMarkerDefaults;t.exports=function(t,e,r,c){function u(r,a){return n.coerce(t,e,i,r,a)}var h=u(\"labels\"),f=u(\"values\"),p=s(h,f),d=p.len;if(e._hasLabels=p.hasLabels,e._hasValues=p.hasValues,!e._hasLabels&&e._hasValues&&(u(\"label0\"),u(\"dlabel\")),d){e._length=d,l(t,e,c,u),u(\"scalegroup\");var m,g=u(\"text\"),y=u(\"texttemplate\");if(y||(m=u(\"textinfo\",Array.isArray(g)?\"text+percent\":\"percent\")),u(\"hovertext\"),u(\"hovertemplate\"),y||m&&\"none\"!==m){var v=u(\"textposition\");o(t,e,c,u,v,{moduleHasSelected:!1,moduleHasUnselected:!1,moduleHasConstrain:!1,moduleHasCliponaxis:!1,moduleHasTextangle:!1,moduleHasInsideanchor:!1})}else\"none\"===m&&u(\"textposition\",\"none\");a(e,c,u),u(\"title.text\")&&(u(\"title.position\"),n.coerceFont(u,\"title.font\",c.font)),u(\"aspectratio\"),u(\"baseratio\")}else e.visible=!1}},91132:function(t,e,r){\"use strict\";t.exports={moduleType:\"trace\",name:\"funnelarea\",basePlotModule:r(86817),categories:[\"pie-like\",\"funnelarea\",\"showLegend\"],attributes:r(63447),layoutAttributes:r(10270),supplyDefaults:r(79824),supplyLayoutDefaults:r(69161),calc:r(2807).calc,crossTraceCalc:r(2807).crossTraceCalc,plot:r(96673),style:r(13757),styleOne:r(32891),meta:{}}},10270:function(t,e,r){\"use strict\";var n=r(4031).hiddenlabels;t.exports={hiddenlabels:n,funnelareacolorway:{valType:\"colorlist\",editType:\"calc\"},extendfunnelareacolors:{valType:\"boolean\",dflt:!0,editType:\"calc\"}}},69161:function(t,e,r){\"use strict\";var n=r(34809),i=r(10270);t.exports=function(t,e){function r(r,a){return n.coerce(t,e,i,r,a)}r(\"hiddenlabels\"),r(\"funnelareacolorway\",e.colorway),r(\"extendfunnelareacolors\")}},96673:function(t,e,r){\"use strict\";var n=r(45568),i=r(62203),a=r(34809),o=a.strScale,s=a.strTranslate,l=r(30635),c=r(32995).toMoveInsideBar,u=r(84102),h=u.recordMinTextSize,f=u.clearMinTextSize,p=r(37252),d=r(35734),m=d.attachFxHandlers,g=d.determineInsideTextFont,y=d.layoutAreas,v=d.prerenderTitles,x=d.positionTitleOutside,_=d.formatSliceLabel;function b(t,e){return\"l\"+(e[0]-t[0])+\",\"+(e[1]-t[1])}t.exports=function(t,e){var r=t._context.staticPlot,u=t._fullLayout;f(\"funnelarea\",u),v(e,t),y(e,u._size),a.makeTraceGroups(u._funnelarealayer,e,\"trace\").each((function(e){var f=n.select(this),d=e[0],y=d.trace;!function(t){if(t.length){var e=t[0],r=e.trace,n=r.aspectratio,i=r.baseratio;i>.999&&(i=.999);var a,o,s,l=Math.pow(i,2),c=e.vTotal,u=c,h=c*l/(1-l)/c,f=[];for(f.push(E()),o=t.length-1;o>-1;o--)if(!(s=t[o]).hidden){var p=s.v/u;h+=p,f.push(E())}var d=1/0,m=-1/0;for(o=0;o-1;o--)if(!(s=t[o]).hidden){var M=f[A+=1][0],S=f[A][1];s.TL=[-M,S],s.TR=[M,S],s.BL=T,s.BR=k,s.pxmid=(b=s.TR,w=s.BR,[.5*(b[0]+w[0]),.5*(b[1]+w[1])]),T=s.TL,k=s.TR}}function E(){var t,e={x:t=Math.sqrt(h),y:-t};return[e.x,e.y]}}(e),f.each((function(){var f=n.select(this).selectAll(\"g.slice\").data(e);f.enter().append(\"g\").classed(\"slice\",!0),f.exit().remove(),f.each((function(o,s){if(o.hidden)n.select(this).selectAll(\"path,g\").remove();else{o.pointNumber=o.i,o.curveNumber=y.index;var f=d.cx,v=d.cy,x=n.select(this),w=x.selectAll(\"path.surface\").data([o]);w.enter().append(\"path\").classed(\"surface\",!0).style({\"pointer-events\":r?\"none\":\"all\"}),x.call(m,t,e);var T=\"M\"+(f+o.TR[0])+\",\"+(v+o.TR[1])+b(o.TR,o.BR)+b(o.BR,o.BL)+b(o.BL,o.TL)+\"Z\";w.attr(\"d\",T),_(t,o,d);var k=p.castOption(y.textposition,o.pts),A=x.selectAll(\"g.slicetext\").data(o.text&&\"none\"!==k?[0]:[]);A.enter().append(\"g\").classed(\"slicetext\",!0),A.exit().remove(),A.each((function(){var r=a.ensureSingle(n.select(this),\"text\",\"\",(function(t){t.attr(\"data-notex\",1)})),p=a.ensureUniformFontSize(t,g(y,o,u.font));r.text(o.text).attr({class:\"slicetext\",transform:\"\",\"text-anchor\":\"middle\"}).call(i.font,p).call(l.convertToTspans,t);var d,m,x,_=i.bBox(r.node()),b=Math.min(o.BL[1],o.BR[1])+v,w=Math.max(o.TL[1],o.TR[1])+v;m=Math.max(o.TL[0],o.BL[0])+f,x=Math.min(o.TR[0],o.BR[0])+f,(d=c(m,x,b,w,_,{isHorizontal:!0,constrained:!0,angle:0,anchor:\"middle\"})).fontSize=p.size,h(y.type,d,u),e[s].transform=d,a.setTransormAndDisplay(r,d)}))}}));var v=n.select(this).selectAll(\"g.titletext\").data(y.title.text?[0]:[]);v.enter().append(\"g\").classed(\"titletext\",!0),v.exit().remove(),v.each((function(){var e=a.ensureSingle(n.select(this),\"text\",\"\",(function(t){t.attr(\"data-notex\",1)})),r=y.title.text;y._meta&&(r=a.templateString(r,y._meta)),e.text(r).attr({class:\"titletext\",transform:\"\",\"text-anchor\":\"middle\"}).call(i.font,y.title.font).call(l.convertToTspans,t);var c=x(d,u._size);e.attr(\"transform\",s(c.x,c.y)+o(Math.min(1,c.scale))+s(c.tx,c.ty))}))}))}))}},13757:function(t,e,r){\"use strict\";var n=r(45568),i=r(32891),a=r(84102).resizeText;t.exports=function(t){var e=t._fullLayout._funnelarealayer.selectAll(\".trace\");a(t,e,\"funnelarea\"),e.each((function(e){var r=e[0].trace,a=n.select(this);a.style({opacity:r.opacity}),a.selectAll(\"path.surface\").each((function(e){n.select(this).call(i,e,r,t)}))}))}},81658:function(t,e,r){\"use strict\";var n=r(36640),i=r(9829),a=r(80337),o=r(80712).axisHoverFormat,s=r(3208).rb,l=r(3208).ay,c=r(87163),u=r(93049).extendFlat;t.exports=u({z:{valType:\"data_array\",editType:\"calc\"},x:u({},n.x,{impliedEdits:{xtype:\"array\"}}),x0:u({},n.x0,{impliedEdits:{xtype:\"scaled\"}}),dx:u({},n.dx,{impliedEdits:{xtype:\"scaled\"}}),y:u({},n.y,{impliedEdits:{ytype:\"array\"}}),y0:u({},n.y0,{impliedEdits:{ytype:\"scaled\"}}),dy:u({},n.dy,{impliedEdits:{ytype:\"scaled\"}}),xperiod:u({},n.xperiod,{impliedEdits:{xtype:\"scaled\"}}),yperiod:u({},n.yperiod,{impliedEdits:{ytype:\"scaled\"}}),xperiod0:u({},n.xperiod0,{impliedEdits:{xtype:\"scaled\"}}),yperiod0:u({},n.yperiod0,{impliedEdits:{ytype:\"scaled\"}}),xperiodalignment:u({},n.xperiodalignment,{impliedEdits:{xtype:\"scaled\"}}),yperiodalignment:u({},n.yperiodalignment,{impliedEdits:{ytype:\"scaled\"}}),text:{valType:\"data_array\",editType:\"calc\"},hovertext:{valType:\"data_array\",editType:\"calc\"},transpose:{valType:\"boolean\",dflt:!1,editType:\"calc\"},xtype:{valType:\"enumerated\",values:[\"array\",\"scaled\"],editType:\"calc+clearAxisTypes\"},ytype:{valType:\"enumerated\",values:[\"array\",\"scaled\"],editType:\"calc+clearAxisTypes\"},zsmooth:{valType:\"enumerated\",values:[\"fast\",\"best\",!1],dflt:!1,editType:\"calc\"},hoverongaps:{valType:\"boolean\",dflt:!0,editType:\"none\"},connectgaps:{valType:\"boolean\",editType:\"calc\"},xgap:{valType:\"number\",dflt:0,min:0,editType:\"plot\"},ygap:{valType:\"number\",dflt:0,min:0,editType:\"plot\"},xhoverformat:o(\"x\"),yhoverformat:o(\"y\"),zhoverformat:o(\"z\",1),hovertemplate:s(),texttemplate:l({arrayOk:!1,editType:\"plot\"},{keys:[\"x\",\"y\",\"z\",\"text\"]}),textfont:a({editType:\"plot\",autoSize:!0,autoColor:!0,colorEditType:\"style\"}),showlegend:u({},i.showlegend,{dflt:!1}),zorder:n.zorder},{transforms:void 0},c(\"\",{cLetter:\"z\",autoColorDflt:!1}))},51670:function(t,e,r){\"use strict\";var n=r(33626),i=r(34809),a=r(29714),o=r(40528),s=r(19226),l=r(28379),c=r(87869),u=r(93877),h=r(69295),f=r(78106),p=r(80924),d=r(63821).BADNUM;function m(t){for(var e=[],r=t.length,n=0;n1){var e=(t[t.length-1]-t[0])/(t.length-1),r=Math.abs(e/100);for(k=0;kr)return!1}return!0}(M.rangebreaks||S.rangebreaks)&&(T=function(t,e,r){for(var n=[],i=-1,a=0;a=0;o--)(s=((h[[(r=(a=f[o])[0])-1,i=a[1]]]||m)[2]+(h[[r+1,i]]||m)[2]+(h[[r,i-1]]||m)[2]+(h[[r,i+1]]||m)[2])/20)&&(l[a]=[r,i,s],f.splice(o,1),c=!0);if(!c)throw\"findEmpties iterated with no new neighbors\";for(a in l)h[a]=l[a],u.push(l[a])}return u.sort((function(t,e){return e[2]-t[2]}))}},93125:function(t,e,r){\"use strict\";var n=r(32141),i=r(34809),a=i.isArrayOrTypedArray,o=r(29714),s=r(88856).extractOpts;t.exports=function(t,e,r,l,c){c||(c={});var u,h,f,p,d=c.isContour,m=t.cd[0],g=m.trace,y=t.xa,v=t.ya,x=m.x,_=m.y,b=m.z,w=m.xCenter,T=m.yCenter,k=m.zmask,A=g.zhoverformat,M=x,S=_;if(!1!==t.index){try{f=Math.round(t.index[1]),p=Math.round(t.index[0])}catch(e){return void i.error(\"Error hovering on heatmap, pointNumber must be [row,col], found:\",t.index)}if(f<0||f>=b[0].length||p<0||p>b.length)return}else{if(n.inbox(e-x[0],e-x[x.length-1],0)>0||n.inbox(r-_[0],r-_[_.length-1],0)>0)return;if(d){var E;for(M=[2*x[0]-x[1]],E=1;Em&&(y=Math.max(y,Math.abs(t[a][o]-d)/(g-m))))}return y}t.exports=function(t,e){var r,i=1;for(o(t,e),r=0;r.01;r++)i=o(t,e,a(i));return i>.01&&n.log(\"interp2d didn't converge quickly\",i),t}},63814:function(t,e,r){\"use strict\";var n=r(34809);t.exports=function(t,e){t(\"texttemplate\");var r=n.extendFlat({},e.font,{color:\"auto\",size:\"auto\"});n.coerceFont(t,\"textfont\",r)}},80924:function(t,e,r){\"use strict\";var n=r(33626),i=r(34809).isArrayOrTypedArray;t.exports=function(t,e,r,a,o,s){var l,c,u,h=[],f=n.traceIs(t,\"contour\"),p=n.traceIs(t,\"histogram\"),d=n.traceIs(t,\"gl2d\");if(i(e)&&e.length>1&&!p&&\"category\"!==s.type){var m=e.length;if(!(m<=o))return f?e.slice(0,o):e.slice(0,o+1);if(f||d)h=Array.from(e).slice(0,o);else if(1===o)h=\"log\"===s.type?[.5*e[0],2*e[0]]:[e[0]-.5,e[0]+.5];else if(\"log\"===s.type){for(h=[Math.pow(e[0],1.5)/Math.pow(e[1],.5)],u=1;u0;)k=A.c2p(N[L]),L--;for(k0;)C=M.c2p(j[L]),L--;C=A._length||k<=0||E>=M._length||C<=0)return z.selectAll(\"image\").data([]).exit().remove(),void _(z);\"fast\"===X?(J=Z,K=G):(J=Q,K=tt);var et=document.createElement(\"canvas\");et.width=J,et.height=K;var rt,nt,it=et.getContext(\"2d\",{willReadFrequently:!0}),at=p(D,{noNumericCheck:!0,returnArray:!0});\"fast\"===X?(rt=W?function(t){return Z-1-t}:l.identity,nt=Y?function(t){return G-1-t}:l.identity):(rt=function(t){return l.constrain(Math.round(A.c2p(N[t])-r),0,Q)},nt=function(t){return l.constrain(Math.round(M.c2p(j[t])-E),0,tt)});var ot,st,lt,ct,ut=nt(0),ht=[ut,ut],ft=W?0:1,pt=Y?0:1,dt=0,mt=0,gt=0,yt=0;function vt(t,e){if(void 0!==t){var r=at(t);return r[0]=Math.round(r[0]),r[1]=Math.round(r[1]),r[2]=Math.round(r[2]),dt+=e,mt+=r[0]*e,gt+=r[1]*e,yt+=r[2]*e,r}return[0,0,0,0]}function xt(t,e,r,n){var i=t[r.bin0];if(void 0===i)return vt(void 0,1);var a,o=t[r.bin1],s=e[r.bin0],l=e[r.bin1],c=o-i||0,u=s-i||0;return a=void 0===o?void 0===l?0:void 0===s?2*(l-i):2*(2*l-s-i)/3:void 0===l?void 0===s?0:2*(2*i-o-s)/3:void 0===s?2*(2*l-o-i)/3:l+i-o-s,vt(i+r.frac*c+n.frac*(u+r.frac*a))}if(\"default\"!==X){var _t,bt=0;try{_t=new Uint8Array(J*K*4)}catch(t){_t=new Array(J*K*4)}if(\"smooth\"===X){var wt,Tt,kt,At=U||N,Mt=V||j,St=new Array(At.length),Et=new Array(Mt.length),Ct=new Array(Q),Lt=U?w:b,It=V?w:b;for(L=0;LXt||Xt>M._length))for(I=Gt;IJt||Jt>A._length)){var Kt=u({x:$t,y:Yt},D,t._fullLayout);Kt.x=$t,Kt.y=Yt;var Qt=O.z[L][I];void 0===Qt?(Kt.z=\"\",Kt.zLabel=\"\"):(Kt.z=Qt,Kt.zLabel=s.tickText(Ut,Qt,\"hover\").text);var te=O.text&&O.text[L]&&O.text[L][I];void 0!==te&&!1!==te||(te=\"\"),Kt.text=te;var ee=l.texttemplateString(Nt,Kt,t._fullLayout._d3locale,Kt,D._meta||{});if(ee){var re=ee.split(\"
\"),ne=re.length,ie=0;for(P=0;P0&&(a=!0);for(var l=0;la){var o=a-r[t];return r[t]=a,o}}return 0},max:function(t,e,r,i){var a=i[e];if(n(a)){if(a=Number(a),!n(r[t]))return r[t]=a,a;if(r[t]c?t>o?t>1.1*i?i:t>1.1*a?a:o:t>s?s:t>l?l:c:Math.pow(10,Math.floor(Math.log(t)/Math.LN10))}function p(t,e,r,n,a,s){if(n&&t>o){var l=d(e,a,s),c=d(r,a,s),u=t===i?0:1;return l[u]!==c[u]}return Math.floor(r/t)-Math.floor(e/t)>.1}function d(t,e,r){var n=e.c2d(t,i,r).split(\"-\");return\"\"===n[0]&&(n.unshift(),n[0]=\"-\"+n[0]),n}t.exports=function(t,e,r,n,a){var s,l,c=-1.1*e,f=-.1*e,p=t-f,d=r[0],m=r[1],g=Math.min(h(d+f,d+p,n,a),h(m+f,m+p,n,a)),y=Math.min(h(d+c,d+f,n,a),h(m+c,m+f,n,a));if(g>y&&yo){var v=s===i?1:6,x=s===i?\"M12\":\"M1\";return function(e,r){var o=n.c2d(e,i,a),s=o.indexOf(\"-\",v);s>0&&(o=o.substr(0,s));var c=n.d2c(o,0,a);if(cr.r2l(B)&&(j=o.tickIncrement(j,_.size,!0,p)),O.start=r.l2r(j),F||i.nestedProperty(e,y+\".start\").set(O.start)}var U=_.end,V=r.r2l(z.end),q=void 0!==V;if((_.endFound||q)&&V!==r.r2l(U)){var H=q?V:i.aggNums(Math.max,null,d);O.end=r.l2r(H),q||i.nestedProperty(e,y+\".start\").set(O.end)}var G=\"autobin\"+s;return!1===e._input[G]&&(e._input[y]=i.extendFlat({},e[y]||{}),delete e._input[G],delete e[G]),[O,d]}t.exports={calc:function(t,e){var r,a,p,d,m=[],g=[],y=\"h\"===e.orientation,v=o.getFromId(t,y?e.yaxis:e.xaxis),x=y?\"y\":\"x\",_={x:\"y\",y:\"x\"}[x],b=e[x+\"calendar\"],w=e.cumulative,T=f(t,e,v,x),k=T[0],A=T[1],M=\"string\"==typeof k.size,S=[],E=M?S:k,C=[],L=[],I=[],P=0,z=e.histnorm,O=e.histfunc,D=-1!==z.indexOf(\"density\");w.enabled&&D&&(z=z.replace(/ ?density$/,\"\"),D=!1);var R,F=\"max\"===O||\"min\"===O?null:0,B=l.count,N=c[z],j=!1,U=function(t){return v.r2c(t,0,b)};for(i.isArrayOrTypedArray(e[_])&&\"count\"!==O&&(R=e[_],j=\"avg\"===O,B=l[O]),r=U(k.start),p=U(k.end)+(r-o.tickIncrement(r,k.size,!1,b))/1e6;r=0&&d=0;n--)s(n);else if(\"increasing\"===e){for(n=1;n=0;n--)t[n]+=t[n+1];\"exclude\"===r&&(t.push(0),t.shift())}}(g,w.direction,w.currentbin);var J=Math.min(m.length,g.length),K=[],Q=0,tt=J-1;for(r=0;r=Q;r--)if(g[r]){tt=r;break}for(r=Q;r<=tt;r++)if(n(m[r])&&n(g[r])){var et={p:m[r],s:g[r],b:0};w.enabled||(et.pts=I[r],Z?et.ph0=et.ph1=I[r].length?A[I[r][0]]:m[r]:(e._computePh=!0,et.ph0=H(S[r]),et.ph1=H(S[r+1],!0))),K.push(et)}return 1===K.length&&(K[0].width1=o.tickIncrement(K[0].p,k.size,!1,b)-K[0].p),s(K,e),i.isArrayOrTypedArray(e.selectedpoints)&&i.tagSelected(K,e,X),K},calcAllAutoBins:f}},39732:function(t){\"use strict\";t.exports={eventDataKeys:[\"binNumber\"]}},83380:function(t,e,r){\"use strict\";var n=r(34809),i=r(5975),a=r(33626).traceIs,o=r(36301),s=r(17550).validateCornerradius,l=n.nestedProperty,c=r(84391).getAxisGroup,u=[{aStr:{x:\"xbins.start\",y:\"ybins.start\"},name:\"start\"},{aStr:{x:\"xbins.end\",y:\"ybins.end\"},name:\"end\"},{aStr:{x:\"xbins.size\",y:\"ybins.size\"},name:\"size\"},{aStr:{x:\"nbinsx\",y:\"nbinsy\"},name:\"nbins\"}],h=[\"x\",\"y\"];t.exports=function(t,e){var r,f,p,d,m,g,y,v=e._histogramBinOpts={},x=[],_={},b=[];function w(t,e){return n.coerce(r._input,r,r._module.attributes,t,e)}function T(t){return\"v\"===t.orientation?\"x\":\"y\"}function k(t,r,a){var o=t.uid+\"__\"+a;r||(r=o);var s=function(t,r){return i.getFromTrace({_fullLayout:e},t,r).type}(t,a),l=t[a+\"calendar\"]||\"\",c=v[r],u=!0;c&&(s===c.axType&&l===c.calendar?(u=!1,c.traces.push(t),c.dirs.push(a)):(r=o,s!==c.axType&&n.warn([\"Attempted to group the bins of trace\",t.index,\"set on a\",\"type:\"+s,\"axis\",\"with bins on\",\"type:\"+c.axType,\"axis.\"].join(\" \")),l!==c.calendar&&n.warn([\"Attempted to group the bins of trace\",t.index,\"set with a\",l,\"calendar\",\"with bins\",c.calendar?\"on a \"+c.calendar+\" calendar\":\"w/o a set calendar\"].join(\" \")))),u&&(v[r]={traces:[t],dirs:[a],axType:s,calendar:t[a+\"calendar\"]||\"\"}),t[\"_\"+a+\"bingroup\"]=r}for(m=0;mS&&T.splice(S,T.length-S),M.length>S&&M.splice(S,M.length-S);var E=[],C=[],L=[],I=\"string\"==typeof w.size,P=\"string\"==typeof A.size,z=[],O=[],D=I?z:w,R=P?O:A,F=0,B=[],N=[],j=e.histnorm,U=e.histfunc,V=-1!==j.indexOf(\"density\"),q=\"max\"===U||\"min\"===U?null:0,H=a.count,G=o[j],Z=!1,W=[],Y=[],X=\"z\"in e?e.z:\"marker\"in e&&Array.isArray(e.marker.color)?e.marker.color:\"\";X&&\"count\"!==U&&(Z=\"avg\"===U,H=a[U]);var $=w.size,J=x(w.start),K=x(w.end)+(J-i.tickIncrement(J,$,!1,y))/1e6;for(r=J;r=0&&p=0&&d-1,flipY:L.tiling.flip.indexOf(\"y\")>-1,orientation:L.tiling.orientation,pad:{inner:L.tiling.pad},maxDepth:L._maxDepth}).descendants(),D=1/0,R=-1/0;O.forEach((function(t){var e=t.depth;e>=L._maxDepth?(t.x0=t.x1=(t.x0+t.x1)/2,t.y0=t.y1=(t.y0+t.y1)/2):(D=Math.min(D,e),R=Math.max(R,e))})),d=d.data(O,u.getPtId),L._maxVisibleLayers=isFinite(R)?R-D+1:0,d.enter().append(\"g\").classed(\"slice\",!0),k(d,p,{},[g,y],_),d.order();var F=null;if(T&&S){var B=u.getPtId(S);d.each((function(t){null===F&&u.getPtId(t)===B&&(F={x0:t.x0,x1:t.x1,y0:t.y0,y1:t.y1})}))}var N=function(){return F||{x0:0,x1:g,y0:0,y1:y}},j=d;return T&&(j=j.transition().each(\"end\",(function(){var e=n.select(this);u.setSliceCursor(e,t,{hideOnRoot:!0,hideOnLeaves:!1,isTransitioning:!1})}))),j.each((function(s){s._x0=v(s.x0),s._x1=v(s.x1),s._y0=x(s.y0),s._y1=x(s.y1),s._hoverX=v(s.x1-L.tiling.pad),s._hoverY=x(z?s.y1-L.tiling.pad/2:s.y0+L.tiling.pad/2);var d=n.select(this),m=i.ensureSingle(d,\"path\",\"surface\",(function(t){t.style(\"pointer-events\",E?\"none\":\"all\")}));T?m.transition().attrTween(\"d\",(function(t){var e=A(t,p,N(),[g,y],{orientation:L.tiling.orientation,flipX:L.tiling.flip.indexOf(\"x\")>-1,flipY:L.tiling.flip.indexOf(\"y\")>-1});return function(t){return _(e(t))}})):m.attr(\"d\",_),d.call(h,r,t,e,{styleOne:l,eventDataKeys:c.eventDataKeys,transitionTime:c.CLICK_TRANSITION_TIME,transitionEasing:c.CLICK_TRANSITION_EASING}).call(u.setSliceCursor,t,{isTransitioning:t._transitioning}),m.call(l,s,L,t,{hovered:!1}),s.x0===s.x1||s.y0===s.y1?s._text=\"\":s._text=f(s,r,L,e,C)||\"\";var k=i.ensureSingle(d,\"g\",\"slicetext\"),S=i.ensureSingle(k,\"text\",\"\",(function(t){t.attr(\"data-notex\",1)})),O=i.ensureUniformFontSize(t,u.determineTextFont(L,s,C.font));S.text(s._text||\" \").classed(\"slicetext\",!0).attr(\"text-anchor\",P?\"end\":I?\"start\":\"middle\").call(a.font,O).call(o.convertToTspans,t),s.textBB=a.bBox(S.node()),s.transform=b(s,{fontSize:O.size}),s.transform.fontSize=O.size,T?S.transition().attrTween(\"transform\",(function(t){var e=M(t,p,N(),[g,y]);return function(t){return w(e(t))}})):S.attr(\"transform\",w(s))})),F}},36858:function(t,e,r){\"use strict\";t.exports={moduleType:\"trace\",name:\"icicle\",basePlotModule:r(63387),categories:[],animatable:!0,attributes:r(12505),layoutAttributes:r(60052),supplyDefaults:r(17918),supplyLayoutDefaults:r(11747),calc:r(36349)._,crossTraceCalc:r(36349).t,plot:r(1395),style:r(50579).style,colorbar:r(21146),meta:{}}},60052:function(t){\"use strict\";t.exports={iciclecolorway:{valType:\"colorlist\",editType:\"calc\"},extendiciclecolors:{valType:\"boolean\",dflt:!0,editType:\"calc\"}}},11747:function(t,e,r){\"use strict\";var n=r(34809),i=r(60052);t.exports=function(t,e){function r(r,a){return n.coerce(t,e,i,r,a)}r(\"iciclecolorway\",e.colorway),r(\"extendiciclecolors\")}},29316:function(t,e,r){\"use strict\";var n=r(92264),i=r(36141);t.exports=function(t,e,r){var a=r.flipX,o=r.flipY,s=\"h\"===r.orientation,l=r.maxDepth,c=e[0],u=e[1];l&&(c=(t.height+1)*e[0]/Math.min(t.height+1,l),u=(t.height+1)*e[1]/Math.min(t.height+1,l));var h=n.partition().padding(r.pad.inner).size(s?[e[1],c]:[e[0],u])(t);return(s||a||o)&&i(h,e,{swapXY:s,flipX:a,flipY:o}),h}},1395:function(t,e,r){\"use strict\";var n=r(41567),i=r(23593);t.exports=function(t,e,r,a){return n(t,e,r,a,{type:\"icicle\",drawDescendants:i})}},50579:function(t,e,r){\"use strict\";var n=r(45568),i=r(78766),a=r(34809),o=r(84102).resizeText,s=r(72043);function l(t,e,r,n){var o=e.data.data,l=!e.children,c=o.i,u=a.castOption(r,c,\"marker.line.color\")||i.defaultLine,h=a.castOption(r,c,\"marker.line.width\")||0;t.call(s,e,r,n).style(\"stroke-width\",h).call(i.stroke,u).style(\"opacity\",l?r.leaf.opacity:null)}t.exports={style:function(t){var e=t._fullLayout._iciclelayer.selectAll(\".trace\");o(t,e,\"icicle\"),e.each((function(e){var r=n.select(this),i=e[0].trace;r.style(\"opacity\",i.opacity),r.selectAll(\"path.surface\").each((function(e){n.select(this).call(l,e,i,t)}))}))},styleOne:l}},22153:function(t,e,r){\"use strict\";for(var n=r(9829),i=r(36640).zorder,a=r(3208).rb,o=r(93049).extendFlat,s=r(42939).colormodel,l=[\"rgb\",\"rgba\",\"rgba256\",\"hsl\",\"hsla\"],c=[],u=[],h=0;h0||n.inbox(r-s.y0,r-(s.y0+s.h*l.dy),0)>0)){var h,f=Math.floor((e-s.x0)/l.dx),p=Math.floor(Math.abs(r-s.y0)/l.dy);if(l._hasZ?h=s.z[p][f]:l._hasSource&&(h=l._canvas.el.getContext(\"2d\",{willReadFrequently:!0}).getImageData(f,p,1,1).data),h){var d,m=s.hi||l.hoverinfo;if(m){var g=m.split(\"+\");-1!==g.indexOf(\"all\")&&(g=[\"color\"]),-1!==g.indexOf(\"color\")&&(d=!0)}var y,v=o.colormodel[l.colormodel],x=v.colormodel||l.colormodel,_=x.length,b=l._scaler(h),w=v.suffix,T=[];(l.hovertemplate||d)&&(T.push(\"[\"+[b[0]+w[0],b[1]+w[1],b[2]+w[2]].join(\", \")),4===_&&T.push(\", \"+b[3]+w[3]),T.push(\"]\"),T=T.join(\"\"),t.extraText=x.toUpperCase()+\": \"+T),a(l.hovertext)&&a(l.hovertext[p])?y=l.hovertext[p][f]:a(l.text)&&a(l.text[p])&&(y=l.text[p][f]);var k=u.c2p(s.y0+(p+.5)*l.dy),A=s.x0+(f+.5)*l.dx,M=s.y0+(p+.5)*l.dy,S=\"[\"+h.slice(0,l.colormodel.length).join(\", \")+\"]\";return[i.extendFlat(t,{index:[p,f],x0:c.c2p(s.x0+f*l.dx),x1:c.c2p(s.x0+(f+1)*l.dx),y0:k,y1:k,color:b,xVal:A,xLabelVal:A,yVal:M,yLabelVal:M,zLabelVal:S,text:y,hovertemplateLabels:{zLabel:S,colorLabel:T,\"color[0]Label\":b[0]+w[0],\"color[1]Label\":b[1]+w[1],\"color[2]Label\":b[2]+w[2],\"color[3]Label\":b[3]+w[3]}})]}}}},92106:function(t,e,r){\"use strict\";t.exports={attributes:r(22153),supplyDefaults:r(82766),calc:r(31181),plot:r(36899),style:r(67555),hoverPoints:r(57328),eventData:r(45461),moduleType:\"trace\",name:\"image\",basePlotModule:r(37703),categories:[\"cartesian\",\"svg\",\"2dMap\",\"noSortingByValue\"],animatable:!1,meta:{}}},36899:function(t,e,r){\"use strict\";var n=r(45568),i=r(34809),a=i.strTranslate,o=r(62972),s=r(42939),l=r(95544),c=r(1837).STYLE;t.exports=function(t,e,r,u){var h=e.xaxis,f=e.yaxis,p=!t._context._exportedPlot&&l();i.makeTraceGroups(u,r,\"im\").each((function(e){var r=n.select(this),l=e[0],u=l.trace,d=(\"fast\"===u.zsmooth||!1===u.zsmooth&&p)&&!u._hasZ&&u._hasSource&&\"linear\"===h.type&&\"linear\"===f.type;u._realImage=d;var m,g,y,v,x,_,b=l.z,w=l.x0,T=l.y0,k=l.w,A=l.h,M=u.dx,S=u.dy;for(_=0;void 0===m&&_0;)g=h.c2p(w+_*M),_--;for(_=0;void 0===v&&_0;)x=f.c2p(T+_*S),_--;gz[0];if(O||D){var R=m+E/2,F=v+C/2;I+=\"transform:\"+a(R+\"px\",F+\"px\")+\"scale(\"+(O?-1:1)+\",\"+(D?-1:1)+\")\"+a(-R+\"px\",-F+\"px\")+\";\"}}L.attr(\"style\",I);var B=new Promise((function(t){if(u._hasZ)t();else if(u._hasSource)if(u._canvas&&u._canvas.el.width===k&&u._canvas.el.height===A&&u._canvas.source===u.source)t();else{var e=document.createElement(\"canvas\");e.width=k,e.height=A;var r=e.getContext(\"2d\",{willReadFrequently:!0});u._image=u._image||new Image;var n=u._image;n.onload=function(){r.drawImage(n,0,0),u._canvas={el:e,source:u.source},t()},n.setAttribute(\"src\",u.source)}})).then((function(){var t,e;if(u._hasZ)e=N((function(t,e){var r=b[e][t];return i.isTypedArray(r)&&(r=Array.from(r)),r})),t=e.toDataURL(\"image/png\");else if(u._hasSource)if(d)t=u.source;else{var r=u._canvas.el.getContext(\"2d\",{willReadFrequently:!0}).getImageData(0,0,k,A).data;e=N((function(t,e){var n=4*(e*k+t);return[r[n],r[n+1],r[n+2],r[n+3]]})),t=e.toDataURL(\"image/png\")}L.attr({\"xlink:href\":t,height:C,width:E,x:m,y:v})}));t._promises.push(B)}function N(t){var e=document.createElement(\"canvas\");e.width=E,e.height=C;var r,n=e.getContext(\"2d\",{willReadFrequently:!0}),a=function(t){return i.constrain(Math.round(h.c2p(w+t*M)-m),0,E)},o=function(t){return i.constrain(Math.round(f.c2p(T+t*S)-v),0,C)},c=s.colormodel[u.colormodel],p=c.colormodel||u.colormodel,d=c.fmt;for(_=0;_0}function T(t){t.each((function(t){v.stroke(n.select(this),t.line.color)})).each((function(t){v.fill(n.select(this),t.color)})).style(\"stroke-width\",(function(t){return t.line.width}))}function k(t,e,r){var n=t._fullLayout,i=o.extendFlat({type:\"linear\",ticks:\"outside\",range:r,showline:!0},e),a={type:\"linear\",_id:\"x\"+e._id},s={letter:\"x\",font:n.font,noAutotickangles:!0,noHover:!0,noTickson:!0};function l(t,e){return o.coerce(i,a,y,t,e)}return m(i,a,l,s,n),g(i,a,l,s),a}function A(t,e,r){return[Math.min(e/t.width,r/t.height),t,e+\"x\"+r]}function M(t,e,r,i){var a=document.createElementNS(\"http://www.w3.org/2000/svg\",\"text\"),o=n.select(a);return o.text(t).attr(\"x\",0).attr(\"y\",0).attr(\"text-anchor\",r).attr(\"data-unformatted\",t).call(p.convertToTspans,i).call(h.font,e),h.bBox(o.node())}function S(t,e,r,n,i,a){var s=\"_cache\"+e;t[s]&&t[s].key===i||(t[s]={key:i,value:r});var l=o.aggNums(a,null,[t[s].value,n],2);return t[s].value=l,l}t.exports=function(t,e,r,m){var g,y=t._fullLayout;w(r)&&m&&(g=m()),o.makeTraceGroups(y._indicatorlayer,e,\"trace\").each((function(e){var m,E,C,L,I,P=e[0].trace,z=n.select(this),O=P._hasGauge,D=P._isAngular,R=P._isBullet,F=P.domain,B={w:y._size.w*(F.x[1]-F.x[0]),h:y._size.h*(F.y[1]-F.y[0]),l:y._size.l+y._size.w*F.x[0],r:y._size.r+y._size.w*(1-F.x[1]),t:y._size.t+y._size.h*(1-F.y[1]),b:y._size.b+y._size.h*F.y[0]},N=B.l+B.w/2,j=B.t+B.h/2,U=Math.min(B.w/2,B.h),V=f.innerRadius*U,q=P.align||\"center\";if(E=j,O){if(D&&(m=N,E=j+U/2,C=function(t){return function(t,e){return[e/Math.sqrt(t.width/2*(t.width/2)+t.height*t.height),t,e]}(t,.9*V)}),R){var H=f.bulletPadding,G=1-f.bulletNumberDomainSize+H;m=B.l+(G+(1-G)*_[q])*B.w,C=function(t){return A(t,(f.bulletNumberDomainSize-H)*B.w,B.h)}}}else m=B.l+_[q]*B.w,C=function(t){return A(t,B.w,B.h)};!function(t,e,r,i){var c,u,f,m=r[0].trace,g=i.numbersX,y=i.numbersY,T=m.align||\"center\",A=x[T],E=i.transitionOpts,C=i.onComplete,L=o.ensureSingle(e,\"g\",\"numbers\"),I=[];m._hasNumber&&I.push(\"number\"),m._hasDelta&&(I.push(\"delta\"),\"left\"===m.delta.position&&I.reverse());var P=L.selectAll(\"text\").data(I);function z(e,r,n,i){if(!e.match(\"s\")||n>=0==i>=0||r(n).slice(-1).match(b)||r(i).slice(-1).match(b))return r;var a=e.slice().replace(\"s\",\"f\").replace(/\\d+/,(function(t){return parseInt(t)-1})),o=k(t,{tickformat:a});return function(t){return Math.abs(t)<1?d.tickText(o,t).text:r(t)}}P.enter().append(\"text\"),P.attr(\"text-anchor\",(function(){return A})).attr(\"class\",(function(t){return t})).attr(\"x\",null).attr(\"y\",null).attr(\"dx\",null).attr(\"dy\",null),P.exit().remove();var O,D=m.mode+m.align;if(m._hasDelta&&(O=function(){var e=k(t,{tickformat:m.delta.valueformat},m._range);e.setScale(),d.prepTicks(e);var i=function(t){return d.tickText(e,t).text},o=m.delta.suffix,s=m.delta.prefix,l=function(t){return m.delta.relative?t.relativeDelta:t.delta},c=function(t,e){return 0===t||\"number\"!=typeof t||isNaN(t)?\"-\":(t>0?m.delta.increasing.symbol:m.delta.decreasing.symbol)+s+e(t)+o},f=function(t){return t.delta>=0?m.delta.increasing.color:m.delta.decreasing.color};void 0===m._deltaLastValue&&(m._deltaLastValue=l(r[0]));var g=L.select(\"text.delta\");function y(){g.text(c(l(r[0]),i)).call(v.fill,f(r[0])).call(p.convertToTspans,t)}return g.call(h.font,m.delta.font).call(v.fill,f({delta:m._deltaLastValue})),w(E)?g.transition().duration(E.duration).ease(E.easing).tween(\"text\",(function(){var t=n.select(this),e=l(r[0]),o=m._deltaLastValue,s=z(m.delta.valueformat,i,o,e),u=a(o,e);return m._deltaLastValue=e,function(e){t.text(c(u(e),s)),t.call(v.fill,f({delta:u(e)}))}})).each(\"end\",(function(){y(),C&&C()})).each(\"interrupt\",(function(){y(),C&&C()})):y(),u=M(c(l(r[0]),i),m.delta.font,A,t),g}(),D+=m.delta.position+m.delta.font.size+m.delta.font.family+m.delta.valueformat,D+=m.delta.increasing.symbol+m.delta.decreasing.symbol,f=u),m._hasNumber&&(function(){var e=k(t,{tickformat:m.number.valueformat},m._range);e.setScale(),d.prepTicks(e);var i=function(t){return d.tickText(e,t).text},o=m.number.suffix,s=m.number.prefix,l=L.select(\"text.number\");function u(){var e=\"number\"==typeof r[0].y?s+i(r[0].y)+o:\"-\";l.text(e).call(h.font,m.number.font).call(p.convertToTspans,t)}w(E)?l.transition().duration(E.duration).ease(E.easing).each(\"end\",(function(){u(),C&&C()})).each(\"interrupt\",(function(){u(),C&&C()})).attrTween(\"text\",(function(){var t=n.select(this),e=a(r[0].lastY,r[0].y);m._lastValue=r[0].y;var l=z(m.number.valueformat,i,r[0].lastY,r[0].y);return function(r){t.text(s+l(e(r))+o)}})):u(),c=M(s+i(r[0].y)+o,m.number.font,A,t)}(),D+=m.number.font.size+m.number.font.family+m.number.valueformat+m.number.suffix+m.number.prefix,f=c),m._hasDelta&&m._hasNumber){var R,F,B=[(c.left+c.right)/2,(c.top+c.bottom)/2],N=[(u.left+u.right)/2,(u.top+u.bottom)/2],j=.75*m.delta.font.size;\"left\"===m.delta.position&&(R=S(m,\"deltaPos\",0,-1*(c.width*_[m.align]+u.width*(1-_[m.align])+j),D,Math.min),F=B[1]-N[1],f={width:c.width+u.width+j,height:Math.max(c.height,u.height),left:u.left+R,right:c.right,top:Math.min(c.top,u.top+F),bottom:Math.max(c.bottom,u.bottom+F)}),\"right\"===m.delta.position&&(R=S(m,\"deltaPos\",0,c.width*(1-_[m.align])+u.width*_[m.align]+j,D,Math.max),F=B[1]-N[1],f={width:c.width+u.width+j,height:Math.max(c.height,u.height),left:c.left,right:u.right+R,top:Math.min(c.top,u.top+F),bottom:Math.max(c.bottom,u.bottom+F)}),\"bottom\"===m.delta.position&&(R=null,F=u.height,f={width:Math.max(c.width,u.width),height:c.height+u.height,left:Math.min(c.left,u.left),right:Math.max(c.right,u.right),top:c.bottom-c.height,bottom:c.bottom+u.height}),\"top\"===m.delta.position&&(R=null,F=c.top,f={width:Math.max(c.width,u.width),height:c.height+u.height,left:Math.min(c.left,u.left),right:Math.max(c.right,u.right),top:c.bottom-c.height-u.height,bottom:c.bottom}),O.attr({dx:R,dy:F})}(m._hasNumber||m._hasDelta)&&L.attr(\"transform\",(function(){var t=i.numbersScaler(f);D+=t[2];var e,r=S(m,\"numbersScale\",1,t[0],D,Math.min);m._scaleNumbers||(r=1),e=m._isAngular?y-r*f.bottom:y-r*(f.top+f.bottom)/2,m._numbersTop=r*f.top+e;var n=f[T];\"center\"===T&&(n=(f.left+f.right)/2);var a=g-r*n;return a=S(m,\"numbersTranslate\",0,a,D,Math.max),l(a,e)+s(r)}))}(t,z,e,{numbersX:m,numbersY:E,numbersScaler:C,transitionOpts:r,onComplete:g}),O&&(L={range:P.gauge.axis.range,color:P.gauge.bgcolor,line:{color:P.gauge.bordercolor,width:0},thickness:1},I={range:P.gauge.axis.range,color:\"rgba(0, 0, 0, 0)\",line:{color:P.gauge.bordercolor,width:P.gauge.borderwidth},thickness:1});var Z=z.selectAll(\"g.angular\").data(D?e:[]);Z.exit().remove();var W=z.selectAll(\"g.angularaxis\").data(D?e:[]);W.exit().remove(),D&&function(t,e,r,a){var o,s,h,f,p=r[0].trace,m=a.size,g=a.radius,y=a.innerRadius,v=a.gaugeBg,x=a.gaugeOutline,_=[m.l+m.w/2,m.t+m.h/2+g/2],b=a.gauge,A=a.layer,M=a.transitionOpts,S=a.onComplete,E=Math.PI/2;function C(t){var e=p.gauge.axis.range[0],r=(t-e)/(p.gauge.axis.range[1]-e)*Math.PI-E;return r<-E?-E:r>E?E:r}function L(t){return n.svg.arc().innerRadius((y+g)/2-t/2*(g-y)).outerRadius((y+g)/2+t/2*(g-y)).startAngle(-E)}function I(t){t.attr(\"d\",(function(t){return L(t.thickness).startAngle(C(t.range[0])).endAngle(C(t.range[1]))()}))}b.enter().append(\"g\").classed(\"angular\",!0),b.attr(\"transform\",l(_[0],_[1])),A.enter().append(\"g\").classed(\"angularaxis\",!0).classed(\"crisp\",!0),A.selectAll(\"g.xangularaxistick,path,text\").remove(),(o=k(t,p.gauge.axis)).type=\"linear\",o.range=p.gauge.axis.range,o._id=\"xangularaxis\",o.ticklabeloverflow=\"allow\",o.setScale();var P=function(t){return(o.range[0]-t.x)/(o.range[1]-o.range[0])*Math.PI+Math.PI},z={},O=d.makeLabelFns(o,0).labelStandoff;z.xFn=function(t){var e=P(t);return Math.cos(e)*O},z.yFn=function(t){var e=P(t),r=Math.sin(e)>0?.2:1;return-Math.sin(e)*(O+t.fontSize*r)+Math.abs(Math.cos(e))*(t.fontSize*u)},z.anchorFn=function(t){var e=P(t),r=Math.cos(e);return Math.abs(r)<.1?\"middle\":r>0?\"start\":\"end\"},z.heightFn=function(t,e,r){var n=P(t);return-.5*(1+Math.sin(n))*r};var D=function(t){return l(_[0]+g*Math.cos(t),_[1]-g*Math.sin(t))};h=function(t){return D(P(t))};if(s=d.calcTicks(o),f=d.getTickSigns(o)[2],o.visible){f=\"inside\"===o.ticks?-1:1;var R=(o.linewidth||1)/2;d.drawTicks(t,o,{vals:s,layer:A,path:\"M\"+f*R+\",0h\"+f*o.ticklen,transFn:function(t){var e=P(t);return D(e)+\"rotate(\"+-c(e)+\")\"}}),d.drawLabels(t,o,{vals:s,layer:A,transFn:h,labelFns:z})}var F=[v].concat(p.gauge.steps),B=b.selectAll(\"g.bg-arc\").data(F);B.enter().append(\"g\").classed(\"bg-arc\",!0).append(\"path\"),B.select(\"path\").call(I).call(T),B.exit().remove();var N=L(p.gauge.bar.thickness),j=b.selectAll(\"g.value-arc\").data([p.gauge.bar]);j.enter().append(\"g\").classed(\"value-arc\",!0).append(\"path\");var U,V,q,H=j.select(\"path\");w(M)?(H.transition().duration(M.duration).ease(M.easing).each(\"end\",(function(){S&&S()})).each(\"interrupt\",(function(){S&&S()})).attrTween(\"d\",(U=N,V=C(r[0].lastY),q=C(r[0].y),function(){var t=i(V,q);return function(e){return U.endAngle(t(e))()}})),p._lastValue=r[0].y):H.attr(\"d\",\"number\"==typeof r[0].y?N.endAngle(C(r[0].y)):\"M0,0Z\"),H.call(T),j.exit().remove(),F=[];var G=p.gauge.threshold.value;(G||0===G)&&F.push({range:[G,G],color:p.gauge.threshold.color,line:{color:p.gauge.threshold.line.color,width:p.gauge.threshold.line.width},thickness:p.gauge.threshold.thickness});var Z=b.selectAll(\"g.threshold-arc\").data(F);Z.enter().append(\"g\").classed(\"threshold-arc\",!0).append(\"path\"),Z.select(\"path\").call(I).call(T),Z.exit().remove();var W=b.selectAll(\"g.gauge-outline\").data([x]);W.enter().append(\"g\").classed(\"gauge-outline\",!0).append(\"path\"),W.select(\"path\").call(I).call(T),W.exit().remove()}(t,0,e,{radius:U,innerRadius:V,gauge:Z,layer:W,size:B,gaugeBg:L,gaugeOutline:I,transitionOpts:r,onComplete:g});var Y=z.selectAll(\"g.bullet\").data(R?e:[]);Y.exit().remove();var X=z.selectAll(\"g.bulletaxis\").data(R?e:[]);X.exit().remove(),R&&function(t,e,r,n){var i,a,o,s,c,u=r[0].trace,h=n.gauge,p=n.layer,m=n.gaugeBg,g=n.gaugeOutline,y=n.size,x=u.domain,_=n.transitionOpts,b=n.onComplete;h.enter().append(\"g\").classed(\"bullet\",!0),h.attr(\"transform\",l(y.l,y.t)),p.enter().append(\"g\").classed(\"bulletaxis\",!0).classed(\"crisp\",!0),p.selectAll(\"g.xbulletaxistick,path,text\").remove();var A=y.h,M=u.gauge.bar.thickness*A,S=x.x[0],E=x.x[0]+(x.x[1]-x.x[0])*(u._hasNumber||u._hasDelta?1-f.bulletNumberDomainSize:1);function C(t){t.attr(\"width\",(function(t){return Math.max(0,i.c2p(t.range[1])-i.c2p(t.range[0]))})).attr(\"x\",(function(t){return i.c2p(t.range[0])})).attr(\"y\",(function(t){return.5*(1-t.thickness)*A})).attr(\"height\",(function(t){return t.thickness*A}))}(i=k(t,u.gauge.axis))._id=\"xbulletaxis\",i.domain=[S,E],i.setScale(),a=d.calcTicks(i),o=d.makeTransTickFn(i),s=d.getTickSigns(i)[2],c=y.t+y.h,i.visible&&(d.drawTicks(t,i,{vals:\"inside\"===i.ticks?d.clipEnds(i,a):a,layer:p,path:d.makeTickPath(i,c,s),transFn:o}),d.drawLabels(t,i,{vals:a,layer:p,transFn:o,labelFns:d.makeLabelFns(i,c)}));var L=[m].concat(u.gauge.steps),I=h.selectAll(\"g.bg-bullet\").data(L);I.enter().append(\"g\").classed(\"bg-bullet\",!0).append(\"rect\"),I.select(\"rect\").call(C).call(T),I.exit().remove();var P=h.selectAll(\"g.value-bullet\").data([u.gauge.bar]);P.enter().append(\"g\").classed(\"value-bullet\",!0).append(\"rect\"),P.select(\"rect\").attr(\"height\",M).attr(\"y\",(A-M)/2).call(T),w(_)?P.select(\"rect\").transition().duration(_.duration).ease(_.easing).each(\"end\",(function(){b&&b()})).each(\"interrupt\",(function(){b&&b()})).attr(\"width\",Math.max(0,i.c2p(Math.min(u.gauge.axis.range[1],r[0].y)))):P.select(\"rect\").attr(\"width\",\"number\"==typeof r[0].y?Math.max(0,i.c2p(Math.min(u.gauge.axis.range[1],r[0].y))):0),P.exit().remove();var z=r.filter((function(){return u.gauge.threshold.value||0===u.gauge.threshold.value})),O=h.selectAll(\"g.threshold-bullet\").data(z);O.enter().append(\"g\").classed(\"threshold-bullet\",!0).append(\"line\"),O.select(\"line\").attr(\"x1\",i.c2p(u.gauge.threshold.value)).attr(\"x2\",i.c2p(u.gauge.threshold.value)).attr(\"y1\",(1-u.gauge.threshold.thickness)/2*A).attr(\"y2\",(1-(1-u.gauge.threshold.thickness)/2)*A).call(v.stroke,u.gauge.threshold.line.color).style(\"stroke-width\",u.gauge.threshold.line.width),O.exit().remove();var D=h.selectAll(\"g.gauge-outline\").data([g]);D.enter().append(\"g\").classed(\"gauge-outline\",!0).append(\"rect\"),D.select(\"rect\").call(C).call(T),D.exit().remove()}(t,0,e,{gauge:Y,layer:X,size:B,gaugeBg:L,gaugeOutline:I,transitionOpts:r,onComplete:g});var $=z.selectAll(\"text.title\").data(e);$.exit().remove(),$.enter().append(\"text\").classed(\"title\",!0),$.attr(\"text-anchor\",(function(){return R?x.right:x[P.title.align]})).text(P.title.text).call(h.font,P.title.font).call(p.convertToTspans,t),$.attr(\"transform\",(function(){var t,e=B.l+B.w*_[P.title.align],r=f.titlePadding,n=h.bBox($.node());return O?(D&&(t=P.gauge.axis.visible?h.bBox(W.node()).top-r-n.bottom:B.t+B.h/2-U/2-n.bottom-r),R&&(t=E-(n.top+n.bottom)/2,e=B.l-f.bulletPadding*B.w)):t=P._numbersTop-r-n.bottom,l(e,t)}))}))}},70252:function(t,e,r){\"use strict\";var n=r(87163),i=r(80712).axisHoverFormat,a=r(3208).rb,o=r(42450),s=r(9829),l=r(93049).extendFlat,c=r(13582).overrideAll,u=t.exports=c(l({x:{valType:\"data_array\"},y:{valType:\"data_array\"},z:{valType:\"data_array\"},value:{valType:\"data_array\"},isomin:{valType:\"number\"},isomax:{valType:\"number\"},surface:{show:{valType:\"boolean\",dflt:!0},count:{valType:\"integer\",dflt:2,min:1},fill:{valType:\"number\",min:0,max:1,dflt:1},pattern:{valType:\"flaglist\",flags:[\"A\",\"B\",\"C\",\"D\",\"E\"],extras:[\"all\",\"odd\",\"even\"],dflt:\"all\"}},spaceframe:{show:{valType:\"boolean\",dflt:!1},fill:{valType:\"number\",min:0,max:1,dflt:.15}},slices:{x:{show:{valType:\"boolean\",dflt:!1},locations:{valType:\"data_array\",dflt:[]},fill:{valType:\"number\",min:0,max:1,dflt:1}},y:{show:{valType:\"boolean\",dflt:!1},locations:{valType:\"data_array\",dflt:[]},fill:{valType:\"number\",min:0,max:1,dflt:1}},z:{show:{valType:\"boolean\",dflt:!1},locations:{valType:\"data_array\",dflt:[]},fill:{valType:\"number\",min:0,max:1,dflt:1}}},caps:{x:{show:{valType:\"boolean\",dflt:!0},fill:{valType:\"number\",min:0,max:1,dflt:1}},y:{show:{valType:\"boolean\",dflt:!0},fill:{valType:\"number\",min:0,max:1,dflt:1}},z:{show:{valType:\"boolean\",dflt:!0},fill:{valType:\"number\",min:0,max:1,dflt:1}}},text:{valType:\"string\",dflt:\"\",arrayOk:!0},hovertext:{valType:\"string\",dflt:\"\",arrayOk:!0},hovertemplate:a(),xhoverformat:i(\"x\"),yhoverformat:i(\"y\"),zhoverformat:i(\"z\"),valuehoverformat:i(\"value\",1),showlegend:l({},s.showlegend,{dflt:!1})},n(\"\",{colorAttr:\"`value`\",showScaleDflt:!0,editTypeOverride:\"calc\"}),{opacity:o.opacity,lightposition:o.lightposition,lighting:o.lighting,flatshading:o.flatshading,contour:o.contour,hoverinfo:l({},s.hoverinfo)}),\"calc\",\"nested\");u.flatshading.dflt=!0,u.lighting.facenormalsepsilon.dflt=0,u.x.editType=u.y.editType=u.z.editType=u.value.editType=\"calc+clearAxisTypes\",u.transforms=void 0},58988:function(t,e,r){\"use strict\";var n=r(28379),i=r(36402).processGrid,a=r(36402).filter;t.exports=function(t,e){e._len=Math.min(e.x.length,e.y.length,e.z.length,e.value.length),e._x=a(e.x,e._len),e._y=a(e.y,e._len),e._z=a(e.z,e._len),e._value=a(e.value,e._len);var r=i(e);e._gridFill=r.fill,e._Xs=r.Xs,e._Ys=r.Ys,e._Zs=r.Zs,e._len=r.len;for(var o=1/0,s=-1/0,l=0;l0;r--){var n=Math.min(e[r],e[r-1]),i=Math.max(e[r],e[r-1]);if(i>n&&n-1}function R(t,e){return null===t?e:t}function F(e,r,n){L();var i,a,o,l=[r],c=[n];if(s>=1)l=[r],c=[n];else if(s>0){var u=function(t,e){var r=t[0],n=t[1],i=t[2],a=function(t,e,r){for(var n=[],i=0;i-1?n[p]:C(d,m,y);f[p]=x>-1?x:P(d,m,y,R(e,v))}i=f[0],a=f[1],o=f[2],t._meshI.push(i),t._meshJ.push(a),t._meshK.push(o),++g}}function B(t,e,r,n){var i=t[3];in&&(i=n);for(var a=(t[3]-i)/(t[3]-e[3]+1e-9),o=[],s=0;s<4;s++)o[s]=(1-a)*t[s]+a*e[s];return o}function N(t,e,r){return t>=e&&t<=r}function j(t){var e=.001*(E-S);return t>=S-e&&t<=E+e}function U(e){for(var r=[],n=0;n<4;n++){var i=e[n];r.push([t._x[i],t._y[i],t._z[i],t._value[i]])}return r}var V=3;function q(t,e,r,n,i,a){a||(a=1),r=[-1,-1,-1];var o=!1,s=[N(e[0][3],n,i),N(e[1][3],n,i),N(e[2][3],n,i)];if(!s[0]&&!s[1]&&!s[2])return!1;var l=function(t,e,r){return j(e[0][3])&&j(e[1][3])&&j(e[2][3])?(F(t,e,r),!0):aMath.abs(C-M)?[A,C]:[C,M];d=!0,Q(r,L[0],L[1]),d=!1}}var z=[[Math.min(S,M),Math.max(S,M)],[Math.min(A,E),Math.max(A,E)]];[\"x\",\"y\",\"z\"].forEach((function(r){for(var n=[],i=0;i0&&(h.push(d.id),\"x\"===r?f.push([d.distRatio,0,0]):\"y\"===r?f.push([0,d.distRatio,0]):f.push([0,0,d.distRatio]))}else u=nt(1,\"x\"===r?_-1:\"y\"===r?b-1:w-1);h.length>0&&(n[a]=\"x\"===r?tt(e,h,o,s,f,n[a]):\"y\"===r?et(e,h,o,s,f,n[a]):rt(e,h,o,s,f,n[a]),a++),u.length>0&&(n[a]=\"x\"===r?$(e,u,o,s,n[a]):\"y\"===r?J(e,u,o,s,n[a]):K(e,u,o,s,n[a]),a++)}var m=t.caps[r];m.show&&m.fill&&(O(m.fill),n[a]=\"x\"===r?$(e,[0,_-1],o,s,n[a]):\"y\"===r?J(e,[0,b-1],o,s,n[a]):K(e,[0,w-1],o,s,n[a]),a++)}})),0===g&&I(),t._meshX=n,t._meshY=i,t._meshZ=a,t._meshIntensity=o,t._Xs=y,t._Ys=v,t._Zs=x}(),t}t.exports={findNearestOnAxis:c,generateIsoMeshes:p,createIsosurfaceTrace:function(t,e){var r=t.glplot.gl,i=n({gl:r}),a=new u(t,i,e.uid);return i._trace=a,a.update(e),t.glplot.add(i),a}}},44731:function(t,e,r){\"use strict\";var n=r(34809),i=r(33626),a=r(70252),o=r(39356);function s(t,e,r,n,a){var s=a(\"isomin\"),l=a(\"isomax\");null!=l&&null!=s&&s>l&&(e.isomin=null,e.isomax=null);var c=a(\"x\"),u=a(\"y\"),h=a(\"z\"),f=a(\"value\");c&&c.length&&u&&u.length&&h&&h.length&&f&&f.length?(i.getComponentMethod(\"calendars\",\"handleTraceDefaults\")(t,e,[\"x\",\"y\",\"z\"],n),a(\"valuehoverformat\"),[\"x\",\"y\",\"z\"].forEach((function(t){a(t+\"hoverformat\");var e=\"caps.\"+t;a(e+\".show\")&&a(e+\".fill\");var r=\"slices.\"+t;a(r+\".show\")&&(a(r+\".fill\"),a(r+\".locations\"))})),a(\"spaceframe.show\")&&a(\"spaceframe.fill\"),a(\"surface.show\")&&(a(\"surface.count\"),a(\"surface.fill\"),a(\"surface.pattern\")),a(\"contour.show\")&&(a(\"contour.color\"),a(\"contour.width\")),[\"text\",\"hovertext\",\"hovertemplate\",\"lighting.ambient\",\"lighting.diffuse\",\"lighting.specular\",\"lighting.roughness\",\"lighting.fresnel\",\"lighting.vertexnormalsepsilon\",\"lighting.facenormalsepsilon\",\"lightposition.x\",\"lightposition.y\",\"lightposition.z\",\"flatshading\",\"opacity\"].forEach((function(t){a(t)})),o(t,e,n,a,{prefix:\"\",cLetter:\"c\"}),e._length=null):e.visible=!1}t.exports={supplyDefaults:function(t,e,r,i){s(t,e,0,i,(function(r,i){return n.coerce(t,e,a,r,i)}))},supplyIsoDefaults:s}},75297:function(t,e,r){\"use strict\";t.exports={attributes:r(70252),supplyDefaults:r(44731).supplyDefaults,calc:r(58988),colorbar:{min:\"cmin\",max:\"cmax\"},plot:r(91370).createIsosurfaceTrace,moduleType:\"trace\",name:\"isosurface\",basePlotModule:r(2487),categories:[\"gl3d\",\"showLegend\"],meta:{}}},42450:function(t,e,r){\"use strict\";var n=r(87163),i=r(80712).axisHoverFormat,a=r(3208).rb,o=r(16131),s=r(9829),l=r(93049).extendFlat;t.exports=l({x:{valType:\"data_array\",editType:\"calc+clearAxisTypes\"},y:{valType:\"data_array\",editType:\"calc+clearAxisTypes\"},z:{valType:\"data_array\",editType:\"calc+clearAxisTypes\"},i:{valType:\"data_array\",editType:\"calc\"},j:{valType:\"data_array\",editType:\"calc\"},k:{valType:\"data_array\",editType:\"calc\"},text:{valType:\"string\",dflt:\"\",arrayOk:!0,editType:\"calc\"},hovertext:{valType:\"string\",dflt:\"\",arrayOk:!0,editType:\"calc\"},hovertemplate:a({editType:\"calc\"}),xhoverformat:i(\"x\"),yhoverformat:i(\"y\"),zhoverformat:i(\"z\"),delaunayaxis:{valType:\"enumerated\",values:[\"x\",\"y\",\"z\"],dflt:\"z\",editType:\"calc\"},alphahull:{valType:\"number\",dflt:-1,editType:\"calc\"},intensity:{valType:\"data_array\",editType:\"calc\"},intensitymode:{valType:\"enumerated\",values:[\"vertex\",\"cell\"],dflt:\"vertex\",editType:\"calc\"},color:{valType:\"color\",editType:\"calc\"},vertexcolor:{valType:\"data_array\",editType:\"calc\"},facecolor:{valType:\"data_array\",editType:\"calc\"},transforms:void 0},n(\"\",{colorAttr:\"`intensity`\",showScaleDflt:!0,editTypeOverride:\"calc\"}),{opacity:o.opacity,flatshading:{valType:\"boolean\",dflt:!1,editType:\"calc\"},contour:{show:l({},o.contours.x.show,{}),color:o.contours.x.color,width:o.contours.x.width,editType:\"calc\"},lightposition:{x:l({},o.lightposition.x,{dflt:1e5}),y:l({},o.lightposition.y,{dflt:1e5}),z:l({},o.lightposition.z,{dflt:0}),editType:\"calc\"},lighting:l({vertexnormalsepsilon:{valType:\"number\",min:0,max:1,dflt:1e-12,editType:\"calc\"},facenormalsepsilon:{valType:\"number\",min:0,max:1,dflt:1e-6,editType:\"calc\"},editType:\"calc\"},o.lighting),hoverinfo:l({},s.hoverinfo,{editType:\"calc\"}),showlegend:l({},s.showlegend,{dflt:!1})})},44878:function(t,e,r){\"use strict\";var n=r(28379);t.exports=function(t,e){e.intensity&&n(t,e,{vals:e.intensity,containerStr:\"\",cLetter:\"c\"})}},82836:function(t,e,r){\"use strict\";var n=r(99098).gl_mesh3d,i=r(99098).delaunay_triangulate,a=r(99098).alpha_shape,o=r(99098).convex_hull,s=r(46998).parseColorScale,l=r(34809).isArrayOrTypedArray,c=r(55010),u=r(88856).extractOpts,h=r(88239);function f(t,e,r){this.scene=t,this.uid=r,this.mesh=e,this.name=\"\",this.color=\"#fff\",this.data=null,this.showContour=!1}var p=f.prototype;function d(t){for(var e=[],r=t.length,n=0;n=e-.5)return!1;return!0}p.handlePick=function(t){if(t.object===this.mesh){var e=t.index=t.data.index;t.data._cellCenter?t.traceCoordinate=t.data.dataCoordinate:t.traceCoordinate=[this.data.x[e],this.data.y[e],this.data.z[e]];var r=this.data.hovertext||this.data.text;return l(r)&&void 0!==r[e]?t.textLabel=r[e]:r&&(t.textLabel=r),!0}},p.update=function(t){var e=this.scene,r=e.fullSceneLayout;this.data=t;var n,l=t.x.length,f=h(m(r.xaxis,t.x,e.dataScale[0],t.xcalendar),m(r.yaxis,t.y,e.dataScale[1],t.ycalendar),m(r.zaxis,t.z,e.dataScale[2],t.zcalendar));if(t.i&&t.j&&t.k){if(t.i.length!==t.j.length||t.j.length!==t.k.length||!y(t.i,l)||!y(t.j,l)||!y(t.k,l))return;n=h(g(t.i),g(t.j),g(t.k))}else n=0===t.alphahull?o(f):t.alphahull>0?a(t.alphahull,f):function(t,e){for(var r=[\"x\",\"y\",\"z\"].indexOf(t),n=[],a=e.length,o=0;oy):g=A>w,y=A;var M=c(w,T,k,A);M.pos=b,M.yc=(w+A)/2,M.i=_,M.dir=g?\"increasing\":\"decreasing\",M.x=M.pos,M.y=[k,T],v&&(M.orig_p=r[_]),d&&(M.tx=e.text[_]),m&&(M.htx=e.hovertext[_]),x.push(M)}else x.push({pos:b,empty:!0})}return e._extremes[l._id]=a.findExtremes(l,n.concat(f,h),{padded:!0}),x.length&&(x[0].t={labels:{open:i(t,\"open:\")+\" \",high:i(t,\"high:\")+\" \",low:i(t,\"low:\")+\" \",close:i(t,\"close:\")+\" \"}}),x}t.exports={calc:function(t,e){var r=a.getFromId(t,e.xaxis),i=a.getFromId(t,e.yaxis),s=function(t,e,r){var i=r._minDiff;if(!i){var a,s=t._fullData,l=[];for(i=1/0,a=0;a\"+c.labels[x]+n.hoverLabelText(s,_,l.yhoverformat):((v=i.extendFlat({},f)).y0=v.y1=b,v.yLabelVal=_,v.yLabel=c.labels[x]+n.hoverLabelText(s,_,l.yhoverformat),v.name=\"\",h.push(v),g[_]=v)}return h}function f(t,e,r,i){var a=t.cd,o=t.ya,l=a[0].trace,h=a[0].t,f=u(t,e,r,i);if(!f)return[];var p=a[f.index],d=f.index=p.i,m=p.dir;function g(t){return h.labels[t]+n.hoverLabelText(o,l[t][d],l.yhoverformat)}var y=p.hi||l.hoverinfo,v=y.split(\"+\"),x=\"all\"===y,_=x||-1!==v.indexOf(\"y\"),b=x||-1!==v.indexOf(\"text\"),w=_?[g(\"open\"),g(\"high\"),g(\"low\"),g(\"close\")+\" \"+c[m]]:[];return b&&s(p,l,w),f.extraText=w.join(\"
\"),f.y0=f.y1=o.c2p(p.yc,!0),[f]}t.exports={hoverPoints:function(t,e,r,n){return t.cd[0].trace.hoverlabel.split?h(t,e,r,n):f(t,e,r,n)},hoverSplit:h,hoverOnPoints:f}},12683:function(t,e,r){\"use strict\";t.exports={moduleType:\"trace\",name:\"ohlc\",basePlotModule:r(37703),categories:[\"cartesian\",\"svg\",\"showLegend\"],meta:{},attributes:r(86706),supplyDefaults:r(22629),calc:r(95694).calc,plot:r(38956),style:r(57406),hoverPoints:r(93245).hoverPoints,selectPoints:r(49343)}},28270:function(t,e,r){\"use strict\";var n=r(33626),i=r(34809);t.exports=function(t,e,r,a){var o=r(\"x\"),s=r(\"open\"),l=r(\"high\"),c=r(\"low\"),u=r(\"close\");if(r(\"hoverlabel.split\"),n.getComponentMethod(\"calendars\",\"handleTraceDefaults\")(t,e,[\"x\"],a),s&&l&&c&&u){var h=Math.min(s.length,l.length,c.length,u.length);return o&&(h=Math.min(h,i.minRowLength(o))),e._length=h,h}}},38956:function(t,e,r){\"use strict\";var n=r(45568),i=r(34809);t.exports=function(t,e,r,a){var o=e.yaxis,s=e.xaxis,l=!!s.rangebreaks;i.makeTraceGroups(a,r,\"trace ohlc\").each((function(t){var e=n.select(this),r=t[0],a=r.t;if(!0!==r.trace.visible||a.empty)e.remove();else{var c=a.tickLen,u=e.selectAll(\"path\").data(i.identity);u.enter().append(\"path\"),u.exit().remove(),u.attr(\"d\",(function(t){if(t.empty)return\"M0,0Z\";var e=s.c2p(t.pos-c,!0),r=s.c2p(t.pos+c,!0),n=l?(e+r)/2:s.c2p(t.pos,!0);return\"M\"+e+\",\"+o.c2p(t.o,!0)+\"H\"+n+\"M\"+n+\",\"+o.c2p(t.h,!0)+\"V\"+o.c2p(t.l,!0)+\"M\"+r+\",\"+o.c2p(t.c,!0)+\"H\"+n}))}}))}},49343:function(t){\"use strict\";t.exports=function(t,e){var r,n=t.cd,i=t.xaxis,a=t.yaxis,o=[],s=n[0].t.bPos||0;if(!1===e)for(r=0;r=t.length)return!1;if(void 0!==e[t[r]])return!1;e[t[r]]=!0}return!0}(r))for(e=0;e0||u(s);c&&(o=\"array\");var h=r(\"categoryorder\",o);\"array\"===h?(r(\"categoryarray\"),r(\"ticktext\")):(delete t.categoryarray,delete t.ticktext),c||\"array\"!==h||(e.categoryorder=\"trace\")}}t.exports=function(t,e,r,u){function f(r,i){return n.coerce(t,e,l,r,i)}var p=s(t,e,{name:\"dimensions\",handleItemDefaults:h}),d=function(t,e,r,o,s){s(\"line.shape\"),s(\"line.hovertemplate\");var l=s(\"line.color\",o.colorway[0]);if(i(t,\"line\")&&n.isArrayOrTypedArray(l)){if(l.length)return s(\"line.colorscale\"),a(t,e,o,s,{prefix:\"line.\",cLetter:\"c\"}),l.length;e.line.color=r}return 1/0}(t,e,r,u,f);o(e,u,f),Array.isArray(p)&&p.length||(e.visible=!1),c(e,p,\"values\",d),f(\"hoveron\"),f(\"hovertemplate\"),f(\"arrangement\"),f(\"bundlecolors\"),f(\"sortpaths\"),f(\"counts\");var m=u.font;n.coerceFont(f,\"labelfont\",m,{overrideDflt:{size:Math.round(m.size)}}),n.coerceFont(f,\"tickfont\",m,{autoShadowDflt:!0,overrideDflt:{size:Math.round(m.size/1.2)}})}},6305:function(t,e,r){\"use strict\";t.exports={attributes:r(11660),supplyDefaults:r(62651),calc:r(95564),plot:r(37822),colorbar:{container:\"line\",min:\"cmin\",max:\"cmax\"},moduleType:\"trace\",name:\"parcats\",basePlotModule:r(83260),categories:[\"noOpacity\"],meta:{}}},27219:function(t,e,r){\"use strict\";var n=r(45568),i=r(88640).Dj,a=r(31420),o=r(32141),s=r(34809),l=s.strTranslate,c=r(62203),u=r(65657),h=r(30635);function f(t,e,r,i){var a=e._context.staticPlot,o=t.map(F.bind(0,e,r)),u=i.selectAll(\"g.parcatslayer\").data([null]);u.enter().append(\"g\").attr(\"class\",\"parcatslayer\").style(\"pointer-events\",a?\"none\":\"all\");var f=u.selectAll(\"g.trace.parcats\").data(o,p),v=f.enter().append(\"g\").attr(\"class\",\"trace parcats\");f.attr(\"transform\",(function(t){return l(t.x,t.y)})),v.append(\"g\").attr(\"class\",\"paths\");var x=f.select(\"g.paths\").selectAll(\"path.path\").data((function(t){return t.paths}),p);x.attr(\"fill\",(function(t){return t.model.color}));var w=x.enter().append(\"path\").attr(\"class\",\"path\").attr(\"stroke-opacity\",0).attr(\"fill\",(function(t){return t.model.color})).attr(\"fill-opacity\",0);b(w),x.attr(\"d\",(function(t){return t.svgD})),w.empty()||x.sort(m),x.exit().remove(),x.on(\"mouseover\",g).on(\"mouseout\",y).on(\"click\",_),v.append(\"g\").attr(\"class\",\"dimensions\");var A=f.select(\"g.dimensions\").selectAll(\"g.dimension\").data((function(t){return t.dimensions}),p);A.enter().append(\"g\").attr(\"class\",\"dimension\"),A.attr(\"transform\",(function(t){return l(t.x,0)})),A.exit().remove();var M=A.selectAll(\"g.category\").data((function(t){return t.categories}),p),S=M.enter().append(\"g\").attr(\"class\",\"category\");M.attr(\"transform\",(function(t){return l(0,t.y)})),S.append(\"rect\").attr(\"class\",\"catrect\").attr(\"pointer-events\",\"none\"),M.select(\"rect.catrect\").attr(\"fill\",\"none\").attr(\"width\",(function(t){return t.width})).attr(\"height\",(function(t){return t.height})),T(S);var E=M.selectAll(\"rect.bandrect\").data((function(t){return t.bands}),p);E.each((function(){s.raiseToTop(this)})),E.attr(\"fill\",(function(t){return t.color}));var O=E.enter().append(\"rect\").attr(\"class\",\"bandrect\").attr(\"stroke-opacity\",0).attr(\"fill\",(function(t){return t.color})).attr(\"fill-opacity\",0);E.attr(\"fill\",(function(t){return t.color})).attr(\"width\",(function(t){return t.width})).attr(\"height\",(function(t){return t.height})).attr(\"y\",(function(t){return t.y})).attr(\"cursor\",(function(t){return\"fixed\"===t.parcatsViewModel.arrangement?\"default\":\"perpendicular\"===t.parcatsViewModel.arrangement?\"ns-resize\":\"move\"})),k(O),E.exit().remove(),S.append(\"text\").attr(\"class\",\"catlabel\").attr(\"pointer-events\",\"none\"),M.select(\"text.catlabel\").attr(\"text-anchor\",(function(t){return d(t)?\"start\":\"end\"})).attr(\"alignment-baseline\",\"middle\").style(\"fill\",\"rgb(0, 0, 0)\").attr(\"x\",(function(t){return d(t)?t.width+5:-5})).attr(\"y\",(function(t){return t.height/2})).text((function(t){return t.model.categoryLabel})).each((function(t){c.font(n.select(this),t.parcatsViewModel.categorylabelfont),h.convertToTspans(n.select(this),e)})),S.append(\"text\").attr(\"class\",\"dimlabel\"),M.select(\"text.dimlabel\").attr(\"text-anchor\",\"middle\").attr(\"alignment-baseline\",\"baseline\").attr(\"cursor\",(function(t){return\"fixed\"===t.parcatsViewModel.arrangement?\"default\":\"ew-resize\"})).attr(\"x\",(function(t){return t.width/2})).attr(\"y\",-5).text((function(t,e){return 0===e?t.parcatsViewModel.model.dimensions[t.model.dimensionInd].dimensionLabel:null})).each((function(t){c.font(n.select(this),t.parcatsViewModel.labelfont)})),M.selectAll(\"rect.bandrect\").on(\"mouseover\",C).on(\"mouseout\",L),M.exit().remove(),A.call(n.behavior.drag().origin((function(t){return{x:t.x,y:0}})).on(\"dragstart\",I).on(\"drag\",P).on(\"dragend\",z)),f.each((function(t){t.traceSelection=n.select(this),t.pathSelection=n.select(this).selectAll(\"g.paths\").selectAll(\"path.path\"),t.dimensionSelection=n.select(this).selectAll(\"g.dimensions\").selectAll(\"g.dimension\")})),f.exit().remove()}function p(t){return t.key}function d(t){var e=t.parcatsViewModel.dimensions.length,r=t.parcatsViewModel.dimensions[e-1].model.dimensionInd;return t.model.dimensionInd===r}function m(t,e){return t.model.rawColor>e.model.rawColor?1:t.model.rawColor\"),C=n.mouse(h)[0];o.loneHover({trace:f,x:_-d.left+m.left,y:b-d.top+m.top,text:E,color:t.model.color,borderColor:\"black\",fontFamily:'Monaco, \"Courier New\", monospace',fontSize:10,fontColor:T,idealAlign:C<_?\"right\":\"left\",hovertemplate:(f.line||{}).hovertemplate,hovertemplateLabels:M,eventData:[{data:f._input,fullData:f,count:k,probability:A}]},{container:p._hoverlayer.node(),outerContainer:p._paper.node(),gd:h})}}}function y(t){if(!t.parcatsViewModel.dragDimension&&(b(n.select(this)),o.loneUnhover(t.parcatsViewModel.graphDiv._fullLayout._hoverlayer.node()),t.parcatsViewModel.pathSelection.sort(m),-1===t.parcatsViewModel.hoverinfoItems.indexOf(\"skip\"))){var e=v(t),r=x(t);t.parcatsViewModel.graphDiv.emit(\"plotly_unhover\",{points:e,event:n.event,constraints:r})}}function v(t){for(var e=[],r=O(t.parcatsViewModel),n=0;n1&&f.displayInd===h.dimensions.length-1?(i=c.left,a=\"left\"):(i=c.left+c.width,a=\"right\");var m=u.model.count,g=u.model.categoryLabel,y=m/u.parcatsViewModel.model.count,v={countLabel:m,categoryLabel:g,probabilityLabel:y.toFixed(3)},x=[];-1!==u.parcatsViewModel.hoverinfoItems.indexOf(\"count\")&&x.push([\"Count:\",v.countLabel].join(\" \")),-1!==u.parcatsViewModel.hoverinfoItems.indexOf(\"probability\")&&x.push([\"P(\"+v.categoryLabel+\"):\",v.probabilityLabel].join(\" \"));var _=x.join(\"
\");return{trace:p,x:o*(i-e.left),y:s*(d-e.top),text:_,color:\"lightgray\",borderColor:\"black\",fontFamily:'Monaco, \"Courier New\", monospace',fontSize:12,fontColor:\"black\",idealAlign:a,hovertemplate:p.hovertemplate,hovertemplateLabels:v,eventData:[{data:p._input,fullData:p,count:m,category:g,probability:y}]}}function C(t){if(!t.parcatsViewModel.dragDimension&&-1===t.parcatsViewModel.hoverinfoItems.indexOf(\"skip\")){if(n.mouse(this)[1]<-1)return;var e,r=t.parcatsViewModel.graphDiv,i=r._fullLayout,a=i._paperdiv.node().getBoundingClientRect(),l=t.parcatsViewModel.hoveron,c=this;\"color\"===l?(function(t){var e=n.select(t).datum(),r=A(e);w(r),r.each((function(){s.raiseToTop(this)})),n.select(t.parentNode).selectAll(\"rect.bandrect\").filter((function(t){return t.color===e.color})).each((function(){s.raiseToTop(this),n.select(this).attr(\"stroke\",\"black\").attr(\"stroke-width\",1.5)}))}(c),S(c,\"plotly_hover\",n.event)):(function(t){n.select(t.parentNode).selectAll(\"rect.bandrect\").each((function(t){var e=A(t);w(e),e.each((function(){s.raiseToTop(this)}))})),n.select(t.parentNode).select(\"rect.catrect\").attr(\"stroke\",\"black\").attr(\"stroke-width\",2.5)}(c),M(c,\"plotly_hover\",n.event)),-1===t.parcatsViewModel.hoverinfoItems.indexOf(\"none\")&&(\"category\"===l?e=E(r,a,c):\"color\"===l?e=function(t,e,r){t._fullLayout._calcInverseTransform(t);var i,a,o=t._fullLayout._invScaleX,s=t._fullLayout._invScaleY,l=r.getBoundingClientRect(),c=n.select(r).datum(),h=c.categoryViewModel,f=h.parcatsViewModel,p=f.model.dimensions[h.model.dimensionInd],d=f.trace,m=l.y+l.height/2;f.dimensions.length>1&&p.displayInd===f.dimensions.length-1?(i=l.left,a=\"left\"):(i=l.left+l.width,a=\"right\");var g=h.model.categoryLabel,y=c.parcatsViewModel.model.count,v=0;c.categoryViewModel.bands.forEach((function(t){t.color===c.color&&(v+=t.count)}));var x=h.model.count,_=0;f.pathSelection.each((function(t){t.model.color===c.color&&(_+=t.model.count)}));var b=v/y,w=v/_,T=v/x,k={countLabel:v,categoryLabel:g,probabilityLabel:b.toFixed(3)},A=[];-1!==h.parcatsViewModel.hoverinfoItems.indexOf(\"count\")&&A.push([\"Count:\",k.countLabel].join(\" \")),-1!==h.parcatsViewModel.hoverinfoItems.indexOf(\"probability\")&&(A.push(\"P(color ∩ \"+g+\"): \"+k.probabilityLabel),A.push(\"P(\"+g+\" | color): \"+w.toFixed(3)),A.push(\"P(color | \"+g+\"): \"+T.toFixed(3)));var M=A.join(\"
\"),S=u.mostReadable(c.color,[\"black\",\"white\"]);return{trace:d,x:o*(i-e.left),y:s*(m-e.top),text:M,color:c.color,borderColor:\"black\",fontFamily:'Monaco, \"Courier New\", monospace',fontColor:S,fontSize:10,idealAlign:a,hovertemplate:d.hovertemplate,hovertemplateLabels:k,eventData:[{data:d._input,fullData:d,category:g,count:y,probability:b,categorycount:x,colorcount:_,bandcolorcount:v}]}}(r,a,c):\"dimension\"===l&&(e=function(t,e,r){var i=[];return n.select(r.parentNode.parentNode).selectAll(\"g.category\").select(\"rect.catrect\").each((function(){i.push(E(t,e,this))})),i}(r,a,c)),e&&o.loneHover(e,{container:i._hoverlayer.node(),outerContainer:i._paper.node(),gd:r}))}}function L(t){var e=t.parcatsViewModel;e.dragDimension||(b(e.pathSelection),T(e.dimensionSelection.selectAll(\"g.category\")),k(e.dimensionSelection.selectAll(\"g.category\").selectAll(\"rect.bandrect\")),o.loneUnhover(e.graphDiv._fullLayout._hoverlayer.node()),e.pathSelection.sort(m),-1!==e.hoverinfoItems.indexOf(\"skip\"))||(\"color\"===t.parcatsViewModel.hoveron?S(this,\"plotly_unhover\",n.event):M(this,\"plotly_unhover\",n.event))}function I(t){\"fixed\"!==t.parcatsViewModel.arrangement&&(t.dragDimensionDisplayInd=t.model.displayInd,t.initialDragDimensionDisplayInds=t.parcatsViewModel.model.dimensions.map((function(t){return t.displayInd})),t.dragHasMoved=!1,t.dragCategoryDisplayInd=null,n.select(this).selectAll(\"g.category\").select(\"rect.catrect\").each((function(e){var r=n.mouse(this)[0],i=n.mouse(this)[1];-2<=r&&r<=e.width+2&&-2<=i&&i<=e.height+2&&(t.dragCategoryDisplayInd=e.model.displayInd,t.initialDragCategoryDisplayInds=t.model.categories.map((function(t){return t.displayInd})),e.model.dragY=e.y,s.raiseToTop(this.parentNode),n.select(this.parentNode).selectAll(\"rect.bandrect\").each((function(e){e.yh.y+h.height/2&&(o.model.displayInd=h.model.displayInd,h.model.displayInd=l),t.dragCategoryDisplayInd=o.model.displayInd}if(null===t.dragCategoryDisplayInd||\"freeform\"===t.parcatsViewModel.arrangement){a.model.dragX=n.event.x;var f=t.parcatsViewModel.dimensions[r],p=t.parcatsViewModel.dimensions[i];void 0!==f&&a.model.dragXp.x&&(a.model.displayInd=p.model.displayInd,p.model.displayInd=t.dragDimensionDisplayInd),t.dragDimensionDisplayInd=a.model.displayInd}j(t.parcatsViewModel),N(t.parcatsViewModel),R(t.parcatsViewModel),D(t.parcatsViewModel)}}function z(t){if(\"fixed\"!==t.parcatsViewModel.arrangement&&null!==t.dragDimensionDisplayInd){n.select(this).selectAll(\"text\").attr(\"font-weight\",\"normal\");var e={},r=O(t.parcatsViewModel),i=t.parcatsViewModel.model.dimensions.map((function(t){return t.displayInd})),o=t.initialDragDimensionDisplayInds.some((function(t,e){return t!==i[e]}));o&&i.forEach((function(r,n){var i=t.parcatsViewModel.model.dimensions[n].containerInd;e[\"dimensions[\"+i+\"].displayindex\"]=r}));var s=!1;if(null!==t.dragCategoryDisplayInd){var l=t.model.categories.map((function(t){return t.displayInd}));if(s=t.initialDragCategoryDisplayInds.some((function(t,e){return t!==l[e]}))){var c=t.model.categories.slice().sort((function(t,e){return t.displayInd-e.displayInd})),u=c.map((function(t){return t.categoryValue})),h=c.map((function(t){return t.categoryLabel}));e[\"dimensions[\"+t.model.containerInd+\"].categoryarray\"]=[u],e[\"dimensions[\"+t.model.containerInd+\"].ticktext\"]=[h],e[\"dimensions[\"+t.model.containerInd+\"].categoryorder\"]=\"array\"}}-1===t.parcatsViewModel.hoverinfoItems.indexOf(\"skip\")&&!t.dragHasMoved&&t.potentialClickBand&&(\"color\"===t.parcatsViewModel.hoveron?S(t.potentialClickBand,\"plotly_click\",n.event.sourceEvent):M(t.potentialClickBand,\"plotly_click\",n.event.sourceEvent)),t.model.dragX=null,null!==t.dragCategoryDisplayInd&&(t.parcatsViewModel.dimensions[t.dragDimensionDisplayInd].categories[t.dragCategoryDisplayInd].model.dragY=null,t.dragCategoryDisplayInd=null),t.dragDimensionDisplayInd=null,t.parcatsViewModel.dragDimension=null,t.dragHasMoved=null,t.potentialClickBand=null,j(t.parcatsViewModel),N(t.parcatsViewModel),n.transition().duration(300).ease(\"cubic-in-out\").each((function(){R(t.parcatsViewModel,!0),D(t.parcatsViewModel,!0)})).each(\"end\",(function(){(o||s)&&a.restyle(t.parcatsViewModel.graphDiv,e,[r])}))}}function O(t){for(var e,r=t.graphDiv._fullData,n=0;n=0;s--)u+=\"C\"+c[s]+\",\"+(e[s+1]+n)+\" \"+l[s]+\",\"+(e[s]+n)+\" \"+(t[s]+r[s])+\",\"+(e[s]+n),u+=\"l-\"+r[s]+\",0 \";return u+\"Z\"}function N(t){var e=t.dimensions,r=t.model,n=e.map((function(t){return t.categories.map((function(t){return t.y}))})),i=t.model.dimensions.map((function(t){return t.categories.map((function(t){return t.displayInd}))})),a=t.model.dimensions.map((function(t){return t.displayInd})),o=t.dimensions.map((function(t){return t.model.dimensionInd})),s=e.map((function(t){return t.x})),l=e.map((function(t){return t.width})),c=[];for(var u in r.paths)r.paths.hasOwnProperty(u)&&c.push(r.paths[u]);function h(t){var e=t.categoryInds.map((function(t,e){return i[e][t]}));return o.map((function(t){return e[t]}))}c.sort((function(e,r){var n=h(e),i=h(r);return\"backward\"===t.sortpaths&&(n.reverse(),i.reverse()),n.push(e.valueInds[0]),i.push(r.valueInds[0]),t.bundlecolors&&(n.unshift(e.rawColor),i.unshift(r.rawColor)),ni?1:0}));for(var f=new Array(c.length),p=e[0].model.count,d=e[0].categories.map((function(t){return t.height})).reduce((function(t,e){return t+e})),m=0;m0?d*(y.count/p):0;for(var v,x=new Array(n.length),_=0;_1?(t.width-80-16)/(n-1):0)*i;var a,o,s,l,c,u=[],h=t.model.maxCats,f=e.categories.length,p=e.count,d=t.height-8*(h-1),m=8*(h-f)/2,g=e.categories.map((function(t){return{displayInd:t.displayInd,categoryInd:t.categoryInd}}));for(g.sort((function(t,e){return t.displayInd-e.displayInd})),c=0;c0?o.count/p*d:0,s={key:o.valueInds[0],model:o,width:16,height:a,y:null!==o.dragY?o.dragY:m,bands:[],parcatsViewModel:t},m=m+a+8,u.push(s);return{key:e.dimensionInd,x:null!==e.dragX?e.dragX:r,y:0,width:16,model:e,categories:u,parcatsViewModel:t,dragCategoryDisplayInd:null,dragDimensionDisplayInd:null,initialDragDimensionDisplayInds:null,initialDragCategoryDisplayInds:null,dragHasMoved:null,potentialClickBand:null}}t.exports=function(t,e,r,n){f(r,t,n,e)}},37822:function(t,e,r){\"use strict\";var n=r(27219);t.exports=function(t,e,r,i){var a=t._fullLayout,o=a._paper,s=a._size;n(t,o,e,{width:s.w,height:s.h,margin:{t:s.t,r:s.r,b:s.b,l:s.l}},r,i)}},59549:function(t,e,r){\"use strict\";var n=r(87163),i=r(25829),a=r(80337),o=r(13792).u,s=r(93049).extendFlat,l=r(78032).templatedArray;t.exports={domain:o({name:\"parcoords\",trace:!0,editType:\"plot\"}),labelangle:{valType:\"angle\",dflt:0,editType:\"plot\"},labelside:{valType:\"enumerated\",values:[\"top\",\"bottom\"],dflt:\"top\",editType:\"plot\"},labelfont:a({editType:\"plot\"}),tickfont:a({autoShadowDflt:!0,editType:\"plot\"}),rangefont:a({editType:\"plot\"}),dimensions:l(\"dimension\",{label:{valType:\"string\",editType:\"plot\"},tickvals:s({},i.tickvals,{editType:\"plot\"}),ticktext:s({},i.ticktext,{editType:\"plot\"}),tickformat:s({},i.tickformat,{editType:\"plot\"}),visible:{valType:\"boolean\",dflt:!0,editType:\"plot\"},range:{valType:\"info_array\",items:[{valType:\"number\",editType:\"plot\"},{valType:\"number\",editType:\"plot\"}],editType:\"plot\"},constraintrange:{valType:\"info_array\",freeLength:!0,dimensions:\"1-2\",items:[{valType:\"any\",editType:\"plot\"},{valType:\"any\",editType:\"plot\"}],editType:\"plot\"},multiselect:{valType:\"boolean\",dflt:!0,editType:\"plot\"},values:{valType:\"data_array\",editType:\"calc\"},editType:\"calc\"}),line:s({editType:\"calc\"},n(\"line\",{colorscaleDflt:\"Viridis\",autoColorDflt:!1,editTypeOverride:\"calc\"})),unselected:{line:{color:{valType:\"color\",dflt:\"#7f7f7f\",editType:\"plot\"},opacity:{valType:\"number\",min:0,max:1,dflt:\"auto\",editType:\"plot\"},editType:\"plot\"},editType:\"plot\"}}},23245:function(t,e,r){\"use strict\";var n=r(77911),i=r(45568),a=r(71293).keyFun,o=r(71293).repeat,s=r(34809).sorterAsc,l=r(34809).strTranslate,c=n.bar.snapRatio;function u(t,e){return t*(1-c)+e*c}var h=n.bar.snapClose;function f(t,e){return t*(1-h)+e*h}function p(t,e,r,n){if(function(t,e){for(var r=0;r=e[r][0]&&t<=e[r][1])return!0;return!1}(r,n))return r;var i=t?-1:1,a=0,o=e.length-1;if(i<0){var s=a;a=o,o=s}for(var l=e[a],c=l,h=a;i*he){f=r;break}}if(a=u,isNaN(a)&&(a=isNaN(h)||isNaN(f)?isNaN(h)?f:h:e-c[h][1]t[1]+r||e=.9*t[1]+.1*t[0]?\"n\":e<=.9*t[0]+.1*t[1]?\"s\":\"ns\"}(d,e);m&&(o.interval=l[a],o.intervalPix=d,o.region=m)}}if(t.ordinal&&!o.region){var g=t.unitTickvals,v=t.unitToPaddedPx.invert(e);for(r=0;r=x[0]&&v<=x[1]){o.clickableOrdinalRange=x;break}}}return o}function w(t,e){i.event.sourceEvent.stopPropagation();var r=e.height-i.mouse(t)[1]-2*n.verticalPadding,a=e.brush.svgBrush;a.wasDragged=!0,a._dragging=!0,a.grabbingBar?a.newExtent=[r-a.grabPoint,r+a.barLength-a.grabPoint].map(e.unitToPaddedPx.invert):a.newExtent=[a.startExtent,e.unitToPaddedPx.invert(r)].sort(s),e.brush.filterSpecified=!0,a.extent=a.stayingIntervals.concat([a.newExtent]),a.brushCallback(e),_(t.parentNode)}function T(t,e){var r=b(e,e.height-i.mouse(t)[1]-2*n.verticalPadding),a=\"crosshair\";r.clickableOrdinalRange?a=\"pointer\":r.region&&(a=r.region+\"-resize\"),i.select(document.body).style(\"cursor\",a)}function k(t){t.on(\"mousemove\",(function(t){i.event.preventDefault(),t.parent.inBrushDrag||T(this,t)})).on(\"mouseleave\",(function(t){t.parent.inBrushDrag||v()})).call(i.behavior.drag().on(\"dragstart\",(function(t){!function(t,e){i.event.sourceEvent.stopPropagation();var r=e.height-i.mouse(t)[1]-2*n.verticalPadding,a=e.unitToPaddedPx.invert(r),o=e.brush,s=b(e,r),l=s.interval,c=o.svgBrush;if(c.wasDragged=!1,c.grabbingBar=\"ns\"===s.region,c.grabbingBar){var u=l.map(e.unitToPaddedPx);c.grabPoint=r-u[0]-n.verticalPadding,c.barLength=u[1]-u[0]}c.clickableOrdinalRange=s.clickableOrdinalRange,c.stayingIntervals=e.multiselect&&o.filterSpecified?o.filter.getConsolidated():[],l&&(c.stayingIntervals=c.stayingIntervals.filter((function(t){return t[0]!==l[0]&&t[1]!==l[1]}))),c.startExtent=s.region?l[\"s\"===s.region?1:0]:a,e.parent.inBrushDrag=!0,c.brushStartCallback()}(this,t)})).on(\"drag\",(function(t){w(this,t)})).on(\"dragend\",(function(t){!function(t,e){var r=e.brush,n=r.filter,a=r.svgBrush;a._dragging||(T(t,e),w(t,e),e.brush.svgBrush.wasDragged=!1),a._dragging=!1,i.event.sourceEvent.stopPropagation();var o=a.grabbingBar;if(a.grabbingBar=!1,a.grabLocation=void 0,e.parent.inBrushDrag=!1,v(),!a.wasDragged)return a.wasDragged=void 0,a.clickableOrdinalRange?r.filterSpecified&&e.multiselect?a.extent.push(a.clickableOrdinalRange):(a.extent=[a.clickableOrdinalRange],r.filterSpecified=!0):o?(a.extent=a.stayingIntervals,0===a.extent.length&&M(r)):M(r),a.brushCallback(e),_(t.parentNode),void a.brushEndCallback(r.filterSpecified?n.getConsolidated():[]);var s=function(){n.set(n.getConsolidated())};if(e.ordinal){var l=e.unitTickvals;l[l.length-1]a.newExtent[0];a.extent=a.stayingIntervals.concat(c?[a.newExtent]:[]),a.extent.length||M(r),a.brushCallback(e),c?_(t.parentNode,s):(s(),_(t.parentNode))}else s();a.brushEndCallback(r.filterSpecified?n.getConsolidated():[])}(this,t)})))}function A(t,e){return t[0]-e[0]}function M(t){t.filterSpecified=!1,t.svgBrush.extent=[[-1/0,1/0]]}function S(t){for(var e,r=t.slice(),n=[],i=r.shift();i;){for(e=i.slice();(i=r.shift())&&i[0]<=e[1];)e[1]=Math.max(e[1],i[1]);n.push(e)}return 1===n.length&&n[0][0]>n[0][1]&&(n=[]),n}t.exports={makeBrush:function(t,e,r,n,i,a){var o,l=function(){var t,e,r=[];return{set:function(n){1===(r=n.map((function(t){return t.slice().sort(s)})).sort(A)).length&&r[0][0]===-1/0&&r[0][1]===1/0&&(r=[[0,-1]]),t=S(r),e=r.reduce((function(t,e){return[Math.min(t[0],e[0]),Math.max(t[1],e[1])]}),[1/0,-1/0])},get:function(){return r.slice()},getConsolidated:function(){return t},getBounds:function(){return e}}}();return l.set(r),{filter:l,filterSpecified:e,svgBrush:{extent:[],brushStartCallback:n,brushCallback:(o=i,function(t){var e=t.brush,r=function(t){return t.svgBrush.extent.map((function(t){return t.slice()}))}(e),n=r.slice();e.filter.set(n),o()}),brushEndCallback:a}}},ensureAxisBrush:function(t,e,r){var i=t.selectAll(\".\"+n.cn.axisBrush).data(o,a);i.enter().append(\"g\").classed(n.cn.axisBrush,!0),function(t,e,r){var i=r._context.staticPlot,a=t.selectAll(\".background\").data(o);a.enter().append(\"rect\").classed(\"background\",!0).call(d).call(m).style(\"pointer-events\",i?\"none\":\"auto\").attr(\"transform\",l(0,n.verticalPadding)),a.call(k).attr(\"height\",(function(t){return t.height-n.verticalPadding}));var s=t.selectAll(\".highlight-shadow\").data(o);s.enter().append(\"line\").classed(\"highlight-shadow\",!0).attr(\"x\",-n.bar.width/2).attr(\"stroke-width\",n.bar.width+n.bar.strokeWidth).attr(\"stroke\",e).attr(\"opacity\",n.bar.strokeOpacity).attr(\"stroke-linecap\",\"butt\"),s.attr(\"y1\",(function(t){return t.height})).call(x);var c=t.selectAll(\".highlight\").data(o);c.enter().append(\"line\").classed(\"highlight\",!0).attr(\"x\",-n.bar.width/2).attr(\"stroke-width\",n.bar.width-n.bar.strokeWidth).attr(\"stroke\",n.bar.fillColor).attr(\"opacity\",n.bar.fillOpacity).attr(\"stroke-linecap\",\"butt\"),c.attr(\"y1\",(function(t){return t.height})).call(x)}(i,e,r)},cleanRanges:function(t,e){if(Array.isArray(t[0])?(t=t.map((function(t){return t.sort(s)})),t=e.multiselect?S(t.sort(A)):[t[0]]):t=[t.sort(s)],e.tickvals){var r=e.tickvals.slice().sort(s);if(!(t=t.map((function(t){var e=[p(0,r,t[0],[]),p(1,r,t[1],[])];if(e[1]>e[0])return e})).filter((function(t){return t}))).length)return}return t.length>1?t:t[0]}}},79846:function(t,e,r){\"use strict\";t.exports={attributes:r(59549),supplyDefaults:r(12842),calc:r(20113),colorbar:{container:\"line\",min:\"cmin\",max:\"cmax\"},moduleType:\"trace\",name:\"parcoords\",basePlotModule:r(67207),categories:[\"gl\",\"regl\",\"noOpacity\",\"noHover\"],meta:{}}},67207:function(t,e,r){\"use strict\";var n=r(45568),i=r(4173).eV,a=r(58823),o=r(62972);e.name=\"parcoords\",e.plot=function(t){var e=i(t.calcdata,\"parcoords\")[0];e.length&&a(t,e)},e.clean=function(t,e,r,n){var i=n._has&&n._has(\"parcoords\"),a=e._has&&e._has(\"parcoords\");i&&!a&&(n._paperdiv.selectAll(\".parcoords\").remove(),n._glimages.selectAll(\"*\").remove())},e.toSVG=function(t){var e=t._fullLayout._glimages,r=n.select(t).selectAll(\".svg-container\");r.filter((function(t,e){return e===r.size()-1})).selectAll(\".gl-canvas-context, .gl-canvas-focus\").each((function(){var t=this,r=t.toDataURL(\"image/png\");e.append(\"svg:image\").attr({xmlns:o.svg,\"xlink:href\":r,preserveAspectRatio:\"none\",x:0,y:0,width:t.style.width,height:t.style.height})})),window.setTimeout((function(){n.selectAll(\"#filterBarPattern\").attr(\"id\",\"filterBarPattern\")}),60)}},20113:function(t,e,r){\"use strict\";var n=r(34809).isArrayOrTypedArray,i=r(88856),a=r(71293).wrap;t.exports=function(t,e){var r,o;return i.hasColorscale(e,\"line\")&&n(e.line.color)?(r=e.line.color,o=i.extractOpts(e.line).colorscale,i.calc(t,e,{vals:r,containerStr:\"line\",cLetter:\"c\"})):(r=function(t){for(var e=new Array(t),r=0;rh&&(n.log(\"parcoords traces support up to \"+h+\" dimensions at the moment\"),d.splice(h));var m=s(t,e,{name:\"dimensions\",layout:l,handleItemDefaults:p}),g=function(t,e,r,o,s){var l=s(\"line.color\",r);if(i(t,\"line\")&&n.isArrayOrTypedArray(l)){if(l.length)return s(\"line.colorscale\"),a(t,e,o,s,{prefix:\"line.\",cLetter:\"c\"}),l.length;e.line.color=r}return 1/0}(t,e,r,l,u);o(e,l,u),Array.isArray(m)&&m.length||(e.visible=!1),f(e,m,\"values\",g);var y=n.extendFlat({},l.font,{size:Math.round(l.font.size/1.2)});n.coerceFont(u,\"labelfont\",y),n.coerceFont(u,\"tickfont\",y,{autoShadowDflt:!0}),n.coerceFont(u,\"rangefont\",y),u(\"labelangle\"),u(\"labelside\"),u(\"unselected.line.color\"),u(\"unselected.line.opacity\")}},62935:function(t,e,r){\"use strict\";var n=r(34809).isTypedArray;e.convertTypedArray=function(t){return n(t)?Array.prototype.slice.call(t):t},e.isOrdinal=function(t){return!!t.tickvals},e.isVisible=function(t){return t.visible||!(\"visible\"in t)}},83910:function(t,e,r){\"use strict\";var n=r(79846);n.plot=r(58823),t.exports=n},1293:function(t,e,r){\"use strict\";var n=[\"precision highp float;\",\"\",\"varying vec4 fragColor;\",\"\",\"attribute vec4 p01_04, p05_08, p09_12, p13_16,\",\" p17_20, p21_24, p25_28, p29_32,\",\" p33_36, p37_40, p41_44, p45_48,\",\" p49_52, p53_56, p57_60, colors;\",\"\",\"uniform mat4 dim0A, dim1A, dim0B, dim1B, dim0C, dim1C, dim0D, dim1D,\",\" loA, hiA, loB, hiB, loC, hiC, loD, hiD;\",\"\",\"uniform vec2 resolution, viewBoxPos, viewBoxSize;\",\"uniform float maskHeight;\",\"uniform float drwLayer; // 0: context, 1: focus, 2: pick\",\"uniform vec4 contextColor;\",\"uniform sampler2D maskTexture, palette;\",\"\",\"bool isPick = (drwLayer > 1.5);\",\"bool isContext = (drwLayer < 0.5);\",\"\",\"const vec4 ZEROS = vec4(0.0, 0.0, 0.0, 0.0);\",\"const vec4 UNITS = vec4(1.0, 1.0, 1.0, 1.0);\",\"\",\"float val(mat4 p, mat4 v) {\",\" return dot(matrixCompMult(p, v) * UNITS, UNITS);\",\"}\",\"\",\"float axisY(float ratio, mat4 A, mat4 B, mat4 C, mat4 D) {\",\" float y1 = val(A, dim0A) + val(B, dim0B) + val(C, dim0C) + val(D, dim0D);\",\" float y2 = val(A, dim1A) + val(B, dim1B) + val(C, dim1C) + val(D, dim1D);\",\" return y1 * (1.0 - ratio) + y2 * ratio;\",\"}\",\"\",\"int iMod(int a, int b) {\",\" return a - b * (a / b);\",\"}\",\"\",\"bool fOutside(float p, float lo, float hi) {\",\" return (lo < hi) && (lo > p || p > hi);\",\"}\",\"\",\"bool vOutside(vec4 p, vec4 lo, vec4 hi) {\",\" return (\",\" fOutside(p[0], lo[0], hi[0]) ||\",\" fOutside(p[1], lo[1], hi[1]) ||\",\" fOutside(p[2], lo[2], hi[2]) ||\",\" fOutside(p[3], lo[3], hi[3])\",\" );\",\"}\",\"\",\"bool mOutside(mat4 p, mat4 lo, mat4 hi) {\",\" return (\",\" vOutside(p[0], lo[0], hi[0]) ||\",\" vOutside(p[1], lo[1], hi[1]) ||\",\" vOutside(p[2], lo[2], hi[2]) ||\",\" vOutside(p[3], lo[3], hi[3])\",\" );\",\"}\",\"\",\"bool outsideBoundingBox(mat4 A, mat4 B, mat4 C, mat4 D) {\",\" return mOutside(A, loA, hiA) ||\",\" mOutside(B, loB, hiB) ||\",\" mOutside(C, loC, hiC) ||\",\" mOutside(D, loD, hiD);\",\"}\",\"\",\"bool outsideRasterMask(mat4 A, mat4 B, mat4 C, mat4 D) {\",\" mat4 pnts[4];\",\" pnts[0] = A;\",\" pnts[1] = B;\",\" pnts[2] = C;\",\" pnts[3] = D;\",\"\",\" for(int i = 0; i < 4; ++i) {\",\" for(int j = 0; j < 4; ++j) {\",\" for(int k = 0; k < 4; ++k) {\",\" if(0 == iMod(\",\" int(255.0 * texture2D(maskTexture,\",\" vec2(\",\" (float(i * 2 + j / 2) + 0.5) / 8.0,\",\" (pnts[i][j][k] * (maskHeight - 1.0) + 1.0) / maskHeight\",\" ))[3]\",\" ) / int(pow(2.0, float(iMod(j * 4 + k, 8)))),\",\" 2\",\" )) return true;\",\" }\",\" }\",\" }\",\" return false;\",\"}\",\"\",\"vec4 position(bool isContext, float v, mat4 A, mat4 B, mat4 C, mat4 D) {\",\" float x = 0.5 * sign(v) + 0.5;\",\" float y = axisY(x, A, B, C, D);\",\" float z = 1.0 - abs(v);\",\"\",\" z += isContext ? 0.0 : 2.0 * float(\",\" outsideBoundingBox(A, B, C, D) ||\",\" outsideRasterMask(A, B, C, D)\",\" );\",\"\",\" return vec4(\",\" 2.0 * (vec2(x, y) * viewBoxSize + viewBoxPos) / resolution - 1.0,\",\" z,\",\" 1.0\",\" );\",\"}\",\"\",\"void main() {\",\" mat4 A = mat4(p01_04, p05_08, p09_12, p13_16);\",\" mat4 B = mat4(p17_20, p21_24, p25_28, p29_32);\",\" mat4 C = mat4(p33_36, p37_40, p41_44, p45_48);\",\" mat4 D = mat4(p49_52, p53_56, p57_60, ZEROS);\",\"\",\" float v = colors[3];\",\"\",\" gl_Position = position(isContext, v, A, B, C, D);\",\"\",\" fragColor =\",\" isContext ? vec4(contextColor) :\",\" isPick ? vec4(colors.rgb, 1.0) : texture2D(palette, vec2(abs(v), 0.5));\",\"}\"].join(\"\\n\"),i=[\"precision highp float;\",\"\",\"varying vec4 fragColor;\",\"\",\"void main() {\",\" gl_FragColor = fragColor;\",\"}\"].join(\"\\n\"),a=r(77911).maxDimensionCount,o=r(34809),s=1e-6,l=new Uint8Array(4),c=new Uint8Array(4),u={shape:[256,1],format:\"rgba\",type:\"uint8\",mag:\"nearest\",min:\"nearest\"};function h(t,e,r,n,i){var a=t._gl;a.enable(a.SCISSOR_TEST),a.scissor(e,r,n,i),t.clear({color:[0,0,0,0],depth:1})}function f(t,e,r,n,i,a){var o=a.key;r.drawCompleted||(function(t){t.read({x:0,y:0,width:1,height:1,data:l})}(t),r.drawCompleted=!0),function s(l){var c=Math.min(n,i-l*n);0===l&&(window.cancelAnimationFrame(r.currentRafs[o]),delete r.currentRafs[o],h(t,a.scissorX,a.scissorY,a.scissorWidth,a.viewBoxSize[1])),r.clearOnly||(a.count=2*c,a.offset=2*l*n,e(a),l*n+c>>8*e)%256/255}function m(t,e,r){for(var n=new Array(8*e),i=0,a=0;ac&&(c=t[i].dim1.canvasX,o=i);0===s&&h(k,0,0,r.canvasWidth,r.canvasHeight);var u=function(t){var e,r,n,i=[[],[]];for(n=0;n<64;n++){var a=!t&&ns._length&&(E=E.slice(0,s._length));var L,I=s.tickvals;function P(t,e){return{val:t,text:L[e]}}function z(t,e){return t.val-e.val}if(a(I)&&I.length){i.isTypedArray(I)&&(I=Array.from(I)),L=s.ticktext,a(L)&&L.length?L.length>I.length?L=L.slice(0,I.length):I.length>L.length&&(I=I.slice(0,L.length)):L=I.map(o(s.tickformat));for(var O=1;O=r||l>=i)return;var c=t.lineLayer.readPixel(s,i-1-l),u=0!==c[3],h=u?c[2]+256*(c[1]+256*c[0]):null,f={x:s,y:l,clientX:e.clientX,clientY:e.clientY,dataIndex:t.model.key,curveNumber:h};h!==N&&(u?a.hover(f):a.unhover&&a.unhover(f),N=h)}})),B.style(\"opacity\",(function(t){return t.pick?0:1})),p.style(\"background\",\"rgba(255, 255, 255, 0)\");var j=p.selectAll(\".\"+x.cn.parcoords).data(F,m);j.exit().remove(),j.enter().append(\"g\").classed(x.cn.parcoords,!0).style(\"shape-rendering\",\"crispEdges\").style(\"pointer-events\",\"none\"),j.attr(\"transform\",(function(t){return u(t.model.translateX,t.model.translateY)}));var U=j.selectAll(\".\"+x.cn.parcoordsControlView).data(g,m);U.enter().append(\"g\").classed(x.cn.parcoordsControlView,!0),U.attr(\"transform\",(function(t){return u(t.model.pad.l,t.model.pad.t)}));var V=U.selectAll(\".\"+x.cn.yAxis).data((function(t){return t.dimensions}),m);V.enter().append(\"g\").classed(x.cn.yAxis,!0),U.each((function(t){O(V,t,w)})),B.each((function(t){if(t.viewModel){!t.lineLayer||a?t.lineLayer=b(this,t):t.lineLayer.update(t),(t.key||0===t.key)&&(t.viewModel[t.key]=t.lineLayer);var e=!t.context||a;t.lineLayer.render(t.viewModel.panels,e)}})),V.attr(\"transform\",(function(t){return u(t.xScale(t.xIndex),0)})),V.call(n.behavior.drag().origin((function(t){return t})).on(\"drag\",(function(t){var e=t.parent;E.linePickActive(!1),t.x=Math.max(-x.overdrag,Math.min(t.model.width+x.overdrag,n.event.x)),t.canvasX=t.x*t.model.canvasPixelRatio,V.sort((function(t,e){return t.x-e.x})).each((function(e,r){e.xIndex=r,e.x=t===e?e.x:e.xScale(e.xIndex),e.canvasX=e.x*e.model.canvasPixelRatio})),O(V,e,w),V.filter((function(e){return 0!==Math.abs(t.xIndex-e.xIndex)})).attr(\"transform\",(function(t){return u(t.xScale(t.xIndex),0)})),n.select(this).attr(\"transform\",u(t.x,0)),V.each((function(r,n,i){i===t.parent.key&&(e.dimensions[n]=r)})),e.contextLayer&&e.contextLayer.render(e.panels,!1,!C(e)),e.focusLayer.render&&e.focusLayer.render(e.panels)})).on(\"dragend\",(function(t){var e=t.parent;t.x=t.xScale(t.xIndex),t.canvasX=t.x*t.model.canvasPixelRatio,O(V,e,w),n.select(this).attr(\"transform\",(function(t){return u(t.x,0)})),e.contextLayer&&e.contextLayer.render(e.panels,!1,!C(e)),e.focusLayer&&e.focusLayer.render(e.panels),e.pickLayer&&e.pickLayer.render(e.panels,!0),E.linePickActive(!0),a&&a.axesMoved&&a.axesMoved(e.key,e.dimensions.map((function(t){return t.crossfilterDimensionIndex})))}))),V.exit().remove();var q=V.selectAll(\".\"+x.cn.axisOverlays).data(g,m);q.enter().append(\"g\").classed(x.cn.axisOverlays,!0),q.selectAll(\".\"+x.cn.axis).remove();var H=q.selectAll(\".\"+x.cn.axis).data(g,m);H.enter().append(\"g\").classed(x.cn.axis,!0),H.each((function(t){var e=t.model.height/t.model.tickDistance,r=t.domainScale,i=r.domain();n.select(this).call(n.svg.axis().orient(\"left\").tickSize(4).outerTickSize(2).ticks(e,t.tickFormat).tickValues(t.ordinal?i:null).tickFormat((function(e){return v.isOrdinal(t)?e:D(t.model.dimensions[t.visibleIndex],e)})).scale(r)),f.font(H.selectAll(\"text\"),t.model.tickFont)})),H.selectAll(\".domain, .tick>line\").attr(\"fill\",\"none\").attr(\"stroke\",\"black\").attr(\"stroke-opacity\",.25).attr(\"stroke-width\",\"1px\"),H.selectAll(\"text\").style(\"cursor\",\"default\");var G=q.selectAll(\".\"+x.cn.axisHeading).data(g,m);G.enter().append(\"g\").classed(x.cn.axisHeading,!0);var Z=G.selectAll(\".\"+x.cn.axisTitle).data(g,m);Z.enter().append(\"text\").classed(x.cn.axisTitle,!0).attr(\"text-anchor\",\"middle\").style(\"cursor\",\"ew-resize\").style(\"pointer-events\",o?\"none\":\"auto\"),Z.text((function(t){return t.label})).each((function(e){var r=n.select(this);f.font(r,e.model.labelFont),h.convertToTspans(r,t)})).attr(\"transform\",(function(t){var e=z(t.model.labelAngle,t.model.labelSide),r=x.axisTitleOffset;return(e.dir>0?\"\":u(0,2*r+t.model.height))+c(e.degrees)+u(-r*e.dx,-r*e.dy)})).attr(\"text-anchor\",(function(t){var e=z(t.model.labelAngle,t.model.labelSide);return 2*Math.abs(e.dx)>Math.abs(e.dy)?e.dir*e.dx<0?\"start\":\"end\":\"middle\"}));var W=q.selectAll(\".\"+x.cn.axisExtent).data(g,m);W.enter().append(\"g\").classed(x.cn.axisExtent,!0);var Y=W.selectAll(\".\"+x.cn.axisExtentTop).data(g,m);Y.enter().append(\"g\").classed(x.cn.axisExtentTop,!0),Y.attr(\"transform\",u(0,-x.axisExtentOffset));var X=Y.selectAll(\".\"+x.cn.axisExtentTopText).data(g,m);X.enter().append(\"text\").classed(x.cn.axisExtentTopText,!0).call(P),X.text((function(t){return R(t,!0)})).each((function(t){f.font(n.select(this),t.model.rangeFont)}));var $=W.selectAll(\".\"+x.cn.axisExtentBottom).data(g,m);$.enter().append(\"g\").classed(x.cn.axisExtentBottom,!0),$.attr(\"transform\",(function(t){return u(0,t.model.height+x.axisExtentOffset)}));var J=$.selectAll(\".\"+x.cn.axisExtentBottomText).data(g,m);J.enter().append(\"text\").classed(x.cn.axisExtentBottomText,!0).attr(\"dy\",\"0.75em\").call(P),J.text((function(t){return R(t,!1)})).each((function(t){f.font(n.select(this),t.model.rangeFont)})),_.ensureAxisBrush(q,k,t)}},58823:function(t,e,r){\"use strict\";var n=r(16019),i=r(22459),a=r(62935).isVisible,o={};function s(t,e,r){var n=e.indexOf(r),i=t.indexOf(n);return-1===i&&(i+=e.length),i}(t.exports=function(t,e){var r=t._fullLayout;if(i(t,[],o)){var l={},c={},u={},h={},f=r._size;e.forEach((function(e,r){var n=e[0].trace;u[r]=n.index;var i=h[r]=n._fullInput.index;l[r]=t.data[i].dimensions,c[r]=t.data[i].dimensions.slice()})),n(t,e,{width:f.w,height:f.h,margin:{t:f.t,r:f.r,b:f.b,l:f.l}},{filterChanged:function(e,n,i){var a=c[e][n],o=i.map((function(t){return t.slice()})),s=\"dimensions[\"+n+\"].constraintrange\",l=r._tracePreGUI[t._fullData[u[e]]._fullInput.uid];if(void 0===l[s]){var f=a.constraintrange;l[s]=f||null}var p=t._fullData[u[e]].dimensions[n];o.length?(1===o.length&&(o=o[0]),a.constraintrange=o,p.constraintrange=o.slice(),o=[o]):(delete a.constraintrange,delete p.constraintrange,o=null);var d={};d[s]=o,t.emit(\"plotly_restyle\",[d,[h[e]]])},hover:function(e){t.emit(\"plotly_hover\",e)},unhover:function(e){t.emit(\"plotly_unhover\",e)},axesMoved:function(e,r){var n=function(t,e){return function(r,n){return s(t,e,r)-s(t,e,n)}}(r,c[e].filter(a));l[e].sort(n),c[e].filter((function(t){return!a(t)})).sort((function(t){return c[e].indexOf(t)})).forEach((function(t){l[e].splice(l[e].indexOf(t),1),l[e].splice(c[e].indexOf(t),0,t)})),t.emit(\"plotly_restyle\",[{dimensions:[l[e]]},[h[e]]])}})}}).reglPrecompiled=o},55412:function(t,e,r){\"use strict\";var n=r(9829),i=r(13792).u,a=r(80337),o=r(10229),s=r(3208).rb,l=r(3208).ay,c=r(93049).extendFlat,u=r(94850).k,h=a({editType:\"plot\",arrayOk:!0,colorEditType:\"plot\"});t.exports={labels:{valType:\"data_array\",editType:\"calc\"},label0:{valType:\"number\",dflt:0,editType:\"calc\"},dlabel:{valType:\"number\",dflt:1,editType:\"calc\"},values:{valType:\"data_array\",editType:\"calc\"},marker:{colors:{valType:\"data_array\",editType:\"calc\"},line:{color:{valType:\"color\",dflt:o.defaultLine,arrayOk:!0,editType:\"style\"},width:{valType:\"number\",min:0,dflt:0,arrayOk:!0,editType:\"style\"},editType:\"calc\"},pattern:u,editType:\"calc\"},text:{valType:\"data_array\",editType:\"plot\"},hovertext:{valType:\"string\",dflt:\"\",arrayOk:!0,editType:\"style\"},scalegroup:{valType:\"string\",dflt:\"\",editType:\"calc\"},textinfo:{valType:\"flaglist\",flags:[\"label\",\"text\",\"value\",\"percent\"],extras:[\"none\"],editType:\"calc\"},hoverinfo:c({},n.hoverinfo,{flags:[\"label\",\"text\",\"value\",\"percent\",\"name\"]}),hovertemplate:s({},{keys:[\"label\",\"color\",\"value\",\"percent\",\"text\"]}),texttemplate:l({editType:\"plot\"},{keys:[\"label\",\"color\",\"value\",\"percent\",\"text\"]}),textposition:{valType:\"enumerated\",values:[\"inside\",\"outside\",\"auto\",\"none\"],dflt:\"auto\",arrayOk:!0,editType:\"plot\"},textfont:c({},h,{}),insidetextorientation:{valType:\"enumerated\",values:[\"horizontal\",\"radial\",\"tangential\",\"auto\"],dflt:\"auto\",editType:\"plot\"},insidetextfont:c({},h,{}),outsidetextfont:c({},h,{}),automargin:{valType:\"boolean\",dflt:!1,editType:\"plot\"},title:{text:{valType:\"string\",dflt:\"\",editType:\"plot\"},font:c({},h,{}),position:{valType:\"enumerated\",values:[\"top left\",\"top center\",\"top right\",\"middle center\",\"bottom left\",\"bottom center\",\"bottom right\"],editType:\"plot\"},editType:\"plot\"},domain:i({name:\"pie\",trace:!0,editType:\"calc\"}),hole:{valType:\"number\",min:0,max:1,dflt:0,editType:\"calc\"},sort:{valType:\"boolean\",dflt:!0,editType:\"calc\"},direction:{valType:\"enumerated\",values:[\"clockwise\",\"counterclockwise\"],dflt:\"counterclockwise\",editType:\"calc\"},rotation:{valType:\"angle\",dflt:0,editType:\"calc\"},pull:{valType:\"number\",min:0,max:1,dflt:0,arrayOk:!0,editType:\"calc\"},_deprecated:{title:{valType:\"string\",dflt:\"\",editType:\"calc\"},titlefont:c({},h,{}),titleposition:{valType:\"enumerated\",values:[\"top left\",\"top center\",\"top right\",\"middle center\",\"bottom left\",\"bottom center\",\"bottom right\"],editType:\"calc\"}}}},96052:function(t,e,r){\"use strict\";var n=r(44122);e.name=\"pie\",e.plot=function(t,r,i,a){n.plotBasePlot(e.name,t,r,i,a)},e.clean=function(t,r,i,a){n.cleanBasePlot(e.name,t,r,i,a)}},44148:function(t,e,r){\"use strict\";var n=r(10721),i=r(65657),a=r(78766),o={};function s(t){return function(e,r){return!!e&&!!(e=i(e)).isValid()&&(e=a.addOpacity(e,e.getAlpha()),t[r]||(t[r]=e),e)}}function l(t,e){var r,n=JSON.stringify(t),a=e[n];if(!a){for(a=t.slice(),r=0;r=0})),(\"funnelarea\"===e.type?y:e.sort)&&a.sort((function(t,e){return e.v-t.v})),a[0]&&(a[0].vTotal=g),a},crossTraceCalc:function(t,e){var r=(e||{}).type;r||(r=\"pie\");var n=t._fullLayout,i=t.calcdata,a=n[r+\"colorway\"],s=n[\"_\"+r+\"colormap\"];n[\"extend\"+r+\"colors\"]&&(a=l(a,o));for(var c=0,u=0;u0){s=!0;break}}s||(o=0)}return{hasLabels:r,hasValues:a,len:o}}function u(t,e,r,n,i){n(\"marker.line.width\")&&n(\"marker.line.color\",i?void 0:r.paper_bgcolor);var a=n(\"marker.colors\");l(n,\"marker.pattern\",a),t.marker&&!e.marker.pattern.fgcolor&&(e.marker.pattern.fgcolor=t.marker.colors),e.marker.pattern.bgcolor||(e.marker.pattern.bgcolor=r.paper_bgcolor)}t.exports={handleLabelsAndValues:c,handleMarkerDefaults:u,supplyDefaults:function(t,e,r,n){function l(r,n){return i.coerce(t,e,a,r,n)}var h=c(l(\"labels\"),l(\"values\")),f=h.len;if(e._hasLabels=h.hasLabels,e._hasValues=h.hasValues,!e._hasLabels&&e._hasValues&&(l(\"label0\"),l(\"dlabel\")),f){e._length=f,u(t,e,n,l,!0),l(\"scalegroup\");var p,d=l(\"text\"),m=l(\"texttemplate\");if(m||(p=l(\"textinfo\",i.isArrayOrTypedArray(d)?\"text+percent\":\"percent\")),l(\"hovertext\"),l(\"hovertemplate\"),m||p&&\"none\"!==p){var g=l(\"textposition\");s(t,e,n,l,g,{moduleHasSelected:!1,moduleHasUnselected:!1,moduleHasConstrain:!1,moduleHasCliponaxis:!1,moduleHasTextangle:!1,moduleHasInsideanchor:!1}),(Array.isArray(g)||\"auto\"===g||\"outside\"===g)&&l(\"automargin\"),(\"inside\"===g||\"auto\"===g||Array.isArray(g))&&l(\"insidetextorientation\")}else\"none\"===p&&l(\"textposition\",\"none\");o(e,n,l);var y=l(\"hole\");if(l(\"title.text\")){var v=l(\"title.position\",y?\"middle center\":\"top center\");y||\"middle center\"!==v||(e.title.position=\"top center\"),i.coerceFont(l,\"title.font\",n.font)}l(\"sort\"),l(\"direction\"),l(\"rotation\"),l(\"pull\")}else e.visible=!1}}},50568:function(t,e,r){\"use strict\";var n=r(36040).appendArrayMultiPointValues;t.exports=function(t,e){var r={curveNumber:e.index,pointNumbers:t.pts,data:e._input,fullData:e,label:t.label,color:t.color,value:t.v,percent:t.percent,text:t.text,bbox:t.bbox,v:t.v};return 1===t.pts.length&&(r.pointNumber=r.i=t.pts[0]),n(r,e,t.pts),\"funnelarea\"===e.type&&(delete r.v,delete r.i),r}},75067:function(t,e,r){\"use strict\";var n=r(62203),i=r(78766);t.exports=function(t,e,r,a){var o=r.marker.pattern;o&&o.shape?n.pointStyle(t,r,a,e):i.fill(t,e.color)}},37252:function(t,e,r){\"use strict\";var n=r(34809);function i(t){return-1!==t.indexOf(\"e\")?t.replace(/[.]?0+e/,\"e\"):-1!==t.indexOf(\".\")?t.replace(/[.]?0+$/,\"\"):t}e.formatPiePercent=function(t,e){var r=i((100*t).toPrecision(3));return n.numSeparate(r,e)+\"%\"},e.formatPieValue=function(t,e){var r=i(t.toPrecision(10));return n.numSeparate(r,e)},e.getFirstFilled=function(t,e){if(n.isArrayOrTypedArray(t))for(var r=0;r\"),name:h.hovertemplate||-1!==f.indexOf(\"name\")?h.name:void 0,idealAlign:t.pxmid[0]<0?\"left\":\"right\",color:g.castOption(b.bgcolor,t.pts)||t.color,borderColor:g.castOption(b.bordercolor,t.pts),fontFamily:g.castOption(w.family,t.pts),fontSize:g.castOption(w.size,t.pts),fontColor:g.castOption(w.color,t.pts),nameLength:g.castOption(b.namelength,t.pts),textAlign:g.castOption(b.align,t.pts),hovertemplate:g.castOption(h.hovertemplate,t.pts),hovertemplateLabels:t,eventData:[y(t,h)]},{container:r._hoverlayer.node(),outerContainer:r._paper.node(),gd:e,inOut_bbox:T}),t.bbox=T[0],c._hasHoverLabel=!0}c._hasHoverEvent=!0,e.emit(\"plotly_hover\",{points:[y(t,h)],event:n.event})}})),t.on(\"mouseout\",(function(t){var r=e._fullLayout,i=e._fullData[c.index],o=n.select(this).datum();c._hasHoverEvent&&(t.originalEvent=n.event,e.emit(\"plotly_unhover\",{points:[y(o,i)],event:n.event}),c._hasHoverEvent=!1),c._hasHoverLabel&&(a.loneUnhover(r._hoverlayer.node()),c._hasHoverLabel=!1)})),t.on(\"click\",(function(t){var r=e._fullLayout,i=e._fullData[c.index];e._dragging||!1===r.hovermode||(e._hoverdata=[y(t,i)],a.click(e,n.event))}))}function _(t,e,r){var n=g.castOption(t.insidetextfont.color,e.pts);!n&&t._input.textfont&&(n=g.castOption(t._input.textfont.color,e.pts));var i=g.castOption(t.insidetextfont.family,e.pts)||g.castOption(t.textfont.family,e.pts)||r.family,a=g.castOption(t.insidetextfont.size,e.pts)||g.castOption(t.textfont.size,e.pts)||r.size,s=g.castOption(t.insidetextfont.weight,e.pts)||g.castOption(t.textfont.weight,e.pts)||r.weight,l=g.castOption(t.insidetextfont.style,e.pts)||g.castOption(t.textfont.style,e.pts)||r.style,c=g.castOption(t.insidetextfont.variant,e.pts)||g.castOption(t.textfont.variant,e.pts)||r.variant,u=g.castOption(t.insidetextfont.textcase,e.pts)||g.castOption(t.textfont.textcase,e.pts)||r.textcase,h=g.castOption(t.insidetextfont.lineposition,e.pts)||g.castOption(t.textfont.lineposition,e.pts)||r.lineposition,f=g.castOption(t.insidetextfont.shadow,e.pts)||g.castOption(t.textfont.shadow,e.pts)||r.shadow;return{color:n||o.contrast(e.color),family:i,size:a,weight:s,style:l,variant:c,textcase:u,lineposition:h,shadow:f}}function b(t,e){for(var r,n,i=0;ie&&e>n||r=-4;g-=2)y(Math.PI*g,\"tan\");for(g=4;g>=-4;g-=2)y(Math.PI*(g+1),\"tan\")}if(h||p){for(g=4;g>=-4;g-=2)y(Math.PI*(g+1.5),\"rad\");for(g=4;g>=-4;g-=2)y(Math.PI*(g+.5),\"rad\")}}if(s||d||h){var v=Math.sqrt(t.width*t.width+t.height*t.height);if((a={scale:i*n*2/v,rCenter:1-i,rotate:0}).textPosAngle=(e.startangle+e.stopangle)/2,a.scale>=1)return a;m.push(a)}(d||p)&&((a=T(t,n,o,l,c)).textPosAngle=(e.startangle+e.stopangle)/2,m.push(a)),(d||f)&&((a=k(t,n,o,l,c)).textPosAngle=(e.startangle+e.stopangle)/2,m.push(a));for(var x=0,_=0,b=0;b=1)break}return m[x]}function T(t,e,r,n,i){e=Math.max(0,e-2*m);var a=t.width/t.height,o=S(a,n,e,r);return{scale:2*o/t.height,rCenter:A(a,o/e),rotate:M(i)}}function k(t,e,r,n,i){e=Math.max(0,e-2*m);var a=t.height/t.width,o=S(a,n,e,r);return{scale:2*o/t.width,rCenter:A(a,o/e),rotate:M(i+Math.PI/2)}}function A(t,e){return Math.cos(e)-t*e}function M(t){return(180/Math.PI*t+720)%180-90}function S(t,e,r,n){var i=t+1/(2*Math.tan(e));return r*Math.min(1/(Math.sqrt(i*i+.5)+i),n/(Math.sqrt(t*t+n/2)+t))}function E(t,e){return t.v!==e.vTotal||e.trace.hole?Math.min(1/(1+1/Math.sin(t.halfangle)),t.ring/2):1}function C(t,e){var r=e.pxmid[0],n=e.pxmid[1],i=t.width/2,a=t.height/2;return r<0&&(i*=-1),n<0&&(a*=-1),{scale:1,rCenter:1,rotate:0,x:i+Math.abs(a)*(i>0?1:-1)/2,y:a/(1+r*r/(n*n)),outside:!0}}function L(t,e){var r,n,i,a=t.trace,o={x:t.cx,y:t.cy},s={tx:0,ty:0};s.ty+=a.title.font.size,i=P(a),-1!==a.title.position.indexOf(\"top\")?(o.y-=(1+i)*t.r,s.ty-=t.titleBox.height):-1!==a.title.position.indexOf(\"bottom\")&&(o.y+=(1+i)*t.r);var l,c=t.r/(void 0===(l=t.trace.aspectratio)?1:l),u=e.w*(a.domain.x[1]-a.domain.x[0])/2;return-1!==a.title.position.indexOf(\"left\")?(u+=c,o.x-=(1+i)*c,s.tx+=t.titleBox.width/2):-1!==a.title.position.indexOf(\"center\")?u*=2:-1!==a.title.position.indexOf(\"right\")&&(u+=c,o.x+=(1+i)*c,s.tx-=t.titleBox.width/2),r=u/t.titleBox.width,n=I(t,e)/t.titleBox.height,{x:o.x,y:o.y,scale:Math.min(r,n),tx:s.tx,ty:s.ty}}function I(t,e){var r=t.trace,n=e.h*(r.domain.y[1]-r.domain.y[0]);return Math.min(t.titleBox.height,n/2)}function P(t){var e,r=t.pull;if(!r)return 0;if(l.isArrayOrTypedArray(r))for(r=0,e=0;er&&(r=t.pull[e]);return r}function z(t,e){for(var r=[],n=0;n1?u=(c=r.r)/i.aspectratio:c=(u=r.r)*i.aspectratio,l=(c*=(1+i.baseratio)/2)*u}o=Math.min(o,l/r.vTotal)}for(n=0;n\")}if(a){var x=l.castOption(i,e.i,\"texttemplate\");if(x){var _=function(t){return{label:t.label,value:t.v,valueLabel:g.formatPieValue(t.v,n.separators),percent:t.v/r.vTotal,percentLabel:g.formatPiePercent(t.v/r.vTotal,n.separators),color:t.color,text:t.text,customdata:l.castOption(i,t.i,\"customdata\")}}(e),b=g.getFirstFilled(i.text,e.pts);(v(b)||\"\"===b)&&(_.text=b),e.text=l.texttemplateString(x,_,t._fullLayout._d3locale,_,i._meta||{})}else e.text=\"\"}}function R(t,e){var r=t.rotate*Math.PI/180,n=Math.cos(r),i=Math.sin(r),a=(e.left+e.right)/2,o=(e.top+e.bottom)/2;t.textX=a*n-o*i,t.textY=a*i+o*n,t.noCenter=!0}t.exports={plot:function(t,e){var r=t._context.staticPlot,a=t._fullLayout,f=a._size;d(\"pie\",a),b(e,t),z(e,f);var m=l.makeTraceGroups(a._pielayer,e,\"trace\").each((function(e){var d=n.select(this),m=e[0],y=m.trace;!function(t){var e,r,n,i=t[0],a=i.r,o=i.trace,s=g.getRotationAngle(o.rotation),l=2*Math.PI/i.vTotal,c=\"px0\",u=\"px1\";if(\"counterclockwise\"===o.direction){for(e=0;ei.vTotal/2?1:0,r.halfangle=Math.PI*Math.min(r.v/i.vTotal,.5),r.ring=1-o.hole,r.rInscribed=E(r,i))}(e),d.attr(\"stroke-linejoin\",\"round\"),d.each((function(){var v=n.select(this).selectAll(\"g.slice\").data(e);v.enter().append(\"g\").classed(\"slice\",!0),v.exit().remove();var b=[[[],[]],[[],[]]],T=!1;v.each((function(i,o){if(i.hidden)n.select(this).selectAll(\"path,g\").remove();else{i.pointNumber=i.i,i.curveNumber=y.index,b[i.pxmid[1]<0?0:1][i.pxmid[0]<0?0:1].push(i);var c=m.cx,u=m.cy,f=n.select(this),d=f.selectAll(\"path.surface\").data([i]);if(d.enter().append(\"path\").classed(\"surface\",!0).style({\"pointer-events\":r?\"none\":\"all\"}),f.call(x,t,e),y.pull){var v=+g.castOption(y.pull,i.pts)||0;v>0&&(c+=v*i.pxmid[0],u+=v*i.pxmid[1])}i.cxFinal=c,i.cyFinal=u;var k=y.hole;if(i.v===m.vTotal){var A=\"M\"+(c+i.px0[0])+\",\"+(u+i.px0[1])+I(i.px0,i.pxmid,!0,1)+I(i.pxmid,i.px0,!0,1)+\"Z\";k?d.attr(\"d\",\"M\"+(c+k*i.px0[0])+\",\"+(u+k*i.px0[1])+I(i.px0,i.pxmid,!1,k)+I(i.pxmid,i.px0,!1,k)+\"Z\"+A):d.attr(\"d\",A)}else{var M=I(i.px0,i.px1,!0,1);if(k){var S=1-k;d.attr(\"d\",\"M\"+(c+k*i.px1[0])+\",\"+(u+k*i.px1[1])+I(i.px1,i.px0,!1,k)+\"l\"+S*i.px0[0]+\",\"+S*i.px0[1]+M+\"Z\")}else d.attr(\"d\",\"M\"+c+\",\"+u+\"l\"+i.px0[0]+\",\"+i.px0[1]+M+\"Z\")}D(t,i,m);var E=g.castOption(y.textposition,i.pts),L=f.selectAll(\"g.slicetext\").data(i.text&&\"none\"!==E?[0]:[]);L.enter().append(\"g\").classed(\"slicetext\",!0),L.exit().remove(),L.each((function(){var r=l.ensureSingle(n.select(this),\"text\",\"\",(function(t){t.attr(\"data-notex\",1)})),f=l.ensureUniformFontSize(t,\"outside\"===E?function(t,e,r){return{color:g.castOption(t.outsidetextfont.color,e.pts)||g.castOption(t.textfont.color,e.pts)||r.color,family:g.castOption(t.outsidetextfont.family,e.pts)||g.castOption(t.textfont.family,e.pts)||r.family,size:g.castOption(t.outsidetextfont.size,e.pts)||g.castOption(t.textfont.size,e.pts)||r.size,weight:g.castOption(t.outsidetextfont.weight,e.pts)||g.castOption(t.textfont.weight,e.pts)||r.weight,style:g.castOption(t.outsidetextfont.style,e.pts)||g.castOption(t.textfont.style,e.pts)||r.style,variant:g.castOption(t.outsidetextfont.variant,e.pts)||g.castOption(t.textfont.variant,e.pts)||r.variant,textcase:g.castOption(t.outsidetextfont.textcase,e.pts)||g.castOption(t.textfont.textcase,e.pts)||r.textcase,lineposition:g.castOption(t.outsidetextfont.lineposition,e.pts)||g.castOption(t.textfont.lineposition,e.pts)||r.lineposition,shadow:g.castOption(t.outsidetextfont.shadow,e.pts)||g.castOption(t.textfont.shadow,e.pts)||r.shadow}}(y,i,a.font):_(y,i,a.font));r.text(i.text).attr({class:\"slicetext\",transform:\"\",\"text-anchor\":\"middle\"}).call(s.font,f).call(h.convertToTspans,t);var d,v=s.bBox(r.node());if(\"outside\"===E)d=C(v,i);else if(d=w(v,i,m),\"auto\"===E&&d.scale<1){var x=l.ensureUniformFontSize(t,y.outsidetextfont);r.call(s.font,x),d=C(v=s.bBox(r.node()),i)}var b=d.textPosAngle,k=void 0===b?i.pxmid:O(m.r,b);if(d.targetX=c+k[0]*d.rCenter+(d.x||0),d.targetY=u+k[1]*d.rCenter+(d.y||0),R(d,v),d.outside){var A=d.targetY;i.yLabelMin=A-v.height/2,i.yLabelMid=A,i.yLabelMax=A+v.height/2,i.labelExtraX=0,i.labelExtraY=0,T=!0}d.fontSize=f.size,p(y.type,d,a),e[o].transform=d,l.setTransormAndDisplay(r,d)}))}function I(t,e,r,n){var a=n*(e[0]-t[0]),o=n*(e[1]-t[1]);return\"a\"+n*m.r+\",\"+n*m.r+\" 0 \"+i.largeArc+(r?\" 1 \":\" 0 \")+a+\",\"+o}}));var k=n.select(this).selectAll(\"g.titletext\").data(y.title.text?[0]:[]);if(k.enter().append(\"g\").classed(\"titletext\",!0),k.exit().remove(),k.each((function(){var e,r=l.ensureSingle(n.select(this),\"text\",\"\",(function(t){t.attr(\"data-notex\",1)})),i=y.title.text;y._meta&&(i=l.templateString(i,y._meta)),r.text(i).attr({class:\"titletext\",transform:\"\",\"text-anchor\":\"middle\"}).call(s.font,y.title.font).call(h.convertToTspans,t),e=\"middle center\"===y.title.position?function(t){var e=Math.sqrt(t.titleBox.width*t.titleBox.width+t.titleBox.height*t.titleBox.height);return{x:t.cx,y:t.cy,scale:t.trace.hole*t.r*2/e,tx:0,ty:-t.titleBox.height/2+t.trace.title.font.size}}(m):L(m,f),r.attr(\"transform\",u(e.x,e.y)+c(Math.min(1,e.scale))+u(e.tx,e.ty))})),T&&function(t,e){var r,n,i,a,o,s,c,u,h,f,p,d,m;function y(t,e){return t.pxmid[1]-e.pxmid[1]}function v(t,e){return e.pxmid[1]-t.pxmid[1]}function x(t,r){r||(r={});var i,u,h,p,d=r.labelExtraY+(n?r.yLabelMax:r.yLabelMin),m=n?t.yLabelMin:t.yLabelMax,y=n?t.yLabelMax:t.yLabelMin,v=t.cyFinal+o(t.px0[1],t.px1[1]),x=d-m;if(x*c>0&&(t.labelExtraY=x),l.isArrayOrTypedArray(e.pull))for(u=0;u=(g.castOption(e.pull,h.pts)||0)||((t.pxmid[1]-h.pxmid[1])*c>0?(x=h.cyFinal+o(h.px0[1],h.px1[1])-m-t.labelExtraY)*c>0&&(t.labelExtraY+=x):(y+t.labelExtraY-v)*c>0&&(i=3*s*Math.abs(u-f.indexOf(t)),(p=h.cxFinal+a(h.px0[0],h.px1[0])+i-(t.cxFinal+t.pxmid[0])-t.labelExtraX)*s>0&&(t.labelExtraX+=p)))}for(n=0;n<2;n++)for(i=n?y:v,o=n?Math.max:Math.min,c=n?1:-1,r=0;r<2;r++){for(a=r?Math.max:Math.min,s=r?1:-1,(u=t[n][r]).sort(i),h=t[1-n][r],f=h.concat(u),d=[],p=0;pMath.abs(h)?s+=\"l\"+h*t.pxmid[0]/t.pxmid[1]+\",\"+h+\"H\"+(a+t.labelExtraX+c):s+=\"l\"+t.labelExtraX+\",\"+u+\"v\"+(h-u)+\"h\"+c}else s+=\"V\"+(t.yLabelMid+t.labelExtraY)+\"h\"+c;l.ensureSingle(r,\"path\",\"textline\").call(o.stroke,e.outsidetextfont.color).attr({\"stroke-width\":Math.min(2,e.outsidetextfont.size/8),d:s,fill:\"none\"})}else r.select(\"path.textline\").remove()}))}(v,y),T&&y.automargin){var A=s.bBox(d.node()),M=y.domain,S=f.w*(M.x[1]-M.x[0]),E=f.h*(M.y[1]-M.y[0]),I=(.5*S-m.r)/f.w,P=(.5*E-m.r)/f.h;i.autoMargin(t,\"pie.\"+y.uid+\".automargin\",{xl:M.x[0]-I,xr:M.x[1]+I,yb:M.y[0]-P,yt:M.y[1]+P,l:Math.max(m.cx-m.r-A.left,0),r:Math.max(A.right-(m.cx+m.r),0),b:Math.max(A.bottom-(m.cy+m.r),0),t:Math.max(m.cy-m.r-A.top,0),pad:5})}}))}));setTimeout((function(){m.selectAll(\"tspan\").each((function(){var t=n.select(this);t.attr(\"dy\")&&t.attr(\"dy\",t.attr(\"dy\"))}))}),0)},formatSliceLabel:D,transformInsideText:w,determineInsideTextFont:_,positionTitleOutside:L,prerenderTitles:b,layoutAreas:z,attachFxHandlers:x,computeTransform:R}},140:function(t,e,r){\"use strict\";var n=r(45568),i=r(32891),a=r(84102).resizeText;t.exports=function(t){var e=t._fullLayout._pielayer.selectAll(\".trace\");a(t,e,\"pie\"),e.each((function(e){var r=e[0].trace,a=n.select(this);a.style({opacity:r.opacity}),a.selectAll(\"path.surface\").each((function(e){n.select(this).call(i,e,r,t)}))}))}},32891:function(t,e,r){\"use strict\";var n=r(78766),i=r(37252).castOption,a=r(75067);t.exports=function(t,e,r,o){var s=r.marker.line,l=i(s.color,e.pts)||n.defaultLine,c=i(s.width,e.pts)||0;t.call(a,e,r,o).style(\"stroke-width\",c).call(n.stroke,l)}},36961:function(t,e,r){\"use strict\";var n=r(36640);t.exports={x:n.x,y:n.y,xy:{valType:\"data_array\",editType:\"calc\"},indices:{valType:\"data_array\",editType:\"calc\"},xbounds:{valType:\"data_array\",editType:\"calc\"},ybounds:{valType:\"data_array\",editType:\"calc\"},text:n.text,marker:{color:{valType:\"color\",arrayOk:!1,editType:\"calc\"},opacity:{valType:\"number\",min:0,max:1,dflt:1,arrayOk:!1,editType:\"calc\"},blend:{valType:\"boolean\",dflt:null,editType:\"calc\"},sizemin:{valType:\"number\",min:.1,max:2,dflt:.5,editType:\"calc\"},sizemax:{valType:\"number\",min:.1,dflt:20,editType:\"calc\"},border:{color:{valType:\"color\",arrayOk:!1,editType:\"calc\"},arearatio:{valType:\"number\",min:0,max:1,dflt:0,editType:\"calc\"},editType:\"calc\"},editType:\"calc\"},transforms:void 0}},71593:function(t,e,r){\"use strict\";var n=r(99098).gl_pointcloud2d,i=r(34809).isArrayOrTypedArray,a=r(55010),o=r(32919).findExtremes,s=r(11539);function l(t,e){this.scene=t,this.uid=e,this.type=\"pointcloud\",this.pickXData=[],this.pickYData=[],this.xData=[],this.yData=[],this.textLabels=[],this.color=\"rgb(0, 0, 0)\",this.name=\"\",this.hoverinfo=\"all\",this.idToIndex=new Int32Array(0),this.bounds=[0,0,0,0],this.pointcloudOptions={positions:new Float32Array(0),idToIndex:this.idToIndex,sizemin:.5,sizemax:12,color:[0,0,0,1],areaRatio:1,borderColor:[0,0,0,1]},this.pointcloud=n(t.glplot,this.pointcloudOptions),this.pointcloud._trace=this}var c=l.prototype;c.handlePick=function(t){var e=this.idToIndex[t.pointId];return{trace:this,dataCoord:t.dataCoord,traceCoord:this.pickXYData?[this.pickXYData[2*e],this.pickXYData[2*e+1]]:[this.pickXData[e],this.pickYData[e]],textLabel:i(this.textLabels)?this.textLabels[e]:this.textLabels,color:this.color,name:this.name,pointIndex:e,hoverinfo:this.hoverinfo}},c.update=function(t){this.index=t.index,this.textLabels=t.text,this.name=t.name,this.hoverinfo=t.hoverinfo,this.bounds=[1/0,1/0,-1/0,-1/0],this.updateFast(t),this.color=s(t,{})},c.updateFast=function(t){var e,r,n,i,s,l,c=this.xData=this.pickXData=t.x,u=this.yData=this.pickYData=t.y,h=this.pickXYData=t.xy,f=t.xbounds&&t.ybounds,p=t.indices,d=this.bounds;if(h){if(n=h,e=h.length>>>1,f)d[0]=t.xbounds[0],d[2]=t.xbounds[1],d[1]=t.ybounds[0],d[3]=t.ybounds[1];else for(l=0;ld[2]&&(d[2]=i),sd[3]&&(d[3]=s);if(p)r=p;else for(r=new Int32Array(e),l=0;ld[2]&&(d[2]=i),sd[3]&&(d[3]=s);this.idToIndex=r,this.pointcloudOptions.idToIndex=r,this.pointcloudOptions.positions=n;var m=a(t.marker.color),g=a(t.marker.border.color),y=t.opacity*t.marker.opacity;m[3]*=y,this.pointcloudOptions.color=m;var v=t.marker.blend;null===v&&(v=c.length<100||u.length<100),this.pointcloudOptions.blend=v,g[3]*=y,this.pointcloudOptions.borderColor=g;var x=t.marker.sizemin,_=Math.max(t.marker.sizemax,t.marker.sizemin);this.pointcloudOptions.sizeMin=x,this.pointcloudOptions.sizeMax=_,this.pointcloudOptions.areaRatio=t.marker.border.arearatio,this.pointcloud.update(this.pointcloudOptions);var b=this.scene.xaxis,w=this.scene.yaxis,T=_/2||.5;t._extremes[b._id]=o(b,[d[0],d[2]],{ppad:T}),t._extremes[w._id]=o(w,[d[1],d[3]],{ppad:T})},c.dispose=function(){this.pointcloud.dispose()},t.exports=function(t,e){var r=new l(t,e.uid);return r.update(e),r}},75526:function(t,e,r){\"use strict\";var n=r(34809),i=r(36961);t.exports=function(t,e,r){function a(r,a){return n.coerce(t,e,i,r,a)}a(\"x\"),a(\"y\"),a(\"xbounds\"),a(\"ybounds\"),t.xy&&t.xy instanceof Float32Array&&(e.xy=t.xy),t.indices&&t.indices instanceof Int32Array&&(e.indices=t.indices),a(\"text\"),a(\"marker.color\",r),a(\"marker.opacity\"),a(\"marker.blend\"),a(\"marker.sizemin\"),a(\"marker.sizemax\"),a(\"marker.border.color\",r),a(\"marker.border.arearatio\"),e._length=null}},15186:function(t,e,r){\"use strict\";[\"*pointcloud* trace is deprecated!\",\"Please consider switching to the *scattergl* trace type.\"].join(\" \"),t.exports={attributes:r(36961),supplyDefaults:r(75526),calc:r(37593),plot:r(71593),moduleType:\"trace\",name:\"pointcloud\",basePlotModule:r(24585),categories:[\"gl\",\"gl2d\",\"showLegend\"],meta:{}}},33795:function(t,e,r){\"use strict\";var n=r(80337),i=r(9829),a=r(10229),o=r(70192),s=r(13792).u,l=r(3208).rb,c=r(87163),u=r(78032).templatedArray,h=r(80712).descriptionOnlyNumbers,f=r(93049).extendFlat,p=r(13582).overrideAll;(t.exports=p({hoverinfo:f({},i.hoverinfo,{flags:[],arrayOk:!1}),hoverlabel:o.hoverlabel,domain:s({name:\"sankey\",trace:!0}),orientation:{valType:\"enumerated\",values:[\"v\",\"h\"],dflt:\"h\"},valueformat:{valType:\"string\",dflt:\".3s\",description:h(\"value\")},valuesuffix:{valType:\"string\",dflt:\"\"},arrangement:{valType:\"enumerated\",values:[\"snap\",\"perpendicular\",\"freeform\",\"fixed\"],dflt:\"snap\"},textfont:n({autoShadowDflt:!0}),customdata:void 0,node:{label:{valType:\"data_array\",dflt:[]},groups:{valType:\"info_array\",impliedEdits:{x:[],y:[]},dimensions:2,freeLength:!0,dflt:[],items:{valType:\"number\",editType:\"calc\"}},x:{valType:\"data_array\",dflt:[]},y:{valType:\"data_array\",dflt:[]},color:{valType:\"color\",arrayOk:!0},customdata:{valType:\"data_array\",editType:\"calc\"},line:{color:{valType:\"color\",dflt:a.defaultLine,arrayOk:!0},width:{valType:\"number\",min:0,dflt:.5,arrayOk:!0}},pad:{valType:\"number\",arrayOk:!1,min:0,dflt:20},thickness:{valType:\"number\",arrayOk:!1,min:1,dflt:20},hoverinfo:{valType:\"enumerated\",values:[\"all\",\"none\",\"skip\"],dflt:\"all\"},hoverlabel:o.hoverlabel,hovertemplate:l({},{keys:[\"value\",\"label\"]}),align:{valType:\"enumerated\",values:[\"justify\",\"left\",\"right\",\"center\"],dflt:\"justify\"}},link:{arrowlen:{valType:\"number\",min:0,dflt:0},label:{valType:\"data_array\",dflt:[]},color:{valType:\"color\",arrayOk:!0},hovercolor:{valType:\"color\",arrayOk:!0},customdata:{valType:\"data_array\",editType:\"calc\"},line:{color:{valType:\"color\",dflt:a.defaultLine,arrayOk:!0},width:{valType:\"number\",min:0,dflt:0,arrayOk:!0}},source:{valType:\"data_array\",dflt:[]},target:{valType:\"data_array\",dflt:[]},value:{valType:\"data_array\",dflt:[]},hoverinfo:{valType:\"enumerated\",values:[\"all\",\"none\",\"skip\"],dflt:\"all\"},hoverlabel:o.hoverlabel,hovertemplate:l({},{keys:[\"value\",\"label\"]}),colorscales:u(\"concentrationscales\",{editType:\"calc\",label:{valType:\"string\",editType:\"calc\",dflt:\"\"},cmax:{valType:\"number\",editType:\"calc\",dflt:1},cmin:{valType:\"number\",editType:\"calc\",dflt:0},colorscale:f(c().colorscale,{dflt:[[0,\"white\"],[1,\"black\"]]})})}},\"calc\",\"nested\")).transforms=void 0},42229:function(t,e,r){\"use strict\";var n=r(13582).overrideAll,i=r(4173).eV,a=r(16506),o=r(6811),s=r(27983),l=r(14751),c=r(44844).prepSelect,u=r(34809),h=r(33626),f=\"sankey\";function p(t,e){var r=t._fullData[e],n=t._fullLayout,i=n.dragmode,a=\"pan\"===n.dragmode?\"move\":\"crosshair\",o=r._bgRect;if(o&&\"pan\"!==i&&\"zoom\"!==i){s(o,a);var f={_id:\"x\",c2p:u.identity,_offset:r._sankey.translateX,_length:r._sankey.width},p={_id:\"y\",c2p:u.identity,_offset:r._sankey.translateY,_length:r._sankey.height},d={gd:t,element:o.node(),plotinfo:{id:e,xaxis:f,yaxis:p,fillRangeItems:u.noop},subplot:e,xaxes:[f],yaxes:[p],doneFnCompleted:function(r){var n,i=t._fullData[e],a=i.node.groups.slice(),o=[];function s(t){for(var e=i._sankey.graph.nodes,r=0;rx&&(x=a.source[e]),a.target[e]>x&&(x=a.target[e]);var _,b=x+1;t.node._count=b;var w=t.node.groups,T={};for(e=0;e0&&s(C,b)&&s(L,b)&&(!T.hasOwnProperty(C)||!T.hasOwnProperty(L)||T[C]!==T[L])){T.hasOwnProperty(L)&&(L=T[L]),T.hasOwnProperty(C)&&(C=T[C]),L=+L,p[C=+C]=p[L]=!0;var I=\"\";a.label&&a.label[e]&&(I=a.label[e]);var P=null;I&&d.hasOwnProperty(I)&&(P=d[I]),c.push({pointNumber:e,label:I,color:u?a.color[e]:a.color,hovercolor:h?a.hovercolor[e]:a.hovercolor,customdata:f?a.customdata[e]:a.customdata,concentrationscale:P,source:C,target:L,value:+E}),S.source.push(C),S.target.push(L)}}var z=b+w.length,O=o(r.color),D=o(r.customdata),R=[];for(e=0;eb-1,childrenNodes:[],pointNumber:e,label:F,color:O?r.color[e]:r.color,customdata:D?r.customdata[e]:r.customdata})}var B=!1;return function(t,e,r){for(var a=i.init2dArray(t,0),o=0;o1}))}(z,S.source,S.target)&&(B=!0),{circular:B,links:c,nodes:R,groups:w,groupLookup:T}}(e);return a({circular:r.circular,_nodes:r.nodes,_links:r.links,_groups:r.groups,_groupLookup:r.groupLookup})}},21541:function(t){\"use strict\";t.exports={nodeTextOffsetHorizontal:4,nodeTextOffsetVertical:3,nodePadAcross:10,sankeyIterations:50,forceIterations:5,forceTicksPerFrame:10,duration:500,ease:\"linear\",cn:{sankey:\"sankey\",sankeyLinks:\"sankey-links\",sankeyLink:\"sankey-link\",sankeyNodeSet:\"sankey-node-set\",sankeyNode:\"sankey-node\",nodeRect:\"node-rect\",nodeLabel:\"node-label\"}}},67940:function(t,e,r){\"use strict\";var n=r(34809),i=r(33795),a=r(78766),o=r(65657),s=r(13792).N,l=r(26430),c=r(78032),u=r(59008);function h(t,e){function r(r,a){return n.coerce(t,e,i.link.colorscales,r,a)}r(\"label\"),r(\"cmin\"),r(\"cmax\"),r(\"colorscale\")}t.exports=function(t,e,r,f){function p(r,a){return n.coerce(t,e,i,r,a)}var d=n.extendDeep(f.hoverlabel,t.hoverlabel),m=t.node,g=c.newContainer(e,\"node\");function y(t,e){return n.coerce(m,g,i.node,t,e)}y(\"label\"),y(\"groups\"),y(\"x\"),y(\"y\"),y(\"pad\"),y(\"thickness\"),y(\"line.color\"),y(\"line.width\"),y(\"hoverinfo\",t.hoverinfo),l(m,g,y,d),y(\"hovertemplate\"),y(\"align\");var v=f.colorway;y(\"color\",g.label.map((function(t,e){return a.addOpacity(function(t){return v[t%v.length]}(e),.8)}))),y(\"customdata\");var x=t.link||{},_=c.newContainer(e,\"link\");function b(t,e){return n.coerce(x,_,i.link,t,e)}b(\"label\"),b(\"arrowlen\"),b(\"source\"),b(\"target\"),b(\"value\"),b(\"line.color\"),b(\"line.width\"),b(\"hoverinfo\",t.hoverinfo),l(x,_,b,d),b(\"hovertemplate\");var w,T=o(f.paper_bgcolor).getLuminance()<.333,k=b(\"color\",T?\"rgba(255, 255, 255, 0.6)\":\"rgba(0, 0, 0, 0.2)\");function A(t){var e=o(t);if(!e.isValid())return t;var r=e.getAlpha();return r<=.8?e.setAlpha(r+.2):e=T?e.brighten():e.darken(),e.toRgbString()}b(\"hovercolor\",Array.isArray(k)?k.map(A):A(k)),b(\"customdata\"),u(x,_,{name:\"colorscales\",handleItemDefaults:h}),s(e,f,p),p(\"orientation\"),p(\"valueformat\"),p(\"valuesuffix\"),g.x.length&&g.y.length&&(w=\"freeform\"),p(\"arrangement\",w),n.coerceFont(p,\"textfont\",f.font,{autoShadowDflt:!0}),e._length=null}},71760:function(t,e,r){\"use strict\";t.exports={attributes:r(33795),supplyDefaults:r(67940),calc:r(22915),plot:r(16506),moduleType:\"trace\",name:\"sankey\",basePlotModule:r(42229),selectPoints:r(74670),categories:[\"noOpacity\"],meta:{}}},16506:function(t,e,r){\"use strict\";var n=r(45568),i=r(34809),a=i.numberFormat,o=r(90958),s=r(32141),l=r(78766),c=r(21541).cn,u=i._;function h(t){return\"\"!==t}function f(t,e){return t.filter((function(t){return t.key===e.traceId}))}function p(t,e){n.select(t).select(\"path\").style(\"fill-opacity\",e),n.select(t).select(\"rect\").style(\"fill-opacity\",e)}function d(t){n.select(t).select(\"text.name\").style(\"fill\",\"black\")}function m(t){return function(e){return-1!==t.node.sourceLinks.indexOf(e.link)||-1!==t.node.targetLinks.indexOf(e.link)}}function g(t){return function(e){return-1!==e.node.sourceLinks.indexOf(t.link)||-1!==e.node.targetLinks.indexOf(t.link)}}function y(t,e,r){e&&r&&f(r,e).selectAll(\".\"+c.sankeyLink).filter(m(e)).call(x.bind(0,e,r,!1))}function v(t,e,r){e&&r&&f(r,e).selectAll(\".\"+c.sankeyLink).filter(m(e)).call(_.bind(0,e,r,!1))}function x(t,e,r,n){n.style(\"fill\",(function(t){if(!t.link.concentrationscale)return t.tinyColorHoverHue})).style(\"fill-opacity\",(function(t){if(!t.link.concentrationscale)return t.tinyColorHoverAlpha})),n.each((function(r){var n=r.link.label;\"\"!==n&&f(e,t).selectAll(\".\"+c.sankeyLink).filter((function(t){return t.link.label===n})).style(\"fill\",(function(t){if(!t.link.concentrationscale)return t.tinyColorHoverHue})).style(\"fill-opacity\",(function(t){if(!t.link.concentrationscale)return t.tinyColorHoverAlpha}))})),r&&f(e,t).selectAll(\".\"+c.sankeyNode).filter(g(t)).call(y)}function _(t,e,r,n){n.style(\"fill\",(function(t){return t.tinyColorHue})).style(\"fill-opacity\",(function(t){return t.tinyColorAlpha})),n.each((function(r){var n=r.link.label;\"\"!==n&&f(e,t).selectAll(\".\"+c.sankeyLink).filter((function(t){return t.link.label===n})).style(\"fill\",(function(t){return t.tinyColorHue})).style(\"fill-opacity\",(function(t){return t.tinyColorAlpha}))})),r&&f(e,t).selectAll(c.sankeyNode).filter(g(t)).call(v)}function b(t,e){var r=t.hoverlabel||{},n=i.nestedProperty(r,e).get();return!Array.isArray(n)&&n}t.exports=function(t,e){for(var r=t._fullLayout,i=r._paper,f=r._size,m=0;m\"),color:b(o,\"bgcolor\")||l.addOpacity(m.color,1),borderColor:b(o,\"bordercolor\"),fontFamily:b(o,\"font.family\"),fontSize:b(o,\"font.size\"),fontColor:b(o,\"font.color\"),fontWeight:b(o,\"font.weight\"),fontStyle:b(o,\"font.style\"),fontVariant:b(o,\"font.variant\"),fontTextcase:b(o,\"font.textcase\"),fontLineposition:b(o,\"font.lineposition\"),fontShadow:b(o,\"font.shadow\"),nameLength:b(o,\"namelength\"),textAlign:b(o,\"align\"),idealAlign:n.event.x\"),color:b(o,\"bgcolor\")||i.tinyColorHue,borderColor:b(o,\"bordercolor\"),fontFamily:b(o,\"font.family\"),fontSize:b(o,\"font.size\"),fontColor:b(o,\"font.color\"),fontWeight:b(o,\"font.weight\"),fontStyle:b(o,\"font.style\"),fontVariant:b(o,\"font.variant\"),fontTextcase:b(o,\"font.textcase\"),fontLineposition:b(o,\"font.lineposition\"),fontShadow:b(o,\"font.shadow\"),nameLength:b(o,\"namelength\"),textAlign:b(o,\"align\"),idealAlign:\"left\",hovertemplate:o.hovertemplate,hovertemplateLabels:v,eventData:[i.node]},{container:r._hoverlayer.node(),outerContainer:r._paper.node(),gd:t});p(w,.85),d(w)}}},unhover:function(e,i,a){!1!==t._fullLayout.hovermode&&(n.select(e).call(v,i,a),\"skip\"!==i.node.trace.node.hoverinfo&&(i.node.fullData=i.node.trace,t.emit(\"plotly_unhover\",{event:n.event,points:[i.node]})),s.loneUnhover(r._hoverlayer.node()))},select:function(e,r,i){var a=r.node;a.originalEvent=n.event,t._hoverdata=[a],n.select(e).call(v,r,i),s.click(t,{target:!0})}}})}},90958:function(t,e,r){\"use strict\";var n=r(32702),i=r(88640).Dj,a=r(45568),o=r(62369),s=r(68735),l=r(21541),c=r(65657),u=r(78766),h=r(62203),f=r(34809),p=f.strTranslate,d=f.strRotate,m=r(71293),g=m.keyFun,y=m.repeat,v=m.unwrap,x=r(30635),_=r(33626),b=r(4530),w=b.CAP_SHIFT,T=b.LINE_SPACING;function k(t,e,r){var n,i=v(e),a=i.trace,u=a.domain,h=\"h\"===a.orientation,p=a.node.pad,d=a.node.thickness,m={justify:o.sankeyJustify,left:o.sankeyLeft,right:o.sankeyRight,center:o.sankeyCenter}[a.node.align],g=t.width*(u.x[1]-u.x[0]),y=t.height*(u.y[1]-u.y[0]),x=i._nodes,_=i._links,b=i.circular;(n=b?s.sankeyCircular().circularLinkGap(0):o.sankey()).iterations(l.sankeyIterations).size(h?[g,y]:[y,g]).nodeWidth(d).nodePadding(p).nodeId((function(t){return t.pointNumber})).nodeAlign(m).nodes(x).links(_);var w,T,k,A=n();for(var M in n.nodePadding()o+d&&(a+=1,e=s.x0),o=s.x0,i[a]||(i[a]=[]),i[a].push(s),r=e-s.x0,s.x0+=r,s.x1+=r}return i}(x=A.nodes).forEach((function(t){var e,r,n,i=0,a=t.length;for(t.sort((function(t,e){return t.y0-e.y0})),n=0;n=i||(r=i-e.y0)>1e-6&&(e.y0+=r,e.y1+=r),i=e.y1+p})),n.update(A)}return{circular:b,key:r,trace:a,guid:f.randstr(),horizontal:h,width:g,height:y,nodePad:a.node.pad,nodeLineColor:a.node.line.color,nodeLineWidth:a.node.line.width,linkLineColor:a.link.line.color,linkLineWidth:a.link.line.width,linkArrowLength:a.link.arrowlen,valueFormat:a.valueformat,valueSuffix:a.valuesuffix,textFont:a.textfont,translateX:u.x[0]*t.width+t.margin.l,translateY:t.height-u.y[1]*t.height+t.margin.t,dragParallel:h?y:g,dragPerpendicular:h?g:y,arrangement:a.arrangement,sankey:n,graph:A,forceLayouts:{},interactionState:{dragInProgress:!1,hovered:!1}}}function A(t,e,r){var n=c(e.color),i=c(e.hovercolor),a=e.source.label+\"|\"+e.target.label+\"__\"+r;return e.trace=t.trace,e.curveNumber=t.trace.index,{circular:t.circular,key:a,traceId:t.key,pointNumber:e.pointNumber,link:e,tinyColorHue:u.tinyRGB(n),tinyColorAlpha:n.getAlpha(),tinyColorHoverHue:u.tinyRGB(i),tinyColorHoverAlpha:i.getAlpha(),linkPath:M,linkLineColor:t.linkLineColor,linkLineWidth:t.linkLineWidth,linkArrowLength:t.linkArrowLength,valueFormat:t.valueFormat,valueSuffix:t.valueSuffix,sankey:t.sankey,parent:t,interactionState:t.interactionState,flow:e.flow}}function M(){return function(t){var e=t.linkArrowLength;if(t.link.circular)return function(t,e){var r=t.width/2,n=t.circularPathData;return\"top\"===t.circularLinkType?\"M \"+(n.targetX-e)+\" \"+(n.targetY+r)+\" L\"+(n.rightInnerExtent-e)+\" \"+(n.targetY+r)+\"A\"+(n.rightLargeArcRadius+r)+\" \"+(n.rightSmallArcRadius+r)+\" 0 0 1 \"+(n.rightFullExtent-r-e)+\" \"+(n.targetY-n.rightSmallArcRadius)+\"L\"+(n.rightFullExtent-r-e)+\" \"+n.verticalRightInnerExtent+\"A\"+(n.rightLargeArcRadius+r)+\" \"+(n.rightLargeArcRadius+r)+\" 0 0 1 \"+(n.rightInnerExtent-e)+\" \"+(n.verticalFullExtent-r)+\"L\"+n.leftInnerExtent+\" \"+(n.verticalFullExtent-r)+\"A\"+(n.leftLargeArcRadius+r)+\" \"+(n.leftLargeArcRadius+r)+\" 0 0 1 \"+(n.leftFullExtent+r)+\" \"+n.verticalLeftInnerExtent+\"L\"+(n.leftFullExtent+r)+\" \"+(n.sourceY-n.leftSmallArcRadius)+\"A\"+(n.leftLargeArcRadius+r)+\" \"+(n.leftSmallArcRadius+r)+\" 0 0 1 \"+n.leftInnerExtent+\" \"+(n.sourceY+r)+\"L\"+n.sourceX+\" \"+(n.sourceY+r)+\"L\"+n.sourceX+\" \"+(n.sourceY-r)+\"L\"+n.leftInnerExtent+\" \"+(n.sourceY-r)+\"A\"+(n.leftLargeArcRadius-r)+\" \"+(n.leftSmallArcRadius-r)+\" 0 0 0 \"+(n.leftFullExtent-r)+\" \"+(n.sourceY-n.leftSmallArcRadius)+\"L\"+(n.leftFullExtent-r)+\" \"+n.verticalLeftInnerExtent+\"A\"+(n.leftLargeArcRadius-r)+\" \"+(n.leftLargeArcRadius-r)+\" 0 0 0 \"+n.leftInnerExtent+\" \"+(n.verticalFullExtent+r)+\"L\"+(n.rightInnerExtent-e)+\" \"+(n.verticalFullExtent+r)+\"A\"+(n.rightLargeArcRadius-r)+\" \"+(n.rightLargeArcRadius-r)+\" 0 0 0 \"+(n.rightFullExtent+r-e)+\" \"+n.verticalRightInnerExtent+\"L\"+(n.rightFullExtent+r-e)+\" \"+(n.targetY-n.rightSmallArcRadius)+\"A\"+(n.rightLargeArcRadius-r)+\" \"+(n.rightSmallArcRadius-r)+\" 0 0 0 \"+(n.rightInnerExtent-e)+\" \"+(n.targetY-r)+\"L\"+(n.targetX-e)+\" \"+(n.targetY-r)+(e>0?\"L\"+n.targetX+\" \"+n.targetY:\"\")+\"Z\":\"M \"+(n.targetX-e)+\" \"+(n.targetY-r)+\" L\"+(n.rightInnerExtent-e)+\" \"+(n.targetY-r)+\"A\"+(n.rightLargeArcRadius+r)+\" \"+(n.rightSmallArcRadius+r)+\" 0 0 0 \"+(n.rightFullExtent-r-e)+\" \"+(n.targetY+n.rightSmallArcRadius)+\"L\"+(n.rightFullExtent-r-e)+\" \"+n.verticalRightInnerExtent+\"A\"+(n.rightLargeArcRadius+r)+\" \"+(n.rightLargeArcRadius+r)+\" 0 0 0 \"+(n.rightInnerExtent-e)+\" \"+(n.verticalFullExtent+r)+\"L\"+n.leftInnerExtent+\" \"+(n.verticalFullExtent+r)+\"A\"+(n.leftLargeArcRadius+r)+\" \"+(n.leftLargeArcRadius+r)+\" 0 0 0 \"+(n.leftFullExtent+r)+\" \"+n.verticalLeftInnerExtent+\"L\"+(n.leftFullExtent+r)+\" \"+(n.sourceY+n.leftSmallArcRadius)+\"A\"+(n.leftLargeArcRadius+r)+\" \"+(n.leftSmallArcRadius+r)+\" 0 0 0 \"+n.leftInnerExtent+\" \"+(n.sourceY-r)+\"L\"+n.sourceX+\" \"+(n.sourceY-r)+\"L\"+n.sourceX+\" \"+(n.sourceY+r)+\"L\"+n.leftInnerExtent+\" \"+(n.sourceY+r)+\"A\"+(n.leftLargeArcRadius-r)+\" \"+(n.leftSmallArcRadius-r)+\" 0 0 1 \"+(n.leftFullExtent-r)+\" \"+(n.sourceY+n.leftSmallArcRadius)+\"L\"+(n.leftFullExtent-r)+\" \"+n.verticalLeftInnerExtent+\"A\"+(n.leftLargeArcRadius-r)+\" \"+(n.leftLargeArcRadius-r)+\" 0 0 1 \"+n.leftInnerExtent+\" \"+(n.verticalFullExtent-r)+\"L\"+(n.rightInnerExtent-e)+\" \"+(n.verticalFullExtent-r)+\"A\"+(n.rightLargeArcRadius-r)+\" \"+(n.rightLargeArcRadius-r)+\" 0 0 1 \"+(n.rightFullExtent+r-e)+\" \"+n.verticalRightInnerExtent+\"L\"+(n.rightFullExtent+r-e)+\" \"+(n.targetY+n.rightSmallArcRadius)+\"A\"+(n.rightLargeArcRadius-r)+\" \"+(n.rightSmallArcRadius-r)+\" 0 0 1 \"+(n.rightInnerExtent-e)+\" \"+(n.targetY+r)+\"L\"+(n.targetX-e)+\" \"+(n.targetY+r)+(e>0?\"L\"+n.targetX+\" \"+n.targetY:\"\")+\"Z\"}(t.link,e);var r=Math.abs((t.link.target.x0-t.link.source.x1)/2);e>r&&(e=r);var n=t.link.source.x1,a=t.link.target.x0-e,o=i(n,a),s=o(.5),l=o(.5),c=t.link.y0-t.link.width/2,u=t.link.y0+t.link.width/2,h=t.link.y1-t.link.width/2,f=t.link.y1+t.link.width/2,p=\"M\"+n+\",\"+c,d=\"C\"+s+\",\"+c+\" \"+l+\",\"+h+\" \"+a+\",\"+h,m=\"C\"+l+\",\"+f+\" \"+s+\",\"+u+\" \"+n+\",\"+u,g=e>0?\"L\"+(a+e)+\",\"+(h+t.link.width/2):\"\";return p+d+(g+=\"L\"+a+\",\"+f)+m+\"Z\"}}function S(t,e){var r=c(e.color),n=l.nodePadAcross,i=t.nodePad/2;e.dx=e.x1-e.x0,e.dy=e.y1-e.y0;var a=e.dx,o=Math.max(.5,e.dy),s=\"node_\"+e.pointNumber;return e.group&&(s=f.randstr()),e.trace=t.trace,e.curveNumber=t.trace.index,{index:e.pointNumber,key:s,partOfGroup:e.partOfGroup||!1,group:e.group,traceId:t.key,trace:t.trace,node:e,nodePad:t.nodePad,nodeLineColor:t.nodeLineColor,nodeLineWidth:t.nodeLineWidth,textFont:t.textFont,size:t.horizontal?t.height:t.width,visibleWidth:Math.ceil(a),visibleHeight:o,zoneX:-n,zoneY:-i,zoneWidth:a+2*n,zoneHeight:o+2*i,labelY:t.horizontal?e.dy/2+1:e.dx/2+1,left:1===e.originalLayer,sizeAcross:t.width,forceLayouts:t.forceLayouts,horizontal:t.horizontal,darkBackground:r.getBrightness()<=128,tinyColorHue:u.tinyRGB(r),tinyColorAlpha:r.getAlpha(),valueFormat:t.valueFormat,valueSuffix:t.valueSuffix,sankey:t.sankey,graph:t.graph,arrangement:t.arrangement,uniqueNodeLabelPathId:[t.guid,t.key,s].join(\"_\"),interactionState:t.interactionState,figure:t}}function E(t){t.attr(\"transform\",(function(t){return p(t.node.x0.toFixed(3),t.node.y0.toFixed(3))}))}function C(t){t.call(E)}function L(t,e){t.call(C),e.attr(\"d\",M())}function I(t){t.attr(\"width\",(function(t){return t.node.x1-t.node.x0})).attr(\"height\",(function(t){return t.visibleHeight}))}function P(t){return t.link.width>1||t.linkLineWidth>0}function z(t){return p(t.translateX,t.translateY)+(t.horizontal?\"matrix(1 0 0 1 0 0)\":\"matrix(0 1 1 0 0 0)\")}function O(t,e,r){t.on(\".basic\",null).on(\"mouseover.basic\",(function(t){t.interactionState.dragInProgress||t.partOfGroup||(r.hover(this,t,e),t.interactionState.hovered=[this,t])})).on(\"mousemove.basic\",(function(t){t.interactionState.dragInProgress||t.partOfGroup||(r.follow(this,t),t.interactionState.hovered=[this,t])})).on(\"mouseout.basic\",(function(t){t.interactionState.dragInProgress||t.partOfGroup||(r.unhover(this,t,e),t.interactionState.hovered=!1)})).on(\"click.basic\",(function(t){t.interactionState.hovered&&(r.unhover(this,t,e),t.interactionState.hovered=!1),t.interactionState.dragInProgress||t.partOfGroup||r.select(this,t,e)}))}function D(t,e,r,i){var o=a.behavior.drag().origin((function(t){return{x:t.node.x0+t.visibleWidth/2,y:t.node.y0+t.visibleHeight/2}})).on(\"dragstart\",(function(a){if(\"fixed\"!==a.arrangement&&(f.ensureSingle(i._fullLayout._infolayer,\"g\",\"dragcover\",(function(t){i._fullLayout._dragCover=t})),f.raiseToTop(this),a.interactionState.dragInProgress=a.node,F(a.node),a.interactionState.hovered&&(r.nodeEvents.unhover.apply(0,a.interactionState.hovered),a.interactionState.hovered=!1),\"snap\"===a.arrangement)){var o=a.traceId+\"|\"+a.key;a.forceLayouts[o]?a.forceLayouts[o].alpha(1):function(t,e,r,i){!function(t){for(var e=0;e0&&n.forceLayouts[e].alpha(0)}}(0,e,a,r)).stop()}(0,o,a),function(t,e,r,n,i){window.requestAnimationFrame((function a(){var o;for(o=0;o0)window.requestAnimationFrame(a);else{var s=r.node.originalX;r.node.x0=s-r.visibleWidth/2,r.node.x1=s+r.visibleWidth/2,R(r,i)}}))}(t,e,a,o,i)}})).on(\"drag\",(function(r){if(\"fixed\"!==r.arrangement){var n=a.event.x,i=a.event.y;\"snap\"===r.arrangement?(r.node.x0=n-r.visibleWidth/2,r.node.x1=n+r.visibleWidth/2,r.node.y0=i-r.visibleHeight/2,r.node.y1=i+r.visibleHeight/2):(\"freeform\"===r.arrangement&&(r.node.x0=n-r.visibleWidth/2,r.node.x1=n+r.visibleWidth/2),i=Math.max(0,Math.min(r.size-r.visibleHeight/2,i)),r.node.y0=i-r.visibleHeight/2,r.node.y1=i+r.visibleHeight/2),F(r.node),\"snap\"!==r.arrangement&&(r.sankey.update(r.graph),L(t.filter(B(r)),e))}})).on(\"dragend\",(function(t){if(\"fixed\"!==t.arrangement){t.interactionState.dragInProgress=!1;for(var e=0;el&&L[y].gap;)y--;for(x=L[y].s,m=L.length-1;m>y;m--)L[m].s=x;for(;lS[h]&&h=0;h--){var f=t[h];if(\"scatter\"===f.type&&f.xaxis===c.xaxis&&f.yaxis===c.yaxis){f.opacity=void 0;break}}}}}},40247:function(t,e,r){\"use strict\";var n=r(34809),i=r(33626),a=r(36640),o=r(32660),s=r(64726),l=r(99867),c=r(99669),u=r(382),h=r(24272),f=r(98168),p=r(91602),d=r(663),m=r(54114),g=r(34809).coercePattern;t.exports=function(t,e,r,y){function v(r,i){return n.coerce(t,e,a,r,i)}var x=l(t,e,y,v);if(x||(e.visible=!1),e.visible){c(t,e,y,v),v(\"xhoverformat\"),v(\"yhoverformat\"),v(\"zorder\");var _=u(t,e,y,v);\"group\"===y.scattermode&&void 0===e.orientation&&v(\"orientation\",\"v\");var b=!_&&x=Math.min(e,r)&&d<=Math.max(e,r)?0:1/0}var n=Math.max(3,t.mrc||0),i=1-1/n,a=Math.abs(f.c2p(t.x)-d);return a=Math.min(e,r)&&m<=Math.max(e,r)?0:1/0}var n=Math.max(3,t.mrc||0),i=1-1/n,a=Math.abs(p.c2p(t.y)-m);return ar!=(c=i[n][1])>=r&&(o=i[n-1][0],s=i[n][0],c-l&&(a=o+(s-o)*(r-l)/(c-l),h=Math.min(h,a),d=Math.max(d,a)));return{x0:h=Math.max(h,0),x1:d=Math.min(d,f._length),y0:r,y1:r}}(h._polygons);null===P&&(P={x0:g[0],x1:g[0],y0:g[1],y1:g[1]});var z=s.defaultLine;return s.opacity(h.fillcolor)?z=h.fillcolor:s.opacity((h.line||{}).color)&&(z=h.line.color),n.extendFlat(t,{distance:t.maxHoverDistance,x0:P.x0,x1:P.x1,y0:P.y0,y1:P.y1,color:z,hovertemplate:!1}),delete t.index,h.text&&!n.isArrayOrTypedArray(h.text)?t.text=String(h.text):t.text=h.name,[t]}}},69693:function(t,e,r){\"use strict\";var n=r(64726);t.exports={hasLines:n.hasLines,hasMarkers:n.hasMarkers,hasText:n.hasText,isBubble:n.isBubble,attributes:r(36640),layoutAttributes:r(26667),supplyDefaults:r(40247),crossTraceDefaults:r(53044),supplyLayoutDefaults:r(12332),calc:r(26544).calc,crossTraceCalc:r(75603),arraysToCalcdata:r(99203),plot:r(36098),colorbar:r(21146),formatLabels:r(15294),style:r(9408).style,styleOnSelect:r(9408).styleOnSelect,hoverPoints:r(37255),selectPoints:r(32665),animatable:!0,moduleType:\"trace\",name:\"scatter\",basePlotModule:r(37703),categories:[\"cartesian\",\"svg\",\"symbols\",\"errorBarsOK\",\"showLegend\",\"scatter-like\",\"zoomScale\"],meta:{}}},26667:function(t){\"use strict\";t.exports={scattermode:{valType:\"enumerated\",values:[\"group\",\"overlay\"],dflt:\"overlay\",editType:\"calc\"},scattergap:{valType:\"number\",min:0,max:1,editType:\"calc\"}}},12332:function(t,e,r){\"use strict\";var n=r(34809),i=r(26667);t.exports=function(t,e){var r,a=\"group\"===e.barmode;\"group\"===e.scattermode&&(\"scattergap\",r=a?e.bargap:.2,n.coerce(t,e,i,\"scattergap\",r))}},98168:function(t,e,r){\"use strict\";var n=r(34809).isArrayOrTypedArray,i=r(65477).hasColorscale,a=r(39356);t.exports=function(t,e,r,o,s,l){l||(l={});var c=(t.marker||{}).color;c&&c._inputArray&&(c=c._inputArray),s(\"line.color\",r),i(t,\"line\")?a(t,e,o,s,{prefix:\"line.\",cLetter:\"c\"}):s(\"line.color\",!n(c)&&c||r),s(\"line.width\"),l.noDash||s(\"line.dash\"),l.backoff&&s(\"line.backoff\")}},5525:function(t,e,r){\"use strict\";var n=r(62203),i=r(63821),a=i.BADNUM,o=i.LOG_CLIP,s=o+.5,l=o-.5,c=r(34809),u=c.segmentsIntersect,h=c.constrain,f=r(32660);t.exports=function(t,e){var r,i,o,p,d,m,g,y,v,x,_,b,w,T,k,A,M,S,E=e.trace||{},C=e.xaxis,L=e.yaxis,I=\"log\"===C.type,P=\"log\"===L.type,z=C._length,O=L._length,D=e.backoff,R=E.marker,F=e.connectGaps,B=e.baseTolerance,N=e.shape,j=\"linear\"===N,U=E.fill&&\"none\"!==E.fill,V=[],q=f.minTolerance,H=t.length,G=new Array(H),Z=0;function W(r){var n=t[r];if(!n)return!1;var i=e.linearized?C.l2p(n.x):C.c2p(n.x),o=e.linearized?L.l2p(n.y):L.c2p(n.y);if(i===a){if(I&&(i=C.c2p(n.x,!0)),i===a)return!1;P&&o===a&&(i*=Math.abs(C._m*O*(C._m>0?s:l)/(L._m*z*(L._m>0?s:l)))),i*=1e3}if(o===a){if(P&&(o=L.c2p(n.y,!0)),o===a)return!1;o*=1e3}return[i,o]}function Y(t,e,r,n){var i=r-t,a=n-e,o=.5-t,s=.5-e,l=i*i+a*a,c=i*o+a*s;if(c>0&&cot||t[1]lt)return[h(t[0],at,ot),h(t[1],st,lt)]}function ht(t,e){return t[0]===e[0]&&(t[0]===at||t[0]===ot)||t[1]===e[1]&&(t[1]===st||t[1]===lt)||void 0}function ft(t,e,r){return function(n,i){var a=ut(n),o=ut(i),s=[];if(a&&o&&ht(a,o))return s;a&&s.push(a),o&&s.push(o);var l=2*c.constrain((n[t]+i[t])/2,e,r)-((a||n)[t]+(o||i)[t]);return l&&((a&&o?l>0==a[t]>o[t]?a:o:a||o)[t]+=l),s}}function pt(t){var e=t[0],r=t[1],n=e===G[Z-1][0],i=r===G[Z-1][1];if(!n||!i)if(Z>1){var a=e===G[Z-2][0],o=r===G[Z-2][1];n&&(e===at||e===ot)&&a?o?Z--:G[Z-1]=t:i&&(r===st||r===lt)&&o?a?Z--:G[Z-1]=t:G[Z++]=t}else G[Z++]=t}function dt(t){G[Z-1][0]!==t[0]&&G[Z-1][1]!==t[1]&&pt([Q,tt]),pt(t),et=null,Q=tt=0}\"linear\"===N||\"spline\"===N?nt=function(t,e){for(var r=[],n=0,i=0;i<4;i++){var a=ct[i],o=u(t[0],t[1],e[0],e[1],a[0],a[1],a[2],a[3]);o&&(!n||Math.abs(o.x-r[0][0])>1||Math.abs(o.y-r[0][1])>1)&&(o=[o.x,o.y],n&&$(o,t)<$(r[0],t)?r.unshift(o):r.push(o),n++)}return r}:\"hv\"===N||\"vh\"===N?nt=function(t,e){var r=[],n=ut(t),i=ut(e);return n&&i&&ht(n,i)||(n&&r.push(n),i&&r.push(i)),r}:\"hvh\"===N?nt=ft(0,at,ot):\"vhv\"===N&&(nt=ft(1,st,lt));var mt=c.isArrayOrTypedArray(R);function gt(e){if(e&&D&&(e.i=r,e.d=t,e.trace=E,e.marker=mt?R[e.i]:R,e.backoff=D),M=e[0]/z,S=e[1]/O,J=e[0]ot?ot:0,K=e[1]lt?lt:0,J||K){if(Z)if(et){var n=nt(et,e);n.length>1&&(dt(n[0]),G[Z++]=n[1])}else rt=nt(G[Z-1],e)[0],G[Z++]=rt;else G[Z++]=[J||e[0],K||e[1]];var i=G[Z-1];J&&K&&(i[0]!==J||i[1]!==K)?(et&&(Q!==J&&tt!==K?pt(Q&&tt?(a=et,s=(o=e)[0]-a[0],l=(o[1]-a[1])/s,(a[1]*o[0]-o[1]*a[0])/s>0?[l>0?at:ot,lt]:[l>0?ot:at,st]):[Q||J,tt||K]):Q&&tt&&pt([Q,tt])),pt([J,K])):Q-J&&tt-K&&pt([J||Q,K||tt]),et=e,Q=J,tt=K}else et&&dt(nt(et,e)[0]),G[Z++]=e;var a,o,s,l}for(r=0;rX(m,yt))break;o=m,(w=v[0]*y[0]+v[1]*y[1])>_?(_=w,p=m,g=!1):w=t.length||!m)break;gt(m),i=m}}else gt(p)}et&&pt([Q||et[0],tt||et[1]]),V.push(G.slice(0,Z))}var vt=N.slice(N.length-1);if(D&&\"h\"!==vt&&\"v\"!==vt){for(var xt=!1,_t=-1,bt=[],wt=0;wt=0?l=p:(l=p=f,f++),l0?Math.max(r,a):0}}},21146:function(t){\"use strict\";t.exports={container:\"marker\",min:\"cmin\",max:\"cmax\"}},24272:function(t,e,r){\"use strict\";var n=r(78766),i=r(65477).hasColorscale,a=r(39356),o=r(64726);t.exports=function(t,e,r,s,l,c){var u=o.isBubble(t),h=(t.line||{}).color;c=c||{},h&&(r=h),l(\"marker.symbol\"),l(\"marker.opacity\",u?.7:1),l(\"marker.size\"),c.noAngle||(l(\"marker.angle\"),c.noAngleRef||l(\"marker.angleref\"),c.noStandOff||l(\"marker.standoff\")),l(\"marker.color\",r),i(t,\"marker\")&&a(t,e,s,l,{prefix:\"marker.\",cLetter:\"c\"}),c.noSelect||(l(\"selected.marker.color\"),l(\"unselected.marker.color\"),l(\"selected.marker.size\"),l(\"unselected.marker.size\")),c.noLine||(l(\"marker.line.color\",h&&!Array.isArray(h)&&e.marker.color!==h?h:u?n.background:n.defaultLine),i(t,\"marker.line\")&&a(t,e,s,l,{prefix:\"marker.line.\",cLetter:\"c\"}),l(\"marker.line.width\",u?1:0)),u&&(l(\"marker.sizeref\"),l(\"marker.sizemin\"),l(\"marker.sizemode\")),c.gradient&&\"none\"!==l(\"marker.gradient.type\")&&l(\"marker.gradient.color\")}},99669:function(t,e,r){\"use strict\";var n=r(34809).dateTick0,i=r(63821).ONEWEEK;function a(t,e){return n(e,t%i==0?1:0)}t.exports=function(t,e,r,n,i){if(i||(i={x:!0,y:!0}),i.x){var o=n(\"xperiod\");o&&(n(\"xperiod0\",a(o,e.xcalendar)),n(\"xperiodalignment\"))}if(i.y){var s=n(\"yperiod\");s&&(n(\"yperiod0\",a(s,e.ycalendar)),n(\"yperiodalignment\"))}}},36098:function(t,e,r){\"use strict\";var n=r(45568),i=r(33626),a=r(34809),o=a.ensureSingle,s=a.identity,l=r(62203),c=r(64726),u=r(5525),h=r(17210),f=r(80899).tester;function p(t,e,r,h,p,d,m){var g,y=t._context.staticPlot;!function(t,e,r,i,o){var s=r.xaxis,l=r.yaxis,u=n.extent(a.simpleMap(s.range,s.r2c)),h=n.extent(a.simpleMap(l.range,l.r2c)),f=i[0].trace;if(c.hasMarkers(f)){var p=f.marker.maxdisplayed;if(0!==p){var d=i.filter((function(t){return t.x>=u[0]&&t.x<=u[1]&&t.y>=h[0]&&t.y<=h[1]})),m=Math.ceil(d.length/p),g=0;o.forEach((function(t,r){var n=t[0].trace;c.hasMarkers(n)&&n.marker.maxdisplayed>0&&r0;function x(t){return v?t.transition():t}var _=r.xaxis,b=r.yaxis,w=h[0].trace,T=w.line,k=n.select(d),A=o(k,\"g\",\"errorbars\"),M=o(k,\"g\",\"lines\"),S=o(k,\"g\",\"points\"),E=o(k,\"g\",\"text\");if(i.getComponentMethod(\"errorbars\",\"plot\")(t,A,r,m),!0===w.visible){var C,L;x(k).style(\"opacity\",w.opacity);var I,P,z=w.fill.charAt(w.fill.length-1);\"x\"!==z&&\"y\"!==z&&(z=\"\"),\"y\"===z?(I=1,P=b.c2p(0,!0)):\"x\"===z&&(I=0,P=_.c2p(0,!0)),h[0][r.isRangePlot?\"nodeRangePlot3\":\"node3\"]=k;var O,D,R=\"\",F=[],B=w._prevtrace,N=null,j=null;B&&(R=B._prevRevpath||\"\",L=B._nextFill,F=B._ownPolygons,N=B._fillsegments,j=B._fillElement);var U,V,q,H,G,Z,W=\"\",Y=\"\",X=[];w._polygons=[];var $=[],J=[],K=a.noop;if(C=w._ownFill,c.hasLines(w)||\"none\"!==w.fill){L&&L.datum(h),-1!==[\"hv\",\"vh\",\"hvh\",\"vhv\"].indexOf(T.shape)?(U=l.steps(T.shape),V=l.steps(T.shape.split(\"\").reverse().join(\"\"))):U=V=\"spline\"===T.shape?function(t){var e=t[t.length-1];return t.length>1&&t[0][0]===e[0]&&t[0][1]===e[1]?l.smoothclosed(t.slice(1),T.smoothing):l.smoothopen(t,T.smoothing)}:function(t){return\"M\"+t.join(\"L\")},q=function(t){return V(t.reverse())},J=u(h,{xaxis:_,yaxis:b,trace:w,connectGaps:w.connectgaps,baseTolerance:Math.max(T.width||1,3)/4,shape:T.shape,backoff:T.backoff,simplify:T.simplify,fill:w.fill}),$=new Array(J.length);var Q=0;for(g=0;g0,g=h(t,e,r);(u=i.selectAll(\"g.trace\").data(g,(function(t){return t[0].trace.uid}))).enter().append(\"g\").attr(\"class\",(function(t){return\"trace scatter trace\"+t[0].trace.uid})).style(\"stroke-miterlimit\",2),u.order(),function(t,e,r){e.each((function(e){var i=o(n.select(this),\"g\",\"fills\");l.setClipUrl(i,r.layerClipId,t);var a=e[0].trace,c=[];a._ownfill&&c.push(\"_ownFill\"),a._nexttrace&&c.push(\"_nextFill\");var u=i.selectAll(\"g\").data(c,s);u.enter().append(\"g\"),u.exit().each((function(t){a[t]=null})).remove(),u.order().each((function(t){a[t]=o(n.select(this),\"path\",\"js-fill\")}))}))}(t,u,e),m?(c&&(f=c()),n.transition().duration(a.duration).ease(a.easing).each(\"end\",(function(){f&&f()})).each(\"interrupt\",(function(){f&&f()})).each((function(){i.selectAll(\"g.trace\").each((function(r,n){p(t,n,e,r,g,this,a)}))}))):u.each((function(r,n){p(t,n,e,r,g,this,a)})),d&&u.exit().remove(),i.selectAll(\"path:not([d])\").remove()}},32665:function(t,e,r){\"use strict\";var n=r(64726);t.exports=function(t,e){var r,i,a,o,s=t.cd,l=t.xaxis,c=t.yaxis,u=[],h=s[0].trace;if(!n.hasMarkers(h)&&!n.hasText(h))return[];if(!1===e)for(r=0;r0){var f=i.c2l(u);i._lowerLogErrorBound||(i._lowerLogErrorBound=f),i._lowerErrorBound=Math.min(i._lowerLogErrorBound,f)}}else o[s]=[-l[0]*r,l[1]*r]}return o}t.exports=function(t,e,r){var n=[i(t.x,t.error_x,e[0],r.xaxis),i(t.y,t.error_y,e[1],r.yaxis),i(t.z,t.error_z,e[2],r.zaxis)],a=function(t){for(var e=0;e-1?-1:t.indexOf(\"right\")>-1?1:0}function _(t){return null==t?0:t.indexOf(\"top\")>-1?-1:t.indexOf(\"bottom\")>-1?1:0}function b(t,e){return e(4*t)}function w(t){return p[t]}function T(t,e,r,n,i){var a=null;if(l.isArrayOrTypedArray(t)){a=[];for(var o=0;o=0){var E=function(t,e,r){var n,i=(r+1)%3,a=(r+2)%3,o=[],l=[];for(n=0;n=0&&h(\"surfacecolor\",p||d);for(var m=[\"x\",\"y\",\"z\"],g=0;g<3;++g){var y=\"projection.\"+m[g];h(y+\".show\")&&(h(y+\".opacity\"),h(y+\".scale\"))}var v=n.getComponentMethod(\"errorbars\",\"supplyDefaults\");v(t,e,p||d||r,{axis:\"z\"}),v(t,e,p||d||r,{axis:\"y\",inherit:\"z\"}),v(t,e,p||d||r,{axis:\"x\",inherit:\"z\"})}else e.visible=!1}},17822:function(t,e,r){\"use strict\";t.exports={plot:r(16533),attributes:r(14117),markerSymbols:r(49467),supplyDefaults:r(82418),colorbar:[{container:\"marker\",min:\"cmin\",max:\"cmax\"},{container:\"line\",min:\"cmin\",max:\"cmax\"}],calc:r(37593),moduleType:\"trace\",name:\"scatter3d\",basePlotModule:r(2487),categories:[\"gl3d\",\"symbols\",\"showLegend\",\"scatter-like\"],meta:{}}},54637:function(t,e,r){\"use strict\";var n=r(19326),i=r(36640),a=r(9829),o=r(3208).rb,s=r(3208).ay,l=r(87163),c=r(93049).extendFlat,u=i.marker,h=i.line,f=u.line;t.exports={carpet:{valType:\"string\",editType:\"calc\"},a:{valType:\"data_array\",editType:\"calc\"},b:{valType:\"data_array\",editType:\"calc\"},mode:c({},i.mode,{dflt:\"markers\"}),text:c({},i.text,{}),texttemplate:s({editType:\"plot\"},{keys:[\"a\",\"b\",\"text\"]}),hovertext:c({},i.hovertext,{}),line:{color:h.color,width:h.width,dash:h.dash,backoff:h.backoff,shape:c({},h.shape,{values:[\"linear\",\"spline\"]}),smoothing:h.smoothing,editType:\"calc\"},connectgaps:i.connectgaps,fill:c({},i.fill,{values:[\"none\",\"toself\",\"tonext\"],dflt:\"none\"}),fillcolor:n(),marker:c({symbol:u.symbol,opacity:u.opacity,maxdisplayed:u.maxdisplayed,angle:u.angle,angleref:u.angleref,standoff:u.standoff,size:u.size,sizeref:u.sizeref,sizemin:u.sizemin,sizemode:u.sizemode,line:c({width:f.width,editType:\"calc\"},l(\"marker.line\")),gradient:u.gradient,editType:\"calc\"},l(\"marker\")),textfont:i.textfont,textposition:i.textposition,selected:i.selected,unselected:i.unselected,hoverinfo:c({},a.hoverinfo,{flags:[\"a\",\"b\",\"text\",\"name\"]}),hoveron:i.hoveron,hovertemplate:o(),zorder:i.zorder}},68001:function(t,e,r){\"use strict\";var n=r(10721),i=r(77272),a=r(99203),o=r(48861),s=r(26544).calcMarkerSize,l=r(26571);t.exports=function(t,e){var r=e._carpetTrace=l(t,e);if(r&&r.visible&&\"legendonly\"!==r.visible){var c;e.xaxis=r.xaxis,e.yaxis=r.yaxis;var u,h,f=e._length,p=new Array(f),d=!1;for(c=0;c\")}return o}function v(t,e){var r;r=t.labelprefix&&t.labelprefix.length>0?t.labelprefix.replace(/ = $/,\"\"):t._hovertitle,g.push(r+\": \"+e.toFixed(3)+t.labelsuffix)}}},56534:function(t,e,r){\"use strict\";t.exports={attributes:r(54637),supplyDefaults:r(16986),colorbar:r(21146),formatLabels:r(32709),calc:r(68001),plot:r(64535),style:r(9408).style,styleOnSelect:r(9408).styleOnSelect,hoverPoints:r(59420),selectPoints:r(32665),eventData:r(68289),moduleType:\"trace\",name:\"scattercarpet\",basePlotModule:r(37703),categories:[\"svg\",\"carpet\",\"symbols\",\"showLegend\",\"carpetDependent\",\"zoomScale\"],meta:{}}},64535:function(t,e,r){\"use strict\";var n=r(36098),i=r(29714),a=r(62203);t.exports=function(t,e,r,o){var s,l,c,u=r[0][0].carpet,h=i.getFromId(t,u.xaxis||\"x\"),f=i.getFromId(t,u.yaxis||\"y\"),p={xaxis:h,yaxis:f,plot:e.plot};for(s=0;s\")}function p(t){return t+\"°\"}}(c,m,t,l[0].t.labels),t.hovertemplate=c.hovertemplate,[t]}}},18070:function(t,e,r){\"use strict\";t.exports={attributes:r(6893),supplyDefaults:r(27386),colorbar:r(21146),formatLabels:r(57413),calc:r(75649),calcGeoJSON:r(48887).calcGeoJSON,plot:r(48887).plot,style:r(60367),styleOnSelect:r(9408).styleOnSelect,hoverPoints:r(40636),eventData:r(71873),selectPoints:r(45852),moduleType:\"trace\",name:\"scattergeo\",basePlotModule:r(47544),categories:[\"geo\",\"symbols\",\"showLegend\",\"scatter-like\"],meta:{}}},48887:function(t,e,r){\"use strict\";var n=r(45568),i=r(34809),a=r(11577).getTopojsonFeatures,o=r(39532),s=r(3994),l=r(32919).findExtremes,c=r(63821).BADNUM,u=r(26544).calcMarkerSize,h=r(64726),f=r(60367);t.exports={calcGeoJSON:function(t,e){var r,n,o=t[0].trace,h=e[o.geo],f=h._subplot,p=o._length;if(i.isArrayOrTypedArray(o.locations)){var d=o.locationmode,m=\"geojson-id\"===d?s.extractTraceFeature(t):a(o,f.topojson);for(r=0;r=g,w=2*_,T={},k=l.makeCalcdata(e,\"x\"),A=v.makeCalcdata(e,\"y\"),M=s(e,l,\"x\",k),S=s(e,v,\"y\",A),E=M.vals,C=S.vals;e._x=E,e._y=C,e.xperiodalignment&&(e._origX=k,e._xStarts=M.starts,e._xEnds=M.ends),e.yperiodalignment&&(e._origY=A,e._yStarts=S.starts,e._yEnds=S.ends);var L=new Array(w),I=new Array(_);for(r=0;r<_;r++)L[2*r]=E[r]===m?NaN:E[r],L[2*r+1]=C[r]===m?NaN:C[r],I[r]=r;if(\"log\"===l.type)for(r=0;r1&&i.extendFlat(s.line,p.linePositions(t,r,n)),s.errorX||s.errorY){var l=p.errorBarPositions(t,r,n,a,o);s.errorX&&i.extendFlat(s.errorX,l.x),s.errorY&&i.extendFlat(s.errorY,l.y)}return s.text&&(i.extendFlat(s.text,{positions:n},p.textPosition(t,r,s.text,s.marker)),i.extendFlat(s.textSel,{positions:n},p.textPosition(t,r,s.text,s.markerSel)),i.extendFlat(s.textUnsel,{positions:n},p.textPosition(t,r,s.text,s.markerUnsel))),s}(t,0,e,L,E,C),O=d(t,x);return h(o,e),b?z.marker&&(P=z.marker.sizeAvg||Math.max(z.marker.size,3)):P=c(e,_),u(t,e,l,v,E,C,P),z.errorX&&y(e,l,z.errorX),z.errorY&&y(e,v,z.errorY),z.fill&&!O.fill2d&&(O.fill2d=!0),z.marker&&!O.scatter2d&&(O.scatter2d=!0),z.line&&!O.line2d&&(O.line2d=!0),!z.errorX&&!z.errorY||O.error2d||(O.error2d=!0),z.text&&!O.glText&&(O.glText=!0),z.marker&&(z.marker.snap=_),O.lineOptions.push(z.line),O.errorXOptions.push(z.errorX),O.errorYOptions.push(z.errorY),O.fillOptions.push(z.fill),O.markerOptions.push(z.marker),O.markerSelectedOptions.push(z.markerSel),O.markerUnselectedOptions.push(z.markerUnsel),O.textOptions.push(z.text),O.textSelectedOptions.push(z.textSel),O.textUnselectedOptions.push(z.textUnsel),O.selectBatch.push([]),O.unselectBatch.push([]),T._scene=O,T.index=O.count,T.x=E,T.y=C,T.positions=L,O.count++,[{x:!1,y:!1,t:T,trace:e}]}},29483:function(t){\"use strict\";t.exports={TOO_MANY_POINTS:1e5,SYMBOL_SDF_SIZE:200,SYMBOL_SIZE:20,SYMBOL_STROKE:1,DOT_RE:/-dot/,OPEN_RE:/-open/,DASHES:{solid:[1],dot:[1,1],dash:[4,1],longdash:[8,1],dashdot:[4,1,1,1],longdashdot:[8,1,1,1]}}},19937:function(t,e,r){\"use strict\";var n=r(10721),i=r(96021),a=r(162),o=r(33626),s=r(34809),l=s.isArrayOrTypedArray,c=r(62203),u=r(5975),h=r(46998).formatColor,f=r(64726),p=r(92527),d=r(4075),m=r(29483),g=r(20438).DESELECTDIM,y={start:1,left:1,end:-1,right:-1,middle:0,center:0,bottom:1,top:-1},v=r(36040).appendArrayPointValue;function x(t,e){var r,i=t._fullLayout,a=e._length,o=e.textfont,c=e.textposition,u=l(c)?c:[c],h=o.color,f=o.size,p=o.family,d=o.weight,m=o.style,g=o.variant,y={},x=t._context.plotGlPixelRatio,b=e.texttemplate;if(b){y.text=[];var w=i._d3locale,T=Array.isArray(b),k=T?Math.min(b.length,a):a,A=T?function(t){return b[t]}:function(){return b};for(r=0;r500?\"bold\":\"normal\":t}function b(t,e){var r,n,i=e._length,o=e.marker,s={},c=l(o.symbol),u=l(o.angle),f=l(o.color),m=l(o.line.color),g=l(o.opacity),y=l(o.size),v=l(o.line.width);if(c||(n=d.isOpenSymbol(o.symbol)),c||f||m||g||u){s.symbols=new Array(i),s.angles=new Array(i),s.colors=new Array(i),s.borderColors=new Array(i);var x=o.symbol,_=o.angle,b=h(o,o.opacity,i),w=h(o.line,o.opacity,i);if(!l(w[0])){var T=w;for(w=Array(i),r=0;rm.TOO_MANY_POINTS||f.hasMarkers(e)?\"rect\":\"round\";if(c&&e.connectgaps){var h=n[0],p=n[1];for(i=0;i1?c[i]:c[0]:c,m=l(u)?u.length>1?u[i]:u[0]:u,g=y[d],v=y[m],x=h?h/.8+1:0,_=-v*x-.5*v;o.offset[i]=[g*x/p,_/p]}}return o}}},86590:function(t,e,r){\"use strict\";var n=r(34809),i=r(33626),a=r(4075),o=r(92089),s=r(32660),l=r(64726),c=r(99867),u=r(99669),h=r(24272),f=r(98168),p=r(54114),d=r(663);t.exports=function(t,e,r,m){function g(r,i){return n.coerce(t,e,o,r,i)}var y=!!t.marker&&a.isOpenSymbol(t.marker.symbol),v=l.isBubble(t),x=c(t,e,m,g);if(x){u(t,e,m,g),g(\"xhoverformat\"),g(\"yhoverformat\");var _=x100},e.isDotSymbol=function(t){return\"string\"==typeof t?n.DOT_RE.test(t):t>200}},36544:function(t,e,r){\"use strict\";var n=r(33626),i=r(34809),a=r(11539);function o(t,e,r,o){var s=t.xa,l=t.ya,c=t.distance,u=t.dxy,h=t.index,f={pointNumber:h,x:e[h],y:r[h]};f.tx=i.isArrayOrTypedArray(o.text)?o.text[h]:o.text,f.htx=Array.isArray(o.hovertext)?o.hovertext[h]:o.hovertext,f.data=Array.isArray(o.customdata)?o.customdata[h]:o.customdata,f.tp=Array.isArray(o.textposition)?o.textposition[h]:o.textposition;var p=o.textfont;p&&(f.ts=i.isArrayOrTypedArray(p.size)?p.size[h]:p.size,f.tc=i.isArrayOrTypedArray(p.color)?p.color[h]:p.color,f.tf=Array.isArray(p.family)?p.family[h]:p.family,f.tw=Array.isArray(p.weight)?p.weight[h]:p.weight,f.ty=Array.isArray(p.style)?p.style[h]:p.style,f.tv=Array.isArray(p.variant)?p.variant[h]:p.variant);var d=o.marker;d&&(f.ms=i.isArrayOrTypedArray(d.size)?d.size[h]:d.size,f.mo=i.isArrayOrTypedArray(d.opacity)?d.opacity[h]:d.opacity,f.mx=i.isArrayOrTypedArray(d.symbol)?d.symbol[h]:d.symbol,f.ma=i.isArrayOrTypedArray(d.angle)?d.angle[h]:d.angle,f.mc=i.isArrayOrTypedArray(d.color)?d.color[h]:d.color);var m=d&&d.line;m&&(f.mlc=Array.isArray(m.color)?m.color[h]:m.color,f.mlw=i.isArrayOrTypedArray(m.width)?m.width[h]:m.width);var g=d&&d.gradient;g&&\"none\"!==g.type&&(f.mgt=Array.isArray(g.type)?g.type[h]:g.type,f.mgc=Array.isArray(g.color)?g.color[h]:g.color);var y=s.c2p(f.x,!0),v=l.c2p(f.y,!0),x=f.mrc||1,_=o.hoverlabel;_&&(f.hbg=Array.isArray(_.bgcolor)?_.bgcolor[h]:_.bgcolor,f.hbc=Array.isArray(_.bordercolor)?_.bordercolor[h]:_.bordercolor,f.hts=i.isArrayOrTypedArray(_.font.size)?_.font.size[h]:_.font.size,f.htc=Array.isArray(_.font.color)?_.font.color[h]:_.font.color,f.htf=Array.isArray(_.font.family)?_.font.family[h]:_.font.family,f.hnl=i.isArrayOrTypedArray(_.namelength)?_.namelength[h]:_.namelength);var b=o.hoverinfo;b&&(f.hi=Array.isArray(b)?b[h]:b);var w=o.hovertemplate;w&&(f.ht=Array.isArray(w)?w[h]:w);var T={};T[t.index]=f;var k=o._origX,A=o._origY,M=i.extendFlat({},t,{color:a(o,f),x0:y-x,x1:y+x,xLabelVal:k?k[h]:f.x,y0:v-x,y1:v+x,yLabelVal:A?A[h]:f.y,cd:T,distance:c,spikeDistance:u,hovertemplate:f.ht});return f.htx?M.text=f.htx:f.tx?M.text=f.tx:o.text&&(M.text=o.text),i.fillText(f,o,M),n.getComponentMethod(\"errorbars\",\"hoverInfo\")(f,o,M),M}t.exports={hoverPoints:function(t,e,r,n){var i,a,s,l,c,u,h,f,p,d,m=t.cd,g=m[0].t,y=m[0].trace,v=t.xa,x=t.ya,_=g.x,b=g.y,w=v.c2p(e),T=x.c2p(r),k=t.distance;if(g.tree){var A=v.p2c(w-k),M=v.p2c(w+k),S=x.p2c(T-k),E=x.p2c(T+k);i=\"x\"===n?g.tree.range(Math.min(A,M),Math.min(x._rl[0],x._rl[1]),Math.max(A,M),Math.max(x._rl[0],x._rl[1])):g.tree.range(Math.min(A,M),Math.min(S,E),Math.max(A,M),Math.max(S,E))}else i=g.ids;var C=k;if(\"x\"===n){var L=!!y.xperiodalignment,I=!!y.yperiodalignment;for(u=0;u=Math.min(P,z)&&w<=Math.max(P,z)?0:1/0}if(h=Math.min(O,D)&&T<=Math.max(O,D)?0:1/0}d=Math.sqrt(h*h+f*f),s=i[u]}}}else for(u=i.length-1;u>-1;u--)l=_[a=i[u]],c=b[a],h=v.c2p(l)-w,f=x.c2p(c)-T,(p=Math.sqrt(h*h+f*f))v.glText.length){var T=b-v.glText.length;for(m=0;mr&&(isNaN(e[n])||isNaN(e[n+1]));)n-=2;t.positions=e.slice(r,n+2)}return t})),v.line2d.update(v.lineOptions)),v.error2d){var A=(v.errorXOptions||[]).concat(v.errorYOptions||[]);v.error2d.update(A)}v.scatter2d&&v.scatter2d.update(v.markerOptions),v.fillOrder=s.repeat(null,b),v.fill2d&&(v.fillOptions=v.fillOptions.map((function(t,e){var n=r[e];if(t&&n&&n[0]&&n[0].trace){var i,a,o=n[0],s=o.trace,l=o.t,c=v.lineOptions[e],u=[];s._ownfill&&u.push(e),s._nexttrace&&u.push(e+1),u.length&&(v.fillOrder[e]=u);var h,f,p=[],d=c&&c.positions||l.positions;if(\"tozeroy\"===s.fill){for(h=0;hh&&isNaN(d[f+1]);)f-=2;0!==d[h+1]&&(p=[d[h],0]),p=p.concat(d.slice(h,f+2)),0!==d[f+1]&&(p=p.concat([d[f],0]))}else if(\"tozerox\"===s.fill){for(h=0;hh&&isNaN(d[f]);)f-=2;0!==d[h]&&(p=[0,d[h+1]]),p=p.concat(d.slice(h,f+2)),0!==d[f]&&(p=p.concat([0,d[f+1]]))}else if(\"toself\"===s.fill||\"tonext\"===s.fill){for(p=[],i=0,t.splitNull=!0,a=0;a-1;for(m=0;m850?\" Black\":i>750?\" Extra Bold\":i>650?\" Bold\":i>550?\" Semi Bold\":i>450?\" Medium\":i>350?\" Regular\":i>250?\" Light\":i>150?\" Extra Light\":\" Thin\"):\"Open Sans\"===a.slice(0,2).join(\" \")?(s=\"Open Sans\",s+=i>750?\" Extrabold\":i>650?\" Bold\":i>550?\" Semibold\":i>350?\" Regular\":\" Light\"):\"Klokantech Noto Sans\"===a.slice(0,3).join(\" \")&&(s=\"Klokantech Noto Sans\",\"CJK\"===a[3]&&(s+=\" CJK\"),s+=i>500?\" Bold\":\" Regular\")),o&&(s+=\" Italic\"),\"Open Sans Regular Italic\"===s?s=\"Open Sans Italic\":\"Open Sans Regular Bold\"===s?s=\"Open Sans Bold\":\"Open Sans Regular Bold Italic\"===s?s=\"Open Sans Bold Italic\":\"Klokantech Noto Sans Regular Italic\"===s&&(s=\"Klokantech Noto Sans Italic\"),h(s)||(s=r),s.split(\", \")}t.exports=function(t,e){var r,a=e[0].trace,h=!0===a.visible&&0!==a._length,w=\"none\"!==a.fill,T=u.hasLines(a),k=u.hasMarkers(a),A=u.hasText(a),M=k&&\"circle\"===a.marker.symbol,S=k&&\"circle\"!==a.marker.symbol,E=a.cluster&&a.cluster.enabled,C=g(\"fill\"),L=g(\"line\"),I=g(\"circle\"),P=g(\"symbol\"),z={fill:C,line:L,circle:I,symbol:P};if(!h)return z;if((w||T)&&(r=o.calcTraceToLineCoords(e)),w&&(C.geojson=o.makePolygon(r),C.layout.visibility=\"visible\",i.extendFlat(C.paint,{\"fill-color\":a.fillcolor})),T&&(L.geojson=o.makeLine(r),L.layout.visibility=\"visible\",i.extendFlat(L.paint,{\"line-width\":a.line.width,\"line-color\":a.line.color,\"line-opacity\":a.opacity})),M){var O=function(t){var e,r,a,o,u=t[0].trace,h=u.marker,f=u.selectedpoints,p=i.isArrayOrTypedArray(h.color),d=i.isArrayOrTypedArray(h.size),m=i.isArrayOrTypedArray(h.opacity);function g(t){return u.opacity*t}p&&(r=s.hasColorscale(u,\"marker\")?s.makeColorScaleFuncFromTrace(h):i.identity),d&&(a=c(u)),m&&(o=function(t){return g(n(t)?+i.constrain(t,0,1):0)});var y,v,_=[];for(e=0;e\")}function u(t){return t+\"°\"}}t.exports={hoverPoints:function(t,e,r){var o=t.cd,u=o[0].trace,h=t.xa,f=t.ya,p=t.subplot,d=[],m=l+u.uid+\"-circle\",g=u.cluster&&u.cluster.enabled;if(g){var y=p.map.queryRenderedFeatures(null,{layers:[m]});d=y.map((function(t){return t.id}))}var v=360*(e>=0?Math.floor((e+180)/360):Math.ceil((e-180)/360)),x=e-v;if(n.getClosest(o,(function(t){var e=t.lonlat;if(e[0]===s)return 1/0;if(g&&-1===d.indexOf(t.i+1))return 1/0;var n=i.modHalf(e[0],360),a=e[1],o=p.project([n,a]),l=o.x-h.c2p([x,a]),c=o.y-f.c2p([n,r]),u=Math.max(3,t.mrc||0);return Math.max(Math.sqrt(l*l+c*c)-u,1-3/u)}),t),!1!==t.index){var _=o[t.index],b=_.lonlat,w=[i.modHalf(b[0],360)+v,b[1]],T=h.c2p(w),k=f.c2p(w),A=_.mrc||1;t.x0=T-A,t.x1=T+A,t.y0=k-A,t.y1=k+A;var M={};M[u.subplot]={_subplot:p};var S=u._module.formatLabels(_,u,M);return t.lonLabel=S.lonLabel,t.latLabel=S.latLabel,t.color=a(u,_),t.extraText=c(u,_,o[0].t.labels),t.hovertemplate=u.hovertemplate,[t]}},getExtraText:c}},30929:function(t,e,r){\"use strict\";t.exports={attributes:r(71388),supplyDefaults:r(57387),colorbar:r(21146),formatLabels:r(66762),calc:r(75649),plot:r(26126),hoverPoints:r(67275).hoverPoints,eventData:r(58240),selectPoints:r(21501),styleOnSelect:function(t,e){e&&e[0].trace._glTrace.update(e)},moduleType:\"trace\",name:\"scattermap\",basePlotModule:r(34091),categories:[\"map\",\"gl\",\"symbols\",\"showLegend\",\"scatter-like\"],meta:{}}},26126:function(t,e,r){\"use strict\";var n=r(34809),i=r(76717),a=r(8814).traceLayerPrefix,o={cluster:[\"cluster\",\"clusterCount\",\"circle\"],nonCluster:[\"fill\",\"line\",\"circle\",\"symbol\"]};function s(t,e,r,n){this.type=\"scattermap\",this.subplot=t,this.uid=e,this.clusterEnabled=r,this.isHidden=n,this.sourceIds={fill:\"source-\"+e+\"-fill\",line:\"source-\"+e+\"-line\",circle:\"source-\"+e+\"-circle\",symbol:\"source-\"+e+\"-symbol\",cluster:\"source-\"+e+\"-circle\",clusterCount:\"source-\"+e+\"-circle\"},this.layerIds={fill:a+e+\"-fill\",line:a+e+\"-line\",circle:a+e+\"-circle\",symbol:a+e+\"-symbol\",cluster:a+e+\"-cluster\",clusterCount:a+e+\"-cluster-count\"},this.below=null}var l=s.prototype;l.addSource=function(t,e,r){var i={type:\"geojson\",data:e.geojson};r&&r.enabled&&n.extendFlat(i,{cluster:!0,clusterMaxZoom:r.maxzoom});var a=this.subplot.map.getSource(this.sourceIds[t]);a?a.setData(e.geojson):this.subplot.map.addSource(this.sourceIds[t],i)},l.setSourceData=function(t,e){this.subplot.map.getSource(this.sourceIds[t]).setData(e.geojson)},l.addLayer=function(t,e,r){var n={type:e.type,id:this.layerIds[t],source:this.sourceIds[t],layout:e.layout,paint:e.paint};e.filter&&(n.filter=e.filter);for(var i,a=this.layerIds[t],o=this.subplot.getMapLayers(),s=0;s=0;r--){var i=e[r];n.removeLayer(u.layerIds[i])}t||n.removeSource(u.sourceIds.circle)}(t):function(t){for(var e=o.nonCluster,r=e.length-1;r>=0;r--){var i=e[r];n.removeLayer(u.layerIds[i]),t||n.removeSource(u.sourceIds[i])}}(t)}function f(t){l?function(t){t||u.addSource(\"circle\",a.circle,e.cluster);for(var r=o.cluster,n=0;n=0;r--){var n=e[r];t.removeLayer(this.layerIds[n]),t.removeSource(this.sourceIds[n])}},t.exports=function(t,e){var r,n,a,l=e[0].trace,c=l.cluster&&l.cluster.enabled,u=!0!==l.visible,h=new s(t,l.uid,c,u),f=i(t.gd,e),p=h.below=t.belowLookup[\"trace-\"+l.uid];if(c)for(h.addSource(\"circle\",f.circle,l.cluster),r=0;r850?\" Black\":i>750?\" Extra Bold\":i>650?\" Bold\":i>550?\" Semi Bold\":i>450?\" Medium\":i>350?\" Regular\":i>250?\" Light\":i>150?\" Extra Light\":\" Thin\"):\"Open Sans\"===a.slice(0,2).join(\" \")?(s=\"Open Sans\",s+=i>750?\" Extrabold\":i>650?\" Bold\":i>550?\" Semibold\":i>350?\" Regular\":\" Light\"):\"Klokantech Noto Sans\"===a.slice(0,3).join(\" \")&&(s=\"Klokantech Noto Sans\",\"CJK\"===a[3]&&(s+=\" CJK\"),s+=i>500?\" Bold\":\" Regular\")),o&&(s+=\" Italic\"),\"Open Sans Regular Italic\"===s?s=\"Open Sans Italic\":\"Open Sans Regular Bold\"===s?s=\"Open Sans Bold\":\"Open Sans Regular Bold Italic\"===s?s=\"Open Sans Bold Italic\":\"Klokantech Noto Sans Regular Italic\"===s&&(s=\"Klokantech Noto Sans Italic\"),h(s)||(s=r),s.split(\", \")}t.exports=function(t,e){var r,a=e[0].trace,h=!0===a.visible&&0!==a._length,w=\"none\"!==a.fill,T=u.hasLines(a),k=u.hasMarkers(a),A=u.hasText(a),M=k&&\"circle\"===a.marker.symbol,S=k&&\"circle\"!==a.marker.symbol,E=a.cluster&&a.cluster.enabled,C=g(\"fill\"),L=g(\"line\"),I=g(\"circle\"),P=g(\"symbol\"),z={fill:C,line:L,circle:I,symbol:P};if(!h)return z;if((w||T)&&(r=o.calcTraceToLineCoords(e)),w&&(C.geojson=o.makePolygon(r),C.layout.visibility=\"visible\",i.extendFlat(C.paint,{\"fill-color\":a.fillcolor})),T&&(L.geojson=o.makeLine(r),L.layout.visibility=\"visible\",i.extendFlat(L.paint,{\"line-width\":a.line.width,\"line-color\":a.line.color,\"line-opacity\":a.opacity})),M){var O=function(t){var e,r,a,o,u=t[0].trace,h=u.marker,f=u.selectedpoints,p=i.isArrayOrTypedArray(h.color),d=i.isArrayOrTypedArray(h.size),m=i.isArrayOrTypedArray(h.opacity);function g(t){return u.opacity*t}p&&(r=s.hasColorscale(u,\"marker\")?s.makeColorScaleFuncFromTrace(h):i.identity),d&&(a=c(u)),m&&(o=function(t){return g(n(t)?+i.constrain(t,0,1):0)});var y,v,_=[];for(e=0;e\")}function u(t){return t+\"°\"}}t.exports={hoverPoints:function(t,e,r){var o=t.cd,u=o[0].trace,h=t.xa,f=t.ya,p=t.subplot,d=[],m=l+u.uid+\"-circle\",g=u.cluster&&u.cluster.enabled;if(g){var y=p.map.queryRenderedFeatures(null,{layers:[m]});d=y.map((function(t){return t.id}))}var v=360*(e>=0?Math.floor((e+180)/360):Math.ceil((e-180)/360)),x=e-v;if(n.getClosest(o,(function(t){var e=t.lonlat;if(e[0]===s)return 1/0;if(g&&-1===d.indexOf(t.i+1))return 1/0;var n=i.modHalf(e[0],360),a=e[1],o=p.project([n,a]),l=o.x-h.c2p([x,a]),c=o.y-f.c2p([n,r]),u=Math.max(3,t.mrc||0);return Math.max(Math.sqrt(l*l+c*c)-u,1-3/u)}),t),!1!==t.index){var _=o[t.index],b=_.lonlat,w=[i.modHalf(b[0],360)+v,b[1]],T=h.c2p(w),k=f.c2p(w),A=_.mrc||1;t.x0=T-A,t.x1=T+A,t.y0=k-A,t.y1=k+A;var M={};M[u.subplot]={_subplot:p};var S=u._module.formatLabels(_,u,M);return t.lonLabel=S.lonLabel,t.latLabel=S.latLabel,t.color=a(u,_),t.extraText=c(u,_,o[0].t.labels),t.hovertemplate=u.hovertemplate,[t]}},getExtraText:c}},83866:function(t,e,r){\"use strict\";[\"*scattermapbox* trace is deprecated!\",\"Please consider switching to the *scattermap* trace type and `map` subplots.\",\"Learn more at: https://plotly.com/javascript/maplibre-migration/\"].join(\" \"),t.exports={attributes:r(95833),supplyDefaults:r(38302),colorbar:r(21146),formatLabels:r(69009),calc:r(75649),plot:r(20691),hoverPoints:r(18016).hoverPoints,eventData:r(68197),selectPoints:r(60784),styleOnSelect:function(t,e){e&&e[0].trace._glTrace.update(e)},moduleType:\"trace\",name:\"scattermapbox\",basePlotModule:r(68192),categories:[\"mapbox\",\"gl\",\"symbols\",\"showLegend\",\"scatter-like\"],meta:{}}},20691:function(t,e,r){\"use strict\";var n=r(34809),i=r(27009),a=r(44245).traceLayerPrefix,o={cluster:[\"cluster\",\"clusterCount\",\"circle\"],nonCluster:[\"fill\",\"line\",\"circle\",\"symbol\"]};function s(t,e,r,n){this.type=\"scattermapbox\",this.subplot=t,this.uid=e,this.clusterEnabled=r,this.isHidden=n,this.sourceIds={fill:\"source-\"+e+\"-fill\",line:\"source-\"+e+\"-line\",circle:\"source-\"+e+\"-circle\",symbol:\"source-\"+e+\"-symbol\",cluster:\"source-\"+e+\"-circle\",clusterCount:\"source-\"+e+\"-circle\"},this.layerIds={fill:a+e+\"-fill\",line:a+e+\"-line\",circle:a+e+\"-circle\",symbol:a+e+\"-symbol\",cluster:a+e+\"-cluster\",clusterCount:a+e+\"-cluster-count\"},this.below=null}var l=s.prototype;l.addSource=function(t,e,r){var i={type:\"geojson\",data:e.geojson};r&&r.enabled&&n.extendFlat(i,{cluster:!0,clusterMaxZoom:r.maxzoom});var a=this.subplot.map.getSource(this.sourceIds[t]);a?a.setData(e.geojson):this.subplot.map.addSource(this.sourceIds[t],i)},l.setSourceData=function(t,e){this.subplot.map.getSource(this.sourceIds[t]).setData(e.geojson)},l.addLayer=function(t,e,r){var n={type:e.type,id:this.layerIds[t],source:this.sourceIds[t],layout:e.layout,paint:e.paint};e.filter&&(n.filter=e.filter);for(var i,a=this.layerIds[t],o=this.subplot.getMapLayers(),s=0;s=0;r--){var i=e[r];n.removeLayer(u.layerIds[i])}t||n.removeSource(u.sourceIds.circle)}(t):function(t){for(var e=o.nonCluster,r=e.length-1;r>=0;r--){var i=e[r];n.removeLayer(u.layerIds[i]),t||n.removeSource(u.sourceIds[i])}}(t)}function f(t){l?function(t){t||u.addSource(\"circle\",a.circle,e.cluster);for(var r=o.cluster,n=0;n=0;r--){var n=e[r];t.removeLayer(this.layerIds[n]),t.removeSource(this.sourceIds[n])}},t.exports=function(t,e){var r,n,a,l=e[0].trace,c=l.cluster&&l.cluster.enabled,u=!0!==l.visible,h=new s(t,l.uid,c,u),f=i(t.gd,e),p=h.below=t.belowLookup[\"trace-\"+l.uid];if(c)for(h.addSource(\"circle\",f.circle,l.cluster),r=0;r\")}}t.exports={hoverPoints:function(t,e,r,a){var o=n(t,e,r,a);if(o&&!1!==o[0].index){var s=o[0];if(void 0===s.index)return o;var l=t.subplot,c=s.cd[s.index],u=s.trace;if(l.isPtInside(c))return s.xLabelVal=void 0,s.yLabelVal=void 0,i(c,u,l,s),s.hovertemplate=u.hovertemplate,o}},makeHoverPointText:i}},66939:function(t,e,r){\"use strict\";t.exports={moduleType:\"trace\",name:\"scatterpolar\",basePlotModule:r(31645),categories:[\"polar\",\"symbols\",\"showLegend\",\"scatter-like\"],attributes:r(8738),supplyDefaults:r(73749).supplyDefaults,colorbar:r(21146),formatLabels:r(33368),calc:r(13246),plot:r(43836),style:r(9408).style,styleOnSelect:r(9408).styleOnSelect,hoverPoints:r(29709).hoverPoints,selectPoints:r(32665),meta:{}}},43836:function(t,e,r){\"use strict\";var n=r(36098),i=r(63821).BADNUM;t.exports=function(t,e,r){for(var a=e.layers.frontplot.select(\"g.scatterlayer\"),o=e.xaxis,s=e.yaxis,l={xaxis:o,yaxis:s,plot:e.framework,layerClipId:e._hasClipOnAxisFalse?e.clipIds.forTraces:null},c=e.radialAxis,u=e.angularAxis,h=0;h=c&&(v.marker.cluster=d.tree),v.marker&&(v.markerSel.positions=v.markerUnsel.positions=v.marker.positions=b),v.line&&b.length>1&&l.extendFlat(v.line,s.linePositions(t,p,b)),v.text&&(l.extendFlat(v.text,{positions:b},s.textPosition(t,p,v.text,v.marker)),l.extendFlat(v.textSel,{positions:b},s.textPosition(t,p,v.text,v.markerSel)),l.extendFlat(v.textUnsel,{positions:b},s.textPosition(t,p,v.text,v.markerUnsel))),v.fill&&!f.fill2d&&(f.fill2d=!0),v.marker&&!f.scatter2d&&(f.scatter2d=!0),v.line&&!f.line2d&&(f.line2d=!0),v.text&&!f.glText&&(f.glText=!0),f.lineOptions.push(v.line),f.fillOptions.push(v.fill),f.markerOptions.push(v.marker),f.markerSelectedOptions.push(v.markerSel),f.markerUnselectedOptions.push(v.markerUnsel),f.textOptions.push(v.text),f.textSelectedOptions.push(v.textSel),f.textUnselectedOptions.push(v.textUnsel),f.selectBatch.push([]),f.unselectBatch.push([]),d.x=w,d.y=T,d.rawx=w,d.rawy=T,d.r=g,d.theta=y,d.positions=b,d._scene=f,d.index=f.count,f.count++}})),a(t,e,r)}},t.exports.reglPrecompiled={}},69595:function(t,e,r){\"use strict\";var n=r(3208).rb,i=r(3208).ay,a=r(93049).extendFlat,o=r(19326),s=r(36640),l=r(9829),c=s.line;t.exports={mode:s.mode,real:{valType:\"data_array\",editType:\"calc+clearAxisTypes\"},imag:{valType:\"data_array\",editType:\"calc+clearAxisTypes\"},text:s.text,texttemplate:i({editType:\"plot\"},{keys:[\"real\",\"imag\",\"text\"]}),hovertext:s.hovertext,line:{color:c.color,width:c.width,dash:c.dash,backoff:c.backoff,shape:a({},c.shape,{values:[\"linear\",\"spline\"]}),smoothing:c.smoothing,editType:\"calc\"},connectgaps:s.connectgaps,marker:s.marker,cliponaxis:a({},s.cliponaxis,{dflt:!1}),textposition:s.textposition,textfont:s.textfont,fill:a({},s.fill,{values:[\"none\",\"toself\",\"tonext\"],dflt:\"none\"}),fillcolor:o(),hoverinfo:a({},l.hoverinfo,{flags:[\"real\",\"imag\",\"text\",\"name\"]}),hoveron:s.hoveron,hovertemplate:n(),selected:s.selected,unselected:s.unselected}},44315:function(t,e,r){\"use strict\";var n=r(10721),i=r(63821).BADNUM,a=r(77272),o=r(99203),s=r(48861),l=r(26544).calcMarkerSize;t.exports=function(t,e){for(var r=t._fullLayout,c=e.subplot,u=r[c].realaxis,h=r[c].imaginaryaxis,f=u.makeCalcdata(e,\"real\"),p=h.makeCalcdata(e,\"imag\"),d=e._length,m=new Array(d),g=0;g\")}}t.exports={hoverPoints:function(t,e,r,a){var o=n(t,e,r,a);if(o&&!1!==o[0].index){var s=o[0];if(void 0===s.index)return o;var l=t.subplot,c=s.cd[s.index],u=s.trace;if(l.isPtInside(c))return s.xLabelVal=void 0,s.yLabelVal=void 0,i(c,u,l,s),s.hovertemplate=u.hovertemplate,o}},makeHoverPointText:i}},73304:function(t,e,r){\"use strict\";t.exports={moduleType:\"trace\",name:\"scattersmith\",basePlotModule:r(50358),categories:[\"smith\",\"symbols\",\"showLegend\",\"scatter-like\"],attributes:r(69595),supplyDefaults:r(93788),colorbar:r(21146),formatLabels:r(89419),calc:r(44315),plot:r(6229),style:r(9408).style,styleOnSelect:r(9408).styleOnSelect,hoverPoints:r(64422).hoverPoints,selectPoints:r(32665),meta:{}}},6229:function(t,e,r){\"use strict\";var n=r(36098),i=r(63821).BADNUM,a=r(52007).smith;t.exports=function(t,e,r){for(var o=e.layers.frontplot.select(\"g.scatterlayer\"),s=e.xaxis,l=e.yaxis,c={xaxis:s,yaxis:l,plot:e.framework,layerClipId:e._hasClipOnAxisFalse?e.clipIds.forTraces:null},u=0;u\"),o.hovertemplate=f.hovertemplate,a}function x(t,e){y.push(t._hovertitle+\": \"+e)}}},12864:function(t,e,r){\"use strict\";t.exports={attributes:r(18483),supplyDefaults:r(79028),colorbar:r(21146),formatLabels:r(78995),calc:r(67091),plot:r(79005),style:r(9408).style,styleOnSelect:r(9408).styleOnSelect,hoverPoints:r(26558),selectPoints:r(32665),eventData:r(94343),moduleType:\"trace\",name:\"scatterternary\",basePlotModule:r(7638),categories:[\"ternary\",\"symbols\",\"showLegend\",\"scatter-like\"],meta:{}}},79005:function(t,e,r){\"use strict\";var n=r(36098);t.exports=function(t,e,r){var i=e.plotContainer;i.select(\".scatterlayer\").selectAll(\"*\").remove();for(var a=e.xaxis,o=e.yaxis,s={xaxis:a,yaxis:o,plot:i,layerClipId:e._hasClipOnAxisFalse?e.clipIdRelative:null},l=e.layers.frontplot.select(\"g.scatterlayer\"),c=0;cf?_.sizeAvg||Math.max(_.size,3):a(e,x),p=0;pa&&l||i-1,I=!0;if(o(x)||p.selectedpoints||L){var P=p._length;if(p.selectedpoints){m.selectBatch=p.selectedpoints;var z=p.selectedpoints,O={};for(l=0;l1&&(u=m[v-1],f=g[v-1],d=y[v-1]),e=0;eu?\"-\":\"+\")+\"x\")).replace(\"y\",(h>f?\"-\":\"+\")+\"y\")).replace(\"z\",(p>d?\"-\":\"+\")+\"z\");var C=function(){v=0,M=[],S=[],E=[]};(!v||v2?t.slice(1,e-1):2===e?[(t[0]+t[1])/2]:t}function p(t){var e=t.length;return 1===e?[.5,.5]:[t[1]-t[0],t[e-1]-t[e-2]]}function d(t,e){var r=t.fullSceneLayout,i=t.dataScale,u=e._len,h={};function d(t,e){var n=r[e],o=i[c[e]];return a.simpleMap(t,(function(t){return n.d2l(t)*o}))}if(h.vectors=l(d(e._u,\"xaxis\"),d(e._v,\"yaxis\"),d(e._w,\"zaxis\"),u),!u)return{positions:[],cells:[]};var m=d(e._Xs,\"xaxis\"),g=d(e._Ys,\"yaxis\"),y=d(e._Zs,\"zaxis\");if(h.meshgrid=[m,g,y],h.gridFill=e._gridFill,e._slen)h.startingPositions=l(d(e._startsX,\"xaxis\"),d(e._startsY,\"yaxis\"),d(e._startsZ,\"zaxis\"));else{for(var v=g[0],x=f(m),_=f(y),b=new Array(x.length*_.length),w=0,T=0;T=0};v?(r=Math.min(y.length,_.length),l=function(t){return M(y[t])&&S(t)},h=function(t){return String(y[t])}):(r=Math.min(x.length,_.length),l=function(t){return M(x[t])&&S(t)},h=function(t){return String(x[t])}),w&&(r=Math.min(r,b.length));for(var E=0;E1){for(var P=a.randstr(),z=0;z=0){e.i=s.i;var u=r.marker;u.pattern&&u.colors&&u.pattern.shape||(u.color=c,e.color=c),n.pointStyle(t,r,a,e)}else i.fill(t,c)}},44691:function(t,e,r){\"use strict\";var n=r(45568),i=r(33626),a=r(36040).appendArrayPointValue,o=r(32141),s=r(34809),l=r(68596),c=r(33108),u=r(37252).formatPieValue;function h(t,e,r){for(var n=t.data.data,i={curveNumber:e.index,pointNumber:n.i,data:e._input,fullData:e},o=0;o\"),name:A||O(\"name\")?v.name:void 0,color:k(\"hoverlabel.bgcolor\")||x.color,borderColor:k(\"hoverlabel.bordercolor\"),fontFamily:k(\"hoverlabel.font.family\"),fontSize:k(\"hoverlabel.font.size\"),fontColor:k(\"hoverlabel.font.color\"),fontWeight:k(\"hoverlabel.font.weight\"),fontStyle:k(\"hoverlabel.font.style\"),fontVariant:k(\"hoverlabel.font.variant\"),nameLength:k(\"hoverlabel.namelength\"),textAlign:k(\"hoverlabel.align\"),hovertemplate:A,hovertemplateLabels:I,eventData:l};g&&(F.x0=E-i.rInscribed*i.rpx1,F.x1=E+i.rInscribed*i.rpx1,F.idealAlign=i.pxmid[0]<0?\"left\":\"right\"),y&&(F.x=E,F.idealAlign=E<0?\"left\":\"right\");var B=[];o.loneHover(F,{container:a._hoverlayer.node(),outerContainer:a._paper.node(),gd:r,inOut_bbox:B}),l[0].bbox=B[0],d._hasHoverLabel=!0}if(y){var N=t.select(\"path.surface\");f.styleOne(N,i,v,r,{hovered:!0})}d._hasHoverEvent=!0,r.emit(\"plotly_hover\",{points:l||[h(i,v,f.eventDataKeys)],event:n.event})}})),t.on(\"mouseout\",(function(e){var i=r._fullLayout,a=r._fullData[d.index],s=n.select(this).datum();if(d._hasHoverEvent&&(e.originalEvent=n.event,r.emit(\"plotly_unhover\",{points:[h(s,a,f.eventDataKeys)],event:n.event}),d._hasHoverEvent=!1),d._hasHoverLabel&&(o.loneUnhover(i._hoverlayer.node()),d._hasHoverLabel=!1),y){var l=t.select(\"path.surface\");f.styleOne(l,s,a,r,{hovered:!1})}})),t.on(\"click\",(function(t){var e=r._fullLayout,a=r._fullData[d.index],s=g&&(c.isHierarchyRoot(t)||c.isLeaf(t)),u=c.getPtId(t),p=c.isEntry(t)?c.findEntryWithChild(m,u):c.findEntryWithLevel(m,u),y=c.getPtId(p),v={points:[h(t,a,f.eventDataKeys)],event:n.event};s||(v.nextLevel=y);var x=l.triggerHandler(r,\"plotly_\"+d.type+\"click\",v);if(!1!==x&&e.hovermode&&(r._hoverdata=[h(t,a,f.eventDataKeys)],o.click(r,n.event)),!s&&!1!==x&&!r._dragging&&!r._transitioning){i.call(\"_storeDirectGUIEdit\",a,e._tracePreGUI[a.uid],{level:a.level});var _={data:[{level:y}],traces:[d.index]},b={frame:{redraw:!1,duration:f.transitionTime},transition:{duration:f.transitionTime,easing:f.transitionEasing},mode:\"immediate\",fromcurrent:!0};o.loneUnhover(e._hoverlayer.node()),i.call(\"animate\",r,_,b)}}))}},33108:function(t,e,r){\"use strict\";var n=r(34809),i=r(78766),a=r(27983),o=r(37252);function s(t){return t.data.data.pid}e.findEntryWithLevel=function(t,r){var n;return r&&t.eachAfter((function(t){if(e.getPtId(t)===r)return n=t.copy()})),n||t},e.findEntryWithChild=function(t,r){var n;return t.eachAfter((function(t){for(var i=t.children||[],a=0;a0)},e.getMaxDepth=function(t){return t.maxdepth>=0?t.maxdepth:1/0},e.isHeader=function(t,r){return!(e.isLeaf(t)||t.depth===r._maxDepth-1)},e.getParent=function(t,r){return e.findEntryWithLevel(t,s(r))},e.listPath=function(t,r){var n=t.parent;if(!n)return[];var i=r?[n.data[r]]:[n];return e.listPath(n,r).concat(i)},e.getPath=function(t){return e.listPath(t,\"label\").join(\"/\")+\"/\"},e.formatValue=o.formatPieValue,e.formatPercent=function(t,e){var r=n.formatPercent(t,0);return\"0%\"===r&&(r=o.formatPiePercent(t,e)),r}},80809:function(t,e,r){\"use strict\";t.exports={moduleType:\"trace\",name:\"sunburst\",basePlotModule:r(14724),categories:[],animatable:!0,attributes:r(56708),layoutAttributes:r(98959),supplyDefaults:r(33459),supplyLayoutDefaults:r(75816),calc:r(14852).calc,crossTraceCalc:r(14852).crossTraceCalc,plot:r(19718).plot,style:r(98972).style,colorbar:r(21146),meta:{}}},98959:function(t){\"use strict\";t.exports={sunburstcolorway:{valType:\"colorlist\",editType:\"calc\"},extendsunburstcolors:{valType:\"boolean\",dflt:!0,editType:\"calc\"}}},75816:function(t,e,r){\"use strict\";var n=r(34809),i=r(98959);t.exports=function(t,e){function r(r,a){return n.coerce(t,e,i,r,a)}r(\"sunburstcolorway\",e.colorway),r(\"extendsunburstcolors\")}},19718:function(t,e,r){\"use strict\";var n=r(45568),i=r(92264),a=r(88640).GW,o=r(62203),s=r(34809),l=r(30635),c=r(84102),u=c.recordMinTextSize,h=c.clearMinTextSize,f=r(35734),p=r(37252).getRotationAngle,d=f.computeTransform,m=f.transformInsideText,g=r(98972).styleOne,y=r(6851).resizeText,v=r(44691),x=r(2032),_=r(33108);function b(t,r,c,h){var f=t._context.staticPlot,y=t._fullLayout,b=!y.uniformtext.mode&&_.hasTransition(h),T=n.select(c).selectAll(\"g.slice\"),k=r[0],A=k.trace,M=k.hierarchy,S=_.findEntryWithLevel(M,A.level),E=_.getMaxDepth(A),C=y._size,L=A.domain,I=C.w*(L.x[1]-L.x[0]),P=C.h*(L.y[1]-L.y[0]),z=.5*Math.min(I,P),O=k.cx=C.l+C.w*(L.x[1]+L.x[0])/2,D=k.cy=C.t+C.h*(1-L.y[0])-P/2;if(!S)return T.remove();var R=null,F={};b&&T.each((function(t){F[_.getPtId(t)]={rpx0:t.rpx0,rpx1:t.rpx1,x0:t.x0,x1:t.x1,transform:t.transform},!R&&_.isEntry(t)&&(R=t)}));var B=function(t){return i.partition().size([2*Math.PI,t.height+1])(t)}(S).descendants(),N=S.height+1,j=0,U=E;k.hasMultipleRoots&&_.isHierarchyRoot(S)&&(B=B.slice(1),N-=1,j=1,U+=1),B=B.filter((function(t){return t.y1<=U}));var V=p(A.rotation);V&&B.forEach((function(t){t.x0+=V,t.x1+=V}));var q=Math.min(N,E),H=function(t){return(t-j)/q*z},G=function(t,e){return[t*Math.cos(e),-t*Math.sin(e)]},Z=function(t){return s.pathAnnulus(t.rpx0,t.rpx1,t.x0,t.x1,O,D)},W=function(t){return O+w(t)[0]*(t.transform.rCenter||0)+(t.transform.x||0)},Y=function(t){return D+w(t)[1]*(t.transform.rCenter||0)+(t.transform.y||0)};(T=T.data(B,_.getPtId)).enter().append(\"g\").classed(\"slice\",!0),b?T.exit().transition().each((function(){var t=n.select(this);t.select(\"path.surface\").transition().attrTween(\"d\",(function(t){var e=function(t){var e,r=_.getPtId(t),n=F[r],i=F[_.getPtId(S)];if(i){var o=(t.x1>i.x1?2*Math.PI:0)+V;e=t.rpx1X?2*Math.PI:0)+V;e={x0:i,x1:i}}else e={rpx0:z,rpx1:z},s.extendFlat(e,K(t));else e={rpx0:0,rpx1:0};else e={x0:V,x1:V};return a(e,n)}(t);return function(t){return Z(e(t))}})):h.attr(\"d\",Z),c.call(v,S,t,r,{eventDataKeys:x.eventDataKeys,transitionTime:x.CLICK_TRANSITION_TIME,transitionEasing:x.CLICK_TRANSITION_EASING}).call(_.setSliceCursor,t,{hideOnRoot:!0,hideOnLeaves:!0,isTransitioning:t._transitioning}),h.call(g,i,A,t);var p=s.ensureSingle(c,\"g\",\"slicetext\"),w=s.ensureSingle(p,\"text\",\"\",(function(t){t.attr(\"data-notex\",1)})),T=s.ensureUniformFontSize(t,_.determineTextFont(A,i,y.font));w.text(e.formatSliceLabel(i,S,A,r,y)).classed(\"slicetext\",!0).attr(\"text-anchor\",\"middle\").call(o.font,T).call(l.convertToTspans,t);var M=o.bBox(w.node());i.transform=m(M,i,k),i.transform.targetX=W(i),i.transform.targetY=Y(i);var E=function(t,e){var r=t.transform;return d(r,e),r.fontSize=T.size,u(A.type,r,y),s.getTextTransform(r)};b?w.transition().attrTween(\"transform\",(function(t){var e=function(t){var e,r=F[_.getPtId(t)],n=t.transform;if(r)e=r;else if(e={rpx1:t.rpx1,transform:{textPosAngle:n.textPosAngle,scale:0,rotate:n.rotate,rCenter:n.rCenter,x:n.x,y:n.y}},R)if(t.parent)if(X){var i=t.x1>X?2*Math.PI:0;e.x0=e.x1=i}else s.extendFlat(e,K(t));else e.x0=e.x1=V;else e.x0=e.x1=V;var o=a(e.transform.textPosAngle,t.transform.textPosAngle),l=a(e.rpx1,t.rpx1),c=a(e.x0,t.x0),h=a(e.x1,t.x1),f=a(e.transform.scale,n.scale),p=a(e.transform.rotate,n.rotate),d=0===n.rCenter?3:0===e.transform.rCenter?1/3:1,m=a(e.transform.rCenter,n.rCenter);return function(t){var e=l(t),r=c(t),i=h(t),a=function(t){return m(Math.pow(t,d))}(t),s={pxmid:G(e,(r+i)/2),rpx1:e,transform:{textPosAngle:o(t),rCenter:a,x:n.x,y:n.y}};return u(A.type,n,y),{transform:{targetX:W(s),targetY:Y(s),scale:f(t),rotate:p(t),rCenter:a}}}}(t);return function(t){return E(e(t),M)}})):w.attr(\"transform\",E(i,M))}))}function w(t){return e=t.rpx1,r=t.transform.textPosAngle,[e*Math.sin(r),-e*Math.cos(r)];var e,r}e.plot=function(t,e,r,i){var a,o,s=t._fullLayout,l=s._sunburstlayer,c=!r,u=!s.uniformtext.mode&&_.hasTransition(r);h(\"sunburst\",s),(a=l.selectAll(\"g.trace.sunburst\").data(e,(function(t){return t[0].trace.uid}))).enter().append(\"g\").classed(\"trace\",!0).classed(\"sunburst\",!0).attr(\"stroke-linejoin\",\"round\"),a.order(),u?(i&&(o=i()),n.transition().duration(r.duration).ease(r.easing).each(\"end\",(function(){o&&o()})).each(\"interrupt\",(function(){o&&o()})).each((function(){l.selectAll(\"g.trace\").each((function(e){b(t,e,this,r)}))}))):(a.each((function(e){b(t,e,this,r)})),s.uniformtext.mode&&y(t,s._sunburstlayer.selectAll(\".trace\"),\"sunburst\")),c&&a.exit().remove()},e.formatSliceLabel=function(t,e,r,n,i){var a=r.texttemplate,o=r.textinfo;if(!(a||o&&\"none\"!==o))return\"\";var l=i.separators,c=n[0],u=t.data.data,h=c.hierarchy,f=_.isHierarchyRoot(t),p=_.getParent(h,t),d=_.getValue(t);if(!a){var m,g=o.split(\"+\"),y=function(t){return-1!==g.indexOf(t)},v=[];if(y(\"label\")&&u.label&&v.push(u.label),u.hasOwnProperty(\"v\")&&y(\"value\")&&v.push(_.formatValue(u.v,l)),!f){y(\"current path\")&&v.push(_.getPath(t.data));var x=0;y(\"percent parent\")&&x++,y(\"percent entry\")&&x++,y(\"percent root\")&&x++;var b=x>1;if(x){var w,T=function(t){m=_.formatPercent(w,l),b&&(m+=\" of \"+t),v.push(m)};y(\"percent parent\")&&!f&&(w=d/_.getValue(p),T(\"parent\")),y(\"percent entry\")&&(w=d/_.getValue(e),T(\"entry\")),y(\"percent root\")&&(w=d/_.getValue(h),T(\"root\"))}}return y(\"text\")&&(m=s.castOption(r,u.i,\"text\"),s.isValidTextValue(m)&&v.push(m)),v.join(\"
\")}var k=s.castOption(r,u.i,\"texttemplate\");if(!k)return\"\";var A={};u.label&&(A.label=u.label),u.hasOwnProperty(\"v\")&&(A.value=u.v,A.valueLabel=_.formatValue(u.v,l)),A.currentPath=_.getPath(t.data),f||(A.percentParent=d/_.getValue(p),A.percentParentLabel=_.formatPercent(A.percentParent,l),A.parent=_.getPtLabel(p)),A.percentEntry=d/_.getValue(e),A.percentEntryLabel=_.formatPercent(A.percentEntry,l),A.entry=_.getPtLabel(e),A.percentRoot=d/_.getValue(h),A.percentRootLabel=_.formatPercent(A.percentRoot,l),A.root=_.getPtLabel(h),u.hasOwnProperty(\"color\")&&(A.color=u.color);var M=s.castOption(r,u.i,\"text\");return(s.isValidTextValue(M)||\"\"===M)&&(A.text=M),A.customdata=s.castOption(r,u.i,\"customdata\"),s.texttemplateString(k,A,i._d3locale,A,r._meta||{})}},98972:function(t,e,r){\"use strict\";var n=r(45568),i=r(78766),a=r(34809),o=r(84102).resizeText,s=r(72043);function l(t,e,r,n){var o=e.data.data,l=!e.children,c=o.i,u=a.castOption(r,c,\"marker.line.color\")||i.defaultLine,h=a.castOption(r,c,\"marker.line.width\")||0;t.call(s,e,r,n).style(\"stroke-width\",h).call(i.stroke,u).style(\"opacity\",l?r.leaf.opacity:null)}t.exports={style:function(t){var e=t._fullLayout._sunburstlayer.selectAll(\".trace\");o(t,e,\"sunburst\"),e.each((function(e){var r=n.select(this),i=e[0].trace;r.style(\"opacity\",i.opacity),r.selectAll(\"path.surface\").each((function(e){n.select(this).call(l,e,i,t)}))}))},styleOne:l}},16131:function(t,e,r){\"use strict\";var n=r(78766),i=r(87163),a=r(80712).axisHoverFormat,o=r(3208).rb,s=r(9829),l=r(93049).extendFlat,c=r(13582).overrideAll;function u(t){return{show:{valType:\"boolean\",dflt:!1},start:{valType:\"number\",dflt:null,editType:\"plot\"},end:{valType:\"number\",dflt:null,editType:\"plot\"},size:{valType:\"number\",dflt:null,min:0,editType:\"plot\"},project:{x:{valType:\"boolean\",dflt:!1},y:{valType:\"boolean\",dflt:!1},z:{valType:\"boolean\",dflt:!1}},color:{valType:\"color\",dflt:n.defaultLine},usecolormap:{valType:\"boolean\",dflt:!1},width:{valType:\"number\",min:1,max:16,dflt:2},highlight:{valType:\"boolean\",dflt:!0},highlightcolor:{valType:\"color\",dflt:n.defaultLine},highlightwidth:{valType:\"number\",min:1,max:16,dflt:2}}}var h=t.exports=c(l({z:{valType:\"data_array\"},x:{valType:\"data_array\"},y:{valType:\"data_array\"},text:{valType:\"string\",dflt:\"\",arrayOk:!0},hovertext:{valType:\"string\",dflt:\"\",arrayOk:!0},hovertemplate:o(),xhoverformat:a(\"x\"),yhoverformat:a(\"y\"),zhoverformat:a(\"z\"),connectgaps:{valType:\"boolean\",dflt:!1,editType:\"calc\"},surfacecolor:{valType:\"data_array\"}},i(\"\",{colorAttr:\"z or surfacecolor\",showScaleDflt:!0,autoColorDflt:!1,editTypeOverride:\"calc\"}),{contours:{x:u(),y:u(),z:u()},hidesurface:{valType:\"boolean\",dflt:!1},lightposition:{x:{valType:\"number\",min:-1e5,max:1e5,dflt:10},y:{valType:\"number\",min:-1e5,max:1e5,dflt:1e4},z:{valType:\"number\",min:-1e5,max:1e5,dflt:0}},lighting:{ambient:{valType:\"number\",min:0,max:1,dflt:.8},diffuse:{valType:\"number\",min:0,max:1,dflt:.8},specular:{valType:\"number\",min:0,max:2,dflt:.05},roughness:{valType:\"number\",min:0,max:1,dflt:.5},fresnel:{valType:\"number\",min:0,max:5,dflt:.2}},opacity:{valType:\"number\",min:0,max:1,dflt:1},opacityscale:{valType:\"any\",editType:\"calc\"},_deprecated:{zauto:l({},i.zauto,{}),zmin:l({},i.zmin,{}),zmax:l({},i.zmax,{})},hoverinfo:l({},s.hoverinfo),showlegend:l({},s.showlegend,{dflt:!1})}),\"calc\",\"nested\");h.x.editType=h.y.editType=h.z.editType=\"calc+clearAxisTypes\",h.transforms=void 0},53027:function(t,e,r){\"use strict\";var n=r(28379);t.exports=function(t,e){e.surfacecolor?n(t,e,{vals:e.surfacecolor,containerStr:\"\",cLetter:\"c\"}):n(t,e,{vals:e.z,containerStr:\"\",cLetter:\"c\"})}},27159:function(t,e,r){\"use strict\";var n=r(99098).gl_surface3d,i=r(99098).ndarray,a=r(99098).ndarray_linear_interpolate.d2,o=r(69295),s=r(78106),l=r(34809).isArrayOrTypedArray,c=r(46998).parseColorScale,u=r(55010),h=r(88856).extractOpts;function f(t,e,r){this.scene=t,this.uid=r,this.surface=e,this.data=null,this.showContour=[!1,!1,!1],this.contourStart=[null,null,null],this.contourEnd=[null,null,null],this.contourSize=[0,0,0],this.minValues=[1/0,1/0,1/0],this.maxValues=[-1/0,-1/0,-1/0],this.dataScaleX=1,this.dataScaleY=1,this.refineData=!0,this.objectOffset=[0,0,0]}var p=f.prototype;p.getXat=function(t,e,r,n){var i=l(this.data.x)?l(this.data.x[0])?this.data.x[e][t]:this.data.x[t]:t;return void 0===r?i:n.d2l(i,0,r)},p.getYat=function(t,e,r,n){var i=l(this.data.y)?l(this.data.y[0])?this.data.y[e][t]:this.data.y[e]:e;return void 0===r?i:n.d2l(i,0,r)},p.getZat=function(t,e,r,n){var i=this.data.z[e][t];return null===i&&this.data.connectgaps&&this.data._interpolatedZ&&(i=this.data._interpolatedZ[e][t]),void 0===r?i:n.d2l(i,0,r)},p.handlePick=function(t){if(t.object===this.surface){var e=(t.data.index[0]-1)/this.dataScaleX-1,r=(t.data.index[1]-1)/this.dataScaleY-1,n=Math.max(Math.min(Math.round(e),this.data.z[0].length-1),0),i=Math.max(Math.min(Math.round(r),this.data._ylength-1),0);t.index=[n,i],t.traceCoordinate=[this.getXat(n,i),this.getYat(n,i),this.getZat(n,i)],t.dataCoordinate=[this.getXat(n,i,this.data.xcalendar,this.scene.fullSceneLayout.xaxis),this.getYat(n,i,this.data.ycalendar,this.scene.fullSceneLayout.yaxis),this.getZat(n,i,this.data.zcalendar,this.scene.fullSceneLayout.zaxis)];for(var a=0;a<3;a++){null!=t.dataCoordinate[a]&&(t.dataCoordinate[a]*=this.scene.dataScale[a])}var o=this.data.hovertext||this.data.text;return l(o)&&o[i]&&void 0!==o[i][n]?t.textLabel=o[i][n]:t.textLabel=o||\"\",t.data.dataCoordinate=t.dataCoordinate.slice(),this.surface.highlight(t.data),this.scene.glplot.spikes.position=t.dataCoordinate,!0}};var d=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997,1009,1013,1019,1021,1031,1033,1039,1049,1051,1061,1063,1069,1087,1091,1093,1097,1103,1109,1117,1123,1129,1151,1153,1163,1171,1181,1187,1193,1201,1213,1217,1223,1229,1231,1237,1249,1259,1277,1279,1283,1289,1291,1297,1301,1303,1307,1319,1321,1327,1361,1367,1373,1381,1399,1409,1423,1427,1429,1433,1439,1447,1451,1453,1459,1471,1481,1483,1487,1489,1493,1499,1511,1523,1531,1543,1549,1553,1559,1567,1571,1579,1583,1597,1601,1607,1609,1613,1619,1621,1627,1637,1657,1663,1667,1669,1693,1697,1699,1709,1721,1723,1733,1741,1747,1753,1759,1777,1783,1787,1789,1801,1811,1823,1831,1847,1861,1867,1871,1873,1877,1879,1889,1901,1907,1913,1931,1933,1949,1951,1973,1979,1987,1993,1997,1999,2003,2011,2017,2027,2029,2039,2053,2063,2069,2081,2083,2087,2089,2099,2111,2113,2129,2131,2137,2141,2143,2153,2161,2179,2203,2207,2213,2221,2237,2239,2243,2251,2267,2269,2273,2281,2287,2293,2297,2309,2311,2333,2339,2341,2347,2351,2357,2371,2377,2381,2383,2389,2393,2399,2411,2417,2423,2437,2441,2447,2459,2467,2473,2477,2503,2521,2531,2539,2543,2549,2551,2557,2579,2591,2593,2609,2617,2621,2633,2647,2657,2659,2663,2671,2677,2683,2687,2689,2693,2699,2707,2711,2713,2719,2729,2731,2741,2749,2753,2767,2777,2789,2791,2797,2801,2803,2819,2833,2837,2843,2851,2857,2861,2879,2887,2897,2903,2909,2917,2927,2939,2953,2957,2963,2969,2971,2999];function m(t,e){if(t0){r=d[n];break}return r}function v(t,e){if(!(t<1||e<1)){for(var r=g(t),n=g(e),i=1,a=0;ab;)r--,r/=y(r),++r<_&&(r=b);var n=Math.round(r/t);return n>1?n:1},p.refineCoords=function(t){for(var e=this.dataScaleX,r=this.dataScaleY,n=t[0].shape[0],a=t[0].shape[1],o=0|Math.floor(t[0].shape[0]*e+1),s=0|Math.floor(t[0].shape[1]*r+1),l=1+n+1,c=1+a+1,u=i(new Float32Array(l*c),[l,c]),h=[1/e,0,0,0,1/r,0,0,0,1],f=0;f0&&null!==this.contourStart[t]&&null!==this.contourEnd[t]&&this.contourEnd[t]>this.contourStart[t]))for(i[t]=!0,e=this.contourStart[t];ea&&(this.minValues[e]=a),this.maxValues[e]\",maxDimensionCount:60,overdrag:45,releaseTransitionDuration:120,releaseTransitionEase:\"cubic-out\",scrollbarCaptureWidth:18,scrollbarHideDelay:1e3,scrollbarHideDuration:1e3,scrollbarOffset:5,scrollbarWidth:8,transitionDuration:100,transitionEase:\"cubic-out\",uplift:5,wrapSpacer:\" \",wrapSplitCharacter:\" \",cn:{table:\"table\",tableControlView:\"table-control-view\",scrollBackground:\"scroll-background\",yColumn:\"y-column\",columnBlock:\"column-block\",scrollAreaClip:\"scroll-area-clip\",scrollAreaClipRect:\"scroll-area-clip-rect\",columnBoundary:\"column-boundary\",columnBoundaryClippath:\"column-boundary-clippath\",columnBoundaryRect:\"column-boundary-rect\",columnCells:\"column-cells\",columnCell:\"column-cell\",cellRect:\"cell-rect\",cellText:\"cell-text\",cellTextHolder:\"cell-text-holder\",scrollbarKit:\"scrollbar-kit\",scrollbar:\"scrollbar\",scrollbarSlider:\"scrollbar-slider\",scrollbarGlyph:\"scrollbar-glyph\",scrollbarCaptureZone:\"scrollbar-capture-zone\"}}},21908:function(t,e,r){\"use strict\";var n=r(18426),i=r(93049).extendFlat,a=r(10721),o=r(87800).isTypedArray,s=r(87800).isArrayOrTypedArray;function l(t){if(s(t)){for(var e=0,r=0;r=e||c===t.length-1)&&(n[i]=o,o.key=l++,o.firstRowIndex=s,o.lastRowIndex=c,o={firstRowIndex:null,lastRowIndex:null,rows:[]},i+=a,s=c+1,a=0);return n}t.exports=function(t,e){var r=u(e.cells.values),o=function(t){return t.slice(e.header.values.length,t.length)},m=u(e.header.values);m.length&&!m[0].length&&(m[0]=[\"\"],m=u(m));var g=m.concat(o(r).map((function(){return h((m[0]||[\"\"]).length)}))),y=e.domain,v=Math.floor(t._fullLayout._size.w*(y.x[1]-y.x[0])),x=Math.floor(t._fullLayout._size.h*(y.y[1]-y.y[0])),_=e.header.values.length?g[0].map((function(){return e.header.height})):[n.emptyHeaderHeight],b=r.length?r[0].map((function(){return e.cells.height})):[],w=_.reduce(c,0),T=d(b,x-w+n.uplift),k=p(d(_,w),[]),A=p(T,k),M={},S=e._fullInput.columnorder;s(S)&&(S=Array.from(S)),S=S.concat(o(r.map((function(t,e){return e}))));var E=g.map((function(t,r){var n=s(e.columnwidth)?e.columnwidth[Math.min(r,e.columnwidth.length-1)]:e.columnwidth;return a(n)?Number(n):1})),C=E.reduce(c,0);E=E.map((function(t){return t/C*v}));var L=Math.max(l(e.header.line.width),l(e.cells.line.width)),I={key:e.uid+t._context.staticPlot,translateX:y.x[0]*t._fullLayout._size.w,translateY:t._fullLayout._size.h*(1-y.y[1]),size:t._fullLayout._size,width:v,maxLineWidth:L,height:x,columnOrder:S,groupHeight:x,rowBlocks:A,headerRowBlocks:k,scrollY:0,cells:i({},e.cells,{values:r}),headerCells:i({},e.header,{values:g}),gdColumns:g.map((function(t){return t[0]})),gdColumnsOriginalOrder:g.map((function(t){return t[0]})),prevPages:[0,0],scrollbarState:{scrollbarScrollInProgress:!1},columns:g.map((function(t,e){var r=M[t];return M[t]=(r||0)+1,{key:t+\"__\"+M[t],label:t,specIndex:e,xIndex:S[e],xScale:f,x:void 0,calcdata:void 0,columnWidth:E[e]}}))};return I.columns.forEach((function(t){t.calcdata=I,t.x=f(t)})),I}},49618:function(t,e,r){\"use strict\";var n=r(93049).extendFlat;e.splitToPanels=function(t){var e=[0,0],r=n({},t,{key:\"header\",type:\"header\",page:0,prevPages:e,currentRepaint:[null,null],dragHandle:!0,values:t.calcdata.headerCells.values[t.specIndex],rowBlocks:t.calcdata.headerRowBlocks,calcdata:n({},t.calcdata,{cells:t.calcdata.headerCells})});return[n({},t,{key:\"cells1\",type:\"cells\",page:0,prevPages:e,currentRepaint:[null,null],dragHandle:!1,values:t.calcdata.cells.values[t.specIndex],rowBlocks:t.calcdata.rowBlocks}),n({},t,{key:\"cells2\",type:\"cells\",page:1,prevPages:e,currentRepaint:[null,null],dragHandle:!1,values:t.calcdata.cells.values[t.specIndex],rowBlocks:t.calcdata.rowBlocks}),r]},e.splitToCells=function(t){var e=function(t){var e=t.rowBlocks[t.page],r=e?e.rows[0].rowIndex:0;return[r,e?r+e.rows.length:0]}(t);return(t.values||[]).slice(e[0],e[1]).map((function(r,n){return{keyWithinBlock:n+(\"string\"==typeof r&&r.match(/[<$&> ]/)?\"_keybuster_\"+Math.random():\"\"),key:e[0]+n,column:t,calcdata:t.calcdata,page:t.page,rowBlocks:t.rowBlocks,value:r}}))}},23281:function(t,e,r){\"use strict\";var n=r(34809),i=r(92294),a=r(13792).N;t.exports=function(t,e,r,o){function s(r,a){return n.coerce(t,e,i,r,a)}a(e,o,s),s(\"columnwidth\"),s(\"header.values\"),s(\"header.format\"),s(\"header.align\"),s(\"header.prefix\"),s(\"header.suffix\"),s(\"header.height\"),s(\"header.line.width\"),s(\"header.line.color\"),s(\"header.fill.color\"),n.coerceFont(s,\"header.font\",o.font),function(t,e){for(var r=t.columnorder||[],n=t.header.values.length,i=r.slice(0,n),a=i.slice().sort((function(t,e){return t-e})),o=i.map((function(t){return a.indexOf(t)})),s=o.length;s/i),l=!a||s;t.mayHaveMarkup=a&&i.match(/[<&>]/);var c,u=\"string\"==typeof(c=i)&&c.match(n.latexCheck);t.latex=u;var h,f,p=u?\"\":k(t.calcdata.cells.prefix,e,r)||\"\",d=u?\"\":k(t.calcdata.cells.suffix,e,r)||\"\",m=u?null:k(t.calcdata.cells.format,e,r)||null,g=p+(m?o(m)(t.value):t.value)+d;if(t.wrappingNeeded=!t.wrapped&&!l&&!u&&(h=T(g)),t.cellHeightMayIncrease=s||u||t.mayHaveMarkup||(void 0===h?T(g):h),t.needsConvertToTspans=t.mayHaveMarkup||t.wrappingNeeded||t.latex,t.wrappingNeeded){var y=(\" \"===n.wrapSplitCharacter?g.replace(/i&&n.push(a),i+=l}return n}(i,l,s);1===c.length&&(c[0]===i.length-1?c.unshift(c[0]-1):c.push(c[0]+1)),c[0]%2&&c.reverse(),e.each((function(t,e){t.page=c[e],t.scrollY=l})),e.attr(\"transform\",(function(t){var e=R(t.rowBlocks,t.page)-t.scrollY;return h(0,e)})),t&&(I(t,r,e,c,n.prevPages,n,0),I(t,r,e,c,n.prevPages,n,1),_(r,t))}}function L(t,e,r,a){return function(o){var s=o.calcdata?o.calcdata:o,l=e.filter((function(t){return s.key===t.key})),c=r||s.scrollbarState.dragMultiplier,u=s.scrollY;s.scrollY=void 0===a?s.scrollY+c*i.event.dy:a;var h=l.selectAll(\".\"+n.cn.yColumn).selectAll(\".\"+n.cn.columnBlock).filter(M);return C(t,h,l),s.scrollY===u}}function I(t,e,r,n,i,a,o){n[o]!==i[o]&&(clearTimeout(a.currentRepaint[o]),a.currentRepaint[o]=setTimeout((function(){var a=r.filter((function(t,e){return e===o&&n[e]!==i[e]}));b(t,e,a,r),i[o]=n[o]})))}function P(t,e,r,a){return function(){var o=i.select(e.parentNode);o.each((function(t){var e=t.fragments;o.selectAll(\"tspan.line\").each((function(t,r){e[r].width=this.getComputedTextLength()}));var r,i,a=e[e.length-1].width,s=e.slice(0,-1),l=[],c=0,u=t.column.columnWidth-2*n.cellPad;for(t.value=\"\";s.length;)c+(i=(r=s.shift()).width+a)>u&&(t.value+=l.join(n.wrapSpacer)+n.lineBreaker,l=[],c=0),l.push(r.text),c+=i;c&&(t.value+=l.join(n.wrapSpacer)),t.wrapped=!0})),o.selectAll(\"tspan.line\").remove(),w(o.select(\".\"+n.cn.cellText),r,t,a),i.select(e.parentNode.parentNode).call(D)}}function z(t,e,r,a,o){return function(){if(!o.settledY){var s=i.select(e.parentNode),l=N(o),c=o.key-l.firstRowIndex,u=l.rows[c].rowHeight,f=o.cellHeightMayIncrease?e.parentNode.getBoundingClientRect().height+2*n.cellPad:u,p=Math.max(f,u);p-l.rows[c].rowHeight&&(l.rows[c].rowHeight=p,t.selectAll(\".\"+n.cn.columnCell).call(D),C(null,t.filter(M),0),_(r,a,!0)),s.attr(\"transform\",(function(){var t=this,e=t.parentNode.getBoundingClientRect(),r=i.select(t.parentNode).select(\".\"+n.cn.cellRect).node().getBoundingClientRect(),a=t.transform.baseVal.consolidate(),s=r.top-e.top+(a?a.matrix.f:n.cellPad);return h(O(o,i.select(t.parentNode).select(\".\"+n.cn.cellTextHolder).node().getBoundingClientRect().width),s)})),o.settledY=!0}}}function O(t,e){switch(t.align){case\"left\":default:return n.cellPad;case\"right\":return t.column.columnWidth-(e||0)-n.cellPad;case\"center\":return(t.column.columnWidth-(e||0))/2}}function D(t){t.attr(\"transform\",(function(t){var e=t.rowBlocks[0].auxiliaryBlocks.reduce((function(t,e){return t+F(e,1/0)}),0),r=F(N(t),t.key);return h(0,r+e)})).selectAll(\".\"+n.cn.cellRect).attr(\"height\",(function(t){return(e=N(t),r=t.key,e.rows[r-e.firstRowIndex]).rowHeight;var e,r}))}function R(t,e){for(var r=0,n=e-1;n>=0;n--)r+=B(t[n]);return r}function F(t,e){for(var r=0,n=0;n\",\"<\",\"|\",\"/\",\"\\\\\"],dflt:\">\",editType:\"plot\"},thickness:{valType:\"number\",min:12,editType:\"plot\"},textfont:u({},s.textfont,{}),editType:\"calc\"},text:s.text,textinfo:l.textinfo,texttemplate:i({editType:\"plot\"},{keys:c.eventDataKeys.concat([\"label\",\"value\"])}),hovertext:s.hovertext,hoverinfo:l.hoverinfo,hovertemplate:n({},{keys:c.eventDataKeys}),textfont:s.textfont,insidetextfont:s.insidetextfont,outsidetextfont:u({},s.outsidetextfont,{}),textposition:{valType:\"enumerated\",values:[\"top left\",\"top center\",\"top right\",\"middle left\",\"middle center\",\"middle right\",\"bottom left\",\"bottom center\",\"bottom right\"],dflt:\"top left\",editType:\"plot\"},sort:s.sort,root:l.root,domain:o({name:\"treemap\",trace:!0,editType:\"calc\"})}},69784:function(t,e,r){\"use strict\";var n=r(44122);e.name=\"treemap\",e.plot=function(t,r,i,a){n.plotBasePlot(e.name,t,r,i,a)},e.clean=function(t,r,i,a){n.cleanBasePlot(e.name,t,r,i,a)}},38848:function(t,e,r){\"use strict\";var n=r(14852);e._=function(t,e){return n.calc(t,e)},e.t=function(t){return n._runCrossTraceCalc(\"treemap\",t)}},43236:function(t){\"use strict\";t.exports={CLICK_TRANSITION_TIME:750,CLICK_TRANSITION_EASING:\"poly\",eventDataKeys:[\"currentPath\",\"root\",\"entry\",\"percentRoot\",\"percentEntry\",\"percentParent\"],gapWithPathbar:1}},95719:function(t,e,r){\"use strict\";var n=r(34809),i=r(71856),a=r(78766),o=r(13792).N,s=r(17550).handleText,l=r(56155).TEXTPAD,c=r(46979).handleMarkerDefaults,u=r(88856),h=u.hasColorscale,f=u.handleDefaults;t.exports=function(t,e,r,u){function p(r,a){return n.coerce(t,e,i,r,a)}var d=p(\"labels\"),m=p(\"parents\");if(d&&d.length&&m&&m.length){var g=p(\"values\");g&&g.length?p(\"branchvalues\"):p(\"count\"),p(\"level\"),p(\"maxdepth\"),\"squarify\"===p(\"tiling.packing\")&&p(\"tiling.squarifyratio\"),p(\"tiling.flip\"),p(\"tiling.pad\");var y=p(\"text\");p(\"texttemplate\"),e.texttemplate||p(\"textinfo\",n.isArrayOrTypedArray(y)?\"text+label\":\"label\"),p(\"hovertext\"),p(\"hovertemplate\");var v=p(\"pathbar.visible\");s(t,e,u,p,\"auto\",{hasPathbar:v,moduleHasSelected:!1,moduleHasUnselected:!1,moduleHasConstrain:!1,moduleHasCliponaxis:!1,moduleHasTextangle:!1,moduleHasInsideanchor:!1}),p(\"textposition\");var x=-1!==e.textposition.indexOf(\"bottom\");c(t,e,u,p),(e._hasColorscale=h(t,\"marker\",\"colors\")||(t.marker||{}).coloraxis)?f(t,e,u,p,{prefix:\"marker.\",cLetter:\"c\"}):p(\"marker.depthfade\",!(e.marker.colors||[]).length);var _=2*e.textfont.size;p(\"marker.pad.t\",x?_/4:_),p(\"marker.pad.l\",_/4),p(\"marker.pad.r\",_/4),p(\"marker.pad.b\",x?_:_/4),p(\"marker.cornerradius\"),e._hovered={marker:{line:{width:2,color:a.contrast(u.paper_bgcolor)}}},v&&(p(\"pathbar.thickness\",e.pathbar.textfont.size+2*l),p(\"pathbar.side\"),p(\"pathbar.edgeshape\")),p(\"sort\"),p(\"root.color\"),o(e,u,p),e._length=null}else e.visible=!1}},41567:function(t,e,r){\"use strict\";var n=r(45568),i=r(33108),a=r(84102).clearMinTextSize,o=r(6851).resizeText,s=r(95709);t.exports=function(t,e,r,l,c){var u,h,f=c.type,p=c.drawDescendants,d=t._fullLayout,m=d[\"_\"+f+\"layer\"],g=!r;a(f,d),(u=m.selectAll(\"g.trace.\"+f).data(e,(function(t){return t[0].trace.uid}))).enter().append(\"g\").classed(\"trace\",!0).classed(f,!0),u.order(),!d.uniformtext.mode&&i.hasTransition(r)?(l&&(h=l()),n.transition().duration(r.duration).ease(r.easing).each(\"end\",(function(){h&&h()})).each(\"interrupt\",(function(){h&&h()})).each((function(){m.selectAll(\"g.trace\").each((function(e){s(t,e,this,r,p)}))}))):(u.each((function(e){s(t,e,this,r,p)})),d.uniformtext.mode&&o(t,m.selectAll(\".trace\"),f)),g&&u.exit().remove()}},17010:function(t,e,r){\"use strict\";var n=r(45568),i=r(34809),a=r(62203),o=r(30635),s=r(11995),l=r(92080).styleOne,c=r(43236),u=r(33108),h=r(44691),f=!0;t.exports=function(t,e,r,p,d){var m=d.barDifY,g=d.width,y=d.height,v=d.viewX,x=d.viewY,_=d.pathSlice,b=d.toMoveInsideSlice,w=d.strTransform,T=d.hasTransition,k=d.handleSlicesExit,A=d.makeUpdateSliceInterpolator,M=d.makeUpdateTextInterpolator,S={},E=t._context.staticPlot,C=t._fullLayout,L=e[0],I=L.trace,P=L.hierarchy,z=g/I._entryDepth,O=u.listPath(r.data,\"id\"),D=s(P.copy(),[g,y],{packing:\"dice\",pad:{inner:0,top:0,left:0,right:0,bottom:0}}).descendants();(D=D.filter((function(t){var e=O.indexOf(t.data.id);return-1!==e&&(t.x0=z*e,t.x1=z*(e+1),t.y0=m,t.y1=m+y,t.onPathbar=!0,!0)}))).reverse(),(p=p.data(D,u.getPtId)).enter().append(\"g\").classed(\"pathbar\",!0),k(p,f,S,[g,y],_),p.order();var R=p;T&&(R=R.transition().each(\"end\",(function(){var e=n.select(this);u.setSliceCursor(e,t,{hideOnRoot:!1,hideOnLeaves:!1,isTransitioning:!1})}))),R.each((function(s){s._x0=v(s.x0),s._x1=v(s.x1),s._y0=x(s.y0),s._y1=x(s.y1),s._hoverX=v(s.x1-Math.min(g,y)/2),s._hoverY=x(s.y1-y/2);var p=n.select(this),d=i.ensureSingle(p,\"path\",\"surface\",(function(t){t.style(\"pointer-events\",E?\"none\":\"all\")}));T?d.transition().attrTween(\"d\",(function(t){var e=A(t,f,S,[g,y]);return function(t){return _(e(t))}})):d.attr(\"d\",_),p.call(h,r,t,e,{styleOne:l,eventDataKeys:c.eventDataKeys,transitionTime:c.CLICK_TRANSITION_TIME,transitionEasing:c.CLICK_TRANSITION_EASING}).call(u.setSliceCursor,t,{hideOnRoot:!1,hideOnLeaves:!1,isTransitioning:t._transitioning}),d.call(l,s,I,t,{hovered:!1}),s._text=(u.getPtLabel(s)||\"\").split(\"
\").join(\" \")||\"\";var m=i.ensureSingle(p,\"g\",\"slicetext\"),k=i.ensureSingle(m,\"text\",\"\",(function(t){t.attr(\"data-notex\",1)})),L=i.ensureUniformFontSize(t,u.determineTextFont(I,s,C.font,{onPathbar:!0}));k.text(s._text||\" \").classed(\"slicetext\",!0).attr(\"text-anchor\",\"start\").call(a.font,L).call(o.convertToTspans,t),s.textBB=a.bBox(k.node()),s.transform=b(s,{fontSize:L.size,onPathbar:!0}),s.transform.fontSize=L.size,T?k.transition().attrTween(\"transform\",(function(t){var e=M(t,f,S,[g,y]);return function(t){return w(e(t))}})):k.attr(\"transform\",w(s))}))}},50916:function(t,e,r){\"use strict\";var n=r(45568),i=r(34809),a=r(62203),o=r(30635),s=r(11995),l=r(92080).styleOne,c=r(43236),u=r(33108),h=r(44691),f=r(19718).formatSliceLabel,p=!1;t.exports=function(t,e,r,d,m){var g=m.width,y=m.height,v=m.viewX,x=m.viewY,_=m.pathSlice,b=m.toMoveInsideSlice,w=m.strTransform,T=m.hasTransition,k=m.handleSlicesExit,A=m.makeUpdateSliceInterpolator,M=m.makeUpdateTextInterpolator,S=m.prevEntry,E=t._context.staticPlot,C=t._fullLayout,L=e[0].trace,I=-1!==L.textposition.indexOf(\"left\"),P=-1!==L.textposition.indexOf(\"right\"),z=-1!==L.textposition.indexOf(\"bottom\"),O=!z&&!L.marker.pad.t||z&&!L.marker.pad.b,D=s(r,[g,y],{packing:L.tiling.packing,squarifyratio:L.tiling.squarifyratio,flipX:L.tiling.flip.indexOf(\"x\")>-1,flipY:L.tiling.flip.indexOf(\"y\")>-1,pad:{inner:L.tiling.pad,top:L.marker.pad.t,left:L.marker.pad.l,right:L.marker.pad.r,bottom:L.marker.pad.b}}).descendants(),R=1/0,F=-1/0;D.forEach((function(t){var e=t.depth;e>=L._maxDepth?(t.x0=t.x1=(t.x0+t.x1)/2,t.y0=t.y1=(t.y0+t.y1)/2):(R=Math.min(R,e),F=Math.max(F,e))})),d=d.data(D,u.getPtId),L._maxVisibleLayers=isFinite(F)?F-R+1:0,d.enter().append(\"g\").classed(\"slice\",!0),k(d,p,{},[g,y],_),d.order();var B=null;if(T&&S){var N=u.getPtId(S);d.each((function(t){null===B&&u.getPtId(t)===N&&(B={x0:t.x0,x1:t.x1,y0:t.y0,y1:t.y1})}))}var j=function(){return B||{x0:0,x1:g,y0:0,y1:y}},U=d;return T&&(U=U.transition().each(\"end\",(function(){var e=n.select(this);u.setSliceCursor(e,t,{hideOnRoot:!0,hideOnLeaves:!1,isTransitioning:!1})}))),U.each((function(s){var d=u.isHeader(s,L);s._x0=v(s.x0),s._x1=v(s.x1),s._y0=x(s.y0),s._y1=x(s.y1),s._hoverX=v(s.x1-L.marker.pad.r),s._hoverY=x(z?s.y1-L.marker.pad.b/2:s.y0+L.marker.pad.t/2);var m=n.select(this),k=i.ensureSingle(m,\"path\",\"surface\",(function(t){t.style(\"pointer-events\",E?\"none\":\"all\")}));T?k.transition().attrTween(\"d\",(function(t){var e=A(t,p,j(),[g,y]);return function(t){return _(e(t))}})):k.attr(\"d\",_),m.call(h,r,t,e,{styleOne:l,eventDataKeys:c.eventDataKeys,transitionTime:c.CLICK_TRANSITION_TIME,transitionEasing:c.CLICK_TRANSITION_EASING}).call(u.setSliceCursor,t,{isTransitioning:t._transitioning}),k.call(l,s,L,t,{hovered:!1}),s.x0===s.x1||s.y0===s.y1?s._text=\"\":s._text=d?O?\"\":u.getPtLabel(s)||\"\":f(s,r,L,e,C)||\"\";var S=i.ensureSingle(m,\"g\",\"slicetext\"),D=i.ensureSingle(S,\"text\",\"\",(function(t){t.attr(\"data-notex\",1)})),R=i.ensureUniformFontSize(t,u.determineTextFont(L,s,C.font)),F=s._text||\" \",B=d&&-1===F.indexOf(\"
\");D.text(F).classed(\"slicetext\",!0).attr(\"text-anchor\",P?\"end\":I||B?\"start\":\"middle\").call(a.font,R).call(o.convertToTspans,t),s.textBB=a.bBox(D.node()),s.transform=b(s,{fontSize:R.size,isHeader:d}),s.transform.fontSize=R.size,T?D.transition().attrTween(\"transform\",(function(t){var e=M(t,p,j(),[g,y]);return function(t){return w(e(t))}})):D.attr(\"transform\",w(s))})),B}},36141:function(t){\"use strict\";t.exports=function t(e,r,n){var i;n.swapXY&&(i=e.x0,e.x0=e.y0,e.y0=i,i=e.x1,e.x1=e.y1,e.y1=i),n.flipX&&(i=e.x0,e.x0=r[0]-e.x1,e.x1=r[0]-i),n.flipY&&(i=e.y0,e.y0=r[1]-e.y1,e.y1=r[1]-i);var a=e.children;if(a)for(var o=0;o-1?L+z:-(P+z):0,D={x0:I,x1:I,y0:O,y1:O+P},R=function(t,e,r){var n=y.tiling.pad,i=function(t){return t-n<=e.x0},a=function(t){return t+n>=e.x1},o=function(t){return t-n<=e.y0},s=function(t){return t+n>=e.y1};return t.x0===e.x0&&t.x1===e.x1&&t.y0===e.y0&&t.y1===e.y1?{x0:t.x0,x1:t.x1,y0:t.y0,y1:t.y1}:{x0:i(t.x0-n)?0:a(t.x0-n)?r[0]:t.x0,x1:i(t.x1+n)?0:a(t.x1+n)?r[0]:t.x1,y0:o(t.y0-n)?0:s(t.y0-n)?r[1]:t.y0,y1:o(t.y1+n)?0:s(t.y1+n)?r[1]:t.y1}},F=null,B={},N={},j=null,U=function(t,e){return e?B[f(t)]:N[f(t)]};g.hasMultipleRoots&&k&&M++,y._maxDepth=M,y._backgroundColor=m.paper_bgcolor,y._entryDepth=_.data.depth,y._atRootLevel=k;var V=-C/2+S.l+S.w*(E.x[1]+E.x[0])/2,q=-L/2+S.t+S.h*(1-(E.y[1]+E.y[0])/2),H=function(t){return V+t},G=function(t){return q+t},Z=G(0),W=H(0),Y=function(t){return W+t},X=function(t){return Z+t};function $(t,e){return t+\",\"+e}var J=Y(0),K=function(t){t.x=Math.max(J,t.x)},Q=y.pathbar.edgeshape,tt=y[v?\"tiling\":\"marker\"].pad,et=function(t){return-1!==y.textposition.indexOf(t)},rt=et(\"top\"),nt=et(\"left\"),it=et(\"right\"),at=et(\"bottom\"),ot=function(t,e){var r=t.x0,n=t.x1,i=t.y0,a=t.y1,o=t.textBB,u=rt||e.isHeader&&!at?\"start\":at?\"end\":\"middle\",h=et(\"right\"),f=et(\"left\")||e.onPathbar?-1:h?1:0;if(e.isHeader){if((r+=(v?tt:tt.l)-s)>=(n-=(v?tt:tt.r)-s)){var p=(r+n)/2;r=p,n=p}var d;at?i<(d=a-(v?tt:tt.b))&&d\"===Q?(l.x-=a,c.x-=a,u.x-=a,h.x-=a):\"/\"===Q?(u.x-=a,h.x-=a,o.x-=a/2,s.x-=a/2):\"\\\\\"===Q?(l.x-=a,c.x-=a,o.x-=a/2,s.x-=a/2):\"<\"===Q&&(o.x-=a,s.x-=a),K(l),K(h),K(o),K(c),K(u),K(s),\"M\"+$(l.x,l.y)+\"L\"+$(c.x,c.y)+\"L\"+$(s.x,s.y)+\"L\"+$(u.x,u.y)+\"L\"+$(h.x,h.y)+\"L\"+$(o.x,o.y)+\"Z\"},toMoveInsideSlice:ot,makeUpdateSliceInterpolator:lt,makeUpdateTextInterpolator:ct,handleSlicesExit:ut,hasTransition:A,strTransform:ht}):w.remove()}},92080:function(t,e,r){\"use strict\";var n=r(45568),i=r(78766),a=r(34809),o=r(33108),s=r(84102).resizeText,l=r(72043);function c(t,e,r,n,s){var c,u,h=(s||{}).hovered,f=e.data.data,p=f.i,d=f.color,m=o.isHierarchyRoot(e),g=1;if(h)c=r._hovered.marker.line.color,u=r._hovered.marker.line.width;else if(m&&d===r.root.color)g=100,c=\"rgba(0,0,0,0)\",u=0;else if(c=a.castOption(r,p,\"marker.line.color\")||i.defaultLine,u=a.castOption(r,p,\"marker.line.width\")||0,!r._hasColorscale&&!e.onPathbar){var y=r.marker.depthfade;if(y){var v,x=i.combine(i.addOpacity(r._backgroundColor,.75),d);if(!0===y){var _=o.getMaxDepth(r);v=isFinite(_)?o.isLeaf(e)?0:r._maxVisibleLayers-(e.data.depth-r._entryDepth):e.data.height+1}else v=e.data.depth-r._entryDepth,r._atRootLevel||v++;if(v>0)for(var b=0;b0){var _,b,w,T,k,A=t.xa,M=t.ya;\"h\"===d.orientation?(k=e,_=\"y\",w=M,b=\"x\",T=A):(k=r,_=\"x\",w=A,b=\"y\",T=M);var S=p[t.index];if(k>=S.span[0]&&k<=S.span[1]){var E=i.extendFlat({},t),C=T.c2p(k,!0),L=s.getKdeValue(S,d,k),I=s.getPositionOnKdePath(S,d,C),P=w._offset,z=w._length;E[_+\"0\"]=I[0],E[_+\"1\"]=I[1],E[b+\"0\"]=E[b+\"1\"]=C,E[b+\"Label\"]=b+\": \"+a.hoverLabelText(T,k,d[b+\"hoverformat\"])+\", \"+p[0].t.labels.kde+\" \"+L.toFixed(3);for(var O=0,D=0;D\")),u.color=function(t,e){var r=t[e.dir].marker,n=r.color,a=r.line.color,o=r.line.width;return i(n)?n:i(a)&&o?a:void 0}(f,g),[u]}function k(t){return n(m,t,f[d+\"hoverformat\"])}}},38261:function(t,e,r){\"use strict\";t.exports={attributes:r(37832),layoutAttributes:r(579),supplyDefaults:r(67199).supplyDefaults,crossTraceDefaults:r(67199).crossTraceDefaults,supplyLayoutDefaults:r(71492),calc:r(15e3),crossTraceCalc:r(9963),plot:r(71130),style:r(57256).style,hoverPoints:r(40943),eventData:r(64932),selectPoints:r(88384),moduleType:\"trace\",name:\"waterfall\",basePlotModule:r(37703),categories:[\"bar-like\",\"cartesian\",\"svg\",\"oriented\",\"showLegend\",\"zoomScale\"],meta:{}}},579:function(t){\"use strict\";t.exports={waterfallmode:{valType:\"enumerated\",values:[\"group\",\"overlay\"],dflt:\"group\",editType:\"calc\"},waterfallgap:{valType:\"number\",min:0,max:1,editType:\"calc\"},waterfallgroupgap:{valType:\"number\",min:0,max:1,dflt:0,editType:\"calc\"}}},71492:function(t,e,r){\"use strict\";var n=r(34809),i=r(579);t.exports=function(t,e,r){var a=!1;function o(r,a){return n.coerce(t,e,i,r,a)}for(var s=0;s0&&(g+=f?\"M\"+h[0]+\",\"+d[1]+\"V\"+d[0]:\"M\"+h[1]+\",\"+d[0]+\"H\"+h[0]),\"between\"!==p&&(r.isSum||s path\").each((function(t){if(!t.isBlank){var e=s[t.dir].marker;n.select(this).call(a.fill,e.color).call(a.stroke,e.line.color).call(i.dashLine,e.line.dash,e.line.width).style(\"opacity\",s.selectedpoints&&!t.selected?o:1)}})),c(r,s,t),r.selectAll(\".lines\").each((function(){var t=s.connector.line;i.lineGroupStyle(n.select(this).selectAll(\"path\"),t.width,t.color,t.dash)}))}))}}},47908:function(t,e,r){\"use strict\";var n=r(29714),i=r(34809),a=r(57297),o=r(5086).z,s=r(63821).BADNUM;e.moduleType=\"transform\",e.name=\"aggregate\";var l=e.attributes={enabled:{valType:\"boolean\",dflt:!0,editType:\"calc\"},groups:{valType:\"string\",strict:!0,noBlank:!0,arrayOk:!0,dflt:\"x\",editType:\"calc\"},aggregations:{_isLinkedToArray:\"aggregation\",target:{valType:\"string\",editType:\"calc\"},func:{valType:\"enumerated\",values:[\"count\",\"sum\",\"avg\",\"median\",\"mode\",\"rms\",\"stddev\",\"min\",\"max\",\"first\",\"last\",\"change\",\"range\"],dflt:\"first\",editType:\"calc\"},funcmode:{valType:\"enumerated\",values:[\"sample\",\"population\"],dflt:\"sample\",editType:\"calc\"},enabled:{valType:\"boolean\",dflt:!0,editType:\"calc\"},editType:\"calc\"},editType:\"calc\"},c=l.aggregations;function u(t,e,r,a){if(a.enabled){for(var o=a.target,l=i.nestedProperty(e,o),c=l.get(),u=function(t,e){var r=t.func,n=e.d2c,a=e.c2d;switch(r){case\"count\":return h;case\"first\":return f;case\"last\":return p;case\"sum\":return function(t,e){for(var r=0,i=0;ii&&(i=u,o=c)}}return i?a(o):s};case\"rms\":return function(t,e){for(var r=0,i=0,o=0;o\":return function(t){return p(t)>h};case\">=\":return function(t){return p(t)>=h};case\"[]\":return function(t){var e=p(t);return e>=h[0]&&e<=h[1]};case\"()\":return function(t){var e=p(t);return e>h[0]&&e=h[0]&&eh[0]&&e<=h[1]};case\"][\":return function(t){var e=p(t);return e<=h[0]||e>=h[1]};case\")(\":return function(t){var e=p(t);return eh[1]};case\"](\":return function(t){var e=p(t);return e<=h[0]||e>h[1]};case\")[\":return function(t){var e=p(t);return e=h[1]};case\"{}\":return function(t){return-1!==h.indexOf(p(t))};case\"}{\":return function(t){return-1===h.indexOf(p(t))}}}(r,a.getDataToCoordFunc(t,e,s,i),f),x={},_={},b=0;d?(g=function(t){x[t.astr]=n.extendDeep([],t.get()),t.set(new Array(h))},y=function(t,e){var r=x[t.astr][e];t.get()[e]=r}):(g=function(t){x[t.astr]=n.extendDeep([],t.get()),t.set([])},y=function(t,e){var r=x[t.astr][e];t.get().push(r)}),k(g);for(var w=o(e.transforms,r),T=0;T1?\"%{group} (%{trace})\":\"%{group}\");var l=t.styles,c=o.styles=[];if(l)for(a=0;af)throw new RangeError('The value \"'+t+'\" is invalid for option \"size\"');var e=new Uint8Array(t);return Object.setPrototypeOf(e,d.prototype),e}function d(t,e,r){if(\"number\"==typeof t){if(\"string\"==typeof e)throw new TypeError('The \"string\" argument must be of type string. Received type number');return y(t)}return m(t,e,r)}function m(t,e,r){if(\"string\"==typeof t)return function(t,e){if(\"string\"==typeof e&&\"\"!==e||(e=\"utf8\"),!d.isEncoding(e))throw new TypeError(\"Unknown encoding: \"+e);var r=0|b(t,e),n=p(r),i=n.write(t,e);return i!==r&&(n=n.slice(0,i)),n}(t,e);if(ArrayBuffer.isView(t))return function(t){if(et(t,Uint8Array)){var e=new Uint8Array(t);return x(e.buffer,e.byteOffset,e.byteLength)}return v(t)}(t);if(null==t)throw new TypeError(\"The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type \"+l(t));if(et(t,ArrayBuffer)||t&&et(t.buffer,ArrayBuffer))return x(t,e,r);if(\"undefined\"!=typeof SharedArrayBuffer&&(et(t,SharedArrayBuffer)||t&&et(t.buffer,SharedArrayBuffer)))return x(t,e,r);if(\"number\"==typeof t)throw new TypeError('The \"value\" argument must not be of type number. Received type number');var n=t.valueOf&&t.valueOf();if(null!=n&&n!==t)return d.from(n,e,r);var i=function(t){if(d.isBuffer(t)){var e=0|_(t.length),r=p(e);return 0===r.length||t.copy(r,0,0,e),r}return void 0!==t.length?\"number\"!=typeof t.length||rt(t.length)?p(0):v(t):\"Buffer\"===t.type&&Array.isArray(t.data)?v(t.data):void 0}(t);if(i)return i;if(\"undefined\"!=typeof Symbol&&null!=Symbol.toPrimitive&&\"function\"==typeof t[Symbol.toPrimitive])return d.from(t[Symbol.toPrimitive](\"string\"),e,r);throw new TypeError(\"The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type \"+l(t))}function g(t){if(\"number\"!=typeof t)throw new TypeError('\"size\" argument must be of type number');if(t<0)throw new RangeError('The value \"'+t+'\" is invalid for option \"size\"')}function y(t){return g(t),p(t<0?0:0|_(t))}function v(t){for(var e=t.length<0?0:0|_(t.length),r=p(e),n=0;n=f)throw new RangeError(\"Attempt to allocate Buffer larger than maximum size: 0x\"+f.toString(16)+\" bytes\");return 0|t}function b(t,e){if(d.isBuffer(t))return t.length;if(ArrayBuffer.isView(t)||et(t,ArrayBuffer))return t.byteLength;if(\"string\"!=typeof t)throw new TypeError('The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+l(t));var r=t.length,n=arguments.length>2&&!0===arguments[2];if(!n&&0===r)return 0;for(var i=!1;;)switch(e){case\"ascii\":case\"latin1\":case\"binary\":return r;case\"utf8\":case\"utf-8\":return K(t).length;case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return 2*r;case\"hex\":return r>>>1;case\"base64\":return Q(t).length;default:if(i)return n?-1:K(t).length;e=(\"\"+e).toLowerCase(),i=!0}}function w(t,e,r){var n=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return\"\";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return\"\";if((r>>>=0)<=(e>>>=0))return\"\";for(t||(t=\"utf8\");;)switch(t){case\"hex\":return R(this,e,r);case\"utf8\":case\"utf-8\":return P(this,e,r);case\"ascii\":return O(this,e,r);case\"latin1\":case\"binary\":return D(this,e,r);case\"base64\":return I(this,e,r);case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return F(this,e,r);default:if(n)throw new TypeError(\"Unknown encoding: \"+t);t=(t+\"\").toLowerCase(),n=!0}}function T(t,e,r){var n=t[e];t[e]=t[r],t[r]=n}function k(t,e,r,n,i){if(0===t.length)return-1;if(\"string\"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),rt(r=+r)&&(r=i?0:t.length-1),r<0&&(r=t.length+r),r>=t.length){if(i)return-1;r=t.length-1}else if(r<0){if(!i)return-1;r=0}if(\"string\"==typeof e&&(e=d.from(e,n)),d.isBuffer(e))return 0===e.length?-1:A(t,e,r,n,i);if(\"number\"==typeof e)return e&=255,\"function\"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(t,e,r):Uint8Array.prototype.lastIndexOf.call(t,e,r):A(t,[e],r,n,i);throw new TypeError(\"val must be string, number or Buffer\")}function A(t,e,r,n,i){var a,o=1,s=t.length,l=e.length;if(void 0!==n&&(\"ucs2\"===(n=String(n).toLowerCase())||\"ucs-2\"===n||\"utf16le\"===n||\"utf-16le\"===n)){if(t.length<2||e.length<2)return-1;o=2,s/=2,l/=2,r/=2}function c(t,e){return 1===o?t[e]:t.readUInt16BE(e*o)}if(i){var u=-1;for(a=r;as&&(r=s-l),a=r;a>=0;a--){for(var h=!0,f=0;fi&&(n=i):n=i;var a,o=e.length;for(n>o/2&&(n=o/2),a=0;a>8,i=r%256,a.push(i),a.push(n);return a}(e,t.length-r),t,r,n)}function I(t,e,r){return 0===e&&r===t.length?c.fromByteArray(t):c.fromByteArray(t.slice(e,r))}function P(t,e,r){r=Math.min(t.length,r);for(var n=[],i=e;i239?4:a>223?3:a>191?2:1;if(i+s<=r){var l=void 0,c=void 0,u=void 0,h=void 0;switch(s){case 1:a<128&&(o=a);break;case 2:128==(192&(l=t[i+1]))&&(h=(31&a)<<6|63&l)>127&&(o=h);break;case 3:l=t[i+1],c=t[i+2],128==(192&l)&&128==(192&c)&&(h=(15&a)<<12|(63&l)<<6|63&c)>2047&&(h<55296||h>57343)&&(o=h);break;case 4:l=t[i+1],c=t[i+2],u=t[i+3],128==(192&l)&&128==(192&c)&&128==(192&u)&&(h=(15&a)<<18|(63&l)<<12|(63&c)<<6|63&u)>65535&&h<1114112&&(o=h)}}null===o?(o=65533,s=1):o>65535&&(o-=65536,n.push(o>>>10&1023|55296),o=56320|1023&o),n.push(o),i+=s}return function(t){var e=t.length;if(e<=z)return String.fromCharCode.apply(String,t);for(var r=\"\",n=0;nn.length?(d.isBuffer(a)||(a=d.from(a)),a.copy(n,i)):Uint8Array.prototype.set.call(n,a,i);else{if(!d.isBuffer(a))throw new TypeError('\"list\" argument must be an Array of Buffers');a.copy(n,i)}i+=a.length}return n},d.byteLength=b,d.prototype._isBuffer=!0,d.prototype.swap16=function(){var t=this.length;if(t%2!=0)throw new RangeError(\"Buffer size must be a multiple of 16-bits\");for(var e=0;er&&(t+=\" ... \"),\"\"},h&&(d.prototype[h]=d.prototype.inspect),d.prototype.compare=function(t,e,r,n,i){if(et(t,Uint8Array)&&(t=d.from(t,t.offset,t.byteLength)),!d.isBuffer(t))throw new TypeError('The \"target\" argument must be one of type Buffer or Uint8Array. Received type '+l(t));if(void 0===e&&(e=0),void 0===r&&(r=t?t.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),e<0||r>t.length||n<0||i>this.length)throw new RangeError(\"out of range index\");if(n>=i&&e>=r)return 0;if(n>=i)return-1;if(e>=r)return 1;if(this===t)return 0;for(var a=(i>>>=0)-(n>>>=0),o=(r>>>=0)-(e>>>=0),s=Math.min(a,o),c=this.slice(n,i),u=t.slice(e,r),h=0;h>>=0,isFinite(r)?(r>>>=0,void 0===n&&(n=\"utf8\")):(n=r,r=void 0)}var i=this.length-e;if((void 0===r||r>i)&&(r=i),t.length>0&&(r<0||e<0)||e>this.length)throw new RangeError(\"Attempt to write outside buffer bounds\");n||(n=\"utf8\");for(var a=!1;;)switch(n){case\"hex\":return M(this,t,e,r);case\"utf8\":case\"utf-8\":return S(this,t,e,r);case\"ascii\":case\"latin1\":case\"binary\":return E(this,t,e,r);case\"base64\":return C(this,t,e,r);case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return L(this,t,e,r);default:if(a)throw new TypeError(\"Unknown encoding: \"+n);n=(\"\"+n).toLowerCase(),a=!0}},d.prototype.toJSON=function(){return{type:\"Buffer\",data:Array.prototype.slice.call(this._arr||this,0)}};var z=4096;function O(t,e,r){var n=\"\";r=Math.min(t.length,r);for(var i=e;in)&&(r=n);for(var i=\"\",a=e;ar)throw new RangeError(\"Trying to access beyond buffer length\")}function N(t,e,r,n,i,a){if(!d.isBuffer(t))throw new TypeError('\"buffer\" argument must be a Buffer instance');if(e>i||et.length)throw new RangeError(\"Index out of range\")}function j(t,e,r,n,i){Y(e,n,i,t,r,7);var a=Number(e&BigInt(4294967295));t[r++]=a,a>>=8,t[r++]=a,a>>=8,t[r++]=a,a>>=8,t[r++]=a;var o=Number(e>>BigInt(32)&BigInt(4294967295));return t[r++]=o,o>>=8,t[r++]=o,o>>=8,t[r++]=o,o>>=8,t[r++]=o,r}function U(t,e,r,n,i){Y(e,n,i,t,r,7);var a=Number(e&BigInt(4294967295));t[r+7]=a,a>>=8,t[r+6]=a,a>>=8,t[r+5]=a,a>>=8,t[r+4]=a;var o=Number(e>>BigInt(32)&BigInt(4294967295));return t[r+3]=o,o>>=8,t[r+2]=o,o>>=8,t[r+1]=o,o>>=8,t[r]=o,r+8}function V(t,e,r,n,i,a){if(r+n>t.length)throw new RangeError(\"Index out of range\");if(r<0)throw new RangeError(\"Index out of range\")}function q(t,e,r,n,i){return e=+e,r>>>=0,i||V(t,0,r,4),u.write(t,e,r,n,23,4),r+4}function H(t,e,r,n,i){return e=+e,r>>>=0,i||V(t,0,r,8),u.write(t,e,r,n,52,8),r+8}d.prototype.slice=function(t,e){var r=this.length;(t=~~t)<0?(t+=r)<0&&(t=0):t>r&&(t=r),(e=void 0===e?r:~~e)<0?(e+=r)<0&&(e=0):e>r&&(e=r),e>>=0,e>>>=0,r||B(t,e,this.length);for(var n=this[t],i=1,a=0;++a>>=0,e>>>=0,r||B(t,e,this.length);for(var n=this[t+--e],i=1;e>0&&(i*=256);)n+=this[t+--e]*i;return n},d.prototype.readUint8=d.prototype.readUInt8=function(t,e){return t>>>=0,e||B(t,1,this.length),this[t]},d.prototype.readUint16LE=d.prototype.readUInt16LE=function(t,e){return t>>>=0,e||B(t,2,this.length),this[t]|this[t+1]<<8},d.prototype.readUint16BE=d.prototype.readUInt16BE=function(t,e){return t>>>=0,e||B(t,2,this.length),this[t]<<8|this[t+1]},d.prototype.readUint32LE=d.prototype.readUInt32LE=function(t,e){return t>>>=0,e||B(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},d.prototype.readUint32BE=d.prototype.readUInt32BE=function(t,e){return t>>>=0,e||B(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},d.prototype.readBigUInt64LE=it((function(t){X(t>>>=0,\"offset\");var e=this[t],r=this[t+7];void 0!==e&&void 0!==r||$(t,this.length-8);var n=e+this[++t]*Math.pow(2,8)+this[++t]*Math.pow(2,16)+this[++t]*Math.pow(2,24),i=this[++t]+this[++t]*Math.pow(2,8)+this[++t]*Math.pow(2,16)+r*Math.pow(2,24);return BigInt(n)+(BigInt(i)<>>=0,\"offset\");var e=this[t],r=this[t+7];void 0!==e&&void 0!==r||$(t,this.length-8);var n=e*Math.pow(2,24)+this[++t]*Math.pow(2,16)+this[++t]*Math.pow(2,8)+this[++t],i=this[++t]*Math.pow(2,24)+this[++t]*Math.pow(2,16)+this[++t]*Math.pow(2,8)+r;return(BigInt(n)<>>=0,e>>>=0,r||B(t,e,this.length);for(var n=this[t],i=1,a=0;++a=(i*=128)&&(n-=Math.pow(2,8*e)),n},d.prototype.readIntBE=function(t,e,r){t>>>=0,e>>>=0,r||B(t,e,this.length);for(var n=e,i=1,a=this[t+--n];n>0&&(i*=256);)a+=this[t+--n]*i;return a>=(i*=128)&&(a-=Math.pow(2,8*e)),a},d.prototype.readInt8=function(t,e){return t>>>=0,e||B(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},d.prototype.readInt16LE=function(t,e){t>>>=0,e||B(t,2,this.length);var r=this[t]|this[t+1]<<8;return 32768&r?4294901760|r:r},d.prototype.readInt16BE=function(t,e){t>>>=0,e||B(t,2,this.length);var r=this[t+1]|this[t]<<8;return 32768&r?4294901760|r:r},d.prototype.readInt32LE=function(t,e){return t>>>=0,e||B(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},d.prototype.readInt32BE=function(t,e){return t>>>=0,e||B(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},d.prototype.readBigInt64LE=it((function(t){X(t>>>=0,\"offset\");var e=this[t],r=this[t+7];void 0!==e&&void 0!==r||$(t,this.length-8);var n=this[t+4]+this[t+5]*Math.pow(2,8)+this[t+6]*Math.pow(2,16)+(r<<24);return(BigInt(n)<>>=0,\"offset\");var e=this[t],r=this[t+7];void 0!==e&&void 0!==r||$(t,this.length-8);var n=(e<<24)+this[++t]*Math.pow(2,16)+this[++t]*Math.pow(2,8)+this[++t];return(BigInt(n)<>>=0,e||B(t,4,this.length),u.read(this,t,!0,23,4)},d.prototype.readFloatBE=function(t,e){return t>>>=0,e||B(t,4,this.length),u.read(this,t,!1,23,4)},d.prototype.readDoubleLE=function(t,e){return t>>>=0,e||B(t,8,this.length),u.read(this,t,!0,52,8)},d.prototype.readDoubleBE=function(t,e){return t>>>=0,e||B(t,8,this.length),u.read(this,t,!1,52,8)},d.prototype.writeUintLE=d.prototype.writeUIntLE=function(t,e,r,n){t=+t,e>>>=0,r>>>=0,n||N(this,t,e,r,Math.pow(2,8*r)-1,0);var i=1,a=0;for(this[e]=255&t;++a>>=0,r>>>=0,n||N(this,t,e,r,Math.pow(2,8*r)-1,0);var i=r-1,a=1;for(this[e+i]=255&t;--i>=0&&(a*=256);)this[e+i]=t/a&255;return e+r},d.prototype.writeUint8=d.prototype.writeUInt8=function(t,e,r){return t=+t,e>>>=0,r||N(this,t,e,1,255,0),this[e]=255&t,e+1},d.prototype.writeUint16LE=d.prototype.writeUInt16LE=function(t,e,r){return t=+t,e>>>=0,r||N(this,t,e,2,65535,0),this[e]=255&t,this[e+1]=t>>>8,e+2},d.prototype.writeUint16BE=d.prototype.writeUInt16BE=function(t,e,r){return t=+t,e>>>=0,r||N(this,t,e,2,65535,0),this[e]=t>>>8,this[e+1]=255&t,e+2},d.prototype.writeUint32LE=d.prototype.writeUInt32LE=function(t,e,r){return t=+t,e>>>=0,r||N(this,t,e,4,4294967295,0),this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t,e+4},d.prototype.writeUint32BE=d.prototype.writeUInt32BE=function(t,e,r){return t=+t,e>>>=0,r||N(this,t,e,4,4294967295,0),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},d.prototype.writeBigUInt64LE=it((function(t){return j(this,t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,BigInt(0),BigInt(\"0xffffffffffffffff\"))})),d.prototype.writeBigUInt64BE=it((function(t){return U(this,t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,BigInt(0),BigInt(\"0xffffffffffffffff\"))})),d.prototype.writeIntLE=function(t,e,r,n){if(t=+t,e>>>=0,!n){var i=Math.pow(2,8*r-1);N(this,t,e,r,i-1,-i)}var a=0,o=1,s=0;for(this[e]=255&t;++a>0)-s&255;return e+r},d.prototype.writeIntBE=function(t,e,r,n){if(t=+t,e>>>=0,!n){var i=Math.pow(2,8*r-1);N(this,t,e,r,i-1,-i)}var a=r-1,o=1,s=0;for(this[e+a]=255&t;--a>=0&&(o*=256);)t<0&&0===s&&0!==this[e+a+1]&&(s=1),this[e+a]=(t/o>>0)-s&255;return e+r},d.prototype.writeInt8=function(t,e,r){return t=+t,e>>>=0,r||N(this,t,e,1,127,-128),t<0&&(t=255+t+1),this[e]=255&t,e+1},d.prototype.writeInt16LE=function(t,e,r){return t=+t,e>>>=0,r||N(this,t,e,2,32767,-32768),this[e]=255&t,this[e+1]=t>>>8,e+2},d.prototype.writeInt16BE=function(t,e,r){return t=+t,e>>>=0,r||N(this,t,e,2,32767,-32768),this[e]=t>>>8,this[e+1]=255&t,e+2},d.prototype.writeInt32LE=function(t,e,r){return t=+t,e>>>=0,r||N(this,t,e,4,2147483647,-2147483648),this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24,e+4},d.prototype.writeInt32BE=function(t,e,r){return t=+t,e>>>=0,r||N(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},d.prototype.writeBigInt64LE=it((function(t){return j(this,t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,-BigInt(\"0x8000000000000000\"),BigInt(\"0x7fffffffffffffff\"))})),d.prototype.writeBigInt64BE=it((function(t){return U(this,t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,-BigInt(\"0x8000000000000000\"),BigInt(\"0x7fffffffffffffff\"))})),d.prototype.writeFloatLE=function(t,e,r){return q(this,t,e,!0,r)},d.prototype.writeFloatBE=function(t,e,r){return q(this,t,e,!1,r)},d.prototype.writeDoubleLE=function(t,e,r){return H(this,t,e,!0,r)},d.prototype.writeDoubleBE=function(t,e,r){return H(this,t,e,!1,r)},d.prototype.copy=function(t,e,r,n){if(!d.isBuffer(t))throw new TypeError(\"argument should be a Buffer\");if(r||(r=0),n||0===n||(n=this.length),e>=t.length&&(e=t.length),e||(e=0),n>0&&n=this.length)throw new RangeError(\"Index out of range\");if(n<0)throw new RangeError(\"sourceEnd out of bounds\");n>this.length&&(n=this.length),t.length-e>>=0,r=void 0===r?this.length:r>>>0,t||(t=0),\"number\"==typeof t)for(a=e;a=n+4;r-=3)e=\"_\".concat(t.slice(r-3,r)).concat(e);return\"\".concat(t.slice(0,r)).concat(e)}function Y(t,e,r,n,i,a){if(t>r||t3?0===e||e===BigInt(0)?\">= 0\".concat(s,\" and < 2\").concat(s,\" ** \").concat(8*(a+1)).concat(s):\">= -(2\".concat(s,\" ** \").concat(8*(a+1)-1).concat(s,\") and < 2 ** \")+\"\".concat(8*(a+1)-1).concat(s):\">= \".concat(e).concat(s,\" and <= \").concat(r).concat(s),new G.ERR_OUT_OF_RANGE(\"value\",o,t)}!function(t,e,r){X(e,\"offset\"),void 0!==t[e]&&void 0!==t[e+r]||$(e,t.length-(r+1))}(n,i,a)}function X(t,e){if(\"number\"!=typeof t)throw new G.ERR_INVALID_ARG_TYPE(e,\"number\",t)}function $(t,e,r){if(Math.floor(t)!==t)throw X(t,r),new G.ERR_OUT_OF_RANGE(r||\"offset\",\"an integer\",t);if(e<0)throw new G.ERR_BUFFER_OUT_OF_BOUNDS;throw new G.ERR_OUT_OF_RANGE(r||\"offset\",\">= \".concat(r?1:0,\" and <= \").concat(e),t)}Z(\"ERR_BUFFER_OUT_OF_BOUNDS\",(function(t){return t?\"\".concat(t,\" is outside of buffer bounds\"):\"Attempt to access memory outside buffer bounds\"}),RangeError),Z(\"ERR_INVALID_ARG_TYPE\",(function(t,e){return'The \"'.concat(t,'\" argument must be of type number. Received type ').concat(l(e))}),TypeError),Z(\"ERR_OUT_OF_RANGE\",(function(t,e,r){var n='The value of \"'.concat(t,'\" is out of range.'),i=r;return Number.isInteger(r)&&Math.abs(r)>Math.pow(2,32)?i=W(String(r)):\"bigint\"==typeof r&&(i=String(r),(r>Math.pow(BigInt(2),BigInt(32))||r<-Math.pow(BigInt(2),BigInt(32)))&&(i=W(i)),i+=\"n\"),n+\" It must be \".concat(e,\". Received \").concat(i)}),RangeError);var J=/[^+/0-9A-Za-z-_]/g;function K(t,e){var r;e=e||1/0;for(var n=t.length,i=null,a=[],o=0;o55295&&r<57344){if(!i){if(r>56319){(e-=3)>-1&&a.push(239,191,189);continue}if(o+1===n){(e-=3)>-1&&a.push(239,191,189);continue}i=r;continue}if(r<56320){(e-=3)>-1&&a.push(239,191,189),i=r;continue}r=65536+(i-55296<<10|r-56320)}else i&&(e-=3)>-1&&a.push(239,191,189);if(i=null,r<128){if((e-=1)<0)break;a.push(r)}else if(r<2048){if((e-=2)<0)break;a.push(r>>6|192,63&r|128)}else if(r<65536){if((e-=3)<0)break;a.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error(\"Invalid code point\");if((e-=4)<0)break;a.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return a}function Q(t){return c.toByteArray(function(t){if((t=(t=t.split(\"=\")[0]).trim().replace(J,\"\")).length<2)return\"\";for(;t.length%4!=0;)t+=\"=\";return t}(t))}function tt(t,e,r,n){var i;for(i=0;i=e.length||i>=t.length);++i)e[i+r]=t[i];return i}function et(t,e){return t instanceof e||null!=t&&null!=t.constructor&&null!=t.constructor.name&&t.constructor.name===e.name}function rt(t){return t!=t}var nt=function(){for(var t=\"0123456789abcdef\",e=new Array(256),r=0;r<16;++r)for(var n=16*r,i=0;i<16;++i)e[n+i]=t[r]+t[i];return e}();function it(t){return\"undefined\"==typeof BigInt?at:t}function at(){throw new Error(\"BigInt not supported\")}},9216:function(t){\"use strict\";t.exports=i,t.exports.isMobile=i,t.exports.default=i;var e=/(android|bb\\d+|meego).+mobile|armv7l|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series[46]0|samsungbrowser.*mobile|symbian|treo|up\\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i,r=/CrOS/,n=/android|ipad|playbook|silk/i;function i(t){t||(t={});var i=t.ua;if(i||\"undefined\"==typeof navigator||(i=navigator.userAgent),i&&i.headers&&\"string\"==typeof i.headers[\"user-agent\"]&&(i=i.headers[\"user-agent\"]),\"string\"!=typeof i)return!1;var a=e.test(i)&&!r.test(i)||!!t.tablet&&n.test(i);return!a&&t.tablet&&t.featureDetect&&navigator&&navigator.maxTouchPoints>1&&-1!==i.indexOf(\"Macintosh\")&&-1!==i.indexOf(\"Safari\")&&(a=!0),a}},6296:function(t,e,r){\"use strict\";t.exports=function(t){var e=(t=t||{}).eye||[0,0,1],r=t.center||[0,0,0],s=t.up||[0,1,0],l=t.distanceLimits||[0,1/0],c=t.mode||\"turntable\",u=n(),h=i(),f=a();return u.setDistanceLimits(l[0],l[1]),u.lookAt(0,e,r,s),h.setDistanceLimits(l[0],l[1]),h.lookAt(0,e,r,s),f.setDistanceLimits(l[0],l[1]),f.lookAt(0,e,r,s),new o({turntable:u,orbit:h,matrix:f},c)};var n=r(7261),i=r(9977),a=r(4192);function o(t,e){this._controllerNames=Object.keys(t),this._controllerList=this._controllerNames.map((function(e){return t[e]})),this._mode=e,this._active=t[e],this._active||(this._mode=\"turntable\",this._active=t.turntable),this.modes=this._controllerNames,this.computedMatrix=this._active.computedMatrix,this.computedEye=this._active.computedEye,this.computedUp=this._active.computedUp,this.computedCenter=this._active.computedCenter,this.computedRadius=this._active.computedRadius}var s=o.prototype;s.flush=function(t){for(var e=this._controllerList,r=0;r0?o-4:o;for(r=0;r>16&255,c[u++]=e>>8&255,c[u++]=255&e;return 2===l&&(e=n[t.charCodeAt(r)]<<2|n[t.charCodeAt(r+1)]>>4,c[u++]=255&e),1===l&&(e=n[t.charCodeAt(r)]<<10|n[t.charCodeAt(r+1)]<<4|n[t.charCodeAt(r+2)]>>2,c[u++]=e>>8&255,c[u++]=255&e),c},e.fromByteArray=function(t){for(var e,n=t.length,i=n%3,a=[],o=16383,s=0,c=n-i;sc?c:s+o));return 1===i?(e=t[n-1],a.push(r[e>>2]+r[e<<4&63]+\"==\")):2===i&&(e=(t[n-2]<<8)+t[n-1],a.push(r[e>>10]+r[e>>4&63]+r[e<<2&63]+\"=\")),a.join(\"\")};for(var r=[],n=[],i=\"undefined\"!=typeof Uint8Array?Uint8Array:Array,a=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\",o=0;o<64;++o)r[o]=a[o],n[a.charCodeAt(o)]=o;function s(t){var e=t.length;if(e%4>0)throw new Error(\"Invalid string. Length must be a multiple of 4\");var r=t.indexOf(\"=\");return-1===r&&(r=e),[r,r===e?0:4-r%4]}function l(t,e,n){for(var i,a,o=[],s=e;s>18&63]+r[a>>12&63]+r[a>>6&63]+r[63&a]);return o.join(\"\")}n[\"-\".charCodeAt(0)]=62,n[\"_\".charCodeAt(0)]=63},3865:function(t,e,r){\"use strict\";var n=r(869);t.exports=function(t,e){return n(t[0].mul(e[1]).add(e[0].mul(t[1])),t[1].mul(e[1]))}},1318:function(t){\"use strict\";t.exports=function(t,e){return t[0].mul(e[1]).cmp(e[0].mul(t[1]))}},8697:function(t,e,r){\"use strict\";var n=r(869);t.exports=function(t,e){return n(t[0].mul(e[1]),t[1].mul(e[0]))}},7842:function(t,e,r){\"use strict\";var n=r(6330),i=r(1533),a=r(2651),o=r(4387),s=r(869),l=r(8697);t.exports=function t(e,r){if(n(e))return r?l(e,t(r)):[e[0].clone(),e[1].clone()];var c,u,h=0;if(i(e))c=e.clone();else if(\"string\"==typeof e)c=o(e);else{if(0===e)return[a(0),a(1)];if(e===Math.floor(e))c=a(e);else{for(;e!==Math.floor(e);)e*=Math.pow(2,256),h-=256;c=a(e)}}if(n(r))c.mul(r[1]),u=r[0].clone();else if(i(r))u=r.clone();else if(\"string\"==typeof r)u=o(r);else if(r)if(r===Math.floor(r))u=a(r);else{for(;r!==Math.floor(r);)r*=Math.pow(2,256),h+=256;u=a(r)}else u=a(1);return h>0?c=c.ushln(h):h<0&&(u=u.ushln(-h)),s(c,u)}},6330:function(t,e,r){\"use strict\";var n=r(1533);t.exports=function(t){return Array.isArray(t)&&2===t.length&&n(t[0])&&n(t[1])}},5716:function(t,e,r){\"use strict\";var n=r(6859);t.exports=function(t){return t.cmp(new n(0))}},1369:function(t,e,r){\"use strict\";var n=r(5716);t.exports=function(t){var e=t.length,r=t.words,i=0;if(1===e)i=r[0];else if(2===e)i=r[0]+67108864*r[1];else for(var a=0;a20?52:r+32}},1533:function(t,e,r){\"use strict\";r(6859),t.exports=function(t){return t&&\"object\"==typeof t&&Boolean(t.words)}},2651:function(t,e,r){\"use strict\";var n=r(6859),i=r(2361);t.exports=function(t){var e=i.exponent(t);return e<52?new n(t):new n(t*Math.pow(2,52-e)).ushln(e-52)}},869:function(t,e,r){\"use strict\";var n=r(2651),i=r(5716);t.exports=function(t,e){var r=i(t),a=i(e);if(0===r)return[n(0),n(1)];if(0===a)return[n(0),n(0)];a<0&&(t=t.neg(),e=e.neg());var o=t.gcd(e);return o.cmpn(1)?[t.div(o),e.div(o)]:[t,e]}},4387:function(t,e,r){\"use strict\";var n=r(6859);t.exports=function(t){return new n(t)}},6504:function(t,e,r){\"use strict\";var n=r(869);t.exports=function(t,e){return n(t[0].mul(e[0]),t[1].mul(e[1]))}},7721:function(t,e,r){\"use strict\";var n=r(5716);t.exports=function(t){return n(t[0])*n(t[1])}},5572:function(t,e,r){\"use strict\";var n=r(869);t.exports=function(t,e){return n(t[0].mul(e[1]).sub(t[1].mul(e[0])),t[1].mul(e[1]))}},946:function(t,e,r){\"use strict\";var n=r(1369),i=r(4025);t.exports=function(t){var e=t[0],r=t[1];if(0===e.cmpn(0))return 0;var a=e.abs().divmod(r.abs()),o=a.div,s=n(o),l=a.mod,c=e.negative!==r.negative?-1:1;if(0===l.cmpn(0))return c*s;if(s){var u=i(s)+4;return c*(s+(f=n(l.ushln(u).divRound(r)))*Math.pow(2,-u))}var h=r.bitLength()-l.bitLength()+53,f=n(l.ushln(h).divRound(r));return h<1023?c*f*Math.pow(2,-h):c*(f*=Math.pow(2,-1023))*Math.pow(2,1023-h)}},2478:function(t){\"use strict\";function e(t,e,r,n,i){for(var a=i+1;n<=i;){var o=n+i>>>1,s=t[o];(void 0!==r?r(s,e):s-e)>=0?(a=o,i=o-1):n=o+1}return a}function r(t,e,r,n,i){for(var a=i+1;n<=i;){var o=n+i>>>1,s=t[o];(void 0!==r?r(s,e):s-e)>0?(a=o,i=o-1):n=o+1}return a}function n(t,e,r,n,i){for(var a=n-1;n<=i;){var o=n+i>>>1,s=t[o];(void 0!==r?r(s,e):s-e)<0?(a=o,n=o+1):i=o-1}return a}function i(t,e,r,n,i){for(var a=n-1;n<=i;){var o=n+i>>>1,s=t[o];(void 0!==r?r(s,e):s-e)<=0?(a=o,n=o+1):i=o-1}return a}function a(t,e,r,n,i){for(;n<=i;){var a=n+i>>>1,o=t[a],s=void 0!==r?r(o,e):o-e;if(0===s)return a;s<=0?n=a+1:i=a-1}return-1}function o(t,e,r,n,i,a){return\"function\"==typeof r?a(t,e,r,void 0===n?0:0|n,void 0===i?t.length-1:0|i):a(t,e,void 0,void 0===r?0:0|r,void 0===n?t.length-1:0|n)}t.exports={ge:function(t,r,n,i,a){return o(t,r,n,i,a,e)},gt:function(t,e,n,i,a){return o(t,e,n,i,a,r)},lt:function(t,e,r,i,a){return o(t,e,r,i,a,n)},le:function(t,e,r,n,a){return o(t,e,r,n,a,i)},eq:function(t,e,r,n,i){return o(t,e,r,n,i,a)}}},8828:function(t,e){\"use strict\";function r(t){var e=32;return(t&=-t)&&e--,65535&t&&(e-=16),16711935&t&&(e-=8),252645135&t&&(e-=4),858993459&t&&(e-=2),1431655765&t&&(e-=1),e}e.INT_BITS=32,e.INT_MAX=2147483647,e.INT_MIN=-1<<31,e.sign=function(t){return(t>0)-(t<0)},e.abs=function(t){var e=t>>31;return(t^e)-e},e.min=function(t,e){return e^(t^e)&-(t65535)<<4,e|=r=((t>>>=e)>255)<<3,e|=r=((t>>>=r)>15)<<2,(e|=r=((t>>>=r)>3)<<1)|(t>>>=r)>>1},e.log10=function(t){return t>=1e9?9:t>=1e8?8:t>=1e7?7:t>=1e6?6:t>=1e5?5:t>=1e4?4:t>=1e3?3:t>=100?2:t>=10?1:0},e.popCount=function(t){return 16843009*((t=(858993459&(t-=t>>>1&1431655765))+(t>>>2&858993459))+(t>>>4)&252645135)>>>24},e.countTrailingZeros=r,e.nextPow2=function(t){return t+=0===t,--t,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,1+(t|=t>>>16)},e.prevPow2=function(t){return t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,(t|=t>>>16)-(t>>>1)},e.parity=function(t){return t^=t>>>16,t^=t>>>8,t^=t>>>4,27030>>>(t&=15)&1};var n=new Array(256);!function(t){for(var e=0;e<256;++e){var r=e,n=e,i=7;for(r>>>=1;r;r>>>=1)n<<=1,n|=1&r,--i;t[e]=n<>>8&255]<<16|n[t>>>16&255]<<8|n[t>>>24&255]},e.interleave2=function(t,e){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t&=65535)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e&=65535)|e<<8))|e<<4))|e<<2))|e<<1))<<1},e.deinterleave2=function(t,e){return(t=65535&((t=16711935&((t=252645135&((t=858993459&((t=t>>>e&1431655765)|t>>>1))|t>>>2))|t>>>4))|t>>>16))<<16>>16},e.interleave3=function(t,e,r){return t=1227133513&((t=3272356035&((t=251719695&((t=4278190335&((t&=1023)|t<<16))|t<<8))|t<<4))|t<<2),(t|=(e=1227133513&((e=3272356035&((e=251719695&((e=4278190335&((e&=1023)|e<<16))|e<<8))|e<<4))|e<<2))<<1)|(r=1227133513&((r=3272356035&((r=251719695&((r=4278190335&((r&=1023)|r<<16))|r<<8))|r<<4))|r<<2))<<2},e.deinterleave3=function(t,e){return(t=1023&((t=4278190335&((t=251719695&((t=3272356035&((t=t>>>e&1227133513)|t>>>2))|t>>>4))|t>>>8))|t>>>16))<<22>>22},e.nextCombination=function(t){var e=t|t-1;return e+1|(~e&-~e)-1>>>r(t)+1}},6859:function(t,e,r){!function(t,e){\"use strict\";function n(t,e){if(!t)throw new Error(e||\"Assertion failed\")}function i(t,e){t.super_=e;var r=function(){};r.prototype=e.prototype,t.prototype=new r,t.prototype.constructor=t}function a(t,e,r){if(a.isBN(t))return t;this.negative=0,this.words=null,this.length=0,this.red=null,null!==t&&(\"le\"!==e&&\"be\"!==e||(r=e,e=10),this._init(t||0,e||10,r||\"be\"))}var o;\"object\"==typeof t?t.exports=a:e.BN=a,a.BN=a,a.wordSize=26;try{o=\"undefined\"!=typeof window&&void 0!==window.Buffer?window.Buffer:r(7790).Buffer}catch(t){}function s(t,e){var r=t.charCodeAt(e);return r>=65&&r<=70?r-55:r>=97&&r<=102?r-87:r-48&15}function l(t,e,r){var n=s(t,r);return r-1>=e&&(n|=s(t,r-1)<<4),n}function c(t,e,r,n){for(var i=0,a=Math.min(t.length,r),o=e;o=49?s-49+10:s>=17?s-17+10:s}return i}a.isBN=function(t){return t instanceof a||null!==t&&\"object\"==typeof t&&t.constructor.wordSize===a.wordSize&&Array.isArray(t.words)},a.max=function(t,e){return t.cmp(e)>0?t:e},a.min=function(t,e){return t.cmp(e)<0?t:e},a.prototype._init=function(t,e,r){if(\"number\"==typeof t)return this._initNumber(t,e,r);if(\"object\"==typeof t)return this._initArray(t,e,r);\"hex\"===e&&(e=16),n(e===(0|e)&&e>=2&&e<=36);var i=0;\"-\"===(t=t.toString().replace(/\\s+/g,\"\"))[0]&&(i++,this.negative=1),i=0;i-=3)o=t[i]|t[i-1]<<8|t[i-2]<<16,this.words[a]|=o<>>26-s&67108863,(s+=24)>=26&&(s-=26,a++);else if(\"le\"===r)for(i=0,a=0;i>>26-s&67108863,(s+=24)>=26&&(s-=26,a++);return this.strip()},a.prototype._parseHex=function(t,e,r){this.length=Math.ceil((t.length-e)/6),this.words=new Array(this.length);for(var n=0;n=e;n-=2)i=l(t,e,n)<=18?(a-=18,o+=1,this.words[o]|=i>>>26):a+=8;else for(n=(t.length-e)%2==0?e+1:e;n=18?(a-=18,o+=1,this.words[o]|=i>>>26):a+=8;this.strip()},a.prototype._parseBase=function(t,e,r){this.words=[0],this.length=1;for(var n=0,i=1;i<=67108863;i*=e)n++;n--,i=i/e|0;for(var a=t.length-r,o=a%n,s=Math.min(a,a-o)+r,l=0,u=r;u1&&0===this.words[this.length-1];)this.length--;return this._normSign()},a.prototype._normSign=function(){return 1===this.length&&0===this.words[0]&&(this.negative=0),this},a.prototype.inspect=function(){return(this.red?\"\"};var u=[\"\",\"0\",\"00\",\"000\",\"0000\",\"00000\",\"000000\",\"0000000\",\"00000000\",\"000000000\",\"0000000000\",\"00000000000\",\"000000000000\",\"0000000000000\",\"00000000000000\",\"000000000000000\",\"0000000000000000\",\"00000000000000000\",\"000000000000000000\",\"0000000000000000000\",\"00000000000000000000\",\"000000000000000000000\",\"0000000000000000000000\",\"00000000000000000000000\",\"000000000000000000000000\",\"0000000000000000000000000\"],h=[0,0,25,16,12,11,10,9,8,8,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],f=[0,0,33554432,43046721,16777216,48828125,60466176,40353607,16777216,43046721,1e7,19487171,35831808,62748517,7529536,11390625,16777216,24137569,34012224,47045881,64e6,4084101,5153632,6436343,7962624,9765625,11881376,14348907,17210368,20511149,243e5,28629151,33554432,39135393,45435424,52521875,60466176];function p(t,e,r){r.negative=e.negative^t.negative;var n=t.length+e.length|0;r.length=n,n=n-1|0;var i=0|t.words[0],a=0|e.words[0],o=i*a,s=67108863&o,l=o/67108864|0;r.words[0]=s;for(var c=1;c>>26,h=67108863&l,f=Math.min(c,e.length-1),p=Math.max(0,c-t.length+1);p<=f;p++){var d=c-p|0;u+=(o=(i=0|t.words[d])*(a=0|e.words[p])+h)/67108864|0,h=67108863&o}r.words[c]=0|h,l=0|u}return 0!==l?r.words[c]=0|l:r.length--,r.strip()}a.prototype.toString=function(t,e){var r;if(e=0|e||1,16===(t=t||10)||\"hex\"===t){r=\"\";for(var i=0,a=0,o=0;o>>24-i&16777215)||o!==this.length-1?u[6-l.length]+l+r:l+r,(i+=2)>=26&&(i-=26,o--)}for(0!==a&&(r=a.toString(16)+r);r.length%e!=0;)r=\"0\"+r;return 0!==this.negative&&(r=\"-\"+r),r}if(t===(0|t)&&t>=2&&t<=36){var c=h[t],p=f[t];r=\"\";var d=this.clone();for(d.negative=0;!d.isZero();){var m=d.modn(p).toString(t);r=(d=d.idivn(p)).isZero()?m+r:u[c-m.length]+m+r}for(this.isZero()&&(r=\"0\"+r);r.length%e!=0;)r=\"0\"+r;return 0!==this.negative&&(r=\"-\"+r),r}n(!1,\"Base should be between 2 and 36\")},a.prototype.toNumber=function(){var t=this.words[0];return 2===this.length?t+=67108864*this.words[1]:3===this.length&&1===this.words[2]?t+=4503599627370496+67108864*this.words[1]:this.length>2&&n(!1,\"Number can only safely store up to 53 bits\"),0!==this.negative?-t:t},a.prototype.toJSON=function(){return this.toString(16)},a.prototype.toBuffer=function(t,e){return n(void 0!==o),this.toArrayLike(o,t,e)},a.prototype.toArray=function(t,e){return this.toArrayLike(Array,t,e)},a.prototype.toArrayLike=function(t,e,r){var i=this.byteLength(),a=r||Math.max(1,i);n(i<=a,\"byte array longer than desired length\"),n(a>0,\"Requested array length <= 0\"),this.strip();var o,s,l=\"le\"===e,c=new t(a),u=this.clone();if(l){for(s=0;!u.isZero();s++)o=u.andln(255),u.iushrn(8),c[s]=o;for(;s=4096&&(r+=13,e>>>=13),e>=64&&(r+=7,e>>>=7),e>=8&&(r+=4,e>>>=4),e>=2&&(r+=2,e>>>=2),r+e},a.prototype._zeroBits=function(t){if(0===t)return 26;var e=t,r=0;return 0==(8191&e)&&(r+=13,e>>>=13),0==(127&e)&&(r+=7,e>>>=7),0==(15&e)&&(r+=4,e>>>=4),0==(3&e)&&(r+=2,e>>>=2),0==(1&e)&&r++,r},a.prototype.bitLength=function(){var t=this.words[this.length-1],e=this._countBits(t);return 26*(this.length-1)+e},a.prototype.zeroBits=function(){if(this.isZero())return 0;for(var t=0,e=0;et.length?this.clone().ior(t):t.clone().ior(this)},a.prototype.uor=function(t){return this.length>t.length?this.clone().iuor(t):t.clone().iuor(this)},a.prototype.iuand=function(t){var e;e=this.length>t.length?t:this;for(var r=0;rt.length?this.clone().iand(t):t.clone().iand(this)},a.prototype.uand=function(t){return this.length>t.length?this.clone().iuand(t):t.clone().iuand(this)},a.prototype.iuxor=function(t){var e,r;this.length>t.length?(e=this,r=t):(e=t,r=this);for(var n=0;nt.length?this.clone().ixor(t):t.clone().ixor(this)},a.prototype.uxor=function(t){return this.length>t.length?this.clone().iuxor(t):t.clone().iuxor(this)},a.prototype.inotn=function(t){n(\"number\"==typeof t&&t>=0);var e=0|Math.ceil(t/26),r=t%26;this._expand(e),r>0&&e--;for(var i=0;i0&&(this.words[i]=~this.words[i]&67108863>>26-r),this.strip()},a.prototype.notn=function(t){return this.clone().inotn(t)},a.prototype.setn=function(t,e){n(\"number\"==typeof t&&t>=0);var r=t/26|0,i=t%26;return this._expand(r+1),this.words[r]=e?this.words[r]|1<t.length?(r=this,n=t):(r=t,n=this);for(var i=0,a=0;a>>26;for(;0!==i&&a>>26;if(this.length=r.length,0!==i)this.words[this.length]=i,this.length++;else if(r!==this)for(;at.length?this.clone().iadd(t):t.clone().iadd(this)},a.prototype.isub=function(t){if(0!==t.negative){t.negative=0;var e=this.iadd(t);return t.negative=1,e._normSign()}if(0!==this.negative)return this.negative=0,this.iadd(t),this.negative=1,this._normSign();var r,n,i=this.cmp(t);if(0===i)return this.negative=0,this.length=1,this.words[0]=0,this;i>0?(r=this,n=t):(r=t,n=this);for(var a=0,o=0;o>26,this.words[o]=67108863&e;for(;0!==a&&o>26,this.words[o]=67108863&e;if(0===a&&o>>13,p=0|o[1],d=8191&p,m=p>>>13,g=0|o[2],y=8191&g,v=g>>>13,x=0|o[3],_=8191&x,b=x>>>13,w=0|o[4],T=8191&w,k=w>>>13,A=0|o[5],M=8191&A,S=A>>>13,E=0|o[6],C=8191&E,L=E>>>13,I=0|o[7],P=8191&I,z=I>>>13,O=0|o[8],D=8191&O,R=O>>>13,F=0|o[9],B=8191&F,N=F>>>13,j=0|s[0],U=8191&j,V=j>>>13,q=0|s[1],H=8191&q,G=q>>>13,Z=0|s[2],W=8191&Z,Y=Z>>>13,X=0|s[3],$=8191&X,J=X>>>13,K=0|s[4],Q=8191&K,tt=K>>>13,et=0|s[5],rt=8191&et,nt=et>>>13,it=0|s[6],at=8191&it,ot=it>>>13,st=0|s[7],lt=8191&st,ct=st>>>13,ut=0|s[8],ht=8191&ut,ft=ut>>>13,pt=0|s[9],dt=8191&pt,mt=pt>>>13;r.negative=t.negative^e.negative,r.length=19;var gt=(c+(n=Math.imul(h,U))|0)+((8191&(i=(i=Math.imul(h,V))+Math.imul(f,U)|0))<<13)|0;c=((a=Math.imul(f,V))+(i>>>13)|0)+(gt>>>26)|0,gt&=67108863,n=Math.imul(d,U),i=(i=Math.imul(d,V))+Math.imul(m,U)|0,a=Math.imul(m,V);var yt=(c+(n=n+Math.imul(h,H)|0)|0)+((8191&(i=(i=i+Math.imul(h,G)|0)+Math.imul(f,H)|0))<<13)|0;c=((a=a+Math.imul(f,G)|0)+(i>>>13)|0)+(yt>>>26)|0,yt&=67108863,n=Math.imul(y,U),i=(i=Math.imul(y,V))+Math.imul(v,U)|0,a=Math.imul(v,V),n=n+Math.imul(d,H)|0,i=(i=i+Math.imul(d,G)|0)+Math.imul(m,H)|0,a=a+Math.imul(m,G)|0;var vt=(c+(n=n+Math.imul(h,W)|0)|0)+((8191&(i=(i=i+Math.imul(h,Y)|0)+Math.imul(f,W)|0))<<13)|0;c=((a=a+Math.imul(f,Y)|0)+(i>>>13)|0)+(vt>>>26)|0,vt&=67108863,n=Math.imul(_,U),i=(i=Math.imul(_,V))+Math.imul(b,U)|0,a=Math.imul(b,V),n=n+Math.imul(y,H)|0,i=(i=i+Math.imul(y,G)|0)+Math.imul(v,H)|0,a=a+Math.imul(v,G)|0,n=n+Math.imul(d,W)|0,i=(i=i+Math.imul(d,Y)|0)+Math.imul(m,W)|0,a=a+Math.imul(m,Y)|0;var xt=(c+(n=n+Math.imul(h,$)|0)|0)+((8191&(i=(i=i+Math.imul(h,J)|0)+Math.imul(f,$)|0))<<13)|0;c=((a=a+Math.imul(f,J)|0)+(i>>>13)|0)+(xt>>>26)|0,xt&=67108863,n=Math.imul(T,U),i=(i=Math.imul(T,V))+Math.imul(k,U)|0,a=Math.imul(k,V),n=n+Math.imul(_,H)|0,i=(i=i+Math.imul(_,G)|0)+Math.imul(b,H)|0,a=a+Math.imul(b,G)|0,n=n+Math.imul(y,W)|0,i=(i=i+Math.imul(y,Y)|0)+Math.imul(v,W)|0,a=a+Math.imul(v,Y)|0,n=n+Math.imul(d,$)|0,i=(i=i+Math.imul(d,J)|0)+Math.imul(m,$)|0,a=a+Math.imul(m,J)|0;var _t=(c+(n=n+Math.imul(h,Q)|0)|0)+((8191&(i=(i=i+Math.imul(h,tt)|0)+Math.imul(f,Q)|0))<<13)|0;c=((a=a+Math.imul(f,tt)|0)+(i>>>13)|0)+(_t>>>26)|0,_t&=67108863,n=Math.imul(M,U),i=(i=Math.imul(M,V))+Math.imul(S,U)|0,a=Math.imul(S,V),n=n+Math.imul(T,H)|0,i=(i=i+Math.imul(T,G)|0)+Math.imul(k,H)|0,a=a+Math.imul(k,G)|0,n=n+Math.imul(_,W)|0,i=(i=i+Math.imul(_,Y)|0)+Math.imul(b,W)|0,a=a+Math.imul(b,Y)|0,n=n+Math.imul(y,$)|0,i=(i=i+Math.imul(y,J)|0)+Math.imul(v,$)|0,a=a+Math.imul(v,J)|0,n=n+Math.imul(d,Q)|0,i=(i=i+Math.imul(d,tt)|0)+Math.imul(m,Q)|0,a=a+Math.imul(m,tt)|0;var bt=(c+(n=n+Math.imul(h,rt)|0)|0)+((8191&(i=(i=i+Math.imul(h,nt)|0)+Math.imul(f,rt)|0))<<13)|0;c=((a=a+Math.imul(f,nt)|0)+(i>>>13)|0)+(bt>>>26)|0,bt&=67108863,n=Math.imul(C,U),i=(i=Math.imul(C,V))+Math.imul(L,U)|0,a=Math.imul(L,V),n=n+Math.imul(M,H)|0,i=(i=i+Math.imul(M,G)|0)+Math.imul(S,H)|0,a=a+Math.imul(S,G)|0,n=n+Math.imul(T,W)|0,i=(i=i+Math.imul(T,Y)|0)+Math.imul(k,W)|0,a=a+Math.imul(k,Y)|0,n=n+Math.imul(_,$)|0,i=(i=i+Math.imul(_,J)|0)+Math.imul(b,$)|0,a=a+Math.imul(b,J)|0,n=n+Math.imul(y,Q)|0,i=(i=i+Math.imul(y,tt)|0)+Math.imul(v,Q)|0,a=a+Math.imul(v,tt)|0,n=n+Math.imul(d,rt)|0,i=(i=i+Math.imul(d,nt)|0)+Math.imul(m,rt)|0,a=a+Math.imul(m,nt)|0;var wt=(c+(n=n+Math.imul(h,at)|0)|0)+((8191&(i=(i=i+Math.imul(h,ot)|0)+Math.imul(f,at)|0))<<13)|0;c=((a=a+Math.imul(f,ot)|0)+(i>>>13)|0)+(wt>>>26)|0,wt&=67108863,n=Math.imul(P,U),i=(i=Math.imul(P,V))+Math.imul(z,U)|0,a=Math.imul(z,V),n=n+Math.imul(C,H)|0,i=(i=i+Math.imul(C,G)|0)+Math.imul(L,H)|0,a=a+Math.imul(L,G)|0,n=n+Math.imul(M,W)|0,i=(i=i+Math.imul(M,Y)|0)+Math.imul(S,W)|0,a=a+Math.imul(S,Y)|0,n=n+Math.imul(T,$)|0,i=(i=i+Math.imul(T,J)|0)+Math.imul(k,$)|0,a=a+Math.imul(k,J)|0,n=n+Math.imul(_,Q)|0,i=(i=i+Math.imul(_,tt)|0)+Math.imul(b,Q)|0,a=a+Math.imul(b,tt)|0,n=n+Math.imul(y,rt)|0,i=(i=i+Math.imul(y,nt)|0)+Math.imul(v,rt)|0,a=a+Math.imul(v,nt)|0,n=n+Math.imul(d,at)|0,i=(i=i+Math.imul(d,ot)|0)+Math.imul(m,at)|0,a=a+Math.imul(m,ot)|0;var Tt=(c+(n=n+Math.imul(h,lt)|0)|0)+((8191&(i=(i=i+Math.imul(h,ct)|0)+Math.imul(f,lt)|0))<<13)|0;c=((a=a+Math.imul(f,ct)|0)+(i>>>13)|0)+(Tt>>>26)|0,Tt&=67108863,n=Math.imul(D,U),i=(i=Math.imul(D,V))+Math.imul(R,U)|0,a=Math.imul(R,V),n=n+Math.imul(P,H)|0,i=(i=i+Math.imul(P,G)|0)+Math.imul(z,H)|0,a=a+Math.imul(z,G)|0,n=n+Math.imul(C,W)|0,i=(i=i+Math.imul(C,Y)|0)+Math.imul(L,W)|0,a=a+Math.imul(L,Y)|0,n=n+Math.imul(M,$)|0,i=(i=i+Math.imul(M,J)|0)+Math.imul(S,$)|0,a=a+Math.imul(S,J)|0,n=n+Math.imul(T,Q)|0,i=(i=i+Math.imul(T,tt)|0)+Math.imul(k,Q)|0,a=a+Math.imul(k,tt)|0,n=n+Math.imul(_,rt)|0,i=(i=i+Math.imul(_,nt)|0)+Math.imul(b,rt)|0,a=a+Math.imul(b,nt)|0,n=n+Math.imul(y,at)|0,i=(i=i+Math.imul(y,ot)|0)+Math.imul(v,at)|0,a=a+Math.imul(v,ot)|0,n=n+Math.imul(d,lt)|0,i=(i=i+Math.imul(d,ct)|0)+Math.imul(m,lt)|0,a=a+Math.imul(m,ct)|0;var kt=(c+(n=n+Math.imul(h,ht)|0)|0)+((8191&(i=(i=i+Math.imul(h,ft)|0)+Math.imul(f,ht)|0))<<13)|0;c=((a=a+Math.imul(f,ft)|0)+(i>>>13)|0)+(kt>>>26)|0,kt&=67108863,n=Math.imul(B,U),i=(i=Math.imul(B,V))+Math.imul(N,U)|0,a=Math.imul(N,V),n=n+Math.imul(D,H)|0,i=(i=i+Math.imul(D,G)|0)+Math.imul(R,H)|0,a=a+Math.imul(R,G)|0,n=n+Math.imul(P,W)|0,i=(i=i+Math.imul(P,Y)|0)+Math.imul(z,W)|0,a=a+Math.imul(z,Y)|0,n=n+Math.imul(C,$)|0,i=(i=i+Math.imul(C,J)|0)+Math.imul(L,$)|0,a=a+Math.imul(L,J)|0,n=n+Math.imul(M,Q)|0,i=(i=i+Math.imul(M,tt)|0)+Math.imul(S,Q)|0,a=a+Math.imul(S,tt)|0,n=n+Math.imul(T,rt)|0,i=(i=i+Math.imul(T,nt)|0)+Math.imul(k,rt)|0,a=a+Math.imul(k,nt)|0,n=n+Math.imul(_,at)|0,i=(i=i+Math.imul(_,ot)|0)+Math.imul(b,at)|0,a=a+Math.imul(b,ot)|0,n=n+Math.imul(y,lt)|0,i=(i=i+Math.imul(y,ct)|0)+Math.imul(v,lt)|0,a=a+Math.imul(v,ct)|0,n=n+Math.imul(d,ht)|0,i=(i=i+Math.imul(d,ft)|0)+Math.imul(m,ht)|0,a=a+Math.imul(m,ft)|0;var At=(c+(n=n+Math.imul(h,dt)|0)|0)+((8191&(i=(i=i+Math.imul(h,mt)|0)+Math.imul(f,dt)|0))<<13)|0;c=((a=a+Math.imul(f,mt)|0)+(i>>>13)|0)+(At>>>26)|0,At&=67108863,n=Math.imul(B,H),i=(i=Math.imul(B,G))+Math.imul(N,H)|0,a=Math.imul(N,G),n=n+Math.imul(D,W)|0,i=(i=i+Math.imul(D,Y)|0)+Math.imul(R,W)|0,a=a+Math.imul(R,Y)|0,n=n+Math.imul(P,$)|0,i=(i=i+Math.imul(P,J)|0)+Math.imul(z,$)|0,a=a+Math.imul(z,J)|0,n=n+Math.imul(C,Q)|0,i=(i=i+Math.imul(C,tt)|0)+Math.imul(L,Q)|0,a=a+Math.imul(L,tt)|0,n=n+Math.imul(M,rt)|0,i=(i=i+Math.imul(M,nt)|0)+Math.imul(S,rt)|0,a=a+Math.imul(S,nt)|0,n=n+Math.imul(T,at)|0,i=(i=i+Math.imul(T,ot)|0)+Math.imul(k,at)|0,a=a+Math.imul(k,ot)|0,n=n+Math.imul(_,lt)|0,i=(i=i+Math.imul(_,ct)|0)+Math.imul(b,lt)|0,a=a+Math.imul(b,ct)|0,n=n+Math.imul(y,ht)|0,i=(i=i+Math.imul(y,ft)|0)+Math.imul(v,ht)|0,a=a+Math.imul(v,ft)|0;var Mt=(c+(n=n+Math.imul(d,dt)|0)|0)+((8191&(i=(i=i+Math.imul(d,mt)|0)+Math.imul(m,dt)|0))<<13)|0;c=((a=a+Math.imul(m,mt)|0)+(i>>>13)|0)+(Mt>>>26)|0,Mt&=67108863,n=Math.imul(B,W),i=(i=Math.imul(B,Y))+Math.imul(N,W)|0,a=Math.imul(N,Y),n=n+Math.imul(D,$)|0,i=(i=i+Math.imul(D,J)|0)+Math.imul(R,$)|0,a=a+Math.imul(R,J)|0,n=n+Math.imul(P,Q)|0,i=(i=i+Math.imul(P,tt)|0)+Math.imul(z,Q)|0,a=a+Math.imul(z,tt)|0,n=n+Math.imul(C,rt)|0,i=(i=i+Math.imul(C,nt)|0)+Math.imul(L,rt)|0,a=a+Math.imul(L,nt)|0,n=n+Math.imul(M,at)|0,i=(i=i+Math.imul(M,ot)|0)+Math.imul(S,at)|0,a=a+Math.imul(S,ot)|0,n=n+Math.imul(T,lt)|0,i=(i=i+Math.imul(T,ct)|0)+Math.imul(k,lt)|0,a=a+Math.imul(k,ct)|0,n=n+Math.imul(_,ht)|0,i=(i=i+Math.imul(_,ft)|0)+Math.imul(b,ht)|0,a=a+Math.imul(b,ft)|0;var St=(c+(n=n+Math.imul(y,dt)|0)|0)+((8191&(i=(i=i+Math.imul(y,mt)|0)+Math.imul(v,dt)|0))<<13)|0;c=((a=a+Math.imul(v,mt)|0)+(i>>>13)|0)+(St>>>26)|0,St&=67108863,n=Math.imul(B,$),i=(i=Math.imul(B,J))+Math.imul(N,$)|0,a=Math.imul(N,J),n=n+Math.imul(D,Q)|0,i=(i=i+Math.imul(D,tt)|0)+Math.imul(R,Q)|0,a=a+Math.imul(R,tt)|0,n=n+Math.imul(P,rt)|0,i=(i=i+Math.imul(P,nt)|0)+Math.imul(z,rt)|0,a=a+Math.imul(z,nt)|0,n=n+Math.imul(C,at)|0,i=(i=i+Math.imul(C,ot)|0)+Math.imul(L,at)|0,a=a+Math.imul(L,ot)|0,n=n+Math.imul(M,lt)|0,i=(i=i+Math.imul(M,ct)|0)+Math.imul(S,lt)|0,a=a+Math.imul(S,ct)|0,n=n+Math.imul(T,ht)|0,i=(i=i+Math.imul(T,ft)|0)+Math.imul(k,ht)|0,a=a+Math.imul(k,ft)|0;var Et=(c+(n=n+Math.imul(_,dt)|0)|0)+((8191&(i=(i=i+Math.imul(_,mt)|0)+Math.imul(b,dt)|0))<<13)|0;c=((a=a+Math.imul(b,mt)|0)+(i>>>13)|0)+(Et>>>26)|0,Et&=67108863,n=Math.imul(B,Q),i=(i=Math.imul(B,tt))+Math.imul(N,Q)|0,a=Math.imul(N,tt),n=n+Math.imul(D,rt)|0,i=(i=i+Math.imul(D,nt)|0)+Math.imul(R,rt)|0,a=a+Math.imul(R,nt)|0,n=n+Math.imul(P,at)|0,i=(i=i+Math.imul(P,ot)|0)+Math.imul(z,at)|0,a=a+Math.imul(z,ot)|0,n=n+Math.imul(C,lt)|0,i=(i=i+Math.imul(C,ct)|0)+Math.imul(L,lt)|0,a=a+Math.imul(L,ct)|0,n=n+Math.imul(M,ht)|0,i=(i=i+Math.imul(M,ft)|0)+Math.imul(S,ht)|0,a=a+Math.imul(S,ft)|0;var Ct=(c+(n=n+Math.imul(T,dt)|0)|0)+((8191&(i=(i=i+Math.imul(T,mt)|0)+Math.imul(k,dt)|0))<<13)|0;c=((a=a+Math.imul(k,mt)|0)+(i>>>13)|0)+(Ct>>>26)|0,Ct&=67108863,n=Math.imul(B,rt),i=(i=Math.imul(B,nt))+Math.imul(N,rt)|0,a=Math.imul(N,nt),n=n+Math.imul(D,at)|0,i=(i=i+Math.imul(D,ot)|0)+Math.imul(R,at)|0,a=a+Math.imul(R,ot)|0,n=n+Math.imul(P,lt)|0,i=(i=i+Math.imul(P,ct)|0)+Math.imul(z,lt)|0,a=a+Math.imul(z,ct)|0,n=n+Math.imul(C,ht)|0,i=(i=i+Math.imul(C,ft)|0)+Math.imul(L,ht)|0,a=a+Math.imul(L,ft)|0;var Lt=(c+(n=n+Math.imul(M,dt)|0)|0)+((8191&(i=(i=i+Math.imul(M,mt)|0)+Math.imul(S,dt)|0))<<13)|0;c=((a=a+Math.imul(S,mt)|0)+(i>>>13)|0)+(Lt>>>26)|0,Lt&=67108863,n=Math.imul(B,at),i=(i=Math.imul(B,ot))+Math.imul(N,at)|0,a=Math.imul(N,ot),n=n+Math.imul(D,lt)|0,i=(i=i+Math.imul(D,ct)|0)+Math.imul(R,lt)|0,a=a+Math.imul(R,ct)|0,n=n+Math.imul(P,ht)|0,i=(i=i+Math.imul(P,ft)|0)+Math.imul(z,ht)|0,a=a+Math.imul(z,ft)|0;var It=(c+(n=n+Math.imul(C,dt)|0)|0)+((8191&(i=(i=i+Math.imul(C,mt)|0)+Math.imul(L,dt)|0))<<13)|0;c=((a=a+Math.imul(L,mt)|0)+(i>>>13)|0)+(It>>>26)|0,It&=67108863,n=Math.imul(B,lt),i=(i=Math.imul(B,ct))+Math.imul(N,lt)|0,a=Math.imul(N,ct),n=n+Math.imul(D,ht)|0,i=(i=i+Math.imul(D,ft)|0)+Math.imul(R,ht)|0,a=a+Math.imul(R,ft)|0;var Pt=(c+(n=n+Math.imul(P,dt)|0)|0)+((8191&(i=(i=i+Math.imul(P,mt)|0)+Math.imul(z,dt)|0))<<13)|0;c=((a=a+Math.imul(z,mt)|0)+(i>>>13)|0)+(Pt>>>26)|0,Pt&=67108863,n=Math.imul(B,ht),i=(i=Math.imul(B,ft))+Math.imul(N,ht)|0,a=Math.imul(N,ft);var zt=(c+(n=n+Math.imul(D,dt)|0)|0)+((8191&(i=(i=i+Math.imul(D,mt)|0)+Math.imul(R,dt)|0))<<13)|0;c=((a=a+Math.imul(R,mt)|0)+(i>>>13)|0)+(zt>>>26)|0,zt&=67108863;var Ot=(c+(n=Math.imul(B,dt))|0)+((8191&(i=(i=Math.imul(B,mt))+Math.imul(N,dt)|0))<<13)|0;return c=((a=Math.imul(N,mt))+(i>>>13)|0)+(Ot>>>26)|0,Ot&=67108863,l[0]=gt,l[1]=yt,l[2]=vt,l[3]=xt,l[4]=_t,l[5]=bt,l[6]=wt,l[7]=Tt,l[8]=kt,l[9]=At,l[10]=Mt,l[11]=St,l[12]=Et,l[13]=Ct,l[14]=Lt,l[15]=It,l[16]=Pt,l[17]=zt,l[18]=Ot,0!==c&&(l[19]=c,r.length++),r};function m(t,e,r){return(new g).mulp(t,e,r)}function g(t,e){this.x=t,this.y=e}Math.imul||(d=p),a.prototype.mulTo=function(t,e){var r,n=this.length+t.length;return r=10===this.length&&10===t.length?d(this,t,e):n<63?p(this,t,e):n<1024?function(t,e,r){r.negative=e.negative^t.negative,r.length=t.length+e.length;for(var n=0,i=0,a=0;a>>26)|0)>>>26,o&=67108863}r.words[a]=s,n=o,o=i}return 0!==n?r.words[a]=n:r.length--,r.strip()}(this,t,e):m(this,t,e),r},g.prototype.makeRBT=function(t){for(var e=new Array(t),r=a.prototype._countBits(t)-1,n=0;n>=1;return n},g.prototype.permute=function(t,e,r,n,i,a){for(var o=0;o>>=1)i++;return 1<>>=13,r[2*o+1]=8191&a,a>>>=13;for(o=2*e;o>=26,e+=i/67108864|0,e+=a>>>26,this.words[r]=67108863&a}return 0!==e&&(this.words[r]=e,this.length++),this},a.prototype.muln=function(t){return this.clone().imuln(t)},a.prototype.sqr=function(){return this.mul(this)},a.prototype.isqr=function(){return this.imul(this.clone())},a.prototype.pow=function(t){var e=function(t){for(var e=new Array(t.bitLength()),r=0;r>>i}return e}(t);if(0===e.length)return new a(1);for(var r=this,n=0;n=0);var e,r=t%26,i=(t-r)/26,a=67108863>>>26-r<<26-r;if(0!==r){var o=0;for(e=0;e>>26-r}o&&(this.words[e]=o,this.length++)}if(0!==i){for(e=this.length-1;e>=0;e--)this.words[e+i]=this.words[e];for(e=0;e=0),i=e?(e-e%26)/26:0;var a=t%26,o=Math.min((t-a)/26,this.length),s=67108863^67108863>>>a<o)for(this.length-=o,c=0;c=0&&(0!==u||c>=i);c--){var h=0|this.words[c];this.words[c]=u<<26-a|h>>>a,u=h&s}return l&&0!==u&&(l.words[l.length++]=u),0===this.length&&(this.words[0]=0,this.length=1),this.strip()},a.prototype.ishrn=function(t,e,r){return n(0===this.negative),this.iushrn(t,e,r)},a.prototype.shln=function(t){return this.clone().ishln(t)},a.prototype.ushln=function(t){return this.clone().iushln(t)},a.prototype.shrn=function(t){return this.clone().ishrn(t)},a.prototype.ushrn=function(t){return this.clone().iushrn(t)},a.prototype.testn=function(t){n(\"number\"==typeof t&&t>=0);var e=t%26,r=(t-e)/26,i=1<=0);var e=t%26,r=(t-e)/26;if(n(0===this.negative,\"imaskn works only with positive numbers\"),this.length<=r)return this;if(0!==e&&r++,this.length=Math.min(r,this.length),0!==e){var i=67108863^67108863>>>e<=67108864;e++)this.words[e]-=67108864,e===this.length-1?this.words[e+1]=1:this.words[e+1]++;return this.length=Math.max(this.length,e+1),this},a.prototype.isubn=function(t){if(n(\"number\"==typeof t),n(t<67108864),t<0)return this.iaddn(-t);if(0!==this.negative)return this.negative=0,this.iaddn(t),this.negative=1,this;if(this.words[0]-=t,1===this.length&&this.words[0]<0)this.words[0]=-this.words[0],this.negative=1;else for(var e=0;e>26)-(l/67108864|0),this.words[i+r]=67108863&a}for(;i>26,this.words[i+r]=67108863&a;if(0===s)return this.strip();for(n(-1===s),s=0,i=0;i>26,this.words[i]=67108863&a;return this.negative=1,this.strip()},a.prototype._wordDiv=function(t,e){var r=(this.length,t.length),n=this.clone(),i=t,o=0|i.words[i.length-1];0!=(r=26-this._countBits(o))&&(i=i.ushln(r),n.iushln(r),o=0|i.words[i.length-1]);var s,l=n.length-i.length;if(\"mod\"!==e){(s=new a(null)).length=l+1,s.words=new Array(s.length);for(var c=0;c=0;h--){var f=67108864*(0|n.words[i.length+h])+(0|n.words[i.length+h-1]);for(f=Math.min(f/o|0,67108863),n._ishlnsubmul(i,f,h);0!==n.negative;)f--,n.negative=0,n._ishlnsubmul(i,1,h),n.isZero()||(n.negative^=1);s&&(s.words[h]=f)}return s&&s.strip(),n.strip(),\"div\"!==e&&0!==r&&n.iushrn(r),{div:s||null,mod:n}},a.prototype.divmod=function(t,e,r){return n(!t.isZero()),this.isZero()?{div:new a(0),mod:new a(0)}:0!==this.negative&&0===t.negative?(s=this.neg().divmod(t,e),\"mod\"!==e&&(i=s.div.neg()),\"div\"!==e&&(o=s.mod.neg(),r&&0!==o.negative&&o.iadd(t)),{div:i,mod:o}):0===this.negative&&0!==t.negative?(s=this.divmod(t.neg(),e),\"mod\"!==e&&(i=s.div.neg()),{div:i,mod:s.mod}):0!=(this.negative&t.negative)?(s=this.neg().divmod(t.neg(),e),\"div\"!==e&&(o=s.mod.neg(),r&&0!==o.negative&&o.isub(t)),{div:s.div,mod:o}):t.length>this.length||this.cmp(t)<0?{div:new a(0),mod:this}:1===t.length?\"div\"===e?{div:this.divn(t.words[0]),mod:null}:\"mod\"===e?{div:null,mod:new a(this.modn(t.words[0]))}:{div:this.divn(t.words[0]),mod:new a(this.modn(t.words[0]))}:this._wordDiv(t,e);var i,o,s},a.prototype.div=function(t){return this.divmod(t,\"div\",!1).div},a.prototype.mod=function(t){return this.divmod(t,\"mod\",!1).mod},a.prototype.umod=function(t){return this.divmod(t,\"mod\",!0).mod},a.prototype.divRound=function(t){var e=this.divmod(t);if(e.mod.isZero())return e.div;var r=0!==e.div.negative?e.mod.isub(t):e.mod,n=t.ushrn(1),i=t.andln(1),a=r.cmp(n);return a<0||1===i&&0===a?e.div:0!==e.div.negative?e.div.isubn(1):e.div.iaddn(1)},a.prototype.modn=function(t){n(t<=67108863);for(var e=(1<<26)%t,r=0,i=this.length-1;i>=0;i--)r=(e*r+(0|this.words[i]))%t;return r},a.prototype.idivn=function(t){n(t<=67108863);for(var e=0,r=this.length-1;r>=0;r--){var i=(0|this.words[r])+67108864*e;this.words[r]=i/t|0,e=i%t}return this.strip()},a.prototype.divn=function(t){return this.clone().idivn(t)},a.prototype.egcd=function(t){n(0===t.negative),n(!t.isZero());var e=this,r=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var i=new a(1),o=new a(0),s=new a(0),l=new a(1),c=0;e.isEven()&&r.isEven();)e.iushrn(1),r.iushrn(1),++c;for(var u=r.clone(),h=e.clone();!e.isZero();){for(var f=0,p=1;0==(e.words[0]&p)&&f<26;++f,p<<=1);if(f>0)for(e.iushrn(f);f-- >0;)(i.isOdd()||o.isOdd())&&(i.iadd(u),o.isub(h)),i.iushrn(1),o.iushrn(1);for(var d=0,m=1;0==(r.words[0]&m)&&d<26;++d,m<<=1);if(d>0)for(r.iushrn(d);d-- >0;)(s.isOdd()||l.isOdd())&&(s.iadd(u),l.isub(h)),s.iushrn(1),l.iushrn(1);e.cmp(r)>=0?(e.isub(r),i.isub(s),o.isub(l)):(r.isub(e),s.isub(i),l.isub(o))}return{a:s,b:l,gcd:r.iushln(c)}},a.prototype._invmp=function(t){n(0===t.negative),n(!t.isZero());var e=this,r=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var i,o=new a(1),s=new a(0),l=r.clone();e.cmpn(1)>0&&r.cmpn(1)>0;){for(var c=0,u=1;0==(e.words[0]&u)&&c<26;++c,u<<=1);if(c>0)for(e.iushrn(c);c-- >0;)o.isOdd()&&o.iadd(l),o.iushrn(1);for(var h=0,f=1;0==(r.words[0]&f)&&h<26;++h,f<<=1);if(h>0)for(r.iushrn(h);h-- >0;)s.isOdd()&&s.iadd(l),s.iushrn(1);e.cmp(r)>=0?(e.isub(r),o.isub(s)):(r.isub(e),s.isub(o))}return(i=0===e.cmpn(1)?o:s).cmpn(0)<0&&i.iadd(t),i},a.prototype.gcd=function(t){if(this.isZero())return t.abs();if(t.isZero())return this.abs();var e=this.clone(),r=t.clone();e.negative=0,r.negative=0;for(var n=0;e.isEven()&&r.isEven();n++)e.iushrn(1),r.iushrn(1);for(;;){for(;e.isEven();)e.iushrn(1);for(;r.isEven();)r.iushrn(1);var i=e.cmp(r);if(i<0){var a=e;e=r,r=a}else if(0===i||0===r.cmpn(1))break;e.isub(r)}return r.iushln(n)},a.prototype.invm=function(t){return this.egcd(t).a.umod(t)},a.prototype.isEven=function(){return 0==(1&this.words[0])},a.prototype.isOdd=function(){return 1==(1&this.words[0])},a.prototype.andln=function(t){return this.words[0]&t},a.prototype.bincn=function(t){n(\"number\"==typeof t);var e=t%26,r=(t-e)/26,i=1<>>26,s&=67108863,this.words[o]=s}return 0!==a&&(this.words[o]=a,this.length++),this},a.prototype.isZero=function(){return 1===this.length&&0===this.words[0]},a.prototype.cmpn=function(t){var e,r=t<0;if(0!==this.negative&&!r)return-1;if(0===this.negative&&r)return 1;if(this.strip(),this.length>1)e=1;else{r&&(t=-t),n(t<=67108863,\"Number is too big\");var i=0|this.words[0];e=i===t?0:it.length)return 1;if(this.length=0;r--){var n=0|this.words[r],i=0|t.words[r];if(n!==i){ni&&(e=1);break}}return e},a.prototype.gtn=function(t){return 1===this.cmpn(t)},a.prototype.gt=function(t){return 1===this.cmp(t)},a.prototype.gten=function(t){return this.cmpn(t)>=0},a.prototype.gte=function(t){return this.cmp(t)>=0},a.prototype.ltn=function(t){return-1===this.cmpn(t)},a.prototype.lt=function(t){return-1===this.cmp(t)},a.prototype.lten=function(t){return this.cmpn(t)<=0},a.prototype.lte=function(t){return this.cmp(t)<=0},a.prototype.eqn=function(t){return 0===this.cmpn(t)},a.prototype.eq=function(t){return 0===this.cmp(t)},a.red=function(t){return new T(t)},a.prototype.toRed=function(t){return n(!this.red,\"Already a number in reduction context\"),n(0===this.negative,\"red works only with positives\"),t.convertTo(this)._forceRed(t)},a.prototype.fromRed=function(){return n(this.red,\"fromRed works only with numbers in reduction context\"),this.red.convertFrom(this)},a.prototype._forceRed=function(t){return this.red=t,this},a.prototype.forceRed=function(t){return n(!this.red,\"Already a number in reduction context\"),this._forceRed(t)},a.prototype.redAdd=function(t){return n(this.red,\"redAdd works only with red numbers\"),this.red.add(this,t)},a.prototype.redIAdd=function(t){return n(this.red,\"redIAdd works only with red numbers\"),this.red.iadd(this,t)},a.prototype.redSub=function(t){return n(this.red,\"redSub works only with red numbers\"),this.red.sub(this,t)},a.prototype.redISub=function(t){return n(this.red,\"redISub works only with red numbers\"),this.red.isub(this,t)},a.prototype.redShl=function(t){return n(this.red,\"redShl works only with red numbers\"),this.red.shl(this,t)},a.prototype.redMul=function(t){return n(this.red,\"redMul works only with red numbers\"),this.red._verify2(this,t),this.red.mul(this,t)},a.prototype.redIMul=function(t){return n(this.red,\"redMul works only with red numbers\"),this.red._verify2(this,t),this.red.imul(this,t)},a.prototype.redSqr=function(){return n(this.red,\"redSqr works only with red numbers\"),this.red._verify1(this),this.red.sqr(this)},a.prototype.redISqr=function(){return n(this.red,\"redISqr works only with red numbers\"),this.red._verify1(this),this.red.isqr(this)},a.prototype.redSqrt=function(){return n(this.red,\"redSqrt works only with red numbers\"),this.red._verify1(this),this.red.sqrt(this)},a.prototype.redInvm=function(){return n(this.red,\"redInvm works only with red numbers\"),this.red._verify1(this),this.red.invm(this)},a.prototype.redNeg=function(){return n(this.red,\"redNeg works only with red numbers\"),this.red._verify1(this),this.red.neg(this)},a.prototype.redPow=function(t){return n(this.red&&!t.red,\"redPow(normalNum)\"),this.red._verify1(this),this.red.pow(this,t)};var y={k256:null,p224:null,p192:null,p25519:null};function v(t,e){this.name=t,this.p=new a(e,16),this.n=this.p.bitLength(),this.k=new a(1).iushln(this.n).isub(this.p),this.tmp=this._tmp()}function x(){v.call(this,\"k256\",\"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f\")}function _(){v.call(this,\"p224\",\"ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001\")}function b(){v.call(this,\"p192\",\"ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff\")}function w(){v.call(this,\"25519\",\"7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed\")}function T(t){if(\"string\"==typeof t){var e=a._prime(t);this.m=e.p,this.prime=e}else n(t.gtn(1),\"modulus must be greater than 1\"),this.m=t,this.prime=null}function k(t){T.call(this,t),this.shift=this.m.bitLength(),this.shift%26!=0&&(this.shift+=26-this.shift%26),this.r=new a(1).iushln(this.shift),this.r2=this.imod(this.r.sqr()),this.rinv=this.r._invmp(this.m),this.minv=this.rinv.mul(this.r).isubn(1).div(this.m),this.minv=this.minv.umod(this.r),this.minv=this.r.sub(this.minv)}v.prototype._tmp=function(){var t=new a(null);return t.words=new Array(Math.ceil(this.n/13)),t},v.prototype.ireduce=function(t){var e,r=t;do{this.split(r,this.tmp),e=(r=(r=this.imulK(r)).iadd(this.tmp)).bitLength()}while(e>this.n);var n=e0?r.isub(this.p):void 0!==r.strip?r.strip():r._strip(),r},v.prototype.split=function(t,e){t.iushrn(this.n,0,e)},v.prototype.imulK=function(t){return t.imul(this.k)},i(x,v),x.prototype.split=function(t,e){for(var r=4194303,n=Math.min(t.length,9),i=0;i>>22,a=o}a>>>=22,t.words[i-10]=a,0===a&&t.length>10?t.length-=10:t.length-=9},x.prototype.imulK=function(t){t.words[t.length]=0,t.words[t.length+1]=0,t.length+=2;for(var e=0,r=0;r>>=26,t.words[r]=i,e=n}return 0!==e&&(t.words[t.length++]=e),t},a._prime=function(t){if(y[t])return y[t];var e;if(\"k256\"===t)e=new x;else if(\"p224\"===t)e=new _;else if(\"p192\"===t)e=new b;else{if(\"p25519\"!==t)throw new Error(\"Unknown prime \"+t);e=new w}return y[t]=e,e},T.prototype._verify1=function(t){n(0===t.negative,\"red works only with positives\"),n(t.red,\"red works only with red numbers\")},T.prototype._verify2=function(t,e){n(0==(t.negative|e.negative),\"red works only with positives\"),n(t.red&&t.red===e.red,\"red works only with red numbers\")},T.prototype.imod=function(t){return this.prime?this.prime.ireduce(t)._forceRed(this):t.umod(this.m)._forceRed(this)},T.prototype.neg=function(t){return t.isZero()?t.clone():this.m.sub(t)._forceRed(this)},T.prototype.add=function(t,e){this._verify2(t,e);var r=t.add(e);return r.cmp(this.m)>=0&&r.isub(this.m),r._forceRed(this)},T.prototype.iadd=function(t,e){this._verify2(t,e);var r=t.iadd(e);return r.cmp(this.m)>=0&&r.isub(this.m),r},T.prototype.sub=function(t,e){this._verify2(t,e);var r=t.sub(e);return r.cmpn(0)<0&&r.iadd(this.m),r._forceRed(this)},T.prototype.isub=function(t,e){this._verify2(t,e);var r=t.isub(e);return r.cmpn(0)<0&&r.iadd(this.m),r},T.prototype.shl=function(t,e){return this._verify1(t),this.imod(t.ushln(e))},T.prototype.imul=function(t,e){return this._verify2(t,e),this.imod(t.imul(e))},T.prototype.mul=function(t,e){return this._verify2(t,e),this.imod(t.mul(e))},T.prototype.isqr=function(t){return this.imul(t,t.clone())},T.prototype.sqr=function(t){return this.mul(t,t)},T.prototype.sqrt=function(t){if(t.isZero())return t.clone();var e=this.m.andln(3);if(n(e%2==1),3===e){var r=this.m.add(new a(1)).iushrn(2);return this.pow(t,r)}for(var i=this.m.subn(1),o=0;!i.isZero()&&0===i.andln(1);)o++,i.iushrn(1);n(!i.isZero());var s=new a(1).toRed(this),l=s.redNeg(),c=this.m.subn(1).iushrn(1),u=this.m.bitLength();for(u=new a(2*u*u).toRed(this);0!==this.pow(u,c).cmp(l);)u.redIAdd(l);for(var h=this.pow(u,i),f=this.pow(t,i.addn(1).iushrn(1)),p=this.pow(t,i),d=o;0!==p.cmp(s);){for(var m=p,g=0;0!==m.cmp(s);g++)m=m.redSqr();n(g=0;n--){for(var c=e.words[n],u=l-1;u>=0;u--){var h=c>>u&1;i!==r[0]&&(i=this.sqr(i)),0!==h||0!==o?(o<<=1,o|=h,(4==++s||0===n&&0===u)&&(i=this.mul(i,r[o]),s=0,o=0)):s=0}l=26}return i},T.prototype.convertTo=function(t){var e=t.umod(this.m);return e===t?e.clone():e},T.prototype.convertFrom=function(t){var e=t.clone();return e.red=null,e},a.mont=function(t){return new k(t)},i(k,T),k.prototype.convertTo=function(t){return this.imod(t.ushln(this.shift))},k.prototype.convertFrom=function(t){var e=this.imod(t.mul(this.rinv));return e.red=null,e},k.prototype.imul=function(t,e){if(t.isZero()||e.isZero())return t.words[0]=0,t.length=1,t;var r=t.imul(e),n=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),i=r.isub(n).iushrn(this.shift),a=i;return i.cmp(this.m)>=0?a=i.isub(this.m):i.cmpn(0)<0&&(a=i.iadd(this.m)),a._forceRed(this)},k.prototype.mul=function(t,e){if(t.isZero()||e.isZero())return new a(0)._forceRed(this);var r=t.mul(e),n=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),i=r.isub(n).iushrn(this.shift),o=i;return i.cmp(this.m)>=0?o=i.isub(this.m):i.cmpn(0)<0&&(o=i.iadd(this.m)),o._forceRed(this)},k.prototype.invm=function(t){return this.imod(t._invmp(this.m).mul(this.r2))._forceRed(this)}}(t=r.nmd(t),this)},6204:function(t){\"use strict\";t.exports=function(t){var e,r,n,i=t.length,a=0;for(e=0;e>>1;if(!(u<=0)){var h,f=i.mallocDouble(2*u*s),p=i.mallocInt32(s);if((s=l(t,u,f,p))>0){if(1===u&&n)a.init(s),h=a.sweepComplete(u,r,0,s,f,p,0,s,f,p);else{var d=i.mallocDouble(2*u*c),m=i.mallocInt32(c);(c=l(e,u,d,m))>0&&(a.init(s+c),h=1===u?a.sweepBipartite(u,r,0,s,f,p,0,c,d,m):o(u,r,n,s,f,p,c,d,m),i.free(d),i.free(m))}i.free(f),i.free(p)}return h}}}function u(t,e){n.push([t,e])}},2455:function(t,e){\"use strict\";function r(t){return t?function(t,e,r,n,i,a,o,s,l,c,u){return i-n>l-s?function(t,e,r,n,i,a,o,s,l,c,u){for(var h=2*t,f=n,p=h*n;fc-l?n?function(t,e,r,n,i,a,o,s,l,c,u){for(var h=2*t,f=n,p=h*n;f0;){var O=(P-=1)*_,D=w[O],R=w[O+1],F=w[O+2],B=w[O+3],N=w[O+4],j=w[O+5],U=P*b,V=T[U],q=T[U+1],H=1&j,G=!!(16&j),Z=u,W=S,Y=C,X=L;if(H&&(Z=C,W=L,Y=u,X=S),!(2&j&&R>=(F=g(t,D,R,F,Z,W,q))||4&j&&(R=y(t,D,R,F,Z,W,V))>=F)){var $=F-R,J=N-B;if(G){if(t*$*($+J)=p0)&&!(p1>=hi)\"),m=u(\"lo===p0\"),g=u(\"lo>>1,f=2*t,p=h,d=s[f*h+e];c=x?(p=v,d=x):y>=b?(p=g,d=y):(p=_,d=b):x>=b?(p=v,d=x):b>=y?(p=g,d=y):(p=_,d=b);for(var w=f*(u-1),T=f*p,k=0;kr&&i[h+e]>c;--u,h-=o){for(var f=h,p=h+o,d=0;df;++f,l+=s)if(i[l+h]===o)if(u===f)u+=1,c+=s;else{for(var p=0;s>p;++p){var d=i[l+p];i[l+p]=i[c],i[c++]=d}var m=a[f];a[f]=a[u],a[u++]=m}return u},\"lof;++f,l+=s)if(i[l+h]p;++p){var d=i[l+p];i[l+p]=i[c],i[c++]=d}var m=a[f];a[f]=a[u],a[u++]=m}return u},\"lo<=p0\":function(t,e,r,n,i,a,o){for(var s=2*t,l=s*r,c=l,u=r,h=t+e,f=r;n>f;++f,l+=s)if(i[l+h]<=o)if(u===f)u+=1,c+=s;else{for(var p=0;s>p;++p){var d=i[l+p];i[l+p]=i[c],i[c++]=d}var m=a[f];a[f]=a[u],a[u++]=m}return u},\"hi<=p0\":function(t,e,r,n,i,a,o){for(var s=2*t,l=s*r,c=l,u=r,h=t+e,f=r;n>f;++f,l+=s)if(i[l+h]<=o)if(u===f)u+=1,c+=s;else{for(var p=0;s>p;++p){var d=i[l+p];i[l+p]=i[c],i[c++]=d}var m=a[f];a[f]=a[u],a[u++]=m}return u},\"lop;++p,l+=s){var d=i[l+h],m=i[l+f];if(dg;++g){var y=i[l+g];i[l+g]=i[c],i[c++]=y}var v=a[p];a[p]=a[u],a[u++]=v}}return u},\"lo<=p0&&p0<=hi\":function(t,e,r,n,i,a,o){for(var s=2*t,l=s*r,c=l,u=r,h=e,f=t+e,p=r;n>p;++p,l+=s){var d=i[l+h],m=i[l+f];if(d<=o&&o<=m)if(u===p)u+=1,c+=s;else{for(var g=0;s>g;++g){var y=i[l+g];i[l+g]=i[c],i[c++]=y}var v=a[p];a[p]=a[u],a[u++]=v}}return u},\"!(lo>=p0)&&!(p1>=hi)\":function(t,e,r,n,i,a,o,s){for(var l=2*t,c=l*r,u=c,h=r,f=e,p=t+e,d=r;n>d;++d,c+=l){var m=i[c+f],g=i[c+p];if(!(m>=o||s>=g))if(h===d)h+=1,u+=l;else{for(var y=0;l>y;++y){var v=i[c+y];i[c+y]=i[u],i[u++]=v}var x=a[d];a[d]=a[h],a[h++]=x}}return h}}},1811:function(t){\"use strict\";t.exports=function(t,n){n<=4*e?r(0,n-1,t):c(0,n-1,t)};var e=32;function r(t,e,r){for(var n=2*(t+1),i=t+1;i<=e;++i){for(var a=r[n++],o=r[n++],s=i,l=n-2;s-- >t;){var c=r[l-2],u=r[l-1];if(cr[e+1])}function l(t,e,r,n){var i=n[t*=2];return i>1,g=m-f,y=m+f,v=p,x=g,_=m,b=y,w=d,T=t+1,k=u-1,A=0;s(v,x,h)&&(A=v,v=x,x=A),s(b,w,h)&&(A=b,b=w,w=A),s(v,_,h)&&(A=v,v=_,_=A),s(x,_,h)&&(A=x,x=_,_=A),s(v,b,h)&&(A=v,v=b,b=A),s(_,b,h)&&(A=_,_=b,b=A),s(x,w,h)&&(A=x,x=w,w=A),s(x,_,h)&&(A=x,x=_,_=A),s(b,w,h)&&(A=b,b=w,w=A);for(var M=h[2*x],S=h[2*x+1],E=h[2*b],C=h[2*b+1],L=2*v,I=2*_,P=2*w,z=2*p,O=2*m,D=2*d,R=0;R<2;++R){var F=h[L+R],B=h[I+R],N=h[P+R];h[z+R]=F,h[O+R]=B,h[D+R]=N}i(g,t,h),i(y,u,h);for(var j=T;j<=k;++j)if(l(j,M,S,h))j!==T&&n(j,T,h),++T;else if(!l(j,E,C,h))for(;;){if(l(k,E,C,h)){l(k,M,S,h)?(a(j,T,k,h),++T,--k):(n(j,k,h),--k);break}if(--k>>1;a(d,S);var E=0,C=0;for(T=0;T=o)m(u,h,C--,L=L-o|0);else if(L>=0)m(l,c,E--,L);else if(L<=-o){L=-L-o|0;for(var I=0;I>>1;a(d,E);var C=0,L=0,I=0;for(k=0;k>1==d[2*k+3]>>1&&(z=2,k+=1),P<0){for(var O=-(P>>1)-1,D=0;D>1)-1,0===z?m(l,c,C--,O):1===z?m(u,h,L--,O):2===z&&m(f,p,I--,O)}},scanBipartite:function(t,e,r,n,i,s,u,h,f,p,y,v){var x=0,_=2*t,b=e,w=e+t,T=1,k=1;n?k=o:T=o;for(var A=i;A>>1;a(d,C);var L=0;for(A=0;A=o?(P=!n,M-=o):(P=!!n,M-=1),P)g(l,c,L++,M);else{var z=v[M],O=_*M,D=y[O+e+1],R=y[O+e+1+t];t:for(var F=0;F>>1;a(d,T);var k=0;for(x=0;x=o)l[k++]=_-o;else{var M=p[_-=1],S=g*_,E=f[S+e+1],C=f[S+e+1+t];t:for(var L=0;L=0;--L)if(l[L]===_){for(O=L+1;O0;){for(var p=r.pop(),d=(u=-1,h=-1,l=o[s=r.pop()],1);d=0||(e.flip(s,p),i(t,e,r,u,s,h),i(t,e,r,s,h,u),i(t,e,r,h,p,u),i(t,e,r,p,u,h))}}},5023:function(t,e,r){\"use strict\";var n,i=r(2478);function a(t,e,r,n,i,a,o){this.cells=t,this.neighbor=e,this.flags=n,this.constraint=r,this.active=i,this.next=a,this.boundary=o}function o(t,e){return t[0]-e[0]||t[1]-e[1]||t[2]-e[2]}t.exports=function(t,e,r){var n=function(t,e){for(var r=t.cells(),n=r.length,i=0;i0||l.length>0;){for(;s.length>0;){var p=s.pop();if(c[p]!==-i){c[p]=i,u[p];for(var d=0;d<3;++d){var m=f[3*p+d];m>=0&&0===c[m]&&(h[3*p+d]?l.push(m):(s.push(m),c[m]=i))}}}var g=l;l=s,s=g,l.length=0,i=-i}var y=function(t,e,r){for(var n=0,i=0;i1&&i(r[f[p-2]],r[f[p-1]],a)>0;)t.push([f[p-1],f[p-2],o]),p-=1;f.length=p,f.push(o);var d=h.upperIds;for(p=d.length;p>1&&i(r[d[p-2]],r[d[p-1]],a)<0;)t.push([d[p-2],d[p-1],o]),p-=1;d.length=p,d.push(o)}}function u(t,e){var r;return(r=t.a[0]d[0]&&i.push(new o(d,p,2,l),new o(p,d,1,l))}i.sort(s);for(var m=i[0].a[0]-(1+Math.abs(i[0].a[0]))*Math.pow(2,-52),g=[new a([m,1],[m,0],-1,[],[],[],[])],y=[],v=(l=0,i.length);l=0}}(),a.removeTriangle=function(t,e,r){var n=this.stars;o(n[t],e,r),o(n[e],r,t),o(n[r],t,e)},a.addTriangle=function(t,e,r){var n=this.stars;n[t].push(e,r),n[e].push(r,t),n[r].push(t,e)},a.opposite=function(t,e){for(var r=this.stars[e],n=1,i=r.length;ne[2]?1:0)}function y(t,e,r){if(0!==t.length){if(e)for(var n=0;n=0;--a){var x=e[u=(S=n[a])[0]],_=x[0],b=x[1],w=t[_],T=t[b];if((w[0]-T[0]||w[1]-T[1])<0){var k=_;_=b,b=k}x[0]=_;var A,M=x[1]=S[1];for(i&&(A=x[2]);a>0&&n[a-1][0]===u;){var S,E=(S=n[--a])[1];i?e.push([M,E,A]):e.push([M,E]),M=E}i?e.push([M,b,A]):e.push([M,b])}return f}(t,e,f,m,r),v=d(t,g);return y(e,v,r),!!v||f.length>0||m.length>0}},3637:function(t,e,r){\"use strict\";t.exports=function(t,e,r,n){var a=s(e,t),h=s(n,r),f=u(a,h);if(0===o(f))return null;var p=u(h,s(t,r)),d=i(p,f),m=c(a,d);return l(t,m)};var n=r(6504),i=r(8697),a=r(5572),o=r(7721),s=r(544),l=r(2653),c=r(8987);function u(t,e){return a(n(t[0],e[1]),n(t[1],e[0]))}},3642:function(t){t.exports={jet:[{index:0,rgb:[0,0,131]},{index:.125,rgb:[0,60,170]},{index:.375,rgb:[5,255,255]},{index:.625,rgb:[255,255,0]},{index:.875,rgb:[250,0,0]},{index:1,rgb:[128,0,0]}],hsv:[{index:0,rgb:[255,0,0]},{index:.169,rgb:[253,255,2]},{index:.173,rgb:[247,255,2]},{index:.337,rgb:[0,252,4]},{index:.341,rgb:[0,252,10]},{index:.506,rgb:[1,249,255]},{index:.671,rgb:[2,0,253]},{index:.675,rgb:[8,0,253]},{index:.839,rgb:[255,0,251]},{index:.843,rgb:[255,0,245]},{index:1,rgb:[255,0,6]}],hot:[{index:0,rgb:[0,0,0]},{index:.3,rgb:[230,0,0]},{index:.6,rgb:[255,210,0]},{index:1,rgb:[255,255,255]}],spring:[{index:0,rgb:[255,0,255]},{index:1,rgb:[255,255,0]}],summer:[{index:0,rgb:[0,128,102]},{index:1,rgb:[255,255,102]}],autumn:[{index:0,rgb:[255,0,0]},{index:1,rgb:[255,255,0]}],winter:[{index:0,rgb:[0,0,255]},{index:1,rgb:[0,255,128]}],bone:[{index:0,rgb:[0,0,0]},{index:.376,rgb:[84,84,116]},{index:.753,rgb:[169,200,200]},{index:1,rgb:[255,255,255]}],copper:[{index:0,rgb:[0,0,0]},{index:.804,rgb:[255,160,102]},{index:1,rgb:[255,199,127]}],greys:[{index:0,rgb:[0,0,0]},{index:1,rgb:[255,255,255]}],yignbu:[{index:0,rgb:[8,29,88]},{index:.125,rgb:[37,52,148]},{index:.25,rgb:[34,94,168]},{index:.375,rgb:[29,145,192]},{index:.5,rgb:[65,182,196]},{index:.625,rgb:[127,205,187]},{index:.75,rgb:[199,233,180]},{index:.875,rgb:[237,248,217]},{index:1,rgb:[255,255,217]}],greens:[{index:0,rgb:[0,68,27]},{index:.125,rgb:[0,109,44]},{index:.25,rgb:[35,139,69]},{index:.375,rgb:[65,171,93]},{index:.5,rgb:[116,196,118]},{index:.625,rgb:[161,217,155]},{index:.75,rgb:[199,233,192]},{index:.875,rgb:[229,245,224]},{index:1,rgb:[247,252,245]}],yiorrd:[{index:0,rgb:[128,0,38]},{index:.125,rgb:[189,0,38]},{index:.25,rgb:[227,26,28]},{index:.375,rgb:[252,78,42]},{index:.5,rgb:[253,141,60]},{index:.625,rgb:[254,178,76]},{index:.75,rgb:[254,217,118]},{index:.875,rgb:[255,237,160]},{index:1,rgb:[255,255,204]}],bluered:[{index:0,rgb:[0,0,255]},{index:1,rgb:[255,0,0]}],rdbu:[{index:0,rgb:[5,10,172]},{index:.35,rgb:[106,137,247]},{index:.5,rgb:[190,190,190]},{index:.6,rgb:[220,170,132]},{index:.7,rgb:[230,145,90]},{index:1,rgb:[178,10,28]}],picnic:[{index:0,rgb:[0,0,255]},{index:.1,rgb:[51,153,255]},{index:.2,rgb:[102,204,255]},{index:.3,rgb:[153,204,255]},{index:.4,rgb:[204,204,255]},{index:.5,rgb:[255,255,255]},{index:.6,rgb:[255,204,255]},{index:.7,rgb:[255,153,255]},{index:.8,rgb:[255,102,204]},{index:.9,rgb:[255,102,102]},{index:1,rgb:[255,0,0]}],rainbow:[{index:0,rgb:[150,0,90]},{index:.125,rgb:[0,0,200]},{index:.25,rgb:[0,25,255]},{index:.375,rgb:[0,152,255]},{index:.5,rgb:[44,255,150]},{index:.625,rgb:[151,255,0]},{index:.75,rgb:[255,234,0]},{index:.875,rgb:[255,111,0]},{index:1,rgb:[255,0,0]}],portland:[{index:0,rgb:[12,51,131]},{index:.25,rgb:[10,136,186]},{index:.5,rgb:[242,211,56]},{index:.75,rgb:[242,143,56]},{index:1,rgb:[217,30,30]}],blackbody:[{index:0,rgb:[0,0,0]},{index:.2,rgb:[230,0,0]},{index:.4,rgb:[230,210,0]},{index:.7,rgb:[255,255,255]},{index:1,rgb:[160,200,255]}],earth:[{index:0,rgb:[0,0,130]},{index:.1,rgb:[0,180,180]},{index:.2,rgb:[40,210,40]},{index:.4,rgb:[230,230,50]},{index:.6,rgb:[120,70,20]},{index:1,rgb:[255,255,255]}],electric:[{index:0,rgb:[0,0,0]},{index:.15,rgb:[30,0,100]},{index:.4,rgb:[120,0,100]},{index:.6,rgb:[160,90,0]},{index:.8,rgb:[230,200,0]},{index:1,rgb:[255,250,220]}],alpha:[{index:0,rgb:[255,255,255,0]},{index:1,rgb:[255,255,255,1]}],viridis:[{index:0,rgb:[68,1,84]},{index:.13,rgb:[71,44,122]},{index:.25,rgb:[59,81,139]},{index:.38,rgb:[44,113,142]},{index:.5,rgb:[33,144,141]},{index:.63,rgb:[39,173,129]},{index:.75,rgb:[92,200,99]},{index:.88,rgb:[170,220,50]},{index:1,rgb:[253,231,37]}],inferno:[{index:0,rgb:[0,0,4]},{index:.13,rgb:[31,12,72]},{index:.25,rgb:[85,15,109]},{index:.38,rgb:[136,34,106]},{index:.5,rgb:[186,54,85]},{index:.63,rgb:[227,89,51]},{index:.75,rgb:[249,140,10]},{index:.88,rgb:[249,201,50]},{index:1,rgb:[252,255,164]}],magma:[{index:0,rgb:[0,0,4]},{index:.13,rgb:[28,16,68]},{index:.25,rgb:[79,18,123]},{index:.38,rgb:[129,37,129]},{index:.5,rgb:[181,54,122]},{index:.63,rgb:[229,80,100]},{index:.75,rgb:[251,135,97]},{index:.88,rgb:[254,194,135]},{index:1,rgb:[252,253,191]}],plasma:[{index:0,rgb:[13,8,135]},{index:.13,rgb:[75,3,161]},{index:.25,rgb:[125,3,168]},{index:.38,rgb:[168,34,150]},{index:.5,rgb:[203,70,121]},{index:.63,rgb:[229,107,93]},{index:.75,rgb:[248,148,65]},{index:.88,rgb:[253,195,40]},{index:1,rgb:[240,249,33]}],warm:[{index:0,rgb:[125,0,179]},{index:.13,rgb:[172,0,187]},{index:.25,rgb:[219,0,170]},{index:.38,rgb:[255,0,130]},{index:.5,rgb:[255,63,74]},{index:.63,rgb:[255,123,0]},{index:.75,rgb:[234,176,0]},{index:.88,rgb:[190,228,0]},{index:1,rgb:[147,255,0]}],cool:[{index:0,rgb:[125,0,179]},{index:.13,rgb:[116,0,218]},{index:.25,rgb:[98,74,237]},{index:.38,rgb:[68,146,231]},{index:.5,rgb:[0,204,197]},{index:.63,rgb:[0,247,146]},{index:.75,rgb:[0,255,88]},{index:.88,rgb:[40,255,8]},{index:1,rgb:[147,255,0]}],\"rainbow-soft\":[{index:0,rgb:[125,0,179]},{index:.1,rgb:[199,0,180]},{index:.2,rgb:[255,0,121]},{index:.3,rgb:[255,108,0]},{index:.4,rgb:[222,194,0]},{index:.5,rgb:[150,255,0]},{index:.6,rgb:[0,255,55]},{index:.7,rgb:[0,246,150]},{index:.8,rgb:[50,167,222]},{index:.9,rgb:[103,51,235]},{index:1,rgb:[124,0,186]}],bathymetry:[{index:0,rgb:[40,26,44]},{index:.13,rgb:[59,49,90]},{index:.25,rgb:[64,76,139]},{index:.38,rgb:[63,110,151]},{index:.5,rgb:[72,142,158]},{index:.63,rgb:[85,174,163]},{index:.75,rgb:[120,206,163]},{index:.88,rgb:[187,230,172]},{index:1,rgb:[253,254,204]}],cdom:[{index:0,rgb:[47,15,62]},{index:.13,rgb:[87,23,86]},{index:.25,rgb:[130,28,99]},{index:.38,rgb:[171,41,96]},{index:.5,rgb:[206,67,86]},{index:.63,rgb:[230,106,84]},{index:.75,rgb:[242,149,103]},{index:.88,rgb:[249,193,135]},{index:1,rgb:[254,237,176]}],chlorophyll:[{index:0,rgb:[18,36,20]},{index:.13,rgb:[25,63,41]},{index:.25,rgb:[24,91,59]},{index:.38,rgb:[13,119,72]},{index:.5,rgb:[18,148,80]},{index:.63,rgb:[80,173,89]},{index:.75,rgb:[132,196,122]},{index:.88,rgb:[175,221,162]},{index:1,rgb:[215,249,208]}],density:[{index:0,rgb:[54,14,36]},{index:.13,rgb:[89,23,80]},{index:.25,rgb:[110,45,132]},{index:.38,rgb:[120,77,178]},{index:.5,rgb:[120,113,213]},{index:.63,rgb:[115,151,228]},{index:.75,rgb:[134,185,227]},{index:.88,rgb:[177,214,227]},{index:1,rgb:[230,241,241]}],\"freesurface-blue\":[{index:0,rgb:[30,4,110]},{index:.13,rgb:[47,14,176]},{index:.25,rgb:[41,45,236]},{index:.38,rgb:[25,99,212]},{index:.5,rgb:[68,131,200]},{index:.63,rgb:[114,156,197]},{index:.75,rgb:[157,181,203]},{index:.88,rgb:[200,208,216]},{index:1,rgb:[241,237,236]}],\"freesurface-red\":[{index:0,rgb:[60,9,18]},{index:.13,rgb:[100,17,27]},{index:.25,rgb:[142,20,29]},{index:.38,rgb:[177,43,27]},{index:.5,rgb:[192,87,63]},{index:.63,rgb:[205,125,105]},{index:.75,rgb:[216,162,148]},{index:.88,rgb:[227,199,193]},{index:1,rgb:[241,237,236]}],oxygen:[{index:0,rgb:[64,5,5]},{index:.13,rgb:[106,6,15]},{index:.25,rgb:[144,26,7]},{index:.38,rgb:[168,64,3]},{index:.5,rgb:[188,100,4]},{index:.63,rgb:[206,136,11]},{index:.75,rgb:[220,174,25]},{index:.88,rgb:[231,215,44]},{index:1,rgb:[248,254,105]}],par:[{index:0,rgb:[51,20,24]},{index:.13,rgb:[90,32,35]},{index:.25,rgb:[129,44,34]},{index:.38,rgb:[159,68,25]},{index:.5,rgb:[182,99,19]},{index:.63,rgb:[199,134,22]},{index:.75,rgb:[212,171,35]},{index:.88,rgb:[221,210,54]},{index:1,rgb:[225,253,75]}],phase:[{index:0,rgb:[145,105,18]},{index:.13,rgb:[184,71,38]},{index:.25,rgb:[186,58,115]},{index:.38,rgb:[160,71,185]},{index:.5,rgb:[110,97,218]},{index:.63,rgb:[50,123,164]},{index:.75,rgb:[31,131,110]},{index:.88,rgb:[77,129,34]},{index:1,rgb:[145,105,18]}],salinity:[{index:0,rgb:[42,24,108]},{index:.13,rgb:[33,50,162]},{index:.25,rgb:[15,90,145]},{index:.38,rgb:[40,118,137]},{index:.5,rgb:[59,146,135]},{index:.63,rgb:[79,175,126]},{index:.75,rgb:[120,203,104]},{index:.88,rgb:[193,221,100]},{index:1,rgb:[253,239,154]}],temperature:[{index:0,rgb:[4,35,51]},{index:.13,rgb:[23,51,122]},{index:.25,rgb:[85,59,157]},{index:.38,rgb:[129,79,143]},{index:.5,rgb:[175,95,130]},{index:.63,rgb:[222,112,101]},{index:.75,rgb:[249,146,66]},{index:.88,rgb:[249,196,65]},{index:1,rgb:[232,250,91]}],turbidity:[{index:0,rgb:[34,31,27]},{index:.13,rgb:[65,50,41]},{index:.25,rgb:[98,69,52]},{index:.38,rgb:[131,89,57]},{index:.5,rgb:[161,112,59]},{index:.63,rgb:[185,140,66]},{index:.75,rgb:[202,174,88]},{index:.88,rgb:[216,209,126]},{index:1,rgb:[233,246,171]}],\"velocity-blue\":[{index:0,rgb:[17,32,64]},{index:.13,rgb:[35,52,116]},{index:.25,rgb:[29,81,156]},{index:.38,rgb:[31,113,162]},{index:.5,rgb:[50,144,169]},{index:.63,rgb:[87,173,176]},{index:.75,rgb:[149,196,189]},{index:.88,rgb:[203,221,211]},{index:1,rgb:[254,251,230]}],\"velocity-green\":[{index:0,rgb:[23,35,19]},{index:.13,rgb:[24,64,38]},{index:.25,rgb:[11,95,45]},{index:.38,rgb:[39,123,35]},{index:.5,rgb:[95,146,12]},{index:.63,rgb:[152,165,18]},{index:.75,rgb:[201,186,69]},{index:.88,rgb:[233,216,137]},{index:1,rgb:[255,253,205]}],cubehelix:[{index:0,rgb:[0,0,0]},{index:.07,rgb:[22,5,59]},{index:.13,rgb:[60,4,105]},{index:.2,rgb:[109,1,135]},{index:.27,rgb:[161,0,147]},{index:.33,rgb:[210,2,142]},{index:.4,rgb:[251,11,123]},{index:.47,rgb:[255,29,97]},{index:.53,rgb:[255,54,69]},{index:.6,rgb:[255,85,46]},{index:.67,rgb:[255,120,34]},{index:.73,rgb:[255,157,37]},{index:.8,rgb:[241,191,57]},{index:.87,rgb:[224,220,93]},{index:.93,rgb:[218,241,142]},{index:1,rgb:[227,253,198]}]}},6729:function(t,e,r){\"use strict\";var n=r(3642),i=r(395);function a(t){return[t[0]/255,t[1]/255,t[2]/255,t[3]]}function o(t){for(var e,r=\"#\",n=0;n<3;++n)r+=(\"00\"+(e=(e=t[n]).toString(16))).substr(e.length);return r}function s(t){return\"rgba(\"+t.join(\",\")+\")\"}t.exports=function(t){var e,r,l,c,u,h,f,p,d,m;if(t||(t={}),p=(t.nshades||72)-1,f=t.format||\"hex\",(h=t.colormap)||(h=\"jet\"),\"string\"==typeof h){if(h=h.toLowerCase(),!n[h])throw Error(h+\" not a supported colorscale\");u=n[h]}else{if(!Array.isArray(h))throw Error(\"unsupported colormap option\",h);u=h.slice()}if(u.length>p+1)throw new Error(h+\" map requires nshades to be at least size \"+u.length);d=Array.isArray(t.alpha)?2!==t.alpha.length?[1,1]:t.alpha.slice():\"number\"==typeof t.alpha?[t.alpha,t.alpha]:[1,1],e=u.map((function(t){return Math.round(t.index*p)})),d[0]=Math.min(Math.max(d[0],0),1),d[1]=Math.min(Math.max(d[1],0),1);var g=u.map((function(t,e){var r=u[e].index,n=u[e].rgb.slice();return 4===n.length&&n[3]>=0&&n[3]<=1||(n[3]=d[0]+(d[1]-d[0])*r),n})),y=[];for(m=0;m0||l(t,e,a)?-1:1:0===s?c>0||l(t,e,r)?1:-1:i(c-s)}var h=n(t,e,r);return h>0?o>0&&n(t,e,a)>0?1:-1:h<0?o>0||n(t,e,a)>0?1:-1:n(t,e,a)>0||l(t,e,r)?1:-1};var n=r(3250),i=r(8572),a=r(9362),o=r(5382),s=r(8210);function l(t,e,r){var n=a(t[0],-e[0]),i=a(t[1],-e[1]),l=a(r[0],-e[0]),c=a(r[1],-e[1]),u=s(o(n,l),o(i,c));return u[u.length-1]>=0}},8572:function(t){\"use strict\";t.exports=function(t){return t<0?-1:t>0?1:0}},8507:function(t){t.exports=function(t,n){var i=t.length,a=t.length-n.length;if(a)return a;switch(i){case 0:return 0;case 1:return t[0]-n[0];case 2:return t[0]+t[1]-n[0]-n[1]||e(t[0],t[1])-e(n[0],n[1]);case 3:var o=t[0]+t[1],s=n[0]+n[1];if(a=o+t[2]-(s+n[2]))return a;var l=e(t[0],t[1]),c=e(n[0],n[1]);return e(l,t[2])-e(c,n[2])||e(l+t[2],o)-e(c+n[2],s);case 4:var u=t[0],h=t[1],f=t[2],p=t[3],d=n[0],m=n[1],g=n[2],y=n[3];return u+h+f+p-(d+m+g+y)||e(u,h,f,p)-e(d,m,g,y,d)||e(u+h,u+f,u+p,h+f,h+p,f+p)-e(d+m,d+g,d+y,m+g,m+y,g+y)||e(u+h+f,u+h+p,u+f+p,h+f+p)-e(d+m+g,d+m+y,d+g+y,m+g+y);default:for(var v=t.slice().sort(r),x=n.slice().sort(r),_=0;_t[r][0]&&(r=n);return er?[[r],[e]]:[[e]]}},4750:function(t,e,r){\"use strict\";t.exports=function(t){var e=n(t),r=e.length;if(r<=2)return[];for(var i=new Array(r),a=e[r-1],o=0;o=e[l]&&(s+=1);a[o]=s}}return t}(n(a,!0),r)}};var n=r(8954),i=r(3952)},4769:function(t){\"use strict\";t.exports=function(t,e,r,n,i,a){var o=i-1,s=i*i,l=o*o,c=(1+2*i)*l,u=i*l,h=s*(3-2*i),f=s*o;if(t.length){a||(a=new Array(t.length));for(var p=t.length-1;p>=0;--p)a[p]=c*t[p]+u*e[p]+h*r[p]+f*n[p];return a}return c*t+u*e+h*r+f*n},t.exports.derivative=function(t,e,r,n,i,a){var o=6*i*i-6*i,s=3*i*i-4*i+1,l=-6*i*i+6*i,c=3*i*i-2*i;if(t.length){a||(a=new Array(t.length));for(var u=t.length-1;u>=0;--u)a[u]=o*t[u]+s*e[u]+l*r[u]+c*n[u];return a}return o*t+s*e+l*r[u]+c*n}},7642:function(t,e,r){\"use strict\";var n=r(8954),i=r(1682);function a(t,e){this.point=t,this.index=e}function o(t,e){for(var r=t.point,n=e.point,i=r.length,a=0;a=2)return!1;t[r]=n}return!0})):b.filter((function(t){for(var e=0;e<=s;++e){var r=y[t[e]];if(r<0)return!1;t[e]=r}return!0})),1&s)for(u=0;u>>31},t.exports.exponent=function(e){return(t.exports.hi(e)<<1>>>21)-1023},t.exports.fraction=function(e){var r=t.exports.lo(e),n=t.exports.hi(e),i=1048575&n;return 2146435072&n&&(i+=1<<20),[r,i]},t.exports.denormalized=function(e){return!(2146435072&t.exports.hi(e))}},1338:function(t){\"use strict\";function e(t,r,n){var i=0|t[n];if(i<=0)return[];var a,o=new Array(i);if(n===t.length-1)for(a=0;a0)return function(t,e){var r,n;for(r=new Array(t),n=0;n=r-1){f=l.length-1;var d=t-e[r-1];for(p=0;p=r-1)for(var u=s.length-1,h=(e[r-1],0);h=0;--r)if(t[--e])return!1;return!0},s.jump=function(t){var e=this.lastT(),r=this.dimension;if(!(t0;--h)n.push(a(l[h-1],c[h-1],arguments[h])),i.push(0)}},s.push=function(t){var e=this.lastT(),r=this.dimension;if(!(t1e-6?1/s:0;this._time.push(t);for(var f=r;f>0;--f){var p=a(c[f-1],u[f-1],arguments[f]);n.push(p),i.push((p-n[o++])*h)}}},s.set=function(t){var e=this.dimension;if(!(t0;--l)r.push(a(o[l-1],s[l-1],arguments[l])),n.push(0)}},s.move=function(t){var e=this.lastT(),r=this.dimension;if(!(t<=e||arguments.length!==r+1)){var n=this._state,i=this._velocity,o=n.length-this.dimension,s=this.bounds,l=s[0],c=s[1],u=t-e,h=u>1e-6?1/u:0;this._time.push(t);for(var f=r;f>0;--f){var p=arguments[f];n.push(a(l[f-1],c[f-1],n[o++]+p)),i.push(p*h)}}},s.idle=function(t){var e=this.lastT();if(!(t=0;--h)n.push(a(l[h],c[h],n[o]+u*i[o])),i.push(0),o+=1}}},3840:function(t){\"use strict\";function e(t,e,r,n,i,a){this._color=t,this.key=e,this.value=r,this.left=n,this.right=i,this._count=a}function r(t){return new e(t._color,t.key,t.value,t.left,t.right,t._count)}function n(t,r){return new e(t,r.key,r.value,r.left,r.right,r._count)}function i(t){t._count=1+(t.left?t.left._count:0)+(t.right?t.right._count:0)}function a(t,e){this._compare=t,this.root=e}t.exports=function(t){return new a(t||p,null)};var o=a.prototype;function s(t,e){var r;return e.left&&(r=s(t,e.left))?r:(r=t(e.key,e.value))||(e.right?s(t,e.right):void 0)}function l(t,e,r,n){if(e(t,n.key)<=0){var i;if(n.left&&(i=l(t,e,r,n.left)))return i;if(i=r(n.key,n.value))return i}if(n.right)return l(t,e,r,n.right)}function c(t,e,r,n,i){var a,o=r(t,i.key),s=r(e,i.key);if(o<=0){if(i.left&&(a=c(t,e,r,n,i.left)))return a;if(s>0&&(a=n(i.key,i.value)))return a}if(s>0&&i.right)return c(t,e,r,n,i.right)}function u(t,e){this.tree=t,this._stack=e}Object.defineProperty(o,\"keys\",{get:function(){var t=[];return this.forEach((function(e,r){t.push(e)})),t}}),Object.defineProperty(o,\"values\",{get:function(){var t=[];return this.forEach((function(e,r){t.push(r)})),t}}),Object.defineProperty(o,\"length\",{get:function(){return this.root?this.root._count:0}}),o.insert=function(t,r){for(var o=this._compare,s=this.root,l=[],c=[];s;){var u=o(t,s.key);l.push(s),c.push(u),s=u<=0?s.left:s.right}l.push(new e(0,t,r,null,null,1));for(var h=l.length-2;h>=0;--h)s=l[h],c[h]<=0?l[h]=new e(s._color,s.key,s.value,l[h+1],s.right,s._count+1):l[h]=new e(s._color,s.key,s.value,s.left,l[h+1],s._count+1);for(h=l.length-1;h>1;--h){var f=l[h-1];if(s=l[h],1===f._color||1===s._color)break;var p=l[h-2];if(p.left===f)if(f.left===s){if(!(d=p.right)||0!==d._color){p._color=0,p.left=f.right,f._color=1,f.right=p,l[h-2]=f,l[h-1]=s,i(p),i(f),h>=3&&((m=l[h-3]).left===p?m.left=f:m.right=f);break}f._color=1,p.right=n(1,d),p._color=0,h-=1}else{if(!(d=p.right)||0!==d._color){f.right=s.left,p._color=0,p.left=s.right,s._color=1,s.left=f,s.right=p,l[h-2]=s,l[h-1]=f,i(p),i(f),i(s),h>=3&&((m=l[h-3]).left===p?m.left=s:m.right=s);break}f._color=1,p.right=n(1,d),p._color=0,h-=1}else if(f.right===s){if(!(d=p.left)||0!==d._color){p._color=0,p.right=f.left,f._color=1,f.left=p,l[h-2]=f,l[h-1]=s,i(p),i(f),h>=3&&((m=l[h-3]).right===p?m.right=f:m.left=f);break}f._color=1,p.left=n(1,d),p._color=0,h-=1}else{var d;if(!(d=p.left)||0!==d._color){var m;f.left=s.right,p._color=0,p.right=s.left,s._color=1,s.right=f,s.left=p,l[h-2]=s,l[h-1]=f,i(p),i(f),i(s),h>=3&&((m=l[h-3]).right===p?m.right=s:m.left=s);break}f._color=1,p.left=n(1,d),p._color=0,h-=1}}return l[0]._color=1,new a(o,l[0])},o.forEach=function(t,e,r){if(this.root)switch(arguments.length){case 1:return s(t,this.root);case 2:return l(e,this._compare,t,this.root);case 3:if(this._compare(e,r)>=0)return;return c(e,r,this._compare,t,this.root)}},Object.defineProperty(o,\"begin\",{get:function(){for(var t=[],e=this.root;e;)t.push(e),e=e.left;return new u(this,t)}}),Object.defineProperty(o,\"end\",{get:function(){for(var t=[],e=this.root;e;)t.push(e),e=e.right;return new u(this,t)}}),o.at=function(t){if(t<0)return new u(this,[]);for(var e=this.root,r=[];;){if(r.push(e),e.left){if(t=e.right._count)break;e=e.right}return new u(this,[])},o.ge=function(t){for(var e=this._compare,r=this.root,n=[],i=0;r;){var a=e(t,r.key);n.push(r),a<=0&&(i=n.length),r=a<=0?r.left:r.right}return n.length=i,new u(this,n)},o.gt=function(t){for(var e=this._compare,r=this.root,n=[],i=0;r;){var a=e(t,r.key);n.push(r),a<0&&(i=n.length),r=a<0?r.left:r.right}return n.length=i,new u(this,n)},o.lt=function(t){for(var e=this._compare,r=this.root,n=[],i=0;r;){var a=e(t,r.key);n.push(r),a>0&&(i=n.length),r=a<=0?r.left:r.right}return n.length=i,new u(this,n)},o.le=function(t){for(var e=this._compare,r=this.root,n=[],i=0;r;){var a=e(t,r.key);n.push(r),a>=0&&(i=n.length),r=a<0?r.left:r.right}return n.length=i,new u(this,n)},o.find=function(t){for(var e=this._compare,r=this.root,n=[];r;){var i=e(t,r.key);if(n.push(r),0===i)return new u(this,n);r=i<=0?r.left:r.right}return new u(this,[])},o.remove=function(t){var e=this.find(t);return e?e.remove():this},o.get=function(t){for(var e=this._compare,r=this.root;r;){var n=e(t,r.key);if(0===n)return r.value;r=n<=0?r.left:r.right}};var h=u.prototype;function f(t,e){t.key=e.key,t.value=e.value,t.left=e.left,t.right=e.right,t._color=e._color,t._count=e._count}function p(t,e){return te?1:0}Object.defineProperty(h,\"valid\",{get:function(){return this._stack.length>0}}),Object.defineProperty(h,\"node\",{get:function(){return this._stack.length>0?this._stack[this._stack.length-1]:null},enumerable:!0}),h.clone=function(){return new u(this.tree,this._stack.slice())},h.remove=function(){var t=this._stack;if(0===t.length)return this.tree;var o=new Array(t.length),s=t[t.length-1];o[o.length-1]=new e(s._color,s.key,s.value,s.left,s.right,s._count);for(var l=t.length-2;l>=0;--l)(s=t[l]).left===t[l+1]?o[l]=new e(s._color,s.key,s.value,o[l+1],s.right,s._count):o[l]=new e(s._color,s.key,s.value,s.left,o[l+1],s._count);if((s=o[o.length-1]).left&&s.right){var c=o.length;for(s=s.left;s.right;)o.push(s),s=s.right;var u=o[c-1];for(o.push(new e(s._color,u.key,u.value,s.left,s.right,s._count)),o[c-1].key=s.key,o[c-1].value=s.value,l=o.length-2;l>=c;--l)s=o[l],o[l]=new e(s._color,s.key,s.value,s.left,o[l+1],s._count);o[c-1].left=o[c]}if(0===(s=o[o.length-1])._color){var h=o[o.length-2];for(h.left===s?h.left=null:h.right===s&&(h.right=null),o.pop(),l=0;l=0;--l){if(e=t[l],0===l)return void(e._color=1);if((a=t[l-1]).left===e){if((o=a.right).right&&0===o.right._color)return s=(o=a.right=r(o)).right=r(o.right),a.right=o.left,o.left=a,o.right=s,o._color=a._color,e._color=1,a._color=1,s._color=1,i(a),i(o),l>1&&((c=t[l-2]).left===a?c.left=o:c.right=o),void(t[l-1]=o);if(o.left&&0===o.left._color)return s=(o=a.right=r(o)).left=r(o.left),a.right=s.left,o.left=s.right,s.left=a,s.right=o,s._color=a._color,a._color=1,o._color=1,e._color=1,i(a),i(o),i(s),l>1&&((c=t[l-2]).left===a?c.left=s:c.right=s),void(t[l-1]=s);if(1===o._color){if(0===a._color)return a._color=1,void(a.right=n(0,o));a.right=n(0,o);continue}o=r(o),a.right=o.left,o.left=a,o._color=a._color,a._color=0,i(a),i(o),l>1&&((c=t[l-2]).left===a?c.left=o:c.right=o),t[l-1]=o,t[l]=a,l+11&&((c=t[l-2]).right===a?c.right=o:c.left=o),void(t[l-1]=o);if(o.right&&0===o.right._color)return s=(o=a.left=r(o)).right=r(o.right),a.left=s.right,o.right=s.left,s.right=a,s.left=o,s._color=a._color,a._color=1,o._color=1,e._color=1,i(a),i(o),i(s),l>1&&((c=t[l-2]).right===a?c.right=s:c.left=s),void(t[l-1]=s);if(1===o._color){if(0===a._color)return a._color=1,void(a.left=n(0,o));a.left=n(0,o);continue}var c;o=r(o),a.left=o.right,o.right=a,o._color=a._color,a._color=0,i(a),i(o),l>1&&((c=t[l-2]).right===a?c.right=o:c.left=o),t[l-1]=o,t[l]=a,l+10)return this._stack[this._stack.length-1].key},enumerable:!0}),Object.defineProperty(h,\"value\",{get:function(){if(this._stack.length>0)return this._stack[this._stack.length-1].value},enumerable:!0}),Object.defineProperty(h,\"index\",{get:function(){var t=0,e=this._stack;if(0===e.length){var r=this.tree.root;return r?r._count:0}e[e.length-1].left&&(t=e[e.length-1].left._count);for(var n=e.length-2;n>=0;--n)e[n+1]===e[n].right&&(++t,e[n].left&&(t+=e[n].left._count));return t},enumerable:!0}),h.next=function(){var t=this._stack;if(0!==t.length){var e=t[t.length-1];if(e.right)for(e=e.right;e;)t.push(e),e=e.left;else for(t.pop();t.length>0&&t[t.length-1].right===e;)e=t[t.length-1],t.pop()}},Object.defineProperty(h,\"hasNext\",{get:function(){var t=this._stack;if(0===t.length)return!1;if(t[t.length-1].right)return!0;for(var e=t.length-1;e>0;--e)if(t[e-1].left===t[e])return!0;return!1}}),h.update=function(t){var r=this._stack;if(0===r.length)throw new Error(\"Can't update empty node!\");var n=new Array(r.length),i=r[r.length-1];n[n.length-1]=new e(i._color,i.key,t,i.left,i.right,i._count);for(var o=r.length-2;o>=0;--o)(i=r[o]).left===r[o+1]?n[o]=new e(i._color,i.key,i.value,n[o+1],i.right,i._count):n[o]=new e(i._color,i.key,i.value,i.left,n[o+1],i._count);return new a(this.tree._compare,n[0])},h.prev=function(){var t=this._stack;if(0!==t.length){var e=t[t.length-1];if(e.left)for(e=e.left;e;)t.push(e),e=e.right;else for(t.pop();t.length>0&&t[t.length-1].left===e;)e=t[t.length-1],t.pop()}},Object.defineProperty(h,\"hasPrev\",{get:function(){var t=this._stack;if(0===t.length)return!1;if(t[t.length-1].left)return!0;for(var e=t.length-1;e>0;--e)if(t[e-1].right===t[e])return!0;return!1}})},3837:function(t,e,r){\"use strict\";t.exports=function(t,e){var r=new p(t);return r.update(e),r};var n=r(4935),i=r(501),a=r(5304),o=r(6429),s=r(6444),l=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),c=ArrayBuffer,u=DataView;function h(t){return Array.isArray(t)||function(t){return c.isView(t)&&!(t instanceof u)}(t)}function f(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t}function p(t){this.gl=t,this.pixelRatio=1,this.bounds=[[-10,-10,-10],[10,10,10]],this.ticks=[[],[],[]],this.autoTicks=!0,this.tickSpacing=[1,1,1],this.tickEnable=[!0,!0,!0],this.tickFont=[\"sans-serif\",\"sans-serif\",\"sans-serif\"],this.tickFontStyle=[\"normal\",\"normal\",\"normal\"],this.tickFontWeight=[\"normal\",\"normal\",\"normal\"],this.tickFontVariant=[\"normal\",\"normal\",\"normal\"],this.tickSize=[12,12,12],this.tickAngle=[0,0,0],this.tickAlign=[\"auto\",\"auto\",\"auto\"],this.tickColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.tickPad=[10,10,10],this.lastCubeProps={cubeEdges:[0,0,0],axis:[0,0,0]},this.labels=[\"x\",\"y\",\"z\"],this.labelEnable=[!0,!0,!0],this.labelFont=[\"sans-serif\",\"sans-serif\",\"sans-serif\"],this.labelFontStyle=[\"normal\",\"normal\",\"normal\"],this.labelFontWeight=[\"normal\",\"normal\",\"normal\"],this.labelFontVariant=[\"normal\",\"normal\",\"normal\"],this.labelSize=[20,20,20],this.labelAngle=[0,0,0],this.labelAlign=[\"auto\",\"auto\",\"auto\"],this.labelColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.labelPad=[10,10,10],this.lineEnable=[!0,!0,!0],this.lineMirror=[!1,!1,!1],this.lineWidth=[1,1,1],this.lineColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.lineTickEnable=[!0,!0,!0],this.lineTickMirror=[!1,!1,!1],this.lineTickLength=[0,0,0],this.lineTickWidth=[1,1,1],this.lineTickColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.gridEnable=[!0,!0,!0],this.gridWidth=[1,1,1],this.gridColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.zeroEnable=[!0,!0,!0],this.zeroLineColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.zeroLineWidth=[2,2,2],this.backgroundEnable=[!1,!1,!1],this.backgroundColor=[[.8,.8,.8,.5],[.8,.8,.8,.5],[.8,.8,.8,.5]],this._firstInit=!0,this._text=null,this._lines=null,this._background=a(t)}var d=p.prototype;function m(){this.primalOffset=[0,0,0],this.primalMinor=[0,0,0],this.mirrorOffset=[0,0,0],this.mirrorMinor=[0,0,0]}d.update=function(t){function e(e,r,n){if(n in t){var i,a=t[n],o=this[n];(e?h(a)&&h(a[0]):h(a))?this[n]=i=[r(a[0]),r(a[1]),r(a[2])]:this[n]=i=[r(a),r(a),r(a)];for(var s=0;s<3;++s)if(i[s]!==o[s])return!0}return!1}t=t||{};var r,a=e.bind(this,!1,Number),o=e.bind(this,!1,Boolean),l=e.bind(this,!1,String),c=e.bind(this,!0,(function(t){if(h(t)){if(3===t.length)return[+t[0],+t[1],+t[2],1];if(4===t.length)return[+t[0],+t[1],+t[2],+t[3]]}return[0,0,0,1]})),u=!1,f=!1;if(\"bounds\"in t)for(var p=t.bounds,d=0;d<2;++d)for(var m=0;m<3;++m)p[d][m]!==this.bounds[d][m]&&(f=!0),this.bounds[d][m]=p[d][m];if(\"ticks\"in t)for(r=t.ticks,u=!0,this.autoTicks=!1,d=0;d<3;++d)this.tickSpacing[d]=0;else a(\"tickSpacing\")&&(this.autoTicks=!0,f=!0);if(this._firstInit&&(\"ticks\"in t||\"tickSpacing\"in t||(this.autoTicks=!0),f=!0,u=!0,this._firstInit=!1),f&&this.autoTicks&&(r=s.create(this.bounds,this.tickSpacing),u=!0),u){for(d=0;d<3;++d)r[d].sort((function(t,e){return t.x-e.x}));s.equal(r,this.ticks)?u=!1:this.ticks=r}o(\"tickEnable\"),l(\"tickFont\")&&(u=!0),l(\"tickFontStyle\")&&(u=!0),l(\"tickFontWeight\")&&(u=!0),l(\"tickFontVariant\")&&(u=!0),a(\"tickSize\"),a(\"tickAngle\"),a(\"tickPad\"),c(\"tickColor\");var g=l(\"labels\");l(\"labelFont\")&&(g=!0),l(\"labelFontStyle\")&&(g=!0),l(\"labelFontWeight\")&&(g=!0),l(\"labelFontVariant\")&&(g=!0),o(\"labelEnable\"),a(\"labelSize\"),a(\"labelPad\"),c(\"labelColor\"),o(\"lineEnable\"),o(\"lineMirror\"),a(\"lineWidth\"),c(\"lineColor\"),o(\"lineTickEnable\"),o(\"lineTickMirror\"),a(\"lineTickLength\"),a(\"lineTickWidth\"),c(\"lineTickColor\"),o(\"gridEnable\"),a(\"gridWidth\"),c(\"gridColor\"),o(\"zeroEnable\"),c(\"zeroLineColor\"),a(\"zeroLineWidth\"),o(\"backgroundEnable\"),c(\"backgroundColor\");var y=[{family:this.labelFont[0],style:this.labelFontStyle[0],weight:this.labelFontWeight[0],variant:this.labelFontVariant[0]},{family:this.labelFont[1],style:this.labelFontStyle[1],weight:this.labelFontWeight[1],variant:this.labelFontVariant[1]},{family:this.labelFont[2],style:this.labelFontStyle[2],weight:this.labelFontWeight[2],variant:this.labelFontVariant[2]}],v=[{family:this.tickFont[0],style:this.tickFontStyle[0],weight:this.tickFontWeight[0],variant:this.tickFontVariant[0]},{family:this.tickFont[1],style:this.tickFontStyle[1],weight:this.tickFontWeight[1],variant:this.tickFontVariant[1]},{family:this.tickFont[2],style:this.tickFontStyle[2],weight:this.tickFontWeight[2],variant:this.tickFontVariant[2]}];this._text?this._text&&(g||u)&&this._text.update(this.bounds,this.labels,y,this.ticks,v):this._text=n(this.gl,this.bounds,this.labels,y,this.ticks,v),this._lines&&u&&(this._lines.dispose(),this._lines=null),this._lines||(this._lines=i(this.gl,this.bounds,this.ticks))};var g=[new m,new m,new m];function y(t,e,r,n,i){for(var a=t.primalOffset,o=t.primalMinor,s=t.mirrorOffset,l=t.mirrorMinor,c=n[e],u=0;u<3;++u)if(e!==u){var h=a,f=s,p=o,d=l;c&1<0?(p[u]=-1,d[u]=0):(p[u]=0,d[u]=1)}}var v=[0,0,0],x={model:l,view:l,projection:l,_ortho:!1};d.isOpaque=function(){return!0},d.isTransparent=function(){return!1},d.drawTransparent=function(t){};var _=[0,0,0],b=[0,0,0],w=[0,0,0];d.draw=function(t){t=t||x;for(var e=this.gl,r=t.model||l,n=t.view||l,i=t.projection||l,a=this.bounds,s=t._ortho||!1,c=o(r,n,i,a,s),u=c.cubeEdges,h=c.axis,p=n[12],d=n[13],m=n[14],T=n[15],k=(s?2:1)*this.pixelRatio*(i[3]*p+i[7]*d+i[11]*m+i[15]*T)/e.drawingBufferHeight,A=0;A<3;++A)this.lastCubeProps.cubeEdges[A]=u[A],this.lastCubeProps.axis[A]=h[A];var M=g;for(A=0;A<3;++A)y(g[A],A,this.bounds,u,h);e=this.gl;var S,E,C,L=v;for(A=0;A<3;++A)this.backgroundEnable[A]?L[A]=h[A]:L[A]=0;for(this._background.draw(r,n,i,a,L,this.backgroundColor),this._lines.bind(r,n,i,this),A=0;A<3;++A){var I=[0,0,0];h[A]>0?I[A]=a[1][A]:I[A]=a[0][A];for(var P=0;P<2;++P){var z=(A+1+P)%3,O=(A+1+(1^P))%3;this.gridEnable[z]&&this._lines.drawGrid(z,O,this.bounds,I,this.gridColor[z],this.gridWidth[z]*this.pixelRatio)}for(P=0;P<2;++P)z=(A+1+P)%3,O=(A+1+(1^P))%3,this.zeroEnable[O]&&Math.min(a[0][O],a[1][O])<=0&&Math.max(a[0][O],a[1][O])>=0&&this._lines.drawZero(z,O,this.bounds,I,this.zeroLineColor[O],this.zeroLineWidth[O]*this.pixelRatio)}for(A=0;A<3;++A){this.lineEnable[A]&&this._lines.drawAxisLine(A,this.bounds,M[A].primalOffset,this.lineColor[A],this.lineWidth[A]*this.pixelRatio),this.lineMirror[A]&&this._lines.drawAxisLine(A,this.bounds,M[A].mirrorOffset,this.lineColor[A],this.lineWidth[A]*this.pixelRatio);var D=f(_,M[A].primalMinor),R=f(b,M[A].mirrorMinor),F=this.lineTickLength;for(P=0;P<3;++P){var B=k/r[5*P];D[P]*=F[P]*B,R[P]*=F[P]*B}this.lineTickEnable[A]&&this._lines.drawAxisTicks(A,M[A].primalOffset,D,this.lineTickColor[A],this.lineTickWidth[A]*this.pixelRatio),this.lineTickMirror[A]&&this._lines.drawAxisTicks(A,M[A].mirrorOffset,R,this.lineTickColor[A],this.lineTickWidth[A]*this.pixelRatio)}function N(t){(C=[0,0,0])[t]=1}function j(t,e,r){var n=(t+1)%3,i=(t+2)%3,a=e[n],o=e[i],s=r[n],l=r[i];a>0&&l>0||a>0&&l<0||a<0&&l>0||a<0&&l<0?N(n):(o>0&&s>0||o>0&&s<0||o<0&&s>0||o<0&&s<0)&&N(i)}for(this._lines.unbind(),this._text.bind(r,n,i,this.pixelRatio),A=0;A<3;++A){var U=M[A].primalMinor,V=M[A].mirrorMinor,q=f(w,M[A].primalOffset);for(P=0;P<3;++P)this.lineTickEnable[A]&&(q[P]+=k*U[P]*Math.max(this.lineTickLength[P],0)/r[5*P]);var H=[0,0,0];if(H[A]=1,this.tickEnable[A]){for(-3600===this.tickAngle[A]?(this.tickAngle[A]=0,this.tickAlign[A]=\"auto\"):this.tickAlign[A]=-1,E=1,\"auto\"===(S=[this.tickAlign[A],.5,E])[0]?S[0]=0:S[0]=parseInt(\"\"+S[0]),C=[0,0,0],j(A,U,V),P=0;P<3;++P)q[P]+=k*U[P]*this.tickPad[P]/r[5*P];this._text.drawTicks(A,this.tickSize[A],this.tickAngle[A],q,this.tickColor[A],H,C,S)}if(this.labelEnable[A]){for(E=0,C=[0,0,0],this.labels[A].length>4&&(N(A),E=1),\"auto\"===(S=[this.labelAlign[A],.5,E])[0]?S[0]=0:S[0]=parseInt(\"\"+S[0]),P=0;P<3;++P)q[P]+=k*U[P]*this.labelPad[P]/r[5*P];q[A]+=.5*(a[0][A]+a[1][A]),this._text.drawLabel(A,this.labelSize[A],this.labelAngle[A],q,this.labelColor[A],[0,0,0],C,S)}}this._text.unbind()},d.dispose=function(){this._text.dispose(),this._lines.dispose(),this._background.dispose(),this._lines=null,this._text=null,this._background=null,this.gl=null}},5304:function(t,e,r){\"use strict\";t.exports=function(t){for(var e=[],r=[],s=0,l=0;l<3;++l)for(var c=(l+1)%3,u=(l+2)%3,h=[0,0,0],f=[0,0,0],p=-1;p<=1;p+=2){r.push(s,s+2,s+1,s+1,s+2,s+3),h[l]=p,f[l]=p;for(var d=-1;d<=1;d+=2){h[c]=d;for(var m=-1;m<=1;m+=2)h[u]=m,e.push(h[0],h[1],h[2],f[0],f[1],f[2]),s+=1}var g=c;c=u,u=g}var y=n(t,new Float32Array(e)),v=n(t,new Uint16Array(r),t.ELEMENT_ARRAY_BUFFER),x=i(t,[{buffer:y,type:t.FLOAT,size:3,offset:0,stride:24},{buffer:y,type:t.FLOAT,size:3,offset:12,stride:24}],v),_=a(t);return _.attributes.position.location=0,_.attributes.normal.location=1,new o(t,y,x,_)};var n=r(2762),i=r(8116),a=r(1879).bg;function o(t,e,r,n){this.gl=t,this.buffer=e,this.vao=r,this.shader=n}var s=o.prototype;s.draw=function(t,e,r,n,i,a){for(var o=!1,s=0;s<3;++s)o=o||i[s];if(o){var l=this.gl;l.enable(l.POLYGON_OFFSET_FILL),l.polygonOffset(1,2),this.shader.bind(),this.shader.uniforms={model:t,view:e,projection:r,bounds:n,enable:i,colors:a},this.vao.bind(),this.vao.draw(this.gl.TRIANGLES,36),this.vao.unbind(),l.disable(l.POLYGON_OFFSET_FILL)}},s.dispose=function(){this.vao.dispose(),this.buffer.dispose(),this.shader.dispose()}},6429:function(t,e,r){\"use strict\";t.exports=function(t,e,r,a,p){i(s,e,t),i(s,r,s);for(var v=0,x=0;x<2;++x){u[2]=a[x][2];for(var _=0;_<2;++_){u[1]=a[_][1];for(var b=0;b<2;++b)u[0]=a[b][0],f(l[v],u,s),v+=1}}var w=-1;for(x=0;x<8;++x){for(var T=l[x][3],k=0;k<3;++k)c[x][k]=l[x][k]/T;p&&(c[x][2]*=-1),T<0&&(w<0||c[x][2]E&&(w|=1<E&&(w|=1<c[x][1])&&(R=x);var F=-1;for(x=0;x<3;++x)(N=R^1<c[B][0]&&(B=N))}var j=m;j[0]=j[1]=j[2]=0,j[n.log2(F^R)]=R&F,j[n.log2(R^B)]=R&B;var U=7^B;U===w||U===D?(U=7^F,j[n.log2(B^U)]=U&B):j[n.log2(F^U)]=U&F;var V=g,q=w;for(A=0;A<3;++A)V[A]=q&1< HALF_PI) && (b <= ONE_AND_HALF_PI)) ?\\n b - PI :\\n b;\\n}\\n\\nfloat look_horizontal_or_vertical(float a, float ratio) {\\n // ratio controls the ratio between being horizontal to (vertical + horizontal)\\n // if ratio is set to 0.5 then it is 50%, 50%.\\n // when using a higher ratio e.g. 0.75 the result would\\n // likely be more horizontal than vertical.\\n\\n float b = positive_angle(a);\\n\\n return\\n (b < ( ratio) * HALF_PI) ? 0.0 :\\n (b < (2.0 - ratio) * HALF_PI) ? -HALF_PI :\\n (b < (2.0 + ratio) * HALF_PI) ? 0.0 :\\n (b < (4.0 - ratio) * HALF_PI) ? HALF_PI :\\n 0.0;\\n}\\n\\nfloat roundTo(float a, float b) {\\n return float(b * floor((a + 0.5 * b) / b));\\n}\\n\\nfloat look_round_n_directions(float a, int n) {\\n float b = positive_angle(a);\\n float div = TWO_PI / float(n);\\n float c = roundTo(b, div);\\n return look_upwards(c);\\n}\\n\\nfloat applyAlignOption(float rawAngle, float delta) {\\n return\\n (option > 2) ? look_round_n_directions(rawAngle + delta, option) : // option 3-n: round to n directions\\n (option == 2) ? look_horizontal_or_vertical(rawAngle + delta, hv_ratio) : // horizontal or vertical\\n (option == 1) ? rawAngle + delta : // use free angle, and flip to align with one direction of the axis\\n (option == 0) ? look_upwards(rawAngle) : // use free angle, and stay upwards\\n (option ==-1) ? 0.0 : // useful for backward compatibility, all texts remains horizontal\\n rawAngle; // otherwise return back raw input angle\\n}\\n\\nbool isAxisTitle = (axis.x == 0.0) &&\\n (axis.y == 0.0) &&\\n (axis.z == 0.0);\\n\\nvoid main() {\\n //Compute world offset\\n float axisDistance = position.z;\\n vec3 dataPosition = axisDistance * axis + offset;\\n\\n float beta = angle; // i.e. user defined attributes for each tick\\n\\n float axisAngle;\\n float clipAngle;\\n float flip;\\n\\n if (enableAlign) {\\n axisAngle = (isAxisTitle) ? HALF_PI :\\n computeViewAngle(dataPosition, dataPosition + axis);\\n clipAngle = computeViewAngle(dataPosition, dataPosition + alignDir);\\n\\n axisAngle += (sin(axisAngle) < 0.0) ? PI : 0.0;\\n clipAngle += (sin(clipAngle) < 0.0) ? PI : 0.0;\\n\\n flip = (dot(vec2(cos(axisAngle), sin(axisAngle)),\\n vec2(sin(clipAngle),-cos(clipAngle))) > 0.0) ? 1.0 : 0.0;\\n\\n beta += applyAlignOption(clipAngle, flip * PI);\\n }\\n\\n //Compute plane offset\\n vec2 planeCoord = position.xy * pixelScale;\\n\\n mat2 planeXform = scale * mat2(\\n cos(beta), sin(beta),\\n -sin(beta), cos(beta)\\n );\\n\\n vec2 viewOffset = 2.0 * planeXform * planeCoord / resolution;\\n\\n //Compute clip position\\n vec3 clipPosition = project(dataPosition);\\n\\n //Apply text offset in clip coordinates\\n clipPosition += vec3(viewOffset, 0.0);\\n\\n //Done\\n gl_Position = vec4(clipPosition, 1.0);\\n}\\n\"]),l=n([\"precision highp float;\\n#define GLSLIFY 1\\n\\nuniform vec4 color;\\nvoid main() {\\n gl_FragColor = color;\\n}\"]);e.Q=function(t){return i(t,s,l,null,[{name:\"position\",type:\"vec3\"}])};var c=n([\"precision highp float;\\n#define GLSLIFY 1\\n\\nattribute vec3 position;\\nattribute vec3 normal;\\n\\nuniform mat4 model, view, projection;\\nuniform vec3 enable;\\nuniform vec3 bounds[2];\\n\\nvarying vec3 colorChannel;\\n\\nvoid main() {\\n\\n vec3 signAxis = sign(bounds[1] - bounds[0]);\\n\\n vec3 realNormal = signAxis * normal;\\n\\n if(dot(realNormal, enable) > 0.0) {\\n vec3 minRange = min(bounds[0], bounds[1]);\\n vec3 maxRange = max(bounds[0], bounds[1]);\\n vec3 nPosition = mix(minRange, maxRange, 0.5 * (position + 1.0));\\n gl_Position = projection * (view * (model * vec4(nPosition, 1.0)));\\n } else {\\n gl_Position = vec4(0,0,0,0);\\n }\\n\\n colorChannel = abs(realNormal);\\n}\\n\"]),u=n([\"precision highp float;\\n#define GLSLIFY 1\\n\\nuniform vec4 colors[3];\\n\\nvarying vec3 colorChannel;\\n\\nvoid main() {\\n gl_FragColor = colorChannel.x * colors[0] +\\n colorChannel.y * colors[1] +\\n colorChannel.z * colors[2];\\n}\"]);e.bg=function(t){return i(t,c,u,null,[{name:\"position\",type:\"vec3\"},{name:\"normal\",type:\"vec3\"}])}},4935:function(t,e,r){\"use strict\";t.exports=function(t,e,r,i,o,l){var c=n(t),h=a(t,[{buffer:c,size:3}]),f=s(t);f.attributes.position.location=0;var p=new u(t,f,c,h);return p.update(e,r,i,o,l),p};var n=r(2762),a=r(8116),o=r(4359),s=r(1879).Q,l=window||i.global||{},c=l.__TEXT_CACHE||{};function u(t,e,r,n){this.gl=t,this.shader=e,this.buffer=r,this.vao=n,this.tickOffset=this.tickCount=this.labelOffset=this.labelCount=null}l.__TEXT_CACHE={};var h=u.prototype,f=[0,0];h.bind=function(t,e,r,n){this.vao.bind(),this.shader.bind();var i=this.shader.uniforms;i.model=t,i.view=e,i.projection=r,i.pixelScale=n,f[0]=this.gl.drawingBufferWidth,f[1]=this.gl.drawingBufferHeight,this.shader.uniforms.resolution=f},h.unbind=function(){this.vao.unbind()},h.update=function(t,e,r,n,i){var a=[];function s(t,e,r,n,i,s){var l=[r.style,r.weight,r.variant,r.family].join(\"_\"),u=c[l];u||(u=c[l]={});var h=u[e];h||(h=u[e]=function(t,e){try{return o(t,e)}catch(e){return console.warn('error vectorizing text:\"'+t+'\" error:',e),{cells:[],positions:[]}}}(e,{triangles:!0,font:r.family,fontStyle:r.style,fontWeight:r.weight,fontVariant:r.variant,textAlign:\"center\",textBaseline:\"middle\",lineSpacing:i,styletags:s}));for(var f=(n||12)/12,p=h.positions,d=h.cells,m=0,g=d.length;m=0;--v){var x=p[y[v]];a.push(f*x[0],-f*x[1],t)}}for(var l=[0,0,0],u=[0,0,0],h=[0,0,0],f=[0,0,0],p={breaklines:!0,bolds:!0,italics:!0,subscripts:!0,superscripts:!0},d=0;d<3;++d){h[d]=a.length/3|0,s(.5*(t[0][d]+t[1][d]),e[d],r[d],12,1.25,p),f[d]=(a.length/3|0)-h[d],l[d]=a.length/3|0;for(var m=0;m=0&&(i=r.length-n-1);var a=Math.pow(10,i),o=Math.round(t*e*a),s=o+\"\";if(s.indexOf(\"e\")>=0)return s;var l=o/a,c=o%a;o<0?(l=0|-Math.ceil(l),c=0|-c):(l=0|Math.floor(l),c|=0);var u=\"\"+l;if(o<0&&(u=\"-\"+u),i){for(var h=\"\"+c;h.length=t[0][i];--o)a.push({x:o*e[i],text:r(e[i],o)});n.push(a)}return n},e.equal=function(t,e){for(var r=0;r<3;++r){if(t[r].length!==e[r].length)return!1;for(var n=0;nr)throw new Error(\"gl-buffer: If resizing buffer, must not specify offset\");return t.bufferSubData(e,a,i),r}function u(t,e){for(var r=n.malloc(t.length,e),i=t.length,a=0;a=0;--n){if(e[n]!==r)return!1;r*=t[n]}return!0}(t.shape,t.stride))0===t.offset&&t.data.length===t.shape[0]?this.length=c(this.gl,this.type,this.length,this.usage,t.data,e):this.length=c(this.gl,this.type,this.length,this.usage,t.data.subarray(t.offset,t.shape[0]),e);else{var s=n.malloc(t.size,r),l=a(s,t.shape);i.assign(l,t),this.length=c(this.gl,this.type,this.length,this.usage,e<0?s:s.subarray(0,t.size),e),n.free(s)}}else if(Array.isArray(t)){var h;h=this.type===this.gl.ELEMENT_ARRAY_BUFFER?u(t,\"uint16\"):u(t,\"float32\"),this.length=c(this.gl,this.type,this.length,this.usage,e<0?h:h.subarray(0,t.length),e),n.free(h)}else if(\"object\"==typeof t&&\"number\"==typeof t.length)this.length=c(this.gl,this.type,this.length,this.usage,t,e);else{if(\"number\"!=typeof t&&void 0!==t)throw new Error(\"gl-buffer: Invalid data type\");if(e>=0)throw new Error(\"gl-buffer: Cannot specify offset when resizing buffer\");(t|=0)<=0&&(t=1),this.gl.bufferData(this.type,0|t,this.usage),this.length=t}},t.exports=function(t,e,r,n){if(r=r||t.ARRAY_BUFFER,n=n||t.DYNAMIC_DRAW,r!==t.ARRAY_BUFFER&&r!==t.ELEMENT_ARRAY_BUFFER)throw new Error(\"gl-buffer: Invalid type for webgl buffer, must be either gl.ARRAY_BUFFER or gl.ELEMENT_ARRAY_BUFFER\");if(n!==t.DYNAMIC_DRAW&&n!==t.STATIC_DRAW&&n!==t.STREAM_DRAW)throw new Error(\"gl-buffer: Invalid usage for buffer, must be either gl.DYNAMIC_DRAW, gl.STATIC_DRAW or gl.STREAM_DRAW\");var i=t.createBuffer(),a=new s(t,r,i,0,n);return a.update(e),a}},6405:function(t,e,r){\"use strict\";var n=r(2931);t.exports=function(t,e){var r=t.positions,i=t.vectors,a={positions:[],vertexIntensity:[],vertexIntensityBounds:t.vertexIntensityBounds,vectors:[],cells:[],coneOffset:t.coneOffset,colormap:t.colormap};if(0===t.positions.length)return e&&(e[0]=[0,0,0],e[1]=[0,0,0]),a;for(var o=0,s=1/0,l=-1/0,c=1/0,u=-1/0,h=1/0,f=-1/0,p=null,d=null,m=[],g=1/0,y=!1,v=\"raw\"===t.coneSizemode,x=0;xo&&(o=n.length(b)),x&&!v){var w=2*n.distance(p,_)/(n.length(d)+n.length(b));w?(g=Math.min(g,w),y=!1):y=!0}y||(p=_,d=b),m.push(b)}var T=[s,c,h],k=[l,u,f];e&&(e[0]=T,e[1]=k),0===o&&(o=1);var A=1/o;isFinite(g)||(g=1),a.vectorScale=g;var M=t.coneSize||(v?1:.5);t.absoluteConeSize&&(M=t.absoluteConeSize*A),a.coneScale=M,x=0;for(var S=0;x=1},p.isTransparent=function(){return this.opacity<1},p.pickSlots=1,p.setPickBase=function(t){this.pickId=t},p.update=function(t){t=t||{};var e=this.gl;this.dirty=!0,\"lightPosition\"in t&&(this.lightPosition=t.lightPosition),\"opacity\"in t&&(this.opacity=t.opacity),\"ambient\"in t&&(this.ambientLight=t.ambient),\"diffuse\"in t&&(this.diffuseLight=t.diffuse),\"specular\"in t&&(this.specularLight=t.specular),\"roughness\"in t&&(this.roughness=t.roughness),\"fresnel\"in t&&(this.fresnel=t.fresnel),void 0!==t.tubeScale&&(this.tubeScale=t.tubeScale),void 0!==t.vectorScale&&(this.vectorScale=t.vectorScale),void 0!==t.coneScale&&(this.coneScale=t.coneScale),void 0!==t.coneOffset&&(this.coneOffset=t.coneOffset),t.colormap&&(this.texture.shape=[256,256],this.texture.minFilter=e.LINEAR_MIPMAP_LINEAR,this.texture.magFilter=e.LINEAR,this.texture.setPixels(function(t){for(var e=u({colormap:t,nshades:256,format:\"rgba\"}),r=new Uint8Array(1024),n=0;n<256;++n){for(var i=e[n],a=0;a<3;++a)r[4*n+a]=i[a];r[4*n+3]=255*i[3]}return c(r,[256,256,4],[4,0,1])}(t.colormap)),this.texture.generateMipmap());var r=t.cells,n=t.positions,i=t.vectors;if(n&&r&&i){var a=[],o=[],s=[],l=[],h=[];this.cells=r,this.positions=n,this.vectors=i;var f=t.meshColor||[1,1,1,1],p=t.vertexIntensity,d=1/0,m=-1/0;if(p)if(t.vertexIntensityBounds)d=+t.vertexIntensityBounds[0],m=+t.vertexIntensityBounds[1];else for(var g=0;g0){var m=this.triShader;m.bind(),m.uniforms=c,this.triangleVAO.bind(),e.drawArrays(e.TRIANGLES,0,3*this.triangleCount),this.triangleVAO.unbind()}},p.drawPick=function(t){t=t||{};for(var e=this.gl,r=t.model||h,n=t.view||h,i=t.projection||h,a=[[-1e6,-1e6,-1e6],[1e6,1e6,1e6]],o=0;o<3;++o)a[0][o]=Math.max(a[0][o],this.clipBounds[0][o]),a[1][o]=Math.min(a[1][o],this.clipBounds[1][o]);this._model=[].slice.call(r),this._view=[].slice.call(n),this._projection=[].slice.call(i),this._resolution=[e.drawingBufferWidth,e.drawingBufferHeight];var s={model:r,view:n,projection:i,clipBounds:a,tubeScale:this.tubeScale,vectorScale:this.vectorScale,coneScale:this.coneScale,coneOffset:this.coneOffset,pickId:this.pickId/255},l=this.pickShader;l.bind(),l.uniforms=s,this.triangleCount>0&&(this.triangleVAO.bind(),e.drawArrays(e.TRIANGLES,0,3*this.triangleCount),this.triangleVAO.unbind())},p.pick=function(t){if(!t)return null;if(t.id!==this.pickId)return null;var e=t.value[0]+256*t.value[1]+65536*t.value[2],r=this.cells[e],n=this.positions[r[1]].slice(0,3),i={position:n,dataCoordinate:n,index:Math.floor(r[1]/48)};return\"cone\"===this.traceType?i.index=Math.floor(r[1]/48):\"streamtube\"===this.traceType&&(i.intensity=this.intensity[r[1]],i.velocity=this.vectors[r[1]].slice(0,3),i.divergence=this.vectors[r[1]][3],i.index=e),i},p.dispose=function(){this.texture.dispose(),this.triShader.dispose(),this.pickShader.dispose(),this.triangleVAO.dispose(),this.trianglePositions.dispose(),this.triangleVectors.dispose(),this.triangleColors.dispose(),this.triangleUVs.dispose(),this.triangleIds.dispose()},t.exports=function(t,e,r){var s=r.shaders;1===arguments.length&&(t=(e=t).gl);var l=function(t,e){var r=n(t,e.meshShader.vertex,e.meshShader.fragment,null,e.meshShader.attributes);return r.attributes.position.location=0,r.attributes.color.location=2,r.attributes.uv.location=3,r.attributes.vector.location=4,r}(t,s),u=function(t,e){var r=n(t,e.pickShader.vertex,e.pickShader.fragment,null,e.pickShader.attributes);return r.attributes.position.location=0,r.attributes.id.location=1,r.attributes.vector.location=4,r}(t,s),h=o(t,c(new Uint8Array([255,255,255,255]),[1,1,4]));h.generateMipmap(),h.minFilter=t.LINEAR_MIPMAP_LINEAR,h.magFilter=t.LINEAR;var p=i(t),d=i(t),m=i(t),g=i(t),y=i(t),v=new f(t,h,l,u,p,d,y,m,g,a(t,[{buffer:p,type:t.FLOAT,size:4},{buffer:y,type:t.UNSIGNED_BYTE,size:4,normalized:!0},{buffer:m,type:t.FLOAT,size:4},{buffer:g,type:t.FLOAT,size:2},{buffer:d,type:t.FLOAT,size:4}]),r.traceType||\"cone\");return v.update(e),v}},614:function(t,e,r){var n=r(3236),i=n([\"precision highp float;\\n\\nprecision highp float;\\n#define GLSLIFY 1\\n\\nvec3 getOrthogonalVector(vec3 v) {\\n // Return up-vector for only-z vector.\\n // Return ax + by + cz = 0, a point that lies on the plane that has v as a normal and that isn't (0,0,0).\\n // From the above if-statement we have ||a|| > 0 U ||b|| > 0.\\n // Assign z = 0, x = -b, y = a:\\n // a*-b + b*a + c*0 = -ba + ba + 0 = 0\\n if (v.x*v.x > v.z*v.z || v.y*v.y > v.z*v.z) {\\n return normalize(vec3(-v.y, v.x, 0.0));\\n } else {\\n return normalize(vec3(0.0, v.z, -v.y));\\n }\\n}\\n\\n// Calculate the cone vertex and normal at the given index.\\n//\\n// The returned vertex is for a cone with its top at origin and height of 1.0,\\n// pointing in the direction of the vector attribute.\\n//\\n// Each cone is made up of a top vertex, a center base vertex and base perimeter vertices.\\n// These vertices are used to make up the triangles of the cone by the following:\\n// segment + 0 top vertex\\n// segment + 1 perimeter vertex a+1\\n// segment + 2 perimeter vertex a\\n// segment + 3 center base vertex\\n// segment + 4 perimeter vertex a\\n// segment + 5 perimeter vertex a+1\\n// Where segment is the number of the radial segment * 6 and a is the angle at that radial segment.\\n// To go from index to segment, floor(index / 6)\\n// To go from segment to angle, 2*pi * (segment/segmentCount)\\n// To go from index to segment index, index - (segment*6)\\n//\\nvec3 getConePosition(vec3 d, float rawIndex, float coneOffset, out vec3 normal) {\\n\\n const float segmentCount = 8.0;\\n\\n float index = rawIndex - floor(rawIndex /\\n (segmentCount * 6.0)) *\\n (segmentCount * 6.0);\\n\\n float segment = floor(0.001 + index/6.0);\\n float segmentIndex = index - (segment*6.0);\\n\\n normal = -normalize(d);\\n\\n if (segmentIndex > 2.99 && segmentIndex < 3.01) {\\n return mix(vec3(0.0), -d, coneOffset);\\n }\\n\\n float nextAngle = (\\n (segmentIndex > 0.99 && segmentIndex < 1.01) ||\\n (segmentIndex > 4.99 && segmentIndex < 5.01)\\n ) ? 1.0 : 0.0;\\n float angle = 2.0 * 3.14159 * ((segment + nextAngle) / segmentCount);\\n\\n vec3 v1 = mix(d, vec3(0.0), coneOffset);\\n vec3 v2 = v1 - d;\\n\\n vec3 u = getOrthogonalVector(d);\\n vec3 v = normalize(cross(u, d));\\n\\n vec3 x = u * cos(angle) * length(d)*0.25;\\n vec3 y = v * sin(angle) * length(d)*0.25;\\n vec3 v3 = v2 + x + y;\\n if (segmentIndex < 3.0) {\\n vec3 tx = u * sin(angle);\\n vec3 ty = v * -cos(angle);\\n vec3 tangent = tx + ty;\\n normal = normalize(cross(v3 - v1, tangent));\\n }\\n\\n if (segmentIndex == 0.0) {\\n return mix(d, vec3(0.0), coneOffset);\\n }\\n return v3;\\n}\\n\\nattribute vec3 vector;\\nattribute vec4 color, position;\\nattribute vec2 uv;\\n\\nuniform float vectorScale, coneScale, coneOffset;\\nuniform mat4 model, view, projection, inverseModel;\\nuniform vec3 eyePosition, lightPosition;\\n\\nvarying vec3 f_normal, f_lightDirection, f_eyeDirection, f_data, f_position;\\nvarying vec4 f_color;\\nvarying vec2 f_uv;\\n\\nvoid main() {\\n // Scale the vector magnitude to stay constant with\\n // model & view changes.\\n vec3 normal;\\n vec3 XYZ = getConePosition(mat3(model) * ((vectorScale * coneScale) * vector), position.w, coneOffset, normal);\\n vec4 conePosition = model * vec4(position.xyz, 1.0) + vec4(XYZ, 0.0);\\n\\n //Lighting geometry parameters\\n vec4 cameraCoordinate = view * conePosition;\\n cameraCoordinate.xyz /= cameraCoordinate.w;\\n f_lightDirection = lightPosition - cameraCoordinate.xyz;\\n f_eyeDirection = eyePosition - cameraCoordinate.xyz;\\n f_normal = normalize((vec4(normal, 0.0) * inverseModel).xyz);\\n\\n // vec4 m_position = model * vec4(conePosition, 1.0);\\n vec4 t_position = view * conePosition;\\n gl_Position = projection * t_position;\\n\\n f_color = color;\\n f_data = conePosition.xyz;\\n f_position = position.xyz;\\n f_uv = uv;\\n}\\n\"]),a=n([\"#extension GL_OES_standard_derivatives : enable\\n\\nprecision highp float;\\n#define GLSLIFY 1\\n\\nfloat beckmannDistribution(float x, float roughness) {\\n float NdotH = max(x, 0.0001);\\n float cos2Alpha = NdotH * NdotH;\\n float tan2Alpha = (cos2Alpha - 1.0) / cos2Alpha;\\n float roughness2 = roughness * roughness;\\n float denom = 3.141592653589793 * roughness2 * cos2Alpha * cos2Alpha;\\n return exp(tan2Alpha / roughness2) / denom;\\n}\\n\\nfloat cookTorranceSpecular(\\n vec3 lightDirection,\\n vec3 viewDirection,\\n vec3 surfaceNormal,\\n float roughness,\\n float fresnel) {\\n\\n float VdotN = max(dot(viewDirection, surfaceNormal), 0.0);\\n float LdotN = max(dot(lightDirection, surfaceNormal), 0.0);\\n\\n //Half angle vector\\n vec3 H = normalize(lightDirection + viewDirection);\\n\\n //Geometric term\\n float NdotH = max(dot(surfaceNormal, H), 0.0);\\n float VdotH = max(dot(viewDirection, H), 0.000001);\\n float LdotH = max(dot(lightDirection, H), 0.000001);\\n float G1 = (2.0 * NdotH * VdotN) / VdotH;\\n float G2 = (2.0 * NdotH * LdotN) / LdotH;\\n float G = min(1.0, min(G1, G2));\\n \\n //Distribution term\\n float D = beckmannDistribution(NdotH, roughness);\\n\\n //Fresnel term\\n float F = pow(1.0 - VdotN, fresnel);\\n\\n //Multiply terms and done\\n return G * F * D / max(3.14159265 * VdotN, 0.000001);\\n}\\n\\nbool outOfRange(float a, float b, float p) {\\n return ((p > max(a, b)) || \\n (p < min(a, b)));\\n}\\n\\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y));\\n}\\n\\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y) ||\\n outOfRange(a.z, b.z, p.z));\\n}\\n\\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\\n return outOfRange(a.xyz, b.xyz, p.xyz);\\n}\\n\\nuniform vec3 clipBounds[2];\\nuniform float roughness, fresnel, kambient, kdiffuse, kspecular, opacity;\\nuniform sampler2D texture;\\n\\nvarying vec3 f_normal, f_lightDirection, f_eyeDirection, f_data, f_position;\\nvarying vec4 f_color;\\nvarying vec2 f_uv;\\n\\nvoid main() {\\n if (outOfRange(clipBounds[0], clipBounds[1], f_position)) discard;\\n vec3 N = normalize(f_normal);\\n vec3 L = normalize(f_lightDirection);\\n vec3 V = normalize(f_eyeDirection);\\n\\n if(gl_FrontFacing) {\\n N = -N;\\n }\\n\\n float specular = min(1.0, max(0.0, cookTorranceSpecular(L, V, N, roughness, fresnel)));\\n float diffuse = min(kambient + kdiffuse * max(dot(N, L), 0.0), 1.0);\\n\\n vec4 surfaceColor = f_color * texture2D(texture, f_uv);\\n vec4 litColor = surfaceColor.a * vec4(diffuse * surfaceColor.rgb + kspecular * vec3(1,1,1) * specular, 1.0);\\n\\n gl_FragColor = litColor * opacity;\\n}\\n\"]),o=n([\"precision highp float;\\n\\nprecision highp float;\\n#define GLSLIFY 1\\n\\nvec3 getOrthogonalVector(vec3 v) {\\n // Return up-vector for only-z vector.\\n // Return ax + by + cz = 0, a point that lies on the plane that has v as a normal and that isn't (0,0,0).\\n // From the above if-statement we have ||a|| > 0 U ||b|| > 0.\\n // Assign z = 0, x = -b, y = a:\\n // a*-b + b*a + c*0 = -ba + ba + 0 = 0\\n if (v.x*v.x > v.z*v.z || v.y*v.y > v.z*v.z) {\\n return normalize(vec3(-v.y, v.x, 0.0));\\n } else {\\n return normalize(vec3(0.0, v.z, -v.y));\\n }\\n}\\n\\n// Calculate the cone vertex and normal at the given index.\\n//\\n// The returned vertex is for a cone with its top at origin and height of 1.0,\\n// pointing in the direction of the vector attribute.\\n//\\n// Each cone is made up of a top vertex, a center base vertex and base perimeter vertices.\\n// These vertices are used to make up the triangles of the cone by the following:\\n// segment + 0 top vertex\\n// segment + 1 perimeter vertex a+1\\n// segment + 2 perimeter vertex a\\n// segment + 3 center base vertex\\n// segment + 4 perimeter vertex a\\n// segment + 5 perimeter vertex a+1\\n// Where segment is the number of the radial segment * 6 and a is the angle at that radial segment.\\n// To go from index to segment, floor(index / 6)\\n// To go from segment to angle, 2*pi * (segment/segmentCount)\\n// To go from index to segment index, index - (segment*6)\\n//\\nvec3 getConePosition(vec3 d, float rawIndex, float coneOffset, out vec3 normal) {\\n\\n const float segmentCount = 8.0;\\n\\n float index = rawIndex - floor(rawIndex /\\n (segmentCount * 6.0)) *\\n (segmentCount * 6.0);\\n\\n float segment = floor(0.001 + index/6.0);\\n float segmentIndex = index - (segment*6.0);\\n\\n normal = -normalize(d);\\n\\n if (segmentIndex > 2.99 && segmentIndex < 3.01) {\\n return mix(vec3(0.0), -d, coneOffset);\\n }\\n\\n float nextAngle = (\\n (segmentIndex > 0.99 && segmentIndex < 1.01) ||\\n (segmentIndex > 4.99 && segmentIndex < 5.01)\\n ) ? 1.0 : 0.0;\\n float angle = 2.0 * 3.14159 * ((segment + nextAngle) / segmentCount);\\n\\n vec3 v1 = mix(d, vec3(0.0), coneOffset);\\n vec3 v2 = v1 - d;\\n\\n vec3 u = getOrthogonalVector(d);\\n vec3 v = normalize(cross(u, d));\\n\\n vec3 x = u * cos(angle) * length(d)*0.25;\\n vec3 y = v * sin(angle) * length(d)*0.25;\\n vec3 v3 = v2 + x + y;\\n if (segmentIndex < 3.0) {\\n vec3 tx = u * sin(angle);\\n vec3 ty = v * -cos(angle);\\n vec3 tangent = tx + ty;\\n normal = normalize(cross(v3 - v1, tangent));\\n }\\n\\n if (segmentIndex == 0.0) {\\n return mix(d, vec3(0.0), coneOffset);\\n }\\n return v3;\\n}\\n\\nattribute vec4 vector;\\nattribute vec4 position;\\nattribute vec4 id;\\n\\nuniform mat4 model, view, projection;\\nuniform float vectorScale, coneScale, coneOffset;\\n\\nvarying vec3 f_position;\\nvarying vec4 f_id;\\n\\nvoid main() {\\n vec3 normal;\\n vec3 XYZ = getConePosition(mat3(model) * ((vectorScale * coneScale) * vector.xyz), position.w, coneOffset, normal);\\n vec4 conePosition = model * vec4(position.xyz, 1.0) + vec4(XYZ, 0.0);\\n gl_Position = projection * (view * conePosition);\\n f_id = id;\\n f_position = position.xyz;\\n}\\n\"]),s=n([\"precision highp float;\\n#define GLSLIFY 1\\n\\nbool outOfRange(float a, float b, float p) {\\n return ((p > max(a, b)) || \\n (p < min(a, b)));\\n}\\n\\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y));\\n}\\n\\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y) ||\\n outOfRange(a.z, b.z, p.z));\\n}\\n\\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\\n return outOfRange(a.xyz, b.xyz, p.xyz);\\n}\\n\\nuniform vec3 clipBounds[2];\\nuniform float pickId;\\n\\nvarying vec3 f_position;\\nvarying vec4 f_id;\\n\\nvoid main() {\\n if (outOfRange(clipBounds[0], clipBounds[1], f_position)) discard;\\n\\n gl_FragColor = vec4(pickId, f_id.xyz);\\n}\"]);e.meshShader={vertex:i,fragment:a,attributes:[{name:\"position\",type:\"vec4\"},{name:\"color\",type:\"vec4\"},{name:\"uv\",type:\"vec2\"},{name:\"vector\",type:\"vec3\"}]},e.pickShader={vertex:o,fragment:s,attributes:[{name:\"position\",type:\"vec4\"},{name:\"id\",type:\"vec4\"},{name:\"vector\",type:\"vec3\"}]}},737:function(t){t.exports={0:\"NONE\",1:\"ONE\",2:\"LINE_LOOP\",3:\"LINE_STRIP\",4:\"TRIANGLES\",5:\"TRIANGLE_STRIP\",6:\"TRIANGLE_FAN\",256:\"DEPTH_BUFFER_BIT\",512:\"NEVER\",513:\"LESS\",514:\"EQUAL\",515:\"LEQUAL\",516:\"GREATER\",517:\"NOTEQUAL\",518:\"GEQUAL\",519:\"ALWAYS\",768:\"SRC_COLOR\",769:\"ONE_MINUS_SRC_COLOR\",770:\"SRC_ALPHA\",771:\"ONE_MINUS_SRC_ALPHA\",772:\"DST_ALPHA\",773:\"ONE_MINUS_DST_ALPHA\",774:\"DST_COLOR\",775:\"ONE_MINUS_DST_COLOR\",776:\"SRC_ALPHA_SATURATE\",1024:\"STENCIL_BUFFER_BIT\",1028:\"FRONT\",1029:\"BACK\",1032:\"FRONT_AND_BACK\",1280:\"INVALID_ENUM\",1281:\"INVALID_VALUE\",1282:\"INVALID_OPERATION\",1285:\"OUT_OF_MEMORY\",1286:\"INVALID_FRAMEBUFFER_OPERATION\",2304:\"CW\",2305:\"CCW\",2849:\"LINE_WIDTH\",2884:\"CULL_FACE\",2885:\"CULL_FACE_MODE\",2886:\"FRONT_FACE\",2928:\"DEPTH_RANGE\",2929:\"DEPTH_TEST\",2930:\"DEPTH_WRITEMASK\",2931:\"DEPTH_CLEAR_VALUE\",2932:\"DEPTH_FUNC\",2960:\"STENCIL_TEST\",2961:\"STENCIL_CLEAR_VALUE\",2962:\"STENCIL_FUNC\",2963:\"STENCIL_VALUE_MASK\",2964:\"STENCIL_FAIL\",2965:\"STENCIL_PASS_DEPTH_FAIL\",2966:\"STENCIL_PASS_DEPTH_PASS\",2967:\"STENCIL_REF\",2968:\"STENCIL_WRITEMASK\",2978:\"VIEWPORT\",3024:\"DITHER\",3042:\"BLEND\",3088:\"SCISSOR_BOX\",3089:\"SCISSOR_TEST\",3106:\"COLOR_CLEAR_VALUE\",3107:\"COLOR_WRITEMASK\",3317:\"UNPACK_ALIGNMENT\",3333:\"PACK_ALIGNMENT\",3379:\"MAX_TEXTURE_SIZE\",3386:\"MAX_VIEWPORT_DIMS\",3408:\"SUBPIXEL_BITS\",3410:\"RED_BITS\",3411:\"GREEN_BITS\",3412:\"BLUE_BITS\",3413:\"ALPHA_BITS\",3414:\"DEPTH_BITS\",3415:\"STENCIL_BITS\",3553:\"TEXTURE_2D\",4352:\"DONT_CARE\",4353:\"FASTEST\",4354:\"NICEST\",5120:\"BYTE\",5121:\"UNSIGNED_BYTE\",5122:\"SHORT\",5123:\"UNSIGNED_SHORT\",5124:\"INT\",5125:\"UNSIGNED_INT\",5126:\"FLOAT\",5386:\"INVERT\",5890:\"TEXTURE\",6401:\"STENCIL_INDEX\",6402:\"DEPTH_COMPONENT\",6406:\"ALPHA\",6407:\"RGB\",6408:\"RGBA\",6409:\"LUMINANCE\",6410:\"LUMINANCE_ALPHA\",7680:\"KEEP\",7681:\"REPLACE\",7682:\"INCR\",7683:\"DECR\",7936:\"VENDOR\",7937:\"RENDERER\",7938:\"VERSION\",9728:\"NEAREST\",9729:\"LINEAR\",9984:\"NEAREST_MIPMAP_NEAREST\",9985:\"LINEAR_MIPMAP_NEAREST\",9986:\"NEAREST_MIPMAP_LINEAR\",9987:\"LINEAR_MIPMAP_LINEAR\",10240:\"TEXTURE_MAG_FILTER\",10241:\"TEXTURE_MIN_FILTER\",10242:\"TEXTURE_WRAP_S\",10243:\"TEXTURE_WRAP_T\",10497:\"REPEAT\",10752:\"POLYGON_OFFSET_UNITS\",16384:\"COLOR_BUFFER_BIT\",32769:\"CONSTANT_COLOR\",32770:\"ONE_MINUS_CONSTANT_COLOR\",32771:\"CONSTANT_ALPHA\",32772:\"ONE_MINUS_CONSTANT_ALPHA\",32773:\"BLEND_COLOR\",32774:\"FUNC_ADD\",32777:\"BLEND_EQUATION_RGB\",32778:\"FUNC_SUBTRACT\",32779:\"FUNC_REVERSE_SUBTRACT\",32819:\"UNSIGNED_SHORT_4_4_4_4\",32820:\"UNSIGNED_SHORT_5_5_5_1\",32823:\"POLYGON_OFFSET_FILL\",32824:\"POLYGON_OFFSET_FACTOR\",32854:\"RGBA4\",32855:\"RGB5_A1\",32873:\"TEXTURE_BINDING_2D\",32926:\"SAMPLE_ALPHA_TO_COVERAGE\",32928:\"SAMPLE_COVERAGE\",32936:\"SAMPLE_BUFFERS\",32937:\"SAMPLES\",32938:\"SAMPLE_COVERAGE_VALUE\",32939:\"SAMPLE_COVERAGE_INVERT\",32968:\"BLEND_DST_RGB\",32969:\"BLEND_SRC_RGB\",32970:\"BLEND_DST_ALPHA\",32971:\"BLEND_SRC_ALPHA\",33071:\"CLAMP_TO_EDGE\",33170:\"GENERATE_MIPMAP_HINT\",33189:\"DEPTH_COMPONENT16\",33306:\"DEPTH_STENCIL_ATTACHMENT\",33635:\"UNSIGNED_SHORT_5_6_5\",33648:\"MIRRORED_REPEAT\",33901:\"ALIASED_POINT_SIZE_RANGE\",33902:\"ALIASED_LINE_WIDTH_RANGE\",33984:\"TEXTURE0\",33985:\"TEXTURE1\",33986:\"TEXTURE2\",33987:\"TEXTURE3\",33988:\"TEXTURE4\",33989:\"TEXTURE5\",33990:\"TEXTURE6\",33991:\"TEXTURE7\",33992:\"TEXTURE8\",33993:\"TEXTURE9\",33994:\"TEXTURE10\",33995:\"TEXTURE11\",33996:\"TEXTURE12\",33997:\"TEXTURE13\",33998:\"TEXTURE14\",33999:\"TEXTURE15\",34e3:\"TEXTURE16\",34001:\"TEXTURE17\",34002:\"TEXTURE18\",34003:\"TEXTURE19\",34004:\"TEXTURE20\",34005:\"TEXTURE21\",34006:\"TEXTURE22\",34007:\"TEXTURE23\",34008:\"TEXTURE24\",34009:\"TEXTURE25\",34010:\"TEXTURE26\",34011:\"TEXTURE27\",34012:\"TEXTURE28\",34013:\"TEXTURE29\",34014:\"TEXTURE30\",34015:\"TEXTURE31\",34016:\"ACTIVE_TEXTURE\",34024:\"MAX_RENDERBUFFER_SIZE\",34041:\"DEPTH_STENCIL\",34055:\"INCR_WRAP\",34056:\"DECR_WRAP\",34067:\"TEXTURE_CUBE_MAP\",34068:\"TEXTURE_BINDING_CUBE_MAP\",34069:\"TEXTURE_CUBE_MAP_POSITIVE_X\",34070:\"TEXTURE_CUBE_MAP_NEGATIVE_X\",34071:\"TEXTURE_CUBE_MAP_POSITIVE_Y\",34072:\"TEXTURE_CUBE_MAP_NEGATIVE_Y\",34073:\"TEXTURE_CUBE_MAP_POSITIVE_Z\",34074:\"TEXTURE_CUBE_MAP_NEGATIVE_Z\",34076:\"MAX_CUBE_MAP_TEXTURE_SIZE\",34338:\"VERTEX_ATTRIB_ARRAY_ENABLED\",34339:\"VERTEX_ATTRIB_ARRAY_SIZE\",34340:\"VERTEX_ATTRIB_ARRAY_STRIDE\",34341:\"VERTEX_ATTRIB_ARRAY_TYPE\",34342:\"CURRENT_VERTEX_ATTRIB\",34373:\"VERTEX_ATTRIB_ARRAY_POINTER\",34466:\"NUM_COMPRESSED_TEXTURE_FORMATS\",34467:\"COMPRESSED_TEXTURE_FORMATS\",34660:\"BUFFER_SIZE\",34661:\"BUFFER_USAGE\",34816:\"STENCIL_BACK_FUNC\",34817:\"STENCIL_BACK_FAIL\",34818:\"STENCIL_BACK_PASS_DEPTH_FAIL\",34819:\"STENCIL_BACK_PASS_DEPTH_PASS\",34877:\"BLEND_EQUATION_ALPHA\",34921:\"MAX_VERTEX_ATTRIBS\",34922:\"VERTEX_ATTRIB_ARRAY_NORMALIZED\",34930:\"MAX_TEXTURE_IMAGE_UNITS\",34962:\"ARRAY_BUFFER\",34963:\"ELEMENT_ARRAY_BUFFER\",34964:\"ARRAY_BUFFER_BINDING\",34965:\"ELEMENT_ARRAY_BUFFER_BINDING\",34975:\"VERTEX_ATTRIB_ARRAY_BUFFER_BINDING\",35040:\"STREAM_DRAW\",35044:\"STATIC_DRAW\",35048:\"DYNAMIC_DRAW\",35632:\"FRAGMENT_SHADER\",35633:\"VERTEX_SHADER\",35660:\"MAX_VERTEX_TEXTURE_IMAGE_UNITS\",35661:\"MAX_COMBINED_TEXTURE_IMAGE_UNITS\",35663:\"SHADER_TYPE\",35664:\"FLOAT_VEC2\",35665:\"FLOAT_VEC3\",35666:\"FLOAT_VEC4\",35667:\"INT_VEC2\",35668:\"INT_VEC3\",35669:\"INT_VEC4\",35670:\"BOOL\",35671:\"BOOL_VEC2\",35672:\"BOOL_VEC3\",35673:\"BOOL_VEC4\",35674:\"FLOAT_MAT2\",35675:\"FLOAT_MAT3\",35676:\"FLOAT_MAT4\",35678:\"SAMPLER_2D\",35680:\"SAMPLER_CUBE\",35712:\"DELETE_STATUS\",35713:\"COMPILE_STATUS\",35714:\"LINK_STATUS\",35715:\"VALIDATE_STATUS\",35716:\"INFO_LOG_LENGTH\",35717:\"ATTACHED_SHADERS\",35718:\"ACTIVE_UNIFORMS\",35719:\"ACTIVE_UNIFORM_MAX_LENGTH\",35720:\"SHADER_SOURCE_LENGTH\",35721:\"ACTIVE_ATTRIBUTES\",35722:\"ACTIVE_ATTRIBUTE_MAX_LENGTH\",35724:\"SHADING_LANGUAGE_VERSION\",35725:\"CURRENT_PROGRAM\",36003:\"STENCIL_BACK_REF\",36004:\"STENCIL_BACK_VALUE_MASK\",36005:\"STENCIL_BACK_WRITEMASK\",36006:\"FRAMEBUFFER_BINDING\",36007:\"RENDERBUFFER_BINDING\",36048:\"FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE\",36049:\"FRAMEBUFFER_ATTACHMENT_OBJECT_NAME\",36050:\"FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL\",36051:\"FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE\",36053:\"FRAMEBUFFER_COMPLETE\",36054:\"FRAMEBUFFER_INCOMPLETE_ATTACHMENT\",36055:\"FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT\",36057:\"FRAMEBUFFER_INCOMPLETE_DIMENSIONS\",36061:\"FRAMEBUFFER_UNSUPPORTED\",36064:\"COLOR_ATTACHMENT0\",36096:\"DEPTH_ATTACHMENT\",36128:\"STENCIL_ATTACHMENT\",36160:\"FRAMEBUFFER\",36161:\"RENDERBUFFER\",36162:\"RENDERBUFFER_WIDTH\",36163:\"RENDERBUFFER_HEIGHT\",36164:\"RENDERBUFFER_INTERNAL_FORMAT\",36168:\"STENCIL_INDEX8\",36176:\"RENDERBUFFER_RED_SIZE\",36177:\"RENDERBUFFER_GREEN_SIZE\",36178:\"RENDERBUFFER_BLUE_SIZE\",36179:\"RENDERBUFFER_ALPHA_SIZE\",36180:\"RENDERBUFFER_DEPTH_SIZE\",36181:\"RENDERBUFFER_STENCIL_SIZE\",36194:\"RGB565\",36336:\"LOW_FLOAT\",36337:\"MEDIUM_FLOAT\",36338:\"HIGH_FLOAT\",36339:\"LOW_INT\",36340:\"MEDIUM_INT\",36341:\"HIGH_INT\",36346:\"SHADER_COMPILER\",36347:\"MAX_VERTEX_UNIFORM_VECTORS\",36348:\"MAX_VARYING_VECTORS\",36349:\"MAX_FRAGMENT_UNIFORM_VECTORS\",37440:\"UNPACK_FLIP_Y_WEBGL\",37441:\"UNPACK_PREMULTIPLY_ALPHA_WEBGL\",37442:\"CONTEXT_LOST_WEBGL\",37443:\"UNPACK_COLORSPACE_CONVERSION_WEBGL\",37444:\"BROWSER_DEFAULT_WEBGL\"}},5171:function(t,e,r){var n=r(737);t.exports=function(t){return n[t]}},9165:function(t,e,r){\"use strict\";t.exports=function(t){var e=t.gl,r=n(e),o=i(e,[{buffer:r,type:e.FLOAT,size:3,offset:0,stride:40},{buffer:r,type:e.FLOAT,size:4,offset:12,stride:40},{buffer:r,type:e.FLOAT,size:3,offset:28,stride:40}]),l=a(e);l.attributes.position.location=0,l.attributes.color.location=1,l.attributes.offset.location=2;var c=new s(e,r,o,l);return c.update(t),c};var n=r(2762),i=r(8116),a=r(3436),o=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];function s(t,e,r,n){this.gl=t,this.shader=n,this.buffer=e,this.vao=r,this.pixelRatio=1,this.bounds=[[1/0,1/0,1/0],[-1/0,-1/0,-1/0]],this.clipBounds=[[-1/0,-1/0,-1/0],[1/0,1/0,1/0]],this.lineWidth=[1,1,1],this.capSize=[10,10,10],this.lineCount=[0,0,0],this.lineOffset=[0,0,0],this.opacity=1,this.hasAlpha=!1}var l=s.prototype;function c(t,e){for(var r=0;r<3;++r)t[0][r]=Math.min(t[0][r],e[r]),t[1][r]=Math.max(t[1][r],e[r])}l.isOpaque=function(){return!this.hasAlpha},l.isTransparent=function(){return this.hasAlpha},l.drawTransparent=l.draw=function(t){var e=this.gl,r=this.shader.uniforms;this.shader.bind();var n=r.view=t.view||o,i=r.projection=t.projection||o;r.model=t.model||o,r.clipBounds=this.clipBounds,r.opacity=this.opacity;var a=n[12],s=n[13],l=n[14],c=n[15],u=(t._ortho?2:1)*this.pixelRatio*(i[3]*a+i[7]*s+i[11]*l+i[15]*c)/e.drawingBufferHeight;this.vao.bind();for(var h=0;h<3;++h)e.lineWidth(this.lineWidth[h]*this.pixelRatio),r.capSize=this.capSize[h]*u,this.lineCount[h]&&e.drawArrays(e.LINES,this.lineOffset[h],this.lineCount[h]);this.vao.unbind()};var u=function(){for(var t=new Array(3),e=0;e<3;++e){for(var r=[],n=1;n<=2;++n)for(var i=-1;i<=1;i+=2){var a=[0,0,0];a[(n+e)%3]=i,r.push(a)}t[e]=r}return t}();function h(t,e,r,n){for(var i=u[n],a=0;a0&&((p=u.slice())[s]+=d[1][s],i.push(u[0],u[1],u[2],m[0],m[1],m[2],m[3],0,0,0,p[0],p[1],p[2],m[0],m[1],m[2],m[3],0,0,0),c(this.bounds,p),o+=2+h(i,p,m,s))}this.lineCount[s]=o-this.lineOffset[s]}this.buffer.update(i)}},l.dispose=function(){this.shader.dispose(),this.buffer.dispose(),this.vao.dispose()}},3436:function(t,e,r){\"use strict\";var n=r(3236),i=r(9405),a=n([\"precision highp float;\\n#define GLSLIFY 1\\n\\nattribute vec3 position, offset;\\nattribute vec4 color;\\nuniform mat4 model, view, projection;\\nuniform float capSize;\\nvarying vec4 fragColor;\\nvarying vec3 fragPosition;\\n\\nvoid main() {\\n vec4 worldPosition = model * vec4(position, 1.0);\\n worldPosition = (worldPosition / worldPosition.w) + vec4(capSize * offset, 0.0);\\n gl_Position = projection * (view * worldPosition);\\n fragColor = color;\\n fragPosition = position;\\n}\"]),o=n([\"precision highp float;\\n#define GLSLIFY 1\\n\\nbool outOfRange(float a, float b, float p) {\\n return ((p > max(a, b)) || \\n (p < min(a, b)));\\n}\\n\\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y));\\n}\\n\\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y) ||\\n outOfRange(a.z, b.z, p.z));\\n}\\n\\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\\n return outOfRange(a.xyz, b.xyz, p.xyz);\\n}\\n\\nuniform vec3 clipBounds[2];\\nuniform float opacity;\\nvarying vec3 fragPosition;\\nvarying vec4 fragColor;\\n\\nvoid main() {\\n if (\\n outOfRange(clipBounds[0], clipBounds[1], fragPosition) ||\\n fragColor.a * opacity == 0.\\n ) discard;\\n\\n gl_FragColor = opacity * fragColor;\\n}\"]);t.exports=function(t){return i(t,a,o,null,[{name:\"position\",type:\"vec3\"},{name:\"color\",type:\"vec4\"},{name:\"offset\",type:\"vec3\"}])}},2260:function(t,e,r){\"use strict\";var n=r(7766);t.exports=function(t,e,r,n){i||(i=t.FRAMEBUFFER_UNSUPPORTED,a=t.FRAMEBUFFER_INCOMPLETE_ATTACHMENT,o=t.FRAMEBUFFER_INCOMPLETE_DIMENSIONS,s=t.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT);var c=t.getExtension(\"WEBGL_draw_buffers\");if(!l&&c&&function(t,e){var r=t.getParameter(e.MAX_COLOR_ATTACHMENTS_WEBGL);l=new Array(r+1);for(var n=0;n<=r;++n){for(var i=new Array(r),a=0;au||r<0||r>u)throw new Error(\"gl-fbo: Parameters are too large for FBO\");var h=1;if(\"color\"in(n=n||{})){if((h=Math.max(0|n.color,0))<0)throw new Error(\"gl-fbo: Must specify a nonnegative number of colors\");if(h>1){if(!c)throw new Error(\"gl-fbo: Multiple draw buffer extension not supported\");if(h>t.getParameter(c.MAX_COLOR_ATTACHMENTS_WEBGL))throw new Error(\"gl-fbo: Context does not support \"+h+\" draw buffers\")}}var f=t.UNSIGNED_BYTE,p=t.getExtension(\"OES_texture_float\");if(n.float&&h>0){if(!p)throw new Error(\"gl-fbo: Context does not support floating point textures\");f=t.FLOAT}else n.preferFloat&&h>0&&p&&(f=t.FLOAT);var m=!0;\"depth\"in n&&(m=!!n.depth);var g=!1;return\"stencil\"in n&&(g=!!n.stencil),new d(t,e,r,f,h,m,g,c)};var i,a,o,s,l=null;function c(t){return[t.getParameter(t.FRAMEBUFFER_BINDING),t.getParameter(t.RENDERBUFFER_BINDING),t.getParameter(t.TEXTURE_BINDING_2D)]}function u(t,e){t.bindFramebuffer(t.FRAMEBUFFER,e[0]),t.bindRenderbuffer(t.RENDERBUFFER,e[1]),t.bindTexture(t.TEXTURE_2D,e[2])}function h(t){switch(t){case i:throw new Error(\"gl-fbo: Framebuffer unsupported\");case a:throw new Error(\"gl-fbo: Framebuffer incomplete attachment\");case o:throw new Error(\"gl-fbo: Framebuffer incomplete dimensions\");case s:throw new Error(\"gl-fbo: Framebuffer incomplete missing attachment\");default:throw new Error(\"gl-fbo: Framebuffer failed for unspecified reason\")}}function f(t,e,r,i,a,o){if(!i)return null;var s=n(t,e,r,a,i);return s.magFilter=t.NEAREST,s.minFilter=t.NEAREST,s.mipSamples=1,s.bind(),t.framebufferTexture2D(t.FRAMEBUFFER,o,t.TEXTURE_2D,s.handle,0),s}function p(t,e,r,n,i){var a=t.createRenderbuffer();return t.bindRenderbuffer(t.RENDERBUFFER,a),t.renderbufferStorage(t.RENDERBUFFER,n,e,r),t.framebufferRenderbuffer(t.FRAMEBUFFER,i,t.RENDERBUFFER,a),a}function d(t,e,r,n,i,a,o,s){this.gl=t,this._shape=[0|e,0|r],this._destroyed=!1,this._ext=s,this.color=new Array(i);for(var d=0;d1&&s.drawBuffersWEBGL(l[o]);var v=r.getExtension(\"WEBGL_depth_texture\");v?d?t.depth=f(r,i,a,v.UNSIGNED_INT_24_8_WEBGL,r.DEPTH_STENCIL,r.DEPTH_STENCIL_ATTACHMENT):m&&(t.depth=f(r,i,a,r.UNSIGNED_SHORT,r.DEPTH_COMPONENT,r.DEPTH_ATTACHMENT)):m&&d?t._depth_rb=p(r,i,a,r.DEPTH_STENCIL,r.DEPTH_STENCIL_ATTACHMENT):m?t._depth_rb=p(r,i,a,r.DEPTH_COMPONENT16,r.DEPTH_ATTACHMENT):d&&(t._depth_rb=p(r,i,a,r.STENCIL_INDEX,r.STENCIL_ATTACHMENT));var x=r.checkFramebufferStatus(r.FRAMEBUFFER);if(x!==r.FRAMEBUFFER_COMPLETE){for(t._destroyed=!0,r.bindFramebuffer(r.FRAMEBUFFER,null),r.deleteFramebuffer(t.handle),t.handle=null,t.depth&&(t.depth.dispose(),t.depth=null),t._depth_rb&&(r.deleteRenderbuffer(t._depth_rb),t._depth_rb=null),y=0;yi||r<0||r>i)throw new Error(\"gl-fbo: Can't resize FBO, invalid dimensions\");t._shape[0]=e,t._shape[1]=r;for(var a=c(n),o=0;o>8*p&255;this.pickOffset=r,i.bind();var d=i.uniforms;d.viewTransform=t,d.pickOffset=e,d.shape=this.shape;var m=i.attributes;return this.positionBuffer.bind(),m.position.pointer(),this.weightBuffer.bind(),m.weight.pointer(s.UNSIGNED_BYTE,!1),this.idBuffer.bind(),m.pickId.pointer(s.UNSIGNED_BYTE,!1),s.drawArrays(s.TRIANGLES,0,o),r+this.shape[0]*this.shape[1]}}}(),h.pick=function(t,e,r){var n=this.pickOffset,i=this.shape[0]*this.shape[1];if(r=n+i)return null;var a=r-n,o=this.xData,s=this.yData;return{object:this,pointId:a,dataCoord:[o[a%this.shape[0]],s[a/this.shape[0]|0]]}},h.update=function(t){var e=(t=t||{}).shape||[0,0],r=t.x||i(e[0]),o=t.y||i(e[1]),s=t.z||new Float32Array(e[0]*e[1]),l=!1!==t.zsmooth;this.xData=r,this.yData=o;var c,u,h,p,d=t.colorLevels||[0],m=t.colorValues||[0,0,0,1],g=d.length,y=this.bounds;l?(c=y[0]=r[0],u=y[1]=o[0],h=y[2]=r[r.length-1],p=y[3]=o[o.length-1]):(c=y[0]=r[0]+(r[1]-r[0])/2,u=y[1]=o[0]+(o[1]-o[0])/2,h=y[2]=r[r.length-1]+(r[r.length-1]-r[r.length-2])/2,p=y[3]=o[o.length-1]+(o[o.length-1]-o[o.length-2])/2);var v=1/(h-c),x=1/(p-u),_=e[0],b=e[1];this.shape=[_,b];var w=(l?(_-1)*(b-1):_*b)*(f.length>>>1);this.numVertices=w;for(var T=a.mallocUint8(4*w),k=a.mallocFloat32(2*w),A=a.mallocUint8(2*w),M=a.mallocUint32(w),S=0,E=l?_-1:_,C=l?b-1:b,L=0;L max(a, b)) || \\n (p < min(a, b)));\\n}\\n\\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y));\\n}\\n\\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y) ||\\n outOfRange(a.z, b.z, p.z));\\n}\\n\\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\\n return outOfRange(a.xyz, b.xyz, p.xyz);\\n}\\n\\nuniform vec3 clipBounds[2];\\nuniform sampler2D dashTexture;\\nuniform float dashScale;\\nuniform float opacity;\\n\\nvarying vec3 worldPosition;\\nvarying float pixelArcLength;\\nvarying vec4 fragColor;\\n\\nvoid main() {\\n if (\\n outOfRange(clipBounds[0], clipBounds[1], worldPosition) ||\\n fragColor.a * opacity == 0.\\n ) discard;\\n\\n float dashWeight = texture2D(dashTexture, vec2(dashScale * pixelArcLength, 0)).r;\\n if(dashWeight < 0.5) {\\n discard;\\n }\\n gl_FragColor = fragColor * opacity;\\n}\\n\"]),s=n([\"precision highp float;\\n#define GLSLIFY 1\\n\\n#define FLOAT_MAX 1.70141184e38\\n#define FLOAT_MIN 1.17549435e-38\\n\\n// https://github.com/mikolalysenko/glsl-read-float/blob/master/index.glsl\\nvec4 packFloat(float v) {\\n float av = abs(v);\\n\\n //Handle special cases\\n if(av < FLOAT_MIN) {\\n return vec4(0.0, 0.0, 0.0, 0.0);\\n } else if(v > FLOAT_MAX) {\\n return vec4(127.0, 128.0, 0.0, 0.0) / 255.0;\\n } else if(v < -FLOAT_MAX) {\\n return vec4(255.0, 128.0, 0.0, 0.0) / 255.0;\\n }\\n\\n vec4 c = vec4(0,0,0,0);\\n\\n //Compute exponent and mantissa\\n float e = floor(log2(av));\\n float m = av * pow(2.0, -e) - 1.0;\\n\\n //Unpack mantissa\\n c[1] = floor(128.0 * m);\\n m -= c[1] / 128.0;\\n c[2] = floor(32768.0 * m);\\n m -= c[2] / 32768.0;\\n c[3] = floor(8388608.0 * m);\\n\\n //Unpack exponent\\n float ebias = e + 127.0;\\n c[0] = floor(ebias / 2.0);\\n ebias -= c[0] * 2.0;\\n c[1] += floor(ebias) * 128.0;\\n\\n //Unpack sign bit\\n c[0] += 128.0 * step(0.0, -v);\\n\\n //Scale back to range\\n return c / 255.0;\\n}\\n\\nbool outOfRange(float a, float b, float p) {\\n return ((p > max(a, b)) || \\n (p < min(a, b)));\\n}\\n\\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y));\\n}\\n\\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y) ||\\n outOfRange(a.z, b.z, p.z));\\n}\\n\\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\\n return outOfRange(a.xyz, b.xyz, p.xyz);\\n}\\n\\nuniform float pickId;\\nuniform vec3 clipBounds[2];\\n\\nvarying vec3 worldPosition;\\nvarying float pixelArcLength;\\nvarying vec4 fragColor;\\n\\nvoid main() {\\n if (outOfRange(clipBounds[0], clipBounds[1], worldPosition)) discard;\\n\\n gl_FragColor = vec4(pickId/255.0, packFloat(pixelArcLength).xyz);\\n}\"]),l=[{name:\"position\",type:\"vec3\"},{name:\"nextPosition\",type:\"vec3\"},{name:\"arcLength\",type:\"float\"},{name:\"lineWidth\",type:\"float\"},{name:\"color\",type:\"vec4\"}];e.createShader=function(t){return i(t,a,o,null,l)},e.createPickShader=function(t){return i(t,a,s,null,l)}},5714:function(t,e,r){\"use strict\";t.exports=function(t){var e=t.gl||t.scene&&t.scene.gl,r=h(e);r.attributes.position.location=0,r.attributes.nextPosition.location=1,r.attributes.arcLength.location=2,r.attributes.lineWidth.location=3,r.attributes.color.location=4;var o=f(e);o.attributes.position.location=0,o.attributes.nextPosition.location=1,o.attributes.arcLength.location=2,o.attributes.lineWidth.location=3,o.attributes.color.location=4;for(var s=n(e),l=i(e,[{buffer:s,size:3,offset:0,stride:48},{buffer:s,size:3,offset:12,stride:48},{buffer:s,size:1,offset:24,stride:48},{buffer:s,size:1,offset:28,stride:48},{buffer:s,size:4,offset:32,stride:48}]),u=c(new Array(1024),[256,1,4]),p=0;p<1024;++p)u.data[p]=255;var d=a(e,u);d.wrap=e.REPEAT;var m=new y(e,r,o,s,l,d);return m.update(t),m};var n=r(2762),i=r(8116),a=r(7766),o=new Uint8Array(4),s=new Float32Array(o.buffer),l=r(2478),c=r(9618),u=r(7319),h=u.createShader,f=u.createPickShader,p=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];function d(t,e){for(var r=0,n=0;n<3;++n){var i=t[n]-e[n];r+=i*i}return Math.sqrt(r)}function m(t){for(var e=[[-1e6,-1e6,-1e6],[1e6,1e6,1e6]],r=0;r<3;++r)e[0][r]=Math.max(t[0][r],e[0][r]),e[1][r]=Math.min(t[1][r],e[1][r]);return e}function g(t,e,r,n){this.arcLength=t,this.position=e,this.index=r,this.dataCoordinate=n}function y(t,e,r,n,i,a){this.gl=t,this.shader=e,this.pickShader=r,this.buffer=n,this.vao=i,this.clipBounds=[[-1/0,-1/0,-1/0],[1/0,1/0,1/0]],this.points=[],this.arcLength=[],this.vertexCount=0,this.bounds=[[0,0,0],[0,0,0]],this.pickId=0,this.lineWidth=1,this.texture=a,this.dashScale=1,this.opacity=1,this.hasAlpha=!1,this.dirty=!0,this.pixelRatio=1}var v=y.prototype;v.isTransparent=function(){return this.hasAlpha},v.isOpaque=function(){return!this.hasAlpha},v.pickSlots=1,v.setPickBase=function(t){this.pickId=t},v.drawTransparent=v.draw=function(t){if(this.vertexCount){var e=this.gl,r=this.shader,n=this.vao;r.bind(),r.uniforms={model:t.model||p,view:t.view||p,projection:t.projection||p,clipBounds:m(this.clipBounds),dashTexture:this.texture.bind(),dashScale:this.dashScale/this.arcLength[this.arcLength.length-1],opacity:this.opacity,screenShape:[e.drawingBufferWidth,e.drawingBufferHeight],pixelRatio:this.pixelRatio},n.bind(),n.draw(e.TRIANGLE_STRIP,this.vertexCount),n.unbind()}},v.drawPick=function(t){if(this.vertexCount){var e=this.gl,r=this.pickShader,n=this.vao;r.bind(),r.uniforms={model:t.model||p,view:t.view||p,projection:t.projection||p,pickId:this.pickId,clipBounds:m(this.clipBounds),screenShape:[e.drawingBufferWidth,e.drawingBufferHeight],pixelRatio:this.pixelRatio},n.bind(),n.draw(e.TRIANGLE_STRIP,this.vertexCount),n.unbind()}},v.update=function(t){var e,r;this.dirty=!0;var n=!!t.connectGaps;\"dashScale\"in t&&(this.dashScale=t.dashScale),this.hasAlpha=!1,\"opacity\"in t&&(this.opacity=+t.opacity,this.opacity<1&&(this.hasAlpha=!0));var i=[],a=[],o=[],s=0,u=0,h=[[1/0,1/0,1/0],[-1/0,-1/0,-1/0]],f=t.position||t.positions;if(f){var p=t.color||t.colors||[0,0,0,1],m=t.lineWidth||1,g=!1;t:for(e=1;e0){for(var w=0;w<24;++w)i.push(i[i.length-12]);u+=2,g=!0}continue t}h[0][r]=Math.min(h[0][r],_[r],b[r]),h[1][r]=Math.max(h[1][r],_[r],b[r])}Array.isArray(p[0])?(y=p.length>e-1?p[e-1]:p.length>0?p[p.length-1]:[0,0,0,1],v=p.length>e?p[e]:p.length>0?p[p.length-1]:[0,0,0,1]):y=v=p,3===y.length&&(y=[y[0],y[1],y[2],1]),3===v.length&&(v=[v[0],v[1],v[2],1]),!this.hasAlpha&&y[3]<1&&(this.hasAlpha=!0),x=Array.isArray(m)?m.length>e-1?m[e-1]:m.length>0?m[m.length-1]:[0,0,0,1]:m;var T=s;if(s+=d(_,b),g){for(r=0;r<2;++r)i.push(_[0],_[1],_[2],b[0],b[1],b[2],T,x,y[0],y[1],y[2],y[3]);u+=2,g=!1}i.push(_[0],_[1],_[2],b[0],b[1],b[2],T,x,y[0],y[1],y[2],y[3],_[0],_[1],_[2],b[0],b[1],b[2],T,-x,y[0],y[1],y[2],y[3],b[0],b[1],b[2],_[0],_[1],_[2],s,-x,v[0],v[1],v[2],v[3],b[0],b[1],b[2],_[0],_[1],_[2],s,x,v[0],v[1],v[2],v[3]),u+=4}}if(this.buffer.update(i),a.push(s),o.push(f[f.length-1].slice()),this.bounds=h,this.vertexCount=u,this.points=o,this.arcLength=a,\"dashes\"in t){var k=t.dashes.slice();for(k.unshift(0),e=1;e1.0001)return null;y+=g[h]}return Math.abs(y-1)>.001?null:[f,s(t,g),g]}},840:function(t,e,r){var n=r(3236),i=n([\"precision highp float;\\n#define GLSLIFY 1\\n\\nattribute vec3 position, normal;\\nattribute vec4 color;\\nattribute vec2 uv;\\n\\nuniform mat4 model\\n , view\\n , projection\\n , inverseModel;\\nuniform vec3 eyePosition\\n , lightPosition;\\n\\nvarying vec3 f_normal\\n , f_lightDirection\\n , f_eyeDirection\\n , f_data;\\nvarying vec4 f_color;\\nvarying vec2 f_uv;\\n\\nvec4 project(vec3 p) {\\n return projection * (view * (model * vec4(p, 1.0)));\\n}\\n\\nvoid main() {\\n gl_Position = project(position);\\n\\n //Lighting geometry parameters\\n vec4 cameraCoordinate = view * vec4(position , 1.0);\\n cameraCoordinate.xyz /= cameraCoordinate.w;\\n f_lightDirection = lightPosition - cameraCoordinate.xyz;\\n f_eyeDirection = eyePosition - cameraCoordinate.xyz;\\n f_normal = normalize((vec4(normal, 0.0) * inverseModel).xyz);\\n\\n f_color = color;\\n f_data = position;\\n f_uv = uv;\\n}\\n\"]),a=n([\"#extension GL_OES_standard_derivatives : enable\\n\\nprecision highp float;\\n#define GLSLIFY 1\\n\\nfloat beckmannDistribution(float x, float roughness) {\\n float NdotH = max(x, 0.0001);\\n float cos2Alpha = NdotH * NdotH;\\n float tan2Alpha = (cos2Alpha - 1.0) / cos2Alpha;\\n float roughness2 = roughness * roughness;\\n float denom = 3.141592653589793 * roughness2 * cos2Alpha * cos2Alpha;\\n return exp(tan2Alpha / roughness2) / denom;\\n}\\n\\nfloat cookTorranceSpecular(\\n vec3 lightDirection,\\n vec3 viewDirection,\\n vec3 surfaceNormal,\\n float roughness,\\n float fresnel) {\\n\\n float VdotN = max(dot(viewDirection, surfaceNormal), 0.0);\\n float LdotN = max(dot(lightDirection, surfaceNormal), 0.0);\\n\\n //Half angle vector\\n vec3 H = normalize(lightDirection + viewDirection);\\n\\n //Geometric term\\n float NdotH = max(dot(surfaceNormal, H), 0.0);\\n float VdotH = max(dot(viewDirection, H), 0.000001);\\n float LdotH = max(dot(lightDirection, H), 0.000001);\\n float G1 = (2.0 * NdotH * VdotN) / VdotH;\\n float G2 = (2.0 * NdotH * LdotN) / LdotH;\\n float G = min(1.0, min(G1, G2));\\n \\n //Distribution term\\n float D = beckmannDistribution(NdotH, roughness);\\n\\n //Fresnel term\\n float F = pow(1.0 - VdotN, fresnel);\\n\\n //Multiply terms and done\\n return G * F * D / max(3.14159265 * VdotN, 0.000001);\\n}\\n\\n//#pragma glslify: beckmann = require(glsl-specular-beckmann) // used in gl-surface3d\\n\\nbool outOfRange(float a, float b, float p) {\\n return ((p > max(a, b)) || \\n (p < min(a, b)));\\n}\\n\\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y));\\n}\\n\\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y) ||\\n outOfRange(a.z, b.z, p.z));\\n}\\n\\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\\n return outOfRange(a.xyz, b.xyz, p.xyz);\\n}\\n\\nuniform vec3 clipBounds[2];\\nuniform float roughness\\n , fresnel\\n , kambient\\n , kdiffuse\\n , kspecular;\\nuniform sampler2D texture;\\n\\nvarying vec3 f_normal\\n , f_lightDirection\\n , f_eyeDirection\\n , f_data;\\nvarying vec4 f_color;\\nvarying vec2 f_uv;\\n\\nvoid main() {\\n if (f_color.a == 0.0 ||\\n outOfRange(clipBounds[0], clipBounds[1], f_data)\\n ) discard;\\n\\n vec3 N = normalize(f_normal);\\n vec3 L = normalize(f_lightDirection);\\n vec3 V = normalize(f_eyeDirection);\\n\\n if(gl_FrontFacing) {\\n N = -N;\\n }\\n\\n float specular = min(1.0, max(0.0, cookTorranceSpecular(L, V, N, roughness, fresnel)));\\n //float specular = max(0.0, beckmann(L, V, N, roughness)); // used in gl-surface3d\\n\\n float diffuse = min(kambient + kdiffuse * max(dot(N, L), 0.0), 1.0);\\n\\n vec4 surfaceColor = vec4(f_color.rgb, 1.0) * texture2D(texture, f_uv);\\n vec4 litColor = surfaceColor.a * vec4(diffuse * surfaceColor.rgb + kspecular * vec3(1,1,1) * specular, 1.0);\\n\\n gl_FragColor = litColor * f_color.a;\\n}\\n\"]),o=n([\"precision highp float;\\n#define GLSLIFY 1\\n\\nattribute vec3 position;\\nattribute vec4 color;\\nattribute vec2 uv;\\n\\nuniform mat4 model, view, projection;\\n\\nvarying vec4 f_color;\\nvarying vec3 f_data;\\nvarying vec2 f_uv;\\n\\nvoid main() {\\n gl_Position = projection * (view * (model * vec4(position, 1.0)));\\n f_color = color;\\n f_data = position;\\n f_uv = uv;\\n}\"]),s=n([\"precision highp float;\\n#define GLSLIFY 1\\n\\nbool outOfRange(float a, float b, float p) {\\n return ((p > max(a, b)) || \\n (p < min(a, b)));\\n}\\n\\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y));\\n}\\n\\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y) ||\\n outOfRange(a.z, b.z, p.z));\\n}\\n\\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\\n return outOfRange(a.xyz, b.xyz, p.xyz);\\n}\\n\\nuniform vec3 clipBounds[2];\\nuniform sampler2D texture;\\nuniform float opacity;\\n\\nvarying vec4 f_color;\\nvarying vec3 f_data;\\nvarying vec2 f_uv;\\n\\nvoid main() {\\n if (outOfRange(clipBounds[0], clipBounds[1], f_data)) discard;\\n\\n gl_FragColor = f_color * texture2D(texture, f_uv) * opacity;\\n}\"]),l=n([\"precision highp float;\\n#define GLSLIFY 1\\n\\nbool outOfRange(float a, float b, float p) {\\n return ((p > max(a, b)) || \\n (p < min(a, b)));\\n}\\n\\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y));\\n}\\n\\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y) ||\\n outOfRange(a.z, b.z, p.z));\\n}\\n\\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\\n return outOfRange(a.xyz, b.xyz, p.xyz);\\n}\\n\\nattribute vec3 position;\\nattribute vec4 color;\\nattribute vec2 uv;\\nattribute float pointSize;\\n\\nuniform mat4 model, view, projection;\\nuniform vec3 clipBounds[2];\\n\\nvarying vec4 f_color;\\nvarying vec2 f_uv;\\n\\nvoid main() {\\n if (outOfRange(clipBounds[0], clipBounds[1], position)) {\\n\\n gl_Position = vec4(0.0, 0.0 ,0.0 ,0.0);\\n } else {\\n gl_Position = projection * (view * (model * vec4(position, 1.0)));\\n }\\n gl_PointSize = pointSize;\\n f_color = color;\\n f_uv = uv;\\n}\"]),c=n([\"precision highp float;\\n#define GLSLIFY 1\\n\\nuniform sampler2D texture;\\nuniform float opacity;\\n\\nvarying vec4 f_color;\\nvarying vec2 f_uv;\\n\\nvoid main() {\\n vec2 pointR = gl_PointCoord.xy - vec2(0.5, 0.5);\\n if(dot(pointR, pointR) > 0.25) {\\n discard;\\n }\\n gl_FragColor = f_color * texture2D(texture, f_uv) * opacity;\\n}\"]),u=n([\"precision highp float;\\n#define GLSLIFY 1\\n\\nattribute vec3 position;\\nattribute vec4 id;\\n\\nuniform mat4 model, view, projection;\\n\\nvarying vec3 f_position;\\nvarying vec4 f_id;\\n\\nvoid main() {\\n gl_Position = projection * (view * (model * vec4(position, 1.0)));\\n f_id = id;\\n f_position = position;\\n}\"]),h=n([\"precision highp float;\\n#define GLSLIFY 1\\n\\nbool outOfRange(float a, float b, float p) {\\n return ((p > max(a, b)) || \\n (p < min(a, b)));\\n}\\n\\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y));\\n}\\n\\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y) ||\\n outOfRange(a.z, b.z, p.z));\\n}\\n\\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\\n return outOfRange(a.xyz, b.xyz, p.xyz);\\n}\\n\\nuniform vec3 clipBounds[2];\\nuniform float pickId;\\n\\nvarying vec3 f_position;\\nvarying vec4 f_id;\\n\\nvoid main() {\\n if (outOfRange(clipBounds[0], clipBounds[1], f_position)) discard;\\n\\n gl_FragColor = vec4(pickId, f_id.xyz);\\n}\"]),f=n([\"precision highp float;\\n#define GLSLIFY 1\\n\\nbool outOfRange(float a, float b, float p) {\\n return ((p > max(a, b)) || \\n (p < min(a, b)));\\n}\\n\\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y));\\n}\\n\\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y) ||\\n outOfRange(a.z, b.z, p.z));\\n}\\n\\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\\n return outOfRange(a.xyz, b.xyz, p.xyz);\\n}\\n\\nattribute vec3 position;\\nattribute float pointSize;\\nattribute vec4 id;\\n\\nuniform mat4 model, view, projection;\\nuniform vec3 clipBounds[2];\\n\\nvarying vec3 f_position;\\nvarying vec4 f_id;\\n\\nvoid main() {\\n if (outOfRange(clipBounds[0], clipBounds[1], position)) {\\n\\n gl_Position = vec4(0.0, 0.0, 0.0, 0.0);\\n } else {\\n gl_Position = projection * (view * (model * vec4(position, 1.0)));\\n gl_PointSize = pointSize;\\n }\\n f_id = id;\\n f_position = position;\\n}\"]),p=n([\"precision highp float;\\n#define GLSLIFY 1\\n\\nattribute vec3 position;\\n\\nuniform mat4 model, view, projection;\\n\\nvoid main() {\\n gl_Position = projection * (view * (model * vec4(position, 1.0)));\\n}\"]),d=n([\"precision highp float;\\n#define GLSLIFY 1\\n\\nuniform vec3 contourColor;\\n\\nvoid main() {\\n gl_FragColor = vec4(contourColor, 1.0);\\n}\\n\"]);e.meshShader={vertex:i,fragment:a,attributes:[{name:\"position\",type:\"vec3\"},{name:\"normal\",type:\"vec3\"},{name:\"color\",type:\"vec4\"},{name:\"uv\",type:\"vec2\"}]},e.wireShader={vertex:o,fragment:s,attributes:[{name:\"position\",type:\"vec3\"},{name:\"color\",type:\"vec4\"},{name:\"uv\",type:\"vec2\"}]},e.pointShader={vertex:l,fragment:c,attributes:[{name:\"position\",type:\"vec3\"},{name:\"color\",type:\"vec4\"},{name:\"uv\",type:\"vec2\"},{name:\"pointSize\",type:\"float\"}]},e.pickShader={vertex:u,fragment:h,attributes:[{name:\"position\",type:\"vec3\"},{name:\"id\",type:\"vec4\"}]},e.pointPickShader={vertex:f,fragment:h,attributes:[{name:\"position\",type:\"vec3\"},{name:\"pointSize\",type:\"float\"},{name:\"id\",type:\"vec4\"}]},e.contourShader={vertex:p,fragment:d,attributes:[{name:\"position\",type:\"vec3\"}]}},7201:function(t,e,r){\"use strict\";var n=r(9405),i=r(2762),a=r(8116),o=r(7766),s=r(8406),l=r(6760),c=r(7608),u=r(9618),h=r(6729),f=r(7765),p=r(1888),d=r(840),m=r(7626),g=d.meshShader,y=d.wireShader,v=d.pointShader,x=d.pickShader,_=d.pointPickShader,b=d.contourShader,w=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];function T(t,e,r,n,i,a,o,s,l,c,u,h,f,p,d,m,g,y,v,x,_,b,T,k,A,M,S){this.gl=t,this.pixelRatio=1,this.cells=[],this.positions=[],this.intensity=[],this.texture=e,this.dirty=!0,this.triShader=r,this.lineShader=n,this.pointShader=i,this.pickShader=a,this.pointPickShader=o,this.contourShader=s,this.trianglePositions=l,this.triangleColors=u,this.triangleNormals=f,this.triangleUVs=h,this.triangleIds=c,this.triangleVAO=p,this.triangleCount=0,this.lineWidth=1,this.edgePositions=d,this.edgeColors=g,this.edgeUVs=y,this.edgeIds=m,this.edgeVAO=v,this.edgeCount=0,this.pointPositions=x,this.pointColors=b,this.pointUVs=T,this.pointSizes=k,this.pointIds=_,this.pointVAO=A,this.pointCount=0,this.contourLineWidth=1,this.contourPositions=M,this.contourVAO=S,this.contourCount=0,this.contourColor=[0,0,0],this.contourEnable=!0,this.pickVertex=!0,this.pickId=1,this.bounds=[[1/0,1/0,1/0],[-1/0,-1/0,-1/0]],this.clipBounds=[[-1/0,-1/0,-1/0],[1/0,1/0,1/0]],this.lightPosition=[1e5,1e5,0],this.ambientLight=.8,this.diffuseLight=.8,this.specularLight=2,this.roughness=.5,this.fresnel=1.5,this.opacity=1,this.hasAlpha=!1,this.opacityscale=!1,this._model=w,this._view=w,this._projection=w,this._resolution=[1,1]}var k=T.prototype;function A(t,e){if(!e)return 1;if(!e.length)return 1;for(var r=0;rt&&r>0){var n=(e[r][0]-t)/(e[r][0]-e[r-1][0]);return e[r][1]*(1-n)+n*e[r-1][1]}}return 1}function M(t){var e=n(t,v.vertex,v.fragment);return e.attributes.position.location=0,e.attributes.color.location=2,e.attributes.uv.location=3,e.attributes.pointSize.location=4,e}function S(t){var e=n(t,x.vertex,x.fragment);return e.attributes.position.location=0,e.attributes.id.location=1,e}function E(t){var e=n(t,_.vertex,_.fragment);return e.attributes.position.location=0,e.attributes.id.location=1,e.attributes.pointSize.location=4,e}function C(t){var e=n(t,b.vertex,b.fragment);return e.attributes.position.location=0,e}k.isOpaque=function(){return!this.hasAlpha},k.isTransparent=function(){return this.hasAlpha},k.pickSlots=1,k.setPickBase=function(t){this.pickId=t},k.highlight=function(t){if(t&&this.contourEnable){for(var e=f(this.cells,this.intensity,t.intensity),r=e.cells,n=e.vertexIds,i=e.vertexWeights,a=r.length,o=p.mallocFloat32(6*a),s=0,l=0;l0&&((h=this.triShader).bind(),h.uniforms=s,this.triangleVAO.bind(),e.drawArrays(e.TRIANGLES,0,3*this.triangleCount),this.triangleVAO.unbind()),this.edgeCount>0&&this.lineWidth>0&&((h=this.lineShader).bind(),h.uniforms=s,this.edgeVAO.bind(),e.lineWidth(this.lineWidth*this.pixelRatio),e.drawArrays(e.LINES,0,2*this.edgeCount),this.edgeVAO.unbind()),this.pointCount>0&&((h=this.pointShader).bind(),h.uniforms=s,this.pointVAO.bind(),e.drawArrays(e.POINTS,0,this.pointCount),this.pointVAO.unbind()),this.contourEnable&&this.contourCount>0&&this.contourLineWidth>0&&((h=this.contourShader).bind(),h.uniforms=s,this.contourVAO.bind(),e.drawArrays(e.LINES,0,this.contourCount),this.contourVAO.unbind())},k.drawPick=function(t){t=t||{};for(var e=this.gl,r=t.model||w,n=t.view||w,i=t.projection||w,a=[[-1e6,-1e6,-1e6],[1e6,1e6,1e6]],o=0;o<3;++o)a[0][o]=Math.max(a[0][o],this.clipBounds[0][o]),a[1][o]=Math.min(a[1][o],this.clipBounds[1][o]);this._model=[].slice.call(r),this._view=[].slice.call(n),this._projection=[].slice.call(i),this._resolution=[e.drawingBufferWidth,e.drawingBufferHeight];var s,l={model:r,view:n,projection:i,clipBounds:a,pickId:this.pickId/255};(s=this.pickShader).bind(),s.uniforms=l,this.triangleCount>0&&(this.triangleVAO.bind(),e.drawArrays(e.TRIANGLES,0,3*this.triangleCount),this.triangleVAO.unbind()),this.edgeCount>0&&(this.edgeVAO.bind(),e.lineWidth(this.lineWidth*this.pixelRatio),e.drawArrays(e.LINES,0,2*this.edgeCount),this.edgeVAO.unbind()),this.pointCount>0&&((s=this.pointPickShader).bind(),s.uniforms=l,this.pointVAO.bind(),e.drawArrays(e.POINTS,0,this.pointCount),this.pointVAO.unbind())},k.pick=function(t){if(!t)return null;if(t.id!==this.pickId)return null;for(var e=t.value[0]+256*t.value[1]+65536*t.value[2],r=this.cells[e],n=this.positions,i=new Array(r.length),a=0;ai[k]&&(r.uniforms.dataAxis=c,r.uniforms.screenOffset=u,r.uniforms.color=g[t],r.uniforms.angle=y[t],a.drawArrays(a.TRIANGLES,i[k],i[A]-i[k]))),v[t]&&T&&(u[1^t]-=M*p*x[t],r.uniforms.dataAxis=h,r.uniforms.screenOffset=u,r.uniforms.color=_[t],r.uniforms.angle=b[t],a.drawArrays(a.TRIANGLES,w,T)),u[1^t]=M*s[2+(1^t)]-1,d[t+2]&&(u[1^t]+=M*p*m[t+2],ki[k]&&(r.uniforms.dataAxis=c,r.uniforms.screenOffset=u,r.uniforms.color=g[t+2],r.uniforms.angle=y[t+2],a.drawArrays(a.TRIANGLES,i[k],i[A]-i[k]))),v[t+2]&&T&&(u[1^t]+=M*p*x[t+2],r.uniforms.dataAxis=h,r.uniforms.screenOffset=u,r.uniforms.color=_[t+2],r.uniforms.angle=b[t+2],a.drawArrays(a.TRIANGLES,w,T))}),m.drawTitle=function(){var t=[0,0],e=[0,0];return function(){var r=this.plot,n=this.shader,i=r.gl,a=r.screenBox,o=r.titleCenter,s=r.titleAngle,l=r.titleColor,c=r.pixelRatio;if(this.titleCount){for(var u=0;u<2;++u)e[u]=2*(o[u]*c-a[u])/(a[2+u]-a[u])-1;n.bind(),n.uniforms.dataAxis=t,n.uniforms.screenOffset=e,n.uniforms.angle=s,n.uniforms.color=l,i.drawArrays(i.TRIANGLES,this.titleOffset,this.titleCount)}}}(),m.bind=(f=[0,0],p=[0,0],d=[0,0],function(){var t=this.plot,e=this.shader,r=t._tickBounds,n=t.dataBox,i=t.screenBox,a=t.viewBox;e.bind();for(var o=0;o<2;++o){var s=r[o],l=r[o+2]-s,c=.5*(n[o+2]+n[o]),u=n[o+2]-n[o],h=a[o],m=a[o+2]-h,g=i[o],y=i[o+2]-g;p[o]=2*l/u*m/y,f[o]=2*(s-c)/u*m/y}d[1]=2*t.pixelRatio/(i[3]-i[1]),d[0]=d[1]*(i[3]-i[1])/(i[2]-i[0]),e.uniforms.dataScale=p,e.uniforms.dataShift=f,e.uniforms.textScale=d,this.vbo.bind(),e.attributes.textCoordinate.pointer()}),m.update=function(t){var e,r,n,i,o,s=[],l=t.ticks,c=t.bounds;for(o=0;o<2;++o){var u=[Math.floor(s.length/3)],h=[-1/0],f=l[o];for(e=0;e=0){var m=e[d]-n[d]*(e[d+2]-e[d])/(n[d+2]-n[d]);0===d?o.drawLine(m,e[1],m,e[3],p[d],f[d]):o.drawLine(e[0],m,e[2],m,p[d],f[d])}}for(d=0;d=0;--t)this.objects[t].dispose();for(this.objects.length=0,t=this.overlays.length-1;t>=0;--t)this.overlays[t].dispose();this.overlays.length=0,this.gl=null},c.addObject=function(t){this.objects.indexOf(t)<0&&(this.objects.push(t),this.setDirty())},c.removeObject=function(t){for(var e=this.objects,r=0;rMath.abs(e))c.rotate(a,0,0,-t*r*Math.PI*d.rotateSpeed/window.innerWidth);else if(!d._ortho){var o=-d.zoomSpeed*i*e/window.innerHeight*(a-c.lastT())/20;c.pan(a,0,0,h*(Math.exp(o)-1))}}}),!0)},d.enableMouseListeners(),d};var n=r(3025),i=r(6296),a=r(351),o=r(8512),s=r(24),l=r(7520)},799:function(t,e,r){var n=r(3236),i=r(9405),a=n([\"precision mediump float;\\n#define GLSLIFY 1\\nattribute vec2 position;\\nvarying vec2 uv;\\nvoid main() {\\n uv = position;\\n gl_Position = vec4(position, 0, 1);\\n}\"]),o=n([\"precision mediump float;\\n#define GLSLIFY 1\\n\\nuniform sampler2D accumBuffer;\\nvarying vec2 uv;\\n\\nvoid main() {\\n vec4 accum = texture2D(accumBuffer, 0.5 * (uv + 1.0));\\n gl_FragColor = min(vec4(1,1,1,1), accum);\\n}\"]);t.exports=function(t){return i(t,a,o,null,[{name:\"position\",type:\"vec2\"}])}},4100:function(t,e,r){\"use strict\";var n=r(4437),i=r(3837),a=r(5445),o=r(4449),s=r(3589),l=r(2260),c=r(7169),u=r(351),h=r(4772),f=r(4040),p=r(799),d=r(9216)({tablet:!0,featureDetect:!0});function m(){this.mouse=[-1,-1],this.screen=null,this.distance=1/0,this.index=null,this.dataCoordinate=null,this.dataPosition=null,this.object=null,this.data=null}function g(t){var e=Math.round(Math.log(Math.abs(t))/Math.log(10));if(e<0){var r=Math.round(Math.pow(10,-e));return Math.ceil(t*r)/r}return e>0?(r=Math.round(Math.pow(10,e)),Math.ceil(t/r)*r):Math.ceil(t)}function y(t){return\"boolean\"!=typeof t||t}t.exports={createScene:function(t){(t=t||{}).camera=t.camera||{};var e=t.canvas;e||(e=document.createElement(\"canvas\"),t.container?t.container.appendChild(e):document.body.appendChild(e));var r=t.gl;if(r||(t.glOptions&&(d=!!t.glOptions.preserveDrawingBuffer),r=function(t,e){var r=null;try{(r=t.getContext(\"webgl\",e))||(r=t.getContext(\"experimental-webgl\",e))}catch(t){return null}return r}(e,t.glOptions||{premultipliedAlpha:!0,antialias:!0,preserveDrawingBuffer:d})),!r)throw new Error(\"webgl not supported\");var v=t.bounds||[[-10,-10,-10],[10,10,10]],x=new m,_=l(r,r.drawingBufferWidth,r.drawingBufferHeight,{preferFloat:!d}),b=p(r),w=t.cameraObject&&!0===t.cameraObject._ortho||t.camera.projection&&\"orthographic\"===t.camera.projection.type||!1,T={eye:t.camera.eye||[2,0,0],center:t.camera.center||[0,0,0],up:t.camera.up||[0,1,0],zoomMin:t.camera.zoomMax||.1,zoomMax:t.camera.zoomMin||100,mode:t.camera.mode||\"turntable\",_ortho:w},k=t.axes||{},A=i(r,k);A.enable=!k.disable;var M=t.spikes||{},S=o(r,M),E=[],C=[],L=[],I=[],P=!0,z=!0,O={view:null,projection:new Array(16),model:new Array(16),_ortho:!1},D=(z=!0,[r.drawingBufferWidth,r.drawingBufferHeight]),R=t.cameraObject||n(e,T),F={gl:r,contextLost:!1,pixelRatio:t.pixelRatio||1,canvas:e,selection:x,camera:R,axes:A,axesPixels:null,spikes:S,bounds:v,objects:E,shape:D,aspect:t.aspectRatio||[1,1,1],pickRadius:t.pickRadius||10,zNear:t.zNear||.01,zFar:t.zFar||1e3,fovy:t.fovy||Math.PI/4,clearColor:t.clearColor||[0,0,0,0],autoResize:y(t.autoResize),autoBounds:y(t.autoBounds),autoScale:!!t.autoScale,autoCenter:y(t.autoCenter),clipToBounds:y(t.clipToBounds),snapToData:!!t.snapToData,onselect:t.onselect||null,onrender:t.onrender||null,onclick:t.onclick||null,cameraParams:O,oncontextloss:null,mouseListener:null,_stopped:!1,getAspectratio:function(){return{x:this.aspect[0],y:this.aspect[1],z:this.aspect[2]}},setAspectratio:function(t){this.aspect[0]=t.x,this.aspect[1]=t.y,this.aspect[2]=t.z,z=!0},setBounds:function(t,e){this.bounds[0][t]=e.min,this.bounds[1][t]=e.max},setClearColor:function(t){this.clearColor=t},clearRGBA:function(){this.gl.clearColor(this.clearColor[0],this.clearColor[1],this.clearColor[2],this.clearColor[3]),this.gl.clear(this.gl.COLOR_BUFFER_BIT|this.gl.DEPTH_BUFFER_BIT)}},B=[r.drawingBufferWidth/F.pixelRatio|0,r.drawingBufferHeight/F.pixelRatio|0];function N(){if(!F._stopped&&F.autoResize){var t=e.parentNode,r=1,n=1;t&&t!==document.body?(r=t.clientWidth,n=t.clientHeight):(r=window.innerWidth,n=window.innerHeight);var i=0|Math.ceil(r*F.pixelRatio),a=0|Math.ceil(n*F.pixelRatio);if(i!==e.width||a!==e.height){e.width=i,e.height=a;var o=e.style;o.position=o.position||\"absolute\",o.left=\"0px\",o.top=\"0px\",o.width=r+\"px\",o.height=n+\"px\",P=!0}}}function j(){for(var t=E.length,e=I.length,n=0;n0&&0===L[e-1];)L.pop(),I.pop().dispose()}function U(){if(F.contextLost)return!0;r.isContextLost()&&(F.contextLost=!0,F.mouseListener.enabled=!1,F.selection.object=null,F.oncontextloss&&F.oncontextloss())}F.autoResize&&N(),window.addEventListener(\"resize\",N),F.update=function(t){F._stopped||(t=t||{},P=!0,z=!0)},F.add=function(t){F._stopped||(t.axes=A,E.push(t),C.push(-1),P=!0,z=!0,j())},F.remove=function(t){if(!F._stopped){var e=E.indexOf(t);e<0||(E.splice(e,1),C.pop(),P=!0,z=!0,j())}},F.dispose=function(){if(!F._stopped&&(F._stopped=!0,window.removeEventListener(\"resize\",N),e.removeEventListener(\"webglcontextlost\",U),F.mouseListener.enabled=!1,!F.contextLost)){A.dispose(),S.dispose();for(var t=0;tx.distance)continue;for(var c=0;c 1.0) {\\n discard;\\n }\\n baseColor = mix(borderColor, color, step(radius, centerFraction));\\n gl_FragColor = vec4(baseColor.rgb * baseColor.a, baseColor.a);\\n }\\n}\\n\"]),e.pickVertex=n([\"precision mediump float;\\n#define GLSLIFY 1\\n\\nattribute vec2 position;\\nattribute vec4 pickId;\\n\\nuniform mat3 matrix;\\nuniform float pointSize;\\nuniform vec4 pickOffset;\\n\\nvarying vec4 fragId;\\n\\nvoid main() {\\n vec3 hgPosition = matrix * vec3(position, 1);\\n gl_Position = vec4(hgPosition.xy, 0, hgPosition.z);\\n gl_PointSize = pointSize;\\n\\n vec4 id = pickId + pickOffset;\\n id.y += floor(id.x / 256.0);\\n id.x -= floor(id.x / 256.0) * 256.0;\\n\\n id.z += floor(id.y / 256.0);\\n id.y -= floor(id.y / 256.0) * 256.0;\\n\\n id.w += floor(id.z / 256.0);\\n id.z -= floor(id.z / 256.0) * 256.0;\\n\\n fragId = id;\\n}\\n\"]),e.pickFragment=n([\"precision mediump float;\\n#define GLSLIFY 1\\n\\nvarying vec4 fragId;\\n\\nvoid main() {\\n float radius = length(2.0 * gl_PointCoord.xy - 1.0);\\n if(radius > 1.0) {\\n discard;\\n }\\n gl_FragColor = fragId / 255.0;\\n}\\n\"])},4696:function(t,e,r){\"use strict\";var n=r(9405),i=r(2762),a=r(1888),o=r(6640);function s(t,e,r,n,i){this.plot=t,this.offsetBuffer=e,this.pickBuffer=r,this.shader=n,this.pickShader=i,this.sizeMin=.5,this.sizeMinCap=2,this.sizeMax=20,this.areaRatio=1,this.pointCount=0,this.color=[1,0,0,1],this.borderColor=[0,0,0,1],this.blend=!1,this.pickOffset=0,this.points=null}t.exports=function(t,e){var r=t.gl,a=new s(t,i(r),i(r),n(r,o.pointVertex,o.pointFragment),n(r,o.pickVertex,o.pickFragment));return a.update(e),t.addObject(a),a};var l,c,u=s.prototype;u.dispose=function(){this.shader.dispose(),this.pickShader.dispose(),this.offsetBuffer.dispose(),this.pickBuffer.dispose(),this.plot.removeObject(this)},u.update=function(t){var e;function r(e,r){return e in t?t[e]:r}t=t||{},this.sizeMin=r(\"sizeMin\",.5),this.sizeMax=r(\"sizeMax\",20),this.color=r(\"color\",[1,0,0,1]).slice(),this.areaRatio=r(\"areaRatio\",1),this.borderColor=r(\"borderColor\",[0,0,0,1]).slice(),this.blend=r(\"blend\",!1);var n=t.positions.length>>>1,i=t.positions instanceof Float32Array,o=t.idToIndex instanceof Int32Array&&t.idToIndex.length>=n,s=t.positions,l=i?s:a.mallocFloat32(s.length),c=o?t.idToIndex:a.mallocInt32(n);if(i||l.set(s),!o)for(l.set(s),e=0;e>>1;for(r=0;r=e[0]&&a<=e[2]&&o>=e[1]&&o<=e[3]&&n++}return n}(this.points,i),u=this.plot.pickPixelRatio*Math.max(Math.min(this.sizeMinCap,this.sizeMin),Math.min(this.sizeMax,this.sizeMax/Math.pow(s,.33333)));l[0]=2/a,l[4]=2/o,l[6]=-2*i[0]/a-1,l[7]=-2*i[1]/o-1,this.offsetBuffer.bind(),r.bind(),r.attributes.position.pointer(),r.uniforms.matrix=l,r.uniforms.color=this.color,r.uniforms.borderColor=this.borderColor,r.uniforms.pointCloud=u<5,r.uniforms.pointSize=u,r.uniforms.centerFraction=Math.min(1,Math.max(0,Math.sqrt(1-this.areaRatio))),e&&(c[0]=255&t,c[1]=t>>8&255,c[2]=t>>16&255,c[3]=t>>24&255,this.pickBuffer.bind(),r.attributes.pickId.pointer(n.UNSIGNED_BYTE),r.uniforms.pickOffset=c,this.pickOffset=t);var h=n.getParameter(n.BLEND),f=n.getParameter(n.DITHER);return h&&!this.blend&&n.disable(n.BLEND),f&&n.disable(n.DITHER),n.drawArrays(n.POINTS,0,this.pointCount),h&&!this.blend&&n.enable(n.BLEND),f&&n.enable(n.DITHER),t+this.pointCount}),u.draw=u.unifiedDraw,u.drawPick=u.unifiedDraw,u.pick=function(t,e,r){var n=this.pickOffset,i=this.pointCount;if(r=n+i)return null;var a=r-n,o=this.points;return{object:this,pointId:a,dataCoord:[o[2*a],o[2*a+1]]}}},783:function(t){t.exports=function(t,e,r,n){var i,a,o,s,l,c=e[0],u=e[1],h=e[2],f=e[3],p=r[0],d=r[1],m=r[2],g=r[3];return(a=c*p+u*d+h*m+f*g)<0&&(a=-a,p=-p,d=-d,m=-m,g=-g),1-a>1e-6?(i=Math.acos(a),o=Math.sin(i),s=Math.sin((1-n)*i)/o,l=Math.sin(n*i)/o):(s=1-n,l=n),t[0]=s*c+l*p,t[1]=s*u+l*d,t[2]=s*h+l*m,t[3]=s*f+l*g,t}},5964:function(t){\"use strict\";t.exports=function(t){return t||0===t?t.toString():\"\"}},9366:function(t,e,r){\"use strict\";var n=r(4359);t.exports=function(t,e,r){var a=[e.style,e.weight,e.variant,e.family].join(\"_\"),o=i[a];if(o||(o=i[a]={}),t in o)return o[t];var s={textAlign:\"center\",textBaseline:\"middle\",lineHeight:1,font:e.family,fontStyle:e.style,fontWeight:e.weight,fontVariant:e.variant,lineSpacing:1.25,styletags:{breaklines:!0,bolds:!0,italics:!0,subscripts:!0,superscripts:!0},triangles:!0},l=n(t,s);s.triangles=!1;var c,u,h=n(t,s);if(r&&1!==r){for(c=0;c max(a, b)) || \\n (p < min(a, b)));\\n}\\n\\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y));\\n}\\n\\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y) ||\\n outOfRange(a.z, b.z, p.z));\\n}\\n\\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\\n return outOfRange(a.xyz, b.xyz, p.xyz);\\n}\\n\\nattribute vec3 position;\\nattribute vec4 color;\\nattribute vec2 glyph;\\nattribute vec4 id;\\n\\nuniform vec4 highlightId;\\nuniform float highlightScale;\\nuniform mat4 model, view, projection;\\nuniform vec3 clipBounds[2];\\n\\nvarying vec4 interpColor;\\nvarying vec4 pickId;\\nvarying vec3 dataCoordinate;\\n\\nvoid main() {\\n if (outOfRange(clipBounds[0], clipBounds[1], position)) {\\n\\n gl_Position = vec4(0,0,0,0);\\n } else {\\n float scale = 1.0;\\n if(distance(highlightId, id) < 0.0001) {\\n scale = highlightScale;\\n }\\n\\n vec4 worldPosition = model * vec4(position, 1);\\n vec4 viewPosition = view * worldPosition;\\n viewPosition = viewPosition / viewPosition.w;\\n vec4 clipPosition = projection * (viewPosition + scale * vec4(glyph.x, -glyph.y, 0, 0));\\n\\n gl_Position = clipPosition;\\n interpColor = color;\\n pickId = id;\\n dataCoordinate = position;\\n }\\n}\"]),o=i([\"precision highp float;\\n#define GLSLIFY 1\\n\\nbool outOfRange(float a, float b, float p) {\\n return ((p > max(a, b)) || \\n (p < min(a, b)));\\n}\\n\\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y));\\n}\\n\\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y) ||\\n outOfRange(a.z, b.z, p.z));\\n}\\n\\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\\n return outOfRange(a.xyz, b.xyz, p.xyz);\\n}\\n\\nattribute vec3 position;\\nattribute vec4 color;\\nattribute vec2 glyph;\\nattribute vec4 id;\\n\\nuniform mat4 model, view, projection;\\nuniform vec2 screenSize;\\nuniform vec3 clipBounds[2];\\nuniform float highlightScale, pixelRatio;\\nuniform vec4 highlightId;\\n\\nvarying vec4 interpColor;\\nvarying vec4 pickId;\\nvarying vec3 dataCoordinate;\\n\\nvoid main() {\\n if (outOfRange(clipBounds[0], clipBounds[1], position)) {\\n\\n gl_Position = vec4(0,0,0,0);\\n } else {\\n float scale = pixelRatio;\\n if(distance(highlightId.bgr, id.bgr) < 0.001) {\\n scale *= highlightScale;\\n }\\n\\n vec4 worldPosition = model * vec4(position, 1.0);\\n vec4 viewPosition = view * worldPosition;\\n vec4 clipPosition = projection * viewPosition;\\n clipPosition /= clipPosition.w;\\n\\n gl_Position = clipPosition + vec4(screenSize * scale * vec2(glyph.x, -glyph.y), 0.0, 0.0);\\n interpColor = color;\\n pickId = id;\\n dataCoordinate = position;\\n }\\n}\"]),s=i([\"precision highp float;\\n#define GLSLIFY 1\\n\\nbool outOfRange(float a, float b, float p) {\\n return ((p > max(a, b)) || \\n (p < min(a, b)));\\n}\\n\\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y));\\n}\\n\\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y) ||\\n outOfRange(a.z, b.z, p.z));\\n}\\n\\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\\n return outOfRange(a.xyz, b.xyz, p.xyz);\\n}\\n\\nattribute vec3 position;\\nattribute vec4 color;\\nattribute vec2 glyph;\\nattribute vec4 id;\\n\\nuniform float highlightScale;\\nuniform vec4 highlightId;\\nuniform vec3 axes[2];\\nuniform mat4 model, view, projection;\\nuniform vec2 screenSize;\\nuniform vec3 clipBounds[2];\\nuniform float scale, pixelRatio;\\n\\nvarying vec4 interpColor;\\nvarying vec4 pickId;\\nvarying vec3 dataCoordinate;\\n\\nvoid main() {\\n if (outOfRange(clipBounds[0], clipBounds[1], position)) {\\n\\n gl_Position = vec4(0,0,0,0);\\n } else {\\n float lscale = pixelRatio * scale;\\n if(distance(highlightId, id) < 0.0001) {\\n lscale *= highlightScale;\\n }\\n\\n vec4 clipCenter = projection * (view * (model * vec4(position, 1)));\\n vec3 dataPosition = position + 0.5*lscale*(axes[0] * glyph.x + axes[1] * glyph.y) * clipCenter.w * screenSize.y;\\n vec4 clipPosition = projection * (view * (model * vec4(dataPosition, 1)));\\n\\n gl_Position = clipPosition;\\n interpColor = color;\\n pickId = id;\\n dataCoordinate = dataPosition;\\n }\\n}\\n\"]),l=i([\"precision highp float;\\n#define GLSLIFY 1\\n\\nbool outOfRange(float a, float b, float p) {\\n return ((p > max(a, b)) || \\n (p < min(a, b)));\\n}\\n\\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y));\\n}\\n\\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y) ||\\n outOfRange(a.z, b.z, p.z));\\n}\\n\\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\\n return outOfRange(a.xyz, b.xyz, p.xyz);\\n}\\n\\nuniform vec3 fragClipBounds[2];\\nuniform float opacity;\\n\\nvarying vec4 interpColor;\\nvarying vec3 dataCoordinate;\\n\\nvoid main() {\\n if (\\n outOfRange(fragClipBounds[0], fragClipBounds[1], dataCoordinate) ||\\n interpColor.a * opacity == 0.\\n ) discard;\\n gl_FragColor = interpColor * opacity;\\n}\\n\"]),c=i([\"precision highp float;\\n#define GLSLIFY 1\\n\\nbool outOfRange(float a, float b, float p) {\\n return ((p > max(a, b)) || \\n (p < min(a, b)));\\n}\\n\\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y));\\n}\\n\\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y) ||\\n outOfRange(a.z, b.z, p.z));\\n}\\n\\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\\n return outOfRange(a.xyz, b.xyz, p.xyz);\\n}\\n\\nuniform vec3 fragClipBounds[2];\\nuniform float pickGroup;\\n\\nvarying vec4 pickId;\\nvarying vec3 dataCoordinate;\\n\\nvoid main() {\\n if (outOfRange(fragClipBounds[0], fragClipBounds[1], dataCoordinate)) discard;\\n\\n gl_FragColor = vec4(pickGroup, pickId.bgr);\\n}\"]),u=[{name:\"position\",type:\"vec3\"},{name:\"color\",type:\"vec4\"},{name:\"glyph\",type:\"vec2\"},{name:\"id\",type:\"vec4\"}],h={vertex:a,fragment:l,attributes:u},f={vertex:o,fragment:l,attributes:u},p={vertex:s,fragment:l,attributes:u},d={vertex:a,fragment:c,attributes:u},m={vertex:o,fragment:c,attributes:u},g={vertex:s,fragment:c,attributes:u};function y(t,e){var r=n(t,e),i=r.attributes;return i.position.location=0,i.color.location=1,i.glyph.location=2,i.id.location=3,r}e.createPerspective=function(t){return y(t,h)},e.createOrtho=function(t){return y(t,f)},e.createProject=function(t){return y(t,p)},e.createPickPerspective=function(t){return y(t,d)},e.createPickOrtho=function(t){return y(t,m)},e.createPickProject=function(t){return y(t,g)}},8418:function(t,e,r){\"use strict\";var n=r(5219),i=r(2762),a=r(8116),o=r(1888),s=r(6760),l=r(1283),c=r(9366),u=r(5964),h=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],f=ArrayBuffer,p=DataView;function d(t){return Array.isArray(t)||function(t){return f.isView(t)&&!(t instanceof p)}(t)}function m(t,e){var r=t[0],n=t[1],i=t[2],a=t[3];return t[0]=e[0]*r+e[4]*n+e[8]*i+e[12]*a,t[1]=e[1]*r+e[5]*n+e[9]*i+e[13]*a,t[2]=e[2]*r+e[6]*n+e[10]*i+e[14]*a,t[3]=e[3]*r+e[7]*n+e[11]*i+e[15]*a,t}function g(t,e,r,n){return m(n,n),m(n,n),m(n,n)}function y(t,e){this.index=t,this.dataCoordinate=this.position=e}function v(t){return!0===t||t>1?1:t}function x(t,e,r,n,i,a,o,s,l,c,u,h){this.gl=t,this.pixelRatio=1,this.shader=e,this.orthoShader=r,this.projectShader=n,this.pointBuffer=i,this.colorBuffer=a,this.glyphBuffer=o,this.idBuffer=s,this.vao=l,this.vertexCount=0,this.lineVertexCount=0,this.opacity=1,this.hasAlpha=!1,this.lineWidth=0,this.projectScale=[2/3,2/3,2/3],this.projectOpacity=[1,1,1],this.projectHasAlpha=!1,this.pickId=0,this.pickPerspectiveShader=c,this.pickOrthoShader=u,this.pickProjectShader=h,this.points=[],this._selectResult=new y(0,[0,0,0]),this.useOrtho=!0,this.bounds=[[1/0,1/0,1/0],[-1/0,-1/0,-1/0]],this.axesProject=[!0,!0,!0],this.axesBounds=[[-1/0,-1/0,-1/0],[1/0,1/0,1/0]],this.highlightId=[1,1,1,1],this.highlightScale=2,this.clipBounds=[[-1/0,-1/0,-1/0],[1/0,1/0,1/0]],this.dirty=!0}t.exports=function(t){var e=t.gl,r=l.createPerspective(e),n=l.createOrtho(e),o=l.createProject(e),s=l.createPickPerspective(e),c=l.createPickOrtho(e),u=l.createPickProject(e),h=i(e),f=i(e),p=i(e),d=i(e),m=new x(e,r,n,o,h,f,p,d,a(e,[{buffer:h,size:3,type:e.FLOAT},{buffer:f,size:4,type:e.FLOAT},{buffer:p,size:2,type:e.FLOAT},{buffer:d,size:4,type:e.UNSIGNED_BYTE,normalized:!0}]),s,c,u);return m.update(t),m};var _=x.prototype;_.pickSlots=1,_.setPickBase=function(t){this.pickId=t},_.isTransparent=function(){if(this.hasAlpha)return!0;for(var t=0;t<3;++t)if(this.axesProject[t]&&this.projectHasAlpha)return!0;return!1},_.isOpaque=function(){if(!this.hasAlpha)return!0;for(var t=0;t<3;++t)if(this.axesProject[t]&&!this.projectHasAlpha)return!0;return!1};var b=[0,0],w=[0,0,0],T=[0,0,0],k=[0,0,0,1],A=[0,0,0,1],M=h.slice(),S=[0,0,0],E=[[0,0,0],[0,0,0]];function C(t){return t[0]=t[1]=t[2]=0,t}function L(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=1,t}function I(t,e,r,n){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[r]=n,t}var P=[[-1e8,-1e8,-1e8],[1e8,1e8,1e8]];function z(t,e,r,n,i,a,o){var l=r.gl;if((a===r.projectHasAlpha||o)&&function(t,e,r,n){var i,a=e.axesProject,o=e.gl,l=t.uniforms,c=r.model||h,u=r.view||h,f=r.projection||h,p=e.axesBounds,d=function(t){for(var e=E,r=0;r<2;++r)for(var n=0;n<3;++n)e[r][n]=Math.max(Math.min(t[r][n],1e8),-1e8);return e}(e.clipBounds);i=e.axes&&e.axes.lastCubeProps?e.axes.lastCubeProps.axis:[1,1,1],b[0]=2/o.drawingBufferWidth,b[1]=2/o.drawingBufferHeight,t.bind(),l.view=u,l.projection=f,l.screenSize=b,l.highlightId=e.highlightId,l.highlightScale=e.highlightScale,l.clipBounds=d,l.pickGroup=e.pickId/255,l.pixelRatio=n;for(var m=0;m<3;++m)if(a[m]){l.scale=e.projectScale[m],l.opacity=e.projectOpacity[m];for(var y=M,v=0;v<16;++v)y[v]=0;for(v=0;v<4;++v)y[5*v]=1;y[5*m]=0,i[m]<0?y[12+m]=p[0][m]:y[12+m]=p[1][m],s(y,c,y),l.model=y;var x=(m+1)%3,_=(m+2)%3,P=C(w),z=C(T);P[x]=1,z[_]=1;var O=g(0,0,0,L(k,P)),D=g(0,0,0,L(A,z));if(Math.abs(O[1])>Math.abs(D[1])){var R=O;O=D,D=R,R=P,P=z,z=R;var F=x;x=_,_=F}O[0]<0&&(P[x]=-1),D[1]>0&&(z[_]=-1);var B=0,N=0;for(v=0;v<4;++v)B+=Math.pow(c[4*x+v],2),N+=Math.pow(c[4*_+v],2);P[x]/=Math.sqrt(B),z[_]/=Math.sqrt(N),l.axes[0]=P,l.axes[1]=z,l.fragClipBounds[0]=I(S,d[0],m,-1e8),l.fragClipBounds[1]=I(S,d[1],m,1e8),e.vao.bind(),e.vao.draw(o.TRIANGLES,e.vertexCount),e.lineWidth>0&&(o.lineWidth(e.lineWidth*n),e.vao.draw(o.LINES,e.lineVertexCount,e.vertexCount)),e.vao.unbind()}}(e,r,n,i),a===r.hasAlpha||o){t.bind();var c=t.uniforms;c.model=n.model||h,c.view=n.view||h,c.projection=n.projection||h,b[0]=2/l.drawingBufferWidth,b[1]=2/l.drawingBufferHeight,c.screenSize=b,c.highlightId=r.highlightId,c.highlightScale=r.highlightScale,c.fragClipBounds=P,c.clipBounds=r.axes.bounds,c.opacity=r.opacity,c.pickGroup=r.pickId/255,c.pixelRatio=i,r.vao.bind(),r.vao.draw(l.TRIANGLES,r.vertexCount),r.lineWidth>0&&(l.lineWidth(r.lineWidth*i),r.vao.draw(l.LINES,r.lineVertexCount,r.vertexCount)),r.vao.unbind()}}function O(t,e,r,i){var a;a=d(t)?e=this.pointCount||e<0)return null;var r=this.points[e],n=this._selectResult;n.index=e;for(var i=0;i<3;++i)n.position[i]=n.dataCoordinate[i]=r[i];return n},_.highlight=function(t){if(t){var e=t.index,r=255&e,n=e>>8&255,i=e>>16&255;this.highlightId=[r/255,n/255,i/255,0]}else this.highlightId=[1,1,1,1]},_.update=function(t){if(\"perspective\"in(t=t||{})&&(this.useOrtho=!t.perspective),\"orthographic\"in t&&(this.useOrtho=!!t.orthographic),\"lineWidth\"in t&&(this.lineWidth=t.lineWidth),\"project\"in t)if(d(t.project))this.axesProject=t.project;else{var e=!!t.project;this.axesProject=[e,e,e]}if(\"projectScale\"in t)if(d(t.projectScale))this.projectScale=t.projectScale.slice();else{var r=+t.projectScale;this.projectScale=[r,r,r]}if(this.projectHasAlpha=!1,\"projectOpacity\"in t){d(t.projectOpacity)?this.projectOpacity=t.projectOpacity.slice():(r=+t.projectOpacity,this.projectOpacity=[r,r,r]);for(var n=0;n<3;++n)this.projectOpacity[n]=v(this.projectOpacity[n]),this.projectOpacity[n]<1&&(this.projectHasAlpha=!0)}this.hasAlpha=!1,\"opacity\"in t&&(this.opacity=v(t.opacity),this.opacity<1&&(this.hasAlpha=!0)),this.dirty=!0;var i,a,s=t.position,l={family:t.font||\"normal\",style:t.fontStyle||\"normal\",weight:t.fontWeight||\"normal\",variant:t.fontVariant||\"normal\"},c=t.alignment||[0,0];if(2===c.length)i=c[0],a=c[1];else for(i=[],a=[],n=0;n0){var z=0,D=_,R=[0,0,0,1],F=[0,0,0,1],B=d(p)&&d(p[0]),N=d(y)&&d(y[0]);t:for(n=0;n0?1-S[0][0]:W<0?1+S[1][0]:1,Y*=Y>0?1-S[0][1]:Y<0?1+S[1][1]:1],$=A.cells||[],J=A.positions||[];for(k=0;k<$.length;++k)for(var K=$[k],Q=0;Q<3;++Q){for(var tt=0;tt<3;++tt)C[3*z+tt]=T[tt];for(tt=0;tt<4;++tt)L[4*z+tt]=R[tt];P[z]=x;var et=J[K[Q]];I[2*z]=q*(G*et[0]-Z*et[1]+X[0]),I[2*z+1]=q*(Z*et[0]+G*et[1]+X[1]),z+=1}for($=M.edges,J=M.positions,k=0;k<$.length;++k)for(K=$[k],Q=0;Q<2;++Q){for(tt=0;tt<3;++tt)C[3*D+tt]=T[tt];for(tt=0;tt<4;++tt)L[4*D+tt]=F[tt];P[D]=x,et=J[K[Q]],I[2*D]=q*(G*et[0]-Z*et[1]+X[0]),I[2*D+1]=q*(Z*et[0]+G*et[1]+X[1]),D+=1}}}this.bounds=[u,h],this.points=s,this.pointCount=s.length,this.vertexCount=_,this.lineVertexCount=b,this.pointBuffer.update(C),this.colorBuffer.update(L),this.glyphBuffer.update(I),this.idBuffer.update(P),o.free(C),o.free(L),o.free(I),o.free(P)},_.dispose=function(){this.shader.dispose(),this.orthoShader.dispose(),this.pickPerspectiveShader.dispose(),this.pickOrthoShader.dispose(),this.vao.dispose(),this.pointBuffer.dispose(),this.colorBuffer.dispose(),this.glyphBuffer.dispose(),this.idBuffer.dispose()}},4298:function(t,e,r){\"use strict\";var n=r(3236);e.boxVertex=n([\"precision mediump float;\\n#define GLSLIFY 1\\n\\nattribute vec2 vertex;\\n\\nuniform vec2 cornerA, cornerB;\\n\\nvoid main() {\\n gl_Position = vec4(mix(cornerA, cornerB, vertex), 0, 1);\\n}\\n\"]),e.boxFragment=n([\"precision mediump float;\\n#define GLSLIFY 1\\n\\nuniform vec4 color;\\n\\nvoid main() {\\n gl_FragColor = color;\\n}\\n\"])},3161:function(t,e,r){\"use strict\";var n=r(9405),i=r(2762),a=r(4298);function o(t,e,r){this.plot=t,this.boxBuffer=e,this.boxShader=r,this.enabled=!0,this.selectBox=[1/0,1/0,-1/0,-1/0],this.borderColor=[0,0,0,1],this.innerFill=!1,this.innerColor=[0,0,0,.25],this.outerFill=!0,this.outerColor=[0,0,0,.5],this.borderWidth=10}t.exports=function(t,e){var r=t.gl,s=new o(t,i(r,[0,0,0,1,1,0,1,1]),n(r,a.boxVertex,a.boxFragment));return s.update(e),t.addOverlay(s),s};var s=o.prototype;s.draw=function(){if(this.enabled){var t=this.plot,e=this.selectBox,r=this.borderWidth,n=(this.innerFill,this.innerColor),i=(this.outerFill,this.outerColor),a=this.borderColor,o=t.box,s=t.screenBox,l=t.dataBox,c=t.viewBox,u=t.pixelRatio,h=(e[0]-l[0])*(c[2]-c[0])/(l[2]-l[0])+c[0],f=(e[1]-l[1])*(c[3]-c[1])/(l[3]-l[1])+c[1],p=(e[2]-l[0])*(c[2]-c[0])/(l[2]-l[0])+c[0],d=(e[3]-l[1])*(c[3]-c[1])/(l[3]-l[1])+c[1];if(h=Math.max(h,c[0]),f=Math.max(f,c[1]),p=Math.min(p,c[2]),d=Math.min(d,c[3]),!(p0){var y=r*u;o.drawBox(h-y,f-y,p+y,f+y,a),o.drawBox(h-y,d-y,p+y,d+y,a),o.drawBox(h-y,f-y,h+y,d+y,a),o.drawBox(p-y,f-y,p+y,d+y,a)}}}},s.update=function(t){t=t||{},this.innerFill=!!t.innerFill,this.outerFill=!!t.outerFill,this.innerColor=(t.innerColor||[0,0,0,.5]).slice(),this.outerColor=(t.outerColor||[0,0,0,.5]).slice(),this.borderColor=(t.borderColor||[0,0,0,1]).slice(),this.borderWidth=t.borderWidth||0,this.selectBox=(t.selectBox||this.selectBox).slice()},s.dispose=function(){this.boxBuffer.dispose(),this.boxShader.dispose(),this.plot.removeOverlay(this)}},3589:function(t,e,r){\"use strict\";t.exports=function(t,e){var r=e[0],a=e[1];return new l(t,n(t,r,a,{}),i.mallocUint8(r*a*4))};var n=r(2260),i=r(1888),a=r(9618),o=r(8828).nextPow2;function s(t,e,r,n,i){this.coord=[t,e],this.id=r,this.value=n,this.distance=i}function l(t,e,r){this.gl=t,this.fbo=e,this.buffer=r,this._readTimeout=null;var n=this;this._readCallback=function(){n.gl&&(e.bind(),t.readPixels(0,0,e.shape[0],e.shape[1],t.RGBA,t.UNSIGNED_BYTE,n.buffer),n._readTimeout=null)}}var c=l.prototype;Object.defineProperty(c,\"shape\",{get:function(){return this.gl?this.fbo.shape.slice():[0,0]},set:function(t){if(this.gl){this.fbo.shape=t;var e=this.fbo.shape[0],r=this.fbo.shape[1];if(r*e*4>this.buffer.length){i.free(this.buffer);for(var n=this.buffer=i.mallocUint8(o(r*e*4)),a=0;ar)for(t=r;te)for(t=e;t=0){for(var T=0|w.type.charAt(w.type.length-1),k=new Array(T),A=0;A=0;)M+=1;b[v]=M}var S=new Array(r.length);function E(){f.program=o.program(p,f._vref,f._fref,_,b);for(var t=0;t=0){if((d=f.charCodeAt(f.length-1)-48)<2||d>4)throw new n(\"\",\"Invalid data type for attribute \"+h+\": \"+f);s(t,e,p[0],i,d,a,h)}else{if(!(f.indexOf(\"mat\")>=0))throw new n(\"\",\"Unknown data type for attribute \"+h+\": \"+f);var d;if((d=f.charCodeAt(f.length-1)-48)<2||d>4)throw new n(\"\",\"Invalid data type for attribute \"+h+\": \"+f);l(t,e,p,i,d,a,h)}}}return a};var n=r(8866);function i(t,e,r,n,i,a){this._gl=t,this._wrapper=e,this._index=r,this._locations=n,this._dimension=i,this._constFunc=a}var a=i.prototype;a.pointer=function(t,e,r,n){var i=this,a=i._gl,o=i._locations[i._index];a.vertexAttribPointer(o,i._dimension,t||a.FLOAT,!!e,r||0,n||0),a.enableVertexAttribArray(o)},a.set=function(t,e,r,n){return this._constFunc(this._locations[this._index],t,e,r,n)},Object.defineProperty(a,\"location\",{get:function(){return this._locations[this._index]},set:function(t){return t!==this._locations[this._index]&&(this._locations[this._index]=0|t,this._wrapper.program=null),0|t}});var o=[function(t,e,r){return void 0===r.length?t.vertexAttrib1f(e,r):t.vertexAttrib1fv(e,r)},function(t,e,r,n){return void 0===r.length?t.vertexAttrib2f(e,r,n):t.vertexAttrib2fv(e,r)},function(t,e,r,n,i){return void 0===r.length?t.vertexAttrib3f(e,r,n,i):t.vertexAttrib3fv(e,r)},function(t,e,r,n,i,a){return void 0===r.length?t.vertexAttrib4f(e,r,n,i,a):t.vertexAttrib4fv(e,r)}];function s(t,e,r,n,a,s,l){var c=o[a],u=new i(t,e,r,n,a,c);Object.defineProperty(s,l,{set:function(e){return t.disableVertexAttribArray(n[r]),c(t,n[r],e),e},get:function(){return u},enumerable:!0})}function l(t,e,r,n,i,a,o){for(var l=new Array(i),c=new Array(i),u=0;u4)throw new i(\"\",\"Invalid uniform dimension type for matrix \"+name+\": \"+v);t[\"uniformMatrix\"+y+\"fv\"](s[h],!1,f);break}throw new i(\"\",\"Unknown uniform data type for \"+name+\": \"+v)}if((y=v.charCodeAt(v.length-1)-48)<2||y>4)throw new i(\"\",\"Invalid data type\");switch(v.charAt(0)){case\"b\":case\"i\":t[\"uniform\"+y+\"iv\"](s[h],f);break;case\"v\":t[\"uniform\"+y+\"fv\"](s[h],f);break;default:throw new i(\"\",\"Unrecognized data type for vector \"+name+\": \"+v)}}}}}}function c(t,e){if(\"object\"!=typeof e)return[[t,e]];var r=[];for(var n in e){var i=e[n],a=t;parseInt(n)+\"\"===n?a+=\"[\"+n+\"]\":a+=\".\"+n,\"object\"==typeof i?r.push.apply(r,c(a,i)):r.push([a,i])}return r}function u(t,e,n){if(\"object\"==typeof n){var c=h(n);Object.defineProperty(t,e,{get:a(c),set:l(n),enumerable:!0,configurable:!1})}else s[n]?Object.defineProperty(t,e,{get:(u=n,function(t,e,r){return t.getUniform(e.program,r[u])}),set:l(n),enumerable:!0,configurable:!1}):t[e]=function(t){switch(t){case\"bool\":return!1;case\"int\":case\"sampler2D\":case\"samplerCube\":case\"float\":return 0;default:var e=t.indexOf(\"vec\");if(0<=e&&e<=1&&t.length===4+e){if((r=t.charCodeAt(t.length-1)-48)<2||r>4)throw new i(\"\",\"Invalid data type\");return\"b\"===t.charAt(0)?o(r,!1):o(r,0)}if(0===t.indexOf(\"mat\")&&4===t.length){var r;if((r=t.charCodeAt(t.length-1)-48)<2||r>4)throw new i(\"\",\"Invalid uniform dimension type for matrix \"+name+\": \"+t);return o(r*r,0)}throw new i(\"\",\"Unknown uniform data type for \"+name+\": \"+t)}}(r[n].type);var u}function h(t){var e;if(Array.isArray(t)){e=new Array(t.length);for(var r=0;r1){s[0]in a||(a[s[0]]=[]),a=a[s[0]];for(var l=1;l1)for(var l=0;l 0 U ||b|| > 0.\\n // Assign z = 0, x = -b, y = a:\\n // a*-b + b*a + c*0 = -ba + ba + 0 = 0\\n if (v.x*v.x > v.z*v.z || v.y*v.y > v.z*v.z) {\\n return normalize(vec3(-v.y, v.x, 0.0));\\n } else {\\n return normalize(vec3(0.0, v.z, -v.y));\\n }\\n}\\n\\n// Calculate the tube vertex and normal at the given index.\\n//\\n// The returned vertex is for a tube ring with its center at origin, radius of length(d), pointing in the direction of d.\\n//\\n// Each tube segment is made up of a ring of vertices.\\n// These vertices are used to make up the triangles of the tube by connecting them together in the vertex array.\\n// The indexes of tube segments run from 0 to 8.\\n//\\nvec3 getTubePosition(vec3 d, float index, out vec3 normal) {\\n float segmentCount = 8.0;\\n\\n float angle = 2.0 * 3.14159 * (index / segmentCount);\\n\\n vec3 u = getOrthogonalVector(d);\\n vec3 v = normalize(cross(u, d));\\n\\n vec3 x = u * cos(angle) * length(d);\\n vec3 y = v * sin(angle) * length(d);\\n vec3 v3 = x + y;\\n\\n normal = normalize(v3);\\n\\n return v3;\\n}\\n\\nattribute vec4 vector;\\nattribute vec4 color, position;\\nattribute vec2 uv;\\n\\nuniform float vectorScale, tubeScale;\\nuniform mat4 model, view, projection, inverseModel;\\nuniform vec3 eyePosition, lightPosition;\\n\\nvarying vec3 f_normal, f_lightDirection, f_eyeDirection, f_data, f_position;\\nvarying vec4 f_color;\\nvarying vec2 f_uv;\\n\\nvoid main() {\\n // Scale the vector magnitude to stay constant with\\n // model & view changes.\\n vec3 normal;\\n vec3 XYZ = getTubePosition(mat3(model) * (tubeScale * vector.w * normalize(vector.xyz)), position.w, normal);\\n vec4 tubePosition = model * vec4(position.xyz, 1.0) + vec4(XYZ, 0.0);\\n\\n //Lighting geometry parameters\\n vec4 cameraCoordinate = view * tubePosition;\\n cameraCoordinate.xyz /= cameraCoordinate.w;\\n f_lightDirection = lightPosition - cameraCoordinate.xyz;\\n f_eyeDirection = eyePosition - cameraCoordinate.xyz;\\n f_normal = normalize((vec4(normal, 0.0) * inverseModel).xyz);\\n\\n // vec4 m_position = model * vec4(tubePosition, 1.0);\\n vec4 t_position = view * tubePosition;\\n gl_Position = projection * t_position;\\n\\n f_color = color;\\n f_data = tubePosition.xyz;\\n f_position = position.xyz;\\n f_uv = uv;\\n}\\n\"]),a=n([\"#extension GL_OES_standard_derivatives : enable\\n\\nprecision highp float;\\n#define GLSLIFY 1\\n\\nfloat beckmannDistribution(float x, float roughness) {\\n float NdotH = max(x, 0.0001);\\n float cos2Alpha = NdotH * NdotH;\\n float tan2Alpha = (cos2Alpha - 1.0) / cos2Alpha;\\n float roughness2 = roughness * roughness;\\n float denom = 3.141592653589793 * roughness2 * cos2Alpha * cos2Alpha;\\n return exp(tan2Alpha / roughness2) / denom;\\n}\\n\\nfloat cookTorranceSpecular(\\n vec3 lightDirection,\\n vec3 viewDirection,\\n vec3 surfaceNormal,\\n float roughness,\\n float fresnel) {\\n\\n float VdotN = max(dot(viewDirection, surfaceNormal), 0.0);\\n float LdotN = max(dot(lightDirection, surfaceNormal), 0.0);\\n\\n //Half angle vector\\n vec3 H = normalize(lightDirection + viewDirection);\\n\\n //Geometric term\\n float NdotH = max(dot(surfaceNormal, H), 0.0);\\n float VdotH = max(dot(viewDirection, H), 0.000001);\\n float LdotH = max(dot(lightDirection, H), 0.000001);\\n float G1 = (2.0 * NdotH * VdotN) / VdotH;\\n float G2 = (2.0 * NdotH * LdotN) / LdotH;\\n float G = min(1.0, min(G1, G2));\\n \\n //Distribution term\\n float D = beckmannDistribution(NdotH, roughness);\\n\\n //Fresnel term\\n float F = pow(1.0 - VdotN, fresnel);\\n\\n //Multiply terms and done\\n return G * F * D / max(3.14159265 * VdotN, 0.000001);\\n}\\n\\nbool outOfRange(float a, float b, float p) {\\n return ((p > max(a, b)) || \\n (p < min(a, b)));\\n}\\n\\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y));\\n}\\n\\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y) ||\\n outOfRange(a.z, b.z, p.z));\\n}\\n\\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\\n return outOfRange(a.xyz, b.xyz, p.xyz);\\n}\\n\\nuniform vec3 clipBounds[2];\\nuniform float roughness, fresnel, kambient, kdiffuse, kspecular, opacity;\\nuniform sampler2D texture;\\n\\nvarying vec3 f_normal, f_lightDirection, f_eyeDirection, f_data, f_position;\\nvarying vec4 f_color;\\nvarying vec2 f_uv;\\n\\nvoid main() {\\n if (outOfRange(clipBounds[0], clipBounds[1], f_position)) discard;\\n vec3 N = normalize(f_normal);\\n vec3 L = normalize(f_lightDirection);\\n vec3 V = normalize(f_eyeDirection);\\n\\n if(gl_FrontFacing) {\\n N = -N;\\n }\\n\\n float specular = min(1.0, max(0.0, cookTorranceSpecular(L, V, N, roughness, fresnel)));\\n float diffuse = min(kambient + kdiffuse * max(dot(N, L), 0.0), 1.0);\\n\\n vec4 surfaceColor = f_color * texture2D(texture, f_uv);\\n vec4 litColor = surfaceColor.a * vec4(diffuse * surfaceColor.rgb + kspecular * vec3(1,1,1) * specular, 1.0);\\n\\n gl_FragColor = litColor * opacity;\\n}\\n\"]),o=n([\"precision highp float;\\n\\nprecision highp float;\\n#define GLSLIFY 1\\n\\nvec3 getOrthogonalVector(vec3 v) {\\n // Return up-vector for only-z vector.\\n // Return ax + by + cz = 0, a point that lies on the plane that has v as a normal and that isn't (0,0,0).\\n // From the above if-statement we have ||a|| > 0 U ||b|| > 0.\\n // Assign z = 0, x = -b, y = a:\\n // a*-b + b*a + c*0 = -ba + ba + 0 = 0\\n if (v.x*v.x > v.z*v.z || v.y*v.y > v.z*v.z) {\\n return normalize(vec3(-v.y, v.x, 0.0));\\n } else {\\n return normalize(vec3(0.0, v.z, -v.y));\\n }\\n}\\n\\n// Calculate the tube vertex and normal at the given index.\\n//\\n// The returned vertex is for a tube ring with its center at origin, radius of length(d), pointing in the direction of d.\\n//\\n// Each tube segment is made up of a ring of vertices.\\n// These vertices are used to make up the triangles of the tube by connecting them together in the vertex array.\\n// The indexes of tube segments run from 0 to 8.\\n//\\nvec3 getTubePosition(vec3 d, float index, out vec3 normal) {\\n float segmentCount = 8.0;\\n\\n float angle = 2.0 * 3.14159 * (index / segmentCount);\\n\\n vec3 u = getOrthogonalVector(d);\\n vec3 v = normalize(cross(u, d));\\n\\n vec3 x = u * cos(angle) * length(d);\\n vec3 y = v * sin(angle) * length(d);\\n vec3 v3 = x + y;\\n\\n normal = normalize(v3);\\n\\n return v3;\\n}\\n\\nattribute vec4 vector;\\nattribute vec4 position;\\nattribute vec4 id;\\n\\nuniform mat4 model, view, projection;\\nuniform float tubeScale;\\n\\nvarying vec3 f_position;\\nvarying vec4 f_id;\\n\\nvoid main() {\\n vec3 normal;\\n vec3 XYZ = getTubePosition(mat3(model) * (tubeScale * vector.w * normalize(vector.xyz)), position.w, normal);\\n vec4 tubePosition = model * vec4(position.xyz, 1.0) + vec4(XYZ, 0.0);\\n\\n gl_Position = projection * (view * tubePosition);\\n f_id = id;\\n f_position = position.xyz;\\n}\\n\"]),s=n([\"precision highp float;\\n#define GLSLIFY 1\\n\\nbool outOfRange(float a, float b, float p) {\\n return ((p > max(a, b)) || \\n (p < min(a, b)));\\n}\\n\\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y));\\n}\\n\\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y) ||\\n outOfRange(a.z, b.z, p.z));\\n}\\n\\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\\n return outOfRange(a.xyz, b.xyz, p.xyz);\\n}\\n\\nuniform vec3 clipBounds[2];\\nuniform float pickId;\\n\\nvarying vec3 f_position;\\nvarying vec4 f_id;\\n\\nvoid main() {\\n if (outOfRange(clipBounds[0], clipBounds[1], f_position)) discard;\\n\\n gl_FragColor = vec4(pickId, f_id.xyz);\\n}\"]);e.meshShader={vertex:i,fragment:a,attributes:[{name:\"position\",type:\"vec4\"},{name:\"color\",type:\"vec4\"},{name:\"uv\",type:\"vec2\"},{name:\"vector\",type:\"vec4\"}]},e.pickShader={vertex:o,fragment:s,attributes:[{name:\"position\",type:\"vec4\"},{name:\"id\",type:\"vec4\"},{name:\"vector\",type:\"vec4\"}]}},7815:function(t,e,r){\"use strict\";var n=r(2931),i=r(9970),a=[\"xyz\",\"xzy\",\"yxz\",\"yzx\",\"zxy\",\"zyx\"],o=function(t,e){var r,n=t.length;for(r=0;re)return r-1}return r},s=function(t,e,r){return tr?r:t},l=function(t){var e=1/0;t.sort((function(t,e){return t-e}));for(var r=t.length,n=1;nh-1||v>f-1||x>p-1)return n.create();var _,b,w,T,k,A,M=a[0][d],S=a[0][y],E=a[1][m],C=a[1][v],L=a[2][g],I=(l-M)/(S-M),P=(c-E)/(C-E),z=(u-L)/(a[2][x]-L);switch(isFinite(I)||(I=.5),isFinite(P)||(P=.5),isFinite(z)||(z=.5),r.reversedX&&(d=h-1-d,y=h-1-y),r.reversedY&&(m=f-1-m,v=f-1-v),r.reversedZ&&(g=p-1-g,x=p-1-x),r.filled){case 5:k=g,A=x,w=m*p,T=v*p,_=d*p*f,b=y*p*f;break;case 4:k=g,A=x,_=d*p,b=y*p,w=m*p*h,T=v*p*h;break;case 3:w=m,T=v,k=g*f,A=x*f,_=d*f*p,b=y*f*p;break;case 2:w=m,T=v,_=d*f,b=y*f,k=g*f*h,A=x*f*h;break;case 1:_=d,b=y,k=g*h,A=x*h,w=m*h*p,T=v*h*p;break;default:_=d,b=y,w=m*h,T=v*h,k=g*h*f,A=x*h*f}var O=i[_+w+k],D=i[_+w+A],R=i[_+T+k],F=i[_+T+A],B=i[b+w+k],N=i[b+w+A],j=i[b+T+k],U=i[b+T+A],V=n.create(),q=n.create(),H=n.create(),G=n.create();n.lerp(V,O,B,I),n.lerp(q,D,N,I),n.lerp(H,R,j,I),n.lerp(G,F,U,I);var Z=n.create(),W=n.create();n.lerp(Z,V,H,P),n.lerp(W,q,G,P);var Y=n.create();return n.lerp(Y,Z,W,z),Y}(e,t,p)},m=t.getDivergence||function(t,e){var r=n.create(),i=1e-4;n.add(r,t,[i,0,0]);var a=d(r);n.subtract(a,a,e),n.scale(a,a,1/i),n.add(r,t,[0,i,0]);var o=d(r);n.subtract(o,o,e),n.scale(o,o,1/i),n.add(r,t,[0,0,i]);var s=d(r);return n.subtract(s,s,e),n.scale(s,s,1/i),n.add(r,a,o),n.add(r,r,s),r},g=[],y=e[0][0],v=e[0][1],x=e[0][2],_=e[1][0],b=e[1][1],w=e[1][2],T=function(t){var e=t[0],r=t[1],n=t[2];return!(e_||rb||nw)},k=10*n.distance(e[0],e[1])/c,A=k*k,M=1,S=0,E=r.length;E>1&&(M=function(t){for(var e=[],r=[],n=[],i={},a={},o={},s=t.length,c=0;cS&&(S=F),D.push(F),g.push({points:I,velocities:P,divergences:D});for(var B=0;B<100*c&&I.lengthA&&n.scale(N,N,k/Math.sqrt(j)),n.add(N,N,L),z=d(N),n.squaredDistance(O,N)-A>-1e-4*A&&(I.push(N),O=N,P.push(z),R=m(N,z),F=n.length(R),isFinite(F)&&F>S&&(S=F),D.push(F)),L=N}}var U=function(t,e,r,a){for(var o=0,s=0;s0)for(T=0;T<8;T++){var k=(T+1)%8;c.push(f[T],p[T],p[k],p[k],f[k],f[T]),h.push(v,y,y,y,v,v),d.push(m,g,g,g,m,m);var A=c.length;u.push([A-6,A-5,A-4],[A-3,A-2,A-1])}var M=f;f=p,p=M;var S=v;v=y,y=S;var E=m;m=g,g=E}return{positions:c,cells:u,vectors:h,vertexIntensity:d}}(t,r,a,o)})),h=[],f=[],p=[],d=[];for(s=0;s max(a, b)) || \\n (p < min(a, b)));\\n}\\n\\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y));\\n}\\n\\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y) ||\\n outOfRange(a.z, b.z, p.z));\\n}\\n\\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\\n return outOfRange(a.xyz, b.xyz, p.xyz);\\n}\\n\\nuniform vec3 lowerBound, upperBound;\\nuniform float contourTint;\\nuniform vec4 contourColor;\\nuniform sampler2D colormap;\\nuniform vec3 clipBounds[2];\\nuniform float roughness, fresnel, kambient, kdiffuse, kspecular, opacity;\\nuniform float vertexColor;\\n\\nvarying float value, kill;\\nvarying vec3 worldCoordinate;\\nvarying vec3 lightDirection, eyeDirection, surfaceNormal;\\nvarying vec4 vColor;\\n\\nvoid main() {\\n if (\\n kill > 0.0 ||\\n vColor.a == 0.0 ||\\n outOfRange(clipBounds[0], clipBounds[1], worldCoordinate)\\n ) discard;\\n\\n vec3 N = normalize(surfaceNormal);\\n vec3 V = normalize(eyeDirection);\\n vec3 L = normalize(lightDirection);\\n\\n if(gl_FrontFacing) {\\n N = -N;\\n }\\n\\n float specular = max(beckmannSpecular(L, V, N, roughness), 0.);\\n float diffuse = min(kambient + kdiffuse * max(dot(N, L), 0.0), 1.0);\\n\\n //decide how to interpolate color — in vertex or in fragment\\n vec4 surfaceColor =\\n step(vertexColor, .5) * texture2D(colormap, vec2(value, value)) +\\n step(.5, vertexColor) * vColor;\\n\\n vec4 litColor = surfaceColor.a * vec4(diffuse * surfaceColor.rgb + kspecular * vec3(1,1,1) * specular, 1.0);\\n\\n gl_FragColor = mix(litColor, contourColor, contourTint) * opacity;\\n}\\n\"]),s=i([\"precision highp float;\\n#define GLSLIFY 1\\n\\nattribute vec4 uv;\\nattribute float f;\\n\\nuniform vec3 objectOffset;\\nuniform mat3 permutation;\\nuniform mat4 model, view, projection;\\nuniform float height, zOffset;\\nuniform sampler2D colormap;\\n\\nvarying float value, kill;\\nvarying vec3 worldCoordinate;\\nvarying vec2 planeCoordinate;\\nvarying vec3 lightDirection, eyeDirection, surfaceNormal;\\nvarying vec4 vColor;\\n\\nvoid main() {\\n vec3 dataCoordinate = permutation * vec3(uv.xy, height);\\n worldCoordinate = objectOffset + dataCoordinate;\\n mat4 objectOffsetTranslation = mat4(1.0) + mat4(vec4(0), vec4(0), vec4(0), vec4(objectOffset, 0));\\n vec4 worldPosition = (model * objectOffsetTranslation) * vec4(dataCoordinate, 1.0);\\n\\n vec4 clipPosition = projection * (view * worldPosition);\\n clipPosition.z += zOffset;\\n\\n gl_Position = clipPosition;\\n value = f + objectOffset.z;\\n kill = -1.0;\\n planeCoordinate = uv.zw;\\n\\n vColor = texture2D(colormap, vec2(value, value));\\n\\n //Don't do lighting for contours\\n surfaceNormal = vec3(1,0,0);\\n eyeDirection = vec3(0,1,0);\\n lightDirection = vec3(0,0,1);\\n}\\n\"]),l=i([\"precision highp float;\\n#define GLSLIFY 1\\n\\nbool outOfRange(float a, float b, float p) {\\n return ((p > max(a, b)) || \\n (p < min(a, b)));\\n}\\n\\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y));\\n}\\n\\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\\n return (outOfRange(a.x, b.x, p.x) ||\\n outOfRange(a.y, b.y, p.y) ||\\n outOfRange(a.z, b.z, p.z));\\n}\\n\\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\\n return outOfRange(a.xyz, b.xyz, p.xyz);\\n}\\n\\nuniform vec2 shape;\\nuniform vec3 clipBounds[2];\\nuniform float pickId;\\n\\nvarying float value, kill;\\nvarying vec3 worldCoordinate;\\nvarying vec2 planeCoordinate;\\nvarying vec3 surfaceNormal;\\n\\nvec2 splitFloat(float v) {\\n float vh = 255.0 * v;\\n float upper = floor(vh);\\n float lower = fract(vh);\\n return vec2(upper / 255.0, floor(lower * 16.0) / 16.0);\\n}\\n\\nvoid main() {\\n if ((kill > 0.0) ||\\n (outOfRange(clipBounds[0], clipBounds[1], worldCoordinate))) discard;\\n\\n vec2 ux = splitFloat(planeCoordinate.x / shape.x);\\n vec2 uy = splitFloat(planeCoordinate.y / shape.y);\\n gl_FragColor = vec4(pickId, ux.x, uy.x, ux.y + (uy.y/16.0));\\n}\\n\"]);e.createShader=function(t){var e=n(t,a,o,null,[{name:\"uv\",type:\"vec4\"},{name:\"f\",type:\"vec3\"},{name:\"normal\",type:\"vec3\"}]);return e.attributes.uv.location=0,e.attributes.f.location=1,e.attributes.normal.location=2,e},e.createPickShader=function(t){var e=n(t,a,l,null,[{name:\"uv\",type:\"vec4\"},{name:\"f\",type:\"vec3\"},{name:\"normal\",type:\"vec3\"}]);return e.attributes.uv.location=0,e.attributes.f.location=1,e.attributes.normal.location=2,e},e.createContourShader=function(t){var e=n(t,s,o,null,[{name:\"uv\",type:\"vec4\"},{name:\"f\",type:\"float\"}]);return e.attributes.uv.location=0,e.attributes.f.location=1,e},e.createPickContourShader=function(t){var e=n(t,s,l,null,[{name:\"uv\",type:\"vec4\"},{name:\"f\",type:\"float\"}]);return e.attributes.uv.location=0,e.attributes.f.location=1,e}},9499:function(t,e,r){\"use strict\";t.exports=function(t){var e=t.gl,r=v(e),n=_(e),s=x(e),l=b(e),c=i(e),u=a(e,[{buffer:c,size:4,stride:w,offset:0},{buffer:c,size:3,stride:w,offset:16},{buffer:c,size:3,stride:w,offset:28}]),h=i(e),f=a(e,[{buffer:h,size:4,stride:20,offset:0},{buffer:h,size:1,stride:20,offset:16}]),p=i(e),d=a(e,[{buffer:p,size:2,type:e.FLOAT}]),m=o(e,1,S,e.RGBA,e.UNSIGNED_BYTE);m.minFilter=e.LINEAR,m.magFilter=e.LINEAR;var g=new E(e,[0,0],[[0,0,0],[0,0,0]],r,n,c,u,m,s,l,h,f,p,d,[0,0,0]),y={levels:[[],[],[]]};for(var T in t)y[T]=t[T];return y.colormap=y.colormap||\"jet\",g.update(y),g};var n=r(8828),i=r(2762),a=r(8116),o=r(7766),s=r(1888),l=r(6729),c=r(5298),u=r(9994),h=r(9618),f=r(3711),p=r(6760),d=r(7608),m=r(2478),g=r(6199),y=r(990),v=y.createShader,x=y.createContourShader,_=y.createPickShader,b=y.createPickContourShader,w=40,T=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],k=[[0,0],[0,1],[1,0],[1,1],[1,0],[0,1]],A=[[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0]];function M(t,e,r,n,i){this.position=t,this.index=e,this.uv=r,this.level=n,this.dataCoordinate=i}!function(){for(var t=0;t<3;++t){var e=A[t],r=(t+2)%3;e[(t+1)%3+0]=1,e[r+3]=1,e[t+6]=1}}();var S=256;function E(t,e,r,n,i,a,o,l,c,u,f,p,d,m,g){this.gl=t,this.shape=e,this.bounds=r,this.objectOffset=g,this.intensityBounds=[],this._shader=n,this._pickShader=i,this._coordinateBuffer=a,this._vao=o,this._colorMap=l,this._contourShader=c,this._contourPickShader=u,this._contourBuffer=f,this._contourVAO=p,this._contourOffsets=[[],[],[]],this._contourCounts=[[],[],[]],this._vertexCount=0,this._pickResult=new M([0,0,0],[0,0],[0,0],[0,0,0],[0,0,0]),this._dynamicBuffer=d,this._dynamicVAO=m,this._dynamicOffsets=[0,0,0],this._dynamicCounts=[0,0,0],this.contourWidth=[1,1,1],this.contourLevels=[[1],[1],[1]],this.contourTint=[0,0,0],this.contourColor=[[.5,.5,.5,1],[.5,.5,.5,1],[.5,.5,.5,1]],this.showContour=!0,this.showSurface=!0,this.enableHighlight=[!0,!0,!0],this.highlightColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.highlightTint=[1,1,1],this.highlightLevel=[-1,-1,-1],this.enableDynamic=[!0,!0,!0],this.dynamicLevel=[NaN,NaN,NaN],this.dynamicColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.dynamicTint=[1,1,1],this.dynamicWidth=[1,1,1],this.axesBounds=[[1/0,1/0,1/0],[-1/0,-1/0,-1/0]],this.surfaceProject=[!1,!1,!1],this.contourProject=[[!1,!1,!1],[!1,!1,!1],[!1,!1,!1]],this.colorBounds=[!1,!1],this._field=[h(s.mallocFloat(1024),[0,0]),h(s.mallocFloat(1024),[0,0]),h(s.mallocFloat(1024),[0,0])],this.pickId=1,this.clipBounds=[[-1/0,-1/0,-1/0],[1/0,1/0,1/0]],this.snapToData=!1,this.pixelRatio=1,this.opacity=1,this.lightPosition=[10,1e4,0],this.ambientLight=.8,this.diffuseLight=.8,this.specularLight=2,this.roughness=.5,this.fresnel=1.5,this.vertexColor=0,this.dirty=!0}var C=E.prototype;C.genColormap=function(t,e){var r=!1,n=u([l({colormap:t,nshades:S,format:\"rgba\"}).map((function(t,n){var i=e?function(t,e){if(!e)return 1;if(!e.length)return 1;for(var r=0;rt&&r>0){var n=(e[r][0]-t)/(e[r][0]-e[r-1][0]);return e[r][1]*(1-n)+n*e[r-1][1]}}return 1}(n/255,e):t[3];return i<1&&(r=!0),[t[0],t[1],t[2],255*i]}))]);return c.divseq(n,255),this.hasAlphaScale=r,n},C.isTransparent=function(){return this.opacity<1||this.hasAlphaScale},C.isOpaque=function(){return!this.isTransparent()},C.pickSlots=1,C.setPickBase=function(t){this.pickId=t};var L=[0,0,0],I={showSurface:!1,showContour:!1,projections:[T.slice(),T.slice(),T.slice()],clipBounds:[[[0,0,0],[0,0,0]],[[0,0,0],[0,0,0]],[[0,0,0],[0,0,0]]]};function P(t,e){var r,n,i,a=e.axes&&e.axes.lastCubeProps.axis||L,o=e.showSurface,s=e.showContour;for(r=0;r<3;++r)for(o=o||e.surfaceProject[r],n=0;n<3;++n)s=s||e.contourProject[r][n];for(r=0;r<3;++r){var l=I.projections[r];for(n=0;n<16;++n)l[n]=0;for(n=0;n<4;++n)l[5*n]=1;l[5*r]=0,l[12+r]=e.axesBounds[+(a[r]>0)][r],p(l,t.model,l);var c=I.clipBounds[r];for(i=0;i<2;++i)for(n=0;n<3;++n)c[i][n]=t.clipBounds[i][n];c[0][r]=-1e8,c[1][r]=1e8}return I.showSurface=o,I.showContour=s,I}var z={model:T,view:T,projection:T,inverseModel:T.slice(),lowerBound:[0,0,0],upperBound:[0,0,0],colorMap:0,clipBounds:[[0,0,0],[0,0,0]],height:0,contourTint:0,contourColor:[0,0,0,1],permutation:[1,0,0,0,1,0,0,0,1],zOffset:-1e-4,objectOffset:[0,0,0],kambient:1,kdiffuse:1,kspecular:1,lightPosition:[1e3,1e3,1e3],eyePosition:[0,0,0],roughness:1,fresnel:1,opacity:1,vertexColor:0},O=T.slice(),D=[1,0,0,0,1,0,0,0,1];function R(t,e){t=t||{};var r=this.gl;r.disable(r.CULL_FACE),this._colorMap.bind(0);var n=z;n.model=t.model||T,n.view=t.view||T,n.projection=t.projection||T,n.lowerBound=[this.bounds[0][0],this.bounds[0][1],this.colorBounds[0]||this.bounds[0][2]],n.upperBound=[this.bounds[1][0],this.bounds[1][1],this.colorBounds[1]||this.bounds[1][2]],n.objectOffset=this.objectOffset,n.contourColor=this.contourColor[0],n.inverseModel=d(n.inverseModel,n.model);for(var i=0;i<2;++i)for(var a=n.clipBounds[i],o=0;o<3;++o)a[o]=Math.min(Math.max(this.clipBounds[i][o],-1e8),1e8);n.kambient=this.ambientLight,n.kdiffuse=this.diffuseLight,n.kspecular=this.specularLight,n.roughness=this.roughness,n.fresnel=this.fresnel,n.opacity=this.opacity,n.height=0,n.permutation=D,n.vertexColor=this.vertexColor;var s=O;for(p(s,n.view,n.model),p(s,n.projection,s),d(s,s),i=0;i<3;++i)n.eyePosition[i]=s[12+i]/s[15];var l=s[15];for(i=0;i<3;++i)l+=this.lightPosition[i]*s[4*i+3];for(i=0;i<3;++i){var c=s[12+i];for(o=0;o<3;++o)c+=s[4*o+i]*this.lightPosition[o];n.lightPosition[i]=c/l}var u=P(n,this);if(u.showSurface){for(this._shader.bind(),this._shader.uniforms=n,this._vao.bind(),this.showSurface&&this._vertexCount&&this._vao.draw(r.TRIANGLES,this._vertexCount),i=0;i<3;++i)this.surfaceProject[i]&&this.vertexCount&&(this._shader.uniforms.model=u.projections[i],this._shader.uniforms.clipBounds=u.clipBounds[i],this._vao.draw(r.TRIANGLES,this._vertexCount));this._vao.unbind()}if(u.showContour){var h=this._contourShader;n.kambient=1,n.kdiffuse=0,n.kspecular=0,n.opacity=1,h.bind(),h.uniforms=n;var f=this._contourVAO;for(f.bind(),i=0;i<3;++i)for(h.uniforms.permutation=A[i],r.lineWidth(this.contourWidth[i]*this.pixelRatio),o=0;o>4)/16)/255,i=Math.floor(n),a=n-i,o=e[1]*(t.value[1]+(15&t.value[2])/16)/255,s=Math.floor(o),l=o-s;i+=1,s+=1;var c=r.position;c[0]=c[1]=c[2]=0;for(var u=0;u<2;++u)for(var h=u?a:1-a,f=0;f<2;++f)for(var p=i+u,d=s+f,g=h*(f?l:1-l),y=0;y<3;++y)c[y]+=this._field[y].get(p,d)*g;for(var v=this._pickResult.level,x=0;x<3;++x)if(v[x]=m.le(this.contourLevels[x],c[x]),v[x]<0)this.contourLevels[x].length>0&&(v[x]=0);else if(v[x]Math.abs(b-c[x])&&(v[x]+=1)}for(r.index[0]=a<.5?i:i+1,r.index[1]=l<.5?s:s+1,r.uv[0]=n/e[0],r.uv[1]=o/e[1],y=0;y<3;++y)r.dataCoordinate[y]=this._field[y].get(r.index[0],r.index[1]);return r},C.padField=function(t,e){var r=e.shape.slice(),n=t.shape.slice();c.assign(t.lo(1,1).hi(r[0],r[1]),e),c.assign(t.lo(1).hi(r[0],1),e.hi(r[0],1)),c.assign(t.lo(1,n[1]-1).hi(r[0],1),e.lo(0,r[1]-1).hi(r[0],1)),c.assign(t.lo(0,1).hi(1,r[1]),e.hi(1)),c.assign(t.lo(n[0]-1,1).hi(1,r[1]),e.lo(r[0]-1)),t.set(0,0,e.get(0,0)),t.set(0,n[1]-1,e.get(0,r[1]-1)),t.set(n[0]-1,0,e.get(r[0]-1,0)),t.set(n[0]-1,n[1]-1,e.get(r[0]-1,r[1]-1))},C.update=function(t){t=t||{},this.objectOffset=t.objectOffset||this.objectOffset,this.dirty=!0,\"contourWidth\"in t&&(this.contourWidth=B(t.contourWidth,Number)),\"showContour\"in t&&(this.showContour=B(t.showContour,Boolean)),\"showSurface\"in t&&(this.showSurface=!!t.showSurface),\"contourTint\"in t&&(this.contourTint=B(t.contourTint,Boolean)),\"contourColor\"in t&&(this.contourColor=j(t.contourColor)),\"contourProject\"in t&&(this.contourProject=B(t.contourProject,(function(t){return B(t,Boolean)}))),\"surfaceProject\"in t&&(this.surfaceProject=t.surfaceProject),\"dynamicColor\"in t&&(this.dynamicColor=j(t.dynamicColor)),\"dynamicTint\"in t&&(this.dynamicTint=B(t.dynamicTint,Number)),\"dynamicWidth\"in t&&(this.dynamicWidth=B(t.dynamicWidth,Number)),\"opacity\"in t&&(this.opacity=t.opacity),\"opacityscale\"in t&&(this.opacityscale=t.opacityscale),\"colorBounds\"in t&&(this.colorBounds=t.colorBounds),\"vertexColor\"in t&&(this.vertexColor=t.vertexColor?1:0),\"colormap\"in t&&this._colorMap.setPixels(this.genColormap(t.colormap,this.opacityscale));var e=t.field||t.coords&&t.coords[2]||null,r=!1;if(e||(e=this._field[2].shape[0]||this._field[2].shape[2]?this._field[2].lo(1,1).hi(this._field[2].shape[0]-2,this._field[2].shape[1]-2):this._field[2].hi(0,0)),\"field\"in t||\"coords\"in t){var i=(e.shape[0]+2)*(e.shape[1]+2);i>this._field[2].data.length&&(s.freeFloat(this._field[2].data),this._field[2].data=s.mallocFloat(n.nextPow2(i))),this._field[2]=h(this._field[2].data,[e.shape[0]+2,e.shape[1]+2]),this.padField(this._field[2],e),this.shape=e.shape.slice();for(var a=this.shape,o=0;o<2;++o)this._field[2].size>this._field[o].data.length&&(s.freeFloat(this._field[o].data),this._field[o].data=s.mallocFloat(this._field[2].size)),this._field[o]=h(this._field[o].data,[a[0]+2,a[1]+2]);if(t.coords){var l=t.coords;if(!Array.isArray(l)||3!==l.length)throw new Error(\"gl-surface: invalid coordinates for x/y\");for(o=0;o<2;++o){var c=l[o];for(y=0;y<2;++y)if(c.shape[y]!==a[y])throw new Error(\"gl-surface: coords have incorrect shape\");this.padField(this._field[o],c)}}else if(t.ticks){var u=t.ticks;if(!Array.isArray(u)||2!==u.length)throw new Error(\"gl-surface: invalid ticks\");for(o=0;o<2;++o){var p=u[o];if((Array.isArray(p)||p.length)&&(p=h(p)),p.shape[0]!==a[o])throw new Error(\"gl-surface: invalid tick length\");var d=h(p.data,a);d.stride[o]=p.stride[0],d.stride[1^o]=0,this.padField(this._field[o],d)}}else{for(o=0;o<2;++o){var m=[0,0];m[o]=1,this._field[o]=h(this._field[o].data,[a[0]+2,a[1]+2],m,0)}this._field[0].set(0,0,0);for(var y=0;y0){for(var xt=0;xt<5;++xt)K.pop();U-=1}continue t}K.push(nt[0],nt[1],ot[0],ot[1],nt[2]),U+=1}}rt.push(U)}this._contourOffsets[Q]=et,this._contourCounts[Q]=rt}var _t=s.mallocFloat(K.length);for(o=0;os||o[1]<0||o[1]>s)throw new Error(\"gl-texture2d: Invalid texture size\");var l=d(o,e.stride.slice()),c=0;\"float32\"===r?c=t.FLOAT:\"float64\"===r?(c=t.FLOAT,l=!1,r=\"float32\"):\"uint8\"===r?c=t.UNSIGNED_BYTE:(c=t.UNSIGNED_BYTE,l=!1,r=\"uint8\");var h,p,g=0;if(2===o.length)g=t.LUMINANCE,o=[o[0],o[1],1],e=n(e.data,o,[e.stride[0],e.stride[1],1],e.offset);else{if(3!==o.length)throw new Error(\"gl-texture2d: Invalid shape for texture\");if(1===o[2])g=t.ALPHA;else if(2===o[2])g=t.LUMINANCE_ALPHA;else if(3===o[2])g=t.RGB;else{if(4!==o[2])throw new Error(\"gl-texture2d: Invalid shape for pixel coords\");g=t.RGBA}}c!==t.FLOAT||t.getExtension(\"OES_texture_float\")||(c=t.UNSIGNED_BYTE,l=!1);var y=e.size;if(l)h=0===e.offset&&e.data.length===y?e.data:e.data.subarray(e.offset,e.offset+y);else{var v=[o[2],o[2]*o[0],1];p=a.malloc(y,r);var x=n(p,o,v,0);\"float32\"!==r&&\"float64\"!==r||c!==t.UNSIGNED_BYTE?i.assign(x,e):u(x,e),h=p.subarray(0,y)}var _=m(t);return t.texImage2D(t.TEXTURE_2D,0,g,o[0],o[1],0,g,c,h),l||a.free(p),new f(t,_,o[0],o[1],g,c)}(t,e)}throw new Error(\"gl-texture2d: Invalid arguments for texture2d constructor\")};var o=null,s=null,l=null;function c(t){return\"undefined\"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||\"undefined\"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||\"undefined\"!=typeof HTMLVideoElement&&t instanceof HTMLVideoElement||\"undefined\"!=typeof ImageData&&t instanceof ImageData}var u=function(t,e){i.muls(t,e,255)};function h(t,e,r){var n=t.gl,i=n.getParameter(n.MAX_TEXTURE_SIZE);if(e<0||e>i||r<0||r>i)throw new Error(\"gl-texture2d: Invalid texture size\");return t._shape=[e,r],t.bind(),n.texImage2D(n.TEXTURE_2D,0,t.format,e,r,0,t.format,t.type,null),t._mipLevels=[0],t}function f(t,e,r,n,i,a){this.gl=t,this.handle=e,this.format=i,this.type=a,this._shape=[r,n],this._mipLevels=[0],this._magFilter=t.NEAREST,this._minFilter=t.NEAREST,this._wrapS=t.CLAMP_TO_EDGE,this._wrapT=t.CLAMP_TO_EDGE,this._anisoSamples=1;var o=this,s=[this._wrapS,this._wrapT];Object.defineProperties(s,[{get:function(){return o._wrapS},set:function(t){return o.wrapS=t}},{get:function(){return o._wrapT},set:function(t){return o.wrapT=t}}]),this._wrapVector=s;var l=[this._shape[0],this._shape[1]];Object.defineProperties(l,[{get:function(){return o._shape[0]},set:function(t){return o.width=t}},{get:function(){return o._shape[1]},set:function(t){return o.height=t}}]),this._shapeVector=l}var p=f.prototype;function d(t,e){return 3===t.length?1===e[2]&&e[1]===t[0]*t[2]&&e[0]===t[2]:1===e[0]&&e[1]===t[0]}function m(t){var e=t.createTexture();return t.bindTexture(t.TEXTURE_2D,e),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),e}function g(t,e,r,n,i){var a=t.getParameter(t.MAX_TEXTURE_SIZE);if(e<0||e>a||r<0||r>a)throw new Error(\"gl-texture2d: Invalid texture shape\");if(i===t.FLOAT&&!t.getExtension(\"OES_texture_float\"))throw new Error(\"gl-texture2d: Floating point textures not supported on this platform\");var o=m(t);return t.texImage2D(t.TEXTURE_2D,0,n,e,r,0,n,i,null),new f(t,o,e,r,n,i)}Object.defineProperties(p,{minFilter:{get:function(){return this._minFilter},set:function(t){this.bind();var e=this.gl;if(this.type===e.FLOAT&&o.indexOf(t)>=0&&(e.getExtension(\"OES_texture_float_linear\")||(t=e.NEAREST)),s.indexOf(t)<0)throw new Error(\"gl-texture2d: Unknown filter mode \"+t);return e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,t),this._minFilter=t}},magFilter:{get:function(){return this._magFilter},set:function(t){this.bind();var e=this.gl;if(this.type===e.FLOAT&&o.indexOf(t)>=0&&(e.getExtension(\"OES_texture_float_linear\")||(t=e.NEAREST)),s.indexOf(t)<0)throw new Error(\"gl-texture2d: Unknown filter mode \"+t);return e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,t),this._magFilter=t}},mipSamples:{get:function(){return this._anisoSamples},set:function(t){var e=this._anisoSamples;if(this._anisoSamples=0|Math.max(t,1),e!==this._anisoSamples){var r=this.gl.getExtension(\"EXT_texture_filter_anisotropic\");r&&this.gl.texParameterf(this.gl.TEXTURE_2D,r.TEXTURE_MAX_ANISOTROPY_EXT,this._anisoSamples)}return this._anisoSamples}},wrapS:{get:function(){return this._wrapS},set:function(t){if(this.bind(),l.indexOf(t)<0)throw new Error(\"gl-texture2d: Unknown wrap mode \"+t);return this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_S,t),this._wrapS=t}},wrapT:{get:function(){return this._wrapT},set:function(t){if(this.bind(),l.indexOf(t)<0)throw new Error(\"gl-texture2d: Unknown wrap mode \"+t);return this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_T,t),this._wrapT=t}},wrap:{get:function(){return this._wrapVector},set:function(t){if(Array.isArray(t)||(t=[t,t]),2!==t.length)throw new Error(\"gl-texture2d: Must specify wrap mode for rows and columns\");for(var e=0;e<2;++e)if(l.indexOf(t[e])<0)throw new Error(\"gl-texture2d: Unknown wrap mode \"+t);this._wrapS=t[0],this._wrapT=t[1];var r=this.gl;return this.bind(),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_S,this._wrapS),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_T,this._wrapT),t}},shape:{get:function(){return this._shapeVector},set:function(t){if(Array.isArray(t)){if(2!==t.length)throw new Error(\"gl-texture2d: Invalid texture shape\")}else t=[0|t,0|t];return h(this,0|t[0],0|t[1]),[0|t[0],0|t[1]]}},width:{get:function(){return this._shape[0]},set:function(t){return h(this,t|=0,this._shape[1]),t}},height:{get:function(){return this._shape[1]},set:function(t){return t|=0,h(this,this._shape[0],t),t}}}),p.bind=function(t){var e=this.gl;return void 0!==t&&e.activeTexture(e.TEXTURE0+(0|t)),e.bindTexture(e.TEXTURE_2D,this.handle),void 0!==t?0|t:e.getParameter(e.ACTIVE_TEXTURE)-e.TEXTURE0},p.dispose=function(){this.gl.deleteTexture(this.handle)},p.generateMipmap=function(){this.bind(),this.gl.generateMipmap(this.gl.TEXTURE_2D);for(var t=Math.min(this._shape[0],this._shape[1]),e=0;t>0;++e,t>>>=1)this._mipLevels.indexOf(e)<0&&this._mipLevels.push(e)},p.setPixels=function(t,e,r,o){var s=this.gl;this.bind(),Array.isArray(e)?(o=r,r=0|e[1],e=0|e[0]):(e=e||0,r=r||0),o=o||0;var l=c(t)?t:t.raw;if(l)this._mipLevels.indexOf(o)<0?(s.texImage2D(s.TEXTURE_2D,0,this.format,this.format,this.type,l),this._mipLevels.push(o)):s.texSubImage2D(s.TEXTURE_2D,o,e,r,this.format,this.type,l);else{if(!(t.shape&&t.stride&&t.data))throw new Error(\"gl-texture2d: Unsupported data type\");if(t.shape.length<2||e+t.shape[1]>this._shape[1]>>>o||r+t.shape[0]>this._shape[0]>>>o||e<0||r<0)throw new Error(\"gl-texture2d: Texture dimensions are out of bounds\");!function(t,e,r,o,s,l,c,h){var f=h.dtype,p=h.shape.slice();if(p.length<2||p.length>3)throw new Error(\"gl-texture2d: Invalid ndarray, must be 2d or 3d\");var m=0,g=0,y=d(p,h.stride.slice());if(\"float32\"===f?m=t.FLOAT:\"float64\"===f?(m=t.FLOAT,y=!1,f=\"float32\"):\"uint8\"===f?m=t.UNSIGNED_BYTE:(m=t.UNSIGNED_BYTE,y=!1,f=\"uint8\"),2===p.length)g=t.LUMINANCE,p=[p[0],p[1],1],h=n(h.data,p,[h.stride[0],h.stride[1],1],h.offset);else{if(3!==p.length)throw new Error(\"gl-texture2d: Invalid shape for texture\");if(1===p[2])g=t.ALPHA;else if(2===p[2])g=t.LUMINANCE_ALPHA;else if(3===p[2])g=t.RGB;else{if(4!==p[2])throw new Error(\"gl-texture2d: Invalid shape for pixel coords\");g=t.RGBA}p[2]}if(g!==t.LUMINANCE&&g!==t.ALPHA||s!==t.LUMINANCE&&s!==t.ALPHA||(g=s),g!==s)throw new Error(\"gl-texture2d: Incompatible texture format for setPixels\");var v=h.size,x=c.indexOf(o)<0;if(x&&c.push(o),m===l&&y)0===h.offset&&h.data.length===v?x?t.texImage2D(t.TEXTURE_2D,o,s,p[0],p[1],0,s,l,h.data):t.texSubImage2D(t.TEXTURE_2D,o,e,r,p[0],p[1],s,l,h.data):x?t.texImage2D(t.TEXTURE_2D,o,s,p[0],p[1],0,s,l,h.data.subarray(h.offset,h.offset+v)):t.texSubImage2D(t.TEXTURE_2D,o,e,r,p[0],p[1],s,l,h.data.subarray(h.offset,h.offset+v));else{var _;_=l===t.FLOAT?a.mallocFloat32(v):a.mallocUint8(v);var b=n(_,p,[p[2],p[2]*p[0],1]);m===t.FLOAT&&l===t.UNSIGNED_BYTE?u(b,h):i.assign(b,h),x?t.texImage2D(t.TEXTURE_2D,o,s,p[0],p[1],0,s,l,_.subarray(0,v)):t.texSubImage2D(t.TEXTURE_2D,o,e,r,p[0],p[1],s,l,_.subarray(0,v)),l===t.FLOAT?a.freeFloat32(_):a.freeUint8(_)}}(s,e,r,o,this.format,this.type,this._mipLevels,t)}}},1433:function(t){\"use strict\";t.exports=function(t,e,r){e?e.bind():t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,null);var n=0|t.getParameter(t.MAX_VERTEX_ATTRIBS);if(r){if(r.length>n)throw new Error(\"gl-vao: Too many vertex attributes\");for(var i=0;i1?0:Math.acos(s)};var n=r(2825),i=r(3536),a=r(244)},9226:function(t){t.exports=function(t,e){return t[0]=Math.ceil(e[0]),t[1]=Math.ceil(e[1]),t[2]=Math.ceil(e[2]),t}},3126:function(t){t.exports=function(t){var e=new Float32Array(3);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e}},3990:function(t){t.exports=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t}},1091:function(t){t.exports=function(){var t=new Float32Array(3);return t[0]=0,t[1]=0,t[2]=0,t}},5911:function(t){t.exports=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=r[0],s=r[1],l=r[2];return t[0]=i*l-a*s,t[1]=a*o-n*l,t[2]=n*s-i*o,t}},5455:function(t,e,r){t.exports=r(7056)},7056:function(t){t.exports=function(t,e){var r=e[0]-t[0],n=e[1]-t[1],i=e[2]-t[2];return Math.sqrt(r*r+n*n+i*i)}},4008:function(t,e,r){t.exports=r(6690)},6690:function(t){t.exports=function(t,e,r){return t[0]=e[0]/r[0],t[1]=e[1]/r[1],t[2]=e[2]/r[2],t}},244:function(t){t.exports=function(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]}},2613:function(t){t.exports=1e-6},9922:function(t,e,r){t.exports=function(t,e){var r=t[0],i=t[1],a=t[2],o=e[0],s=e[1],l=e[2];return Math.abs(r-o)<=n*Math.max(1,Math.abs(r),Math.abs(o))&&Math.abs(i-s)<=n*Math.max(1,Math.abs(i),Math.abs(s))&&Math.abs(a-l)<=n*Math.max(1,Math.abs(a),Math.abs(l))};var n=r(2613)},9265:function(t){t.exports=function(t,e){return t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]}},2681:function(t){t.exports=function(t,e){return t[0]=Math.floor(e[0]),t[1]=Math.floor(e[1]),t[2]=Math.floor(e[2]),t}},5137:function(t,e,r){t.exports=function(t,e,r,i,a,o){var s,l;for(e||(e=3),r||(r=0),l=i?Math.min(i*e+r,t.length):t.length,s=r;s0&&(a=1/Math.sqrt(a),t[0]=e[0]*a,t[1]=e[1]*a,t[2]=e[2]*a),t}},7636:function(t){t.exports=function(t,e){e=e||1;var r=2*Math.random()*Math.PI,n=2*Math.random()-1,i=Math.sqrt(1-n*n)*e;return t[0]=Math.cos(r)*i,t[1]=Math.sin(r)*i,t[2]=n*e,t}},6894:function(t){t.exports=function(t,e,r,n){var i=r[1],a=r[2],o=e[1]-i,s=e[2]-a,l=Math.sin(n),c=Math.cos(n);return t[0]=e[0],t[1]=i+o*c-s*l,t[2]=a+o*l+s*c,t}},109:function(t){t.exports=function(t,e,r,n){var i=r[0],a=r[2],o=e[0]-i,s=e[2]-a,l=Math.sin(n),c=Math.cos(n);return t[0]=i+s*l+o*c,t[1]=e[1],t[2]=a+s*c-o*l,t}},8692:function(t){t.exports=function(t,e,r,n){var i=r[0],a=r[1],o=e[0]-i,s=e[1]-a,l=Math.sin(n),c=Math.cos(n);return t[0]=i+o*c-s*l,t[1]=a+o*l+s*c,t[2]=e[2],t}},2447:function(t){t.exports=function(t,e){return t[0]=Math.round(e[0]),t[1]=Math.round(e[1]),t[2]=Math.round(e[2]),t}},6621:function(t){t.exports=function(t,e,r){return t[0]=e[0]*r,t[1]=e[1]*r,t[2]=e[2]*r,t}},8489:function(t){t.exports=function(t,e,r,n){return t[0]=e[0]+r[0]*n,t[1]=e[1]+r[1]*n,t[2]=e[2]+r[2]*n,t}},1463:function(t){t.exports=function(t,e,r,n){return t[0]=e,t[1]=r,t[2]=n,t}},6141:function(t,e,r){t.exports=r(2953)},5486:function(t,e,r){t.exports=r(3066)},2953:function(t){t.exports=function(t,e){var r=e[0]-t[0],n=e[1]-t[1],i=e[2]-t[2];return r*r+n*n+i*i}},3066:function(t){t.exports=function(t){var e=t[0],r=t[1],n=t[2];return e*e+r*r+n*n}},2229:function(t,e,r){t.exports=r(6843)},6843:function(t){t.exports=function(t,e,r){return t[0]=e[0]-r[0],t[1]=e[1]-r[1],t[2]=e[2]-r[2],t}},492:function(t){t.exports=function(t,e,r){var n=e[0],i=e[1],a=e[2];return t[0]=n*r[0]+i*r[3]+a*r[6],t[1]=n*r[1]+i*r[4]+a*r[7],t[2]=n*r[2]+i*r[5]+a*r[8],t}},5673:function(t){t.exports=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=r[3]*n+r[7]*i+r[11]*a+r[15];return o=o||1,t[0]=(r[0]*n+r[4]*i+r[8]*a+r[12])/o,t[1]=(r[1]*n+r[5]*i+r[9]*a+r[13])/o,t[2]=(r[2]*n+r[6]*i+r[10]*a+r[14])/o,t}},264:function(t){t.exports=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=r[0],s=r[1],l=r[2],c=r[3],u=c*n+s*a-l*i,h=c*i+l*n-o*a,f=c*a+o*i-s*n,p=-o*n-s*i-l*a;return t[0]=u*c+p*-o+h*-l-f*-s,t[1]=h*c+p*-s+f*-o-u*-l,t[2]=f*c+p*-l+u*-s-h*-o,t}},4361:function(t){t.exports=function(t,e,r){return t[0]=e[0]+r[0],t[1]=e[1]+r[1],t[2]=e[2]+r[2],t[3]=e[3]+r[3],t}},2335:function(t){t.exports=function(t){var e=new Float32Array(4);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e}},2933:function(t){t.exports=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t}},7536:function(t){t.exports=function(){var t=new Float32Array(4);return t[0]=0,t[1]=0,t[2]=0,t[3]=0,t}},4691:function(t){t.exports=function(t,e){var r=e[0]-t[0],n=e[1]-t[1],i=e[2]-t[2],a=e[3]-t[3];return Math.sqrt(r*r+n*n+i*i+a*a)}},1373:function(t){t.exports=function(t,e,r){return t[0]=e[0]/r[0],t[1]=e[1]/r[1],t[2]=e[2]/r[2],t[3]=e[3]/r[3],t}},3750:function(t){t.exports=function(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]+t[3]*e[3]}},3390:function(t){t.exports=function(t,e,r,n){var i=new Float32Array(4);return i[0]=t,i[1]=e,i[2]=r,i[3]=n,i}},9970:function(t,e,r){t.exports={create:r(7536),clone:r(2335),fromValues:r(3390),copy:r(2933),set:r(4578),add:r(4361),subtract:r(6860),multiply:r(3576),divide:r(1373),min:r(2334),max:r(160),scale:r(9288),scaleAndAdd:r(4844),distance:r(4691),squaredDistance:r(7960),length:r(6808),squaredLength:r(483),negate:r(1498),inverse:r(4494),normalize:r(5177),dot:r(3750),lerp:r(2573),random:r(9131),transformMat4:r(5352),transformQuat:r(4041)}},4494:function(t){t.exports=function(t,e){return t[0]=1/e[0],t[1]=1/e[1],t[2]=1/e[2],t[3]=1/e[3],t}},6808:function(t){t.exports=function(t){var e=t[0],r=t[1],n=t[2],i=t[3];return Math.sqrt(e*e+r*r+n*n+i*i)}},2573:function(t){t.exports=function(t,e,r,n){var i=e[0],a=e[1],o=e[2],s=e[3];return t[0]=i+n*(r[0]-i),t[1]=a+n*(r[1]-a),t[2]=o+n*(r[2]-o),t[3]=s+n*(r[3]-s),t}},160:function(t){t.exports=function(t,e,r){return t[0]=Math.max(e[0],r[0]),t[1]=Math.max(e[1],r[1]),t[2]=Math.max(e[2],r[2]),t[3]=Math.max(e[3],r[3]),t}},2334:function(t){t.exports=function(t,e,r){return t[0]=Math.min(e[0],r[0]),t[1]=Math.min(e[1],r[1]),t[2]=Math.min(e[2],r[2]),t[3]=Math.min(e[3],r[3]),t}},3576:function(t){t.exports=function(t,e,r){return t[0]=e[0]*r[0],t[1]=e[1]*r[1],t[2]=e[2]*r[2],t[3]=e[3]*r[3],t}},1498:function(t){t.exports=function(t,e){return t[0]=-e[0],t[1]=-e[1],t[2]=-e[2],t[3]=-e[3],t}},5177:function(t){t.exports=function(t,e){var r=e[0],n=e[1],i=e[2],a=e[3],o=r*r+n*n+i*i+a*a;return o>0&&(o=1/Math.sqrt(o),t[0]=r*o,t[1]=n*o,t[2]=i*o,t[3]=a*o),t}},9131:function(t,e,r){var n=r(5177),i=r(9288);t.exports=function(t,e){return e=e||1,t[0]=Math.random(),t[1]=Math.random(),t[2]=Math.random(),t[3]=Math.random(),n(t,t),i(t,t,e),t}},9288:function(t){t.exports=function(t,e,r){return t[0]=e[0]*r,t[1]=e[1]*r,t[2]=e[2]*r,t[3]=e[3]*r,t}},4844:function(t){t.exports=function(t,e,r,n){return t[0]=e[0]+r[0]*n,t[1]=e[1]+r[1]*n,t[2]=e[2]+r[2]*n,t[3]=e[3]+r[3]*n,t}},4578:function(t){t.exports=function(t,e,r,n,i){return t[0]=e,t[1]=r,t[2]=n,t[3]=i,t}},7960:function(t){t.exports=function(t,e){var r=e[0]-t[0],n=e[1]-t[1],i=e[2]-t[2],a=e[3]-t[3];return r*r+n*n+i*i+a*a}},483:function(t){t.exports=function(t){var e=t[0],r=t[1],n=t[2],i=t[3];return e*e+r*r+n*n+i*i}},6860:function(t){t.exports=function(t,e,r){return t[0]=e[0]-r[0],t[1]=e[1]-r[1],t[2]=e[2]-r[2],t[3]=e[3]-r[3],t}},5352:function(t){t.exports=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=e[3];return t[0]=r[0]*n+r[4]*i+r[8]*a+r[12]*o,t[1]=r[1]*n+r[5]*i+r[9]*a+r[13]*o,t[2]=r[2]*n+r[6]*i+r[10]*a+r[14]*o,t[3]=r[3]*n+r[7]*i+r[11]*a+r[15]*o,t}},4041:function(t){t.exports=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=r[0],s=r[1],l=r[2],c=r[3],u=c*n+s*a-l*i,h=c*i+l*n-o*a,f=c*a+o*i-s*n,p=-o*n-s*i-l*a;return t[0]=u*c+p*-o+h*-l-f*-s,t[1]=h*c+p*-s+f*-o-u*-l,t[2]=f*c+p*-l+u*-s-h*-o,t[3]=e[3],t}},1848:function(t,e,r){var n=r(4905),i=r(6468);t.exports=function(t){for(var e=Array.isArray(t)?t:n(t),r=0;r0)continue;r=t.slice(0,1).join(\"\")}return N(r),I+=r.length,(S=S.slice(r.length)).length}}function Z(){return/[^a-fA-F0-9]/.test(e)?(N(S.join(\"\")),M=l,k):(S.push(e),r=e,k+1)}function W(){return\".\"===e||/[eE]/.test(e)?(S.push(e),M=m,r=e,k+1):\"x\"===e&&1===S.length&&\"0\"===S[0]?(M=b,S.push(e),r=e,k+1):/[^\\d]/.test(e)?(N(S.join(\"\")),M=l,k):(S.push(e),r=e,k+1)}function Y(){return\"f\"===e&&(S.push(e),r=e,k+=1),/[eE]/.test(e)?(S.push(e),r=e,k+1):(\"-\"!==e&&\"+\"!==e||!/[eE]/.test(r))&&/[^\\d]/.test(e)?(N(S.join(\"\")),M=l,k):(S.push(e),r=e,k+1)}function X(){if(/[^\\d\\w_]/.test(e)){var t=S.join(\"\");return M=B[t]?v:F[t]?y:g,N(S.join(\"\")),M=l,k}return S.push(e),r=e,k+1}};var n=r(620),i=r(7827),a=r(6852),o=r(7932),s=r(3508),l=999,c=9999,u=0,h=1,f=2,p=3,d=4,m=5,g=6,y=7,v=8,x=9,_=10,b=11,w=[\"block-comment\",\"line-comment\",\"preprocessor\",\"operator\",\"integer\",\"float\",\"ident\",\"builtin\",\"keyword\",\"whitespace\",\"eof\",\"integer\"]},3508:function(t,e,r){var n=r(6852);n=n.slice().filter((function(t){return!/^(gl\\_|texture)/.test(t)})),t.exports=n.concat([\"gl_VertexID\",\"gl_InstanceID\",\"gl_Position\",\"gl_PointSize\",\"gl_FragCoord\",\"gl_FrontFacing\",\"gl_FragDepth\",\"gl_PointCoord\",\"gl_MaxVertexAttribs\",\"gl_MaxVertexUniformVectors\",\"gl_MaxVertexOutputVectors\",\"gl_MaxFragmentInputVectors\",\"gl_MaxVertexTextureImageUnits\",\"gl_MaxCombinedTextureImageUnits\",\"gl_MaxTextureImageUnits\",\"gl_MaxFragmentUniformVectors\",\"gl_MaxDrawBuffers\",\"gl_MinProgramTexelOffset\",\"gl_MaxProgramTexelOffset\",\"gl_DepthRangeParameters\",\"gl_DepthRange\",\"trunc\",\"round\",\"roundEven\",\"isnan\",\"isinf\",\"floatBitsToInt\",\"floatBitsToUint\",\"intBitsToFloat\",\"uintBitsToFloat\",\"packSnorm2x16\",\"unpackSnorm2x16\",\"packUnorm2x16\",\"unpackUnorm2x16\",\"packHalf2x16\",\"unpackHalf2x16\",\"outerProduct\",\"transpose\",\"determinant\",\"inverse\",\"texture\",\"textureSize\",\"textureProj\",\"textureLod\",\"textureOffset\",\"texelFetch\",\"texelFetchOffset\",\"textureProjOffset\",\"textureLodOffset\",\"textureProjLod\",\"textureProjLodOffset\",\"textureGrad\",\"textureGradOffset\",\"textureProjGrad\",\"textureProjGradOffset\"])},6852:function(t){t.exports=[\"abs\",\"acos\",\"all\",\"any\",\"asin\",\"atan\",\"ceil\",\"clamp\",\"cos\",\"cross\",\"dFdx\",\"dFdy\",\"degrees\",\"distance\",\"dot\",\"equal\",\"exp\",\"exp2\",\"faceforward\",\"floor\",\"fract\",\"gl_BackColor\",\"gl_BackLightModelProduct\",\"gl_BackLightProduct\",\"gl_BackMaterial\",\"gl_BackSecondaryColor\",\"gl_ClipPlane\",\"gl_ClipVertex\",\"gl_Color\",\"gl_DepthRange\",\"gl_DepthRangeParameters\",\"gl_EyePlaneQ\",\"gl_EyePlaneR\",\"gl_EyePlaneS\",\"gl_EyePlaneT\",\"gl_Fog\",\"gl_FogCoord\",\"gl_FogFragCoord\",\"gl_FogParameters\",\"gl_FragColor\",\"gl_FragCoord\",\"gl_FragData\",\"gl_FragDepth\",\"gl_FragDepthEXT\",\"gl_FrontColor\",\"gl_FrontFacing\",\"gl_FrontLightModelProduct\",\"gl_FrontLightProduct\",\"gl_FrontMaterial\",\"gl_FrontSecondaryColor\",\"gl_LightModel\",\"gl_LightModelParameters\",\"gl_LightModelProducts\",\"gl_LightProducts\",\"gl_LightSource\",\"gl_LightSourceParameters\",\"gl_MaterialParameters\",\"gl_MaxClipPlanes\",\"gl_MaxCombinedTextureImageUnits\",\"gl_MaxDrawBuffers\",\"gl_MaxFragmentUniformComponents\",\"gl_MaxLights\",\"gl_MaxTextureCoords\",\"gl_MaxTextureImageUnits\",\"gl_MaxTextureUnits\",\"gl_MaxVaryingFloats\",\"gl_MaxVertexAttribs\",\"gl_MaxVertexTextureImageUnits\",\"gl_MaxVertexUniformComponents\",\"gl_ModelViewMatrix\",\"gl_ModelViewMatrixInverse\",\"gl_ModelViewMatrixInverseTranspose\",\"gl_ModelViewMatrixTranspose\",\"gl_ModelViewProjectionMatrix\",\"gl_ModelViewProjectionMatrixInverse\",\"gl_ModelViewProjectionMatrixInverseTranspose\",\"gl_ModelViewProjectionMatrixTranspose\",\"gl_MultiTexCoord0\",\"gl_MultiTexCoord1\",\"gl_MultiTexCoord2\",\"gl_MultiTexCoord3\",\"gl_MultiTexCoord4\",\"gl_MultiTexCoord5\",\"gl_MultiTexCoord6\",\"gl_MultiTexCoord7\",\"gl_Normal\",\"gl_NormalMatrix\",\"gl_NormalScale\",\"gl_ObjectPlaneQ\",\"gl_ObjectPlaneR\",\"gl_ObjectPlaneS\",\"gl_ObjectPlaneT\",\"gl_Point\",\"gl_PointCoord\",\"gl_PointParameters\",\"gl_PointSize\",\"gl_Position\",\"gl_ProjectionMatrix\",\"gl_ProjectionMatrixInverse\",\"gl_ProjectionMatrixInverseTranspose\",\"gl_ProjectionMatrixTranspose\",\"gl_SecondaryColor\",\"gl_TexCoord\",\"gl_TextureEnvColor\",\"gl_TextureMatrix\",\"gl_TextureMatrixInverse\",\"gl_TextureMatrixInverseTranspose\",\"gl_TextureMatrixTranspose\",\"gl_Vertex\",\"greaterThan\",\"greaterThanEqual\",\"inversesqrt\",\"length\",\"lessThan\",\"lessThanEqual\",\"log\",\"log2\",\"matrixCompMult\",\"max\",\"min\",\"mix\",\"mod\",\"normalize\",\"not\",\"notEqual\",\"pow\",\"radians\",\"reflect\",\"refract\",\"sign\",\"sin\",\"smoothstep\",\"sqrt\",\"step\",\"tan\",\"texture2D\",\"texture2DLod\",\"texture2DProj\",\"texture2DProjLod\",\"textureCube\",\"textureCubeLod\",\"texture2DLodEXT\",\"texture2DProjLodEXT\",\"textureCubeLodEXT\",\"texture2DGradEXT\",\"texture2DProjGradEXT\",\"textureCubeGradEXT\"]},7932:function(t,e,r){var n=r(620);t.exports=n.slice().concat([\"layout\",\"centroid\",\"smooth\",\"case\",\"mat2x2\",\"mat2x3\",\"mat2x4\",\"mat3x2\",\"mat3x3\",\"mat3x4\",\"mat4x2\",\"mat4x3\",\"mat4x4\",\"uvec2\",\"uvec3\",\"uvec4\",\"samplerCubeShadow\",\"sampler2DArray\",\"sampler2DArrayShadow\",\"isampler2D\",\"isampler3D\",\"isamplerCube\",\"isampler2DArray\",\"usampler2D\",\"usampler3D\",\"usamplerCube\",\"usampler2DArray\",\"coherent\",\"restrict\",\"readonly\",\"writeonly\",\"resource\",\"atomic_uint\",\"noperspective\",\"patch\",\"sample\",\"subroutine\",\"common\",\"partition\",\"active\",\"filter\",\"image1D\",\"image2D\",\"image3D\",\"imageCube\",\"iimage1D\",\"iimage2D\",\"iimage3D\",\"iimageCube\",\"uimage1D\",\"uimage2D\",\"uimage3D\",\"uimageCube\",\"image1DArray\",\"image2DArray\",\"iimage1DArray\",\"iimage2DArray\",\"uimage1DArray\",\"uimage2DArray\",\"image1DShadow\",\"image2DShadow\",\"image1DArrayShadow\",\"image2DArrayShadow\",\"imageBuffer\",\"iimageBuffer\",\"uimageBuffer\",\"sampler1DArray\",\"sampler1DArrayShadow\",\"isampler1D\",\"isampler1DArray\",\"usampler1D\",\"usampler1DArray\",\"isampler2DRect\",\"usampler2DRect\",\"samplerBuffer\",\"isamplerBuffer\",\"usamplerBuffer\",\"sampler2DMS\",\"isampler2DMS\",\"usampler2DMS\",\"sampler2DMSArray\",\"isampler2DMSArray\",\"usampler2DMSArray\"])},620:function(t){t.exports=[\"precision\",\"highp\",\"mediump\",\"lowp\",\"attribute\",\"const\",\"uniform\",\"varying\",\"break\",\"continue\",\"do\",\"for\",\"while\",\"if\",\"else\",\"in\",\"out\",\"inout\",\"float\",\"int\",\"uint\",\"void\",\"bool\",\"true\",\"false\",\"discard\",\"return\",\"mat2\",\"mat3\",\"mat4\",\"vec2\",\"vec3\",\"vec4\",\"ivec2\",\"ivec3\",\"ivec4\",\"bvec2\",\"bvec3\",\"bvec4\",\"sampler1D\",\"sampler2D\",\"sampler3D\",\"samplerCube\",\"sampler1DShadow\",\"sampler2DShadow\",\"struct\",\"asm\",\"class\",\"union\",\"enum\",\"typedef\",\"template\",\"this\",\"packed\",\"goto\",\"switch\",\"default\",\"inline\",\"noinline\",\"volatile\",\"public\",\"static\",\"extern\",\"external\",\"interface\",\"long\",\"short\",\"double\",\"half\",\"fixed\",\"unsigned\",\"input\",\"output\",\"hvec2\",\"hvec3\",\"hvec4\",\"dvec2\",\"dvec3\",\"dvec4\",\"fvec2\",\"fvec3\",\"fvec4\",\"sampler2DRect\",\"sampler3DRect\",\"sampler2DRectShadow\",\"sizeof\",\"cast\",\"namespace\",\"using\"]},7827:function(t){t.exports=[\"<<=\",\">>=\",\"++\",\"--\",\"<<\",\">>\",\"<=\",\">=\",\"==\",\"!=\",\"&&\",\"||\",\"+=\",\"-=\",\"*=\",\"/=\",\"%=\",\"&=\",\"^^\",\"^=\",\"|=\",\"(\",\")\",\"[\",\"]\",\".\",\"!\",\"~\",\"*\",\"/\",\"%\",\"+\",\"-\",\"<\",\">\",\"&\",\"^\",\"|\",\"?\",\":\",\"=\",\",\",\";\",\"{\",\"}\"]},4905:function(t,e,r){var n=r(5874);t.exports=function(t,e){var r=n(e),i=[];return(i=i.concat(r(t))).concat(r(null))}},3236:function(t){t.exports=function(t){\"string\"==typeof t&&(t=[t]);for(var e=[].slice.call(arguments,1),r=[],n=0;n>1,u=-7,h=r?i-1:0,f=r?-1:1,p=t[e+h];for(h+=f,a=p&(1<<-u)-1,p>>=-u,u+=s;u>0;a=256*a+t[e+h],h+=f,u-=8);for(o=a&(1<<-u)-1,a>>=-u,u+=n;u>0;o=256*o+t[e+h],h+=f,u-=8);if(0===a)a=1-c;else{if(a===l)return o?NaN:1/0*(p?-1:1);o+=Math.pow(2,n),a-=c}return(p?-1:1)*o*Math.pow(2,a-n)},e.write=function(t,e,r,n,i,a){var o,s,l,c=8*a-i-1,u=(1<>1,f=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,p=n?0:a-1,d=n?1:-1,m=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(s=isNaN(e)?1:0,o=u):(o=Math.floor(Math.log(e)/Math.LN2),e*(l=Math.pow(2,-o))<1&&(o--,l*=2),(e+=o+h>=1?f/l:f*Math.pow(2,1-h))*l>=2&&(o++,l/=2),o+h>=u?(s=0,o=u):o+h>=1?(s=(e*l-1)*Math.pow(2,i),o+=h):(s=e*Math.pow(2,h-1)*Math.pow(2,i),o=0));i>=8;t[r+p]=255&s,p+=d,s/=256,i-=8);for(o=o<0;t[r+p]=255&o,p+=d,o/=256,c-=8);t[r+p-d]|=128*m}},8954:function(t,e,r){\"use strict\";t.exports=function(t,e){var r=t.length;if(0===r)throw new Error(\"Must have at least d+1 points\");var i=t[0].length;if(r<=i)throw new Error(\"Must input at least d+1 points\");var o=t.slice(0,i+1),s=n.apply(void 0,o);if(0===s)throw new Error(\"Input not in general position\");for(var l=new Array(i+1),u=0;u<=i;++u)l[u]=u;s<0&&(l[0]=1,l[1]=0);var h=new a(l,new Array(i+1),!1),f=h.adjacent,p=new Array(i+2);for(u=0;u<=i;++u){for(var d=l.slice(),m=0;m<=i;++m)m===u&&(d[m]=-1);var g=d[0];d[0]=d[1],d[1]=g;var y=new a(d,new Array(i+1),!0);f[u]=y,p[u]=y}for(p[i+1]=h,u=0;u<=i;++u){d=f[u].vertices;var v=f[u].adjacent;for(m=0;m<=i;++m){var x=d[m];if(x<0)v[m]=h;else for(var _=0;_<=i;++_)f[_].vertices.indexOf(x)<0&&(v[m]=f[_])}}var b=new c(i,o,p),w=!!e;for(u=i+1;u0;)for(var s=(t=o.pop()).adjacent,l=0;l<=r;++l){var c=s[l];if(c.boundary&&!(c.lastVisited<=-n)){for(var u=c.vertices,h=0;h<=r;++h){var f=u[h];i[h]=f<0?e:a[f]}var p=this.orient();if(p>0)return c;c.lastVisited=-n,0===p&&o.push(c)}}return null},u.walk=function(t,e){var r=this.vertices.length-1,n=this.dimension,i=this.vertices,a=this.tuple,o=e?this.interior.length*Math.random()|0:this.interior.length-1,s=this.interior[o];t:for(;!s.boundary;){for(var l=s.vertices,c=s.adjacent,u=0;u<=n;++u)a[u]=i[l[u]];for(s.lastVisited=r,u=0;u<=n;++u){var h=c[u];if(!(h.lastVisited>=r)){var f=a[u];a[u]=t;var p=this.orient();if(a[u]=f,p<0){s=h;continue t}h.boundary?h.lastVisited=-r:h.lastVisited=r}}return}return s},u.addPeaks=function(t,e){var r=this.vertices.length-1,n=this.dimension,i=this.vertices,l=this.tuple,c=this.interior,u=this.simplices,h=[e];e.lastVisited=r,e.vertices[e.vertices.indexOf(-1)]=r,e.boundary=!1,c.push(e);for(var f=[];h.length>0;){var p=(e=h.pop()).vertices,d=e.adjacent,m=p.indexOf(r);if(!(m<0))for(var g=0;g<=n;++g)if(g!==m){var y=d[g];if(y.boundary&&!(y.lastVisited>=r)){var v=y.vertices;if(y.lastVisited!==-r){for(var x=0,_=0;_<=n;++_)v[_]<0?(x=_,l[_]=t):l[_]=i[v[_]];if(this.orient()>0){v[x]=r,y.boundary=!1,c.push(y),h.push(y),y.lastVisited=r;continue}y.lastVisited=-r}var b=y.adjacent,w=p.slice(),T=d.slice(),k=new a(w,T,!0);u.push(k);var A=b.indexOf(e);if(!(A<0))for(b[A]=k,T[m]=y,w[g]=-1,T[g]=e,d[g]=k,k.flip(),_=0;_<=n;++_){var M=w[_];if(!(M<0||M===r)){for(var S=new Array(n-1),E=0,C=0;C<=n;++C){var L=w[C];L<0||C===_||(S[E++]=L)}f.push(new o(S,k,_))}}}}}for(f.sort(s),g=0;g+1=0?o[l++]=s[u]:c=1&u;if(c===(1&t)){var h=o[0];o[0]=o[1],o[1]=h}e.push(o)}}return e}},3352:function(t,e,r){\"use strict\";var n=r(2478);function i(t,e,r,n,i){this.mid=t,this.left=e,this.right=r,this.leftPoints=n,this.rightPoints=i,this.count=(e?e.count:0)+(r?r.count:0)+n.length}t.exports=function(t){return t&&0!==t.length?new y(g(t)):new y(null)};var a=i.prototype;function o(t,e){t.mid=e.mid,t.left=e.left,t.right=e.right,t.leftPoints=e.leftPoints,t.rightPoints=e.rightPoints,t.count=e.count}function s(t,e){var r=g(e);t.mid=r.mid,t.left=r.left,t.right=r.right,t.leftPoints=r.leftPoints,t.rightPoints=r.rightPoints,t.count=r.count}function l(t,e){var r=t.intervals([]);r.push(e),s(t,r)}function c(t,e){var r=t.intervals([]),n=r.indexOf(e);return n<0?0:(r.splice(n,1),s(t,r),1)}function u(t,e,r){for(var n=0;n=0&&t[n][1]>=e;--n){var i=r(t[n]);if(i)return i}}function f(t,e){for(var r=0;r>1],a=[],o=[],s=[];for(r=0;r3*(e+1)?l(this,t):this.left.insert(t):this.left=g([t]);else if(t[0]>this.mid)this.right?4*(this.right.count+1)>3*(e+1)?l(this,t):this.right.insert(t):this.right=g([t]);else{var r=n.ge(this.leftPoints,t,d),i=n.ge(this.rightPoints,t,m);this.leftPoints.splice(r,0,t),this.rightPoints.splice(i,0,t)}},a.remove=function(t){var e=this.count-this.leftPoints;if(t[1]3*(e-1)?c(this,t):2===(s=this.left.remove(t))?(this.left=null,this.count-=1,1):(1===s&&(this.count-=1),s):0;if(t[0]>this.mid)return this.right?4*(this.left?this.left.count:0)>3*(e-1)?c(this,t):2===(s=this.right.remove(t))?(this.right=null,this.count-=1,1):(1===s&&(this.count-=1),s):0;if(1===this.count)return this.leftPoints[0]===t?2:0;if(1===this.leftPoints.length&&this.leftPoints[0]===t){if(this.left&&this.right){for(var r=this,i=this.left;i.right;)r=i,i=i.right;if(r===this)i.right=this.right;else{var a=this.left,s=this.right;r.count-=i.count,r.right=i.left,i.left=a,i.right=s}o(this,i),this.count=(this.left?this.left.count:0)+(this.right?this.right.count:0)+this.leftPoints.length}else this.left?o(this,this.left):o(this,this.right);return 1}for(a=n.ge(this.leftPoints,t,d);athis.mid?this.right&&(r=this.right.queryPoint(t,e))?r:h(this.rightPoints,t,e):f(this.leftPoints,e);var r},a.queryInterval=function(t,e,r){var n;return tthis.mid&&this.right&&(n=this.right.queryInterval(t,e,r))?n:ethis.mid?h(this.rightPoints,t,r):f(this.leftPoints,r)};var v=y.prototype;v.insert=function(t){this.root?this.root.insert(t):this.root=new i(t[0],null,null,[t],[t])},v.remove=function(t){if(this.root){var e=this.root.remove(t);return 2===e&&(this.root=null),0!==e}return!1},v.queryPoint=function(t,e){if(this.root)return this.root.queryPoint(t,e)},v.queryInterval=function(t,e,r){if(t<=e&&this.root)return this.root.queryInterval(t,e,r)},Object.defineProperty(v,\"count\",{get:function(){return this.root?this.root.count:0}}),Object.defineProperty(v,\"intervals\",{get:function(){return this.root?this.root.intervals([]):[]}})},7762:function(t){\"use strict\";t.exports=function(t){for(var e=new Array(t),r=0;r13)&&32!==e&&133!==e&&160!==e&&5760!==e&&6158!==e&&(e<8192||e>8205)&&8232!==e&&8233!==e&&8239!==e&&8287!==e&&8288!==e&&12288!==e&&65279!==e)return!1;return!0}},395:function(t){t.exports=function(t,e,r){return t*(1-r)+e*r}},2652:function(t,e,r){var n=r(4335),i=r(6864),a=r(1903),o=r(9921),s=r(7608),l=r(5665),c={length:r(1387),normalize:r(3536),dot:r(244),cross:r(5911)},u=i(),h=i(),f=[0,0,0,0],p=[[0,0,0],[0,0,0],[0,0,0]],d=[0,0,0];function m(t,e,r,n,i){t[0]=e[0]*n+r[0]*i,t[1]=e[1]*n+r[1]*i,t[2]=e[2]*n+r[2]*i}t.exports=function(t,e,r,i,g,y){if(e||(e=[0,0,0]),r||(r=[0,0,0]),i||(i=[0,0,0]),g||(g=[0,0,0,1]),y||(y=[0,0,0,1]),!n(u,t))return!1;if(a(h,u),h[3]=0,h[7]=0,h[11]=0,h[15]=1,Math.abs(o(h)<1e-8))return!1;var v,x,_,b,w,T,k,A=u[3],M=u[7],S=u[11],E=u[12],C=u[13],L=u[14],I=u[15];if(0!==A||0!==M||0!==S){if(f[0]=A,f[1]=M,f[2]=S,f[3]=I,!s(h,h))return!1;l(h,h),v=g,_=h,b=(x=f)[0],w=x[1],T=x[2],k=x[3],v[0]=_[0]*b+_[4]*w+_[8]*T+_[12]*k,v[1]=_[1]*b+_[5]*w+_[9]*T+_[13]*k,v[2]=_[2]*b+_[6]*w+_[10]*T+_[14]*k,v[3]=_[3]*b+_[7]*w+_[11]*T+_[15]*k}else g[0]=g[1]=g[2]=0,g[3]=1;if(e[0]=E,e[1]=C,e[2]=L,function(t,e){t[0][0]=e[0],t[0][1]=e[1],t[0][2]=e[2],t[1][0]=e[4],t[1][1]=e[5],t[1][2]=e[6],t[2][0]=e[8],t[2][1]=e[9],t[2][2]=e[10]}(p,u),r[0]=c.length(p[0]),c.normalize(p[0],p[0]),i[0]=c.dot(p[0],p[1]),m(p[1],p[1],p[0],1,-i[0]),r[1]=c.length(p[1]),c.normalize(p[1],p[1]),i[0]/=r[1],i[1]=c.dot(p[0],p[2]),m(p[2],p[2],p[0],1,-i[1]),i[2]=c.dot(p[1],p[2]),m(p[2],p[2],p[1],1,-i[2]),r[2]=c.length(p[2]),c.normalize(p[2],p[2]),i[1]/=r[2],i[2]/=r[2],c.cross(d,p[1],p[2]),c.dot(p[0],d)<0)for(var P=0;P<3;P++)r[P]*=-1,p[P][0]*=-1,p[P][1]*=-1,p[P][2]*=-1;return y[0]=.5*Math.sqrt(Math.max(1+p[0][0]-p[1][1]-p[2][2],0)),y[1]=.5*Math.sqrt(Math.max(1-p[0][0]+p[1][1]-p[2][2],0)),y[2]=.5*Math.sqrt(Math.max(1-p[0][0]-p[1][1]+p[2][2],0)),y[3]=.5*Math.sqrt(Math.max(1+p[0][0]+p[1][1]+p[2][2],0)),p[2][1]>p[1][2]&&(y[0]=-y[0]),p[0][2]>p[2][0]&&(y[1]=-y[1]),p[1][0]>p[0][1]&&(y[2]=-y[2]),!0}},4335:function(t){t.exports=function(t,e){var r=e[15];if(0===r)return!1;for(var n=1/r,i=0;i<16;i++)t[i]=e[i]*n;return!0}},7442:function(t,e,r){var n=r(6658),i=r(7182),a=r(2652),o=r(9921),s=r(8648),l=h(),c=h(),u=h();function h(){return{translate:f(),scale:f(1),skew:f(),perspective:[0,0,0,1],quaternion:[0,0,0,1]}}function f(t){return[t||0,t||0,t||0]}t.exports=function(t,e,r,h){if(0===o(e)||0===o(r))return!1;var f=a(e,l.translate,l.scale,l.skew,l.perspective,l.quaternion),p=a(r,c.translate,c.scale,c.skew,c.perspective,c.quaternion);return!(!f||!p||(n(u.translate,l.translate,c.translate,h),n(u.skew,l.skew,c.skew,h),n(u.scale,l.scale,c.scale,h),n(u.perspective,l.perspective,c.perspective,h),s(u.quaternion,l.quaternion,c.quaternion,h),i(t,u.translate,u.scale,u.skew,u.perspective,u.quaternion),0))}},7182:function(t,e,r){var n={identity:r(7894),translate:r(7656),multiply:r(6760),create:r(6864),scale:r(2504),fromRotationTranslation:r(6743)},i=(n.create(),n.create());t.exports=function(t,e,r,a,o,s){return n.identity(t),n.fromRotationTranslation(t,s,e),t[3]=o[0],t[7]=o[1],t[11]=o[2],t[15]=o[3],n.identity(i),0!==a[2]&&(i[9]=a[2],n.multiply(t,t,i)),0!==a[1]&&(i[9]=0,i[8]=a[1],n.multiply(t,t,i)),0!==a[0]&&(i[8]=0,i[4]=a[0],n.multiply(t,t,i)),n.scale(t,t,r),t}},4192:function(t,e,r){\"use strict\";var n=r(2478),i=r(7442),a=r(7608),o=r(5567),s=r(2408),l=r(7089),c=r(6582),u=r(7656),h=(r(2504),r(3536)),f=[0,0,0];function p(t){this._components=t.slice(),this._time=[0],this.prevMatrix=t.slice(),this.nextMatrix=t.slice(),this.computedMatrix=t.slice(),this.computedInverse=t.slice(),this.computedEye=[0,0,0],this.computedUp=[0,0,0],this.computedCenter=[0,0,0],this.computedRadius=[0],this._limits=[-1/0,1/0]}t.exports=function(t){return new p((t=t||{}).matrix||[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1])};var d=p.prototype;d.recalcMatrix=function(t){var e=this._time,r=n.le(e,t),o=this.computedMatrix;if(!(r<0)){var s=this._components;if(r===e.length-1)for(var l=16*r,c=0;c<16;++c)o[c]=s[l++];else{var u=e[r+1]-e[r],f=(l=16*r,this.prevMatrix),p=!0;for(c=0;c<16;++c)f[c]=s[l++];var d=this.nextMatrix;for(c=0;c<16;++c)d[c]=s[l++],p=p&&f[c]===d[c];if(u<1e-6||p)for(c=0;c<16;++c)o[c]=f[c];else i(o,f,d,(t-e[r])/u)}var m=this.computedUp;m[0]=o[1],m[1]=o[5],m[2]=o[9],h(m,m);var g=this.computedInverse;a(g,o);var y=this.computedEye,v=g[15];y[0]=g[12]/v,y[1]=g[13]/v,y[2]=g[14]/v;var x=this.computedCenter,_=Math.exp(this.computedRadius[0]);for(c=0;c<3;++c)x[c]=y[c]-o[2+4*c]*_}},d.idle=function(t){if(!(t1&&n(t[o[u-2]],t[o[u-1]],c)<=0;)u-=1,o.pop();for(o.push(l),u=s.length;u>1&&n(t[s[u-2]],t[s[u-1]],c)>=0;)u-=1,s.pop();s.push(l)}r=new Array(s.length+o.length-2);for(var h=0,f=(i=0,o.length);i0;--p)r[h++]=s[p];return r};var n=r(3250)[3]},351:function(t,e,r){\"use strict\";t.exports=function(t,e){e||(e=t,t=window);var r=0,i=0,a=0,o={shift:!1,alt:!1,control:!1,meta:!1},s=!1;function l(t){var e=!1;return\"altKey\"in t&&(e=e||t.altKey!==o.alt,o.alt=!!t.altKey),\"shiftKey\"in t&&(e=e||t.shiftKey!==o.shift,o.shift=!!t.shiftKey),\"ctrlKey\"in t&&(e=e||t.ctrlKey!==o.control,o.control=!!t.ctrlKey),\"metaKey\"in t&&(e=e||t.metaKey!==o.meta,o.meta=!!t.metaKey),e}function c(t,s){var c=n.x(s),u=n.y(s);\"buttons\"in s&&(t=0|s.buttons),(t!==r||c!==i||u!==a||l(s))&&(r=0|t,i=c||0,a=u||0,e&&e(r,i,a,o))}function u(t){c(0,t)}function h(){(r||i||a||o.shift||o.alt||o.meta||o.control)&&(i=a=0,r=0,o.shift=o.alt=o.control=o.meta=!1,e&&e(0,0,0,o))}function f(t){l(t)&&e&&e(r,i,a,o)}function p(t){0===n.buttons(t)?c(0,t):c(r,t)}function d(t){c(r|n.buttons(t),t)}function m(t){c(r&~n.buttons(t),t)}function g(){s||(s=!0,t.addEventListener(\"mousemove\",p),t.addEventListener(\"mousedown\",d),t.addEventListener(\"mouseup\",m),t.addEventListener(\"mouseleave\",u),t.addEventListener(\"mouseenter\",u),t.addEventListener(\"mouseout\",u),t.addEventListener(\"mouseover\",u),t.addEventListener(\"blur\",h),t.addEventListener(\"keyup\",f),t.addEventListener(\"keydown\",f),t.addEventListener(\"keypress\",f),t!==window&&(window.addEventListener(\"blur\",h),window.addEventListener(\"keyup\",f),window.addEventListener(\"keydown\",f),window.addEventListener(\"keypress\",f)))}g();var y={element:t};return Object.defineProperties(y,{enabled:{get:function(){return s},set:function(e){e?g():s&&(s=!1,t.removeEventListener(\"mousemove\",p),t.removeEventListener(\"mousedown\",d),t.removeEventListener(\"mouseup\",m),t.removeEventListener(\"mouseleave\",u),t.removeEventListener(\"mouseenter\",u),t.removeEventListener(\"mouseout\",u),t.removeEventListener(\"mouseover\",u),t.removeEventListener(\"blur\",h),t.removeEventListener(\"keyup\",f),t.removeEventListener(\"keydown\",f),t.removeEventListener(\"keypress\",f),t!==window&&(window.removeEventListener(\"blur\",h),window.removeEventListener(\"keyup\",f),window.removeEventListener(\"keydown\",f),window.removeEventListener(\"keypress\",f)))},enumerable:!0},buttons:{get:function(){return r},enumerable:!0},x:{get:function(){return i},enumerable:!0},y:{get:function(){return a},enumerable:!0},mods:{get:function(){return o},enumerable:!0}}),y};var n=r(4687)},24:function(t){var e={left:0,top:0};t.exports=function(t,r,n){r=r||t.currentTarget||t.srcElement,Array.isArray(n)||(n=[0,0]);var i,a=t.clientX||0,o=t.clientY||0,s=(i=r)===window||i===document||i===document.body?e:i.getBoundingClientRect();return n[0]=a-s.left,n[1]=o-s.top,n}},4687:function(t,e){\"use strict\";function r(t){return t.target||t.srcElement||window}e.buttons=function(t){if(\"object\"==typeof t){if(\"buttons\"in t)return t.buttons;if(\"which\"in t){if(2===(e=t.which))return 4;if(3===e)return 2;if(e>0)return 1<=0)return 1< 0\"),\"function\"!=typeof t.vertex&&e(\"Must specify vertex creation function\"),\"function\"!=typeof t.cell&&e(\"Must specify cell creation function\"),\"function\"!=typeof t.phase&&e(\"Must specify phase function\");for(var o=t.getters||[],s=new Array(a),l=0;l=0?s[l]=!0:s[l]=!1;return function(t,e,r,a,o,s){var l=[s,o].join(\",\");return(0,i[l])(t,e,r,n.mallocUint32,n.freeUint32)}(t.vertex,t.cell,t.phase,0,r,s)};var i={\"false,0,1\":function(t,e,r,n,i){return function(a,o,s,l){var c,u=0|a.shape[0],h=0|a.shape[1],f=a.data,p=0|a.offset,d=0|a.stride[0],m=0|a.stride[1],g=p,y=0|-d,v=0,x=0|-m,_=0,b=-d-m|0,w=0,T=0|d,k=m-d*u|0,A=0,M=0,S=0,E=2*u|0,C=n(E),L=n(E),I=0,P=0,z=-1,O=-1,D=0,R=0|-u,F=0|u,B=0,N=-u-1|0,j=u-1|0,U=0,V=0,q=0;for(A=0;A0){if(M=1,C[I++]=r(f[g],o,s,l),g+=T,u>0)for(A=1,c=f[g],P=C[I]=r(c,o,s,l),D=C[I+z],B=C[I+R],U=C[I+N],P===D&&P===B&&P===U||(v=f[g+y],_=f[g+x],w=f[g+b],t(A,M,c,v,_,w,P,D,B,U,o,s,l),V=L[I]=S++),I+=1,g+=T,A=2;A0)for(A=1,c=f[g],P=C[I]=r(c,o,s,l),D=C[I+z],B=C[I+R],U=C[I+N],P===D&&P===B&&P===U||(v=f[g+y],_=f[g+x],w=f[g+b],t(A,M,c,v,_,w,P,D,B,U,o,s,l),V=L[I]=S++,U!==B&&e(L[I+R],V,_,w,B,U,o,s,l)),I+=1,g+=T,A=2;A0){if(A=1,C[I++]=r(f[g],o,s,l),g+=T,h>0)for(M=1,c=f[g],P=C[I]=r(c,o,s,l),B=C[I+R],D=C[I+z],U=C[I+N],P===B&&P===D&&P===U||(v=f[g+y],_=f[g+x],w=f[g+b],t(A,M,c,v,_,w,P,B,D,U,o,s,l),V=L[I]=S++),I+=1,g+=T,M=2;M0)for(M=1,c=f[g],P=C[I]=r(c,o,s,l),B=C[I+R],D=C[I+z],U=C[I+N],P===B&&P===D&&P===U||(v=f[g+y],_=f[g+x],w=f[g+b],t(A,M,c,v,_,w,P,B,D,U,o,s,l),V=L[I]=S++,U!==B&&e(L[I+R],V,w,v,U,B,o,s,l)),I+=1,g+=T,M=2;M2&&a[1]>2&&n(i.pick(-1,-1).lo(1,1).hi(a[0]-2,a[1]-2),t.pick(-1,-1,0).lo(1,1).hi(a[0]-2,a[1]-2),t.pick(-1,-1,1).lo(1,1).hi(a[0]-2,a[1]-2)),a[1]>2&&(r(i.pick(0,-1).lo(1).hi(a[1]-2),t.pick(0,-1,1).lo(1).hi(a[1]-2)),e(t.pick(0,-1,0).lo(1).hi(a[1]-2))),a[1]>2&&(r(i.pick(a[0]-1,-1).lo(1).hi(a[1]-2),t.pick(a[0]-1,-1,1).lo(1).hi(a[1]-2)),e(t.pick(a[0]-1,-1,0).lo(1).hi(a[1]-2))),a[0]>2&&(r(i.pick(-1,0).lo(1).hi(a[0]-2),t.pick(-1,0,0).lo(1).hi(a[0]-2)),e(t.pick(-1,0,1).lo(1).hi(a[0]-2))),a[0]>2&&(r(i.pick(-1,a[1]-1).lo(1).hi(a[0]-2),t.pick(-1,a[1]-1,0).lo(1).hi(a[0]-2)),e(t.pick(-1,a[1]-1,1).lo(1).hi(a[0]-2))),t.set(0,0,0,0),t.set(0,0,1,0),t.set(a[0]-1,0,0,0),t.set(a[0]-1,0,1,0),t.set(0,a[1]-1,0,0),t.set(0,a[1]-1,1,0),t.set(a[0]-1,a[1]-1,0,0),t.set(a[0]-1,a[1]-1,1,0),t}}t.exports=function(t,e,r){return Array.isArray(r)||(r=n(e.dimension,\"string\"==typeof r?r:\"clamp\")),0===e.size?t:0===e.dimension?(t.set(0),t):function(t){var e=t.join();if(a=u[e])return a;for(var r=t.length,n=[h,f],i=1;i<=r;++i)n.push(p(i));var a=d.apply(void 0,n);return u[e]=a,a}(r)(t,e)}},4317:function(t){\"use strict\";function e(t,e){var r=Math.floor(e),n=e-r,i=0<=r&&r0;){x<64?(l=x,x=0):(l=64,x-=64);for(var _=0|t[1];_>0;){_<64?(c=_,_=0):(c=64,_-=64),n=y+x*h+_*f,o=v+x*d+_*m;var b=0,w=0,T=0,k=p,A=h-u*p,M=f-l*h,S=g,E=d-u*g,C=m-l*d;for(T=0;T0;){m<64?(l=m,m=0):(l=64,m-=64);for(var g=0|t[0];g>0;){g<64?(s=g,g=0):(s=64,g-=64),n=p+m*u+g*c,o=d+m*f+g*h;var y=0,v=0,x=u,_=c-l*u,b=f,w=h-l*f;for(v=0;v0;){v<64?(c=v,v=0):(c=64,v-=64);for(var x=0|t[0];x>0;){x<64?(s=x,x=0):(s=64,x-=64);for(var _=0|t[1];_>0;){_<64?(l=_,_=0):(l=64,_-=64),n=g+v*f+x*u+_*h,o=y+v*m+x*p+_*d;var b=0,w=0,T=0,k=f,A=u-c*f,M=h-s*u,S=m,E=p-c*m,C=d-s*p;for(T=0;Tr;){y=0,v=m-o;e:for(g=0;g_)break e;v+=h,y+=f}for(y=m,v=m-o,g=0;g>1,H=q-j,G=q+j,Z=U,W=H,Y=q,X=G,$=V,J=i+1,K=a-1,Q=!0,tt=0,et=0,rt=0,nt=h,it=e(nt),at=e(nt);A=l*Z,M=l*W,N=s;t:for(k=0;k0){g=Z,Z=W,W=g;break t}if(rt<0)break t;N+=p}A=l*X,M=l*$,N=s;t:for(k=0;k0){g=X,X=$,$=g;break t}if(rt<0)break t;N+=p}A=l*Z,M=l*Y,N=s;t:for(k=0;k0){g=Z,Z=Y,Y=g;break t}if(rt<0)break t;N+=p}A=l*W,M=l*Y,N=s;t:for(k=0;k0){g=W,W=Y,Y=g;break t}if(rt<0)break t;N+=p}A=l*Z,M=l*X,N=s;t:for(k=0;k0){g=Z,Z=X,X=g;break t}if(rt<0)break t;N+=p}A=l*Y,M=l*X,N=s;t:for(k=0;k0){g=Y,Y=X,X=g;break t}if(rt<0)break t;N+=p}A=l*W,M=l*$,N=s;t:for(k=0;k0){g=W,W=$,$=g;break t}if(rt<0)break t;N+=p}A=l*W,M=l*Y,N=s;t:for(k=0;k0){g=W,W=Y,Y=g;break t}if(rt<0)break t;N+=p}A=l*X,M=l*$,N=s;t:for(k=0;k0){g=X,X=$,$=g;break t}if(rt<0)break t;N+=p}for(A=l*Z,M=l*W,S=l*Y,E=l*X,C=l*$,L=l*U,I=l*q,P=l*V,B=0,N=s,k=0;k0)){if(rt<0){for(A=l*_,M=l*J,S=l*K,N=s,k=0;k0)for(;;){for(b=s+K*l,B=0,k=0;k0)){for(b=s+K*l,B=0,k=0;kV){t:for(;;){for(b=s+J*l,B=0,N=s,k=0;k1&&n?s(r,n[0],n[1]):s(r)}(t,e,l);return n(l,c)}},446:function(t,e,r){\"use strict\";var n=r(7640),i={};t.exports=function(t){var e=t.order,r=t.dtype,a=[e,r].join(\":\"),o=i[a];return o||(i[a]=o=n(e,r)),o(t),t}},9618:function(t,e,r){var n=r(7163),i=\"undefined\"!=typeof Float64Array;function a(t,e){return t[0]-e[0]}function o(){var t,e=this.stride,r=new Array(e.length);for(t=0;t=0&&(e+=a*(r=0|t),i-=r),new n(this.data,i,a,e)},i.step=function(t){var e=this.shape[0],r=this.stride[0],i=this.offset,a=0,o=Math.ceil;return\"number\"==typeof t&&((a=0|t)<0?(i+=r*(e-1),e=o(-e/a)):e=o(e/a),r*=a),new n(this.data,e,r,i)},i.transpose=function(t){t=void 0===t?0:0|t;var e=this.shape,r=this.stride;return new n(this.data,e[t],r[t],this.offset)},i.pick=function(t){var r=[],n=[],i=this.offset;return\"number\"==typeof t&&t>=0?i=i+this.stride[0]*t|0:(r.push(this.shape[0]),n.push(this.stride[0])),(0,e[r.length+1])(this.data,r,n,i)},function(t,e,r,i){return new n(t,e[0],r[0],i)}},2:function(t,e,r){function n(t,e,r,n,i,a){this.data=t,this.shape=[e,r],this.stride=[n,i],this.offset=0|a}var i=n.prototype;return i.dtype=t,i.dimension=2,Object.defineProperty(i,\"size\",{get:function(){return this.shape[0]*this.shape[1]}}),Object.defineProperty(i,\"order\",{get:function(){return Math.abs(this.stride[0])>Math.abs(this.stride[1])?[1,0]:[0,1]}}),i.set=function(e,r,n){return\"generic\"===t?this.data.set(this.offset+this.stride[0]*e+this.stride[1]*r,n):this.data[this.offset+this.stride[0]*e+this.stride[1]*r]=n},i.get=function(e,r){return\"generic\"===t?this.data.get(this.offset+this.stride[0]*e+this.stride[1]*r):this.data[this.offset+this.stride[0]*e+this.stride[1]*r]},i.index=function(t,e){return this.offset+this.stride[0]*t+this.stride[1]*e},i.hi=function(t,e){return new n(this.data,\"number\"!=typeof t||t<0?this.shape[0]:0|t,\"number\"!=typeof e||e<0?this.shape[1]:0|e,this.stride[0],this.stride[1],this.offset)},i.lo=function(t,e){var r=this.offset,i=0,a=this.shape[0],o=this.shape[1],s=this.stride[0],l=this.stride[1];return\"number\"==typeof t&&t>=0&&(r+=s*(i=0|t),a-=i),\"number\"==typeof e&&e>=0&&(r+=l*(i=0|e),o-=i),new n(this.data,a,o,s,l,r)},i.step=function(t,e){var r=this.shape[0],i=this.shape[1],a=this.stride[0],o=this.stride[1],s=this.offset,l=0,c=Math.ceil;return\"number\"==typeof t&&((l=0|t)<0?(s+=a*(r-1),r=c(-r/l)):r=c(r/l),a*=l),\"number\"==typeof e&&((l=0|e)<0?(s+=o*(i-1),i=c(-i/l)):i=c(i/l),o*=l),new n(this.data,r,i,a,o,s)},i.transpose=function(t,e){t=void 0===t?0:0|t,e=void 0===e?1:0|e;var r=this.shape,i=this.stride;return new n(this.data,r[t],r[e],i[t],i[e],this.offset)},i.pick=function(t,r){var n=[],i=[],a=this.offset;return\"number\"==typeof t&&t>=0?a=a+this.stride[0]*t|0:(n.push(this.shape[0]),i.push(this.stride[0])),\"number\"==typeof r&&r>=0?a=a+this.stride[1]*r|0:(n.push(this.shape[1]),i.push(this.stride[1])),(0,e[n.length+1])(this.data,n,i,a)},function(t,e,r,i){return new n(t,e[0],e[1],r[0],r[1],i)}},3:function(t,e,r){function n(t,e,r,n,i,a,o,s){this.data=t,this.shape=[e,r,n],this.stride=[i,a,o],this.offset=0|s}var i=n.prototype;return i.dtype=t,i.dimension=3,Object.defineProperty(i,\"size\",{get:function(){return this.shape[0]*this.shape[1]*this.shape[2]}}),Object.defineProperty(i,\"order\",{get:function(){var t=Math.abs(this.stride[0]),e=Math.abs(this.stride[1]),r=Math.abs(this.stride[2]);return t>e?e>r?[2,1,0]:t>r?[1,2,0]:[1,0,2]:t>r?[2,0,1]:r>e?[0,1,2]:[0,2,1]}}),i.set=function(e,r,n,i){return\"generic\"===t?this.data.set(this.offset+this.stride[0]*e+this.stride[1]*r+this.stride[2]*n,i):this.data[this.offset+this.stride[0]*e+this.stride[1]*r+this.stride[2]*n]=i},i.get=function(e,r,n){return\"generic\"===t?this.data.get(this.offset+this.stride[0]*e+this.stride[1]*r+this.stride[2]*n):this.data[this.offset+this.stride[0]*e+this.stride[1]*r+this.stride[2]*n]},i.index=function(t,e,r){return this.offset+this.stride[0]*t+this.stride[1]*e+this.stride[2]*r},i.hi=function(t,e,r){return new n(this.data,\"number\"!=typeof t||t<0?this.shape[0]:0|t,\"number\"!=typeof e||e<0?this.shape[1]:0|e,\"number\"!=typeof r||r<0?this.shape[2]:0|r,this.stride[0],this.stride[1],this.stride[2],this.offset)},i.lo=function(t,e,r){var i=this.offset,a=0,o=this.shape[0],s=this.shape[1],l=this.shape[2],c=this.stride[0],u=this.stride[1],h=this.stride[2];return\"number\"==typeof t&&t>=0&&(i+=c*(a=0|t),o-=a),\"number\"==typeof e&&e>=0&&(i+=u*(a=0|e),s-=a),\"number\"==typeof r&&r>=0&&(i+=h*(a=0|r),l-=a),new n(this.data,o,s,l,c,u,h,i)},i.step=function(t,e,r){var i=this.shape[0],a=this.shape[1],o=this.shape[2],s=this.stride[0],l=this.stride[1],c=this.stride[2],u=this.offset,h=0,f=Math.ceil;return\"number\"==typeof t&&((h=0|t)<0?(u+=s*(i-1),i=f(-i/h)):i=f(i/h),s*=h),\"number\"==typeof e&&((h=0|e)<0?(u+=l*(a-1),a=f(-a/h)):a=f(a/h),l*=h),\"number\"==typeof r&&((h=0|r)<0?(u+=c*(o-1),o=f(-o/h)):o=f(o/h),c*=h),new n(this.data,i,a,o,s,l,c,u)},i.transpose=function(t,e,r){t=void 0===t?0:0|t,e=void 0===e?1:0|e,r=void 0===r?2:0|r;var i=this.shape,a=this.stride;return new n(this.data,i[t],i[e],i[r],a[t],a[e],a[r],this.offset)},i.pick=function(t,r,n){var i=[],a=[],o=this.offset;return\"number\"==typeof t&&t>=0?o=o+this.stride[0]*t|0:(i.push(this.shape[0]),a.push(this.stride[0])),\"number\"==typeof r&&r>=0?o=o+this.stride[1]*r|0:(i.push(this.shape[1]),a.push(this.stride[1])),\"number\"==typeof n&&n>=0?o=o+this.stride[2]*n|0:(i.push(this.shape[2]),a.push(this.stride[2])),(0,e[i.length+1])(this.data,i,a,o)},function(t,e,r,i){return new n(t,e[0],e[1],e[2],r[0],r[1],r[2],i)}},4:function(t,e,r){function n(t,e,r,n,i,a,o,s,l,c){this.data=t,this.shape=[e,r,n,i],this.stride=[a,o,s,l],this.offset=0|c}var i=n.prototype;return i.dtype=t,i.dimension=4,Object.defineProperty(i,\"size\",{get:function(){return this.shape[0]*this.shape[1]*this.shape[2]*this.shape[3]}}),Object.defineProperty(i,\"order\",{get:r}),i.set=function(e,r,n,i,a){return\"generic\"===t?this.data.set(this.offset+this.stride[0]*e+this.stride[1]*r+this.stride[2]*n+this.stride[3]*i,a):this.data[this.offset+this.stride[0]*e+this.stride[1]*r+this.stride[2]*n+this.stride[3]*i]=a},i.get=function(e,r,n,i){return\"generic\"===t?this.data.get(this.offset+this.stride[0]*e+this.stride[1]*r+this.stride[2]*n+this.stride[3]*i):this.data[this.offset+this.stride[0]*e+this.stride[1]*r+this.stride[2]*n+this.stride[3]*i]},i.index=function(t,e,r,n){return this.offset+this.stride[0]*t+this.stride[1]*e+this.stride[2]*r+this.stride[3]*n},i.hi=function(t,e,r,i){return new n(this.data,\"number\"!=typeof t||t<0?this.shape[0]:0|t,\"number\"!=typeof e||e<0?this.shape[1]:0|e,\"number\"!=typeof r||r<0?this.shape[2]:0|r,\"number\"!=typeof i||i<0?this.shape[3]:0|i,this.stride[0],this.stride[1],this.stride[2],this.stride[3],this.offset)},i.lo=function(t,e,r,i){var a=this.offset,o=0,s=this.shape[0],l=this.shape[1],c=this.shape[2],u=this.shape[3],h=this.stride[0],f=this.stride[1],p=this.stride[2],d=this.stride[3];return\"number\"==typeof t&&t>=0&&(a+=h*(o=0|t),s-=o),\"number\"==typeof e&&e>=0&&(a+=f*(o=0|e),l-=o),\"number\"==typeof r&&r>=0&&(a+=p*(o=0|r),c-=o),\"number\"==typeof i&&i>=0&&(a+=d*(o=0|i),u-=o),new n(this.data,s,l,c,u,h,f,p,d,a)},i.step=function(t,e,r,i){var a=this.shape[0],o=this.shape[1],s=this.shape[2],l=this.shape[3],c=this.stride[0],u=this.stride[1],h=this.stride[2],f=this.stride[3],p=this.offset,d=0,m=Math.ceil;return\"number\"==typeof t&&((d=0|t)<0?(p+=c*(a-1),a=m(-a/d)):a=m(a/d),c*=d),\"number\"==typeof e&&((d=0|e)<0?(p+=u*(o-1),o=m(-o/d)):o=m(o/d),u*=d),\"number\"==typeof r&&((d=0|r)<0?(p+=h*(s-1),s=m(-s/d)):s=m(s/d),h*=d),\"number\"==typeof i&&((d=0|i)<0?(p+=f*(l-1),l=m(-l/d)):l=m(l/d),f*=d),new n(this.data,a,o,s,l,c,u,h,f,p)},i.transpose=function(t,e,r,i){t=void 0===t?0:0|t,e=void 0===e?1:0|e,r=void 0===r?2:0|r,i=void 0===i?3:0|i;var a=this.shape,o=this.stride;return new n(this.data,a[t],a[e],a[r],a[i],o[t],o[e],o[r],o[i],this.offset)},i.pick=function(t,r,n,i){var a=[],o=[],s=this.offset;return\"number\"==typeof t&&t>=0?s=s+this.stride[0]*t|0:(a.push(this.shape[0]),o.push(this.stride[0])),\"number\"==typeof r&&r>=0?s=s+this.stride[1]*r|0:(a.push(this.shape[1]),o.push(this.stride[1])),\"number\"==typeof n&&n>=0?s=s+this.stride[2]*n|0:(a.push(this.shape[2]),o.push(this.stride[2])),\"number\"==typeof i&&i>=0?s=s+this.stride[3]*i|0:(a.push(this.shape[3]),o.push(this.stride[3])),(0,e[a.length+1])(this.data,a,o,s)},function(t,e,r,i){return new n(t,e[0],e[1],e[2],e[3],r[0],r[1],r[2],r[3],i)}},5:function(t,e,r){function n(t,e,r,n,i,a,o,s,l,c,u,h){this.data=t,this.shape=[e,r,n,i,a],this.stride=[o,s,l,c,u],this.offset=0|h}var i=n.prototype;return i.dtype=t,i.dimension=5,Object.defineProperty(i,\"size\",{get:function(){return this.shape[0]*this.shape[1]*this.shape[2]*this.shape[3]*this.shape[4]}}),Object.defineProperty(i,\"order\",{get:r}),i.set=function(e,r,n,i,a,o){return\"generic\"===t?this.data.set(this.offset+this.stride[0]*e+this.stride[1]*r+this.stride[2]*n+this.stride[3]*i+this.stride[4]*a,o):this.data[this.offset+this.stride[0]*e+this.stride[1]*r+this.stride[2]*n+this.stride[3]*i+this.stride[4]*a]=o},i.get=function(e,r,n,i,a){return\"generic\"===t?this.data.get(this.offset+this.stride[0]*e+this.stride[1]*r+this.stride[2]*n+this.stride[3]*i+this.stride[4]*a):this.data[this.offset+this.stride[0]*e+this.stride[1]*r+this.stride[2]*n+this.stride[3]*i+this.stride[4]*a]},i.index=function(t,e,r,n,i){return this.offset+this.stride[0]*t+this.stride[1]*e+this.stride[2]*r+this.stride[3]*n+this.stride[4]*i},i.hi=function(t,e,r,i,a){return new n(this.data,\"number\"!=typeof t||t<0?this.shape[0]:0|t,\"number\"!=typeof e||e<0?this.shape[1]:0|e,\"number\"!=typeof r||r<0?this.shape[2]:0|r,\"number\"!=typeof i||i<0?this.shape[3]:0|i,\"number\"!=typeof a||a<0?this.shape[4]:0|a,this.stride[0],this.stride[1],this.stride[2],this.stride[3],this.stride[4],this.offset)},i.lo=function(t,e,r,i,a){var o=this.offset,s=0,l=this.shape[0],c=this.shape[1],u=this.shape[2],h=this.shape[3],f=this.shape[4],p=this.stride[0],d=this.stride[1],m=this.stride[2],g=this.stride[3],y=this.stride[4];return\"number\"==typeof t&&t>=0&&(o+=p*(s=0|t),l-=s),\"number\"==typeof e&&e>=0&&(o+=d*(s=0|e),c-=s),\"number\"==typeof r&&r>=0&&(o+=m*(s=0|r),u-=s),\"number\"==typeof i&&i>=0&&(o+=g*(s=0|i),h-=s),\"number\"==typeof a&&a>=0&&(o+=y*(s=0|a),f-=s),new n(this.data,l,c,u,h,f,p,d,m,g,y,o)},i.step=function(t,e,r,i,a){var o=this.shape[0],s=this.shape[1],l=this.shape[2],c=this.shape[3],u=this.shape[4],h=this.stride[0],f=this.stride[1],p=this.stride[2],d=this.stride[3],m=this.stride[4],g=this.offset,y=0,v=Math.ceil;return\"number\"==typeof t&&((y=0|t)<0?(g+=h*(o-1),o=v(-o/y)):o=v(o/y),h*=y),\"number\"==typeof e&&((y=0|e)<0?(g+=f*(s-1),s=v(-s/y)):s=v(s/y),f*=y),\"number\"==typeof r&&((y=0|r)<0?(g+=p*(l-1),l=v(-l/y)):l=v(l/y),p*=y),\"number\"==typeof i&&((y=0|i)<0?(g+=d*(c-1),c=v(-c/y)):c=v(c/y),d*=y),\"number\"==typeof a&&((y=0|a)<0?(g+=m*(u-1),u=v(-u/y)):u=v(u/y),m*=y),new n(this.data,o,s,l,c,u,h,f,p,d,m,g)},i.transpose=function(t,e,r,i,a){t=void 0===t?0:0|t,e=void 0===e?1:0|e,r=void 0===r?2:0|r,i=void 0===i?3:0|i,a=void 0===a?4:0|a;var o=this.shape,s=this.stride;return new n(this.data,o[t],o[e],o[r],o[i],o[a],s[t],s[e],s[r],s[i],s[a],this.offset)},i.pick=function(t,r,n,i,a){var o=[],s=[],l=this.offset;return\"number\"==typeof t&&t>=0?l=l+this.stride[0]*t|0:(o.push(this.shape[0]),s.push(this.stride[0])),\"number\"==typeof r&&r>=0?l=l+this.stride[1]*r|0:(o.push(this.shape[1]),s.push(this.stride[1])),\"number\"==typeof n&&n>=0?l=l+this.stride[2]*n|0:(o.push(this.shape[2]),s.push(this.stride[2])),\"number\"==typeof i&&i>=0?l=l+this.stride[3]*i|0:(o.push(this.shape[3]),s.push(this.stride[3])),\"number\"==typeof a&&a>=0?l=l+this.stride[4]*a|0:(o.push(this.shape[4]),s.push(this.stride[4])),(0,e[o.length+1])(this.data,o,s,l)},function(t,e,r,i){return new n(t,e[0],e[1],e[2],e[3],e[4],r[0],r[1],r[2],r[3],r[4],i)}}};function l(t,e){var r=-1===e?\"T\":String(e),n=s[r];return-1===e?n(t):0===e?n(t,c[t][0]):n(t,c[t],o)}var c={generic:[],buffer:[],array:[],float32:[],float64:[],int8:[],int16:[],int32:[],uint8_clamped:[],uint8:[],uint16:[],uint32:[],bigint64:[],biguint64:[]};t.exports=function(t,e,r,a){if(void 0===t)return(0,c.array[0])([]);\"number\"==typeof t&&(t=[t]),void 0===e&&(e=[t.length]);var o=e.length;if(void 0===r){r=new Array(o);for(var s=o-1,u=1;s>=0;--s)r[s]=u,u*=e[s]}if(void 0===a)for(a=0,s=0;s>>0;t.exports=function(t,e){if(isNaN(t)||isNaN(e))return NaN;if(t===e)return t;if(0===t)return e<0?-i:i;var r=n.hi(t),o=n.lo(t);return e>t==t>0?o===a?(r+=1,o=0):o+=1:0===o?(o=a,r-=1):o-=1,n.pack(o,r)}},8406:function(t,e){e.vertexNormals=function(t,e,r){for(var n=e.length,i=new Array(n),a=void 0===r?1e-6:r,o=0;oa){var _=i[c],b=1/Math.sqrt(g*v);for(x=0;x<3;++x){var w=(x+1)%3,T=(x+2)%3;_[x]+=b*(y[w]*m[T]-y[T]*m[w])}}}for(o=0;oa)for(b=1/Math.sqrt(k),x=0;x<3;++x)_[x]*=b;else for(x=0;x<3;++x)_[x]=0}return i},e.faceNormals=function(t,e,r){for(var n=t.length,i=new Array(n),a=void 0===r?1e-6:r,o=0;oa?1/Math.sqrt(p):0,c=0;c<3;++c)f[c]*=p;i[o]=f}return i}},4081:function(t){\"use strict\";t.exports=function(t,e,r,n,i,a,o,s,l,c){var u=e+a+c;if(h>0){var h=Math.sqrt(u+1);t[0]=.5*(o-l)/h,t[1]=.5*(s-n)/h,t[2]=.5*(r-a)/h,t[3]=.5*h}else{var f=Math.max(e,a,c);h=Math.sqrt(2*f-u+1),e>=f?(t[0]=.5*h,t[1]=.5*(i+r)/h,t[2]=.5*(s+n)/h,t[3]=.5*(o-l)/h):a>=f?(t[0]=.5*(r+i)/h,t[1]=.5*h,t[2]=.5*(l+o)/h,t[3]=.5*(s-n)/h):(t[0]=.5*(n+s)/h,t[1]=.5*(o+l)/h,t[2]=.5*h,t[3]=.5*(r-i)/h)}return t}},9977:function(t,e,r){\"use strict\";t.exports=function(t){var e=(t=t||{}).center||[0,0,0],r=t.rotation||[0,0,0,1],n=t.radius||1;e=[].slice.call(e,0,3),u(r=[].slice.call(r,0,4),r);var i=new h(r,e,Math.log(n));return i.setDistanceLimits(t.zoomMin,t.zoomMax),(\"eye\"in t||\"up\"in t)&&i.lookAt(0,t.eye,t.center,t.up),i};var n=r(9215),i=r(6582),a=r(7399),o=r(7608),s=r(4081);function l(t,e,r){return Math.sqrt(Math.pow(t,2)+Math.pow(e,2)+Math.pow(r,2))}function c(t,e,r,n){return Math.sqrt(Math.pow(t,2)+Math.pow(e,2)+Math.pow(r,2)+Math.pow(n,2))}function u(t,e){var r=e[0],n=e[1],i=e[2],a=e[3],o=c(r,n,i,a);o>1e-6?(t[0]=r/o,t[1]=n/o,t[2]=i/o,t[3]=a/o):(t[0]=t[1]=t[2]=0,t[3]=1)}function h(t,e,r){this.radius=n([r]),this.center=n(e),this.rotation=n(t),this.computedRadius=this.radius.curve(0),this.computedCenter=this.center.curve(0),this.computedRotation=this.rotation.curve(0),this.computedUp=[.1,0,0],this.computedEye=[.1,0,0],this.computedMatrix=[.1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],this.recalcMatrix(0)}var f=h.prototype;f.lastT=function(){return Math.max(this.radius.lastT(),this.center.lastT(),this.rotation.lastT())},f.recalcMatrix=function(t){this.radius.curve(t),this.center.curve(t),this.rotation.curve(t);var e=this.computedRotation;u(e,e);var r=this.computedMatrix;a(r,e);var n=this.computedCenter,i=this.computedEye,o=this.computedUp,s=Math.exp(this.computedRadius[0]);i[0]=n[0]+s*r[2],i[1]=n[1]+s*r[6],i[2]=n[2]+s*r[10],o[0]=r[1],o[1]=r[5],o[2]=r[9];for(var l=0;l<3;++l){for(var c=0,h=0;h<3;++h)c+=r[l+4*h]*i[h];r[12+l]=-c}},f.getMatrix=function(t,e){this.recalcMatrix(t);var r=this.computedMatrix;if(e){for(var n=0;n<16;++n)e[n]=r[n];return e}return r},f.idle=function(t){this.center.idle(t),this.radius.idle(t),this.rotation.idle(t)},f.flush=function(t){this.center.flush(t),this.radius.flush(t),this.rotation.flush(t)},f.pan=function(t,e,r,n){e=e||0,r=r||0,n=n||0,this.recalcMatrix(t);var i=this.computedMatrix,a=i[1],o=i[5],s=i[9],c=l(a,o,s);a/=c,o/=c,s/=c;var u=i[0],h=i[4],f=i[8],p=u*a+h*o+f*s,d=l(u-=a*p,h-=o*p,f-=s*p);u/=d,h/=d,f/=d;var m=i[2],g=i[6],y=i[10],v=m*a+g*o+y*s,x=m*u+g*h+y*f,_=l(m-=v*a+x*u,g-=v*o+x*h,y-=v*s+x*f);m/=_,g/=_,y/=_;var b=u*e+a*r,w=h*e+o*r,T=f*e+s*r;this.center.move(t,b,w,T);var k=Math.exp(this.computedRadius[0]);k=Math.max(1e-4,k+n),this.radius.set(t,Math.log(k))},f.rotate=function(t,e,r,n){this.recalcMatrix(t),e=e||0,r=r||0;var i=this.computedMatrix,a=i[0],o=i[4],s=i[8],u=i[1],h=i[5],f=i[9],p=i[2],d=i[6],m=i[10],g=e*a+r*u,y=e*o+r*h,v=e*s+r*f,x=-(d*v-m*y),_=-(m*g-p*v),b=-(p*y-d*g),w=Math.sqrt(Math.max(0,1-Math.pow(x,2)-Math.pow(_,2)-Math.pow(b,2))),T=c(x,_,b,w);T>1e-6?(x/=T,_/=T,b/=T,w/=T):(x=_=b=0,w=1);var k=this.computedRotation,A=k[0],M=k[1],S=k[2],E=k[3],C=A*w+E*x+M*b-S*_,L=M*w+E*_+S*x-A*b,I=S*w+E*b+A*_-M*x,P=E*w-A*x-M*_-S*b;if(n){x=p,_=d,b=m;var z=Math.sin(n)/l(x,_,b);x*=z,_*=z,b*=z,P=P*(w=Math.cos(e))-(C=C*w+P*x+L*b-I*_)*x-(L=L*w+P*_+I*x-C*b)*_-(I=I*w+P*b+C*_-L*x)*b}var O=c(C,L,I,P);O>1e-6?(C/=O,L/=O,I/=O,P/=O):(C=L=I=0,P=1),this.rotation.set(t,C,L,I,P)},f.lookAt=function(t,e,r,n){this.recalcMatrix(t),r=r||this.computedCenter,e=e||this.computedEye,n=n||this.computedUp;var a=this.computedMatrix;i(a,e,r,n);var o=this.computedRotation;s(o,a[0],a[1],a[2],a[4],a[5],a[6],a[8],a[9],a[10]),u(o,o),this.rotation.set(t,o[0],o[1],o[2],o[3]);for(var l=0,c=0;c<3;++c)l+=Math.pow(r[c]-e[c],2);this.radius.set(t,.5*Math.log(Math.max(l,1e-6))),this.center.set(t,r[0],r[1],r[2])},f.translate=function(t,e,r,n){this.center.move(t,e||0,r||0,n||0)},f.setMatrix=function(t,e){var r=this.computedRotation;s(r,e[0],e[1],e[2],e[4],e[5],e[6],e[8],e[9],e[10]),u(r,r),this.rotation.set(t,r[0],r[1],r[2],r[3]);var n=this.computedMatrix;o(n,e);var i=n[15];if(Math.abs(i)>1e-6){var a=n[12]/i,l=n[13]/i,c=n[14]/i;this.recalcMatrix(t);var h=Math.exp(this.computedRadius[0]);this.center.set(t,a-n[2]*h,l-n[6]*h,c-n[10]*h),this.radius.idle(t)}else this.center.idle(t),this.radius.idle(t)},f.setDistance=function(t,e){e>0&&this.radius.set(t,Math.log(e))},f.setDistanceLimits=function(t,e){t=t>0?Math.log(t):-1/0,e=e>0?Math.log(e):1/0,e=Math.max(e,t),this.radius.bounds[0][0]=t,this.radius.bounds[1][0]=e},f.getDistanceLimits=function(t){var e=this.radius.bounds;return t?(t[0]=Math.exp(e[0][0]),t[1]=Math.exp(e[1][0]),t):[Math.exp(e[0][0]),Math.exp(e[1][0])]},f.toJSON=function(){return this.recalcMatrix(this.lastT()),{center:this.computedCenter.slice(),rotation:this.computedRotation.slice(),distance:Math.log(this.computedRadius[0]),zoomMin:this.radius.bounds[0][0],zoomMax:this.radius.bounds[1][0]}},f.fromJSON=function(t){var e=this.lastT(),r=t.center;r&&this.center.set(e,r[0],r[1],r[2]);var n=t.rotation;n&&this.rotation.set(e,n[0],n[1],n[2],n[3]);var i=t.distance;i&&i>0&&this.radius.set(e,Math.log(i)),this.setDistanceLimits(t.zoomMin,t.zoomMax)}},1371:function(t,e,r){\"use strict\";var n=r(3233);t.exports=function(t,e,r){return n(r=void 0!==r?r+\"\":\" \",e)+t}},3202:function(t){t.exports=function(t,e){e||(e=[0,\"\"]),t=String(t);var r=parseFloat(t,10);return e[0]=r,e[1]=t.match(/[\\d.\\-\\+]*\\s*(.*)/)[1]||\"\",e}},3088:function(t,e,r){\"use strict\";t.exports=function(t,e){for(var r=0|e.length,i=t.length,a=[new Array(r),new Array(r)],o=0;o0){o=a[u][r][0],l=u;break}s=o[1^l];for(var h=0;h<2;++h)for(var f=a[h][r],p=0;p0&&(o=d,s=m,l=h)}return i||o&&c(o,l),s}function h(t,r){var i=a[r][t][0],o=[t];c(i,r);for(var s=i[1^r];;){for(;s!==t;)o.push(s),s=u(o[o.length-2],s,!1);if(a[0][t].length+a[1][t].length===0)break;var l=o[o.length-1],h=t,f=o[1],p=u(l,h,!0);if(n(e[l],e[h],e[f],e[p])<0)break;o.push(t),s=u(l,h)}return o}function f(t,e){return e[1]===e[e.length-1]}for(o=0;o0;){a[0][o].length;var m=h(o,p);f(0,m)?d.push.apply(d,m):(d.length>0&&l.push(d),d=m)}d.length>0&&l.push(d)}return l};var n=r(3140)},5609:function(t,e,r){\"use strict\";t.exports=function(t,e){for(var r=n(t,e.length),i=new Array(e.length),a=new Array(e.length),o=[],s=0;s0;){i[p=o.pop()]=!1;var c=r[p];for(s=0;s0}))).length,g=new Array(m),y=new Array(m);for(p=0;p0;){var B=R.pop(),N=E[B];l(N,(function(t,e){return t-e}));var j,U=N.length,V=F[B];for(0===V&&(j=[q=d[B]]),p=0;p=0||(F[H]=1^V,R.push(H),0===V&&(D(q=d[H])||(q.reverse(),j.push(q))))}0===V&&r.push(j)}return r};var n=r(3134),i=r(3088),a=r(5085),o=r(5250),s=r(8210),l=r(1682),c=r(5609);function u(t,e){for(var r=new Array(t),n=0;n0&&e[i]===r[0]))return 1;a=t[i-1]}for(var s=1;a;){var l=a.key,c=n(r,l[0],l[1]);if(l[0][0]0))return 0;s=-1,a=a.right}else if(c>0)a=a.left;else{if(!(c<0))return 0;s=1,a=a.right}}return s}}(y.slabs,y.coordinates);return 0===a.length?v:function(t,e){return function(r){return t(r[0],r[1])?0:e(r)}}(l(a),v)};var n=r(3250)[3],i=r(4209),a=r(3352),o=r(2478);function s(){return!0}function l(t){for(var e={},r=0;r=c?(k=1,v=c+2*f+d):v=f*(k=-f/c)+d):(k=0,p>=0?(A=0,v=d):-p>=h?(A=1,v=h+2*p+d):v=p*(A=-p/h)+d);else if(A<0)A=0,f>=0?(k=0,v=d):-f>=c?(k=1,v=c+2*f+d):v=f*(k=-f/c)+d;else{var M=1/T;v=(k*=M)*(c*k+u*(A*=M)+2*f)+A*(u*k+h*A+2*p)+d}else k<0?(_=h+p)>(x=u+f)?(b=_-x)>=(w=c-2*u+h)?(k=1,A=0,v=c+2*f+d):v=(k=b/w)*(c*k+u*(A=1-k)+2*f)+A*(u*k+h*A+2*p)+d:(k=0,_<=0?(A=1,v=h+2*p+d):p>=0?(A=0,v=d):v=p*(A=-p/h)+d):A<0?(_=c+f)>(x=u+p)?(b=_-x)>=(w=c-2*u+h)?(A=1,k=0,v=h+2*p+d):v=(k=1-(A=b/w))*(c*k+u*A+2*f)+A*(u*k+h*A+2*p)+d:(A=0,_<=0?(k=1,v=c+2*f+d):f>=0?(k=0,v=d):v=f*(k=-f/c)+d):(b=h+p-u-f)<=0?(k=0,A=1,v=h+2*p+d):b>=(w=c-2*u+h)?(k=1,A=0,v=c+2*f+d):v=(k=b/w)*(c*k+u*(A=1-k)+2*f)+A*(u*k+h*A+2*p)+d;var S=1-k-A;for(l=0;l0){var c=t[r-1];if(0===n(s,c)&&a(c)!==l){r-=1;continue}}t[r++]=s}}return t.length=r,t}},3233:function(t){\"use strict\";var e,r=\"\";t.exports=function(t,n){if(\"string\"!=typeof t)throw new TypeError(\"expected a string\");if(1===n)return t;if(2===n)return t+t;var i=t.length*n;if(e!==t||void 0===e)e=t,r=\"\";else if(r.length>=i)return r.substr(0,i);for(;i>r.length&&n>1;)1&n&&(r+=t),n>>=1,t+=t;return r=(r+=t).substr(0,i)}},3025:function(t,e,r){t.exports=r.g.performance&&r.g.performance.now?function(){return performance.now()}:Date.now||function(){return+new Date}},7004:function(t){\"use strict\";t.exports=function(t){for(var e=t.length,r=t[t.length-1],n=e,i=e-2;i>=0;--i){var a=r;(l=(s=t[i])-((r=a+s)-a))&&(t[--n]=r,r=l)}var o=0;for(i=n;i0){if(a<=0)return o;n=i+a}else{if(!(i<0))return o;if(a>=0)return o;n=-(i+a)}var s=33306690738754716e-32*n;return o>=s||o<=-s?o:h(t,e,r)},function(t,e,r,n){var i=t[0]-n[0],a=e[0]-n[0],o=r[0]-n[0],s=t[1]-n[1],l=e[1]-n[1],c=r[1]-n[1],u=t[2]-n[2],h=e[2]-n[2],p=r[2]-n[2],d=a*c,m=o*l,g=o*s,y=i*c,v=i*l,x=a*s,_=u*(d-m)+h*(g-y)+p*(v-x),b=7771561172376103e-31*((Math.abs(d)+Math.abs(m))*Math.abs(u)+(Math.abs(g)+Math.abs(y))*Math.abs(h)+(Math.abs(v)+Math.abs(x))*Math.abs(p));return _>b||-_>b?_:f(t,e,r,n)}];function d(t){var e=p[t.length];return e||(e=p[t.length]=u(t.length)),e.apply(void 0,t)}function m(t,e,r,n,i,a,o){return function(e,r,s,l,c){switch(arguments.length){case 0:case 1:return 0;case 2:return n(e,r);case 3:return i(e,r,s);case 4:return a(e,r,s,l);case 5:return o(e,r,s,l,c)}for(var u=new Array(arguments.length),h=0;h0&&o>0||a<0&&o<0)return!1;var s=n(r,t,e),l=n(i,t,e);return!(s>0&&l>0||s<0&&l<0)&&(0!==a||0!==o||0!==s||0!==l||function(t,e,r,n){for(var i=0;i<2;++i){var a=t[i],o=e[i],s=Math.min(a,o),l=Math.max(a,o),c=r[i],u=n[i],h=Math.min(c,u);if(Math.max(c,u)=n?(i=h,(l+=1)=n?(i=h,(l+=1)>1,c=e[2*l+1];if(c===a)return l;a>1,c=e[2*l+1];if(c===a)return l;a>1,c=e[2*l+1];if(c===a)return l;a0)-(t<0)},e.abs=function(t){var e=t>>31;return(t^e)-e},e.min=function(t,e){return e^(t^e)&-(t65535)<<4,e|=r=((t>>>=e)>255)<<3,e|=r=((t>>>=r)>15)<<2,(e|=r=((t>>>=r)>3)<<1)|(t>>>=r)>>1},e.log10=function(t){return t>=1e9?9:t>=1e8?8:t>=1e7?7:t>=1e6?6:t>=1e5?5:t>=1e4?4:t>=1e3?3:t>=100?2:t>=10?1:0},e.popCount=function(t){return 16843009*((t=(858993459&(t-=t>>>1&1431655765))+(t>>>2&858993459))+(t>>>4)&252645135)>>>24},e.countTrailingZeros=r,e.nextPow2=function(t){return t+=0===t,--t,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,1+(t|=t>>>16)},e.prevPow2=function(t){return t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,(t|=t>>>16)-(t>>>1)},e.parity=function(t){return t^=t>>>16,t^=t>>>8,t^=t>>>4,27030>>>(t&=15)&1};var n=new Array(256);!function(t){for(var e=0;e<256;++e){var r=e,n=e,i=7;for(r>>>=1;r;r>>>=1)n<<=1,n|=1&r,--i;t[e]=n<>>8&255]<<16|n[t>>>16&255]<<8|n[t>>>24&255]},e.interleave2=function(t,e){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t&=65535)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e&=65535)|e<<8))|e<<4))|e<<2))|e<<1))<<1},e.deinterleave2=function(t,e){return(t=65535&((t=16711935&((t=252645135&((t=858993459&((t=t>>>e&1431655765)|t>>>1))|t>>>2))|t>>>4))|t>>>16))<<16>>16},e.interleave3=function(t,e,r){return t=1227133513&((t=3272356035&((t=251719695&((t=4278190335&((t&=1023)|t<<16))|t<<8))|t<<4))|t<<2),(t|=(e=1227133513&((e=3272356035&((e=251719695&((e=4278190335&((e&=1023)|e<<16))|e<<8))|e<<4))|e<<2))<<1)|(r=1227133513&((r=3272356035&((r=251719695&((r=4278190335&((r&=1023)|r<<16))|r<<8))|r<<4))|r<<2))<<2},e.deinterleave3=function(t,e){return(t=1023&((t=4278190335&((t=251719695&((t=3272356035&((t=t>>>e&1227133513)|t>>>2))|t>>>4))|t>>>8))|t>>>16))<<22>>22},e.nextCombination=function(t){var e=t|t-1;return e+1|(~e&-~e)-1>>>r(t)+1}},2014:function(t,e,r){\"use strict\";var n=r(3105),i=r(4623);function a(t,e){var r=t.length,n=t.length-e.length,i=Math.min;if(n)return n;switch(r){case 0:return 0;case 1:return t[0]-e[0];case 2:return(s=t[0]+t[1]-e[0]-e[1])||i(t[0],t[1])-i(e[0],e[1]);case 3:var a=t[0]+t[1],o=e[0]+e[1];if(s=a+t[2]-(o+e[2]))return s;var s,l=i(t[0],t[1]),c=i(e[0],e[1]);return(s=i(l,t[2])-i(c,e[2]))||i(l+t[2],a)-i(c+e[2],o);default:var u=t.slice(0);u.sort();var h=e.slice(0);h.sort();for(var f=0;f>1,s=a(t[o],e);s<=0?(0===s&&(i=o),r=o+1):s>0&&(n=o-1)}return i}function u(t,e){for(var r=new Array(t.length),i=0,o=r.length;i=t.length||0!==a(t[g],s)););}return r}function h(t,e){if(e<0)return[];for(var r=[],i=(1<>>u&1&&c.push(i[u]);e.push(c)}return s(e)},e.skeleton=h,e.boundary=function(t){for(var e=[],r=0,n=t.length;r>1:(t>>1)-1}function x(t){for(var e=y(t);;){var r=e,n=2*t+1,i=2*(t+1),a=t;if(n0;){var r=v(t);if(!(r>=0&&e0){var t=k[0];return g(0,M-1),M-=1,x(0),t}return-1}function w(t,e){var r=k[t];return c[r]===e?t:(c[r]=-1/0,_(t),b(),c[r]=e,_((M+=1)-1))}function T(t){if(!u[t]){u[t]=!0;var e=s[t],r=l[t];s[r]>=0&&(s[r]=e),l[e]>=0&&(l[e]=r),A[e]>=0&&w(A[e],m(e)),A[r]>=0&&w(A[r],m(r))}}var k=[],A=new Array(a);for(h=0;h>1;h>=0;--h)x(h);for(;;){var S=b();if(S<0||c[S]>r)break;T(S)}var E=[];for(h=0;h=0&&r>=0&&e!==r){var n=A[e],i=A[r];n!==i&&L.push([n,i])}})),i.unique(i.normalize(L)),{positions:E,edges:L}};var n=r(3250),i=r(2014)},1303:function(t,e,r){\"use strict\";t.exports=function(t,e){var r,a,o,s;if(e[0][0]e[1][0]))return i(e,t);r=e[1],a=e[0]}if(t[0][0]t[1][0]))return-i(t,e);o=t[1],s=t[0]}var l=n(r,a,s),c=n(r,a,o);if(l<0){if(c<=0)return l}else if(l>0){if(c>=0)return l}else if(c)return c;if(l=n(s,o,a),c=n(s,o,r),l<0){if(c<=0)return l}else if(l>0){if(c>=0)return l}else if(c)return c;return a[0]-s[0]};var n=r(3250);function i(t,e){var r,i,a,o;if(e[0][0]e[1][0])){var s=Math.min(t[0][1],t[1][1]),l=Math.max(t[0][1],t[1][1]),c=Math.min(e[0][1],e[1][1]),u=Math.max(e[0][1],e[1][1]);return lu?s-u:l-u}r=e[1],i=e[0]}t[0][1]0)if(e[0]!==o[1][0])r=t,t=t.right;else{if(l=c(t.right,e))return l;t=t.left}else{if(e[0]!==o[1][0])return t;var l;if(l=c(t.right,e))return l;t=t.left}}return r}function u(t,e,r,n){this.y=t,this.index=e,this.start=r,this.closed=n}function h(t,e,r,n){this.x=t,this.segment=e,this.create=r,this.index=n}s.prototype.castUp=function(t){var e=n.le(this.coordinates,t[0]);if(e<0)return-1;this.slabs[e];var r=c(this.slabs[e],t),i=-1;if(r&&(i=r.value),this.coordinates[e]===t[0]){var s=null;if(r&&(s=r.key),e>0){var u=c(this.slabs[e-1],t);u&&(s?o(u.key,s)>0&&(s=u.key,i=u.value):(i=u.value,s=u.key))}var h=this.horizontal[e];if(h.length>0){var f=n.ge(h,t[1],l);if(f=h.length)return i;p=h[f]}}if(p.start)if(s){var d=a(s[0],s[1],[t[0],p.y]);s[0][0]>s[1][0]&&(d=-d),d>0&&(i=p.index)}else i=p.index;else p.y!==t[1]&&(i=p.index)}}}return i}},5202:function(t,e,r){\"use strict\";var n=r(1944),i=r(8210);function a(t,e){var r=i(n(t,e),[e[e.length-1]]);return r[r.length-1]}function o(t,e,r,n){var i=-e/(n-e);i<0?i=0:i>1&&(i=1);for(var a=1-i,o=t.length,s=new Array(o),l=0;l0||i>0&&u<0){var h=o(s,u,l,i);r.push(h),n.push(h.slice())}u<0?n.push(l.slice()):u>0?r.push(l.slice()):(r.push(l.slice()),n.push(l.slice())),i=u}return{positive:r,negative:n}},t.exports.positive=function(t,e){for(var r=[],n=a(t[t.length-1],e),i=t[t.length-1],s=t[0],l=0;l0||n>0&&c<0)&&r.push(o(i,c,s,n)),c>=0&&r.push(s.slice()),n=c}return r},t.exports.negative=function(t,e){for(var r=[],n=a(t[t.length-1],e),i=t[t.length-1],s=t[0],l=0;l0||n>0&&c<0)&&r.push(o(i,c,s,n)),c<=0&&r.push(s.slice()),n=c}return r}},3387:function(t,e,r){var n;!function(){\"use strict\";var i={not_string:/[^s]/,not_bool:/[^t]/,not_type:/[^T]/,not_primitive:/[^v]/,number:/[diefg]/,numeric_arg:/[bcdiefguxX]/,json:/[j]/,not_json:/[^j]/,text:/^[^\\x25]+/,modulo:/^\\x25{2}/,placeholder:/^\\x25(?:([1-9]\\d*)\\$|\\(([^)]+)\\))?(\\+)?(0|'[^$])?(-)?(\\d+)?(?:\\.(\\d+))?([b-gijostTuvxX])/,key:/^([a-z_][a-z_\\d]*)/i,key_access:/^\\.([a-z_][a-z_\\d]*)/i,index_access:/^\\[(\\d+)\\]/,sign:/^[+-]/};function a(t){return function(t,e){var r,n,o,s,l,c,u,h,f,p=1,d=t.length,m=\"\";for(n=0;n=0),s.type){case\"b\":r=parseInt(r,10).toString(2);break;case\"c\":r=String.fromCharCode(parseInt(r,10));break;case\"d\":case\"i\":r=parseInt(r,10);break;case\"j\":r=JSON.stringify(r,null,s.width?parseInt(s.width):0);break;case\"e\":r=s.precision?parseFloat(r).toExponential(s.precision):parseFloat(r).toExponential();break;case\"f\":r=s.precision?parseFloat(r).toFixed(s.precision):parseFloat(r);break;case\"g\":r=s.precision?String(Number(r.toPrecision(s.precision))):parseFloat(r);break;case\"o\":r=(parseInt(r,10)>>>0).toString(8);break;case\"s\":r=String(r),r=s.precision?r.substring(0,s.precision):r;break;case\"t\":r=String(!!r),r=s.precision?r.substring(0,s.precision):r;break;case\"T\":r=Object.prototype.toString.call(r).slice(8,-1).toLowerCase(),r=s.precision?r.substring(0,s.precision):r;break;case\"u\":r=parseInt(r,10)>>>0;break;case\"v\":r=r.valueOf(),r=s.precision?r.substring(0,s.precision):r;break;case\"x\":r=(parseInt(r,10)>>>0).toString(16);break;case\"X\":r=(parseInt(r,10)>>>0).toString(16).toUpperCase()}i.json.test(s.type)?m+=r:(!i.number.test(s.type)||h&&!s.sign?f=\"\":(f=h?\"+\":\"-\",r=r.toString().replace(i.sign,\"\")),c=s.pad_char?\"0\"===s.pad_char?\"0\":s.pad_char.charAt(1):\" \",u=s.width-(f+r).length,l=s.width&&u>0?c.repeat(u):\"\",m+=s.align?f+r+l:\"0\"===c?f+l+r:l+f+r)}return m}(function(t){if(s[t])return s[t];for(var e,r=t,n=[],a=0;r;){if(null!==(e=i.text.exec(r)))n.push(e[0]);else if(null!==(e=i.modulo.exec(r)))n.push(\"%\");else{if(null===(e=i.placeholder.exec(r)))throw new SyntaxError(\"[sprintf] unexpected placeholder\");if(e[2]){a|=1;var o=[],l=e[2],c=[];if(null===(c=i.key.exec(l)))throw new SyntaxError(\"[sprintf] failed to parse named argument key\");for(o.push(c[1]);\"\"!==(l=l.substring(c[0].length));)if(null!==(c=i.key_access.exec(l)))o.push(c[1]);else{if(null===(c=i.index_access.exec(l)))throw new SyntaxError(\"[sprintf] failed to parse named argument key\");o.push(c[1])}e[2]=o}else a|=2;if(3===a)throw new Error(\"[sprintf] mixing positional and named placeholders is not (yet) supported\");n.push({placeholder:e[0],param_no:e[1],keys:e[2],sign:e[3],pad_char:e[4],align:e[5],width:e[6],precision:e[7],type:e[8]})}r=r.substring(e[0].length)}return s[t]=n}(t),arguments)}function o(t,e){return a.apply(null,[t].concat(e||[]))}var s=Object.create(null);e.sprintf=a,e.vsprintf=o,\"undefined\"!=typeof window&&(window.sprintf=a,window.vsprintf=o,void 0===(n=function(){return{sprintf:a,vsprintf:o}}.call(e,r,e,t))||(t.exports=n))}()},3711:function(t,e,r){\"use strict\";t.exports=function(t,e){if(t.dimension<=0)return{positions:[],cells:[]};if(1===t.dimension)return function(t,e){for(var r=i(t,e),n=r.length,a=new Array(n),o=new Array(n),s=0;sn|0},vertex:function(t,e,r,n,i,a,o,s,l,c,u,h,f){var p=(o<<0)+(s<<1)+(l<<2)+(c<<3)|0;if(0!==p&&15!==p)switch(p){case 0:case 15:u.push([t-.5,e-.5]);break;case 1:u.push([t-.25-.25*(n+r-2*f)/(r-n),e-.25-.25*(i+r-2*f)/(r-i)]);break;case 2:u.push([t-.75-.25*(-n-r+2*f)/(n-r),e-.25-.25*(a+n-2*f)/(n-a)]);break;case 3:u.push([t-.5,e-.5-.5*(i+r+a+n-4*f)/(r-i+n-a)]);break;case 4:u.push([t-.25-.25*(a+i-2*f)/(i-a),e-.75-.25*(-i-r+2*f)/(i-r)]);break;case 5:u.push([t-.5-.5*(n+r+a+i-4*f)/(r-n+i-a),e-.5]);break;case 6:u.push([t-.5-.25*(-n-r+a+i)/(n-r+i-a),e-.5-.25*(-i-r+a+n)/(i-r+n-a)]);break;case 7:u.push([t-.75-.25*(a+i-2*f)/(i-a),e-.75-.25*(a+n-2*f)/(n-a)]);break;case 8:u.push([t-.75-.25*(-a-i+2*f)/(a-i),e-.75-.25*(-a-n+2*f)/(a-n)]);break;case 9:u.push([t-.5-.25*(n+r+-a-i)/(r-n+a-i),e-.5-.25*(i+r+-a-n)/(r-i+a-n)]);break;case 10:u.push([t-.5-.5*(-n-r-a-i+4*f)/(n-r+a-i),e-.5]);break;case 11:u.push([t-.25-.25*(-a-i+2*f)/(a-i),e-.75-.25*(i+r-2*f)/(r-i)]);break;case 12:u.push([t-.5,e-.5-.5*(-i-r-a-n+4*f)/(i-r+a-n)]);break;case 13:u.push([t-.75-.25*(n+r-2*f)/(r-n),e-.25-.25*(-a-n+2*f)/(a-n)]);break;case 14:u.push([t-.25-.25*(-n-r+2*f)/(n-r),e-.25-.25*(-i-r+2*f)/(i-r)])}},cell:function(t,e,r,n,i,a,o,s,l){i?s.push([t,e]):s.push([e,t])}});return function(t,e){var r=[],i=[];return n(t,r,i,e),{positions:r,cells:i}}}},o={}},529:function(t,e,r){\"use strict\";t.exports=function t(e,r,i){var a=(i=i||{}).fontStyle||\"normal\",s=i.fontWeight||\"normal\",l=i.fontVariant||\"normal\",c=[a,s,l,e].join(\"_\"),u=o[c];u||(u=o[c]={\" \":{data:new Float32Array(0),shape:.2}});var h=u[r];if(!h)if(r.length<=1||!/\\d/.test(r))h=u[r]=function(t){for(var e=t.cells,r=t.positions,n=new Float32Array(6*e.length),i=0,a=0,o=0;o0&&(m+=.02);var y=new Float32Array(d),v=0,x=-.5*m;for(g=0;gMath.max(r,n)?i[2]=1:r>Math.max(e,n)?i[0]=1:i[1]=1;for(var a=0,o=0,l=0;l<3;++l)a+=t[l]*t[l],o+=i[l]*t[l];for(l=0;l<3;++l)i[l]-=o/a*t[l];return s(i,i),i}function f(t,e,r,i,a,o,s,l){this.center=n(r),this.up=n(i),this.right=n(a),this.radius=n([o]),this.angle=n([s,l]),this.angle.bounds=[[-1/0,-Math.PI/2],[1/0,Math.PI/2]],this.setDistanceLimits(t,e),this.computedCenter=this.center.curve(0),this.computedUp=this.up.curve(0),this.computedRight=this.right.curve(0),this.computedRadius=this.radius.curve(0),this.computedAngle=this.angle.curve(0),this.computedToward=[0,0,0],this.computedEye=[0,0,0],this.computedMatrix=new Array(16);for(var c=0;c<16;++c)this.computedMatrix[c]=.5;this.recalcMatrix(0)}var p=f.prototype;p.setDistanceLimits=function(t,e){t=t>0?Math.log(t):-1/0,e=e>0?Math.log(e):1/0,e=Math.max(e,t),this.radius.bounds[0][0]=t,this.radius.bounds[1][0]=e},p.getDistanceLimits=function(t){var e=this.radius.bounds[0];return t?(t[0]=Math.exp(e[0][0]),t[1]=Math.exp(e[1][0]),t):[Math.exp(e[0][0]),Math.exp(e[1][0])]},p.recalcMatrix=function(t){this.center.curve(t),this.up.curve(t),this.right.curve(t),this.radius.curve(t),this.angle.curve(t);for(var e=this.computedUp,r=this.computedRight,n=0,i=0,a=0;a<3;++a)i+=e[a]*r[a],n+=e[a]*e[a];var l=Math.sqrt(n),u=0;for(a=0;a<3;++a)r[a]-=e[a]*i/n,u+=r[a]*r[a],e[a]/=l;var h=Math.sqrt(u);for(a=0;a<3;++a)r[a]/=h;var f=this.computedToward;o(f,e,r),s(f,f);var p=Math.exp(this.computedRadius[0]),d=this.computedAngle[0],m=this.computedAngle[1],g=Math.cos(d),y=Math.sin(d),v=Math.cos(m),x=Math.sin(m),_=this.computedCenter,b=g*v,w=y*v,T=x,k=-g*x,A=-y*x,M=v,S=this.computedEye,E=this.computedMatrix;for(a=0;a<3;++a){var C=b*r[a]+w*f[a]+T*e[a];E[4*a+1]=k*r[a]+A*f[a]+M*e[a],E[4*a+2]=C,E[4*a+3]=0}var L=E[1],I=E[5],P=E[9],z=E[2],O=E[6],D=E[10],R=I*D-P*O,F=P*z-L*D,B=L*O-I*z,N=c(R,F,B);for(R/=N,F/=N,B/=N,E[0]=R,E[4]=F,E[8]=B,a=0;a<3;++a)S[a]=_[a]+E[2+4*a]*p;for(a=0;a<3;++a){u=0;for(var j=0;j<3;++j)u+=E[a+4*j]*S[j];E[12+a]=-u}E[15]=1},p.getMatrix=function(t,e){this.recalcMatrix(t);var r=this.computedMatrix;if(e){for(var n=0;n<16;++n)e[n]=r[n];return e}return r};var d=[0,0,0];p.rotate=function(t,e,r,n){if(this.angle.move(t,e,r),n){this.recalcMatrix(t);var i=this.computedMatrix;d[0]=i[2],d[1]=i[6],d[2]=i[10];for(var o=this.computedUp,s=this.computedRight,l=this.computedToward,c=0;c<3;++c)i[4*c]=o[c],i[4*c+1]=s[c],i[4*c+2]=l[c];for(a(i,i,n,d),c=0;c<3;++c)o[c]=i[4*c],s[c]=i[4*c+1];this.up.set(t,o[0],o[1],o[2]),this.right.set(t,s[0],s[1],s[2])}},p.pan=function(t,e,r,n){e=e||0,r=r||0,n=n||0,this.recalcMatrix(t);var i=this.computedMatrix,a=(Math.exp(this.computedRadius[0]),i[1]),o=i[5],s=i[9],l=c(a,o,s);a/=l,o/=l,s/=l;var u=i[0],h=i[4],f=i[8],p=u*a+h*o+f*s,d=c(u-=a*p,h-=o*p,f-=s*p),m=(u/=d)*e+a*r,g=(h/=d)*e+o*r,y=(f/=d)*e+s*r;this.center.move(t,m,g,y);var v=Math.exp(this.computedRadius[0]);v=Math.max(1e-4,v+n),this.radius.set(t,Math.log(v))},p.translate=function(t,e,r,n){this.center.move(t,e||0,r||0,n||0)},p.setMatrix=function(t,e,r,n){var a=1;\"number\"==typeof r&&(a=0|r),(a<0||a>3)&&(a=1);var o=(a+2)%3;e||(this.recalcMatrix(t),e=this.computedMatrix);var s=e[a],l=e[a+4],h=e[a+8];if(n){var f=Math.abs(s),p=Math.abs(l),d=Math.abs(h),m=Math.max(f,p,d);f===m?(s=s<0?-1:1,l=h=0):d===m?(h=h<0?-1:1,s=l=0):(l=l<0?-1:1,s=h=0)}else{var g=c(s,l,h);s/=g,l/=g,h/=g}var y,v,x=e[o],_=e[o+4],b=e[o+8],w=x*s+_*l+b*h,T=c(x-=s*w,_-=l*w,b-=h*w),k=l*(b/=T)-h*(_/=T),A=h*(x/=T)-s*b,M=s*_-l*x,S=c(k,A,M);if(k/=S,A/=S,M/=S,this.center.jump(t,H,G,Z),this.radius.idle(t),this.up.jump(t,s,l,h),this.right.jump(t,x,_,b),2===a){var E=e[1],C=e[5],L=e[9],I=E*x+C*_+L*b,P=E*k+C*A+L*M;y=R<0?-Math.PI/2:Math.PI/2,v=Math.atan2(P,I)}else{var z=e[2],O=e[6],D=e[10],R=z*s+O*l+D*h,F=z*x+O*_+D*b,B=z*k+O*A+D*M;y=Math.asin(u(R)),v=Math.atan2(B,F)}this.angle.jump(t,v,y),this.recalcMatrix(t);var N=e[2],j=e[6],U=e[10],V=this.computedMatrix;i(V,e);var q=V[15],H=V[12]/q,G=V[13]/q,Z=V[14]/q,W=Math.exp(this.computedRadius[0]);this.center.jump(t,H-N*W,G-j*W,Z-U*W)},p.lastT=function(){return Math.max(this.center.lastT(),this.up.lastT(),this.right.lastT(),this.radius.lastT(),this.angle.lastT())},p.idle=function(t){this.center.idle(t),this.up.idle(t),this.right.idle(t),this.radius.idle(t),this.angle.idle(t)},p.flush=function(t){this.center.flush(t),this.up.flush(t),this.right.flush(t),this.radius.flush(t),this.angle.flush(t)},p.setDistance=function(t,e){e>0&&this.radius.set(t,Math.log(e))},p.lookAt=function(t,e,r,n){this.recalcMatrix(t),e=e||this.computedEye,r=r||this.computedCenter;var i=(n=n||this.computedUp)[0],a=n[1],o=n[2],s=c(i,a,o);if(!(s<1e-6)){i/=s,a/=s,o/=s;var l=e[0]-r[0],h=e[1]-r[1],f=e[2]-r[2],p=c(l,h,f);if(!(p<1e-6)){l/=p,h/=p,f/=p;var d=this.computedRight,m=d[0],g=d[1],y=d[2],v=i*m+a*g+o*y,x=c(m-=v*i,g-=v*a,y-=v*o);if(!(x<.01&&(x=c(m=a*f-o*h,g=o*l-i*f,y=i*h-a*l))<1e-6)){m/=x,g/=x,y/=x,this.up.set(t,i,a,o),this.right.set(t,m,g,y),this.center.set(t,r[0],r[1],r[2]),this.radius.set(t,Math.log(p));var _=a*y-o*g,b=o*m-i*y,w=i*g-a*m,T=c(_,b,w),k=i*l+a*h+o*f,A=m*l+g*h+y*f,M=(_/=T)*l+(b/=T)*h+(w/=T)*f,S=Math.asin(u(k)),E=Math.atan2(M,A),C=this.angle._state,L=C[C.length-1],I=C[C.length-2];L%=2*Math.PI;var P=Math.abs(L+2*Math.PI-E),z=Math.abs(L-E),O=Math.abs(L-2*Math.PI-E);P0?r.pop():new ArrayBuffer(t)}function d(t){return new Uint8Array(p(t),0,t)}function m(t){return new Uint16Array(p(2*t),0,t)}function g(t){return new Uint32Array(p(4*t),0,t)}function y(t){return new Int8Array(p(t),0,t)}function v(t){return new Int16Array(p(2*t),0,t)}function x(t){return new Int32Array(p(4*t),0,t)}function _(t){return new Float32Array(p(4*t),0,t)}function b(t){return new Float64Array(p(8*t),0,t)}function w(t){return o?new Uint8ClampedArray(p(t),0,t):d(t)}function T(t){return s?new BigUint64Array(p(8*t),0,t):null}function k(t){return l?new BigInt64Array(p(8*t),0,t):null}function A(t){return new DataView(p(t),0,t)}function M(t){t=n.nextPow2(t);var e=n.log2(t),r=h[e];return r.length>0?r.pop():new a(t)}e.free=function(t){if(a.isBuffer(t))h[n.log2(t.length)].push(t);else{if(\"[object ArrayBuffer]\"!==Object.prototype.toString.call(t)&&(t=t.buffer),!t)return;var e=t.length||t.byteLength,r=0|n.log2(e);u[r].push(t)}},e.freeUint8=e.freeUint16=e.freeUint32=e.freeBigUint64=e.freeInt8=e.freeInt16=e.freeInt32=e.freeBigInt64=e.freeFloat32=e.freeFloat=e.freeFloat64=e.freeDouble=e.freeUint8Clamped=e.freeDataView=function(t){f(t.buffer)},e.freeArrayBuffer=f,e.freeBuffer=function(t){h[n.log2(t.length)].push(t)},e.malloc=function(t,e){if(void 0===e||\"arraybuffer\"===e)return p(t);switch(e){case\"uint8\":return d(t);case\"uint16\":return m(t);case\"uint32\":return g(t);case\"int8\":return y(t);case\"int16\":return v(t);case\"int32\":return x(t);case\"float\":case\"float32\":return _(t);case\"double\":case\"float64\":return b(t);case\"uint8_clamped\":return w(t);case\"bigint64\":return k(t);case\"biguint64\":return T(t);case\"buffer\":return M(t);case\"data\":case\"dataview\":return A(t);default:return null}return null},e.mallocArrayBuffer=p,e.mallocUint8=d,e.mallocUint16=m,e.mallocUint32=g,e.mallocInt8=y,e.mallocInt16=v,e.mallocInt32=x,e.mallocFloat32=e.mallocFloat=_,e.mallocFloat64=e.mallocDouble=b,e.mallocUint8Clamped=w,e.mallocBigUint64=T,e.mallocBigInt64=k,e.mallocDataView=A,e.mallocBuffer=M,e.clearCache=function(){for(var t=0;t<32;++t)c.UINT8[t].length=0,c.UINT16[t].length=0,c.UINT32[t].length=0,c.INT8[t].length=0,c.INT16[t].length=0,c.INT32[t].length=0,c.FLOAT[t].length=0,c.DOUBLE[t].length=0,c.BIGUINT64[t].length=0,c.BIGINT64[t].length=0,c.UINT8C[t].length=0,u[t].length=0,h[t].length=0}},1755:function(t){\"use strict\";function e(t){this.roots=new Array(t),this.ranks=new Array(t);for(var e=0;e0&&(a=n.size),n.lineSpacing&&n.lineSpacing>0&&(o=n.lineSpacing),n.styletags&&n.styletags.breaklines&&(s.breaklines=!!n.styletags.breaklines),n.styletags&&n.styletags.bolds&&(s.bolds=!!n.styletags.bolds),n.styletags&&n.styletags.italics&&(s.italics=!!n.styletags.italics),n.styletags&&n.styletags.subscripts&&(s.subscripts=!!n.styletags.subscripts),n.styletags&&n.styletags.superscripts&&(s.superscripts=!!n.styletags.superscripts)),r.font=[n.fontStyle,n.fontVariant,n.fontWeight,a+\"px\",n.font].filter((function(t){return t})).join(\" \"),r.textAlign=\"start\",r.textBaseline=\"alphabetic\",r.direction=\"ltr\",w(function(t,e,r,n,a,o){r=r.replace(/\\n/g,\"\"),r=!0===o.breaklines?r.replace(/\\/g,\"\\n\"):r.replace(/\\/g,\" \");var s=\"\",l=[];for(T=0;T-1?parseInt(t[1+i]):0,l=a>-1?parseInt(r[1+a]):0;s!==l&&(n=n.replace(F(),\"?px \"),M*=Math.pow(.75,l-s),n=n.replace(\"?px \",F())),A+=.25*C*(l-s)}if(!0===o.superscripts){var c=t.indexOf(d),h=r.indexOf(d),p=c>-1?parseInt(t[1+c]):0,m=h>-1?parseInt(r[1+h]):0;p!==m&&(n=n.replace(F(),\"?px \"),M*=Math.pow(.75,m-p),n=n.replace(\"?px \",F())),A-=.25*C*(m-p)}if(!0===o.bolds){var g=t.indexOf(u)>-1,v=r.indexOf(u)>-1;!g&&v&&(n=x?n.replace(\"italic \",\"italic bold \"):\"bold \"+n),g&&!v&&(n=n.replace(\"bold \",\"\"))}if(!0===o.italics){var x=t.indexOf(f)>-1,_=r.indexOf(f)>-1;!x&&_&&(n=\"italic \"+n),x&&!_&&(n=n.replace(\"italic \",\"\"))}e.font=n}for(w=0;w\",a=\"\",o=i.length,s=a.length,l=e[0]===d||e[0]===y,c=0,u=-s;c>-1&&-1!==(c=r.indexOf(i,c))&&-1!==(u=r.indexOf(a,c+o))&&!(u<=c);){for(var h=c;h=u)n[h]=null,r=r.substr(0,h)+\" \"+r.substr(h+1);else if(null!==n[h]){var f=n[h].indexOf(e[0]);-1===f?n[h]+=e:l&&(n[h]=n[h].substr(0,f+1)+(1+parseInt(n[h][f+1]))+n[h].substr(f+2))}var p=c+o,m=r.substr(p,u-p).indexOf(i);c=-1!==m?m:u+s}return n}function _(t,e){var r=n(t,128);return e?a(r.cells,r.positions,.25):{edges:r.cells,positions:r.positions}}function b(t,e,r,n){var i=_(t,n),a=function(t,e,r){for(var n=e.textAlign||\"start\",i=e.textBaseline||\"alphabetic\",a=[1<<30,1<<30],o=[0,0],s=t.length,l=0;l=0?e[a]:i}))},has___:{value:x((function(e){var n=v(e);return n?r in n:t.indexOf(e)>=0}))},set___:{value:x((function(n,i){var a,o=v(n);return o?o[r]=i:(a=t.indexOf(n))>=0?e[a]=i:(a=t.length,e[a]=i,t[a]=n),this}))},delete___:{value:x((function(n){var i,a,o=v(n);return o?r in o&&delete o[r]:!((i=t.indexOf(n))<0||(a=t.length-1,t[i]=void 0,e[i]=e[a],t[i]=t[a],t.length=a,e.length=a,0))}))}})};m.prototype=Object.create(Object.prototype,{get:{value:function(t,e){return this.get___(t,e)},writable:!0,configurable:!0},has:{value:function(t){return this.has___(t)},writable:!0,configurable:!0},set:{value:function(t,e){return this.set___(t,e)},writable:!0,configurable:!0},delete:{value:function(t){return this.delete___(t)},writable:!0,configurable:!0}}),\"function\"==typeof r?function(){function n(){this instanceof m||_();var t,n=new r,i=void 0,a=!1;return t=e?function(t,e){return n.set(t,e),n.has(t)||(i||(i=new m),i.set(t,e)),this}:function(t,e){if(a)try{n.set(t,e)}catch(r){i||(i=new m),i.set___(t,e)}else n.set(t,e);return this},Object.create(m.prototype,{get___:{value:x((function(t,e){return i?n.has(t)?n.get(t):i.get___(t,e):n.get(t,e)}))},has___:{value:x((function(t){return n.has(t)||!!i&&i.has___(t)}))},set___:{value:x(t)},delete___:{value:x((function(t){var e=!!n.delete(t);return i&&i.delete___(t)||e}))},permitHostObjects___:{value:x((function(t){if(t!==g)throw new Error(\"bogus call to permitHostObjects___\");a=!0}))}})}e&&\"undefined\"!=typeof Proxy&&(Proxy=void 0),n.prototype=m.prototype,t.exports=n,Object.defineProperty(WeakMap.prototype,\"constructor\",{value:WeakMap,enumerable:!1,configurable:!0,writable:!0})}():(\"undefined\"!=typeof Proxy&&(Proxy=void 0),t.exports=m)}function g(t){t.permitHostObjects___&&t.permitHostObjects___(g)}function y(t){return!(t.substr(0,8)==l&&\"___\"===t.substr(t.length-3))}function v(t){if(t!==Object(t))throw new TypeError(\"Not an object: \"+t);var e=t[c];if(e&&e.key===t)return e;if(s(t)){e={key:t};try{return o(t,c,{value:e,writable:!1,enumerable:!1,configurable:!1}),e}catch(t){return}}}function x(t){return t.prototype=null,Object.freeze(t)}function _(){p||\"undefined\"==typeof console||(p=!0,console.warn(\"WeakMap should be invoked as new WeakMap(), not WeakMap(). This will be an error in the future.\"))}}()},236:function(t,e,r){var n=r(8284);t.exports=function(){var t={};return function(e){if((\"object\"!=typeof e||null===e)&&\"function\"!=typeof e)throw new Error(\"Weakmap-shim: Key must be object\");var r=e.valueOf(t);return r&&r.identity===t?r:n(e,t)}}},8284:function(t){t.exports=function(t,e){var r={identity:e},n=t.valueOf;return Object.defineProperty(t,\"valueOf\",{value:function(t){return t!==e?n.apply(this,arguments):r},writable:!0}),r}},606:function(t,e,r){var n=r(236);t.exports=function(){var t=n();return{get:function(e,r){var n=t(e);return n.hasOwnProperty(\"value\")?n.value:r},set:function(e,r){return t(e).value=r,this},has:function(e){return\"value\"in t(e)},delete:function(e){return delete t(e).value}}}},3349:function(t){\"use strict\";t.exports=function(t){var e={};return function(r,n,i){var a=r.dtype,o=r.order,s=[a,o.join()].join(),l=e[s];return l||(e[s]=l=t([a,o])),l(r.shape.slice(0),r.data,r.stride,0|r.offset,n,i)}}(function(){return function(t,e,r,n,i,a){var o=t[0],s=r[0],l=[0],c=s;n|=0;var u=0,h=s;for(u=0;u=0!=p>=0&&i.push(l[0]+.5+.5*(f+p)/(f-p)),n+=h,++l[0]}}}.bind(void 0,{funcName:\"zeroCrossings\"}))},781:function(t,e,r){\"use strict\";t.exports=function(t,e){var r=[];return e=+e||0,n(t.hi(t.shape[0]-1),r,e),r};var n=r(3349)},7790:function(){}},r={};function a(t){var n=r[t];if(void 0!==n)return n.exports;var i=r[t]={id:t,loaded:!1,exports:{}};return e[t].call(i.exports,i,i.exports,a),i.loaded=!0,i.exports}a.g=function(){if(\"object\"==typeof globalThis)return globalThis;try{return this||new Function(\"return this\")()}catch(t){if(\"object\"==typeof window)return window}}(),a.nmd=function(t){return t.paths=[],t.children||(t.children=[]),t};var o=a(1964);t.exports=o}()},45708:function(t,e,r){\"use strict\";function n(t,e){for(var r=0;rp)throw new RangeError('The value \"'+t+'\" is invalid for option \"size\"');var e=new Uint8Array(t);return Object.setPrototypeOf(e,m.prototype),e}function m(t,e,r){if(\"number\"==typeof t){if(\"string\"==typeof e)throw new TypeError('The \"string\" argument must be of type string. Received type number');return v(t)}return g(t,e,r)}function g(t,e,r){if(\"string\"==typeof t)return function(t,e){if(\"string\"==typeof e&&\"\"!==e||(e=\"utf8\"),!m.isEncoding(e))throw new TypeError(\"Unknown encoding: \"+e);var r=0|w(t,e),n=d(r),i=n.write(t,e);return i!==r&&(n=n.slice(0,i)),n}(t,e);if(ArrayBuffer.isView(t))return function(t){if(rt(t,Uint8Array)){var e=new Uint8Array(t);return _(e.buffer,e.byteOffset,e.byteLength)}return x(t)}(t);if(null==t)throw new TypeError(\"The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type \"+c(t));if(rt(t,ArrayBuffer)||t&&rt(t.buffer,ArrayBuffer))return _(t,e,r);if(\"undefined\"!=typeof SharedArrayBuffer&&(rt(t,SharedArrayBuffer)||t&&rt(t.buffer,SharedArrayBuffer)))return _(t,e,r);if(\"number\"==typeof t)throw new TypeError('The \"value\" argument must not be of type number. Received type number');var n=t.valueOf&&t.valueOf();if(null!=n&&n!==t)return m.from(n,e,r);var i=function(t){if(m.isBuffer(t)){var e=0|b(t.length),r=d(e);return 0===r.length||t.copy(r,0,0,e),r}return void 0!==t.length?\"number\"!=typeof t.length||nt(t.length)?d(0):x(t):\"Buffer\"===t.type&&Array.isArray(t.data)?x(t.data):void 0}(t);if(i)return i;if(\"undefined\"!=typeof Symbol&&null!=Symbol.toPrimitive&&\"function\"==typeof t[Symbol.toPrimitive])return m.from(t[Symbol.toPrimitive](\"string\"),e,r);throw new TypeError(\"The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type \"+c(t))}function y(t){if(\"number\"!=typeof t)throw new TypeError('\"size\" argument must be of type number');if(t<0)throw new RangeError('The value \"'+t+'\" is invalid for option \"size\"')}function v(t){return y(t),d(t<0?0:0|b(t))}function x(t){for(var e=t.length<0?0:0|b(t.length),r=d(e),n=0;n=p)throw new RangeError(\"Attempt to allocate Buffer larger than maximum size: 0x\"+p.toString(16)+\" bytes\");return 0|t}function w(t,e){if(m.isBuffer(t))return t.length;if(ArrayBuffer.isView(t)||rt(t,ArrayBuffer))return t.byteLength;if(\"string\"!=typeof t)throw new TypeError('The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+c(t));var r=t.length,n=arguments.length>2&&!0===arguments[2];if(!n&&0===r)return 0;for(var i=!1;;)switch(e){case\"ascii\":case\"latin1\":case\"binary\":return r;case\"utf8\":case\"utf-8\":return Q(t).length;case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return 2*r;case\"hex\":return r>>>1;case\"base64\":return tt(t).length;default:if(i)return n?-1:Q(t).length;e=(\"\"+e).toLowerCase(),i=!0}}function T(t,e,r){var n=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return\"\";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return\"\";if((r>>>=0)<=(e>>>=0))return\"\";for(t||(t=\"utf8\");;)switch(t){case\"hex\":return F(this,e,r);case\"utf8\":case\"utf-8\":return z(this,e,r);case\"ascii\":return D(this,e,r);case\"latin1\":case\"binary\":return R(this,e,r);case\"base64\":return P(this,e,r);case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return B(this,e,r);default:if(n)throw new TypeError(\"Unknown encoding: \"+t);t=(t+\"\").toLowerCase(),n=!0}}function k(t,e,r){var n=t[e];t[e]=t[r],t[r]=n}function A(t,e,r,n,i){if(0===t.length)return-1;if(\"string\"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),nt(r=+r)&&(r=i?0:t.length-1),r<0&&(r=t.length+r),r>=t.length){if(i)return-1;r=t.length-1}else if(r<0){if(!i)return-1;r=0}if(\"string\"==typeof e&&(e=m.from(e,n)),m.isBuffer(e))return 0===e.length?-1:M(t,e,r,n,i);if(\"number\"==typeof e)return e&=255,\"function\"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(t,e,r):Uint8Array.prototype.lastIndexOf.call(t,e,r):M(t,[e],r,n,i);throw new TypeError(\"val must be string, number or Buffer\")}function M(t,e,r,n,i){var a,o=1,s=t.length,l=e.length;if(void 0!==n&&(\"ucs2\"===(n=String(n).toLowerCase())||\"ucs-2\"===n||\"utf16le\"===n||\"utf-16le\"===n)){if(t.length<2||e.length<2)return-1;o=2,s/=2,l/=2,r/=2}function c(t,e){return 1===o?t[e]:t.readUInt16BE(e*o)}if(i){var u=-1;for(a=r;as&&(r=s-l),a=r;a>=0;a--){for(var h=!0,f=0;fi&&(n=i):n=i;var a,o=e.length;for(n>o/2&&(n=o/2),a=0;a>8,i=r%256,a.push(i),a.push(n);return a}(e,t.length-r),t,r,n)}function P(t,e,r){return 0===e&&r===t.length?u.fromByteArray(t):u.fromByteArray(t.slice(e,r))}function z(t,e,r){r=Math.min(t.length,r);for(var n=[],i=e;i239?4:a>223?3:a>191?2:1;if(i+s<=r){var l=void 0,c=void 0,u=void 0,h=void 0;switch(s){case 1:a<128&&(o=a);break;case 2:128==(192&(l=t[i+1]))&&(h=(31&a)<<6|63&l)>127&&(o=h);break;case 3:l=t[i+1],c=t[i+2],128==(192&l)&&128==(192&c)&&(h=(15&a)<<12|(63&l)<<6|63&c)>2047&&(h<55296||h>57343)&&(o=h);break;case 4:l=t[i+1],c=t[i+2],u=t[i+3],128==(192&l)&&128==(192&c)&&128==(192&u)&&(h=(15&a)<<18|(63&l)<<12|(63&c)<<6|63&u)>65535&&h<1114112&&(o=h)}}null===o?(o=65533,s=1):o>65535&&(o-=65536,n.push(o>>>10&1023|55296),o=56320|1023&o),n.push(o),i+=s}return function(t){var e=t.length;if(e<=O)return String.fromCharCode.apply(String,t);for(var r=\"\",n=0;nn.length?(m.isBuffer(a)||(a=m.from(a)),a.copy(n,i)):Uint8Array.prototype.set.call(n,a,i);else{if(!m.isBuffer(a))throw new TypeError('\"list\" argument must be an Array of Buffers');a.copy(n,i)}i+=a.length}return n},m.byteLength=w,m.prototype._isBuffer=!0,m.prototype.swap16=function(){var t=this.length;if(t%2!=0)throw new RangeError(\"Buffer size must be a multiple of 16-bits\");for(var e=0;er&&(t+=\" ... \"),\"\"},f&&(m.prototype[f]=m.prototype.inspect),m.prototype.compare=function(t,e,r,n,i){if(rt(t,Uint8Array)&&(t=m.from(t,t.offset,t.byteLength)),!m.isBuffer(t))throw new TypeError('The \"target\" argument must be one of type Buffer or Uint8Array. Received type '+c(t));if(void 0===e&&(e=0),void 0===r&&(r=t?t.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),e<0||r>t.length||n<0||i>this.length)throw new RangeError(\"out of range index\");if(n>=i&&e>=r)return 0;if(n>=i)return-1;if(e>=r)return 1;if(this===t)return 0;for(var a=(i>>>=0)-(n>>>=0),o=(r>>>=0)-(e>>>=0),s=Math.min(a,o),l=this.slice(n,i),u=t.slice(e,r),h=0;h>>=0,isFinite(r)?(r>>>=0,void 0===n&&(n=\"utf8\")):(n=r,r=void 0)}var i=this.length-e;if((void 0===r||r>i)&&(r=i),t.length>0&&(r<0||e<0)||e>this.length)throw new RangeError(\"Attempt to write outside buffer bounds\");n||(n=\"utf8\");for(var a=!1;;)switch(n){case\"hex\":return S(this,t,e,r);case\"utf8\":case\"utf-8\":return E(this,t,e,r);case\"ascii\":case\"latin1\":case\"binary\":return C(this,t,e,r);case\"base64\":return L(this,t,e,r);case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return I(this,t,e,r);default:if(a)throw new TypeError(\"Unknown encoding: \"+n);n=(\"\"+n).toLowerCase(),a=!0}},m.prototype.toJSON=function(){return{type:\"Buffer\",data:Array.prototype.slice.call(this._arr||this,0)}};var O=4096;function D(t,e,r){var n=\"\";r=Math.min(t.length,r);for(var i=e;in)&&(r=n);for(var i=\"\",a=e;ar)throw new RangeError(\"Trying to access beyond buffer length\")}function j(t,e,r,n,i,a){if(!m.isBuffer(t))throw new TypeError('\"buffer\" argument must be a Buffer instance');if(e>i||et.length)throw new RangeError(\"Index out of range\")}function U(t,e,r,n,i){X(e,n,i,t,r,7);var a=Number(e&BigInt(4294967295));t[r++]=a,a>>=8,t[r++]=a,a>>=8,t[r++]=a,a>>=8,t[r++]=a;var o=Number(e>>BigInt(32)&BigInt(4294967295));return t[r++]=o,o>>=8,t[r++]=o,o>>=8,t[r++]=o,o>>=8,t[r++]=o,r}function V(t,e,r,n,i){X(e,n,i,t,r,7);var a=Number(e&BigInt(4294967295));t[r+7]=a,a>>=8,t[r+6]=a,a>>=8,t[r+5]=a,a>>=8,t[r+4]=a;var o=Number(e>>BigInt(32)&BigInt(4294967295));return t[r+3]=o,o>>=8,t[r+2]=o,o>>=8,t[r+1]=o,o>>=8,t[r]=o,r+8}function q(t,e,r,n,i,a){if(r+n>t.length)throw new RangeError(\"Index out of range\");if(r<0)throw new RangeError(\"Index out of range\")}function H(t,e,r,n,i){return e=+e,r>>>=0,i||q(t,0,r,4),h.write(t,e,r,n,23,4),r+4}function G(t,e,r,n,i){return e=+e,r>>>=0,i||q(t,0,r,8),h.write(t,e,r,n,52,8),r+8}m.prototype.slice=function(t,e){var r=this.length;(t=~~t)<0?(t+=r)<0&&(t=0):t>r&&(t=r),(e=void 0===e?r:~~e)<0?(e+=r)<0&&(e=0):e>r&&(e=r),e>>=0,e>>>=0,r||N(t,e,this.length);for(var n=this[t],i=1,a=0;++a>>=0,e>>>=0,r||N(t,e,this.length);for(var n=this[t+--e],i=1;e>0&&(i*=256);)n+=this[t+--e]*i;return n},m.prototype.readUint8=m.prototype.readUInt8=function(t,e){return t>>>=0,e||N(t,1,this.length),this[t]},m.prototype.readUint16LE=m.prototype.readUInt16LE=function(t,e){return t>>>=0,e||N(t,2,this.length),this[t]|this[t+1]<<8},m.prototype.readUint16BE=m.prototype.readUInt16BE=function(t,e){return t>>>=0,e||N(t,2,this.length),this[t]<<8|this[t+1]},m.prototype.readUint32LE=m.prototype.readUInt32LE=function(t,e){return t>>>=0,e||N(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},m.prototype.readUint32BE=m.prototype.readUInt32BE=function(t,e){return t>>>=0,e||N(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},m.prototype.readBigUInt64LE=at((function(t){$(t>>>=0,\"offset\");var e=this[t],r=this[t+7];void 0!==e&&void 0!==r||J(t,this.length-8);var n=e+this[++t]*Math.pow(2,8)+this[++t]*Math.pow(2,16)+this[++t]*Math.pow(2,24),i=this[++t]+this[++t]*Math.pow(2,8)+this[++t]*Math.pow(2,16)+r*Math.pow(2,24);return BigInt(n)+(BigInt(i)<>>=0,\"offset\");var e=this[t],r=this[t+7];void 0!==e&&void 0!==r||J(t,this.length-8);var n=e*Math.pow(2,24)+this[++t]*Math.pow(2,16)+this[++t]*Math.pow(2,8)+this[++t],i=this[++t]*Math.pow(2,24)+this[++t]*Math.pow(2,16)+this[++t]*Math.pow(2,8)+r;return(BigInt(n)<>>=0,e>>>=0,r||N(t,e,this.length);for(var n=this[t],i=1,a=0;++a=(i*=128)&&(n-=Math.pow(2,8*e)),n},m.prototype.readIntBE=function(t,e,r){t>>>=0,e>>>=0,r||N(t,e,this.length);for(var n=e,i=1,a=this[t+--n];n>0&&(i*=256);)a+=this[t+--n]*i;return a>=(i*=128)&&(a-=Math.pow(2,8*e)),a},m.prototype.readInt8=function(t,e){return t>>>=0,e||N(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},m.prototype.readInt16LE=function(t,e){t>>>=0,e||N(t,2,this.length);var r=this[t]|this[t+1]<<8;return 32768&r?4294901760|r:r},m.prototype.readInt16BE=function(t,e){t>>>=0,e||N(t,2,this.length);var r=this[t+1]|this[t]<<8;return 32768&r?4294901760|r:r},m.prototype.readInt32LE=function(t,e){return t>>>=0,e||N(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},m.prototype.readInt32BE=function(t,e){return t>>>=0,e||N(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},m.prototype.readBigInt64LE=at((function(t){$(t>>>=0,\"offset\");var e=this[t],r=this[t+7];void 0!==e&&void 0!==r||J(t,this.length-8);var n=this[t+4]+this[t+5]*Math.pow(2,8)+this[t+6]*Math.pow(2,16)+(r<<24);return(BigInt(n)<>>=0,\"offset\");var e=this[t],r=this[t+7];void 0!==e&&void 0!==r||J(t,this.length-8);var n=(e<<24)+this[++t]*Math.pow(2,16)+this[++t]*Math.pow(2,8)+this[++t];return(BigInt(n)<>>=0,e||N(t,4,this.length),h.read(this,t,!0,23,4)},m.prototype.readFloatBE=function(t,e){return t>>>=0,e||N(t,4,this.length),h.read(this,t,!1,23,4)},m.prototype.readDoubleLE=function(t,e){return t>>>=0,e||N(t,8,this.length),h.read(this,t,!0,52,8)},m.prototype.readDoubleBE=function(t,e){return t>>>=0,e||N(t,8,this.length),h.read(this,t,!1,52,8)},m.prototype.writeUintLE=m.prototype.writeUIntLE=function(t,e,r,n){t=+t,e>>>=0,r>>>=0,n||j(this,t,e,r,Math.pow(2,8*r)-1,0);var i=1,a=0;for(this[e]=255&t;++a>>=0,r>>>=0,n||j(this,t,e,r,Math.pow(2,8*r)-1,0);var i=r-1,a=1;for(this[e+i]=255&t;--i>=0&&(a*=256);)this[e+i]=t/a&255;return e+r},m.prototype.writeUint8=m.prototype.writeUInt8=function(t,e,r){return t=+t,e>>>=0,r||j(this,t,e,1,255,0),this[e]=255&t,e+1},m.prototype.writeUint16LE=m.prototype.writeUInt16LE=function(t,e,r){return t=+t,e>>>=0,r||j(this,t,e,2,65535,0),this[e]=255&t,this[e+1]=t>>>8,e+2},m.prototype.writeUint16BE=m.prototype.writeUInt16BE=function(t,e,r){return t=+t,e>>>=0,r||j(this,t,e,2,65535,0),this[e]=t>>>8,this[e+1]=255&t,e+2},m.prototype.writeUint32LE=m.prototype.writeUInt32LE=function(t,e,r){return t=+t,e>>>=0,r||j(this,t,e,4,4294967295,0),this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t,e+4},m.prototype.writeUint32BE=m.prototype.writeUInt32BE=function(t,e,r){return t=+t,e>>>=0,r||j(this,t,e,4,4294967295,0),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},m.prototype.writeBigUInt64LE=at((function(t){return U(this,t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,BigInt(0),BigInt(\"0xffffffffffffffff\"))})),m.prototype.writeBigUInt64BE=at((function(t){return V(this,t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,BigInt(0),BigInt(\"0xffffffffffffffff\"))})),m.prototype.writeIntLE=function(t,e,r,n){if(t=+t,e>>>=0,!n){var i=Math.pow(2,8*r-1);j(this,t,e,r,i-1,-i)}var a=0,o=1,s=0;for(this[e]=255&t;++a>0)-s&255;return e+r},m.prototype.writeIntBE=function(t,e,r,n){if(t=+t,e>>>=0,!n){var i=Math.pow(2,8*r-1);j(this,t,e,r,i-1,-i)}var a=r-1,o=1,s=0;for(this[e+a]=255&t;--a>=0&&(o*=256);)t<0&&0===s&&0!==this[e+a+1]&&(s=1),this[e+a]=(t/o>>0)-s&255;return e+r},m.prototype.writeInt8=function(t,e,r){return t=+t,e>>>=0,r||j(this,t,e,1,127,-128),t<0&&(t=255+t+1),this[e]=255&t,e+1},m.prototype.writeInt16LE=function(t,e,r){return t=+t,e>>>=0,r||j(this,t,e,2,32767,-32768),this[e]=255&t,this[e+1]=t>>>8,e+2},m.prototype.writeInt16BE=function(t,e,r){return t=+t,e>>>=0,r||j(this,t,e,2,32767,-32768),this[e]=t>>>8,this[e+1]=255&t,e+2},m.prototype.writeInt32LE=function(t,e,r){return t=+t,e>>>=0,r||j(this,t,e,4,2147483647,-2147483648),this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24,e+4},m.prototype.writeInt32BE=function(t,e,r){return t=+t,e>>>=0,r||j(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},m.prototype.writeBigInt64LE=at((function(t){return U(this,t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,-BigInt(\"0x8000000000000000\"),BigInt(\"0x7fffffffffffffff\"))})),m.prototype.writeBigInt64BE=at((function(t){return V(this,t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,-BigInt(\"0x8000000000000000\"),BigInt(\"0x7fffffffffffffff\"))})),m.prototype.writeFloatLE=function(t,e,r){return H(this,t,e,!0,r)},m.prototype.writeFloatBE=function(t,e,r){return H(this,t,e,!1,r)},m.prototype.writeDoubleLE=function(t,e,r){return G(this,t,e,!0,r)},m.prototype.writeDoubleBE=function(t,e,r){return G(this,t,e,!1,r)},m.prototype.copy=function(t,e,r,n){if(!m.isBuffer(t))throw new TypeError(\"argument should be a Buffer\");if(r||(r=0),n||0===n||(n=this.length),e>=t.length&&(e=t.length),e||(e=0),n>0&&n=this.length)throw new RangeError(\"Index out of range\");if(n<0)throw new RangeError(\"sourceEnd out of bounds\");n>this.length&&(n=this.length),t.length-e>>=0,r=void 0===r?this.length:r>>>0,t||(t=0),\"number\"==typeof t)for(a=e;a=n+4;r-=3)e=\"_\".concat(t.slice(r-3,r)).concat(e);return\"\".concat(t.slice(0,r)).concat(e)}function X(t,e,r,n,i,a){if(t>r||t3?0===e||e===BigInt(0)?\">= 0\".concat(s,\" and < 2\").concat(s,\" ** \").concat(8*(a+1)).concat(s):\">= -(2\".concat(s,\" ** \").concat(8*(a+1)-1).concat(s,\") and < 2 ** \")+\"\".concat(8*(a+1)-1).concat(s):\">= \".concat(e).concat(s,\" and <= \").concat(r).concat(s),new Z.ERR_OUT_OF_RANGE(\"value\",o,t)}!function(t,e,r){$(e,\"offset\"),void 0!==t[e]&&void 0!==t[e+r]||J(e,t.length-(r+1))}(n,i,a)}function $(t,e){if(\"number\"!=typeof t)throw new Z.ERR_INVALID_ARG_TYPE(e,\"number\",t)}function J(t,e,r){if(Math.floor(t)!==t)throw $(t,r),new Z.ERR_OUT_OF_RANGE(r||\"offset\",\"an integer\",t);if(e<0)throw new Z.ERR_BUFFER_OUT_OF_BOUNDS;throw new Z.ERR_OUT_OF_RANGE(r||\"offset\",\">= \".concat(r?1:0,\" and <= \").concat(e),t)}W(\"ERR_BUFFER_OUT_OF_BOUNDS\",(function(t){return t?\"\".concat(t,\" is outside of buffer bounds\"):\"Attempt to access memory outside buffer bounds\"}),RangeError),W(\"ERR_INVALID_ARG_TYPE\",(function(t,e){return'The \"'.concat(t,'\" argument must be of type number. Received type ').concat(c(e))}),TypeError),W(\"ERR_OUT_OF_RANGE\",(function(t,e,r){var n='The value of \"'.concat(t,'\" is out of range.'),i=r;return Number.isInteger(r)&&Math.abs(r)>Math.pow(2,32)?i=Y(String(r)):\"bigint\"==typeof r&&(i=String(r),(r>Math.pow(BigInt(2),BigInt(32))||r<-Math.pow(BigInt(2),BigInt(32)))&&(i=Y(i)),i+=\"n\"),n+\" It must be \".concat(e,\". Received \").concat(i)}),RangeError);var K=/[^+/0-9A-Za-z-_]/g;function Q(t,e){var r;e=e||1/0;for(var n=t.length,i=null,a=[],o=0;o55295&&r<57344){if(!i){if(r>56319){(e-=3)>-1&&a.push(239,191,189);continue}if(o+1===n){(e-=3)>-1&&a.push(239,191,189);continue}i=r;continue}if(r<56320){(e-=3)>-1&&a.push(239,191,189),i=r;continue}r=65536+(i-55296<<10|r-56320)}else i&&(e-=3)>-1&&a.push(239,191,189);if(i=null,r<128){if((e-=1)<0)break;a.push(r)}else if(r<2048){if((e-=2)<0)break;a.push(r>>6|192,63&r|128)}else if(r<65536){if((e-=3)<0)break;a.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error(\"Invalid code point\");if((e-=4)<0)break;a.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return a}function tt(t){return u.toByteArray(function(t){if((t=(t=t.split(\"=\")[0]).trim().replace(K,\"\")).length<2)return\"\";for(;t.length%4!=0;)t+=\"=\";return t}(t))}function et(t,e,r,n){var i;for(i=0;i=e.length||i>=t.length);++i)e[i+r]=t[i];return i}function rt(t,e){return t instanceof e||null!=t&&null!=t.constructor&&null!=t.constructor.name&&t.constructor.name===e.name}function nt(t){return t!=t}var it=function(){for(var t=\"0123456789abcdef\",e=new Array(256),r=0;r<16;++r)for(var n=16*r,i=0;i<16;++i)e[n+i]=t[r]+t[i];return e}();function at(t){return\"undefined\"==typeof BigInt?ot:t}function ot(){throw new Error(\"BigInt not supported\")}},13087:function(t){\"use strict\";t.exports=i,t.exports.isMobile=i,t.exports.default=i;var e=/(android|bb\\d+|meego).+mobile|armv7l|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series[46]0|samsungbrowser.*mobile|symbian|treo|up\\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i,r=/CrOS/,n=/android|ipad|playbook|silk/i;function i(t){t||(t={});var i=t.ua;if(i||\"undefined\"==typeof navigator||(i=navigator.userAgent),i&&i.headers&&\"string\"==typeof i.headers[\"user-agent\"]&&(i=i.headers[\"user-agent\"]),\"string\"!=typeof i)return!1;var a=e.test(i)&&!r.test(i)||!!t.tablet&&n.test(i);return!a&&t.tablet&&t.featureDetect&&navigator&&navigator.maxTouchPoints>1&&-1!==i.indexOf(\"Macintosh\")&&-1!==i.indexOf(\"Safari\")&&(a=!0),a}},5955:function(t,e,r){\"use strict\";var n=r(22413),i=r.n(n),a=r(51070),o=r.n(a),s=r(62133),l=r.n(s),c=new URL(r(77035),r.b),u=new URL(r(43470),r.b),h=new URL(r(68164),r.b),f=new URL(r(64665),r.b),p=new URL(r(4890),r.b),d=new URL(r(13363),r.b),m=new URL(r(13490),r.b),g=new URL(r(47603),r.b),y=new URL(r(13913),r.b),v=new URL(r(91413),r.b),x=new URL(r(64643),r.b),_=new URL(r(80216),r.b),b=new URL(r(61907),r.b),w=new URL(r(68605),r.b),T=new URL(r(25446),r.b),k=new URL(r(56694),r.b),A=new URL(r(24420),r.b),M=new URL(r(75796),r.b),S=new URL(r(92228),r.b),E=new URL(r(9819),r.b),C=new URL(r(47695),r.b),L=new URL(r(28869),r.b),I=new URL(r(30557),r.b),P=new URL(r(48460),r.b),z=new URL(r(56539),r.b),O=new URL(r(43737),r.b),D=new URL(r(47914),r.b),R=new URL(r(26117),r.b),F=new URL(r(66311),r.b),B=o()(i()),N=l()(c),j=l()(u),U=l()(h),V=l()(f),q=l()(p),H=l()(d),G=l()(m),Z=l()(g),W=l()(y),Y=l()(v),X=l()(x),$=l()(_),J=l()(b),K=l()(w),Q=l()(T),tt=l()(k),et=l()(A),rt=l()(M),nt=l()(S),it=l()(E),at=l()(C),ot=l()(L),st=l()(I),lt=l()(P),ct=l()(z),ut=l()(O),ht=l()(D),ft=l()(R),pt=l()(F);B.push([t.id,\".maplibregl-map{font:12px/20px Helvetica Neue,Arial,Helvetica,sans-serif;overflow:hidden;position:relative;-webkit-tap-highlight-color:rgb(0 0 0/0)}.maplibregl-canvas{left:0;position:absolute;top:0}.maplibregl-map:fullscreen{height:100%;width:100%}.maplibregl-ctrl-group button.maplibregl-ctrl-compass{touch-action:none}.maplibregl-canvas-container.maplibregl-interactive,.maplibregl-ctrl-group button.maplibregl-ctrl-compass{cursor:grab;-webkit-user-select:none;-moz-user-select:none;user-select:none}.maplibregl-canvas-container.maplibregl-interactive.maplibregl-track-pointer{cursor:pointer}.maplibregl-canvas-container.maplibregl-interactive:active,.maplibregl-ctrl-group button.maplibregl-ctrl-compass:active{cursor:grabbing}.maplibregl-canvas-container.maplibregl-touch-zoom-rotate,.maplibregl-canvas-container.maplibregl-touch-zoom-rotate .maplibregl-canvas{touch-action:pan-x pan-y}.maplibregl-canvas-container.maplibregl-touch-drag-pan,.maplibregl-canvas-container.maplibregl-touch-drag-pan .maplibregl-canvas{touch-action:pinch-zoom}.maplibregl-canvas-container.maplibregl-touch-zoom-rotate.maplibregl-touch-drag-pan,.maplibregl-canvas-container.maplibregl-touch-zoom-rotate.maplibregl-touch-drag-pan .maplibregl-canvas{touch-action:none}.maplibregl-canvas-container.maplibregl-touch-drag-pan.maplibregl-cooperative-gestures,.maplibregl-canvas-container.maplibregl-touch-drag-pan.maplibregl-cooperative-gestures .maplibregl-canvas{touch-action:pan-x pan-y}.maplibregl-ctrl-bottom-left,.maplibregl-ctrl-bottom-right,.maplibregl-ctrl-top-left,.maplibregl-ctrl-top-right{pointer-events:none;position:absolute;z-index:2}.maplibregl-ctrl-top-left{left:0;top:0}.maplibregl-ctrl-top-right{right:0;top:0}.maplibregl-ctrl-bottom-left{bottom:0;left:0}.maplibregl-ctrl-bottom-right{bottom:0;right:0}.maplibregl-ctrl{clear:both;pointer-events:auto;transform:translate(0)}.maplibregl-ctrl-top-left .maplibregl-ctrl{float:left;margin:10px 0 0 10px}.maplibregl-ctrl-top-right .maplibregl-ctrl{float:right;margin:10px 10px 0 0}.maplibregl-ctrl-bottom-left .maplibregl-ctrl{float:left;margin:0 0 10px 10px}.maplibregl-ctrl-bottom-right .maplibregl-ctrl{float:right;margin:0 10px 10px 0}.maplibregl-ctrl-group{background:#fff;border-radius:4px}.maplibregl-ctrl-group:not(:empty){box-shadow:0 0 0 2px rgba(0,0,0,.1)}@media (forced-colors:active){.maplibregl-ctrl-group:not(:empty){box-shadow:0 0 0 2px ButtonText}}.maplibregl-ctrl-group button{background-color:transparent;border:0;box-sizing:border-box;cursor:pointer;display:block;height:29px;outline:none;padding:0;width:29px}.maplibregl-ctrl-group button+button{border-top:1px solid #ddd}.maplibregl-ctrl button .maplibregl-ctrl-icon{background-position:50%;background-repeat:no-repeat;display:block;height:100%;width:100%}@media (forced-colors:active){.maplibregl-ctrl-icon{background-color:transparent}.maplibregl-ctrl-group button+button{border-top:1px solid ButtonText}}.maplibregl-ctrl button::-moz-focus-inner{border:0;padding:0}.maplibregl-ctrl-attrib-button:focus,.maplibregl-ctrl-group button:focus{box-shadow:0 0 2px 2px #0096ff}.maplibregl-ctrl button:disabled{cursor:not-allowed}.maplibregl-ctrl button:disabled .maplibregl-ctrl-icon{opacity:.25}.maplibregl-ctrl button:not(:disabled):hover{background-color:rgb(0 0 0/5%)}.maplibregl-ctrl-group button:focus:focus-visible{box-shadow:0 0 2px 2px #0096ff}.maplibregl-ctrl-group button:focus:not(:focus-visible){box-shadow:none}.maplibregl-ctrl-group button:focus:first-child{border-radius:4px 4px 0 0}.maplibregl-ctrl-group button:focus:last-child{border-radius:0 0 4px 4px}.maplibregl-ctrl-group button:focus:only-child{border-radius:inherit}.maplibregl-ctrl button.maplibregl-ctrl-zoom-out .maplibregl-ctrl-icon{background-image:url(\"+N+\")}.maplibregl-ctrl button.maplibregl-ctrl-zoom-in .maplibregl-ctrl-icon{background-image:url(\"+j+\")}@media (forced-colors:active){.maplibregl-ctrl button.maplibregl-ctrl-zoom-out .maplibregl-ctrl-icon{background-image:url(\"+U+\")}.maplibregl-ctrl button.maplibregl-ctrl-zoom-in .maplibregl-ctrl-icon{background-image:url(\"+V+\")}}@media (forced-colors:active) and (prefers-color-scheme:light){.maplibregl-ctrl button.maplibregl-ctrl-zoom-out .maplibregl-ctrl-icon{background-image:url(\"+q+\")}.maplibregl-ctrl button.maplibregl-ctrl-zoom-in .maplibregl-ctrl-icon{background-image:url(\"+H+\")}}.maplibregl-ctrl button.maplibregl-ctrl-fullscreen .maplibregl-ctrl-icon{background-image:url(\"+G+\")}.maplibregl-ctrl button.maplibregl-ctrl-shrink .maplibregl-ctrl-icon{background-image:url(\"+Z+\")}@media (forced-colors:active){.maplibregl-ctrl button.maplibregl-ctrl-fullscreen .maplibregl-ctrl-icon{background-image:url(\"+W+\")}.maplibregl-ctrl button.maplibregl-ctrl-shrink .maplibregl-ctrl-icon{background-image:url(\"+Y+\")}}@media (forced-colors:active) and (prefers-color-scheme:light){.maplibregl-ctrl button.maplibregl-ctrl-fullscreen .maplibregl-ctrl-icon{background-image:url(\"+X+\")}.maplibregl-ctrl button.maplibregl-ctrl-shrink .maplibregl-ctrl-icon{background-image:url(\"+Z+\")}}.maplibregl-ctrl button.maplibregl-ctrl-compass .maplibregl-ctrl-icon{background-image:url(\"+$+\")}@media (forced-colors:active){.maplibregl-ctrl button.maplibregl-ctrl-compass .maplibregl-ctrl-icon{background-image:url(\"+J+\")}}@media (forced-colors:active) and (prefers-color-scheme:light){.maplibregl-ctrl button.maplibregl-ctrl-compass .maplibregl-ctrl-icon{background-image:url(\"+K+\")}}.maplibregl-ctrl button.maplibregl-ctrl-terrain .maplibregl-ctrl-icon{background-image:url(\"+Q+\")}.maplibregl-ctrl button.maplibregl-ctrl-terrain-enabled .maplibregl-ctrl-icon{background-image:url(\"+tt+\")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate .maplibregl-ctrl-icon{background-image:url(\"+et+\")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate:disabled .maplibregl-ctrl-icon{background-image:url(\"+rt+\")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-active .maplibregl-ctrl-icon{background-image:url(\"+nt+\")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-active-error .maplibregl-ctrl-icon{background-image:url(\"+it+\")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-background .maplibregl-ctrl-icon{background-image:url(\"+at+\")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-background-error .maplibregl-ctrl-icon{background-image:url(\"+ot+\")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-waiting .maplibregl-ctrl-icon{animation:maplibregl-spin 2s linear infinite}@media (forced-colors:active){.maplibregl-ctrl button.maplibregl-ctrl-geolocate .maplibregl-ctrl-icon{background-image:url(\"+st+\")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate:disabled .maplibregl-ctrl-icon{background-image:url(\"+lt+\")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-active .maplibregl-ctrl-icon{background-image:url(\"+nt+\")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-active-error .maplibregl-ctrl-icon{background-image:url(\"+it+\")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-background .maplibregl-ctrl-icon{background-image:url(\"+at+\")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-background-error .maplibregl-ctrl-icon{background-image:url(\"+ot+\")}}@media (forced-colors:active) and (prefers-color-scheme:light){.maplibregl-ctrl button.maplibregl-ctrl-geolocate .maplibregl-ctrl-icon{background-image:url(\"+ct+\")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate:disabled .maplibregl-ctrl-icon{background-image:url(\"+ut+\")}}@keyframes maplibregl-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}a.maplibregl-ctrl-logo{background-image:url(\"+ht+\");background-repeat:no-repeat;cursor:pointer;display:block;height:23px;margin:0 0 -4px -4px;overflow:hidden;width:88px}a.maplibregl-ctrl-logo.maplibregl-compact{width:14px}@media (forced-colors:active){a.maplibregl-ctrl-logo{background-color:transparent;background-image:url(\"+ht+\")}}@media (forced-colors:active) and (prefers-color-scheme:light){a.maplibregl-ctrl-logo{background-image:url(\"+ht+\")}}.maplibregl-ctrl.maplibregl-ctrl-attrib{background-color:hsla(0,0%,100%,.5);margin:0;padding:0 5px}@media screen{.maplibregl-ctrl-attrib.maplibregl-compact{background-color:#fff;border-radius:12px;box-sizing:content-box;color:#000;margin:10px;min-height:20px;padding:2px 24px 2px 0;position:relative}.maplibregl-ctrl-attrib.maplibregl-compact-show{padding:2px 28px 2px 8px;visibility:visible}.maplibregl-ctrl-bottom-left>.maplibregl-ctrl-attrib.maplibregl-compact-show,.maplibregl-ctrl-top-left>.maplibregl-ctrl-attrib.maplibregl-compact-show{border-radius:12px;padding:2px 8px 2px 28px}.maplibregl-ctrl-attrib.maplibregl-compact .maplibregl-ctrl-attrib-inner{display:none}.maplibregl-ctrl-attrib-button{background-color:hsla(0,0%,100%,.5);background-image:url(\"+ft+\");border:0;border-radius:12px;box-sizing:border-box;cursor:pointer;display:none;height:24px;outline:none;position:absolute;right:0;top:0;width:24px}.maplibregl-ctrl-attrib summary.maplibregl-ctrl-attrib-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;list-style:none}.maplibregl-ctrl-attrib summary.maplibregl-ctrl-attrib-button::-webkit-details-marker{display:none}.maplibregl-ctrl-bottom-left .maplibregl-ctrl-attrib-button,.maplibregl-ctrl-top-left .maplibregl-ctrl-attrib-button{left:0}.maplibregl-ctrl-attrib.maplibregl-compact .maplibregl-ctrl-attrib-button,.maplibregl-ctrl-attrib.maplibregl-compact-show .maplibregl-ctrl-attrib-inner{display:block}.maplibregl-ctrl-attrib.maplibregl-compact-show .maplibregl-ctrl-attrib-button{background-color:rgb(0 0 0/5%)}.maplibregl-ctrl-bottom-right>.maplibregl-ctrl-attrib.maplibregl-compact:after{bottom:0;right:0}.maplibregl-ctrl-top-right>.maplibregl-ctrl-attrib.maplibregl-compact:after{right:0;top:0}.maplibregl-ctrl-top-left>.maplibregl-ctrl-attrib.maplibregl-compact:after{left:0;top:0}.maplibregl-ctrl-bottom-left>.maplibregl-ctrl-attrib.maplibregl-compact:after{bottom:0;left:0}}@media screen and (forced-colors:active){.maplibregl-ctrl-attrib.maplibregl-compact:after{background-image:url(\"+pt+\")}}@media screen and (forced-colors:active) and (prefers-color-scheme:light){.maplibregl-ctrl-attrib.maplibregl-compact:after{background-image:url(\"+ft+')}}.maplibregl-ctrl-attrib a{color:rgba(0,0,0,.75);text-decoration:none}.maplibregl-ctrl-attrib a:hover{color:inherit;text-decoration:underline}.maplibregl-attrib-empty{display:none}.maplibregl-ctrl-scale{background-color:hsla(0,0%,100%,.75);border:2px solid #333;border-top:#333;box-sizing:border-box;color:#333;font-size:10px;padding:0 5px}.maplibregl-popup{display:flex;left:0;pointer-events:none;position:absolute;top:0;will-change:transform}.maplibregl-popup-anchor-top,.maplibregl-popup-anchor-top-left,.maplibregl-popup-anchor-top-right{flex-direction:column}.maplibregl-popup-anchor-bottom,.maplibregl-popup-anchor-bottom-left,.maplibregl-popup-anchor-bottom-right{flex-direction:column-reverse}.maplibregl-popup-anchor-left{flex-direction:row}.maplibregl-popup-anchor-right{flex-direction:row-reverse}.maplibregl-popup-tip{border:10px solid transparent;height:0;width:0;z-index:1}.maplibregl-popup-anchor-top .maplibregl-popup-tip{align-self:center;border-bottom-color:#fff;border-top:none}.maplibregl-popup-anchor-top-left .maplibregl-popup-tip{align-self:flex-start;border-bottom-color:#fff;border-left:none;border-top:none}.maplibregl-popup-anchor-top-right .maplibregl-popup-tip{align-self:flex-end;border-bottom-color:#fff;border-right:none;border-top:none}.maplibregl-popup-anchor-bottom .maplibregl-popup-tip{align-self:center;border-bottom:none;border-top-color:#fff}.maplibregl-popup-anchor-bottom-left .maplibregl-popup-tip{align-self:flex-start;border-bottom:none;border-left:none;border-top-color:#fff}.maplibregl-popup-anchor-bottom-right .maplibregl-popup-tip{align-self:flex-end;border-bottom:none;border-right:none;border-top-color:#fff}.maplibregl-popup-anchor-left .maplibregl-popup-tip{align-self:center;border-left:none;border-right-color:#fff}.maplibregl-popup-anchor-right .maplibregl-popup-tip{align-self:center;border-left-color:#fff;border-right:none}.maplibregl-popup-close-button{background-color:transparent;border:0;border-radius:0 3px 0 0;cursor:pointer;position:absolute;right:0;top:0}.maplibregl-popup-close-button:hover{background-color:rgb(0 0 0/5%)}.maplibregl-popup-content{background:#fff;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.1);padding:15px 10px;pointer-events:auto;position:relative}.maplibregl-popup-anchor-top-left .maplibregl-popup-content{border-top-left-radius:0}.maplibregl-popup-anchor-top-right .maplibregl-popup-content{border-top-right-radius:0}.maplibregl-popup-anchor-bottom-left .maplibregl-popup-content{border-bottom-left-radius:0}.maplibregl-popup-anchor-bottom-right .maplibregl-popup-content{border-bottom-right-radius:0}.maplibregl-popup-track-pointer{display:none}.maplibregl-popup-track-pointer *{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.maplibregl-map:hover .maplibregl-popup-track-pointer{display:flex}.maplibregl-map:active .maplibregl-popup-track-pointer{display:none}.maplibregl-marker{left:0;position:absolute;top:0;transition:opacity .2s;will-change:transform}.maplibregl-user-location-dot,.maplibregl-user-location-dot:before{background-color:#1da1f2;border-radius:50%;height:15px;width:15px}.maplibregl-user-location-dot:before{animation:maplibregl-user-location-dot-pulse 2s infinite;content:\"\";position:absolute}.maplibregl-user-location-dot:after{border:2px solid #fff;border-radius:50%;box-shadow:0 0 3px rgba(0,0,0,.35);box-sizing:border-box;content:\"\";height:19px;left:-2px;position:absolute;top:-2px;width:19px}@keyframes maplibregl-user-location-dot-pulse{0%{opacity:1;transform:scale(1)}70%{opacity:0;transform:scale(3)}to{opacity:0;transform:scale(1)}}.maplibregl-user-location-dot-stale{background-color:#aaa}.maplibregl-user-location-dot-stale:after{display:none}.maplibregl-user-location-accuracy-circle{background-color:#1da1f233;border-radius:100%;height:1px;width:1px}.maplibregl-crosshair,.maplibregl-crosshair .maplibregl-interactive,.maplibregl-crosshair .maplibregl-interactive:active{cursor:crosshair}.maplibregl-boxzoom{background:#fff;border:2px dotted #202020;height:0;left:0;opacity:.5;position:absolute;top:0;width:0}.maplibregl-cooperative-gesture-screen{align-items:center;background:rgba(0,0,0,.4);color:#fff;display:flex;font-size:1.4em;inset:0;justify-content:center;line-height:1.2;opacity:0;padding:1rem;pointer-events:none;position:absolute;transition:opacity 1s ease 1s;z-index:99999}.maplibregl-cooperative-gesture-screen.maplibregl-show{opacity:1;transition:opacity .05s}.maplibregl-cooperative-gesture-screen .maplibregl-mobile-message{display:none}@media (hover:none),(width <= 480px){.maplibregl-cooperative-gesture-screen .maplibregl-desktop-message{display:none}.maplibregl-cooperative-gesture-screen .maplibregl-mobile-message{display:block}}.maplibregl-pseudo-fullscreen{height:100%!important;left:0!important;position:fixed!important;top:0!important;width:100%!important;z-index:99999}',\"\"]),e.A=B},68735:function(t,e,r){\"use strict\";r.r(e),r.d(e,{sankeyCenter:function(){return f},sankeyCircular:function(){return L},sankeyJustify:function(){return h},sankeyLeft:function(){return c},sankeyRight:function(){return u}});var n=r(29725),i=r(4575),a=r(48544),o=r(96143),s=r.n(o);function l(t){return t.target.depth}function c(t){return t.depth}function u(t,e){return e-1-t.height}function h(t,e){return t.sourceLinks.length?t.depth:e-1}function f(t){return t.targetLinks.length?t.depth:t.sourceLinks.length?(0,n.jk)(t.sourceLinks,l)-1:0}function p(t){return function(){return t}}var d=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\"function\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\"symbol\":typeof t};function m(t,e){return y(t.source,e.source)||t.index-e.index}function g(t,e){return y(t.target,e.target)||t.index-e.index}function y(t,e){return t.partOfCycle===e.partOfCycle?t.y0-e.y0:\"top\"===t.circularLinkType||\"bottom\"===e.circularLinkType?-1:1}function v(t){return t.value}function x(t){return(t.y0+t.y1)/2}function _(t){return x(t.source)}function b(t){return x(t.target)}function w(t){return t.index}function T(t){return t.nodes}function k(t){return t.links}function A(t,e){var r=t.get(e);if(!r)throw new Error(\"missing: \"+e);return r}function M(t,e){return e(t)}var S=25,E=10,C=.3;function L(){var t,e,r=0,a=0,o=1,l=1,c=24,u=w,f=h,M=T,L=k,P=32,O=2,D=null;function F(){var h={nodes:M.apply(null,arguments),links:L.apply(null,arguments)};!function(t){t.nodes.forEach((function(t,e){t.index=e,t.sourceLinks=[],t.targetLinks=[]}));var e=(0,i.Tj)(t.nodes,u);t.links.forEach((function(t,r){t.index=r;var n=t.source,i=t.target;\"object\"!==(void 0===n?\"undefined\":d(n))&&(n=t.source=A(e,n)),\"object\"!==(void 0===i?\"undefined\":d(i))&&(i=t.target=A(e,i)),n.sourceLinks.push(t),i.targetLinks.push(t)}))}(h),function(t,e,r){var n=0;if(null===r){for(var i=[],a=0;a0?e+S+E:e,bottom:r=r>0?r+S+E:r,left:a=a>0?a+S+E:a,right:i=i>0?i+S+E:i}}(s),d=function(t,e){var i=(0,n.T9)(t.nodes,(function(t){return t.column})),s=o-r,u=l-a,h=s/(s+e.right+e.left),f=u/(u+e.top+e.bottom);return r=r*h+e.left,o=0==e.right?o:o*h,a=a*f+e.top,l*=f,t.nodes.forEach((function(t){t.x0=r+t.column*((o-r-c)/i),t.x1=t.x0+c})),f}(s,p);h*=d,s.links.forEach((function(t){t.width=t.value*h})),f.forEach((function(t){var e=t.length;t.forEach((function(t,r){t.depth==f.length-1&&1==e||0==t.depth&&1==e?(t.y0=l/2-t.value*h,t.y1=t.y0+t.value*h):t.partOfCycle?0==z(t,i)?(t.y0=l/2+r,t.y1=t.y0+t.value*h):\"top\"==t.circularLinkType?(t.y0=a+r,t.y1=t.y0+t.value*h):(t.y0=l-t.value*h-r,t.y1=t.y0+t.value*h):0==p.top||0==p.bottom?(t.y0=(l-a)/e*r,t.y1=t.y0+t.value*h):(t.y0=(l-a)/2-e/2+r,t.y1=t.y0+t.value*h)}))}))})(h),g();for(var p=1,d=u;d>0;--d)m(p*=.99,h),g();function m(t,e){var r=f.length;f.forEach((function(i){var a=i.length,o=i[0].depth;i.forEach((function(i){var s;if(i.sourceLinks.length||i.targetLinks.length)if(i.partOfCycle&&z(i,e)>0);else if(0==o&&1==a)s=i.y1-i.y0,i.y0=l/2-s/2,i.y1=l/2+s/2;else if(o==r-1&&1==a)s=i.y1-i.y0,i.y0=l/2-s/2,i.y1=l/2+s/2;else{var c=(0,n.i2)(i.sourceLinks,b),u=(0,n.i2)(i.targetLinks,_),h=((c&&u?(c+u)/2:c||u)-x(i))*t;i.y0+=h,i.y1+=h}}))}))}function g(){f.forEach((function(e){var r,n,i,o=a,s=e.length;for(e.sort(y),i=0;i0&&(r.y0+=n,r.y1+=n),o=r.y1+t;if((n=o-t-l)>0)for(o=r.y0-=n,r.y1-=n,i=s-2;i>=0;--i)(n=(r=e[i]).y1+t-o)>0&&(r.y0-=n,r.y1-=n),o=r.y0}))}}(h,P,u),B(h);for(var p=0;p<4;p++)Y(h,l,u),X(h,0,u),Z(h,a,l,u),Y(h,l,u),X(h,0,u);return function(t,e,r){var i=t.nodes,a=t.links,o=!1,s=!1;if(a.forEach((function(t){\"top\"==t.circularLinkType?o=!0:\"bottom\"==t.circularLinkType&&(s=!0)})),0==o||0==s){var l=(0,n.jk)(i,(function(t){return t.y0})),c=(r-e)/((0,n.T9)(i,(function(t){return t.y1}))-l);i.forEach((function(t){var e=(t.y1-t.y0)*c;t.y0=(t.y0-l)*c,t.y1=t.y0+e})),a.forEach((function(t){t.y0=(t.y0-l)*c,t.y1=(t.y1-l)*c,t.width=t.width*c}))}}(h,a,l),R(h,O,l,u),h}function B(t){t.nodes.forEach((function(t){t.sourceLinks.sort(g),t.targetLinks.sort(m)})),t.nodes.forEach((function(t){var e=t.y0,r=e,n=t.y1,i=n;t.sourceLinks.forEach((function(t){t.circular?(t.y0=n-t.width/2,n-=t.width):(t.y0=e+t.width/2,e+=t.width)})),t.targetLinks.forEach((function(t){t.circular?(t.y1=i-t.width/2,i-=t.width):(t.y1=r+t.width/2,r+=t.width)}))}))}return F.nodeId=function(t){return arguments.length?(u=\"function\"==typeof t?t:p(t),F):u},F.nodeAlign=function(t){return arguments.length?(f=\"function\"==typeof t?t:p(t),F):f},F.nodeWidth=function(t){return arguments.length?(c=+t,F):c},F.nodePadding=function(e){return arguments.length?(t=+e,F):t},F.nodes=function(t){return arguments.length?(M=\"function\"==typeof t?t:p(t),F):M},F.links=function(t){return arguments.length?(L=\"function\"==typeof t?t:p(t),F):L},F.size=function(t){return arguments.length?(r=a=0,o=+t[0],l=+t[1],F):[o-r,l-a]},F.extent=function(t){return arguments.length?(r=+t[0][0],o=+t[1][0],a=+t[0][1],l=+t[1][1],F):[[r,a],[o,l]]},F.iterations=function(t){return arguments.length?(P=+t,F):P},F.circularLinkGap=function(t){return arguments.length?(O=+t,F):O},F.nodePaddingRatio=function(t){return arguments.length?(e=+t,F):e},F.sortNodes=function(t){return arguments.length?(D=t,F):D},F.update=function(t){return I(t,u),B(t),t.links.forEach((function(t){t.circular&&(t.circularLinkType=t.y0+t.y11||i>1)}function D(t,e,r){return t.sort(F),t.forEach((function(n,i){var a,o,s=0;if(K(n,r)&&O(n))n.circularPathData.verticalBuffer=s+n.width/2;else{for(var l=0;lo.source.column)){var c=t[l].circularPathData.verticalBuffer+t[l].width/2+e;s=c>s?c:s}n.circularPathData.verticalBuffer=s+n.width/2}})),t}function R(t,e,r,i){var o=(0,n.jk)(t.links,(function(t){return t.source.y0}));t.links.forEach((function(t){t.circular&&(t.circularPathData={})})),D(t.links.filter((function(t){return\"top\"==t.circularLinkType})),e,i),D(t.links.filter((function(t){return\"bottom\"==t.circularLinkType})),e,i),t.links.forEach((function(n){if(n.circular){if(n.circularPathData.arcRadius=n.width+E,n.circularPathData.leftNodeBuffer=5,n.circularPathData.rightNodeBuffer=5,n.circularPathData.sourceWidth=n.source.x1-n.source.x0,n.circularPathData.sourceX=n.source.x0+n.circularPathData.sourceWidth,n.circularPathData.targetX=n.target.x0,n.circularPathData.sourceY=n.y0,n.circularPathData.targetY=n.y1,K(n,i)&&O(n))n.circularPathData.leftSmallArcRadius=E+n.width/2,n.circularPathData.leftLargeArcRadius=E+n.width/2,n.circularPathData.rightSmallArcRadius=E+n.width/2,n.circularPathData.rightLargeArcRadius=E+n.width/2,\"bottom\"==n.circularLinkType?(n.circularPathData.verticalFullExtent=n.source.y1+S+n.circularPathData.verticalBuffer,n.circularPathData.verticalLeftInnerExtent=n.circularPathData.verticalFullExtent-n.circularPathData.leftLargeArcRadius,n.circularPathData.verticalRightInnerExtent=n.circularPathData.verticalFullExtent-n.circularPathData.rightLargeArcRadius):(n.circularPathData.verticalFullExtent=n.source.y0-S-n.circularPathData.verticalBuffer,n.circularPathData.verticalLeftInnerExtent=n.circularPathData.verticalFullExtent+n.circularPathData.leftLargeArcRadius,n.circularPathData.verticalRightInnerExtent=n.circularPathData.verticalFullExtent+n.circularPathData.rightLargeArcRadius);else{var s=n.source.column,l=n.circularLinkType,c=t.links.filter((function(t){return t.source.column==s&&t.circularLinkType==l}));\"bottom\"==n.circularLinkType?c.sort(N):c.sort(B);var u=0;c.forEach((function(t,r){t.circularLinkID==n.circularLinkID&&(n.circularPathData.leftSmallArcRadius=E+n.width/2+u,n.circularPathData.leftLargeArcRadius=E+n.width/2+r*e+u),u+=t.width})),s=n.target.column,c=t.links.filter((function(t){return t.target.column==s&&t.circularLinkType==l})),\"bottom\"==n.circularLinkType?c.sort(U):c.sort(j),u=0,c.forEach((function(t,r){t.circularLinkID==n.circularLinkID&&(n.circularPathData.rightSmallArcRadius=E+n.width/2+u,n.circularPathData.rightLargeArcRadius=E+n.width/2+r*e+u),u+=t.width})),\"bottom\"==n.circularLinkType?(n.circularPathData.verticalFullExtent=Math.max(r,n.source.y1,n.target.y1)+S+n.circularPathData.verticalBuffer,n.circularPathData.verticalLeftInnerExtent=n.circularPathData.verticalFullExtent-n.circularPathData.leftLargeArcRadius,n.circularPathData.verticalRightInnerExtent=n.circularPathData.verticalFullExtent-n.circularPathData.rightLargeArcRadius):(n.circularPathData.verticalFullExtent=o-S-n.circularPathData.verticalBuffer,n.circularPathData.verticalLeftInnerExtent=n.circularPathData.verticalFullExtent+n.circularPathData.leftLargeArcRadius,n.circularPathData.verticalRightInnerExtent=n.circularPathData.verticalFullExtent+n.circularPathData.rightLargeArcRadius)}n.circularPathData.leftInnerExtent=n.circularPathData.sourceX+n.circularPathData.leftNodeBuffer,n.circularPathData.rightInnerExtent=n.circularPathData.targetX-n.circularPathData.rightNodeBuffer,n.circularPathData.leftFullExtent=n.circularPathData.sourceX+n.circularPathData.leftLargeArcRadius+n.circularPathData.leftNodeBuffer,n.circularPathData.rightFullExtent=n.circularPathData.targetX-n.circularPathData.rightLargeArcRadius-n.circularPathData.rightNodeBuffer}if(n.circular)n.path=function(t){return\"top\"==t.circularLinkType?\"M\"+t.circularPathData.sourceX+\" \"+t.circularPathData.sourceY+\" L\"+t.circularPathData.leftInnerExtent+\" \"+t.circularPathData.sourceY+\" A\"+t.circularPathData.leftLargeArcRadius+\" \"+t.circularPathData.leftSmallArcRadius+\" 0 0 0 \"+t.circularPathData.leftFullExtent+\" \"+(t.circularPathData.sourceY-t.circularPathData.leftSmallArcRadius)+\" L\"+t.circularPathData.leftFullExtent+\" \"+t.circularPathData.verticalLeftInnerExtent+\" A\"+t.circularPathData.leftLargeArcRadius+\" \"+t.circularPathData.leftLargeArcRadius+\" 0 0 0 \"+t.circularPathData.leftInnerExtent+\" \"+t.circularPathData.verticalFullExtent+\" L\"+t.circularPathData.rightInnerExtent+\" \"+t.circularPathData.verticalFullExtent+\" A\"+t.circularPathData.rightLargeArcRadius+\" \"+t.circularPathData.rightLargeArcRadius+\" 0 0 0 \"+t.circularPathData.rightFullExtent+\" \"+t.circularPathData.verticalRightInnerExtent+\" L\"+t.circularPathData.rightFullExtent+\" \"+(t.circularPathData.targetY-t.circularPathData.rightSmallArcRadius)+\" A\"+t.circularPathData.rightLargeArcRadius+\" \"+t.circularPathData.rightSmallArcRadius+\" 0 0 0 \"+t.circularPathData.rightInnerExtent+\" \"+t.circularPathData.targetY+\" L\"+t.circularPathData.targetX+\" \"+t.circularPathData.targetY:\"M\"+t.circularPathData.sourceX+\" \"+t.circularPathData.sourceY+\" L\"+t.circularPathData.leftInnerExtent+\" \"+t.circularPathData.sourceY+\" A\"+t.circularPathData.leftLargeArcRadius+\" \"+t.circularPathData.leftSmallArcRadius+\" 0 0 1 \"+t.circularPathData.leftFullExtent+\" \"+(t.circularPathData.sourceY+t.circularPathData.leftSmallArcRadius)+\" L\"+t.circularPathData.leftFullExtent+\" \"+t.circularPathData.verticalLeftInnerExtent+\" A\"+t.circularPathData.leftLargeArcRadius+\" \"+t.circularPathData.leftLargeArcRadius+\" 0 0 1 \"+t.circularPathData.leftInnerExtent+\" \"+t.circularPathData.verticalFullExtent+\" L\"+t.circularPathData.rightInnerExtent+\" \"+t.circularPathData.verticalFullExtent+\" A\"+t.circularPathData.rightLargeArcRadius+\" \"+t.circularPathData.rightLargeArcRadius+\" 0 0 1 \"+t.circularPathData.rightFullExtent+\" \"+t.circularPathData.verticalRightInnerExtent+\" L\"+t.circularPathData.rightFullExtent+\" \"+(t.circularPathData.targetY+t.circularPathData.rightSmallArcRadius)+\" A\"+t.circularPathData.rightLargeArcRadius+\" \"+t.circularPathData.rightSmallArcRadius+\" 0 0 1 \"+t.circularPathData.rightInnerExtent+\" \"+t.circularPathData.targetY+\" L\"+t.circularPathData.targetX+\" \"+t.circularPathData.targetY}(n);else{var h=(0,a.pq)().source((function(t){return[t.source.x0+(t.source.x1-t.source.x0),t.y0]})).target((function(t){return[t.target.x0,t.y1]}));n.path=h(n)}}))}function F(t,e){return V(t)==V(e)?\"bottom\"==t.circularLinkType?N(t,e):B(t,e):V(e)-V(t)}function B(t,e){return t.y0-e.y0}function N(t,e){return e.y0-t.y0}function j(t,e){return t.y1-e.y1}function U(t,e){return e.y1-t.y1}function V(t){return t.target.column-t.source.column}function q(t){return t.target.x0-t.source.x1}function H(t,e){var r=P(t),n=q(e)/Math.tan(r);return\"up\"==J(t)?t.y1+n:t.y1-n}function G(t,e){var r=P(t),n=q(e)/Math.tan(r);return\"up\"==J(t)?t.y1-n:t.y1+n}function Z(t,e,r,n){t.links.forEach((function(i){if(!i.circular&&i.target.column-i.source.column>1){var a=i.source.column+1,o=i.target.column-1,s=1,l=o-a+1;for(s=1;a<=o;a++,s++)t.nodes.forEach((function(o){if(o.column==a){var c,u=s/(l+1),h=Math.pow(1-u,3),f=3*u*Math.pow(1-u,2),p=3*Math.pow(u,2)*(1-u),d=Math.pow(u,3),m=h*i.y0+f*i.y0+p*i.y1+d*i.y1,g=m-i.width/2,y=m+i.width/2;g>o.y0&&ga.y0&&i.y0a.y0&&i.y1a.y1)&&W(t,c,e,r)}))):(y>o.y0&&yo.y1)&&(c=y-o.y0+10,o=W(o,c,e,r),t.nodes.forEach((function(t){M(t,n)!=M(o,n)&&t.column==o.column&&t.y0o.y1&&W(t,c,e,r)})))}}))}}))}function W(t,e,r,n){return t.y0+e>=r&&t.y1+e<=n&&(t.y0=t.y0+e,t.y1=t.y1+e,t.targetLinks.forEach((function(t){t.y1=t.y1+e})),t.sourceLinks.forEach((function(t){t.y0=t.y0+e}))),t}function Y(t,e,r,n){t.nodes.forEach((function(i){n&&i.y+(i.y1-i.y0)>e&&(i.y=i.y-(i.y+(i.y1-i.y0)-e));var a=t.links.filter((function(t){return M(t.source,r)==M(i,r)})),o=a.length;o>1&&a.sort((function(t,e){if(!t.circular&&!e.circular){if(t.target.column==e.target.column)return t.y1-e.y1;if(!$(t,e))return t.y1-e.y1;if(t.target.column>e.target.column){var r=G(e,t);return t.y1-r}if(e.target.column>t.target.column)return G(t,e)-e.y1}return t.circular&&!e.circular?\"top\"==t.circularLinkType?-1:1:e.circular&&!t.circular?\"top\"==e.circularLinkType?1:-1:t.circular&&e.circular?t.circularLinkType===e.circularLinkType&&\"top\"==t.circularLinkType?t.target.column===e.target.column?t.target.y1-e.target.y1:e.target.column-t.target.column:t.circularLinkType===e.circularLinkType&&\"bottom\"==t.circularLinkType?t.target.column===e.target.column?e.target.y1-t.target.y1:t.target.column-e.target.column:\"top\"==t.circularLinkType?-1:1:void 0}));var s=i.y0;a.forEach((function(t){t.y0=s+t.width/2,s+=t.width})),a.forEach((function(t,e){if(\"bottom\"==t.circularLinkType){for(var r=e+1,n=0;r1&&n.sort((function(t,e){if(!t.circular&&!e.circular){if(t.source.column==e.source.column)return t.y0-e.y0;if(!$(t,e))return t.y0-e.y0;if(e.source.column0?\"up\":\"down\"}function K(t,e){return M(t.source,e)==M(t.target,e)}},62369:function(t,e,r){\"use strict\";r.r(e),r.d(e,{sankey:function(){return w},sankeyCenter:function(){return c},sankeyJustify:function(){return l},sankeyLeft:function(){return o},sankeyLinkHorizontal:function(){return M},sankeyRight:function(){return s}});var n=r(29725),i=r(4575);function a(t){return t.target.depth}function o(t){return t.depth}function s(t,e){return e-1-t.height}function l(t,e){return t.sourceLinks.length?t.depth:e-1}function c(t){return t.targetLinks.length?t.depth:t.sourceLinks.length?(0,n.jk)(t.sourceLinks,a)-1:0}function u(t){return function(){return t}}function h(t,e){return p(t.source,e.source)||t.index-e.index}function f(t,e){return p(t.target,e.target)||t.index-e.index}function p(t,e){return t.y0-e.y0}function d(t){return t.value}function m(t){return(t.y0+t.y1)/2}function g(t){return m(t.source)*t.value}function y(t){return m(t.target)*t.value}function v(t){return t.index}function x(t){return t.nodes}function _(t){return t.links}function b(t,e){var r=t.get(e);if(!r)throw new Error(\"missing: \"+e);return r}function w(){var t=0,e=0,r=1,a=1,o=24,s=8,c=v,w=l,T=x,k=_,A=32;function M(){var l={nodes:T.apply(null,arguments),links:k.apply(null,arguments)};return function(t){t.nodes.forEach((function(t,e){t.index=e,t.sourceLinks=[],t.targetLinks=[]}));var e=(0,i.Tj)(t.nodes,c);t.links.forEach((function(t,r){t.index=r;var n=t.source,i=t.target;\"object\"!=typeof n&&(n=t.source=b(e,n)),\"object\"!=typeof i&&(i=t.target=b(e,i)),n.sourceLinks.push(t),i.targetLinks.push(t)}))}(l),function(t){t.nodes.forEach((function(t){t.value=Math.max((0,n.cz)(t.sourceLinks,d),(0,n.cz)(t.targetLinks,d))}))}(l),function(e){var n,i,a;for(n=e.nodes,i=[],a=0;n.length;++a,n=i,i=[])n.forEach((function(t){t.depth=a,t.sourceLinks.forEach((function(t){i.indexOf(t.target)<0&&i.push(t.target)}))}));for(n=e.nodes,i=[],a=0;n.length;++a,n=i,i=[])n.forEach((function(t){t.height=a,t.targetLinks.forEach((function(t){i.indexOf(t.source)<0&&i.push(t.source)}))}));var s=(r-t-o)/(a-1);e.nodes.forEach((function(e){e.x1=(e.x0=t+Math.max(0,Math.min(a-1,Math.floor(w.call(null,e,a))))*s)+o}))}(l),function(t){var r=(0,i.$I)().key((function(t){return t.x0})).sortKeys(n.V_).entries(t.nodes).map((function(t){return t.values}));(function(){var i=(0,n.T9)(r,(function(t){return t.length})),o=.6666666666666666*(a-e)/(i-1);s>o&&(s=o);var l=(0,n.jk)(r,(function(t){return(a-e-(t.length-1)*s)/(0,n.cz)(t,d)}));r.forEach((function(t){t.forEach((function(t,e){t.y1=(t.y0=e)+t.value*l}))})),t.links.forEach((function(t){t.width=t.value*l}))})(),h();for(var o=1,l=A;l>0;--l)u(o*=.99),h(),c(o),h();function c(t){r.forEach((function(e){e.forEach((function(e){if(e.targetLinks.length){var r=((0,n.cz)(e.targetLinks,g)/(0,n.cz)(e.targetLinks,d)-m(e))*t;e.y0+=r,e.y1+=r}}))}))}function u(t){r.slice().reverse().forEach((function(e){e.forEach((function(e){if(e.sourceLinks.length){var r=((0,n.cz)(e.sourceLinks,y)/(0,n.cz)(e.sourceLinks,d)-m(e))*t;e.y0+=r,e.y1+=r}}))}))}function h(){r.forEach((function(t){var r,n,i,o=e,l=t.length;for(t.sort(p),i=0;i0&&(r.y0+=n,r.y1+=n),o=r.y1+s;if((n=o-s-a)>0)for(o=r.y0-=n,r.y1-=n,i=l-2;i>=0;--i)(n=(r=t[i]).y1+s-o)>0&&(r.y0-=n,r.y1-=n),o=r.y0}))}}(l),S(l),l}function S(t){t.nodes.forEach((function(t){t.sourceLinks.sort(f),t.targetLinks.sort(h)})),t.nodes.forEach((function(t){var e=t.y0,r=e;t.sourceLinks.forEach((function(t){t.y0=e+t.width/2,e+=t.width})),t.targetLinks.forEach((function(t){t.y1=r+t.width/2,r+=t.width}))}))}return M.update=function(t){return S(t),t},M.nodeId=function(t){return arguments.length?(c=\"function\"==typeof t?t:u(t),M):c},M.nodeAlign=function(t){return arguments.length?(w=\"function\"==typeof t?t:u(t),M):w},M.nodeWidth=function(t){return arguments.length?(o=+t,M):o},M.nodePadding=function(t){return arguments.length?(s=+t,M):s},M.nodes=function(t){return arguments.length?(T=\"function\"==typeof t?t:u(t),M):T},M.links=function(t){return arguments.length?(k=\"function\"==typeof t?t:u(t),M):k},M.size=function(n){return arguments.length?(t=e=0,r=+n[0],a=+n[1],M):[r-t,a-e]},M.extent=function(n){return arguments.length?(t=+n[0][0],r=+n[1][0],e=+n[0][1],a=+n[1][1],M):[[t,e],[r,a]]},M.iterations=function(t){return arguments.length?(A=+t,M):A},M}var T=r(48544);function k(t){return[t.source.x1,t.y0]}function A(t){return[t.target.x0,t.y1]}function M(){return(0,T.pq)().source(k).target(A)}},45568:function(t,e,r){var n,i;(function(){var a={version:\"3.8.2\"},o=[].slice,s=function(t){return o.call(t)},l=self.document;function c(t){return t&&(t.ownerDocument||t.document||t).documentElement}function u(t){return t&&(t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView)}if(l)try{s(l.documentElement.childNodes)[0].nodeType}catch(t){s=function(t){for(var e=t.length,r=new Array(e);e--;)r[e]=t[e];return r}}if(Date.now||(Date.now=function(){return+new Date}),l)try{l.createElement(\"DIV\").style.setProperty(\"opacity\",0,\"\")}catch(t){var h=this.Element.prototype,f=h.setAttribute,p=h.setAttributeNS,d=this.CSSStyleDeclaration.prototype,m=d.setProperty;h.setAttribute=function(t,e){f.call(this,t,e+\"\")},h.setAttributeNS=function(t,e,r){p.call(this,t,e,r+\"\")},d.setProperty=function(t,e,r){m.call(this,t,e+\"\",r)}}function g(t,e){return te?1:t>=e?0:NaN}function y(t){return null===t?NaN:+t}function v(t){return!isNaN(t)}function x(t){return{left:function(e,r,n,i){for(arguments.length<3&&(n=0),arguments.length<4&&(i=e.length);n>>1;t(e[a],r)<0?n=a+1:i=a}return n},right:function(e,r,n,i){for(arguments.length<3&&(n=0),arguments.length<4&&(i=e.length);n>>1;t(e[a],r)>0?i=a:n=a+1}return n}}}a.ascending=g,a.descending=function(t,e){return et?1:e>=t?0:NaN},a.min=function(t,e){var r,n,i=-1,a=t.length;if(1===arguments.length){for(;++i=n){r=n;break}for(;++in&&(r=n)}else{for(;++i=n){r=n;break}for(;++in&&(r=n)}return r},a.max=function(t,e){var r,n,i=-1,a=t.length;if(1===arguments.length){for(;++i=n){r=n;break}for(;++ir&&(r=n)}else{for(;++i=n){r=n;break}for(;++ir&&(r=n)}return r},a.extent=function(t,e){var r,n,i,a=-1,o=t.length;if(1===arguments.length){for(;++a=n){r=i=n;break}for(;++an&&(r=n),i=n){r=i=n;break}for(;++an&&(r=n),i1)return o/(l-1)},a.deviation=function(){var t=a.variance.apply(this,arguments);return t?Math.sqrt(t):t};var _=x(g);function b(t){return t.length}a.bisectLeft=_.left,a.bisect=a.bisectRight=_.right,a.bisector=function(t){return x(1===t.length?function(e,r){return g(t(e),r)}:t)},a.shuffle=function(t,e,r){(a=arguments.length)<3&&(r=t.length,a<2&&(e=0));for(var n,i,a=r-e;a;)i=Math.random()*a--|0,n=t[a+e],t[a+e]=t[i+e],t[i+e]=n;return t},a.permute=function(t,e){for(var r=e.length,n=new Array(r);r--;)n[r]=t[e[r]];return n},a.pairs=function(t){for(var e=0,r=t.length-1,n=t[0],i=new Array(r<0?0:r);e=0;)for(e=(n=t[i]).length;--e>=0;)r[--o]=n[e];return r};var w=Math.abs;function T(t,e){for(var r in e)Object.defineProperty(t.prototype,r,{value:e[r],enumerable:!1})}function k(){this._=Object.create(null)}a.range=function(t,e,r){if(arguments.length<3&&(r=1,arguments.length<2&&(e=t,t=0)),(e-t)/r==1/0)throw new Error(\"infinite range\");var n,i=[],a=function(t){for(var e=1;t*e%1;)e*=10;return e}(w(r)),o=-1;if(t*=a,e*=a,(r*=a)<0)for(;(n=t+r*++o)>e;)i.push(n/a);else for(;(n=t+r*++o)=n.length)return e?e.call(r,a):t?a.sort(t):a;for(var l,c,u,h,f=-1,p=a.length,d=n[s++],m=new k;++f=n.length)return t;var r=[],a=i[e++];return t.forEach((function(t,n){r.push({key:t,values:s(n,e)})})),a?r.sort((function(t,e){return a(t.key,e.key)})):r}return r.map=function(t,e){return o(e,t,0)},r.entries=function(t){return s(o(a.map,t,0),0)},r.key=function(t){return n.push(t),r},r.sortKeys=function(t){return i[n.length-1]=t,r},r.sortValues=function(e){return t=e,r},r.rollup=function(t){return e=t,r},r},a.set=function(t){var e=new O;if(t)for(var r=0,n=t.length;r=0&&(n=t.slice(r+1),t=t.slice(0,r)),t)return arguments.length<2?this[t].on(n):this[t].on(n,e);if(2===arguments.length){if(null==e)for(t in this)this.hasOwnProperty(t)&&this[t].on(n,null);return this}},a.event=null,a.requote=function(t){return t.replace(G,\"\\\\$&\")};var G=/[\\\\\\^\\$\\*\\+\\?\\|\\[\\]\\(\\)\\.\\{\\}]/g,Z={}.__proto__?function(t,e){t.__proto__=e}:function(t,e){for(var r in e)t[r]=e[r]};function W(t){return Z(t,J),t}var Y=function(t,e){return e.querySelector(t)},X=function(t,e){return e.querySelectorAll(t)},$=function(t,e){var r=t.matches||t[F(t,\"matchesSelector\")];return $=function(t,e){return r.call(t,e)},$(t,e)};\"function\"==typeof Sizzle&&(Y=function(t,e){return Sizzle(t,e)[0]||null},X=Sizzle,$=Sizzle.matchesSelector),a.selection=function(){return a.select(l.documentElement)};var J=a.selection.prototype=[];function K(t){return\"function\"==typeof t?t:function(){return Y(t,this)}}function Q(t){return\"function\"==typeof t?t:function(){return X(t,this)}}J.select=function(t){var e,r,n,i,a=[];t=K(t);for(var o=-1,s=this.length;++o=0&&\"xmlns\"!==(r=t.slice(0,e))&&(t=t.slice(e+1)),et.hasOwnProperty(r)?{space:et[r],local:t}:t}},J.attr=function(t,e){if(arguments.length<2){if(\"string\"==typeof t){var r=this.node();return(t=a.ns.qualify(t)).local?r.getAttributeNS(t.space,t.local):r.getAttribute(t)}for(e in t)this.each(rt(e,t[e]));return this}return this.each(rt(t,e))},J.classed=function(t,e){if(arguments.length<2){if(\"string\"==typeof t){var r=this.node(),n=(t=at(t)).length,i=-1;if(e=r.classList){for(;++i=0;)(r=n[i])&&(a&&a!==r.nextSibling&&a.parentNode.insertBefore(r,a),a=r);return this},J.sort=function(t){t=dt.apply(this,arguments);for(var e=-1,r=this.length;++e0&&(t=t.slice(0,i));var l=xt.get(t);function c(){var e=this[n];e&&(this.removeEventListener(t,e,e.$),delete this[n])}return l&&(t=l,o=bt),i?e?function(){var i=o(e,s(arguments));c.call(this),this.addEventListener(t,this[n]=i,i.$=r),i._=e}:c:e?N:function(){var e,r=new RegExp(\"^__on([^.]+)\"+a.requote(t)+\"$\");for(var n in this)if(e=n.match(r)){var i=this[n];this.removeEventListener(e[1],i,i.$),delete this[n]}}}a.selection.enter=gt,a.selection.enter.prototype=yt,yt.append=J.append,yt.empty=J.empty,yt.node=J.node,yt.call=J.call,yt.size=J.size,yt.select=function(t){for(var e,r,n,i,a,o=[],s=-1,l=this.length;++s=n&&(n=e+1);!(o=s[n])&&++n1?zt:t<-1?-zt:Math.asin(t)}function Ft(t){return((t=Math.exp(t))+1/t)/2}var Bt=Math.SQRT2;a.interpolateZoom=function(t,e){var r,n,i=t[0],a=t[1],o=t[2],s=e[0],l=e[1],c=e[2],u=s-i,h=l-a,f=u*u+h*h;if(f0&&(t=t.transition().duration(m)),t.call(w.event)}function S(){s&&s.domain(o.range().map((function(t){return(t-f.x)/f.k})).map(o.invert)),h&&h.domain(c.range().map((function(t){return(t-f.y)/f.k})).map(c.invert))}function E(t){g++||t({type:\"zoomstart\"})}function C(t){S(),t({type:\"zoom\",scale:f.k,translate:[f.x,f.y]})}function L(t){--g||(t({type:\"zoomend\"}),e=null)}function I(){var t=this,e=b.of(t,arguments),r=0,n=a.select(u(t)).on(v,(function(){r=1,A(a.mouse(t),i),C(e)})).on(x,(function(){n.on(v,null).on(x,null),o(r),L(e)})),i=T(a.mouse(t)),o=kt(t);$i.call(t),E(e)}function P(){var t,e=this,r=b.of(e,arguments),n={},o=0,s=\".zoom-\"+a.event.changedTouches[0].identifier,l=\"touchmove\"+s,c=\"touchend\"+s,u=[],h=a.select(e),p=kt(e);function d(){var r=a.touches(e);return t=f.k,r.forEach((function(t){t.identifier in n&&(n[t.identifier]=T(t))})),r}function m(){var t=a.event.target;a.select(t).on(l,g).on(c,v),u.push(t);for(var r=a.event.changedTouches,s=0,h=r.length;s1){y=p[0];var x=p[1],_=y[0]-x[0],b=y[1]-x[1];o=_*_+b*b}}function g(){var s,l,c,u,h=a.touches(e);$i.call(e);for(var f=0,p=h.length;f360?t-=360:t<0&&(t+=360),t<60?n+(i-n)*t/60:t<180?i:t<240?n+(i-n)*(240-t)/60:n}(t))}return t=isNaN(t)?0:(t%=360)<0?t+360:t,e=isNaN(e)||e<0?0:e>1?1:e,n=2*(r=r<0?0:r>1?1:r)-(i=r<=.5?r*(1+e):r+e-r*e),new ae(a(t+120),a(t),a(t-120))}function Zt(t,e,r){return this instanceof Zt?(this.h=+t,this.c=+e,void(this.l=+r)):arguments.length<2?t instanceof Zt?new Zt(t.h,t.c,t.l):function(t,e,r){return t>0?new Zt(Math.atan2(r,e)*Dt,Math.sqrt(e*e+r*r),t):new Zt(NaN,NaN,t)}(t instanceof Xt?t.l:(t=fe((t=a.rgb(t)).r,t.g,t.b)).l,t.a,t.b):new Zt(t,e,r)}Ht.brighter=function(t){return t=Math.pow(.7,arguments.length?t:1),new qt(this.h,this.s,this.l/t)},Ht.darker=function(t){return t=Math.pow(.7,arguments.length?t:1),new qt(this.h,this.s,t*this.l)},Ht.rgb=function(){return Gt(this.h,this.s,this.l)},a.hcl=Zt;var Wt=Zt.prototype=new Vt;function Yt(t,e,r){return isNaN(t)&&(t=0),isNaN(e)&&(e=0),new Xt(r,Math.cos(t*=Ot)*e,Math.sin(t)*e)}function Xt(t,e,r){return this instanceof Xt?(this.l=+t,this.a=+e,void(this.b=+r)):arguments.length<2?t instanceof Xt?new Xt(t.l,t.a,t.b):t instanceof Zt?Yt(t.h,t.c,t.l):fe((t=ae(t)).r,t.g,t.b):new Xt(t,e,r)}Wt.brighter=function(t){return new Zt(this.h,this.c,Math.min(100,this.l+$t*(arguments.length?t:1)))},Wt.darker=function(t){return new Zt(this.h,this.c,Math.max(0,this.l-$t*(arguments.length?t:1)))},Wt.rgb=function(){return Yt(this.h,this.c,this.l).rgb()},a.lab=Xt;var $t=18,Jt=.95047,Kt=1,Qt=1.08883,te=Xt.prototype=new Vt;function ee(t,e,r){var n=(t+16)/116,i=n+e/500,a=n-r/200;return new ae(ie(3.2404542*(i=re(i)*Jt)-1.5371385*(n=re(n)*Kt)-.4985314*(a=re(a)*Qt)),ie(-.969266*i+1.8760108*n+.041556*a),ie(.0556434*i-.2040259*n+1.0572252*a))}function re(t){return t>.206893034?t*t*t:(t-4/29)/7.787037}function ne(t){return t>.008856?Math.pow(t,1/3):7.787037*t+4/29}function ie(t){return Math.round(255*(t<=.00304?12.92*t:1.055*Math.pow(t,1/2.4)-.055))}function ae(t,e,r){return this instanceof ae?(this.r=~~t,this.g=~~e,void(this.b=~~r)):arguments.length<2?t instanceof ae?new ae(t.r,t.g,t.b):ue(\"\"+t,ae,Gt):new ae(t,e,r)}function oe(t){return new ae(t>>16,t>>8&255,255&t)}function se(t){return oe(t)+\"\"}te.brighter=function(t){return new Xt(Math.min(100,this.l+$t*(arguments.length?t:1)),this.a,this.b)},te.darker=function(t){return new Xt(Math.max(0,this.l-$t*(arguments.length?t:1)),this.a,this.b)},te.rgb=function(){return ee(this.l,this.a,this.b)},a.rgb=ae;var le=ae.prototype=new Vt;function ce(t){return t<16?\"0\"+Math.max(0,t).toString(16):Math.min(255,t).toString(16)}function ue(t,e,r){var n,i,a,o=0,s=0,l=0;if(n=/([a-z]+)\\((.*)\\)/.exec(t=t.toLowerCase()))switch(i=n[2].split(\",\"),n[1]){case\"hsl\":return r(parseFloat(i[0]),parseFloat(i[1])/100,parseFloat(i[2])/100);case\"rgb\":return e(de(i[0]),de(i[1]),de(i[2]))}return(a=me.get(t))?e(a.r,a.g,a.b):(null==t||\"#\"!==t.charAt(0)||isNaN(a=parseInt(t.slice(1),16))||(4===t.length?(o=(3840&a)>>4,o|=o>>4,s=240&a,s|=s>>4,l=15&a,l|=l<<4):7===t.length&&(o=(16711680&a)>>16,s=(65280&a)>>8,l=255&a)),e(o,s,l))}function he(t,e,r){var n,i,a=Math.min(t/=255,e/=255,r/=255),o=Math.max(t,e,r),s=o-a,l=(o+a)/2;return s?(i=l<.5?s/(o+a):s/(2-o-a),n=t==o?(e-r)/s+(e0&&l<1?0:n),new qt(n,i,l)}function fe(t,e,r){var n=ne((.4124564*(t=pe(t))+.3575761*(e=pe(e))+.1804375*(r=pe(r)))/Jt),i=ne((.2126729*t+.7151522*e+.072175*r)/Kt);return Xt(116*i-16,500*(n-i),200*(i-ne((.0193339*t+.119192*e+.9503041*r)/Qt)))}function pe(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function de(t){var e=parseFloat(t);return\"%\"===t.charAt(t.length-1)?Math.round(2.55*e):e}le.brighter=function(t){t=Math.pow(.7,arguments.length?t:1);var e=this.r,r=this.g,n=this.b,i=30;return e||r||n?(e&&e=200&&e<300||304===e){try{t=r.call(i,c)}catch(t){return void o.error.call(i,t)}o.load.call(i,t)}else o.error.call(i,c)}return self.XDomainRequest&&!(\"withCredentials\"in c)&&/^(http(s)?:)?\\/\\//.test(t)&&(c=new XDomainRequest),\"onload\"in c?c.onload=c.onerror=h:c.onreadystatechange=function(){c.readyState>3&&h()},c.onprogress=function(t){var e=a.event;a.event=t;try{o.progress.call(i,c)}finally{a.event=e}},i.header=function(t,e){return t=(t+\"\").toLowerCase(),arguments.length<2?l[t]:(null==e?delete l[t]:l[t]=e+\"\",i)},i.mimeType=function(t){return arguments.length?(e=null==t?null:t+\"\",i):e},i.responseType=function(t){return arguments.length?(u=t,i):u},i.response=function(t){return r=t,i},[\"get\",\"post\"].forEach((function(t){i[t]=function(){return i.send.apply(i,[t].concat(s(arguments)))}})),i.send=function(r,n,a){if(2===arguments.length&&\"function\"==typeof n&&(a=n,n=null),c.open(r,t,!0),null==e||\"accept\"in l||(l.accept=e+\",*/*\"),c.setRequestHeader)for(var s in l)c.setRequestHeader(s,l[s]);return null!=e&&c.overrideMimeType&&c.overrideMimeType(e),null!=u&&(c.responseType=u),null!=a&&i.on(\"error\",a).on(\"load\",(function(t){a(null,t)})),o.beforesend.call(i,c),c.send(null==n?null:n),i},i.abort=function(){return c.abort(),i},a.rebind(i,o,\"on\"),null==n?i:i.get(function(t){return 1===t.length?function(e,r){t(null==e?r:null)}:t}(n))}me.forEach((function(t,e){me.set(t,oe(e))})),a.functor=ge,a.xhr=ye(D),a.dsv=function(t,e){var r=new RegExp('[\"'+t+\"\\n]\"),n=t.charCodeAt(0);function i(t,r,n){arguments.length<3&&(n=r,r=null);var i=ve(t,e,null==r?a:o(r),n);return i.row=function(t){return arguments.length?i.response(null==(r=t)?a:o(t)):r},i}function a(t){return i.parse(t.responseText)}function o(t){return function(e){return i.parse(e.responseText,t)}}function s(e){return e.map(l).join(t)}function l(t){return r.test(t)?'\"'+t.replace(/\\\"/g,'\"\"')+'\"':t}return i.parse=function(t,e){var r;return i.parseRows(t,(function(t,n){if(r)return r(t,n-1);var i=function(e){for(var r={},n=t.length,i=0;i=l)return o;if(i)return i=!1,a;var e=c;if(34===t.charCodeAt(e)){for(var r=e;r++24?(isFinite(e)&&(clearTimeout(we),we=setTimeout(Ae,e)),be=0):(be=1,Te(Ae))}function Me(){for(var t=Date.now(),e=xe;e;)t>=e.t&&e.c(t-e.t)&&(e.c=null),e=e.n;return t}function Se(){for(var t,e=xe,r=1/0;e;)e.c?(e.t1&&(e=t[a[o-2]],r=t[a[o-1]],n=t[s],(r[0]-e[0])*(n[1]-e[1])-(r[1]-e[1])*(n[0]-e[0])<=0);)--o;a[o++]=s}return a.slice(0,o)}function Ie(t,e){return t[0]-e[0]||t[1]-e[1]}a.timer=function(){ke.apply(this,arguments)},a.timer.flush=function(){Me(),Se()},a.round=function(t,e){return e?Math.round(t*(e=Math.pow(10,e)))/e:Math.round(t)},a.geom={},a.geom.hull=function(t){var e=Ee,r=Ce;if(arguments.length)return n(t);function n(t){if(t.length<3)return[];var n,i=ge(e),a=ge(r),o=t.length,s=[],l=[];for(n=0;n=0;--n)p.push(t[s[c[n]][2]]);for(n=+h;nEt)s=s.L;else{if(!((i=a-Xe(s,o))>Et)){n>-Et?(e=s.P,r=s):i>-Et?(e=s,r=s.N):e=r=s;break}if(!s.R){e=s;break}s=s.R}var l=He(t);if(Be.insert(e,l),e||r){if(e===r)return tr(e),r=He(e.site),Be.insert(l,r),l.edge=r.edge=nr(e.site,l.site),Qe(e),void Qe(r);if(r){tr(e),tr(r);var c=e.site,u=c.x,h=c.y,f=t.x-u,p=t.y-h,d=r.site,m=d.x-u,g=d.y-h,y=2*(f*g-p*m),v=f*f+p*p,x=m*m+g*g,_={x:(g*v-p*x)/y+u,y:(f*x-m*v)/y+h};ir(r.edge,c,d,_),l.edge=nr(c,t,null,_),r.edge=nr(t,d,null,_),Qe(e),Qe(r)}else l.edge=nr(e.site,l.site)}}function Ye(t,e){var r=t.site,n=r.x,i=r.y,a=i-e;if(!a)return n;var o=t.P;if(!o)return-1/0;var s=(r=o.site).x,l=r.y,c=l-e;if(!c)return s;var u=s-n,h=1/a-1/c,f=u/c;return h?(-f+Math.sqrt(f*f-2*h*(u*u/(-2*c)-l+c/2+i-a/2)))/h+n:(n+s)/2}function Xe(t,e){var r=t.N;if(r)return Ye(r,e);var n=t.site;return n.y===e?n.x:1/0}function $e(t){this.site=t,this.edges=[]}function Je(t,e){return e.angle-t.angle}function Ke(){sr(this),this.x=this.y=this.arc=this.site=this.cy=null}function Qe(t){var e=t.P,r=t.N;if(e&&r){var n=e.site,i=t.site,a=r.site;if(n!==a){var o=i.x,s=i.y,l=n.x-o,c=n.y-s,u=a.x-o,h=2*(l*(g=a.y-s)-c*u);if(!(h>=-Ct)){var f=l*l+c*c,p=u*u+g*g,d=(g*f-c*p)/h,m=(l*p-u*f)/h,g=m+s,y=Ve.pop()||new Ke;y.arc=t,y.site=i,y.x=d+o,y.y=g+Math.sqrt(d*d+m*m),y.cy=g,t.circle=y;for(var v=null,x=je._;x;)if(y.y=s)return;if(f>d){if(a){if(a.y>=c)return}else a={x:g,y:l};r={x:g,y:c}}else{if(a){if(a.y1)if(f>d){if(a){if(a.y>=c)return}else a={x:(l-i)/n,y:l};r={x:(c-i)/n,y:c}}else{if(a){if(a.y=s)return}else a={x:o,y:n*o+i};r={x:s,y:n*s+i}}else{if(a){if(a.x0)){if(e/=f,f<0){if(e0){if(e>h)return;e>u&&(u=e)}if(e=i-l,f||!(e<0)){if(e/=f,f<0){if(e>h)return;e>u&&(u=e)}else if(f>0){if(e0)){if(e/=p,p<0){if(e0){if(e>h)return;e>u&&(u=e)}if(e=a-c,p||!(e<0)){if(e/=p,p<0){if(e>h)return;e>u&&(u=e)}else if(p>0){if(e0&&(t.a={x:l+u*f,y:c+u*p}),h<1&&(t.b={x:l+h*f,y:c+h*p}),t}}}}}),l=o.length;l--;)(!er(e=o[l],t)||!s(e)||w(e.a.x-e.b.x)Et||w(i-r)>Et)&&(s.splice(o,0,new ar((y=a.site,v=u,x=w(n-h)Et?{x:h,y:w(e-h)Et?{x:w(r-d)Et?{x:f,y:w(e-f)Et?{x:w(r-p)=r&&c.x<=i&&c.y>=n&&c.y<=o?[[r,o],[i,o],[i,n],[r,n]]:[]).point=t[s]})),e}function s(t){return t.map((function(t,e){return{x:Math.round(n(t,e)/Et)*Et,y:Math.round(i(t,e)/Et)*Et,i:e}}))}return o.links=function(t){return hr(s(t)).edges.filter((function(t){return t.l&&t.r})).map((function(e){return{source:t[e.l.i],target:t[e.r.i]}}))},o.triangles=function(t){var e=[];return hr(s(t)).cells.forEach((function(r,n){for(var i,a,o,s,l=r.site,c=r.edges.sort(Je),u=-1,h=c.length,f=c[h-1].edge,p=f.l===l?f.r:f.l;++ua&&(i=e.slice(a,i),s[o]?s[o]+=i:s[++o]=i),(r=r[0])===(n=n[0])?s[o]?s[o]+=n:s[++o]=n:(s[++o]=null,l.push({i:o,x:xr(r,n)})),a=wr.lastIndex;return am&&(m=l.x),l.y>g&&(g=l.y),c.push(l.x),u.push(l.y);else for(h=0;hm&&(m=x),_>g&&(g=_),c.push(x),u.push(_)}var b=m-p,T=g-d;function k(t,e,r,n,i,a,o,s){if(!isNaN(r)&&!isNaN(n))if(t.leaf){var l=t.x,c=t.y;if(null!=l)if(w(l-r)+w(c-n)<.01)A(t,e,r,n,i,a,o,s);else{var u=t.point;t.x=t.y=t.point=null,A(t,u,l,c,i,a,o,s),A(t,e,r,n,i,a,o,s)}else t.x=r,t.y=n,t.point=e}else A(t,e,r,n,i,a,o,s)}function A(t,e,r,n,i,a,o,s){var l=.5*(i+o),c=.5*(a+s),u=r>=l,h=n>=c,f=h<<1|u;t.leaf=!1,u?i=l:o=l,h?a=c:s=c,k(t=t.nodes[f]||(t.nodes[f]={leaf:!0,nodes:[],point:null,x:null,y:null}),e,r,n,i,a,o,s)}b>T?g=d+b:m=p+T;var M={leaf:!0,nodes:[],point:null,x:null,y:null,add:function(t){k(M,t,+y(t,++h),+v(t,h),p,d,m,g)}};if(M.visit=function(t){gr(t,M,p,d,m,g)},M.find=function(t){return function(t,e,r,n,i,a,o){var s,l=1/0;return function t(c,u,h,f,p){if(!(u>a||h>o||f=b)<<1|e>=_,T=w+4;w=0&&!(r=a.interpolators[n](t,e)););return r}function kr(t,e){var r,n=[],i=[],a=t.length,o=e.length,s=Math.min(t.length,e.length);for(r=0;r=1)return 1;var e=t*t,r=e*t;return 4*(t<.5?r:3*(t-e)+r-.75)}function zr(t){return 1-Math.cos(t*zt)}function Or(t){return Math.pow(2,10*(t-1))}function Dr(t){return 1-Math.sqrt(1-t*t)}function Rr(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375}function Fr(t,e){return e-=t,function(r){return Math.round(t+e*r)}}function Br(t){var e,r,n,i=[t.a,t.b],a=[t.c,t.d],o=jr(i),s=Nr(i,a),l=jr(((e=a)[0]+=(n=-s)*(r=i)[0],e[1]+=n*r[1],e))||0;i[0]*a[1]=0?t.slice(0,r):t,i=r>=0?t.slice(r+1):\"in\";return n=Mr.get(n)||Ar,i=Sr.get(i)||D,e=i(n.apply(null,o.call(arguments,1))),function(t){return t<=0?0:t>=1?1:e(t)}},a.interpolateHcl=function(t,e){t=a.hcl(t),e=a.hcl(e);var r=t.h,n=t.c,i=t.l,o=e.h-r,s=e.c-n,l=e.l-i;return isNaN(s)&&(s=0,n=isNaN(n)?e.c:n),isNaN(o)?(o=0,r=isNaN(r)?e.h:r):o>180?o-=360:o<-180&&(o+=360),function(t){return Yt(r+o*t,n+s*t,i+l*t)+\"\"}},a.interpolateHsl=function(t,e){t=a.hsl(t),e=a.hsl(e);var r=t.h,n=t.s,i=t.l,o=e.h-r,s=e.s-n,l=e.l-i;return isNaN(s)&&(s=0,n=isNaN(n)?e.s:n),isNaN(o)?(o=0,r=isNaN(r)?e.h:r):o>180?o-=360:o<-180&&(o+=360),function(t){return Gt(r+o*t,n+s*t,i+l*t)+\"\"}},a.interpolateLab=function(t,e){t=a.lab(t),e=a.lab(e);var r=t.l,n=t.a,i=t.b,o=e.l-r,s=e.a-n,l=e.b-i;return function(t){return ee(r+o*t,n+s*t,i+l*t)+\"\"}},a.interpolateRound=Fr,a.transform=function(t){var e=l.createElementNS(a.ns.prefix.svg,\"g\");return(a.transform=function(t){if(null!=t){e.setAttribute(\"transform\",t);var r=e.transform.baseVal.consolidate()}return new Br(r?r.matrix:Ur)})(t)},Br.prototype.toString=function(){return\"translate(\"+this.translate+\")rotate(\"+this.rotate+\")skewX(\"+this.skew+\")scale(\"+this.scale+\")\"};var Ur={a:1,b:0,c:0,d:1,e:0,f:0};function Vr(t){return t.length?t.pop()+\",\":\"\"}function qr(t,e){var r=[],n=[];return t=a.transform(t),e=a.transform(e),function(t,e,r,n){if(t[0]!==e[0]||t[1]!==e[1]){var i=r.push(\"translate(\",null,\",\",null,\")\");n.push({i:i-4,x:xr(t[0],e[0])},{i:i-2,x:xr(t[1],e[1])})}else(e[0]||e[1])&&r.push(\"translate(\"+e+\")\")}(t.translate,e.translate,r,n),function(t,e,r,n){t!==e?(t-e>180?e+=360:e-t>180&&(t+=360),n.push({i:r.push(Vr(r)+\"rotate(\",null,\")\")-2,x:xr(t,e)})):e&&r.push(Vr(r)+\"rotate(\"+e+\")\")}(t.rotate,e.rotate,r,n),function(t,e,r,n){t!==e?n.push({i:r.push(Vr(r)+\"skewX(\",null,\")\")-2,x:xr(t,e)}):e&&r.push(Vr(r)+\"skewX(\"+e+\")\")}(t.skew,e.skew,r,n),function(t,e,r,n){if(t[0]!==e[0]||t[1]!==e[1]){var i=r.push(Vr(r)+\"scale(\",null,\",\",null,\")\");n.push({i:i-4,x:xr(t[0],e[0])},{i:i-2,x:xr(t[1],e[1])})}else 1===e[0]&&1===e[1]||r.push(Vr(r)+\"scale(\"+e+\")\")}(t.scale,e.scale,r,n),t=e=null,function(t){for(var e,i=-1,a=n.length;++i0?r=e:(t.c=null,t.t=NaN,t=null,l.end({type:\"end\",alpha:r=0})):e>0&&(l.start({type:\"start\",alpha:r=e}),t=ke(s.tick)),s):r},s.start=function(){var t,e,r,a=y.length,l=v.length,u=c[0],d=c[1];for(t=0;t=0;)r.push(i[n])}function an(t,e){for(var r=[t],n=[];null!=(t=r.pop());)if(n.push(t),(a=t.children)&&(i=a.length))for(var i,a,o=-1;++o=0;)o.push(u=c[l]),u.parent=a,u.depth=a.depth+1;r&&(a.value=0),a.children=c}else r&&(a.value=+r.call(n,a,a.depth)||0),delete a.children;return an(i,(function(e){var n,i;t&&(n=e.children)&&n.sort(t),r&&(i=e.parent)&&(i.value+=e.value)})),s}return n.sort=function(e){return arguments.length?(t=e,n):t},n.children=function(t){return arguments.length?(e=t,n):e},n.value=function(t){return arguments.length?(r=t,n):r},n.revalue=function(t){return r&&(nn(t,(function(t){t.children&&(t.value=0)})),an(t,(function(t){var e;t.children||(t.value=+r.call(n,t,t.depth)||0),(e=t.parent)&&(e.value+=t.value)}))),t},n},a.layout.partition=function(){var t=a.layout.hierarchy(),e=[1,1];function r(t,e,n,i){var a=t.children;if(t.x=e,t.y=t.depth*i,t.dx=n,t.dy=i,a&&(o=a.length)){var o,s,l,c=-1;for(n=t.value?n/t.value:0;++cs&&(s=n),o.push(n)}for(r=0;ri&&(n=r,i=e);return n}function xn(t){return t.reduce(_n,0)}function _n(t,e){return t+e[1]}function bn(t,e){return wn(t,Math.ceil(Math.log(e.length)/Math.LN2+1))}function wn(t,e){for(var r=-1,n=+t[0],i=(t[1]-n)/e,a=[];++r<=e;)a[r]=i*r+n;return a}function Tn(t){return[a.min(t),a.max(t)]}function kn(t,e){return t.value-e.value}function An(t,e){var r=t._pack_next;t._pack_next=e,e._pack_prev=t,e._pack_next=r,r._pack_prev=e}function Mn(t,e){t._pack_next=e,e._pack_prev=t}function Sn(t,e){var r=e.x-t.x,n=e.y-t.y,i=t.r+e.r;return.999*i*i>r*r+n*n}function En(t){if((e=t.children)&&(l=e.length)){var e,r,n,i,a,o,s,l,c=1/0,u=-1/0,h=1/0,f=-1/0;if(e.forEach(Cn),(r=e[0]).x=-r.r,r.y=0,x(r),l>1&&((n=e[1]).x=n.r,n.y=0,x(n),l>2))for(Pn(r,n,i=e[2]),x(i),An(r,i),r._pack_prev=i,An(i,n),n=r._pack_next,a=3;a0)for(o=-1;++o=h[0]&&l<=h[1]&&((s=c[a.bisect(f,l,1,d)-1]).y+=m,s.push(i[o]));return c}return i.value=function(t){return arguments.length?(e=t,i):e},i.range=function(t){return arguments.length?(r=ge(t),i):r},i.bins=function(t){return arguments.length?(n=\"number\"==typeof t?function(e){return wn(e,t)}:ge(t),i):n},i.frequency=function(e){return arguments.length?(t=!!e,i):t},i},a.layout.pack=function(){var t,e=a.layout.hierarchy().sort(kn),r=0,n=[1,1];function i(i,a){var o=e.call(this,i,a),s=o[0],l=n[0],c=n[1],u=null==t?Math.sqrt:\"function\"==typeof t?t:function(){return t};if(s.x=s.y=0,an(s,(function(t){t.r=+u(t.value)})),an(s,En),r){var h=r*(t?1:Math.max(2*s.r/l,2*s.r/c))/2;an(s,(function(t){t.r+=h})),an(s,En),an(s,(function(t){t.r-=h}))}return In(s,l/2,c/2,t?1:1/Math.max(2*s.r/l,2*s.r/c)),o}return i.size=function(t){return arguments.length?(n=t,i):n},i.radius=function(e){return arguments.length?(t=null==e||\"function\"==typeof e?e:+e,i):t},i.padding=function(t){return arguments.length?(r=+t,i):r},rn(i,e)},a.layout.tree=function(){var t=a.layout.hierarchy().sort(null).value(null),e=zn,r=[1,1],n=null;function i(i,a){var c=t.call(this,i,a),u=c[0],h=function(t){for(var e,r={A:null,children:[t]},n=[r];null!=(e=n.pop());)for(var i,a=e.children,o=0,s=a.length;op.x&&(p=t),t.depth>d.depth&&(d=t)}));var m=e(f,p)/2-f.x,g=r[0]/(p.x+e(p,f)/2+m),y=r[1]/(d.depth||1);nn(u,(function(t){t.x=(t.x+m)*g,t.y=t.depth*y}))}return c}function o(t){var r=t.children,n=t.parent.children,i=t.i?n[t.i-1]:null;if(r.length){!function(t){for(var e,r=0,n=0,i=t.children,a=i.length;--a>=0;)(e=i[a]).z+=r,e.m+=r,r+=e.s+(n+=e.c)}(t);var a=(r[0].z+r[r.length-1].z)/2;i?(t.z=i.z+e(t._,i._),t.m=t.z-a):t.z=a}else i&&(t.z=i.z+e(t._,i._));t.parent.A=function(t,r,n){if(r){for(var i,a=t,o=t,s=r,l=a.parent.children[0],c=a.m,u=o.m,h=s.m,f=l.m;s=Dn(s),a=On(a),s&&a;)l=On(l),(o=Dn(o)).a=t,(i=s.z+h-a.z-c+e(s._,a._))>0&&(Rn(Fn(s,t,n),t,i),c+=i,u+=i),h+=s.m,c+=a.m,f+=l.m,u+=o.m;s&&!Dn(o)&&(o.t=s,o.m+=h-u),a&&!On(l)&&(l.t=a,l.m+=c-f,n=t)}return n}(t,i,t.parent.A||n[0])}function s(t){t._.x=t.z+t.parent.m,t.m+=t.parent.m}function l(t){t.x*=r[0],t.y=t.depth*r[1]}return i.separation=function(t){return arguments.length?(e=t,i):e},i.size=function(t){return arguments.length?(n=null==(r=t)?l:null,i):n?null:r},i.nodeSize=function(t){return arguments.length?(n=null==(r=t)?null:l,i):n?r:null},rn(i,t)},a.layout.cluster=function(){var t=a.layout.hierarchy().sort(null).value(null),e=zn,r=[1,1],n=!1;function i(i,o){var s,l=t.call(this,i,o),c=l[0],u=0;an(c,(function(t){var r=t.children;r&&r.length?(t.x=function(t){return t.reduce((function(t,e){return t+e.x}),0)/t.length}(r),t.y=function(t){return 1+a.max(t,(function(t){return t.y}))}(r)):(t.x=s?u+=e(t,s):0,t.y=0,s=t)}));var h=Bn(c),f=Nn(c),p=h.x-e(h,f)/2,d=f.x+e(f,h)/2;return an(c,n?function(t){t.x=(t.x-c.x)*r[0],t.y=(c.y-t.y)*r[1]}:function(t){t.x=(t.x-p)/(d-p)*r[0],t.y=(1-(c.y?t.y/c.y:1))*r[1]}),l}return i.separation=function(t){return arguments.length?(e=t,i):e},i.size=function(t){return arguments.length?(n=null==(r=t),i):n?null:r},i.nodeSize=function(t){return arguments.length?(n=null!=(r=t),i):n?r:null},rn(i,t)},a.layout.treemap=function(){var t,e=a.layout.hierarchy(),r=Math.round,n=[1,1],i=null,o=jn,s=!1,l=\"squarify\",c=.5*(1+Math.sqrt(5));function u(t,e){for(var r,n,i=-1,a=t.length;++i0;)s.push(r=c[i-1]),s.area+=r.area,\"squarify\"!==l||(n=p(s,m))<=f?(c.pop(),f=n):(s.area-=s.pop().area,d(s,m,a,!1),m=Math.min(a.dx,a.dy),s.length=s.area=0,f=1/0);s.length&&(d(s,m,a,!0),s.length=s.area=0),e.forEach(h)}}function f(t){var e=t.children;if(e&&e.length){var r,n=o(t),i=e.slice(),a=[];for(u(i,n.dx*n.dy/t.value),a.area=0;r=i.pop();)a.push(r),a.area+=r.area,null!=r.z&&(d(a,r.z?n.dx:n.dy,n,!i.length),a.length=a.area=0);e.forEach(f)}}function p(t,e){for(var r,n=t.area,i=0,a=1/0,o=-1,s=t.length;++oi&&(i=r));return e*=e,(n*=n)?Math.max(e*i*c/n,n/(e*a*c)):1/0}function d(t,e,n,i){var a,o=-1,s=t.length,l=n.x,c=n.y,u=e?r(t.area/e):0;if(e==n.dx){for((i||u>n.dy)&&(u=n.dy);++on.dx)&&(u=n.dx);++o1);return t+e*r*Math.sqrt(-2*Math.log(i)/i)}},logNormal:function(){var t=a.random.normal.apply(a,arguments);return function(){return Math.exp(t())}},bates:function(t){var e=a.random.irwinHall(t);return function(){return e()/t}},irwinHall:function(t){return function(){for(var e=0,r=0;r2?Yn:Hn,l=n?Gr:Hr;return i=o(t,e,l,r),a=o(e,t,l,Tr),s}function s(t){return i(t)}return s.invert=function(t){return a(t)},s.domain=function(e){return arguments.length?(t=e.map(Number),o()):t},s.range=function(t){return arguments.length?(e=t,o()):e},s.rangeRound=function(t){return s.range(t).interpolate(Fr)},s.clamp=function(t){return arguments.length?(n=t,o()):n},s.interpolate=function(t){return arguments.length?(r=t,o()):r},s.ticks=function(e){return Qn(t,e)},s.tickFormat=function(e,r){return d3_scale_linearTickFormat(t,e,r)},s.nice=function(e){return Jn(t,e),o()},s.copy=function(){return Xn(t,e,r,n)},o()}function $n(t,e){return a.rebind(t,e,\"range\",\"rangeRound\",\"interpolate\",\"clamp\")}function Jn(t,e){return Gn(t,Zn(Kn(t,e)[2])),Gn(t,Zn(Kn(t,e)[2])),t}function Kn(t,e){null==e&&(e=10);var r=Vn(t),n=r[1]-r[0],i=Math.pow(10,Math.floor(Math.log(n/e)/Math.LN10)),a=e/n*i;return a<=.15?i*=10:a<=.35?i*=5:a<=.75&&(i*=2),r[0]=Math.ceil(r[0]/i)*i,r[1]=Math.floor(r[1]/i)*i+.5*i,r[2]=i,r}function Qn(t,e){return a.range.apply(a,Kn(t,e))}function ti(t,e,r,n){function i(t){return(r?Math.log(t<0?0:t):-Math.log(t>0?0:-t))/Math.log(e)}function a(t){return r?Math.pow(e,t):-Math.pow(e,-t)}function o(e){return t(i(e))}return o.invert=function(e){return a(t.invert(e))},o.domain=function(e){return arguments.length?(r=e[0]>=0,t.domain((n=e.map(Number)).map(i)),o):n},o.base=function(r){return arguments.length?(e=+r,t.domain(n.map(i)),o):e},o.nice=function(){var e=Gn(n.map(i),r?Math:ei);return t.domain(e),n=e.map(a),o},o.ticks=function(){var t=Vn(n),o=[],s=t[0],l=t[1],c=Math.floor(i(s)),u=Math.ceil(i(l)),h=e%1?2:e;if(isFinite(u-c)){if(r){for(;c0;f--)o.push(a(c)*f);for(c=0;o[c]l;u--);o=o.slice(c,u)}return o},o.copy=function(){return ti(t.copy(),e,r,n)},$n(o,t)}a.scale.linear=function(){return Xn([0,1],[0,1],Tr,!1)},a.scale.log=function(){return ti(a.scale.linear().domain([0,1]),10,!0,[1,10])};var ei={floor:function(t){return-Math.ceil(-t)},ceil:function(t){return-Math.floor(-t)}};function ri(t,e,r){var n=ni(e),i=ni(1/e);function a(e){return t(n(e))}return a.invert=function(e){return i(t.invert(e))},a.domain=function(e){return arguments.length?(t.domain((r=e.map(Number)).map(n)),a):r},a.ticks=function(t){return Qn(r,t)},a.tickFormat=function(t,e){return d3_scale_linearTickFormat(r,t,e)},a.nice=function(t){return a.domain(Jn(r,t))},a.exponent=function(o){return arguments.length?(n=ni(e=o),i=ni(1/e),t.domain(r.map(n)),a):e},a.copy=function(){return ri(t.copy(),e,r)},$n(a,t)}function ni(t){return function(e){return e<0?-Math.pow(-e,t):Math.pow(e,t)}}function ii(t,e){var r,n,i;function o(i){return n[((r.get(i)||(\"range\"===e.t?r.set(i,t.push(i)):NaN))-1)%n.length]}function s(e,r){return a.range(t.length).map((function(t){return e+r*t}))}return o.domain=function(n){if(!arguments.length)return t;t=[],r=new k;for(var i,a=-1,s=n.length;++a0?r[n-1]:t[0],nh?0:1;if(c=Pt)return l(c,p)+(s?l(s,1-p):\"\")+\"Z\";var d,m,g,y,v,x,_,b,w,T,k,A,M=0,S=0,E=[];if((y=(+o.apply(this,arguments)||0)/2)&&(g=n===di?Math.sqrt(s*s+c*c):+n.apply(this,arguments),p||(S*=-1),c&&(S=Rt(g/c*Math.sin(y))),s&&(M=Rt(g/s*Math.sin(y)))),c){v=c*Math.cos(u+S),x=c*Math.sin(u+S),_=c*Math.cos(h-S),b=c*Math.sin(h-S);var C=Math.abs(h-u-2*S)<=Lt?0:1;if(S&&_i(v,x,_,b)===p^C){var L=(u+h)/2;v=c*Math.cos(L),x=c*Math.sin(L),_=b=null}}else v=x=0;if(s){w=s*Math.cos(h-M),T=s*Math.sin(h-M),k=s*Math.cos(u+M),A=s*Math.sin(u+M);var I=Math.abs(u-h+2*M)<=Lt?0:1;if(M&&_i(w,T,k,A)===1-p^I){var P=(u+h)/2;w=s*Math.cos(P),T=s*Math.sin(P),k=A=null}}else w=T=0;if(f>Et&&(d=Math.min(Math.abs(c-s)/2,+r.apply(this,arguments)))>.001){m=s0?0:1}function bi(t,e,r,n,i){var a=t[0]-e[0],o=t[1]-e[1],s=(i?n:-n)/Math.sqrt(a*a+o*o),l=s*o,c=-s*a,u=t[0]+l,h=t[1]+c,f=e[0]+l,p=e[1]+c,d=(u+f)/2,m=(h+p)/2,g=f-u,y=p-h,v=g*g+y*y,x=r-n,_=u*p-f*h,b=(y<0?-1:1)*Math.sqrt(Math.max(0,x*x*v-_*_)),w=(_*y-g*b)/v,T=(-_*g-y*b)/v,k=(_*y+g*b)/v,A=(-_*g+y*b)/v,M=w-d,S=T-m,E=k-d,C=A-m;return M*M+S*S>E*E+C*C&&(w=k,T=A),[[w-l,T-c],[w*r/x,T*r/x]]}function wi(){return!0}function Ti(t){var e=Ee,r=Ce,n=wi,i=Ai,a=i.key,o=.7;function s(a){var s,l=[],c=[],u=-1,h=a.length,f=ge(e),p=ge(r);function d(){l.push(\"M\",i(t(c),o))}for(;++u1&&i.push(\"H\",n[0]),i.join(\"\")},\"step-before\":Si,\"step-after\":Ei,basis:Ii,\"basis-open\":function(t){if(t.length<4)return Ai(t);for(var e,r=[],n=-1,i=t.length,a=[0],o=[0];++n<3;)e=t[n],a.push(e[0]),o.push(e[1]);for(r.push(Pi(Di,a)+\",\"+Pi(Di,o)),--n;++n9&&(i=3*e/Math.sqrt(i),o[s]=i*r,o[s+1]=i*n);for(s=-1;++s<=l;)i=(t[Math.min(l,s+1)][0]-t[Math.max(0,s-1)][0])/(6*(1+o[s]*o[s])),a.push([i||0,o[s]*i||0]);return a}(t))}});function Ai(t){return t.length>1?t.join(\"L\"):t+\"Z\"}function Mi(t){return t.join(\"L\")+\"Z\"}function Si(t){for(var e=0,r=t.length,n=t[0],i=[n[0],\",\",n[1]];++e1){s=e[1],a=t[l],l++,n+=\"C\"+(i[0]+o[0])+\",\"+(i[1]+o[1])+\",\"+(a[0]-s[0])+\",\"+(a[1]-s[1])+\",\"+a[0]+\",\"+a[1];for(var c=2;cLt)+\",1 \"+e}function l(t,e,r,n){return\"Q 0,0 \"+n}return a.radius=function(t){return arguments.length?(r=ge(t),a):r},a.source=function(e){return arguments.length?(t=ge(e),a):t},a.target=function(t){return arguments.length?(e=ge(t),a):e},a.startAngle=function(t){return arguments.length?(n=ge(t),a):n},a.endAngle=function(t){return arguments.length?(i=ge(t),a):i},a},a.svg.diagonal=function(){var t=ji,e=Ui,r=qi;function n(n,i){var a=t.call(this,n,i),o=e.call(this,n,i),s=(a.y+o.y)/2,l=[a,{x:a.x,y:s},{x:o.x,y:s},o];return\"M\"+(l=l.map(r))[0]+\"C\"+l[1]+\" \"+l[2]+\" \"+l[3]}return n.source=function(e){return arguments.length?(t=ge(e),n):t},n.target=function(t){return arguments.length?(e=ge(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},a.svg.diagonal.radial=function(){var t=a.svg.diagonal(),e=qi,r=t.projection;return t.projection=function(t){return arguments.length?r(function(t){return function(){var e=t.apply(this,arguments),r=e[0],n=e[1]-zt;return[r*Math.cos(n),r*Math.sin(n)]}}(e=t)):e},t},a.svg.symbol=function(){var t=Gi,e=Hi;function r(r,n){return(Wi.get(t.call(this,r,n))||Zi)(e.call(this,r,n))}return r.type=function(e){return arguments.length?(t=ge(e),r):t},r.size=function(t){return arguments.length?(e=ge(t),r):e},r};var Wi=a.map({circle:Zi,cross:function(t){var e=Math.sqrt(t/5)/2;return\"M\"+-3*e+\",\"+-e+\"H\"+-e+\"V\"+-3*e+\"H\"+e+\"V\"+-e+\"H\"+3*e+\"V\"+e+\"H\"+e+\"V\"+3*e+\"H\"+-e+\"V\"+e+\"H\"+-3*e+\"Z\"},diamond:function(t){var e=Math.sqrt(t/(2*Xi)),r=e*Xi;return\"M0,\"+-e+\"L\"+r+\",0 0,\"+e+\" \"+-r+\",0Z\"},square:function(t){var e=Math.sqrt(t)/2;return\"M\"+-e+\",\"+-e+\"L\"+e+\",\"+-e+\" \"+e+\",\"+e+\" \"+-e+\",\"+e+\"Z\"},\"triangle-down\":function(t){var e=Math.sqrt(t/Yi),r=e*Yi/2;return\"M0,\"+r+\"L\"+e+\",\"+-r+\" \"+-e+\",\"+-r+\"Z\"},\"triangle-up\":function(t){var e=Math.sqrt(t/Yi),r=e*Yi/2;return\"M0,\"+-r+\"L\"+e+\",\"+r+\" \"+-e+\",\"+r+\"Z\"}});a.svg.symbolTypes=Wi.keys();var Yi=Math.sqrt(3),Xi=Math.tan(30*Ot);J.transition=function(t){for(var e,r,n=Qi||++ra,i=aa(t),a=[],o=ta||{time:Date.now(),ease:Pr,delay:0,duration:250},s=-1,l=this.length;++s0;)c[--f].call(t,o);if(a>=1)return h.event&&h.event.end.call(t,t.__data__,e),--u.count?delete u[n]:delete t[r],1}h||(a=i.time,o=ke((function(t){var e=h.delay;if(o.t=e+a,e<=t)return f(t-e);o.c=f}),0,a),h=u[n]={tween:new k,time:a,timer:o,delay:i.delay,duration:i.duration,ease:i.ease,index:e},i=null,++u.count)}ea.call=J.call,ea.empty=J.empty,ea.node=J.node,ea.size=J.size,a.transition=function(t,e){return t&&t.transition?Qi?t.transition(e):t:a.selection().transition(t)},a.transition.prototype=ea,ea.select=function(t){var e,r,n,i=this.id,a=this.namespace,o=[];t=K(t);for(var s=-1,l=this.length;++srect,.s>rect\").attr(\"width\",o[1]-o[0])}function m(t){t.select(\".extent\").attr(\"y\",s[0]),t.selectAll(\".extent,.e>rect,.w>rect\").attr(\"height\",s[1]-s[0])}function g(){var h,g,y=this,v=a.select(a.event.target),x=r.of(y,arguments),_=a.select(y),b=v.datum(),w=!/^(n|s)$/.test(b)&&n,T=!/^(e|w)$/.test(b)&&i,k=v.classed(\"extent\"),A=kt(y),M=a.mouse(y),S=a.select(u(y)).on(\"keydown.brush\",(function(){32==a.event.keyCode&&(k||(h=null,M[0]-=o[1],M[1]-=s[1],k=2),V())})).on(\"keyup.brush\",(function(){32==a.event.keyCode&&2==k&&(M[0]+=o[1],M[1]+=s[1],k=0,V())}));if(a.event.changedTouches?S.on(\"touchmove.brush\",L).on(\"touchend.brush\",P):S.on(\"mousemove.brush\",L).on(\"mouseup.brush\",P),_.interrupt().selectAll(\"*\").interrupt(),k)M[0]=o[0]-M[0],M[1]=s[0]-M[1];else if(b){var E=+/w$/.test(b),C=+/^n/.test(b);g=[o[1-E]-M[0],s[1-C]-M[1]],M[0]=o[E],M[1]=s[C]}else a.event.altKey&&(h=M.slice());function L(){var t=a.mouse(y),e=!1;g&&(t[0]+=g[0],t[1]+=g[1]),k||(a.event.altKey?(h||(h=[(o[0]+o[1])/2,(s[0]+s[1])/2]),M[0]=o[+(t[0](n=1))return n;for(;ra?r=i:n=i,i=.5*(n-r)+r}return i},i.prototype.solve=function(t,e){return this.sampleCurveY(this.solveCurveX(t,e))};var a=o;function o(t,e){this.x=t,this.y=e}o.prototype={clone:function(){return new o(this.x,this.y)},add:function(t){return this.clone()._add(t)},sub:function(t){return this.clone()._sub(t)},multByPoint:function(t){return this.clone()._multByPoint(t)},divByPoint:function(t){return this.clone()._divByPoint(t)},mult:function(t){return this.clone()._mult(t)},div:function(t){return this.clone()._div(t)},rotate:function(t){return this.clone()._rotate(t)},rotateAround:function(t,e){return this.clone()._rotateAround(t,e)},matMult:function(t){return this.clone()._matMult(t)},unit:function(){return this.clone()._unit()},perp:function(){return this.clone()._perp()},round:function(){return this.clone()._round()},mag:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},equals:function(t){return this.x===t.x&&this.y===t.y},dist:function(t){return Math.sqrt(this.distSqr(t))},distSqr:function(t){var e=t.x-this.x,r=t.y-this.y;return e*e+r*r},angle:function(){return Math.atan2(this.y,this.x)},angleTo:function(t){return Math.atan2(this.y-t.y,this.x-t.x)},angleWith:function(t){return this.angleWithSep(t.x,t.y)},angleWithSep:function(t,e){return Math.atan2(this.x*e-this.y*t,this.x*t+this.y*e)},_matMult:function(t){var e=t[0]*this.x+t[1]*this.y,r=t[2]*this.x+t[3]*this.y;return this.x=e,this.y=r,this},_add:function(t){return this.x+=t.x,this.y+=t.y,this},_sub:function(t){return this.x-=t.x,this.y-=t.y,this},_mult:function(t){return this.x*=t,this.y*=t,this},_div:function(t){return this.x/=t,this.y/=t,this},_multByPoint:function(t){return this.x*=t.x,this.y*=t.y,this},_divByPoint:function(t){return this.x/=t.x,this.y/=t.y,this},_unit:function(){return this._div(this.mag()),this},_perp:function(){var t=this.y;return this.y=this.x,this.x=-t,this},_rotate:function(t){var e=Math.cos(t),r=Math.sin(t),n=e*this.x-r*this.y,i=r*this.x+e*this.y;return this.x=n,this.y=i,this},_rotateAround:function(t,e){var r=Math.cos(t),n=Math.sin(t),i=e.x+r*(this.x-e.x)-n*(this.y-e.y),a=e.y+n*(this.x-e.x)+r*(this.y-e.y);return this.x=i,this.y=a,this},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}},o.convert=function(t){return t instanceof o?t:Array.isArray(t)?new o(t[0],t[1]):t};var s=\"undefined\"!=typeof self?self:{};var l=Math.pow(2,53)-1;function c(t,e,r,i){var a=new n(t,e,r,i);return function(t){return a.solve(t)}}var u=c(.25,.1,.25,1);function h(t,e,r){return Math.min(r,Math.max(e,t))}function f(t,e,r){var n=r-e,i=((t-e)%n+n)%n+e;return i===e?r:i}function p(t){for(var e=[],r=arguments.length-1;r-- >0;)e[r]=arguments[r+1];for(var n=0,i=e;n>e/4).toString(16):([1e7]+-[1e3]+-4e3+-8e3+-1e11).replace(/[018]/g,t)}()}function y(t){return!!t&&/^[0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(t)}function v(t,e){t.forEach((function(t){e[t]&&(e[t]=e[t].bind(e))}))}function x(t,e){return-1!==t.indexOf(e,t.length-e.length)}function _(t,e,r){var n={};for(var i in t)n[i]=e.call(r||this,t[i],i,t);return n}function b(t,e,r){var n={};for(var i in t)e.call(r||this,t[i],i,t)&&(n[i]=t[i]);return n}function w(t){return Array.isArray(t)?t.map(w):\"object\"==typeof t&&t?_(t,w):t}var T={};function k(t){T[t]||(\"undefined\"!=typeof console&&console.warn(t),T[t]=!0)}function A(t,e,r){return(r.y-t.y)*(e.x-t.x)>(e.y-t.y)*(r.x-t.x)}function M(t){for(var e=0,r=0,n=t.length,i=n-1,a=void 0,o=void 0;r@\\,;\\:\\\\\"\\/\\[\\]\\?\\=\\{\\}\\x7F]+)(?:\\=(?:([^\\x00-\\x20\\(\\)<>@\\,;\\:\\\\\"\\/\\[\\]\\?\\=\\{\\}\\x7F]+)|(?:\\\"((?:[^\"\\\\]|\\\\.)*)\\\")))?/g,(function(t,r,n,i){var a=n||i;return e[r]=!a||a.toLowerCase(),\"\"})),e[\"max-age\"]){var r=parseInt(e[\"max-age\"],10);isNaN(r)?delete e[\"max-age\"]:e[\"max-age\"]=r}return e}var C=null;function L(t){if(null==C){var e=t.navigator?t.navigator.userAgent:null;C=!!t.safari||!(!e||!(/\\b(iPad|iPhone|iPod)\\b/.test(e)||e.match(\"Safari\")&&!e.match(\"Chrome\")))}return C}function I(t){try{var e=s[t];return e.setItem(\"_mapbox_test_\",1),e.removeItem(\"_mapbox_test_\"),!0}catch(t){return!1}}var P,z,O,D,R=s.performance&&s.performance.now?s.performance.now.bind(s.performance):Date.now.bind(Date),F=s.requestAnimationFrame||s.mozRequestAnimationFrame||s.webkitRequestAnimationFrame||s.msRequestAnimationFrame,B=s.cancelAnimationFrame||s.mozCancelAnimationFrame||s.webkitCancelAnimationFrame||s.msCancelAnimationFrame,N={now:R,frame:function(t){var e=F(t);return{cancel:function(){return B(e)}}},getImageData:function(t,e){void 0===e&&(e=0);var r=s.document.createElement(\"canvas\"),n=r.getContext(\"2d\");if(!n)throw new Error(\"failed to create canvas 2d context\");return r.width=t.width,r.height=t.height,n.drawImage(t,0,0,t.width,t.height),n.getImageData(-e,-e,t.width+2*e,t.height+2*e)},resolveURL:function(t){return P||(P=s.document.createElement(\"a\")),P.href=t,P.href},hardwareConcurrency:s.navigator&&s.navigator.hardwareConcurrency||4,get devicePixelRatio(){return s.devicePixelRatio},get prefersReducedMotion(){return!!s.matchMedia&&(null==z&&(z=s.matchMedia(\"(prefers-reduced-motion: reduce)\")),z.matches)}},j={API_URL:\"https://api.mapbox.com\",get EVENTS_URL(){return this.API_URL?0===this.API_URL.indexOf(\"https://api.mapbox.cn\")?\"https://events.mapbox.cn/events/v2\":0===this.API_URL.indexOf(\"https://api.mapbox.com\")?\"https://events.mapbox.com/events/v2\":null:null},FEEDBACK_URL:\"https://apps.mapbox.com/feedback\",REQUIRE_ACCESS_TOKEN:!0,ACCESS_TOKEN:null,MAX_PARALLEL_IMAGE_REQUESTS:16},U={supported:!1,testSupport:function(t){!V&&D&&(q?H(t):O=t)}},V=!1,q=!1;function H(t){var e=t.createTexture();t.bindTexture(t.TEXTURE_2D,e);try{if(t.texImage2D(t.TEXTURE_2D,0,t.RGBA,t.RGBA,t.UNSIGNED_BYTE,D),t.isContextLost())return;U.supported=!0}catch(t){}t.deleteTexture(e),V=!0}s.document&&((D=s.document.createElement(\"img\")).onload=function(){O&&H(O),O=null,q=!0},D.onerror=function(){V=!0,O=null},D.src=\"data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAQAAAAfQ//73v/+BiOh/AAA=\");var G=\"01\";var Z=function(t,e){this._transformRequestFn=t,this._customAccessToken=e,this._createSkuToken()};function W(t){return 0===t.indexOf(\"mapbox:\")}Z.prototype._createSkuToken=function(){var t=function(){for(var t=\"\",e=0;e<10;e++)t+=\"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\"[Math.floor(62*Math.random())];return{token:[\"1\",G,t].join(\"\"),tokenExpiresAt:Date.now()+432e5}}();this._skuToken=t.token,this._skuTokenExpiresAt=t.tokenExpiresAt},Z.prototype._isSkuTokenExpired=function(){return Date.now()>this._skuTokenExpiresAt},Z.prototype.transformRequest=function(t,e){return this._transformRequestFn&&this._transformRequestFn(t,e)||{url:t}},Z.prototype.normalizeStyleURL=function(t,e){if(!W(t))return t;var r=J(t);return r.path=\"/styles/v1\"+r.path,this._makeAPIURL(r,this._customAccessToken||e)},Z.prototype.normalizeGlyphsURL=function(t,e){if(!W(t))return t;var r=J(t);return r.path=\"/fonts/v1\"+r.path,this._makeAPIURL(r,this._customAccessToken||e)},Z.prototype.normalizeSourceURL=function(t,e){if(!W(t))return t;var r=J(t);return r.path=\"/v4/\"+r.authority+\".json\",r.params.push(\"secure\"),this._makeAPIURL(r,this._customAccessToken||e)},Z.prototype.normalizeSpriteURL=function(t,e,r,n){var i=J(t);return W(t)?(i.path=\"/styles/v1\"+i.path+\"/sprite\"+e+r,this._makeAPIURL(i,this._customAccessToken||n)):(i.path+=\"\"+e+r,K(i))},Z.prototype.normalizeTileURL=function(t,e){if(this._isSkuTokenExpired()&&this._createSkuToken(),t&&!W(t))return t;var r=J(t),n=N.devicePixelRatio>=2||512===e?\"@2x\":\"\",i=U.supported?\".webp\":\"$1\";r.path=r.path.replace(/(\\.(png|jpg)\\d*)(?=$)/,\"\"+n+i),r.path=r.path.replace(/^.+\\/v4\\//,\"/\"),r.path=\"/v4\"+r.path;var a=this._customAccessToken||function(t){for(var e=0,r=t;e=0&&t.params.splice(i,1)}if(\"/\"!==n.path&&(t.path=\"\"+n.path+t.path),!j.REQUIRE_ACCESS_TOKEN)return K(t);if(!(e=e||j.ACCESS_TOKEN))throw new Error(\"An API access token is required to use Mapbox GL. \"+r);if(\"s\"===e[0])throw new Error(\"Use a public access token (pk.*) with Mapbox GL, not a secret access token (sk.*). \"+r);return t.params=t.params.filter((function(t){return-1===t.indexOf(\"access_token\")})),t.params.push(\"access_token=\"+e),K(t)};var Y=/^((https?:)?\\/\\/)?([^\\/]+\\.)?mapbox\\.c(n|om)(\\/|\\?|$)/i;function X(t){return Y.test(t)}var $=/^(\\w+):\\/\\/([^/?]*)(\\/[^?]+)?\\??(.+)?/;function J(t){var e=t.match($);if(!e)throw new Error(\"Unable to parse URL object\");return{protocol:e[1],authority:e[2],path:e[3]||\"/\",params:e[4]?e[4].split(\"&\"):[]}}function K(t){var e=t.params.length?\"?\"+t.params.join(\"&\"):\"\";return t.protocol+\"://\"+t.authority+t.path+e}var Q=\"mapbox.eventData\";function tt(t){if(!t)return null;var e,r=t.split(\".\");if(!r||3!==r.length)return null;try{return JSON.parse((e=r[1],decodeURIComponent(s.atob(e).split(\"\").map((function(t){return\"%\"+(\"00\"+t.charCodeAt(0).toString(16)).slice(-2)})).join(\"\"))))}catch(t){return null}}var et=function(t){this.type=t,this.anonId=null,this.eventData={},this.queue=[],this.pendingRequest=null};et.prototype.getStorageKey=function(t){var e,r,n=tt(j.ACCESS_TOKEN);return e=n&&n.u?(r=n.u,s.btoa(encodeURIComponent(r).replace(/%([0-9A-F]{2})/g,(function(t,e){return String.fromCharCode(Number(\"0x\"+e))})))):j.ACCESS_TOKEN||\"\",t?Q+\".\"+t+\":\"+e:Q+\":\"+e},et.prototype.fetchEventData=function(){var t=I(\"localStorage\"),e=this.getStorageKey(),r=this.getStorageKey(\"uuid\");if(t)try{var n=s.localStorage.getItem(e);n&&(this.eventData=JSON.parse(n));var i=s.localStorage.getItem(r);i&&(this.anonId=i)}catch(t){k(\"Unable to read from LocalStorage\")}},et.prototype.saveEventData=function(){var t=I(\"localStorage\"),e=this.getStorageKey(),r=this.getStorageKey(\"uuid\");if(t)try{s.localStorage.setItem(r,this.anonId),Object.keys(this.eventData).length>=1&&s.localStorage.setItem(e,JSON.stringify(this.eventData))}catch(t){k(\"Unable to write to LocalStorage\")}},et.prototype.processRequests=function(t){},et.prototype.postEvent=function(t,e,n,i){var a=this;if(j.EVENTS_URL){var o=J(j.EVENTS_URL);o.params.push(\"access_token=\"+(i||j.ACCESS_TOKEN||\"\"));var s={event:this.type,created:new Date(t).toISOString(),sdkIdentifier:\"mapbox-gl-js\",sdkVersion:r,skuId:G,userId:this.anonId},l=e?p(s,e):s,c={url:K(o),headers:{\"Content-Type\":\"text/plain\"},body:JSON.stringify([l])};this.pendingRequest=St(c,(function(t){a.pendingRequest=null,n(t),a.saveEventData(),a.processRequests(i)}))}},et.prototype.queueRequest=function(t,e){this.queue.push(t),this.processRequests(e)};var rt,nt,it=function(t){function e(){t.call(this,\"map.load\"),this.success={},this.skuToken=\"\"}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.postMapLoadEvent=function(t,e,r,n){this.skuToken=r,(j.EVENTS_URL&&n||j.ACCESS_TOKEN&&Array.isArray(t)&&t.some((function(t){return W(t)||X(t)})))&&this.queueRequest({id:e,timestamp:Date.now()},n)},e.prototype.processRequests=function(t){var e=this;if(!this.pendingRequest&&0!==this.queue.length){var r=this.queue.shift(),n=r.id,i=r.timestamp;n&&this.success[n]||(this.anonId||this.fetchEventData(),y(this.anonId)||(this.anonId=g()),this.postEvent(i,{skuToken:this.skuToken},(function(t){t||n&&(e.success[n]=!0)}),t))}},e}(et),at=function(t){function e(e){t.call(this,\"appUserTurnstile\"),this._customAccessToken=e}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.postTurnstileEvent=function(t,e){j.EVENTS_URL&&j.ACCESS_TOKEN&&Array.isArray(t)&&t.some((function(t){return W(t)||X(t)}))&&this.queueRequest(Date.now(),e)},e.prototype.processRequests=function(t){var e=this;if(!this.pendingRequest&&0!==this.queue.length){this.anonId&&this.eventData.lastSuccess&&this.eventData.tokenU||this.fetchEventData();var r=tt(j.ACCESS_TOKEN),n=r?r.u:j.ACCESS_TOKEN,i=n!==this.eventData.tokenU;y(this.anonId)||(this.anonId=g(),i=!0);var a=this.queue.shift();if(this.eventData.lastSuccess){var o=new Date(this.eventData.lastSuccess),s=new Date(a),l=(a-this.eventData.lastSuccess)/864e5;i=i||l>=1||l<-1||o.getDate()!==s.getDate()}else i=!0;if(!i)return this.processRequests();this.postEvent(a,{\"enabled.telemetry\":!1},(function(t){t||(e.eventData.lastSuccess=a,e.eventData.tokenU=n)}),t)}},e}(et),ot=new at,st=ot.postTurnstileEvent.bind(ot),lt=new it,ct=lt.postMapLoadEvent.bind(lt),ut=\"mapbox-tiles\",ht=500,ft=50,pt=42e4;function dt(){s.caches&&!rt&&(rt=s.caches.open(ut))}function mt(t,e,r){if(dt(),rt){var n={status:e.status,statusText:e.statusText,headers:new s.Headers};e.headers.forEach((function(t,e){return n.headers.set(e,t)}));var i=E(e.headers.get(\"Cache-Control\")||\"\");i[\"no-store\"]||(i[\"max-age\"]&&n.headers.set(\"Expires\",new Date(r+1e3*i[\"max-age\"]).toUTCString()),new Date(n.headers.get(\"Expires\")).getTime()-rDate.now()&&!r[\"no-cache\"]}(n);t.delete(r),i&&t.put(r,n.clone()),e(null,n,i)})).catch(e)})).catch(e)}var vt,xt=1/0;function _t(){return null==vt&&(vt=s.OffscreenCanvas&&new s.OffscreenCanvas(1,1).getContext(\"2d\")&&\"function\"==typeof s.createImageBitmap),vt}var bt={Unknown:\"Unknown\",Style:\"Style\",Source:\"Source\",Tile:\"Tile\",Glyphs:\"Glyphs\",SpriteImage:\"SpriteImage\",SpriteJSON:\"SpriteJSON\",Image:\"Image\"};\"function\"==typeof Object.freeze&&Object.freeze(bt);var wt=function(t){function e(e,r,n){401===r&&X(n)&&(e+=\": you may have provided an invalid Mapbox access token. See https://www.mapbox.com/api-documentation/#access-tokens-and-token-scopes\"),t.call(this,e),this.status=r,this.url=n,this.name=this.constructor.name,this.message=e}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.toString=function(){return this.name+\": \"+this.message+\" (\"+this.status+\"): \"+this.url},e}(Error),Tt=S()?function(){return self.worker&&self.worker.referrer}:function(){return(\"blob:\"===s.location.protocol?s.parent:s).location.href};function kt(t,e){var r,n=new s.AbortController,i=new s.Request(t.url,{method:t.method||\"GET\",body:t.body,credentials:t.credentials,headers:t.headers,referrer:Tt(),signal:n.signal}),a=!1,o=!1,l=(r=i.url).indexOf(\"sku=\")>0&&X(r);\"json\"===t.type&&i.headers.set(\"Accept\",\"application/json\");var c=function(r,n,a){if(!o){if(r&&\"SecurityError\"!==r.message&&k(r),n&&a)return u(n);var c=Date.now();s.fetch(i).then((function(r){if(r.ok){var n=l?r.clone():null;return u(r,n,c)}return e(new wt(r.statusText,r.status,t.url))})).catch((function(t){20!==t.code&&e(new Error(t.message))}))}},u=function(r,n,s){(\"arrayBuffer\"===t.type?r.arrayBuffer():\"json\"===t.type?r.json():r.text()).then((function(t){o||(n&&s&&mt(i,n,s),a=!0,e(null,t,r.headers.get(\"Cache-Control\"),r.headers.get(\"Expires\")))})).catch((function(t){o||e(new Error(t.message))}))};return l?yt(i,c):c(null,null),{cancel:function(){o=!0,a||n.abort()}}}var At=function(t,e){if(r=t.url,!(/^file:/.test(r)||/^file:/.test(Tt())&&!/^\\w+:/.test(r))){if(s.fetch&&s.Request&&s.AbortController&&s.Request.prototype.hasOwnProperty(\"signal\"))return kt(t,e);if(S()&&self.worker&&self.worker.actor){return self.worker.actor.send(\"getResource\",t,e,void 0,!0)}}var r;return function(t,e){var r=new s.XMLHttpRequest;for(var n in r.open(t.method||\"GET\",t.url,!0),\"arrayBuffer\"===t.type&&(r.responseType=\"arraybuffer\"),t.headers)r.setRequestHeader(n,t.headers[n]);return\"json\"===t.type&&(r.responseType=\"text\",r.setRequestHeader(\"Accept\",\"application/json\")),r.withCredentials=\"include\"===t.credentials,r.onerror=function(){e(new Error(r.statusText))},r.onload=function(){if((r.status>=200&&r.status<300||0===r.status)&&null!==r.response){var n=r.response;if(\"json\"===t.type)try{n=JSON.parse(r.response)}catch(t){return e(t)}e(null,n,r.getResponseHeader(\"Cache-Control\"),r.getResponseHeader(\"Expires\"))}else e(new wt(r.statusText,r.status,t.url))},r.send(t.body),{cancel:function(){return r.abort()}}}(t,e)},Mt=function(t,e){return At(p(t,{type:\"arrayBuffer\"}),e)},St=function(t,e){return At(p(t,{method:\"POST\"}),e)};var Et,Ct,Lt=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII=\";Et=[],Ct=0;var It=function(t,e){if(U.supported&&(t.headers||(t.headers={}),t.headers.accept=\"image/webp,*/*\"),Ct>=j.MAX_PARALLEL_IMAGE_REQUESTS){var r={requestParameters:t,callback:e,cancelled:!1,cancel:function(){this.cancelled=!0}};return Et.push(r),r}Ct++;var n=!1,i=function(){if(!n)for(n=!0,Ct--;Et.length&&Ct0||this._oneTimeListeners&&this._oneTimeListeners[t]&&this._oneTimeListeners[t].length>0||this._eventedParent&&this._eventedParent.listens(t)},Rt.prototype.setEventedParent=function(t,e){return this._eventedParent=t,this._eventedParentData=e,this};var Ft={$version:8,$root:{version:{required:!0,type:\"enum\",values:[8]},name:{type:\"string\"},metadata:{type:\"*\"},center:{type:\"array\",value:\"number\"},zoom:{type:\"number\"},bearing:{type:\"number\",default:0,period:360,units:\"degrees\"},pitch:{type:\"number\",default:0,units:\"degrees\"},light:{type:\"light\"},sources:{required:!0,type:\"sources\"},sprite:{type:\"string\"},glyphs:{type:\"string\"},transition:{type:\"transition\"},layers:{required:!0,type:\"array\",value:\"layer\"}},sources:{\"*\":{type:\"source\"}},source:[\"source_vector\",\"source_raster\",\"source_raster_dem\",\"source_geojson\",\"source_video\",\"source_image\"],source_vector:{type:{required:!0,type:\"enum\",values:{vector:{}}},url:{type:\"string\"},tiles:{type:\"array\",value:\"string\"},bounds:{type:\"array\",value:\"number\",length:4,default:[-180,-85.051129,180,85.051129]},scheme:{type:\"enum\",values:{xyz:{},tms:{}},default:\"xyz\"},minzoom:{type:\"number\",default:0},maxzoom:{type:\"number\",default:22},attribution:{type:\"string\"},promoteId:{type:\"promoteId\"},volatile:{type:\"boolean\",default:!1},\"*\":{type:\"*\"}},source_raster:{type:{required:!0,type:\"enum\",values:{raster:{}}},url:{type:\"string\"},tiles:{type:\"array\",value:\"string\"},bounds:{type:\"array\",value:\"number\",length:4,default:[-180,-85.051129,180,85.051129]},minzoom:{type:\"number\",default:0},maxzoom:{type:\"number\",default:22},tileSize:{type:\"number\",default:512,units:\"pixels\"},scheme:{type:\"enum\",values:{xyz:{},tms:{}},default:\"xyz\"},attribution:{type:\"string\"},volatile:{type:\"boolean\",default:!1},\"*\":{type:\"*\"}},source_raster_dem:{type:{required:!0,type:\"enum\",values:{\"raster-dem\":{}}},url:{type:\"string\"},tiles:{type:\"array\",value:\"string\"},bounds:{type:\"array\",value:\"number\",length:4,default:[-180,-85.051129,180,85.051129]},minzoom:{type:\"number\",default:0},maxzoom:{type:\"number\",default:22},tileSize:{type:\"number\",default:512,units:\"pixels\"},attribution:{type:\"string\"},encoding:{type:\"enum\",values:{terrarium:{},mapbox:{}},default:\"mapbox\"},volatile:{type:\"boolean\",default:!1},\"*\":{type:\"*\"}},source_geojson:{type:{required:!0,type:\"enum\",values:{geojson:{}}},data:{type:\"*\"},maxzoom:{type:\"number\",default:18},attribution:{type:\"string\"},buffer:{type:\"number\",default:128,maximum:512,minimum:0},filter:{type:\"*\"},tolerance:{type:\"number\",default:.375},cluster:{type:\"boolean\",default:!1},clusterRadius:{type:\"number\",default:50,minimum:0},clusterMaxZoom:{type:\"number\"},clusterMinPoints:{type:\"number\"},clusterProperties:{type:\"*\"},lineMetrics:{type:\"boolean\",default:!1},generateId:{type:\"boolean\",default:!1},promoteId:{type:\"promoteId\"}},source_video:{type:{required:!0,type:\"enum\",values:{video:{}}},urls:{required:!0,type:\"array\",value:\"string\"},coordinates:{required:!0,type:\"array\",length:4,value:{type:\"array\",length:2,value:\"number\"}}},source_image:{type:{required:!0,type:\"enum\",values:{image:{}}},url:{required:!0,type:\"string\"},coordinates:{required:!0,type:\"array\",length:4,value:{type:\"array\",length:2,value:\"number\"}}},layer:{id:{type:\"string\",required:!0},type:{type:\"enum\",values:{fill:{},line:{},symbol:{},circle:{},heatmap:{},\"fill-extrusion\":{},raster:{},hillshade:{},background:{}},required:!0},metadata:{type:\"*\"},source:{type:\"string\"},\"source-layer\":{type:\"string\"},minzoom:{type:\"number\",minimum:0,maximum:24},maxzoom:{type:\"number\",minimum:0,maximum:24},filter:{type:\"filter\"},layout:{type:\"layout\"},paint:{type:\"paint\"}},layout:[\"layout_fill\",\"layout_line\",\"layout_circle\",\"layout_heatmap\",\"layout_fill-extrusion\",\"layout_symbol\",\"layout_raster\",\"layout_hillshade\",\"layout_background\"],layout_background:{visibility:{type:\"enum\",values:{visible:{},none:{}},default:\"visible\",\"property-type\":\"constant\"}},layout_fill:{\"fill-sort-key\":{type:\"number\",expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},visibility:{type:\"enum\",values:{visible:{},none:{}},default:\"visible\",\"property-type\":\"constant\"}},layout_circle:{\"circle-sort-key\":{type:\"number\",expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},visibility:{type:\"enum\",values:{visible:{},none:{}},default:\"visible\",\"property-type\":\"constant\"}},layout_heatmap:{visibility:{type:\"enum\",values:{visible:{},none:{}},default:\"visible\",\"property-type\":\"constant\"}},\"layout_fill-extrusion\":{visibility:{type:\"enum\",values:{visible:{},none:{}},default:\"visible\",\"property-type\":\"constant\"}},layout_line:{\"line-cap\":{type:\"enum\",values:{butt:{},round:{},square:{}},default:\"butt\",expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"line-join\":{type:\"enum\",values:{bevel:{},round:{},miter:{}},default:\"miter\",expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"line-miter-limit\":{type:\"number\",default:2,requires:[{\"line-join\":\"miter\"}],expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"line-round-limit\":{type:\"number\",default:1.05,requires:[{\"line-join\":\"round\"}],expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"line-sort-key\":{type:\"number\",expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},visibility:{type:\"enum\",values:{visible:{},none:{}},default:\"visible\",\"property-type\":\"constant\"}},layout_symbol:{\"symbol-placement\":{type:\"enum\",values:{point:{},line:{},\"line-center\":{}},default:\"point\",expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"symbol-spacing\":{type:\"number\",default:250,minimum:1,units:\"pixels\",requires:[{\"symbol-placement\":\"line\"}],expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"symbol-avoid-edges\":{type:\"boolean\",default:!1,expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"symbol-sort-key\":{type:\"number\",expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"symbol-z-order\":{type:\"enum\",values:{auto:{},\"viewport-y\":{},source:{}},default:\"auto\",expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"icon-allow-overlap\":{type:\"boolean\",default:!1,requires:[\"icon-image\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"icon-ignore-placement\":{type:\"boolean\",default:!1,requires:[\"icon-image\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"icon-optional\":{type:\"boolean\",default:!1,requires:[\"icon-image\",\"text-field\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"icon-rotation-alignment\":{type:\"enum\",values:{map:{},viewport:{},auto:{}},default:\"auto\",requires:[\"icon-image\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"icon-size\":{type:\"number\",default:1,minimum:0,units:\"factor of the original icon size\",requires:[\"icon-image\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"icon-text-fit\":{type:\"enum\",values:{none:{},width:{},height:{},both:{}},default:\"none\",requires:[\"icon-image\",\"text-field\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"icon-text-fit-padding\":{type:\"array\",value:\"number\",length:4,default:[0,0,0,0],units:\"pixels\",requires:[\"icon-image\",\"text-field\",{\"icon-text-fit\":[\"both\",\"width\",\"height\"]}],expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"icon-image\":{type:\"resolvedImage\",tokens:!0,expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"icon-rotate\":{type:\"number\",default:0,period:360,units:\"degrees\",requires:[\"icon-image\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"icon-padding\":{type:\"number\",default:2,minimum:0,units:\"pixels\",requires:[\"icon-image\"],expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"icon-keep-upright\":{type:\"boolean\",default:!1,requires:[\"icon-image\",{\"icon-rotation-alignment\":\"map\"},{\"symbol-placement\":[\"line\",\"line-center\"]}],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"icon-offset\":{type:\"array\",value:\"number\",length:2,default:[0,0],requires:[\"icon-image\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"icon-anchor\":{type:\"enum\",values:{center:{},left:{},right:{},top:{},bottom:{},\"top-left\":{},\"top-right\":{},\"bottom-left\":{},\"bottom-right\":{}},default:\"center\",requires:[\"icon-image\"],expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"icon-pitch-alignment\":{type:\"enum\",values:{map:{},viewport:{},auto:{}},default:\"auto\",requires:[\"icon-image\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-pitch-alignment\":{type:\"enum\",values:{map:{},viewport:{},auto:{}},default:\"auto\",requires:[\"text-field\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-rotation-alignment\":{type:\"enum\",values:{map:{},viewport:{},auto:{}},default:\"auto\",requires:[\"text-field\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-field\":{type:\"formatted\",default:\"\",tokens:!0,expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-font\":{type:\"array\",value:\"string\",default:[\"Open Sans Regular\",\"Arial Unicode MS Regular\"],requires:[\"text-field\"],expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-size\":{type:\"number\",default:16,minimum:0,units:\"pixels\",requires:[\"text-field\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-max-width\":{type:\"number\",default:10,minimum:0,units:\"ems\",requires:[\"text-field\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-line-height\":{type:\"number\",default:1.2,units:\"ems\",requires:[\"text-field\"],expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-letter-spacing\":{type:\"number\",default:0,units:\"ems\",requires:[\"text-field\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-justify\":{type:\"enum\",values:{auto:{},left:{},center:{},right:{}},default:\"center\",requires:[\"text-field\"],expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-radial-offset\":{type:\"number\",units:\"ems\",default:0,requires:[\"text-field\"],\"property-type\":\"data-driven\",expression:{interpolated:!0,parameters:[\"zoom\",\"feature\"]}},\"text-variable-anchor\":{type:\"array\",value:\"enum\",values:{center:{},left:{},right:{},top:{},bottom:{},\"top-left\":{},\"top-right\":{},\"bottom-left\":{},\"bottom-right\":{}},requires:[\"text-field\",{\"symbol-placement\":[\"point\"]}],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-anchor\":{type:\"enum\",values:{center:{},left:{},right:{},top:{},bottom:{},\"top-left\":{},\"top-right\":{},\"bottom-left\":{},\"bottom-right\":{}},default:\"center\",requires:[\"text-field\",{\"!\":\"text-variable-anchor\"}],expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-max-angle\":{type:\"number\",default:45,units:\"degrees\",requires:[\"text-field\",{\"symbol-placement\":[\"line\",\"line-center\"]}],expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-writing-mode\":{type:\"array\",value:\"enum\",values:{horizontal:{},vertical:{}},requires:[\"text-field\",{\"symbol-placement\":[\"point\"]}],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-rotate\":{type:\"number\",default:0,period:360,units:\"degrees\",requires:[\"text-field\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-padding\":{type:\"number\",default:2,minimum:0,units:\"pixels\",requires:[\"text-field\"],expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-keep-upright\":{type:\"boolean\",default:!0,requires:[\"text-field\",{\"text-rotation-alignment\":\"map\"},{\"symbol-placement\":[\"line\",\"line-center\"]}],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-transform\":{type:\"enum\",values:{none:{},uppercase:{},lowercase:{}},default:\"none\",requires:[\"text-field\"],expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-offset\":{type:\"array\",value:\"number\",units:\"ems\",length:2,default:[0,0],requires:[\"text-field\",{\"!\":\"text-radial-offset\"}],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-allow-overlap\":{type:\"boolean\",default:!1,requires:[\"text-field\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-ignore-placement\":{type:\"boolean\",default:!1,requires:[\"text-field\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-optional\":{type:\"boolean\",default:!1,requires:[\"text-field\",\"icon-image\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},visibility:{type:\"enum\",values:{visible:{},none:{}},default:\"visible\",\"property-type\":\"constant\"}},layout_raster:{visibility:{type:\"enum\",values:{visible:{},none:{}},default:\"visible\",\"property-type\":\"constant\"}},layout_hillshade:{visibility:{type:\"enum\",values:{visible:{},none:{}},default:\"visible\",\"property-type\":\"constant\"}},filter:{type:\"array\",value:\"*\"},filter_operator:{type:\"enum\",values:{\"==\":{},\"!=\":{},\">\":{},\">=\":{},\"<\":{},\"<=\":{},in:{},\"!in\":{},all:{},any:{},none:{},has:{},\"!has\":{},within:{}}},geometry_type:{type:\"enum\",values:{Point:{},LineString:{},Polygon:{}}},function:{expression:{type:\"expression\"},stops:{type:\"array\",value:\"function_stop\"},base:{type:\"number\",default:1,minimum:0},property:{type:\"string\",default:\"$zoom\"},type:{type:\"enum\",values:{identity:{},exponential:{},interval:{},categorical:{}},default:\"exponential\"},colorSpace:{type:\"enum\",values:{rgb:{},lab:{},hcl:{}},default:\"rgb\"},default:{type:\"*\",required:!1}},function_stop:{type:\"array\",minimum:0,maximum:24,value:[\"number\",\"color\"],length:2},expression:{type:\"array\",value:\"*\",minimum:1},light:{anchor:{type:\"enum\",default:\"viewport\",values:{map:{},viewport:{}},\"property-type\":\"data-constant\",transition:!1,expression:{interpolated:!1,parameters:[\"zoom\"]}},position:{type:\"array\",default:[1.15,210,30],length:3,value:\"number\",\"property-type\":\"data-constant\",transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]}},color:{type:\"color\",\"property-type\":\"data-constant\",default:\"#ffffff\",expression:{interpolated:!0,parameters:[\"zoom\"]},transition:!0},intensity:{type:\"number\",\"property-type\":\"data-constant\",default:.5,minimum:0,maximum:1,expression:{interpolated:!0,parameters:[\"zoom\"]},transition:!0}},paint:[\"paint_fill\",\"paint_line\",\"paint_circle\",\"paint_heatmap\",\"paint_fill-extrusion\",\"paint_symbol\",\"paint_raster\",\"paint_hillshade\",\"paint_background\"],paint_fill:{\"fill-antialias\":{type:\"boolean\",default:!0,expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"fill-opacity\":{type:\"number\",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"fill-color\":{type:\"color\",default:\"#000000\",transition:!0,requires:[{\"!\":\"fill-pattern\"}],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"fill-outline-color\":{type:\"color\",transition:!0,requires:[{\"!\":\"fill-pattern\"},{\"fill-antialias\":!0}],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"fill-translate\":{type:\"array\",value:\"number\",length:2,default:[0,0],transition:!0,units:\"pixels\",expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"fill-translate-anchor\":{type:\"enum\",values:{map:{},viewport:{}},default:\"map\",requires:[\"fill-translate\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"fill-pattern\":{type:\"resolvedImage\",transition:!0,expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"cross-faded-data-driven\"}},\"paint_fill-extrusion\":{\"fill-extrusion-opacity\":{type:\"number\",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"fill-extrusion-color\":{type:\"color\",default:\"#000000\",transition:!0,requires:[{\"!\":\"fill-extrusion-pattern\"}],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"fill-extrusion-translate\":{type:\"array\",value:\"number\",length:2,default:[0,0],transition:!0,units:\"pixels\",expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"fill-extrusion-translate-anchor\":{type:\"enum\",values:{map:{},viewport:{}},default:\"map\",requires:[\"fill-extrusion-translate\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"fill-extrusion-pattern\":{type:\"resolvedImage\",transition:!0,expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"cross-faded-data-driven\"},\"fill-extrusion-height\":{type:\"number\",default:0,minimum:0,units:\"meters\",transition:!0,expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"fill-extrusion-base\":{type:\"number\",default:0,minimum:0,units:\"meters\",transition:!0,requires:[\"fill-extrusion-height\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"fill-extrusion-vertical-gradient\":{type:\"boolean\",default:!0,transition:!1,expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"}},paint_line:{\"line-opacity\":{type:\"number\",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"line-color\":{type:\"color\",default:\"#000000\",transition:!0,requires:[{\"!\":\"line-pattern\"}],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"line-translate\":{type:\"array\",value:\"number\",length:2,default:[0,0],transition:!0,units:\"pixels\",expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"line-translate-anchor\":{type:\"enum\",values:{map:{},viewport:{}},default:\"map\",requires:[\"line-translate\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"line-width\":{type:\"number\",default:1,minimum:0,transition:!0,units:\"pixels\",expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"line-gap-width\":{type:\"number\",default:0,minimum:0,transition:!0,units:\"pixels\",expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"line-offset\":{type:\"number\",default:0,transition:!0,units:\"pixels\",expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"line-blur\":{type:\"number\",default:0,minimum:0,transition:!0,units:\"pixels\",expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"line-dasharray\":{type:\"array\",value:\"number\",minimum:0,transition:!0,units:\"line widths\",requires:[{\"!\":\"line-pattern\"}],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"cross-faded\"},\"line-pattern\":{type:\"resolvedImage\",transition:!0,expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"cross-faded-data-driven\"},\"line-gradient\":{type:\"color\",transition:!1,requires:[{\"!\":\"line-dasharray\"},{\"!\":\"line-pattern\"},{source:\"geojson\",has:{lineMetrics:!0}}],expression:{interpolated:!0,parameters:[\"line-progress\"]},\"property-type\":\"color-ramp\"}},paint_circle:{\"circle-radius\":{type:\"number\",default:5,minimum:0,transition:!0,units:\"pixels\",expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"circle-color\":{type:\"color\",default:\"#000000\",transition:!0,expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"circle-blur\":{type:\"number\",default:0,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"circle-opacity\":{type:\"number\",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"circle-translate\":{type:\"array\",value:\"number\",length:2,default:[0,0],transition:!0,units:\"pixels\",expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"circle-translate-anchor\":{type:\"enum\",values:{map:{},viewport:{}},default:\"map\",requires:[\"circle-translate\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"circle-pitch-scale\":{type:\"enum\",values:{map:{},viewport:{}},default:\"map\",expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"circle-pitch-alignment\":{type:\"enum\",values:{map:{},viewport:{}},default:\"viewport\",expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"circle-stroke-width\":{type:\"number\",default:0,minimum:0,transition:!0,units:\"pixels\",expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"circle-stroke-color\":{type:\"color\",default:\"#000000\",transition:!0,expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"circle-stroke-opacity\":{type:\"number\",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"}},paint_heatmap:{\"heatmap-radius\":{type:\"number\",default:30,minimum:1,transition:!0,units:\"pixels\",expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"heatmap-weight\":{type:\"number\",default:1,minimum:0,transition:!1,expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"heatmap-intensity\":{type:\"number\",default:1,minimum:0,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"heatmap-color\":{type:\"color\",default:[\"interpolate\",[\"linear\"],[\"heatmap-density\"],0,\"rgba(0, 0, 255, 0)\",.1,\"royalblue\",.3,\"cyan\",.5,\"lime\",.7,\"yellow\",1,\"red\"],transition:!1,expression:{interpolated:!0,parameters:[\"heatmap-density\"]},\"property-type\":\"color-ramp\"},\"heatmap-opacity\":{type:\"number\",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"}},paint_symbol:{\"icon-opacity\":{type:\"number\",default:1,minimum:0,maximum:1,transition:!0,requires:[\"icon-image\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"icon-color\":{type:\"color\",default:\"#000000\",transition:!0,requires:[\"icon-image\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"icon-halo-color\":{type:\"color\",default:\"rgba(0, 0, 0, 0)\",transition:!0,requires:[\"icon-image\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"icon-halo-width\":{type:\"number\",default:0,minimum:0,transition:!0,units:\"pixels\",requires:[\"icon-image\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"icon-halo-blur\":{type:\"number\",default:0,minimum:0,transition:!0,units:\"pixels\",requires:[\"icon-image\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"icon-translate\":{type:\"array\",value:\"number\",length:2,default:[0,0],transition:!0,units:\"pixels\",requires:[\"icon-image\"],expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"icon-translate-anchor\":{type:\"enum\",values:{map:{},viewport:{}},default:\"map\",requires:[\"icon-image\",\"icon-translate\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-opacity\":{type:\"number\",default:1,minimum:0,maximum:1,transition:!0,requires:[\"text-field\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"text-color\":{type:\"color\",default:\"#000000\",transition:!0,overridable:!0,requires:[\"text-field\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"text-halo-color\":{type:\"color\",default:\"rgba(0, 0, 0, 0)\",transition:!0,requires:[\"text-field\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"text-halo-width\":{type:\"number\",default:0,minimum:0,transition:!0,units:\"pixels\",requires:[\"text-field\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"text-halo-blur\":{type:\"number\",default:0,minimum:0,transition:!0,units:\"pixels\",requires:[\"text-field\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"text-translate\":{type:\"array\",value:\"number\",length:2,default:[0,0],transition:!0,units:\"pixels\",requires:[\"text-field\"],expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-translate-anchor\":{type:\"enum\",values:{map:{},viewport:{}},default:\"map\",requires:[\"text-field\",\"text-translate\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"}},paint_raster:{\"raster-opacity\":{type:\"number\",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"raster-hue-rotate\":{type:\"number\",default:0,period:360,transition:!0,units:\"degrees\",expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"raster-brightness-min\":{type:\"number\",default:0,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"raster-brightness-max\":{type:\"number\",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"raster-saturation\":{type:\"number\",default:0,minimum:-1,maximum:1,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"raster-contrast\":{type:\"number\",default:0,minimum:-1,maximum:1,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"raster-resampling\":{type:\"enum\",values:{linear:{},nearest:{}},default:\"linear\",expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"raster-fade-duration\":{type:\"number\",default:300,minimum:0,transition:!1,units:\"milliseconds\",expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"}},paint_hillshade:{\"hillshade-illumination-direction\":{type:\"number\",default:335,minimum:0,maximum:359,transition:!1,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"hillshade-illumination-anchor\":{type:\"enum\",values:{map:{},viewport:{}},default:\"viewport\",expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"hillshade-exaggeration\":{type:\"number\",default:.5,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"hillshade-shadow-color\":{type:\"color\",default:\"#000000\",transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"hillshade-highlight-color\":{type:\"color\",default:\"#FFFFFF\",transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"hillshade-accent-color\":{type:\"color\",default:\"#000000\",transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"}},paint_background:{\"background-color\":{type:\"color\",default:\"#000000\",transition:!0,requires:[{\"!\":\"background-pattern\"}],expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"background-pattern\":{type:\"resolvedImage\",transition:!0,expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"cross-faded\"},\"background-opacity\":{type:\"number\",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"}},transition:{duration:{type:\"number\",default:300,minimum:0,units:\"milliseconds\"},delay:{type:\"number\",default:0,minimum:0,units:\"milliseconds\"}},\"property-type\":{\"data-driven\":{type:\"property-type\"},\"cross-faded\":{type:\"property-type\"},\"cross-faded-data-driven\":{type:\"property-type\"},\"color-ramp\":{type:\"property-type\"},\"data-constant\":{type:\"property-type\"},constant:{type:\"property-type\"}},promoteId:{\"*\":{type:\"string\"}}},Bt=function(t,e,r,n){this.message=(t?t+\": \":\"\")+r,n&&(this.identifier=n),null!=e&&e.__line__&&(this.line=e.__line__)};function Nt(t){var e=t.key,r=t.value;return r?[new Bt(e,r,\"constants have been deprecated as of v8\")]:[]}function jt(t){for(var e=[],r=arguments.length-1;r-- >0;)e[r]=arguments[r+1];for(var n=0,i=e;n\":\"value\"===t.itemType.kind?\"array\":\"array<\"+e+\">\"}return t.kind}var ne=[Gt,Zt,Wt,Yt,Xt,Qt,$t,ee(Jt),te];function ie(t,e){if(\"error\"===e.kind)return null;if(\"array\"===t.kind){if(\"array\"===e.kind&&(0===e.N&&\"value\"===e.itemType.kind||!ie(t.itemType,e.itemType))&&(\"number\"!=typeof t.N||t.N===e.N))return null}else{if(t.kind===e.kind)return null;if(\"value\"===t.kind)for(var r=0,n=ne;r255?255:t}function i(t){return t<0?0:t>1?1:t}function a(t){return\"%\"===t[t.length-1]?n(parseFloat(t)/100*255):n(parseInt(t))}function o(t){return\"%\"===t[t.length-1]?i(parseFloat(t)/100):i(parseFloat(t))}function s(t,e,r){return r<0?r+=1:r>1&&(r-=1),6*r<1?t+(e-t)*r*6:2*r<1?e:3*r<2?t+(e-t)*(2/3-r)*6:t}try{e.parseCSSColor=function(t){var e,i=t.replace(/ /g,\"\").toLowerCase();if(i in r)return r[i].slice();if(\"#\"===i[0])return 4===i.length?(e=parseInt(i.substr(1),16))>=0&&e<=4095?[(3840&e)>>4|(3840&e)>>8,240&e|(240&e)>>4,15&e|(15&e)<<4,1]:null:7===i.length&&(e=parseInt(i.substr(1),16))>=0&&e<=16777215?[(16711680&e)>>16,(65280&e)>>8,255&e,1]:null;var l=i.indexOf(\"(\"),c=i.indexOf(\")\");if(-1!==l&&c+1===i.length){var u=i.substr(0,l),h=i.substr(l+1,c-(l+1)).split(\",\"),f=1;switch(u){case\"rgba\":if(4!==h.length)return null;f=o(h.pop());case\"rgb\":return 3!==h.length?null:[a(h[0]),a(h[1]),a(h[2]),f];case\"hsla\":if(4!==h.length)return null;f=o(h.pop());case\"hsl\":if(3!==h.length)return null;var p=(parseFloat(h[0])%360+360)%360/360,d=o(h[1]),m=o(h[2]),g=m<=.5?m*(d+1):m+d-m*d,y=2*m-g;return[n(255*s(y,g,p+1/3)),n(255*s(y,g,p)),n(255*s(y,g,p-1/3)),f];default:return null}}return null}}catch(t){}})),le=se.parseCSSColor,ce=function(t,e,r,n){void 0===n&&(n=1),this.r=t,this.g=e,this.b=r,this.a=n};ce.parse=function(t){if(t){if(t instanceof ce)return t;if(\"string\"==typeof t){var e=le(t);if(e)return new ce(e[0]/255*e[3],e[1]/255*e[3],e[2]/255*e[3],e[3])}}},ce.prototype.toString=function(){var t=this.toArray(),e=t[0],r=t[1],n=t[2],i=t[3];return\"rgba(\"+Math.round(e)+\",\"+Math.round(r)+\",\"+Math.round(n)+\",\"+i+\")\"},ce.prototype.toArray=function(){var t=this,e=t.r,r=t.g,n=t.b,i=t.a;return 0===i?[0,0,0,0]:[255*e/i,255*r/i,255*n/i,i]},ce.black=new ce(0,0,0,1),ce.white=new ce(1,1,1,1),ce.transparent=new ce(0,0,0,0),ce.red=new ce(1,0,0,1);var ue=function(t,e,r){this.sensitivity=t?e?\"variant\":\"case\":e?\"accent\":\"base\",this.locale=r,this.collator=new Intl.Collator(this.locale?this.locale:[],{sensitivity:this.sensitivity,usage:\"search\"})};ue.prototype.compare=function(t,e){return this.collator.compare(t,e)},ue.prototype.resolvedLocale=function(){return new Intl.Collator(this.locale?this.locale:[]).resolvedOptions().locale};var he=function(t,e,r,n,i){this.text=t,this.image=e,this.scale=r,this.fontStack=n,this.textColor=i},fe=function(t){this.sections=t};fe.fromString=function(t){return new fe([new he(t,null,null,null,null)])},fe.prototype.isEmpty=function(){return 0===this.sections.length||!this.sections.some((function(t){return 0!==t.text.length||t.image&&0!==t.image.name.length}))},fe.factory=function(t){return t instanceof fe?t:fe.fromString(t)},fe.prototype.toString=function(){return 0===this.sections.length?\"\":this.sections.map((function(t){return t.text})).join(\"\")},fe.prototype.serialize=function(){for(var t=[\"format\"],e=0,r=this.sections;e=0&&t<=255&&\"number\"==typeof e&&e>=0&&e<=255&&\"number\"==typeof r&&r>=0&&r<=255?void 0===n||\"number\"==typeof n&&n>=0&&n<=1?null:\"Invalid rgba value [\"+[t,e,r,n].join(\", \")+\"]: 'a' must be between 0 and 1.\":\"Invalid rgba value [\"+(\"number\"==typeof n?[t,e,r,n]:[t,e,r]).join(\", \")+\"]: 'r', 'g', and 'b' must be between 0 and 255.\"}function me(t){if(null===t)return!0;if(\"string\"==typeof t)return!0;if(\"boolean\"==typeof t)return!0;if(\"number\"==typeof t)return!0;if(t instanceof ce)return!0;if(t instanceof ue)return!0;if(t instanceof fe)return!0;if(t instanceof pe)return!0;if(Array.isArray(t)){for(var e=0,r=t;e2){var s=t[1];if(\"string\"!=typeof s||!(s in _e)||\"object\"===s)return e.error('The item type argument of \"array\" must be one of string, number, boolean',1);a=_e[s],n++}else a=Jt;if(t.length>3){if(null!==t[2]&&(\"number\"!=typeof t[2]||t[2]<0||t[2]!==Math.floor(t[2])))return e.error('The length argument to \"array\" must be a positive integer literal',2);o=t[2],n++}r=ee(a,o)}else r=_e[i];for(var l=[];n1)&&e.push(n)}}return e.concat(this.args.map((function(t){return t.serialize()})))};var we=function(t){this.type=Qt,this.sections=t};we.parse=function(t,e){if(t.length<2)return e.error(\"Expected at least one argument.\");var r=t[1];if(!Array.isArray(r)&&\"object\"==typeof r)return e.error(\"First argument must be an image or text section.\");for(var n=[],i=!1,a=1;a<=t.length-1;++a){var o=t[a];if(i&&\"object\"==typeof o&&!Array.isArray(o)){i=!1;var s=null;if(o[\"font-scale\"]&&!(s=e.parse(o[\"font-scale\"],1,Zt)))return null;var l=null;if(o[\"text-font\"]&&!(l=e.parse(o[\"text-font\"],1,ee(Wt))))return null;var c=null;if(o[\"text-color\"]&&!(c=e.parse(o[\"text-color\"],1,Xt)))return null;var u=n[n.length-1];u.scale=s,u.font=l,u.textColor=c}else{var h=e.parse(t[a],1,Jt);if(!h)return null;var f=h.type.kind;if(\"string\"!==f&&\"value\"!==f&&\"null\"!==f&&\"resolvedImage\"!==f)return e.error(\"Formatted text type must be 'string', 'value', 'image' or 'null'.\");i=!0,n.push({content:h,scale:null,font:null,textColor:null})}}return new we(n)},we.prototype.evaluate=function(t){return new fe(this.sections.map((function(e){var r=e.content.evaluate(t);return ge(r)===te?new he(\"\",r,null,null,null):new he(ye(r),null,e.scale?e.scale.evaluate(t):null,e.font?e.font.evaluate(t).join(\",\"):null,e.textColor?e.textColor.evaluate(t):null)})))},we.prototype.eachChild=function(t){for(var e=0,r=this.sections;e-1),r},Te.prototype.eachChild=function(t){t(this.input)},Te.prototype.outputDefined=function(){return!1},Te.prototype.serialize=function(){return[\"image\",this.input.serialize()]};var ke={\"to-boolean\":Yt,\"to-color\":Xt,\"to-number\":Zt,\"to-string\":Wt},Ae=function(t,e){this.type=t,this.args=e};Ae.parse=function(t,e){if(t.length<2)return e.error(\"Expected at least one argument.\");var r=t[0];if((\"to-boolean\"===r||\"to-string\"===r)&&2!==t.length)return e.error(\"Expected one argument.\");for(var n=ke[r],i=[],a=1;a4?\"Invalid rbga value \"+JSON.stringify(e)+\": expected an array containing either three or four numeric values.\":de(e[0],e[1],e[2],e[3])))return new ce(e[0]/255,e[1]/255,e[2]/255,e[3])}throw new xe(r||\"Could not parse color from value '\"+(\"string\"==typeof e?e:String(JSON.stringify(e)))+\"'\")}if(\"number\"===this.type.kind){for(var o=null,s=0,l=this.args;s=e[2]||t[1]<=e[1]||t[3]>=e[3])}function ze(t,e){var r,n=(180+t[0])/360,i=(r=t[1],(180-180/Math.PI*Math.log(Math.tan(Math.PI/4+r*Math.PI/360)))/360),a=Math.pow(2,e.z);return[Math.round(n*a*Le),Math.round(i*a*Le)]}function Oe(t,e,r){return e[1]>t[1]!=r[1]>t[1]&&t[0]<(r[0]-e[0])*(t[1]-e[1])/(r[1]-e[1])+e[0]}function De(t,e){for(var r=!1,n=0,i=e.length;n0&&h<0||u<0&&h>0}function Be(t,e,r){for(var n=0,i=r;nr[2]){var i=.5*n,a=t[0]-r[0]>i?-n:r[0]-t[0]>i?n:0;0===a&&(a=t[0]-r[2]>i?-n:r[2]-t[0]>i?n:0),t[0]+=a}Ie(e,t)}function He(t,e,r,n){for(var i=Math.pow(2,n.z)*Le,a=[n.x*Le,n.y*Le],o=[],s=0,l=t;s=0)return!1;var r=!0;return t.eachChild((function(t){r&&!Xe(t,e)&&(r=!1)})),r}Ze.parse=function(t,e){if(2!==t.length)return e.error(\"'within' expression requires exactly one argument, but found \"+(t.length-1)+\" instead.\");if(me(t[1])){var r=t[1];if(\"FeatureCollection\"===r.type)for(var n=0;ne))throw new xe(\"Input is not a number.\");o=s-1}return 0}Je.prototype.parse=function(t,e,r,n,i){return void 0===i&&(i={}),e?this.concat(e,r,n)._parse(t,i):this._parse(t,i)},Je.prototype._parse=function(t,e){function r(t,e,r){return\"assert\"===r?new be(e,[t]):\"coerce\"===r?new Ae(e,[t]):t}if(null!==t&&\"string\"!=typeof t&&\"boolean\"!=typeof t&&\"number\"!=typeof t||(t=[\"literal\",t]),Array.isArray(t)){if(0===t.length)return this.error('Expected an array with at least one element. If you wanted a literal array, use [\"literal\", []].');var n=t[0];if(\"string\"!=typeof n)return this.error(\"Expression name must be a string, but found \"+typeof n+' instead. If you wanted a literal array, use [\"literal\", [...]].',0),null;var i=this.registry[n];if(i){var a=i.parse(t,this);if(!a)return null;if(this.expectedType){var o=this.expectedType,s=a.type;if(\"string\"!==o.kind&&\"number\"!==o.kind&&\"boolean\"!==o.kind&&\"object\"!==o.kind&&\"array\"!==o.kind||\"value\"!==s.kind)if(\"color\"!==o.kind&&\"formatted\"!==o.kind&&\"resolvedImage\"!==o.kind||\"value\"!==s.kind&&\"string\"!==s.kind){if(this.checkSubtype(o,s))return null}else a=r(a,o,e.typeAnnotation||\"coerce\");else a=r(a,o,e.typeAnnotation||\"assert\")}if(!(a instanceof ve)&&\"resolvedImage\"!==a.type.kind&&Ke(a)){var l=new Se;try{a=new ve(a.type,a.evaluate(l))}catch(t){return this.error(t.message),null}}return a}return this.error('Unknown expression \"'+n+'\". If you wanted a literal array, use [\"literal\", [...]].',0)}return void 0===t?this.error(\"'undefined' value invalid. Use null instead.\"):\"object\"==typeof t?this.error('Bare objects invalid. Use [\"literal\", {...}] instead.'):this.error(\"Expected an array, but found \"+typeof t+\" instead.\")},Je.prototype.concat=function(t,e,r){var n=\"number\"==typeof t?this.path.concat(t):this.path,i=r?this.scope.concat(r):this.scope;return new Je(this.registry,n,e||null,i,this.errors)},Je.prototype.error=function(t){for(var e=[],r=arguments.length-1;r-- >0;)e[r]=arguments[r+1];var n=\"\"+this.key+e.map((function(t){return\"[\"+t+\"]\"})).join(\"\");this.errors.push(new qt(n,t))},Je.prototype.checkSubtype=function(t,e){var r=ie(t,e);return r&&this.error(r),r};var tr=function(t,e,r){this.type=t,this.input=e,this.labels=[],this.outputs=[];for(var n=0,i=r;n=o)return e.error('Input/output pairs for \"step\" expressions must be arranged with input values in strictly ascending order.',l);var u=e.parse(s,c,i);if(!u)return null;i=i||u.type,n.push([o,u])}return new tr(i,r,n)},tr.prototype.evaluate=function(t){var e=this.labels,r=this.outputs;if(1===e.length)return r[0].evaluate(t);var n=this.input.evaluate(t);if(n<=e[0])return r[0].evaluate(t);var i=e.length;return n>=e[i-1]?r[i-1].evaluate(t):r[Qe(e,n)].evaluate(t)},tr.prototype.eachChild=function(t){t(this.input);for(var e=0,r=this.outputs;e0&&t.push(this.labels[e]),t.push(this.outputs[e].serialize());return t};var rr=Object.freeze({__proto__:null,number:er,color:function(t,e,r){return new ce(er(t.r,e.r,r),er(t.g,e.g,r),er(t.b,e.b,r),er(t.a,e.a,r))},array:function(t,e,r){return t.map((function(t,n){return er(t,e[n],r)}))}}),nr=.95047,ir=1,ar=1.08883,or=4/29,sr=6/29,lr=3*sr*sr,cr=sr*sr*sr,ur=Math.PI/180,hr=180/Math.PI;function fr(t){return t>cr?Math.pow(t,1/3):t/lr+or}function pr(t){return t>sr?t*t*t:lr*(t-or)}function dr(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function mr(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function gr(t){var e=mr(t.r),r=mr(t.g),n=mr(t.b),i=fr((.4124564*e+.3575761*r+.1804375*n)/nr),a=fr((.2126729*e+.7151522*r+.072175*n)/ir);return{l:116*a-16,a:500*(i-a),b:200*(a-fr((.0193339*e+.119192*r+.9503041*n)/ar)),alpha:t.a}}function yr(t){var e=(t.l+16)/116,r=isNaN(t.a)?e:e+t.a/500,n=isNaN(t.b)?e:e-t.b/200;return e=ir*pr(e),r=nr*pr(r),n=ar*pr(n),new ce(dr(3.2404542*r-1.5371385*e-.4985314*n),dr(-.969266*r+1.8760108*e+.041556*n),dr(.0556434*r-.2040259*e+1.0572252*n),t.alpha)}function vr(t,e,r){var n=e-t;return t+r*(n>180||n<-180?n-360*Math.round(n/360):n)}var xr={forward:gr,reverse:yr,interpolate:function(t,e,r){return{l:er(t.l,e.l,r),a:er(t.a,e.a,r),b:er(t.b,e.b,r),alpha:er(t.alpha,e.alpha,r)}}},_r={forward:function(t){var e=gr(t),r=e.l,n=e.a,i=e.b,a=Math.atan2(i,n)*hr;return{h:a<0?a+360:a,c:Math.sqrt(n*n+i*i),l:r,alpha:t.a}},reverse:function(t){var e=t.h*ur,r=t.c;return yr({l:t.l,a:Math.cos(e)*r,b:Math.sin(e)*r,alpha:t.alpha})},interpolate:function(t,e,r){return{h:vr(t.h,e.h,r),c:er(t.c,e.c,r),l:er(t.l,e.l,r),alpha:er(t.alpha,e.alpha,r)}}},br=Object.freeze({__proto__:null,lab:xr,hcl:_r}),wr=function(t,e,r,n,i){this.type=t,this.operator=e,this.interpolation=r,this.input=n,this.labels=[],this.outputs=[];for(var a=0,o=i;a1})))return e.error(\"Cubic bezier interpolation requires four numeric arguments with values between 0 and 1.\",1);n={name:\"cubic-bezier\",controlPoints:s}}if(t.length-1<4)return e.error(\"Expected at least 4 arguments, but found only \"+(t.length-1)+\".\");if((t.length-1)%2!=0)return e.error(\"Expected an even number of arguments.\");if(!(i=e.parse(i,2,Zt)))return null;var l=[],c=null;\"interpolate-hcl\"===r||\"interpolate-lab\"===r?c=Xt:e.expectedType&&\"value\"!==e.expectedType.kind&&(c=e.expectedType);for(var u=0;u=h)return e.error('Input/output pairs for \"interpolate\" expressions must be arranged with input values in strictly ascending order.',p);var m=e.parse(f,d,c);if(!m)return null;c=c||m.type,l.push([h,m])}return\"number\"===c.kind||\"color\"===c.kind||\"array\"===c.kind&&\"number\"===c.itemType.kind&&\"number\"==typeof c.N?new wr(c,r,n,i,l):e.error(\"Type \"+re(c)+\" is not interpolatable.\")},wr.prototype.evaluate=function(t){var e=this.labels,r=this.outputs;if(1===e.length)return r[0].evaluate(t);var n=this.input.evaluate(t);if(n<=e[0])return r[0].evaluate(t);var i=e.length;if(n>=e[i-1])return r[i-1].evaluate(t);var a=Qe(e,n),o=e[a],s=e[a+1],l=wr.interpolationFactor(this.interpolation,n,o,s),c=r[a].evaluate(t),u=r[a+1].evaluate(t);return\"interpolate\"===this.operator?rr[this.type.kind.toLowerCase()](c,u,l):\"interpolate-hcl\"===this.operator?_r.reverse(_r.interpolate(_r.forward(c),_r.forward(u),l)):xr.reverse(xr.interpolate(xr.forward(c),xr.forward(u),l))},wr.prototype.eachChild=function(t){t(this.input);for(var e=0,r=this.outputs;e=r.length)throw new xe(\"Array index out of bounds: \"+e+\" > \"+(r.length-1)+\".\");if(e!==Math.floor(e))throw new xe(\"Array index must be an integer, but found \"+e+\" instead.\");return r[e]},Mr.prototype.eachChild=function(t){t(this.index),t(this.input)},Mr.prototype.outputDefined=function(){return!1},Mr.prototype.serialize=function(){return[\"at\",this.index.serialize(),this.input.serialize()]};var Sr=function(t,e){this.type=Yt,this.needle=t,this.haystack=e};Sr.parse=function(t,e){if(3!==t.length)return e.error(\"Expected 2 arguments, but found \"+(t.length-1)+\" instead.\");var r=e.parse(t[1],1,Jt),n=e.parse(t[2],2,Jt);return r&&n?ae(r.type,[Yt,Wt,Zt,Gt,Jt])?new Sr(r,n):e.error(\"Expected first argument to be of type boolean, string, number or null, but found \"+re(r.type)+\" instead\"):null},Sr.prototype.evaluate=function(t){var e=this.needle.evaluate(t),r=this.haystack.evaluate(t);if(!r)return!1;if(!oe(e,[\"boolean\",\"string\",\"number\",\"null\"]))throw new xe(\"Expected first argument to be of type boolean, string, number or null, but found \"+re(ge(e))+\" instead.\");if(!oe(r,[\"string\",\"array\"]))throw new xe(\"Expected second argument to be of type array or string, but found \"+re(ge(r))+\" instead.\");return r.indexOf(e)>=0},Sr.prototype.eachChild=function(t){t(this.needle),t(this.haystack)},Sr.prototype.outputDefined=function(){return!0},Sr.prototype.serialize=function(){return[\"in\",this.needle.serialize(),this.haystack.serialize()]};var Er=function(t,e,r){this.type=Zt,this.needle=t,this.haystack=e,this.fromIndex=r};Er.parse=function(t,e){if(t.length<=2||t.length>=5)return e.error(\"Expected 3 or 4 arguments, but found \"+(t.length-1)+\" instead.\");var r=e.parse(t[1],1,Jt),n=e.parse(t[2],2,Jt);if(!r||!n)return null;if(!ae(r.type,[Yt,Wt,Zt,Gt,Jt]))return e.error(\"Expected first argument to be of type boolean, string, number or null, but found \"+re(r.type)+\" instead\");if(4===t.length){var i=e.parse(t[3],3,Zt);return i?new Er(r,n,i):null}return new Er(r,n)},Er.prototype.evaluate=function(t){var e=this.needle.evaluate(t),r=this.haystack.evaluate(t);if(!oe(e,[\"boolean\",\"string\",\"number\",\"null\"]))throw new xe(\"Expected first argument to be of type boolean, string, number or null, but found \"+re(ge(e))+\" instead.\");if(!oe(r,[\"string\",\"array\"]))throw new xe(\"Expected second argument to be of type array or string, but found \"+re(ge(r))+\" instead.\");if(this.fromIndex){var n=this.fromIndex.evaluate(t);return r.indexOf(e,n)}return r.indexOf(e)},Er.prototype.eachChild=function(t){t(this.needle),t(this.haystack),this.fromIndex&&t(this.fromIndex)},Er.prototype.outputDefined=function(){return!1},Er.prototype.serialize=function(){if(null!=this.fromIndex&&void 0!==this.fromIndex){var t=this.fromIndex.serialize();return[\"index-of\",this.needle.serialize(),this.haystack.serialize(),t]}return[\"index-of\",this.needle.serialize(),this.haystack.serialize()]};var Cr=function(t,e,r,n,i,a){this.inputType=t,this.type=e,this.input=r,this.cases=n,this.outputs=i,this.otherwise=a};Cr.parse=function(t,e){if(t.length<5)return e.error(\"Expected at least 4 arguments, but found only \"+(t.length-1)+\".\");if(t.length%2!=1)return e.error(\"Expected an even number of arguments.\");var r,n;e.expectedType&&\"value\"!==e.expectedType.kind&&(n=e.expectedType);for(var i={},a=[],o=2;oNumber.MAX_SAFE_INTEGER)return c.error(\"Branch labels must be integers no larger than \"+Number.MAX_SAFE_INTEGER+\".\");if(\"number\"==typeof f&&Math.floor(f)!==f)return c.error(\"Numeric branch labels must be integer values.\");if(r){if(c.checkSubtype(r,ge(f)))return null}else r=ge(f);if(void 0!==i[String(f)])return c.error(\"Branch labels must be unique.\");i[String(f)]=a.length}var p=e.parse(l,o,n);if(!p)return null;n=n||p.type,a.push(p)}var d=e.parse(t[1],1,Jt);if(!d)return null;var m=e.parse(t[t.length-1],t.length-1,n);return m?\"value\"!==d.type.kind&&e.concat(1).checkSubtype(r,d.type)?null:new Cr(r,n,d,i,a,m):null},Cr.prototype.evaluate=function(t){var e=this.input.evaluate(t);return(ge(e)===this.inputType&&this.outputs[this.cases[e]]||this.otherwise).evaluate(t)},Cr.prototype.eachChild=function(t){t(this.input),this.outputs.forEach(t),t(this.otherwise)},Cr.prototype.outputDefined=function(){return this.outputs.every((function(t){return t.outputDefined()}))&&this.otherwise.outputDefined()},Cr.prototype.serialize=function(){for(var t=this,e=[\"match\",this.input.serialize()],r=[],n={},i=0,a=Object.keys(this.cases).sort();i=5)return e.error(\"Expected 3 or 4 arguments, but found \"+(t.length-1)+\" instead.\");var r=e.parse(t[1],1,Jt),n=e.parse(t[2],2,Zt);if(!r||!n)return null;if(!ae(r.type,[ee(Jt),Wt,Jt]))return e.error(\"Expected first argument to be of type array or string, but found \"+re(r.type)+\" instead\");if(4===t.length){var i=e.parse(t[3],3,Zt);return i?new Ir(r.type,r,n,i):null}return new Ir(r.type,r,n)},Ir.prototype.evaluate=function(t){var e=this.input.evaluate(t),r=this.beginIndex.evaluate(t);if(!oe(e,[\"string\",\"array\"]))throw new xe(\"Expected first argument to be of type array or string, but found \"+re(ge(e))+\" instead.\");if(this.endIndex){var n=this.endIndex.evaluate(t);return e.slice(r,n)}return e.slice(r)},Ir.prototype.eachChild=function(t){t(this.input),t(this.beginIndex),this.endIndex&&t(this.endIndex)},Ir.prototype.outputDefined=function(){return!1},Ir.prototype.serialize=function(){if(null!=this.endIndex&&void 0!==this.endIndex){var t=this.endIndex.serialize();return[\"slice\",this.input.serialize(),this.beginIndex.serialize(),t]}return[\"slice\",this.input.serialize(),this.beginIndex.serialize()]};var Dr=Or(\"==\",(function(t,e,r){return e===r}),zr),Rr=Or(\"!=\",(function(t,e,r){return e!==r}),(function(t,e,r,n){return!zr(0,e,r,n)})),Fr=Or(\"<\",(function(t,e,r){return e\",(function(t,e,r){return e>r}),(function(t,e,r,n){return n.compare(e,r)>0})),Nr=Or(\"<=\",(function(t,e,r){return e<=r}),(function(t,e,r,n){return n.compare(e,r)<=0})),jr=Or(\">=\",(function(t,e,r){return e>=r}),(function(t,e,r,n){return n.compare(e,r)>=0})),Ur=function(t,e,r,n,i){this.type=Wt,this.number=t,this.locale=e,this.currency=r,this.minFractionDigits=n,this.maxFractionDigits=i};Ur.parse=function(t,e){if(3!==t.length)return e.error(\"Expected two arguments.\");var r=e.parse(t[1],1,Zt);if(!r)return null;var n=t[2];if(\"object\"!=typeof n||Array.isArray(n))return e.error(\"NumberFormat options argument must be an object.\");var i=null;if(n.locale&&!(i=e.parse(n.locale,1,Wt)))return null;var a=null;if(n.currency&&!(a=e.parse(n.currency,1,Wt)))return null;var o=null;if(n[\"min-fraction-digits\"]&&!(o=e.parse(n[\"min-fraction-digits\"],1,Zt)))return null;var s=null;return n[\"max-fraction-digits\"]&&!(s=e.parse(n[\"max-fraction-digits\"],1,Zt))?null:new Ur(r,i,a,o,s)},Ur.prototype.evaluate=function(t){return new Intl.NumberFormat(this.locale?this.locale.evaluate(t):[],{style:this.currency?\"currency\":\"decimal\",currency:this.currency?this.currency.evaluate(t):void 0,minimumFractionDigits:this.minFractionDigits?this.minFractionDigits.evaluate(t):void 0,maximumFractionDigits:this.maxFractionDigits?this.maxFractionDigits.evaluate(t):void 0}).format(this.number.evaluate(t))},Ur.prototype.eachChild=function(t){t(this.number),this.locale&&t(this.locale),this.currency&&t(this.currency),this.minFractionDigits&&t(this.minFractionDigits),this.maxFractionDigits&&t(this.maxFractionDigits)},Ur.prototype.outputDefined=function(){return!1},Ur.prototype.serialize=function(){var t={};return this.locale&&(t.locale=this.locale.serialize()),this.currency&&(t.currency=this.currency.serialize()),this.minFractionDigits&&(t[\"min-fraction-digits\"]=this.minFractionDigits.serialize()),this.maxFractionDigits&&(t[\"max-fraction-digits\"]=this.maxFractionDigits.serialize()),[\"number-format\",this.number.serialize(),t]};var Vr=function(t){this.type=Zt,this.input=t};Vr.parse=function(t,e){if(2!==t.length)return e.error(\"Expected 1 argument, but found \"+(t.length-1)+\" instead.\");var r=e.parse(t[1],1);return r?\"array\"!==r.type.kind&&\"string\"!==r.type.kind&&\"value\"!==r.type.kind?e.error(\"Expected argument of type string or array, but found \"+re(r.type)+\" instead.\"):new Vr(r):null},Vr.prototype.evaluate=function(t){var e=this.input.evaluate(t);if(\"string\"==typeof e)return e.length;if(Array.isArray(e))return e.length;throw new xe(\"Expected value to be of type string or array, but found \"+re(ge(e))+\" instead.\")},Vr.prototype.eachChild=function(t){t(this.input)},Vr.prototype.outputDefined=function(){return!1},Vr.prototype.serialize=function(){var t=[\"length\"];return this.eachChild((function(e){t.push(e.serialize())})),t};var qr={\"==\":Dr,\"!=\":Rr,\">\":Br,\"<\":Fr,\">=\":jr,\"<=\":Nr,array:be,at:Mr,boolean:be,case:Lr,coalesce:kr,collator:Ce,format:we,image:Te,in:Sr,\"index-of\":Er,interpolate:wr,\"interpolate-hcl\":wr,\"interpolate-lab\":wr,length:Vr,let:Ar,literal:ve,match:Cr,number:be,\"number-format\":Ur,object:be,slice:Ir,step:tr,string:be,\"to-boolean\":Ae,\"to-color\":Ae,\"to-number\":Ae,\"to-string\":Ae,var:$e,within:Ze};function Hr(t,e){var r=e[0],n=e[1],i=e[2],a=e[3];r=r.evaluate(t),n=n.evaluate(t),i=i.evaluate(t);var o=a?a.evaluate(t):1,s=de(r,n,i,o);if(s)throw new xe(s);return new ce(r/255*o,n/255*o,i/255*o,o)}function Gr(t,e){return t in e}function Zr(t,e){var r=e[t];return void 0===r?null:r}function Wr(t){return{type:t}}function Yr(t){return{result:\"success\",value:t}}function Xr(t){return{result:\"error\",value:t}}function $r(t){return\"data-driven\"===t[\"property-type\"]||\"cross-faded-data-driven\"===t[\"property-type\"]}function Jr(t){return!!t.expression&&t.expression.parameters.indexOf(\"zoom\")>-1}function Kr(t){return!!t.expression&&t.expression.interpolated}function Qr(t){return t instanceof Number?\"number\":t instanceof String?\"string\":t instanceof Boolean?\"boolean\":Array.isArray(t)?\"array\":null===t?\"null\":typeof t}function tn(t){return\"object\"==typeof t&&null!==t&&!Array.isArray(t)}function en(t){return t}function rn(t,e){var r,n,i,a=\"color\"===e.type,o=t.stops&&\"object\"==typeof t.stops[0][0],s=o||void 0!==t.property,l=o||!s,c=t.type||(Kr(e)?\"exponential\":\"interval\");if(a&&((t=jt({},t)).stops&&(t.stops=t.stops.map((function(t){return[t[0],ce.parse(t[1])]}))),t.default?t.default=ce.parse(t.default):t.default=ce.parse(e.default)),t.colorSpace&&\"rgb\"!==t.colorSpace&&!br[t.colorSpace])throw new Error(\"Unknown color space: \"+t.colorSpace);if(\"exponential\"===c)r=sn;else if(\"interval\"===c)r=on;else if(\"categorical\"===c){r=an,n=Object.create(null);for(var u=0,h=t.stops;u=t.stops[n-1][0])return t.stops[n-1][1];var i=Qe(t.stops.map((function(t){return t[0]})),r);return t.stops[i][1]}function sn(t,e,r){var n=void 0!==t.base?t.base:1;if(\"number\"!==Qr(r))return nn(t.default,e.default);var i=t.stops.length;if(1===i)return t.stops[0][1];if(r<=t.stops[0][0])return t.stops[0][1];if(r>=t.stops[i-1][0])return t.stops[i-1][1];var a=Qe(t.stops.map((function(t){return t[0]})),r),o=function(t,e,r,n){var i=n-r,a=t-r;return 0===i?0:1===e?a/i:(Math.pow(e,a)-1)/(Math.pow(e,i)-1)}(r,n,t.stops[a][0],t.stops[a+1][0]),s=t.stops[a][1],l=t.stops[a+1][1],c=rr[e.type]||en;if(t.colorSpace&&\"rgb\"!==t.colorSpace){var u=br[t.colorSpace];c=function(t,e){return u.reverse(u.interpolate(u.forward(t),u.forward(e),o))}}return\"function\"==typeof s.evaluate?{evaluate:function(){for(var t=[],e=arguments.length;e--;)t[e]=arguments[e];var r=s.evaluate.apply(void 0,t),n=l.evaluate.apply(void 0,t);if(void 0!==r&&void 0!==n)return c(r,n,o)}}:c(s,l,o)}function ln(t,e,r){return\"color\"===e.type?r=ce.parse(r):\"formatted\"===e.type?r=fe.fromString(r.toString()):\"resolvedImage\"===e.type?r=pe.fromString(r.toString()):Qr(r)===e.type||\"enum\"===e.type&&e.values[r]||(r=void 0),nn(r,t.default,e.default)}Ee.register(qr,{error:[{kind:\"error\"},[Wt],function(t,e){var r=e[0];throw new xe(r.evaluate(t))}],typeof:[Wt,[Jt],function(t,e){return re(ge(e[0].evaluate(t)))}],\"to-rgba\":[ee(Zt,4),[Xt],function(t,e){return e[0].evaluate(t).toArray()}],rgb:[Xt,[Zt,Zt,Zt],Hr],rgba:[Xt,[Zt,Zt,Zt,Zt],Hr],has:{type:Yt,overloads:[[[Wt],function(t,e){return Gr(e[0].evaluate(t),t.properties())}],[[Wt,$t],function(t,e){var r=e[0],n=e[1];return Gr(r.evaluate(t),n.evaluate(t))}]]},get:{type:Jt,overloads:[[[Wt],function(t,e){return Zr(e[0].evaluate(t),t.properties())}],[[Wt,$t],function(t,e){var r=e[0],n=e[1];return Zr(r.evaluate(t),n.evaluate(t))}]]},\"feature-state\":[Jt,[Wt],function(t,e){return Zr(e[0].evaluate(t),t.featureState||{})}],properties:[$t,[],function(t){return t.properties()}],\"geometry-type\":[Wt,[],function(t){return t.geometryType()}],id:[Jt,[],function(t){return t.id()}],zoom:[Zt,[],function(t){return t.globals.zoom}],\"heatmap-density\":[Zt,[],function(t){return t.globals.heatmapDensity||0}],\"line-progress\":[Zt,[],function(t){return t.globals.lineProgress||0}],accumulated:[Jt,[],function(t){return void 0===t.globals.accumulated?null:t.globals.accumulated}],\"+\":[Zt,Wr(Zt),function(t,e){for(var r=0,n=0,i=e;n\":[Yt,[Wt,Jt],function(t,e){var r=e[0],n=e[1],i=t.properties()[r.value],a=n.value;return typeof i==typeof a&&i>a}],\"filter-id->\":[Yt,[Jt],function(t,e){var r=e[0],n=t.id(),i=r.value;return typeof n==typeof i&&n>i}],\"filter-<=\":[Yt,[Wt,Jt],function(t,e){var r=e[0],n=e[1],i=t.properties()[r.value],a=n.value;return typeof i==typeof a&&i<=a}],\"filter-id-<=\":[Yt,[Jt],function(t,e){var r=e[0],n=t.id(),i=r.value;return typeof n==typeof i&&n<=i}],\"filter->=\":[Yt,[Wt,Jt],function(t,e){var r=e[0],n=e[1],i=t.properties()[r.value],a=n.value;return typeof i==typeof a&&i>=a}],\"filter-id->=\":[Yt,[Jt],function(t,e){var r=e[0],n=t.id(),i=r.value;return typeof n==typeof i&&n>=i}],\"filter-has\":[Yt,[Jt],function(t,e){return e[0].value in t.properties()}],\"filter-has-id\":[Yt,[],function(t){return null!==t.id()&&void 0!==t.id()}],\"filter-type-in\":[Yt,[ee(Wt)],function(t,e){return e[0].value.indexOf(t.geometryType())>=0}],\"filter-id-in\":[Yt,[ee(Jt)],function(t,e){return e[0].value.indexOf(t.id())>=0}],\"filter-in-small\":[Yt,[Wt,ee(Jt)],function(t,e){var r=e[0];return e[1].value.indexOf(t.properties()[r.value])>=0}],\"filter-in-large\":[Yt,[Wt,ee(Jt)],function(t,e){var r=e[0],n=e[1];return function(t,e,r,n){for(;r<=n;){var i=r+n>>1;if(e[i]===t)return!0;e[i]>t?n=i-1:r=i+1}return!1}(t.properties()[r.value],n.value,0,n.value.length-1)}],all:{type:Yt,overloads:[[[Yt,Yt],function(t,e){var r=e[0],n=e[1];return r.evaluate(t)&&n.evaluate(t)}],[Wr(Yt),function(t,e){for(var r=0,n=e;r0&&\"string\"==typeof t[0]&&t[0]in qr}function hn(t,e){var r=new Je(qr,[],e?function(t){var e={color:Xt,string:Wt,number:Zt,enum:Wt,boolean:Yt,formatted:Qt,resolvedImage:te};return\"array\"===t.type?ee(e[t.value]||Jt,t.length):e[t.type]}(e):void 0),n=r.parse(t,void 0,void 0,void 0,e&&\"string\"===e.type?{typeAnnotation:\"coerce\"}:void 0);return n?Yr(new cn(n,e)):Xr(r.errors)}cn.prototype.evaluateWithoutErrorHandling=function(t,e,r,n,i,a){return this._evaluator.globals=t,this._evaluator.feature=e,this._evaluator.featureState=r,this._evaluator.canonical=n,this._evaluator.availableImages=i||null,this._evaluator.formattedSection=a,this.expression.evaluate(this._evaluator)},cn.prototype.evaluate=function(t,e,r,n,i,a){this._evaluator.globals=t,this._evaluator.feature=e||null,this._evaluator.featureState=r||null,this._evaluator.canonical=n,this._evaluator.availableImages=i||null,this._evaluator.formattedSection=a||null;try{var o=this.expression.evaluate(this._evaluator);if(null==o||\"number\"==typeof o&&o!=o)return this._defaultValue;if(this._enumValues&&!(o in this._enumValues))throw new xe(\"Expected value to be one of \"+Object.keys(this._enumValues).map((function(t){return JSON.stringify(t)})).join(\", \")+\", but found \"+JSON.stringify(o)+\" instead.\");return o}catch(t){return this._warningHistory[t.message]||(this._warningHistory[t.message]=!0,\"undefined\"!=typeof console&&console.warn(t.message)),this._defaultValue}};var fn=function(t,e){this.kind=t,this._styleExpression=e,this.isStateDependent=\"constant\"!==t&&!Ye(e.expression)};fn.prototype.evaluateWithoutErrorHandling=function(t,e,r,n,i,a){return this._styleExpression.evaluateWithoutErrorHandling(t,e,r,n,i,a)},fn.prototype.evaluate=function(t,e,r,n,i,a){return this._styleExpression.evaluate(t,e,r,n,i,a)};var pn=function(t,e,r,n){this.kind=t,this.zoomStops=r,this._styleExpression=e,this.isStateDependent=\"camera\"!==t&&!Ye(e.expression),this.interpolationType=n};function dn(t,e){if(\"error\"===(t=hn(t,e)).result)return t;var r=t.value.expression,n=We(r);if(!n&&!$r(e))return Xr([new qt(\"\",\"data expressions not supported\")]);var i=Xe(r,[\"zoom\"]);if(!i&&!Jr(e))return Xr([new qt(\"\",\"zoom expressions not supported\")]);var a=gn(r);if(!a&&!i)return Xr([new qt(\"\",'\"zoom\" expression may only be used as input to a top-level \"step\" or \"interpolate\" expression.')]);if(a instanceof qt)return Xr([a]);if(a instanceof wr&&!Kr(e))return Xr([new qt(\"\",'\"interpolate\" expressions cannot be used with this property')]);if(!a)return Yr(new fn(n?\"constant\":\"source\",t.value));var o=a instanceof wr?a.interpolation:void 0;return Yr(new pn(n?\"camera\":\"composite\",t.value,a.labels,o))}pn.prototype.evaluateWithoutErrorHandling=function(t,e,r,n,i,a){return this._styleExpression.evaluateWithoutErrorHandling(t,e,r,n,i,a)},pn.prototype.evaluate=function(t,e,r,n,i,a){return this._styleExpression.evaluate(t,e,r,n,i,a)},pn.prototype.interpolationFactor=function(t,e,r){return this.interpolationType?wr.interpolationFactor(this.interpolationType,t,e,r):0};var mn=function(t,e){this._parameters=t,this._specification=e,jt(this,rn(this._parameters,this._specification))};function gn(t){var e=null;if(t instanceof Ar)e=gn(t.result);else if(t instanceof kr)for(var r=0,n=t.args;rn.maximum?[new Bt(e,r,r+\" is greater than the maximum value \"+n.maximum)]:[]}function _n(t){var e,r,n,i=t.valueSpec,a=Ut(t.value.type),o={},s=\"categorical\"!==a&&void 0===t.value.property,l=!s,c=\"array\"===Qr(t.value.stops)&&\"array\"===Qr(t.value.stops[0])&&\"object\"===Qr(t.value.stops[0][0]),u=yn({key:t.key,value:t.value,valueSpec:t.styleSpec.function,style:t.style,styleSpec:t.styleSpec,objectElementValidators:{stops:function(t){if(\"identity\"===a)return[new Bt(t.key,t.value,'identity function may not have a \"stops\" property')];var e=[],r=t.value;return e=e.concat(vn({key:t.key,value:r,valueSpec:t.valueSpec,style:t.style,styleSpec:t.styleSpec,arrayElementValidator:h})),\"array\"===Qr(r)&&0===r.length&&e.push(new Bt(t.key,r,\"array must have at least one stop\")),e},default:function(t){return Hn({key:t.key,value:t.value,valueSpec:i,style:t.style,styleSpec:t.styleSpec})}}});return\"identity\"===a&&s&&u.push(new Bt(t.key,t.value,'missing required property \"property\"')),\"identity\"===a||t.value.stops||u.push(new Bt(t.key,t.value,'missing required property \"stops\"')),\"exponential\"===a&&t.valueSpec.expression&&!Kr(t.valueSpec)&&u.push(new Bt(t.key,t.value,\"exponential functions not supported\")),t.styleSpec.$version>=8&&(l&&!$r(t.valueSpec)?u.push(new Bt(t.key,t.value,\"property functions not supported\")):s&&!Jr(t.valueSpec)&&u.push(new Bt(t.key,t.value,\"zoom functions not supported\"))),\"categorical\"!==a&&!c||void 0!==t.value.property||u.push(new Bt(t.key,t.value,'\"property\" property is required')),u;function h(t){var e=[],a=t.value,s=t.key;if(\"array\"!==Qr(a))return[new Bt(s,a,\"array expected, \"+Qr(a)+\" found\")];if(2!==a.length)return[new Bt(s,a,\"array length 2 expected, length \"+a.length+\" found\")];if(c){if(\"object\"!==Qr(a[0]))return[new Bt(s,a,\"object expected, \"+Qr(a[0])+\" found\")];if(void 0===a[0].zoom)return[new Bt(s,a,\"object stop key must have zoom\")];if(void 0===a[0].value)return[new Bt(s,a,\"object stop key must have value\")];if(n&&n>Ut(a[0].zoom))return[new Bt(s,a[0].zoom,\"stop zoom values must appear in ascending order\")];Ut(a[0].zoom)!==n&&(n=Ut(a[0].zoom),r=void 0,o={}),e=e.concat(yn({key:s+\"[0]\",value:a[0],valueSpec:{zoom:{}},style:t.style,styleSpec:t.styleSpec,objectElementValidators:{zoom:xn,value:f}}))}else e=e.concat(f({key:s+\"[0]\",value:a[0],valueSpec:{},style:t.style,styleSpec:t.styleSpec},a));return un(Vt(a[1]))?e.concat([new Bt(s+\"[1]\",a[1],\"expressions are not allowed in function stops.\")]):e.concat(Hn({key:s+\"[1]\",value:a[1],valueSpec:i,style:t.style,styleSpec:t.styleSpec}))}function f(t,n){var s=Qr(t.value),l=Ut(t.value),c=null!==t.value?t.value:n;if(e){if(s!==e)return[new Bt(t.key,c,s+\" stop domain type must match previous stop domain type \"+e)]}else e=s;if(\"number\"!==s&&\"string\"!==s&&\"boolean\"!==s)return[new Bt(t.key,c,\"stop domain value must be a number, string, or boolean\")];if(\"number\"!==s&&\"categorical\"!==a){var u=\"number expected, \"+s+\" found\";return $r(i)&&void 0===a&&(u+='\\nIf you intended to use a categorical function, specify `\"type\": \"categorical\"`.'),[new Bt(t.key,c,u)]}return\"categorical\"!==a||\"number\"!==s||isFinite(l)&&Math.floor(l)===l?\"categorical\"!==a&&\"number\"===s&&void 0!==r&&l=2&&\"$id\"!==t[1]&&\"$type\"!==t[1];case\"in\":return t.length>=3&&(\"string\"!=typeof t[1]||Array.isArray(t[2]));case\"!in\":case\"!has\":case\"none\":return!1;case\"==\":case\"!=\":case\">\":case\">=\":case\"<\":case\"<=\":return 3!==t.length||Array.isArray(t[1])||Array.isArray(t[2]);case\"any\":case\"all\":for(var e=0,r=t.slice(1);ee?1:0}function Sn(t){if(!Array.isArray(t))return!1;if(\"within\"===t[0])return!0;for(var e=1;e\"===r||\"<=\"===r||\">=\"===r?Cn(t[1],t[2],r):\"any\"===r?(e=t.slice(1),[\"any\"].concat(e.map(En))):\"all\"===r?[\"all\"].concat(t.slice(1).map(En)):\"none\"===r?[\"all\"].concat(t.slice(1).map(En).map(Pn)):\"in\"===r?Ln(t[1],t.slice(2)):\"!in\"===r?Pn(Ln(t[1],t.slice(2))):\"has\"===r?In(t[1]):\"!has\"===r?Pn(In(t[1])):\"within\"!==r||t}function Cn(t,e,r){switch(t){case\"$type\":return[\"filter-type-\"+r,e];case\"$id\":return[\"filter-id-\"+r,e];default:return[\"filter-\"+r,t,e]}}function Ln(t,e){if(0===e.length)return!1;switch(t){case\"$type\":return[\"filter-type-in\",[\"literal\",e]];case\"$id\":return[\"filter-id-in\",[\"literal\",e]];default:return e.length>200&&!e.some((function(t){return typeof t!=typeof e[0]}))?[\"filter-in-large\",t,[\"literal\",e.sort(Mn)]]:[\"filter-in-small\",t,[\"literal\",e]]}}function In(t){switch(t){case\"$type\":return!0;case\"$id\":return[\"filter-has-id\"];default:return[\"filter-has\",t]}}function Pn(t){return[\"!\",t]}function zn(t){return Tn(Vt(t.value))?bn(jt({},t,{expressionContext:\"filter\",valueSpec:{value:\"boolean\"}})):On(t)}function On(t){var e=t.value,r=t.key;if(\"array\"!==Qr(e))return[new Bt(r,e,\"array expected, \"+Qr(e)+\" found\")];var n,i=t.styleSpec,a=[];if(e.length<1)return[new Bt(r,e,\"filter array must have at least 1 element\")];switch(a=a.concat(wn({key:r+\"[0]\",value:e[0],valueSpec:i.filter_operator,style:t.style,styleSpec:t.styleSpec})),Ut(e[0])){case\"<\":case\"<=\":case\">\":case\">=\":e.length>=2&&\"$type\"===Ut(e[1])&&a.push(new Bt(r,e,'\"$type\" cannot be use with operator \"'+e[0]+'\"'));case\"==\":case\"!=\":3!==e.length&&a.push(new Bt(r,e,'filter array for operator \"'+e[0]+'\" must have 3 elements'));case\"in\":case\"!in\":e.length>=2&&\"string\"!==(n=Qr(e[1]))&&a.push(new Bt(r+\"[1]\",e[1],\"string expected, \"+n+\" found\"));for(var o=2;o=u[p+0]&&n>=u[p+1])?(o[f]=!0,a.push(c[f])):o[f]=!1}}},ri.prototype._forEachCell=function(t,e,r,n,i,a,o,s){for(var l=this._convertToCellCoord(t),c=this._convertToCellCoord(e),u=this._convertToCellCoord(r),h=this._convertToCellCoord(n),f=l;f<=u;f++)for(var p=c;p<=h;p++){var d=this.d*p+f;if((!s||s(this._convertFromCellCoord(f),this._convertFromCellCoord(p),this._convertFromCellCoord(f+1),this._convertFromCellCoord(p+1)))&&i.call(this,t,e,r,n,d,a,o,s))return}},ri.prototype._convertFromCellCoord=function(t){return(t-this.padding)/this.scale},ri.prototype._convertToCellCoord=function(t){return Math.max(0,Math.min(this.d-1,Math.floor(t*this.scale)+this.padding))},ri.prototype.toArrayBuffer=function(){if(this.arrayBuffer)return this.arrayBuffer;for(var t=this.cells,e=ei+this.cells.length+1+1,r=0,n=0;n=0)){var h=t[u];c[u]=ai[l].shallow.indexOf(u)>=0?h:ui(h,e)}t instanceof Error&&(c.message=t.message)}if(c.$name)throw new Error(\"$name property is reserved for worker serialization logic.\");return\"Object\"!==l&&(c.$name=l),c}throw new Error(\"can't serialize object of type \"+typeof t)}function hi(t){if(null==t||\"boolean\"==typeof t||\"number\"==typeof t||\"string\"==typeof t||t instanceof Boolean||t instanceof Number||t instanceof String||t instanceof Date||t instanceof RegExp||li(t)||ci(t)||ArrayBuffer.isView(t)||t instanceof ni)return t;if(Array.isArray(t))return t.map(hi);if(\"object\"==typeof t){var e=t.$name||\"Object\",r=ai[e].klass;if(!r)throw new Error(\"can't deserialize unregistered class \"+e);if(r.deserialize)return r.deserialize(t);for(var n=Object.create(r.prototype),i=0,a=Object.keys(t);i=0?s:hi(s)}}return n}throw new Error(\"can't deserialize object of type \"+typeof t)}var fi=function(){this.first=!0};fi.prototype.update=function(t,e){var r=Math.floor(t);return this.first?(this.first=!1,this.lastIntegerZoom=r,this.lastIntegerZoomTime=0,this.lastZoom=t,this.lastFloorZoom=r,!0):(this.lastFloorZoom>r?(this.lastIntegerZoom=r+1,this.lastIntegerZoomTime=e):this.lastFloorZoom=128&&t<=255},Arabic:function(t){return t>=1536&&t<=1791},\"Arabic Supplement\":function(t){return t>=1872&&t<=1919},\"Arabic Extended-A\":function(t){return t>=2208&&t<=2303},\"Hangul Jamo\":function(t){return t>=4352&&t<=4607},\"Unified Canadian Aboriginal Syllabics\":function(t){return t>=5120&&t<=5759},Khmer:function(t){return t>=6016&&t<=6143},\"Unified Canadian Aboriginal Syllabics Extended\":function(t){return t>=6320&&t<=6399},\"General Punctuation\":function(t){return t>=8192&&t<=8303},\"Letterlike Symbols\":function(t){return t>=8448&&t<=8527},\"Number Forms\":function(t){return t>=8528&&t<=8591},\"Miscellaneous Technical\":function(t){return t>=8960&&t<=9215},\"Control Pictures\":function(t){return t>=9216&&t<=9279},\"Optical Character Recognition\":function(t){return t>=9280&&t<=9311},\"Enclosed Alphanumerics\":function(t){return t>=9312&&t<=9471},\"Geometric Shapes\":function(t){return t>=9632&&t<=9727},\"Miscellaneous Symbols\":function(t){return t>=9728&&t<=9983},\"Miscellaneous Symbols and Arrows\":function(t){return t>=11008&&t<=11263},\"CJK Radicals Supplement\":function(t){return t>=11904&&t<=12031},\"Kangxi Radicals\":function(t){return t>=12032&&t<=12255},\"Ideographic Description Characters\":function(t){return t>=12272&&t<=12287},\"CJK Symbols and Punctuation\":function(t){return t>=12288&&t<=12351},Hiragana:function(t){return t>=12352&&t<=12447},Katakana:function(t){return t>=12448&&t<=12543},Bopomofo:function(t){return t>=12544&&t<=12591},\"Hangul Compatibility Jamo\":function(t){return t>=12592&&t<=12687},Kanbun:function(t){return t>=12688&&t<=12703},\"Bopomofo Extended\":function(t){return t>=12704&&t<=12735},\"CJK Strokes\":function(t){return t>=12736&&t<=12783},\"Katakana Phonetic Extensions\":function(t){return t>=12784&&t<=12799},\"Enclosed CJK Letters and Months\":function(t){return t>=12800&&t<=13055},\"CJK Compatibility\":function(t){return t>=13056&&t<=13311},\"CJK Unified Ideographs Extension A\":function(t){return t>=13312&&t<=19903},\"Yijing Hexagram Symbols\":function(t){return t>=19904&&t<=19967},\"CJK Unified Ideographs\":function(t){return t>=19968&&t<=40959},\"Yi Syllables\":function(t){return t>=40960&&t<=42127},\"Yi Radicals\":function(t){return t>=42128&&t<=42191},\"Hangul Jamo Extended-A\":function(t){return t>=43360&&t<=43391},\"Hangul Syllables\":function(t){return t>=44032&&t<=55215},\"Hangul Jamo Extended-B\":function(t){return t>=55216&&t<=55295},\"Private Use Area\":function(t){return t>=57344&&t<=63743},\"CJK Compatibility Ideographs\":function(t){return t>=63744&&t<=64255},\"Arabic Presentation Forms-A\":function(t){return t>=64336&&t<=65023},\"Vertical Forms\":function(t){return t>=65040&&t<=65055},\"CJK Compatibility Forms\":function(t){return t>=65072&&t<=65103},\"Small Form Variants\":function(t){return t>=65104&&t<=65135},\"Arabic Presentation Forms-B\":function(t){return t>=65136&&t<=65279},\"Halfwidth and Fullwidth Forms\":function(t){return t>=65280&&t<=65519}};function di(t){for(var e=0,r=t;e=65097&&t<=65103)||pi[\"CJK Compatibility Ideographs\"](t)||pi[\"CJK Compatibility\"](t)||pi[\"CJK Radicals Supplement\"](t)||pi[\"CJK Strokes\"](t)||!(!pi[\"CJK Symbols and Punctuation\"](t)||t>=12296&&t<=12305||t>=12308&&t<=12319||12336===t)||pi[\"CJK Unified Ideographs Extension A\"](t)||pi[\"CJK Unified Ideographs\"](t)||pi[\"Enclosed CJK Letters and Months\"](t)||pi[\"Hangul Compatibility Jamo\"](t)||pi[\"Hangul Jamo Extended-A\"](t)||pi[\"Hangul Jamo Extended-B\"](t)||pi[\"Hangul Jamo\"](t)||pi[\"Hangul Syllables\"](t)||pi.Hiragana(t)||pi[\"Ideographic Description Characters\"](t)||pi.Kanbun(t)||pi[\"Kangxi Radicals\"](t)||pi[\"Katakana Phonetic Extensions\"](t)||pi.Katakana(t)&&12540!==t||!(!pi[\"Halfwidth and Fullwidth Forms\"](t)||65288===t||65289===t||65293===t||t>=65306&&t<=65310||65339===t||65341===t||65343===t||t>=65371&&t<=65503||65507===t||t>=65512&&t<=65519)||!(!pi[\"Small Form Variants\"](t)||t>=65112&&t<=65118||t>=65123&&t<=65126)||pi[\"Unified Canadian Aboriginal Syllabics\"](t)||pi[\"Unified Canadian Aboriginal Syllabics Extended\"](t)||pi[\"Vertical Forms\"](t)||pi[\"Yijing Hexagram Symbols\"](t)||pi[\"Yi Syllables\"](t)||pi[\"Yi Radicals\"](t))))}function gi(t){return!(mi(t)||function(t){return!!(pi[\"Latin-1 Supplement\"](t)&&(167===t||169===t||174===t||177===t||188===t||189===t||190===t||215===t||247===t)||pi[\"General Punctuation\"](t)&&(8214===t||8224===t||8225===t||8240===t||8241===t||8251===t||8252===t||8258===t||8263===t||8264===t||8265===t||8273===t)||pi[\"Letterlike Symbols\"](t)||pi[\"Number Forms\"](t)||pi[\"Miscellaneous Technical\"](t)&&(t>=8960&&t<=8967||t>=8972&&t<=8991||t>=8996&&t<=9e3||9003===t||t>=9085&&t<=9114||t>=9150&&t<=9165||9167===t||t>=9169&&t<=9179||t>=9186&&t<=9215)||pi[\"Control Pictures\"](t)&&9251!==t||pi[\"Optical Character Recognition\"](t)||pi[\"Enclosed Alphanumerics\"](t)||pi[\"Geometric Shapes\"](t)||pi[\"Miscellaneous Symbols\"](t)&&!(t>=9754&&t<=9759)||pi[\"Miscellaneous Symbols and Arrows\"](t)&&(t>=11026&&t<=11055||t>=11088&&t<=11097||t>=11192&&t<=11243)||pi[\"CJK Symbols and Punctuation\"](t)||pi.Katakana(t)||pi[\"Private Use Area\"](t)||pi[\"CJK Compatibility Forms\"](t)||pi[\"Small Form Variants\"](t)||pi[\"Halfwidth and Fullwidth Forms\"](t)||8734===t||8756===t||8757===t||t>=9984&&t<=10087||t>=10102&&t<=10131||65532===t||65533===t)}(t))}function yi(t){return pi.Arabic(t)||pi[\"Arabic Supplement\"](t)||pi[\"Arabic Extended-A\"](t)||pi[\"Arabic Presentation Forms-A\"](t)||pi[\"Arabic Presentation Forms-B\"](t)}function vi(t){return t>=1424&&t<=2303||pi[\"Arabic Presentation Forms-A\"](t)||pi[\"Arabic Presentation Forms-B\"](t)}function xi(t,e){return!(!e&&vi(t)||t>=2304&&t<=3583||t>=3840&&t<=4255||pi.Khmer(t))}function _i(t){for(var e=0,r=t;e-1&&(Mi=ki),Ai&&Ai(t)};function Ci(){Li.fire(new Ot(\"pluginStateChange\",{pluginStatus:Mi,pluginURL:Si}))}var Li=new Rt,Ii=function(){return Mi},Pi=function(){if(Mi!==bi||!Si)throw new Error(\"rtl-text-plugin cannot be downloaded unless a pluginURL is specified\");Mi=wi,Ci(),Si&&Mt({url:Si},(function(t){t?Ei(t):(Mi=Ti,Ci())}))},zi={applyArabicShaping:null,processBidirectionalText:null,processStyledBidirectionalText:null,isLoaded:function(){return Mi===Ti||null!=zi.applyArabicShaping},isLoading:function(){return Mi===wi},setState:function(t){Mi=t.pluginStatus,Si=t.pluginURL},isParsed:function(){return null!=zi.applyArabicShaping&&null!=zi.processBidirectionalText&&null!=zi.processStyledBidirectionalText},getPluginURL:function(){return Si}},Oi=function(t,e){this.zoom=t,e?(this.now=e.now,this.fadeDuration=e.fadeDuration,this.zoomHistory=e.zoomHistory,this.transition=e.transition):(this.now=0,this.fadeDuration=0,this.zoomHistory=new fi,this.transition={})};Oi.prototype.isSupportedScript=function(t){return function(t,e){for(var r=0,n=t;rthis.zoomHistory.lastIntegerZoom?{fromScale:2,toScale:1,t:e+(1-e)*r}:{fromScale:.5,toScale:1,t:1-(1-r)*e}};var Di=function(t,e){this.property=t,this.value=e,this.expression=function(t,e){if(tn(t))return new mn(t,e);if(un(t)){var r=dn(t,e);if(\"error\"===r.result)throw new Error(r.value.map((function(t){return t.key+\": \"+t.message})).join(\", \"));return r.value}var n=t;return\"string\"==typeof t&&\"color\"===e.type&&(n=ce.parse(t)),{kind:\"constant\",evaluate:function(){return n}}}(void 0===e?t.specification.default:e,t.specification)};Di.prototype.isDataDriven=function(){return\"source\"===this.expression.kind||\"composite\"===this.expression.kind},Di.prototype.possiblyEvaluate=function(t,e,r){return this.property.possiblyEvaluate(this,t,e,r)};var Ri=function(t){this.property=t,this.value=new Di(t,void 0)};Ri.prototype.transitioned=function(t,e){return new Bi(this.property,this.value,e,p({},t.transition,this.transition),t.now)},Ri.prototype.untransitioned=function(){return new Bi(this.property,this.value,null,{},0)};var Fi=function(t){this._properties=t,this._values=Object.create(t.defaultTransitionablePropertyValues)};Fi.prototype.getValue=function(t){return w(this._values[t].value.value)},Fi.prototype.setValue=function(t,e){this._values.hasOwnProperty(t)||(this._values[t]=new Ri(this._values[t].property)),this._values[t].value=new Di(this._values[t].property,null===e?void 0:w(e))},Fi.prototype.getTransition=function(t){return w(this._values[t].transition)},Fi.prototype.setTransition=function(t,e){this._values.hasOwnProperty(t)||(this._values[t]=new Ri(this._values[t].property)),this._values[t].transition=w(e)||void 0},Fi.prototype.serialize=function(){for(var t={},e=0,r=Object.keys(this._values);ethis.end)return this.prior=null,i;if(this.value.isDataDriven())return this.prior=null,i;if(n=1)return 1;var e=t*t,r=e*t;return 4*(t<.5?r:3*(t-e)+r-.75)}(o))}return i};var Ni=function(t){this._properties=t,this._values=Object.create(t.defaultTransitioningPropertyValues)};Ni.prototype.possiblyEvaluate=function(t,e,r){for(var n=new Vi(this._properties),i=0,a=Object.keys(this._values);in.zoomHistory.lastIntegerZoom?{from:t,to:e}:{from:r,to:e}},e.prototype.interpolate=function(t){return t},e}(Hi),Zi=function(t){this.specification=t};Zi.prototype.possiblyEvaluate=function(t,e,r,n){if(void 0!==t.value){if(\"constant\"===t.expression.kind){var i=t.expression.evaluate(e,null,{},r,n);return this._calculate(i,i,i,e)}return this._calculate(t.expression.evaluate(new Oi(Math.floor(e.zoom-1),e)),t.expression.evaluate(new Oi(Math.floor(e.zoom),e)),t.expression.evaluate(new Oi(Math.floor(e.zoom+1),e)),e)}},Zi.prototype._calculate=function(t,e,r,n){return n.zoom>n.zoomHistory.lastIntegerZoom?{from:t,to:e}:{from:r,to:e}},Zi.prototype.interpolate=function(t){return t};var Wi=function(t){this.specification=t};Wi.prototype.possiblyEvaluate=function(t,e,r,n){return!!t.expression.evaluate(e,null,{},r,n)},Wi.prototype.interpolate=function(){return!1};var Yi=function(t){for(var e in this.properties=t,this.defaultPropertyValues={},this.defaultTransitionablePropertyValues={},this.defaultTransitioningPropertyValues={},this.defaultPossiblyEvaluatedValues={},this.overridableProperties=[],t){var r=t[e];r.specification.overridable&&this.overridableProperties.push(e);var n=this.defaultPropertyValues[e]=new Di(r,void 0),i=this.defaultTransitionablePropertyValues[e]=new Ri(r);this.defaultTransitioningPropertyValues[e]=i.untransitioned(),this.defaultPossiblyEvaluatedValues[e]=n.possiblyEvaluate({})}};oi(\"DataDrivenProperty\",Hi),oi(\"DataConstantProperty\",qi),oi(\"CrossFadedDataDrivenProperty\",Gi),oi(\"CrossFadedProperty\",Zi),oi(\"ColorRampProperty\",Wi);var Xi=\"-transition\",$i=function(t){function e(e,r){if(t.call(this),this.id=e.id,this.type=e.type,this._featureFilter={filter:function(){return!0},needGeometry:!1},\"custom\"!==e.type&&(this.metadata=e.metadata,this.minzoom=e.minzoom,this.maxzoom=e.maxzoom,\"background\"!==e.type&&(this.source=e.source,this.sourceLayer=e[\"source-layer\"],this.filter=e.filter),r.layout&&(this._unevaluatedLayout=new ji(r.layout)),r.paint)){for(var n in this._transitionablePaint=new Fi(r.paint),e.paint)this.setPaintProperty(n,e.paint[n],{validate:!1});for(var i in e.layout)this.setLayoutProperty(i,e.layout[i],{validate:!1});this._transitioningPaint=this._transitionablePaint.untransitioned(),this.paint=new Vi(r.paint)}}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.getCrossfadeParameters=function(){return this._crossfadeParameters},e.prototype.getLayoutProperty=function(t){return\"visibility\"===t?this.visibility:this._unevaluatedLayout.getValue(t)},e.prototype.setLayoutProperty=function(t,e,r){if(void 0===r&&(r={}),null!=e){var n=\"layers.\"+this.id+\".layout.\"+t;if(this._validate(Kn,n,t,e,r))return}\"visibility\"!==t?this._unevaluatedLayout.setValue(t,e):this.visibility=e},e.prototype.getPaintProperty=function(t){return x(t,Xi)?this._transitionablePaint.getTransition(t.slice(0,-11)):this._transitionablePaint.getValue(t)},e.prototype.setPaintProperty=function(t,e,r){if(void 0===r&&(r={}),null!=e){var n=\"layers.\"+this.id+\".paint.\"+t;if(this._validate(Jn,n,t,e,r))return!1}if(x(t,Xi))return this._transitionablePaint.setTransition(t.slice(0,-11),e||void 0),!1;var i=this._transitionablePaint._values[t],a=\"cross-faded-data-driven\"===i.property.specification[\"property-type\"],o=i.value.isDataDriven(),s=i.value;this._transitionablePaint.setValue(t,e),this._handleSpecialPaintPropertyUpdate(t);var l=this._transitionablePaint._values[t].value;return l.isDataDriven()||o||a||this._handleOverridablePaintPropertyUpdate(t,s,l)},e.prototype._handleSpecialPaintPropertyUpdate=function(t){},e.prototype._handleOverridablePaintPropertyUpdate=function(t,e,r){return!1},e.prototype.isHidden=function(t){return!!(this.minzoom&&t=this.maxzoom)||\"none\"===this.visibility},e.prototype.updateTransitions=function(t){this._transitioningPaint=this._transitionablePaint.transitioned(t,this._transitioningPaint)},e.prototype.hasTransition=function(){return this._transitioningPaint.hasTransition()},e.prototype.recalculate=function(t,e){t.getCrossfadeParameters&&(this._crossfadeParameters=t.getCrossfadeParameters()),this._unevaluatedLayout&&(this.layout=this._unevaluatedLayout.possiblyEvaluate(t,void 0,e)),this.paint=this._transitioningPaint.possiblyEvaluate(t,void 0,e)},e.prototype.serialize=function(){var t={id:this.id,type:this.type,source:this.source,\"source-layer\":this.sourceLayer,metadata:this.metadata,minzoom:this.minzoom,maxzoom:this.maxzoom,filter:this.filter,layout:this._unevaluatedLayout&&this._unevaluatedLayout.serialize(),paint:this._transitionablePaint&&this._transitionablePaint.serialize()};return this.visibility&&(t.layout=t.layout||{},t.layout.visibility=this.visibility),b(t,(function(t,e){return!(void 0===t||\"layout\"===e&&!Object.keys(t).length||\"paint\"===e&&!Object.keys(t).length)}))},e.prototype._validate=function(t,e,r,n,i){return void 0===i&&(i={}),(!i||!1!==i.validate)&&Qn(this,t.call(Xn,{key:e,layerType:this.type,objectKey:r,value:n,styleSpec:Ft,style:{glyphs:!0,sprite:!0}}))},e.prototype.is3D=function(){return!1},e.prototype.isTileClipped=function(){return!1},e.prototype.hasOffscreenPass=function(){return!1},e.prototype.resize=function(){},e.prototype.isStateDependent=function(){for(var t in this.paint._values){var e=this.paint.get(t);if(e instanceof Ui&&$r(e.property.specification)&&(\"source\"===e.value.kind||\"composite\"===e.value.kind)&&e.value.isStateDependent)return!0}return!1},e}(Rt),Ji={Int8:Int8Array,Uint8:Uint8Array,Int16:Int16Array,Uint16:Uint16Array,Int32:Int32Array,Uint32:Uint32Array,Float32:Float32Array},Ki=function(t,e){this._structArray=t,this._pos1=e*this.size,this._pos2=this._pos1/2,this._pos4=this._pos1/4,this._pos8=this._pos1/8},Qi=function(){this.isTransferred=!1,this.capacity=-1,this.resize(0)};function ta(t,e){void 0===e&&(e=1);var r=0,n=0;return{members:t.map((function(t){var i,a=(i=t.type,Ji[i].BYTES_PER_ELEMENT),o=r=ea(r,Math.max(e,a)),s=t.components||1;return n=Math.max(n,a),r+=a*s,{name:t.name,type:t.type,components:s,offset:o}})),size:ea(r,Math.max(n,e)),alignment:e}}function ea(t,e){return Math.ceil(t/e)*e}Qi.serialize=function(t,e){return t._trim(),e&&(t.isTransferred=!0,e.push(t.arrayBuffer)),{length:t.length,arrayBuffer:t.arrayBuffer}},Qi.deserialize=function(t){var e=Object.create(this.prototype);return e.arrayBuffer=t.arrayBuffer,e.length=t.length,e.capacity=t.arrayBuffer.byteLength/e.bytesPerElement,e._refreshViews(),e},Qi.prototype._trim=function(){this.length!==this.capacity&&(this.capacity=this.length,this.arrayBuffer=this.arrayBuffer.slice(0,this.length*this.bytesPerElement),this._refreshViews())},Qi.prototype.clear=function(){this.length=0},Qi.prototype.resize=function(t){this.reserve(t),this.length=t},Qi.prototype.reserve=function(t){if(t>this.capacity){this.capacity=Math.max(t,Math.floor(5*this.capacity),128),this.arrayBuffer=new ArrayBuffer(this.capacity*this.bytesPerElement);var e=this.uint8;this._refreshViews(),e&&this.uint8.set(e)}},Qi.prototype._refreshViews=function(){throw new Error(\"_refreshViews() must be implemented by each concrete StructArray layout\")};var ra=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e){var r=this.length;return this.resize(r+1),this.emplace(r,t,e)},e.prototype.emplace=function(t,e,r){var n=2*t;return this.int16[n+0]=e,this.int16[n+1]=r,t},e}(Qi);ra.prototype.bytesPerElement=4,oi(\"StructArrayLayout2i4\",ra);var na=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n){var i=this.length;return this.resize(i+1),this.emplace(i,t,e,r,n)},e.prototype.emplace=function(t,e,r,n,i){var a=4*t;return this.int16[a+0]=e,this.int16[a+1]=r,this.int16[a+2]=n,this.int16[a+3]=i,t},e}(Qi);na.prototype.bytesPerElement=8,oi(\"StructArrayLayout4i8\",na);var ia=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n,i,a){var o=this.length;return this.resize(o+1),this.emplace(o,t,e,r,n,i,a)},e.prototype.emplace=function(t,e,r,n,i,a,o){var s=6*t;return this.int16[s+0]=e,this.int16[s+1]=r,this.int16[s+2]=n,this.int16[s+3]=i,this.int16[s+4]=a,this.int16[s+5]=o,t},e}(Qi);ia.prototype.bytesPerElement=12,oi(\"StructArrayLayout2i4i12\",ia);var aa=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n,i,a){var o=this.length;return this.resize(o+1),this.emplace(o,t,e,r,n,i,a)},e.prototype.emplace=function(t,e,r,n,i,a,o){var s=4*t,l=8*t;return this.int16[s+0]=e,this.int16[s+1]=r,this.uint8[l+4]=n,this.uint8[l+5]=i,this.uint8[l+6]=a,this.uint8[l+7]=o,t},e}(Qi);aa.prototype.bytesPerElement=8,oi(\"StructArrayLayout2i4ub8\",aa);var oa=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e){var r=this.length;return this.resize(r+1),this.emplace(r,t,e)},e.prototype.emplace=function(t,e,r){var n=2*t;return this.float32[n+0]=e,this.float32[n+1]=r,t},e}(Qi);oa.prototype.bytesPerElement=8,oi(\"StructArrayLayout2f8\",oa);var sa=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n,i,a,o,s,l,c){var u=this.length;return this.resize(u+1),this.emplace(u,t,e,r,n,i,a,o,s,l,c)},e.prototype.emplace=function(t,e,r,n,i,a,o,s,l,c,u){var h=10*t;return this.uint16[h+0]=e,this.uint16[h+1]=r,this.uint16[h+2]=n,this.uint16[h+3]=i,this.uint16[h+4]=a,this.uint16[h+5]=o,this.uint16[h+6]=s,this.uint16[h+7]=l,this.uint16[h+8]=c,this.uint16[h+9]=u,t},e}(Qi);sa.prototype.bytesPerElement=20,oi(\"StructArrayLayout10ui20\",sa);var la=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n,i,a,o,s,l,c,u,h){var f=this.length;return this.resize(f+1),this.emplace(f,t,e,r,n,i,a,o,s,l,c,u,h)},e.prototype.emplace=function(t,e,r,n,i,a,o,s,l,c,u,h,f){var p=12*t;return this.int16[p+0]=e,this.int16[p+1]=r,this.int16[p+2]=n,this.int16[p+3]=i,this.uint16[p+4]=a,this.uint16[p+5]=o,this.uint16[p+6]=s,this.uint16[p+7]=l,this.int16[p+8]=c,this.int16[p+9]=u,this.int16[p+10]=h,this.int16[p+11]=f,t},e}(Qi);la.prototype.bytesPerElement=24,oi(\"StructArrayLayout4i4ui4i24\",la);var ca=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r){var n=this.length;return this.resize(n+1),this.emplace(n,t,e,r)},e.prototype.emplace=function(t,e,r,n){var i=3*t;return this.float32[i+0]=e,this.float32[i+1]=r,this.float32[i+2]=n,t},e}(Qi);ca.prototype.bytesPerElement=12,oi(\"StructArrayLayout3f12\",ca);var ua=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t){var e=this.length;return this.resize(e+1),this.emplace(e,t)},e.prototype.emplace=function(t,e){var r=1*t;return this.uint32[r+0]=e,t},e}(Qi);ua.prototype.bytesPerElement=4,oi(\"StructArrayLayout1ul4\",ua);var ha=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n,i,a,o,s,l){var c=this.length;return this.resize(c+1),this.emplace(c,t,e,r,n,i,a,o,s,l)},e.prototype.emplace=function(t,e,r,n,i,a,o,s,l,c){var u=10*t,h=5*t;return this.int16[u+0]=e,this.int16[u+1]=r,this.int16[u+2]=n,this.int16[u+3]=i,this.int16[u+4]=a,this.int16[u+5]=o,this.uint32[h+3]=s,this.uint16[u+8]=l,this.uint16[u+9]=c,t},e}(Qi);ha.prototype.bytesPerElement=20,oi(\"StructArrayLayout6i1ul2ui20\",ha);var fa=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n,i,a){var o=this.length;return this.resize(o+1),this.emplace(o,t,e,r,n,i,a)},e.prototype.emplace=function(t,e,r,n,i,a,o){var s=6*t;return this.int16[s+0]=e,this.int16[s+1]=r,this.int16[s+2]=n,this.int16[s+3]=i,this.int16[s+4]=a,this.int16[s+5]=o,t},e}(Qi);fa.prototype.bytesPerElement=12,oi(\"StructArrayLayout2i2i2i12\",fa);var pa=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n,i){var a=this.length;return this.resize(a+1),this.emplace(a,t,e,r,n,i)},e.prototype.emplace=function(t,e,r,n,i,a){var o=4*t,s=8*t;return this.float32[o+0]=e,this.float32[o+1]=r,this.float32[o+2]=n,this.int16[s+6]=i,this.int16[s+7]=a,t},e}(Qi);pa.prototype.bytesPerElement=16,oi(\"StructArrayLayout2f1f2i16\",pa);var da=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n){var i=this.length;return this.resize(i+1),this.emplace(i,t,e,r,n)},e.prototype.emplace=function(t,e,r,n,i){var a=12*t,o=3*t;return this.uint8[a+0]=e,this.uint8[a+1]=r,this.float32[o+1]=n,this.float32[o+2]=i,t},e}(Qi);da.prototype.bytesPerElement=12,oi(\"StructArrayLayout2ub2f12\",da);var ma=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r){var n=this.length;return this.resize(n+1),this.emplace(n,t,e,r)},e.prototype.emplace=function(t,e,r,n){var i=3*t;return this.uint16[i+0]=e,this.uint16[i+1]=r,this.uint16[i+2]=n,t},e}(Qi);ma.prototype.bytesPerElement=6,oi(\"StructArrayLayout3ui6\",ma);var ga=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n,i,a,o,s,l,c,u,h,f,p,d,m,g){var y=this.length;return this.resize(y+1),this.emplace(y,t,e,r,n,i,a,o,s,l,c,u,h,f,p,d,m,g)},e.prototype.emplace=function(t,e,r,n,i,a,o,s,l,c,u,h,f,p,d,m,g,y){var v=24*t,x=12*t,_=48*t;return this.int16[v+0]=e,this.int16[v+1]=r,this.uint16[v+2]=n,this.uint16[v+3]=i,this.uint32[x+2]=a,this.uint32[x+3]=o,this.uint32[x+4]=s,this.uint16[v+10]=l,this.uint16[v+11]=c,this.uint16[v+12]=u,this.float32[x+7]=h,this.float32[x+8]=f,this.uint8[_+36]=p,this.uint8[_+37]=d,this.uint8[_+38]=m,this.uint32[x+10]=g,this.int16[v+22]=y,t},e}(Qi);ga.prototype.bytesPerElement=48,oi(\"StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48\",ga);var ya=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n,i,a,o,s,l,c,u,h,f,p,d,m,g,y,v,x,_,b,w,T,k,A,M,S){var E=this.length;return this.resize(E+1),this.emplace(E,t,e,r,n,i,a,o,s,l,c,u,h,f,p,d,m,g,y,v,x,_,b,w,T,k,A,M,S)},e.prototype.emplace=function(t,e,r,n,i,a,o,s,l,c,u,h,f,p,d,m,g,y,v,x,_,b,w,T,k,A,M,S,E){var C=34*t,L=17*t;return this.int16[C+0]=e,this.int16[C+1]=r,this.int16[C+2]=n,this.int16[C+3]=i,this.int16[C+4]=a,this.int16[C+5]=o,this.int16[C+6]=s,this.int16[C+7]=l,this.uint16[C+8]=c,this.uint16[C+9]=u,this.uint16[C+10]=h,this.uint16[C+11]=f,this.uint16[C+12]=p,this.uint16[C+13]=d,this.uint16[C+14]=m,this.uint16[C+15]=g,this.uint16[C+16]=y,this.uint16[C+17]=v,this.uint16[C+18]=x,this.uint16[C+19]=_,this.uint16[C+20]=b,this.uint16[C+21]=w,this.uint16[C+22]=T,this.uint32[L+12]=k,this.float32[L+13]=A,this.float32[L+14]=M,this.float32[L+15]=S,this.float32[L+16]=E,t},e}(Qi);ya.prototype.bytesPerElement=68,oi(\"StructArrayLayout8i15ui1ul4f68\",ya);var va=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t){var e=this.length;return this.resize(e+1),this.emplace(e,t)},e.prototype.emplace=function(t,e){var r=1*t;return this.float32[r+0]=e,t},e}(Qi);va.prototype.bytesPerElement=4,oi(\"StructArrayLayout1f4\",va);var xa=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r){var n=this.length;return this.resize(n+1),this.emplace(n,t,e,r)},e.prototype.emplace=function(t,e,r,n){var i=3*t;return this.int16[i+0]=e,this.int16[i+1]=r,this.int16[i+2]=n,t},e}(Qi);xa.prototype.bytesPerElement=6,oi(\"StructArrayLayout3i6\",xa);var _a=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r){var n=this.length;return this.resize(n+1),this.emplace(n,t,e,r)},e.prototype.emplace=function(t,e,r,n){var i=2*t,a=4*t;return this.uint32[i+0]=e,this.uint16[a+2]=r,this.uint16[a+3]=n,t},e}(Qi);_a.prototype.bytesPerElement=8,oi(\"StructArrayLayout1ul2ui8\",_a);var ba=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e){var r=this.length;return this.resize(r+1),this.emplace(r,t,e)},e.prototype.emplace=function(t,e,r){var n=2*t;return this.uint16[n+0]=e,this.uint16[n+1]=r,t},e}(Qi);ba.prototype.bytesPerElement=4,oi(\"StructArrayLayout2ui4\",ba);var wa=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t){var e=this.length;return this.resize(e+1),this.emplace(e,t)},e.prototype.emplace=function(t,e){var r=1*t;return this.uint16[r+0]=e,t},e}(Qi);wa.prototype.bytesPerElement=2,oi(\"StructArrayLayout1ui2\",wa);var Ta=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n){var i=this.length;return this.resize(i+1),this.emplace(i,t,e,r,n)},e.prototype.emplace=function(t,e,r,n,i){var a=4*t;return this.float32[a+0]=e,this.float32[a+1]=r,this.float32[a+2]=n,this.float32[a+3]=i,t},e}(Qi);Ta.prototype.bytesPerElement=16,oi(\"StructArrayLayout4f16\",Ta);var ka=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var r={anchorPointX:{configurable:!0},anchorPointY:{configurable:!0},x1:{configurable:!0},y1:{configurable:!0},x2:{configurable:!0},y2:{configurable:!0},featureIndex:{configurable:!0},sourceLayerIndex:{configurable:!0},bucketIndex:{configurable:!0},anchorPoint:{configurable:!0}};return r.anchorPointX.get=function(){return this._structArray.int16[this._pos2+0]},r.anchorPointY.get=function(){return this._structArray.int16[this._pos2+1]},r.x1.get=function(){return this._structArray.int16[this._pos2+2]},r.y1.get=function(){return this._structArray.int16[this._pos2+3]},r.x2.get=function(){return this._structArray.int16[this._pos2+4]},r.y2.get=function(){return this._structArray.int16[this._pos2+5]},r.featureIndex.get=function(){return this._structArray.uint32[this._pos4+3]},r.sourceLayerIndex.get=function(){return this._structArray.uint16[this._pos2+8]},r.bucketIndex.get=function(){return this._structArray.uint16[this._pos2+9]},r.anchorPoint.get=function(){return new a(this.anchorPointX,this.anchorPointY)},Object.defineProperties(e.prototype,r),e}(Ki);ka.prototype.size=20;var Aa=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.get=function(t){return new ka(this,t)},e}(ha);oi(\"CollisionBoxArray\",Aa);var Ma=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var r={anchorX:{configurable:!0},anchorY:{configurable:!0},glyphStartIndex:{configurable:!0},numGlyphs:{configurable:!0},vertexStartIndex:{configurable:!0},lineStartIndex:{configurable:!0},lineLength:{configurable:!0},segment:{configurable:!0},lowerSize:{configurable:!0},upperSize:{configurable:!0},lineOffsetX:{configurable:!0},lineOffsetY:{configurable:!0},writingMode:{configurable:!0},placedOrientation:{configurable:!0},hidden:{configurable:!0},crossTileID:{configurable:!0},associatedIconIndex:{configurable:!0}};return r.anchorX.get=function(){return this._structArray.int16[this._pos2+0]},r.anchorY.get=function(){return this._structArray.int16[this._pos2+1]},r.glyphStartIndex.get=function(){return this._structArray.uint16[this._pos2+2]},r.numGlyphs.get=function(){return this._structArray.uint16[this._pos2+3]},r.vertexStartIndex.get=function(){return this._structArray.uint32[this._pos4+2]},r.lineStartIndex.get=function(){return this._structArray.uint32[this._pos4+3]},r.lineLength.get=function(){return this._structArray.uint32[this._pos4+4]},r.segment.get=function(){return this._structArray.uint16[this._pos2+10]},r.lowerSize.get=function(){return this._structArray.uint16[this._pos2+11]},r.upperSize.get=function(){return this._structArray.uint16[this._pos2+12]},r.lineOffsetX.get=function(){return this._structArray.float32[this._pos4+7]},r.lineOffsetY.get=function(){return this._structArray.float32[this._pos4+8]},r.writingMode.get=function(){return this._structArray.uint8[this._pos1+36]},r.placedOrientation.get=function(){return this._structArray.uint8[this._pos1+37]},r.placedOrientation.set=function(t){this._structArray.uint8[this._pos1+37]=t},r.hidden.get=function(){return this._structArray.uint8[this._pos1+38]},r.hidden.set=function(t){this._structArray.uint8[this._pos1+38]=t},r.crossTileID.get=function(){return this._structArray.uint32[this._pos4+10]},r.crossTileID.set=function(t){this._structArray.uint32[this._pos4+10]=t},r.associatedIconIndex.get=function(){return this._structArray.int16[this._pos2+22]},Object.defineProperties(e.prototype,r),e}(Ki);Ma.prototype.size=48;var Sa=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.get=function(t){return new Ma(this,t)},e}(ga);oi(\"PlacedSymbolArray\",Sa);var Ea=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var r={anchorX:{configurable:!0},anchorY:{configurable:!0},rightJustifiedTextSymbolIndex:{configurable:!0},centerJustifiedTextSymbolIndex:{configurable:!0},leftJustifiedTextSymbolIndex:{configurable:!0},verticalPlacedTextSymbolIndex:{configurable:!0},placedIconSymbolIndex:{configurable:!0},verticalPlacedIconSymbolIndex:{configurable:!0},key:{configurable:!0},textBoxStartIndex:{configurable:!0},textBoxEndIndex:{configurable:!0},verticalTextBoxStartIndex:{configurable:!0},verticalTextBoxEndIndex:{configurable:!0},iconBoxStartIndex:{configurable:!0},iconBoxEndIndex:{configurable:!0},verticalIconBoxStartIndex:{configurable:!0},verticalIconBoxEndIndex:{configurable:!0},featureIndex:{configurable:!0},numHorizontalGlyphVertices:{configurable:!0},numVerticalGlyphVertices:{configurable:!0},numIconVertices:{configurable:!0},numVerticalIconVertices:{configurable:!0},useRuntimeCollisionCircles:{configurable:!0},crossTileID:{configurable:!0},textBoxScale:{configurable:!0},textOffset0:{configurable:!0},textOffset1:{configurable:!0},collisionCircleDiameter:{configurable:!0}};return r.anchorX.get=function(){return this._structArray.int16[this._pos2+0]},r.anchorY.get=function(){return this._structArray.int16[this._pos2+1]},r.rightJustifiedTextSymbolIndex.get=function(){return this._structArray.int16[this._pos2+2]},r.centerJustifiedTextSymbolIndex.get=function(){return this._structArray.int16[this._pos2+3]},r.leftJustifiedTextSymbolIndex.get=function(){return this._structArray.int16[this._pos2+4]},r.verticalPlacedTextSymbolIndex.get=function(){return this._structArray.int16[this._pos2+5]},r.placedIconSymbolIndex.get=function(){return this._structArray.int16[this._pos2+6]},r.verticalPlacedIconSymbolIndex.get=function(){return this._structArray.int16[this._pos2+7]},r.key.get=function(){return this._structArray.uint16[this._pos2+8]},r.textBoxStartIndex.get=function(){return this._structArray.uint16[this._pos2+9]},r.textBoxEndIndex.get=function(){return this._structArray.uint16[this._pos2+10]},r.verticalTextBoxStartIndex.get=function(){return this._structArray.uint16[this._pos2+11]},r.verticalTextBoxEndIndex.get=function(){return this._structArray.uint16[this._pos2+12]},r.iconBoxStartIndex.get=function(){return this._structArray.uint16[this._pos2+13]},r.iconBoxEndIndex.get=function(){return this._structArray.uint16[this._pos2+14]},r.verticalIconBoxStartIndex.get=function(){return this._structArray.uint16[this._pos2+15]},r.verticalIconBoxEndIndex.get=function(){return this._structArray.uint16[this._pos2+16]},r.featureIndex.get=function(){return this._structArray.uint16[this._pos2+17]},r.numHorizontalGlyphVertices.get=function(){return this._structArray.uint16[this._pos2+18]},r.numVerticalGlyphVertices.get=function(){return this._structArray.uint16[this._pos2+19]},r.numIconVertices.get=function(){return this._structArray.uint16[this._pos2+20]},r.numVerticalIconVertices.get=function(){return this._structArray.uint16[this._pos2+21]},r.useRuntimeCollisionCircles.get=function(){return this._structArray.uint16[this._pos2+22]},r.crossTileID.get=function(){return this._structArray.uint32[this._pos4+12]},r.crossTileID.set=function(t){this._structArray.uint32[this._pos4+12]=t},r.textBoxScale.get=function(){return this._structArray.float32[this._pos4+13]},r.textOffset0.get=function(){return this._structArray.float32[this._pos4+14]},r.textOffset1.get=function(){return this._structArray.float32[this._pos4+15]},r.collisionCircleDiameter.get=function(){return this._structArray.float32[this._pos4+16]},Object.defineProperties(e.prototype,r),e}(Ki);Ea.prototype.size=68;var Ca=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.get=function(t){return new Ea(this,t)},e}(ya);oi(\"SymbolInstanceArray\",Ca);var La=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.getoffsetX=function(t){return this.float32[1*t+0]},e}(va);oi(\"GlyphOffsetArray\",La);var Ia=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.getx=function(t){return this.int16[3*t+0]},e.prototype.gety=function(t){return this.int16[3*t+1]},e.prototype.gettileUnitDistanceFromAnchor=function(t){return this.int16[3*t+2]},e}(xa);oi(\"SymbolLineVertexArray\",Ia);var Pa=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var r={featureIndex:{configurable:!0},sourceLayerIndex:{configurable:!0},bucketIndex:{configurable:!0}};return r.featureIndex.get=function(){return this._structArray.uint32[this._pos4+0]},r.sourceLayerIndex.get=function(){return this._structArray.uint16[this._pos2+2]},r.bucketIndex.get=function(){return this._structArray.uint16[this._pos2+3]},Object.defineProperties(e.prototype,r),e}(Ki);Pa.prototype.size=8;var za=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.get=function(t){return new Pa(this,t)},e}(_a);oi(\"FeatureIndexArray\",za);var Oa=ta([{name:\"a_pos\",components:2,type:\"Int16\"}],4).members,Da=function(t){void 0===t&&(t=[]),this.segments=t};function Ra(t,e){return 256*(t=h(Math.floor(t),0,255))+h(Math.floor(e),0,255)}Da.prototype.prepareSegment=function(t,e,r,n){var i=this.segments[this.segments.length-1];return t>Da.MAX_VERTEX_ARRAY_LENGTH&&k(\"Max vertices per segment is \"+Da.MAX_VERTEX_ARRAY_LENGTH+\": bucket requested \"+t),(!i||i.vertexLength+t>Da.MAX_VERTEX_ARRAY_LENGTH||i.sortKey!==n)&&(i={vertexOffset:e.length,primitiveOffset:r.length,vertexLength:0,primitiveLength:0},void 0!==n&&(i.sortKey=n),this.segments.push(i)),i},Da.prototype.get=function(){return this.segments},Da.prototype.destroy=function(){for(var t=0,e=this.segments;t>>16)*o&65535)<<16)&4294967295)<<15|l>>>17))*s+(((l>>>16)*s&65535)<<16)&4294967295)<<13|i>>>19))+((5*(i>>>16)&65535)<<16)&4294967295))+((58964+(a>>>16)&65535)<<16);switch(l=0,r){case 3:l^=(255&t.charCodeAt(c+2))<<16;case 2:l^=(255&t.charCodeAt(c+1))<<8;case 1:i^=l=(65535&(l=(l=(65535&(l^=255&t.charCodeAt(c)))*o+(((l>>>16)*o&65535)<<16)&4294967295)<<15|l>>>17))*s+(((l>>>16)*s&65535)<<16)&4294967295}return i^=t.length,i=2246822507*(65535&(i^=i>>>16))+((2246822507*(i>>>16)&65535)<<16)&4294967295,i=3266489909*(65535&(i^=i>>>13))+((3266489909*(i>>>16)&65535)<<16)&4294967295,(i^=i>>>16)>>>0}})),Na=e((function(t){t.exports=function(t,e){for(var r,n=t.length,i=e^n,a=0;n>=4;)r=1540483477*(65535&(r=255&t.charCodeAt(a)|(255&t.charCodeAt(++a))<<8|(255&t.charCodeAt(++a))<<16|(255&t.charCodeAt(++a))<<24))+((1540483477*(r>>>16)&65535)<<16),i=1540483477*(65535&i)+((1540483477*(i>>>16)&65535)<<16)^(r=1540483477*(65535&(r^=r>>>24))+((1540483477*(r>>>16)&65535)<<16)),n-=4,++a;switch(n){case 3:i^=(255&t.charCodeAt(a+2))<<16;case 2:i^=(255&t.charCodeAt(a+1))<<8;case 1:i=1540483477*(65535&(i^=255&t.charCodeAt(a)))+((1540483477*(i>>>16)&65535)<<16)}return i=1540483477*(65535&(i^=i>>>13))+((1540483477*(i>>>16)&65535)<<16),(i^=i>>>15)>>>0}})),ja=Ba,Ua=Ba,Va=Na;ja.murmur3=Ua,ja.murmur2=Va;var qa=function(){this.ids=[],this.positions=[],this.indexed=!1};qa.prototype.add=function(t,e,r,n){this.ids.push(Ga(t)),this.positions.push(e,r,n)},qa.prototype.getPositions=function(t){for(var e=Ga(t),r=0,n=this.ids.length-1;r>1;this.ids[i]>=e?n=i:r=i+1}for(var a=[];this.ids[r]===e;){var o=this.positions[3*r],s=this.positions[3*r+1],l=this.positions[3*r+2];a.push({index:o,start:s,end:l}),r++}return a},qa.serialize=function(t,e){var r=new Float64Array(t.ids),n=new Uint32Array(t.positions);return Za(r,n,0,r.length-1),e&&e.push(r.buffer,n.buffer),{ids:r,positions:n}},qa.deserialize=function(t){var e=new qa;return e.ids=t.ids,e.positions=t.positions,e.indexed=!0,e};var Ha=Math.pow(2,53)-1;function Ga(t){var e=+t;return!isNaN(e)&&e<=Ha?e:ja(String(t))}function Za(t,e,r,n){for(;r>1],a=r-1,o=n+1;;){do{a++}while(t[a]i);if(a>=o)break;Wa(t,a,o),Wa(e,3*a,3*o),Wa(e,3*a+1,3*o+1),Wa(e,3*a+2,3*o+2)}o-ro.x+1||lo.y+1)&&k(\"Geometry exceeds allowed extent, reduce your vector tile buffer size\")}return r}function vo(t,e){return{type:t.type,id:t.id,properties:t.properties,geometry:e?yo(t):[]}}function xo(t,e,r,n,i){t.emplaceBack(2*e+(n+1)/2,2*r+(i+1)/2)}var _o=function(t){this.zoom=t.zoom,this.overscaling=t.overscaling,this.layers=t.layers,this.layerIds=this.layers.map((function(t){return t.id})),this.index=t.index,this.hasPattern=!1,this.layoutVertexArray=new ra,this.indexArray=new ma,this.segments=new Da,this.programConfigurations=new uo(t.layers,t.zoom),this.stateDependentLayerIds=this.layers.filter((function(t){return t.isStateDependent()})).map((function(t){return t.id}))};function bo(t,e){for(var r=0;r1){if(Ao(t,e))return!0;for(var n=0;n1?t.distSqr(r):t.distSqr(r.sub(e)._mult(i)._add(e))}function Co(t,e){for(var r,n,i,a=!1,o=0;oe.y!=i.y>e.y&&e.x<(i.x-n.x)*(e.y-n.y)/(i.y-n.y)+n.x&&(a=!a);return a}function Lo(t,e){for(var r=!1,n=0,i=t.length-1;ne.y!=o.y>e.y&&e.x<(o.x-a.x)*(e.y-a.y)/(o.y-a.y)+a.x&&(r=!r)}return r}function Io(t,e,r){var n=r[0],i=r[2];if(t.xi.x&&e.x>i.x||t.yi.y&&e.y>i.y)return!1;var a=A(t,e,r[0]);return a!==A(t,e,r[1])||a!==A(t,e,r[2])||a!==A(t,e,r[3])}function Po(t,e,r){var n=e.paint.get(t).value;return\"constant\"===n.kind?n.value:r.programConfigurations.get(e.id).getMaxValue(t)}function zo(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1])}function Oo(t,e,r,n,i){if(!e[0]&&!e[1])return t;var o=a.convert(e)._mult(i);\"viewport\"===r&&o._rotate(-n);for(var s=[],l=0;l=po||u<0||u>=po)){var h=this.segments.prepareSegment(4,this.layoutVertexArray,this.indexArray,t.sortKey),f=h.vertexLength;xo(this.layoutVertexArray,c,u,-1,-1),xo(this.layoutVertexArray,c,u,1,-1),xo(this.layoutVertexArray,c,u,1,1),xo(this.layoutVertexArray,c,u,-1,1),this.indexArray.emplaceBack(f,f+1,f+2),this.indexArray.emplaceBack(f,f+3,f+2),h.vertexLength+=4,h.primitiveLength+=2}}this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length,t,r,{},n)},oi(\"CircleBucket\",_o,{omit:[\"layers\"]});var Do=new Yi({\"circle-sort-key\":new Hi(Ft.layout_circle[\"circle-sort-key\"])}),Ro={paint:new Yi({\"circle-radius\":new Hi(Ft.paint_circle[\"circle-radius\"]),\"circle-color\":new Hi(Ft.paint_circle[\"circle-color\"]),\"circle-blur\":new Hi(Ft.paint_circle[\"circle-blur\"]),\"circle-opacity\":new Hi(Ft.paint_circle[\"circle-opacity\"]),\"circle-translate\":new qi(Ft.paint_circle[\"circle-translate\"]),\"circle-translate-anchor\":new qi(Ft.paint_circle[\"circle-translate-anchor\"]),\"circle-pitch-scale\":new qi(Ft.paint_circle[\"circle-pitch-scale\"]),\"circle-pitch-alignment\":new qi(Ft.paint_circle[\"circle-pitch-alignment\"]),\"circle-stroke-width\":new Hi(Ft.paint_circle[\"circle-stroke-width\"]),\"circle-stroke-color\":new Hi(Ft.paint_circle[\"circle-stroke-color\"]),\"circle-stroke-opacity\":new Hi(Ft.paint_circle[\"circle-stroke-opacity\"])}),layout:Do},Fo=\"undefined\"!=typeof Float32Array?Float32Array:Array;function Bo(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}function No(t,e,r){var n=e[0],i=e[1],a=e[2],o=e[3],s=e[4],l=e[5],c=e[6],u=e[7],h=e[8],f=e[9],p=e[10],d=e[11],m=e[12],g=e[13],y=e[14],v=e[15],x=r[0],_=r[1],b=r[2],w=r[3];return t[0]=x*n+_*s+b*h+w*m,t[1]=x*i+_*l+b*f+w*g,t[2]=x*a+_*c+b*p+w*y,t[3]=x*o+_*u+b*d+w*v,x=r[4],_=r[5],b=r[6],w=r[7],t[4]=x*n+_*s+b*h+w*m,t[5]=x*i+_*l+b*f+w*g,t[6]=x*a+_*c+b*p+w*y,t[7]=x*o+_*u+b*d+w*v,x=r[8],_=r[9],b=r[10],w=r[11],t[8]=x*n+_*s+b*h+w*m,t[9]=x*i+_*l+b*f+w*g,t[10]=x*a+_*c+b*p+w*y,t[11]=x*o+_*u+b*d+w*v,x=r[12],_=r[13],b=r[14],w=r[15],t[12]=x*n+_*s+b*h+w*m,t[13]=x*i+_*l+b*f+w*g,t[14]=x*a+_*c+b*p+w*y,t[15]=x*o+_*u+b*d+w*v,t}Math.hypot||(Math.hypot=function(){for(var t=arguments,e=0,r=arguments.length;r--;)e+=t[r]*t[r];return Math.sqrt(e)});var jo=No;var Uo,Vo=function(t,e,r){return t[0]=e[0]-r[0],t[1]=e[1]-r[1],t[2]=e[2]-r[2],t};function qo(t,e,r){var n=e[0],i=e[1],a=e[2],o=e[3];return t[0]=r[0]*n+r[4]*i+r[8]*a+r[12]*o,t[1]=r[1]*n+r[5]*i+r[9]*a+r[13]*o,t[2]=r[2]*n+r[6]*i+r[10]*a+r[14]*o,t[3]=r[3]*n+r[7]*i+r[11]*a+r[15]*o,t}Uo=new Fo(3),Fo!=Float32Array&&(Uo[0]=0,Uo[1]=0,Uo[2]=0),function(){var t=new Fo(4);Fo!=Float32Array&&(t[0]=0,t[1]=0,t[2]=0,t[3]=0)}();var Ho=function(t){var e=t[0],r=t[1];return e*e+r*r},Go=(function(){var t=new Fo(2);Fo!=Float32Array&&(t[0]=0,t[1]=0)}(),function(t){function e(e){t.call(this,e,Ro)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.createBucket=function(t){return new _o(t)},e.prototype.queryRadius=function(t){var e=t;return Po(\"circle-radius\",this,e)+Po(\"circle-stroke-width\",this,e)+zo(this.paint.get(\"circle-translate\"))},e.prototype.queryIntersectsFeature=function(t,e,r,n,i,a,o,s){for(var l=Oo(t,this.paint.get(\"circle-translate\"),this.paint.get(\"circle-translate-anchor\"),a.angle,o),c=this.paint.get(\"circle-radius\").evaluate(e,r)+this.paint.get(\"circle-stroke-width\").evaluate(e,r),u=\"map\"===this.paint.get(\"circle-pitch-alignment\"),h=u?l:function(t,e){return t.map((function(t){return Zo(t,e)}))}(l,s),f=u?c*o:c,p=0,d=n;pt.width||i.height>t.height||r.x>t.width-i.width||r.y>t.height-i.height)throw new RangeError(\"out of range source coordinates for image copy\");if(i.width>e.width||i.height>e.height||n.x>e.width-i.width||n.y>e.height-i.height)throw new RangeError(\"out of range destination coordinates for image copy\");for(var o=t.data,s=e.data,l=0;l80*r){n=a=t[0],i=o=t[1];for(var d=r;da&&(a=s),l>o&&(o=l);c=0!==(c=Math.max(a-n,o-i))?1/c:0}return us(f,p,r,n,i,c),p}function ls(t,e,r,n,i){var a,o;if(i===Ps(t,e,r,n)>0)for(a=e;a=e;a-=n)o=Cs(a,t[a],t[a+1],o);return o&&Ts(o,o.next)&&(Ls(o),o=o.next),o}function cs(t,e){if(!t)return t;e||(e=t);var r,n=t;do{if(r=!1,n.steiner||!Ts(n,n.next)&&0!==ws(n.prev,n,n.next))n=n.next;else{if(Ls(n),(n=e=n.prev)===n.next)break;r=!0}}while(r||n!==e);return e}function us(t,e,r,n,i,a,o){if(t){!o&&a&&function(t,e,r,n){var i=t;do{null===i.z&&(i.z=vs(i.x,i.y,e,r,n)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next}while(i!==t);i.prevZ.nextZ=null,i.prevZ=null,function(t){var e,r,n,i,a,o,s,l,c=1;do{for(r=t,t=null,a=null,o=0;r;){for(o++,n=r,s=0,e=0;e0||l>0&&n;)0!==s&&(0===l||!n||r.z<=n.z)?(i=r,r=r.nextZ,s--):(i=n,n=n.nextZ,l--),a?a.nextZ=i:t=i,i.prevZ=a,a=i;r=n}a.nextZ=null,c*=2}while(o>1)}(i)}(t,n,i,a);for(var s,l,c=t;t.prev!==t.next;)if(s=t.prev,l=t.next,a?fs(t,n,i,a):hs(t))e.push(s.i/r),e.push(t.i/r),e.push(l.i/r),Ls(t),t=l.next,c=l.next;else if((t=l)===c){o?1===o?us(t=ps(cs(t),e,r),e,r,n,i,a,2):2===o&&ds(t,e,r,n,i,a):us(cs(t),e,r,n,i,a,1);break}}}function hs(t){var e=t.prev,r=t,n=t.next;if(ws(e,r,n)>=0)return!1;for(var i=t.next.next;i!==t.prev;){if(_s(e.x,e.y,r.x,r.y,n.x,n.y,i.x,i.y)&&ws(i.prev,i,i.next)>=0)return!1;i=i.next}return!0}function fs(t,e,r,n){var i=t.prev,a=t,o=t.next;if(ws(i,a,o)>=0)return!1;for(var s=i.xa.x?i.x>o.x?i.x:o.x:a.x>o.x?a.x:o.x,u=i.y>a.y?i.y>o.y?i.y:o.y:a.y>o.y?a.y:o.y,h=vs(s,l,e,r,n),f=vs(c,u,e,r,n),p=t.prevZ,d=t.nextZ;p&&p.z>=h&&d&&d.z<=f;){if(p!==t.prev&&p!==t.next&&_s(i.x,i.y,a.x,a.y,o.x,o.y,p.x,p.y)&&ws(p.prev,p,p.next)>=0)return!1;if(p=p.prevZ,d!==t.prev&&d!==t.next&&_s(i.x,i.y,a.x,a.y,o.x,o.y,d.x,d.y)&&ws(d.prev,d,d.next)>=0)return!1;d=d.nextZ}for(;p&&p.z>=h;){if(p!==t.prev&&p!==t.next&&_s(i.x,i.y,a.x,a.y,o.x,o.y,p.x,p.y)&&ws(p.prev,p,p.next)>=0)return!1;p=p.prevZ}for(;d&&d.z<=f;){if(d!==t.prev&&d!==t.next&&_s(i.x,i.y,a.x,a.y,o.x,o.y,d.x,d.y)&&ws(d.prev,d,d.next)>=0)return!1;d=d.nextZ}return!0}function ps(t,e,r){var n=t;do{var i=n.prev,a=n.next.next;!Ts(i,a)&&ks(i,n,n.next,a)&&Ss(i,a)&&Ss(a,i)&&(e.push(i.i/r),e.push(n.i/r),e.push(a.i/r),Ls(n),Ls(n.next),n=t=a),n=n.next}while(n!==t);return cs(n)}function ds(t,e,r,n,i,a){var o=t;do{for(var s=o.next.next;s!==o.prev;){if(o.i!==s.i&&bs(o,s)){var l=Es(o,s);return o=cs(o,o.next),l=cs(l,l.next),us(o,e,r,n,i,a),void us(l,e,r,n,i,a)}s=s.next}o=o.next}while(o!==t)}function ms(t,e){return t.x-e.x}function gs(t,e){if(e=function(t,e){var r,n=e,i=t.x,a=t.y,o=-1/0;do{if(a<=n.y&&a>=n.next.y&&n.next.y!==n.y){var s=n.x+(a-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(s<=i&&s>o){if(o=s,s===i){if(a===n.y)return n;if(a===n.next.y)return n.next}r=n.x=n.x&&n.x>=u&&i!==n.x&&_s(ar.x||n.x===r.x&&ys(r,n)))&&(r=n,f=l)),n=n.next}while(n!==c);return r}(t,e)){var r=Es(e,t);cs(e,e.next),cs(r,r.next)}}function ys(t,e){return ws(t.prev,t,e.prev)<0&&ws(e.next,t,t.next)<0}function vs(t,e,r,n,i){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=32767*(t-r)*i)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=32767*(e-n)*i)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function xs(t){var e=t,r=t;do{(e.x=0&&(t-o)*(n-s)-(r-o)*(e-s)>=0&&(r-o)*(a-s)-(i-o)*(n-s)>=0}function bs(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){var r=t;do{if(r.i!==t.i&&r.next.i!==t.i&&r.i!==e.i&&r.next.i!==e.i&&ks(r,r.next,t,e))return!0;r=r.next}while(r!==t);return!1}(t,e)&&(Ss(t,e)&&Ss(e,t)&&function(t,e){var r=t,n=!1,i=(t.x+e.x)/2,a=(t.y+e.y)/2;do{r.y>a!=r.next.y>a&&r.next.y!==r.y&&i<(r.next.x-r.x)*(a-r.y)/(r.next.y-r.y)+r.x&&(n=!n),r=r.next}while(r!==t);return n}(t,e)&&(ws(t.prev,t,e.prev)||ws(t,e.prev,e))||Ts(t,e)&&ws(t.prev,t,t.next)>0&&ws(e.prev,e,e.next)>0)}function ws(t,e,r){return(e.y-t.y)*(r.x-e.x)-(e.x-t.x)*(r.y-e.y)}function Ts(t,e){return t.x===e.x&&t.y===e.y}function ks(t,e,r,n){var i=Ms(ws(t,e,r)),a=Ms(ws(t,e,n)),o=Ms(ws(r,n,t)),s=Ms(ws(r,n,e));return i!==a&&o!==s||!(0!==i||!As(t,r,e))||!(0!==a||!As(t,n,e))||!(0!==o||!As(r,t,n))||!(0!==s||!As(r,e,n))}function As(t,e,r){return e.x<=Math.max(t.x,r.x)&&e.x>=Math.min(t.x,r.x)&&e.y<=Math.max(t.y,r.y)&&e.y>=Math.min(t.y,r.y)}function Ms(t){return t>0?1:t<0?-1:0}function Ss(t,e){return ws(t.prev,t,t.next)<0?ws(t,e,t.next)>=0&&ws(t,t.prev,e)>=0:ws(t,e,t.prev)<0||ws(t,t.next,e)<0}function Es(t,e){var r=new Is(t.i,t.x,t.y),n=new Is(e.i,e.x,e.y),i=t.next,a=e.prev;return t.next=e,e.prev=t,r.next=i,i.prev=r,n.next=r,r.prev=n,a.next=n,n.prev=a,n}function Cs(t,e,r,n){var i=new Is(t,e,r);return n?(i.next=n.next,i.prev=n,n.next.prev=i,n.next=i):(i.prev=i,i.next=i),i}function Ls(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function Is(t,e,r){this.i=t,this.x=e,this.y=r,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}function Ps(t,e,r,n){for(var i=0,a=e,o=r-n;ar;){if(n-r>600){var a=n-r+1,o=e-r+1,s=Math.log(a),l=.5*Math.exp(2*s/3),c=.5*Math.sqrt(s*l*(a-l)/a)*(o-a/2<0?-1:1);Os(t,e,Math.max(r,Math.floor(e-o*l/a+c)),Math.min(n,Math.floor(e+(a-o)*l/a+c)),i)}var u=t[e],h=r,f=n;for(Ds(t,r,e),i(t[n],u)>0&&Ds(t,r,n);h0;)f--}0===i(t[r],u)?Ds(t,r,f):Ds(t,++f,n),f<=e&&(r=f+1),e<=f&&(n=f-1)}}function Ds(t,e,r){var n=t[e];t[e]=t[r],t[r]=n}function Rs(t,e){return te?1:0}function Fs(t,e){var r=t.length;if(r<=1)return[t];for(var n,i,a=[],o=0;o1)for(var l=0;l0&&(n+=t[i-1].length,r.holes.push(n))}return r},as.default=os;var Us=function(t){this.zoom=t.zoom,this.overscaling=t.overscaling,this.layers=t.layers,this.layerIds=this.layers.map((function(t){return t.id})),this.index=t.index,this.hasPattern=!1,this.patternFeatures=[],this.layoutVertexArray=new ra,this.indexArray=new ma,this.indexArray2=new ba,this.programConfigurations=new uo(t.layers,t.zoom),this.segments=new Da,this.segments2=new Da,this.stateDependentLayerIds=this.layers.filter((function(t){return t.isStateDependent()})).map((function(t){return t.id}))};Us.prototype.populate=function(t,e,r){this.hasPattern=Ns(\"fill\",this.layers,e);for(var n=this.layers[0].layout.get(\"fill-sort-key\"),i=[],a=0,o=t;a>3}if(i--,1===n||2===n)o+=t.readSVarint(),s+=t.readSVarint(),1===n&&(e&&l.push(e),e=[]),e.push(new a(o,s));else{if(7!==n)throw new Error(\"unknown command \"+n);e&&e.push(e[0].clone())}}return e&&l.push(e),l},Ws.prototype.bbox=function(){var t=this._pbf;t.pos=this._geometry;for(var e=t.readVarint()+t.pos,r=1,n=0,i=0,a=0,o=1/0,s=-1/0,l=1/0,c=-1/0;t.pos>3}if(n--,1===r||2===r)(i+=t.readSVarint())s&&(s=i),(a+=t.readSVarint())c&&(c=a);else if(7!==r)throw new Error(\"unknown command \"+r)}return[o,l,s,c]},Ws.prototype.toGeoJSON=function(t,e,r){var n,i,a=this.extent*Math.pow(2,r),o=this.extent*t,s=this.extent*e,l=this.loadGeometry(),c=Ws.types[this.type];function u(t){for(var e=0;e>3;e=1===n?t.readString():2===n?t.readFloat():3===n?t.readDouble():4===n?t.readVarint64():5===n?t.readVarint():6===n?t.readSVarint():7===n?t.readBoolean():null}return e}(r))}function Qs(t,e,r){if(3===t){var n=new $s(r,r.readVarint()+r.pos);n.length&&(e[n.name]=n)}}Js.prototype.feature=function(t){if(t<0||t>=this._features.length)throw new Error(\"feature index out of bounds\");this._pbf.pos=this._features[t];var e=this._pbf.readVarint()+this._pbf.pos;return new Zs(this._pbf,e,this.extent,this._keys,this._values)};var tl={VectorTile:function(t,e){this.layers=t.readFields(Qs,{},e)},VectorTileFeature:Zs,VectorTileLayer:$s},el=tl.VectorTileFeature.types,rl=Math.pow(2,13);function nl(t,e,r,n,i,a,o,s){t.emplaceBack(e,r,2*Math.floor(n*rl)+o,i*rl*2,a*rl*2,Math.round(s))}var il=function(t){this.zoom=t.zoom,this.overscaling=t.overscaling,this.layers=t.layers,this.layerIds=this.layers.map((function(t){return t.id})),this.index=t.index,this.hasPattern=!1,this.layoutVertexArray=new ia,this.indexArray=new ma,this.programConfigurations=new uo(t.layers,t.zoom),this.segments=new Da,this.stateDependentLayerIds=this.layers.filter((function(t){return t.isStateDependent()})).map((function(t){return t.id}))};function al(t,e){return t.x===e.x&&(t.x<0||t.x>po)||t.y===e.y&&(t.y<0||t.y>po)}il.prototype.populate=function(t,e,r){this.features=[],this.hasPattern=Ns(\"fill-extrusion\",this.layers,e);for(var n=0,i=t;npo}))||P.every((function(t){return t.y<0}))||P.every((function(t){return t.y>po}))))for(var m=0,g=0;g=1){var v=d[g-1];if(!al(y,v)){h.vertexLength+4>Da.MAX_VERTEX_ARRAY_LENGTH&&(h=this.segments.prepareSegment(4,this.layoutVertexArray,this.indexArray));var x=y.sub(v)._perp()._unit(),_=v.dist(y);m+_>32768&&(m=0),nl(this.layoutVertexArray,y.x,y.y,x.x,x.y,0,0,m),nl(this.layoutVertexArray,y.x,y.y,x.x,x.y,0,1,m),m+=_,nl(this.layoutVertexArray,v.x,v.y,x.x,x.y,0,0,m),nl(this.layoutVertexArray,v.x,v.y,x.x,x.y,0,1,m);var b=h.vertexLength;this.indexArray.emplaceBack(b,b+2,b+1),this.indexArray.emplaceBack(b+1,b+2,b+3),h.vertexLength+=4,h.primitiveLength+=2}}}}if(h.vertexLength+l>Da.MAX_VERTEX_ARRAY_LENGTH&&(h=this.segments.prepareSegment(l,this.layoutVertexArray,this.indexArray)),\"Polygon\"===el[t.type]){for(var w=[],T=[],k=h.vertexLength,A=0,M=s;A=2&&t[l-1].equals(t[l-2]);)l--;for(var c=0;c0;if(T&&y>c){var A=u.dist(p);if(A>2*h){var M=u.sub(u.sub(p)._mult(h/A)._round());this.updateDistance(p,M),this.addCurrentVertex(M,m,0,0,f),p=M}}var S=p&&d,E=S?r:s?\"butt\":n;if(S&&\"round\"===E&&(bi&&(E=\"bevel\"),\"bevel\"===E&&(b>2&&(E=\"flipbevel\"),b100)v=g.mult(-1);else{var C=b*m.add(g).mag()/m.sub(g).mag();v._perp()._mult(C*(k?-1:1))}this.addCurrentVertex(u,v,0,0,f),this.addCurrentVertex(u,v.mult(-1),0,0,f)}else if(\"bevel\"===E||\"fakeround\"===E){var L=-Math.sqrt(b*b-1),I=k?L:0,P=k?0:L;if(p&&this.addCurrentVertex(u,m,I,P,f),\"fakeround\"===E)for(var z=Math.round(180*w/Math.PI/20),O=1;O2*h){var j=u.add(d.sub(u)._mult(h/N)._round());this.updateDistance(u,j),this.addCurrentVertex(j,g,0,0,f),u=j}}}}},ml.prototype.addCurrentVertex=function(t,e,r,n,i,a){void 0===a&&(a=!1);var o=e.x+e.y*r,s=e.y-e.x*r,l=-e.x+e.y*n,c=-e.y-e.x*n;this.addHalfVertex(t,o,s,a,!1,r,i),this.addHalfVertex(t,l,c,a,!0,-n,i),this.distance>dl/2&&0===this.totalDistance&&(this.distance=0,this.addCurrentVertex(t,e,r,n,i,a))},ml.prototype.addHalfVertex=function(t,e,r,n,i,a,o){var s=t.x,l=t.y,c=.5*(this.lineClips?this.scaledDistance*(dl-1):this.scaledDistance);if(this.layoutVertexArray.emplaceBack((s<<1)+(n?1:0),(l<<1)+(i?1:0),Math.round(63*e)+128,Math.round(63*r)+128,1+(0===a?0:a<0?-1:1)|(63&c)<<2,c>>6),this.lineClips){var u=(this.scaledDistance-this.lineClips.start)/(this.lineClips.end-this.lineClips.start);this.layoutVertexArray2.emplaceBack(u,this.lineClipsArray.length)}var h=o.vertexLength++;this.e1>=0&&this.e2>=0&&(this.indexArray.emplaceBack(this.e1,this.e2,h),o.primitiveLength++),i?this.e2=h:this.e1=h},ml.prototype.updateScaledDistance=function(){this.scaledDistance=this.lineClips?this.lineClips.start+(this.lineClips.end-this.lineClips.start)*this.distance/this.totalDistance:this.distance},ml.prototype.updateDistance=function(t,e){this.distance+=t.dist(e),this.updateScaledDistance()},oi(\"LineBucket\",ml,{omit:[\"layers\",\"patternFeatures\"]});var gl=new Yi({\"line-cap\":new qi(Ft.layout_line[\"line-cap\"]),\"line-join\":new Hi(Ft.layout_line[\"line-join\"]),\"line-miter-limit\":new qi(Ft.layout_line[\"line-miter-limit\"]),\"line-round-limit\":new qi(Ft.layout_line[\"line-round-limit\"]),\"line-sort-key\":new Hi(Ft.layout_line[\"line-sort-key\"])}),yl={paint:new Yi({\"line-opacity\":new Hi(Ft.paint_line[\"line-opacity\"]),\"line-color\":new Hi(Ft.paint_line[\"line-color\"]),\"line-translate\":new qi(Ft.paint_line[\"line-translate\"]),\"line-translate-anchor\":new qi(Ft.paint_line[\"line-translate-anchor\"]),\"line-width\":new Hi(Ft.paint_line[\"line-width\"]),\"line-gap-width\":new Hi(Ft.paint_line[\"line-gap-width\"]),\"line-offset\":new Hi(Ft.paint_line[\"line-offset\"]),\"line-blur\":new Hi(Ft.paint_line[\"line-blur\"]),\"line-dasharray\":new Zi(Ft.paint_line[\"line-dasharray\"]),\"line-pattern\":new Gi(Ft.paint_line[\"line-pattern\"]),\"line-gradient\":new Wi(Ft.paint_line[\"line-gradient\"])}),layout:gl},vl=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.possiblyEvaluate=function(e,r){return r=new Oi(Math.floor(r.zoom),{now:r.now,fadeDuration:r.fadeDuration,zoomHistory:r.zoomHistory,transition:r.transition}),t.prototype.possiblyEvaluate.call(this,e,r)},e.prototype.evaluate=function(e,r,n,i){return r=p({},r,{zoom:Math.floor(r.zoom)}),t.prototype.evaluate.call(this,e,r,n,i)},e}(Hi),xl=new vl(yl.paint.properties[\"line-width\"].specification);xl.useIntegerZoom=!0;var _l=function(t){function e(e){t.call(this,e,yl),this.gradientVersion=0}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._handleSpecialPaintPropertyUpdate=function(t){if(\"line-gradient\"===t){var e=this._transitionablePaint._values[\"line-gradient\"].value.expression;this.stepInterpolant=e._styleExpression.expression instanceof tr,this.gradientVersion=(this.gradientVersion+1)%l}},e.prototype.gradientExpression=function(){return this._transitionablePaint._values[\"line-gradient\"].value.expression},e.prototype.recalculate=function(e,r){t.prototype.recalculate.call(this,e,r),this.paint._values[\"line-floorwidth\"]=xl.possiblyEvaluate(this._transitioningPaint._values[\"line-width\"].value,e)},e.prototype.createBucket=function(t){return new ml(t)},e.prototype.queryRadius=function(t){var e=t,r=bl(Po(\"line-width\",this,e),Po(\"line-gap-width\",this,e)),n=Po(\"line-offset\",this,e);return r/2+Math.abs(n)+zo(this.paint.get(\"line-translate\"))},e.prototype.queryIntersectsFeature=function(t,e,r,n,i,o,s){var l=Oo(t,this.paint.get(\"line-translate\"),this.paint.get(\"line-translate-anchor\"),o.angle,s),c=s/2*bl(this.paint.get(\"line-width\").evaluate(e,r),this.paint.get(\"line-gap-width\").evaluate(e,r)),u=this.paint.get(\"line-offset\").evaluate(e,r);return u&&(n=function(t,e){for(var r=[],n=new a(0,0),i=0;i=3)for(var a=0;a0?e+2*t:t}var wl=ta([{name:\"a_pos_offset\",components:4,type:\"Int16\"},{name:\"a_data\",components:4,type:\"Uint16\"},{name:\"a_pixeloffset\",components:4,type:\"Int16\"}],4),Tl=ta([{name:\"a_projected_pos\",components:3,type:\"Float32\"}],4),kl=(ta([{name:\"a_fade_opacity\",components:1,type:\"Uint32\"}],4),ta([{name:\"a_placed\",components:2,type:\"Uint8\"},{name:\"a_shift\",components:2,type:\"Float32\"}])),Al=(ta([{type:\"Int16\",name:\"anchorPointX\"},{type:\"Int16\",name:\"anchorPointY\"},{type:\"Int16\",name:\"x1\"},{type:\"Int16\",name:\"y1\"},{type:\"Int16\",name:\"x2\"},{type:\"Int16\",name:\"y2\"},{type:\"Uint32\",name:\"featureIndex\"},{type:\"Uint16\",name:\"sourceLayerIndex\"},{type:\"Uint16\",name:\"bucketIndex\"}]),ta([{name:\"a_pos\",components:2,type:\"Int16\"},{name:\"a_anchor_pos\",components:2,type:\"Int16\"},{name:\"a_extrude\",components:2,type:\"Int16\"}],4)),Ml=ta([{name:\"a_pos\",components:2,type:\"Float32\"},{name:\"a_radius\",components:1,type:\"Float32\"},{name:\"a_flags\",components:2,type:\"Int16\"}],4);function Sl(t,e,r){return t.sections.forEach((function(t){t.text=function(t,e,r){var n=e.layout.get(\"text-transform\").evaluate(r,{});return\"uppercase\"===n?t=t.toLocaleUpperCase():\"lowercase\"===n&&(t=t.toLocaleLowerCase()),zi.applyArabicShaping&&(t=zi.applyArabicShaping(t)),t}(t.text,e,r)})),t}ta([{name:\"triangle\",components:3,type:\"Uint16\"}]),ta([{type:\"Int16\",name:\"anchorX\"},{type:\"Int16\",name:\"anchorY\"},{type:\"Uint16\",name:\"glyphStartIndex\"},{type:\"Uint16\",name:\"numGlyphs\"},{type:\"Uint32\",name:\"vertexStartIndex\"},{type:\"Uint32\",name:\"lineStartIndex\"},{type:\"Uint32\",name:\"lineLength\"},{type:\"Uint16\",name:\"segment\"},{type:\"Uint16\",name:\"lowerSize\"},{type:\"Uint16\",name:\"upperSize\"},{type:\"Float32\",name:\"lineOffsetX\"},{type:\"Float32\",name:\"lineOffsetY\"},{type:\"Uint8\",name:\"writingMode\"},{type:\"Uint8\",name:\"placedOrientation\"},{type:\"Uint8\",name:\"hidden\"},{type:\"Uint32\",name:\"crossTileID\"},{type:\"Int16\",name:\"associatedIconIndex\"}]),ta([{type:\"Int16\",name:\"anchorX\"},{type:\"Int16\",name:\"anchorY\"},{type:\"Int16\",name:\"rightJustifiedTextSymbolIndex\"},{type:\"Int16\",name:\"centerJustifiedTextSymbolIndex\"},{type:\"Int16\",name:\"leftJustifiedTextSymbolIndex\"},{type:\"Int16\",name:\"verticalPlacedTextSymbolIndex\"},{type:\"Int16\",name:\"placedIconSymbolIndex\"},{type:\"Int16\",name:\"verticalPlacedIconSymbolIndex\"},{type:\"Uint16\",name:\"key\"},{type:\"Uint16\",name:\"textBoxStartIndex\"},{type:\"Uint16\",name:\"textBoxEndIndex\"},{type:\"Uint16\",name:\"verticalTextBoxStartIndex\"},{type:\"Uint16\",name:\"verticalTextBoxEndIndex\"},{type:\"Uint16\",name:\"iconBoxStartIndex\"},{type:\"Uint16\",name:\"iconBoxEndIndex\"},{type:\"Uint16\",name:\"verticalIconBoxStartIndex\"},{type:\"Uint16\",name:\"verticalIconBoxEndIndex\"},{type:\"Uint16\",name:\"featureIndex\"},{type:\"Uint16\",name:\"numHorizontalGlyphVertices\"},{type:\"Uint16\",name:\"numVerticalGlyphVertices\"},{type:\"Uint16\",name:\"numIconVertices\"},{type:\"Uint16\",name:\"numVerticalIconVertices\"},{type:\"Uint16\",name:\"useRuntimeCollisionCircles\"},{type:\"Uint32\",name:\"crossTileID\"},{type:\"Float32\",name:\"textBoxScale\"},{type:\"Float32\",components:2,name:\"textOffset\"},{type:\"Float32\",name:\"collisionCircleDiameter\"}]),ta([{type:\"Float32\",name:\"offsetX\"}]),ta([{type:\"Int16\",name:\"x\"},{type:\"Int16\",name:\"y\"},{type:\"Int16\",name:\"tileUnitDistanceFromAnchor\"}]);var El={\"!\":\"︕\",\"#\":\"#\",$:\"$\",\"%\":\"%\",\"&\":\"&\",\"(\":\"︵\",\")\":\"︶\",\"*\":\"*\",\"+\":\"+\",\",\":\"︐\",\"-\":\"︲\",\".\":\"・\",\"/\":\"/\",\":\":\"︓\",\";\":\"︔\",\"<\":\"︿\",\"=\":\"=\",\">\":\"﹀\",\"?\":\"︖\",\"@\":\"@\",\"[\":\"﹇\",\"\\\\\":\"\\",\"]\":\"﹈\",\"^\":\"^\",_:\"︳\",\"`\":\"`\",\"{\":\"︷\",\"|\":\"―\",\"}\":\"︸\",\"~\":\"~\",\"¢\":\"¢\",\"£\":\"£\",\"¥\":\"¥\",\"¦\":\"¦\",\"¬\":\"¬\",\"¯\":\" ̄\",\"–\":\"︲\",\"—\":\"︱\",\"‘\":\"﹃\",\"’\":\"﹄\",\"“\":\"﹁\",\"”\":\"﹂\",\"…\":\"︙\",\"‧\":\"・\",\"₩\":\"₩\",\"、\":\"︑\",\"。\":\"︒\",\"〈\":\"︿\",\"〉\":\"﹀\",\"《\":\"︽\",\"》\":\"︾\",\"「\":\"﹁\",\"」\":\"﹂\",\"『\":\"﹃\",\"』\":\"﹄\",\"【\":\"︻\",\"】\":\"︼\",\"〔\":\"︹\",\"〕\":\"︺\",\"〖\":\"︗\",\"〗\":\"︘\",\"!\":\"︕\",\"(\":\"︵\",\")\":\"︶\",\",\":\"︐\",\"-\":\"︲\",\".\":\"・\",\":\":\"︓\",\";\":\"︔\",\"<\":\"︿\",\">\":\"﹀\",\"?\":\"︖\",\"[\":\"﹇\",\"]\":\"﹈\",\"_\":\"︳\",\"{\":\"︷\",\"|\":\"―\",\"}\":\"︸\",\"⦅\":\"︵\",\"⦆\":\"︶\",\"。\":\"︒\",\"「\":\"﹁\",\"」\":\"﹂\"};var Cl=24,Ll=function(t,e,r,n,i){var a,o,s=8*i-n-1,l=(1<>1,u=-7,h=r?i-1:0,f=r?-1:1,p=t[e+h];for(h+=f,a=p&(1<<-u)-1,p>>=-u,u+=s;u>0;a=256*a+t[e+h],h+=f,u-=8);for(o=a&(1<<-u)-1,a>>=-u,u+=n;u>0;o=256*o+t[e+h],h+=f,u-=8);if(0===a)a=1-c;else{if(a===l)return o?NaN:1/0*(p?-1:1);o+=Math.pow(2,n),a-=c}return(p?-1:1)*o*Math.pow(2,a-n)},Il=function(t,e,r,n,i,a){var o,s,l,c=8*a-i-1,u=(1<>1,f=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,p=n?0:a-1,d=n?1:-1,m=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(s=isNaN(e)?1:0,o=u):(o=Math.floor(Math.log(e)/Math.LN2),e*(l=Math.pow(2,-o))<1&&(o--,l*=2),(e+=o+h>=1?f/l:f*Math.pow(2,1-h))*l>=2&&(o++,l/=2),o+h>=u?(s=0,o=u):o+h>=1?(s=(e*l-1)*Math.pow(2,i),o+=h):(s=e*Math.pow(2,h-1)*Math.pow(2,i),o=0));i>=8;t[r+p]=255&s,p+=d,s/=256,i-=8);for(o=o<0;t[r+p]=255&o,p+=d,o/=256,c-=8);t[r+p-d]|=128*m},Pl=zl;function zl(t){this.buf=ArrayBuffer.isView&&ArrayBuffer.isView(t)?t:new Uint8Array(t||0),this.pos=0,this.type=0,this.length=this.buf.length}zl.Varint=0,zl.Fixed64=1,zl.Bytes=2,zl.Fixed32=5;var Ol=4294967296,Dl=1/Ol,Rl=\"undefined\"==typeof TextDecoder?null:new TextDecoder(\"utf8\");function Fl(t){return t.type===zl.Bytes?t.readVarint()+t.pos:t.pos+1}function Bl(t,e,r){return r?4294967296*e+(t>>>0):4294967296*(e>>>0)+(t>>>0)}function Nl(t,e,r){var n=e<=16383?1:e<=2097151?2:e<=268435455?3:Math.floor(Math.log(e)/(7*Math.LN2));r.realloc(n);for(var i=r.pos-1;i>=t;i--)r.buf[i+n]=r.buf[i]}function jl(t,e){for(var r=0;r>>8,t[r+2]=e>>>16,t[r+3]=e>>>24}function Jl(t,e){return(t[e]|t[e+1]<<8|t[e+2]<<16)+(t[e+3]<<24)}zl.prototype={destroy:function(){this.buf=null},readFields:function(t,e,r){for(r=r||this.length;this.pos>3,a=this.pos;this.type=7&n,t(i,e,this),this.pos===a&&this.skip(n)}return e},readMessage:function(t,e){return this.readFields(t,e,this.readVarint()+this.pos)},readFixed32:function(){var t=Xl(this.buf,this.pos);return this.pos+=4,t},readSFixed32:function(){var t=Jl(this.buf,this.pos);return this.pos+=4,t},readFixed64:function(){var t=Xl(this.buf,this.pos)+Xl(this.buf,this.pos+4)*Ol;return this.pos+=8,t},readSFixed64:function(){var t=Xl(this.buf,this.pos)+Jl(this.buf,this.pos+4)*Ol;return this.pos+=8,t},readFloat:function(){var t=Ll(this.buf,this.pos,!0,23,4);return this.pos+=4,t},readDouble:function(){var t=Ll(this.buf,this.pos,!0,52,8);return this.pos+=8,t},readVarint:function(t){var e,r,n=this.buf;return e=127&(r=n[this.pos++]),r<128?e:(e|=(127&(r=n[this.pos++]))<<7,r<128?e:(e|=(127&(r=n[this.pos++]))<<14,r<128?e:(e|=(127&(r=n[this.pos++]))<<21,r<128?e:function(t,e,r){var n,i,a=r.buf;if(n=(112&(i=a[r.pos++]))>>4,i<128)return Bl(t,n,e);if(n|=(127&(i=a[r.pos++]))<<3,i<128)return Bl(t,n,e);if(n|=(127&(i=a[r.pos++]))<<10,i<128)return Bl(t,n,e);if(n|=(127&(i=a[r.pos++]))<<17,i<128)return Bl(t,n,e);if(n|=(127&(i=a[r.pos++]))<<24,i<128)return Bl(t,n,e);if(n|=(1&(i=a[r.pos++]))<<31,i<128)return Bl(t,n,e);throw new Error(\"Expected varint not more than 10 bytes\")}(e|=(15&(r=n[this.pos]))<<28,t,this))))},readVarint64:function(){return this.readVarint(!0)},readSVarint:function(){var t=this.readVarint();return t%2==1?(t+1)/-2:t/2},readBoolean:function(){return Boolean(this.readVarint())},readString:function(){var t=this.readVarint()+this.pos,e=this.pos;return this.pos=t,t-e>=12&&Rl?function(t,e,r){return Rl.decode(t.subarray(e,r))}(this.buf,e,t):function(t,e,r){for(var n=\"\",i=e;i239?4:l>223?3:l>191?2:1;if(i+u>r)break;1===u?l<128&&(c=l):2===u?128==(192&(a=t[i+1]))&&(c=(31&l)<<6|63&a)<=127&&(c=null):3===u?(a=t[i+1],o=t[i+2],128==(192&a)&&128==(192&o)&&((c=(15&l)<<12|(63&a)<<6|63&o)<=2047||c>=55296&&c<=57343)&&(c=null)):4===u&&(a=t[i+1],o=t[i+2],s=t[i+3],128==(192&a)&&128==(192&o)&&128==(192&s)&&((c=(15&l)<<18|(63&a)<<12|(63&o)<<6|63&s)<=65535||c>=1114112)&&(c=null)),null===c?(c=65533,u=1):c>65535&&(c-=65536,n+=String.fromCharCode(c>>>10&1023|55296),c=56320|1023&c),n+=String.fromCharCode(c),i+=u}return n}(this.buf,e,t)},readBytes:function(){var t=this.readVarint()+this.pos,e=this.buf.subarray(this.pos,t);return this.pos=t,e},readPackedVarint:function(t,e){if(this.type!==zl.Bytes)return t.push(this.readVarint(e));var r=Fl(this);for(t=t||[];this.pos127;);else if(e===zl.Bytes)this.pos=this.readVarint()+this.pos;else if(e===zl.Fixed32)this.pos+=4;else{if(e!==zl.Fixed64)throw new Error(\"Unimplemented type: \"+e);this.pos+=8}},writeTag:function(t,e){this.writeVarint(t<<3|e)},realloc:function(t){for(var e=this.length||16;e268435455||t<0?function(t,e){var r,n;if(t>=0?(r=t%4294967296|0,n=t/4294967296|0):(n=~(-t/4294967296),4294967295^(r=~(-t%4294967296))?r=r+1|0:(r=0,n=n+1|0)),t>=0x10000000000000000||t<-0x10000000000000000)throw new Error(\"Given varint doesn't fit into 10 bytes\");e.realloc(10),function(t,e,r){r.buf[r.pos++]=127&t|128,t>>>=7,r.buf[r.pos++]=127&t|128,t>>>=7,r.buf[r.pos++]=127&t|128,t>>>=7,r.buf[r.pos++]=127&t|128,t>>>=7,r.buf[r.pos]=127&t}(r,0,e),function(t,e){var r=(7&t)<<4;e.buf[e.pos++]|=r|((t>>>=3)?128:0),t&&(e.buf[e.pos++]=127&t|((t>>>=7)?128:0),t&&(e.buf[e.pos++]=127&t|((t>>>=7)?128:0),t&&(e.buf[e.pos++]=127&t|((t>>>=7)?128:0),t&&(e.buf[e.pos++]=127&t|((t>>>=7)?128:0),t&&(e.buf[e.pos++]=127&t)))))}(n,e)}(t,this):(this.realloc(4),this.buf[this.pos++]=127&t|(t>127?128:0),t<=127||(this.buf[this.pos++]=127&(t>>>=7)|(t>127?128:0),t<=127||(this.buf[this.pos++]=127&(t>>>=7)|(t>127?128:0),t<=127||(this.buf[this.pos++]=t>>>7&127))))},writeSVarint:function(t){this.writeVarint(t<0?2*-t-1:2*t)},writeBoolean:function(t){this.writeVarint(Boolean(t))},writeString:function(t){t=String(t),this.realloc(4*t.length),this.pos++;var e=this.pos;this.pos=function(t,e,r){for(var n,i,a=0;a55295&&n<57344){if(!i){n>56319||a+1===e.length?(t[r++]=239,t[r++]=191,t[r++]=189):i=n;continue}if(n<56320){t[r++]=239,t[r++]=191,t[r++]=189,i=n;continue}n=i-55296<<10|n-56320|65536,i=null}else i&&(t[r++]=239,t[r++]=191,t[r++]=189,i=null);n<128?t[r++]=n:(n<2048?t[r++]=n>>6|192:(n<65536?t[r++]=n>>12|224:(t[r++]=n>>18|240,t[r++]=n>>12&63|128),t[r++]=n>>6&63|128),t[r++]=63&n|128)}return r}(this.buf,t,this.pos);var r=this.pos-e;r>=128&&Nl(e,r,this),this.pos=e-1,this.writeVarint(r),this.pos+=r},writeFloat:function(t){this.realloc(4),Il(this.buf,t,this.pos,!0,23,4),this.pos+=4},writeDouble:function(t){this.realloc(8),Il(this.buf,t,this.pos,!0,52,8),this.pos+=8},writeBytes:function(t){var e=t.length;this.writeVarint(e),this.realloc(e);for(var r=0;r=128&&Nl(r,n,this),this.pos=r-1,this.writeVarint(n),this.pos+=n},writeMessage:function(t,e,r){this.writeTag(t,zl.Bytes),this.writeRawMessage(e,r)},writePackedVarint:function(t,e){e.length&&this.writeMessage(t,jl,e)},writePackedSVarint:function(t,e){e.length&&this.writeMessage(t,Ul,e)},writePackedBoolean:function(t,e){e.length&&this.writeMessage(t,Hl,e)},writePackedFloat:function(t,e){e.length&&this.writeMessage(t,Vl,e)},writePackedDouble:function(t,e){e.length&&this.writeMessage(t,ql,e)},writePackedFixed32:function(t,e){e.length&&this.writeMessage(t,Gl,e)},writePackedSFixed32:function(t,e){e.length&&this.writeMessage(t,Zl,e)},writePackedFixed64:function(t,e){e.length&&this.writeMessage(t,Wl,e)},writePackedSFixed64:function(t,e){e.length&&this.writeMessage(t,Yl,e)},writeBytesField:function(t,e){this.writeTag(t,zl.Bytes),this.writeBytes(e)},writeFixed32Field:function(t,e){this.writeTag(t,zl.Fixed32),this.writeFixed32(e)},writeSFixed32Field:function(t,e){this.writeTag(t,zl.Fixed32),this.writeSFixed32(e)},writeFixed64Field:function(t,e){this.writeTag(t,zl.Fixed64),this.writeFixed64(e)},writeSFixed64Field:function(t,e){this.writeTag(t,zl.Fixed64),this.writeSFixed64(e)},writeVarintField:function(t,e){this.writeTag(t,zl.Varint),this.writeVarint(e)},writeSVarintField:function(t,e){this.writeTag(t,zl.Varint),this.writeSVarint(e)},writeStringField:function(t,e){this.writeTag(t,zl.Bytes),this.writeString(e)},writeFloatField:function(t,e){this.writeTag(t,zl.Fixed32),this.writeFloat(e)},writeDoubleField:function(t,e){this.writeTag(t,zl.Fixed64),this.writeDouble(e)},writeBooleanField:function(t,e){this.writeVarintField(t,Boolean(e))}};var Kl=3;function Ql(t,e,r){1===t&&r.readMessage(tc,e)}function tc(t,e,r){if(3===t){var n=r.readMessage(ec,{}),i=n.id,a=n.bitmap,o=n.width,s=n.height,l=n.left,c=n.top,u=n.advance;e.push({id:i,bitmap:new Jo({width:o+2*Kl,height:s+2*Kl},a),metrics:{width:o,height:s,left:l,top:c,advance:u}})}}function ec(t,e,r){1===t?e.id=r.readVarint():2===t?e.bitmap=r.readBytes():3===t?e.width=r.readVarint():4===t?e.height=r.readVarint():5===t?e.left=r.readSVarint():6===t?e.top=r.readSVarint():7===t&&(e.advance=r.readVarint())}var rc=Kl;function nc(t){for(var e=0,r=0,n=0,i=t;n=0;f--){var p=o[f];if(!(h.w>p.w||h.h>p.h)){if(h.x=p.x,h.y=p.y,l=Math.max(l,h.y+h.h),s=Math.max(s,h.x+h.w),h.w===p.w&&h.h===p.h){var d=o.pop();f0&&B>A&&(A=B)}else{var N=r[S.fontStack],j=N&&N[C];if(j&&j.rect)P=j.rect,I=j.metrics;else{var U=e[S.fontStack],V=U&&U[C];if(!V)continue;I=V.metrics}L=(b-S.scale)*Cl}D?(t.verticalizable=!0,k.push({glyph:C,imageName:z,x:f,y:p+L,vertical:D,scale:S.scale,fontStack:S.fontStack,sectionIndex:E,metrics:I,rect:P}),f+=O*S.scale+c):(k.push({glyph:C,imageName:z,x:f,y:p+L,vertical:D,scale:S.scale,fontStack:S.fontStack,sectionIndex:E,metrics:I,rect:P}),f+=I.advance*S.scale+c)}if(0!==k.length){var q=f-c;d=Math.max(q,d),wc(k,0,k.length-1,g,A)}f=0;var H=a*b+A;T.lineOffset=Math.max(A,w),p+=H,m=Math.max(H,m),++y}else p+=a,++y}var G=p-cc,Z=bc(o),W=Z.horizontalAlign,Y=Z.verticalAlign;(function(t,e,r,n,i,a,o,s,l){var c=(e-r)*i,u=0;u=a!==o?-s*n-cc:(-n*l+.5)*o;for(var h=0,f=t;h=0&&n>=t&&pc[this.text.charCodeAt(n)];n--)r--;this.text=this.text.substring(t,r),this.sectionIndex=this.sectionIndex.slice(t,r)},hc.prototype.substring=function(t,e){var r=new hc;return r.text=this.text.substring(t,e),r.sectionIndex=this.sectionIndex.slice(t,e),r.sections=this.sections,r},hc.prototype.toString=function(){return this.text},hc.prototype.getMaxScale=function(){var t=this;return this.sectionIndex.reduce((function(e,r){return Math.max(e,t.sections[r].scale)}),0)},hc.prototype.addTextSection=function(t,e){this.text+=t.text,this.sections.push(uc.forText(t.scale,t.fontStack||e));for(var r=this.sections.length-1,n=0;n=63743?null:++this.imageSectionID:(this.imageSectionID=57344,this.imageSectionID)};var pc={9:!0,10:!0,11:!0,12:!0,13:!0,32:!0},dc={};function mc(t,e,r,n,i,a){if(e.imageName){var o=n[e.imageName];return o?o.displaySize[0]*e.scale*Cl/a+i:0}var s=r[e.fontStack],l=s&&s[t];return l?l.metrics.advance*e.scale+i:0}function gc(t,e,r,n){var i=Math.pow(t-e,2);return n?t=0,u=0,h=0;h-r/2;){if(--o<0)return!1;s-=t[o].dist(a),a=t[o]}s+=t[o].dist(t[o+1]),o++;for(var l=[],c=0;sn;)c-=l.shift().angleDelta;if(c>i)return!1;o++,s+=h.dist(f)}return!0}function Ic(t){for(var e=0,r=0;rc){var d=(c-l)/p,m=er(h.x,f.x,d),g=er(h.y,f.y,d),y=new kc(m,g,f.angleTo(h),u);return y._round(),!o||Lc(t,y,s,o,e)?y:void 0}l+=p}}function Dc(t,e,r,n,i,a,o,s,l){var c=Pc(n,a,o),u=zc(n,i),h=u*o,f=0===t[0].x||t[0].x===l||0===t[0].y||t[0].y===l;return e-h=0&&_=0&&b=0&&f+c<=u){var w=new kc(_,b,v,d);w._round(),n&&!Lc(t,w,a,n,i)||p.push(w)}}h+=y}return s||p.length||o||(p=Rc(t,h/2,r,n,i,a,o,!0,l)),p}function Fc(t,e,r,n,i){for(var o=[],s=0;s=n&&f.x>=n||(h.x>=n?h=new a(n,h.y+(f.y-h.y)*((n-h.x)/(f.x-h.x)))._round():f.x>=n&&(f=new a(n,h.y+(f.y-h.y)*((n-h.x)/(f.x-h.x)))._round()),h.y>=i&&f.y>=i||(h.y>=i?h=new a(h.x+(f.x-h.x)*((i-h.y)/(f.y-h.y)),i)._round():f.y>=i&&(f=new a(h.x+(f.x-h.x)*((i-h.y)/(f.y-h.y)),i)._round()),c&&h.equals(c[c.length-1])||(c=[h],o.push(c)),c.push(f)))))}return o}var Bc=ic;function Nc(t,e,r,n){var i=[],o=t.image,s=o.pixelRatio,l=o.paddedRect.w-2*Bc,c=o.paddedRect.h-2*Bc,u=t.right-t.left,h=t.bottom-t.top,f=o.stretchX||[[0,l]],p=o.stretchY||[[0,c]],d=function(t,e){return t+e[1]-e[0]},m=f.reduce(d,0),g=p.reduce(d,0),y=l-m,v=c-g,x=0,_=m,b=0,w=g,T=0,k=y,A=0,M=v;if(o.content&&n){var S=o.content;x=jc(f,0,S[0]),b=jc(p,0,S[1]),_=jc(f,S[0],S[2]),w=jc(p,S[1],S[3]),T=S[0]-x,A=S[1]-b,k=S[2]-S[0]-_,M=S[3]-S[1]-w}var E=function(n,i,l,c){var f=Vc(n.stretch-x,_,u,t.left),p=qc(n.fixed-T,k,n.stretch,m),d=Vc(i.stretch-b,w,h,t.top),y=qc(i.fixed-A,M,i.stretch,g),v=Vc(l.stretch-x,_,u,t.left),S=qc(l.fixed-T,k,l.stretch,m),E=Vc(c.stretch-b,w,h,t.top),C=qc(c.fixed-A,M,c.stretch,g),L=new a(f,d),I=new a(v,d),P=new a(v,E),z=new a(f,E),O=new a(p/s,y/s),D=new a(S/s,C/s),R=e*Math.PI/180;if(R){var F=Math.sin(R),B=Math.cos(R),N=[B,-F,F,B];L._matMult(N),I._matMult(N),z._matMult(N),P._matMult(N)}var j=n.stretch+n.fixed,U=l.stretch+l.fixed,V=i.stretch+i.fixed,q=c.stretch+c.fixed;return{tl:L,tr:I,bl:z,br:P,tex:{x:o.paddedRect.x+Bc+j,y:o.paddedRect.y+Bc+V,w:U-j,h:q-V},writingMode:void 0,glyphOffset:[0,0],sectionIndex:0,pixelOffsetTL:O,pixelOffsetBR:D,minFontScaleX:k/s/u,minFontScaleY:M/s/h,isSDF:r}};if(n&&(o.stretchX||o.stretchY))for(var C=Uc(f,y,m),L=Uc(p,v,g),I=0;I0&&(d=Math.max(10,d),this.circleDiameter=d)}else{var m=o.top*s-l,g=o.bottom*s+l,y=o.left*s-l,v=o.right*s+l,x=o.collisionPadding;if(x&&(y-=x[0]*s,m-=x[1]*s,v+=x[2]*s,g+=x[3]*s),u){var _=new a(y,m),b=new a(v,m),w=new a(y,g),T=new a(v,g),k=u*Math.PI/180;_._rotate(k),b._rotate(k),w._rotate(k),T._rotate(k),y=Math.min(_.x,b.x,w.x,T.x),v=Math.max(_.x,b.x,w.x,T.x),m=Math.min(_.y,b.y,w.y,T.y),g=Math.max(_.y,b.y,w.y,T.y)}t.emplaceBack(e.x,e.y,y,m,v,g,r,n,i)}this.boxEndIndex=t.length},Gc=function(t,e){if(void 0===t&&(t=[]),void 0===e&&(e=Zc),this.data=t,this.length=this.data.length,this.compare=e,this.length>0)for(var r=(this.length>>1)-1;r>=0;r--)this._down(r)};function Zc(t,e){return te?1:0}function Wc(t,e,r){void 0===e&&(e=1),void 0===r&&(r=!1);for(var n=1/0,i=1/0,o=-1/0,s=-1/0,l=t[0],c=0;co)&&(o=u.x),(!c||u.y>s)&&(s=u.y)}var h=o-n,f=s-i,p=Math.min(h,f),d=p/2,m=new Gc([],Yc);if(0===p)return new a(n,i);for(var g=n;gv.d||!v.d)&&(v=_,r&&console.log(\"found best %d after %d probes\",Math.round(1e4*_.d)/1e4,x)),_.max-v.d<=e||(d=_.h/2,m.push(new Xc(_.p.x-d,_.p.y-d,d,t)),m.push(new Xc(_.p.x+d,_.p.y-d,d,t)),m.push(new Xc(_.p.x-d,_.p.y+d,d,t)),m.push(new Xc(_.p.x+d,_.p.y+d,d,t)),x+=4)}return r&&(console.log(\"num probes: \"+x),console.log(\"best distance: \"+v.d)),v.p}function Yc(t,e){return e.max-t.max}function Xc(t,e,r,n){this.p=new a(t,e),this.h=r,this.d=function(t,e){for(var r=!1,n=1/0,i=0;it.y!=u.y>t.y&&t.x<(u.x-c.x)*(t.y-c.y)/(u.y-c.y)+c.x&&(r=!r),n=Math.min(n,Eo(t,c,u))}return(r?1:-1)*Math.sqrt(n)}(this.p,n),this.max=this.d+this.h*Math.SQRT2}Gc.prototype.push=function(t){this.data.push(t),this.length++,this._up(this.length-1)},Gc.prototype.pop=function(){if(0!==this.length){var t=this.data[0],e=this.data.pop();return this.length--,this.length>0&&(this.data[0]=e,this._down(0)),t}},Gc.prototype.peek=function(){return this.data[0]},Gc.prototype._up=function(t){for(var e=this.data,r=this.compare,n=e[t];t>0;){var i=t-1>>1,a=e[i];if(r(n,a)>=0)break;e[t]=a,t=i}e[t]=n},Gc.prototype._down=function(t){for(var e=this.data,r=this.compare,n=this.length>>1,i=e[t];t=0)break;e[t]=o,t=a}e[t]=i};var $c=7,Jc=Number.POSITIVE_INFINITY;function Kc(t,e){return e[1]!==Jc?function(t,e,r){var n=0,i=0;switch(e=Math.abs(e),r=Math.abs(r),t){case\"top-right\":case\"top-left\":case\"top\":i=r-$c;break;case\"bottom-right\":case\"bottom-left\":case\"bottom\":i=-r+$c}switch(t){case\"top-right\":case\"bottom-right\":case\"right\":n=-e;break;case\"top-left\":case\"bottom-left\":case\"left\":n=e}return[n,i]}(t,e[0],e[1]):function(t,e){var r=0,n=0;e<0&&(e=0);var i=e/Math.sqrt(2);switch(t){case\"top-right\":case\"top-left\":n=i-$c;break;case\"bottom-right\":case\"bottom-left\":n=-i+$c;break;case\"bottom\":n=-e+$c;break;case\"top\":n=e-$c}switch(t){case\"top-right\":case\"bottom-right\":r=-i;break;case\"top-left\":case\"bottom-left\":r=i;break;case\"left\":r=e;break;case\"right\":r=-e}return[r,n]}(t,e[0])}function Qc(t){switch(t){case\"right\":case\"top-right\":case\"bottom-right\":return\"right\";case\"left\":case\"top-left\":case\"bottom-left\":return\"left\"}return\"center\"}var tu=255,eu=tu*Ac;function ru(t,e,r,n,i,o,s,l,c,u,h,f,p,d,m){var g=function(t,e,r,n,i,o,s,l){for(var c=n.layout.get(\"text-rotate\").evaluate(o,{})*Math.PI/180,u=[],h=0,f=e.positionedLines;heu&&k(t.layerIds[0]+': Value for \"text-size\" is >= '+tu+'. Reduce your \"text-size\".'):\"composite\"===y.kind&&((v=[Ac*d.compositeTextSizes[0].evaluate(s,{},m),Ac*d.compositeTextSizes[1].evaluate(s,{},m)])[0]>eu||v[1]>eu)&&k(t.layerIds[0]+': Value for \"text-size\" is >= '+tu+'. Reduce your \"text-size\".'),t.addSymbols(t.text,g,v,l,o,s,u,e,c.lineStartIndex,c.lineLength,p,m);for(var x=0,_=h;x<_.length;x+=1)f[_[x]]=t.text.placedSymbolArray.length-1;return 4*g.length}function nu(t){for(var e in t)return t[e];return null}function iu(t,e,r,n){var i=t.compareText;if(e in i){for(var a=i[e],o=a.length-1;o>=0;o--)if(n.dist(a[o])0)&&(\"constant\"!==a.value.kind||a.value.value.length>0),c=\"constant\"!==s.value.kind||!!s.value.value||Object.keys(s.parameters).length>0,u=i.get(\"symbol-sort-key\");if(this.features=[],l||c){for(var h=e.iconDependencies,f=e.glyphDependencies,p=e.availableImages,d=new Oi(this.zoom),m=0,g=t;m=0;for(var z=0,O=k.sections;z=0;s--)a[s]={x:e[s].x,y:e[s].y,tileUnitDistanceFromAnchor:i},s>0&&(i+=e[s-1].dist(e[s]));for(var l=0;l0},fu.prototype.hasIconData=function(){return this.icon.segments.get().length>0},fu.prototype.hasDebugData=function(){return this.textCollisionBox&&this.iconCollisionBox},fu.prototype.hasTextCollisionBoxData=function(){return this.hasDebugData()&&this.textCollisionBox.segments.get().length>0},fu.prototype.hasIconCollisionBoxData=function(){return this.hasDebugData()&&this.iconCollisionBox.segments.get().length>0},fu.prototype.addIndicesForPlacedSymbol=function(t,e){for(var r=t.placedSymbolArray.get(e),n=r.vertexStartIndex+4*r.numGlyphs,i=r.vertexStartIndex;i1||this.icon.segments.get().length>1)){this.symbolInstanceIndexes=this.getSortedSymbolIndexes(t),this.sortedAngle=t,this.text.indexArray.clear(),this.icon.indexArray.clear(),this.featureSortOrder=[];for(var r=0,n=this.symbolInstanceIndexes;r=0&&n.indexOf(t)===r&&e.addIndicesForPlacedSymbol(e.text,t)})),a.verticalPlacedTextSymbolIndex>=0&&this.addIndicesForPlacedSymbol(this.text,a.verticalPlacedTextSymbolIndex),a.placedIconSymbolIndex>=0&&this.addIndicesForPlacedSymbol(this.icon,a.placedIconSymbolIndex),a.verticalPlacedIconSymbolIndex>=0&&this.addIndicesForPlacedSymbol(this.icon,a.verticalPlacedIconSymbolIndex)}this.text.indexBuffer&&this.text.indexBuffer.updateData(this.text.indexArray),this.icon.indexBuffer&&this.icon.indexBuffer.updateData(this.icon.indexArray)}},oi(\"SymbolBucket\",fu,{omit:[\"layers\",\"collisionBoxArray\",\"features\",\"compareText\"]}),fu.MAX_GLYPHS=65535,fu.addDynamicAttributes=lu;var pu=new Yi({\"symbol-placement\":new qi(Ft.layout_symbol[\"symbol-placement\"]),\"symbol-spacing\":new qi(Ft.layout_symbol[\"symbol-spacing\"]),\"symbol-avoid-edges\":new qi(Ft.layout_symbol[\"symbol-avoid-edges\"]),\"symbol-sort-key\":new Hi(Ft.layout_symbol[\"symbol-sort-key\"]),\"symbol-z-order\":new qi(Ft.layout_symbol[\"symbol-z-order\"]),\"icon-allow-overlap\":new qi(Ft.layout_symbol[\"icon-allow-overlap\"]),\"icon-ignore-placement\":new qi(Ft.layout_symbol[\"icon-ignore-placement\"]),\"icon-optional\":new qi(Ft.layout_symbol[\"icon-optional\"]),\"icon-rotation-alignment\":new qi(Ft.layout_symbol[\"icon-rotation-alignment\"]),\"icon-size\":new Hi(Ft.layout_symbol[\"icon-size\"]),\"icon-text-fit\":new qi(Ft.layout_symbol[\"icon-text-fit\"]),\"icon-text-fit-padding\":new qi(Ft.layout_symbol[\"icon-text-fit-padding\"]),\"icon-image\":new Hi(Ft.layout_symbol[\"icon-image\"]),\"icon-rotate\":new Hi(Ft.layout_symbol[\"icon-rotate\"]),\"icon-padding\":new qi(Ft.layout_symbol[\"icon-padding\"]),\"icon-keep-upright\":new qi(Ft.layout_symbol[\"icon-keep-upright\"]),\"icon-offset\":new Hi(Ft.layout_symbol[\"icon-offset\"]),\"icon-anchor\":new Hi(Ft.layout_symbol[\"icon-anchor\"]),\"icon-pitch-alignment\":new qi(Ft.layout_symbol[\"icon-pitch-alignment\"]),\"text-pitch-alignment\":new qi(Ft.layout_symbol[\"text-pitch-alignment\"]),\"text-rotation-alignment\":new qi(Ft.layout_symbol[\"text-rotation-alignment\"]),\"text-field\":new Hi(Ft.layout_symbol[\"text-field\"]),\"text-font\":new Hi(Ft.layout_symbol[\"text-font\"]),\"text-size\":new Hi(Ft.layout_symbol[\"text-size\"]),\"text-max-width\":new Hi(Ft.layout_symbol[\"text-max-width\"]),\"text-line-height\":new qi(Ft.layout_symbol[\"text-line-height\"]),\"text-letter-spacing\":new Hi(Ft.layout_symbol[\"text-letter-spacing\"]),\"text-justify\":new Hi(Ft.layout_symbol[\"text-justify\"]),\"text-radial-offset\":new Hi(Ft.layout_symbol[\"text-radial-offset\"]),\"text-variable-anchor\":new qi(Ft.layout_symbol[\"text-variable-anchor\"]),\"text-anchor\":new Hi(Ft.layout_symbol[\"text-anchor\"]),\"text-max-angle\":new qi(Ft.layout_symbol[\"text-max-angle\"]),\"text-writing-mode\":new qi(Ft.layout_symbol[\"text-writing-mode\"]),\"text-rotate\":new Hi(Ft.layout_symbol[\"text-rotate\"]),\"text-padding\":new qi(Ft.layout_symbol[\"text-padding\"]),\"text-keep-upright\":new qi(Ft.layout_symbol[\"text-keep-upright\"]),\"text-transform\":new Hi(Ft.layout_symbol[\"text-transform\"]),\"text-offset\":new Hi(Ft.layout_symbol[\"text-offset\"]),\"text-allow-overlap\":new qi(Ft.layout_symbol[\"text-allow-overlap\"]),\"text-ignore-placement\":new qi(Ft.layout_symbol[\"text-ignore-placement\"]),\"text-optional\":new qi(Ft.layout_symbol[\"text-optional\"])}),du={paint:new Yi({\"icon-opacity\":new Hi(Ft.paint_symbol[\"icon-opacity\"]),\"icon-color\":new Hi(Ft.paint_symbol[\"icon-color\"]),\"icon-halo-color\":new Hi(Ft.paint_symbol[\"icon-halo-color\"]),\"icon-halo-width\":new Hi(Ft.paint_symbol[\"icon-halo-width\"]),\"icon-halo-blur\":new Hi(Ft.paint_symbol[\"icon-halo-blur\"]),\"icon-translate\":new qi(Ft.paint_symbol[\"icon-translate\"]),\"icon-translate-anchor\":new qi(Ft.paint_symbol[\"icon-translate-anchor\"]),\"text-opacity\":new Hi(Ft.paint_symbol[\"text-opacity\"]),\"text-color\":new Hi(Ft.paint_symbol[\"text-color\"],{runtimeType:Xt,getOverride:function(t){return t.textColor},hasOverride:function(t){return!!t.textColor}}),\"text-halo-color\":new Hi(Ft.paint_symbol[\"text-halo-color\"]),\"text-halo-width\":new Hi(Ft.paint_symbol[\"text-halo-width\"]),\"text-halo-blur\":new Hi(Ft.paint_symbol[\"text-halo-blur\"]),\"text-translate\":new qi(Ft.paint_symbol[\"text-translate\"]),\"text-translate-anchor\":new qi(Ft.paint_symbol[\"text-translate-anchor\"])}),layout:pu},mu=function(t){this.type=t.property.overrides?t.property.overrides.runtimeType:Gt,this.defaultValue=t};mu.prototype.evaluate=function(t){if(t.formattedSection){var e=this.defaultValue.property.overrides;if(e&&e.hasOverride(t.formattedSection))return e.getOverride(t.formattedSection)}return t.feature&&t.featureState?this.defaultValue.evaluate(t.feature,t.featureState):this.defaultValue.property.specification.default},mu.prototype.eachChild=function(t){this.defaultValue.isConstant()||t(this.defaultValue.value._styleExpression.expression)},mu.prototype.outputDefined=function(){return!1},mu.prototype.serialize=function(){return null},oi(\"FormatSectionOverride\",mu,{omit:[\"defaultValue\"]});var gu=function(t){function e(e){t.call(this,e,du)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.recalculate=function(e,r){if(t.prototype.recalculate.call(this,e,r),\"auto\"===this.layout.get(\"icon-rotation-alignment\")&&(\"point\"!==this.layout.get(\"symbol-placement\")?this.layout._values[\"icon-rotation-alignment\"]=\"map\":this.layout._values[\"icon-rotation-alignment\"]=\"viewport\"),\"auto\"===this.layout.get(\"text-rotation-alignment\")&&(\"point\"!==this.layout.get(\"symbol-placement\")?this.layout._values[\"text-rotation-alignment\"]=\"map\":this.layout._values[\"text-rotation-alignment\"]=\"viewport\"),\"auto\"===this.layout.get(\"text-pitch-alignment\")&&(this.layout._values[\"text-pitch-alignment\"]=this.layout.get(\"text-rotation-alignment\")),\"auto\"===this.layout.get(\"icon-pitch-alignment\")&&(this.layout._values[\"icon-pitch-alignment\"]=this.layout.get(\"icon-rotation-alignment\")),\"point\"===this.layout.get(\"symbol-placement\")){var n=this.layout.get(\"text-writing-mode\");if(n){for(var i=[],a=0,o=n;a\",targetMapId:n,sourceMapId:a.mapId})}}},Lu.prototype.receive=function(t){var e=t.data,r=e.id;if(r&&(!e.targetMapId||this.mapId===e.targetMapId))if(\"\"===e.type){delete this.tasks[r];var n=this.cancelCallbacks[r];delete this.cancelCallbacks[r],n&&n()}else S()||e.mustQueue?(this.tasks[r]=e,this.taskQueue.push(r),this.invoker.trigger()):this.processTask(r,e)},Lu.prototype.process=function(){if(this.taskQueue.length){var t=this.taskQueue.shift(),e=this.tasks[t];delete this.tasks[t],this.taskQueue.length&&this.invoker.trigger(),e&&this.processTask(t,e)}},Lu.prototype.processTask=function(t,e){var r=this;if(\"\"===e.type){var n=this.callbacks[t];delete this.callbacks[t],n&&(e.error?n(hi(e.error)):n(null,hi(e.data)))}else{var i=!1,a=L(this.globalScope)?void 0:[],o=e.hasCallback?function(e,n){i=!0,delete r.cancelCallbacks[t],r.target.postMessage({id:t,type:\"\",sourceMapId:r.mapId,error:e?ui(e):null,data:ui(n,a)},a)}:function(t){i=!0},s=null,l=hi(e.data);if(this.parent[e.type])s=this.parent[e.type](e.sourceMapId,l,o);else if(this.parent.getWorkerSource){var c=e.type.split(\".\");s=this.parent.getWorkerSource(e.sourceMapId,c[0],l.source)[c[1]](l,o)}else o(new Error(\"Could not find function \"+e.type));!i&&s&&s.cancel&&(this.cancelCallbacks[t]=s.cancel)}},Lu.prototype.remove=function(){this.invoker.remove(),this.target.removeEventListener(\"message\",this.receive,!1)};var Pu=function(t,e){t&&(e?this.setSouthWest(t).setNorthEast(e):4===t.length?this.setSouthWest([t[0],t[1]]).setNorthEast([t[2],t[3]]):this.setSouthWest(t[0]).setNorthEast(t[1]))};Pu.prototype.setNorthEast=function(t){return this._ne=t instanceof Ou?new Ou(t.lng,t.lat):Ou.convert(t),this},Pu.prototype.setSouthWest=function(t){return this._sw=t instanceof Ou?new Ou(t.lng,t.lat):Ou.convert(t),this},Pu.prototype.extend=function(t){var e,r,n=this._sw,i=this._ne;if(t instanceof Ou)e=t,r=t;else{if(!(t instanceof Pu)){if(Array.isArray(t)){if(4===t.length||t.every(Array.isArray)){var a=t;return this.extend(Pu.convert(a))}var o=t;return this.extend(Ou.convert(o))}return this}if(e=t._sw,r=t._ne,!e||!r)return this}return n||i?(n.lng=Math.min(e.lng,n.lng),n.lat=Math.min(e.lat,n.lat),i.lng=Math.max(r.lng,i.lng),i.lat=Math.max(r.lat,i.lat)):(this._sw=new Ou(e.lng,e.lat),this._ne=new Ou(r.lng,r.lat)),this},Pu.prototype.getCenter=function(){return new Ou((this._sw.lng+this._ne.lng)/2,(this._sw.lat+this._ne.lat)/2)},Pu.prototype.getSouthWest=function(){return this._sw},Pu.prototype.getNorthEast=function(){return this._ne},Pu.prototype.getNorthWest=function(){return new Ou(this.getWest(),this.getNorth())},Pu.prototype.getSouthEast=function(){return new Ou(this.getEast(),this.getSouth())},Pu.prototype.getWest=function(){return this._sw.lng},Pu.prototype.getSouth=function(){return this._sw.lat},Pu.prototype.getEast=function(){return this._ne.lng},Pu.prototype.getNorth=function(){return this._ne.lat},Pu.prototype.toArray=function(){return[this._sw.toArray(),this._ne.toArray()]},Pu.prototype.toString=function(){return\"LngLatBounds(\"+this._sw.toString()+\", \"+this._ne.toString()+\")\"},Pu.prototype.isEmpty=function(){return!(this._sw&&this._ne)},Pu.prototype.contains=function(t){var e=Ou.convert(t),r=e.lng,n=e.lat,i=this._sw.lat<=n&&n<=this._ne.lat,a=this._sw.lng<=r&&r<=this._ne.lng;return this._sw.lng>this._ne.lng&&(a=this._sw.lng>=r&&r>=this._ne.lng),i&&a},Pu.convert=function(t){return!t||t instanceof Pu?t:new Pu(t)};var zu=6371008.8,Ou=function(t,e){if(isNaN(t)||isNaN(e))throw new Error(\"Invalid LngLat object: (\"+t+\", \"+e+\")\");if(this.lng=+t,this.lat=+e,this.lat>90||this.lat<-90)throw new Error(\"Invalid LngLat latitude value: must be between -90 and 90\")};Ou.prototype.wrap=function(){return new Ou(f(this.lng,-180,180),this.lat)},Ou.prototype.toArray=function(){return[this.lng,this.lat]},Ou.prototype.toString=function(){return\"LngLat(\"+this.lng+\", \"+this.lat+\")\"},Ou.prototype.distanceTo=function(t){var e=Math.PI/180,r=this.lat*e,n=t.lat*e,i=Math.sin(r)*Math.sin(n)+Math.cos(r)*Math.cos(n)*Math.cos((t.lng-this.lng)*e);return zu*Math.acos(Math.min(i,1))},Ou.prototype.toBounds=function(t){void 0===t&&(t=0);var e=360*t/40075017,r=e/Math.cos(Math.PI/180*this.lat);return new Pu(new Ou(this.lng-r,this.lat-e),new Ou(this.lng+r,this.lat+e))},Ou.convert=function(t){if(t instanceof Ou)return t;if(Array.isArray(t)&&(2===t.length||3===t.length))return new Ou(Number(t[0]),Number(t[1]));if(!Array.isArray(t)&&\"object\"==typeof t&&null!==t)return new Ou(Number(\"lng\"in t?t.lng:t.lon),Number(t.lat));throw new Error(\"`LngLatLike` argument must be specified as a LngLat instance, an object {lng: , lat: }, an object {lon: , lat: }, or an array of [, ]\")};var Du=2*Math.PI*zu;function Ru(t){return Du*Math.cos(t*Math.PI/180)}function Fu(t){return(180+t)/360}function Bu(t){return(180-180/Math.PI*Math.log(Math.tan(Math.PI/4+t*Math.PI/360)))/360}function Nu(t,e){return t/Ru(e)}function ju(t){var e=180-360*t;return 360/Math.PI*Math.atan(Math.exp(e*Math.PI/180))-90}var Uu=function(t,e,r){void 0===r&&(r=0),this.x=+t,this.y=+e,this.z=+r};Uu.fromLngLat=function(t,e){void 0===e&&(e=0);var r=Ou.convert(t);return new Uu(Fu(r.lng),Bu(r.lat),Nu(e,r.lat))},Uu.prototype.toLngLat=function(){return new Ou(360*this.x-180,ju(this.y))},Uu.prototype.toAltitude=function(){return t=this.z,e=this.y,t*Ru(ju(e));var t,e},Uu.prototype.meterInMercatorCoordinateUnits=function(){return 1/Du*(t=ju(this.y),1/Math.cos(t*Math.PI/180));var t};var Vu=function(t,e,r){this.z=t,this.x=e,this.y=r,this.key=Gu(0,t,t,e,r)};Vu.prototype.equals=function(t){return this.z===t.z&&this.x===t.x&&this.y===t.y},Vu.prototype.url=function(t,e){var r,n,i,a,o,s=(r=this.x,n=this.y,i=this.z,a=Iu(256*r,256*(n=Math.pow(2,i)-n-1),i),o=Iu(256*(r+1),256*(n+1),i),a[0]+\",\"+a[1]+\",\"+o[0]+\",\"+o[1]),l=function(t,e,r){for(var n,i=\"\",a=t;a>0;a--)i+=(e&(n=1<this.canonical.z?new Hu(t,this.wrap,this.canonical.z,this.canonical.x,this.canonical.y):new Hu(t,this.wrap,t,this.canonical.x>>e,this.canonical.y>>e)},Hu.prototype.calculateScaledKey=function(t,e){var r=this.canonical.z-t;return t>this.canonical.z?Gu(this.wrap*+e,t,this.canonical.z,this.canonical.x,this.canonical.y):Gu(this.wrap*+e,t,t,this.canonical.x>>r,this.canonical.y>>r)},Hu.prototype.isChildOf=function(t){if(t.wrap!==this.wrap)return!1;var e=this.canonical.z-t.canonical.z;return 0===t.overscaledZ||t.overscaledZ>e&&t.canonical.y===this.canonical.y>>e},Hu.prototype.children=function(t){if(this.overscaledZ>=t)return[new Hu(this.overscaledZ+1,this.wrap,this.canonical.z,this.canonical.x,this.canonical.y)];var e=this.canonical.z+1,r=2*this.canonical.x,n=2*this.canonical.y;return[new Hu(e,this.wrap,e,r,n),new Hu(e,this.wrap,e,r+1,n),new Hu(e,this.wrap,e,r,n+1),new Hu(e,this.wrap,e,r+1,n+1)]},Hu.prototype.isLessThan=function(t){return this.wrapt.wrap)&&(this.overscaledZt.overscaledZ)&&(this.canonical.xt.canonical.x)&&this.canonical.y=this.dim+1||e<-1||e>=this.dim+1)throw new RangeError(\"out of range source coordinates for DEM data\");return(e+1)*this.stride+(t+1)},Zu.prototype._unpackMapbox=function(t,e,r){return(256*t*256+256*e+r)/10-1e4},Zu.prototype._unpackTerrarium=function(t,e,r){return 256*t+e+r/256-32768},Zu.prototype.getPixels=function(){return new Ko({width:this.stride,height:this.stride},new Uint8Array(this.data.buffer))},Zu.prototype.backfillBorder=function(t,e,r){if(this.dim!==t.dim)throw new Error(\"dem dimension mismatch\");var n=e*this.dim,i=e*this.dim+this.dim,a=r*this.dim,o=r*this.dim+this.dim;switch(e){case-1:n=i-1;break;case 1:i=n+1}switch(r){case-1:a=o-1;break;case 1:o=a+1}for(var s=-e*this.dim,l=-r*this.dim,c=a;c=0&&u[3]>=0&&s.insert(o,u[0],u[1],u[2],u[3])}},Ju.prototype.loadVTLayers=function(){return this.vtLayers||(this.vtLayers=new tl.VectorTile(new Pl(this.rawTileData)).layers,this.sourceLayerCoder=new Wu(this.vtLayers?Object.keys(this.vtLayers).sort():[\"_geojsonTileLayer\"])),this.vtLayers},Ju.prototype.query=function(t,e,r,n){var i=this;this.loadVTLayers();for(var o=t.params||{},s=po/t.tileSize/t.scale,l=An(o.filter),c=t.queryGeometry,u=t.queryPadding*s,h=Qu(c),f=this.grid.query(h.minX-u,h.minY-u,h.maxX+u,h.maxY+u),p=Qu(t.cameraQueryGeometry),d=0,m=this.grid3D.query(p.minX-u,p.minY-u,p.maxX+u,p.maxY+u,(function(e,r,n,i){return function(t,e,r,n,i){for(var o=0,s=t;o=l.x&&i>=l.y)return!0}var c=[new a(e,r),new a(e,i),new a(n,i),new a(n,r)];if(t.length>2)for(var u=0,h=c;u=0)return!0;return!1}(a,h)){var f=this.sourceLayerCoder.decode(r),d=this.vtLayers[f].feature(n);if(i.needGeometry){var m=vo(d,!0);if(!i.filter(new Oi(this.tileID.overscaledZ),m,this.tileID.canonical))return}else if(!i.filter(new Oi(this.tileID.overscaledZ),d))return;for(var g=this.getId(d,f),y=0;yn)i=!1;else if(e)if(this.expirationTimeft&&(t.getActor().send(\"enforceCacheSizeLimit\",ht),xt=0)},t.clamp=h,t.clearTileCache=function(t){var e=s.caches.delete(ut);t&&e.catch(t).then((function(){return t()}))},t.clipLine=Fc,t.clone=function(t){var e=new Fo(16);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e[9]=t[9],e[10]=t[10],e[11]=t[11],e[12]=t[12],e[13]=t[13],e[14]=t[14],e[15]=t[15],e},t.clone$1=w,t.clone$2=function(t){var e=new Fo(3);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e},t.collisionCircleLayout=Ml,t.config=j,t.create=function(){var t=new Fo(16);return Fo!=Float32Array&&(t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0),t[0]=1,t[5]=1,t[10]=1,t[15]=1,t},t.create$1=function(){var t=new Fo(9);return Fo!=Float32Array&&(t[1]=0,t[2]=0,t[3]=0,t[5]=0,t[6]=0,t[7]=0),t[0]=1,t[4]=1,t[8]=1,t},t.create$2=function(){var t=new Fo(4);return Fo!=Float32Array&&(t[1]=0,t[2]=0),t[0]=1,t[3]=1,t},t.createCommonjsModule=e,t.createExpression=hn,t.createLayout=ta,t.createStyleLayer=function(t){return\"custom\"===t.type?new bu(t):new wu[t.type](t)},t.cross=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=r[0],s=r[1],l=r[2];return t[0]=i*l-a*s,t[1]=a*o-n*l,t[2]=n*s-i*o,t},t.deepEqual=function t(e,r){if(Array.isArray(e)){if(!Array.isArray(r)||e.length!==r.length)return!1;for(var n=0;n0&&(a=1/Math.sqrt(a)),t[0]=e[0]*a,t[1]=e[1]*a,t[2]=e[2]*a,t},t.number=er,t.offscreenCanvasSupported=_t,t.ortho=function(t,e,r,n,i,a,o){var s=1/(e-r),l=1/(n-i),c=1/(a-o);return t[0]=-2*s,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=-2*l,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=2*c,t[11]=0,t[12]=(e+r)*s,t[13]=(i+n)*l,t[14]=(o+a)*c,t[15]=1,t},t.parseGlyphPBF=function(t){return new Pl(t).readFields(Ql,[])},t.pbf=Pl,t.performSymbolLayout=function(t,e,r,n,i,a,o){t.createArrays();var s=512*t.overscaling;t.tilePixelRatio=po/s,t.compareText={},t.iconsNeedLinear=!1;var l=t.layers[0].layout,c=t.layers[0]._unevaluatedLayout._values,u={};if(\"composite\"===t.textSizeData.kind){var h=t.textSizeData,f=h.minZoom,p=h.maxZoom;u.compositeTextSizes=[c[\"text-size\"].possiblyEvaluate(new Oi(f),o),c[\"text-size\"].possiblyEvaluate(new Oi(p),o)]}if(\"composite\"===t.iconSizeData.kind){var d=t.iconSizeData,m=d.minZoom,g=d.maxZoom;u.compositeIconSizes=[c[\"icon-size\"].possiblyEvaluate(new Oi(m),o),c[\"icon-size\"].possiblyEvaluate(new Oi(g),o)]}u.layoutTextSize=c[\"text-size\"].possiblyEvaluate(new Oi(t.zoom+1),o),u.layoutIconSize=c[\"icon-size\"].possiblyEvaluate(new Oi(t.zoom+1),o),u.textMaxSize=c[\"text-size\"].possiblyEvaluate(new Oi(18));for(var y=l.get(\"text-line-height\")*Cl,v=\"map\"===l.get(\"text-rotation-alignment\")&&\"point\"!==l.get(\"symbol-placement\"),x=l.get(\"text-keep-upright\"),_=l.get(\"text-size\"),b=function(){var a=T[w],s=l.get(\"text-font\").evaluate(a,{},o).join(\",\"),c=_.evaluate(a,{},o),h=u.layoutTextSize.evaluate(a,{},o),f=u.layoutIconSize.evaluate(a,{},o),p={horizontal:{},vertical:void 0},d=a.text,m=[0,0];if(d){var g=d.toString(),b=l.get(\"text-letter-spacing\").evaluate(a,{},o)*Cl,A=function(t){for(var e=0,r=t;e=po||h.y<0||h.y>=po||function(t,e,r,n,i,a,o,s,l,c,u,h,f,p,d,m,g,y,v,x,_,b,w,T,A){var M,S,E,C,L,I=t.addToLineVertexArray(e,r),P=0,z=0,O=0,D=0,R=-1,F=-1,B={},N=ja(\"\"),j=0,U=0;if(void 0===s._unevaluatedLayout.getValue(\"text-radial-offset\")?(j=(M=s.layout.get(\"text-offset\").evaluate(_,{},T).map((function(t){return t*Cl})))[0],U=M[1]):(j=s.layout.get(\"text-radial-offset\").evaluate(_,{},T)*Cl,U=Jc),t.allowVerticalPlacement&&n.vertical){var V=s.layout.get(\"text-rotate\").evaluate(_,{},T)+90,q=n.vertical;C=new Hc(l,e,c,u,h,q,f,p,d,V),o&&(L=new Hc(l,e,c,u,h,o,g,y,d,V))}if(i){var H=s.layout.get(\"icon-rotate\").evaluate(_,{}),G=\"none\"!==s.layout.get(\"icon-text-fit\"),Z=Nc(i,H,w,G),W=o?Nc(o,H,w,G):void 0;E=new Hc(l,e,c,u,h,i,g,y,!1,H),P=4*Z.length;var Y=t.iconSizeData,X=null;\"source\"===Y.kind?(X=[Ac*s.layout.get(\"icon-size\").evaluate(_,{})])[0]>eu&&k(t.layerIds[0]+': Value for \"icon-size\" is >= '+tu+'. Reduce your \"icon-size\".'):\"composite\"===Y.kind&&((X=[Ac*b.compositeIconSizes[0].evaluate(_,{},T),Ac*b.compositeIconSizes[1].evaluate(_,{},T)])[0]>eu||X[1]>eu)&&k(t.layerIds[0]+': Value for \"icon-size\" is >= '+tu+'. Reduce your \"icon-size\".'),t.addSymbols(t.icon,Z,X,x,v,_,!1,e,I.lineStartIndex,I.lineLength,-1,T),R=t.icon.placedSymbolArray.length-1,W&&(z=4*W.length,t.addSymbols(t.icon,W,X,x,v,_,lc.vertical,e,I.lineStartIndex,I.lineLength,-1,T),F=t.icon.placedSymbolArray.length-1)}for(var $ in n.horizontal){var J=n.horizontal[$];if(!S){N=ja(J.text);var K=s.layout.get(\"text-rotate\").evaluate(_,{},T);S=new Hc(l,e,c,u,h,J,f,p,d,K)}var Q=1===J.positionedLines.length;if(O+=ru(t,e,J,a,s,d,_,m,I,n.vertical?lc.horizontal:lc.horizontalOnly,Q?Object.keys(n.horizontal):[$],B,R,b,T),Q)break}n.vertical&&(D+=ru(t,e,n.vertical,a,s,d,_,m,I,lc.vertical,[\"vertical\"],B,F,b,T));var tt=S?S.boxStartIndex:t.collisionBoxArray.length,et=S?S.boxEndIndex:t.collisionBoxArray.length,rt=C?C.boxStartIndex:t.collisionBoxArray.length,nt=C?C.boxEndIndex:t.collisionBoxArray.length,it=E?E.boxStartIndex:t.collisionBoxArray.length,at=E?E.boxEndIndex:t.collisionBoxArray.length,ot=L?L.boxStartIndex:t.collisionBoxArray.length,st=L?L.boxEndIndex:t.collisionBoxArray.length,lt=-1,ct=function(t,e){return t&&t.circleDiameter?Math.max(t.circleDiameter,e):e};lt=ct(S,lt),lt=ct(C,lt),lt=ct(E,lt);var ut=(lt=ct(L,lt))>-1?1:0;ut&&(lt*=A/Cl),t.glyphOffsetArray.length>=fu.MAX_GLYPHS&&k(\"Too many glyphs being rendered in a tile. See https://github.com/mapbox/mapbox-gl-js/issues/2907\"),void 0!==_.sortKey&&t.addToSortKeyRanges(t.symbolInstances.length,_.sortKey),t.symbolInstances.emplaceBack(e.x,e.y,B.right>=0?B.right:-1,B.center>=0?B.center:-1,B.left>=0?B.left:-1,B.vertical||-1,R,F,N,tt,et,rt,nt,it,at,ot,st,c,O,D,P,z,ut,0,f,j,U,lt)}(t,h,s,r,n,i,f,t.layers[0],t.collisionBoxArray,e.index,e.sourceLayerIndex,t.index,v,w,M,l,_,T,S,d,e,a,c,u,o)};if(\"line\"===E)for(var P=0,z=Fc(e.geometry,0,0,po,po);P1){var U=Oc(j,A,r.vertical||m,n,g,x);U&&I(j,U)}}else if(\"Polygon\"===e.type)for(var V=0,q=Fs(e.geometry,0);V=E.maxzoom||\"none\"!==E.visibility&&(o(S,this.zoom,n),(m[E.id]=E.createBucket({index:u.bucketLayerIDs.length,layers:S,zoom:this.zoom,pixelRatio:this.pixelRatio,overscaling:this.overscaling,collisionBoxArray:this.collisionBoxArray,sourceLayerIndex:_,sourceID:this.source})).populate(b,g,this.tileID.canonical),u.bucketLayerIDs.push(S.map((function(t){return t.id}))))}}}var C=t.mapObject(g.glyphDependencies,(function(t){return Object.keys(t).map(Number)}));Object.keys(C).length?a.send(\"getGlyphs\",{uid:this.uid,stacks:C},(function(t,e){h||(h=t,f=e,P.call(l))})):f={};var L=Object.keys(g.iconDependencies);L.length?a.send(\"getImages\",{icons:L,source:this.source,tileID:this.tileID,type:\"icons\"},(function(t,e){h||(h=t,p=e,P.call(l))})):p={};var I=Object.keys(g.patternDependencies);function P(){if(h)return s(h);if(f&&p&&d){var e=new i(f),r=new t.ImageAtlas(p,d);for(var a in m){var l=m[a];l instanceof t.SymbolBucket?(o(l.layers,this.zoom,n),t.performSymbolLayout(l,f,e.positions,p,r.iconPositions,this.showCollisionBoxes,this.tileID.canonical)):l.hasPattern&&(l instanceof t.LineBucket||l instanceof t.FillBucket||l instanceof t.FillExtrusionBucket)&&(o(l.layers,this.zoom,n),l.addFeatures(g,this.tileID.canonical,r.patternPositions))}this.status=\"done\",s(null,{buckets:t.values(m).filter((function(t){return!t.isEmpty()})),featureIndex:u,collisionBoxArray:this.collisionBoxArray,glyphAtlasImage:e.image,imageAtlas:r,glyphMap:this.returnDependencies?f:null,iconMap:this.returnDependencies?p:null,glyphPositions:this.returnDependencies?e.positions:null})}}I.length?a.send(\"getImages\",{icons:I,source:this.source,tileID:this.tileID,type:\"patterns\"},(function(t,e){h||(h=t,d=e,P.call(l))})):d={},P.call(this)};var l=function(t,e,r,n){this.actor=t,this.layerIndex=e,this.availableImages=r,this.loadVectorData=n||s,this.loading={},this.loaded={}};l.prototype.loadTile=function(e,r){var n=this,i=e.uid;this.loading||(this.loading={});var o=!!(e&&e.request&&e.request.collectResourceTiming)&&new t.RequestPerformance(e.request),s=this.loading[i]=new a(e);s.abort=this.loadVectorData(e,(function(e,a){if(delete n.loading[i],e||!a)return s.status=\"done\",n.loaded[i]=s,r(e);var l=a.rawData,c={};a.expires&&(c.expires=a.expires),a.cacheControl&&(c.cacheControl=a.cacheControl);var u={};if(o){var h=o.finish();h&&(u.resourceTiming=JSON.parse(JSON.stringify(h)))}s.vectorTile=a.vectorTile,s.parse(a.vectorTile,n.layerIndex,n.availableImages,n.actor,(function(e,n){if(e||!n)return r(e);r(null,t.extend({rawTileData:l.slice(0)},n,c,u))})),n.loaded=n.loaded||{},n.loaded[i]=s}))},l.prototype.reloadTile=function(t,e){var r=this,n=this.loaded,i=t.uid,a=this;if(n&&n[i]){var o=n[i];o.showCollisionBoxes=t.showCollisionBoxes;var s=function(t,n){var i=o.reloadCallback;i&&(delete o.reloadCallback,o.parse(o.vectorTile,a.layerIndex,r.availableImages,a.actor,i)),e(t,n)};\"parsing\"===o.status?o.reloadCallback=s:\"done\"===o.status&&(o.vectorTile?o.parse(o.vectorTile,this.layerIndex,this.availableImages,this.actor,s):s())}},l.prototype.abortTile=function(t,e){var r=this.loading,n=t.uid;r&&r[n]&&r[n].abort&&(r[n].abort(),delete r[n]),e()},l.prototype.removeTile=function(t,e){var r=this.loaded,n=t.uid;r&&r[n]&&delete r[n],e()};var c=t.window.ImageBitmap,u=function(){this.loaded={}};u.prototype.loadTile=function(e,r){var n=e.uid,i=e.encoding,a=e.rawImageData,o=c&&a instanceof c?this.getImageData(a):a,s=new t.DEMData(n,o,i);this.loaded=this.loaded||{},this.loaded[n]=s,r(null,s)},u.prototype.getImageData=function(e){this.offscreenCanvas&&this.offscreenCanvasContext||(this.offscreenCanvas=new OffscreenCanvas(e.width,e.height),this.offscreenCanvasContext=this.offscreenCanvas.getContext(\"2d\")),this.offscreenCanvas.width=e.width,this.offscreenCanvas.height=e.height,this.offscreenCanvasContext.drawImage(e,0,0,e.width,e.height);var r=this.offscreenCanvasContext.getImageData(-1,-1,e.width+2,e.height+2);return this.offscreenCanvasContext.clearRect(0,0,this.offscreenCanvas.width,this.offscreenCanvas.height),new t.RGBAImage({width:r.width,height:r.height},r.data)},u.prototype.removeTile=function(t){var e=this.loaded,r=t.uid;e&&e[r]&&delete e[r]};var h=function t(e,r){var n,i=e&&e.type;if(\"FeatureCollection\"===i)for(n=0;n=0!=!!e&&t.reverse()}var d=t.vectorTile.VectorTileFeature.prototype.toGeoJSON,m=function(e){this._feature=e,this.extent=t.EXTENT,this.type=e.type,this.properties=e.tags,\"id\"in e&&!isNaN(e.id)&&(this.id=parseInt(e.id,10))};m.prototype.loadGeometry=function(){if(1===this._feature.type){for(var e=[],r=0,n=this._feature.geometry;r>31}function I(t,e){for(var r=t.loadGeometry(),n=t.type,i=0,a=0,o=r.length,s=0;s>1;O(t,e,o,n,i,a%2),z(t,e,r,n,o-1,a+1),z(t,e,r,o+1,i,a+1)}}function O(t,e,r,n,i,a){for(;i>n;){if(i-n>600){var o=i-n+1,s=r-n+1,l=Math.log(o),c=.5*Math.exp(2*l/3),u=.5*Math.sqrt(l*c*(o-c)/o)*(s-o/2<0?-1:1);O(t,e,r,Math.max(n,Math.floor(r-s*c/o+u)),Math.min(i,Math.floor(r+(o-s)*c/o+u)),a)}var h=e[2*r+a],f=n,p=i;for(D(t,e,n,r),e[2*i+a]>h&&D(t,e,n,i);fh;)p--}e[2*n+a]===h?D(t,e,n,p):D(t,e,++p,i),p<=r&&(n=p+1),r<=p&&(i=p-1)}}function D(t,e,r,n){R(t,r,n),R(e,2*r,2*n),R(e,2*r+1,2*n+1)}function R(t,e,r){var n=t[e];t[e]=t[r],t[r]=n}function F(t,e,r,n){var i=t-r,a=e-n;return i*i+a*a}b.fromVectorTileJs=w,b.fromGeojsonVt=T,b.GeoJSONWrapper=k;var B=function(t){return t[0]},N=function(t){return t[1]},j=function(t,e,r,n,i){void 0===e&&(e=B),void 0===r&&(r=N),void 0===n&&(n=64),void 0===i&&(i=Float64Array),this.nodeSize=n,this.points=t;for(var a=t.length<65536?Uint16Array:Uint32Array,o=this.ids=new a(t.length),s=this.coords=new i(2*t.length),l=0;l=r&&s<=i&&l>=n&&l<=a&&u.push(t[d]);else{var m=Math.floor((p+f)/2);s=e[2*m],l=e[2*m+1],s>=r&&s<=i&&l>=n&&l<=a&&u.push(t[m]);var g=(h+1)%2;(0===h?r<=s:n<=l)&&(c.push(p),c.push(m-1),c.push(g)),(0===h?i>=s:a>=l)&&(c.push(m+1),c.push(f),c.push(g))}}return u}(this.ids,this.coords,t,e,r,n,this.nodeSize)},j.prototype.within=function(t,e,r){return function(t,e,r,n,i,a){for(var o=[0,t.length-1,0],s=[],l=i*i;o.length;){var c=o.pop(),u=o.pop(),h=o.pop();if(u-h<=a)for(var f=h;f<=u;f++)F(e[2*f],e[2*f+1],r,n)<=l&&s.push(t[f]);else{var p=Math.floor((h+u)/2),d=e[2*p],m=e[2*p+1];F(d,m,r,n)<=l&&s.push(t[p]);var g=(c+1)%2;(0===c?r-i<=d:n-i<=m)&&(o.push(h),o.push(p-1),o.push(g)),(0===c?r+i>=d:n+i>=m)&&(o.push(p+1),o.push(u),o.push(g))}}return s}(this.ids,this.coords,t,e,r,this.nodeSize)};var U={minZoom:0,maxZoom:16,minPoints:2,radius:40,extent:512,nodeSize:64,log:!1,generateId:!1,reduce:null,map:function(t){return t}},V=function(t){this.options=X(Object.create(U),t),this.trees=new Array(this.options.maxZoom+1)};function q(t,e,r,n,i){return{x:t,y:e,zoom:1/0,id:r,parentId:-1,numPoints:n,properties:i}}function H(t,e){var r=t.geometry.coordinates,n=r[0],i=r[1];return{x:W(n),y:Y(i),zoom:1/0,index:e,parentId:-1}}function G(t){return{type:\"Feature\",id:t.id,properties:Z(t),geometry:{type:\"Point\",coordinates:[(n=t.x,360*(n-.5)),(e=t.y,r=(180-360*e)*Math.PI/180,360*Math.atan(Math.exp(r))/Math.PI-90)]}};var e,r,n}function Z(t){var e=t.numPoints,r=e>=1e4?Math.round(e/1e3)+\"k\":e>=1e3?Math.round(e/100)/10+\"k\":e;return X(X({},t.properties),{cluster:!0,cluster_id:t.id,point_count:e,point_count_abbreviated:r})}function W(t){return t/360+.5}function Y(t){var e=Math.sin(t*Math.PI/180),r=.5-.25*Math.log((1+e)/(1-e))/Math.PI;return r<0?0:r>1?1:r}function X(t,e){for(var r in e)t[r]=e[r];return t}function $(t){return t.x}function J(t){return t.y}function K(t,e,r,n){for(var i,a=n,o=r-e>>1,s=r-e,l=t[e],c=t[e+1],u=t[r],h=t[r+1],f=e+3;fa)i=f,a=p;else if(p===a){var d=Math.abs(f-o);dn&&(i-e>3&&K(t,e,i,n),t[i+2]=a,r-i>3&&K(t,i,r,n))}function Q(t,e,r,n,i,a){var o=i-r,s=a-n;if(0!==o||0!==s){var l=((t-r)*o+(e-n)*s)/(o*o+s*s);l>1?(r=i,n=a):l>0&&(r+=o*l,n+=s*l)}return(o=t-r)*o+(s=e-n)*s}function tt(t,e,r,n){var i={id:void 0===t?null:t,type:e,geometry:r,tags:n,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0};return function(t){var e=t.geometry,r=t.type;if(\"Point\"===r||\"MultiPoint\"===r||\"LineString\"===r)et(t,e);else if(\"Polygon\"===r||\"MultiLineString\"===r)for(var n=0;n0&&(o+=n?(i*c-l*a)/2:Math.sqrt(Math.pow(l-i,2)+Math.pow(c-a,2))),i=l,a=c}var u=e.length-3;e[2]=1,K(e,0,u,r),e[u+2]=1,e.size=Math.abs(o),e.start=0,e.end=e.size}function at(t,e,r,n){for(var i=0;i1?1:r}function lt(t,e,r,n,i,a,o,s){if(n/=e,a>=(r/=e)&&o=n)return null;for(var l=[],c=0;c=r&&d=n)){var m=[];if(\"Point\"===f||\"MultiPoint\"===f)ct(h,m,r,n,i);else if(\"LineString\"===f)ut(h,m,r,n,i,!1,s.lineMetrics);else if(\"MultiLineString\"===f)ft(h,m,r,n,i,!1);else if(\"Polygon\"===f)ft(h,m,r,n,i,!0);else if(\"MultiPolygon\"===f)for(var g=0;g=r&&o<=n&&(e.push(t[a]),e.push(t[a+1]),e.push(t[a+2]))}}function ut(t,e,r,n,i,a,o){for(var s,l,c=ht(t),u=0===i?dt:mt,h=t.start,f=0;fr&&(l=u(c,p,d,g,y,r),o&&(c.start=h+s*l)):v>n?x=r&&(l=u(c,p,d,g,y,r),_=!0),x>n&&v<=n&&(l=u(c,p,d,g,y,n),_=!0),!a&&_&&(o&&(c.end=h+s*l),e.push(c),c=ht(t)),o&&(h+=s)}var b=t.length-3;p=t[b],d=t[b+1],m=t[b+2],(v=0===i?p:d)>=r&&v<=n&&pt(c,p,d,m),b=c.length-3,a&&b>=3&&(c[b]!==c[0]||c[b+1]!==c[1])&&pt(c,c[0],c[1],c[2]),c.length&&e.push(c)}function ht(t){var e=[];return e.size=t.size,e.start=t.start,e.end=t.end,e}function ft(t,e,r,n,i,a){for(var o=0;oo.maxX&&(o.maxX=u),h>o.maxY&&(o.maxY=h)}return o}function bt(t,e,r,n){var i=e.geometry,a=e.type,o=[];if(\"Point\"===a||\"MultiPoint\"===a)for(var s=0;s0&&e.size<(i?o:n))r.numPoints+=e.length/3;else{for(var s=[],l=0;lo)&&(r.numSimplified++,s.push(e[l]),s.push(e[l+1])),r.numPoints++;i&&function(t,e){for(var r=0,n=0,i=t.length,a=i-2;n0===e)for(n=0,i=t.length;n24)throw new Error(\"maxZoom should be in the 0-24 range\");if(e.promoteId&&e.generateId)throw new Error(\"promoteId and generateId cannot be used together.\");var n=function(t,e){var r=[];if(\"FeatureCollection\"===t.type)for(var n=0;n=n;c--){var u=+Date.now();s=this._cluster(s,c),this.trees[c]=new j(s,$,J,a,Float32Array),r&&console.log(\"z%d: %d clusters in %dms\",c,s.length,+Date.now()-u)}return r&&console.timeEnd(\"total time\"),this},V.prototype.getClusters=function(t,e){var r=((t[0]+180)%360+360)%360-180,n=Math.max(-90,Math.min(90,t[1])),i=180===t[2]?180:((t[2]+180)%360+360)%360-180,a=Math.max(-90,Math.min(90,t[3]));if(t[2]-t[0]>=360)r=-180,i=180;else if(r>i){var o=this.getClusters([r,n,180,a],e),s=this.getClusters([-180,n,i,a],e);return o.concat(s)}for(var l=this.trees[this._limitZoom(e)],c=[],u=0,h=l.range(W(r),Y(a),W(i),Y(n));ue&&(d+=v.numPoints||1)}if(d>=s){for(var x=u.x*p,_=u.y*p,b=o&&p>1?this._map(u,!0):null,w=(c<<5)+(e+1)+this.points.length,T=0,k=f;T1)for(var E=0,C=f;E>5},V.prototype._getOriginZoom=function(t){return(t-this.points.length)%32},V.prototype._map=function(t,e){if(t.numPoints)return e?X({},t.properties):t.properties;var r=this.points[t.index].properties,n=this.options.map(r);return e&&n===r?X({},n):n},Tt.prototype.options={maxZoom:14,indexMaxZoom:5,indexMaxPoints:1e5,tolerance:3,extent:4096,buffer:64,lineMetrics:!1,promoteId:null,generateId:!1,debug:0},Tt.prototype.splitTile=function(t,e,r,n,i,a,o){for(var s=[t,e,r,n],l=this.options,c=l.debug;s.length;){n=s.pop(),r=s.pop(),e=s.pop(),t=s.pop();var u=1<1&&console.time(\"creation\"),f=this.tiles[h]=_t(t,e,r,n,l),this.tileCoords.push({z:e,x:r,y:n}),c)){c>1&&(console.log(\"tile z%d-%d-%d (features: %d, points: %d, simplified: %d)\",e,r,n,f.numFeatures,f.numPoints,f.numSimplified),console.timeEnd(\"creation\"));var p=\"z\"+e;this.stats[p]=(this.stats[p]||0)+1,this.total++}if(f.source=t,i){if(e===l.maxZoom||e===i)continue;var d=1<1&&console.time(\"clipping\");var m,g,y,v,x,_,b=.5*l.buffer/l.extent,w=.5-b,T=.5+b,k=1+b;m=g=y=v=null,x=lt(t,u,r-b,r+T,0,f.minX,f.maxX,l),_=lt(t,u,r+w,r+k,0,f.minX,f.maxX,l),t=null,x&&(m=lt(x,u,n-b,n+T,1,f.minY,f.maxY,l),g=lt(x,u,n+w,n+k,1,f.minY,f.maxY,l),x=null),_&&(y=lt(_,u,n-b,n+T,1,f.minY,f.maxY,l),v=lt(_,u,n+w,n+k,1,f.minY,f.maxY,l),_=null),c>1&&console.timeEnd(\"clipping\"),s.push(m||[],e+1,2*r,2*n),s.push(g||[],e+1,2*r,2*n+1),s.push(y||[],e+1,2*r+1,2*n),s.push(v||[],e+1,2*r+1,2*n+1)}}},Tt.prototype.getTile=function(t,e,r){var n=this.options,i=n.extent,a=n.debug;if(t<0||t>24)return null;var o=1<1&&console.log(\"drilling down to z%d-%d-%d\",t,e,r);for(var l,c=t,u=e,h=r;!l&&c>0;)c--,u=Math.floor(u/2),h=Math.floor(h/2),l=this.tiles[kt(c,u,h)];return l&&l.source?(a>1&&console.log(\"found parent tile z%d-%d-%d\",c,u,h),a>1&&console.time(\"drilling down\"),this.splitTile(l.source,c,u,h,t,e,r),a>1&&console.timeEnd(\"drilling down\"),this.tiles[s]?vt(this.tiles[s],i):null):null};var Mt=function(e){function r(t,r,n,i){e.call(this,t,r,n,At),i&&(this.loadGeoJSON=i)}return e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r,r.prototype.loadData=function(t,e){this._pendingCallback&&this._pendingCallback(null,{abandoned:!0}),this._pendingCallback=e,this._pendingLoadDataParams=t,this._state&&\"Idle\"!==this._state?this._state=\"NeedsLoadData\":(this._state=\"Coalescing\",this._loadData())},r.prototype._loadData=function(){var e=this;if(this._pendingCallback&&this._pendingLoadDataParams){var r=this._pendingCallback,n=this._pendingLoadDataParams;delete this._pendingCallback,delete this._pendingLoadDataParams;var i=!!(n&&n.request&&n.request.collectResourceTiming)&&new t.RequestPerformance(n.request);this.loadGeoJSON(n,(function(a,o){if(a||!o)return r(a);if(\"object\"!=typeof o)return r(new Error(\"Input data given to '\"+n.source+\"' is not a valid GeoJSON object.\"));h(o,!0);try{if(n.filter){var s=t.createExpression(n.filter,{type:\"boolean\",\"property-type\":\"data-driven\",overridable:!1,transition:!1});if(\"error\"===s.result)throw new Error(s.value.map((function(t){return t.key+\": \"+t.message})).join(\", \"));var l=o.features.filter((function(t){return s.value.evaluate({zoom:0},t)}));o={type:\"FeatureCollection\",features:l}}e._geoJSONIndex=n.cluster?new V(function(e){var r=e.superclusterOptions,n=e.clusterProperties;if(!n||!r)return r;for(var i={},a={},o={accumulated:null,zoom:0},s={properties:null},l=Object.keys(n),c=0,u=l;c=0?0:e.button},r.remove=function(t){t.parentNode&&t.parentNode.removeChild(t)};var f=function(e){function r(){e.call(this),this.images={},this.updatedImages={},this.callbackDispatchedThisFrame={},this.loaded=!1,this.requestors=[],this.patterns={},this.atlasImage=new t.RGBAImage({width:1,height:1}),this.dirty=!0}return e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r,r.prototype.isLoaded=function(){return this.loaded},r.prototype.setLoaded=function(t){if(this.loaded!==t&&(this.loaded=t,t)){for(var e=0,r=this.requestors;e=0?1.2:1))}function y(t,e,r,n,i,a,o){for(var s=0;s65535)e(new Error(\"glyphs > 65535 not supported\"));else if(a.ranges[s])e(null,{stack:r,id:i,glyph:o});else{var l=a.requests[s];l||(l=a.requests[s]=[],x.loadGlyphRange(r,s,n.url,n.requestManager,(function(t,e){if(e){for(var r in e)n._doesCharSupportLocalGlyph(+r)||(a.glyphs[+r]=e[+r]);a.ranges[s]=!0}for(var i=0,o=l;i1&&(l=t[++s]);var u=Math.abs(c-l.left),h=Math.abs(c-l.right),f=Math.min(u,h),p=void 0,d=i/r*(n+1);if(l.isDash){var m=n-Math.abs(d);p=Math.sqrt(f*f+m*m)}else p=n-Math.sqrt(f*f+d*d);this.data[o+c]=Math.max(0,Math.min(255,p+128))}},k.prototype.addRegularDash=function(t){for(var e=t.length-1;e>=0;--e){var r=t[e],n=t[e+1];r.zeroLength?t.splice(e,1):n&&n.isDash===r.isDash&&(n.left=r.left,t.splice(e,1))}var i=t[0],a=t[t.length-1];i.isDash===a.isDash&&(i.left=a.left-this.width,a.right=i.right+this.width);for(var o=this.width*this.nextRow,s=0,l=t[s],c=0;c1&&(l=t[++s]);var u=Math.abs(c-l.left),h=Math.abs(c-l.right),f=Math.min(u,h),p=l.isDash?f:-f;this.data[o+c]=Math.max(0,Math.min(255,p+128))}},k.prototype.addDash=function(e,r){var n=r?7:0,i=2*n+1;if(this.nextRow+i>this.height)return t.warnOnce(\"LineAtlas out of space\"),null;for(var a=0,o=0;o=n&&e.x=i&&e.y0&&(l[new t.OverscaledTileID(e.overscaledZ,a,r.z,i,r.y-1).key]={backfilled:!1},l[new t.OverscaledTileID(e.overscaledZ,e.wrap,r.z,r.x,r.y-1).key]={backfilled:!1},l[new t.OverscaledTileID(e.overscaledZ,s,r.z,o,r.y-1).key]={backfilled:!1}),r.y+10&&(n.resourceTiming=e._resourceTiming,e._resourceTiming=[]),e.fire(new t.Event(\"data\",n))}}))},r.prototype.onAdd=function(t){this.map=t,this.load()},r.prototype.setData=function(e){var r=this;return this._data=e,this.fire(new t.Event(\"dataloading\",{dataType:\"source\"})),this._updateWorkerData((function(e){if(e)r.fire(new t.ErrorEvent(e));else{var n={dataType:\"source\",sourceDataType:\"content\"};r._collectResourceTiming&&r._resourceTiming&&r._resourceTiming.length>0&&(n.resourceTiming=r._resourceTiming,r._resourceTiming=[]),r.fire(new t.Event(\"data\",n))}})),this},r.prototype.getClusterExpansionZoom=function(t,e){return this.actor.send(\"geojson.getClusterExpansionZoom\",{clusterId:t,source:this.id},e),this},r.prototype.getClusterChildren=function(t,e){return this.actor.send(\"geojson.getClusterChildren\",{clusterId:t,source:this.id},e),this},r.prototype.getClusterLeaves=function(t,e,r,n){return this.actor.send(\"geojson.getClusterLeaves\",{source:this.id,clusterId:t,limit:e,offset:r},n),this},r.prototype._updateWorkerData=function(e){var r=this;this._loaded=!1;var n=t.extend({},this.workerOptions),i=this._data;\"string\"==typeof i?(n.request=this.map._requestManager.transformRequest(t.browser.resolveURL(i),t.ResourceType.Source),n.request.collectResourceTiming=this._collectResourceTiming):n.data=JSON.stringify(i),this.actor.send(this.type+\".loadData\",n,(function(t,i){r._removed||i&&i.abandoned||(r._loaded=!0,i&&i.resourceTiming&&i.resourceTiming[r.id]&&(r._resourceTiming=i.resourceTiming[r.id].slice(0)),r.actor.send(r.type+\".coalesce\",{source:n.source},null),e(t))}))},r.prototype.loaded=function(){return this._loaded},r.prototype.loadTile=function(e,r){var n=this,i=e.actor?\"reloadTile\":\"loadTile\";e.actor=this.actor;var a={type:this.type,uid:e.uid,tileID:e.tileID,zoom:e.tileID.overscaledZ,maxZoom:this.maxzoom,tileSize:this.tileSize,source:this.id,pixelRatio:t.browser.devicePixelRatio,showCollisionBoxes:this.map.showCollisionBoxes,promoteId:this.promoteId};e.request=this.actor.send(i,a,(function(t,a){return delete e.request,e.unloadVectorData(),e.aborted?r(null):t?r(t):(e.loadVectorData(a,n.map.painter,\"reloadTile\"===i),r(null))}))},r.prototype.abortTile=function(t){t.request&&(t.request.cancel(),delete t.request),t.aborted=!0},r.prototype.unloadTile=function(t){t.unloadVectorData(),this.actor.send(\"removeTile\",{uid:t.uid,type:this.type,source:this.id})},r.prototype.onRemove=function(){this._removed=!0,this.actor.send(\"removeSource\",{type:this.type,source:this.id})},r.prototype.serialize=function(){return t.extend({},this._options,{type:this.type,data:this._data})},r.prototype.hasTransition=function(){return!1},r}(t.Evented),P=t.createLayout([{name:\"a_pos\",type:\"Int16\",components:2},{name:\"a_texture_pos\",type:\"Int16\",components:2}]),z=function(e){function r(t,r,n,i){e.call(this),this.id=t,this.dispatcher=n,this.coordinates=r.coordinates,this.type=\"image\",this.minzoom=0,this.maxzoom=22,this.tileSize=512,this.tiles={},this._loaded=!1,this.setEventedParent(i),this.options=r}return e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r,r.prototype.load=function(e,r){var n=this;this._loaded=!1,this.fire(new t.Event(\"dataloading\",{dataType:\"source\"})),this.url=this.options.url,t.getImage(this.map._requestManager.transformRequest(this.url,t.ResourceType.Image),(function(i,a){n._loaded=!0,i?n.fire(new t.ErrorEvent(i)):a&&(n.image=a,e&&(n.coordinates=e),r&&r(),n._finishLoading())}))},r.prototype.loaded=function(){return this._loaded},r.prototype.updateImage=function(t){var e=this;return this.image&&t.url?(this.options.url=t.url,this.load(t.coordinates,(function(){e.texture=null})),this):this},r.prototype._finishLoading=function(){this.map&&(this.setCoordinates(this.coordinates),this.fire(new t.Event(\"data\",{dataType:\"source\",sourceDataType:\"metadata\"})))},r.prototype.onAdd=function(t){this.map=t,this.load()},r.prototype.setCoordinates=function(e){var r=this;this.coordinates=e;var n=e.map(t.MercatorCoordinate.fromLngLat);this.tileID=function(e){for(var r=1/0,n=1/0,i=-1/0,a=-1/0,o=0,s=e;or.end(0)?this.fire(new t.ErrorEvent(new t.ValidationError(\"sources.\"+this.id,null,\"Playback for this video can be set only between the \"+r.start(0)+\" and \"+r.end(0)+\"-second mark.\"))):this.video.currentTime=e}},r.prototype.getVideo=function(){return this.video},r.prototype.onAdd=function(t){this.map||(this.map=t,this.load(),this.video&&(this.video.play(),this.setCoordinates(this.coordinates)))},r.prototype.prepare=function(){if(!(0===Object.keys(this.tiles).length||this.video.readyState<2)){var e=this.map.painter.context,r=e.gl;for(var n in this.boundsBuffer||(this.boundsBuffer=e.createVertexBuffer(this._boundsArray,P.members)),this.boundsSegments||(this.boundsSegments=t.SegmentVector.simpleSegment(0,0,4,2)),this.texture?this.video.paused||(this.texture.bind(r.LINEAR,r.CLAMP_TO_EDGE),r.texSubImage2D(r.TEXTURE_2D,0,0,0,r.RGBA,r.UNSIGNED_BYTE,this.video)):(this.texture=new t.Texture(e,this.video,r.RGBA),this.texture.bind(r.LINEAR,r.CLAMP_TO_EDGE)),this.tiles){var i=this.tiles[n];\"loaded\"!==i.state&&(i.state=\"loaded\",i.texture=this.texture)}}},r.prototype.serialize=function(){return{type:\"video\",urls:this.urls,coordinates:this.coordinates}},r.prototype.hasTransition=function(){return this.video&&!this.video.paused},r}(z),D=function(e){function r(r,n,i,a){e.call(this,r,n,i,a),n.coordinates?Array.isArray(n.coordinates)&&4===n.coordinates.length&&!n.coordinates.some((function(t){return!Array.isArray(t)||2!==t.length||t.some((function(t){return\"number\"!=typeof t}))}))||this.fire(new t.ErrorEvent(new t.ValidationError(\"sources.\"+r,null,'\"coordinates\" property must be an array of 4 longitude/latitude array pairs'))):this.fire(new t.ErrorEvent(new t.ValidationError(\"sources.\"+r,null,'missing required property \"coordinates\"'))),n.animate&&\"boolean\"!=typeof n.animate&&this.fire(new t.ErrorEvent(new t.ValidationError(\"sources.\"+r,null,'optional \"animate\" property must be a boolean value'))),n.canvas?\"string\"==typeof n.canvas||n.canvas instanceof t.window.HTMLCanvasElement||this.fire(new t.ErrorEvent(new t.ValidationError(\"sources.\"+r,null,'\"canvas\" must be either a string representing the ID of the canvas element from which to read, or an HTMLCanvasElement instance'))):this.fire(new t.ErrorEvent(new t.ValidationError(\"sources.\"+r,null,'missing required property \"canvas\"'))),this.options=n,this.animate=void 0===n.animate||n.animate}return e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r,r.prototype.load=function(){this._loaded=!0,this.canvas||(this.canvas=this.options.canvas instanceof t.window.HTMLCanvasElement?this.options.canvas:t.window.document.getElementById(this.options.canvas)),this.width=this.canvas.width,this.height=this.canvas.height,this._hasInvalidDimensions()?this.fire(new t.ErrorEvent(new Error(\"Canvas dimensions cannot be less than or equal to zero.\"))):(this.play=function(){this._playing=!0,this.map.triggerRepaint()},this.pause=function(){this._playing&&(this.prepare(),this._playing=!1)},this._finishLoading())},r.prototype.getCanvas=function(){return this.canvas},r.prototype.onAdd=function(t){this.map=t,this.load(),this.canvas&&this.animate&&this.play()},r.prototype.onRemove=function(){this.pause()},r.prototype.prepare=function(){var e=!1;if(this.canvas.width!==this.width&&(this.width=this.canvas.width,e=!0),this.canvas.height!==this.height&&(this.height=this.canvas.height,e=!0),!this._hasInvalidDimensions()&&0!==Object.keys(this.tiles).length){var r=this.map.painter.context,n=r.gl;for(var i in this.boundsBuffer||(this.boundsBuffer=r.createVertexBuffer(this._boundsArray,P.members)),this.boundsSegments||(this.boundsSegments=t.SegmentVector.simpleSegment(0,0,4,2)),this.texture?(e||this._playing)&&this.texture.update(this.canvas,{premultiply:!0}):this.texture=new t.Texture(r,this.canvas,n.RGBA,{premultiply:!0}),this.tiles){var a=this.tiles[i];\"loaded\"!==a.state&&(a.state=\"loaded\",a.texture=this.texture)}}},r.prototype.serialize=function(){return{type:\"canvas\",coordinates:this.coordinates}},r.prototype.hasTransition=function(){return this._playing},r.prototype._hasInvalidDimensions=function(){for(var t=0,e=[this.canvas.width,this.canvas.height];tthis.max){var o=this._getAndRemoveByKey(this.order[0]);o&&this.onRemove(o)}return this},j.prototype.has=function(t){return t.wrapped().key in this.data},j.prototype.getAndRemove=function(t){return this.has(t)?this._getAndRemoveByKey(t.wrapped().key):null},j.prototype._getAndRemoveByKey=function(t){var e=this.data[t].shift();return e.timeout&&clearTimeout(e.timeout),0===this.data[t].length&&delete this.data[t],this.order.splice(this.order.indexOf(t),1),e.value},j.prototype.getByKey=function(t){var e=this.data[t];return e?e[0].value:null},j.prototype.get=function(t){return this.has(t)?this.data[t.wrapped().key][0].value:null},j.prototype.remove=function(t,e){if(!this.has(t))return this;var r=t.wrapped().key,n=void 0===e?0:this.data[r].indexOf(e),i=this.data[r][n];return this.data[r].splice(n,1),i.timeout&&clearTimeout(i.timeout),0===this.data[r].length&&delete this.data[r],this.onRemove(i.value),this.order.splice(this.order.indexOf(r),1),this},j.prototype.setMaxSize=function(t){for(this.max=t;this.order.length>this.max;){var e=this._getAndRemoveByKey(this.order[0]);e&&this.onRemove(e)}return this},j.prototype.filter=function(t){var e=[];for(var r in this.data)for(var n=0,i=this.data[r];n1||(Math.abs(r)>1&&(1===Math.abs(r+i)?r+=i:1===Math.abs(r-i)&&(r-=i)),e.dem&&t.dem&&(t.dem.backfillBorder(e.dem,r,n),t.neighboringTiles&&t.neighboringTiles[a]&&(t.neighboringTiles[a].backfilled=!0)))}},r.prototype.getTile=function(t){return this.getTileByID(t.key)},r.prototype.getTileByID=function(t){return this._tiles[t]},r.prototype._retainLoadedChildren=function(t,e,r,n){for(var i in this._tiles){var a=this._tiles[i];if(!(n[i]||!a.hasData()||a.tileID.overscaledZ<=e||a.tileID.overscaledZ>r)){for(var o=a.tileID;a&&a.tileID.overscaledZ>e+1;){var s=a.tileID.scaledTo(a.tileID.overscaledZ-1);(a=this._tiles[s.key])&&a.hasData()&&(o=s)}for(var l=o;l.overscaledZ>e;)if(t[(l=l.scaledTo(l.overscaledZ-1)).key]){n[o.key]=o;break}}}},r.prototype.findLoadedParent=function(t,e){if(t.key in this._loadedParentTiles){var r=this._loadedParentTiles[t.key];return r&&r.tileID.overscaledZ>=e?r:null}for(var n=t.overscaledZ-1;n>=e;n--){var i=t.scaledTo(n),a=this._getLoadedTile(i);if(a)return a}},r.prototype._getLoadedTile=function(t){var e=this._tiles[t.key];return e&&e.hasData()?e:this._cache.getByKey(t.wrapped().key)},r.prototype.updateCacheSize=function(t){var e=(Math.ceil(t.width/this._source.tileSize)+1)*(Math.ceil(t.height/this._source.tileSize)+1),r=Math.floor(5*e),n=\"number\"==typeof this._maxTileCacheSize?Math.min(this._maxTileCacheSize,r):r;this._cache.setMaxSize(n)},r.prototype.handleWrapJump=function(t){var e=(t-(void 0===this._prevLng?t:this._prevLng))/360,r=Math.round(e);if(this._prevLng=t,r){var n={};for(var i in this._tiles){var a=this._tiles[i];a.tileID=a.tileID.unwrapTo(a.tileID.wrap+r),n[a.tileID.key]=a}for(var o in this._tiles=n,this._timers)clearTimeout(this._timers[o]),delete this._timers[o];for(var s in this._tiles){var l=this._tiles[s];this._setTileReloadTimer(s,l)}}},r.prototype.update=function(e){var n=this;if(this.transform=e,this._sourceLoaded&&!this._paused){var i;this.updateCacheSize(e),this.handleWrapJump(this.transform.center.lng),this._coveredTiles={},this.used?this._source.tileID?i=e.getVisibleUnwrappedCoordinates(this._source.tileID).map((function(e){return new t.OverscaledTileID(e.canonical.z,e.wrap,e.canonical.z,e.canonical.x,e.canonical.y)})):(i=e.coveringTiles({tileSize:this._source.tileSize,minzoom:this._source.minzoom,maxzoom:this._source.maxzoom,roundZoom:this._source.roundZoom,reparseOverscaled:this._source.reparseOverscaled}),this._source.hasTile&&(i=i.filter((function(t){return n._source.hasTile(t)})))):i=[];var a=e.coveringZoomLevel(this._source),o=Math.max(a-r.maxOverzooming,this._source.minzoom),s=Math.max(a+r.maxUnderzooming,this._source.minzoom),l=this._updateRetainedTiles(i,a);if(Ot(this._source.type)){for(var c={},u={},h=0,f=Object.keys(l);hthis._source.maxzoom){var g=d.children(this._source.maxzoom)[0],y=this.getTile(g);if(y&&y.hasData()){n[g.key]=g;continue}}else{var v=d.children(this._source.maxzoom);if(n[v[0].key]&&n[v[1].key]&&n[v[2].key]&&n[v[3].key])continue}for(var x=m.wasRequested(),_=d.overscaledZ-1;_>=a;--_){var b=d.scaledTo(_);if(i[b.key])break;if(i[b.key]=!0,!(m=this.getTile(b))&&x&&(m=this._addTile(b)),m&&(n[b.key]=b,x=m.wasRequested(),m.hasData()))break}}}return n},r.prototype._updateLoadedParentTileCache=function(){for(var t in this._loadedParentTiles={},this._tiles){for(var e=[],r=void 0,n=this._tiles[t].tileID;n.overscaledZ>0;){if(n.key in this._loadedParentTiles){r=this._loadedParentTiles[n.key];break}e.push(n.key);var i=n.scaledTo(n.overscaledZ-1);if(r=this._getLoadedTile(i))break;n=i}for(var a=0,o=e;a0||(e.hasData()&&\"reloading\"!==e.state?this._cache.add(e.tileID,e,e.getExpiryTimeout()):(e.aborted=!0,this._abortTile(e),this._unloadTile(e))))},r.prototype.clearTiles=function(){for(var t in this._shouldReloadOnResume=!1,this._paused=!1,this._tiles)this._removeTile(t);this._cache.reset()},r.prototype.tilesIn=function(e,r,n){var i=this,a=[],o=this.transform;if(!o)return a;for(var s=n?o.getCameraQueryGeometry(e):e,l=e.map((function(t){return o.pointCoordinate(t)})),c=s.map((function(t){return o.pointCoordinate(t)})),u=this.getIds(),h=1/0,f=1/0,p=-1/0,d=-1/0,m=0,g=c;m=0&&y[1].y+g>=0){var v=l.map((function(t){return s.getTilePoint(t)})),x=c.map((function(t){return s.getTilePoint(t)}));a.push({tile:n,tileID:s,queryGeometry:v,cameraQueryGeometry:x,scale:m})}}},x=0;x=t.browser.now())return!0}return!1},r.prototype.setFeatureState=function(t,e,r){t=t||\"_geojsonTileLayer\",this._state.updateState(t,e,r)},r.prototype.removeFeatureState=function(t,e,r){t=t||\"_geojsonTileLayer\",this._state.removeFeatureState(t,e,r)},r.prototype.getFeatureState=function(t,e){return t=t||\"_geojsonTileLayer\",this._state.getState(t,e)},r.prototype.setDependencies=function(t,e,r){var n=this._tiles[t];n&&n.setDependencies(e,r)},r.prototype.reloadTilesForDependencies=function(t,e){for(var r in this._tiles)this._tiles[r].hasDependency(t,e)&&this._reloadTile(r,\"reloading\");this._cache.filter((function(r){return!r.hasDependency(t,e)}))},r}(t.Evented);function zt(t,e){var r=Math.abs(2*t.wrap)-+(t.wrap<0),n=Math.abs(2*e.wrap)-+(e.wrap<0);return t.overscaledZ-e.overscaledZ||n-r||e.canonical.y-t.canonical.y||e.canonical.x-t.canonical.x}function Ot(t){return\"raster\"===t||\"image\"===t||\"video\"===t}function Dt(){return new t.window.Worker(oa.workerUrl)}Pt.maxOverzooming=10,Pt.maxUnderzooming=3;var Rt=\"mapboxgl_preloaded_worker_pool\",Ft=function(){this.active={}};Ft.prototype.acquire=function(t){if(!this.workers)for(this.workers=[];this.workers.length0?(i-o)/s:0;return this.points[a].mult(1-l).add(this.points[r].mult(l))};var Qt=function(t,e,r){var n=this.boxCells=[],i=this.circleCells=[];this.xCellCount=Math.ceil(t/r),this.yCellCount=Math.ceil(e/r);for(var a=0;a=-e[0]&&r<=e[0]&&n>=-e[1]&&n<=e[1]}function ae(e,r,n,i,a,o,s,l){var c=i?e.textSizeData:e.iconSizeData,u=t.evaluateSizeForZoom(c,n.transform.zoom),h=[256/n.width*2+1,256/n.height*2+1],f=i?e.text.dynamicLayoutVertexArray:e.icon.dynamicLayoutVertexArray;f.clear();for(var p=e.lineVertexArray,d=i?e.text.placedSymbolArray:e.icon.placedSymbolArray,m=n.transform.width/n.transform.height,g=!1,y=0;yMath.abs(n.x-r.x)*i?{useVertical:!0}:(e===t.WritingMode.vertical?r.yn.x)?{needsFlipping:!0}:null}function le(e,r,n,i,a,o,s,l,c,u,h,f,p,d){var m,g=r/24,y=e.lineOffsetX*g,v=e.lineOffsetY*g;if(e.numGlyphs>1){var x=e.glyphStartIndex+e.numGlyphs,_=e.lineStartIndex,b=e.lineStartIndex+e.lineLength,w=oe(g,l,y,v,n,h,f,e,c,o,p);if(!w)return{notEnoughRoom:!0};var T=re(w.first.point,s).point,k=re(w.last.point,s).point;if(i&&!n){var A=se(e.writingMode,T,k,d);if(A)return A}m=[w.first];for(var M=e.glyphStartIndex+1;M0?L.point:ce(f,C,S,1,a),P=se(e.writingMode,S,I,d);if(P)return P}var z=ue(g*l.getoffsetX(e.glyphStartIndex),y,v,n,h,f,e.segment,e.lineStartIndex,e.lineStartIndex+e.lineLength,c,o,p);if(!z)return{notEnoughRoom:!0};m=[z]}for(var O=0,D=m;O0?1:-1,m=0;i&&(d*=-1,m=Math.PI),d<0&&(m+=Math.PI);for(var g=d>0?l+s:l+s+1,y=a,v=a,x=0,_=0,b=Math.abs(p),w=[];x+_<=b;){if((g+=d)=c)return null;if(v=y,w.push(y),void 0===(y=f[g])){var T=new t.Point(u.getx(g),u.gety(g)),k=re(T,h);if(k.signedDistanceFromCamera>0)y=f[g]=k.point;else{var A=g-d;y=ce(0===x?o:new t.Point(u.getx(A),u.gety(A)),T,v,b-x+1,h)}}x+=_,_=v.dist(y)}var M=(b-x)/_,S=y.sub(v),E=S.mult(M)._add(v);E._add(S._unit()._perp()._mult(n*d));var C=m+Math.atan2(y.y-v.y,y.x-v.x);return w.push(E),{point:E,angle:C,path:w}}Qt.prototype.keysLength=function(){return this.boxKeys.length+this.circleKeys.length},Qt.prototype.insert=function(t,e,r,n,i){this._forEachCell(e,r,n,i,this._insertBoxCell,this.boxUid++),this.boxKeys.push(t),this.bboxes.push(e),this.bboxes.push(r),this.bboxes.push(n),this.bboxes.push(i)},Qt.prototype.insertCircle=function(t,e,r,n){this._forEachCell(e-n,r-n,e+n,r+n,this._insertCircleCell,this.circleUid++),this.circleKeys.push(t),this.circles.push(e),this.circles.push(r),this.circles.push(n)},Qt.prototype._insertBoxCell=function(t,e,r,n,i,a){this.boxCells[i].push(a)},Qt.prototype._insertCircleCell=function(t,e,r,n,i,a){this.circleCells[i].push(a)},Qt.prototype._query=function(t,e,r,n,i,a){if(r<0||t>this.width||n<0||e>this.height)return!i&&[];var o=[];if(t<=0&&e<=0&&this.width<=r&&this.height<=n){if(i)return!0;for(var s=0;s0:o},Qt.prototype._queryCircle=function(t,e,r,n,i){var a=t-r,o=t+r,s=e-r,l=e+r;if(o<0||a>this.width||l<0||s>this.height)return!n&&[];var c=[],u={hitTest:n,circle:{x:t,y:e,radius:r},seenUids:{box:{},circle:{}}};return this._forEachCell(a,s,o,l,this._queryCellCircle,c,u,i),n?c.length>0:c},Qt.prototype.query=function(t,e,r,n,i){return this._query(t,e,r,n,!1,i)},Qt.prototype.hitTest=function(t,e,r,n,i){return this._query(t,e,r,n,!0,i)},Qt.prototype.hitTestCircle=function(t,e,r,n){return this._queryCircle(t,e,r,!0,n)},Qt.prototype._queryCell=function(t,e,r,n,i,a,o,s){var l=o.seenUids,c=this.boxCells[i];if(null!==c)for(var u=this.bboxes,h=0,f=c;h=u[d+0]&&n>=u[d+1]&&(!s||s(this.boxKeys[p]))){if(o.hitTest)return a.push(!0),!0;a.push({key:this.boxKeys[p],x1:u[d],y1:u[d+1],x2:u[d+2],y2:u[d+3]})}}}var m=this.circleCells[i];if(null!==m)for(var g=this.circles,y=0,v=m;yo*o+s*s},Qt.prototype._circleAndRectCollide=function(t,e,r,n,i,a,o){var s=(a-n)/2,l=Math.abs(t-(n+s));if(l>s+r)return!1;var c=(o-i)/2,u=Math.abs(e-(i+c));if(u>c+r)return!1;if(l<=s||u<=c)return!0;var h=l-s,f=u-c;return h*h+f*f<=r*r};var he=new Float32Array([-1/0,-1/0,0,-1/0,-1/0,0,-1/0,-1/0,0,-1/0,-1/0,0]);function fe(t,e){for(var r=0;r=1;I--)L.push(E.path[I]);for(var P=1;P0){for(var R=L[0].clone(),F=L[0].clone(),B=1;B=A.x&&F.x<=M.x&&R.y>=A.y&&F.y<=M.y?[L]:F.xM.x||F.yM.y?[]:t.clipLine([L],A.x,A.y,M.x,M.y)}for(var N=0,j=D;N=this.screenRightBoundary||nthis.screenBottomBoundary},me.prototype.isInsideGrid=function(t,e,r,n){return r>=0&&t=0&&e0?(this.prevPlacement&&this.prevPlacement.variableOffsets[h.crossTileID]&&this.prevPlacement.placements[h.crossTileID]&&this.prevPlacement.placements[h.crossTileID].text&&(m=this.prevPlacement.variableOffsets[h.crossTileID].anchor),this.variableOffsets[h.crossTileID]={textOffset:g,width:r,height:n,anchor:t,textBoxScale:i,prevAnchor:m},this.markUsedJustification(f,t,h,p),f.allowVerticalPlacement&&(this.markUsedOrientation(f,p,h),this.placedOrientations[h.crossTileID]=p),{shift:y,placedGlyphBoxes:v}):void 0},Ae.prototype.placeLayerBucketPart=function(e,r,n){var i=this,a=e.parameters,o=a.bucket,s=a.layout,l=a.posMatrix,c=a.textLabelPlaneMatrix,u=a.labelToScreenMatrix,h=a.textPixelRatio,f=a.holdingForFade,p=a.collisionBoxArray,d=a.partiallyEvaluatedTextSize,m=a.collisionGroup,g=s.get(\"text-optional\"),y=s.get(\"icon-optional\"),v=s.get(\"text-allow-overlap\"),x=s.get(\"icon-allow-overlap\"),_=\"map\"===s.get(\"text-rotation-alignment\"),b=\"map\"===s.get(\"text-pitch-alignment\"),w=\"none\"!==s.get(\"icon-text-fit\"),T=\"viewport-y\"===s.get(\"symbol-z-order\"),k=v&&(x||!o.hasIconData()||y),A=x&&(v||!o.hasTextData()||g);!o.collisionArrays&&p&&o.deserializeCollisionBoxes(p);var M=function(e,a){if(!r[e.crossTileID])if(f)i.placements[e.crossTileID]=new xe(!1,!1,!1);else{var p,T=!1,M=!1,S=!0,E=null,C={box:null,offscreen:null},L={box:null,offscreen:null},I=null,P=null,z=0,O=0,D=0;a.textFeatureIndex?z=a.textFeatureIndex:e.useRuntimeCollisionCircles&&(z=e.featureIndex),a.verticalTextFeatureIndex&&(O=a.verticalTextFeatureIndex);var R=a.textBox;if(R){var F=function(r){var n=t.WritingMode.horizontal;if(o.allowVerticalPlacement&&!r&&i.prevPlacement){var a=i.prevPlacement.placedOrientations[e.crossTileID];a&&(i.placedOrientations[e.crossTileID]=a,n=a,i.markUsedOrientation(o,n,e))}return n},B=function(r,n){if(o.allowVerticalPlacement&&e.numVerticalGlyphVertices>0&&a.verticalTextBox)for(var i=0,s=o.writingModes;i0&&(N=N.filter((function(t){return t!==j.anchor}))).unshift(j.anchor)}var U=function(t,r,n){for(var a=t.x2-t.x1,s=t.y2-t.y1,c=e.textBoxScale,u=w&&!x?r:null,f={box:[],offscreen:!1},p=v?2*N.length:N.length,d=0;d=N.length,k=i.attemptAnchorPlacement(g,t,a,s,c,_,b,h,l,m,y,e,o,n,u);if(k&&(f=k.placedGlyphBoxes)&&f.box&&f.box.length){T=!0,E=k.shift;break}}return f};B((function(){return U(R,a.iconBox,t.WritingMode.horizontal)}),(function(){var r=a.verticalTextBox,n=C&&C.box&&C.box.length;return o.allowVerticalPlacement&&!n&&e.numVerticalGlyphVertices>0&&r?U(r,a.verticalIconBox,t.WritingMode.vertical):{box:null,offscreen:null}})),C&&(T=C.box,S=C.offscreen);var V=F(C&&C.box);if(!T&&i.prevPlacement){var q=i.prevPlacement.variableOffsets[e.crossTileID];q&&(i.variableOffsets[e.crossTileID]=q,i.markUsedJustification(o,q.anchor,e,V))}}else{var H=function(t,r){var n=i.collisionIndex.placeCollisionBox(t,v,h,l,m.predicate);return n&&n.box&&n.box.length&&(i.markUsedOrientation(o,r,e),i.placedOrientations[e.crossTileID]=r),n};B((function(){return H(R,t.WritingMode.horizontal)}),(function(){var r=a.verticalTextBox;return o.allowVerticalPlacement&&e.numVerticalGlyphVertices>0&&r?H(r,t.WritingMode.vertical):{box:null,offscreen:null}})),F(C&&C.box&&C.box.length)}}if(T=(p=C)&&p.box&&p.box.length>0,S=p&&p.offscreen,e.useRuntimeCollisionCircles){var G=o.text.placedSymbolArray.get(e.centerJustifiedTextSymbolIndex),Z=t.evaluateSizeForFeature(o.textSizeData,d,G),W=s.get(\"text-padding\"),Y=e.collisionCircleDiameter;I=i.collisionIndex.placeCollisionCircles(v,G,o.lineVertexArray,o.glyphOffsetArray,Z,l,c,u,n,b,m.predicate,Y,W),T=v||I.circles.length>0&&!I.collisionDetected,S=S&&I.offscreen}if(a.iconFeatureIndex&&(D=a.iconFeatureIndex),a.iconBox){var X=function(t){var e=w&&E?ke(t,E.x,E.y,_,b,i.transform.angle):t;return i.collisionIndex.placeCollisionBox(e,x,h,l,m.predicate)};M=L&&L.box&&L.box.length&&a.verticalIconBox?(P=X(a.verticalIconBox)).box.length>0:(P=X(a.iconBox)).box.length>0,S=S&&P.offscreen}var $=g||0===e.numHorizontalGlyphVertices&&0===e.numVerticalGlyphVertices,J=y||0===e.numIconVertices;if($||J?J?$||(M=M&&T):T=M&&T:M=T=M&&T,T&&p&&p.box&&(L&&L.box&&O?i.collisionIndex.insertCollisionBox(p.box,s.get(\"text-ignore-placement\"),o.bucketInstanceId,O,m.ID):i.collisionIndex.insertCollisionBox(p.box,s.get(\"text-ignore-placement\"),o.bucketInstanceId,z,m.ID)),M&&P&&i.collisionIndex.insertCollisionBox(P.box,s.get(\"icon-ignore-placement\"),o.bucketInstanceId,D,m.ID),I&&(T&&i.collisionIndex.insertCollisionCircles(I.circles,s.get(\"text-ignore-placement\"),o.bucketInstanceId,z,m.ID),n)){var K=o.bucketInstanceId,Q=i.collisionCircleArrays[K];void 0===Q&&(Q=i.collisionCircleArrays[K]=new _e);for(var tt=0;tt=0;--E){var C=S[E];M(o.symbolInstances.get(C),o.collisionArrays[C])}else for(var L=e.symbolInstanceStart;L=0&&(e.text.placedSymbolArray.get(c).crossTileID=a>=0&&c!==a?0:n.crossTileID)}},Ae.prototype.markUsedOrientation=function(e,r,n){for(var i=r===t.WritingMode.horizontal||r===t.WritingMode.horizontalOnly?r:0,a=r===t.WritingMode.vertical?r:0,o=0,s=[n.leftJustifiedTextSymbolIndex,n.centerJustifiedTextSymbolIndex,n.rightJustifiedTextSymbolIndex];o0||l>0,x=a.numIconVertices>0,_=i.placedOrientations[a.crossTileID],b=_===t.WritingMode.vertical,w=_===t.WritingMode.horizontal||_===t.WritingMode.horizontalOnly;if(v){var T=Oe(y.text),k=b?De:T;d(e.text,s,k);var A=w?De:T;d(e.text,l,A);var M=y.text.isHidden();[a.rightJustifiedTextSymbolIndex,a.centerJustifiedTextSymbolIndex,a.leftJustifiedTextSymbolIndex].forEach((function(t){t>=0&&(e.text.placedSymbolArray.get(t).hidden=M||b?1:0)})),a.verticalPlacedTextSymbolIndex>=0&&(e.text.placedSymbolArray.get(a.verticalPlacedTextSymbolIndex).hidden=M||w?1:0);var S=i.variableOffsets[a.crossTileID];S&&i.markUsedJustification(e,S.anchor,a,_);var E=i.placedOrientations[a.crossTileID];E&&(i.markUsedJustification(e,\"left\",a,E),i.markUsedOrientation(e,E,a))}if(x){var C=Oe(y.icon),L=!(f&&a.verticalPlacedIconSymbolIndex&&b);if(a.placedIconSymbolIndex>=0){var I=L?C:De;d(e.icon,a.numIconVertices,I),e.icon.placedSymbolArray.get(a.placedIconSymbolIndex).hidden=y.icon.isHidden()}if(a.verticalPlacedIconSymbolIndex>=0){var P=L?De:C;d(e.icon,a.numVerticalIconVertices,P),e.icon.placedSymbolArray.get(a.verticalPlacedIconSymbolIndex).hidden=y.icon.isHidden()}}if(e.hasIconCollisionBoxData()||e.hasTextCollisionBoxData()){var z=e.collisionArrays[n];if(z){var O=new t.Point(0,0);if(z.textBox||z.verticalTextBox){var D=!0;if(c){var R=i.variableOffsets[m];R?(O=Te(R.anchor,R.width,R.height,R.textOffset,R.textBoxScale),u&&O._rotate(h?i.transform.angle:-i.transform.angle)):D=!1}z.textBox&&Me(e.textCollisionBox.collisionVertexArray,y.text.placed,!D||b,O.x,O.y),z.verticalTextBox&&Me(e.textCollisionBox.collisionVertexArray,y.text.placed,!D||w,O.x,O.y)}var F=Boolean(!w&&z.verticalIconBox);z.iconBox&&Me(e.iconCollisionBox.collisionVertexArray,y.icon.placed,F,f?O.x:0,f?O.y:0),z.verticalIconBox&&Me(e.iconCollisionBox.collisionVertexArray,y.icon.placed,!F,f?O.x:0,f?O.y:0)}}},g=0;gt},Ae.prototype.setStale=function(){this.stale=!0};var Se=Math.pow(2,25),Ee=Math.pow(2,24),Ce=Math.pow(2,17),Le=Math.pow(2,16),Ie=Math.pow(2,9),Pe=Math.pow(2,8),ze=Math.pow(2,1);function Oe(t){if(0===t.opacity&&!t.placed)return 0;if(1===t.opacity&&t.placed)return 4294967295;var e=t.placed?1:0,r=Math.floor(127*t.opacity);return r*Se+e*Ee+r*Ce+e*Le+r*Ie+e*Pe+r*ze+e}var De=0,Re=function(t){this._sortAcrossTiles=\"viewport-y\"!==t.layout.get(\"symbol-z-order\")&&void 0!==t.layout.get(\"symbol-sort-key\").constantOr(1),this._currentTileIndex=0,this._currentPartIndex=0,this._seenCrossTileIDs={},this._bucketParts=[]};Re.prototype.continuePlacement=function(t,e,r,n,i){for(var a=this._bucketParts;this._currentTileIndex2};this._currentPlacementIndex>=0;){var s=r[e[this._currentPlacementIndex]],l=this.placement.collisionIndex.transform.zoom;if(\"symbol\"===s.type&&(!s.minzoom||s.minzoom<=l)&&(!s.maxzoom||s.maxzoom>l)){if(this._inProgressLayer||(this._inProgressLayer=new Re(s)),this._inProgressLayer.continuePlacement(n[s.source],this.placement,this._showCollisionBoxes,s,o))return;delete this._inProgressLayer}this._currentPlacementIndex--}this._done=!0},Fe.prototype.commit=function(t){return this.placement.commit(t),this.placement};var Be=512/t.EXTENT/2,Ne=function(t,e,r){this.tileID=t,this.indexedSymbolInstances={},this.bucketInstanceId=r;for(var n=0;nt.overscaledZ)for(var s in o){var l=o[s];l.tileID.isChildOf(t)&&l.findMatches(e.symbolInstances,t,i)}else{var c=o[t.scaledTo(Number(a)).key];c&&c.findMatches(e.symbolInstances,t,i)}}for(var u=0;u1?\"@2x\":\"\",l=t.getJSON(r.transformRequest(r.normalizeSpriteURL(e,s,\".json\"),t.ResourceType.SpriteJSON),(function(t,e){l=null,o||(o=t,i=e,u())})),c=t.getImage(r.transformRequest(r.normalizeSpriteURL(e,s,\".png\"),t.ResourceType.SpriteImage),(function(t,e){c=null,o||(o=t,a=e,u())}));function u(){if(o)n(o);else if(i&&a){var e=t.browser.getImageData(a),r={};for(var s in i){var l=i[s],c=l.width,u=l.height,h=l.x,f=l.y,p=l.sdf,d=l.pixelRatio,m=l.stretchX,g=l.stretchY,y=l.content,v=new t.RGBAImage({width:c,height:u});t.RGBAImage.copy(e,v,{x:h,y:f},{x:0,y:0},{width:c,height:u}),r[s]={data:v,pixelRatio:d,sdf:p,stretchX:m,stretchY:g,content:y}}n(null,r)}}return{cancel:function(){l&&(l.cancel(),l=null),c&&(c.cancel(),c=null)}}}(e,this.map._requestManager,(function(e,n){if(r._spriteRequest=null,e)r.fire(new t.ErrorEvent(e));else if(n)for(var i in n)r.imageManager.addImage(i,n[i]);r.imageManager.setLoaded(!0),r._availableImages=r.imageManager.listImages(),r.dispatcher.broadcast(\"setImages\",r._availableImages),r.fire(new t.Event(\"data\",{dataType:\"style\"}))}))},r.prototype._validateLayer=function(e){var r=this.sourceCaches[e.source];if(r){var n=e.sourceLayer;if(n){var i=r.getSource();(\"geojson\"===i.type||i.vectorLayerIds&&-1===i.vectorLayerIds.indexOf(n))&&this.fire(new t.ErrorEvent(new Error('Source layer \"'+n+'\" does not exist on source \"'+i.id+'\" as specified by style layer \"'+e.id+'\"')))}}},r.prototype.loaded=function(){if(!this._loaded)return!1;if(Object.keys(this._updatedSources).length)return!1;for(var t in this.sourceCaches)if(!this.sourceCaches[t].loaded())return!1;return!!this.imageManager.isLoaded()},r.prototype._serializeLayers=function(t){for(var e=[],r=0,n=t;r0)throw new Error(\"Unimplemented: \"+i.map((function(t){return t.command})).join(\", \")+\".\");return n.forEach((function(t){\"setTransition\"!==t.command&&r[t.command].apply(r,t.args)})),this.stylesheet=e,!0},r.prototype.addImage=function(e,r){if(this.getImage(e))return this.fire(new t.ErrorEvent(new Error(\"An image with this name already exists.\")));this.imageManager.addImage(e,r),this._afterImageUpdated(e)},r.prototype.updateImage=function(t,e){this.imageManager.updateImage(t,e)},r.prototype.getImage=function(t){return this.imageManager.getImage(t)},r.prototype.removeImage=function(e){if(!this.getImage(e))return this.fire(new t.ErrorEvent(new Error(\"No image with this name exists.\")));this.imageManager.removeImage(e),this._afterImageUpdated(e)},r.prototype._afterImageUpdated=function(e){this._availableImages=this.imageManager.listImages(),this._changedImages[e]=!0,this._changed=!0,this.dispatcher.broadcast(\"setImages\",this._availableImages),this.fire(new t.Event(\"data\",{dataType:\"style\"}))},r.prototype.listImages=function(){return this._checkLoaded(),this.imageManager.listImages()},r.prototype.addSource=function(e,r,n){var i=this;if(void 0===n&&(n={}),this._checkLoaded(),void 0!==this.sourceCaches[e])throw new Error(\"There is already a source with this ID\");if(!r.type)throw new Error(\"The type property must be defined, but only the following properties were given: \"+Object.keys(r).join(\", \")+\".\");if(!([\"vector\",\"raster\",\"geojson\",\"video\",\"image\"].indexOf(r.type)>=0&&this._validate(t.validateStyle.source,\"sources.\"+e,r,null,n))){this.map&&this.map._collectResourceTiming&&(r.collectResourceTiming=!0);var a=this.sourceCaches[e]=new Pt(e,r,this.dispatcher);a.style=this,a.setEventedParent(this,(function(){return{isSourceLoaded:i.loaded(),source:a.serialize(),sourceId:e}})),a.onAdd(this.map),this._changed=!0}},r.prototype.removeSource=function(e){if(this._checkLoaded(),void 0===this.sourceCaches[e])throw new Error(\"There is no source with this ID\");for(var r in this._layers)if(this._layers[r].source===e)return this.fire(new t.ErrorEvent(new Error('Source \"'+e+'\" cannot be removed while layer \"'+r+'\" is using it.')));var n=this.sourceCaches[e];delete this.sourceCaches[e],delete this._updatedSources[e],n.fire(new t.Event(\"data\",{sourceDataType:\"metadata\",dataType:\"source\",sourceId:e})),n.setEventedParent(null),n.clearTiles(),n.onRemove&&n.onRemove(this.map),this._changed=!0},r.prototype.setGeoJSONSourceData=function(t,e){this._checkLoaded(),this.sourceCaches[t].getSource().setData(e),this._changed=!0},r.prototype.getSource=function(t){return this.sourceCaches[t]&&this.sourceCaches[t].getSource()},r.prototype.addLayer=function(e,r,n){void 0===n&&(n={}),this._checkLoaded();var i=e.id;if(this.getLayer(i))this.fire(new t.ErrorEvent(new Error('Layer with id \"'+i+'\" already exists on this map')));else{var a;if(\"custom\"===e.type){if(qe(this,t.validateCustomStyleLayer(e)))return;a=t.createStyleLayer(e)}else{if(\"object\"==typeof e.source&&(this.addSource(i,e.source),e=t.clone$1(e),e=t.extend(e,{source:i})),this._validate(t.validateStyle.layer,\"layers.\"+i,e,{arrayIndex:-1},n))return;a=t.createStyleLayer(e),this._validateLayer(a),a.setEventedParent(this,{layer:{id:i}}),this._serializedLayers[a.id]=a.serialize()}var o=r?this._order.indexOf(r):this._order.length;if(r&&-1===o)this.fire(new t.ErrorEvent(new Error('Layer with id \"'+r+'\" does not exist on this map.')));else{if(this._order.splice(o,0,i),this._layerOrderChanged=!0,this._layers[i]=a,this._removedLayers[i]&&a.source&&\"custom\"!==a.type){var s=this._removedLayers[i];delete this._removedLayers[i],s.type!==a.type?this._updatedSources[a.source]=\"clear\":(this._updatedSources[a.source]=\"reload\",this.sourceCaches[a.source].pause())}this._updateLayer(a),a.onAdd&&a.onAdd(this.map)}}},r.prototype.moveLayer=function(e,r){if(this._checkLoaded(),this._changed=!0,this._layers[e]){if(e!==r){var n=this._order.indexOf(e);this._order.splice(n,1);var i=r?this._order.indexOf(r):this._order.length;r&&-1===i?this.fire(new t.ErrorEvent(new Error('Layer with id \"'+r+'\" does not exist on this map.'))):(this._order.splice(i,0,e),this._layerOrderChanged=!0)}}else this.fire(new t.ErrorEvent(new Error(\"The layer '\"+e+\"' does not exist in the map's style and cannot be moved.\")))},r.prototype.removeLayer=function(e){this._checkLoaded();var r=this._layers[e];if(r){r.setEventedParent(null);var n=this._order.indexOf(e);this._order.splice(n,1),this._layerOrderChanged=!0,this._changed=!0,this._removedLayers[e]=r,delete this._layers[e],delete this._serializedLayers[e],delete this._updatedLayers[e],delete this._updatedPaintProps[e],r.onRemove&&r.onRemove(this.map)}else this.fire(new t.ErrorEvent(new Error(\"The layer '\"+e+\"' does not exist in the map's style and cannot be removed.\")))},r.prototype.getLayer=function(t){return this._layers[t]},r.prototype.hasLayer=function(t){return t in this._layers},r.prototype.setLayerZoomRange=function(e,r,n){this._checkLoaded();var i=this.getLayer(e);i?i.minzoom===r&&i.maxzoom===n||(null!=r&&(i.minzoom=r),null!=n&&(i.maxzoom=n),this._updateLayer(i)):this.fire(new t.ErrorEvent(new Error(\"The layer '\"+e+\"' does not exist in the map's style and cannot have zoom extent.\")))},r.prototype.setFilter=function(e,r,n){void 0===n&&(n={}),this._checkLoaded();var i=this.getLayer(e);if(i){if(!t.deepEqual(i.filter,r))return null==r?(i.filter=void 0,void this._updateLayer(i)):void(this._validate(t.validateStyle.filter,\"layers.\"+i.id+\".filter\",r,null,n)||(i.filter=t.clone$1(r),this._updateLayer(i)))}else this.fire(new t.ErrorEvent(new Error(\"The layer '\"+e+\"' does not exist in the map's style and cannot be filtered.\")))},r.prototype.getFilter=function(e){return t.clone$1(this.getLayer(e).filter)},r.prototype.setLayoutProperty=function(e,r,n,i){void 0===i&&(i={}),this._checkLoaded();var a=this.getLayer(e);a?t.deepEqual(a.getLayoutProperty(r),n)||(a.setLayoutProperty(r,n,i),this._updateLayer(a)):this.fire(new t.ErrorEvent(new Error(\"The layer '\"+e+\"' does not exist in the map's style and cannot be styled.\")))},r.prototype.getLayoutProperty=function(e,r){var n=this.getLayer(e);if(n)return n.getLayoutProperty(r);this.fire(new t.ErrorEvent(new Error(\"The layer '\"+e+\"' does not exist in the map's style.\")))},r.prototype.setPaintProperty=function(e,r,n,i){void 0===i&&(i={}),this._checkLoaded();var a=this.getLayer(e);a?t.deepEqual(a.getPaintProperty(r),n)||(a.setPaintProperty(r,n,i)&&this._updateLayer(a),this._changed=!0,this._updatedPaintProps[e]=!0):this.fire(new t.ErrorEvent(new Error(\"The layer '\"+e+\"' does not exist in the map's style and cannot be styled.\")))},r.prototype.getPaintProperty=function(t,e){return this.getLayer(t).getPaintProperty(e)},r.prototype.setFeatureState=function(e,r){this._checkLoaded();var n=e.source,i=e.sourceLayer,a=this.sourceCaches[n];if(void 0!==a){var o=a.getSource().type;\"geojson\"===o&&i?this.fire(new t.ErrorEvent(new Error(\"GeoJSON sources cannot have a sourceLayer parameter.\"))):\"vector\"!==o||i?(void 0===e.id&&this.fire(new t.ErrorEvent(new Error(\"The feature id parameter must be provided.\"))),a.setFeatureState(i,e.id,r)):this.fire(new t.ErrorEvent(new Error(\"The sourceLayer parameter must be provided for vector source types.\")))}else this.fire(new t.ErrorEvent(new Error(\"The source '\"+n+\"' does not exist in the map's style.\")))},r.prototype.removeFeatureState=function(e,r){this._checkLoaded();var n=e.source,i=this.sourceCaches[n];if(void 0!==i){var a=i.getSource().type,o=\"vector\"===a?e.sourceLayer:void 0;\"vector\"!==a||o?r&&\"string\"!=typeof e.id&&\"number\"!=typeof e.id?this.fire(new t.ErrorEvent(new Error(\"A feature id is required to remove its specific state property.\"))):i.removeFeatureState(o,e.id,r):this.fire(new t.ErrorEvent(new Error(\"The sourceLayer parameter must be provided for vector source types.\")))}else this.fire(new t.ErrorEvent(new Error(\"The source '\"+n+\"' does not exist in the map's style.\")))},r.prototype.getFeatureState=function(e){this._checkLoaded();var r=e.source,n=e.sourceLayer,i=this.sourceCaches[r];if(void 0!==i){if(\"vector\"!==i.getSource().type||n)return void 0===e.id&&this.fire(new t.ErrorEvent(new Error(\"The feature id parameter must be provided.\"))),i.getFeatureState(n,e.id);this.fire(new t.ErrorEvent(new Error(\"The sourceLayer parameter must be provided for vector source types.\")))}else this.fire(new t.ErrorEvent(new Error(\"The source '\"+r+\"' does not exist in the map's style.\")))},r.prototype.getTransition=function(){return t.extend({duration:300,delay:0},this.stylesheet&&this.stylesheet.transition)},r.prototype.serialize=function(){return t.filterObject({version:this.stylesheet.version,name:this.stylesheet.name,metadata:this.stylesheet.metadata,light:this.stylesheet.light,center:this.stylesheet.center,zoom:this.stylesheet.zoom,bearing:this.stylesheet.bearing,pitch:this.stylesheet.pitch,sprite:this.stylesheet.sprite,glyphs:this.stylesheet.glyphs,transition:this.stylesheet.transition,sources:t.mapObject(this.sourceCaches,(function(t){return t.serialize()})),layers:this._serializeLayers(this._order)},(function(t){return void 0!==t}))},r.prototype._updateLayer=function(t){this._updatedLayers[t.id]=!0,t.source&&!this._updatedSources[t.source]&&\"raster\"!==this.sourceCaches[t.source].getSource().type&&(this._updatedSources[t.source]=\"reload\",this.sourceCaches[t.source].pause()),this._changed=!0},r.prototype._flattenAndSortRenderedFeatures=function(t){for(var e=this,r=function(t){return\"fill-extrusion\"===e._layers[t].type},n={},i=[],a=this._order.length-1;a>=0;a--){var o=this._order[a];if(r(o)){n[o]=a;for(var s=0,l=t;s=0;d--){var m=this._order[d];if(r(m))for(var g=i.length-1;g>=0;g--){var y=i[g].feature;if(n[y.layer.id] 0.5) {gl_FragColor=vec4(0.0,0.0,1.0,0.5)*alpha;}if (v_notUsed > 0.5) {gl_FragColor*=.1;}}\",\"attribute vec2 a_pos;attribute vec2 a_anchor_pos;attribute vec2 a_extrude;attribute vec2 a_placed;attribute vec2 a_shift;uniform mat4 u_matrix;uniform vec2 u_extrude_scale;uniform float u_camera_to_center_distance;varying float v_placed;varying float v_notUsed;void main() {vec4 projectedPoint=u_matrix*vec4(a_anchor_pos,0,1);highp float camera_to_anchor_distance=projectedPoint.w;highp float collision_perspective_ratio=clamp(0.5+0.5*(u_camera_to_center_distance/camera_to_anchor_distance),0.0,4.0);gl_Position=u_matrix*vec4(a_pos,0.0,1.0);gl_Position.xy+=(a_extrude+a_shift)*u_extrude_scale*gl_Position.w*collision_perspective_ratio;v_placed=a_placed.x;v_notUsed=a_placed.y;}\"),nr=br(\"varying float v_radius;varying vec2 v_extrude;varying float v_perspective_ratio;varying float v_collision;void main() {float alpha=0.5*min(v_perspective_ratio,1.0);float stroke_radius=0.9*max(v_perspective_ratio,1.0);float distance_to_center=length(v_extrude);float distance_to_edge=abs(distance_to_center-v_radius);float opacity_t=smoothstep(-stroke_radius,0.0,-distance_to_edge);vec4 color=mix(vec4(0.0,0.0,1.0,0.5),vec4(1.0,0.0,0.0,1.0),v_collision);gl_FragColor=color*alpha*opacity_t;}\",\"attribute vec2 a_pos;attribute float a_radius;attribute vec2 a_flags;uniform mat4 u_matrix;uniform mat4 u_inv_matrix;uniform vec2 u_viewport_size;uniform float u_camera_to_center_distance;varying float v_radius;varying vec2 v_extrude;varying float v_perspective_ratio;varying float v_collision;vec3 toTilePosition(vec2 screenPos) {vec4 rayStart=u_inv_matrix*vec4(screenPos,-1.0,1.0);vec4 rayEnd =u_inv_matrix*vec4(screenPos, 1.0,1.0);rayStart.xyz/=rayStart.w;rayEnd.xyz /=rayEnd.w;highp float t=(0.0-rayStart.z)/(rayEnd.z-rayStart.z);return mix(rayStart.xyz,rayEnd.xyz,t);}void main() {vec2 quadCenterPos=a_pos;float radius=a_radius;float collision=a_flags.x;float vertexIdx=a_flags.y;vec2 quadVertexOffset=vec2(mix(-1.0,1.0,float(vertexIdx >=2.0)),mix(-1.0,1.0,float(vertexIdx >=1.0 && vertexIdx <=2.0)));vec2 quadVertexExtent=quadVertexOffset*radius;vec3 tilePos=toTilePosition(quadCenterPos);vec4 clipPos=u_matrix*vec4(tilePos,1.0);highp float camera_to_anchor_distance=clipPos.w;highp float collision_perspective_ratio=clamp(0.5+0.5*(u_camera_to_center_distance/camera_to_anchor_distance),0.0,4.0);float padding_factor=1.2;v_radius=radius;v_extrude=quadVertexExtent*padding_factor;v_perspective_ratio=collision_perspective_ratio;v_collision=collision;gl_Position=vec4(clipPos.xyz/clipPos.w,1.0)+vec4(quadVertexExtent*padding_factor/u_viewport_size*2.0,0.0,0.0);}\"),ir=br(\"uniform highp vec4 u_color;uniform sampler2D u_overlay;varying vec2 v_uv;void main() {vec4 overlay_color=texture2D(u_overlay,v_uv);gl_FragColor=mix(u_color,overlay_color,overlay_color.a);}\",\"attribute vec2 a_pos;varying vec2 v_uv;uniform mat4 u_matrix;uniform float u_overlay_scale;void main() {v_uv=a_pos/8192.0;gl_Position=u_matrix*vec4(a_pos*u_overlay_scale,0,1);}\"),ar=br(\"#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize lowp float opacity\\ngl_FragColor=color*opacity;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"attribute vec2 a_pos;uniform mat4 u_matrix;\\n#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize lowp float opacity\\ngl_Position=u_matrix*vec4(a_pos,0,1);}\"),or=br(\"varying vec2 v_pos;\\n#pragma mapbox: define highp vec4 outline_color\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 outline_color\\n#pragma mapbox: initialize lowp float opacity\\nfloat dist=length(v_pos-gl_FragCoord.xy);float alpha=1.0-smoothstep(0.0,1.0,dist);gl_FragColor=outline_color*(alpha*opacity);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"attribute vec2 a_pos;uniform mat4 u_matrix;uniform vec2 u_world;varying vec2 v_pos;\\n#pragma mapbox: define highp vec4 outline_color\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 outline_color\\n#pragma mapbox: initialize lowp float opacity\\ngl_Position=u_matrix*vec4(a_pos,0,1);v_pos=(gl_Position.xy/gl_Position.w+1.0)/2.0*u_world;}\"),sr=br(\"uniform vec2 u_texsize;uniform sampler2D u_image;uniform float u_fade;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec2 v_pos;\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp vec4 pattern_from\\n#pragma mapbox: define lowp vec4 pattern_to\\nvoid main() {\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump vec4 pattern_from\\n#pragma mapbox: initialize mediump vec4 pattern_to\\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(pattern_tl_a/u_texsize,pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(pattern_tl_b/u_texsize,pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);float dist=length(v_pos-gl_FragCoord.xy);float alpha=1.0-smoothstep(0.0,1.0,dist);gl_FragColor=mix(color1,color2,u_fade)*alpha*opacity;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"uniform mat4 u_matrix;uniform vec2 u_world;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform vec3 u_scale;attribute vec2 a_pos;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec2 v_pos;\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp vec4 pattern_from\\n#pragma mapbox: define lowp vec4 pattern_to\\n#pragma mapbox: define lowp float pixel_ratio_from\\n#pragma mapbox: define lowp float pixel_ratio_to\\nvoid main() {\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump vec4 pattern_from\\n#pragma mapbox: initialize mediump vec4 pattern_to\\n#pragma mapbox: initialize lowp float pixel_ratio_from\\n#pragma mapbox: initialize lowp float pixel_ratio_to\\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;gl_Position=u_matrix*vec4(a_pos,0,1);vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,fromScale*display_size_a,tileRatio,a_pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,toScale*display_size_b,tileRatio,a_pos);v_pos=(gl_Position.xy/gl_Position.w+1.0)/2.0*u_world;}\"),lr=br(\"uniform vec2 u_texsize;uniform float u_fade;uniform sampler2D u_image;varying vec2 v_pos_a;varying vec2 v_pos_b;\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp vec4 pattern_from\\n#pragma mapbox: define lowp vec4 pattern_to\\nvoid main() {\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump vec4 pattern_from\\n#pragma mapbox: initialize mediump vec4 pattern_to\\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(pattern_tl_a/u_texsize,pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(pattern_tl_b/u_texsize,pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);gl_FragColor=mix(color1,color2,u_fade)*opacity;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"uniform mat4 u_matrix;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform vec3 u_scale;attribute vec2 a_pos;varying vec2 v_pos_a;varying vec2 v_pos_b;\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp vec4 pattern_from\\n#pragma mapbox: define lowp vec4 pattern_to\\n#pragma mapbox: define lowp float pixel_ratio_from\\n#pragma mapbox: define lowp float pixel_ratio_to\\nvoid main() {\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump vec4 pattern_from\\n#pragma mapbox: initialize mediump vec4 pattern_to\\n#pragma mapbox: initialize lowp float pixel_ratio_from\\n#pragma mapbox: initialize lowp float pixel_ratio_to\\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileZoomRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;gl_Position=u_matrix*vec4(a_pos,0,1);v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,fromScale*display_size_a,tileZoomRatio,a_pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,toScale*display_size_b,tileZoomRatio,a_pos);}\"),cr=br(\"varying vec4 v_color;void main() {gl_FragColor=v_color;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"uniform mat4 u_matrix;uniform vec3 u_lightcolor;uniform lowp vec3 u_lightpos;uniform lowp float u_lightintensity;uniform float u_vertical_gradient;uniform lowp float u_opacity;attribute vec2 a_pos;attribute vec4 a_normal_ed;varying vec4 v_color;\\n#pragma mapbox: define highp float base\\n#pragma mapbox: define highp float height\\n#pragma mapbox: define highp vec4 color\\nvoid main() {\\n#pragma mapbox: initialize highp float base\\n#pragma mapbox: initialize highp float height\\n#pragma mapbox: initialize highp vec4 color\\nvec3 normal=a_normal_ed.xyz;base=max(0.0,base);height=max(0.0,height);float t=mod(normal.x,2.0);gl_Position=u_matrix*vec4(a_pos,t > 0.0 ? height : base,1);float colorvalue=color.r*0.2126+color.g*0.7152+color.b*0.0722;v_color=vec4(0.0,0.0,0.0,1.0);vec4 ambientlight=vec4(0.03,0.03,0.03,1.0);color+=ambientlight;float directional=clamp(dot(normal/16384.0,u_lightpos),0.0,1.0);directional=mix((1.0-u_lightintensity),max((1.0-colorvalue+u_lightintensity),1.0),directional);if (normal.y !=0.0) {directional*=((1.0-u_vertical_gradient)+(u_vertical_gradient*clamp((t+base)*pow(height/150.0,0.5),mix(0.7,0.98,1.0-u_lightintensity),1.0)));}v_color.r+=clamp(color.r*directional*u_lightcolor.r,mix(0.0,0.3,1.0-u_lightcolor.r),1.0);v_color.g+=clamp(color.g*directional*u_lightcolor.g,mix(0.0,0.3,1.0-u_lightcolor.g),1.0);v_color.b+=clamp(color.b*directional*u_lightcolor.b,mix(0.0,0.3,1.0-u_lightcolor.b),1.0);v_color*=u_opacity;}\"),ur=br(\"uniform vec2 u_texsize;uniform float u_fade;uniform sampler2D u_image;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec4 v_lighting;\\n#pragma mapbox: define lowp float base\\n#pragma mapbox: define lowp float height\\n#pragma mapbox: define lowp vec4 pattern_from\\n#pragma mapbox: define lowp vec4 pattern_to\\n#pragma mapbox: define lowp float pixel_ratio_from\\n#pragma mapbox: define lowp float pixel_ratio_to\\nvoid main() {\\n#pragma mapbox: initialize lowp float base\\n#pragma mapbox: initialize lowp float height\\n#pragma mapbox: initialize mediump vec4 pattern_from\\n#pragma mapbox: initialize mediump vec4 pattern_to\\n#pragma mapbox: initialize lowp float pixel_ratio_from\\n#pragma mapbox: initialize lowp float pixel_ratio_to\\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(pattern_tl_a/u_texsize,pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(pattern_tl_b/u_texsize,pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);vec4 mixedColor=mix(color1,color2,u_fade);gl_FragColor=mixedColor*v_lighting;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"uniform mat4 u_matrix;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform float u_height_factor;uniform vec3 u_scale;uniform float u_vertical_gradient;uniform lowp float u_opacity;uniform vec3 u_lightcolor;uniform lowp vec3 u_lightpos;uniform lowp float u_lightintensity;attribute vec2 a_pos;attribute vec4 a_normal_ed;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec4 v_lighting;\\n#pragma mapbox: define lowp float base\\n#pragma mapbox: define lowp float height\\n#pragma mapbox: define lowp vec4 pattern_from\\n#pragma mapbox: define lowp vec4 pattern_to\\n#pragma mapbox: define lowp float pixel_ratio_from\\n#pragma mapbox: define lowp float pixel_ratio_to\\nvoid main() {\\n#pragma mapbox: initialize lowp float base\\n#pragma mapbox: initialize lowp float height\\n#pragma mapbox: initialize mediump vec4 pattern_from\\n#pragma mapbox: initialize mediump vec4 pattern_to\\n#pragma mapbox: initialize lowp float pixel_ratio_from\\n#pragma mapbox: initialize lowp float pixel_ratio_to\\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;vec3 normal=a_normal_ed.xyz;float edgedistance=a_normal_ed.w;vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;base=max(0.0,base);height=max(0.0,height);float t=mod(normal.x,2.0);float z=t > 0.0 ? height : base;gl_Position=u_matrix*vec4(a_pos,z,1);vec2 pos=normal.x==1.0 && normal.y==0.0 && normal.z==16384.0\\n? a_pos\\n: vec2(edgedistance,z*u_height_factor);v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,fromScale*display_size_a,tileRatio,pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,toScale*display_size_b,tileRatio,pos);v_lighting=vec4(0.0,0.0,0.0,1.0);float directional=clamp(dot(normal/16383.0,u_lightpos),0.0,1.0);directional=mix((1.0-u_lightintensity),max((0.5+u_lightintensity),1.0),directional);if (normal.y !=0.0) {directional*=((1.0-u_vertical_gradient)+(u_vertical_gradient*clamp((t+base)*pow(height/150.0,0.5),mix(0.7,0.98,1.0-u_lightintensity),1.0)));}v_lighting.rgb+=clamp(directional*u_lightcolor,mix(vec3(0.0),vec3(0.3),1.0-u_lightcolor),vec3(1.0));v_lighting*=u_opacity;}\"),hr=br(\"#ifdef GL_ES\\nprecision highp float;\\n#endif\\nuniform sampler2D u_image;varying vec2 v_pos;uniform vec2 u_dimension;uniform float u_zoom;uniform vec4 u_unpack;float getElevation(vec2 coord,float bias) {vec4 data=texture2D(u_image,coord)*255.0;data.a=-1.0;return dot(data,u_unpack)/4.0;}void main() {vec2 epsilon=1.0/u_dimension;float a=getElevation(v_pos+vec2(-epsilon.x,-epsilon.y),0.0);float b=getElevation(v_pos+vec2(0,-epsilon.y),0.0);float c=getElevation(v_pos+vec2(epsilon.x,-epsilon.y),0.0);float d=getElevation(v_pos+vec2(-epsilon.x,0),0.0);float e=getElevation(v_pos,0.0);float f=getElevation(v_pos+vec2(epsilon.x,0),0.0);float g=getElevation(v_pos+vec2(-epsilon.x,epsilon.y),0.0);float h=getElevation(v_pos+vec2(0,epsilon.y),0.0);float i=getElevation(v_pos+vec2(epsilon.x,epsilon.y),0.0);float exaggerationFactor=u_zoom < 2.0 ? 0.4 : u_zoom < 4.5 ? 0.35 : 0.3;float exaggeration=u_zoom < 15.0 ? (u_zoom-15.0)*exaggerationFactor : 0.0;vec2 deriv=vec2((c+f+f+i)-(a+d+d+g),(g+h+h+i)-(a+b+b+c))/pow(2.0,exaggeration+(19.2562-u_zoom));gl_FragColor=clamp(vec4(deriv.x/2.0+0.5,deriv.y/2.0+0.5,1.0,1.0),0.0,1.0);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"uniform mat4 u_matrix;uniform vec2 u_dimension;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying vec2 v_pos;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);highp vec2 epsilon=1.0/u_dimension;float scale=(u_dimension.x-2.0)/u_dimension.x;v_pos=(a_texture_pos/8192.0)*scale+epsilon;}\"),fr=br(\"uniform sampler2D u_image;varying vec2 v_pos;uniform vec2 u_latrange;uniform vec2 u_light;uniform vec4 u_shadow;uniform vec4 u_highlight;uniform vec4 u_accent;\\n#define PI 3.141592653589793\\nvoid main() {vec4 pixel=texture2D(u_image,v_pos);vec2 deriv=((pixel.rg*2.0)-1.0);float scaleFactor=cos(radians((u_latrange[0]-u_latrange[1])*(1.0-v_pos.y)+u_latrange[1]));float slope=atan(1.25*length(deriv)/scaleFactor);float aspect=deriv.x !=0.0 ? atan(deriv.y,-deriv.x) : PI/2.0*(deriv.y > 0.0 ? 1.0 :-1.0);float intensity=u_light.x;float azimuth=u_light.y+PI;float base=1.875-intensity*1.75;float maxValue=0.5*PI;float scaledSlope=intensity !=0.5 ? ((pow(base,slope)-1.0)/(pow(base,maxValue)-1.0))*maxValue : slope;float accent=cos(scaledSlope);vec4 accent_color=(1.0-accent)*u_accent*clamp(intensity*2.0,0.0,1.0);float shade=abs(mod((aspect+azimuth)/PI+0.5,2.0)-1.0);vec4 shade_color=mix(u_shadow,u_highlight,shade)*sin(scaledSlope)*clamp(intensity*2.0,0.0,1.0);gl_FragColor=accent_color*(1.0-shade_color.a)+shade_color;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"uniform mat4 u_matrix;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying vec2 v_pos;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);v_pos=a_texture_pos/8192.0;}\"),pr=br(\"uniform lowp float u_device_pixel_ratio;varying vec2 v_width2;varying vec2 v_normal;varying float v_gamma_scale;\\n#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\nfloat dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);gl_FragColor=color*(alpha*opacity);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"\\n#define scale 0.015873016\\nattribute vec2 a_pos_normal;attribute vec4 a_data;uniform mat4 u_matrix;uniform mediump float u_ratio;uniform vec2 u_units_to_pixels;uniform lowp float u_device_pixel_ratio;varying vec2 v_normal;varying vec2 v_width2;varying float v_gamma_scale;varying highp float v_linesofar;\\n#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define mediump float gapwidth\\n#pragma mapbox: define lowp float offset\\n#pragma mapbox: define mediump float width\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump float gapwidth\\n#pragma mapbox: initialize lowp float offset\\n#pragma mapbox: initialize mediump float width\\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;v_linesofar=(floor(a_data.z/4.0)+a_data.w*64.0)*2.0;vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;float extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;v_width2=vec2(outset,inset);}\"),dr=br(\"uniform lowp float u_device_pixel_ratio;uniform sampler2D u_image;varying vec2 v_width2;varying vec2 v_normal;varying float v_gamma_scale;varying highp vec2 v_uv;\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\nfloat dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);vec4 color=texture2D(u_image,v_uv);gl_FragColor=color*(alpha*opacity);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"\\n#define scale 0.015873016\\nattribute vec2 a_pos_normal;attribute vec4 a_data;attribute float a_uv_x;attribute float a_split_index;uniform mat4 u_matrix;uniform mediump float u_ratio;uniform lowp float u_device_pixel_ratio;uniform vec2 u_units_to_pixels;uniform float u_image_height;varying vec2 v_normal;varying vec2 v_width2;varying float v_gamma_scale;varying highp vec2 v_uv;\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define mediump float gapwidth\\n#pragma mapbox: define lowp float offset\\n#pragma mapbox: define mediump float width\\nvoid main() {\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump float gapwidth\\n#pragma mapbox: initialize lowp float offset\\n#pragma mapbox: initialize mediump float width\\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;highp float texel_height=1.0/u_image_height;highp float half_texel_height=0.5*texel_height;v_uv=vec2(a_uv_x,a_split_index*texel_height-half_texel_height);vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;float extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;v_width2=vec2(outset,inset);}\"),mr=br(\"uniform lowp float u_device_pixel_ratio;uniform vec2 u_texsize;uniform float u_fade;uniform mediump vec3 u_scale;uniform sampler2D u_image;varying vec2 v_normal;varying vec2 v_width2;varying float v_linesofar;varying float v_gamma_scale;varying float v_width;\\n#pragma mapbox: define lowp vec4 pattern_from\\n#pragma mapbox: define lowp vec4 pattern_to\\n#pragma mapbox: define lowp float pixel_ratio_from\\n#pragma mapbox: define lowp float pixel_ratio_to\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize mediump vec4 pattern_from\\n#pragma mapbox: initialize mediump vec4 pattern_to\\n#pragma mapbox: initialize lowp float pixel_ratio_from\\n#pragma mapbox: initialize lowp float pixel_ratio_to\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileZoomRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;vec2 pattern_size_a=vec2(display_size_a.x*fromScale/tileZoomRatio,display_size_a.y);vec2 pattern_size_b=vec2(display_size_b.x*toScale/tileZoomRatio,display_size_b.y);float aspect_a=display_size_a.y/v_width;float aspect_b=display_size_b.y/v_width;float dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);float x_a=mod(v_linesofar/pattern_size_a.x*aspect_a,1.0);float x_b=mod(v_linesofar/pattern_size_b.x*aspect_b,1.0);float y=0.5*v_normal.y+0.5;vec2 texel_size=1.0/u_texsize;vec2 pos_a=mix(pattern_tl_a*texel_size-texel_size,pattern_br_a*texel_size+texel_size,vec2(x_a,y));vec2 pos_b=mix(pattern_tl_b*texel_size-texel_size,pattern_br_b*texel_size+texel_size,vec2(x_b,y));vec4 color=mix(texture2D(u_image,pos_a),texture2D(u_image,pos_b),u_fade);gl_FragColor=color*alpha*opacity;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"\\n#define scale 0.015873016\\n#define LINE_DISTANCE_SCALE 2.0\\nattribute vec2 a_pos_normal;attribute vec4 a_data;uniform mat4 u_matrix;uniform vec2 u_units_to_pixels;uniform mediump float u_ratio;uniform lowp float u_device_pixel_ratio;varying vec2 v_normal;varying vec2 v_width2;varying float v_linesofar;varying float v_gamma_scale;varying float v_width;\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp float offset\\n#pragma mapbox: define mediump float gapwidth\\n#pragma mapbox: define mediump float width\\n#pragma mapbox: define lowp float floorwidth\\n#pragma mapbox: define lowp vec4 pattern_from\\n#pragma mapbox: define lowp vec4 pattern_to\\n#pragma mapbox: define lowp float pixel_ratio_from\\n#pragma mapbox: define lowp float pixel_ratio_to\\nvoid main() {\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize lowp float offset\\n#pragma mapbox: initialize mediump float gapwidth\\n#pragma mapbox: initialize mediump float width\\n#pragma mapbox: initialize lowp float floorwidth\\n#pragma mapbox: initialize mediump vec4 pattern_from\\n#pragma mapbox: initialize mediump vec4 pattern_to\\n#pragma mapbox: initialize lowp float pixel_ratio_from\\n#pragma mapbox: initialize lowp float pixel_ratio_to\\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;float a_linesofar=(floor(a_data.z/4.0)+a_data.w*64.0)*LINE_DISTANCE_SCALE;vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;float extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;v_linesofar=a_linesofar;v_width2=vec2(outset,inset);v_width=floorwidth;}\"),gr=br(\"uniform lowp float u_device_pixel_ratio;uniform sampler2D u_image;uniform float u_sdfgamma;uniform float u_mix;varying vec2 v_normal;varying vec2 v_width2;varying vec2 v_tex_a;varying vec2 v_tex_b;varying float v_gamma_scale;\\n#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define mediump float width\\n#pragma mapbox: define lowp float floorwidth\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump float width\\n#pragma mapbox: initialize lowp float floorwidth\\nfloat dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);float sdfdist_a=texture2D(u_image,v_tex_a).a;float sdfdist_b=texture2D(u_image,v_tex_b).a;float sdfdist=mix(sdfdist_a,sdfdist_b,u_mix);alpha*=smoothstep(0.5-u_sdfgamma/floorwidth,0.5+u_sdfgamma/floorwidth,sdfdist);gl_FragColor=color*(alpha*opacity);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"\\n#define scale 0.015873016\\n#define LINE_DISTANCE_SCALE 2.0\\nattribute vec2 a_pos_normal;attribute vec4 a_data;uniform mat4 u_matrix;uniform mediump float u_ratio;uniform lowp float u_device_pixel_ratio;uniform vec2 u_patternscale_a;uniform float u_tex_y_a;uniform vec2 u_patternscale_b;uniform float u_tex_y_b;uniform vec2 u_units_to_pixels;varying vec2 v_normal;varying vec2 v_width2;varying vec2 v_tex_a;varying vec2 v_tex_b;varying float v_gamma_scale;\\n#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define mediump float gapwidth\\n#pragma mapbox: define lowp float offset\\n#pragma mapbox: define mediump float width\\n#pragma mapbox: define lowp float floorwidth\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump float gapwidth\\n#pragma mapbox: initialize lowp float offset\\n#pragma mapbox: initialize mediump float width\\n#pragma mapbox: initialize lowp float floorwidth\\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;float a_linesofar=(floor(a_data.z/4.0)+a_data.w*64.0)*LINE_DISTANCE_SCALE;vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;float extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;v_tex_a=vec2(a_linesofar*u_patternscale_a.x/floorwidth,normal.y*u_patternscale_a.y+u_tex_y_a);v_tex_b=vec2(a_linesofar*u_patternscale_b.x/floorwidth,normal.y*u_patternscale_b.y+u_tex_y_b);v_width2=vec2(outset,inset);}\"),yr=br(\"uniform float u_fade_t;uniform float u_opacity;uniform sampler2D u_image0;uniform sampler2D u_image1;varying vec2 v_pos0;varying vec2 v_pos1;uniform float u_brightness_low;uniform float u_brightness_high;uniform float u_saturation_factor;uniform float u_contrast_factor;uniform vec3 u_spin_weights;void main() {vec4 color0=texture2D(u_image0,v_pos0);vec4 color1=texture2D(u_image1,v_pos1);if (color0.a > 0.0) {color0.rgb=color0.rgb/color0.a;}if (color1.a > 0.0) {color1.rgb=color1.rgb/color1.a;}vec4 color=mix(color0,color1,u_fade_t);color.a*=u_opacity;vec3 rgb=color.rgb;rgb=vec3(dot(rgb,u_spin_weights.xyz),dot(rgb,u_spin_weights.zxy),dot(rgb,u_spin_weights.yzx));float average=(color.r+color.g+color.b)/3.0;rgb+=(average-rgb)*u_saturation_factor;rgb=(rgb-0.5)*u_contrast_factor+0.5;vec3 u_high_vec=vec3(u_brightness_low,u_brightness_low,u_brightness_low);vec3 u_low_vec=vec3(u_brightness_high,u_brightness_high,u_brightness_high);gl_FragColor=vec4(mix(u_high_vec,u_low_vec,rgb)*color.a,color.a);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"uniform mat4 u_matrix;uniform vec2 u_tl_parent;uniform float u_scale_parent;uniform float u_buffer_scale;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying vec2 v_pos0;varying vec2 v_pos1;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);v_pos0=(((a_texture_pos/8192.0)-0.5)/u_buffer_scale )+0.5;v_pos1=(v_pos0*u_scale_parent)+u_tl_parent;}\"),vr=br(\"uniform sampler2D u_texture;varying vec2 v_tex;varying float v_fade_opacity;\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize lowp float opacity\\nlowp float alpha=opacity*v_fade_opacity;gl_FragColor=texture2D(u_texture,v_tex)*alpha;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"const float PI=3.141592653589793;attribute vec4 a_pos_offset;attribute vec4 a_data;attribute vec4 a_pixeloffset;attribute vec3 a_projected_pos;attribute float a_fade_opacity;uniform bool u_is_size_zoom_constant;uniform bool u_is_size_feature_constant;uniform highp float u_size_t;uniform highp float u_size;uniform highp float u_camera_to_center_distance;uniform highp float u_pitch;uniform bool u_rotate_symbol;uniform highp float u_aspect_ratio;uniform float u_fade_change;uniform mat4 u_matrix;uniform mat4 u_label_plane_matrix;uniform mat4 u_coord_matrix;uniform bool u_is_text;uniform bool u_pitch_with_map;uniform vec2 u_texsize;varying vec2 v_tex;varying float v_fade_opacity;\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize lowp float opacity\\nvec2 a_pos=a_pos_offset.xy;vec2 a_offset=a_pos_offset.zw;vec2 a_tex=a_data.xy;vec2 a_size=a_data.zw;float a_size_min=floor(a_size[0]*0.5);vec2 a_pxoffset=a_pixeloffset.xy;vec2 a_minFontScale=a_pixeloffset.zw/256.0;highp float segment_angle=-a_projected_pos[2];float size;if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {size=mix(a_size_min,a_size[1],u_size_t)/128.0;} else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {size=a_size_min/128.0;} else {size=u_size;}vec4 projectedPoint=u_matrix*vec4(a_pos,0,1);highp float camera_to_anchor_distance=projectedPoint.w;highp float distance_ratio=u_pitch_with_map ?\\ncamera_to_anchor_distance/u_camera_to_center_distance :\\nu_camera_to_center_distance/camera_to_anchor_distance;highp float perspective_ratio=clamp(0.5+0.5*distance_ratio,0.0,4.0);size*=perspective_ratio;float fontScale=u_is_text ? size/24.0 : size;highp float symbol_rotation=0.0;if (u_rotate_symbol) {vec4 offsetProjectedPoint=u_matrix*vec4(a_pos+vec2(1,0),0,1);vec2 a=projectedPoint.xy/projectedPoint.w;vec2 b=offsetProjectedPoint.xy/offsetProjectedPoint.w;symbol_rotation=atan((b.y-a.y)/u_aspect_ratio,b.x-a.x);}highp float angle_sin=sin(segment_angle+symbol_rotation);highp float angle_cos=cos(segment_angle+symbol_rotation);mat2 rotation_matrix=mat2(angle_cos,-1.0*angle_sin,angle_sin,angle_cos);vec4 projected_pos=u_label_plane_matrix*vec4(a_projected_pos.xy,0.0,1.0);gl_Position=u_coord_matrix*vec4(projected_pos.xy/projected_pos.w+rotation_matrix*(a_offset/32.0*max(a_minFontScale,fontScale)+a_pxoffset/16.0),0.0,1.0);v_tex=a_tex/u_texsize;vec2 fade_opacity=unpack_opacity(a_fade_opacity);float fade_change=fade_opacity[1] > 0.5 ? u_fade_change :-u_fade_change;v_fade_opacity=max(0.0,min(1.0,fade_opacity[0]+fade_change));}\"),xr=br(\"#define SDF_PX 8.0\\nuniform bool u_is_halo;uniform sampler2D u_texture;uniform highp float u_gamma_scale;uniform lowp float u_device_pixel_ratio;uniform bool u_is_text;varying vec2 v_data0;varying vec3 v_data1;\\n#pragma mapbox: define highp vec4 fill_color\\n#pragma mapbox: define highp vec4 halo_color\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp float halo_width\\n#pragma mapbox: define lowp float halo_blur\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 fill_color\\n#pragma mapbox: initialize highp vec4 halo_color\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize lowp float halo_width\\n#pragma mapbox: initialize lowp float halo_blur\\nfloat EDGE_GAMMA=0.105/u_device_pixel_ratio;vec2 tex=v_data0.xy;float gamma_scale=v_data1.x;float size=v_data1.y;float fade_opacity=v_data1[2];float fontScale=u_is_text ? size/24.0 : size;lowp vec4 color=fill_color;highp float gamma=EDGE_GAMMA/(fontScale*u_gamma_scale);lowp float buff=(256.0-64.0)/256.0;if (u_is_halo) {color=halo_color;gamma=(halo_blur*1.19/SDF_PX+EDGE_GAMMA)/(fontScale*u_gamma_scale);buff=(6.0-halo_width/fontScale)/SDF_PX;}lowp float dist=texture2D(u_texture,tex).a;highp float gamma_scaled=gamma*gamma_scale;highp float alpha=smoothstep(buff-gamma_scaled,buff+gamma_scaled,dist);gl_FragColor=color*(alpha*opacity*fade_opacity);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"const float PI=3.141592653589793;attribute vec4 a_pos_offset;attribute vec4 a_data;attribute vec4 a_pixeloffset;attribute vec3 a_projected_pos;attribute float a_fade_opacity;uniform bool u_is_size_zoom_constant;uniform bool u_is_size_feature_constant;uniform highp float u_size_t;uniform highp float u_size;uniform mat4 u_matrix;uniform mat4 u_label_plane_matrix;uniform mat4 u_coord_matrix;uniform bool u_is_text;uniform bool u_pitch_with_map;uniform highp float u_pitch;uniform bool u_rotate_symbol;uniform highp float u_aspect_ratio;uniform highp float u_camera_to_center_distance;uniform float u_fade_change;uniform vec2 u_texsize;varying vec2 v_data0;varying vec3 v_data1;\\n#pragma mapbox: define highp vec4 fill_color\\n#pragma mapbox: define highp vec4 halo_color\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp float halo_width\\n#pragma mapbox: define lowp float halo_blur\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 fill_color\\n#pragma mapbox: initialize highp vec4 halo_color\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize lowp float halo_width\\n#pragma mapbox: initialize lowp float halo_blur\\nvec2 a_pos=a_pos_offset.xy;vec2 a_offset=a_pos_offset.zw;vec2 a_tex=a_data.xy;vec2 a_size=a_data.zw;float a_size_min=floor(a_size[0]*0.5);vec2 a_pxoffset=a_pixeloffset.xy;highp float segment_angle=-a_projected_pos[2];float size;if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {size=mix(a_size_min,a_size[1],u_size_t)/128.0;} else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {size=a_size_min/128.0;} else {size=u_size;}vec4 projectedPoint=u_matrix*vec4(a_pos,0,1);highp float camera_to_anchor_distance=projectedPoint.w;highp float distance_ratio=u_pitch_with_map ?\\ncamera_to_anchor_distance/u_camera_to_center_distance :\\nu_camera_to_center_distance/camera_to_anchor_distance;highp float perspective_ratio=clamp(0.5+0.5*distance_ratio,0.0,4.0);size*=perspective_ratio;float fontScale=u_is_text ? size/24.0 : size;highp float symbol_rotation=0.0;if (u_rotate_symbol) {vec4 offsetProjectedPoint=u_matrix*vec4(a_pos+vec2(1,0),0,1);vec2 a=projectedPoint.xy/projectedPoint.w;vec2 b=offsetProjectedPoint.xy/offsetProjectedPoint.w;symbol_rotation=atan((b.y-a.y)/u_aspect_ratio,b.x-a.x);}highp float angle_sin=sin(segment_angle+symbol_rotation);highp float angle_cos=cos(segment_angle+symbol_rotation);mat2 rotation_matrix=mat2(angle_cos,-1.0*angle_sin,angle_sin,angle_cos);vec4 projected_pos=u_label_plane_matrix*vec4(a_projected_pos.xy,0.0,1.0);gl_Position=u_coord_matrix*vec4(projected_pos.xy/projected_pos.w+rotation_matrix*(a_offset/32.0*fontScale+a_pxoffset),0.0,1.0);float gamma_scale=gl_Position.w;vec2 fade_opacity=unpack_opacity(a_fade_opacity);float fade_change=fade_opacity[1] > 0.5 ? u_fade_change :-u_fade_change;float interpolated_fade_opacity=max(0.0,min(1.0,fade_opacity[0]+fade_change));v_data0=a_tex/u_texsize;v_data1=vec3(gamma_scale,size,interpolated_fade_opacity);}\"),_r=br(\"#define SDF_PX 8.0\\n#define SDF 1.0\\n#define ICON 0.0\\nuniform bool u_is_halo;uniform sampler2D u_texture;uniform sampler2D u_texture_icon;uniform highp float u_gamma_scale;uniform lowp float u_device_pixel_ratio;varying vec4 v_data0;varying vec4 v_data1;\\n#pragma mapbox: define highp vec4 fill_color\\n#pragma mapbox: define highp vec4 halo_color\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp float halo_width\\n#pragma mapbox: define lowp float halo_blur\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 fill_color\\n#pragma mapbox: initialize highp vec4 halo_color\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize lowp float halo_width\\n#pragma mapbox: initialize lowp float halo_blur\\nfloat fade_opacity=v_data1[2];if (v_data1.w==ICON) {vec2 tex_icon=v_data0.zw;lowp float alpha=opacity*fade_opacity;gl_FragColor=texture2D(u_texture_icon,tex_icon)*alpha;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\nreturn;}vec2 tex=v_data0.xy;float EDGE_GAMMA=0.105/u_device_pixel_ratio;float gamma_scale=v_data1.x;float size=v_data1.y;float fontScale=size/24.0;lowp vec4 color=fill_color;highp float gamma=EDGE_GAMMA/(fontScale*u_gamma_scale);lowp float buff=(256.0-64.0)/256.0;if (u_is_halo) {color=halo_color;gamma=(halo_blur*1.19/SDF_PX+EDGE_GAMMA)/(fontScale*u_gamma_scale);buff=(6.0-halo_width/fontScale)/SDF_PX;}lowp float dist=texture2D(u_texture,tex).a;highp float gamma_scaled=gamma*gamma_scale;highp float alpha=smoothstep(buff-gamma_scaled,buff+gamma_scaled,dist);gl_FragColor=color*(alpha*opacity*fade_opacity);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"const float PI=3.141592653589793;attribute vec4 a_pos_offset;attribute vec4 a_data;attribute vec3 a_projected_pos;attribute float a_fade_opacity;uniform bool u_is_size_zoom_constant;uniform bool u_is_size_feature_constant;uniform highp float u_size_t;uniform highp float u_size;uniform mat4 u_matrix;uniform mat4 u_label_plane_matrix;uniform mat4 u_coord_matrix;uniform bool u_is_text;uniform bool u_pitch_with_map;uniform highp float u_pitch;uniform bool u_rotate_symbol;uniform highp float u_aspect_ratio;uniform highp float u_camera_to_center_distance;uniform float u_fade_change;uniform vec2 u_texsize;uniform vec2 u_texsize_icon;varying vec4 v_data0;varying vec4 v_data1;\\n#pragma mapbox: define highp vec4 fill_color\\n#pragma mapbox: define highp vec4 halo_color\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp float halo_width\\n#pragma mapbox: define lowp float halo_blur\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 fill_color\\n#pragma mapbox: initialize highp vec4 halo_color\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize lowp float halo_width\\n#pragma mapbox: initialize lowp float halo_blur\\nvec2 a_pos=a_pos_offset.xy;vec2 a_offset=a_pos_offset.zw;vec2 a_tex=a_data.xy;vec2 a_size=a_data.zw;float a_size_min=floor(a_size[0]*0.5);float is_sdf=a_size[0]-2.0*a_size_min;highp float segment_angle=-a_projected_pos[2];float size;if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {size=mix(a_size_min,a_size[1],u_size_t)/128.0;} else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {size=a_size_min/128.0;} else {size=u_size;}vec4 projectedPoint=u_matrix*vec4(a_pos,0,1);highp float camera_to_anchor_distance=projectedPoint.w;highp float distance_ratio=u_pitch_with_map ?\\ncamera_to_anchor_distance/u_camera_to_center_distance :\\nu_camera_to_center_distance/camera_to_anchor_distance;highp float perspective_ratio=clamp(0.5+0.5*distance_ratio,0.0,4.0);size*=perspective_ratio;float fontScale=size/24.0;highp float symbol_rotation=0.0;if (u_rotate_symbol) {vec4 offsetProjectedPoint=u_matrix*vec4(a_pos+vec2(1,0),0,1);vec2 a=projectedPoint.xy/projectedPoint.w;vec2 b=offsetProjectedPoint.xy/offsetProjectedPoint.w;symbol_rotation=atan((b.y-a.y)/u_aspect_ratio,b.x-a.x);}highp float angle_sin=sin(segment_angle+symbol_rotation);highp float angle_cos=cos(segment_angle+symbol_rotation);mat2 rotation_matrix=mat2(angle_cos,-1.0*angle_sin,angle_sin,angle_cos);vec4 projected_pos=u_label_plane_matrix*vec4(a_projected_pos.xy,0.0,1.0);gl_Position=u_coord_matrix*vec4(projected_pos.xy/projected_pos.w+rotation_matrix*(a_offset/32.0*fontScale),0.0,1.0);float gamma_scale=gl_Position.w;vec2 fade_opacity=unpack_opacity(a_fade_opacity);float fade_change=fade_opacity[1] > 0.5 ? u_fade_change :-u_fade_change;float interpolated_fade_opacity=max(0.0,min(1.0,fade_opacity[0]+fade_change));v_data0.xy=a_tex/u_texsize;v_data0.zw=a_tex/u_texsize_icon;v_data1=vec4(gamma_scale,size,interpolated_fade_opacity,is_sdf);}\");function br(t,e){var r=/#pragma mapbox: ([\\w]+) ([\\w]+) ([\\w]+) ([\\w]+)/g,n=e.match(/attribute ([\\w]+) ([\\w]+)/g),i=t.match(/uniform ([\\w]+) ([\\w]+)([\\s]*)([\\w]*)/g),a=e.match(/uniform ([\\w]+) ([\\w]+)([\\s]*)([\\w]*)/g),o=a?a.concat(i):i,s={};return{fragmentSource:t=t.replace(r,(function(t,e,r,n,i){return s[i]=!0,\"define\"===e?\"\\n#ifndef HAS_UNIFORM_u_\"+i+\"\\nvarying \"+r+\" \"+n+\" \"+i+\";\\n#else\\nuniform \"+r+\" \"+n+\" u_\"+i+\";\\n#endif\\n\":\"\\n#ifdef HAS_UNIFORM_u_\"+i+\"\\n \"+r+\" \"+n+\" \"+i+\" = u_\"+i+\";\\n#endif\\n\"})),vertexSource:e=e.replace(r,(function(t,e,r,n,i){var a=\"float\"===n?\"vec2\":\"vec4\",o=i.match(/color/)?\"color\":a;return s[i]?\"define\"===e?\"\\n#ifndef HAS_UNIFORM_u_\"+i+\"\\nuniform lowp float u_\"+i+\"_t;\\nattribute \"+r+\" \"+a+\" a_\"+i+\";\\nvarying \"+r+\" \"+n+\" \"+i+\";\\n#else\\nuniform \"+r+\" \"+n+\" u_\"+i+\";\\n#endif\\n\":\"vec4\"===o?\"\\n#ifndef HAS_UNIFORM_u_\"+i+\"\\n \"+i+\" = a_\"+i+\";\\n#else\\n \"+r+\" \"+n+\" \"+i+\" = u_\"+i+\";\\n#endif\\n\":\"\\n#ifndef HAS_UNIFORM_u_\"+i+\"\\n \"+i+\" = unpack_mix_\"+o+\"(a_\"+i+\", u_\"+i+\"_t);\\n#else\\n \"+r+\" \"+n+\" \"+i+\" = u_\"+i+\";\\n#endif\\n\":\"define\"===e?\"\\n#ifndef HAS_UNIFORM_u_\"+i+\"\\nuniform lowp float u_\"+i+\"_t;\\nattribute \"+r+\" \"+a+\" a_\"+i+\";\\n#else\\nuniform \"+r+\" \"+n+\" u_\"+i+\";\\n#endif\\n\":\"vec4\"===o?\"\\n#ifndef HAS_UNIFORM_u_\"+i+\"\\n \"+r+\" \"+n+\" \"+i+\" = a_\"+i+\";\\n#else\\n \"+r+\" \"+n+\" \"+i+\" = u_\"+i+\";\\n#endif\\n\":\"\\n#ifndef HAS_UNIFORM_u_\"+i+\"\\n \"+r+\" \"+n+\" \"+i+\" = unpack_mix_\"+o+\"(a_\"+i+\", u_\"+i+\"_t);\\n#else\\n \"+r+\" \"+n+\" \"+i+\" = u_\"+i+\";\\n#endif\\n\"})),staticAttributes:n,staticUniforms:o}}var wr=Object.freeze({__proto__:null,prelude:Xe,background:$e,backgroundPattern:Je,circle:Ke,clippingMask:Qe,heatmap:tr,heatmapTexture:er,collisionBox:rr,collisionCircle:nr,debug:ir,fill:ar,fillOutline:or,fillOutlinePattern:sr,fillPattern:lr,fillExtrusion:cr,fillExtrusionPattern:ur,hillshadePrepare:hr,hillshade:fr,line:pr,lineGradient:dr,linePattern:mr,lineSDF:gr,raster:yr,symbolIcon:vr,symbolSDF:xr,symbolTextAndIcon:_r}),Tr=function(){this.boundProgram=null,this.boundLayoutVertexBuffer=null,this.boundPaintVertexBuffers=[],this.boundIndexBuffer=null,this.boundVertexOffset=null,this.boundDynamicVertexBuffer=null,this.vao=null};function kr(t){for(var e=[],r=0;r>16,s>>16],u_pixel_coord_lower:[65535&o,65535&s]}}Ar.prototype.draw=function(t,e,r,n,i,a,o,s,l,c,u,h,f,p,d,m){var g,y=t.gl;if(!this.failedToCreate){for(var v in t.program.set(this.program),t.setDepthMode(r),t.setStencilMode(n),t.setColorMode(i),t.setCullFace(a),this.fixedUniforms)this.fixedUniforms[v].set(o[v]);p&&p.setUniforms(t,this.binderUniforms,h,{zoom:f});for(var x=(g={},g[y.LINES]=2,g[y.TRIANGLES]=3,g[y.LINE_STRIP]=1,g)[e],_=0,b=u.get();_0?1-1/(1.001-o):-o),u_contrast_factor:(a=i.paint.get(\"raster-contrast\"),a>0?1/(1-a):1+a),u_spin_weights:Xr(i.paint.get(\"raster-hue-rotate\"))};var a,o};function Xr(t){t*=Math.PI/180;var e=Math.sin(t),r=Math.cos(t);return[(2*r+1)/3,(-Math.sqrt(3)*e-r+1)/3,(Math.sqrt(3)*e-r+1)/3]}var $r,Jr=function(t,e,r,n,i,a,o,s,l,c){var u=i.transform;return{u_is_size_zoom_constant:+(\"constant\"===t||\"source\"===t),u_is_size_feature_constant:+(\"constant\"===t||\"camera\"===t),u_size_t:e?e.uSizeT:0,u_size:e?e.uSize:0,u_camera_to_center_distance:u.cameraToCenterDistance,u_pitch:u.pitch/360*2*Math.PI,u_rotate_symbol:+r,u_aspect_ratio:u.width/u.height,u_fade_change:i.options.fadeDuration?i.symbolFadeChange:1,u_matrix:a,u_label_plane_matrix:o,u_coord_matrix:s,u_is_text:+l,u_pitch_with_map:+n,u_texsize:c,u_texture:0}},Kr=function(e,r,n,i,a,o,s,l,c,u,h){var f=a.transform;return t.extend(Jr(e,r,n,i,a,o,s,l,c,u),{u_gamma_scale:i?Math.cos(f._pitch)*f.cameraToCenterDistance:1,u_device_pixel_ratio:t.browser.devicePixelRatio,u_is_halo:+h})},Qr=function(e,r,n,i,a,o,s,l,c,u){return t.extend(Kr(e,r,n,i,a,o,s,l,!0,c,!0),{u_texsize_icon:u,u_texture_icon:1})},tn=function(t,e,r){return{u_matrix:t,u_opacity:e,u_color:r}},en=function(e,r,n,i,a,o){return t.extend(function(t,e,r,n){var i=r.imageManager.getPattern(t.from.toString()),a=r.imageManager.getPattern(t.to.toString()),o=r.imageManager.getPixelSize(),s=o.width,l=o.height,c=Math.pow(2,n.tileID.overscaledZ),u=n.tileSize*Math.pow(2,r.transform.tileZoom)/c,h=u*(n.tileID.canonical.x+n.tileID.wrap*c),f=u*n.tileID.canonical.y;return{u_image:0,u_pattern_tl_a:i.tl,u_pattern_br_a:i.br,u_pattern_tl_b:a.tl,u_pattern_br_b:a.br,u_texsize:[s,l],u_mix:e.t,u_pattern_size_a:i.displaySize,u_pattern_size_b:a.displaySize,u_scale_a:e.fromScale,u_scale_b:e.toScale,u_tile_units_to_pixels:1/ge(n,1,r.transform.tileZoom),u_pixel_coord_upper:[h>>16,f>>16],u_pixel_coord_lower:[65535&h,65535&f]}}(i,o,n,a),{u_matrix:e,u_opacity:r})},rn={fillExtrusion:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_lightpos:new t.Uniform3f(e,r.u_lightpos),u_lightintensity:new t.Uniform1f(e,r.u_lightintensity),u_lightcolor:new t.Uniform3f(e,r.u_lightcolor),u_vertical_gradient:new t.Uniform1f(e,r.u_vertical_gradient),u_opacity:new t.Uniform1f(e,r.u_opacity)}},fillExtrusionPattern:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_lightpos:new t.Uniform3f(e,r.u_lightpos),u_lightintensity:new t.Uniform1f(e,r.u_lightintensity),u_lightcolor:new t.Uniform3f(e,r.u_lightcolor),u_vertical_gradient:new t.Uniform1f(e,r.u_vertical_gradient),u_height_factor:new t.Uniform1f(e,r.u_height_factor),u_image:new t.Uniform1i(e,r.u_image),u_texsize:new t.Uniform2f(e,r.u_texsize),u_pixel_coord_upper:new t.Uniform2f(e,r.u_pixel_coord_upper),u_pixel_coord_lower:new t.Uniform2f(e,r.u_pixel_coord_lower),u_scale:new t.Uniform3f(e,r.u_scale),u_fade:new t.Uniform1f(e,r.u_fade),u_opacity:new t.Uniform1f(e,r.u_opacity)}},fill:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix)}},fillPattern:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_image:new t.Uniform1i(e,r.u_image),u_texsize:new t.Uniform2f(e,r.u_texsize),u_pixel_coord_upper:new t.Uniform2f(e,r.u_pixel_coord_upper),u_pixel_coord_lower:new t.Uniform2f(e,r.u_pixel_coord_lower),u_scale:new t.Uniform3f(e,r.u_scale),u_fade:new t.Uniform1f(e,r.u_fade)}},fillOutline:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_world:new t.Uniform2f(e,r.u_world)}},fillOutlinePattern:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_world:new t.Uniform2f(e,r.u_world),u_image:new t.Uniform1i(e,r.u_image),u_texsize:new t.Uniform2f(e,r.u_texsize),u_pixel_coord_upper:new t.Uniform2f(e,r.u_pixel_coord_upper),u_pixel_coord_lower:new t.Uniform2f(e,r.u_pixel_coord_lower),u_scale:new t.Uniform3f(e,r.u_scale),u_fade:new t.Uniform1f(e,r.u_fade)}},circle:function(e,r){return{u_camera_to_center_distance:new t.Uniform1f(e,r.u_camera_to_center_distance),u_scale_with_map:new t.Uniform1i(e,r.u_scale_with_map),u_pitch_with_map:new t.Uniform1i(e,r.u_pitch_with_map),u_extrude_scale:new t.Uniform2f(e,r.u_extrude_scale),u_device_pixel_ratio:new t.Uniform1f(e,r.u_device_pixel_ratio),u_matrix:new t.UniformMatrix4f(e,r.u_matrix)}},collisionBox:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_camera_to_center_distance:new t.Uniform1f(e,r.u_camera_to_center_distance),u_pixels_to_tile_units:new t.Uniform1f(e,r.u_pixels_to_tile_units),u_extrude_scale:new t.Uniform2f(e,r.u_extrude_scale),u_overscale_factor:new t.Uniform1f(e,r.u_overscale_factor)}},collisionCircle:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_inv_matrix:new t.UniformMatrix4f(e,r.u_inv_matrix),u_camera_to_center_distance:new t.Uniform1f(e,r.u_camera_to_center_distance),u_viewport_size:new t.Uniform2f(e,r.u_viewport_size)}},debug:function(e,r){return{u_color:new t.UniformColor(e,r.u_color),u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_overlay:new t.Uniform1i(e,r.u_overlay),u_overlay_scale:new t.Uniform1f(e,r.u_overlay_scale)}},clippingMask:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix)}},heatmap:function(e,r){return{u_extrude_scale:new t.Uniform1f(e,r.u_extrude_scale),u_intensity:new t.Uniform1f(e,r.u_intensity),u_matrix:new t.UniformMatrix4f(e,r.u_matrix)}},heatmapTexture:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_world:new t.Uniform2f(e,r.u_world),u_image:new t.Uniform1i(e,r.u_image),u_color_ramp:new t.Uniform1i(e,r.u_color_ramp),u_opacity:new t.Uniform1f(e,r.u_opacity)}},hillshade:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_image:new t.Uniform1i(e,r.u_image),u_latrange:new t.Uniform2f(e,r.u_latrange),u_light:new t.Uniform2f(e,r.u_light),u_shadow:new t.UniformColor(e,r.u_shadow),u_highlight:new t.UniformColor(e,r.u_highlight),u_accent:new t.UniformColor(e,r.u_accent)}},hillshadePrepare:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_image:new t.Uniform1i(e,r.u_image),u_dimension:new t.Uniform2f(e,r.u_dimension),u_zoom:new t.Uniform1f(e,r.u_zoom),u_unpack:new t.Uniform4f(e,r.u_unpack)}},line:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_ratio:new t.Uniform1f(e,r.u_ratio),u_device_pixel_ratio:new t.Uniform1f(e,r.u_device_pixel_ratio),u_units_to_pixels:new t.Uniform2f(e,r.u_units_to_pixels)}},lineGradient:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_ratio:new t.Uniform1f(e,r.u_ratio),u_device_pixel_ratio:new t.Uniform1f(e,r.u_device_pixel_ratio),u_units_to_pixels:new t.Uniform2f(e,r.u_units_to_pixels),u_image:new t.Uniform1i(e,r.u_image),u_image_height:new t.Uniform1f(e,r.u_image_height)}},linePattern:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_texsize:new t.Uniform2f(e,r.u_texsize),u_ratio:new t.Uniform1f(e,r.u_ratio),u_device_pixel_ratio:new t.Uniform1f(e,r.u_device_pixel_ratio),u_image:new t.Uniform1i(e,r.u_image),u_units_to_pixels:new t.Uniform2f(e,r.u_units_to_pixels),u_scale:new t.Uniform3f(e,r.u_scale),u_fade:new t.Uniform1f(e,r.u_fade)}},lineSDF:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_ratio:new t.Uniform1f(e,r.u_ratio),u_device_pixel_ratio:new t.Uniform1f(e,r.u_device_pixel_ratio),u_units_to_pixels:new t.Uniform2f(e,r.u_units_to_pixels),u_patternscale_a:new t.Uniform2f(e,r.u_patternscale_a),u_patternscale_b:new t.Uniform2f(e,r.u_patternscale_b),u_sdfgamma:new t.Uniform1f(e,r.u_sdfgamma),u_image:new t.Uniform1i(e,r.u_image),u_tex_y_a:new t.Uniform1f(e,r.u_tex_y_a),u_tex_y_b:new t.Uniform1f(e,r.u_tex_y_b),u_mix:new t.Uniform1f(e,r.u_mix)}},raster:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_tl_parent:new t.Uniform2f(e,r.u_tl_parent),u_scale_parent:new t.Uniform1f(e,r.u_scale_parent),u_buffer_scale:new t.Uniform1f(e,r.u_buffer_scale),u_fade_t:new t.Uniform1f(e,r.u_fade_t),u_opacity:new t.Uniform1f(e,r.u_opacity),u_image0:new t.Uniform1i(e,r.u_image0),u_image1:new t.Uniform1i(e,r.u_image1),u_brightness_low:new t.Uniform1f(e,r.u_brightness_low),u_brightness_high:new t.Uniform1f(e,r.u_brightness_high),u_saturation_factor:new t.Uniform1f(e,r.u_saturation_factor),u_contrast_factor:new t.Uniform1f(e,r.u_contrast_factor),u_spin_weights:new t.Uniform3f(e,r.u_spin_weights)}},symbolIcon:function(e,r){return{u_is_size_zoom_constant:new t.Uniform1i(e,r.u_is_size_zoom_constant),u_is_size_feature_constant:new t.Uniform1i(e,r.u_is_size_feature_constant),u_size_t:new t.Uniform1f(e,r.u_size_t),u_size:new t.Uniform1f(e,r.u_size),u_camera_to_center_distance:new t.Uniform1f(e,r.u_camera_to_center_distance),u_pitch:new t.Uniform1f(e,r.u_pitch),u_rotate_symbol:new t.Uniform1i(e,r.u_rotate_symbol),u_aspect_ratio:new t.Uniform1f(e,r.u_aspect_ratio),u_fade_change:new t.Uniform1f(e,r.u_fade_change),u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_label_plane_matrix:new t.UniformMatrix4f(e,r.u_label_plane_matrix),u_coord_matrix:new t.UniformMatrix4f(e,r.u_coord_matrix),u_is_text:new t.Uniform1i(e,r.u_is_text),u_pitch_with_map:new t.Uniform1i(e,r.u_pitch_with_map),u_texsize:new t.Uniform2f(e,r.u_texsize),u_texture:new t.Uniform1i(e,r.u_texture)}},symbolSDF:function(e,r){return{u_is_size_zoom_constant:new t.Uniform1i(e,r.u_is_size_zoom_constant),u_is_size_feature_constant:new t.Uniform1i(e,r.u_is_size_feature_constant),u_size_t:new t.Uniform1f(e,r.u_size_t),u_size:new t.Uniform1f(e,r.u_size),u_camera_to_center_distance:new t.Uniform1f(e,r.u_camera_to_center_distance),u_pitch:new t.Uniform1f(e,r.u_pitch),u_rotate_symbol:new t.Uniform1i(e,r.u_rotate_symbol),u_aspect_ratio:new t.Uniform1f(e,r.u_aspect_ratio),u_fade_change:new t.Uniform1f(e,r.u_fade_change),u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_label_plane_matrix:new t.UniformMatrix4f(e,r.u_label_plane_matrix),u_coord_matrix:new t.UniformMatrix4f(e,r.u_coord_matrix),u_is_text:new t.Uniform1i(e,r.u_is_text),u_pitch_with_map:new t.Uniform1i(e,r.u_pitch_with_map),u_texsize:new t.Uniform2f(e,r.u_texsize),u_texture:new t.Uniform1i(e,r.u_texture),u_gamma_scale:new t.Uniform1f(e,r.u_gamma_scale),u_device_pixel_ratio:new t.Uniform1f(e,r.u_device_pixel_ratio),u_is_halo:new t.Uniform1i(e,r.u_is_halo)}},symbolTextAndIcon:function(e,r){return{u_is_size_zoom_constant:new t.Uniform1i(e,r.u_is_size_zoom_constant),u_is_size_feature_constant:new t.Uniform1i(e,r.u_is_size_feature_constant),u_size_t:new t.Uniform1f(e,r.u_size_t),u_size:new t.Uniform1f(e,r.u_size),u_camera_to_center_distance:new t.Uniform1f(e,r.u_camera_to_center_distance),u_pitch:new t.Uniform1f(e,r.u_pitch),u_rotate_symbol:new t.Uniform1i(e,r.u_rotate_symbol),u_aspect_ratio:new t.Uniform1f(e,r.u_aspect_ratio),u_fade_change:new t.Uniform1f(e,r.u_fade_change),u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_label_plane_matrix:new t.UniformMatrix4f(e,r.u_label_plane_matrix),u_coord_matrix:new t.UniformMatrix4f(e,r.u_coord_matrix),u_is_text:new t.Uniform1i(e,r.u_is_text),u_pitch_with_map:new t.Uniform1i(e,r.u_pitch_with_map),u_texsize:new t.Uniform2f(e,r.u_texsize),u_texsize_icon:new t.Uniform2f(e,r.u_texsize_icon),u_texture:new t.Uniform1i(e,r.u_texture),u_texture_icon:new t.Uniform1i(e,r.u_texture_icon),u_gamma_scale:new t.Uniform1f(e,r.u_gamma_scale),u_device_pixel_ratio:new t.Uniform1f(e,r.u_device_pixel_ratio),u_is_halo:new t.Uniform1i(e,r.u_is_halo)}},background:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_opacity:new t.Uniform1f(e,r.u_opacity),u_color:new t.UniformColor(e,r.u_color)}},backgroundPattern:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_opacity:new t.Uniform1f(e,r.u_opacity),u_image:new t.Uniform1i(e,r.u_image),u_pattern_tl_a:new t.Uniform2f(e,r.u_pattern_tl_a),u_pattern_br_a:new t.Uniform2f(e,r.u_pattern_br_a),u_pattern_tl_b:new t.Uniform2f(e,r.u_pattern_tl_b),u_pattern_br_b:new t.Uniform2f(e,r.u_pattern_br_b),u_texsize:new t.Uniform2f(e,r.u_texsize),u_mix:new t.Uniform1f(e,r.u_mix),u_pattern_size_a:new t.Uniform2f(e,r.u_pattern_size_a),u_pattern_size_b:new t.Uniform2f(e,r.u_pattern_size_b),u_scale_a:new t.Uniform1f(e,r.u_scale_a),u_scale_b:new t.Uniform1f(e,r.u_scale_b),u_pixel_coord_upper:new t.Uniform2f(e,r.u_pixel_coord_upper),u_pixel_coord_lower:new t.Uniform2f(e,r.u_pixel_coord_lower),u_tile_units_to_pixels:new t.Uniform1f(e,r.u_tile_units_to_pixels)}}};function nn(e,r,n,i,a,o,s){for(var l=e.context,c=l.gl,u=e.useProgram(\"collisionBox\"),h=[],f=0,p=0,d=0;d0){var b=t.create(),w=v;t.mul(b,y.placementInvProjMatrix,e.transform.glCoordMatrix),t.mul(b,b,y.placementViewportMatrix),h.push({circleArray:_,circleOffset:p,transform:w,invTransform:b}),p=f+=_.length/4}x&&u.draw(l,c.LINES,Mt.disabled,Et.disabled,e.colorModeForRenderPass(),Lt.disabled,Or(v,e.transform,g),n.id,x.layoutVertexBuffer,x.indexBuffer,x.segments,null,e.transform.zoom,null,null,x.collisionVertexBuffer)}}if(s&&h.length){var T=e.useProgram(\"collisionCircle\"),k=new t.StructArrayLayout2f1f2i16;k.resize(4*f),k._trim();for(var A=0,M=0,S=h;M=0&&(m[y.associatedIconIndex]={shiftedAnchor:S,angle:E})}else fe(y.numGlyphs,p)}if(h){d.clear();for(var L=e.icon.placedSymbolArray,I=0;I0){var s=t.browser.now(),l=(s-e.timeAdded)/o,c=r?(s-r.timeAdded)/o:-1,u=n.getSource(),h=a.coveringZoomLevel({tileSize:u.tileSize,roundZoom:u.roundZoom}),f=!r||Math.abs(r.tileID.overscaledZ-h)>Math.abs(e.tileID.overscaledZ-h),p=f&&e.refreshedUponExpiration?1:t.clamp(f?l:1-c,0,1);return e.refreshedUponExpiration&&l>=1&&(e.refreshedUponExpiration=!1),r?{opacity:1,mix:1-p}:{opacity:p,mix:0}}return{opacity:1,mix:0}}var gn=new t.Color(1,0,0,1),yn=new t.Color(0,1,0,1),vn=new t.Color(0,0,1,1),xn=new t.Color(1,0,1,1),_n=new t.Color(0,1,1,1);function bn(t){var e=t.transform.padding;wn(t,t.transform.height-(e.top||0),3,gn),wn(t,e.bottom||0,3,yn),Tn(t,e.left||0,3,vn),Tn(t,t.transform.width-(e.right||0),3,xn);var r=t.transform.centerPoint;!function(t,e,r,n){var i=20,a=2;kn(t,e-a/2,r-i/2,a,i,n),kn(t,e-i/2,r-a/2,i,a,n)}(t,r.x,t.transform.height-r.y,_n)}function wn(t,e,r,n){kn(t,0,e+r/2,t.transform.width,r,n)}function Tn(t,e,r,n){kn(t,e-r/2,0,r,t.transform.height,n)}function kn(e,r,n,i,a,o){var s=e.context,l=s.gl;l.enable(l.SCISSOR_TEST),l.scissor(r*t.browser.devicePixelRatio,n*t.browser.devicePixelRatio,i*t.browser.devicePixelRatio,a*t.browser.devicePixelRatio),s.clear({color:o}),l.disable(l.SCISSOR_TEST)}function An(e,r,n){var i=e.context,a=i.gl,o=n.posMatrix,s=e.useProgram(\"debug\"),l=Mt.disabled,c=Et.disabled,u=e.colorModeForRenderPass(),h=\"$debug\";i.activeTexture.set(a.TEXTURE0),e.emptyTexture.bind(a.LINEAR,a.CLAMP_TO_EDGE),s.draw(i,a.LINE_STRIP,l,c,u,Lt.disabled,Rr(o,t.Color.red),h,e.debugBuffer,e.tileBorderIndexBuffer,e.debugSegments);var f=r.getTileByID(n.key).latestRawTileData,p=f&&f.byteLength||0,d=Math.floor(p/1024),m=r.getTile(n).tileSize,g=512/Math.min(m,512)*(n.overscaledZ/e.transform.zoom)*.5,y=n.canonical.toString();n.overscaledZ!==n.canonical.z&&(y+=\" => \"+n.overscaledZ),function(t,e){t.initDebugOverlayCanvas();var r=t.debugOverlayCanvas,n=t.context.gl,i=t.debugOverlayCanvas.getContext(\"2d\");i.clearRect(0,0,r.width,r.height),i.shadowColor=\"white\",i.shadowBlur=2,i.lineWidth=1.5,i.strokeStyle=\"white\",i.textBaseline=\"top\",i.font=\"bold 36px Open Sans, sans-serif\",i.fillText(e,5,5),i.strokeText(e,5,5),t.debugOverlayTexture.update(r),t.debugOverlayTexture.bind(n.LINEAR,n.CLAMP_TO_EDGE)}(e,y+\" \"+d+\"kb\"),s.draw(i,a.TRIANGLES,l,c,Ct.alphaBlended,Lt.disabled,Rr(o,t.Color.transparent,g),h,e.debugBuffer,e.quadTriangleIndexBuffer,e.debugSegments)}var Mn={symbol:function(e,r,n,i,a){if(\"translucent\"===e.renderPass){var o=Et.disabled,s=e.colorModeForRenderPass();n.layout.get(\"text-variable-anchor\")&&function(e,r,n,i,a,o,s){for(var l=r.transform,c=\"map\"===a,u=\"map\"===o,h=0,f=e;h256&&this.clearStencil(),r.setColorMode(Ct.disabled),r.setDepthMode(Mt.disabled);var i=this.useProgram(\"clippingMask\");this._tileClippingMaskIDs={};for(var a=0,o=e;a256&&this.clearStencil();var t=this.nextStencilID++,e=this.context.gl;return new Et({func:e.NOTEQUAL,mask:255},t,255,e.KEEP,e.KEEP,e.REPLACE)},Sn.prototype.stencilModeForClipping=function(t){var e=this.context.gl;return new Et({func:e.EQUAL,mask:255},this._tileClippingMaskIDs[t.key],0,e.KEEP,e.KEEP,e.REPLACE)},Sn.prototype.stencilConfigForOverlap=function(t){var e,r=this.context.gl,n=t.sort((function(t,e){return e.overscaledZ-t.overscaledZ})),i=n[n.length-1].overscaledZ,a=n[0].overscaledZ-i+1;if(a>1){this.currentStencilSource=void 0,this.nextStencilID+a>256&&this.clearStencil();for(var o={},s=0;s=0;this.currentLayer--){var w=this.style._layers[i[this.currentLayer]],T=a[w.source],k=u[w.source];this._renderTileClippingMasks(w,k),this.renderLayer(this,T,w,k)}for(this.renderPass=\"translucent\",this.currentLayer=0;this.currentLayer0?e.pop():null},Sn.prototype.isPatternMissing=function(t){if(!t)return!1;if(!t.from||!t.to)return!0;var e=this.imageManager.getPattern(t.from.toString()),r=this.imageManager.getPattern(t.to.toString());return!e||!r},Sn.prototype.useProgram=function(t,e){this.cache=this.cache||{};var r=\"\"+t+(e?e.cacheKey:\"\")+(this._showOverdrawInspector?\"/overdraw\":\"\");return this.cache[r]||(this.cache[r]=new Ar(this.context,t,wr[t],e,rn[t],this._showOverdrawInspector)),this.cache[r]},Sn.prototype.setCustomLayerDefaults=function(){this.context.unbindVAO(),this.context.cullFace.setDefault(),this.context.activeTexture.setDefault(),this.context.pixelStoreUnpack.setDefault(),this.context.pixelStoreUnpackPremultiplyAlpha.setDefault(),this.context.pixelStoreUnpackFlipY.setDefault()},Sn.prototype.setBaseState=function(){var t=this.context.gl;this.context.cullFace.set(!1),this.context.viewport.set([0,0,this.width,this.height]),this.context.blendEquation.set(t.FUNC_ADD)},Sn.prototype.initDebugOverlayCanvas=function(){if(null==this.debugOverlayCanvas){this.debugOverlayCanvas=t.window.document.createElement(\"canvas\"),this.debugOverlayCanvas.width=512,this.debugOverlayCanvas.height=512;var e=this.context.gl;this.debugOverlayTexture=new t.Texture(this.context,this.debugOverlayCanvas,e.RGBA)}},Sn.prototype.destroy=function(){this.emptyTexture.destroy(),this.debugOverlayTexture&&this.debugOverlayTexture.destroy()};var En=function(t,e){this.points=t,this.planes=e};En.fromInvProjectionMatrix=function(e,r,n){var i=Math.pow(2,n),a=[[-1,1,-1,1],[1,1,-1,1],[1,-1,-1,1],[-1,-1,-1,1],[-1,1,1,1],[1,1,1,1],[1,-1,1,1],[-1,-1,1,1]].map((function(r){return t.transformMat4([],r,e)})).map((function(e){return t.scale$1([],e,1/e[3]/r*i)})),o=[[0,1,2],[6,5,4],[0,3,7],[2,1,5],[3,2,6],[0,4,5]].map((function(e){var r=t.sub([],a[e[0]],a[e[1]]),n=t.sub([],a[e[2]],a[e[1]]),i=t.normalize([],t.cross([],r,n)),o=-t.dot(i,a[e[1]]);return i.concat(o)}));return new En(a,o)};var Cn=function(e,r){this.min=e,this.max=r,this.center=t.scale$2([],t.add([],this.min,this.max),.5)};Cn.prototype.quadrant=function(e){for(var r=[e%2==0,e<2],n=t.clone$2(this.min),i=t.clone$2(this.max),a=0;a=0;if(0===o)return 0;o!==r.length&&(n=!1)}if(n)return 2;for(var l=0;l<3;l++){for(var c=Number.MAX_VALUE,u=-Number.MAX_VALUE,h=0;hthis.max[l]-this.min[l])return 0}return 1};var Ln=function(t,e,r,n){if(void 0===t&&(t=0),void 0===e&&(e=0),void 0===r&&(r=0),void 0===n&&(n=0),isNaN(t)||t<0||isNaN(e)||e<0||isNaN(r)||r<0||isNaN(n)||n<0)throw new Error(\"Invalid value for edge-insets, top, bottom, left and right must all be numbers\");this.top=t,this.bottom=e,this.left=r,this.right=n};Ln.prototype.interpolate=function(e,r,n){return null!=r.top&&null!=e.top&&(this.top=t.number(e.top,r.top,n)),null!=r.bottom&&null!=e.bottom&&(this.bottom=t.number(e.bottom,r.bottom,n)),null!=r.left&&null!=e.left&&(this.left=t.number(e.left,r.left,n)),null!=r.right&&null!=e.right&&(this.right=t.number(e.right,r.right,n)),this},Ln.prototype.getCenter=function(e,r){var n=t.clamp((this.left+e-this.right)/2,0,e),i=t.clamp((this.top+r-this.bottom)/2,0,r);return new t.Point(n,i)},Ln.prototype.equals=function(t){return this.top===t.top&&this.bottom===t.bottom&&this.left===t.left&&this.right===t.right},Ln.prototype.clone=function(){return new Ln(this.top,this.bottom,this.left,this.right)},Ln.prototype.toJSON=function(){return{top:this.top,bottom:this.bottom,left:this.left,right:this.right}};var In=function(e,r,n,i,a){this.tileSize=512,this.maxValidLatitude=85.051129,this._renderWorldCopies=void 0===a||a,this._minZoom=e||0,this._maxZoom=r||22,this._minPitch=null==n?0:n,this._maxPitch=null==i?60:i,this.setMaxBounds(),this.width=0,this.height=0,this._center=new t.LngLat(0,0),this.zoom=0,this.angle=0,this._fov=.6435011087932844,this._pitch=0,this._unmodified=!0,this._edgeInsets=new Ln,this._posMatrixCache={},this._alignedPosMatrixCache={}},Pn={minZoom:{configurable:!0},maxZoom:{configurable:!0},minPitch:{configurable:!0},maxPitch:{configurable:!0},renderWorldCopies:{configurable:!0},worldSize:{configurable:!0},centerOffset:{configurable:!0},size:{configurable:!0},bearing:{configurable:!0},pitch:{configurable:!0},fov:{configurable:!0},zoom:{configurable:!0},center:{configurable:!0},padding:{configurable:!0},centerPoint:{configurable:!0},unmodified:{configurable:!0},point:{configurable:!0}};In.prototype.clone=function(){var t=new In(this._minZoom,this._maxZoom,this._minPitch,this.maxPitch,this._renderWorldCopies);return t.tileSize=this.tileSize,t.latRange=this.latRange,t.width=this.width,t.height=this.height,t._center=this._center,t.zoom=this.zoom,t.angle=this.angle,t._fov=this._fov,t._pitch=this._pitch,t._unmodified=this._unmodified,t._edgeInsets=this._edgeInsets.clone(),t._calcMatrices(),t},Pn.minZoom.get=function(){return this._minZoom},Pn.minZoom.set=function(t){this._minZoom!==t&&(this._minZoom=t,this.zoom=Math.max(this.zoom,t))},Pn.maxZoom.get=function(){return this._maxZoom},Pn.maxZoom.set=function(t){this._maxZoom!==t&&(this._maxZoom=t,this.zoom=Math.min(this.zoom,t))},Pn.minPitch.get=function(){return this._minPitch},Pn.minPitch.set=function(t){this._minPitch!==t&&(this._minPitch=t,this.pitch=Math.max(this.pitch,t))},Pn.maxPitch.get=function(){return this._maxPitch},Pn.maxPitch.set=function(t){this._maxPitch!==t&&(this._maxPitch=t,this.pitch=Math.min(this.pitch,t))},Pn.renderWorldCopies.get=function(){return this._renderWorldCopies},Pn.renderWorldCopies.set=function(t){void 0===t?t=!0:null===t&&(t=!1),this._renderWorldCopies=t},Pn.worldSize.get=function(){return this.tileSize*this.scale},Pn.centerOffset.get=function(){return this.centerPoint._sub(this.size._div(2))},Pn.size.get=function(){return new t.Point(this.width,this.height)},Pn.bearing.get=function(){return-this.angle/Math.PI*180},Pn.bearing.set=function(e){var r=-t.wrap(e,-180,180)*Math.PI/180;this.angle!==r&&(this._unmodified=!1,this.angle=r,this._calcMatrices(),this.rotationMatrix=t.create$2(),t.rotate(this.rotationMatrix,this.rotationMatrix,this.angle))},Pn.pitch.get=function(){return this._pitch/Math.PI*180},Pn.pitch.set=function(e){var r=t.clamp(e,this.minPitch,this.maxPitch)/180*Math.PI;this._pitch!==r&&(this._unmodified=!1,this._pitch=r,this._calcMatrices())},Pn.fov.get=function(){return this._fov/Math.PI*180},Pn.fov.set=function(t){t=Math.max(.01,Math.min(60,t)),this._fov!==t&&(this._unmodified=!1,this._fov=t/180*Math.PI,this._calcMatrices())},Pn.zoom.get=function(){return this._zoom},Pn.zoom.set=function(t){var e=Math.min(Math.max(t,this.minZoom),this.maxZoom);this._zoom!==e&&(this._unmodified=!1,this._zoom=e,this.scale=this.zoomScale(e),this.tileZoom=Math.floor(e),this.zoomFraction=e-this.tileZoom,this._constrain(),this._calcMatrices())},Pn.center.get=function(){return this._center},Pn.center.set=function(t){t.lat===this._center.lat&&t.lng===this._center.lng||(this._unmodified=!1,this._center=t,this._constrain(),this._calcMatrices())},Pn.padding.get=function(){return this._edgeInsets.toJSON()},Pn.padding.set=function(t){this._edgeInsets.equals(t)||(this._unmodified=!1,this._edgeInsets.interpolate(this._edgeInsets,t,1),this._calcMatrices())},Pn.centerPoint.get=function(){return this._edgeInsets.getCenter(this.width,this.height)},In.prototype.isPaddingEqual=function(t){return this._edgeInsets.equals(t)},In.prototype.interpolatePadding=function(t,e,r){this._unmodified=!1,this._edgeInsets.interpolate(t,e,r),this._constrain(),this._calcMatrices()},In.prototype.coveringZoomLevel=function(t){var e=(t.roundZoom?Math.round:Math.floor)(this.zoom+this.scaleZoom(this.tileSize/t.tileSize));return Math.max(0,e)},In.prototype.getVisibleUnwrappedCoordinates=function(e){var r=[new t.UnwrappedTileID(0,e)];if(this._renderWorldCopies)for(var n=this.pointCoordinate(new t.Point(0,0)),i=this.pointCoordinate(new t.Point(this.width,0)),a=this.pointCoordinate(new t.Point(this.width,this.height)),o=this.pointCoordinate(new t.Point(0,this.height)),s=Math.floor(Math.min(n.x,i.x,a.x,o.x)),l=Math.floor(Math.max(n.x,i.x,a.x,o.x)),c=s-1;c<=l+1;c++)0!==c&&r.push(new t.UnwrappedTileID(c,e));return r},In.prototype.coveringTiles=function(e){var r=this.coveringZoomLevel(e),n=r;if(void 0!==e.minzoom&&re.maxzoom&&(r=e.maxzoom);var i=t.MercatorCoordinate.fromLngLat(this.center),a=Math.pow(2,r),o=[a*i.x,a*i.y,0],s=En.fromInvProjectionMatrix(this.invProjMatrix,this.worldSize,r),l=e.minzoom||0;this.pitch<=60&&this._edgeInsets.top<.1&&(l=r);var c=function(t){return{aabb:new Cn([t*a,0,0],[(t+1)*a,a,0]),zoom:0,x:0,y:0,wrap:t,fullyVisible:!1}},u=[],h=[],f=r,p=e.reparseOverscaled?n:r;if(this._renderWorldCopies)for(var d=1;d<=3;d++)u.push(c(-d)),u.push(c(d));for(u.push(c(0));u.length>0;){var m=u.pop(),g=m.x,y=m.y,v=m.fullyVisible;if(!v){var x=m.aabb.intersects(s);if(0===x)continue;v=2===x}var _=m.aabb.distanceX(o),b=m.aabb.distanceY(o),w=Math.max(Math.abs(_),Math.abs(b)),T=3+(1<T&&m.zoom>=l)h.push({tileID:new t.OverscaledTileID(m.zoom===f?p:m.zoom,m.wrap,m.zoom,g,y),distanceSq:t.sqrLen([o[0]-.5-g,o[1]-.5-y])});else for(var k=0;k<4;k++){var A=(g<<1)+k%2,M=(y<<1)+(k>>1);u.push({aabb:m.aabb.quadrant(k),zoom:m.zoom+1,x:A,y:M,wrap:m.wrap,fullyVisible:v})}}return h.sort((function(t,e){return t.distanceSq-e.distanceSq})).map((function(t){return t.tileID}))},In.prototype.resize=function(t,e){this.width=t,this.height=e,this.pixelsToGLUnits=[2/t,-2/e],this._constrain(),this._calcMatrices()},Pn.unmodified.get=function(){return this._unmodified},In.prototype.zoomScale=function(t){return Math.pow(2,t)},In.prototype.scaleZoom=function(t){return Math.log(t)/Math.LN2},In.prototype.project=function(e){var r=t.clamp(e.lat,-this.maxValidLatitude,this.maxValidLatitude);return new t.Point(t.mercatorXfromLng(e.lng)*this.worldSize,t.mercatorYfromLat(r)*this.worldSize)},In.prototype.unproject=function(e){return new t.MercatorCoordinate(e.x/this.worldSize,e.y/this.worldSize).toLngLat()},Pn.point.get=function(){return this.project(this.center)},In.prototype.setLocationAtPoint=function(e,r){var n=this.pointCoordinate(r),i=this.pointCoordinate(this.centerPoint),a=this.locationCoordinate(e),o=new t.MercatorCoordinate(a.x-(n.x-i.x),a.y-(n.y-i.y));this.center=this.coordinateLocation(o),this._renderWorldCopies&&(this.center=this.center.wrap())},In.prototype.locationPoint=function(t){return this.coordinatePoint(this.locationCoordinate(t))},In.prototype.pointLocation=function(t){return this.coordinateLocation(this.pointCoordinate(t))},In.prototype.locationCoordinate=function(e){return t.MercatorCoordinate.fromLngLat(e)},In.prototype.coordinateLocation=function(t){return t.toLngLat()},In.prototype.pointCoordinate=function(e){var r=[e.x,e.y,0,1],n=[e.x,e.y,1,1];t.transformMat4(r,r,this.pixelMatrixInverse),t.transformMat4(n,n,this.pixelMatrixInverse);var i=r[3],a=n[3],o=r[0]/i,s=n[0]/a,l=r[1]/i,c=n[1]/a,u=r[2]/i,h=n[2]/a,f=u===h?0:(0-u)/(h-u);return new t.MercatorCoordinate(t.number(o,s,f)/this.worldSize,t.number(l,c,f)/this.worldSize)},In.prototype.coordinatePoint=function(e){var r=[e.x*this.worldSize,e.y*this.worldSize,0,1];return t.transformMat4(r,r,this.pixelMatrix),new t.Point(r[0]/r[3],r[1]/r[3])},In.prototype.getBounds=function(){return(new t.LngLatBounds).extend(this.pointLocation(new t.Point(0,0))).extend(this.pointLocation(new t.Point(this.width,0))).extend(this.pointLocation(new t.Point(this.width,this.height))).extend(this.pointLocation(new t.Point(0,this.height)))},In.prototype.getMaxBounds=function(){return this.latRange&&2===this.latRange.length&&this.lngRange&&2===this.lngRange.length?new t.LngLatBounds([this.lngRange[0],this.latRange[0]],[this.lngRange[1],this.latRange[1]]):null},In.prototype.setMaxBounds=function(t){t?(this.lngRange=[t.getWest(),t.getEast()],this.latRange=[t.getSouth(),t.getNorth()],this._constrain()):(this.lngRange=null,this.latRange=[-this.maxValidLatitude,this.maxValidLatitude])},In.prototype.calculatePosMatrix=function(e,r){void 0===r&&(r=!1);var n=e.key,i=r?this._alignedPosMatrixCache:this._posMatrixCache;if(i[n])return i[n];var a=e.canonical,o=this.worldSize/this.zoomScale(a.z),s=a.x+Math.pow(2,a.z)*e.wrap,l=t.identity(new Float64Array(16));return t.translate(l,l,[s*o,a.y*o,0]),t.scale(l,l,[o/t.EXTENT,o/t.EXTENT,1]),t.multiply(l,r?this.alignedProjMatrix:this.projMatrix,l),i[n]=new Float32Array(l),i[n]},In.prototype.customLayerMatrix=function(){return this.mercatorMatrix.slice()},In.prototype._constrain=function(){if(this.center&&this.width&&this.height&&!this._constraining){this._constraining=!0;var e,r,n,i,a=-90,o=90,s=-180,l=180,c=this.size,u=this._unmodified;if(this.latRange){var h=this.latRange;a=t.mercatorYfromLat(h[1])*this.worldSize,e=(o=t.mercatorYfromLat(h[0])*this.worldSize)-ao&&(i=o-g)}if(this.lngRange){var y=p.x,v=c.x/2;y-vl&&(n=l-v)}void 0===n&&void 0===i||(this.center=this.unproject(new t.Point(void 0!==n?n:p.x,void 0!==i?i:p.y))),this._unmodified=u,this._constraining=!1}},In.prototype._calcMatrices=function(){if(this.height){var e=this._fov/2,r=this.centerOffset;this.cameraToCenterDistance=.5/Math.tan(e)*this.height;var n=Math.PI/2+this._pitch,i=this._fov*(.5+r.y/this.height),a=Math.sin(i)*this.cameraToCenterDistance/Math.sin(t.clamp(Math.PI-n-i,.01,Math.PI-.01)),o=this.point,s=o.x,l=o.y,c=1.01*(Math.cos(Math.PI/2-this._pitch)*a+this.cameraToCenterDistance),u=this.height/50,h=new Float64Array(16);t.perspective(h,this._fov,this.width/this.height,u,c),h[8]=2*-r.x/this.width,h[9]=2*r.y/this.height,t.scale(h,h,[1,-1,1]),t.translate(h,h,[0,0,-this.cameraToCenterDistance]),t.rotateX(h,h,this._pitch),t.rotateZ(h,h,this.angle),t.translate(h,h,[-s,-l,0]),this.mercatorMatrix=t.scale([],h,[this.worldSize,this.worldSize,this.worldSize]),t.scale(h,h,[1,1,t.mercatorZfromAltitude(1,this.center.lat)*this.worldSize,1]),this.projMatrix=h,this.invProjMatrix=t.invert([],this.projMatrix);var f=this.width%2/2,p=this.height%2/2,d=Math.cos(this.angle),m=Math.sin(this.angle),g=s-Math.round(s)+d*f+m*p,y=l-Math.round(l)+d*p+m*f,v=new Float64Array(h);if(t.translate(v,v,[g>.5?g-1:g,y>.5?y-1:y,0]),this.alignedProjMatrix=v,h=t.create(),t.scale(h,h,[this.width/2,-this.height/2,1]),t.translate(h,h,[1,-1,0]),this.labelPlaneMatrix=h,h=t.create(),t.scale(h,h,[1,-1,1]),t.translate(h,h,[-1,-1,0]),t.scale(h,h,[2/this.width,2/this.height,1]),this.glCoordMatrix=h,this.pixelMatrix=t.multiply(new Float64Array(16),this.labelPlaneMatrix,this.projMatrix),!(h=t.invert(new Float64Array(16),this.pixelMatrix)))throw new Error(\"failed to invert matrix\");this.pixelMatrixInverse=h,this._posMatrixCache={},this._alignedPosMatrixCache={}}},In.prototype.maxPitchScaleFactor=function(){if(!this.pixelMatrixInverse)return 1;var e=this.pointCoordinate(new t.Point(0,0)),r=[e.x*this.worldSize,e.y*this.worldSize,0,1];return t.transformMat4(r,r,this.pixelMatrix)[3]/this.cameraToCenterDistance},In.prototype.getCameraPoint=function(){var e=this._pitch,r=Math.tan(e)*(this.cameraToCenterDistance||1);return this.centerPoint.add(new t.Point(0,r))},In.prototype.getCameraQueryGeometry=function(e){var r=this.getCameraPoint();if(1===e.length)return[e[0],r];for(var n=r.x,i=r.y,a=r.x,o=r.y,s=0,l=e;s=3&&!t.some((function(t){return isNaN(t)}))){var e=this._map.dragRotate.isEnabled()&&this._map.touchZoomRotate.isEnabled()?+(t[3]||0):this._map.getBearing();return this._map.jumpTo({center:[+t[2],+t[1]],zoom:+t[0],bearing:e,pitch:+(t[4]||0)}),!0}return!1},zn.prototype._updateHashUnthrottled=function(){var e=t.window.location.href.replace(/(#.+)?$/,this.getHashString());try{t.window.history.replaceState(t.window.history.state,null,e)}catch(t){}};var On={linearity:.3,easing:t.bezier(0,0,.3,1)},Dn=t.extend({deceleration:2500,maxSpeed:1400},On),Rn=t.extend({deceleration:20,maxSpeed:1400},On),Fn=t.extend({deceleration:1e3,maxSpeed:360},On),Bn=t.extend({deceleration:1e3,maxSpeed:90},On),Nn=function(t){this._map=t,this.clear()};function jn(t,e){(!t.duration||t.duration0&&r-e[0].time>160;)e.shift()},Nn.prototype._onMoveEnd=function(e){if(this._drainInertiaBuffer(),!(this._inertiaBuffer.length<2)){for(var r={zoom:0,bearing:0,pitch:0,pan:new t.Point(0,0),pinchAround:void 0,around:void 0},n=0,i=this._inertiaBuffer;n=this._clickTolerance||this._map.fire(new Vn(t.type,this._map,t))},Gn.prototype.dblclick=function(t){return this._firePreventable(new Vn(t.type,this._map,t))},Gn.prototype.mouseover=function(t){this._map.fire(new Vn(t.type,this._map,t))},Gn.prototype.mouseout=function(t){this._map.fire(new Vn(t.type,this._map,t))},Gn.prototype.touchstart=function(t){return this._firePreventable(new qn(t.type,this._map,t))},Gn.prototype.touchmove=function(t){this._map.fire(new qn(t.type,this._map,t))},Gn.prototype.touchend=function(t){this._map.fire(new qn(t.type,this._map,t))},Gn.prototype.touchcancel=function(t){this._map.fire(new qn(t.type,this._map,t))},Gn.prototype._firePreventable=function(t){if(this._map.fire(t),t.defaultPrevented)return{}},Gn.prototype.isEnabled=function(){return!0},Gn.prototype.isActive=function(){return!1},Gn.prototype.enable=function(){},Gn.prototype.disable=function(){};var Zn=function(t){this._map=t};Zn.prototype.reset=function(){this._delayContextMenu=!1,delete this._contextMenuEvent},Zn.prototype.mousemove=function(t){this._map.fire(new Vn(t.type,this._map,t))},Zn.prototype.mousedown=function(){this._delayContextMenu=!0},Zn.prototype.mouseup=function(){this._delayContextMenu=!1,this._contextMenuEvent&&(this._map.fire(new Vn(\"contextmenu\",this._map,this._contextMenuEvent)),delete this._contextMenuEvent)},Zn.prototype.contextmenu=function(t){this._delayContextMenu?this._contextMenuEvent=t:this._map.fire(new Vn(t.type,this._map,t)),this._map.listens(\"contextmenu\")&&t.preventDefault()},Zn.prototype.isEnabled=function(){return!0},Zn.prototype.isActive=function(){return!1},Zn.prototype.enable=function(){},Zn.prototype.disable=function(){};var Wn=function(t,e){this._map=t,this._el=t.getCanvasContainer(),this._container=t.getContainer(),this._clickTolerance=e.clickTolerance||1};function Yn(t,e){for(var r={},n=0;nthis.numTouches)&&(this.aborted=!0),this.aborted||(void 0===this.startTime&&(this.startTime=e.timeStamp),n.length===this.numTouches&&(this.centroid=function(e){for(var r=new t.Point(0,0),n=0,i=e;n30)&&(this.aborted=!0)}}},Xn.prototype.touchend=function(t,e,r){if((!this.centroid||t.timeStamp-this.startTime>500)&&(this.aborted=!0),0===r.length){var n=!this.aborted&&this.centroid;if(this.reset(),n)return n}};var $n=function(t){this.singleTap=new Xn(t),this.numTaps=t.numTaps,this.reset()};$n.prototype.reset=function(){this.lastTime=1/0,delete this.lastTap,this.count=0,this.singleTap.reset()},$n.prototype.touchstart=function(t,e,r){this.singleTap.touchstart(t,e,r)},$n.prototype.touchmove=function(t,e,r){this.singleTap.touchmove(t,e,r)},$n.prototype.touchend=function(t,e,r){var n=this.singleTap.touchend(t,e,r);if(n){var i=t.timeStamp-this.lastTime<500,a=!this.lastTap||this.lastTap.dist(n)<30;if(i&&a||this.reset(),this.count++,this.lastTime=t.timeStamp,this.lastTap=n,this.count===this.numTaps)return this.reset(),n}};var Jn=function(){this._zoomIn=new $n({numTouches:1,numTaps:2}),this._zoomOut=new $n({numTouches:2,numTaps:1}),this.reset()};Jn.prototype.reset=function(){this._active=!1,this._zoomIn.reset(),this._zoomOut.reset()},Jn.prototype.touchstart=function(t,e,r){this._zoomIn.touchstart(t,e,r),this._zoomOut.touchstart(t,e,r)},Jn.prototype.touchmove=function(t,e,r){this._zoomIn.touchmove(t,e,r),this._zoomOut.touchmove(t,e,r)},Jn.prototype.touchend=function(t,e,r){var n=this,i=this._zoomIn.touchend(t,e,r),a=this._zoomOut.touchend(t,e,r);return i?(this._active=!0,t.preventDefault(),setTimeout((function(){return n.reset()}),0),{cameraAnimation:function(e){return e.easeTo({duration:300,zoom:e.getZoom()+1,around:e.unproject(i)},{originalEvent:t})}}):a?(this._active=!0,t.preventDefault(),setTimeout((function(){return n.reset()}),0),{cameraAnimation:function(e){return e.easeTo({duration:300,zoom:e.getZoom()-1,around:e.unproject(a)},{originalEvent:t})}}):void 0},Jn.prototype.touchcancel=function(){this.reset()},Jn.prototype.enable=function(){this._enabled=!0},Jn.prototype.disable=function(){this._enabled=!1,this.reset()},Jn.prototype.isEnabled=function(){return this._enabled},Jn.prototype.isActive=function(){return this._active};var Kn={};Kn[0]=1,Kn[2]=2;var Qn=function(t){this.reset(),this._clickTolerance=t.clickTolerance||1};Qn.prototype.reset=function(){this._active=!1,this._moved=!1,delete this._lastPoint,delete this._eventButton},Qn.prototype._correctButton=function(t,e){return!1},Qn.prototype._move=function(t,e){return{}},Qn.prototype.mousedown=function(t,e){if(!this._lastPoint){var n=r.mouseButton(t);this._correctButton(t,n)&&(this._lastPoint=e,this._eventButton=n)}},Qn.prototype.mousemoveWindow=function(t,e){var r=this._lastPoint;if(r)if(t.preventDefault(),function(t,e){var r=Kn[e];return void 0===t.buttons||(t.buttons&r)!==r}(t,this._eventButton))this.reset();else if(this._moved||!(e.dist(r)0&&(this._active=!0);var i=Yn(n,r),a=new t.Point(0,0),o=new t.Point(0,0),s=0;for(var l in i){var c=i[l],u=this._touches[l];u&&(a._add(c),o._add(c.sub(u)),s++,i[l]=c)}if(this._touches=i,!(sMath.abs(t.x)}var hi=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.reset=function(){t.prototype.reset.call(this),this._valid=void 0,delete this._firstMove,delete this._lastPoints},e.prototype._start=function(t){this._lastPoints=t,ui(t[0].sub(t[1]))&&(this._valid=!1)},e.prototype._move=function(t,e,r){var n=t[0].sub(this._lastPoints[0]),i=t[1].sub(this._lastPoints[1]);if(this._valid=this.gestureBeginsVertically(n,i,r.timeStamp),this._valid)return this._lastPoints=t,this._active=!0,{pitchDelta:(n.y+i.y)/2*-.5}},e.prototype.gestureBeginsVertically=function(t,e,r){if(void 0!==this._valid)return this._valid;var n=t.mag()>=2,i=e.mag()>=2;if(n||i){if(!n||!i)return void 0===this._firstMove&&(this._firstMove=r),r-this._firstMove<100&&void 0;var a=t.y>0==e.y>0;return ui(t)&&ui(e)&&a}},e}(ii),fi={panStep:100,bearingStep:15,pitchStep:10},pi=function(){var t=fi;this._panStep=t.panStep,this._bearingStep=t.bearingStep,this._pitchStep=t.pitchStep,this._rotationDisabled=!1};function di(t){return t*(2-t)}pi.prototype.reset=function(){this._active=!1},pi.prototype.keydown=function(t){var e=this;if(!(t.altKey||t.ctrlKey||t.metaKey)){var r=0,n=0,i=0,a=0,o=0;switch(t.keyCode){case 61:case 107:case 171:case 187:r=1;break;case 189:case 109:case 173:r=-1;break;case 37:t.shiftKey?n=-1:(t.preventDefault(),a=-1);break;case 39:t.shiftKey?n=1:(t.preventDefault(),a=1);break;case 38:t.shiftKey?i=1:(t.preventDefault(),o=-1);break;case 40:t.shiftKey?i=-1:(t.preventDefault(),o=1);break;default:return}return this._rotationDisabled&&(n=0,i=0),{cameraAnimation:function(s){var l=s.getZoom();s.easeTo({duration:300,easeId:\"keyboardHandler\",easing:di,zoom:r?Math.round(l)+r*(t.shiftKey?2:1):l,bearing:s.getBearing()+n*e._bearingStep,pitch:s.getPitch()+i*e._pitchStep,offset:[-a*e._panStep,-o*e._panStep],center:s.getCenter()},{originalEvent:t})}}}},pi.prototype.enable=function(){this._enabled=!0},pi.prototype.disable=function(){this._enabled=!1,this.reset()},pi.prototype.isEnabled=function(){return this._enabled},pi.prototype.isActive=function(){return this._active},pi.prototype.disableRotation=function(){this._rotationDisabled=!0},pi.prototype.enableRotation=function(){this._rotationDisabled=!1};var mi=4.000244140625,gi=function(e,r){this._map=e,this._el=e.getCanvasContainer(),this._handler=r,this._delta=0,this._defaultZoomRate=.01,this._wheelZoomRate=.0022222222222222222,t.bindAll([\"_onTimeout\"],this)};gi.prototype.setZoomRate=function(t){this._defaultZoomRate=t},gi.prototype.setWheelZoomRate=function(t){this._wheelZoomRate=t},gi.prototype.isEnabled=function(){return!!this._enabled},gi.prototype.isActive=function(){return!!this._active||void 0!==this._finishTimeout},gi.prototype.isZooming=function(){return!!this._zooming},gi.prototype.enable=function(t){this.isEnabled()||(this._enabled=!0,this._aroundCenter=t&&\"center\"===t.around)},gi.prototype.disable=function(){this.isEnabled()&&(this._enabled=!1)},gi.prototype.wheel=function(e){if(this.isEnabled()){var r=e.deltaMode===t.window.WheelEvent.DOM_DELTA_LINE?40*e.deltaY:e.deltaY,n=t.browser.now(),i=n-(this._lastWheelEventTime||0);this._lastWheelEventTime=n,0!==r&&r%mi==0?this._type=\"wheel\":0!==r&&Math.abs(r)<4?this._type=\"trackpad\":i>400?(this._type=null,this._lastValue=r,this._timeout=setTimeout(this._onTimeout,40,e)):this._type||(this._type=Math.abs(i*r)<200?\"trackpad\":\"wheel\",this._timeout&&(clearTimeout(this._timeout),this._timeout=null,r+=this._lastValue)),e.shiftKey&&r&&(r/=4),this._type&&(this._lastWheelEvent=e,this._delta-=r,this._active||this._start(e)),e.preventDefault()}},gi.prototype._onTimeout=function(t){this._type=\"wheel\",this._delta-=this._lastValue,this._active||this._start(t)},gi.prototype._start=function(e){if(this._delta){this._frameId&&(this._frameId=null),this._active=!0,this.isZooming()||(this._zooming=!0),this._finishTimeout&&(clearTimeout(this._finishTimeout),delete this._finishTimeout);var n=r.mousePos(this._el,e);this._around=t.LngLat.convert(this._aroundCenter?this._map.getCenter():this._map.unproject(n)),this._aroundPoint=this._map.transform.locationPoint(this._around),this._frameId||(this._frameId=!0,this._handler._triggerRenderFrame())}},gi.prototype.renderFrame=function(){var e=this;if(this._frameId&&(this._frameId=null,this.isActive())){var r=this._map.transform;if(0!==this._delta){var n=\"wheel\"===this._type&&Math.abs(this._delta)>mi?this._wheelZoomRate:this._defaultZoomRate,i=2/(1+Math.exp(-Math.abs(this._delta*n)));this._delta<0&&0!==i&&(i=1/i);var a=\"number\"==typeof this._targetZoom?r.zoomScale(this._targetZoom):r.scale;this._targetZoom=Math.min(r.maxZoom,Math.max(r.minZoom,r.scaleZoom(a*i))),\"wheel\"===this._type&&(this._startZoom=r.zoom,this._easing=this._smoothOutEasing(200)),this._delta=0}var o,s=\"number\"==typeof this._targetZoom?this._targetZoom:r.zoom,l=this._startZoom,c=this._easing,u=!1;if(\"wheel\"===this._type&&l&&c){var h=Math.min((t.browser.now()-this._lastWheelEventTime)/200,1),f=c(h);o=t.number(l,s,f),h<1?this._frameId||(this._frameId=!0):u=!0}else o=s,u=!0;return this._active=!0,u&&(this._active=!1,this._finishTimeout=setTimeout((function(){e._zooming=!1,e._handler._triggerRenderFrame(),delete e._targetZoom,delete e._finishTimeout}),200)),{noInertia:!0,needsRenderFrame:!u,zoomDelta:o-r.zoom,around:this._aroundPoint,originalEvent:this._lastWheelEvent}}},gi.prototype._smoothOutEasing=function(e){var r=t.ease;if(this._prevEase){var n=this._prevEase,i=(t.browser.now()-n.start)/n.duration,a=n.easing(i+.01)-n.easing(i),o=.27/Math.sqrt(a*a+1e-4)*.01,s=Math.sqrt(.0729-o*o);r=t.bezier(o,s,.25,1)}return this._prevEase={start:t.browser.now(),duration:e,easing:r},r},gi.prototype.reset=function(){this._active=!1};var yi=function(t,e){this._clickZoom=t,this._tapZoom=e};yi.prototype.enable=function(){this._clickZoom.enable(),this._tapZoom.enable()},yi.prototype.disable=function(){this._clickZoom.disable(),this._tapZoom.disable()},yi.prototype.isEnabled=function(){return this._clickZoom.isEnabled()&&this._tapZoom.isEnabled()},yi.prototype.isActive=function(){return this._clickZoom.isActive()||this._tapZoom.isActive()};var vi=function(){this.reset()};vi.prototype.reset=function(){this._active=!1},vi.prototype.dblclick=function(t,e){return t.preventDefault(),{cameraAnimation:function(r){r.easeTo({duration:300,zoom:r.getZoom()+(t.shiftKey?-1:1),around:r.unproject(e)},{originalEvent:t})}}},vi.prototype.enable=function(){this._enabled=!0},vi.prototype.disable=function(){this._enabled=!1,this.reset()},vi.prototype.isEnabled=function(){return this._enabled},vi.prototype.isActive=function(){return this._active};var xi=function(){this._tap=new $n({numTouches:1,numTaps:1}),this.reset()};xi.prototype.reset=function(){this._active=!1,delete this._swipePoint,delete this._swipeTouch,delete this._tapTime,this._tap.reset()},xi.prototype.touchstart=function(t,e,r){this._swipePoint||(this._tapTime&&t.timeStamp-this._tapTime>500&&this.reset(),this._tapTime?r.length>0&&(this._swipePoint=e[0],this._swipeTouch=r[0].identifier):this._tap.touchstart(t,e,r))},xi.prototype.touchmove=function(t,e,r){if(this._tapTime){if(this._swipePoint){if(r[0].identifier!==this._swipeTouch)return;var n=e[0],i=n.y-this._swipePoint.y;return this._swipePoint=n,t.preventDefault(),this._active=!0,{zoomDelta:i/128}}}else this._tap.touchmove(t,e,r)},xi.prototype.touchend=function(t,e,r){this._tapTime?this._swipePoint&&0===r.length&&this.reset():this._tap.touchend(t,e,r)&&(this._tapTime=t.timeStamp)},xi.prototype.touchcancel=function(){this.reset()},xi.prototype.enable=function(){this._enabled=!0},xi.prototype.disable=function(){this._enabled=!1,this.reset()},xi.prototype.isEnabled=function(){return this._enabled},xi.prototype.isActive=function(){return this._active};var _i=function(t,e,r){this._el=t,this._mousePan=e,this._touchPan=r};_i.prototype.enable=function(t){this._inertiaOptions=t||{},this._mousePan.enable(),this._touchPan.enable(),this._el.classList.add(\"mapboxgl-touch-drag-pan\")},_i.prototype.disable=function(){this._mousePan.disable(),this._touchPan.disable(),this._el.classList.remove(\"mapboxgl-touch-drag-pan\")},_i.prototype.isEnabled=function(){return this._mousePan.isEnabled()&&this._touchPan.isEnabled()},_i.prototype.isActive=function(){return this._mousePan.isActive()||this._touchPan.isActive()};var bi=function(t,e,r){this._pitchWithRotate=t.pitchWithRotate,this._mouseRotate=e,this._mousePitch=r};bi.prototype.enable=function(){this._mouseRotate.enable(),this._pitchWithRotate&&this._mousePitch.enable()},bi.prototype.disable=function(){this._mouseRotate.disable(),this._mousePitch.disable()},bi.prototype.isEnabled=function(){return this._mouseRotate.isEnabled()&&(!this._pitchWithRotate||this._mousePitch.isEnabled())},bi.prototype.isActive=function(){return this._mouseRotate.isActive()||this._mousePitch.isActive()};var wi=function(t,e,r,n){this._el=t,this._touchZoom=e,this._touchRotate=r,this._tapDragZoom=n,this._rotationDisabled=!1,this._enabled=!0};wi.prototype.enable=function(t){this._touchZoom.enable(t),this._rotationDisabled||this._touchRotate.enable(t),this._tapDragZoom.enable(),this._el.classList.add(\"mapboxgl-touch-zoom-rotate\")},wi.prototype.disable=function(){this._touchZoom.disable(),this._touchRotate.disable(),this._tapDragZoom.disable(),this._el.classList.remove(\"mapboxgl-touch-zoom-rotate\")},wi.prototype.isEnabled=function(){return this._touchZoom.isEnabled()&&(this._rotationDisabled||this._touchRotate.isEnabled())&&this._tapDragZoom.isEnabled()},wi.prototype.isActive=function(){return this._touchZoom.isActive()||this._touchRotate.isActive()||this._tapDragZoom.isActive()},wi.prototype.disableRotation=function(){this._rotationDisabled=!0,this._touchRotate.disable()},wi.prototype.enableRotation=function(){this._rotationDisabled=!1,this._touchZoom.isEnabled()&&this._touchRotate.enable()};var Ti=function(t){return t.zoom||t.drag||t.pitch||t.rotate},ki=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e}(t.Event);function Ai(t){return t.panDelta&&t.panDelta.mag()||t.zoomDelta||t.bearingDelta||t.pitchDelta}var Mi=function(e,n){this._map=e,this._el=this._map.getCanvasContainer(),this._handlers=[],this._handlersById={},this._changes=[],this._inertia=new Nn(e),this._bearingSnap=n.bearingSnap,this._previousActiveHandlers={},this._eventsInProgress={},this._addDefaultHandlers(n),t.bindAll([\"handleEvent\",\"handleWindowEvent\"],this);var i=this._el;this._listeners=[[i,\"touchstart\",{passive:!0}],[i,\"touchmove\",{passive:!1}],[i,\"touchend\",void 0],[i,\"touchcancel\",void 0],[i,\"mousedown\",void 0],[i,\"mousemove\",void 0],[i,\"mouseup\",void 0],[t.window.document,\"mousemove\",{capture:!0}],[t.window.document,\"mouseup\",void 0],[i,\"mouseover\",void 0],[i,\"mouseout\",void 0],[i,\"dblclick\",void 0],[i,\"click\",void 0],[i,\"keydown\",{capture:!1}],[i,\"keyup\",void 0],[i,\"wheel\",{passive:!1}],[i,\"contextmenu\",void 0],[t.window,\"blur\",void 0]];for(var a=0,o=this._listeners;aa?Math.min(2,b):Math.max(.5,b),w=Math.pow(g,1-e),T=i.unproject(x.add(_.mult(e*w)).mult(m));i.setLocationAtPoint(i.renderWorldCopies?T.wrap():T,d)}n._fireMoveEvents(r)}),(function(t){n._afterEase(r,t)}),e),this},r.prototype._prepareEase=function(e,r,n){void 0===n&&(n={}),this._moving=!0,r||n.moving||this.fire(new t.Event(\"movestart\",e)),this._zooming&&!n.zooming&&this.fire(new t.Event(\"zoomstart\",e)),this._rotating&&!n.rotating&&this.fire(new t.Event(\"rotatestart\",e)),this._pitching&&!n.pitching&&this.fire(new t.Event(\"pitchstart\",e))},r.prototype._fireMoveEvents=function(e){this.fire(new t.Event(\"move\",e)),this._zooming&&this.fire(new t.Event(\"zoom\",e)),this._rotating&&this.fire(new t.Event(\"rotate\",e)),this._pitching&&this.fire(new t.Event(\"pitch\",e))},r.prototype._afterEase=function(e,r){if(!this._easeId||!r||this._easeId!==r){delete this._easeId;var n=this._zooming,i=this._rotating,a=this._pitching;this._moving=!1,this._zooming=!1,this._rotating=!1,this._pitching=!1,this._padding=!1,n&&this.fire(new t.Event(\"zoomend\",e)),i&&this.fire(new t.Event(\"rotateend\",e)),a&&this.fire(new t.Event(\"pitchend\",e)),this.fire(new t.Event(\"moveend\",e))}},r.prototype.flyTo=function(e,r){var n=this;if(!e.essential&&t.browser.prefersReducedMotion){var i=t.pick(e,[\"center\",\"zoom\",\"bearing\",\"pitch\",\"around\"]);return this.jumpTo(i,r)}this.stop(),e=t.extend({offset:[0,0],speed:1.2,curve:1.42,easing:t.ease},e);var a=this.transform,o=this.getZoom(),s=this.getBearing(),l=this.getPitch(),c=this.getPadding(),u=\"zoom\"in e?t.clamp(+e.zoom,a.minZoom,a.maxZoom):o,h=\"bearing\"in e?this._normalizeBearing(e.bearing,s):s,f=\"pitch\"in e?+e.pitch:l,p=\"padding\"in e?e.padding:a.padding,d=a.zoomScale(u-o),m=t.Point.convert(e.offset),g=a.centerPoint.add(m),y=a.pointLocation(g),v=t.LngLat.convert(e.center||y);this._normalizeCenter(v);var x=a.project(y),_=a.project(v).sub(x),b=e.curve,w=Math.max(a.width,a.height),T=w/d,k=_.mag();if(\"minZoom\"in e){var A=t.clamp(Math.min(e.minZoom,o,u),a.minZoom,a.maxZoom),M=w/a.zoomScale(A-o);b=Math.sqrt(M/k*2)}var S=b*b;function E(t){var e=(T*T-w*w+(t?-1:1)*S*S*k*k)/(2*(t?T:w)*S*k);return Math.log(Math.sqrt(e*e+1)-e)}function C(t){return(Math.exp(t)-Math.exp(-t))/2}function L(t){return(Math.exp(t)+Math.exp(-t))/2}var I=E(0),P=function(t){return L(I)/L(I+b*t)},z=function(t){return w*((L(I)*(C(e=I+b*t)/L(e))-C(I))/S)/k;var e},O=(E(1)-I)/b;if(Math.abs(k)<1e-6||!isFinite(O)){if(Math.abs(w-T)<1e-6)return this.easeTo(e,r);var D=Te.maxDuration&&(e.duration=0),this._zooming=!0,this._rotating=s!==h,this._pitching=f!==l,this._padding=!a.isPaddingEqual(p),this._prepareEase(r,!1),this._ease((function(e){var i=e*O,d=1/P(i);a.zoom=1===e?u:o+a.scaleZoom(d),n._rotating&&(a.bearing=t.number(s,h,e)),n._pitching&&(a.pitch=t.number(l,f,e)),n._padding&&(a.interpolatePadding(c,p,e),g=a.centerPoint.add(m));var y=1===e?v:a.unproject(x.add(_.mult(z(i))).mult(d));a.setLocationAtPoint(a.renderWorldCopies?y.wrap():y,g),n._fireMoveEvents(r)}),(function(){return n._afterEase(r)}),e),this},r.prototype.isEasing=function(){return!!this._easeFrameId},r.prototype.stop=function(){return this._stop()},r.prototype._stop=function(t,e){if(this._easeFrameId&&(this._cancelRenderFrame(this._easeFrameId),delete this._easeFrameId,delete this._onEaseFrame),this._onEaseEnd){var r=this._onEaseEnd;delete this._onEaseEnd,r.call(this,e)}if(!t){var n=this.handlers;n&&n.stop(!1)}return this},r.prototype._ease=function(e,r,n){!1===n.animate||0===n.duration?(e(1),r()):(this._easeStart=t.browser.now(),this._easeOptions=n,this._onEaseFrame=e,this._onEaseEnd=r,this._easeFrameId=this._requestRenderFrame(this._renderFrameCallback))},r.prototype._renderFrameCallback=function(){var e=Math.min((t.browser.now()-this._easeStart)/this._easeOptions.duration,1);this._onEaseFrame(this._easeOptions.easing(e)),e<1?this._easeFrameId=this._requestRenderFrame(this._renderFrameCallback):this.stop()},r.prototype._normalizeBearing=function(e,r){e=t.wrap(e,-180,180);var n=Math.abs(e-r);return Math.abs(e-360-r)180?-360:r<-180?360:0}},r}(t.Evented),Ei=function(e){void 0===e&&(e={}),this.options=e,t.bindAll([\"_toggleAttribution\",\"_updateEditLink\",\"_updateData\",\"_updateCompact\"],this)};Ei.prototype.getDefaultPosition=function(){return\"bottom-right\"},Ei.prototype.onAdd=function(t){var e=this.options&&this.options.compact;return this._map=t,this._container=r.create(\"div\",\"mapboxgl-ctrl mapboxgl-ctrl-attrib\"),this._compactButton=r.create(\"button\",\"mapboxgl-ctrl-attrib-button\",this._container),this._compactButton.addEventListener(\"click\",this._toggleAttribution),this._setElementTitle(this._compactButton,\"ToggleAttribution\"),this._innerContainer=r.create(\"div\",\"mapboxgl-ctrl-attrib-inner\",this._container),this._innerContainer.setAttribute(\"role\",\"list\"),e&&this._container.classList.add(\"mapboxgl-compact\"),this._updateAttributions(),this._updateEditLink(),this._map.on(\"styledata\",this._updateData),this._map.on(\"sourcedata\",this._updateData),this._map.on(\"moveend\",this._updateEditLink),void 0===e&&(this._map.on(\"resize\",this._updateCompact),this._updateCompact()),this._container},Ei.prototype.onRemove=function(){r.remove(this._container),this._map.off(\"styledata\",this._updateData),this._map.off(\"sourcedata\",this._updateData),this._map.off(\"moveend\",this._updateEditLink),this._map.off(\"resize\",this._updateCompact),this._map=void 0,this._attribHTML=void 0},Ei.prototype._setElementTitle=function(t,e){var r=this._map._getUIString(\"AttributionControl.\"+e);t.title=r,t.setAttribute(\"aria-label\",r)},Ei.prototype._toggleAttribution=function(){this._container.classList.contains(\"mapboxgl-compact-show\")?(this._container.classList.remove(\"mapboxgl-compact-show\"),this._compactButton.setAttribute(\"aria-pressed\",\"false\")):(this._container.classList.add(\"mapboxgl-compact-show\"),this._compactButton.setAttribute(\"aria-pressed\",\"true\"))},Ei.prototype._updateEditLink=function(){var e=this._editLink;e||(e=this._editLink=this._container.querySelector(\".mapbox-improve-map\"));var r=[{key:\"owner\",value:this.styleOwner},{key:\"id\",value:this.styleId},{key:\"access_token\",value:this._map._requestManager._customAccessToken||t.config.ACCESS_TOKEN}];if(e){var n=r.reduce((function(t,e,n){return e.value&&(t+=e.key+\"=\"+e.value+(n=0)return!1;return!0}))).join(\" | \");o!==this._attribHTML&&(this._attribHTML=o,t.length?(this._innerContainer.innerHTML=o,this._container.classList.remove(\"mapboxgl-attrib-empty\")):this._container.classList.add(\"mapboxgl-attrib-empty\"),this._editLink=null)}},Ei.prototype._updateCompact=function(){this._map.getCanvasContainer().offsetWidth<=640?this._container.classList.add(\"mapboxgl-compact\"):this._container.classList.remove(\"mapboxgl-compact\",\"mapboxgl-compact-show\")};var Ci=function(){t.bindAll([\"_updateLogo\"],this),t.bindAll([\"_updateCompact\"],this)};Ci.prototype.onAdd=function(t){this._map=t,this._container=r.create(\"div\",\"mapboxgl-ctrl\");var e=r.create(\"a\",\"mapboxgl-ctrl-logo\");return e.target=\"_blank\",e.rel=\"noopener nofollow\",e.href=\"https://www.mapbox.com/\",e.setAttribute(\"aria-label\",this._map._getUIString(\"LogoControl.Title\")),e.setAttribute(\"rel\",\"noopener nofollow\"),this._container.appendChild(e),this._container.style.display=\"none\",this._map.on(\"sourcedata\",this._updateLogo),this._updateLogo(),this._map.on(\"resize\",this._updateCompact),this._updateCompact(),this._container},Ci.prototype.onRemove=function(){r.remove(this._container),this._map.off(\"sourcedata\",this._updateLogo),this._map.off(\"resize\",this._updateCompact)},Ci.prototype.getDefaultPosition=function(){return\"bottom-left\"},Ci.prototype._updateLogo=function(t){t&&\"metadata\"!==t.sourceDataType||(this._container.style.display=this._logoRequired()?\"block\":\"none\")},Ci.prototype._logoRequired=function(){if(this._map.style){var t=this._map.style.sourceCaches;for(var e in t)if(t[e].getSource().mapbox_logo)return!0;return!1}},Ci.prototype._updateCompact=function(){var t=this._container.children;if(t.length){var e=t[0];this._map.getCanvasContainer().offsetWidth<250?e.classList.add(\"mapboxgl-compact\"):e.classList.remove(\"mapboxgl-compact\")}};var Li=function(){this._queue=[],this._id=0,this._cleared=!1,this._currentlyRunning=!1};Li.prototype.add=function(t){var e=++this._id;return this._queue.push({callback:t,id:e,cancelled:!1}),e},Li.prototype.remove=function(t){for(var e=this._currentlyRunning,r=0,n=e?this._queue.concat(e):this._queue;re.maxZoom)throw new Error(\"maxZoom must be greater than or equal to minZoom\");if(null!=e.minPitch&&null!=e.maxPitch&&e.minPitch>e.maxPitch)throw new Error(\"maxPitch must be greater than or equal to minPitch\");if(null!=e.minPitch&&e.minPitch<0)throw new Error(\"minPitch must be greater than or equal to 0\");if(null!=e.maxPitch&&e.maxPitch>Di)throw new Error(\"maxPitch must be less than or equal to 60\");var i=new In(e.minZoom,e.maxZoom,e.minPitch,e.maxPitch,e.renderWorldCopies);if(n.call(this,i,e),this._interactive=e.interactive,this._maxTileCacheSize=e.maxTileCacheSize,this._failIfMajorPerformanceCaveat=e.failIfMajorPerformanceCaveat,this._preserveDrawingBuffer=e.preserveDrawingBuffer,this._antialias=e.antialias,this._trackResize=e.trackResize,this._bearingSnap=e.bearingSnap,this._refreshExpiredTiles=e.refreshExpiredTiles,this._fadeDuration=e.fadeDuration,this._crossSourceCollisions=e.crossSourceCollisions,this._crossFadingFactor=1,this._collectResourceTiming=e.collectResourceTiming,this._renderTaskQueue=new Li,this._controls=[],this._mapId=t.uniqueId(),this._locale=t.extend({},Ii,e.locale),this._clickTolerance=e.clickTolerance,this._requestManager=new t.RequestManager(e.transformRequest,e.accessToken),\"string\"==typeof e.container){if(this._container=t.window.document.getElementById(e.container),!this._container)throw new Error(\"Container '\"+e.container+\"' not found.\")}else{if(!(e.container instanceof zi))throw new Error(\"Invalid type: 'container' must be a String or HTMLElement.\");this._container=e.container}if(e.maxBounds&&this.setMaxBounds(e.maxBounds),t.bindAll([\"_onWindowOnline\",\"_onWindowResize\",\"_onMapScroll\",\"_contextLost\",\"_contextRestored\"],this),this._setupContainer(),this._setupPainter(),void 0===this.painter)throw new Error(\"Failed to initialize WebGL.\");this.on(\"move\",(function(){return r._update(!1)})),this.on(\"moveend\",(function(){return r._update(!1)})),this.on(\"zoom\",(function(){return r._update(!0)})),void 0!==t.window&&(t.window.addEventListener(\"online\",this._onWindowOnline,!1),t.window.addEventListener(\"resize\",this._onWindowResize,!1),t.window.addEventListener(\"orientationchange\",this._onWindowResize,!1)),this.handlers=new Mi(this,e);var a=\"string\"==typeof e.hash&&e.hash||void 0;this._hash=e.hash&&new zn(a).addTo(this),this._hash&&this._hash._onHashChange()||(this.jumpTo({center:e.center,zoom:e.zoom,bearing:e.bearing,pitch:e.pitch}),e.bounds&&(this.resize(),this.fitBounds(e.bounds,t.extend({},e.fitBoundsOptions,{duration:0})))),this.resize(),this._localIdeographFontFamily=e.localIdeographFontFamily,e.style&&this.setStyle(e.style,{localIdeographFontFamily:e.localIdeographFontFamily}),e.attributionControl&&this.addControl(new Ei({customAttribution:e.customAttribution})),this.addControl(new Ci,e.logoPosition),this.on(\"style.load\",(function(){r.transform.unmodified&&r.jumpTo(r.style.stylesheet)})),this.on(\"data\",(function(e){r._update(\"style\"===e.dataType),r.fire(new t.Event(e.dataType+\"data\",e))})),this.on(\"dataloading\",(function(e){r.fire(new t.Event(e.dataType+\"dataloading\",e))}))}n&&(i.__proto__=n),i.prototype=Object.create(n&&n.prototype),i.prototype.constructor=i;var a={showTileBoundaries:{configurable:!0},showPadding:{configurable:!0},showCollisionBoxes:{configurable:!0},showOverdrawInspector:{configurable:!0},repaint:{configurable:!0},vertices:{configurable:!0},version:{configurable:!0}};return i.prototype._getMapId=function(){return this._mapId},i.prototype.addControl=function(e,r){if(void 0===r&&(r=e.getDefaultPosition?e.getDefaultPosition():\"top-right\"),!e||!e.onAdd)return this.fire(new t.ErrorEvent(new Error(\"Invalid argument to map.addControl(). Argument must be a control with onAdd and onRemove methods.\")));var n=e.onAdd(this);this._controls.push(e);var i=this._controlPositions[r];return-1!==r.indexOf(\"bottom\")?i.insertBefore(n,i.firstChild):i.appendChild(n),this},i.prototype.removeControl=function(e){if(!e||!e.onRemove)return this.fire(new t.ErrorEvent(new Error(\"Invalid argument to map.removeControl(). Argument must be a control with onAdd and onRemove methods.\")));var r=this._controls.indexOf(e);return r>-1&&this._controls.splice(r,1),e.onRemove(this),this},i.prototype.hasControl=function(t){return this._controls.indexOf(t)>-1},i.prototype.resize=function(e){var r=this._containerDimensions(),n=r[0],i=r[1];this._resizeCanvas(n,i),this.transform.resize(n,i),this.painter.resize(n,i);var a=!this._moving;return a&&(this.stop(),this.fire(new t.Event(\"movestart\",e)).fire(new t.Event(\"move\",e))),this.fire(new t.Event(\"resize\",e)),a&&this.fire(new t.Event(\"moveend\",e)),this},i.prototype.getBounds=function(){return this.transform.getBounds()},i.prototype.getMaxBounds=function(){return this.transform.getMaxBounds()},i.prototype.setMaxBounds=function(e){return this.transform.setMaxBounds(t.LngLatBounds.convert(e)),this._update()},i.prototype.setMinZoom=function(t){if((t=null==t?-2:t)>=-2&&t<=this.transform.maxZoom)return this.transform.minZoom=t,this._update(),this.getZoom()=this.transform.minZoom)return this.transform.maxZoom=t,this._update(),this.getZoom()>t&&this.setZoom(t),this;throw new Error(\"maxZoom must be greater than the current minZoom\")},i.prototype.getMaxZoom=function(){return this.transform.maxZoom},i.prototype.setMinPitch=function(t){if((t=null==t?0:t)<0)throw new Error(\"minPitch must be greater than or equal to 0\");if(t>=0&&t<=this.transform.maxPitch)return this.transform.minPitch=t,this._update(),this.getPitch()Di)throw new Error(\"maxPitch must be less than or equal to 60\");if(t>=this.transform.minPitch)return this.transform.maxPitch=t,this._update(),this.getPitch()>t&&this.setPitch(t),this;throw new Error(\"maxPitch must be greater than the current minPitch\")},i.prototype.getMaxPitch=function(){return this.transform.maxPitch},i.prototype.getRenderWorldCopies=function(){return this.transform.renderWorldCopies},i.prototype.setRenderWorldCopies=function(t){return this.transform.renderWorldCopies=t,this._update()},i.prototype.project=function(e){return this.transform.locationPoint(t.LngLat.convert(e))},i.prototype.unproject=function(e){return this.transform.pointLocation(t.Point.convert(e))},i.prototype.isMoving=function(){return this._moving||this.handlers.isMoving()},i.prototype.isZooming=function(){return this._zooming||this.handlers.isZooming()},i.prototype.isRotating=function(){return this._rotating||this.handlers.isRotating()},i.prototype._createDelegatedListener=function(t,e,r){var n,i=this;if(\"mouseenter\"===t||\"mouseover\"===t){var a=!1;return{layer:e,listener:r,delegates:{mousemove:function(n){var o=i.getLayer(e)?i.queryRenderedFeatures(n.point,{layers:[e]}):[];o.length?a||(a=!0,r.call(i,new Vn(t,i,n.originalEvent,{features:o}))):a=!1},mouseout:function(){a=!1}}}}if(\"mouseleave\"===t||\"mouseout\"===t){var o=!1;return{layer:e,listener:r,delegates:{mousemove:function(n){(i.getLayer(e)?i.queryRenderedFeatures(n.point,{layers:[e]}):[]).length?o=!0:o&&(o=!1,r.call(i,new Vn(t,i,n.originalEvent)))},mouseout:function(e){o&&(o=!1,r.call(i,new Vn(t,i,e.originalEvent)))}}}}return{layer:e,listener:r,delegates:(n={},n[t]=function(t){var n=i.getLayer(e)?i.queryRenderedFeatures(t.point,{layers:[e]}):[];n.length&&(t.features=n,r.call(i,t),delete t.features)},n)}},i.prototype.on=function(t,e,r){if(void 0===r)return n.prototype.on.call(this,t,e);var i=this._createDelegatedListener(t,e,r);for(var a in this._delegatedListeners=this._delegatedListeners||{},this._delegatedListeners[t]=this._delegatedListeners[t]||[],this._delegatedListeners[t].push(i),i.delegates)this.on(a,i.delegates[a]);return this},i.prototype.once=function(t,e,r){if(void 0===r)return n.prototype.once.call(this,t,e);var i=this._createDelegatedListener(t,e,r);for(var a in i.delegates)this.once(a,i.delegates[a]);return this},i.prototype.off=function(t,e,r){var i=this;if(void 0===r)return n.prototype.off.call(this,t,e);return this._delegatedListeners&&this._delegatedListeners[t]&&function(n){for(var a=n[t],o=0;o180;){var s=n.locationPoint(e);if(s.x>=0&&s.y>=0&&s.x<=n.width&&s.y<=n.height)break;e.lng>n.center.lng?e.lng-=360:e.lng+=360}return e}Ui.prototype.down=function(t,e){this.mouseRotate.mousedown(t,e),this.mousePitch&&this.mousePitch.mousedown(t,e),r.disableDrag()},Ui.prototype.move=function(t,e){var r=this.map,n=this.mouseRotate.mousemoveWindow(t,e);if(n&&n.bearingDelta&&r.setBearing(r.getBearing()+n.bearingDelta),this.mousePitch){var i=this.mousePitch.mousemoveWindow(t,e);i&&i.pitchDelta&&r.setPitch(r.getPitch()+i.pitchDelta)}},Ui.prototype.off=function(){var t=this.element;r.removeEventListener(t,\"mousedown\",this.mousedown),r.removeEventListener(t,\"touchstart\",this.touchstart,{passive:!1}),r.removeEventListener(t,\"touchmove\",this.touchmove),r.removeEventListener(t,\"touchend\",this.touchend),r.removeEventListener(t,\"touchcancel\",this.reset),this.offTemp()},Ui.prototype.offTemp=function(){r.enableDrag(),r.removeEventListener(t.window,\"mousemove\",this.mousemove),r.removeEventListener(t.window,\"mouseup\",this.mouseup)},Ui.prototype.mousedown=function(e){this.down(t.extend({},e,{ctrlKey:!0,preventDefault:function(){return e.preventDefault()}}),r.mousePos(this.element,e)),r.addEventListener(t.window,\"mousemove\",this.mousemove),r.addEventListener(t.window,\"mouseup\",this.mouseup)},Ui.prototype.mousemove=function(t){this.move(t,r.mousePos(this.element,t))},Ui.prototype.mouseup=function(t){this.mouseRotate.mouseupWindow(t),this.mousePitch&&this.mousePitch.mouseupWindow(t),this.offTemp()},Ui.prototype.touchstart=function(t){1!==t.targetTouches.length?this.reset():(this._startPos=this._lastPos=r.touchPos(this.element,t.targetTouches)[0],this.down({type:\"mousedown\",button:0,ctrlKey:!0,preventDefault:function(){return t.preventDefault()}},this._startPos))},Ui.prototype.touchmove=function(t){1!==t.targetTouches.length?this.reset():(this._lastPos=r.touchPos(this.element,t.targetTouches)[0],this.move({preventDefault:function(){return t.preventDefault()}},this._lastPos))},Ui.prototype.touchend=function(t){0===t.targetTouches.length&&this._startPos&&this._lastPos&&this._startPos.dist(this._lastPos)=r}this._isDragging&&(this._pos=e.point.sub(this._positionDelta),this._lngLat=this._map.unproject(this._pos),this.setLngLat(this._lngLat),this._element.style.pointerEvents=\"none\",\"pending\"===this._state&&(this._state=\"active\",this.fire(new t.Event(\"dragstart\"))),this.fire(new t.Event(\"drag\")))},n.prototype._onUp=function(){this._element.style.pointerEvents=\"auto\",this._positionDelta=null,this._pointerdownPos=null,this._isDragging=!1,this._map.off(\"mousemove\",this._onMove),this._map.off(\"touchmove\",this._onMove),\"active\"===this._state&&this.fire(new t.Event(\"dragend\")),this._state=\"inactive\"},n.prototype._addDragHandler=function(t){this._element.contains(t.originalEvent.target)&&(t.preventDefault(),this._positionDelta=t.point.sub(this._pos).add(this._offset),this._pointerdownPos=t.point,this._state=\"pending\",this._map.on(\"mousemove\",this._onMove),this._map.on(\"touchmove\",this._onMove),this._map.once(\"mouseup\",this._onUp),this._map.once(\"touchend\",this._onUp))},n.prototype.setDraggable=function(t){return this._draggable=!!t,this._map&&(t?(this._map.on(\"mousedown\",this._addDragHandler),this._map.on(\"touchstart\",this._addDragHandler)):(this._map.off(\"mousedown\",this._addDragHandler),this._map.off(\"touchstart\",this._addDragHandler))),this},n.prototype.isDraggable=function(){return this._draggable},n.prototype.setRotation=function(t){return this._rotation=t||0,this._update(),this},n.prototype.getRotation=function(){return this._rotation},n.prototype.setRotationAlignment=function(t){return this._rotationAlignment=t||\"auto\",this._update(),this},n.prototype.getRotationAlignment=function(){return this._rotationAlignment},n.prototype.setPitchAlignment=function(t){return this._pitchAlignment=t&&\"auto\"!==t?t:this._rotationAlignment,this._update(),this},n.prototype.getPitchAlignment=function(){return this._pitchAlignment},n}(t.Evented),Wi={positionOptions:{enableHighAccuracy:!1,maximumAge:0,timeout:6e3},fitBoundsOptions:{maxZoom:15},trackUserLocation:!1,showAccuracyCircle:!0,showUserLocation:!0};var Yi=0,Xi=!1,$i=function(e){function n(r){e.call(this),this.options=t.extend({},Wi,r),t.bindAll([\"_onSuccess\",\"_onError\",\"_onZoom\",\"_finish\",\"_setupUI\",\"_updateCamera\",\"_updateMarker\"],this)}return e&&(n.__proto__=e),n.prototype=Object.create(e&&e.prototype),n.prototype.constructor=n,n.prototype.onAdd=function(e){return this._map=e,this._container=r.create(\"div\",\"mapboxgl-ctrl mapboxgl-ctrl-group\"),n=this._setupUI,void 0!==Gi?n(Gi):void 0!==t.window.navigator.permissions?t.window.navigator.permissions.query({name:\"geolocation\"}).then((function(t){Gi=\"denied\"!==t.state,n(Gi)})):(Gi=!!t.window.navigator.geolocation,n(Gi)),this._container;var n},n.prototype.onRemove=function(){void 0!==this._geolocationWatchID&&(t.window.navigator.geolocation.clearWatch(this._geolocationWatchID),this._geolocationWatchID=void 0),this.options.showUserLocation&&this._userLocationDotMarker&&this._userLocationDotMarker.remove(),this.options.showAccuracyCircle&&this._accuracyCircleMarker&&this._accuracyCircleMarker.remove(),r.remove(this._container),this._map.off(\"zoom\",this._onZoom),this._map=void 0,Yi=0,Xi=!1},n.prototype._isOutOfMapMaxBounds=function(t){var e=this._map.getMaxBounds(),r=t.coords;return e&&(r.longitudee.getEast()||r.latitudee.getNorth())},n.prototype._setErrorState=function(){switch(this._watchState){case\"WAITING_ACTIVE\":this._watchState=\"ACTIVE_ERROR\",this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-active\"),this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-active-error\");break;case\"ACTIVE_LOCK\":this._watchState=\"ACTIVE_ERROR\",this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-active\"),this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-active-error\"),this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-waiting\");break;case\"BACKGROUND\":this._watchState=\"BACKGROUND_ERROR\",this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-background\"),this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-background-error\"),this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-waiting\")}},n.prototype._onSuccess=function(e){if(this._map){if(this._isOutOfMapMaxBounds(e))return this._setErrorState(),this.fire(new t.Event(\"outofmaxbounds\",e)),this._updateMarker(),void this._finish();if(this.options.trackUserLocation)switch(this._lastKnownPosition=e,this._watchState){case\"WAITING_ACTIVE\":case\"ACTIVE_LOCK\":case\"ACTIVE_ERROR\":this._watchState=\"ACTIVE_LOCK\",this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-waiting\"),this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-active-error\"),this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-active\");break;case\"BACKGROUND\":case\"BACKGROUND_ERROR\":this._watchState=\"BACKGROUND\",this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-waiting\"),this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-background-error\"),this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-background\")}this.options.showUserLocation&&\"OFF\"!==this._watchState&&this._updateMarker(e),this.options.trackUserLocation&&\"ACTIVE_LOCK\"!==this._watchState||this._updateCamera(e),this.options.showUserLocation&&this._dotElement.classList.remove(\"mapboxgl-user-location-dot-stale\"),this.fire(new t.Event(\"geolocate\",e)),this._finish()}},n.prototype._updateCamera=function(e){var r=new t.LngLat(e.coords.longitude,e.coords.latitude),n=e.coords.accuracy,i=this._map.getBearing(),a=t.extend({bearing:i},this.options.fitBoundsOptions);this._map.fitBounds(r.toBounds(n),a,{geolocateSource:!0})},n.prototype._updateMarker=function(e){if(e){var r=new t.LngLat(e.coords.longitude,e.coords.latitude);this._accuracyCircleMarker.setLngLat(r).addTo(this._map),this._userLocationDotMarker.setLngLat(r).addTo(this._map),this._accuracy=e.coords.accuracy,this.options.showUserLocation&&this.options.showAccuracyCircle&&this._updateCircleRadius()}else this._userLocationDotMarker.remove(),this._accuracyCircleMarker.remove()},n.prototype._updateCircleRadius=function(){var t=this._map._container.clientHeight/2,e=this._map.unproject([0,t]),r=this._map.unproject([1,t]),n=e.distanceTo(r),i=Math.ceil(2*this._accuracy/n);this._circleElement.style.width=i+\"px\",this._circleElement.style.height=i+\"px\"},n.prototype._onZoom=function(){this.options.showUserLocation&&this.options.showAccuracyCircle&&this._updateCircleRadius()},n.prototype._onError=function(e){if(this._map){if(this.options.trackUserLocation)if(1===e.code){this._watchState=\"OFF\",this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-waiting\"),this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-active\"),this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-active-error\"),this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-background\"),this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-background-error\"),this._geolocateButton.disabled=!0;var r=this._map._getUIString(\"GeolocateControl.LocationNotAvailable\");this._geolocateButton.title=r,this._geolocateButton.setAttribute(\"aria-label\",r),void 0!==this._geolocationWatchID&&this._clearWatch()}else{if(3===e.code&&Xi)return;this._setErrorState()}\"OFF\"!==this._watchState&&this.options.showUserLocation&&this._dotElement.classList.add(\"mapboxgl-user-location-dot-stale\"),this.fire(new t.Event(\"error\",e)),this._finish()}},n.prototype._finish=function(){this._timeoutId&&clearTimeout(this._timeoutId),this._timeoutId=void 0},n.prototype._setupUI=function(e){var n=this;if(this._container.addEventListener(\"contextmenu\",(function(t){return t.preventDefault()})),this._geolocateButton=r.create(\"button\",\"mapboxgl-ctrl-geolocate\",this._container),r.create(\"span\",\"mapboxgl-ctrl-icon\",this._geolocateButton).setAttribute(\"aria-hidden\",!0),this._geolocateButton.type=\"button\",!1===e){t.warnOnce(\"Geolocation support is not available so the GeolocateControl will be disabled.\");var i=this._map._getUIString(\"GeolocateControl.LocationNotAvailable\");this._geolocateButton.disabled=!0,this._geolocateButton.title=i,this._geolocateButton.setAttribute(\"aria-label\",i)}else{var a=this._map._getUIString(\"GeolocateControl.FindMyLocation\");this._geolocateButton.title=a,this._geolocateButton.setAttribute(\"aria-label\",a)}this.options.trackUserLocation&&(this._geolocateButton.setAttribute(\"aria-pressed\",\"false\"),this._watchState=\"OFF\"),this.options.showUserLocation&&(this._dotElement=r.create(\"div\",\"mapboxgl-user-location-dot\"),this._userLocationDotMarker=new Zi(this._dotElement),this._circleElement=r.create(\"div\",\"mapboxgl-user-location-accuracy-circle\"),this._accuracyCircleMarker=new Zi({element:this._circleElement,pitchAlignment:\"map\"}),this.options.trackUserLocation&&(this._watchState=\"OFF\"),this._map.on(\"zoom\",this._onZoom)),this._geolocateButton.addEventListener(\"click\",this.trigger.bind(this)),this._setup=!0,this.options.trackUserLocation&&this._map.on(\"movestart\",(function(e){var r=e.originalEvent&&\"resize\"===e.originalEvent.type;e.geolocateSource||\"ACTIVE_LOCK\"!==n._watchState||r||(n._watchState=\"BACKGROUND\",n._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-background\"),n._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-active\"),n.fire(new t.Event(\"trackuserlocationend\")))}))},n.prototype.trigger=function(){if(!this._setup)return t.warnOnce(\"Geolocate control triggered before added to a map\"),!1;if(this.options.trackUserLocation){switch(this._watchState){case\"OFF\":this._watchState=\"WAITING_ACTIVE\",this.fire(new t.Event(\"trackuserlocationstart\"));break;case\"WAITING_ACTIVE\":case\"ACTIVE_LOCK\":case\"ACTIVE_ERROR\":case\"BACKGROUND_ERROR\":Yi--,Xi=!1,this._watchState=\"OFF\",this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-waiting\"),this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-active\"),this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-active-error\"),this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-background\"),this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-background-error\"),this.fire(new t.Event(\"trackuserlocationend\"));break;case\"BACKGROUND\":this._watchState=\"ACTIVE_LOCK\",this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-background\"),this._lastKnownPosition&&this._updateCamera(this._lastKnownPosition),this.fire(new t.Event(\"trackuserlocationstart\"))}switch(this._watchState){case\"WAITING_ACTIVE\":this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-waiting\"),this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-active\");break;case\"ACTIVE_LOCK\":this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-active\");break;case\"ACTIVE_ERROR\":this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-waiting\"),this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-active-error\");break;case\"BACKGROUND\":this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-background\");break;case\"BACKGROUND_ERROR\":this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-waiting\"),this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-background-error\")}if(\"OFF\"===this._watchState&&void 0!==this._geolocationWatchID)this._clearWatch();else if(void 0===this._geolocationWatchID){var e;this._geolocateButton.classList.add(\"mapboxgl-ctrl-geolocate-waiting\"),this._geolocateButton.setAttribute(\"aria-pressed\",\"true\"),++Yi>1?(e={maximumAge:6e5,timeout:0},Xi=!0):(e=this.options.positionOptions,Xi=!1),this._geolocationWatchID=t.window.navigator.geolocation.watchPosition(this._onSuccess,this._onError,e)}}else t.window.navigator.geolocation.getCurrentPosition(this._onSuccess,this._onError,this.options.positionOptions),this._timeoutId=setTimeout(this._finish,1e4);return!0},n.prototype._clearWatch=function(){t.window.navigator.geolocation.clearWatch(this._geolocationWatchID),this._geolocationWatchID=void 0,this._geolocateButton.classList.remove(\"mapboxgl-ctrl-geolocate-waiting\"),this._geolocateButton.setAttribute(\"aria-pressed\",\"false\"),this.options.showUserLocation&&this._updateMarker(null)},n}(t.Evented),Ji={maxWidth:100,unit:\"metric\"},Ki=function(e){this.options=t.extend({},Ji,e),t.bindAll([\"_onMove\",\"setUnit\"],this)};function Qi(t,e,r){var n=r&&r.maxWidth||100,i=t._container.clientHeight/2,a=t.unproject([0,i]),o=t.unproject([n,i]),s=a.distanceTo(o);if(r&&\"imperial\"===r.unit){var l=3.2808*s;l>5280?ta(e,n,l/5280,t._getUIString(\"ScaleControl.Miles\")):ta(e,n,l,t._getUIString(\"ScaleControl.Feet\"))}else r&&\"nautical\"===r.unit?ta(e,n,s/1852,t._getUIString(\"ScaleControl.NauticalMiles\")):s>=1e3?ta(e,n,s/1e3,t._getUIString(\"ScaleControl.Kilometers\")):ta(e,n,s,t._getUIString(\"ScaleControl.Meters\"))}function ta(t,e,r,n){var i,a,o,s=(i=r,(a=Math.pow(10,(\"\"+Math.floor(i)).length-1))*((o=i/a)>=10?10:o>=5?5:o>=3?3:o>=2?2:o>=1?1:function(t){var e=Math.pow(10,Math.ceil(-Math.log(t)/Math.LN10));return Math.round(t*e)/e}(o))),l=s/r;t.style.width=e*l+\"px\",t.innerHTML=s+\" \"+n}Ki.prototype.getDefaultPosition=function(){return\"bottom-left\"},Ki.prototype._onMove=function(){Qi(this._map,this._container,this.options)},Ki.prototype.onAdd=function(t){return this._map=t,this._container=r.create(\"div\",\"mapboxgl-ctrl mapboxgl-ctrl-scale\",t.getContainer()),this._map.on(\"move\",this._onMove),this._onMove(),this._container},Ki.prototype.onRemove=function(){r.remove(this._container),this._map.off(\"move\",this._onMove),this._map=void 0},Ki.prototype.setUnit=function(t){this.options.unit=t,Qi(this._map,this._container,this.options)};var ea=function(e){this._fullscreen=!1,e&&e.container&&(e.container instanceof t.window.HTMLElement?this._container=e.container:t.warnOnce(\"Full screen control 'container' must be a DOM element.\")),t.bindAll([\"_onClickFullscreen\",\"_changeIcon\"],this),\"onfullscreenchange\"in t.window.document?this._fullscreenchange=\"fullscreenchange\":\"onmozfullscreenchange\"in t.window.document?this._fullscreenchange=\"mozfullscreenchange\":\"onwebkitfullscreenchange\"in t.window.document?this._fullscreenchange=\"webkitfullscreenchange\":\"onmsfullscreenchange\"in t.window.document&&(this._fullscreenchange=\"MSFullscreenChange\")};ea.prototype.onAdd=function(e){return this._map=e,this._container||(this._container=this._map.getContainer()),this._controlContainer=r.create(\"div\",\"mapboxgl-ctrl mapboxgl-ctrl-group\"),this._checkFullscreenSupport()?this._setupUI():(this._controlContainer.style.display=\"none\",t.warnOnce(\"This device does not support fullscreen mode.\")),this._controlContainer},ea.prototype.onRemove=function(){r.remove(this._controlContainer),this._map=null,t.window.document.removeEventListener(this._fullscreenchange,this._changeIcon)},ea.prototype._checkFullscreenSupport=function(){return!!(t.window.document.fullscreenEnabled||t.window.document.mozFullScreenEnabled||t.window.document.msFullscreenEnabled||t.window.document.webkitFullscreenEnabled)},ea.prototype._setupUI=function(){var e=this._fullscreenButton=r.create(\"button\",\"mapboxgl-ctrl-fullscreen\",this._controlContainer);r.create(\"span\",\"mapboxgl-ctrl-icon\",e).setAttribute(\"aria-hidden\",!0),e.type=\"button\",this._updateTitle(),this._fullscreenButton.addEventListener(\"click\",this._onClickFullscreen),t.window.document.addEventListener(this._fullscreenchange,this._changeIcon)},ea.prototype._updateTitle=function(){var t=this._getTitle();this._fullscreenButton.setAttribute(\"aria-label\",t),this._fullscreenButton.title=t},ea.prototype._getTitle=function(){return this._map._getUIString(this._isFullscreen()?\"FullscreenControl.Exit\":\"FullscreenControl.Enter\")},ea.prototype._isFullscreen=function(){return this._fullscreen},ea.prototype._changeIcon=function(){(t.window.document.fullscreenElement||t.window.document.mozFullScreenElement||t.window.document.webkitFullscreenElement||t.window.document.msFullscreenElement)===this._container!==this._fullscreen&&(this._fullscreen=!this._fullscreen,this._fullscreenButton.classList.toggle(\"mapboxgl-ctrl-shrink\"),this._fullscreenButton.classList.toggle(\"mapboxgl-ctrl-fullscreen\"),this._updateTitle())},ea.prototype._onClickFullscreen=function(){this._isFullscreen()?t.window.document.exitFullscreen?t.window.document.exitFullscreen():t.window.document.mozCancelFullScreen?t.window.document.mozCancelFullScreen():t.window.document.msExitFullscreen?t.window.document.msExitFullscreen():t.window.document.webkitCancelFullScreen&&t.window.document.webkitCancelFullScreen():this._container.requestFullscreen?this._container.requestFullscreen():this._container.mozRequestFullScreen?this._container.mozRequestFullScreen():this._container.msRequestFullscreen?this._container.msRequestFullscreen():this._container.webkitRequestFullscreen&&this._container.webkitRequestFullscreen()};var ra={closeButton:!0,closeOnClick:!0,focusAfterOpen:!0,className:\"\",maxWidth:\"240px\"},na=[\"a[href]\",\"[tabindex]:not([tabindex='-1'])\",\"[contenteditable]:not([contenteditable='false'])\",\"button:not([disabled])\",\"input:not([disabled])\",\"select:not([disabled])\",\"textarea:not([disabled])\"].join(\", \"),ia=function(e){function n(r){e.call(this),this.options=t.extend(Object.create(ra),r),t.bindAll([\"_update\",\"_onClose\",\"remove\",\"_onMouseMove\",\"_onMouseUp\",\"_onDrag\"],this)}return e&&(n.__proto__=e),n.prototype=Object.create(e&&e.prototype),n.prototype.constructor=n,n.prototype.addTo=function(e){return this._map&&this.remove(),this._map=e,this.options.closeOnClick&&this._map.on(\"click\",this._onClose),this.options.closeOnMove&&this._map.on(\"move\",this._onClose),this._map.on(\"remove\",this.remove),this._update(),this._focusFirstElement(),this._trackPointer?(this._map.on(\"mousemove\",this._onMouseMove),this._map.on(\"mouseup\",this._onMouseUp),this._container&&this._container.classList.add(\"mapboxgl-popup-track-pointer\"),this._map._canvasContainer.classList.add(\"mapboxgl-track-pointer\")):this._map.on(\"move\",this._update),this.fire(new t.Event(\"open\")),this},n.prototype.isOpen=function(){return!!this._map},n.prototype.remove=function(){return this._content&&r.remove(this._content),this._container&&(r.remove(this._container),delete this._container),this._map&&(this._map.off(\"move\",this._update),this._map.off(\"move\",this._onClose),this._map.off(\"click\",this._onClose),this._map.off(\"remove\",this.remove),this._map.off(\"mousemove\",this._onMouseMove),this._map.off(\"mouseup\",this._onMouseUp),this._map.off(\"drag\",this._onDrag),delete this._map),this.fire(new t.Event(\"close\")),this},n.prototype.getLngLat=function(){return this._lngLat},n.prototype.setLngLat=function(e){return this._lngLat=t.LngLat.convert(e),this._pos=null,this._trackPointer=!1,this._update(),this._map&&(this._map.on(\"move\",this._update),this._map.off(\"mousemove\",this._onMouseMove),this._container&&this._container.classList.remove(\"mapboxgl-popup-track-pointer\"),this._map._canvasContainer.classList.remove(\"mapboxgl-track-pointer\")),this},n.prototype.trackPointer=function(){return this._trackPointer=!0,this._pos=null,this._update(),this._map&&(this._map.off(\"move\",this._update),this._map.on(\"mousemove\",this._onMouseMove),this._map.on(\"drag\",this._onDrag),this._container&&this._container.classList.add(\"mapboxgl-popup-track-pointer\"),this._map._canvasContainer.classList.add(\"mapboxgl-track-pointer\")),this},n.prototype.getElement=function(){return this._container},n.prototype.setText=function(e){return this.setDOMContent(t.window.document.createTextNode(e))},n.prototype.setHTML=function(e){var r,n=t.window.document.createDocumentFragment(),i=t.window.document.createElement(\"body\");for(i.innerHTML=e;r=i.firstChild;)n.appendChild(r);return this.setDOMContent(n)},n.prototype.getMaxWidth=function(){return this._container&&this._container.style.maxWidth},n.prototype.setMaxWidth=function(t){return this.options.maxWidth=t,this._update(),this},n.prototype.setDOMContent=function(t){if(this._content)for(;this._content.hasChildNodes();)this._content.firstChild&&this._content.removeChild(this._content.firstChild);else this._content=r.create(\"div\",\"mapboxgl-popup-content\",this._container);return this._content.appendChild(t),this._createCloseButton(),this._update(),this._focusFirstElement(),this},n.prototype.addClassName=function(t){this._container&&this._container.classList.add(t)},n.prototype.removeClassName=function(t){this._container&&this._container.classList.remove(t)},n.prototype.setOffset=function(t){return this.options.offset=t,this._update(),this},n.prototype.toggleClassName=function(t){if(this._container)return this._container.classList.toggle(t)},n.prototype._createCloseButton=function(){this.options.closeButton&&(this._closeButton=r.create(\"button\",\"mapboxgl-popup-close-button\",this._content),this._closeButton.type=\"button\",this._closeButton.setAttribute(\"aria-label\",\"Close popup\"),this._closeButton.innerHTML=\"×\",this._closeButton.addEventListener(\"click\",this._onClose))},n.prototype._onMouseUp=function(t){this._update(t.point)},n.prototype._onMouseMove=function(t){this._update(t.point)},n.prototype._onDrag=function(t){this._update(t.point)},n.prototype._update=function(t){var e=this,n=this._lngLat||this._trackPointer;if(this._map&&n&&this._content&&(this._container||(this._container=r.create(\"div\",\"mapboxgl-popup\",this._map.getContainer()),this._tip=r.create(\"div\",\"mapboxgl-popup-tip\",this._container),this._container.appendChild(this._content),this.options.className&&this.options.className.split(\" \").forEach((function(t){return e._container.classList.add(t)})),this._trackPointer&&this._container.classList.add(\"mapboxgl-popup-track-pointer\")),this.options.maxWidth&&this._container.style.maxWidth!==this.options.maxWidth&&(this._container.style.maxWidth=this.options.maxWidth),this._map.transform.renderWorldCopies&&!this._trackPointer&&(this._lngLat=Vi(this._lngLat,this._pos,this._map.transform)),!this._trackPointer||t)){var i=this._pos=this._trackPointer&&t?t:this._map.project(this._lngLat),a=this.options.anchor,o=aa(this.options.offset);if(!a){var s,l=this._container.offsetWidth,c=this._container.offsetHeight;s=i.y+o.bottom.ythis._map.transform.height-c?[\"bottom\"]:[],i.xthis._map.transform.width-l/2&&s.push(\"right\"),a=0===s.length?\"bottom\":s.join(\"-\")}var u=i.add(o[a]).round();r.setTransform(this._container,qi[a]+\" translate(\"+u.x+\"px,\"+u.y+\"px)\"),Hi(this._container,a,\"popup\")}},n.prototype._focusFirstElement=function(){if(this.options.focusAfterOpen&&this._container){var t=this._container.querySelector(na);t&&t.focus()}},n.prototype._onClose=function(){this.remove()},n}(t.Evented);function aa(e){if(e){if(\"number\"==typeof e){var r=Math.round(Math.sqrt(.5*Math.pow(e,2)));return{center:new t.Point(0,0),top:new t.Point(0,e),\"top-left\":new t.Point(r,r),\"top-right\":new t.Point(-r,r),bottom:new t.Point(0,-e),\"bottom-left\":new t.Point(r,-r),\"bottom-right\":new t.Point(-r,-r),left:new t.Point(e,0),right:new t.Point(-e,0)}}if(e instanceof t.Point||Array.isArray(e)){var n=t.Point.convert(e);return{center:n,top:n,\"top-left\":n,\"top-right\":n,bottom:n,\"bottom-left\":n,\"bottom-right\":n,left:n,right:n}}return{center:t.Point.convert(e.center||[0,0]),top:t.Point.convert(e.top||[0,0]),\"top-left\":t.Point.convert(e[\"top-left\"]||[0,0]),\"top-right\":t.Point.convert(e[\"top-right\"]||[0,0]),bottom:t.Point.convert(e.bottom||[0,0]),\"bottom-left\":t.Point.convert(e[\"bottom-left\"]||[0,0]),\"bottom-right\":t.Point.convert(e[\"bottom-right\"]||[0,0]),left:t.Point.convert(e.left||[0,0]),right:t.Point.convert(e.right||[0,0])}}return aa(new t.Point(0,0))}var oa={version:t.version,supported:e,setRTLTextPlugin:t.setRTLTextPlugin,getRTLTextPluginStatus:t.getRTLTextPluginStatus,Map:Fi,NavigationControl:ji,GeolocateControl:$i,AttributionControl:Ei,ScaleControl:Ki,FullscreenControl:ea,Popup:ia,Marker:Zi,Style:We,LngLat:t.LngLat,LngLatBounds:t.LngLatBounds,Point:t.Point,MercatorCoordinate:t.MercatorCoordinate,Evented:t.Evented,config:t.config,prewarm:function(){jt().acquire(Rt)},clearPrewarmedResources:function(){var t=Bt;t&&(t.isPreloaded()&&1===t.numActive()?(t.release(Rt),Bt=null):console.warn(\"Could not clear WebWorkers since there are active Map instances that still reference it. The pre-warmed WebWorker pool can only be cleared when all map instances have been removed with map.remove()\"))},get accessToken(){return t.config.ACCESS_TOKEN},set accessToken(e){t.config.ACCESS_TOKEN=e},get baseApiUrl(){return t.config.API_URL},set baseApiUrl(e){t.config.API_URL=e},get workerCount(){return Ft.workerCount},set workerCount(t){Ft.workerCount=t},get maxParallelImageRequests(){return t.config.MAX_PARALLEL_IMAGE_REQUESTS},set maxParallelImageRequests(e){t.config.MAX_PARALLEL_IMAGE_REQUESTS=e},clearStorage:function(e){t.clearTileCache(e)},workerUrl:\"\"};return oa})),r}()},27549:function(t,e,r){\"use strict\";t.exports=r(55366)},55366:function(t,e,r){\"use strict\";var n=r(31625),i=r(75144),a=r(5137),o=r(78112),s=r(6807),l=r(68650),c=r(83473),u=r(60201),h=r(10275),f=r(62914);function p(t,e){for(var r=e[0],n=e[1],a=1/(e[2]-r),o=1/(e[3]-n),s=new Array(t.length),l=0,c=t.length/2;l>>1;e.dtype||(e.dtype=\"array\"),\"string\"==typeof e.dtype?d=new(h(e.dtype))(g):e.dtype&&(d=e.dtype,Array.isArray(d)&&(d.length=g));for(var y=0;yr||s>1073741824){for(var f=0;fr+i||M>n+i||S=L||o===s)){var l=v[a];void 0===s&&(s=l.length);for(var c=o;c=g&&h<=w&&f>=y&&f<=T&&I.push(u)}var p=x[a],d=p[4*o+0],m=p[4*o+1],_=p[4*o+2],b=p[4*o+3],k=function(t,e){for(var r=null,n=0;null===r;)if(r=t[4*e+n],++n>t.length)return null;return r}(p,o+1),E=.5*i,P=a+1;e(r,n,E,P,d,m||_||b||k),e(r,n+E,E,P,m,_||b||k),e(r+E,n,E,P,_,b||k),e(r+E,n+E,E,P,b,k)}}(0,0,1,0,0,1),I},d;function E(t,e,r){for(var n=1,i=.5,a=.5,o=.5,s=0;si&&(i=t[o]),t[o]1?r-1:0),i=1;i1?r-1:0),i=1;i1?r-1:0),i=1;i1?r-1:0),i=1;it.length)&&(r=t.length),t.substring(r-e.length,r)===e}var x=\"\",_=\"\",b=\"\",w=\"\",T={deepStrictEqual:\"Expected values to be strictly deep-equal:\",strictEqual:\"Expected values to be strictly equal:\",strictEqualObject:'Expected \"actual\" to be reference-equal to \"expected\":',deepEqual:\"Expected values to be loosely deep-equal:\",equal:\"Expected values to be loosely equal:\",notDeepStrictEqual:'Expected \"actual\" not to be strictly deep-equal to:',notStrictEqual:'Expected \"actual\" to be strictly unequal to:',notStrictEqualObject:'Expected \"actual\" not to be reference-equal to \"expected\":',notDeepEqual:'Expected \"actual\" not to be loosely deep-equal to:',notEqual:'Expected \"actual\" to be loosely unequal to:',notIdentical:\"Values identical but not reference-equal:\"};function k(t){var e=Object.keys(t),r=Object.create(Object.getPrototypeOf(t));return e.forEach((function(e){r[e]=t[e]})),Object.defineProperty(r,\"message\",{value:t.message}),r}function A(t){return g(t,{compact:!1,customInspect:!1,depth:1e3,maxArrayLength:1/0,showHidden:!1,breakLength:1/0,showProxy:!1,sorted:!0,getters:!0})}var M=function(t,e){!function(t,e){if(\"function\"!=typeof e&&null!==e)throw new TypeError(\"Super expression must either be null or a function\");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,\"prototype\",{writable:!1}),e&&p(t,e)}(M,t);var r,i,s,u,h=(r=M,i=f(),function(){var t,e=d(r);if(i){var n=d(this).constructor;t=Reflect.construct(e,arguments,n)}else t=e.apply(this,arguments);return l(this,t)});function M(t){var e;if(function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}(this,M),\"object\"!==m(t)||null===t)throw new y(\"options\",\"Object\",t);var r=t.message,i=t.operator,a=t.stackStartFn,o=t.actual,s=t.expected,u=Error.stackTraceLimit;if(Error.stackTraceLimit=0,null!=r)e=h.call(this,String(r));else if(n.stderr&&n.stderr.isTTY&&(n.stderr&&n.stderr.getColorDepth&&1!==n.stderr.getColorDepth()?(x=\"\u001b[34m\",_=\"\u001b[32m\",w=\"\u001b[39m\",b=\"\u001b[31m\"):(x=\"\",_=\"\",w=\"\",b=\"\")),\"object\"===m(o)&&null!==o&&\"object\"===m(s)&&null!==s&&\"stack\"in o&&o instanceof Error&&\"stack\"in s&&s instanceof Error&&(o=k(o),s=k(s)),\"deepStrictEqual\"===i||\"strictEqual\"===i)e=h.call(this,function(t,e,r){var i=\"\",a=\"\",o=0,s=\"\",l=!1,c=A(t),u=c.split(\"\\n\"),h=A(e).split(\"\\n\"),f=0,p=\"\";if(\"strictEqual\"===r&&\"object\"===m(t)&&\"object\"===m(e)&&null!==t&&null!==e&&(r=\"strictEqualObject\"),1===u.length&&1===h.length&&u[0]!==h[0]){var d=u[0].length+h[0].length;if(d<=10){if(!(\"object\"===m(t)&&null!==t||\"object\"===m(e)&&null!==e||0===t&&0===e))return\"\".concat(T[r],\"\\n\\n\")+\"\".concat(u[0],\" !== \").concat(h[0],\"\\n\")}else if(\"strictEqualObject\"!==r&&d<(n.stderr&&n.stderr.isTTY?n.stderr.columns:80)){for(;u[0][f]===h[0][f];)f++;f>2&&(p=\"\\n \".concat(function(t,e){if(e=Math.floor(e),0==t.length||0==e)return\"\";var r=t.length*e;for(e=Math.floor(Math.log(e)/Math.log(2));e;)t+=t,e--;return t+t.substring(0,r-t.length)}(\" \",f),\"^\"),f=0)}}for(var g=u[u.length-1],y=h[h.length-1];g===y&&(f++<2?s=\"\\n \".concat(g).concat(s):i=g,u.pop(),h.pop(),0!==u.length&&0!==h.length);)g=u[u.length-1],y=h[h.length-1];var k=Math.max(u.length,h.length);if(0===k){var M=c.split(\"\\n\");if(M.length>30)for(M[26]=\"\".concat(x,\"...\").concat(w);M.length>27;)M.pop();return\"\".concat(T.notIdentical,\"\\n\\n\").concat(M.join(\"\\n\"),\"\\n\")}f>3&&(s=\"\\n\".concat(x,\"...\").concat(w).concat(s),l=!0),\"\"!==i&&(s=\"\\n \".concat(i).concat(s),i=\"\");var S=0,E=T[r]+\"\\n\".concat(_,\"+ actual\").concat(w,\" \").concat(b,\"- expected\").concat(w),C=\" \".concat(x,\"...\").concat(w,\" Lines skipped\");for(f=0;f1&&f>2&&(L>4?(a+=\"\\n\".concat(x,\"...\").concat(w),l=!0):L>3&&(a+=\"\\n \".concat(h[f-2]),S++),a+=\"\\n \".concat(h[f-1]),S++),o=f,i+=\"\\n\".concat(b,\"-\").concat(w,\" \").concat(h[f]),S++;else if(h.length1&&f>2&&(L>4?(a+=\"\\n\".concat(x,\"...\").concat(w),l=!0):L>3&&(a+=\"\\n \".concat(u[f-2]),S++),a+=\"\\n \".concat(u[f-1]),S++),o=f,a+=\"\\n\".concat(_,\"+\").concat(w,\" \").concat(u[f]),S++;else{var I=h[f],P=u[f],z=P!==I&&(!v(P,\",\")||P.slice(0,-1)!==I);z&&v(I,\",\")&&I.slice(0,-1)===P&&(z=!1,P+=\",\"),z?(L>1&&f>2&&(L>4?(a+=\"\\n\".concat(x,\"...\").concat(w),l=!0):L>3&&(a+=\"\\n \".concat(u[f-2]),S++),a+=\"\\n \".concat(u[f-1]),S++),o=f,a+=\"\\n\".concat(_,\"+\").concat(w,\" \").concat(P),i+=\"\\n\".concat(b,\"-\").concat(w,\" \").concat(I),S+=2):(a+=i,i=\"\",1!==L&&0!==f||(a+=\"\\n \".concat(P),S++))}if(S>20&&f30)for(p[26]=\"\".concat(x,\"...\").concat(w);p.length>27;)p.pop();e=1===p.length?h.call(this,\"\".concat(f,\" \").concat(p[0])):h.call(this,\"\".concat(f,\"\\n\\n\").concat(p.join(\"\\n\"),\"\\n\"))}else{var d=A(o),g=\"\",S=T[i];\"notDeepEqual\"===i||\"notEqual\"===i?(d=\"\".concat(T[i],\"\\n\\n\").concat(d)).length>1024&&(d=\"\".concat(d.slice(0,1021),\"...\")):(g=\"\".concat(A(s)),d.length>512&&(d=\"\".concat(d.slice(0,509),\"...\")),g.length>512&&(g=\"\".concat(g.slice(0,509),\"...\")),\"deepEqual\"===i||\"equal\"===i?d=\"\".concat(S,\"\\n\\n\").concat(d,\"\\n\\nshould equal\\n\\n\"):g=\" \".concat(i,\" \").concat(g)),e=h.call(this,\"\".concat(d).concat(g))}return Error.stackTraceLimit=u,e.generatedMessage=!r,Object.defineProperty(c(e),\"name\",{value:\"AssertionError [ERR_ASSERTION]\",enumerable:!1,writable:!0,configurable:!0}),e.code=\"ERR_ASSERTION\",e.actual=o,e.expected=s,e.operator=i,Error.captureStackTrace&&Error.captureStackTrace(c(e),a),e.stack,e.name=\"AssertionError\",l(e)}return s=M,(u=[{key:\"toString\",value:function(){return\"\".concat(this.name,\" [\").concat(this.code,\"]: \").concat(this.message)}},{key:e,value:function(t,e){return g(this,a(a({},e),{},{customInspect:!1,depth:0}))}}])&&o(s.prototype,u),Object.defineProperty(s,\"prototype\",{writable:!1}),M}(u(Error),g.custom);t.exports=M},34585:function(t,e,r){\"use strict\";function n(t){return n=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\"function\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\"symbol\":typeof t},n(t)}function i(t,e){return i=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},i(t,e)}function a(t){return a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},a(t)}var o,s,l={};function c(t,e,r){r||(r=Error);var o=function(r){!function(t,e){if(\"function\"!=typeof e&&null!==e)throw new TypeError(\"Super expression must either be null or a function\");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,\"prototype\",{writable:!1}),e&&i(t,e)}(u,r);var o,s,l,c=(s=u,l=function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}(),function(){var t,e=a(s);if(l){var r=a(this).constructor;t=Reflect.construct(e,arguments,r)}else t=e.apply(this,arguments);return function(t,e){if(e&&(\"object\"===n(e)||\"function\"==typeof e))return e;if(void 0!==e)throw new TypeError(\"Derived constructors may only return object or undefined\");return function(t){if(void 0===t)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return t}(t)}(this,t)});function u(r,n,i){var a;return function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}(this,u),a=c.call(this,function(t,r,n){return\"string\"==typeof e?e:e(t,r,n)}(r,n,i)),a.code=t,a}return o=u,Object.defineProperty(o,\"prototype\",{writable:!1}),o}(r);l[t]=o}function u(t,e){if(Array.isArray(t)){var r=t.length;return t=t.map((function(t){return String(t)})),r>2?\"one of \".concat(e,\" \").concat(t.slice(0,r-1).join(\", \"),\", or \")+t[r-1]:2===r?\"one of \".concat(e,\" \").concat(t[0],\" or \").concat(t[1]):\"of \".concat(e,\" \").concat(t[0])}return\"of \".concat(e,\" \").concat(String(t))}c(\"ERR_AMBIGUOUS_ARGUMENT\",'The \"%s\" argument is ambiguous. %s',TypeError),c(\"ERR_INVALID_ARG_TYPE\",(function(t,e,i){var a,s,l,c,h;if(void 0===o&&(o=r(85672)),o(\"string\"==typeof t,\"'name' must be a string\"),\"string\"==typeof e&&(s=\"not \",e.substr(0,4)===s)?(a=\"must not be\",e=e.replace(/^not /,\"\")):a=\"must be\",function(t,e,r){return(void 0===r||r>t.length)&&(r=t.length),t.substring(r-9,r)===e}(t,\" argument\"))l=\"The \".concat(t,\" \").concat(a,\" \").concat(u(e,\"type\"));else{var f=(\"number\"!=typeof h&&(h=0),h+1>(c=t).length||-1===c.indexOf(\".\",h)?\"argument\":\"property\");l='The \"'.concat(t,'\" ').concat(f,\" \").concat(a,\" \").concat(u(e,\"type\"))}return l+\". Received type \".concat(n(i))}),TypeError),c(\"ERR_INVALID_ARG_VALUE\",(function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"is invalid\";void 0===s&&(s=r(56557));var i=s.inspect(e);return i.length>128&&(i=\"\".concat(i.slice(0,128),\"...\")),\"The argument '\".concat(t,\"' \").concat(n,\". Received \").concat(i)}),TypeError,RangeError),c(\"ERR_INVALID_RETURN_VALUE\",(function(t,e,r){var i;return i=r&&r.constructor&&r.constructor.name?\"instance of \".concat(r.constructor.name):\"type \".concat(n(r)),\"Expected \".concat(t,' to be returned from the \"').concat(e,'\"')+\" function but got \".concat(i,\".\")}),TypeError),c(\"ERR_MISSING_ARGS\",(function(){for(var t=arguments.length,e=new Array(t),n=0;n0,\"At least one arg needs to be specified\");var i=\"The \",a=e.length;switch(e=e.map((function(t){return'\"'.concat(t,'\"')})),a){case 1:i+=\"\".concat(e[0],\" argument\");break;case 2:i+=\"\".concat(e[0],\" and \").concat(e[1],\" arguments\");break;default:i+=e.slice(0,a-1).join(\", \"),i+=\", and \".concat(e[a-1],\" arguments\")}return\"\".concat(i,\" must be specified\")}),TypeError),t.exports.codes=l},23879:function(t,e,r){\"use strict\";function n(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var r=null==t?null:\"undefined\"!=typeof Symbol&&t[Symbol.iterator]||t[\"@@iterator\"];if(null!=r){var n,i,a,o,s=[],l=!0,c=!1;try{if(a=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;l=!1}else for(;!(l=(n=a.call(r)).done)&&(s.push(n.value),s.length!==e);l=!0);}catch(t){c=!0,i=t}finally{try{if(!l&&null!=r.return&&(o=r.return(),Object(o)!==o))return}finally{if(c)throw i}}return s}}(t,e)||function(t,e){if(t){if(\"string\"==typeof t)return i(t,e);var r=Object.prototype.toString.call(t).slice(8,-1);return\"Object\"===r&&t.constructor&&(r=t.constructor.name),\"Map\"===r||\"Set\"===r?Array.from(t):\"Arguments\"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?i(t,e):void 0}}(t,e)||function(){throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")}()}function i(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r10)return!0;for(var e=0;e57)return!0}return 10===t.length&&t>=Math.pow(2,32)}function z(t){return Object.keys(t).filter(P).concat(u(t).filter(Object.prototype.propertyIsEnumerable.bind(t)))}function O(t,e){if(t===e)return 0;for(var r=t.length,n=e.length,i=0,a=Math.min(r,n);i>2],a+=n[(3&r[e])<<4|r[e+1]>>4],a+=n[(15&r[e+1])<<2|r[e+2]>>6],a+=n[63&r[e+2]];return i%3==2?a=a.substring(0,a.length-1)+\"=\":i%3==1&&(a=a.substring(0,a.length-2)+\"==\"),a},s=function(t){var e,r,n,a,o,s=.75*t.length,l=t.length,c=0;\"=\"===t[t.length-1]&&(s--,\"=\"===t[t.length-2]&&s--);var u=new ArrayBuffer(s),h=new Uint8Array(u);for(e=0;e>4,h[c++]=(15&n)<<4|a>>2,h[c++]=(3&a)<<6|63&o;return u}},76226:function(t,e){\"use strict\";e.byteLength=function(t){var e=s(t),r=e[0],n=e[1];return 3*(r+n)/4-n},e.toByteArray=function(t){var e,r,a=s(t),o=a[0],l=a[1],c=new i(function(t,e,r){return 3*(e+r)/4-r}(0,o,l)),u=0,h=l>0?o-4:o;for(r=0;r>16&255,c[u++]=e>>8&255,c[u++]=255&e;return 2===l&&(e=n[t.charCodeAt(r)]<<2|n[t.charCodeAt(r+1)]>>4,c[u++]=255&e),1===l&&(e=n[t.charCodeAt(r)]<<10|n[t.charCodeAt(r+1)]<<4|n[t.charCodeAt(r+2)]>>2,c[u++]=e>>8&255,c[u++]=255&e),c},e.fromByteArray=function(t){for(var e,n=t.length,i=n%3,a=[],o=16383,s=0,c=n-i;sc?c:s+o));return 1===i?(e=t[n-1],a.push(r[e>>2]+r[e<<4&63]+\"==\")):2===i&&(e=(t[n-2]<<8)+t[n-1],a.push(r[e>>10]+r[e>>4&63]+r[e<<2&63]+\"=\")),a.join(\"\")};for(var r=[],n=[],i=\"undefined\"!=typeof Uint8Array?Uint8Array:Array,a=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\",o=0;o<64;++o)r[o]=a[o],n[a.charCodeAt(o)]=o;function s(t){var e=t.length;if(e%4>0)throw new Error(\"Invalid string. Length must be a multiple of 4\");var r=t.indexOf(\"=\");return-1===r&&(r=e),[r,r===e?0:4-r%4]}function l(t,e,n){for(var i,a,o=[],s=e;s>18&63]+r[a>>12&63]+r[a>>6&63]+r[63&a]);return o.join(\"\")}n[\"-\".charCodeAt(0)]=62,n[\"_\".charCodeAt(0)]=63},31625:function(t){\"use strict\";function e(t,e,r,n,i){for(var a=i+1;n<=i;){var o=n+i>>>1,s=t[o];(void 0!==r?r(s,e):s-e)>=0?(a=o,i=o-1):n=o+1}return a}function r(t,e,r,n,i){for(var a=i+1;n<=i;){var o=n+i>>>1,s=t[o];(void 0!==r?r(s,e):s-e)>0?(a=o,i=o-1):n=o+1}return a}function n(t,e,r,n,i){for(var a=n-1;n<=i;){var o=n+i>>>1,s=t[o];(void 0!==r?r(s,e):s-e)<0?(a=o,n=o+1):i=o-1}return a}function i(t,e,r,n,i){for(var a=n-1;n<=i;){var o=n+i>>>1,s=t[o];(void 0!==r?r(s,e):s-e)<=0?(a=o,n=o+1):i=o-1}return a}function a(t,e,r,n,i){for(;n<=i;){var a=n+i>>>1,o=t[a],s=void 0!==r?r(o,e):o-e;if(0===s)return a;s<=0?n=a+1:i=a-1}return-1}function o(t,e,r,n,i,a){return\"function\"==typeof r?a(t,e,r,void 0===n?0:0|n,void 0===i?t.length-1:0|i):a(t,e,void 0,void 0===r?0:0|r,void 0===n?t.length-1:0|n)}t.exports={ge:function(t,r,n,i,a){return o(t,r,n,i,a,e)},gt:function(t,e,n,i,a){return o(t,e,n,i,a,r)},lt:function(t,e,r,i,a){return o(t,e,r,i,a,n)},le:function(t,e,r,n,a){return o(t,e,r,n,a,i)},eq:function(t,e,r,n,i){return o(t,e,r,n,i,a)}}},54689:function(t,e){\"use strict\";function r(t){var e=32;return(t&=-t)&&e--,65535&t&&(e-=16),16711935&t&&(e-=8),252645135&t&&(e-=4),858993459&t&&(e-=2),1431655765&t&&(e-=1),e}e.INT_BITS=32,e.INT_MAX=2147483647,e.INT_MIN=-1<<31,e.sign=function(t){return(t>0)-(t<0)},e.abs=function(t){var e=t>>31;return(t^e)-e},e.min=function(t,e){return e^(t^e)&-(t65535)<<4,e|=r=((t>>>=e)>255)<<3,e|=r=((t>>>=r)>15)<<2,(e|=r=((t>>>=r)>3)<<1)|(t>>>=r)>>1},e.log10=function(t){return t>=1e9?9:t>=1e8?8:t>=1e7?7:t>=1e6?6:t>=1e5?5:t>=1e4?4:t>=1e3?3:t>=100?2:t>=10?1:0},e.popCount=function(t){return 16843009*((t=(858993459&(t-=t>>>1&1431655765))+(t>>>2&858993459))+(t>>>4)&252645135)>>>24},e.countTrailingZeros=r,e.nextPow2=function(t){return t+=0===t,--t,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,1+(t|=t>>>16)},e.prevPow2=function(t){return t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,(t|=t>>>16)-(t>>>1)},e.parity=function(t){return t^=t>>>16,t^=t>>>8,t^=t>>>4,27030>>>(t&=15)&1};var n=new Array(256);!function(t){for(var e=0;e<256;++e){var r=e,n=e,i=7;for(r>>>=1;r;r>>>=1)n<<=1,n|=1&r,--i;t[e]=n<>>8&255]<<16|n[t>>>16&255]<<8|n[t>>>24&255]},e.interleave2=function(t,e){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t&=65535)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e&=65535)|e<<8))|e<<4))|e<<2))|e<<1))<<1},e.deinterleave2=function(t,e){return(t=65535&((t=16711935&((t=252645135&((t=858993459&((t=t>>>e&1431655765)|t>>>1))|t>>>2))|t>>>4))|t>>>16))<<16>>16},e.interleave3=function(t,e,r){return t=1227133513&((t=3272356035&((t=251719695&((t=4278190335&((t&=1023)|t<<16))|t<<8))|t<<4))|t<<2),(t|=(e=1227133513&((e=3272356035&((e=251719695&((e=4278190335&((e&=1023)|e<<16))|e<<8))|e<<4))|e<<2))<<1)|(r=1227133513&((r=3272356035&((r=251719695&((r=4278190335&((r&=1023)|r<<16))|r<<8))|r<<4))|r<<2))<<2},e.deinterleave3=function(t,e){return(t=1023&((t=4278190335&((t=251719695&((t=3272356035&((t=t>>>e&1227133513)|t>>>2))|t>>>4))|t>>>8))|t>>>16))<<22>>22},e.nextCombination=function(t){var e=t|t-1;return e+1|(~e&-~e)-1>>>r(t)+1}},88772:function(t,e,r){\"use strict\";var n=r(75144);t.exports=function(t,e){e||(e={});var r,o,s,l,c,u,h,f,p,d,m,g=null==e.cutoff?.25:e.cutoff,y=null==e.radius?8:e.radius,v=e.channel||0;if(ArrayBuffer.isView(t)||Array.isArray(t)){if(!e.width||!e.height)throw Error(\"For raw data width and height should be provided by options\");r=e.width,o=e.height,l=t,u=e.stride?e.stride:Math.floor(t.length/r/o)}else window.HTMLCanvasElement&&t instanceof window.HTMLCanvasElement?(h=(f=t).getContext(\"2d\"),r=f.width,o=f.height,l=(p=h.getImageData(0,0,r,o)).data,u=4):window.CanvasRenderingContext2D&&t instanceof window.CanvasRenderingContext2D?(h=t,r=(f=t.canvas).width,o=f.height,l=(p=h.getImageData(0,0,r,o)).data,u=4):window.ImageData&&t instanceof window.ImageData&&(p=t,r=t.width,o=t.height,l=p.data,u=4);if(s=Math.max(r,o),window.Uint8ClampedArray&&l instanceof window.Uint8ClampedArray||window.Uint8Array&&l instanceof window.Uint8Array)for(c=l,l=Array(r*o),d=0,m=c.length;d-1?i(r):r}},87227:function(t,e,r){\"use strict\";var n=r(87547),i=r(71129),a=r(73285),o=r(48631),s=i(\"%Function.prototype.apply%\"),l=i(\"%Function.prototype.call%\"),c=i(\"%Reflect.apply%\",!0)||n.call(l,s),u=r(40891),h=i(\"%Math.max%\");t.exports=function(t){if(\"function\"!=typeof t)throw new o(\"a function is required\");var e=c(n,l,arguments);return a(e,1+h(0,t.length-(arguments.length-1)),!0)};var f=function(){return c(n,s,arguments)};u?u(t.exports,\"apply\",{value:f}):t.exports.apply=f},75144:function(t){t.exports=function(t,e,r){return er?r:t:te?e:t}},46762:function(t,e,r){\"use strict\";var n=r(75144);function i(t,e){null==e&&(e=!0);var r=t[0],i=t[1],a=t[2],o=t[3];return null==o&&(o=e?1:255),e&&(r*=255,i*=255,a*=255,o*=255),16777216*(r=255&n(r,0,255))+((i=255&n(i,0,255))<<16)+((a=255&n(a,0,255))<<8)+(255&n(o,0,255))}t.exports=i,t.exports.to=i,t.exports.from=function(t,e){var r=(t=+t)>>>24,n=(16711680&t)>>>16,i=(65280&t)>>>8,a=255&t;return!1===e?[r,n,i,a]:[r/255,n/255,i/255,a/255]}},86040:function(t){\"use strict\";t.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}},162:function(t,e,r){\"use strict\";var n=r(16401),i=r(75144),a=r(10275);t.exports=function(t,e){\"float\"!==e&&e||(e=\"array\"),\"uint\"===e&&(e=\"uint8\"),\"uint_clamped\"===e&&(e=\"uint8_clamped\");var r=new(a(e))(4),o=\"uint8\"!==e&&\"uint8_clamped\"!==e;return t.length&&\"string\"!=typeof t||((t=n(t))[0]/=255,t[1]/=255,t[2]/=255),function(t){return t instanceof Uint8Array||t instanceof Uint8ClampedArray||!!(Array.isArray(t)&&(t[0]>1||0===t[0])&&(t[1]>1||0===t[1])&&(t[2]>1||0===t[2])&&(!t[3]||t[3]>1))}(t)?(r[0]=t[0],r[1]=t[1],r[2]=t[2],r[3]=null!=t[3]?t[3]:255,o&&(r[0]/=255,r[1]/=255,r[2]/=255,r[3]/=255),r):(o?(r[0]=t[0],r[1]=t[1],r[2]=t[2],r[3]=null!=t[3]?t[3]:1):(r[0]=i(Math.floor(255*t[0]),0,255),r[1]=i(Math.floor(255*t[1]),0,255),r[2]=i(Math.floor(255*t[2]),0,255),r[3]=null==t[3]?255:i(Math.floor(255*t[3]),0,255)),r)}},16401:function(t,e,r){\"use strict\";var n=r(10826),i=r(52132),a=r(75144);t.exports=function(t){var e,r=n(t);return r.space?((e=Array(3))[0]=a(r.values[0],0,255),e[1]=a(r.values[1],0,255),e[2]=a(r.values[2],0,255),\"h\"===r.space[0]&&(e=i.rgb(e)),e.push(a(r.alpha,0,1)),e):[]}},10826:function(t,e,r){\"use strict\";var n=r(86040);t.exports=function(t){var e,r,a=[],o=1;if(\"string\"==typeof t)if(t=t.toLowerCase(),n[t])a=n[t].slice(),r=\"rgb\";else if(\"transparent\"===t)o=0,r=\"rgb\",a=[0,0,0];else if(/^#[A-Fa-f0-9]+$/.test(t)){var s=t.slice(1);o=1,(u=s.length)<=4?(a=[parseInt(s[0]+s[0],16),parseInt(s[1]+s[1],16),parseInt(s[2]+s[2],16)],4===u&&(o=parseInt(s[3]+s[3],16)/255)):(a=[parseInt(s[0]+s[1],16),parseInt(s[2]+s[3],16),parseInt(s[4]+s[5],16)],8===u&&(o=parseInt(s[6]+s[7],16)/255)),a[0]||(a[0]=0),a[1]||(a[1]=0),a[2]||(a[2]=0),r=\"rgb\"}else if(e=/^((?:rgb|hs[lvb]|hwb|cmyk?|xy[zy]|gray|lab|lchu?v?|[ly]uv|lms)a?)\\s*\\(([^\\)]*)\\)/.exec(t)){var l=e[1],c=\"rgb\"===l;r=s=l.replace(/a$/,\"\");var u=\"cmyk\"===s?4:\"gray\"===s?1:3;a=e[2].trim().split(/\\s*[,\\/]\\s*|\\s+/).map((function(t,e){if(/%$/.test(t))return e===u?parseFloat(t)/100:\"rgb\"===s?255*parseFloat(t)/100:parseFloat(t);if(\"h\"===s[e]){if(/deg$/.test(t))return parseFloat(t);if(void 0!==i[t])return i[t]}return parseFloat(t)})),l===s&&a.push(1),o=c||void 0===a[u]?1:a[u],a=a.slice(0,u)}else t.length>10&&/[0-9](?:\\s|\\/)/.test(t)&&(a=t.match(/([0-9]+)/g).map((function(t){return parseFloat(t)})),r=t.match(/([a-z])/gi).join(\"\").toLowerCase());else isNaN(t)?Array.isArray(t)||t.length?(a=[t[0],t[1],t[2]],r=\"rgb\",o=4===t.length?t[3]:1):t instanceof Object&&(null!=t.r||null!=t.red||null!=t.R?(r=\"rgb\",a=[t.r||t.red||t.R||0,t.g||t.green||t.G||0,t.b||t.blue||t.B||0]):(r=\"hsl\",a=[t.h||t.hue||t.H||0,t.s||t.saturation||t.S||0,t.l||t.lightness||t.L||t.b||t.brightness]),o=t.a||t.alpha||t.opacity||1,null!=t.opacity&&(o/=100)):(r=\"rgb\",a=[t>>>16,(65280&t)>>>8,255&t]);return{space:r,values:a,alpha:o}};var i={red:0,orange:60,yellow:120,green:180,blue:240,purple:300}},52132:function(t,e,r){\"use strict\";var n=r(10520);t.exports={name:\"hsl\",min:[0,0,0],max:[360,100,100],channel:[\"hue\",\"saturation\",\"lightness\"],alias:[\"HSL\"],rgb:function(t){var e,r,n,i,a,o=t[0]/360,s=t[1]/100,l=t[2]/100;if(0===s)return[a=255*l,a,a];e=2*l-(r=l<.5?l*(1+s):l+s-l*s),i=[0,0,0];for(var c=0;c<3;c++)(n=o+1/3*-(c-1))<0?n++:n>1&&n--,a=6*n<1?e+6*(r-e)*n:2*n<1?r:3*n<2?e+(r-e)*(2/3-n)*6:e,i[c]=255*a;return i}},n.hsl=function(t){var e,r,n=t[0]/255,i=t[1]/255,a=t[2]/255,o=Math.min(n,i,a),s=Math.max(n,i,a),l=s-o;return s===o?e=0:n===s?e=(i-a)/l:i===s?e=2+(a-n)/l:a===s&&(e=4+(n-i)/l),(e=Math.min(60*e,360))<0&&(e+=360),r=(o+s)/2,[e,100*(s===o?0:r<=.5?l/(s+o):l/(2-s-o)),100*r]}},10520:function(t){\"use strict\";t.exports={name:\"rgb\",min:[0,0,0],max:[255,255,255],channel:[\"red\",\"green\",\"blue\"],alias:[\"RGB\"]}},78171:function(t){t.exports={AFG:\"afghan\",ALA:\"\\\\b\\\\wland\",ALB:\"albania\",DZA:\"algeria\",ASM:\"^(?=.*americ).*samoa\",AND:\"andorra\",AGO:\"angola\",AIA:\"anguill?a\",ATA:\"antarctica\",ATG:\"antigua\",ARG:\"argentin\",ARM:\"armenia\",ABW:\"^(?!.*bonaire).*\\\\baruba\",AUS:\"australia\",AUT:\"^(?!.*hungary).*austria|\\\\baustri.*\\\\bemp\",AZE:\"azerbaijan\",BHS:\"bahamas\",BHR:\"bahrain\",BGD:\"bangladesh|^(?=.*east).*paki?stan\",BRB:\"barbados\",BLR:\"belarus|byelo\",BEL:\"^(?!.*luxem).*belgium\",BLZ:\"belize|^(?=.*british).*honduras\",BEN:\"benin|dahome\",BMU:\"bermuda\",BTN:\"bhutan\",BOL:\"bolivia\",BES:\"^(?=.*bonaire).*eustatius|^(?=.*carib).*netherlands|\\\\bbes.?islands\",BIH:\"herzegovina|bosnia\",BWA:\"botswana|bechuana\",BVT:\"bouvet\",BRA:\"brazil\",IOT:\"british.?indian.?ocean\",BRN:\"brunei\",BGR:\"bulgaria\",BFA:\"burkina|\\\\bfaso|upper.?volta\",BDI:\"burundi\",CPV:\"verde\",KHM:\"cambodia|kampuchea|khmer\",CMR:\"cameroon\",CAN:\"canada\",CYM:\"cayman\",CAF:\"\\\\bcentral.african.republic\",TCD:\"\\\\bchad\",CHL:\"\\\\bchile\",CHN:\"^(?!.*\\\\bmac)(?!.*\\\\bhong)(?!.*\\\\btai)(?!.*\\\\brep).*china|^(?=.*peo)(?=.*rep).*china\",CXR:\"christmas\",CCK:\"\\\\bcocos|keeling\",COL:\"colombia\",COM:\"comoro\",COG:\"^(?!.*\\\\bdem)(?!.*\\\\bd[\\\\.]?r)(?!.*kinshasa)(?!.*zaire)(?!.*belg)(?!.*l.opoldville)(?!.*free).*\\\\bcongo\",COK:\"\\\\bcook\",CRI:\"costa.?rica\",CIV:\"ivoire|ivory\",HRV:\"croatia\",CUB:\"\\\\bcuba\",CUW:\"^(?!.*bonaire).*\\\\bcura(c|ç)ao\",CYP:\"cyprus\",CSK:\"czechoslovakia\",CZE:\"^(?=.*rep).*czech|czechia|bohemia\",COD:\"\\\\bdem.*congo|congo.*\\\\bdem|congo.*\\\\bd[\\\\.]?r|\\\\bd[\\\\.]?r.*congo|belgian.?congo|congo.?free.?state|kinshasa|zaire|l.opoldville|drc|droc|rdc\",DNK:\"denmark\",DJI:\"djibouti\",DMA:\"dominica(?!n)\",DOM:\"dominican.rep\",ECU:\"ecuador\",EGY:\"egypt\",SLV:\"el.?salvador\",GNQ:\"guine.*eq|eq.*guine|^(?=.*span).*guinea\",ERI:\"eritrea\",EST:\"estonia\",ETH:\"ethiopia|abyssinia\",FLK:\"falkland|malvinas\",FRO:\"faroe|faeroe\",FJI:\"fiji\",FIN:\"finland\",FRA:\"^(?!.*\\\\bdep)(?!.*martinique).*france|french.?republic|\\\\bgaul\",GUF:\"^(?=.*french).*guiana\",PYF:\"french.?polynesia|tahiti\",ATF:\"french.?southern\",GAB:\"gabon\",GMB:\"gambia\",GEO:\"^(?!.*south).*georgia\",DDR:\"german.?democratic.?republic|democratic.?republic.*germany|east.germany\",DEU:\"^(?!.*east).*germany|^(?=.*\\\\bfed.*\\\\brep).*german\",GHA:\"ghana|gold.?coast\",GIB:\"gibraltar\",GRC:\"greece|hellenic|hellas\",GRL:\"greenland\",GRD:\"grenada\",GLP:\"guadeloupe\",GUM:\"\\\\bguam\",GTM:\"guatemala\",GGY:\"guernsey\",GIN:\"^(?!.*eq)(?!.*span)(?!.*bissau)(?!.*portu)(?!.*new).*guinea\",GNB:\"bissau|^(?=.*portu).*guinea\",GUY:\"guyana|british.?guiana\",HTI:\"haiti\",HMD:\"heard.*mcdonald\",VAT:\"holy.?see|vatican|papal.?st\",HND:\"^(?!.*brit).*honduras\",HKG:\"hong.?kong\",HUN:\"^(?!.*austr).*hungary\",ISL:\"iceland\",IND:\"india(?!.*ocea)\",IDN:\"indonesia\",IRN:\"\\\\biran|persia\",IRQ:\"\\\\biraq|mesopotamia\",IRL:\"(^ireland)|(^republic.*ireland)\",IMN:\"^(?=.*isle).*\\\\bman\",ISR:\"israel\",ITA:\"italy\",JAM:\"jamaica\",JPN:\"japan\",JEY:\"jersey\",JOR:\"jordan\",KAZ:\"kazak\",KEN:\"kenya|british.?east.?africa|east.?africa.?prot\",KIR:\"kiribati\",PRK:\"^(?=.*democrat|people|north|d.*p.*.r).*\\\\bkorea|dprk|korea.*(d.*p.*r)\",KWT:\"kuwait\",KGZ:\"kyrgyz|kirghiz\",LAO:\"\\\\blaos?\\\\b\",LVA:\"latvia\",LBN:\"lebanon\",LSO:\"lesotho|basuto\",LBR:\"liberia\",LBY:\"libya\",LIE:\"liechtenstein\",LTU:\"lithuania\",LUX:\"^(?!.*belg).*luxem\",MAC:\"maca(o|u)\",MDG:\"madagascar|malagasy\",MWI:\"malawi|nyasa\",MYS:\"malaysia\",MDV:\"maldive\",MLI:\"\\\\bmali\\\\b\",MLT:\"\\\\bmalta\",MHL:\"marshall\",MTQ:\"martinique\",MRT:\"mauritania\",MUS:\"mauritius\",MYT:\"\\\\bmayotte\",MEX:\"\\\\bmexic\",FSM:\"fed.*micronesia|micronesia.*fed\",MCO:\"monaco\",MNG:\"mongolia\",MNE:\"^(?!.*serbia).*montenegro\",MSR:\"montserrat\",MAR:\"morocco|\\\\bmaroc\",MOZ:\"mozambique\",MMR:\"myanmar|burma\",NAM:\"namibia\",NRU:\"nauru\",NPL:\"nepal\",NLD:\"^(?!.*\\\\bant)(?!.*\\\\bcarib).*netherlands\",ANT:\"^(?=.*\\\\bant).*(nether|dutch)\",NCL:\"new.?caledonia\",NZL:\"new.?zealand\",NIC:\"nicaragua\",NER:\"\\\\bniger(?!ia)\",NGA:\"nigeria\",NIU:\"niue\",NFK:\"norfolk\",MNP:\"mariana\",NOR:\"norway\",OMN:\"\\\\boman|trucial\",PAK:\"^(?!.*east).*paki?stan\",PLW:\"palau\",PSE:\"palestin|\\\\bgaza|west.?bank\",PAN:\"panama\",PNG:\"papua|new.?guinea\",PRY:\"paraguay\",PER:\"peru\",PHL:\"philippines\",PCN:\"pitcairn\",POL:\"poland\",PRT:\"portugal\",PRI:\"puerto.?rico\",QAT:\"qatar\",KOR:\"^(?!.*d.*p.*r)(?!.*democrat)(?!.*people)(?!.*north).*\\\\bkorea(?!.*d.*p.*r)\",MDA:\"moldov|b(a|e)ssarabia\",REU:\"r(e|é)union\",ROU:\"r(o|u|ou)mania\",RUS:\"\\\\brussia|soviet.?union|u\\\\.?s\\\\.?s\\\\.?r|socialist.?republics\",RWA:\"rwanda\",BLM:\"barth(e|é)lemy\",SHN:\"helena\",KNA:\"kitts|\\\\bnevis\",LCA:\"\\\\blucia\",MAF:\"^(?=.*collectivity).*martin|^(?=.*france).*martin(?!ique)|^(?=.*french).*martin(?!ique)\",SPM:\"miquelon\",VCT:\"vincent\",WSM:\"^(?!.*amer).*samoa\",SMR:\"san.?marino\",STP:\"\\\\bs(a|ã)o.?tom(e|é)\",SAU:\"\\\\bsa\\\\w*.?arabia\",SEN:\"senegal\",SRB:\"^(?!.*monte).*serbia\",SYC:\"seychell\",SLE:\"sierra\",SGP:\"singapore\",SXM:\"^(?!.*martin)(?!.*saba).*maarten\",SVK:\"^(?!.*cze).*slovak\",SVN:\"slovenia\",SLB:\"solomon\",SOM:\"somali\",ZAF:\"south.africa|s\\\\\\\\..?africa\",SGS:\"south.?georgia|sandwich\",SSD:\"\\\\bs\\\\w*.?sudan\",ESP:\"spain\",LKA:\"sri.?lanka|ceylon\",SDN:\"^(?!.*\\\\bs(?!u)).*sudan\",SUR:\"surinam|dutch.?guiana\",SJM:\"svalbard\",SWZ:\"swaziland\",SWE:\"sweden\",CHE:\"switz|swiss\",SYR:\"syria\",TWN:\"taiwan|taipei|formosa|^(?!.*peo)(?=.*rep).*china\",TJK:\"tajik\",THA:\"thailand|\\\\bsiam\",MKD:\"macedonia|fyrom\",TLS:\"^(?=.*leste).*timor|^(?=.*east).*timor\",TGO:\"togo\",TKL:\"tokelau\",TON:\"tonga\",TTO:\"trinidad|tobago\",TUN:\"tunisia\",TUR:\"turkey\",TKM:\"turkmen\",TCA:\"turks\",TUV:\"tuvalu\",UGA:\"uganda\",UKR:\"ukrain\",ARE:\"emirates|^u\\\\.?a\\\\.?e\\\\.?$|united.?arab.?em\",GBR:\"united.?kingdom|britain|^u\\\\.?k\\\\.?$\",TZA:\"tanzania\",USA:\"united.?states\\\\b(?!.*islands)|\\\\bu\\\\.?s\\\\.?a\\\\.?\\\\b|^\\\\s*u\\\\.?s\\\\.?\\\\b(?!.*islands)\",UMI:\"minor.?outlying.?is\",URY:\"uruguay\",UZB:\"uzbek\",VUT:\"vanuatu|new.?hebrides\",VEN:\"venezuela\",VNM:\"^(?!.*republic).*viet.?nam|^(?=.*socialist).*viet.?nam\",VGB:\"^(?=.*\\\\bu\\\\.?\\\\s?k).*virgin|^(?=.*brit).*virgin|^(?=.*kingdom).*virgin\",VIR:\"^(?=.*\\\\bu\\\\.?\\\\s?s).*virgin|^(?=.*states).*virgin\",WLF:\"futuna|wallis\",ESH:\"western.sahara\",YEM:\"^(?!.*arab)(?!.*north)(?!.*sana)(?!.*peo)(?!.*dem)(?!.*south)(?!.*aden)(?!.*\\\\bp\\\\.?d\\\\.?r).*yemen\",YMD:\"^(?=.*peo).*yemen|^(?!.*rep)(?=.*dem).*yemen|^(?=.*south).*yemen|^(?=.*aden).*yemen|^(?=.*\\\\bp\\\\.?d\\\\.?r).*yemen\",YUG:\"yugoslavia\",ZMB:\"zambia|northern.?rhodesia\",EAZ:\"zanzibar\",ZWE:\"zimbabwe|^(?!.*northern).*rhodesia\"}},59518:function(t,e,r){\"use strict\";t.exports={parse:r(86029),stringify:r(38211)}},87724:function(t,e,r){\"use strict\";var n=r(23648);t.exports={isSize:function(t){return/^[\\d\\.]/.test(t)||-1!==t.indexOf(\"/\")||-1!==n.indexOf(t)}}},86029:function(t,e,r){\"use strict\";var n=r(80886),i=r(54324),a=r(94316),o=r(99803),s=r(87486),l=r(2362),c=r(28089),u=r(87724).isSize;t.exports=f;var h=f.cache={};function f(t){if(\"string\"!=typeof t)throw new Error(\"Font argument must be a string.\");if(h[t])return h[t];if(\"\"===t)throw new Error(\"Cannot parse an empty string.\");if(-1!==a.indexOf(t))return h[t]={system:t};for(var e,r={style:\"normal\",variant:\"normal\",weight:\"normal\",stretch:\"normal\",lineHeight:\"normal\",size:\"1rem\",family:[\"serif\"]},f=c(t,/\\s+/);e=f.shift();){if(-1!==i.indexOf(e))return[\"style\",\"variant\",\"weight\",\"stretch\"].forEach((function(t){r[t]=e})),h[t]=r;if(-1===s.indexOf(e))if(\"normal\"!==e&&\"small-caps\"!==e)if(-1===l.indexOf(e)){if(-1===o.indexOf(e)){if(u(e)){var d=c(e,\"/\");if(r.size=d[0],null!=d[1]?r.lineHeight=p(d[1]):\"/\"===f[0]&&(f.shift(),r.lineHeight=p(f.shift())),!f.length)throw new Error(\"Missing required font-family.\");return r.family=c(f.join(\" \"),/\\s*,\\s*/).map(n),h[t]=r}throw new Error(\"Unknown or unsupported font token: \"+e)}r.weight=e}else r.stretch=e;else r.variant=e;else r.style=e}throw new Error(\"Missing required font-size.\")}function p(t){var e=parseFloat(t);return e.toString()===t?e:t}},38211:function(t,e,r){\"use strict\";var n=r(6807),i=r(87724).isSize,a=d(r(54324)),o=d(r(94316)),s=d(r(99803)),l=d(r(87486)),c=d(r(2362)),u={normal:1,\"small-caps\":1},h={serif:1,\"sans-serif\":1,monospace:1,cursive:1,fantasy:1,\"system-ui\":1},f=\"serif\";function p(t,e){if(t&&!e[t]&&!a[t])throw Error(\"Unknown keyword `\"+t+\"`\");return t}function d(t){for(var e={},r=0;r0?\" \".concat(e[5]):\"\",\" {\")),r+=t(e),n&&(r+=\"}\"),e[2]&&(r+=\"}\"),e[4]&&(r+=\"}\"),r})).join(\"\")},e.i=function(t,r,n,i,a){\"string\"==typeof t&&(t=[[null,t,void 0]]);var o={};if(n)for(var s=0;s0?\" \".concat(u[5]):\"\",\" {\").concat(u[1],\"}\")),u[5]=a),r&&(u[2]?(u[1]=\"@media \".concat(u[2],\" {\").concat(u[1],\"}\"),u[2]=r):u[2]=r),i&&(u[4]?(u[1]=\"@supports (\".concat(u[4],\") {\").concat(u[1],\"}\"),u[4]=i):u[4]=\"\".concat(i)),e.push(u))}},e}},62133:function(t){\"use strict\";t.exports=function(t,e){return e||(e={}),t?(t=String(t.__esModule?t.default:t),/^['\"].*['\"]$/.test(t)&&(t=t.slice(1,-1)),e.hash&&(t+=e.hash),/[\"'() \\t\\n]|(%20)/.test(t)||e.needQuotes?'\"'.concat(t.replace(/\"/g,'\\\\\"').replace(/\\n/g,\"\\\\n\"),'\"'):t):t}},22413:function(t){\"use strict\";t.exports=function(t){return t[1]}},84510:function(t,e,r){\"use strict\";var n,i=r(80299),a=r(9557),o=r(6887),s=r(86591),l=r(76504),c=r(29854),u=Function.prototype.bind,h=Object.defineProperty,f=Object.prototype.hasOwnProperty;n=function(t,e,r){var n,i=a(e)&&o(e.value);return delete(n=s(e)).writable,delete n.value,n.get=function(){return!r.overwriteDefinition&&f.call(this,t)?i:(e.value=u.call(i,r.resolveContext?r.resolveContext(this):this),h(this,t,e),this[t])},n},t.exports=function(t){var e=l(arguments[1]);return i(e.resolveContext)&&o(e.resolveContext),c(t,(function(t,r){return n(r,t,e)}))}},91819:function(t,e,r){\"use strict\";var n=r(80299),i=r(63461),a=r(1920),o=r(76504),s=r(2338),l=t.exports=function(t,e){var r,i,l,c,u;return arguments.length<2||\"string\"!=typeof t?(c=e,e=t,t=null):c=arguments[2],n(t)?(r=s.call(t,\"c\"),i=s.call(t,\"e\"),l=s.call(t,\"w\")):(r=l=!0,i=!1),u={value:e,configurable:r,enumerable:i,writable:l},c?a(o(c),u):u};l.gs=function(t,e,r){var l,c,u,h;return\"string\"!=typeof t?(u=r,r=e,e=t,t=null):u=arguments[3],n(e)?i(e)?n(r)?i(r)||(u=r,r=void 0):r=void 0:(u=e,e=r=void 0):e=void 0,n(t)?(l=s.call(t,\"c\"),c=s.call(t,\"e\")):(l=!0,c=!1),h={get:e,set:r,configurable:l,enumerable:c},u?a(o(u),h):h}},29725:function(t,e,r){\"use strict\";function n(t,e){return te?1:t>=e?0:NaN}r.d(e,{V_:function(){return n},T9:function(){return s},i2:function(){return c},Am:function(){return u},jk:function(){return h},y1:function(){return f},cz:function(){return p}}),1===(i=n).length&&(a=i,i=function(t,e){return n(a(t),e)});var i,a,o=Array.prototype;function s(t,e){var r,n,i=t.length,a=-1;if(null==e){for(;++a=r)for(n=r;++an&&(n=r)}else for(;++a=r)for(n=r;++an&&(n=r);return n}function l(t){return null===t?NaN:+t}function c(t,e){var r,n=t.length,i=n,a=-1,o=0;if(null==e)for(;++a=0;)for(e=(n=t[i]).length;--e>=0;)r[--o]=n[e];return r}function h(t,e){var r,n,i=t.length,a=-1;if(null==e){for(;++a=r)for(n=r;++ar&&(n=r)}else for(;++a=r)for(n=r;++ar&&(n=r);return n}function f(t,e,r){t=+t,e=+e,r=(i=arguments.length)<2?(e=t,t=0,1):i<3?1:+r;for(var n=-1,i=0|Math.max(0,Math.ceil((e-t)/r)),a=new Array(i);++n=n.length)return null!=t&&r.sort(t),null!=e?e(r):r;for(var c,u,h,f=-1,p=r.length,d=n[i++],m=o(),g=s();++fn.length)return t;var a,o=i[r-1];return null!=e&&r>=n.length?a=t.entries():(a=[],t.each((function(t,e){a.push({key:e,values:s(t,r)})}))),null!=o?a.sort((function(t,e){return o(t.key,e.key)})):a}return r={object:function(t){return a(t,0,l,c)},map:function(t){return a(t,0,u,h)},entries:function(t){return s(a(t,0,u,h),0)},key:function(t){return n.push(t),r},sortKeys:function(t){return i[n.length-1]=t,r},sortValues:function(e){return t=e,r},rollup:function(t){return e=t,r}}}function l(){return{}}function c(t,e,r){t[e]=r}function u(){return o()}function h(t,e,r){t.set(e,r)}function f(){}var p=o.prototype;f.prototype=function(t,e){var r=new f;if(t instanceof f)t.each((function(t){r.add(t)}));else if(t){var n=-1,i=t.length;if(null==e)for(;++n=(a=(m+y)/2))?m=a:y=a,(u=r>=(o=(g+v)/2))?g=o:v=o,i=p,!(p=p[h=u<<1|c]))return i[h]=d,t;if(s=+t._x.call(null,p.data),l=+t._y.call(null,p.data),e===s&&r===l)return d.next=p,i?i[h]=d:t._root=d,t;do{i=i?i[h]=new Array(4):t._root=new Array(4),(c=e>=(a=(m+y)/2))?m=a:y=a,(u=r>=(o=(g+v)/2))?g=o:v=o}while((h=u<<1|c)==(f=(l>=o)<<1|s>=a));return i[f]=p,i[h]=d,t}function s(t,e,r,n,i){this.node=t,this.x0=e,this.y0=r,this.x1=n,this.y1=i}function l(t){return t[0]}function c(t){return t[1]}function u(t,e,r){var n=new h(null==e?l:e,null==r?c:r,NaN,NaN,NaN,NaN);return null==t?n:n.addAll(t)}function h(t,e,r,n,i,a){this._x=t,this._y=e,this._x0=r,this._y0=n,this._x1=i,this._y1=a,this._root=void 0}function f(t){for(var e={data:t.data},r=e;t=t.next;)r=r.next={data:t.data};return e}r.r(e),r.d(e,{forceCenter:function(){return n},forceCollide:function(){return g},forceLink:function(){return _},forceManyBody:function(){return $},forceRadial:function(){return J},forceSimulation:function(){return X},forceX:function(){return K},forceY:function(){return Q}});var p=u.prototype=h.prototype;function d(t){return t.x+t.vx}function m(t){return t.y+t.vy}function g(t){var e,r,n=1,o=1;function s(){for(var t,i,s,c,h,f,p,g=e.length,y=0;yc+d||ih+d||os.index){var m=c-l.x-l.vx,g=h-l.y-l.vy,y=m*m+g*g;yt.r&&(t.r=t[e].r)}function c(){if(e){var n,i,a=e.length;for(r=new Array(a),n=0;nh&&(h=n),if&&(f=i));if(c>h||u>f)return this;for(this.cover(c,u).cover(h,f),r=0;rt||t>=i||n>e||e>=a;)switch(s=(ep||(a=c.y0)>d||(o=c.x1)=v)<<1|t>=y)&&(c=m[m.length-1],m[m.length-1]=m[m.length-1-u],m[m.length-1-u]=c)}else{var x=t-+this._x.call(null,g.data),_=e-+this._y.call(null,g.data),b=x*x+_*_;if(b=(s=(d+g)/2))?d=s:g=s,(u=o>=(l=(m+y)/2))?m=l:y=l,e=p,!(p=p[h=u<<1|c]))return this;if(!p.length)break;(e[h+1&3]||e[h+2&3]||e[h+3&3])&&(r=e,f=h)}for(;p.data!==t;)if(n=p,!(p=p.next))return this;return(i=p.next)&&delete p.next,n?(i?n.next=i:delete n.next,this):e?(i?e[h]=i:delete e[h],(p=e[0]||e[1]||e[2]||e[3])&&p===(e[3]||e[2]||e[1]||e[0])&&!p.length&&(r?r[f]=p:this._root=p),this):(this._root=i,this)},p.removeAll=function(t){for(var e=0,r=t.length;e=0&&(e=t.slice(r+1),t=t.slice(0,r)),t&&!n.hasOwnProperty(t))throw new Error(\"unknown type: \"+t);return{type:t,name:e}}))),o=-1,s=a.length;if(!(arguments.length<2)){if(null!=e&&\"function\"!=typeof e)throw new Error(\"invalid callback: \"+e);for(;++o0)for(var r,n,i=new Array(r),a=0;a=0&&e._call.call(null,t),e=e._next;--C}()}finally{C=0,function(){for(var t,e,r=M,n=1/0;r;)r._call?(n>r._time&&(n=r._time),t=r,r=r._next):(e=r._next,r._next=null,r=t?t._next=e:M=e);S=t,H(n)}(),O=0}}function q(){var t=R.now(),e=t-z;e>P&&(D-=e,z=t)}function H(t){C||(L&&(L=clearTimeout(L)),t-O>24?(t<1/0&&(L=setTimeout(V,t-R.now()-D)),I&&(I=clearInterval(I))):(I||(z=R.now(),I=setInterval(q,P)),C=1,F(V)))}function G(t){return t.x}function Z(t){return t.y}j.prototype=U.prototype={constructor:j,restart:function(t,e,r){if(\"function\"!=typeof t)throw new TypeError(\"callback is not a function\");r=(null==r?B():+r)+(null==e?0:+e),this._next||S===this||(S?S._next=this:M=this,S=this),this._call=t,this._time=r,H()},stop:function(){this._call&&(this._call=null,this._time=1/0,H())}};var W=10,Y=Math.PI*(3-Math.sqrt(5));function X(t){var e,r=1,n=.001,i=1-Math.pow(n,1/300),a=0,o=.6,s=(0,y.Tj)(),l=U(u),c=E(\"tick\",\"end\");function u(){h(),c.call(\"tick\",e),r1?(null==r?s.remove(t):s.set(t,p(r)),e):s.get(t)},find:function(e,r,n){var i,a,o,s,l,c=0,u=t.length;for(null==n?n=1/0:n*=n,c=0;c1?(c.on(t,r),e):c.on(t)}}}function $(){var t,e,r,n,o=i(-30),s=1,l=1/0,c=.81;function h(n){var i,a=t.length,o=u(t,G,Z).visitAfter(p);for(r=n,i=0;i=l)){(t.data!==e||t.next)&&(0===h&&(d+=(h=a())*h),0===f&&(d+=(f=a())*f),d1?n[0]+n.slice(2):n,+t.slice(r+1)]}r.d(e,{GP:function(){return f},OE:function(){return m}});var i,a=/^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;function o(t){if(!(e=a.exec(t)))throw new Error(\"invalid format: \"+t);var e;return new s({fill:e[1],align:e[2],sign:e[3],symbol:e[4],zero:e[5],width:e[6],comma:e[7],precision:e[8]&&e[8].slice(1),trim:e[9],type:e[10]})}function s(t){this.fill=void 0===t.fill?\" \":t.fill+\"\",this.align=void 0===t.align?\">\":t.align+\"\",this.sign=void 0===t.sign?\"-\":t.sign+\"\",this.symbol=void 0===t.symbol?\"\":t.symbol+\"\",this.zero=!!t.zero,this.width=void 0===t.width?void 0:+t.width,this.comma=!!t.comma,this.precision=void 0===t.precision?void 0:+t.precision,this.trim=!!t.trim,this.type=void 0===t.type?\"\":t.type+\"\"}function l(t,e){var r=n(t,e);if(!r)return t+\"\";var i=r[0],a=r[1];return a<0?\"0.\"+new Array(-a).join(\"0\")+i:i.length>a+1?i.slice(0,a+1)+\".\"+i.slice(a+1):i+new Array(a-i.length+2).join(\"0\")}o.prototype=s.prototype,s.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?\"0\":\"\")+(void 0===this.width?\"\":Math.max(1,0|this.width))+(this.comma?\",\":\"\")+(void 0===this.precision?\"\":\".\"+Math.max(0,0|this.precision))+(this.trim?\"~\":\"\")+this.type};var c={\"%\":function(t,e){return(100*t).toFixed(e)},b:function(t){return Math.round(t).toString(2)},c:function(t){return t+\"\"},d:function(t){return Math.abs(t=Math.round(t))>=1e21?t.toLocaleString(\"en\").replace(/,/g,\"\"):t.toString(10)},e:function(t,e){return t.toExponential(e)},f:function(t,e){return t.toFixed(e)},g:function(t,e){return t.toPrecision(e)},o:function(t){return Math.round(t).toString(8)},p:function(t,e){return l(100*t,e)},r:l,s:function(t,e){var r=n(t,e);if(!r)return t+\"\";var a=r[0],o=r[1],s=o-(i=3*Math.max(-8,Math.min(8,Math.floor(o/3))))+1,l=a.length;return s===l?a:s>l?a+new Array(s-l+1).join(\"0\"):s>0?a.slice(0,s)+\".\"+a.slice(s):\"0.\"+new Array(1-s).join(\"0\")+n(t,Math.max(0,e+s-1))[0]},X:function(t){return Math.round(t).toString(16).toUpperCase()},x:function(t){return Math.round(t).toString(16)}};function u(t){return t}var h,f,p=Array.prototype.map,d=[\"y\",\"z\",\"a\",\"f\",\"p\",\"n\",\"µ\",\"m\",\"\",\"k\",\"M\",\"G\",\"T\",\"P\",\"E\",\"Z\",\"Y\"];function m(t){var e,r,a=void 0===t.grouping||void 0===t.thousands?u:(e=p.call(t.grouping,Number),r=t.thousands+\"\",function(t,n){for(var i=t.length,a=[],o=0,s=e[0],l=0;i>0&&s>0&&(l+s+1>n&&(s=Math.max(1,n-l)),a.push(t.substring(i-=s,i+s)),!((l+=s+1)>n));)s=e[o=(o+1)%e.length];return a.reverse().join(r)}),s=void 0===t.currency?\"\":t.currency[0]+\"\",l=void 0===t.currency?\"\":t.currency[1]+\"\",h=void 0===t.decimal?\".\":t.decimal+\"\",f=void 0===t.numerals?u:function(t){return function(e){return e.replace(/[0-9]/g,(function(e){return t[+e]}))}}(p.call(t.numerals,String)),m=void 0===t.percent?\"%\":t.percent+\"\",g=void 0===t.minus?\"-\":t.minus+\"\",y=void 0===t.nan?\"NaN\":t.nan+\"\";function v(t){var e=(t=o(t)).fill,r=t.align,n=t.sign,u=t.symbol,p=t.zero,v=t.width,x=t.comma,_=t.precision,b=t.trim,w=t.type;\"n\"===w?(x=!0,w=\"g\"):c[w]||(void 0===_&&(_=12),b=!0,w=\"g\"),(p||\"0\"===e&&\"=\"===r)&&(p=!0,e=\"0\",r=\"=\");var T=\"$\"===u?s:\"#\"===u&&/[boxX]/.test(w)?\"0\"+w.toLowerCase():\"\",k=\"$\"===u?l:/[%p]/.test(w)?m:\"\",A=c[w],M=/[defgprs%]/.test(w);function S(t){var o,s,l,c=T,u=k;if(\"c\"===w)u=A(t)+u,t=\"\";else{var m=(t=+t)<0||1/t<0;if(t=isNaN(t)?y:A(Math.abs(t),_),b&&(t=function(t){t:for(var e,r=t.length,n=1,i=-1;n0&&(i=0)}return i>0?t.slice(0,i)+t.slice(e+1):t}(t)),m&&0==+t&&\"+\"!==n&&(m=!1),c=(m?\"(\"===n?n:g:\"-\"===n||\"(\"===n?\"\":n)+c,u=(\"s\"===w?d[8+i/3]:\"\")+u+(m&&\"(\"===n?\")\":\"\"),M)for(o=-1,s=t.length;++o(l=t.charCodeAt(o))||l>57){u=(46===l?h+t.slice(o+1):t.slice(o))+u,t=t.slice(0,o);break}}x&&!p&&(t=a(t,1/0));var S=c.length+t.length+u.length,E=S>1)+c+t+u+E.slice(S);break;default:t=E+c+t+u}return f(t)}return _=void 0===_?6:/[gprs]/.test(w)?Math.max(1,Math.min(21,_)):Math.max(0,Math.min(20,_)),S.toString=function(){return t+\"\"},S}return{format:v,formatPrefix:function(t,e){var r,i=v(((t=o(t)).type=\"f\",t)),a=3*Math.max(-8,Math.min(8,Math.floor((r=e,((r=n(Math.abs(r)))?r[1]:NaN)/3)))),s=Math.pow(10,-a),l=d[8+a/3];return function(t){return i(s*t)+l}}}}h=m({decimal:\".\",thousands:\",\",grouping:[3],currency:[\"$\",\"\"],minus:\"-\"}),f=h.format,h.formatPrefix},75987:function(t,e,r){\"use strict\";r.r(e),r.d(e,{geoAiry:function(){return D},geoAiryRaw:function(){return O},geoAitoff:function(){return F},geoAitoffRaw:function(){return R},geoArmadillo:function(){return N},geoArmadilloRaw:function(){return B},geoAugust:function(){return U},geoAugustRaw:function(){return j},geoBaker:function(){return G},geoBakerRaw:function(){return H},geoBerghaus:function(){return Y},geoBerghausRaw:function(){return W},geoBertin1953:function(){return rt},geoBertin1953Raw:function(){return et},geoBoggs:function(){return ut},geoBoggsRaw:function(){return ct},geoBonne:function(){return mt},geoBonneRaw:function(){return dt},geoBottomley:function(){return yt},geoBottomleyRaw:function(){return gt},geoBromley:function(){return xt},geoBromleyRaw:function(){return vt},geoChamberlin:function(){return Et},geoChamberlinAfrica:function(){return St},geoChamberlinRaw:function(){return At},geoCollignon:function(){return Lt},geoCollignonRaw:function(){return Ct},geoCraig:function(){return Pt},geoCraigRaw:function(){return It},geoCraster:function(){return Dt},geoCrasterRaw:function(){return Ot},geoCylindricalEqualArea:function(){return Ft},geoCylindricalEqualAreaRaw:function(){return Rt},geoCylindricalStereographic:function(){return Nt},geoCylindricalStereographicRaw:function(){return Bt},geoEckert1:function(){return Ut},geoEckert1Raw:function(){return jt},geoEckert2:function(){return qt},geoEckert2Raw:function(){return Vt},geoEckert3:function(){return Gt},geoEckert3Raw:function(){return Ht},geoEckert4:function(){return Wt},geoEckert4Raw:function(){return Zt},geoEckert5:function(){return Xt},geoEckert5Raw:function(){return Yt},geoEckert6:function(){return Jt},geoEckert6Raw:function(){return $t},geoEisenlohr:function(){return te},geoEisenlohrRaw:function(){return Qt},geoFahey:function(){return ne},geoFaheyRaw:function(){return re},geoFoucaut:function(){return ae},geoFoucautRaw:function(){return ie},geoFoucautSinusoidal:function(){return se},geoFoucautSinusoidalRaw:function(){return oe},geoGilbert:function(){return fe},geoGingery:function(){return ge},geoGingeryRaw:function(){return pe},geoGinzburg4:function(){return xe},geoGinzburg4Raw:function(){return ve},geoGinzburg5:function(){return be},geoGinzburg5Raw:function(){return _e},geoGinzburg6:function(){return Te},geoGinzburg6Raw:function(){return we},geoGinzburg8:function(){return Ae},geoGinzburg8Raw:function(){return ke},geoGinzburg9:function(){return Se},geoGinzburg9Raw:function(){return Me},geoGringorten:function(){return Le},geoGringortenQuincuncial:function(){return ii},geoGringortenRaw:function(){return Ce},geoGuyou:function(){return Oe},geoGuyouRaw:function(){return ze},geoHammer:function(){return K},geoHammerRaw:function(){return $},geoHammerRetroazimuthal:function(){return Be},geoHammerRetroazimuthalRaw:function(){return Re},geoHealpix:function(){return We},geoHealpixRaw:function(){return qe},geoHill:function(){return Xe},geoHillRaw:function(){return Ye},geoHomolosine:function(){return er},geoHomolosineRaw:function(){return tr},geoHufnagel:function(){return nr},geoHufnagelRaw:function(){return rr},geoHyperelliptical:function(){return sr},geoHyperellipticalRaw:function(){return or},geoInterrupt:function(){return ur},geoInterruptedBoggs:function(){return fr},geoInterruptedHomolosine:function(){return dr},geoInterruptedMollweide:function(){return gr},geoInterruptedMollweideHemispheres:function(){return vr},geoInterruptedQuarticAuthalic:function(){return hn},geoInterruptedSinuMollweide:function(){return _r},geoInterruptedSinusoidal:function(){return wr},geoKavrayskiy7:function(){return kr},geoKavrayskiy7Raw:function(){return Tr},geoLagrange:function(){return Mr},geoLagrangeRaw:function(){return Ar},geoLarrivee:function(){return Cr},geoLarriveeRaw:function(){return Er},geoLaskowski:function(){return Ir},geoLaskowskiRaw:function(){return Lr},geoLittrow:function(){return zr},geoLittrowRaw:function(){return Pr},geoLoximuthal:function(){return Dr},geoLoximuthalRaw:function(){return Or},geoMiller:function(){return Fr},geoMillerRaw:function(){return Rr},geoModifiedStereographic:function(){return Xr},geoModifiedStereographicAlaska:function(){return Hr},geoModifiedStereographicGs48:function(){return Gr},geoModifiedStereographicGs50:function(){return Zr},geoModifiedStereographicLee:function(){return Yr},geoModifiedStereographicMiller:function(){return Wr},geoModifiedStereographicRaw:function(){return Br},geoMollweide:function(){return ot},geoMollweideRaw:function(){return at},geoMtFlatPolarParabolic:function(){return Qr},geoMtFlatPolarParabolicRaw:function(){return Kr},geoMtFlatPolarQuartic:function(){return en},geoMtFlatPolarQuarticRaw:function(){return tn},geoMtFlatPolarSinusoidal:function(){return nn},geoMtFlatPolarSinusoidalRaw:function(){return rn},geoNaturalEarth:function(){return an.A},geoNaturalEarth2:function(){return sn},geoNaturalEarth2Raw:function(){return on},geoNaturalEarthRaw:function(){return an.P},geoNellHammer:function(){return cn},geoNellHammerRaw:function(){return ln},geoNicolosi:function(){return pn},geoNicolosiRaw:function(){return fn},geoPatterson:function(){return kn},geoPattersonRaw:function(){return Tn},geoPeirceQuincuncial:function(){return ai},geoPierceQuincuncial:function(){return ai},geoPolyconic:function(){return Mn},geoPolyconicRaw:function(){return An},geoPolyhedral:function(){return Pn},geoPolyhedralButterfly:function(){return Nn},geoPolyhedralCollignon:function(){return Vn},geoPolyhedralWaterman:function(){return qn},geoProject:function(){return Yn},geoQuantize:function(){return oi},geoQuincuncial:function(){return ni},geoRectangularPolyconic:function(){return li},geoRectangularPolyconicRaw:function(){return si},geoRobinson:function(){return hi},geoRobinsonRaw:function(){return ui},geoSatellite:function(){return pi},geoSatelliteRaw:function(){return fi},geoSinuMollweide:function(){return Qe},geoSinuMollweideRaw:function(){return Ke},geoSinusoidal:function(){return pt},geoSinusoidalRaw:function(){return ft},geoStitch:function(){return Pi},geoTimes:function(){return Oi},geoTimesRaw:function(){return zi},geoTwoPointAzimuthal:function(){return Bi},geoTwoPointAzimuthalRaw:function(){return Ri},geoTwoPointAzimuthalUsa:function(){return Fi},geoTwoPointEquidistant:function(){return Ui},geoTwoPointEquidistantRaw:function(){return Ni},geoTwoPointEquidistantUsa:function(){return ji},geoVanDerGrinten:function(){return qi},geoVanDerGrinten2:function(){return Gi},geoVanDerGrinten2Raw:function(){return Hi},geoVanDerGrinten3:function(){return Wi},geoVanDerGrinten3Raw:function(){return Zi},geoVanDerGrinten4:function(){return Xi},geoVanDerGrinten4Raw:function(){return Yi},geoVanDerGrintenRaw:function(){return Vi},geoWagner:function(){return Ji},geoWagner4:function(){return ra},geoWagner4Raw:function(){return ea},geoWagner6:function(){return ia},geoWagner6Raw:function(){return na},geoWagner7:function(){return Ki},geoWagnerRaw:function(){return $i},geoWiechel:function(){return oa},geoWiechelRaw:function(){return aa},geoWinkel3:function(){return la},geoWinkel3Raw:function(){return sa}});var n=r(94684),i=Math.abs,a=Math.atan,o=Math.atan2,s=(Math.ceil,Math.cos),l=Math.exp,c=Math.floor,u=Math.log,h=Math.max,f=Math.min,p=Math.pow,d=Math.round,m=Math.sign||function(t){return t>0?1:t<0?-1:0},g=Math.sin,y=Math.tan,v=1e-6,x=1e-12,_=Math.PI,b=_/2,w=_/4,T=Math.SQRT1_2,k=I(2),A=I(_),M=2*_,S=180/_,E=_/180;function C(t){return t>1?b:t<-1?-b:Math.asin(t)}function L(t){return t>1?0:t<-1?_:Math.acos(t)}function I(t){return t>0?Math.sqrt(t):0}function P(t){return(l(t)-l(-t))/2}function z(t){return(l(t)+l(-t))/2}function O(t){var e=y(t/2),r=2*u(s(t/2))/(e*e);function n(t,e){var n=s(t),i=s(e),a=g(e),o=i*n,l=-((1-o?u((1+o)/2)/(1-o):-.5)+r/(1+o));return[l*i*g(t),l*a]}return n.invert=function(e,n){var a,l=I(e*e+n*n),c=-t/2,h=50;if(!l)return[0,0];do{var f=c/2,p=s(f),d=g(f),m=d/p,y=-u(i(p));c-=a=(2/m*y-r*m-l)/(-y/(d*d)+1-r/(2*p*p))*(p<0?.7:1)}while(i(a)>v&&--h>0);var x=g(c);return[o(e*x,l*s(c)),C(n*x/l)]},n}function D(){var t=b,e=(0,n.U)(O),r=e(t);return r.radius=function(r){return arguments.length?e(t=r*E):t*S},r.scale(179.976).clipAngle(147)}function R(t,e){var r=s(e),n=function(t){return t?t/Math.sin(t):1}(L(r*s(t/=2)));return[2*r*g(t)*n,g(e)*n]}function F(){return(0,n.A)(R).scale(152.63)}function B(t){var e=g(t),r=s(t),n=t>=0?1:-1,a=y(n*t),l=(1+e-r)/2;function c(t,i){var c=s(i),u=s(t/=2);return[(1+c)*g(t),(n*i>-o(u,a)-.001?0:10*-n)+l+g(i)*r-(1+c)*e*u]}return c.invert=function(t,c){var u=0,h=0,f=50;do{var p=s(u),d=g(u),m=s(h),y=g(h),x=1+m,_=x*d-t,b=l+y*r-x*e*p-c,w=x*p/2,T=-d*y,k=e*x*d/2,A=r*m+e*p*y,M=T*k-A*w,S=(b*T-_*A)/M/2,E=(_*k-b*w)/M;i(E)>2&&(E/=2),u-=S,h-=E}while((i(S)>v||i(E)>v)&&--f>0);return n*h>-o(s(u),a)-.001?[2*u,h]:null},c}function N(){var t=20*E,e=t>=0?1:-1,r=y(e*t),i=(0,n.U)(B),a=i(t),l=a.stream;return a.parallel=function(n){return arguments.length?(r=y((e=(t=n*E)>=0?1:-1)*t),i(t)):t*S},a.stream=function(n){var i=a.rotate(),c=l(n),u=(a.rotate([0,0]),l(n)),h=a.precision();return a.rotate(i),c.sphere=function(){u.polygonStart(),u.lineStart();for(var n=-180*e;e*n<180;n+=90*e)u.point(n,90*e);if(t)for(;e*(n-=3*e*h)>=-180;)u.point(n,e*-o(s(n*E/2),r)*S);u.lineEnd(),u.polygonEnd()},c},a.scale(218.695).center([0,28.0974])}function j(t,e){var r=y(e/2),n=I(1-r*r),i=1+n*s(t/=2),a=g(t)*n/i,o=r/i,l=a*a,c=o*o;return[4/3*a*(3+l-3*c),4/3*o*(3+3*l-c)]}function U(){return(0,n.A)(j).scale(66.1603)}R.invert=function(t,e){if(!(t*t+4*e*e>_*_+v)){var r=t,n=e,a=25;do{var o,l=g(r),c=g(r/2),u=s(r/2),h=g(n),f=s(n),p=g(2*n),d=h*h,m=f*f,y=c*c,x=1-m*u*u,b=x?L(f*u)*I(o=1/x):o=0,w=2*b*f*c-t,T=b*h-e,k=o*(m*y+b*f*u*d),A=o*(.5*l*p-2*b*h*c),M=.25*o*(p*c-b*h*m*l),S=o*(d*u+b*y*f),E=A*M-S*k;if(!E)break;var C=(T*A-w*S)/E,P=(w*M-T*k)/E;r-=C,n-=P}while((i(C)>v||i(P)>v)&&--a>0);return[r,n]}},j.invert=function(t,e){if(e*=3/8,!(t*=3/8)&&i(e)>1)return null;var r=1+t*t+e*e,n=I((r-I(r*r-4*e*e))/2),a=C(n)/3,l=n?function(t){return u(t+I(t*t-1))}(i(e/n))/3:function(t){return u(t+I(t*t+1))}(i(t))/3,c=s(a),h=z(l),f=h*h-c*c;return[2*m(t)*o(P(l)*c,.25-f),2*m(e)*o(h*g(a),.25+f)]};var V=I(8),q=u(1+k);function H(t,e){var r=i(e);return rx&&--c>0);return[t/(s(o)*(V-1/g(o))),m(e)*o]};var Z=r(61957);function W(t){var e=2*_/t;function r(t,r){var n=(0,Z.j)(t,r);if(i(t)>b){var a=o(n[1],n[0]),l=I(n[0]*n[0]+n[1]*n[1]),c=e*d((a-b)/e)+b,u=o(g(a-=c),2-s(a));a=c+C(_/l*g(u))-u,n[0]=l*s(a),n[1]=l*g(a)}return n}return r.invert=function(t,r){var n=I(t*t+r*r);if(n>b){var i=o(r,t),l=e*d((i-b)/e)+b,c=i>l?-1:1,u=n*s(l-i),h=1/y(c*L((u-_)/I(_*(_-2*u)+n*n)));i=l+2*a((h+c*I(h*h-3))/3),t=n*s(i),r=n*g(i)}return Z.j.invert(t,r)},r}function Y(){var t=5,e=(0,n.U)(W),r=e(t),i=r.stream,a=.01,l=-s(a*E),c=g(a*E);return r.lobes=function(r){return arguments.length?e(t=+r):t},r.stream=function(e){var n=r.rotate(),u=i(e),h=(r.rotate([0,0]),i(e));return r.rotate(n),u.sphere=function(){h.polygonStart(),h.lineStart();for(var e=0,r=360/t,n=2*_/t,i=90-180/t,u=b;e0&&i(n)>v);return s<0?NaN:r}function tt(t,e,r){return void 0===e&&(e=40),void 0===r&&(r=x),function(n,a,o,s){var l,c,u;o=void 0===o?0:+o,s=void 0===s?0:+s;for(var h=0;hl)o-=c/=2,s-=u/=2;else{l=m;var g=(o>0?-1:1)*r,y=(s>0?-1:1)*r,v=t(o+g,s),x=t(o,s+y),_=(v[0]-f[0])/g,b=(v[1]-f[1])/g,w=(x[0]-f[0])/y,T=(x[1]-f[1])/y,k=T*_-b*w,A=(i(k)<.5?.5:1)/k;if(o+=c=(d*w-p*T)*A,s+=u=(p*b-d*_)*A,i(c)0&&(i[1]*=1+a/1.5*i[0]*i[0]),i}return e.invert=tt(e),e}function rt(){return(0,n.A)(et()).rotate([-16.5,-42]).scale(176.57).center([7.93,.09])}function nt(t,e){var r,n=t*g(e),a=30;do{e-=r=(e+g(e)-n)/(1+s(e))}while(i(r)>v&&--a>0);return e/2}function it(t,e,r){function n(n,i){return[t*n*s(i=nt(r,i)),e*g(i)]}return n.invert=function(n,i){return i=C(i/e),[n/(t*s(i)),C((2*i+g(2*i))/r)]},n}J.invert=function(t,e){var r=2*C(e/2);return[t*s(r/2)/s(r),r]};var at=it(k/b,k,_);function ot(){return(0,n.A)(at).scale(169.529)}var st=2.00276,lt=1.11072;function ct(t,e){var r=nt(_,e);return[st*t/(1/s(e)+lt/s(r)),(e+k*g(r))/st]}function ut(){return(0,n.A)(ct).scale(160.857)}function ht(t){var e=0,r=(0,n.U)(t),i=r(e);return i.parallel=function(t){return arguments.length?r(e=t*E):e*S},i}function ft(t,e){return[t*s(e),e]}function pt(){return(0,n.A)(ft).scale(152.63)}function dt(t){if(!t)return ft;var e=1/y(t);function r(r,n){var i=e+t-n,a=i?r*s(n)/i:i;return[i*g(a),e-i*s(a)]}return r.invert=function(r,n){var i=I(r*r+(n=e-n)*n),a=e+t-i;return[i/s(a)*o(r,n),a]},r}function mt(){return ht(dt).scale(123.082).center([0,26.1441]).parallel(45)}function gt(t){function e(e,r){var n=b-r,i=n?e*t*g(n)/n:n;return[n*g(i)/t,b-n*s(i)]}return e.invert=function(e,r){var n=e*t,i=b-r,a=I(n*n+i*i),s=o(n,i);return[(a?a/g(a):1)*s/t,b-a]},e}function yt(){var t=.5,e=(0,n.U)(gt),r=e(t);return r.fraction=function(r){return arguments.length?e(t=+r):t},r.scale(158.837)}ct.invert=function(t,e){var r,n,a=st*e,o=e<0?-w:w,l=25;do{n=a-k*g(o),o-=r=(g(2*o)+2*o-_*g(n))/(2*s(2*o)+2+_*s(n)*k*s(o))}while(i(r)>v&&--l>0);return n=a-k*g(o),[t*(1/s(n)+lt/s(o))/st,n]},ft.invert=function(t,e){return[t/s(e),e]};var vt=it(1,4/_,_);function xt(){return(0,n.A)(vt).scale(152.63)}var _t=r(30021),bt=r(30915);function wt(t,e,r,n,a,l){var c,u=s(l);if(i(t)>1||i(l)>1)c=L(r*a+e*n*u);else{var h=g(t/2),f=g(l/2);c=2*C(I(h*h+e*n*f*f))}return i(c)>v?[c,o(n*g(l),e*a-r*n*u)]:[0,0]}function Tt(t,e,r){return L((t*t+e*e-r*r)/(2*t*e))}function kt(t){return t-2*_*c((t+_)/(2*_))}function At(t,e,r){for(var n,i=[[t[0],t[1],g(t[1]),s(t[1])],[e[0],e[1],g(e[1]),s(e[1])],[r[0],r[1],g(r[1]),s(r[1])]],a=i[2],o=0;o<3;++o,a=n)n=i[o],a.v=wt(n[1]-a[1],a[3],a[2],n[3],n[2],n[0]-a[0]),a.point=[0,0];var l=Tt(i[0].v[0],i[2].v[0],i[1].v[0]),c=Tt(i[0].v[0],i[1].v[0],i[2].v[0]),u=_-l;i[2].point[1]=0,i[0].point[0]=-(i[1].point[0]=i[0].v[0]/2);var h=[i[2].point[0]=i[0].point[0]+i[2].v[0]*s(l),2*(i[0].point[1]=i[1].point[1]=i[2].v[0]*g(l))];return function(t,e){var r,n=g(e),a=s(e),o=new Array(3);for(r=0;r<3;++r){var l=i[r];if(o[r]=wt(e-l[1],l[3],l[2],a,n,t-l[0]),!o[r][0])return l.point;o[r][1]=kt(o[r][1]-l.v[1])}var f=h.slice();for(r=0;r<3;++r){var p=2==r?0:r+1,d=Tt(i[r].v[0],o[r][0],o[p][0]);o[r][1]<0&&(d=-d),r?1==r?(d=c-d,f[0]-=o[r][0]*s(d),f[1]-=o[r][0]*g(d)):(d=u-d,f[0]+=o[r][0]*s(d),f[1]+=o[r][0]*g(d)):(f[0]+=o[r][0]*s(d),f[1]-=o[r][0]*g(d))}return f[0]/=3,f[1]/=3,f}}function Mt(t){return t[0]*=E,t[1]*=E,t}function St(){return Et([0,22],[45,22],[22.5,-22]).scale(380).center([22.5,2])}function Et(t,e,r){var i=(0,_t.A)({type:\"MultiPoint\",coordinates:[t,e,r]}),a=[-i[0],-i[1]],o=(0,bt.A)(a),s=At(Mt(o(t)),Mt(o(e)),Mt(o(r)));s.invert=tt(s);var l=(0,n.A)(s).rotate(a),c=l.center;return delete l.rotate,l.center=function(t){return arguments.length?c(o(t)):o.invert(c())},l.clipAngle(90)}function Ct(t,e){var r=I(1-g(e));return[2/A*t*r,A*(1-r)]}function Lt(){return(0,n.A)(Ct).scale(95.6464).center([0,30])}function It(t){var e=y(t);function r(t,r){return[t,(t?t/g(t):1)*(g(r)*s(t)-e*s(r))]}return r.invert=e?function(t,r){t&&(r*=g(t)/t);var n=s(t);return[t,2*o(I(n*n+e*e-r*r)-n,e-r)]}:function(t,e){return[t,C(t?e*y(t)/t:e)]},r}function Pt(){return ht(It).scale(249.828).clipAngle(90)}Ct.invert=function(t,e){var r=(r=e/A-1)*r;return[r>0?t*I(_/r)/2:0,C(1-r)]};var zt=I(3);function Ot(t,e){return[zt*t*(2*s(2*e/3)-1)/A,zt*A*g(e/3)]}function Dt(){return(0,n.A)(Ot).scale(156.19)}function Rt(t){var e=s(t);function r(t,r){return[t*e,g(r)/e]}return r.invert=function(t,r){return[t/e,C(r*e)]},r}function Ft(){return ht(Rt).parallel(38.58).scale(195.044)}function Bt(t){var e=s(t);function r(t,r){return[t*e,(1+e)*y(r/2)]}return r.invert=function(t,r){return[t/e,2*a(r/(1+e))]},r}function Nt(){return ht(Bt).scale(124.75)}function jt(t,e){var r=I(8/(3*_));return[r*t*(1-i(e)/_),r*e]}function Ut(){return(0,n.A)(jt).scale(165.664)}function Vt(t,e){var r=I(4-3*g(i(e)));return[2/I(6*_)*t*r,m(e)*I(2*_/3)*(2-r)]}function qt(){return(0,n.A)(Vt).scale(165.664)}function Ht(t,e){var r=I(_*(4+_));return[2/r*t*(1+I(1-4*e*e/(_*_))),4/r*e]}function Gt(){return(0,n.A)(Ht).scale(180.739)}function Zt(t,e){var r=(2+b)*g(e);e/=2;for(var n=0,a=1/0;n<10&&i(a)>v;n++){var o=s(e);e-=a=(e+g(e)*(o+2)-r)/(2*o*(1+o))}return[2/I(_*(4+_))*t*(1+s(e)),2*I(_/(4+_))*g(e)]}function Wt(){return(0,n.A)(Zt).scale(180.739)}function Yt(t,e){return[t*(1+s(e))/I(2+_),2*e/I(2+_)]}function Xt(){return(0,n.A)(Yt).scale(173.044)}function $t(t,e){for(var r=(1+b)*g(e),n=0,a=1/0;n<10&&i(a)>v;n++)e-=a=(e+g(e)-r)/(1+s(e));return r=I(2+_),[t*(1+s(e))/r,2*e/r]}function Jt(){return(0,n.A)($t).scale(173.044)}Ot.invert=function(t,e){var r=3*C(e/(zt*A));return[A*t/(zt*(2*s(2*r/3)-1)),r]},jt.invert=function(t,e){var r=I(8/(3*_)),n=e/r;return[t/(r*(1-i(n)/_)),n]},Vt.invert=function(t,e){var r=2-i(e)/I(2*_/3);return[t*I(6*_)/(2*r),m(e)*C((4-r*r)/3)]},Ht.invert=function(t,e){var r=I(_*(4+_))/2;return[t*r/(1+I(1-e*e*(4+_)/(4*_))),e*r/2]},Zt.invert=function(t,e){var r=e*I((4+_)/_)/2,n=C(r),i=s(n);return[t/(2/I(_*(4+_))*(1+i)),C((n+r*(i+2))/(2+b))]},Yt.invert=function(t,e){var r=I(2+_),n=e*r/2;return[r*t/(1+s(n)),n]},$t.invert=function(t,e){var r=1+b,n=I(r/2);return[2*t*n/(1+s(e*=n)),C((e+g(e))/r)]};var Kt=3+2*k;function Qt(t,e){var r=g(t/=2),n=s(t),i=I(s(e)),o=s(e/=2),l=g(e)/(o+k*n*i),c=I(2/(1+l*l)),h=I((k*o+(n+r)*i)/(k*o+(n-r)*i));return[Kt*(c*(h-1/h)-2*u(h)),Kt*(c*l*(h+1/h)-2*a(l))]}function te(){return(0,n.A)(Qt).scale(62.5271)}Qt.invert=function(t,e){if(!(r=j.invert(t/1.2,1.065*e)))return null;var r,n=r[0],o=r[1],l=20;t/=Kt,e/=Kt;do{var c=n/2,p=o/2,d=g(c),m=s(c),y=g(p),x=s(p),_=s(o),w=I(_),A=y/(x+k*m*w),M=A*A,S=I(2/(1+M)),E=(k*x+(m+d)*w)/(k*x+(m-d)*w),C=I(E),L=C-1/C,P=C+1/C,z=S*L-2*u(C)-t,O=S*A*P-2*a(A)-e,D=y&&T*w*d*M/y,R=(k*m*x+w)/(2*(x+k*m*w)*(x+k*m*w)*w),F=-.5*A*S*S*S,B=F*D,N=F*R,U=(U=2*x+k*w*(m-d))*U*C,V=(k*m*x*w+_)/U,q=-k*d*y/(w*U),H=L*B-2*V/C+S*(V+V/E),G=L*N-2*q/C+S*(q+q/E),Z=A*P*B-2*D/(1+M)+S*P*D+S*A*(V-V/E),W=A*P*N-2*R/(1+M)+S*P*R+S*A*(q-q/E),Y=G*Z-W*H;if(!Y)break;var X=(O*G-z*W)/Y,$=(z*Z-O*H)/Y;n-=X,o=h(-b,f(b,o-$))}while((i(X)>v||i($)>v)&&--l>0);return i(i(o)-b)n){var f=I(h),p=o(u,c),m=r*d(p/r),y=p-m,x=t*s(y),w=(t*g(y)-y*g(x))/(b-x),T=de(y,w),k=(_-t)/me(T,x,_);c=f;var A,M=50;do{c-=A=(t+me(T,x,c)*k-f)/(T(c)*k)}while(i(A)>v&&--M>0);u=y*g(c),cn){var c=I(l),u=o(a,e),h=r*d(u/r),f=u-h;e=c*s(f),a=c*g(f);for(var p=e-b,m=g(e),y=a/m,v=ev||i(p)>v)&&--y>0);return[d,m]},u}var ve=ye(2.8284,-1.6988,.75432,-.18071,1.76003,-.38914,.042555);function xe(){return(0,n.A)(ve).scale(149.995)}var _e=ye(2.583819,-.835827,.170354,-.038094,1.543313,-.411435,.082742);function be(){return(0,n.A)(_e).scale(153.93)}var we=ye(5/6*_,-.62636,-.0344,0,1.3493,-.05524,0,.045);function Te(){return(0,n.A)(we).scale(130.945)}function ke(t,e){var r=t*t,n=e*e;return[t*(1-.162388*n)*(.87-952426e-9*r*r),e*(1+n/12)]}function Ae(){return(0,n.A)(ke).scale(131.747)}ke.invert=function(t,e){var r,n=t,a=e,o=50;do{var s=a*a;a-=r=(a*(1+s/12)-e)/(1+s/4)}while(i(r)>v&&--o>0);o=50,t/=1-.162388*s;do{var l=(l=n*n)*l;n-=r=(n*(.87-952426e-9*l)-t)/(.87-.00476213*l)}while(i(r)>v&&--o>0);return[n,a]};var Me=ye(2.6516,-.76534,.19123,-.047094,1.36289,-.13965,.031762);function Se(){return(0,n.A)(Me).scale(131.087)}function Ee(t){var e=t(b,0)[0]-t(-b,0)[0];function r(r,n){var i=r>0?-.5:.5,a=t(r+i*_,n);return a[0]-=i*e,a}return t.invert&&(r.invert=function(r,n){var i=r>0?-.5:.5,a=t.invert(r+i*e,n),o=a[0]-i*_;return o<-_?o+=2*_:o>_&&(o-=2*_),a[0]=o,a}),r}function Ce(t,e){var r=m(t),n=m(e),a=s(e),l=s(t)*a,c=g(t)*a,u=g(n*e);t=i(o(c,u)),e=C(l),i(t-b)>v&&(t%=b);var h=function(t,e){if(e===b)return[0,0];var r,n,a=g(e),o=a*a,l=o*o,c=1+l,u=1+3*l,h=1-l,f=C(1/I(c)),p=h+o*c*f,d=(1-a)/p,m=I(d),y=d*c,x=I(y),w=m*h;if(0===t)return[0,-(w+o*x)];var T,k=s(e),A=1/k,M=2*a*k,S=(-p*k-(1-a)*((-3*o+f*u)*M))/(p*p),E=-A*M,L=-A*(o*c*S+d*u*M),P=-2*A*(h*(.5*S/m)-2*o*m*M),z=4*t/_;if(t>.222*_||e<_/4&&t>.175*_){if(r=(w+o*I(y*(1+l)-w*w))/(1+l),t>_/4)return[r,r];var O=r,D=.5*r;r=.5*(D+O),n=50;do{var R=r*(P+E*I(y-r*r))+L*C(r/x)-z;if(!R)break;R<0?D=r:O=r,r=.5*(D+O)}while(i(O-D)>v&&--n>0)}else{r=v,n=25;do{var F=r*r,B=I(y-F),N=P+E*B,j=r*N+L*C(r/x)-z;r-=T=B?j/(N+(L-E*F)/B):0}while(i(T)>v&&--n>0)}return[r,-w-o*I(y-r*r)]}(t>_/4?b-t:t,e);return t>_/4&&(u=h[0],h[0]=-h[1],h[1]=-u),h[0]*=r,h[1]*=-n,h}function Le(){return(0,n.A)(Ee(Ce)).scale(239.75)}function Ie(t,e){var r,n,o,c,u,h;if(e=1-v)return r=(1-e)/4,o=1/(n=z(t)),[(c=((h=l(2*(h=t)))-1)/(h+1))+r*((u=n*P(t))-t)/(n*n),o-r*c*o*(u-t),o+r*c*o*(u+t),2*a(l(t))-b+r*(u-t)/n];var f=[1,0,0,0,0,0,0,0,0],p=[I(e),0,0,0,0,0,0,0,0],d=0;for(n=I(1-e),u=1;i(p[d]/f[d])>v&&d<8;)r=f[d++],p[d]=(r-n)/2,f[d]=(r+n)/2,n=I(r*n),u*=2;o=u*f[d]*t;do{o=(C(c=p[d]*g(n=o)/f[d])+o)/2}while(--d);return[g(o),c=s(o),c/s(o-n),o]}function Pe(t,e){if(!e)return t;if(1===e)return u(y(t/2+w));for(var r=1,n=I(1-e),o=I(e),s=0;i(o)>v;s++){if(t%_){var l=a(n*y(t)/r);l<0&&(l+=_),t+=l+~~(t/_)*_}else t+=t;o=(r+n)/2,n=I(r*n),o=((r=o)-n)/2}return t/(p(2,s)*r)}function ze(t,e){var r=(k-1)/(k+1),n=I(1-r*r),c=Pe(b,n*n),h=u(y(_/4+i(e)/2)),f=l(-1*h)/I(r),p=function(t,e){var r=t*t,n=e+1,i=1-r-e*e;return[.5*((t>=0?b:-b)-o(i,2*t)),-.25*u(i*i+4*r)+.5*u(n*n+r)]}(f*s(-1*t),f*g(-1*t)),d=function(t,e,r){var n=i(t),o=P(i(e));if(n){var s=1/g(n),l=1/(y(n)*y(n)),c=-(l+r*(o*o*s*s)-1+r),u=(-c+I(c*c-(r-1)*l*4))/2;return[Pe(a(1/I(u)),r)*m(t),Pe(a(I((u/l-1)/r)),1-r)*m(e)]}return[0,Pe(a(o),1-r)*m(e)]}(p[0],p[1],n*n);return[-d[1],(e>=0?1:-1)*(.5*c-d[0])]}function Oe(){return(0,n.A)(Ee(ze)).scale(151.496)}Ce.invert=function(t,e){i(t)>1&&(t=2*m(t)-t),i(e)>1&&(e=2*m(e)-e);var r=m(t),n=m(e),a=-r*t,l=-n*e,c=l/a<1,u=function(t,e){for(var r=0,n=1,a=.5,o=50;;){var l=a*a,c=I(a),u=C(1/I(1+l)),h=1-l+a*(1+l)*u,f=(1-c)/h,p=I(f),d=f*(1+l),m=p*(1-l),g=I(d-t*t),y=e+m+a*g;if(i(n-r)0?r=a:n=a,a=.5*(r+n)}if(!o)return null;var v=C(c),b=s(v),w=1/b,T=2*c*b,k=(-h*b-(-3*a+u*(1+3*l))*T*(1-c))/(h*h);return[_/4*(t*(-2*w*((1-l)*(.5*k/p)-2*a*p*T)+-w*T*g)+-w*(a*(1+l)*k+f*(1+3*l)*T)*C(t/I(d))),v]}(c?l:a,c?a:l),h=u[0],f=u[1],p=s(f);return c&&(h=-b-h),[r*(o(g(h)*p,-g(f))+_),n*C(s(h)*p)]},ze.invert=function(t,e){var r,n,i,s,c,h,f=(k-1)/(k+1),p=I(1-f*f),d=(n=-t,i=p*p,(r=.5*Pe(b,p*p)-e)?(s=Ie(r,i),n?(h=(c=Ie(n,1-i))[1]*c[1]+i*s[0]*s[0]*c[0]*c[0],[[s[0]*c[2]/h,s[1]*s[2]*c[0]*c[1]/h],[s[1]*c[1]/h,-s[0]*s[2]*c[0]*c[2]/h],[s[2]*c[1]*c[2]/h,-i*s[0]*s[1]*c[0]/h]]):[[s[0],0],[s[1],0],[s[2],0]]):[[0,(c=Ie(n,1-i))[0]/c[1]],[1/c[1],0],[c[2]/c[1],0]]),m=function(t,e){var r=e[0]*e[0]+e[1]*e[1];return[(t[0]*e[0]+t[1]*e[1])/r,(t[1]*e[0]-t[0]*e[1])/r]}(d[0],d[1]);return[o(m[1],m[0])/-1,2*a(l(-.5*u(f*m[0]*m[0]+f*m[1]*m[1])))-b]};var De=r(39127);function Re(t){var e=g(t),r=s(t),n=Fe(t);function a(t,a){var o=n(t,a);t=o[0],a=o[1];var l=g(a),c=s(a),u=s(t),h=L(e*l+r*c*u),f=g(h),p=i(f)>v?h/f:1;return[p*r*g(t),(i(t)>b?p:-p)*(e*c-r*l*u)]}return n.invert=Fe(-t),a.invert=function(t,r){var i=I(t*t+r*r),a=-g(i),l=s(i),c=i*l,u=-r*a,h=i*e,f=I(c*c+u*u-h*h),p=o(c*h+u*f,u*h-c*f),d=(i>b?-1:1)*o(t*a,i*s(p)*l+r*g(p)*a);return n.invert(d,p)},a}function Fe(t){var e=g(t),r=s(t);return function(t,n){var i=s(n),a=s(t)*i,l=g(t)*i,c=g(n);return[o(l,a*r-c*e),C(c*r+a*e)]}}function Be(){var t=0,e=(0,n.U)(Re),r=e(t),i=r.rotate,a=r.stream,o=(0,De.A)();return r.parallel=function(n){if(!arguments.length)return t*S;var i=r.rotate();return e(t=n*E).rotate(i)},r.rotate=function(e){return arguments.length?(i.call(r,[e[0],e[1]-t*S]),o.center([-e[0],-e[1]]),r):((e=i.call(r))[1]+=t*S,e)},r.stream=function(t){return(t=a(t)).sphere=function(){t.polygonStart();var e,r=o.radius(89.99)().coordinates[0],n=r.length-1,i=-1;for(t.lineStart();++i=0;)t.point((e=r[i])[0],e[1]);t.lineEnd(),t.polygonEnd()},t},r.scale(79.4187).parallel(45).clipAngle(179.999)}var Ne=r(29725),je=r(20465),Ue=C(1-1/3)*S,Ve=Rt(0);function qe(t){var e=Ue*E,r=Ct(_,e)[0]-Ct(-_,e)[0],n=Ve(0,e)[1],a=Ct(0,e)[1],o=A-a,s=M/t,l=4/M,u=n+o*o*4/M;function p(p,d){var m,g=i(d);if(g>e){var y=f(t-1,h(0,c((p+_)/s)));(m=Ct(p+=_*(t-1)/t-y*s,g))[0]=m[0]*M/r-M*(t-1)/(2*t)+y*M/t,m[1]=n+4*(m[1]-a)*o/M,d<0&&(m[1]=-m[1])}else m=Ve(p,d);return m[0]*=l,m[1]/=u,m}return p.invert=function(e,p){e/=l;var d=i(p*=u);if(d>n){var m=f(t-1,h(0,c((e+_)/s)));e=(e+_*(t-1)/t-m*s)*r/M;var g=Ct.invert(e,.25*(d-n)*M/o+a);return g[0]-=_*(t-1)/t-m*s,p<0&&(g[1]=-g[1]),g}return Ve.invert(e,p)},p}function He(t,e){return[t,1&e?90-v:Ue]}function Ge(t,e){return[t,1&e?-90+v:-Ue]}function Ze(t){return[t[0]*(1-v),t[1]]}function We(){var t=4,e=(0,n.U)(qe),r=e(t),i=r.stream;return r.lobes=function(r){return arguments.length?e(t=+r):t},r.stream=function(e){var n=r.rotate(),a=i(e),o=(r.rotate([0,0]),i(e));return r.rotate(n),a.sphere=function(){var e,r;(0,je.A)((e=180/t,r=[].concat((0,Ne.y1)(-180,180+e/2,e).map(He),(0,Ne.y1)(180,-180-e/2,-e).map(Ge)),{type:\"Polygon\",coordinates:[180===e?r.map(Ze):r]}),o)},a},r.scale(239.75)}function Ye(t){var e,r=1+t,n=C(g(1/r)),a=2*I(_/(e=_+4*n*r)),l=.5*a*(r+I(t*(2+t))),c=t*t,u=r*r;function h(h,f){var p,d,m=1-g(f);if(m&&m<2){var y,v=b-f,w=25;do{var T=g(v),k=s(v),A=n+o(T,r-k),M=1+u-2*r*k;v-=y=(v-c*n-r*T+M*A-.5*m*e)/(2*r*T*A)}while(i(y)>x&&--w>0);p=a*I(M),d=h*A/_}else p=a*(t+m),d=h*n/_;return[p*g(d),l-p*s(d)]}return h.invert=function(t,i){var s=t*t+(i-=l)*i,h=(1+u-s/(a*a))/(2*r),f=L(h),p=g(f),d=n+o(p,r-h);return[C(t/I(s))*_/d,C(1-2*(f-c*n-r*p+(1+u-2*r*h)*d)/e)]},h}function Xe(){var t=1,e=(0,n.U)(Ye),r=e(t);return r.ratio=function(r){return arguments.length?e(t=+r):t},r.scale(167.774).center([0,18.67])}var $e=.7109889596207567,Je=.0528035274542;function Ke(t,e){return e>-$e?((t=at(t,e))[1]+=Je,t):ft(t,e)}function Qe(){return(0,n.A)(Ke).rotate([-20,-55]).scale(164.263).center([0,-5.4036])}function tr(t,e){return i(e)>$e?((t=at(t,e))[1]-=e>0?Je:-Je,t):ft(t,e)}function er(){return(0,n.A)(tr).scale(152.63)}function rr(t,e,r,n){var i=I(4*_/(2*r+(1+t-e/2)*g(2*r)+(t+e)/2*g(4*r)+e/2*g(6*r))),a=I(n*g(r)*I((1+t*s(2*r)+e*s(4*r))/(1+t+e))),o=r*c(1);function l(r){return I(1+t*s(2*r)+e*s(4*r))}function c(n){var i=n*r;return(2*i+(1+t-e/2)*g(2*i)+(t+e)/2*g(4*i)+e/2*g(6*i))/r}function u(t){return l(t)*g(t)}var h=function(t,e){var n=r*Q(c,o*g(e)/r,e/_);isNaN(n)&&(n=r*m(e));var u=i*l(n);return[u*a*t/_*s(n),u/a*g(n)]};return h.invert=function(t,e){var n=Q(u,e*a/i);return[t*_/(s(n)*i*a*l(n)),C(r*c(n/r)/o)]},0===r&&(i=I(n/_),(h=function(t,e){return[t*i,g(e)/i]}).invert=function(t,e){return[t/i,C(e*i)]}),h}function nr(){var t=1,e=0,r=45*E,i=2,a=(0,n.U)(rr),o=a(t,e,r,i);return o.a=function(n){return arguments.length?a(t=+n,e,r,i):t},o.b=function(n){return arguments.length?a(t,e=+n,r,i):e},o.psiMax=function(n){return arguments.length?a(t,e,r=+n*E,i):r*S},o.ratio=function(n){return arguments.length?a(t,e,r,i=+n):i},o.scale(180.739)}function ir(t,e,r,n,i,a,o,s,l,c,u){if(u.nanEncountered)return NaN;var h,f,p,d,m,g,y,v,x,_;if(f=t(e+.25*(h=r-e)),p=t(r-.25*h),isNaN(f))u.nanEncountered=!0;else{if(!isNaN(p))return _=((g=(d=h*(n+4*f+i)/12)+(m=h*(i+4*p+a)/12))-o)/15,c>l?(u.maxDepthCount++,g+_):Math.abs(_)t?r=n:e=n,n=e+r>>1}while(n>e);var i=c[n+1]-c[n];return i&&(i=(t-c[n+1])/i),(n+1+i)/s}var f=2*h(1)/_*o/r,d=function(t,e){var r=h(i(g(e))),a=n(r)*t;return r/=f,[a,e>=0?r:-r]};return d.invert=function(t,e){var r;return i(e*=f)<1&&(r=m(e)*C(a(i(e))*o)),[t/n(i(e)),r]},d}function sr(){var t=0,e=2.5,r=1.183136,i=(0,n.U)(or),a=i(t,e,r);return a.alpha=function(n){return arguments.length?i(t=+n,e,r):t},a.k=function(n){return arguments.length?i(t,e=+n,r):e},a.gamma=function(n){return arguments.length?i(t,e,r=+n):r},a.scale(152.63)}function lr(t,e){return i(t[0]-e[0])a[o][2][0];++o);var l=t(r-a[o][1][0],n);return l[0]+=t(a[o][1][0],i*n>i*a[o][0][1]?a[o][0][1]:n)[0],l}r?o.invert=r(o):t.invert&&(o.invert=function(r,n){for(var i=a[+(n<0)],s=e[+(n<0)],l=0,c=i.length;l=0;--s)r=(e=t[1][s])[0][0],n=e[0][1],i=e[1][1],a=e[2][0],o=e[2][1],l.push(cr([[a-v,o-v],[a-v,i+v],[r+v,i+v],[r+v,n-v]],30));return{type:\"Polygon\",coordinates:[(0,Ne.Am)(l)]}}(r),e=r.map((function(t){return t.map((function(t){return[[t[0][0]*E,t[0][1]*E],[t[1][0]*E,t[1][1]*E],[t[2][0]*E,t[2][1]*E]]}))})),a=e.map((function(e){return e.map((function(e){var r,n=t(e[0][0],e[0][1])[0],i=t(e[2][0],e[2][1])[0],a=t(e[1][0],e[0][1])[1],o=t(e[1][0],e[1][1])[1];return a>o&&(r=a,a=o,o=r),[[n,a],[i,o]]}))})),s):e.map((function(t){return t.map((function(t){return[[t[0][0]*S,t[0][1]*S],[t[1][0]*S,t[1][1]*S],[t[2][0]*S,t[2][1]*S]]}))}))},null!=e&&s.lobes(e),s}Ke.invert=function(t,e){return e>-$e?at.invert(t,e-Je):ft.invert(t,e)},tr.invert=function(t,e){return i(e)>$e?at.invert(t,e+(e>0?Je:-Je)):ft.invert(t,e)};var hr=[[[[-180,0],[-100,90],[-40,0]],[[-40,0],[30,90],[180,0]]],[[[-180,0],[-160,-90],[-100,0]],[[-100,0],[-60,-90],[-20,0]],[[-20,0],[20,-90],[80,0]],[[80,0],[140,-90],[180,0]]]];function fr(){return ur(ct,hr).scale(160.857)}var pr=[[[[-180,0],[-100,90],[-40,0]],[[-40,0],[30,90],[180,0]]],[[[-180,0],[-160,-90],[-100,0]],[[-100,0],[-60,-90],[-20,0]],[[-20,0],[20,-90],[80,0]],[[80,0],[140,-90],[180,0]]]];function dr(){return ur(tr,pr).scale(152.63)}var mr=[[[[-180,0],[-100,90],[-40,0]],[[-40,0],[30,90],[180,0]]],[[[-180,0],[-160,-90],[-100,0]],[[-100,0],[-60,-90],[-20,0]],[[-20,0],[20,-90],[80,0]],[[80,0],[140,-90],[180,0]]]];function gr(){return ur(at,mr).scale(169.529)}var yr=[[[[-180,0],[-90,90],[0,0]],[[0,0],[90,90],[180,0]]],[[[-180,0],[-90,-90],[0,0]],[[0,0],[90,-90],[180,0]]]];function vr(){return ur(at,yr).scale(169.529).rotate([20,0])}var xr=[[[[-180,35],[-30,90],[0,35]],[[0,35],[30,90],[180,35]]],[[[-180,-10],[-102,-90],[-65,-10]],[[-65,-10],[5,-90],[77,-10]],[[77,-10],[103,-90],[180,-10]]]];function _r(){return ur(Ke,xr,tt).rotate([-20,-55]).scale(164.263).center([0,-5.4036])}var br=[[[[-180,0],[-110,90],[-40,0]],[[-40,0],[0,90],[40,0]],[[40,0],[110,90],[180,0]]],[[[-180,0],[-110,-90],[-40,0]],[[-40,0],[0,-90],[40,0]],[[40,0],[110,-90],[180,0]]]];function wr(){return ur(ft,br).scale(152.63).rotate([-20,0])}function Tr(t,e){return[3/M*t*I(_*_/3-e*e),e]}function kr(){return(0,n.A)(Tr).scale(158.837)}function Ar(t){function e(e,r){if(i(i(r)-b)2)return null;var a=(e/=2)*e,s=(r/=2)*r,l=2*r/(1+a+s);return l=p((1+l)/(1-l),1/t),[o(2*e,1-a-s)/t,C((l-1)/(l+1))]},e}function Mr(){var t=.5,e=(0,n.U)(Ar),r=e(t);return r.spacing=function(r){return arguments.length?e(t=+r):t},r.scale(124.75)}Tr.invert=function(t,e){return[M/3*t/I(_*_/3-e*e),e]};var Sr=_/k;function Er(t,e){return[t*(1+I(s(e)))/2,e/(s(e/2)*s(t/6))]}function Cr(){return(0,n.A)(Er).scale(97.2672)}function Lr(t,e){var r=t*t,n=e*e;return[t*(.975534+n*(-.0143059*r-.119161+-.0547009*n)),e*(1.00384+r*(.0802894+-.02855*n+199025e-9*r)+n*(.0998909+-.0491032*n))]}function Ir(){return(0,n.A)(Lr).scale(139.98)}function Pr(t,e){return[g(t)/s(e),y(e)*s(t)]}function zr(){return(0,n.A)(Pr).scale(144.049).clipAngle(89.999)}function Or(t){var e=s(t),r=y(w+t/2);function n(n,a){var o=a-t,s=i(o)=0;)f=(h=t[u])[0]+l*(i=f)-c*p,p=h[1]+l*p+c*i;return[f=l*(i=f)-c*p,p=l*p+c*i]}return r.invert=function(r,n){var l=20,c=r,u=n;do{for(var h,f=e,p=t[f],d=p[0],m=p[1],y=0,x=0;--f>=0;)y=d+c*(h=y)-u*x,x=m+c*x+u*h,d=(p=t[f])[0]+c*(h=d)-u*m,m=p[1]+c*m+u*h;var _,b,w=(y=d+c*(h=y)-u*x)*y+(x=m+c*x+u*h)*x;c-=_=((d=c*(h=d)-u*m-r)*y+(m=c*m+u*h-n)*x)/w,u-=b=(m*y-d*x)/w}while(i(_)+i(b)>v*v&&--l>0);if(l){var T=I(c*c+u*u),k=2*a(.5*T),A=g(k);return[o(c*A,T*s(k)),T?C(u*A/T):0]}},r}Er.invert=function(t,e){var r=i(t),n=i(e),a=v,o=b;nv||i(x)>v)&&--a>0);return a&&[r,n]},Pr.invert=function(t,e){var r=t*t,n=e*e+1,i=r+n,a=t?T*I((i-I(i*i-4*r))/r):1/I(n);return[C(t*a),m(e)*L(a)]},Rr.invert=function(t,e){return[t,2.5*a(l(.8*e))-.625*_]};var Nr=[[.9972523,0],[.0052513,-.0041175],[.0074606,.0048125],[-.0153783,-.1968253],[.0636871,-.1408027],[.3660976,-.2937382]],jr=[[.98879,0],[0,0],[-.050909,0],[0,0],[.075528,0]],Ur=[[.984299,0],[.0211642,.0037608],[-.1036018,-.0575102],[-.0329095,-.0320119],[.0499471,.1223335],[.026046,.0899805],[7388e-7,-.1435792],[.0075848,-.1334108],[-.0216473,.0776645],[-.0225161,.0853673]],Vr=[[.9245,0],[0,0],[.01943,0]],qr=[[.721316,0],[0,0],[-.00881625,-.00617325]];function Hr(){return Xr(Nr,[152,-64]).scale(1400).center([-160.908,62.4864]).clipAngle(30).angle(7.8)}function Gr(){return Xr(jr,[95,-38]).scale(1e3).clipAngle(55).center([-96.5563,38.8675])}function Zr(){return Xr(Ur,[120,-45]).scale(359.513).clipAngle(55).center([-117.474,53.0628])}function Wr(){return Xr(Vr,[-20,-18]).scale(209.091).center([20,16.7214]).clipAngle(82)}function Yr(){return Xr(qr,[165,10]).scale(250).clipAngle(130).center([-165,-10])}function Xr(t,e){var r=(0,n.A)(Br(t)).rotate(e).clipAngle(90),i=(0,bt.A)(e),a=r.center;return delete r.rotate,r.center=function(t){return arguments.length?a(i(t)):i.invert(a())},r}var $r=I(6),Jr=I(7);function Kr(t,e){var r=C(7*g(e)/(3*$r));return[$r*t*(2*s(2*r/3)-1)/Jr,9*g(r/3)/Jr]}function Qr(){return(0,n.A)(Kr).scale(164.859)}function tn(t,e){for(var r,n=(1+T)*g(e),a=e,o=0;o<25&&(a-=r=(g(a/2)+g(a)-n)/(.5*s(a/2)+s(a)),!(i(r)x&&--l>0);return[t/(.84719-.13063*(n=s*s)+(o=n*(a=n*n))*o*(.05494*n-.04515-.02326*a+.00331*o)),s]},ln.invert=function(t,e){for(var r=e/2,n=0,a=1/0;n<10&&i(a)>v;++n){var o=s(e/2);e-=a=(e-y(e/2)-r)/(1-.5/(o*o))}return[2*t/(1+s(e)),e]};var un=[[[[-180,0],[-90,90],[0,0]],[[0,0],[90,90],[180,0]]],[[[-180,0],[-90,-90],[0,0]],[[0,0],[90,-90],[180,0]]]];function hn(){return ur($(1/0),un).rotate([20,0]).scale(152.63)}function fn(t,e){var r=g(e),n=s(e),a=m(t);if(0===t||i(e)===b)return[0,e];if(0===e)return[t,0];if(i(t)===b)return[t*n,b*r];var o=_/(2*t)-2*t/_,l=2*e/_,c=(1-l*l)/(r-l),u=o*o,h=c*c,f=1+u/h,p=1+h/u,d=(o*r/c-o/2)/f,y=(h*r/u+c/2)/p,v=y*y-(h*r*r/u+c*r-1)/p;return[b*(d+I(d*d+n*n/f)*a),b*(y+I(v<0?0:v)*m(-e*o)*a)]}function pn(){return(0,n.A)(fn).scale(127.267)}fn.invert=function(t,e){var r=(t/=b)*t,n=r+(e/=b)*e,i=_*_;return[t?(n-1+I((1-n)*(1-n)+4*r))/(2*t)*b:0,Q((function(t){return n*(_*g(t)-2*t)*_+4*t*t*(e-g(t))+2*_*t-i*e}),0)]};var dn=1.0148,mn=.23185,gn=-.14499,yn=.02406,vn=dn,xn=5*mn,_n=7*gn,bn=9*yn,wn=1.790857183;function Tn(t,e){var r=e*e;return[t,e*(dn+r*r*(mn+r*(gn+yn*r)))]}function kn(){return(0,n.A)(Tn).scale(139.319)}function An(t,e){if(i(e)wn?e=wn:e<-1.790857183&&(e=-1.790857183);var r,n=e;do{var a=n*n;n-=r=(n*(dn+a*a*(mn+a*(gn+yn*a)))-e)/(vn+a*a*(xn+a*(_n+bn*a)))}while(i(r)>v);return[t,n]},An.invert=function(t,e){if(i(e)v&&--o>0);return l=y(a),[(i(e)=0;)if(n=e[s],r[0]===n[0]&&r[1]===n[1]){if(a)return[a,r];a=r}}}(e.face,r.face),i=(u=n.map(r.project),h=n.map(e.project),f=Ln(u[1],u[0]),p=Ln(h[1],h[0]),d=function(t,e){return o(t[0]*e[1]-t[1]*e[0],t[0]*e[0]+t[1]*e[1])}(f,p),m=In(f)/In(p),Cn([1,0,u[0][0],0,1,u[0][1]],Cn([m,0,0,0,m,0],Cn([s(d),g(d),0,-g(d),s(d),0],[1,0,-h[0][0],0,1,-h[0][1]]))));e.transform=r.transform?Cn(r.transform,i):i;for(var a=r.edges,l=0,c=a.length;l0?[-e[0],0]:[180-e[0],180])};var e=Bn.map((function(e){return{face:e,project:t(e)}}));return[-1,0,0,1,0,1,4,5].forEach((function(t,r){var n=e[t];n&&(n.children||(n.children=[])).push(e[r])})),Pn(e[0],(function(t,r){return e[t<-_/2?r<0?6:4:t<0?r<0?2:0:t<_/2?r<0?3:1:r<0?7:5]})).angle(-30).scale(121.906).center([0,48.5904])}function qn(t){t=t||function(t){var e=6===t.length?(0,_t.A)({type:\"MultiPoint\",coordinates:t}):t[0];return(0,Rn.A)().scale(1).translate([0,0]).rotate([-e[0],-e[1]])};var e=Bn.map((function(t){for(var e,r=t.map(Zn),n=r.length,i=r[n-1],a=[],o=0;on^p>n&&r<(f-c)*(n-u)/(p-u)+c&&(i=!i)}return i}(t[0],r))return t.push(e),!0}))||t.push([e])})),Qn=[],t.length?t.length>1?{type:\"MultiPolygon\",coordinates:t}:{type:\"Polygon\",coordinates:t[0]}:null}};function ni(t){var e=t(b,0)[0]-t(-b,0)[0];function r(r,n){var a=i(r)0?r-_:r+_,n),s=(o[0]-o[1])*T,l=(o[0]+o[1])*T;if(a)return[s,l];var c=e*T,u=s>0^l>0?-1:1;return[u*s-m(l)*c,u*l-m(s)*c]}return t.invert&&(r.invert=function(r,n){var a=(r+n)*T,o=(n-r)*T,s=i(a)<.5*e&&i(o)<.5*e;if(!s){var l=e*T,c=a>0^o>0?-1:1,u=-c*r+(o>0?1:-1)*l,h=-c*n+(a>0?1:-1)*l;a=(-u-h)*T,o=(u-h)*T}var f=t.invert(a,o);return s||(f[0]+=a>0?_:-_),f}),(0,n.A)(r).rotate([-90,-90,45]).clipAngle(179.999)}function ii(){return ni(Ce).scale(176.423)}function ai(){return ni(ze).scale(111.48)}function oi(t,e){if(!(0<=(e=+e)&&e<=20))throw new Error(\"invalid digits\");function r(t){var r=t.length,n=2,i=new Array(r);for(i[0]=+t[0].toFixed(e),i[1]=+t[1].toFixed(e);n2||a[0]!=e[0]||a[1]!=e[1])&&(n.push(a),e=a)}return 1===n.length&&t.length>1&&n.push(r(t[t.length-1])),n}function a(t){return t.map(i)}function o(t){if(null==t)return t;var e;switch(t.type){case\"GeometryCollection\":e={type:\"GeometryCollection\",geometries:t.geometries.map(o)};break;case\"Point\":e={type:\"Point\",coordinates:r(t.coordinates)};break;case\"MultiPoint\":e={type:t.type,coordinates:n(t.coordinates)};break;case\"LineString\":e={type:t.type,coordinates:i(t.coordinates)};break;case\"MultiLineString\":case\"Polygon\":e={type:t.type,coordinates:a(t.coordinates)};break;case\"MultiPolygon\":e={type:\"MultiPolygon\",coordinates:t.coordinates.map(a)};break;default:return t}return null!=t.bbox&&(e.bbox=t.bbox),e}function s(t){var e={type:\"Feature\",properties:t.properties,geometry:o(t.geometry)};return null!=t.id&&(e.id=t.id),null!=t.bbox&&(e.bbox=t.bbox),e}if(null!=t)switch(t.type){case\"Feature\":return s(t);case\"FeatureCollection\":var l={type:\"FeatureCollection\",features:t.features.map(s)};return null!=t.bbox&&(l.bbox=t.bbox),l;default:return o(t)}return t}function si(t){var e=g(t);function r(r,n){var i=e?y(r*e/2)/e:r/2;if(!n)return[2*i,-t];var o=2*a(i*g(n)),l=1/y(n);return[g(o)*l,n+(1-s(o))*l-t]}return r.invert=function(r,n){if(i(n+=t)v&&--u>0);var d=r*(h=y(c)),m=y(i(n)0?b:-b)*(h+o*(d-l)/2+o*o*(d-2*h+l)/2)]}function hi(){return(0,n.A)(ui).scale(152.63)}function fi(t,e){var r=function(t){function e(e,r){var n=s(r),i=(t-1)/(t-n*s(e));return[i*n*g(e),i*g(r)]}return e.invert=function(e,r){var n=e*e+r*r,i=I(n),a=(t-I(1-n*(t+1)/(t-1)))/((t-1)/i+i/(t-1));return[o(e*a,i*I(1-a*a)),i?C(r*a/i):0]},e}(t);if(!e)return r;var n=s(e),i=g(e);function a(e,a){var o=r(e,a),s=o[1],l=s*i/(t-1)+n;return[o[0]*n/l,s/l]}return a.invert=function(e,a){var o=(t-1)/(t-1-a*i);return r.invert(o*e,o*a*n)},a}function pi(){var t=2,e=0,r=(0,n.U)(fi),i=r(t,e);return i.distance=function(n){return arguments.length?r(t=+n,e):t},i.tilt=function(n){return arguments.length?r(t,e=n*E):e*S},i.scale(432.147).clipAngle(L(1/t)*S-1e-6)}ci.forEach((function(t){t[1]*=1.0144})),ui.invert=function(t,e){var r=e/b,n=90*r,a=f(18,i(n/5)),o=h(0,c(a));do{var s=ci[o][1],l=ci[o+1][1],u=ci[f(19,o+2)][1],p=u-s,d=u-2*l+s,m=2*(i(r)-l)/p,g=d/p,y=m*(1-g*m*(1-2*g*m));if(y>=0||1===o){n=(e>=0?5:-5)*(y+a);var v,_=50;do{y=(a=f(18,i(n)/5))-(o=c(a)),s=ci[o][1],l=ci[o+1][1],u=ci[f(19,o+2)][1],n-=(v=(e>=0?b:-b)*(l+y*(u-s)/2+y*y*(u-2*l+s)/2)-e)*S}while(i(v)>x&&--_>0);break}}while(--o>=0);var w=ci[o][0],T=ci[o+1][0],k=ci[f(19,o+2)][0];return[t/(T+y*(k-w)/2+y*y*(k-2*T+w)/2),n*E]};var di=1e-4,mi=1e4,gi=-180,yi=gi+di,vi=180,xi=vi-di,_i=-90,bi=_i+di,wi=90,Ti=wi-di;function ki(t){return t.length>0}function Ai(t){return t===_i||t===wi?[0,t]:[gi,(e=t,Math.floor(e*mi)/mi)];var e}function Mi(t){var e=t[0],r=t[1],n=!1;return e<=yi?(e=gi,n=!0):e>=xi&&(e=vi,n=!0),r<=bi?(r=_i,n=!0):r>=Ti&&(r=wi,n=!0),n?[e,r]:t}function Si(t){return t.map(Mi)}function Ei(t,e,r){for(var n=0,i=t.length;n=xi||u<=bi||u>=Ti){a[o]=Mi(l);for(var h=o+1;hyi&&pbi&&d=s)break;r.push({index:-1,polygon:e,ring:a=a.slice(h-1)}),a[0]=Ai(a[0][1]),o=-1,s=a.length}}}}function Ci(t){var e,r,n,i,a,o,s=t.length,l={},c={};for(e=0;e0?_-l:l)*S],u=(0,n.A)(t(s)).rotate(c),h=(0,bt.A)(c),f=u.center;return delete u.rotate,u.center=function(t){return arguments.length?f(h(t)):h.invert(f())},u.clipAngle(90)}function Ri(t){var e=s(t);function r(t,r){var n=(0,Rn.T)(t,r);return n[0]*=e,n}return r.invert=function(t,r){return Rn.T.invert(t/e,r)},r}function Fi(){return Bi([-158,21.5],[-77,39]).clipAngle(60).scale(400)}function Bi(t,e){return Di(Ri,t,e)}function Ni(t){if(!(t*=2))return Z.j;var e=-t/2,r=-e,n=t*t,i=y(r),a=.5/g(r);function l(i,a){var o=L(s(a)*s(i-e)),l=L(s(a)*s(i-r));return[((o*=o)-(l*=l))/(2*t),(a<0?-1:1)*I(4*n*l-(n-o+l)*(n-o+l))/(2*t)]}return l.invert=function(t,n){var l,c,u=n*n,h=s(I(u+(l=t+e)*l)),f=s(I(u+(l=t+r)*l));return[o(c=h-f,l=(h+f)*i),(n<0?-1:1)*L(I(l*l+c*c)*a)]},l}function ji(){return Ui([-158,21.5],[-77,39]).clipAngle(130).scale(122.571)}function Ui(t,e){return Di(Ni,t,e)}function Vi(t,e){if(i(e)v&&--l>0);return[m(t)*(I(a*a+4)+a)*_/4,b*s]};var Qi=4*_+3*I(3),ta=2*I(2*_*I(3)/Qi),ea=it(ta*I(3)/_,ta,Qi/6);function ra(){return(0,n.A)(ea).scale(176.84)}function na(t,e){return[t*I(1-3*e*e/(_*_)),e]}function ia(){return(0,n.A)(na).scale(152.63)}function aa(t,e){var r=s(e),n=s(t)*r,i=1-n,a=s(t=o(g(t)*r,-g(e))),l=g(t);return[l*(r=I(1-n*n))-a*i,-a*r-l*i]}function oa(){return(0,n.A)(aa).rotate([0,-90,45]).scale(124.75).clipAngle(179.999)}function sa(t,e){var r=R(t,e);return[(r[0]+t/b)/2,(r[1]+e)/2]}function la(){return(0,n.A)(sa).scale(158.837)}na.invert=function(t,e){return[t/I(1-3*e*e/(_*_)),e]},aa.invert=function(t,e){var r=(t*t+e*e)/-2,n=I(-r*(2+r)),i=e*r+t*n,a=t*r-e*n,s=I(a*a+i*i);return[o(n*i,s*(1+r)),s?-C(n*a/s):0]},sa.invert=function(t,e){var r=t,n=e,a=25;do{var o,l=s(n),c=g(n),u=g(2*n),h=c*c,f=l*l,p=g(r),d=s(r/2),m=g(r/2),y=m*m,x=1-f*d*d,_=x?L(l*d)*I(o=1/x):o=0,w=.5*(2*_*l*m+r/b)-t,T=.5*(_*c+n)-e,k=.5*o*(f*y+_*l*d*h)+.5/b,A=o*(p*u/4-_*c*m),M=.125*o*(u*m-_*c*f*p),S=.5*o*(h*d+_*y*l)+.5,E=A*M-S*k,C=(T*A-w*S)/E,P=(w*M-T*k)/E;r-=C,n-=P}while((i(C)>v||i(P)>v)&&--a>0);return[r,n]}},49353:function(t,e,r){\"use strict\";function n(){return new i}function i(){this.reset()}r.d(e,{A:function(){return n}}),i.prototype={constructor:i,reset:function(){this.s=this.t=0},add:function(t){o(a,t,this.t),o(this,a.s,this.s),this.s?this.t+=a.t:this.s=a.t},valueOf:function(){return this.s}};var a=new i;function o(t,e,r){var n=t.s=e+r,i=n-e,a=n-i;t.t=e-a+(r-i)}},43976:function(t,e,r){\"use strict\";r.d(e,{Ay:function(){return x},B0:function(){return f},Y7:function(){return d}});var n,i,a,o,s,l=r(49353),c=r(61323),u=r(53341),h=r(20465),f=(0,l.A)(),p=(0,l.A)(),d={point:u.A,lineStart:u.A,lineEnd:u.A,polygonStart:function(){f.reset(),d.lineStart=m,d.lineEnd=g},polygonEnd:function(){var t=+f;p.add(t<0?c.FA+t:t),this.lineStart=this.lineEnd=this.point=u.A},sphere:function(){p.add(c.FA)}};function m(){d.point=y}function g(){v(n,i)}function y(t,e){d.point=v,n=t,i=e,t*=c.F2,e*=c.F2,a=t,o=(0,c.gn)(e=e/2+c.gz),s=(0,c.F8)(e)}function v(t,e){t*=c.F2,e=(e*=c.F2)/2+c.gz;var r=t-a,n=r>=0?1:-1,i=n*r,l=(0,c.gn)(e),u=(0,c.F8)(e),h=s*u,p=o*l+h*(0,c.gn)(i),d=h*n*(0,c.F8)(i);f.add((0,c.FP)(d,p)),a=t,o=l,s=u}function x(t){return p.reset(),(0,h.A)(t,d),2*p}},43212:function(t,e,r){\"use strict\";r.d(e,{A:function(){return L}});var n,i,a,o,s,l,c,u,h,f,p=r(49353),d=r(43976),m=r(20375),g=r(61323),y=r(20465),v=(0,p.A)(),x={point:_,lineStart:w,lineEnd:T,polygonStart:function(){x.point=k,x.lineStart=A,x.lineEnd=M,v.reset(),d.Y7.polygonStart()},polygonEnd:function(){d.Y7.polygonEnd(),x.point=_,x.lineStart=w,x.lineEnd=T,d.B0<0?(n=-(a=180),i=-(o=90)):v>g.Ni?o=90:v<-g.Ni&&(i=-90),f[0]=n,f[1]=a},sphere:function(){n=-(a=180),i=-(o=90)}};function _(t,e){h.push(f=[n=t,a=t]),eo&&(o=e)}function b(t,e){var r=(0,m.jf)([t*g.F2,e*g.F2]);if(u){var l=(0,m.r8)(u,r),c=[l[1],-l[0],0],p=(0,m.r8)(c,l);(0,m.Cx)(p),p=(0,m.EV)(p);var d,y=t-s,v=y>0?1:-1,x=p[0]*g.uj*v,_=(0,g.tn)(y)>180;_^(v*so&&(o=d):_^(v*s<(x=(x+360)%360-180)&&xo&&(o=e)),_?tS(n,a)&&(a=t):S(t,a)>S(n,a)&&(n=t):a>=n?(ta&&(a=t)):t>s?S(n,t)>S(n,a)&&(a=t):S(t,a)>S(n,a)&&(n=t)}else h.push(f=[n=t,a=t]);eo&&(o=e),u=r,s=t}function w(){x.point=b}function T(){f[0]=n,f[1]=a,x.point=_,u=null}function k(t,e){if(u){var r=t-s;v.add((0,g.tn)(r)>180?r+(r>0?360:-360):r)}else l=t,c=e;d.Y7.point(t,e),b(t,e)}function A(){d.Y7.lineStart()}function M(){k(l,c),d.Y7.lineEnd(),(0,g.tn)(v)>g.Ni&&(n=-(a=180)),f[0]=n,f[1]=a,u=null}function S(t,e){return(e-=t)<0?e+360:e}function E(t,e){return t[0]-e[0]}function C(t,e){return t[0]<=t[1]?t[0]<=e&&e<=t[1]:eS(s[0],s[1])&&(s[1]=l[1]),S(l[0],s[1])>S(s[0],s[1])&&(s[0]=l[0])):c.push(s=l);for(u=-1/0,e=0,s=c[r=c.length-1];e<=r;s=l,++e)l=c[e],(p=S(s[1],l[0]))>u&&(u=p,n=l[0],a=s[1])}return h=f=null,n===1/0||i===1/0?[[NaN,NaN],[NaN,NaN]]:[[n,i],[a,o]]}},20375:function(t,e,r){\"use strict\";r.d(e,{Cx:function(){return u},EV:function(){return i},W8:function(){return o},ep:function(){return l},jf:function(){return a},ly:function(){return c},r8:function(){return s}});var n=r(61323);function i(t){return[(0,n.FP)(t[1],t[0]),(0,n.qR)(t[2])]}function a(t){var e=t[0],r=t[1],i=(0,n.gn)(r);return[i*(0,n.gn)(e),i*(0,n.F8)(e),(0,n.F8)(r)]}function o(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]}function s(t,e){return[t[1]*e[2]-t[2]*e[1],t[2]*e[0]-t[0]*e[2],t[0]*e[1]-t[1]*e[0]]}function l(t,e){t[0]+=e[0],t[1]+=e[1],t[2]+=e[2]}function c(t,e){return[t[0]*e,t[1]*e,t[2]*e]}function u(t){var e=(0,n.RZ)(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]);t[0]/=e,t[1]/=e,t[2]/=e}},30021:function(t,e,r){\"use strict\";r.d(e,{A:function(){return z}});var n,i,a,o,s,l,c,u,h,f,p,d,m,g,y,v,x=r(61323),_=r(53341),b=r(20465),w={sphere:_.A,point:T,lineStart:A,lineEnd:E,polygonStart:function(){w.lineStart=C,w.lineEnd=L},polygonEnd:function(){w.lineStart=A,w.lineEnd=E}};function T(t,e){t*=x.F2,e*=x.F2;var r=(0,x.gn)(e);k(r*(0,x.gn)(t),r*(0,x.F8)(t),(0,x.F8)(e))}function k(t,e,r){++n,a+=(t-a)/n,o+=(e-o)/n,s+=(r-s)/n}function A(){w.point=M}function M(t,e){t*=x.F2,e*=x.F2;var r=(0,x.gn)(e);g=r*(0,x.gn)(t),y=r*(0,x.F8)(t),v=(0,x.F8)(e),w.point=S,k(g,y,v)}function S(t,e){t*=x.F2,e*=x.F2;var r=(0,x.gn)(e),n=r*(0,x.gn)(t),a=r*(0,x.F8)(t),o=(0,x.F8)(e),s=(0,x.FP)((0,x.RZ)((s=y*o-v*a)*s+(s=v*n-g*o)*s+(s=g*a-y*n)*s),g*n+y*a+v*o);i+=s,l+=s*(g+(g=n)),c+=s*(y+(y=a)),u+=s*(v+(v=o)),k(g,y,v)}function E(){w.point=T}function C(){w.point=I}function L(){P(d,m),w.point=T}function I(t,e){d=t,m=e,t*=x.F2,e*=x.F2,w.point=P;var r=(0,x.gn)(e);g=r*(0,x.gn)(t),y=r*(0,x.F8)(t),v=(0,x.F8)(e),k(g,y,v)}function P(t,e){t*=x.F2,e*=x.F2;var r=(0,x.gn)(e),n=r*(0,x.gn)(t),a=r*(0,x.F8)(t),o=(0,x.F8)(e),s=y*o-v*a,d=v*n-g*o,m=g*a-y*n,_=(0,x.RZ)(s*s+d*d+m*m),b=(0,x.qR)(_),w=_&&-b/_;h+=w*s,f+=w*d,p+=w*m,i+=b,l+=b*(g+(g=n)),c+=b*(y+(y=a)),u+=b*(v+(v=o)),k(g,y,v)}function z(t){n=i=a=o=s=l=c=u=h=f=p=0,(0,b.A)(t,w);var e=h,r=f,d=p,m=e*e+r*r+d*d;return m0?os)&&(o+=i*a.FA));for(var f,p=o;i>0?p>s:p0?i.pi:-i.pi,c=(0,i.tn)(o-r);(0,i.tn)(c-i.pi)0?i.TW:-i.TW),t.point(a,n),t.lineEnd(),t.lineStart(),t.point(l,n),t.point(o,n),e=0):a!==l&&c>=i.pi&&((0,i.tn)(r-a)i.Ni?(0,i.rY)(((0,i.F8)(e)*(o=(0,i.gn)(n))*(0,i.F8)(r)-(0,i.F8)(n)*(a=(0,i.gn)(e))*(0,i.F8)(t))/(a*o*s)):(e+n)/2}(r,n,o,s),t.point(a,n),t.lineEnd(),t.lineStart(),t.point(l,n),e=0),t.point(r=o,n=s),a=l},lineEnd:function(){t.lineEnd(),r=n=NaN},clean:function(){return 2-e}}}),(function(t,e,r,n){var a;if(null==t)a=r*i.TW,n.point(-i.pi,a),n.point(0,a),n.point(i.pi,a),n.point(i.pi,0),n.point(i.pi,-a),n.point(0,-a),n.point(-i.pi,-a),n.point(-i.pi,0),n.point(-i.pi,a);else if((0,i.tn)(t[0]-e[0])>i.Ni){var o=t[0]1&&e.push(e.pop().concat(e.shift()))},result:function(){var r=e;return e=[],t=null,r}}}},47402:function(t,e,r){\"use strict\";r.d(e,{A:function(){return l}});var n=r(20375),i=r(39127),a=r(61323),o=r(28759),s=r(13720);function l(t){var e=(0,a.gn)(t),r=6*a.F2,l=e>0,c=(0,a.tn)(e)>a.Ni;function u(t,r){return(0,a.gn)(t)*(0,a.gn)(r)>e}function h(t,r,i){var o=(0,n.jf)(t),s=(0,n.jf)(r),l=[1,0,0],c=(0,n.r8)(o,s),u=(0,n.W8)(c,c),h=c[0],f=u-h*h;if(!f)return!i&&t;var p=e*u/f,d=-e*h/f,m=(0,n.r8)(l,c),g=(0,n.ly)(l,p),y=(0,n.ly)(c,d);(0,n.ep)(g,y);var v=m,x=(0,n.W8)(g,v),_=(0,n.W8)(v,v),b=x*x-_*((0,n.W8)(g,g)-1);if(!(b<0)){var w=(0,a.RZ)(b),T=(0,n.ly)(v,(-x-w)/_);if((0,n.ep)(T,g),T=(0,n.EV)(T),!i)return T;var k,A=t[0],M=r[0],S=t[1],E=r[1];M0^T[1]<((0,a.tn)(T[0]-A)a.pi^(A<=T[0]&&T[0]<=M)){var I=(0,n.ly)(v,(-x+w)/_);return(0,n.ep)(I,g),[T,(0,n.EV)(I)]}}}function f(e,r){var n=l?t:a.pi-t,i=0;return e<-n?i|=1:e>n&&(i|=2),r<-n?i|=4:r>n&&(i|=8),i}return(0,s.A)(u,(function(t){var e,r,n,i,s;return{lineStart:function(){i=n=!1,s=1},point:function(p,d){var m,g=[p,d],y=u(p,d),v=l?y?0:f(p,d):y?f(p+(p<0?a.pi:-a.pi),d):0;if(!e&&(i=n=y)&&t.lineStart(),y!==n&&(!(m=h(e,g))||(0,o.A)(e,m)||(0,o.A)(g,m))&&(g[2]=1),y!==n)s=0,y?(t.lineStart(),m=h(g,e),t.point(m[0],m[1])):(m=h(e,g),t.point(m[0],m[1],2),t.lineEnd()),e=m;else if(c&&e&&l^y){var x;v&r||!(x=h(g,e,!0))||(s=0,l?(t.lineStart(),t.point(x[0][0],x[0][1]),t.point(x[1][0],x[1][1]),t.lineEnd()):(t.point(x[1][0],x[1][1]),t.lineEnd(),t.lineStart(),t.point(x[0][0],x[0][1],3)))}!y||e&&(0,o.A)(e,g)||t.point(g[0],g[1]),e=g,n=y,r=v},lineEnd:function(){n&&t.lineEnd(),e=null},clean:function(){return s|(i&&n)<<1}}}),(function(e,n,a,o){(0,i.J)(o,t,r,a,e,n)}),l?[0,-t]:[-a.pi,t-a.pi])}},13720:function(t,e,r){\"use strict\";r.d(e,{A:function(){return l}});var n=r(39608),i=r(19119),a=r(61323),o=r(2274),s=r(29725);function l(t,e,r,a){return function(l){var h,f,p,d=e(l),m=(0,n.A)(),g=e(m),y=!1,v={point:x,lineStart:b,lineEnd:w,polygonStart:function(){v.point=T,v.lineStart=k,v.lineEnd=A,f=[],h=[]},polygonEnd:function(){v.point=x,v.lineStart=b,v.lineEnd=w,f=(0,s.Am)(f);var t=(0,o.A)(h,a);f.length?(y||(l.polygonStart(),y=!0),(0,i.A)(f,u,t,r,l)):t&&(y||(l.polygonStart(),y=!0),l.lineStart(),r(null,null,1,l),l.lineEnd()),y&&(l.polygonEnd(),y=!1),f=h=null},sphere:function(){l.polygonStart(),l.lineStart(),r(null,null,1,l),l.lineEnd(),l.polygonEnd()}};function x(e,r){t(e,r)&&l.point(e,r)}function _(t,e){d.point(t,e)}function b(){v.point=_,d.lineStart()}function w(){v.point=x,d.lineEnd()}function T(t,e){p.push([t,e]),g.point(t,e)}function k(){g.lineStart(),p=[]}function A(){T(p[0][0],p[0][1]),g.lineEnd();var t,e,r,n,i=g.clean(),a=m.result(),o=a.length;if(p.pop(),h.push(p),p=null,o)if(1&i){if((e=(r=a[0]).length-1)>0){for(y||(l.polygonStart(),y=!0),l.lineStart(),t=0;t1&&2&i&&a.push(a.pop().concat(a.shift())),f.push(a.filter(c))}return v}}function c(t){return t.length>1}function u(t,e){return((t=t.x)[0]<0?t[1]-a.TW-a.Ni:a.TW-t[1])-((e=e.x)[0]<0?e[1]-a.TW-a.Ni:a.TW-e[1])}},21503:function(t,e,r){\"use strict\";r.d(e,{A:function(){return c}});var n=r(61323),i=r(39608),a=r(19119),o=r(29725),s=1e9,l=-s;function c(t,e,r,c){function u(n,i){return t<=n&&n<=r&&e<=i&&i<=c}function h(n,i,a,o){var s=0,l=0;if(null==n||(s=f(n,a))!==(l=f(i,a))||d(n,i)<0^a>0)do{o.point(0===s||3===s?t:r,s>1?c:e)}while((s=(s+a+4)%4)!==l);else o.point(i[0],i[1])}function f(i,a){return(0,n.tn)(i[0]-t)0?0:3:(0,n.tn)(i[0]-r)0?2:1:(0,n.tn)(i[1]-e)0?1:0:a>0?3:2}function p(t,e){return d(t.x,e.x)}function d(t,e){var r=f(t,1),n=f(e,1);return r!==n?r-n:0===r?e[1]-t[1]:1===r?t[0]-e[0]:2===r?t[1]-e[1]:e[0]-t[0]}return function(n){var f,d,m,g,y,v,x,_,b,w,T,k=n,A=(0,i.A)(),M={point:S,lineStart:function(){M.point=E,d&&d.push(m=[]),w=!0,b=!1,x=_=NaN},lineEnd:function(){f&&(E(g,y),v&&b&&A.rejoin(),f.push(A.result())),M.point=S,b&&k.lineEnd()},polygonStart:function(){k=A,f=[],d=[],T=!0},polygonEnd:function(){var e=function(){for(var e=0,r=0,n=d.length;rc&&(h-i)*(c-a)>(f-a)*(t-i)&&++e:f<=c&&(h-i)*(c-a)<(f-a)*(t-i)&&--e;return e}(),r=T&&e,i=(f=(0,o.Am)(f)).length;(r||i)&&(n.polygonStart(),r&&(n.lineStart(),h(null,null,1,n),n.lineEnd()),i&&(0,a.A)(f,p,e,h,n),n.polygonEnd()),k=n,f=d=m=null}};function S(t,e){u(t,e)&&k.point(t,e)}function E(n,i){var a=u(n,i);if(d&&m.push([n,i]),w)g=n,y=i,v=a,w=!1,a&&(k.lineStart(),k.point(n,i));else if(a&&b)k.point(n,i);else{var o=[x=Math.max(l,Math.min(s,x)),_=Math.max(l,Math.min(s,_))],h=[n=Math.max(l,Math.min(s,n)),i=Math.max(l,Math.min(s,i))];!function(t,e,r,n,i,a){var o,s=t[0],l=t[1],c=0,u=1,h=e[0]-s,f=e[1]-l;if(o=r-s,h||!(o>0)){if(o/=h,h<0){if(o0){if(o>u)return;o>c&&(c=o)}if(o=i-s,h||!(o<0)){if(o/=h,h<0){if(o>u)return;o>c&&(c=o)}else if(h>0){if(o0)){if(o/=f,f<0){if(o0){if(o>u)return;o>c&&(c=o)}if(o=a-l,f||!(o<0)){if(o/=f,f<0){if(o>u)return;o>c&&(c=o)}else if(f>0){if(o0&&(t[0]=s+c*h,t[1]=l+c*f),u<1&&(e[0]=s+u*h,e[1]=l+u*f),!0}}}}}(o,h,t,e,r,c)?a&&(k.lineStart(),k.point(n,i),T=!1):(b||(k.lineStart(),k.point(o[0],o[1])),k.point(h[0],h[1]),a||k.lineEnd(),T=!1)}x=n,_=i,b=a}return M}}},19119:function(t,e,r){\"use strict\";r.d(e,{A:function(){return o}});var n=r(28759),i=r(61323);function a(t,e,r,n){this.x=t,this.z=e,this.o=r,this.e=n,this.v=!1,this.n=this.p=null}function o(t,e,r,o,l){var c,u,h=[],f=[];if(t.forEach((function(t){if(!((e=t.length-1)<=0)){var e,r,o=t[0],s=t[e];if((0,n.A)(o,s)){if(!o[2]&&!s[2]){for(l.lineStart(),c=0;c=0;--c)l.point((d=p[c])[0],d[1]);else o(g.x,g.p.x,-1,l);g=g.p}p=(g=g.o).z,y=!y}while(!g.v);l.lineEnd()}}}function s(t){if(e=t.length){for(var e,r,n=0,i=t[0];++n0&&(i=S(t[a],t[a-1]))>0&&r<=i&&n<=i&&(r+n-i)*(1-Math.pow((r-n)/i,2))g.Ni})).map(l)).concat((0,F.y1)((0,g.mk)(a/p)*p,i,p).filter((function(t){return(0,g.tn)(t%m)>g.Ni})).map(c))}return v.lines=function(){return x().map((function(t){return{type:\"LineString\",coordinates:t}}))},v.outline=function(){return{type:\"Polygon\",coordinates:[u(n).concat(h(o).slice(1),u(r).reverse().slice(1),h(s).reverse().slice(1))]}},v.extent=function(t){return arguments.length?v.extentMajor(t).extentMinor(t):v.extentMinor()},v.extentMajor=function(t){return arguments.length?(n=+t[0][0],r=+t[1][0],s=+t[0][1],o=+t[1][1],n>r&&(t=n,n=r,r=t),s>o&&(t=s,s=o,o=t),v.precision(y)):[[n,s],[r,o]]},v.extentMinor=function(r){return arguments.length?(e=+r[0][0],t=+r[1][0],a=+r[0][1],i=+r[1][1],e>t&&(r=e,e=t,t=r),a>i&&(r=a,a=i,i=r),v.precision(y)):[[e,a],[t,i]]},v.step=function(t){return arguments.length?v.stepMajor(t).stepMinor(t):v.stepMinor()},v.stepMajor=function(t){return arguments.length?(d=+t[0],m=+t[1],v):[d,m]},v.stepMinor=function(t){return arguments.length?(f=+t[0],p=+t[1],v):[f,p]},v.precision=function(f){return arguments.length?(y=+f,l=B(a,i,90),c=N(e,t,y),u=B(s,o,90),h=N(n,r,y),v):y},v.extentMajor([[-180,-90+g.Ni],[180,90-g.Ni]]).extentMinor([[-180,-80-g.Ni],[180,80+g.Ni]])}function U(){return j()()}var V,q,H,G,Z=r(81758),W=r(26827),Y=(0,m.A)(),X=(0,m.A)(),$={point:y.A,lineStart:y.A,lineEnd:y.A,polygonStart:function(){$.lineStart=J,$.lineEnd=tt},polygonEnd:function(){$.lineStart=$.lineEnd=$.point=y.A,Y.add((0,g.tn)(X)),X.reset()},result:function(){var t=Y/2;return Y.reset(),t}};function J(){$.point=K}function K(t,e){$.point=Q,V=H=t,q=G=e}function Q(t,e){X.add(G*t-H*e),H=t,G=e}function tt(){Q(V,q)}var et,rt,nt,it,at=$,ot=r(33028),st=0,lt=0,ct=0,ut=0,ht=0,ft=0,pt=0,dt=0,mt=0,gt={point:yt,lineStart:vt,lineEnd:bt,polygonStart:function(){gt.lineStart=wt,gt.lineEnd=Tt},polygonEnd:function(){gt.point=yt,gt.lineStart=vt,gt.lineEnd=bt},result:function(){var t=mt?[pt/mt,dt/mt]:ft?[ut/ft,ht/ft]:ct?[st/ct,lt/ct]:[NaN,NaN];return st=lt=ct=ut=ht=ft=pt=dt=mt=0,t}};function yt(t,e){st+=t,lt+=e,++ct}function vt(){gt.point=xt}function xt(t,e){gt.point=_t,yt(nt=t,it=e)}function _t(t,e){var r=t-nt,n=e-it,i=(0,g.RZ)(r*r+n*n);ut+=i*(nt+t)/2,ht+=i*(it+e)/2,ft+=i,yt(nt=t,it=e)}function bt(){gt.point=yt}function wt(){gt.point=kt}function Tt(){At(et,rt)}function kt(t,e){gt.point=At,yt(et=nt=t,rt=it=e)}function At(t,e){var r=t-nt,n=e-it,i=(0,g.RZ)(r*r+n*n);ut+=i*(nt+t)/2,ht+=i*(it+e)/2,ft+=i,pt+=(i=it*t-nt*e)*(nt+t),dt+=i*(it+e),mt+=3*i,yt(nt=t,it=e)}var Mt=gt;function St(t){this._context=t}St.prototype={_radius:4.5,pointRadius:function(t){return this._radius=t,this},polygonStart:function(){this._line=0},polygonEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){0===this._line&&this._context.closePath(),this._point=NaN},point:function(t,e){switch(this._point){case 0:this._context.moveTo(t,e),this._point=1;break;case 1:this._context.lineTo(t,e);break;default:this._context.moveTo(t+this._radius,e),this._context.arc(t,e,this._radius,0,g.FA)}},result:y.A};var Et,Ct,Lt,It,Pt,zt=(0,m.A)(),Ot={point:y.A,lineStart:function(){Ot.point=Dt},lineEnd:function(){Et&&Rt(Ct,Lt),Ot.point=y.A},polygonStart:function(){Et=!0},polygonEnd:function(){Et=null},result:function(){var t=+zt;return zt.reset(),t}};function Dt(t,e){Ot.point=Rt,Ct=It=t,Lt=Pt=e}function Rt(t,e){It-=t,Pt-=e,zt.add((0,g.RZ)(It*It+Pt*Pt)),It=t,Pt=e}var Ft=Ot;function Bt(){this._string=[]}function Nt(t){return\"m0,\"+t+\"a\"+t+\",\"+t+\" 0 1,1 0,\"+-2*t+\"a\"+t+\",\"+t+\" 0 1,1 0,\"+2*t+\"z\"}function jt(t,e){var r,n,i=4.5;function a(t){return t&&(\"function\"==typeof i&&n.pointRadius(+i.apply(this,arguments)),(0,v.A)(t,r(n))),n.result()}return a.area=function(t){return(0,v.A)(t,r(at)),at.result()},a.measure=function(t){return(0,v.A)(t,r(Ft)),Ft.result()},a.bounds=function(t){return(0,v.A)(t,r(ot.A)),ot.A.result()},a.centroid=function(t){return(0,v.A)(t,r(Mt)),Mt.result()},a.projection=function(e){return arguments.length?(r=null==e?(t=null,W.A):(t=e).stream,a):t},a.context=function(t){return arguments.length?(n=null==t?(e=null,new Bt):new St(e=t),\"function\"!=typeof i&&n.pointRadius(i),a):e},a.pointRadius=function(t){return arguments.length?(i=\"function\"==typeof t?t:(n.pointRadius(+t),+t),a):i},a.projection(t).context(e)}Bt.prototype={_radius:4.5,_circle:Nt(4.5),pointRadius:function(t){return(t=+t)!==this._radius&&(this._radius=t,this._circle=null),this},polygonStart:function(){this._line=0},polygonEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){0===this._line&&this._string.push(\"Z\"),this._point=NaN},point:function(t,e){switch(this._point){case 0:this._string.push(\"M\",t,\",\",e),this._point=1;break;case 1:this._string.push(\"L\",t,\",\",e);break;default:null==this._circle&&(this._circle=Nt(this._radius)),this._string.push(\"M\",t,\",\",e,this._circle)}},result:function(){if(this._string.length){var t=this._string.join(\"\");return this._string=[],t}return null}};var Ut=r(94684);function Vt(t){var e=0,r=g.pi/3,n=(0,Ut.U)(t),i=n(e,r);return i.parallels=function(t){return arguments.length?n(e=t[0]*g.F2,r=t[1]*g.F2):[e*g.uj,r*g.uj]},i}function qt(t,e){var r=(0,g.F8)(t),n=(r+(0,g.F8)(e))/2;if((0,g.tn)(n)=.12&&i<.234&&n>=-.425&&n<-.214?s:i>=.166&&i<.234&&n>=-.214&&n<-.115?l:o).invert(t)},u.stream=function(r){return t&&e===r?t:(n=[o.stream(e=r),s.stream(r),l.stream(r)],i=n.length,t={point:function(t,e){for(var r=-1;++r0?e<-g.TW+g.Ni&&(e=-g.TW+g.Ni):e>g.TW-g.Ni&&(e=g.TW-g.Ni);var r=i/(0,g.n7)(te(e),n);return[r*(0,g.F8)(n*t),i-r*(0,g.gn)(n*t)]}return a.invert=function(t,e){var r=i-e,a=(0,g._S)(n)*(0,g.RZ)(t*t+r*r),o=(0,g.FP)(t,(0,g.tn)(r))*(0,g._S)(r);return r*n<0&&(o-=g.pi*(0,g._S)(t)*(0,g._S)(r)),[o/n,2*(0,g.rY)((0,g.n7)(i/a,1/n))-g.TW]},a}function re(){return Vt(ee).scale(109.5).parallels([30,30])}Jt.invert=function(t,e){return[t,2*(0,g.rY)((0,g.oN)(e))-g.TW]};var ne=r(18139);function ie(t,e){var r=(0,g.gn)(t),n=t===e?(0,g.F8)(t):(r-(0,g.gn)(e))/(e-t),i=r/n+t;if((0,g.tn)(n)2?t[2]+90:90]):[(t=r())[0],t[1],t[2]-90]},r([0,0,90]).scale(159.155)}xe.invert=(0,ve.I)((function(t){return 2*(0,g.rY)(t)})),be.invert=function(t,e){return[-e,2*(0,g.rY)((0,g.oN)(t))-g.TW]}},81758:function(t,e,r){\"use strict\";r.d(e,{A:function(){return i}});var n=r(61323);function i(t,e){var r=t[0]*n.F2,i=t[1]*n.F2,a=e[0]*n.F2,o=e[1]*n.F2,s=(0,n.gn)(i),l=(0,n.F8)(i),c=(0,n.gn)(o),u=(0,n.F8)(o),h=s*(0,n.gn)(r),f=s*(0,n.F8)(r),p=c*(0,n.gn)(a),d=c*(0,n.F8)(a),m=2*(0,n.qR)((0,n.RZ)((0,n.bo)(o-i)+s*c*(0,n.bo)(a-r))),g=(0,n.F8)(m),y=m?function(t){var e=(0,n.F8)(t*=m)/g,r=(0,n.F8)(m-t)/g,i=r*h+e*p,a=r*f+e*d,o=r*l+e*u;return[(0,n.FP)(a,i)*n.uj,(0,n.FP)(o,(0,n.RZ)(i*i+a*a))*n.uj]}:function(){return[r*n.uj,i*n.uj]};return y.distance=m,y}},61323:function(t,e,r){\"use strict\";r.d(e,{$t:function(){return i},F2:function(){return u},F8:function(){return x},FA:function(){return l},FP:function(){return p},HQ:function(){return T},Ml:function(){return w},Ni:function(){return n},RZ:function(){return b},Rm:function(){return y},TW:function(){return o},_S:function(){return _},bo:function(){return A},gn:function(){return d},gz:function(){return s},mk:function(){return m},n7:function(){return v},oN:function(){return g},pi:function(){return a},qR:function(){return k},rY:function(){return f},tn:function(){return h},uj:function(){return c}});var n=1e-6,i=1e-12,a=Math.PI,o=a/2,s=a/4,l=2*a,c=180/a,u=a/180,h=Math.abs,f=Math.atan,p=Math.atan2,d=Math.cos,m=Math.ceil,g=Math.exp,y=(Math.floor,Math.log),v=Math.pow,x=Math.sin,_=Math.sign||function(t){return t>0?1:t<0?-1:0},b=Math.sqrt,w=Math.tan;function T(t){return t>1?0:t<-1?a:Math.acos(t)}function k(t){return t>1?o:t<-1?-o:Math.asin(t)}function A(t){return(t=x(t/2))*t}},53341:function(t,e,r){\"use strict\";function n(){}r.d(e,{A:function(){return n}})},33028:function(t,e,r){\"use strict\";var n=r(53341),i=1/0,a=i,o=-i,s=o,l={point:function(t,e){to&&(o=t),es&&(s=e)},lineStart:n.A,lineEnd:n.A,polygonStart:n.A,polygonEnd:n.A,result:function(){var t=[[i,a],[o,s]];return o=s=-(a=i=1/0),t}};e.A=l},28759:function(t,e,r){\"use strict\";r.d(e,{A:function(){return i}});var n=r(61323);function i(t,e){return(0,n.tn)(t[0]-e[0])=0?1:-1,C=E*S,L=C>a.pi,I=x*A;if(o.add((0,a.FP)(I*E*(0,a.F8)(C),_*M+I*(0,a.gn)(C))),u+=L?S+E*a.FA:S,L^y>=r^T>=r){var P=(0,i.r8)((0,i.jf)(g),(0,i.jf)(w));(0,i.Cx)(P);var z=(0,i.r8)(c,P);(0,i.Cx)(z);var O=(L^S>=0?-1:1)*(0,a.qR)(z[2]);(n>O||n===O&&(P[0]||P[1]))&&(h+=L^S>=0?1:-1)}}return(u<-a.Ni||u4*e&&y--){var w=o+p,T=s+m,k=c+g,A=(0,l.RZ)(w*w+T*T+k*k),M=(0,l.qR)(k/=A),S=(0,l.tn)((0,l.tn)(k)-1)e||(0,l.tn)((x*I+_*P)/b-.5)>.3||o*p+s*m+c*g2?t[2]%360*l.F2:0,V()):[C*l.uj,L*l.uj,I*l.uj]},j.angle=function(t){return arguments.length?(P=t%360*l.F2,V()):P*l.uj},j.reflectX=function(t){return arguments.length?(z=t?-1:1,V()):z<0},j.reflectY=function(t){return arguments.length?(O=t?-1:1,V()):O<0},j.precision=function(t){return arguments.length?(x=m(_,N=t*t),q()):(0,l.RZ)(N)},j.fitExtent=function(t,e){return(0,h.sp)(j,t,e)},j.fitSize=function(t,e){return(0,h.Hv)(j,t,e)},j.fitWidth=function(t,e){return(0,h.G0)(j,t,e)},j.fitHeight=function(t,e){return(0,h.FL)(j,t,e)},function(){return e=t.apply(this,arguments),j.invert=e.invert&&U,V()}}},57949:function(t,e,r){\"use strict\";r.d(e,{A:function(){return o},P:function(){return a}});var n=r(94684),i=r(61323);function a(t,e){var r=e*e,n=r*r;return[t*(.8707-.131979*r+n*(n*(.003971*r-.001529*n)-.013791)),e*(1.007226+r*(.015085+n*(.028874*r-.044475-.005916*n)))]}function o(){return(0,n.A)(a).scale(175.295)}a.invert=function(t,e){var r,n=e,a=25;do{var o=n*n,s=o*o;n-=r=(n*(1.007226+o*(.015085+s*(.028874*o-.044475-.005916*s)))-e)/(1.007226+o*(.045255+s*(.259866*o-.311325-.005916*11*s)))}while((0,i.tn)(r)>i.Ni&&--a>0);return[t/(.8707+(o=n*n)*(o*(o*o*o*(.003971-.001529*o)-.013791)-.131979)),n]}},53253:function(t,e,r){\"use strict\";r.d(e,{A:function(){return s},x:function(){return o}});var n=r(61323),i=r(57738),a=r(94684);function o(t,e){return[(0,n.gn)(e)*(0,n.F8)(t),(0,n.F8)(e)]}function s(){return(0,a.A)(o).scale(249.5).clipAngle(90+n.Ni)}o.invert=(0,i.I)(n.qR)},30915:function(t,e,r){\"use strict\";r.d(e,{A:function(){return u},y:function(){return o}});var n=r(19057),i=r(61323);function a(t,e){return[(0,i.tn)(t)>i.pi?t+Math.round(-t/i.FA)*i.FA:t,e]}function o(t,e,r){return(t%=i.FA)?e||r?(0,n.A)(l(t),c(e,r)):l(t):e||r?c(e,r):a}function s(t){return function(e,r){return[(e+=t)>i.pi?e-i.FA:e<-i.pi?e+i.FA:e,r]}}function l(t){var e=s(t);return e.invert=s(-t),e}function c(t,e){var r=(0,i.gn)(t),n=(0,i.F8)(t),a=(0,i.gn)(e),o=(0,i.F8)(e);function s(t,e){var s=(0,i.gn)(e),l=(0,i.gn)(t)*s,c=(0,i.F8)(t)*s,u=(0,i.F8)(e),h=u*r+l*n;return[(0,i.FP)(c*a-h*o,l*r-u*n),(0,i.qR)(h*a+c*o)]}return s.invert=function(t,e){var s=(0,i.gn)(e),l=(0,i.gn)(t)*s,c=(0,i.F8)(t)*s,u=(0,i.F8)(e),h=u*a-c*o;return[(0,i.FP)(c*a+u*o,l*r+h*n),(0,i.qR)(h*r-l*n)]},s}function u(t){function e(e){return(e=t(e[0]*i.F2,e[1]*i.F2))[0]*=i.uj,e[1]*=i.uj,e}return t=o(t[0]*i.F2,t[1]*i.F2,t.length>2?t[2]*i.F2:0),e.invert=function(e){return(e=t.invert(e[0]*i.F2,e[1]*i.F2))[0]*=i.uj,e[1]*=i.uj,e},e}a.invert=a},20465:function(t,e,r){\"use strict\";function n(t,e){t&&a.hasOwnProperty(t.type)&&a[t.type](t,e)}r.d(e,{A:function(){return l}});var i={Feature:function(t,e){n(t.geometry,e)},FeatureCollection:function(t,e){for(var r=t.features,i=-1,a=r.length;++i=0;)e+=r[n].value;else e=1;t.value=e}function l(t,e){var r,n,i,a,o,s=new f(t),l=+t.value&&(s.value=t.value),u=[s];for(null==e&&(e=c);r=u.pop();)if(l&&(r.value=+r.data.value),(i=e(r.data))&&(o=i.length))for(r.children=new Array(o),a=o-1;a>=0;--a)u.push(n=r.children[a]=new f(i[a])),n.parent=r,n.depth=r.depth+1;return s.eachBefore(h)}function c(t){return t.children}function u(t){t.data=t.data.data}function h(t){var e=0;do{t.height=e}while((t=t.parent)&&t.height<++e)}function f(t){this.data=t,this.depth=this.height=0,this.parent=null}r.r(e),r.d(e,{cluster:function(){return o},hierarchy:function(){return l},pack:function(){return P},packEnclose:function(){return d},packSiblings:function(){return S},partition:function(){return B},stratify:function(){return H},tree:function(){return J},treemap:function(){return rt},treemapBinary:function(){return nt},treemapDice:function(){return F},treemapResquarify:function(){return at},treemapSlice:function(){return K},treemapSliceDice:function(){return it},treemapSquarify:function(){return et}}),f.prototype=l.prototype={constructor:f,count:function(){return this.eachAfter(s)},each:function(t){var e,r,n,i,a=this,o=[a];do{for(e=o.reverse(),o=[];a=e.pop();)if(t(a),r=a.children)for(n=0,i=r.length;n=0;--r)i.push(e[r]);return this},sum:function(t){return this.eachAfter((function(e){for(var r=+t(e.data)||0,n=e.children,i=n&&n.length;--i>=0;)r+=n[i].value;e.value=r}))},sort:function(t){return this.eachBefore((function(e){e.children&&e.children.sort(t)}))},path:function(t){for(var e=this,r=function(t,e){if(t===e)return t;var r=t.ancestors(),n=e.ancestors(),i=null;for(t=r.pop(),e=n.pop();t===e;)i=t,t=r.pop(),e=n.pop();return i}(e,t),n=[e];e!==r;)e=e.parent,n.push(e);for(var i=n.length;t!==r;)n.splice(i,0,t),t=t.parent;return n},ancestors:function(){for(var t=this,e=[t];t=t.parent;)e.push(t);return e},descendants:function(){var t=[];return this.each((function(e){t.push(e)})),t},leaves:function(){var t=[];return this.eachBefore((function(e){e.children||t.push(e)})),t},links:function(){var t=this,e=[];return t.each((function(r){r!==t&&e.push({source:r.parent,target:r})})),e},copy:function(){return l(this).eachBefore(u)}};var p=Array.prototype.slice;function d(t){for(var e,r,n=0,i=(t=function(t){for(var e,r,n=t.length;n;)r=Math.random()*n--|0,e=t[n],t[n]=t[r],t[r]=e;return t}(p.call(t))).length,a=[];n0&&r*r>n*n+i*i}function v(t,e){for(var r=0;r(o*=o)?(n=(c+o-i)/(2*c),a=Math.sqrt(Math.max(0,o/c-n*n)),r.x=t.x-n*s-a*l,r.y=t.y-n*l+a*s):(n=(c+i-o)/(2*c),a=Math.sqrt(Math.max(0,i/c-n*n)),r.x=e.x+n*s-a*l,r.y=e.y+n*l+a*s)):(r.x=e.x+r.r,r.y=e.y)}function T(t,e){var r=t.r+e.r-1e-6,n=e.x-t.x,i=e.y-t.y;return r>0&&r*r>n*n+i*i}function k(t){var e=t._,r=t.next._,n=e.r+r.r,i=(e.x*r.r+r.x*e.r)/n,a=(e.y*r.r+r.y*e.r)/n;return i*i+a*a}function A(t){this._=t,this.next=null,this.previous=null}function M(t){if(!(i=t.length))return 0;var e,r,n,i,a,o,s,l,c,u,h;if((e=t[0]).x=0,e.y=0,!(i>1))return e.r;if(r=t[1],e.x=-r.r,r.x=e.r,r.y=0,!(i>2))return e.r+r.r;w(r,e,n=t[2]),e=new A(e),r=new A(r),n=new A(n),e.next=n.previous=r,r.next=e.previous=n,n.next=r.previous=e;t:for(s=3;s0)throw new Error(\"cycle\");return a}return r.id=function(e){return arguments.length?(t=E(e),r):t},r.parentId=function(t){return arguments.length?(e=E(t),r):e},r}function G(t,e){return t.parent===e.parent?1:2}function Z(t){var e=t.children;return e?e[0]:t.t}function W(t){var e=t.children;return e?e[e.length-1]:t.t}function Y(t,e,r){var n=r/(e.i-t.i);e.c-=n,e.s+=r,t.c+=n,e.z+=r,e.m+=r}function X(t,e,r){return t.a.parent===e.parent?t.a:r}function $(t,e){this._=t,this.parent=null,this.children=null,this.A=null,this.a=this,this.z=0,this.m=0,this.c=0,this.s=0,this.t=null,this.i=e}function J(){var t=G,e=1,r=1,n=null;function i(i){var l=function(t){for(var e,r,n,i,a,o=new $(t,0),s=[o];e=s.pop();)if(n=e._.children)for(e.children=new Array(a=n.length),i=a-1;i>=0;--i)s.push(r=e.children[i]=new $(n[i],i)),r.parent=e;return(o.parent=new $(null,0)).children=[o],o}(i);if(l.eachAfter(a),l.parent.m=-l.z,l.eachBefore(o),n)i.eachBefore(s);else{var c=i,u=i,h=i;i.eachBefore((function(t){t.xu.x&&(u=t),t.depth>h.depth&&(h=t)}));var f=c===u?1:t(c,u)/2,p=f-c.x,d=e/(u.x+f+p),m=r/(h.depth||1);i.eachBefore((function(t){t.x=(t.x+p)*d,t.y=t.depth*m}))}return i}function a(e){var r=e.children,n=e.parent.children,i=e.i?n[e.i-1]:null;if(r){!function(t){for(var e,r=0,n=0,i=t.children,a=i.length;--a>=0;)(e=i[a]).z+=r,e.m+=r,r+=e.s+(n+=e.c)}(e);var a=(r[0].z+r[r.length-1].z)/2;i?(e.z=i.z+t(e._,i._),e.m=e.z-a):e.z=a}else i&&(e.z=i.z+t(e._,i._));e.parent.A=function(e,r,n){if(r){for(var i,a=e,o=e,s=r,l=a.parent.children[0],c=a.m,u=o.m,h=s.m,f=l.m;s=W(s),a=Z(a),s&&a;)l=Z(l),(o=W(o)).a=e,(i=s.z+h-a.z-c+t(s._,a._))>0&&(Y(X(s,e,n),e,i),c+=i,u+=i),h+=s.m,c+=a.m,f+=l.m,u+=o.m;s&&!W(o)&&(o.t=s,o.m+=h-u),a&&!Z(l)&&(l.t=a,l.m+=c-f,n=e)}return n}(e,i,e.parent.A||n[0])}function o(t){t._.x=t.z+t.parent.m,t.m+=t.parent.m}function s(t){t.x*=e,t.y=t.depth*r}return i.separation=function(e){return arguments.length?(t=e,i):t},i.size=function(t){return arguments.length?(n=!1,e=+t[0],r=+t[1],i):n?null:[e,r]},i.nodeSize=function(t){return arguments.length?(n=!0,e=+t[0],r=+t[1],i):n?[e,r]:null},i}function K(t,e,r,n,i){for(var a,o=t.children,s=-1,l=o.length,c=t.value&&(i-r)/t.value;++sf&&(f=s),g=u*u*m,(p=Math.max(f/g,g/h))>d){u-=s;break}d=p}y.push(o={value:u,dice:l1?e:1)},r}(Q);function rt(){var t=et,e=!1,r=1,n=1,i=[0],a=C,o=C,s=C,l=C,c=C;function u(t){return t.x0=t.y0=0,t.x1=r,t.y1=n,t.eachBefore(h),i=[0],e&&t.eachBefore(R),t}function h(e){var r=i[e.depth],n=e.x0+r,u=e.y0+r,h=e.x1-r,f=e.y1-r;h=r-1){var u=s[e];return u.x0=i,u.y0=a,u.x1=o,void(u.y1=l)}for(var h=c[e],f=n/2+h,p=e+1,d=r-1;p>>1;c[m]l-a){var v=(i*y+o*g)/n;t(e,p,g,i,a,v,l),t(p,r,y,v,a,o,l)}else{var x=(a*y+l*g)/n;t(e,p,g,i,a,o,x),t(p,r,y,i,x,o,l)}}(0,l,t.value,e,r,n,i)}function it(t,e,r,n,i){(1&t.depth?K:F)(t,e,r,n,i)}var at=function t(e){function r(t,r,n,i,a){if((o=t._squarify)&&o.ratio===e)for(var o,s,l,c,u,h=-1,f=o.length,p=t.value;++h1?e:1)},r}(Q)},48544:function(t,e,r){\"use strict\";r.d(e,{pq:function(){return y}});var n=Math.PI,i=2*n,a=1e-6,o=i-a;function s(){this._x0=this._y0=this._x1=this._y1=null,this._=\"\"}function l(){return new s}s.prototype=l.prototype={constructor:s,moveTo:function(t,e){this._+=\"M\"+(this._x0=this._x1=+t)+\",\"+(this._y0=this._y1=+e)},closePath:function(){null!==this._x1&&(this._x1=this._x0,this._y1=this._y0,this._+=\"Z\")},lineTo:function(t,e){this._+=\"L\"+(this._x1=+t)+\",\"+(this._y1=+e)},quadraticCurveTo:function(t,e,r,n){this._+=\"Q\"+ +t+\",\"+ +e+\",\"+(this._x1=+r)+\",\"+(this._y1=+n)},bezierCurveTo:function(t,e,r,n,i,a){this._+=\"C\"+ +t+\",\"+ +e+\",\"+ +r+\",\"+ +n+\",\"+(this._x1=+i)+\",\"+(this._y1=+a)},arcTo:function(t,e,r,i,o){t=+t,e=+e,r=+r,i=+i,o=+o;var s=this._x1,l=this._y1,c=r-t,u=i-e,h=s-t,f=l-e,p=h*h+f*f;if(o<0)throw new Error(\"negative radius: \"+o);if(null===this._x1)this._+=\"M\"+(this._x1=t)+\",\"+(this._y1=e);else if(p>a)if(Math.abs(f*c-u*h)>a&&o){var d=r-s,m=i-l,g=c*c+u*u,y=d*d+m*m,v=Math.sqrt(g),x=Math.sqrt(p),_=o*Math.tan((n-Math.acos((g+p-y)/(2*v*x)))/2),b=_/x,w=_/v;Math.abs(b-1)>a&&(this._+=\"L\"+(t+b*h)+\",\"+(e+b*f)),this._+=\"A\"+o+\",\"+o+\",0,0,\"+ +(f*d>h*m)+\",\"+(this._x1=t+w*c)+\",\"+(this._y1=e+w*u)}else this._+=\"L\"+(this._x1=t)+\",\"+(this._y1=e)},arc:function(t,e,r,s,l,c){t=+t,e=+e,c=!!c;var u=(r=+r)*Math.cos(s),h=r*Math.sin(s),f=t+u,p=e+h,d=1^c,m=c?s-l:l-s;if(r<0)throw new Error(\"negative radius: \"+r);null===this._x1?this._+=\"M\"+f+\",\"+p:(Math.abs(this._x1-f)>a||Math.abs(this._y1-p)>a)&&(this._+=\"L\"+f+\",\"+p),r&&(m<0&&(m=m%i+i),m>o?this._+=\"A\"+r+\",\"+r+\",0,1,\"+d+\",\"+(t-u)+\",\"+(e-h)+\"A\"+r+\",\"+r+\",0,1,\"+d+\",\"+(this._x1=f)+\",\"+(this._y1=p):m>a&&(this._+=\"A\"+r+\",\"+r+\",0,\"+ +(m>=n)+\",\"+d+\",\"+(this._x1=t+r*Math.cos(l))+\",\"+(this._y1=e+r*Math.sin(l))))},rect:function(t,e,r,n){this._+=\"M\"+(this._x0=this._x1=+t)+\",\"+(this._y0=this._y1=+e)+\"h\"+ +r+\"v\"+ +n+\"h\"+-r+\"Z\"},toString:function(){return this._}};var c=l,u=Array.prototype.slice;function h(t){return function(){return t}}function f(t){return t[0]}function p(t){return t[1]}function d(t){return t.source}function m(t){return t.target}function g(t,e,r,n,i){t.moveTo(e,r),t.bezierCurveTo(e=(e+n)/2,r,e,i,n,i)}function y(){return function(t){var e=d,r=m,n=f,i=p,a=null;function o(){var o,s=u.call(arguments),l=e.apply(this,s),h=r.apply(this,s);if(a||(a=o=c()),t(a,+n.apply(this,(s[0]=l,s)),+i.apply(this,s),+n.apply(this,(s[0]=h,s)),+i.apply(this,s)),o)return a=null,o+\"\"||null}return o.source=function(t){return arguments.length?(e=t,o):e},o.target=function(t){return arguments.length?(r=t,o):r},o.x=function(t){return arguments.length?(n=\"function\"==typeof t?t:h(+t),o):n},o.y=function(t){return arguments.length?(i=\"function\"==typeof t?t:h(+t),o):i},o.context=function(t){return arguments.length?(a=null==t?null:t,o):a},o}(g)}},42696:function(t,e,r){\"use strict\";r.d(e,{DC:function(){return d},de:function(){return f},aL:function(){return m}});var n=r(1681),i=r(72543),a=r(55735),o=r(47265),s=r(9830),l=r(59764);function c(t){if(0<=t.y&&t.y<100){var e=new Date(-1,t.m,t.d,t.H,t.M,t.S,t.L);return e.setFullYear(t.y),e}return new Date(t.y,t.m,t.d,t.H,t.M,t.S,t.L)}function u(t){if(0<=t.y&&t.y<100){var e=new Date(Date.UTC(-1,t.m,t.d,t.H,t.M,t.S,t.L));return e.setUTCFullYear(t.y),e}return new Date(Date.UTC(t.y,t.m,t.d,t.H,t.M,t.S,t.L))}function h(t,e,r){return{y:t,m:e,d:r,H:0,M:0,S:0,L:0}}function f(t){var e=t.dateTime,r=t.date,s=t.time,l=t.periods,f=t.days,p=t.shortDays,d=t.months,m=t.shortMonths,y=w(l),v=T(l),x=w(f),_=T(f),b=w(p),St=T(p),Et=w(d),Ct=T(d),Lt=w(m),It=T(m),Pt={a:function(t){return p[t.getDay()]},A:function(t){return f[t.getDay()]},b:function(t){return m[t.getMonth()]},B:function(t){return d[t.getMonth()]},c:null,d:H,e:H,f:X,H:G,I:Z,j:W,L:Y,m:$,M:J,p:function(t){return l[+(t.getHours()>=12)]},q:function(t){return 1+~~(t.getMonth()/3)},Q:At,s:Mt,S:K,u:Q,U:tt,V:et,w:rt,W:nt,x:null,X:null,y:it,Y:at,Z:ot,\"%\":kt},zt={a:function(t){return p[t.getUTCDay()]},A:function(t){return f[t.getUTCDay()]},b:function(t){return m[t.getUTCMonth()]},B:function(t){return d[t.getUTCMonth()]},c:null,d:st,e:st,f:ft,H:lt,I:ct,j:ut,L:ht,m:pt,M:dt,p:function(t){return l[+(t.getUTCHours()>=12)]},q:function(t){return 1+~~(t.getUTCMonth()/3)},Q:At,s:Mt,S:mt,u:gt,U:yt,V:vt,w:xt,W:_t,x:null,X:null,y:bt,Y:wt,Z:Tt,\"%\":kt},Ot={a:function(t,e,r){var n=b.exec(e.slice(r));return n?(t.w=St[n[0].toLowerCase()],r+n[0].length):-1},A:function(t,e,r){var n=x.exec(e.slice(r));return n?(t.w=_[n[0].toLowerCase()],r+n[0].length):-1},b:function(t,e,r){var n=Lt.exec(e.slice(r));return n?(t.m=It[n[0].toLowerCase()],r+n[0].length):-1},B:function(t,e,r){var n=Et.exec(e.slice(r));return n?(t.m=Ct[n[0].toLowerCase()],r+n[0].length):-1},c:function(t,r,n){return Ft(t,e,r,n)},d:O,e:O,f:j,H:R,I:R,j:D,L:N,m:z,M:F,p:function(t,e,r){var n=y.exec(e.slice(r));return n?(t.p=v[n[0].toLowerCase()],r+n[0].length):-1},q:P,Q:V,s:q,S:B,u:A,U:M,V:S,w:k,W:E,x:function(t,e,n){return Ft(t,r,e,n)},X:function(t,e,r){return Ft(t,s,e,r)},y:L,Y:C,Z:I,\"%\":U};function Dt(t,e){return function(r){var n,i,a,o=[],s=-1,l=0,c=t.length;for(r instanceof Date||(r=new Date(+r));++s53)return null;\"w\"in f||(f.w=1),\"Z\"in f?(l=(s=u(h(f.y,0,1))).getUTCDay(),s=l>4||0===l?n.rt.ceil(s):(0,n.rt)(s),s=i.A.offset(s,7*(f.V-1)),f.y=s.getUTCFullYear(),f.m=s.getUTCMonth(),f.d=s.getUTCDate()+(f.w+6)%7):(l=(s=c(h(f.y,0,1))).getDay(),s=l>4||0===l?a.By.ceil(s):(0,a.By)(s),s=o.A.offset(s,7*(f.V-1)),f.y=s.getFullYear(),f.m=s.getMonth(),f.d=s.getDate()+(f.w+6)%7)}else(\"W\"in f||\"U\"in f)&&(\"w\"in f||(f.w=\"u\"in f?f.u%7:\"W\"in f?1:0),l=\"Z\"in f?u(h(f.y,0,1)).getUTCDay():c(h(f.y,0,1)).getDay(),f.m=0,f.d=\"W\"in f?(f.w+6)%7+7*f.W-(l+5)%7:f.w+7*f.U-(l+6)%7);return\"Z\"in f?(f.H+=f.Z/100|0,f.M+=f.Z%100,u(f)):c(f)}}function Ft(t,e,r,n){for(var i,a,o=0,s=e.length,l=r.length;o=l)return-1;if(37===(i=e.charCodeAt(o++))){if(i=e.charAt(o++),!(a=Ot[i in g?e.charAt(o++):i])||(n=a(t,r,n))<0)return-1}else if(i!=r.charCodeAt(n++))return-1}return n}return Pt.x=Dt(r,Pt),Pt.X=Dt(s,Pt),Pt.c=Dt(e,Pt),zt.x=Dt(r,zt),zt.X=Dt(s,zt),zt.c=Dt(e,zt),{format:function(t){var e=Dt(t+=\"\",Pt);return e.toString=function(){return t},e},parse:function(t){var e=Rt(t+=\"\",!1);return e.toString=function(){return t},e},utcFormat:function(t){var e=Dt(t+=\"\",zt);return e.toString=function(){return t},e},utcParse:function(t){var e=Rt(t+=\"\",!0);return e.toString=function(){return t},e}}}var p,d,m,g={\"-\":\"\",_:\" \",0:\"0\"},y=/^\\s*\\d+/,v=/^%/,x=/[\\\\^$*+?|[\\]().{}]/g;function _(t,e,r){var n=t<0?\"-\":\"\",i=(n?-t:t)+\"\",a=i.length;return n+(a68?1900:2e3),r+n[0].length):-1}function I(t,e,r){var n=/^(Z)|([+-]\\d\\d)(?::?(\\d\\d))?/.exec(e.slice(r,r+6));return n?(t.Z=n[1]?0:-(n[2]+(n[3]||\"00\")),r+n[0].length):-1}function P(t,e,r){var n=y.exec(e.slice(r,r+1));return n?(t.q=3*n[0]-3,r+n[0].length):-1}function z(t,e,r){var n=y.exec(e.slice(r,r+2));return n?(t.m=n[0]-1,r+n[0].length):-1}function O(t,e,r){var n=y.exec(e.slice(r,r+2));return n?(t.d=+n[0],r+n[0].length):-1}function D(t,e,r){var n=y.exec(e.slice(r,r+3));return n?(t.m=0,t.d=+n[0],r+n[0].length):-1}function R(t,e,r){var n=y.exec(e.slice(r,r+2));return n?(t.H=+n[0],r+n[0].length):-1}function F(t,e,r){var n=y.exec(e.slice(r,r+2));return n?(t.M=+n[0],r+n[0].length):-1}function B(t,e,r){var n=y.exec(e.slice(r,r+2));return n?(t.S=+n[0],r+n[0].length):-1}function N(t,e,r){var n=y.exec(e.slice(r,r+3));return n?(t.L=+n[0],r+n[0].length):-1}function j(t,e,r){var n=y.exec(e.slice(r,r+6));return n?(t.L=Math.floor(n[0]/1e3),r+n[0].length):-1}function U(t,e,r){var n=v.exec(e.slice(r,r+1));return n?r+n[0].length:-1}function V(t,e,r){var n=y.exec(e.slice(r));return n?(t.Q=+n[0],r+n[0].length):-1}function q(t,e,r){var n=y.exec(e.slice(r));return n?(t.s=+n[0],r+n[0].length):-1}function H(t,e){return _(t.getDate(),e,2)}function G(t,e){return _(t.getHours(),e,2)}function Z(t,e){return _(t.getHours()%12||12,e,2)}function W(t,e){return _(1+o.A.count((0,s.A)(t),t),e,3)}function Y(t,e){return _(t.getMilliseconds(),e,3)}function X(t,e){return Y(t,e)+\"000\"}function $(t,e){return _(t.getMonth()+1,e,2)}function J(t,e){return _(t.getMinutes(),e,2)}function K(t,e){return _(t.getSeconds(),e,2)}function Q(t){var e=t.getDay();return 0===e?7:e}function tt(t,e){return _(a.fz.count((0,s.A)(t)-1,t),e,2)}function et(t,e){var r=t.getDay();return t=r>=4||0===r?(0,a.dt)(t):a.dt.ceil(t),_(a.dt.count((0,s.A)(t),t)+(4===(0,s.A)(t).getDay()),e,2)}function rt(t){return t.getDay()}function nt(t,e){return _(a.By.count((0,s.A)(t)-1,t),e,2)}function it(t,e){return _(t.getFullYear()%100,e,2)}function at(t,e){return _(t.getFullYear()%1e4,e,4)}function ot(t){var e=t.getTimezoneOffset();return(e>0?\"-\":(e*=-1,\"+\"))+_(e/60|0,\"0\",2)+_(e%60,\"0\",2)}function st(t,e){return _(t.getUTCDate(),e,2)}function lt(t,e){return _(t.getUTCHours(),e,2)}function ct(t,e){return _(t.getUTCHours()%12||12,e,2)}function ut(t,e){return _(1+i.A.count((0,l.A)(t),t),e,3)}function ht(t,e){return _(t.getUTCMilliseconds(),e,3)}function ft(t,e){return ht(t,e)+\"000\"}function pt(t,e){return _(t.getUTCMonth()+1,e,2)}function dt(t,e){return _(t.getUTCMinutes(),e,2)}function mt(t,e){return _(t.getUTCSeconds(),e,2)}function gt(t){var e=t.getUTCDay();return 0===e?7:e}function yt(t,e){return _(n.Hl.count((0,l.A)(t)-1,t),e,2)}function vt(t,e){var r=t.getUTCDay();return t=r>=4||0===r?(0,n.pT)(t):n.pT.ceil(t),_(n.pT.count((0,l.A)(t),t)+(4===(0,l.A)(t).getUTCDay()),e,2)}function xt(t){return t.getUTCDay()}function _t(t,e){return _(n.rt.count((0,l.A)(t)-1,t),e,2)}function bt(t,e){return _(t.getUTCFullYear()%100,e,2)}function wt(t,e){return _(t.getUTCFullYear()%1e4,e,4)}function Tt(){return\"+0000\"}function kt(){return\"%\"}function At(t){return+t}function Mt(t){return Math.floor(+t/1e3)}p=f({dateTime:\"%x, %X\",date:\"%-m/%-d/%Y\",time:\"%-I:%M:%S %p\",periods:[\"AM\",\"PM\"],days:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],shortDays:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],months:[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],shortMonths:[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"]}),d=p.format,p.parse,m=p.utcFormat,p.utcParse},47265:function(t,e,r){\"use strict\";r.d(e,{_:function(){return o}});var n=r(53398),i=r(66291),a=(0,n.A)((function(t){t.setHours(0,0,0,0)}),(function(t,e){t.setDate(t.getDate()+e)}),(function(t,e){return(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*i.rR)/i.Nm}),(function(t){return t.getDate()-1}));e.A=a;var o=a.range},66291:function(t,e,r){\"use strict\";r.d(e,{Fq:function(){return s},JJ:function(){return a},Nm:function(){return o},Tt:function(){return n},rR:function(){return i}});var n=1e3,i=6e4,a=36e5,o=864e5,s=6048e5},50936:function(t,e,r){\"use strict\";r.r(e),r.d(e,{timeDay:function(){return y.A},timeDays:function(){return y._},timeFriday:function(){return v.Sh},timeFridays:function(){return v.tz},timeHour:function(){return m},timeHours:function(){return g},timeInterval:function(){return n.A},timeMillisecond:function(){return a},timeMilliseconds:function(){return o},timeMinute:function(){return f},timeMinutes:function(){return p},timeMonday:function(){return v.By},timeMondays:function(){return v.KP},timeMonth:function(){return _},timeMonths:function(){return b},timeSaturday:function(){return v.kS},timeSaturdays:function(){return v.t$},timeSecond:function(){return c},timeSeconds:function(){return u},timeSunday:function(){return v.fz},timeSundays:function(){return v.se},timeThursday:function(){return v.dt},timeThursdays:function(){return v.Q$},timeTuesday:function(){return v.eQ},timeTuesdays:function(){return v.yW},timeWednesday:function(){return v.l3},timeWednesdays:function(){return v.gf},timeWeek:function(){return v.fz},timeWeeks:function(){return v.se},timeYear:function(){return w.A},timeYears:function(){return w.V},utcDay:function(){return C.A},utcDays:function(){return C.o},utcFriday:function(){return L.a1},utcFridays:function(){return L.Zn},utcHour:function(){return S},utcHours:function(){return E},utcMillisecond:function(){return a},utcMilliseconds:function(){return o},utcMinute:function(){return k},utcMinutes:function(){return A},utcMonday:function(){return L.rt},utcMondays:function(){return L.ON},utcMonth:function(){return P},utcMonths:function(){return z},utcSaturday:function(){return L.c8},utcSaturdays:function(){return L.Xo},utcSecond:function(){return c},utcSeconds:function(){return u},utcSunday:function(){return L.Hl},utcSundays:function(){return L.aZ},utcThursday:function(){return L.pT},utcThursdays:function(){return L.wr},utcTuesday:function(){return L.sr},utcTuesdays:function(){return L.jN},utcWednesday:function(){return L.z2},utcWednesdays:function(){return L.G6},utcWeek:function(){return L.Hl},utcWeeks:function(){return L.aZ},utcYear:function(){return O.A},utcYears:function(){return O.j}});var n=r(53398),i=(0,n.A)((function(){}),(function(t,e){t.setTime(+t+e)}),(function(t,e){return e-t}));i.every=function(t){return t=Math.floor(t),isFinite(t)&&t>0?t>1?(0,n.A)((function(e){e.setTime(Math.floor(e/t)*t)}),(function(e,r){e.setTime(+e+r*t)}),(function(e,r){return(r-e)/t})):i:null};var a=i,o=i.range,s=r(66291),l=(0,n.A)((function(t){t.setTime(t-t.getMilliseconds())}),(function(t,e){t.setTime(+t+e*s.Tt)}),(function(t,e){return(e-t)/s.Tt}),(function(t){return t.getUTCSeconds()})),c=l,u=l.range,h=(0,n.A)((function(t){t.setTime(t-t.getMilliseconds()-t.getSeconds()*s.Tt)}),(function(t,e){t.setTime(+t+e*s.rR)}),(function(t,e){return(e-t)/s.rR}),(function(t){return t.getMinutes()})),f=h,p=h.range,d=(0,n.A)((function(t){t.setTime(t-t.getMilliseconds()-t.getSeconds()*s.Tt-t.getMinutes()*s.rR)}),(function(t,e){t.setTime(+t+e*s.JJ)}),(function(t,e){return(e-t)/s.JJ}),(function(t){return t.getHours()})),m=d,g=d.range,y=r(47265),v=r(55735),x=(0,n.A)((function(t){t.setDate(1),t.setHours(0,0,0,0)}),(function(t,e){t.setMonth(t.getMonth()+e)}),(function(t,e){return e.getMonth()-t.getMonth()+12*(e.getFullYear()-t.getFullYear())}),(function(t){return t.getMonth()})),_=x,b=x.range,w=r(9830),T=(0,n.A)((function(t){t.setUTCSeconds(0,0)}),(function(t,e){t.setTime(+t+e*s.rR)}),(function(t,e){return(e-t)/s.rR}),(function(t){return t.getUTCMinutes()})),k=T,A=T.range,M=(0,n.A)((function(t){t.setUTCMinutes(0,0,0)}),(function(t,e){t.setTime(+t+e*s.JJ)}),(function(t,e){return(e-t)/s.JJ}),(function(t){return t.getUTCHours()})),S=M,E=M.range,C=r(72543),L=r(1681),I=(0,n.A)((function(t){t.setUTCDate(1),t.setUTCHours(0,0,0,0)}),(function(t,e){t.setUTCMonth(t.getUTCMonth()+e)}),(function(t,e){return e.getUTCMonth()-t.getUTCMonth()+12*(e.getUTCFullYear()-t.getUTCFullYear())}),(function(t){return t.getUTCMonth()})),P=I,z=I.range,O=r(59764)},53398:function(t,e,r){\"use strict\";r.d(e,{A:function(){return a}});var n=new Date,i=new Date;function a(t,e,r,o){function s(e){return t(e=0===arguments.length?new Date:new Date(+e)),e}return s.floor=function(e){return t(e=new Date(+e)),e},s.ceil=function(r){return t(r=new Date(r-1)),e(r,1),t(r),r},s.round=function(t){var e=s(t),r=s.ceil(t);return t-e0))return o;do{o.push(a=new Date(+r)),e(r,i),t(r)}while(a=e)for(;t(e),!r(e);)e.setTime(e-1)}),(function(t,n){if(t>=t)if(n<0)for(;++n<=0;)for(;e(t,-1),!r(t););else for(;--n>=0;)for(;e(t,1),!r(t););}))},r&&(s.count=function(e,a){return n.setTime(+e),i.setTime(+a),t(n),t(i),Math.floor(r(n,i))},s.every=function(t){return t=Math.floor(t),isFinite(t)&&t>0?t>1?s.filter(o?function(e){return o(e)%t==0}:function(e){return s.count(0,e)%t==0}):s:null}),s}},72543:function(t,e,r){\"use strict\";r.d(e,{o:function(){return o}});var n=r(53398),i=r(66291),a=(0,n.A)((function(t){t.setUTCHours(0,0,0,0)}),(function(t,e){t.setUTCDate(t.getUTCDate()+e)}),(function(t,e){return(e-t)/i.Nm}),(function(t){return t.getUTCDate()-1}));e.A=a;var o=a.range},1681:function(t,e,r){\"use strict\";r.d(e,{G6:function(){return g},Hl:function(){return o},ON:function(){return d},Xo:function(){return x},Zn:function(){return v},a1:function(){return h},aZ:function(){return p},c8:function(){return f},jN:function(){return m},pT:function(){return u},rt:function(){return s},sr:function(){return l},wr:function(){return y},z2:function(){return c}});var n=r(53398),i=r(66291);function a(t){return(0,n.A)((function(e){e.setUTCDate(e.getUTCDate()-(e.getUTCDay()+7-t)%7),e.setUTCHours(0,0,0,0)}),(function(t,e){t.setUTCDate(t.getUTCDate()+7*e)}),(function(t,e){return(e-t)/i.Fq}))}var o=a(0),s=a(1),l=a(2),c=a(3),u=a(4),h=a(5),f=a(6),p=o.range,d=s.range,m=l.range,g=c.range,y=u.range,v=h.range,x=f.range},59764:function(t,e,r){\"use strict\";r.d(e,{j:function(){return a}});var n=r(53398),i=(0,n.A)((function(t){t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)}),(function(t,e){t.setUTCFullYear(t.getUTCFullYear()+e)}),(function(t,e){return e.getUTCFullYear()-t.getUTCFullYear()}),(function(t){return t.getUTCFullYear()}));i.every=function(t){return isFinite(t=Math.floor(t))&&t>0?(0,n.A)((function(e){e.setUTCFullYear(Math.floor(e.getUTCFullYear()/t)*t),e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)}),(function(e,r){e.setUTCFullYear(e.getUTCFullYear()+r*t)})):null},e.A=i;var a=i.range},55735:function(t,e,r){\"use strict\";r.d(e,{By:function(){return s},KP:function(){return d},Q$:function(){return y},Sh:function(){return h},dt:function(){return u},eQ:function(){return l},fz:function(){return o},gf:function(){return g},kS:function(){return f},l3:function(){return c},se:function(){return p},t$:function(){return x},tz:function(){return v},yW:function(){return m}});var n=r(53398),i=r(66291);function a(t){return(0,n.A)((function(e){e.setDate(e.getDate()-(e.getDay()+7-t)%7),e.setHours(0,0,0,0)}),(function(t,e){t.setDate(t.getDate()+7*e)}),(function(t,e){return(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*i.rR)/i.Fq}))}var o=a(0),s=a(1),l=a(2),c=a(3),u=a(4),h=a(5),f=a(6),p=o.range,d=s.range,m=l.range,g=c.range,y=u.range,v=h.range,x=f.range},9830:function(t,e,r){\"use strict\";r.d(e,{V:function(){return a}});var n=r(53398),i=(0,n.A)((function(t){t.setMonth(0,1),t.setHours(0,0,0,0)}),(function(t,e){t.setFullYear(t.getFullYear()+e)}),(function(t,e){return e.getFullYear()-t.getFullYear()}),(function(t){return t.getFullYear()}));i.every=function(t){return isFinite(t=Math.floor(t))&&t>0?(0,n.A)((function(e){e.setFullYear(Math.floor(e.getFullYear()/t)*t),e.setMonth(0,1),e.setHours(0,0,0,0)}),(function(e,r){e.setFullYear(e.getFullYear()+r*t)})):null},e.A=i;var a=i.range},70973:function(t,e,r){\"use strict\";var n=r(40891),i=r(98800),a=r(48631),o=r(52991);t.exports=function(t,e,r){if(!t||\"object\"!=typeof t&&\"function\"!=typeof t)throw new a(\"`obj` must be an object or a function`\");if(\"string\"!=typeof e&&\"symbol\"!=typeof e)throw new a(\"`property` must be a string or a symbol`\");if(arguments.length>3&&\"boolean\"!=typeof arguments[3]&&null!==arguments[3])throw new a(\"`nonEnumerable`, if provided, must be a boolean or null\");if(arguments.length>4&&\"boolean\"!=typeof arguments[4]&&null!==arguments[4])throw new a(\"`nonWritable`, if provided, must be a boolean or null\");if(arguments.length>5&&\"boolean\"!=typeof arguments[5]&&null!==arguments[5])throw new a(\"`nonConfigurable`, if provided, must be a boolean or null\");if(arguments.length>6&&\"boolean\"!=typeof arguments[6])throw new a(\"`loose`, if provided, must be a boolean\");var s=arguments.length>3?arguments[3]:null,l=arguments.length>4?arguments[4]:null,c=arguments.length>5?arguments[5]:null,u=arguments.length>6&&arguments[6],h=!!o&&o(t,e);if(n)n(t,e,{configurable:null===c&&h?h.configurable:!c,enumerable:null===s&&h?h.enumerable:!s,value:r,writable:null===l&&h?h.writable:!l});else{if(!u&&(s||l||c))throw new i(\"This environment does not support defining a property as non-configurable, non-writable, or non-enumerable.\");t[e]=r}}},97936:function(t,e,r){\"use strict\";var n=r(99433),i=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol(\"foo\"),a=Object.prototype.toString,o=Array.prototype.concat,s=Object.defineProperty,l=r(74268)(),c=s&&l,u=function(t,e,r,n){if(e in t)if(!0===n){if(t[e]===r)return}else if(\"function\"!=typeof(i=n)||\"[object Function]\"!==a.call(i)||!n())return;var i;c?s(t,e,{configurable:!0,enumerable:!1,value:r,writable:!0}):t[e]=r},h=function(t,e){var r=arguments.length>2?arguments[2]:{},a=n(e);i&&(a=o.call(a,Object.getOwnPropertySymbols(e)));for(var s=0;ss*l){var p=(f-h)/s;o[u]=1e3*p}}return o}function i(t){for(var e=[],r=t[0];r<=t[1];r++)for(var n=String.fromCharCode(r),i=t[0];i0)return function(t,e){var r,n;for(r=new Array(t),n=0;n80*n){a=s=t[0],o=l=t[1];for(var x=n;xs&&(s=h),f>l&&(l=f);d=0!==(d=Math.max(s-a,l-o))?32767/d:0}return i(y,v,n,a,o,d,0),v}function r(t,e,r,n,i){var a,o;if(i===M(t,e,r,n)>0)for(a=e;a=e;a-=n)o=T(a,t[a],t[a+1],o);return o&&y(o,o.next)&&(k(o),o=o.next),o}function n(t,e){if(!t)return t;e||(e=t);var r,n=t;do{if(r=!1,n.steiner||!y(n,n.next)&&0!==g(n.prev,n,n.next))n=n.next;else{if(k(n),(n=e=n.prev)===n.next)break;r=!0}}while(r||n!==e);return e}function i(t,e,r,c,u,h,p){if(t){!p&&h&&function(t,e,r,n){var i=t;do{0===i.z&&(i.z=f(i.x,i.y,e,r,n)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next}while(i!==t);i.prevZ.nextZ=null,i.prevZ=null,function(t){var e,r,n,i,a,o,s,l,c=1;do{for(r=t,t=null,a=null,o=0;r;){for(o++,n=r,s=0,e=0;e0||l>0&&n;)0!==s&&(0===l||!n||r.z<=n.z)?(i=r,r=r.nextZ,s--):(i=n,n=n.nextZ,l--),a?a.nextZ=i:t=i,i.prevZ=a,a=i;r=n}a.nextZ=null,c*=2}while(o>1)}(i)}(t,c,u,h);for(var d,m,g=t;t.prev!==t.next;)if(d=t.prev,m=t.next,h?o(t,c,u,h):a(t))e.push(d.i/r|0),e.push(t.i/r|0),e.push(m.i/r|0),k(t),t=m.next,g=m.next;else if((t=m)===g){p?1===p?i(t=s(n(t),e,r),e,r,c,u,h,2):2===p&&l(t,e,r,c,u,h):i(n(t),e,r,c,u,h,1);break}}}function a(t){var e=t.prev,r=t,n=t.next;if(g(e,r,n)>=0)return!1;for(var i=e.x,a=r.x,o=n.x,s=e.y,l=r.y,c=n.y,u=ia?i>o?i:o:a>o?a:o,p=s>l?s>c?s:c:l>c?l:c,m=n.next;m!==e;){if(m.x>=u&&m.x<=f&&m.y>=h&&m.y<=p&&d(i,s,a,l,o,c,m.x,m.y)&&g(m.prev,m,m.next)>=0)return!1;m=m.next}return!0}function o(t,e,r,n){var i=t.prev,a=t,o=t.next;if(g(i,a,o)>=0)return!1;for(var s=i.x,l=a.x,c=o.x,u=i.y,h=a.y,p=o.y,m=sl?s>c?s:c:l>c?l:c,x=u>h?u>p?u:p:h>p?h:p,_=f(m,y,e,r,n),b=f(v,x,e,r,n),w=t.prevZ,T=t.nextZ;w&&w.z>=_&&T&&T.z<=b;){if(w.x>=m&&w.x<=v&&w.y>=y&&w.y<=x&&w!==i&&w!==o&&d(s,u,l,h,c,p,w.x,w.y)&&g(w.prev,w,w.next)>=0)return!1;if(w=w.prevZ,T.x>=m&&T.x<=v&&T.y>=y&&T.y<=x&&T!==i&&T!==o&&d(s,u,l,h,c,p,T.x,T.y)&&g(T.prev,T,T.next)>=0)return!1;T=T.nextZ}for(;w&&w.z>=_;){if(w.x>=m&&w.x<=v&&w.y>=y&&w.y<=x&&w!==i&&w!==o&&d(s,u,l,h,c,p,w.x,w.y)&&g(w.prev,w,w.next)>=0)return!1;w=w.prevZ}for(;T&&T.z<=b;){if(T.x>=m&&T.x<=v&&T.y>=y&&T.y<=x&&T!==i&&T!==o&&d(s,u,l,h,c,p,T.x,T.y)&&g(T.prev,T,T.next)>=0)return!1;T=T.nextZ}return!0}function s(t,e,r){var i=t;do{var a=i.prev,o=i.next.next;!y(a,o)&&v(a,i,i.next,o)&&b(a,o)&&b(o,a)&&(e.push(a.i/r|0),e.push(i.i/r|0),e.push(o.i/r|0),k(i),k(i.next),i=t=o),i=i.next}while(i!==t);return n(i)}function l(t,e,r,a,o,s){var l=t;do{for(var c=l.next.next;c!==l.prev;){if(l.i!==c.i&&m(l,c)){var u=w(l,c);return l=n(l,l.next),u=n(u,u.next),i(l,e,r,a,o,s,0),void i(u,e,r,a,o,s,0)}c=c.next}l=l.next}while(l!==t)}function c(t,e){return t.x-e.x}function u(t,e){var r=function(t,e){var r,n=e,i=t.x,a=t.y,o=-1/0;do{if(a<=n.y&&a>=n.next.y&&n.next.y!==n.y){var s=n.x+(a-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(s<=i&&s>o&&(o=s,r=n.x=n.x&&n.x>=u&&i!==n.x&&d(ar.x||n.x===r.x&&h(r,n)))&&(r=n,p=l)),n=n.next}while(n!==c);return r}(t,e);if(!r)return e;var i=w(r,t);return n(i,i.next),n(r,r.next)}function h(t,e){return g(t.prev,t,e.prev)<0&&g(e.next,t,t.next)<0}function f(t,e,r,n,i){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=(t-r)*i|0)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=(e-n)*i|0)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function p(t){var e=t,r=t;do{(e.x=(t-o)*(a-s)&&(t-o)*(n-s)>=(r-o)*(e-s)&&(r-o)*(a-s)>=(i-o)*(n-s)}function m(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){var r=t;do{if(r.i!==t.i&&r.next.i!==t.i&&r.i!==e.i&&r.next.i!==e.i&&v(r,r.next,t,e))return!0;r=r.next}while(r!==t);return!1}(t,e)&&(b(t,e)&&b(e,t)&&function(t,e){var r=t,n=!1,i=(t.x+e.x)/2,a=(t.y+e.y)/2;do{r.y>a!=r.next.y>a&&r.next.y!==r.y&&i<(r.next.x-r.x)*(a-r.y)/(r.next.y-r.y)+r.x&&(n=!n),r=r.next}while(r!==t);return n}(t,e)&&(g(t.prev,t,e.prev)||g(t,e.prev,e))||y(t,e)&&g(t.prev,t,t.next)>0&&g(e.prev,e,e.next)>0)}function g(t,e,r){return(e.y-t.y)*(r.x-e.x)-(e.x-t.x)*(r.y-e.y)}function y(t,e){return t.x===e.x&&t.y===e.y}function v(t,e,r,n){var i=_(g(t,e,r)),a=_(g(t,e,n)),o=_(g(r,n,t)),s=_(g(r,n,e));return i!==a&&o!==s||!(0!==i||!x(t,r,e))||!(0!==a||!x(t,n,e))||!(0!==o||!x(r,t,n))||!(0!==s||!x(r,e,n))}function x(t,e,r){return e.x<=Math.max(t.x,r.x)&&e.x>=Math.min(t.x,r.x)&&e.y<=Math.max(t.y,r.y)&&e.y>=Math.min(t.y,r.y)}function _(t){return t>0?1:t<0?-1:0}function b(t,e){return g(t.prev,t,t.next)<0?g(t,e,t.next)>=0&&g(t,t.prev,e)>=0:g(t,e,t.prev)<0||g(t,t.next,e)<0}function w(t,e){var r=new A(t.i,t.x,t.y),n=new A(e.i,e.x,e.y),i=t.next,a=e.prev;return t.next=e,e.prev=t,r.next=i,i.prev=r,n.next=r,r.prev=n,a.next=n,n.prev=a,n}function T(t,e,r,n){var i=new A(t,e,r);return n?(i.next=n.next,i.prev=n,n.next.prev=i,n.next=i):(i.prev=i,i.next=i),i}function k(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function A(t,e,r){this.i=t,this.x=e,this.y=r,this.prev=null,this.next=null,this.z=0,this.prevZ=null,this.nextZ=null,this.steiner=!1}function M(t,e,r,n){for(var i=0,a=e,o=r-n;a0&&(n+=t[i-1].length,r.holes.push(n))}return r}},96143:function(t,e,r){var n=r(26381);t.exports=function(t,e){var r,i=[],a=[],o=[],s={},l=[];function c(t){o[t]=!1,s.hasOwnProperty(t)&&Object.keys(s[t]).forEach((function(e){delete s[t][e],o[e]&&c(e)}))}function u(t){var e,n,i=!1;for(a.push(t),o[t]=!0,e=0;e=e}))}(e);for(var r,i=n(t).components.filter((function(t){return t.length>1})),a=1/0,o=0;o=55296&&v<=56319&&(w+=t[++r]),w=T?f.call(T,k,w,m):w,e?(p.value=w,d(g,m,p)):g[m]=w,++m;y=m}if(void 0===y)for(y=o(t.length),e&&(g=new e(y)),r=0;r0?1:-1}},10226:function(t,e,r){\"use strict\";var n=r(53579),i=Math.abs,a=Math.floor;t.exports=function(t){return isNaN(t)?0:0!==(t=Number(t))&&isFinite(t)?n(t)*a(i(t)):t}},54653:function(t,e,r){\"use strict\";var n=r(10226),i=Math.max;t.exports=function(t){return i(0,n(t))}},39395:function(t,e,r){\"use strict\";var n=r(52359),i=r(69746),a=Function.prototype.bind,o=Function.prototype.call,s=Object.keys,l=Object.prototype.propertyIsEnumerable;t.exports=function(t,e){return function(r,c){var u,h=arguments[2],f=arguments[3];return r=Object(i(r)),n(c),u=s(r),f&&u.sort(\"function\"==typeof f?a.call(f,r):void 0),\"function\"!=typeof t&&(t=u[t]),o.call(t,u,(function(t,n){return l.call(r,t)?o.call(c,h,r[t],t,r,n):e}))}}},1920:function(t,e,r){\"use strict\";t.exports=r(41271)()?Object.assign:r(26399)},41271:function(t){\"use strict\";t.exports=function(){var t,e=Object.assign;return\"function\"==typeof e&&(e(t={foo:\"raz\"},{bar:\"dwa\"},{trzy:\"trzy\"}),t.foo+t.bar+t.trzy===\"razdwatrzy\")}},26399:function(t,e,r){\"use strict\";var n=r(36353),i=r(69746),a=Math.max;t.exports=function(t,e){var r,o,s,l=a(arguments.length,2);for(t=Object(i(t)),s=function(n){try{t[n]=e[n]}catch(t){r||(r=t)}},o=1;o-1}},48488:function(t){\"use strict\";var e=Object.prototype.toString,r=e.call(\"\");t.exports=function(t){return\"string\"==typeof t||t&&\"object\"==typeof t&&(t instanceof String||e.call(t)===r)||!1}},43497:function(t){\"use strict\";var e=Object.create(null),r=Math.random;t.exports=function(){var t;do{t=r().toString(36).slice(2)}while(e[t]);return t}},71343:function(t,e,r){\"use strict\";var n,i=r(22834),a=r(2338),o=r(91819),s=r(63008),l=r(85490),c=Object.defineProperty;n=t.exports=function(t,e){if(!(this instanceof n))throw new TypeError(\"Constructor requires 'new'\");l.call(this,t),e=e?a.call(e,\"key+value\")?\"key+value\":a.call(e,\"key\")?\"key\":\"value\":\"value\",c(this,\"__kind__\",o(\"\",e))},i&&i(n,l),delete n.prototype.constructor,n.prototype=Object.create(l.prototype,{_resolve:o((function(t){return\"value\"===this.__kind__?this.__list__[t]:\"key+value\"===this.__kind__?[t,this.__list__[t]]:t}))}),c(n.prototype,s.toStringTag,o(\"c\",\"Array Iterator\"))},58755:function(t,e,r){\"use strict\";var n=r(82262),i=r(52359),a=r(48488),o=r(34494),s=Array.isArray,l=Function.prototype.call,c=Array.prototype.some;t.exports=function(t,e){var r,u,h,f,p,d,m,g,y=arguments[2];if(s(t)||n(t)?r=\"array\":a(t)?r=\"string\":t=o(t),i(e),h=function(){f=!0},\"array\"!==r)if(\"string\"!==r)for(u=t.next();!u.done;){if(l.call(e,y,u.value,h),f)return;u=t.next()}else for(d=t.length,p=0;p=55296&&g<=56319&&(m+=t[++p]),l.call(e,y,m,h),!f);++p);else c.call(t,(function(t){return l.call(e,y,t,h),f}))}},34494:function(t,e,r){\"use strict\";var n=r(82262),i=r(48488),a=r(71343),o=r(23417),s=r(82831),l=r(63008).iterator;t.exports=function(t){return\"function\"==typeof s(t)[l]?t[l]():n(t)?new a(t):i(t)?new o(t):new a(t)}},85490:function(t,e,r){\"use strict\";var n,i=r(91445),a=r(1920),o=r(52359),s=r(69746),l=r(91819),c=r(84510),u=r(63008),h=Object.defineProperty,f=Object.defineProperties;t.exports=n=function(t,e){if(!(this instanceof n))throw new TypeError(\"Constructor requires 'new'\");f(this,{__list__:l(\"w\",s(t)),__context__:l(\"w\",e),__nextIndex__:l(\"w\",0)}),e&&(o(e.on),e.on(\"_add\",this._onAdd),e.on(\"_delete\",this._onDelete),e.on(\"_clear\",this._onClear))},delete n.prototype.constructor,f(n.prototype,a({_next:l((function(){var t;if(this.__list__)return this.__redo__&&void 0!==(t=this.__redo__.shift())?t:this.__nextIndex__=this.__nextIndex__||(++this.__nextIndex__,this.__redo__?(this.__redo__.forEach((function(e,r){e>=t&&(this.__redo__[r]=++e)}),this),this.__redo__.push(t)):h(this,\"__redo__\",l(\"c\",[t])))})),_onDelete:l((function(t){var e;t>=this.__nextIndex__||(--this.__nextIndex__,this.__redo__&&(-1!==(e=this.__redo__.indexOf(t))&&this.__redo__.splice(e,1),this.__redo__.forEach((function(e,r){e>t&&(this.__redo__[r]=--e)}),this)))})),_onClear:l((function(){this.__redo__&&i.call(this.__redo__),this.__nextIndex__=0}))}))),h(n.prototype,u.iterator,l((function(){return this})))},50567:function(t,e,r){\"use strict\";var n=r(82262),i=r(1974),a=r(48488),o=r(63008).iterator,s=Array.isArray;t.exports=function(t){return!(!i(t)||!s(t)&&!a(t)&&!n(t)&&\"function\"!=typeof t[o])}},23417:function(t,e,r){\"use strict\";var n,i=r(22834),a=r(91819),o=r(63008),s=r(85490),l=Object.defineProperty;n=t.exports=function(t){if(!(this instanceof n))throw new TypeError(\"Constructor requires 'new'\");t=String(t),s.call(this,t),l(this,\"__length__\",a(\"\",t.length))},i&&i(n,s),delete n.prototype.constructor,n.prototype=Object.create(s.prototype,{_next:a((function(){if(this.__list__)return this.__nextIndex__=55296&&e<=56319?r+this.__list__[this.__nextIndex__++]:r}))}),l(n.prototype,o.toStringTag,a(\"c\",\"String Iterator\"))},82831:function(t,e,r){\"use strict\";var n=r(50567);t.exports=function(t){if(!n(t))throw new TypeError(t+\" is not iterable\");return t}},63008:function(t,e,r){\"use strict\";t.exports=r(25143)()?r(64725).Symbol:r(81905)},25143:function(t,e,r){\"use strict\";var n=r(64725),i={object:!0,symbol:!0};t.exports=function(){var t,e=n.Symbol;if(\"function\"!=typeof e)return!1;t=e(\"test symbol\");try{String(t)}catch(t){return!1}return!!i[typeof e.iterator]&&!!i[typeof e.toPrimitive]&&!!i[typeof e.toStringTag]}},41707:function(t){\"use strict\";t.exports=function(t){return!!t&&(\"symbol\"==typeof t||!!t.constructor&&\"Symbol\"===t.constructor.name&&\"Symbol\"===t[t.constructor.toStringTag])}},74009:function(t,e,r){\"use strict\";var n=r(91819),i=Object.create,a=Object.defineProperty,o=Object.prototype,s=i(null);t.exports=function(t){for(var e,r,i=0;s[t+(i||\"\")];)++i;return s[t+=i||\"\"]=!0,a(o,e=\"@@\"+t,n.gs(null,(function(t){r||(r=!0,a(this,e,n(t)),r=!1)}))),e}},40313:function(t,e,r){\"use strict\";var n=r(91819),i=r(64725).Symbol;t.exports=function(t){return Object.defineProperties(t,{hasInstance:n(\"\",i&&i.hasInstance||t(\"hasInstance\")),isConcatSpreadable:n(\"\",i&&i.isConcatSpreadable||t(\"isConcatSpreadable\")),iterator:n(\"\",i&&i.iterator||t(\"iterator\")),match:n(\"\",i&&i.match||t(\"match\")),replace:n(\"\",i&&i.replace||t(\"replace\")),search:n(\"\",i&&i.search||t(\"search\")),species:n(\"\",i&&i.species||t(\"species\")),split:n(\"\",i&&i.split||t(\"split\")),toPrimitive:n(\"\",i&&i.toPrimitive||t(\"toPrimitive\")),toStringTag:n(\"\",i&&i.toStringTag||t(\"toStringTag\")),unscopables:n(\"\",i&&i.unscopables||t(\"unscopables\"))})}},21290:function(t,e,r){\"use strict\";var n=r(91819),i=r(91765),a=Object.create(null);t.exports=function(t){return Object.defineProperties(t,{for:n((function(e){return a[e]?a[e]:a[e]=t(String(e))})),keyFor:n((function(t){var e;for(e in i(t),a)if(a[e]===t)return e}))})}},81905:function(t,e,r){\"use strict\";var n,i,a,o=r(91819),s=r(91765),l=r(64725).Symbol,c=r(74009),u=r(40313),h=r(21290),f=Object.create,p=Object.defineProperties,d=Object.defineProperty;if(\"function\"==typeof l)try{String(l()),a=!0}catch(t){}else l=null;i=function(t){if(this instanceof i)throw new TypeError(\"Symbol is not a constructor\");return n(t)},t.exports=n=function t(e){var r;if(this instanceof t)throw new TypeError(\"Symbol is not a constructor\");return a?l(e):(r=f(i.prototype),e=void 0===e?\"\":String(e),p(r,{__description__:o(\"\",e),__name__:o(\"\",c(e))}))},u(n),h(n),p(i.prototype,{constructor:o(n),toString:o(\"\",(function(){return this.__name__}))}),p(n.prototype,{toString:o((function(){return\"Symbol (\"+s(this).__description__+\")\"})),valueOf:o((function(){return s(this)}))}),d(n.prototype,n.toPrimitive,o(\"\",(function(){var t=s(this);return\"symbol\"==typeof t?t:t.toString()}))),d(n.prototype,n.toStringTag,o(\"c\",\"Symbol\")),d(i.prototype,n.toStringTag,o(\"c\",n.prototype[n.toStringTag])),d(i.prototype,n.toPrimitive,o(\"c\",n.prototype[n.toPrimitive]))},91765:function(t,e,r){\"use strict\";var n=r(41707);t.exports=function(t){if(!n(t))throw new TypeError(t+\" is not a symbol\");return t}},93103:function(t,e,r){\"use strict\";t.exports=r(22742)()?WeakMap:r(21780)},22742:function(t){\"use strict\";t.exports=function(){var t,e;if(\"function\"!=typeof WeakMap)return!1;try{t=new WeakMap([[e={},\"one\"],[{},\"two\"],[{},\"three\"]])}catch(t){return!1}return\"[object WeakMap]\"===String(t)&&\"function\"==typeof t.set&&t.set({},1)===t&&\"function\"==typeof t.delete&&\"function\"==typeof t.has&&\"one\"===t.get(e)}},81810:function(t){\"use strict\";t.exports=\"function\"==typeof WeakMap&&\"[object WeakMap]\"===Object.prototype.toString.call(new WeakMap)},21780:function(t,e,r){\"use strict\";var n,i=r(1974),a=r(22834),o=r(11004),s=r(69746),l=r(43497),c=r(91819),u=r(34494),h=r(58755),f=r(63008).toStringTag,p=r(81810),d=Array.isArray,m=Object.defineProperty,g=Object.prototype.hasOwnProperty,y=Object.getPrototypeOf;t.exports=n=function(){var t,e=arguments[0];if(!(this instanceof n))throw new TypeError(\"Constructor requires 'new'\");return t=p&&a&&WeakMap!==n?a(new WeakMap,y(this)):this,i(e)&&(d(e)||(e=u(e))),m(t,\"__weakMapData__\",c(\"c\",\"$weakMap$\"+l())),e?(h(e,(function(e){s(e),t.set(e[0],e[1])})),t):t},p&&(a&&a(n,WeakMap),n.prototype=Object.create(WeakMap.prototype,{constructor:c(n)})),Object.defineProperties(n.prototype,{delete:c((function(t){return!!g.call(o(t),this.__weakMapData__)&&(delete t[this.__weakMapData__],!0)})),get:c((function(t){if(g.call(o(t),this.__weakMapData__))return t[this.__weakMapData__]})),has:c((function(t){return g.call(o(t),this.__weakMapData__)})),set:c((function(t,e){return m(o(t),this.__weakMapData__,c(\"c\",e)),this})),toString:c((function(){return\"[object WeakMap]\"}))}),m(n.prototype,f,c(\"c\",\"WeakMap\"))},7683:function(t){\"use strict\";var e,r=\"object\"==typeof Reflect?Reflect:null,n=r&&\"function\"==typeof r.apply?r.apply:function(t,e,r){return Function.prototype.apply.call(t,e,r)};e=r&&\"function\"==typeof r.ownKeys?r.ownKeys:Object.getOwnPropertySymbols?function(t){return Object.getOwnPropertyNames(t).concat(Object.getOwnPropertySymbols(t))}:function(t){return Object.getOwnPropertyNames(t)};var i=Number.isNaN||function(t){return t!=t};function a(){a.init.call(this)}t.exports=a,t.exports.once=function(t,e){return new Promise((function(r,n){function i(r){t.removeListener(e,a),n(r)}function a(){\"function\"==typeof t.removeListener&&t.removeListener(\"error\",i),r([].slice.call(arguments))}m(t,e,a,{once:!0}),\"error\"!==e&&function(t,e,r){\"function\"==typeof t.on&&m(t,\"error\",e,{once:!0})}(t,i)}))},a.EventEmitter=a,a.prototype._events=void 0,a.prototype._eventsCount=0,a.prototype._maxListeners=void 0;var o=10;function s(t){if(\"function\"!=typeof t)throw new TypeError('The \"listener\" argument must be of type Function. Received type '+typeof t)}function l(t){return void 0===t._maxListeners?a.defaultMaxListeners:t._maxListeners}function c(t,e,r,n){var i,a,o,c;if(s(r),void 0===(a=t._events)?(a=t._events=Object.create(null),t._eventsCount=0):(void 0!==a.newListener&&(t.emit(\"newListener\",e,r.listener?r.listener:r),a=t._events),o=a[e]),void 0===o)o=a[e]=r,++t._eventsCount;else if(\"function\"==typeof o?o=a[e]=n?[r,o]:[o,r]:n?o.unshift(r):o.push(r),(i=l(t))>0&&o.length>i&&!o.warned){o.warned=!0;var u=new Error(\"Possible EventEmitter memory leak detected. \"+o.length+\" \"+String(e)+\" listeners added. Use emitter.setMaxListeners() to increase limit\");u.name=\"MaxListenersExceededWarning\",u.emitter=t,u.type=e,u.count=o.length,c=u,console&&console.warn&&console.warn(c)}return t}function u(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function h(t,e,r){var n={fired:!1,wrapFn:void 0,target:t,type:e,listener:r},i=u.bind(n);return i.listener=r,n.wrapFn=i,i}function f(t,e,r){var n=t._events;if(void 0===n)return[];var i=n[e];return void 0===i?[]:\"function\"==typeof i?r?[i.listener||i]:[i]:r?function(t){for(var e=new Array(t.length),r=0;r0&&(o=e[0]),o instanceof Error)throw o;var s=new Error(\"Unhandled error.\"+(o?\" (\"+o.message+\")\":\"\"));throw s.context=o,s}var l=a[t];if(void 0===l)return!1;if(\"function\"==typeof l)n(l,this,e);else{var c=l.length,u=d(l,c);for(r=0;r=0;a--)if(r[a]===e||r[a].listener===e){o=r[a].listener,i=a;break}if(i<0)return this;0===i?r.shift():function(t,e){for(;e+1=0;n--)this.removeListener(t,e[n]);return this},a.prototype.listeners=function(t){return f(this,t,!0)},a.prototype.rawListeners=function(t){return f(this,t,!1)},a.listenerCount=function(t,e){return\"function\"==typeof t.listenerCount?t.listenerCount(e):p.call(t,e)},a.prototype.listenerCount=p,a.prototype.eventNames=function(){return this._eventsCount>0?e(this._events):[]}},77083:function(t){var e=function(){if(\"object\"==typeof self&&self)return self;if(\"object\"==typeof window&&window)return window;throw new Error(\"Unable to resolve global `this`\")};t.exports=function(){if(this)return this;try{Object.defineProperty(Object.prototype,\"__global__\",{get:function(){return this},configurable:!0})}catch(t){return e()}try{return __global__||e()}finally{delete Object.prototype.__global__}}()},64725:function(t,e,r){\"use strict\";t.exports=r(17804)()?globalThis:r(77083)},17804:function(t){\"use strict\";t.exports=function(){return\"object\"==typeof globalThis&&!!globalThis&&globalThis.Array===Array}},10721:function(t,e,r){\"use strict\";var n=r(9914);t.exports=function(t){var e=typeof t;if(\"string\"===e){var r=t;if(0==(t=+t)&&n(r))return!1}else if(\"number\"!==e)return!1;return t-t<1}},83473:function(t,e,r){var n=r(10275);t.exports=function(t,e,r){if(!t)throw new TypeError(\"must specify data as first parameter\");if(r=0|+(r||0),Array.isArray(t)&&t[0]&&\"number\"==typeof t[0][0]){var i,a,o,s,l=t[0].length,c=t.length*l;e&&\"string\"!=typeof e||(e=new(n(e||\"float32\"))(c+r));var u=e.length-r;if(c!==u)throw new Error(\"source length \"+c+\" (\"+l+\"x\"+t.length+\") does not match destination length \"+u);for(i=0,o=r;ie[0]-o[0]/2&&(f=o[0]/2,p+=o[1]);return r}},12673:function(t){\"use strict\";function e(t,a){a||(a={}),(\"string\"==typeof t||Array.isArray(t))&&(a.family=t);var o=Array.isArray(a.family)?a.family.join(\", \"):a.family;if(!o)throw Error(\"`family` must be defined\");var s=a.size||a.fontSize||a.em||48,l=a.weight||a.fontWeight||\"\",c=(t=[a.style||a.fontStyle||\"\",l,s].join(\" \")+\"px \"+o,a.origin||\"top\");if(e.cache[o]&&s<=e.cache[o].em)return r(e.cache[o],c);var u=a.canvas||e.canvas,h=u.getContext(\"2d\"),f={upper:void 0!==a.upper?a.upper:\"H\",lower:void 0!==a.lower?a.lower:\"x\",descent:void 0!==a.descent?a.descent:\"p\",ascent:void 0!==a.ascent?a.ascent:\"h\",tittle:void 0!==a.tittle?a.tittle:\"i\",overshoot:void 0!==a.overshoot?a.overshoot:\"O\"},p=Math.ceil(1.5*s);u.height=p,u.width=.5*p,h.font=t;var d=\"H\",m={top:0};h.clearRect(0,0,p,p),h.textBaseline=\"top\",h.fillStyle=\"black\",h.fillText(d,0,0);var g=n(h.getImageData(0,0,p,p));h.clearRect(0,0,p,p),h.textBaseline=\"bottom\",h.fillText(d,0,p);var y=n(h.getImageData(0,0,p,p));m.lineHeight=m.bottom=p-y+g,h.clearRect(0,0,p,p),h.textBaseline=\"alphabetic\",h.fillText(d,0,p);var v=p-n(h.getImageData(0,0,p,p))-1+g;m.baseline=m.alphabetic=v,h.clearRect(0,0,p,p),h.textBaseline=\"middle\",h.fillText(d,0,.5*p);var x=n(h.getImageData(0,0,p,p));m.median=m.middle=p-x-1+g-.5*p,h.clearRect(0,0,p,p),h.textBaseline=\"hanging\",h.fillText(d,0,.5*p);var _=n(h.getImageData(0,0,p,p));m.hanging=p-_-1+g-.5*p,h.clearRect(0,0,p,p),h.textBaseline=\"ideographic\",h.fillText(d,0,p);var b=n(h.getImageData(0,0,p,p));if(m.ideographic=p-b-1+g,f.upper&&(h.clearRect(0,0,p,p),h.textBaseline=\"top\",h.fillText(f.upper,0,0),m.upper=n(h.getImageData(0,0,p,p)),m.capHeight=m.baseline-m.upper),f.lower&&(h.clearRect(0,0,p,p),h.textBaseline=\"top\",h.fillText(f.lower,0,0),m.lower=n(h.getImageData(0,0,p,p)),m.xHeight=m.baseline-m.lower),f.tittle&&(h.clearRect(0,0,p,p),h.textBaseline=\"top\",h.fillText(f.tittle,0,0),m.tittle=n(h.getImageData(0,0,p,p))),f.ascent&&(h.clearRect(0,0,p,p),h.textBaseline=\"top\",h.fillText(f.ascent,0,0),m.ascent=n(h.getImageData(0,0,p,p))),f.descent&&(h.clearRect(0,0,p,p),h.textBaseline=\"top\",h.fillText(f.descent,0,0),m.descent=i(h.getImageData(0,0,p,p))),f.overshoot){h.clearRect(0,0,p,p),h.textBaseline=\"top\",h.fillText(f.overshoot,0,0);var w=i(h.getImageData(0,0,p,p));m.overshoot=w-v}for(var T in m)m[T]/=s;return m.em=s,e.cache[o]=m,r(m,c)}function r(t,e){var r={};for(var n in\"string\"==typeof e&&(e=t[e]),t)\"em\"!==n&&(r[n]=t[n]-e);return r}function n(t){for(var e=t.height,r=t.data,n=3;n0;n-=4)if(0!==r[n])return Math.floor(.25*(n-3)/e)}t.exports=e,e.canvas=document.createElement(\"canvas\"),e.cache={}},61262:function(t,e,r){\"use strict\";var n=r(82756),i=Object.prototype.toString,a=Object.prototype.hasOwnProperty;t.exports=function(t,e,r){if(!n(e))throw new TypeError(\"iterator must be a function\");var o;arguments.length>=3&&(o=r),\"[object Array]\"===i.call(t)?function(t,e,r){for(var n=0,i=t.length;n1&&\"boolean\"!=typeof e)throw new c('\"allowMissing\" argument must be a boolean');if(null===I(/^%?[^%]*%?$/,t))throw new l(\"`%` may not be present anywhere but at the beginning and end of the intrinsic name\");var r=function(t){var e=L(t,0,1),r=L(t,-1);if(\"%\"===e&&\"%\"!==r)throw new l(\"invalid intrinsic syntax, expected closing `%`\");if(\"%\"===r&&\"%\"!==e)throw new l(\"invalid intrinsic syntax, expected opening `%`\");var n=[];return C(t,P,(function(t,e,r,i){n[n.length]=r?C(i,z,\"$1\"):e||t})),n}(t),n=r.length>0?r[0]:\"\",i=O(\"%\"+n+\"%\",e),a=i.name,o=i.value,s=!1,u=i.alias;u&&(n=u[0],E(r,S([0,1],u)));for(var h=1,f=!0;h=r.length){var y=p(o,d);o=(f=!!y)&&\"get\"in y&&!(\"originalValue\"in y.get)?y.get:o[d]}else f=M(o,d),o=o[d];f&&!s&&(b[a]=o)}}return o}},84840:function(t){t.exports=function(t,e){var r=e[0],n=e[1],i=e[2],a=e[3],o=e[4],s=e[5],l=e[6],c=e[7],u=e[8],h=e[9],f=e[10],p=e[11],d=e[12],m=e[13],g=e[14],y=e[15];return t[0]=s*(f*y-p*g)-h*(l*y-c*g)+m*(l*p-c*f),t[1]=-(n*(f*y-p*g)-h*(i*y-a*g)+m*(i*p-a*f)),t[2]=n*(l*y-c*g)-s*(i*y-a*g)+m*(i*c-a*l),t[3]=-(n*(l*p-c*f)-s*(i*p-a*f)+h*(i*c-a*l)),t[4]=-(o*(f*y-p*g)-u*(l*y-c*g)+d*(l*p-c*f)),t[5]=r*(f*y-p*g)-u*(i*y-a*g)+d*(i*p-a*f),t[6]=-(r*(l*y-c*g)-o*(i*y-a*g)+d*(i*c-a*l)),t[7]=r*(l*p-c*f)-o*(i*p-a*f)+u*(i*c-a*l),t[8]=o*(h*y-p*m)-u*(s*y-c*m)+d*(s*p-c*h),t[9]=-(r*(h*y-p*m)-u*(n*y-a*m)+d*(n*p-a*h)),t[10]=r*(s*y-c*m)-o*(n*y-a*m)+d*(n*c-a*s),t[11]=-(r*(s*p-c*h)-o*(n*p-a*h)+u*(n*c-a*s)),t[12]=-(o*(h*g-f*m)-u*(s*g-l*m)+d*(s*f-l*h)),t[13]=r*(h*g-f*m)-u*(n*g-i*m)+d*(n*f-i*h),t[14]=-(r*(s*g-l*m)-o*(n*g-i*m)+d*(n*l-i*s)),t[15]=r*(s*f-l*h)-o*(n*f-i*h)+u*(n*l-i*s),t}},99698:function(t){t.exports=function(t){var e=new Float32Array(16);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e[9]=t[9],e[10]=t[10],e[11]=t[11],e[12]=t[12],e[13]=t[13],e[14]=t[14],e[15]=t[15],e}},57938:function(t){t.exports=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t[6]=e[6],t[7]=e[7],t[8]=e[8],t[9]=e[9],t[10]=e[10],t[11]=e[11],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15],t}},87519:function(t){t.exports=function(){var t=new Float32Array(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}},6900:function(t){t.exports=function(t){var e=t[0],r=t[1],n=t[2],i=t[3],a=t[4],o=t[5],s=t[6],l=t[7],c=t[8],u=t[9],h=t[10],f=t[11],p=t[12],d=t[13],m=t[14],g=t[15];return(e*o-r*a)*(h*g-f*m)-(e*s-n*a)*(u*g-f*d)+(e*l-i*a)*(u*m-h*d)+(r*s-n*o)*(c*g-f*p)-(r*l-i*o)*(c*m-h*p)+(n*l-i*s)*(c*d-u*p)}},36472:function(t){t.exports=function(t,e){var r=e[0],n=e[1],i=e[2],a=e[3],o=r+r,s=n+n,l=i+i,c=r*o,u=n*o,h=n*s,f=i*o,p=i*s,d=i*l,m=a*o,g=a*s,y=a*l;return t[0]=1-h-d,t[1]=u+y,t[2]=f-g,t[3]=0,t[4]=u-y,t[5]=1-c-d,t[6]=p+m,t[7]=0,t[8]=f+g,t[9]=p-m,t[10]=1-c-h,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}},43061:function(t){t.exports=function(t,e,r){var n,i,a,o=r[0],s=r[1],l=r[2],c=Math.sqrt(o*o+s*s+l*l);return Math.abs(c)<1e-6?null:(o*=c=1/c,s*=c,l*=c,n=Math.sin(e),a=1-(i=Math.cos(e)),t[0]=o*o*a+i,t[1]=s*o*a+l*n,t[2]=l*o*a-s*n,t[3]=0,t[4]=o*s*a-l*n,t[5]=s*s*a+i,t[6]=l*s*a+o*n,t[7]=0,t[8]=o*l*a+s*n,t[9]=s*l*a-o*n,t[10]=l*l*a+i,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t)}},33606:function(t){t.exports=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=e[3],s=n+n,l=i+i,c=a+a,u=n*s,h=n*l,f=n*c,p=i*l,d=i*c,m=a*c,g=o*s,y=o*l,v=o*c;return t[0]=1-(p+m),t[1]=h+v,t[2]=f-y,t[3]=0,t[4]=h-v,t[5]=1-(u+m),t[6]=d+g,t[7]=0,t[8]=f+y,t[9]=d-g,t[10]=1-(u+p),t[11]=0,t[12]=r[0],t[13]=r[1],t[14]=r[2],t[15]=1,t}},98698:function(t){t.exports=function(t,e){return t[0]=e[0],t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=e[1],t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=e[2],t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}},6924:function(t){t.exports=function(t,e){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=e[0],t[13]=e[1],t[14]=e[2],t[15]=1,t}},81181:function(t){t.exports=function(t,e){var r=Math.sin(e),n=Math.cos(e);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=n,t[6]=r,t[7]=0,t[8]=0,t[9]=-r,t[10]=n,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}},95258:function(t){t.exports=function(t,e){var r=Math.sin(e),n=Math.cos(e);return t[0]=n,t[1]=0,t[2]=-r,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=r,t[9]=0,t[10]=n,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}},94815:function(t){t.exports=function(t,e){var r=Math.sin(e),n=Math.cos(e);return t[0]=n,t[1]=r,t[2]=0,t[3]=0,t[4]=-r,t[5]=n,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}},87301:function(t){t.exports=function(t,e,r,n,i,a,o){var s=1/(r-e),l=1/(i-n),c=1/(a-o);return t[0]=2*a*s,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=2*a*l,t[6]=0,t[7]=0,t[8]=(r+e)*s,t[9]=(i+n)*l,t[10]=(o+a)*c,t[11]=-1,t[12]=0,t[13]=0,t[14]=o*a*2*c,t[15]=0,t}},87193:function(t){t.exports=function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}},11191:function(t,e,r){t.exports={create:r(87519),clone:r(99698),copy:r(57938),identity:r(87193),transpose:r(10256),invert:r(96559),adjoint:r(84840),determinant:r(6900),multiply:r(14787),translate:r(4165),scale:r(8697),rotate:r(32416),rotateX:r(81066),rotateY:r(54201),rotateZ:r(33920),fromRotation:r(43061),fromRotationTranslation:r(33606),fromScaling:r(98698),fromTranslation:r(6924),fromXRotation:r(81181),fromYRotation:r(95258),fromZRotation:r(94815),fromQuat:r(36472),frustum:r(87301),perspective:r(5313),perspectiveFromFieldOfView:r(22253),ortho:r(4633),lookAt:r(26645),str:r(66992)}},96559:function(t){t.exports=function(t,e){var r=e[0],n=e[1],i=e[2],a=e[3],o=e[4],s=e[5],l=e[6],c=e[7],u=e[8],h=e[9],f=e[10],p=e[11],d=e[12],m=e[13],g=e[14],y=e[15],v=r*s-n*o,x=r*l-i*o,_=r*c-a*o,b=n*l-i*s,w=n*c-a*s,T=i*c-a*l,k=u*m-h*d,A=u*g-f*d,M=u*y-p*d,S=h*g-f*m,E=h*y-p*m,C=f*y-p*g,L=v*C-x*E+_*S+b*M-w*A+T*k;return L?(L=1/L,t[0]=(s*C-l*E+c*S)*L,t[1]=(i*E-n*C-a*S)*L,t[2]=(m*T-g*w+y*b)*L,t[3]=(f*w-h*T-p*b)*L,t[4]=(l*M-o*C-c*A)*L,t[5]=(r*C-i*M+a*A)*L,t[6]=(g*_-d*T-y*x)*L,t[7]=(u*T-f*_+p*x)*L,t[8]=(o*E-s*M+c*k)*L,t[9]=(n*M-r*E-a*k)*L,t[10]=(d*w-m*_+y*v)*L,t[11]=(h*_-u*w-p*v)*L,t[12]=(s*A-o*S-l*k)*L,t[13]=(r*S-n*A+i*k)*L,t[14]=(m*x-d*b-g*v)*L,t[15]=(u*b-h*x+f*v)*L,t):null}},26645:function(t,e,r){var n=r(87193);t.exports=function(t,e,r,i){var a,o,s,l,c,u,h,f,p,d,m=e[0],g=e[1],y=e[2],v=i[0],x=i[1],_=i[2],b=r[0],w=r[1],T=r[2];return Math.abs(m-b)<1e-6&&Math.abs(g-w)<1e-6&&Math.abs(y-T)<1e-6?n(t):(h=m-b,f=g-w,p=y-T,a=x*(p*=d=1/Math.sqrt(h*h+f*f+p*p))-_*(f*=d),o=_*(h*=d)-v*p,s=v*f-x*h,(d=Math.sqrt(a*a+o*o+s*s))?(a*=d=1/d,o*=d,s*=d):(a=0,o=0,s=0),l=f*s-p*o,c=p*a-h*s,u=h*o-f*a,(d=Math.sqrt(l*l+c*c+u*u))?(l*=d=1/d,c*=d,u*=d):(l=0,c=0,u=0),t[0]=a,t[1]=l,t[2]=h,t[3]=0,t[4]=o,t[5]=c,t[6]=f,t[7]=0,t[8]=s,t[9]=u,t[10]=p,t[11]=0,t[12]=-(a*m+o*g+s*y),t[13]=-(l*m+c*g+u*y),t[14]=-(h*m+f*g+p*y),t[15]=1,t)}},14787:function(t){t.exports=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=e[3],s=e[4],l=e[5],c=e[6],u=e[7],h=e[8],f=e[9],p=e[10],d=e[11],m=e[12],g=e[13],y=e[14],v=e[15],x=r[0],_=r[1],b=r[2],w=r[3];return t[0]=x*n+_*s+b*h+w*m,t[1]=x*i+_*l+b*f+w*g,t[2]=x*a+_*c+b*p+w*y,t[3]=x*o+_*u+b*d+w*v,x=r[4],_=r[5],b=r[6],w=r[7],t[4]=x*n+_*s+b*h+w*m,t[5]=x*i+_*l+b*f+w*g,t[6]=x*a+_*c+b*p+w*y,t[7]=x*o+_*u+b*d+w*v,x=r[8],_=r[9],b=r[10],w=r[11],t[8]=x*n+_*s+b*h+w*m,t[9]=x*i+_*l+b*f+w*g,t[10]=x*a+_*c+b*p+w*y,t[11]=x*o+_*u+b*d+w*v,x=r[12],_=r[13],b=r[14],w=r[15],t[12]=x*n+_*s+b*h+w*m,t[13]=x*i+_*l+b*f+w*g,t[14]=x*a+_*c+b*p+w*y,t[15]=x*o+_*u+b*d+w*v,t}},4633:function(t){t.exports=function(t,e,r,n,i,a,o){var s=1/(e-r),l=1/(n-i),c=1/(a-o);return t[0]=-2*s,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=-2*l,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=2*c,t[11]=0,t[12]=(e+r)*s,t[13]=(i+n)*l,t[14]=(o+a)*c,t[15]=1,t}},5313:function(t){t.exports=function(t,e,r,n,i){var a=1/Math.tan(e/2),o=1/(n-i);return t[0]=a/r,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=a,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=(i+n)*o,t[11]=-1,t[12]=0,t[13]=0,t[14]=2*i*n*o,t[15]=0,t}},22253:function(t){t.exports=function(t,e,r,n){var i=Math.tan(e.upDegrees*Math.PI/180),a=Math.tan(e.downDegrees*Math.PI/180),o=Math.tan(e.leftDegrees*Math.PI/180),s=Math.tan(e.rightDegrees*Math.PI/180),l=2/(o+s),c=2/(i+a);return t[0]=l,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=c,t[6]=0,t[7]=0,t[8]=-(o-s)*l*.5,t[9]=(i-a)*c*.5,t[10]=n/(r-n),t[11]=-1,t[12]=0,t[13]=0,t[14]=n*r/(r-n),t[15]=0,t}},32416:function(t){t.exports=function(t,e,r,n){var i,a,o,s,l,c,u,h,f,p,d,m,g,y,v,x,_,b,w,T,k,A,M,S,E=n[0],C=n[1],L=n[2],I=Math.sqrt(E*E+C*C+L*L);return Math.abs(I)<1e-6?null:(E*=I=1/I,C*=I,L*=I,i=Math.sin(r),o=1-(a=Math.cos(r)),s=e[0],l=e[1],c=e[2],u=e[3],h=e[4],f=e[5],p=e[6],d=e[7],m=e[8],g=e[9],y=e[10],v=e[11],x=E*E*o+a,_=C*E*o+L*i,b=L*E*o-C*i,w=E*C*o-L*i,T=C*C*o+a,k=L*C*o+E*i,A=E*L*o+C*i,M=C*L*o-E*i,S=L*L*o+a,t[0]=s*x+h*_+m*b,t[1]=l*x+f*_+g*b,t[2]=c*x+p*_+y*b,t[3]=u*x+d*_+v*b,t[4]=s*w+h*T+m*k,t[5]=l*w+f*T+g*k,t[6]=c*w+p*T+y*k,t[7]=u*w+d*T+v*k,t[8]=s*A+h*M+m*S,t[9]=l*A+f*M+g*S,t[10]=c*A+p*M+y*S,t[11]=u*A+d*M+v*S,e!==t&&(t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15]),t)}},81066:function(t){t.exports=function(t,e,r){var n=Math.sin(r),i=Math.cos(r),a=e[4],o=e[5],s=e[6],l=e[7],c=e[8],u=e[9],h=e[10],f=e[11];return e!==t&&(t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15]),t[4]=a*i+c*n,t[5]=o*i+u*n,t[6]=s*i+h*n,t[7]=l*i+f*n,t[8]=c*i-a*n,t[9]=u*i-o*n,t[10]=h*i-s*n,t[11]=f*i-l*n,t}},54201:function(t){t.exports=function(t,e,r){var n=Math.sin(r),i=Math.cos(r),a=e[0],o=e[1],s=e[2],l=e[3],c=e[8],u=e[9],h=e[10],f=e[11];return e!==t&&(t[4]=e[4],t[5]=e[5],t[6]=e[6],t[7]=e[7],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15]),t[0]=a*i-c*n,t[1]=o*i-u*n,t[2]=s*i-h*n,t[3]=l*i-f*n,t[8]=a*n+c*i,t[9]=o*n+u*i,t[10]=s*n+h*i,t[11]=l*n+f*i,t}},33920:function(t){t.exports=function(t,e,r){var n=Math.sin(r),i=Math.cos(r),a=e[0],o=e[1],s=e[2],l=e[3],c=e[4],u=e[5],h=e[6],f=e[7];return e!==t&&(t[8]=e[8],t[9]=e[9],t[10]=e[10],t[11]=e[11],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15]),t[0]=a*i+c*n,t[1]=o*i+u*n,t[2]=s*i+h*n,t[3]=l*i+f*n,t[4]=c*i-a*n,t[5]=u*i-o*n,t[6]=h*i-s*n,t[7]=f*i-l*n,t}},8697:function(t){t.exports=function(t,e,r){var n=r[0],i=r[1],a=r[2];return t[0]=e[0]*n,t[1]=e[1]*n,t[2]=e[2]*n,t[3]=e[3]*n,t[4]=e[4]*i,t[5]=e[5]*i,t[6]=e[6]*i,t[7]=e[7]*i,t[8]=e[8]*a,t[9]=e[9]*a,t[10]=e[10]*a,t[11]=e[11]*a,t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15],t}},66992:function(t){t.exports=function(t){return\"mat4(\"+t[0]+\", \"+t[1]+\", \"+t[2]+\", \"+t[3]+\", \"+t[4]+\", \"+t[5]+\", \"+t[6]+\", \"+t[7]+\", \"+t[8]+\", \"+t[9]+\", \"+t[10]+\", \"+t[11]+\", \"+t[12]+\", \"+t[13]+\", \"+t[14]+\", \"+t[15]+\")\"}},4165:function(t){t.exports=function(t,e,r){var n,i,a,o,s,l,c,u,h,f,p,d,m=r[0],g=r[1],y=r[2];return e===t?(t[12]=e[0]*m+e[4]*g+e[8]*y+e[12],t[13]=e[1]*m+e[5]*g+e[9]*y+e[13],t[14]=e[2]*m+e[6]*g+e[10]*y+e[14],t[15]=e[3]*m+e[7]*g+e[11]*y+e[15]):(n=e[0],i=e[1],a=e[2],o=e[3],s=e[4],l=e[5],c=e[6],u=e[7],h=e[8],f=e[9],p=e[10],d=e[11],t[0]=n,t[1]=i,t[2]=a,t[3]=o,t[4]=s,t[5]=l,t[6]=c,t[7]=u,t[8]=h,t[9]=f,t[10]=p,t[11]=d,t[12]=n*m+s*g+h*y+e[12],t[13]=i*m+l*g+f*y+e[13],t[14]=a*m+c*g+p*y+e[14],t[15]=o*m+u*g+d*y+e[15]),t}},10256:function(t){t.exports=function(t,e){if(t===e){var r=e[1],n=e[2],i=e[3],a=e[6],o=e[7],s=e[11];t[1]=e[4],t[2]=e[8],t[3]=e[12],t[4]=r,t[6]=e[9],t[7]=e[13],t[8]=n,t[9]=a,t[11]=e[14],t[12]=i,t[13]=o,t[14]=s}else t[0]=e[0],t[1]=e[4],t[2]=e[8],t[3]=e[12],t[4]=e[1],t[5]=e[5],t[6]=e[9],t[7]=e[13],t[8]=e[2],t[9]=e[6],t[10]=e[10],t[11]=e[14],t[12]=e[3],t[13]=e[7],t[14]=e[11],t[15]=e[15];return t}},74024:function(t,e,r){\"use strict\";var n=r(59518),i=r(6807),a=r(81330),o=r(38862),s=r(93103),l=r(162),c=r(68950),u=r(66127),h=r(5137),f=r(29388),p=r(4957),d=r(44626),m=r(44431),g=r(27976),y=r(12673),v=r(83473),x=r(54689).nextPow2,_=new s,b=!1;if(document.body){var w=document.body.appendChild(document.createElement(\"div\"));w.style.font=\"italic small-caps bold condensed 16px/2 cursive\",getComputedStyle(w).fontStretch&&(b=!0),document.body.removeChild(w)}var T=function(t){!function(t){return\"function\"==typeof t&&t._gl&&t.prop&&t.texture&&t.buffer}(t)?this.gl=o(t):(t={regl:t},this.gl=t.regl._gl),this.shader=_.get(this.gl),this.shader?this.regl=this.shader.regl:this.regl=t.regl||a({gl:this.gl}),this.charBuffer=this.regl.buffer({type:\"uint8\",usage:\"stream\"}),this.sizeBuffer=this.regl.buffer({type:\"float\",usage:\"stream\"}),this.shader||(this.shader=this.createShader(),_.set(this.gl,this.shader)),this.batch=[],this.fontSize=[],this.font=[],this.fontAtlas=[],this.draw=this.shader.draw.bind(this),this.render=function(){this.regl._refresh(),this.draw(this.batch)},this.canvas=this.gl.canvas,this.update(f(t)?t:{})};T.prototype.createShader=function(){var t=this.regl,e=t({blend:{enable:!0,color:[0,0,0,1],func:{srcRGB:\"src alpha\",dstRGB:\"one minus src alpha\",srcAlpha:\"one minus dst alpha\",dstAlpha:\"one\"}},stencil:{enable:!1},depth:{enable:!1},count:t.prop(\"count\"),offset:t.prop(\"offset\"),attributes:{charOffset:{offset:4,stride:8,buffer:t.this(\"sizeBuffer\")},width:{offset:0,stride:8,buffer:t.this(\"sizeBuffer\")},char:t.this(\"charBuffer\"),position:t.this(\"position\")},uniforms:{atlasSize:function(t,e){return[e.atlas.width,e.atlas.height]},atlasDim:function(t,e){return[e.atlas.cols,e.atlas.rows]},atlas:function(t,e){return e.atlas.texture},charStep:function(t,e){return e.atlas.step},em:function(t,e){return e.atlas.em},color:t.prop(\"color\"),opacity:t.prop(\"opacity\"),viewport:t.this(\"viewportArray\"),scale:t.this(\"scale\"),align:t.prop(\"align\"),baseline:t.prop(\"baseline\"),translate:t.this(\"translate\"),positionOffset:t.prop(\"positionOffset\")},primitive:\"points\",viewport:t.this(\"viewport\"),vert:\"\\n\\t\\t\\tprecision highp float;\\n\\t\\t\\tattribute float width, charOffset, char;\\n\\t\\t\\tattribute vec2 position;\\n\\t\\t\\tuniform float fontSize, charStep, em, align, baseline;\\n\\t\\t\\tuniform vec4 viewport;\\n\\t\\t\\tuniform vec4 color;\\n\\t\\t\\tuniform vec2 atlasSize, atlasDim, scale, translate, positionOffset;\\n\\t\\t\\tvarying vec2 charCoord, charId;\\n\\t\\t\\tvarying float charWidth;\\n\\t\\t\\tvarying vec4 fontColor;\\n\\t\\t\\tvoid main () {\\n\\t\\t\\t\\tvec2 offset = floor(em * (vec2(align + charOffset, baseline)\\n\\t\\t\\t\\t\\t+ vec2(positionOffset.x, -positionOffset.y)))\\n\\t\\t\\t\\t\\t/ (viewport.zw * scale.xy);\\n\\n\\t\\t\\t\\tvec2 position = (position + translate) * scale;\\n\\t\\t\\t\\tposition += offset * scale;\\n\\n\\t\\t\\t\\tcharCoord = position * viewport.zw + viewport.xy;\\n\\n\\t\\t\\t\\tgl_Position = vec4(position * 2. - 1., 0, 1);\\n\\n\\t\\t\\t\\tgl_PointSize = charStep;\\n\\n\\t\\t\\t\\tcharId.x = mod(char, atlasDim.x);\\n\\t\\t\\t\\tcharId.y = floor(char / atlasDim.x);\\n\\n\\t\\t\\t\\tcharWidth = width * em;\\n\\n\\t\\t\\t\\tfontColor = color / 255.;\\n\\t\\t\\t}\",frag:\"\\n\\t\\t\\tprecision highp float;\\n\\t\\t\\tuniform float fontSize, charStep, opacity;\\n\\t\\t\\tuniform vec2 atlasSize;\\n\\t\\t\\tuniform vec4 viewport;\\n\\t\\t\\tuniform sampler2D atlas;\\n\\t\\t\\tvarying vec4 fontColor;\\n\\t\\t\\tvarying vec2 charCoord, charId;\\n\\t\\t\\tvarying float charWidth;\\n\\n\\t\\t\\tfloat lightness(vec4 color) {\\n\\t\\t\\t\\treturn color.r * 0.299 + color.g * 0.587 + color.b * 0.114;\\n\\t\\t\\t}\\n\\n\\t\\t\\tvoid main () {\\n\\t\\t\\t\\tvec2 uv = gl_FragCoord.xy - charCoord + charStep * .5;\\n\\t\\t\\t\\tfloat halfCharStep = floor(charStep * .5 + .5);\\n\\n\\t\\t\\t\\t// invert y and shift by 1px (FF expecially needs that)\\n\\t\\t\\t\\tuv.y = charStep - uv.y;\\n\\n\\t\\t\\t\\t// ignore points outside of character bounding box\\n\\t\\t\\t\\tfloat halfCharWidth = ceil(charWidth * .5);\\n\\t\\t\\t\\tif (floor(uv.x) > halfCharStep + halfCharWidth ||\\n\\t\\t\\t\\t\\tfloor(uv.x) < halfCharStep - halfCharWidth) return;\\n\\n\\t\\t\\t\\tuv += charId * charStep;\\n\\t\\t\\t\\tuv = uv / atlasSize;\\n\\n\\t\\t\\t\\tvec4 color = fontColor;\\n\\t\\t\\t\\tvec4 mask = texture2D(atlas, uv);\\n\\n\\t\\t\\t\\tfloat maskY = lightness(mask);\\n\\t\\t\\t\\t// float colorY = lightness(color);\\n\\t\\t\\t\\tcolor.a *= maskY;\\n\\t\\t\\t\\tcolor.a *= opacity;\\n\\n\\t\\t\\t\\t// color.a += .1;\\n\\n\\t\\t\\t\\t// antialiasing, see yiq color space y-channel formula\\n\\t\\t\\t\\t// color.rgb += (1. - color.rgb) * (1. - mask.rgb);\\n\\n\\t\\t\\t\\tgl_FragColor = color;\\n\\t\\t\\t}\"});return{regl:t,draw:e,atlas:{}}},T.prototype.update=function(t){var e=this;if(\"string\"==typeof t)t={text:t};else if(!t)return;null!=(t=i(t,{position:\"position positions coord coords coordinates\",font:\"font fontFace fontface typeface cssFont css-font family fontFamily\",fontSize:\"fontSize fontsize size font-size\",text:\"text texts chars characters value values symbols\",align:\"align alignment textAlign textbaseline\",baseline:\"baseline textBaseline textbaseline\",direction:\"dir direction textDirection\",color:\"color colour fill fill-color fillColor textColor textcolor\",kerning:\"kerning kern\",range:\"range dataBox\",viewport:\"vp viewport viewBox viewbox viewPort\",opacity:\"opacity alpha transparency visible visibility opaque\",offset:\"offset positionOffset padding shift indent indentation\"},!0)).opacity&&(Array.isArray(t.opacity)?this.opacity=t.opacity.map((function(t){return parseFloat(t)})):this.opacity=parseFloat(t.opacity)),null!=t.viewport&&(this.viewport=h(t.viewport),this.viewportArray=[this.viewport.x,this.viewport.y,this.viewport.width,this.viewport.height]),null==this.viewport&&(this.viewport={x:0,y:0,width:this.gl.drawingBufferWidth,height:this.gl.drawingBufferHeight},this.viewportArray=[this.viewport.x,this.viewport.y,this.viewport.width,this.viewport.height]),null!=t.kerning&&(this.kerning=t.kerning),null!=t.offset&&(\"number\"==typeof t.offset&&(t.offset=[t.offset,0]),this.positionOffset=v(t.offset)),t.direction&&(this.direction=t.direction),t.range&&(this.range=t.range,this.scale=[1/(t.range[2]-t.range[0]),1/(t.range[3]-t.range[1])],this.translate=[-t.range[0],-t.range[1]]),t.scale&&(this.scale=t.scale),t.translate&&(this.translate=t.translate),this.scale||(this.scale=[1/this.viewport.width,1/this.viewport.height]),this.translate||(this.translate=[0,0]),this.font.length||t.font||(t.font=T.baseFontSize+\"px sans-serif\");var r,a=!1,o=!1;if(t.font&&(Array.isArray(t.font)?t.font:[t.font]).forEach((function(t,r){if(\"string\"==typeof t)try{t=n.parse(t)}catch(e){t=n.parse(T.baseFontSize+\"px \"+t)}else{var i=t.style,s=t.weight,l=t.stretch,c=t.variant;t=n.parse(n.stringify(t)),i&&(t.style=i),s&&(t.weight=s),l&&(t.stretch=l),c&&(t.variant=c)}var u=n.stringify({size:T.baseFontSize,family:t.family,stretch:b?t.stretch:void 0,variant:t.variant,weight:t.weight,style:t.style}),h=p(t.size),f=Math.round(h[0]*d(h[1]));if(f!==e.fontSize[r]&&(o=!0,e.fontSize[r]=f),!(e.font[r]&&u==e.font[r].baseString||(a=!0,e.font[r]=T.fonts[u],e.font[r]))){var m=t.family.join(\", \"),g=[t.style];t.style!=t.variant&&g.push(t.variant),t.variant!=t.weight&&g.push(t.weight),b&&t.weight!=t.stretch&&g.push(t.stretch),e.font[r]={baseString:u,family:m,weight:t.weight,stretch:t.stretch,style:t.style,variant:t.variant,width:{},kerning:{},metrics:y(m,{origin:\"top\",fontSize:T.baseFontSize,fontStyle:g.join(\" \")})},T.fonts[u]=e.font[r]}})),(a||o)&&this.font.forEach((function(r,i){var a=n.stringify({size:e.fontSize[i],family:r.family,stretch:b?r.stretch:void 0,variant:r.variant,weight:r.weight,style:r.style});if(e.fontAtlas[i]=e.shader.atlas[a],!e.fontAtlas[i]){var o=r.metrics;e.shader.atlas[a]=e.fontAtlas[i]={fontString:a,step:2*Math.ceil(e.fontSize[i]*o.bottom*.5),em:e.fontSize[i],cols:0,rows:0,height:0,width:0,chars:[],ids:{},texture:e.regl.texture()}}null==t.text&&(t.text=e.text)})),\"string\"==typeof t.text&&t.position&&t.position.length>2){for(var s=Array(.5*t.position.length),f=0;f2){for(var w=!t.position[0].length,k=u.mallocFloat(2*this.count),A=0,M=0;A1?e.align[r]:e.align[0]:e.align;if(\"number\"==typeof n)return n;switch(n){case\"right\":case\"end\":return-t;case\"center\":case\"centre\":case\"middle\":return.5*-t}return 0}))),null==this.baseline&&null==t.baseline&&(t.baseline=0),null!=t.baseline&&(this.baseline=t.baseline,Array.isArray(this.baseline)||(this.baseline=[this.baseline]),this.baselineOffset=this.baseline.map((function(t,r){var n=(e.font[r]||e.font[0]).metrics,i=0;return i+=.5*n.bottom,-1*(i+=\"number\"==typeof t?t-n.baseline:-n[t])}))),null!=t.color)if(t.color||(t.color=\"transparent\"),\"string\"!=typeof t.color&&isNaN(t.color)){var H;if(\"number\"==typeof t.color[0]&&t.color.length>this.counts.length){var G=t.color.length;H=u.mallocUint8(G);for(var Z=(t.color.subarray||t.color.slice).bind(t.color),W=0;W4||this.baselineOffset.length>1||this.align&&this.align.length>1||this.fontAtlas.length>1||this.positionOffset.length>2){var $=Math.max(.5*this.position.length||0,.25*this.color.length||0,this.baselineOffset.length||0,this.alignOffset.length||0,this.font.length||0,this.opacity.length||0,.5*this.positionOffset.length||0);this.batch=Array($);for(var J=0;J1?this.counts[J]:this.counts[0],offset:this.textOffsets.length>1?this.textOffsets[J]:this.textOffsets[0],color:this.color?this.color.length<=4?this.color:this.color.subarray(4*J,4*J+4):[0,0,0,255],opacity:Array.isArray(this.opacity)?this.opacity[J]:this.opacity,baseline:null!=this.baselineOffset[J]?this.baselineOffset[J]:this.baselineOffset[0],align:this.align?null!=this.alignOffset[J]?this.alignOffset[J]:this.alignOffset[0]:0,atlas:this.fontAtlas[J]||this.fontAtlas[0],positionOffset:this.positionOffset.length>2?this.positionOffset.subarray(2*J,2*J+2):this.positionOffset}}else this.count?this.batch=[{count:this.count,offset:0,color:this.color||[0,0,0,255],opacity:Array.isArray(this.opacity)?this.opacity[0]:this.opacity,baseline:this.baselineOffset[0],align:this.alignOffset?this.alignOffset[0]:0,atlas:this.fontAtlas[0],positionOffset:this.positionOffset}]:this.batch=[]},T.prototype.destroy=function(){},T.prototype.kerning=!0,T.prototype.position={constant:new Float32Array(2)},T.prototype.translate=null,T.prototype.scale=null,T.prototype.font=null,T.prototype.text=\"\",T.prototype.positionOffset=[0,0],T.prototype.opacity=1,T.prototype.color=new Uint8Array([0,0,0,255]),T.prototype.alignOffset=[0,0],T.maxAtlasSize=1024,T.atlasCanvas=document.createElement(\"canvas\"),T.atlasContext=T.atlasCanvas.getContext(\"2d\",{alpha:!1}),T.baseFontSize=64,T.fonts={},t.exports=T},38862:function(t,e,r){\"use strict\";var n=r(6807);function i(t){if(t.container)if(t.container==document.body)document.body.style.width||(t.canvas.width=t.width||t.pixelRatio*r.g.innerWidth),document.body.style.height||(t.canvas.height=t.height||t.pixelRatio*r.g.innerHeight);else{var e=t.container.getBoundingClientRect();t.canvas.width=t.width||e.right-e.left,t.canvas.height=t.height||e.bottom-e.top}}function a(t){return\"function\"==typeof t.getContext&&\"width\"in t&&\"height\"in t}function o(){var t=document.createElement(\"canvas\");return t.style.position=\"absolute\",t.style.top=0,t.style.left=0,t}t.exports=function(t){var e;if(t?\"string\"==typeof t&&(t={container:t}):t={},(t=a(t)||\"string\"==typeof(e=t).nodeName&&\"function\"==typeof e.appendChild&&\"function\"==typeof e.getBoundingClientRect?{container:t}:function(t){return\"function\"==typeof t.drawArrays||\"function\"==typeof t.drawElements}(t)?{gl:t}:n(t,{container:\"container target element el canvas holder parent parentNode wrapper use ref root node\",gl:\"gl context webgl glContext\",attrs:\"attributes attrs contextAttributes\",pixelRatio:\"pixelRatio pxRatio px ratio pxratio pixelratio\",width:\"w width\",height:\"h height\"},!0)).pixelRatio||(t.pixelRatio=r.g.pixelRatio||1),t.gl)return t.gl;if(t.canvas&&(t.container=t.canvas.parentNode),t.container){if(\"string\"==typeof t.container){var s=document.querySelector(t.container);if(!s)throw Error(\"Element \"+t.container+\" is not found\");t.container=s}a(t.container)?(t.canvas=t.container,t.container=t.canvas.parentNode):t.canvas||(t.canvas=o(),t.container.appendChild(t.canvas),i(t))}else if(!t.canvas){if(\"undefined\"==typeof document)throw Error(\"Not DOM environment. Use headless-gl.\");t.container=document.body||document.documentElement,t.canvas=o(),t.container.appendChild(t.canvas),i(t)}return t.gl||[\"webgl\",\"experimental-webgl\",\"webgl-experimental\"].some((function(e){try{t.gl=t.canvas.getContext(e,t.attrs)}catch(t){}return t.gl})),t.gl}},76765:function(t){t.exports=function(t){\"string\"==typeof t&&(t=[t]);for(var e=[].slice.call(arguments,1),r=[],n=0;n>1,u=-7,h=r?i-1:0,f=r?-1:1,p=t[e+h];for(h+=f,a=p&(1<<-u)-1,p>>=-u,u+=s;u>0;a=256*a+t[e+h],h+=f,u-=8);for(o=a&(1<<-u)-1,a>>=-u,u+=n;u>0;o=256*o+t[e+h],h+=f,u-=8);if(0===a)a=1-c;else{if(a===l)return o?NaN:1/0*(p?-1:1);o+=Math.pow(2,n),a-=c}return(p?-1:1)*o*Math.pow(2,a-n)},e.write=function(t,e,r,n,i,a){var o,s,l,c=8*a-i-1,u=(1<>1,f=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,p=n?0:a-1,d=n?1:-1,m=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(s=isNaN(e)?1:0,o=u):(o=Math.floor(Math.log(e)/Math.LN2),e*(l=Math.pow(2,-o))<1&&(o--,l*=2),(e+=o+h>=1?f/l:f*Math.pow(2,1-h))*l>=2&&(o++,l/=2),o+h>=u?(s=0,o=u):o+h>=1?(s=(e*l-1)*Math.pow(2,i),o+=h):(s=e*Math.pow(2,h-1)*Math.pow(2,i),o=0));i>=8;t[r+p]=255&s,p+=d,s/=256,i-=8);for(o=o<0;t[r+p]=255&o,p+=d,o/=256,c-=8);t[r+p-d]|=128*m}},28062:function(t){\"function\"==typeof Object.create?t.exports=function(t,e){e&&(t.super_=e,t.prototype=Object.create(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}))}:t.exports=function(t,e){if(e){t.super_=e;var r=function(){};r.prototype=e.prototype,t.prototype=new r,t.prototype.constructor=t}}},40280:function(t,e,r){\"use strict\";var n=r(36912)(),i=r(63063)(\"Object.prototype.toString\"),a=function(t){return!(n&&t&&\"object\"==typeof t&&Symbol.toStringTag in t)&&\"[object Arguments]\"===i(t)},o=function(t){return!!a(t)||null!==t&&\"object\"==typeof t&&\"number\"==typeof t.length&&t.length>=0&&\"[object Array]\"!==i(t)&&\"[object Function]\"===i(t.callee)},s=function(){return a(arguments)}();a.isLegacyArguments=o,t.exports=s?a:o},78253:function(t){t.exports=!0},82756:function(t){\"use strict\";var e,r,n=Function.prototype.toString,i=\"object\"==typeof Reflect&&null!==Reflect&&Reflect.apply;if(\"function\"==typeof i&&\"function\"==typeof Object.defineProperty)try{e=Object.defineProperty({},\"length\",{get:function(){throw r}}),r={},i((function(){throw 42}),null,e)}catch(t){t!==r&&(i=null)}else i=null;var a=/^\\s*class\\b/,o=function(t){try{var e=n.call(t);return a.test(e)}catch(t){return!1}},s=function(t){try{return!o(t)&&(n.call(t),!0)}catch(t){return!1}},l=Object.prototype.toString,c=\"function\"==typeof Symbol&&!!Symbol.toStringTag,u=!(0 in[,]),h=function(){return!1};if(\"object\"==typeof document){var f=document.all;l.call(f)===l.call(document.all)&&(h=function(t){if((u||!t)&&(void 0===t||\"object\"==typeof t))try{var e=l.call(t);return(\"[object HTMLAllCollection]\"===e||\"[object HTML document.all class]\"===e||\"[object HTMLCollection]\"===e||\"[object Object]\"===e)&&null==t(\"\")}catch(t){}return!1})}t.exports=i?function(t){if(h(t))return!0;if(!t)return!1;if(\"function\"!=typeof t&&\"object\"!=typeof t)return!1;try{i(t,null,e)}catch(t){if(t!==r)return!1}return!o(t)&&s(t)}:function(t){if(h(t))return!0;if(!t)return!1;if(\"function\"!=typeof t&&\"object\"!=typeof t)return!1;if(c)return s(t);if(o(t))return!1;var e=l.call(t);return!(\"[object Function]\"!==e&&\"[object GeneratorFunction]\"!==e&&!/^\\[object HTML/.test(e))&&s(t)}},80340:function(t,e,r){\"use strict\";var n,i=Object.prototype.toString,a=Function.prototype.toString,o=/^\\s*(?:function)?\\*/,s=r(36912)(),l=Object.getPrototypeOf;t.exports=function(t){if(\"function\"!=typeof t)return!1;if(o.test(a.call(t)))return!0;if(!s)return\"[object GeneratorFunction]\"===i.call(t);if(!l)return!1;if(void 0===n){var e=function(){if(!s)return!1;try{return Function(\"return function*() {}\")()}catch(t){}}();n=!!e&&l(e)}return l(t)===n}},39488:function(t){\"use strict\";t.exports=\"undefined\"!=typeof navigator&&(/MSIE/.test(navigator.userAgent)||/Trident\\//.test(navigator.appVersion))},73287:function(t){\"use strict\";t.exports=function(t){return t!=t}},63057:function(t,e,r){\"use strict\";var n=r(87227),i=r(97936),a=r(73287),o=r(60758),s=r(85684),l=n(o(),Number);i(l,{getPolyfill:o,implementation:a,shim:s}),t.exports=l},60758:function(t,e,r){\"use strict\";var n=r(73287);t.exports=function(){return Number.isNaN&&Number.isNaN(NaN)&&!Number.isNaN(\"a\")?Number.isNaN:n}},85684:function(t,e,r){\"use strict\";var n=r(97936),i=r(60758);t.exports=function(){var t=i();return n(Number,{isNaN:t},{isNaN:function(){return Number.isNaN!==t}}),t}},60201:function(t){\"use strict\";t.exports=function(t){var e=typeof t;return null!==t&&(\"object\"===e||\"function\"===e)}},29388:function(t){\"use strict\";var e=Object.prototype.toString;t.exports=function(t){var r;return\"[object Object]\"===e.call(t)&&(null===(r=Object.getPrototypeOf(t))||r===Object.getPrototypeOf({}))}},9914:function(t){\"use strict\";t.exports=function(t){for(var e,r=t.length,n=0;n13)&&32!==e&&133!==e&&160!==e&&5760!==e&&6158!==e&&(e<8192||e>8205)&&8232!==e&&8233!==e&&8239!==e&&8287!==e&&8288!==e&&12288!==e&&65279!==e)return!1;return!0}},13986:function(t){\"use strict\";t.exports=function(t){return\"string\"==typeof t&&(t=t.trim(),!!(/^[mzlhvcsqta]\\s*[-+.0-9][^mlhvzcsqta]+/i.test(t)&&/[\\dz]$/i.test(t)&&t.length>4))}},15628:function(t,e,r){\"use strict\";var n=r(61262),i=r(70085),a=r(63063),o=a(\"Object.prototype.toString\"),s=r(36912)(),l=r(52991),c=\"undefined\"==typeof globalThis?r.g:globalThis,u=i(),h=a(\"Array.prototype.indexOf\",!0)||function(t,e){for(var r=0;r-1}return!!l&&function(t){var e=!1;return n(p,(function(r,n){if(!e)try{e=r.call(t)===n}catch(t){}})),e}(t)}},62914:function(t){\"use strict\";t.exports=Math.log2||function(t){return Math.log(t)*Math.LOG2E}},99978:function(t,e,r){\"use strict\";t.exports=function(t,e){e||(e=t,t=window);var r=0,i=0,a=0,o={shift:!1,alt:!1,control:!1,meta:!1},s=!1;function l(t){var e=!1;return\"altKey\"in t&&(e=e||t.altKey!==o.alt,o.alt=!!t.altKey),\"shiftKey\"in t&&(e=e||t.shiftKey!==o.shift,o.shift=!!t.shiftKey),\"ctrlKey\"in t&&(e=e||t.ctrlKey!==o.control,o.control=!!t.ctrlKey),\"metaKey\"in t&&(e=e||t.metaKey!==o.meta,o.meta=!!t.metaKey),e}function c(t,s){var c=n.x(s),u=n.y(s);\"buttons\"in s&&(t=0|s.buttons),(t!==r||c!==i||u!==a||l(s))&&(r=0|t,i=c||0,a=u||0,e&&e(r,i,a,o))}function u(t){c(0,t)}function h(){(r||i||a||o.shift||o.alt||o.meta||o.control)&&(i=a=0,r=0,o.shift=o.alt=o.control=o.meta=!1,e&&e(0,0,0,o))}function f(t){l(t)&&e&&e(r,i,a,o)}function p(t){0===n.buttons(t)?c(0,t):c(r,t)}function d(t){c(r|n.buttons(t),t)}function m(t){c(r&~n.buttons(t),t)}function g(){s||(s=!0,t.addEventListener(\"mousemove\",p),t.addEventListener(\"mousedown\",d),t.addEventListener(\"mouseup\",m),t.addEventListener(\"mouseleave\",u),t.addEventListener(\"mouseenter\",u),t.addEventListener(\"mouseout\",u),t.addEventListener(\"mouseover\",u),t.addEventListener(\"blur\",h),t.addEventListener(\"keyup\",f),t.addEventListener(\"keydown\",f),t.addEventListener(\"keypress\",f),t!==window&&(window.addEventListener(\"blur\",h),window.addEventListener(\"keyup\",f),window.addEventListener(\"keydown\",f),window.addEventListener(\"keypress\",f)))}g();var y={element:t};return Object.defineProperties(y,{enabled:{get:function(){return s},set:function(e){e?g():s&&(s=!1,t.removeEventListener(\"mousemove\",p),t.removeEventListener(\"mousedown\",d),t.removeEventListener(\"mouseup\",m),t.removeEventListener(\"mouseleave\",u),t.removeEventListener(\"mouseenter\",u),t.removeEventListener(\"mouseout\",u),t.removeEventListener(\"mouseover\",u),t.removeEventListener(\"blur\",h),t.removeEventListener(\"keyup\",f),t.removeEventListener(\"keydown\",f),t.removeEventListener(\"keypress\",f),t!==window&&(window.removeEventListener(\"blur\",h),window.removeEventListener(\"keyup\",f),window.removeEventListener(\"keydown\",f),window.removeEventListener(\"keypress\",f)))},enumerable:!0},buttons:{get:function(){return r},enumerable:!0},x:{get:function(){return i},enumerable:!0},y:{get:function(){return a},enumerable:!0},mods:{get:function(){return o},enumerable:!0}}),y};var n=r(41926)},44039:function(t){var e={left:0,top:0};t.exports=function(t,r,n){r=r||t.currentTarget||t.srcElement,Array.isArray(n)||(n=[0,0]);var i,a=t.clientX||0,o=t.clientY||0,s=(i=r)===window||i===document||i===document.body?e:i.getBoundingClientRect();return n[0]=a-s.left,n[1]=o-s.top,n}},41926:function(t,e){\"use strict\";function r(t){return t.target||t.srcElement||window}e.buttons=function(t){if(\"object\"==typeof t){if(\"buttons\"in t)return t.buttons;if(\"which\"in t){if(2===(e=t.which))return 4;if(3===e)return 2;if(e>0)return 1<=0)return 1<0&&a(s,r))}catch(t){u.call(new f(r),t)}}}function u(t){var e=this;e.triggered||(e.triggered=!0,e.def&&(e=e.def),e.msg=t,e.state=2,e.chain.length>0&&a(s,e))}function h(t,e,r,n){for(var i=0;i1&&(i*=y=Math.sqrt(y),s*=y);var v=i*i,x=s*s,_=(c==u?-1:1)*Math.sqrt(Math.abs((v*x-v*g*g-x*m*m)/(v*g*g+x*m*m)));_==1/0&&(_=1);var b=_*i*g/s+(t+h)/2,w=_*-s*m/i+(n+f)/2,T=Math.asin(((n-w)/s).toFixed(9)),k=Math.asin(((f-w)/s).toFixed(9));(T=tk&&(T-=2*e),!u&&k>T&&(k-=2*e)}if(Math.abs(k-T)>r){var A=k,M=h,S=f;k=T+r*(u&&k>T?1:-1);var E=a(h=b+i*Math.cos(k),f=w+s*Math.sin(k),i,s,l,0,u,M,S,[k,A,b,w])}var C=Math.tan((k-T)/4),L=4/3*i*C,I=4/3*s*C,P=[2*t-(t+L*Math.sin(T)),2*n-(n-I*Math.cos(T)),h+L*Math.sin(k),f-I*Math.cos(k),h,f];if(p)return P;E&&(P=P.concat(E));for(var z=0;z7&&(r.push(y.splice(0,7)),y.unshift(\"C\"));break;case\"S\":var x=p,_=d;\"C\"!=e&&\"S\"!=e||(x+=x-o,_+=_-l),y=[\"C\",x,_,y[1],y[2],y[3],y[4]];break;case\"T\":\"Q\"==e||\"T\"==e?(h=2*p-h,f=2*d-f):(h=p,f=d),y=i(p,d,h,f,y[1],y[2]);break;case\"Q\":h=y[1],f=y[2],y=i(p,d,y[1],y[2],y[3],y[4]);break;case\"L\":y=n(p,d,y[1],y[2]);break;case\"H\":y=n(p,d,y[1],d);break;case\"V\":y=n(p,d,p,y[1]);break;case\"Z\":y=n(p,d,c,u)}e=v,p=y[y.length-2],d=y[y.length-1],y.length>4?(o=y[y.length-4],l=y[y.length-3]):(o=p,l=d),r.push(y)}return r}},27976:function(t){\"use strict\";var e=Object.getOwnPropertySymbols,r=Object.prototype.hasOwnProperty,n=Object.prototype.propertyIsEnumerable;t.exports=function(){try{if(!Object.assign)return!1;var t=new String(\"abc\");if(t[5]=\"de\",\"5\"===Object.getOwnPropertyNames(t)[0])return!1;for(var e={},r=0;r<10;r++)e[\"_\"+String.fromCharCode(r)]=r;if(\"0123456789\"!==Object.getOwnPropertyNames(e).map((function(t){return e[t]})).join(\"\"))return!1;var n={};return\"abcdefghijklmnopqrst\".split(\"\").forEach((function(t){n[t]=t})),\"abcdefghijklmnopqrst\"===Object.keys(Object.assign({},n)).join(\"\")}catch(t){return!1}}()?Object.assign:function(t,i){for(var a,o,s=function(t){if(null==t)throw new TypeError(\"Object.assign cannot be called with null or undefined\");return Object(t)}(t),l=1;l0&&!i.call(t,0))for(var m=0;m0)for(var g=0;g=0&&\"[object Function]\"===e.call(t.callee)),n}},96927:function(t,e,r){\"use strict\";var n=r(99433),i=r(59457)(),a=r(63063),o=Object,s=a(\"Array.prototype.push\"),l=a(\"Object.prototype.propertyIsEnumerable\"),c=i?Object.getOwnPropertySymbols:null;t.exports=function(t,e){if(null==t)throw new TypeError(\"target must be an object\");var r=o(t);if(1===arguments.length)return r;for(var a=1;a1e4)throw Error(\"References have circular dependency. Please, check them.\");r[n]=t})),n=n.reverse(),r=r.map((function(e){return n.forEach((function(r){e=e.replace(new RegExp(\"(\\\\\"+i+r+\"\\\\\"+i+\")\",\"g\"),t[0]+\"$1\"+t[1])})),e}))}));var o=new RegExp(\"\\\\\"+i+\"([0-9]+)\\\\\"+i);return a?r:function t(e,r,n){for(var i,a=[],s=0;i=o.exec(e);){if(s++>1e4)throw Error(\"Circular references in parenthesis\");a.push(e.slice(0,i.index)),a.push(t(r[i[1]],r)),e=e.slice(i.index+i[0].length)}return a.push(e),a}(r[0],r)}function r(t,e){if(e&&e.flat){var r,n=e&&e.escape||\"___\",i=t[0];if(!i)return\"\";for(var a=new RegExp(\"\\\\\"+n+\"([0-9]+)\\\\\"+n),o=0;i!=r;){if(o++>1e4)throw Error(\"Circular references in \"+t);r=i,i=i.replace(a,s)}return i}return t.reduce((function t(e,r){return Array.isArray(r)&&(r=r.reduce(t,\"\")),e+r}),\"\");function s(e,r){if(null==t[r])throw Error(\"Reference \"+r+\"is undefined\");return t[r]}}function n(t,n){return Array.isArray(t)?r(t,n):e(t,n)}n.parse=e,n.stringify=r,t.exports=n},5137:function(t,e,r){\"use strict\";var n=r(6807);t.exports=function(t){var e;return arguments.length>1&&(t=arguments),\"string\"==typeof t?t=t.split(/\\s/).map(parseFloat):\"number\"==typeof t&&(t=[t]),t.length&&\"number\"==typeof t[0]?e=1===t.length?{width:t[0],height:t[0],x:0,y:0}:2===t.length?{width:t[0],height:t[1],x:0,y:0}:{x:t[0],y:t[1],width:t[2]-t[0]||0,height:t[3]-t[1]||0}:t&&(e={x:(t=n(t,{left:\"x l left Left\",top:\"y t top Top\",width:\"w width W Width\",height:\"h height W Width\",bottom:\"b bottom Bottom\",right:\"r right Right\"})).left||0,y:t.top||0},null==t.width?t.right?e.width=t.right-e.x:e.width=0:e.width=t.width,null==t.height?t.bottom?e.height=t.bottom-e.y:e.height=0:e.height=t.height),e}},26953:function(t){t.exports=function(t){var i=[];return t.replace(r,(function(t,r,a){var o=r.toLowerCase();for(a=function(t){var e=t.match(n);return e?e.map(Number):[]}(a),\"m\"==o&&a.length>2&&(i.push([r].concat(a.splice(0,2))),o=\"l\",r=\"m\"==r?\"l\":\"L\");;){if(a.length==e[o])return a.unshift(r),i.push(a);if(a.lengtha!=p>a&&i<(f-u)*(a-h)/(p-h)+u&&(o=!o)}return o}},11516:function(t,e,r){var n,i=r(42391),a=r(92990),o=r(26202),s=r(22222),l=r(17527),c=r(24491),u=!1,h=a();function f(t,e,r){var i=n.segments(t),a=n.segments(e),o=r(n.combine(i,a));return n.polygon(o)}n={buildLog:function(t){return!0===t?u=i():!1===t&&(u=!1),!1!==u&&u.list},epsilon:function(t){return h.epsilon(t)},segments:function(t){var e=o(!0,h,u);return t.regions.forEach(e.addRegion),{segments:e.calculate(t.inverted),inverted:t.inverted}},combine:function(t,e){return{combined:o(!1,h,u).calculate(t.segments,t.inverted,e.segments,e.inverted),inverted1:t.inverted,inverted2:e.inverted}},selectUnion:function(t){return{segments:l.union(t.combined,u),inverted:t.inverted1||t.inverted2}},selectIntersect:function(t){return{segments:l.intersect(t.combined,u),inverted:t.inverted1&&t.inverted2}},selectDifference:function(t){return{segments:l.difference(t.combined,u),inverted:t.inverted1&&!t.inverted2}},selectDifferenceRev:function(t){return{segments:l.differenceRev(t.combined,u),inverted:!t.inverted1&&t.inverted2}},selectXor:function(t){return{segments:l.xor(t.combined,u),inverted:t.inverted1!==t.inverted2}},polygon:function(t){return{regions:s(t.segments,h,u),inverted:t.inverted}},polygonFromGeoJSON:function(t){return c.toPolygon(n,t)},polygonToGeoJSON:function(t){return c.fromPolygon(n,h,t)},union:function(t,e){return f(t,e,n.selectUnion)},intersect:function(t,e){return f(t,e,n.selectIntersect)},difference:function(t,e){return f(t,e,n.selectDifference)},differenceRev:function(t,e){return f(t,e,n.selectDifferenceRev)},xor:function(t,e){return f(t,e,n.selectXor)}},\"object\"==typeof window&&(window.PolyBool=n),t.exports=n},42391:function(t){t.exports=function(){var t,e=0,r=!1;function n(e,r){return t.list.push({type:e,data:r?JSON.parse(JSON.stringify(r)):void 0}),t}return t={list:[],segmentId:function(){return e++},checkIntersection:function(t,e){return n(\"check\",{seg1:t,seg2:e})},segmentChop:function(t,e){return n(\"div_seg\",{seg:t,pt:e}),n(\"chop\",{seg:t,pt:e})},statusRemove:function(t){return n(\"pop_seg\",{seg:t})},segmentUpdate:function(t){return n(\"seg_update\",{seg:t})},segmentNew:function(t,e){return n(\"new_seg\",{seg:t,primary:e})},segmentRemove:function(t){return n(\"rem_seg\",{seg:t})},tempStatus:function(t,e,r){return n(\"temp_status\",{seg:t,above:e,below:r})},rewind:function(t){return n(\"rewind\",{seg:t})},status:function(t,e,r){return n(\"status\",{seg:t,above:e,below:r})},vert:function(e){return e===r?t:(r=e,n(\"vert\",{x:e}))},log:function(t){return\"string\"!=typeof t&&(t=JSON.stringify(t,!1,\" \")),n(\"log\",{txt:t})},reset:function(){return n(\"reset\")},selected:function(t){return n(\"selected\",{segs:t})},chainStart:function(t){return n(\"chain_start\",{seg:t})},chainRemoveHead:function(t,e){return n(\"chain_rem_head\",{index:t,pt:e})},chainRemoveTail:function(t,e){return n(\"chain_rem_tail\",{index:t,pt:e})},chainNew:function(t,e){return n(\"chain_new\",{pt1:t,pt2:e})},chainMatch:function(t){return n(\"chain_match\",{index:t})},chainClose:function(t){return n(\"chain_close\",{index:t})},chainAddHead:function(t,e){return n(\"chain_add_head\",{index:t,pt:e})},chainAddTail:function(t,e){return n(\"chain_add_tail\",{index:t,pt:e})},chainConnect:function(t,e){return n(\"chain_con\",{index1:t,index2:e})},chainReverse:function(t){return n(\"chain_rev\",{index:t})},chainJoin:function(t,e){return n(\"chain_join\",{index1:t,index2:e})},done:function(){return n(\"done\")}}}},92990:function(t){t.exports=function(t){\"number\"!=typeof t&&(t=1e-10);var e={epsilon:function(e){return\"number\"==typeof e&&(t=e),t},pointAboveOrOnLine:function(e,r,n){var i=r[0],a=r[1],o=n[0],s=n[1],l=e[0];return(o-i)*(e[1]-a)-(s-a)*(l-i)>=-t},pointBetween:function(e,r,n){var i=e[1]-r[1],a=n[0]-r[0],o=e[0]-r[0],s=n[1]-r[1],l=o*a+i*s;return!(l-t)},pointsSameX:function(e,r){return Math.abs(e[0]-r[0])t!=o-i>t&&(a-c)*(i-u)/(o-u)+c-n>t&&(s=!s),a=c,o=u}return s}};return e}},24491:function(t){var e={toPolygon:function(t,e){function r(e){if(e.length<=0)return t.segments({inverted:!1,regions:[]});function r(e){var r=e.slice(0,e.length-1);return t.segments({inverted:!1,regions:[r]})}for(var n=r(e[0]),i=1;i0}))}function u(t,n){var i=t.seg,a=n.seg,o=i.start,s=i.end,c=a.start,u=a.end;r&&r.checkIntersection(i,a);var h=e.linesIntersect(o,s,c,u);if(!1===h){if(!e.pointsCollinear(o,s,c))return!1;if(e.pointsSame(o,u)||e.pointsSame(s,c))return!1;var f=e.pointsSame(o,c),p=e.pointsSame(s,u);if(f&&p)return n;var d=!f&&e.pointBetween(o,c,u),m=!p&&e.pointBetween(s,c,u);if(f)return m?l(n,s):l(t,u),n;d&&(p||(m?l(n,s):l(t,u)),l(n,o))}else 0===h.alongA&&(-1===h.alongB?l(t,c):0===h.alongB?l(t,h.pt):1===h.alongB&&l(t,u)),0===h.alongB&&(-1===h.alongA?l(n,o):0===h.alongA?l(n,h.pt):1===h.alongA&&l(n,s));return!1}for(var h=[];!a.isEmpty();){var f=a.getHead();if(r&&r.vert(f.pt[0]),f.isStart){r&&r.segmentNew(f.seg,f.primary);var p=c(f),d=p.before?p.before.ev:null,m=p.after?p.after.ev:null;function g(){if(d){var t=u(f,d);if(t)return t}return!!m&&u(f,m)}r&&r.tempStatus(f.seg,!!d&&d.seg,!!m&&m.seg);var y,v,x=g();if(x)t?(v=null===f.seg.myFill.below||f.seg.myFill.above!==f.seg.myFill.below)&&(x.seg.myFill.above=!x.seg.myFill.above):x.seg.otherFill=f.seg.myFill,r&&r.segmentUpdate(x.seg),f.other.remove(),f.remove();if(a.getHead()!==f){r&&r.rewind(f.seg);continue}t?(v=null===f.seg.myFill.below||f.seg.myFill.above!==f.seg.myFill.below,f.seg.myFill.below=m?m.seg.myFill.above:i,f.seg.myFill.above=v?!f.seg.myFill.below:f.seg.myFill.below):null===f.seg.otherFill&&(y=m?f.primary===m.primary?m.seg.otherFill.above:m.seg.myFill.above:f.primary?o:i,f.seg.otherFill={above:y,below:y}),r&&r.status(f.seg,!!d&&d.seg,!!m&&m.seg),f.other.status=p.insert(n.node({ev:f}))}else{var _=f.status;if(null===_)throw new Error(\"PolyBool: Zero-length segment detected; your epsilon is probably too small or too large\");if(s.exists(_.prev)&&s.exists(_.next)&&u(_.prev.ev,_.next.ev),r&&r.statusRemove(_.ev.seg),_.remove(),!f.primary){var b=f.seg.myFill;f.seg.myFill=f.seg.otherFill,f.seg.otherFill=b}h.push(f.seg)}a.getHead().remove()}return r&&r.done(),h}return t?{addRegion:function(t){for(var n,i,a,o=t[t.length-1],l=0;l0&&!this.aborted;){var r=this.ifds_to_read.shift();r.offset&&this.scan_ifd(r.id,r.offset,t)}},n.prototype.read_uint16=function(t){var r=this.input;if(t+2>r.length)throw e(\"unexpected EOF\",\"EBADDATA\");return this.big_endian?256*r[t]+r[t+1]:r[t]+256*r[t+1]},n.prototype.read_uint32=function(t){var r=this.input;if(t+4>r.length)throw e(\"unexpected EOF\",\"EBADDATA\");return this.big_endian?16777216*r[t]+65536*r[t+1]+256*r[t+2]+r[t+3]:r[t]+256*r[t+1]+65536*r[t+2]+16777216*r[t+3]},n.prototype.is_subifd_link=function(t,e){return 0===t&&34665===e||0===t&&34853===e||34665===t&&40965===e},n.prototype.exif_format_length=function(t){switch(t){case 1:case 2:case 6:case 7:return 1;case 3:case 8:return 2;case 4:case 9:case 11:return 4;case 5:case 10:case 12:return 8;default:return 0}},n.prototype.exif_format_read=function(t,e){var r;switch(t){case 1:case 2:return this.input[e];case 6:return(r=this.input[e])|33554430*(128&r);case 3:return this.read_uint16(e);case 8:return(r=this.read_uint16(e))|131070*(32768&r);case 4:return this.read_uint32(e);case 9:return 0|this.read_uint32(e);default:return null}},n.prototype.scan_ifd=function(t,n,i){var a=this.read_uint16(n);n+=2;for(var o=0;othis.input.length)throw e(\"unexpected EOF\",\"EBADDATA\");for(var d=[],m=f,g=0;g0&&(this.ifds_to_read.push({id:s,offset:d[0]}),p=!0),!1===i({is_big_endian:this.big_endian,ifd:t,tag:s,format:l,count:c,entry_offset:n+this.start,data_length:h,data_offset:f+this.start,value:d,is_subifd_link:p}))return void(this.aborted=!0);n+=12}0===t&&this.ifds_to_read.push({id:1,offset:this.read_uint32(n)})},t.exports.ExifParser=n,t.exports.get_orientation=function(t){var e=0;try{return new n(t,0,t.length).each((function(t){if(0===t.ifd&&274===t.tag&&Array.isArray(t.value))return e=t.value[0],!1})),e}catch(t){return-1}}},20186:function(t,e,r){\"use strict\";var n=r(3944).bc,i=r(3944).bb;function a(t,e){if(t.length<4+e)return null;var r=i(t,e);return t.length>4&15,i=15&t[4],a=t[5]>>4&15,o=n(t,6),l=8,c=0;ce.width||t.width===e.width&&t.height>e.height?t:e})),i=r.reduce((function(t,e){return t.height>e.height||t.height===e.height&&t.width>e.width?t:e})),n.width>i.height||n.width===i.height&&n.height>i.width?n:i),s=1;e.transforms.forEach((function(t){var e={1:6,2:5,3:8,4:7,5:4,6:3,7:2,8:1},r={1:4,2:3,3:2,4:1,5:6,6:5,7:8,8:7};if(\"imir\"===t.type&&(s=0===t.value?r[s]:e[s=e[s=r[s]]]),\"irot\"===t.type)for(var n=0;n1&&(f.variants=h.variants),h.orientation&&(f.orientation=h.orientation),h.exif_location&&h.exif_location.offset+h.exif_location.length<=t.length){var p=a(t,h.exif_location.offset),d=t.slice(h.exif_location.offset+p+4,h.exif_location.offset+h.exif_location.length),m=s.get_orientation(d);m>0&&(f.orientation=m)}return f}}}}}}},78218:function(t,e,r){\"use strict\";var n=r(3944).VG,i=r(3944).rU,a=r(3944).$l,o=n(\"BM\");t.exports=function(t){if(!(t.length<26)&&i(t,0,o))return{width:a(t,18),height:a(t,22),type:\"bmp\",mime:\"image/bmp\",wUnits:\"px\",hUnits:\"px\"}}},37495:function(t,e,r){\"use strict\";var n=r(3944).VG,i=r(3944).rU,a=r(3944).$l,o=n(\"GIF87a\"),s=n(\"GIF89a\");t.exports=function(t){if(!(t.length<10)&&(i(t,0,o)||i(t,0,s)))return{width:a(t,6),height:a(t,8),type:\"gif\",mime:\"image/gif\",wUnits:\"px\",hUnits:\"px\"}}},88708:function(t,e,r){\"use strict\";var n=r(3944).$l;t.exports=function(t){var e=n(t,0),r=n(t,2),i=n(t,4);if(0===e&&1===r&&i){for(var a=[],o={width:0,height:0},s=0;so.width||c>o.height)&&(o=u)}return{width:o.width,height:o.height,variants:a,type:\"ico\",mime:\"image/x-icon\",wUnits:\"px\",hUnits:\"px\"}}}},13827:function(t,e,r){\"use strict\";var n=r(3944).bc,i=r(3944).VG,a=r(3944).rU,o=r(19789),s=i(\"Exif\\0\\0\");t.exports=function(t){if(!(t.length<2)&&255===t[0]&&216===t[1]&&255===t[2])for(var e=2;;){for(;;){if(t.length-e<2)return;if(255===t[e++])break}for(var r,i,l=t[e++];255===l;)l=t[e++];if(208<=l&&l<=217||1===l)r=0;else{if(!(192<=l&&l<=254))return;if(t.length-e<2)return;r=n(t,e)-2,e+=2}if(217===l||218===l)return;if(225===l&&r>=10&&a(t,e,s)&&(i=o.get_orientation(t.slice(e+6,e+r))),r>=5&&192<=l&&l<=207&&196!==l&&200!==l&&204!==l){if(t.length-e0&&(c.orientation=i),c}e+=r}}},46594:function(t,e,r){\"use strict\";var n=r(3944).VG,i=r(3944).rU,a=r(3944).bb,o=n(\"‰PNG\\r\\n\u001a\\n\"),s=n(\"IHDR\");t.exports=function(t){if(!(t.length<24)&&i(t,0,o)&&i(t,12,s))return{width:a(t,16),height:a(t,20),type:\"png\",mime:\"image/png\",wUnits:\"px\",hUnits:\"px\"}}},13198:function(t,e,r){\"use strict\";var n=r(3944).VG,i=r(3944).rU,a=r(3944).bb,o=n(\"8BPS\\0\u0001\");t.exports=function(t){if(!(t.length<22)&&i(t,0,o))return{width:a(t,18),height:a(t,14),type:\"psd\",mime:\"image/vnd.adobe.photoshop\",wUnits:\"px\",hUnits:\"px\"}}},94203:function(t){\"use strict\";function e(t){return\"number\"==typeof t&&isFinite(t)&&t>0}var r=/<[-_.:a-zA-Z0-9][^>]*>/,n=/^<([-_.:a-zA-Z0-9]+:)?svg\\s/,i=/[^-]\\bwidth=\"([^%]+?)\"|[^-]\\bwidth='([^%]+?)'/,a=/\\bheight=\"([^%]+?)\"|\\bheight='([^%]+?)'/,o=/\\bview[bB]ox=\"(.+?)\"|\\bview[bB]ox='(.+?)'/,s=/in$|mm$|cm$|pt$|pc$|px$|em$|ex$/;function l(t){return s.test(t)?t.match(s)[0]:\"px\"}t.exports=function(t){if(function(t){var e,r=0,n=t.length;for(239===t[0]&&187===t[1]&&191===t[2]&&(r=3);r>14&16383),type:\"webp\",mime:\"image/webp\",wUnits:\"px\",hUnits:\"px\"}}}function f(t,e){return{width:1+(t[e+6]<<16|t[e+5]<<8|t[e+4]),height:1+(t[e+9]<t.length)){for(;e+8=10?r=r||u(t,e+8):\"VP8L\"===p&&d>=9?r=r||h(t,e+8):\"VP8X\"===p&&d>=10?r=r||f(t,e+8):\"EXIF\"===p&&(n=s.get_orientation(t.slice(e+8,e+8+d)),e=1/0),e+=8+d}else e++;if(r)return n>0&&(r.orientation=n),r}}}},43751:function(t,e,r){\"use strict\";t.exports={avif:r(31149),bmp:r(78218),gif:r(37495),ico:r(88708),jpeg:r(13827),png:r(46594),psd:r(13198),svg:r(94203),tiff:r(46966),webp:r(88023)}},19490:function(t,e,r){\"use strict\";var n=r(43751);t.exports=function(t){return function(t){for(var e=Object.keys(n),r=0;r1)for(var r=1;r1&&(t.scaleRatio=[t.scale[0]*t.viewport.width,t.scale[1]*t.viewport.height],r(t),t.after&&t.after(t))}function T(t){if(t){null!=t.length?\"number\"==typeof t[0]&&(t=[{positions:t}]):Array.isArray(t)||(t=[t]);var e=0,r=0;if(_.groups=x=t.map((function(t,c){var u=x[c];return t?(\"function\"==typeof t?t={after:t}:\"number\"==typeof t[0]&&(t={positions:t}),t=o(t,{color:\"color colors fill\",capSize:\"capSize cap capsize cap-size\",lineWidth:\"lineWidth line-width width line thickness\",opacity:\"opacity alpha\",range:\"range dataBox\",viewport:\"viewport viewBox\",errors:\"errors error\",positions:\"positions position data points\"}),u||(x[c]=u={id:c,scale:null,translate:null,scaleFract:null,translateFract:null,draw:!0},t=s({},v,t)),a(u,t,[{lineWidth:function(t){return.5*+t},capSize:function(t){return.5*+t},opacity:parseFloat,errors:function(t){return t=l(t),r+=t.length,t},positions:function(t,r){return t=l(t,\"float64\"),r.count=Math.floor(t.length/2),r.bounds=n(t,2),r.offset=e,e+=r.count,t}},{color:function(t,e){var r=e.count;if(t||(t=\"transparent\"),!Array.isArray(t)||\"number\"==typeof t[0]){var n=t;t=Array(r);for(var a=0;a 0. && baClipping < length(normalWidth * endBotJoin)) {\\n\\t\\t//handle miter clipping\\n\\t\\tbTopCoord -= normalWidth * endTopJoin;\\n\\t\\tbTopCoord += normalize(endTopJoin * normalWidth) * baClipping;\\n\\t}\\n\\n\\tif (nextReverse) {\\n\\t\\t//make join rectangular\\n\\t\\tvec2 miterShift = normalWidth * endJoinDirection * miterLimit * .5;\\n\\t\\tfloat normalAdjust = 1. - min(miterLimit / endMiterRatio, 1.);\\n\\t\\tbBotCoord = bCoord + miterShift - normalAdjust * normalWidth * currNormal * .5;\\n\\t\\tbTopCoord = bCoord + miterShift + normalAdjust * normalWidth * currNormal * .5;\\n\\t}\\n\\telse if (!prevReverse && abClipping > 0. && abClipping < length(normalWidth * startBotJoin)) {\\n\\t\\t//handle miter clipping\\n\\t\\taBotCoord -= normalWidth * startBotJoin;\\n\\t\\taBotCoord += normalize(startBotJoin * normalWidth) * abClipping;\\n\\t}\\n\\n\\tvec2 aTopPosition = (aTopCoord) * adjustedScale + translate;\\n\\tvec2 aBotPosition = (aBotCoord) * adjustedScale + translate;\\n\\n\\tvec2 bTopPosition = (bTopCoord) * adjustedScale + translate;\\n\\tvec2 bBotPosition = (bBotCoord) * adjustedScale + translate;\\n\\n\\t//position is normalized 0..1 coord on the screen\\n\\tvec2 position = (aTopPosition * lineTop + aBotPosition * lineBot) * lineStart + (bTopPosition * lineTop + bBotPosition * lineBot) * lineEnd;\\n\\n\\tstartCoord = aCoord * scaleRatio + translate * viewport.zw + viewport.xy;\\n\\tendCoord = bCoord * scaleRatio + translate * viewport.zw + viewport.xy;\\n\\n\\tgl_Position = vec4(position * 2.0 - 1.0, depth, 1);\\n\\n\\tenableStartMiter = step(dot(currTangent, prevTangent), .5);\\n\\tenableEndMiter = step(dot(currTangent, nextTangent), .5);\\n\\n\\t//bevel miter cutoffs\\n\\tif (miterMode == 1.) {\\n\\t\\tif (enableStartMiter == 1.) {\\n\\t\\t\\tvec2 startMiterWidth = vec2(startJoinDirection) * thickness * miterLimit * .5;\\n\\t\\t\\tstartCutoff = vec4(aCoord, aCoord);\\n\\t\\t\\tstartCutoff.zw += vec2(-startJoinDirection.y, startJoinDirection.x) / scaleRatio;\\n\\t\\t\\tstartCutoff = startCutoff * scaleRatio.xyxy + translate.xyxy * viewport.zwzw;\\n\\t\\t\\tstartCutoff += viewport.xyxy;\\n\\t\\t\\tstartCutoff += startMiterWidth.xyxy;\\n\\t\\t}\\n\\n\\t\\tif (enableEndMiter == 1.) {\\n\\t\\t\\tvec2 endMiterWidth = vec2(endJoinDirection) * thickness * miterLimit * .5;\\n\\t\\t\\tendCutoff = vec4(bCoord, bCoord);\\n\\t\\t\\tendCutoff.zw += vec2(-endJoinDirection.y, endJoinDirection.x) / scaleRatio;\\n\\t\\t\\tendCutoff = endCutoff * scaleRatio.xyxy + translate.xyxy * viewport.zwzw;\\n\\t\\t\\tendCutoff += viewport.xyxy;\\n\\t\\t\\tendCutoff += endMiterWidth.xyxy;\\n\\t\\t}\\n\\t}\\n\\n\\t//round miter cutoffs\\n\\telse if (miterMode == 2.) {\\n\\t\\tif (enableStartMiter == 1.) {\\n\\t\\t\\tvec2 startMiterWidth = vec2(startJoinDirection) * thickness * abs(dot(startJoinDirection, currNormal)) * .5;\\n\\t\\t\\tstartCutoff = vec4(aCoord, aCoord);\\n\\t\\t\\tstartCutoff.zw += vec2(-startJoinDirection.y, startJoinDirection.x) / scaleRatio;\\n\\t\\t\\tstartCutoff = startCutoff * scaleRatio.xyxy + translate.xyxy * viewport.zwzw;\\n\\t\\t\\tstartCutoff += viewport.xyxy;\\n\\t\\t\\tstartCutoff += startMiterWidth.xyxy;\\n\\t\\t}\\n\\n\\t\\tif (enableEndMiter == 1.) {\\n\\t\\t\\tvec2 endMiterWidth = vec2(endJoinDirection) * thickness * abs(dot(endJoinDirection, currNormal)) * .5;\\n\\t\\t\\tendCutoff = vec4(bCoord, bCoord);\\n\\t\\t\\tendCutoff.zw += vec2(-endJoinDirection.y, endJoinDirection.x) / scaleRatio;\\n\\t\\t\\tendCutoff = endCutoff * scaleRatio.xyxy + translate.xyxy * viewport.zwzw;\\n\\t\\t\\tendCutoff += viewport.xyxy;\\n\\t\\t\\tendCutoff += endMiterWidth.xyxy;\\n\\t\\t}\\n\\t}\\n}\\n\",frag:\"\\nprecision highp float;\\n\\nuniform float dashLength, pixelRatio, thickness, opacity, id, miterMode;\\nuniform sampler2D dashTexture;\\n\\nvarying vec4 fragColor;\\nvarying vec2 tangent;\\nvarying vec4 startCutoff, endCutoff;\\nvarying vec2 startCoord, endCoord;\\nvarying float enableStartMiter, enableEndMiter;\\n\\nfloat distToLine(vec2 p, vec2 a, vec2 b) {\\n\\tvec2 diff = b - a;\\n\\tvec2 perp = normalize(vec2(-diff.y, diff.x));\\n\\treturn dot(p - a, perp);\\n}\\n\\nvoid main() {\\n\\tfloat alpha = 1., distToStart, distToEnd;\\n\\tfloat cutoff = thickness * .5;\\n\\n\\t//bevel miter\\n\\tif (miterMode == 1.) {\\n\\t\\tif (enableStartMiter == 1.) {\\n\\t\\t\\tdistToStart = distToLine(gl_FragCoord.xy, startCutoff.xy, startCutoff.zw);\\n\\t\\t\\tif (distToStart < -1.) {\\n\\t\\t\\t\\tdiscard;\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\t\\t\\talpha *= min(max(distToStart + 1., 0.), 1.);\\n\\t\\t}\\n\\n\\t\\tif (enableEndMiter == 1.) {\\n\\t\\t\\tdistToEnd = distToLine(gl_FragCoord.xy, endCutoff.xy, endCutoff.zw);\\n\\t\\t\\tif (distToEnd < -1.) {\\n\\t\\t\\t\\tdiscard;\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\t\\t\\talpha *= min(max(distToEnd + 1., 0.), 1.);\\n\\t\\t}\\n\\t}\\n\\n\\t// round miter\\n\\telse if (miterMode == 2.) {\\n\\t\\tif (enableStartMiter == 1.) {\\n\\t\\t\\tdistToStart = distToLine(gl_FragCoord.xy, startCutoff.xy, startCutoff.zw);\\n\\t\\t\\tif (distToStart < 0.) {\\n\\t\\t\\t\\tfloat radius = length(gl_FragCoord.xy - startCoord);\\n\\n\\t\\t\\t\\tif(radius > cutoff + .5) {\\n\\t\\t\\t\\t\\tdiscard;\\n\\t\\t\\t\\t\\treturn;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\talpha -= smoothstep(cutoff - .5, cutoff + .5, radius);\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tif (enableEndMiter == 1.) {\\n\\t\\t\\tdistToEnd = distToLine(gl_FragCoord.xy, endCutoff.xy, endCutoff.zw);\\n\\t\\t\\tif (distToEnd < 0.) {\\n\\t\\t\\t\\tfloat radius = length(gl_FragCoord.xy - endCoord);\\n\\n\\t\\t\\t\\tif(radius > cutoff + .5) {\\n\\t\\t\\t\\t\\tdiscard;\\n\\t\\t\\t\\t\\treturn;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\talpha -= smoothstep(cutoff - .5, cutoff + .5, radius);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\tfloat t = fract(dot(tangent, gl_FragCoord.xy) / dashLength) * .5 + .25;\\n\\tfloat dash = texture2D(dashTexture, vec2(t, .5)).r;\\n\\n\\tgl_FragColor = fragColor;\\n\\tgl_FragColor.a *= alpha * opacity * dash;\\n}\\n\",attributes:{lineEnd:{buffer:r,divisor:0,stride:8,offset:0},lineTop:{buffer:r,divisor:0,stride:8,offset:4},aColor:{buffer:t.prop(\"colorBuffer\"),stride:4,offset:0,divisor:1},bColor:{buffer:t.prop(\"colorBuffer\"),stride:4,offset:4,divisor:1},prevCoord:{buffer:t.prop(\"positionBuffer\"),stride:8,offset:0,divisor:1},aCoord:{buffer:t.prop(\"positionBuffer\"),stride:8,offset:8,divisor:1},bCoord:{buffer:t.prop(\"positionBuffer\"),stride:8,offset:16,divisor:1},nextCoord:{buffer:t.prop(\"positionBuffer\"),stride:8,offset:24,divisor:1}}},n))}catch(t){e=i}return{fill:t({primitive:\"triangle\",elements:function(t,e){return e.triangles},offset:0,vert:\"\\nprecision highp float;\\n\\nattribute vec2 position, positionFract;\\n\\nuniform vec4 color;\\nuniform vec2 scale, scaleFract, translate, translateFract;\\nuniform float pixelRatio, id;\\nuniform vec4 viewport;\\nuniform float opacity;\\n\\nvarying vec4 fragColor;\\n\\nconst float MAX_LINES = 256.;\\n\\nvoid main() {\\n\\tfloat depth = (MAX_LINES - 4. - id) / (MAX_LINES);\\n\\n\\tvec2 position = position * scale + translate\\n + positionFract * scale + translateFract\\n + position * scaleFract\\n + positionFract * scaleFract;\\n\\n\\tgl_Position = vec4(position * 2.0 - 1.0, depth, 1);\\n\\n\\tfragColor = color / 255.;\\n\\tfragColor.a *= opacity;\\n}\\n\",frag:\"\\nprecision highp float;\\nvarying vec4 fragColor;\\n\\nvoid main() {\\n\\tgl_FragColor = fragColor;\\n}\\n\",uniforms:{scale:t.prop(\"scale\"),color:t.prop(\"fill\"),scaleFract:t.prop(\"scaleFract\"),translateFract:t.prop(\"translateFract\"),translate:t.prop(\"translate\"),opacity:t.prop(\"opacity\"),pixelRatio:t.context(\"pixelRatio\"),id:t.prop(\"id\"),viewport:function(t,e){return[e.viewport.x,e.viewport.y,t.viewportWidth,t.viewportHeight]}},attributes:{position:{buffer:t.prop(\"positionBuffer\"),stride:8,offset:8},positionFract:{buffer:t.prop(\"positionFractBuffer\"),stride:8,offset:8}},blend:n.blend,depth:{enable:!1},scissor:n.scissor,stencil:n.stencil,viewport:n.viewport}),rect:i,miter:e}},g.defaults={dashes:null,join:\"miter\",miterLimit:1,thickness:10,cap:\"square\",color:\"black\",opacity:1,overlay:!1,viewport:null,range:null,close:!1,fill:null},g.prototype.render=function(){for(var t,e=[],r=arguments.length;r--;)e[r]=arguments[r];e.length&&(t=this).update.apply(t,e),this.draw()},g.prototype.draw=function(){for(var t=this,e=[],r=arguments.length;r--;)e[r]=arguments[r];return(e.length?e:this.passes).forEach((function(e,r){var n;if(e&&Array.isArray(e))return(n=t).draw.apply(n,e);\"number\"==typeof e&&(e=t.passes[e]),e&&e.count>1&&e.opacity&&(t.regl._refresh(),e.fill&&e.triangles&&e.triangles.length>2&&t.shaders.fill(e),e.thickness&&(e.scale[0]*e.viewport.width>g.precisionThreshold||e.scale[1]*e.viewport.height>g.precisionThreshold||\"rect\"===e.join||!e.join&&(e.thickness<=2||e.count>=g.maxPoints)?t.shaders.rect(e):t.shaders.miter(e)))})),this},g.prototype.update=function(t){var e=this;if(t){null!=t.length?\"number\"==typeof t[0]&&(t=[{positions:t}]):Array.isArray(t)||(t=[t]);var r=this.regl,u=this.gl;if(t.forEach((function(t,p){var y=e.passes[p];if(void 0!==t)if(null!==t){if(\"number\"==typeof t[0]&&(t={positions:t}),t=o(t,{positions:\"positions points data coords\",thickness:\"thickness lineWidth lineWidths line-width linewidth width stroke-width strokewidth strokeWidth\",join:\"lineJoin linejoin join type mode\",miterLimit:\"miterlimit miterLimit\",dashes:\"dash dashes dasharray dash-array dashArray\",color:\"color colour stroke colors colours stroke-color strokeColor\",fill:\"fill fill-color fillColor\",opacity:\"alpha opacity\",overlay:\"overlay crease overlap intersect\",close:\"closed close closed-path closePath\",range:\"range dataBox\",viewport:\"viewport viewBox\",hole:\"holes hole hollow\",splitNull:\"splitNull\"}),y||(e.passes[p]=y={id:p,scale:null,scaleFract:null,translate:null,translateFract:null,count:0,hole:[],depth:0,dashLength:1,dashTexture:r.texture({channels:1,data:new Uint8Array([255]),width:1,height:1,mag:\"linear\",min:\"linear\"}),colorBuffer:r.buffer({usage:\"dynamic\",type:\"uint8\",data:new Uint8Array}),positionBuffer:r.buffer({usage:\"dynamic\",type:\"float\",data:new Uint8Array}),positionFractBuffer:r.buffer({usage:\"dynamic\",type:\"float\",data:new Uint8Array})},t=a({},g.defaults,t)),null!=t.thickness&&(y.thickness=parseFloat(t.thickness)),null!=t.opacity&&(y.opacity=parseFloat(t.opacity)),null!=t.miterLimit&&(y.miterLimit=parseFloat(t.miterLimit)),null!=t.overlay&&(y.overlay=!!t.overlay,p=D}));(P=P.slice(0,R)).push(D)}for(var F=function(t){var e=k.slice(2*O,2*P[t]).concat(D?k.slice(2*D):[]),r=(y.hole||[]).map((function(e){return e-D+(P[t]-O)})),n=l(e,r);n=n.map((function(e){return e+O+(e+Ot.length)&&(e=t.length);for(var r=0,n=new Array(e);r 1.0 + delta) {\\n\\t\\tdiscard;\\n\\t}\\n\\n\\talpha -= smoothstep(1.0 - delta, 1.0 + delta, radius);\\n\\n\\tfloat borderRadius = fragBorderRadius;\\n\\tfloat ratio = smoothstep(borderRadius - delta, borderRadius + delta, radius);\\n\\tvec4 color = mix(fragColor, fragBorderColor, ratio);\\n\\tcolor.a *= alpha * opacity;\\n\\tgl_FragColor = color;\\n}\\n\"]),l.vert=h([\"precision highp float;\\n#define GLSLIFY 1\\n\\nattribute float x, y, xFract, yFract;\\nattribute float size, borderSize;\\nattribute vec4 colorId, borderColorId;\\nattribute float isActive;\\n\\n// `invariant` effectively turns off optimizations for the position.\\n// We need this because -fast-math on M1 Macs is re-ordering\\n// floating point operations in a way that causes floating point\\n// precision limits to put points in the wrong locations.\\ninvariant gl_Position;\\n\\nuniform bool constPointSize;\\nuniform float pixelRatio;\\nuniform vec2 paletteSize, scale, scaleFract, translate, translateFract;\\nuniform sampler2D paletteTexture;\\n\\nconst float maxSize = 100.;\\n\\nvarying vec4 fragColor, fragBorderColor;\\nvarying float fragBorderRadius, fragWidth;\\n\\nfloat pointSizeScale = (constPointSize) ? 2. : pixelRatio;\\n\\nbool isDirect = (paletteSize.x < 1.);\\n\\nvec4 getColor(vec4 id) {\\n return isDirect ? id / 255. : texture2D(paletteTexture,\\n vec2(\\n (id.x + .5) / paletteSize.x,\\n (id.y + .5) / paletteSize.y\\n )\\n );\\n}\\n\\nvoid main() {\\n // ignore inactive points\\n if (isActive == 0.) return;\\n\\n vec2 position = vec2(x, y);\\n vec2 positionFract = vec2(xFract, yFract);\\n\\n vec4 color = getColor(colorId);\\n vec4 borderColor = getColor(borderColorId);\\n\\n float size = size * maxSize / 255.;\\n float borderSize = borderSize * maxSize / 255.;\\n\\n gl_PointSize = (size + borderSize) * pointSizeScale;\\n\\n vec2 pos = (position + translate) * scale\\n + (positionFract + translateFract) * scale\\n + (position + translate) * scaleFract\\n + (positionFract + translateFract) * scaleFract;\\n\\n gl_Position = vec4(pos * 2. - 1., 0., 1.);\\n\\n fragBorderRadius = 1. - 2. * borderSize / (size + borderSize);\\n fragColor = color;\\n fragBorderColor = borderColor.a == 0. || borderSize == 0. ? vec4(color.rgb, 0.) : borderColor;\\n fragWidth = 1. / gl_PointSize;\\n}\\n\"]),m&&(l.frag=l.frag.replace(\"smoothstep\",\"smoothStep\"),s.frag=s.frag.replace(\"smoothstep\",\"smoothStep\")),this.drawCircle=t(l)}x.defaults={color:\"black\",borderColor:\"transparent\",borderSize:0,size:12,opacity:1,marker:void 0,viewport:null,range:null,pixelSize:null,count:0,offset:0,bounds:null,positions:[],snap:1e4},x.prototype.render=function(){return arguments.length&&this.update.apply(this,arguments),this.draw(),this},x.prototype.draw=function(){for(var t=this,e=arguments.length,r=new Array(e),n=0;nn)?e.tree=c(t,{bounds:h}):n&&n.length&&(e.tree=n),e.tree){var f={primitive:\"points\",usage:\"static\",data:e.tree,type:\"uint32\"};e.elements?e.elements(f):e.elements=o.elements(f)}var p=g.float32(t);return i({data:p,usage:\"dynamic\"}),a({data:g.fract32(t,p),usage:\"dynamic\"}),l({data:new Uint8Array(u),type:\"uint8\",usage:\"stream\"}),t}},{marker:function(e,r,n){var i=r.activation;if(i.forEach((function(t){return t&&t.destroy&&t.destroy()})),i.length=0,e&&\"number\"!=typeof e[0]){for(var a=[],s=0,l=Math.min(e.length,r.count);s=0)return a;if(t instanceof Uint8Array||t instanceof Uint8ClampedArray)e=t;else{e=new Uint8Array(t.length);for(var o=0,s=t.length;o4*n&&(this.tooManyColors=!0),this.updatePalette(r),1===i.length?i[0]:i},x.prototype.updatePalette=function(t){if(!this.tooManyColors){var e=this.maxColors,r=this.paletteTexture,n=Math.ceil(.25*t.length/e);if(n>1)for(var i=.25*(t=t.slice()).length%e;i2?(s[0],s[2],n=s[1],i=s[3]):s.length?(n=s[0],i=s[1]):(s.x,n=s.y,s.x,s.width,i=s.y+s.height),l.length>2?(a=l[0],o=l[2],l[1],l[3]):l.length?(a=l[0],o=l[1]):(a=l.x,l.y,o=l.x+l.width,l.y,l.height),[a,n,o,i]}function p(t){if(\"number\"==typeof t)return[t,t,t,t];if(2===t.length)return[t[0],t[1],t[0],t[1]];var e=l(t);return[e.x,e.y,e.x+e.width,e.y+e.height]}t.exports=u,u.prototype.render=function(){for(var t,e=this,r=[],n=arguments.length;n--;)r[n]=arguments[n];return r.length&&(t=this).update.apply(t,r),this.regl.attributes.preserveDrawingBuffer?this.draw():(this.dirty?null==this.planned&&(this.planned=o((function(){e.draw(),e.dirty=!0,e.planned=null}))):(this.draw(),this.dirty=!0,o((function(){e.dirty=!1}))),this)},u.prototype.update=function(){for(var t,e=[],r=arguments.length;r--;)e[r]=arguments[r];if(e.length){for(var n=0;nk))&&(s.lower||!(T>>=e))<<3,(e|=r=(15<(t>>>=r))<<2)|(r=(3<(t>>>=r))<<1)|t>>>r>>1}function l(){function t(t){t:{for(var e=16;268435456>=e;e*=16)if(t<=e){t=e;break t}t=0}return 0<(e=r[s(t)>>2]).length?e.pop():new ArrayBuffer(t)}function e(t){r[s(t.byteLength)>>2].push(t)}var r=o(8,(function(){return[]}));return{alloc:t,free:e,allocType:function(e,r){var n=null;switch(e){case 5120:n=new Int8Array(t(r),0,r);break;case 5121:n=new Uint8Array(t(r),0,r);break;case 5122:n=new Int16Array(t(2*r),0,r);break;case 5123:n=new Uint16Array(t(2*r),0,r);break;case 5124:n=new Int32Array(t(4*r),0,r);break;case 5125:n=new Uint32Array(t(4*r),0,r);break;case 5126:n=new Float32Array(t(4*r),0,r);break;default:return null}return n.length!==r?n.subarray(0,r):n},freeType:function(t){e(t.buffer)}}}function c(t){return!!t&&\"object\"==typeof t&&Array.isArray(t.shape)&&Array.isArray(t.stride)&&\"number\"==typeof t.offset&&t.shape.length===t.stride.length&&(Array.isArray(t.data)||K(t.data))}function u(t,e,r,n,i,a){for(var o=0;o(i=s)&&(i=n.buffer.byteLength,5123===h?i>>=1:5125===h&&(i>>=2)),n.vertCount=i,i=o,0>o&&(i=4,1===(o=n.buffer.dimension)&&(i=0),2===o&&(i=1),3===o&&(i=4)),n.primType=i}function o(t){n.elementsCount--,delete s[t.id],t.buffer.destroy(),t.buffer=null}var s={},l=0,u={uint8:5121,uint16:5123};e.oes_element_index_uint&&(u.uint32=5125),i.prototype.bind=function(){this.buffer.bind()};var h=[];return{create:function(t,e){function s(t){if(t)if(\"number\"==typeof t)l(t),h.primType=4,h.vertCount=0|t,h.type=5121;else{var e=null,r=35044,n=-1,i=-1,o=0,f=0;Array.isArray(t)||K(t)||c(t)?e=t:(\"data\"in t&&(e=t.data),\"usage\"in t&&(r=nt[t.usage]),\"primitive\"in t&&(n=st[t.primitive]),\"count\"in t&&(i=0|t.count),\"type\"in t&&(f=u[t.type]),\"length\"in t?o=0|t.length:(o=i,5123===f||5122===f?o*=2:5125!==f&&5124!==f||(o*=4))),a(h,e,r,n,i,o,f)}else l(),h.primType=4,h.vertCount=0,h.type=5121;return s}var l=r.create(null,34963,!0),h=new i(l._buffer);return n.elementsCount++,s(t),s._reglType=\"elements\",s._elements=h,s.subdata=function(t,e){return l.subdata(t,e),s},s.destroy=function(){o(h)},s},createStream:function(t){var e=h.pop();return e||(e=new i(r.create(null,34963,!0,!1)._buffer)),a(e,t,35040,-1,-1,0,0),e},destroyStream:function(t){h.push(t)},getElements:function(t){return\"function\"==typeof t&&t._elements instanceof i?t._elements:null},clear:function(){Q(s).forEach(o)}}}function y(t){for(var e=$.allocType(5123,t.length),r=0;r>>31<<15,i=(a<<1>>>24)-127,a=a>>13&1023;e[r]=-24>i?n:-14>i?n+(a+1024>>-14-i):15>=i,r.height>>=i,p(r,n[i]),t.mipmask|=1<e;++e)t.images[e]=null;return t}function L(t){for(var e=t.images,r=0;re){for(var r=0;r=--this.refCount&&F(this)}}),o.profile&&(a.getTotalTextureSize=function(){var t=0;return Object.keys(ct).forEach((function(e){t+=ct[e].stats.size})),t}),{create2D:function(e,r){function n(t,e){var r=i.texInfo;I.call(r);var a=C();return\"number\"==typeof t?M(a,0|t,\"number\"==typeof e?0|e:0|t):t?(P(r,t),S(a,t)):M(a,1,1),r.genMipmaps&&(a.mipmask=(a.width<<1)-1),i.mipmask=a.mipmask,l(i,a),i.internalformat=a.internalformat,n.width=a.width,n.height=a.height,D(i),E(a,3553),z(r,3553),R(),L(a),o.profile&&(i.stats.size=A(i.internalformat,i.type,a.width,a.height,r.genMipmaps,!1)),n.format=X[i.internalformat],n.type=J[i.type],n.mag=rt[r.magFilter],n.min=nt[r.minFilter],n.wrapS=it[r.wrapS],n.wrapT=it[r.wrapT],n}var i=new O(3553);return ct[i.id]=i,a.textureCount++,n(e,r),n.subimage=function(t,e,r,a){e|=0,r|=0,a|=0;var o=m();return l(o,i),o.width=0,o.height=0,p(o,t),o.width=o.width||(i.width>>a)-e,o.height=o.height||(i.height>>a)-r,D(i),d(o,3553,e,r,a),R(),g(o),n},n.resize=function(e,r){var a=0|e,s=0|r||a;if(a===i.width&&s===i.height)return n;n.width=i.width=a,n.height=i.height=s,D(i);for(var l=0;i.mipmask>>l;++l){var c=a>>l,u=s>>l;if(!c||!u)break;t.texImage2D(3553,l,i.format,c,u,0,i.format,i.type,null)}return R(),o.profile&&(i.stats.size=A(i.internalformat,i.type,a,s,!1,!1)),n},n._reglType=\"texture2d\",n._texture=i,o.profile&&(n.stats=i.stats),n.destroy=function(){i.decRef()},n},createCube:function(e,r,n,i,s,c){function h(t,e,r,n,i,a){var s,c=f.texInfo;for(I.call(c),s=0;6>s;++s)y[s]=C();if(\"number\"!=typeof t&&t){if(\"object\"==typeof t)if(e)S(y[0],t),S(y[1],e),S(y[2],r),S(y[3],n),S(y[4],i),S(y[5],a);else if(P(c,t),u(f,t),\"faces\"in t)for(t=t.faces,s=0;6>s;++s)l(y[s],f),S(y[s],t[s]);else for(s=0;6>s;++s)S(y[s],t)}else for(t=0|t||1,s=0;6>s;++s)M(y[s],t,t);for(l(f,y[0]),f.mipmask=c.genMipmaps?(y[0].width<<1)-1:y[0].mipmask,f.internalformat=y[0].internalformat,h.width=y[0].width,h.height=y[0].height,D(f),s=0;6>s;++s)E(y[s],34069+s);for(z(c,34067),R(),o.profile&&(f.stats.size=A(f.internalformat,f.type,h.width,h.height,c.genMipmaps,!0)),h.format=X[f.internalformat],h.type=J[f.type],h.mag=rt[c.magFilter],h.min=nt[c.minFilter],h.wrapS=it[c.wrapS],h.wrapT=it[c.wrapT],s=0;6>s;++s)L(y[s]);return h}var f=new O(34067);ct[f.id]=f,a.cubeCount++;var y=Array(6);return h(e,r,n,i,s,c),h.subimage=function(t,e,r,n,i){r|=0,n|=0,i|=0;var a=m();return l(a,f),a.width=0,a.height=0,p(a,e),a.width=a.width||(f.width>>i)-r,a.height=a.height||(f.height>>i)-n,D(f),d(a,34069+t,r,n,i),R(),g(a),h},h.resize=function(e){if((e|=0)!==f.width){h.width=f.width=e,h.height=f.height=e,D(f);for(var r=0;6>r;++r)for(var n=0;f.mipmask>>n;++n)t.texImage2D(34069+r,n,f.format,e>>n,e>>n,0,f.format,f.type,null);return R(),o.profile&&(f.stats.size=A(f.internalformat,f.type,h.width,h.height,!1,!0)),h}},h._reglType=\"textureCube\",h._texture=f,o.profile&&(h.stats=f.stats),h.destroy=function(){f.decRef()},h},clear:function(){for(var e=0;er;++r)if(0!=(e.mipmask&1<>r,e.height>>r,0,e.internalformat,e.type,null);else for(var n=0;6>n;++n)t.texImage2D(34069+n,r,e.internalformat,e.width>>r,e.height>>r,0,e.internalformat,e.type,null);z(e.texInfo,e.target)}))},refresh:function(){for(var e=0;ei;++i){for(c=0;ct;++t)r[t].resize(n);return e.width=e.height=n,e},_reglType:\"framebufferCube\",destroy:function(){r.forEach((function(t){t.destroy()}))}})},clear:function(){Q(k).forEach(g)},restore:function(){x.cur=null,x.next=null,x.dirty=!0,Q(k).forEach((function(e){e.framebuffer=t.createFramebuffer(),y(e)}))}})}function E(){this.w=this.z=this.y=this.x=this.state=0,this.buffer=null,this.size=0,this.normalized=!1,this.type=5126,this.divisor=this.stride=this.offset=0}function C(t,e,r,n,i,a,o){function s(){this.id=++h,this.attributes=[],this.elements=null,this.ownsElements=!1,this.offset=this.count=0,this.instances=-1,this.primitive=4;var t=e.oes_vertex_array_object;this.vao=t?t.createVertexArrayOES():null,f[this.id]=this,this.buffers=[]}var l=r.maxAttributes,u=Array(l);for(r=0;r=f.byteLength?l.subdata(f):(l.destroy(),r.buffers[s]=null)),r.buffers[s]||(l=r.buffers[s]=i.create(u,34962,!1,!0)),h.buffer=i.getBuffer(l),h.size=0|h.buffer.dimension,h.normalized=!1,h.type=h.buffer.dtype,h.offset=0,h.stride=0,h.divisor=0,h.state=1,t[s]=1):i.getBuffer(u)?(h.buffer=i.getBuffer(u),h.size=0|h.buffer.dimension,h.normalized=!1,h.type=h.buffer.dtype,h.offset=0,h.stride=0,h.divisor=0,h.state=1):i.getBuffer(u.buffer)?(h.buffer=i.getBuffer(u.buffer),h.size=0|(+u.size||h.buffer.dimension),h.normalized=!!u.normalized||!1,h.type=\"type\"in u?rt[u.type]:h.buffer.dtype,h.offset=0|(u.offset||0),h.stride=0|(u.stride||0),h.divisor=0|(u.divisor||0),h.state=1):\"x\"in u&&(h.x=+u.x||0,h.y=+u.y||0,h.z=+u.z||0,h.w=+u.w||0,h.state=2)}for(l=0;lt&&(t=e.stats.uniformsCount)})),t},r.getMaxAttributesCount=function(){var t=0;return f.forEach((function(e){e.stats.attributesCount>t&&(t=e.stats.attributesCount)})),t}),{clear:function(){var e=t.deleteShader.bind(t);Q(c).forEach(e),c={},Q(u).forEach(e),u={},f.forEach((function(e){t.deleteProgram(e.program)})),f.length=0,h={},r.shaderCount=0},program:function(e,n,i,a){var o=h[n];o||(o=h[n]={});var p=o[e];if(p&&(p.refCount++,!a))return p;var d=new s(n,e);return r.shaderCount++,l(d,i,a),p||(o[e]=d),f.push(d),G(d,{destroy:function(){if(d.refCount--,0>=d.refCount){t.deleteProgram(d.program);var e=f.indexOf(d);f.splice(e,1),r.shaderCount--}0>=o[d.vertId].refCount&&(t.deleteShader(u[d.vertId]),delete u[d.vertId],delete h[d.fragId][d.vertId]),Object.keys(h[d.fragId]).length||(t.deleteShader(c[d.fragId]),delete c[d.fragId],delete h[d.fragId])}})},restore:function(){c={},u={};for(var t=0;t>>e|t<<32-e}function z(t,e){var r=(65535&t)+(65535&e);return(t>>16)+(e>>16)+(r>>16)<<16|65535&r}function O(t){return Array.prototype.slice.call(t)}function D(t){return O(t).join(\"\")}function R(t){function e(){var t=[],e=[];return G((function(){t.push.apply(t,O(arguments))}),{def:function(){var r=\"v\"+i++;return e.push(r),0>>4&15)+\"0123456789abcdef\".charAt(15&e);return r}(function(t){for(var e=Array(t.length>>2),r=0;r>5]|=(255&t.charCodeAt(r/8))<<24-r%32;var n,i,a,o,s,l,c,u,h,f,p,d=8*t.length;for(t=[1779033703,-1150833019,1013904242,-1521486534,1359893119,-1694144372,528734635,1541459225],r=Array(64),e[d>>5]|=128<<24-d%32,e[15+(d+64>>9<<4)]=d,u=0;uh;h++){var m;16>h?r[h]=e[h+u]:(f=h,p=z(p=P(p=r[h-2],17)^P(p,19)^p>>>10,r[h-7]),m=P(m=r[h-15],7)^P(m,18)^m>>>3,r[f]=z(z(p,m),r[h-16])),f=z(z(z(z(c,f=P(f=o,6)^P(f,11)^P(f,25)),o&s^~o&l),Mt[h]),r[h]),p=z(c=P(c=d,2)^P(c,13)^P(c,22),d&n^d&i^n&i),c=l,l=s,s=o,o=z(a,f),a=i,i=n,n=d,d=z(f,p)}t[0]=z(d,t[0]),t[1]=z(n,t[1]),t[2]=z(i,t[2]),t[3]=z(a,t[3]),t[4]=z(o,t[4]),t[5]=z(s,t[5]),t[6]=z(l,t[6]),t[7]=z(c,t[7])}for(e=\"\",r=0;r<32*t.length;r+=8)e+=String.fromCharCode(t[r>>5]>>>24-r%32&255);return e}(function(t){for(var e,r,n=\"\",i=-1;++i=e&&56320<=r&&57343>=r&&(e=65536+((1023&e)<<10)+(1023&r),i++),127>=e?n+=String.fromCharCode(e):2047>=e?n+=String.fromCharCode(192|e>>>6&31,128|63&e):65535>=e?n+=String.fromCharCode(224|e>>>12&15,128|e>>>6&63,128|63&e):2097151>=e&&(n+=String.fromCharCode(240|e>>>18&7,128|e>>>12&63,128|e>>>6&63,128|63&e));return n}(r))),n[e])?n[e].apply(null,o):(r=Function.apply(null,a.concat(r)),n&&(n[e]=r),r.apply(null,o))}}}function F(t){return Array.isArray(t)||K(t)||c(t)}function B(t){return t.sort((function(t,e){return\"viewport\"===t?-1:\"viewport\"===e?1:t\"+e+\"?\"+i+\".constant[\"+e+\"]:0;\"})).join(\"\"),\"}}else{\",\"if(\",s,\"(\",i,\".buffer)){\",u,\"=\",a,\".createStream(\",34962,\",\",i,\".buffer);\",\"}else{\",u,\"=\",a,\".getBuffer(\",i,\".buffer);\",\"}\",h,'=\"type\" in ',i,\"?\",o.glTypes,\"[\",i,\".type]:\",u,\".dtype;\",l.normalized,\"=!!\",i,\".normalized;\"),n(\"size\"),n(\"offset\"),n(\"stride\"),n(\"divisor\"),r(\"}}\"),r.exit(\"if(\",l.isStream,\"){\",a,\".destroyStream(\",u,\");\",\"}\"),l}))})),o}function M(t,e,n,i,a){function s(t){var e=c[t];e&&(f[t]=e)}var l=function(t,e){if(\"string\"==typeof(r=t.static).frag&&\"string\"==typeof r.vert){if(0>1)\",s],\");\")}function e(){r(l,\".drawArraysInstancedANGLE(\",[d,m,g,s],\");\")}p&&\"null\"!==p?v?t():(r(\"if(\",p,\"){\"),t(),r(\"}else{\"),e(),r(\"}\")):e()}function o(){function t(){r(u+\".drawElements(\"+[d,g,y,m+\"<<((\"+y+\"-5121)>>1)\"]+\");\")}function e(){r(u+\".drawArrays(\"+[d,m,g]+\");\")}p&&\"null\"!==p?v?t():(r(\"if(\",p,\"){\"),t(),r(\"}else{\"),e(),r(\"}\")):e()}var s,l,c=t.shared,u=c.gl,h=c.draw,f=n.draw,p=function(){var i=f.elements,a=e;return i?((i.contextDep&&n.contextDynamic||i.propDep)&&(a=r),i=i.append(t,a),f.elementsActive&&a(\"if(\"+i+\")\"+u+\".bindBuffer(34963,\"+i+\".buffer.buffer);\")):(i=a.def(),a(i,\"=\",h,\".\",\"elements\",\";\",\"if(\",i,\"){\",u,\".bindBuffer(\",34963,\",\",i,\".buffer.buffer);}\",\"else if(\",c.vao,\".currentVAO){\",i,\"=\",t.shared.elements+\".getElements(\"+c.vao,\".currentVAO.elements);\",et?\"\":\"if(\"+i+\")\"+u+\".bindBuffer(34963,\"+i+\".buffer.buffer);\",\"}\")),i}(),d=i(\"primitive\"),m=i(\"offset\"),g=function(){var i=f.count,a=e;return i?((i.contextDep&&n.contextDynamic||i.propDep)&&(a=r),i=i.append(t,a)):i=a.def(h,\".\",\"count\"),i}();if(\"number\"==typeof g){if(0===g)return}else r(\"if(\",g,\"){\"),r.exit(\"}\");Q&&(s=i(\"instances\"),l=t.instancing);var y=p+\".type\",v=f.elements&&j(f.elements)&&!f.vaoActive;Q&&(\"number\"!=typeof s||0<=s)?\"string\"==typeof s?(r(\"if(\",s,\">0){\"),a(),r(\"}else if(\",s,\"<0){\"),o(),r(\"}\")):a():o()}function q(t,e,r,n,i){return i=(e=b()).proc(\"body\",i),Q&&(e.instancing=i.def(e.shared.extensions,\".angle_instanced_arrays\")),t(e,i,r,n),e.compile().body}function H(t,e,r,n){I(t,e),r.useVAO?r.drawVAO?e(t.shared.vao,\".setVAO(\",r.drawVAO.append(t,e),\");\"):e(t.shared.vao,\".setVAO(\",t.shared.vao,\".targetVAO);\"):(e(t.shared.vao,\".setVAO(null);\"),z(t,e,r,n.attributes,(function(){return!0}))),O(t,e,r,n.uniforms,(function(){return!0}),!1),D(t,e,e,r)}function Z(t,e,r,n){function i(){return!0}t.batchId=\"a1\",I(t,e),z(t,e,r,n.attributes,i),O(t,e,r,n.uniforms,i,!1),D(t,e,e,r)}function Y(t,e,r,n){function i(t){return t.contextDep&&o||t.propDep}function a(t){return!i(t)}I(t,e);var o=r.contextDep,s=e.def(),l=e.def();t.shared.props=l,t.batchId=s;var c=t.scope(),u=t.scope();e(c.entry,\"for(\",s,\"=0;\",s,\"<\",\"a1\",\";++\",s,\"){\",l,\"=\",\"a0\",\"[\",s,\"];\",u,\"}\",c.exit),r.needsContext&&S(t,u,r.context),r.needsFramebuffer&&E(t,u,r.framebuffer),L(t,u,r.state,i),r.profile&&i(r.profile)&&P(t,u,r,!1,!0),n?(r.useVAO?r.drawVAO?i(r.drawVAO)?u(t.shared.vao,\".setVAO(\",r.drawVAO.append(t,u),\");\"):c(t.shared.vao,\".setVAO(\",r.drawVAO.append(t,c),\");\"):c(t.shared.vao,\".setVAO(\",t.shared.vao,\".targetVAO);\"):(c(t.shared.vao,\".setVAO(null);\"),z(t,c,r,n.attributes,a),z(t,u,r,n.attributes,i)),O(t,c,r,n.uniforms,a,!1),O(t,u,r,n.uniforms,i,!0),D(t,c,u,r)):(e=t.global.def(\"{}\"),n=r.shader.progVar.append(t,u),l=u.def(n,\".id\"),c=u.def(e,\"[\",l,\"]\"),u(t.shared.gl,\".useProgram(\",n,\".program);\",\"if(!\",c,\"){\",c,\"=\",e,\"[\",l,\"]=\",t.link((function(e){return q(Z,t,r,e,2)})),\"(\",n,\");}\",c,\".call(this,a0[\",s,\"],\",s,\");\"))}function X(t,r){function n(e){var n=r.shader[e];n&&(n=n.append(t,i),isNaN(n)?i.set(a.shader,\".\"+e,n):i.set(a.shader,\".\"+e,t.link(n,{stable:!0})))}var i=t.proc(\"scope\",3);t.batchId=\"a2\";var a=t.shared,o=a.current;if(S(t,i,r.context),r.framebuffer&&r.framebuffer.append(t,i),B(Object.keys(r.state)).forEach((function(e){var n=r.state[e],o=n.append(t,i);v(o)?o.forEach((function(r,n){isNaN(r)?i.set(t.next[e],\"[\"+n+\"]\",r):i.set(t.next[e],\"[\"+n+\"]\",t.link(r,{stable:!0}))})):j(n)?i.set(a.next,\".\"+e,t.link(o,{stable:!0})):i.set(a.next,\".\"+e,o)})),P(t,i,r,!0,!0),[\"elements\",\"offset\",\"count\",\"instances\",\"primitive\"].forEach((function(e){var n=r.draw[e];n&&(n=n.append(t,i),isNaN(n)?i.set(a.draw,\".\"+e,n):i.set(a.draw,\".\"+e,t.link(n),{stable:!0}))})),Object.keys(r.uniforms).forEach((function(n){var o=r.uniforms[n].append(t,i);Array.isArray(o)&&(o=\"[\"+o.map((function(e){return isNaN(e)?e:t.link(e,{stable:!0})}))+\"]\"),i.set(a.uniforms,\"[\"+t.link(e.id(n),{stable:!0})+\"]\",o)})),Object.keys(r.attributes).forEach((function(e){var n=r.attributes[e].append(t,i),a=t.scopeAttrib(e);Object.keys(new J).forEach((function(t){i.set(a,\".\"+t,n[t])}))})),r.scopeVAO){var s=r.scopeVAO.append(t,i);isNaN(s)?i.set(a.vao,\".targetVAO\",s):i.set(a.vao,\".targetVAO\",t.link(s,{stable:!0}))}n(\"vert\"),n(\"frag\"),0=--this.refCount&&o(this)},i.profile&&(n.getTotalRenderbufferSize=function(){var t=0;return Object.keys(u).forEach((function(e){t+=u[e].stats.size})),t}),{create:function(e,r){function o(e,r){var n=0,a=0,u=32854;if(\"object\"==typeof e&&e?(\"shape\"in e?(n=0|(a=e.shape)[0],a=0|a[1]):(\"radius\"in e&&(n=a=0|e.radius),\"width\"in e&&(n=0|e.width),\"height\"in e&&(a=0|e.height)),\"format\"in e&&(u=s[e.format])):\"number\"==typeof e?(n=0|e,a=\"number\"==typeof r?0|r:n):e||(n=a=1),n!==c.width||a!==c.height||u!==c.format)return o.width=c.width=n,o.height=c.height=a,c.format=u,t.bindRenderbuffer(36161,c.renderbuffer),t.renderbufferStorage(36161,u,n,a),i.profile&&(c.stats.size=wt[c.format]*c.width*c.height),o.format=l[c.format],o}var c=new a(t.createRenderbuffer());return u[c.id]=c,n.renderbufferCount++,o(e,r),o.resize=function(e,r){var n=0|e,a=0|r||n;return n===c.width&&a===c.height||(o.width=c.width=n,o.height=c.height=a,t.bindRenderbuffer(36161,c.renderbuffer),t.renderbufferStorage(36161,c.format,n,a),i.profile&&(c.stats.size=wt[c.format]*c.width*c.height)),o},o._reglType=\"renderbuffer\",o._renderbuffer=c,i.profile&&(o.stats=c.stats),o.destroy=function(){c.decRef()},o},clear:function(){Q(u).forEach(o)},restore:function(){Q(u).forEach((function(e){e.renderbuffer=t.createRenderbuffer(),t.bindRenderbuffer(36161,e.renderbuffer),t.renderbufferStorage(36161,e.format,e.width,e.height)})),t.bindRenderbuffer(36161,null)}}},kt=[];kt[6408]=4,kt[6407]=3;var At=[];At[5121]=1,At[5126]=4,At[36193]=2;var Mt=[1116352408,1899447441,-1245643825,-373957723,961987163,1508970993,-1841331548,-1424204075,-670586216,310598401,607225278,1426881987,1925078388,-2132889090,-1680079193,-1046744716,-459576895,-272742522,264347078,604807628,770255983,1249150122,1555081692,1996064986,-1740746414,-1473132947,-1341970488,-1084653625,-958395405,-710438585,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,-2117940946,-1838011259,-1564481375,-1474664885,-1035236496,-949202525,-778901479,-694614492,-200395387,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,-2067236844,-1933114872,-1866530822,-1538233109,-1090935817,-965641998],St=[\"x\",\"y\",\"z\",\"w\"],Et=\"blend.func blend.equation stencil.func stencil.opFront stencil.opBack sample.coverage viewport scissor.box polygonOffset.offset\".split(\" \"),Ct={0:0,1:1,zero:0,one:1,\"src color\":768,\"one minus src color\":769,\"src alpha\":770,\"one minus src alpha\":771,\"dst color\":774,\"one minus dst color\":775,\"dst alpha\":772,\"one minus dst alpha\":773,\"constant color\":32769,\"one minus constant color\":32770,\"constant alpha\":32771,\"one minus constant alpha\":32772,\"src alpha saturate\":776},Lt={never:512,less:513,\"<\":513,equal:514,\"=\":514,\"==\":514,\"===\":514,lequal:515,\"<=\":515,greater:516,\">\":516,notequal:517,\"!=\":517,\"!==\":517,gequal:518,\">=\":518,always:519},It={0:0,zero:0,keep:7680,replace:7681,increment:7682,decrement:7683,\"increment wrap\":34055,\"decrement wrap\":34056,invert:5386},Pt={cw:2304,ccw:2305},zt=new N(!1,!1,!1,(function(){}));return function(t){function e(){if(0===$.length)T&&T.update(),et=null;else{et=Y.next(e),h();for(var t=$.length-1;0<=t;--t){var r=$[t];r&&r(P,null,0)}d.flush(),T&&T.update()}}function r(){!et&&0<$.length&&(et=Y.next(e))}function n(){et&&(Y.cancel(e),et=null)}function i(t){t.preventDefault(),n(),K.forEach((function(t){t()}))}function o(t){d.getError(),v.restore(),F.restore(),O.restore(),B.restore(),N.restore(),j.restore(),R.restore(),T&&T.restore(),U.procs.refresh(),r(),Q.forEach((function(t){t()}))}function s(t){function e(t,e){var r={},n={};return Object.keys(t).forEach((function(i){var a=t[i];if(W.isDynamic(a))n[i]=W.unbox(a,i);else{if(e&&Array.isArray(a))for(var o=0;o=$.length&&n()}}}}function u(){var t=V.viewport,e=V.scissor_box;t[0]=t[1]=e[0]=e[1]=0,P.viewportWidth=P.framebufferWidth=P.drawingBufferWidth=t[2]=e[2]=d.drawingBufferWidth,P.viewportHeight=P.framebufferHeight=P.drawingBufferHeight=t[3]=e[3]=d.drawingBufferHeight}function h(){P.tick+=1,P.time=p(),u(),U.procs.poll()}function f(){B.refresh(),u(),U.procs.refresh(),T&&T.update()}function p(){return(X()-k)/1e3}if(!(t=a(t)))return null;var d=t.gl,y=d.getContextAttributes();d.isContextLost();var v=function(t,e){function r(e){var r;e=e.toLowerCase();try{r=n[e]=t.getExtension(e)}catch(t){}return!!r}for(var n={},i=0;ie;++e)rt(G({framebuffer:t.framebuffer.faces[e]},t),l);else rt(t,l);else l(0,t)},prop:W.define.bind(null,1),context:W.define.bind(null,2),this:W.define.bind(null,3),draw:s({}),buffer:function(t){return O.create(t,34962,!1,!1)},elements:function(t){return D.create(t,!1)},texture:B.create2D,cube:B.createCube,renderbuffer:N.create,framebuffer:j.create,framebufferCube:j.createCube,vao:R.createVAO,attributes:y,frame:c,on:function(t,e){var r;switch(t){case\"frame\":return c(e);case\"lost\":r=K;break;case\"restore\":r=Q;break;case\"destroy\":r=tt}return r.push(e),{cancel:function(){for(var t=0;t4294967295||l(e)!==e)throw new s(\"`length` must be a positive 32-bit integer\");var r=arguments.length>2&&!!arguments[2],n=!0,c=!0;if(\"length\"in t&&o){var u=o(t,\"length\");u&&!u.configurable&&(n=!1),u&&!u.writable&&(c=!1)}return(n||c||!r)&&(a?i(t,\"length\",e,!0,!0):i(t,\"length\",e)),t}},90386:function(t,e,r){t.exports=i;var n=r(7683).EventEmitter;function i(){n.call(this)}r(28062)(i,n),i.Readable=r(44639),i.Writable=r(84627),i.Duplex=r(71977),i.Transform=r(40255),i.PassThrough=r(28765),i.finished=r(37165),i.pipeline=r(6772),i.Stream=i,i.prototype.pipe=function(t,e){var r=this;function i(e){t.writable&&!1===t.write(e)&&r.pause&&r.pause()}function a(){r.readable&&r.resume&&r.resume()}r.on(\"data\",i),t.on(\"drain\",a),t._isStdio||e&&!1===e.end||(r.on(\"end\",s),r.on(\"close\",l));var o=!1;function s(){o||(o=!0,t.end())}function l(){o||(o=!0,\"function\"==typeof t.destroy&&t.destroy())}function c(t){if(u(),0===n.listenerCount(this,\"error\"))throw t}function u(){r.removeListener(\"data\",i),t.removeListener(\"drain\",a),r.removeListener(\"end\",s),r.removeListener(\"close\",l),r.removeListener(\"error\",c),t.removeListener(\"error\",c),r.removeListener(\"end\",u),r.removeListener(\"close\",u),t.removeListener(\"close\",u)}return r.on(\"error\",c),t.on(\"error\",c),r.on(\"end\",u),r.on(\"close\",u),t.on(\"close\",u),t.emit(\"pipe\",r),t}},44059:function(t){\"use strict\";var e={};function r(t,r,n){n||(n=Error);var i=function(t){var e,n;function i(e,n,i){return t.call(this,function(t,e,n){return\"string\"==typeof r?r:r(t,e,n)}(e,n,i))||this}return n=t,(e=i).prototype=Object.create(n.prototype),e.prototype.constructor=e,e.__proto__=n,i}(n);i.prototype.name=n.name,i.prototype.code=t,e[t]=i}function n(t,e){if(Array.isArray(t)){var r=t.length;return t=t.map((function(t){return String(t)})),r>2?\"one of \".concat(e,\" \").concat(t.slice(0,r-1).join(\", \"),\", or \")+t[r-1]:2===r?\"one of \".concat(e,\" \").concat(t[0],\" or \").concat(t[1]):\"of \".concat(e,\" \").concat(t[0])}return\"of \".concat(e,\" \").concat(String(t))}r(\"ERR_INVALID_OPT_VALUE\",(function(t,e){return'The value \"'+e+'\" is invalid for option \"'+t+'\"'}),TypeError),r(\"ERR_INVALID_ARG_TYPE\",(function(t,e,r){var i,a,o,s,l;if(\"string\"==typeof e&&(a=\"not \",e.substr(0,4)===a)?(i=\"must not be\",e=e.replace(/^not /,\"\")):i=\"must be\",function(t,e,r){return(void 0===r||r>t.length)&&(r=t.length),t.substring(r-9,r)===e}(t,\" argument\"))o=\"The \".concat(t,\" \").concat(i,\" \").concat(n(e,\"type\"));else{var c=(\"number\"!=typeof l&&(l=0),l+1>(s=t).length||-1===s.indexOf(\".\",l)?\"argument\":\"property\");o='The \"'.concat(t,'\" ').concat(c,\" \").concat(i,\" \").concat(n(e,\"type\"))}return o+\". Received type \".concat(typeof r)}),TypeError),r(\"ERR_STREAM_PUSH_AFTER_EOF\",\"stream.push() after EOF\"),r(\"ERR_METHOD_NOT_IMPLEMENTED\",(function(t){return\"The \"+t+\" method is not implemented\"})),r(\"ERR_STREAM_PREMATURE_CLOSE\",\"Premature close\"),r(\"ERR_STREAM_DESTROYED\",(function(t){return\"Cannot call \"+t+\" after a stream was destroyed\"})),r(\"ERR_MULTIPLE_CALLBACK\",\"Callback called multiple times\"),r(\"ERR_STREAM_CANNOT_PIPE\",\"Cannot pipe, not readable\"),r(\"ERR_STREAM_WRITE_AFTER_END\",\"write after end\"),r(\"ERR_STREAM_NULL_VALUES\",\"May not write null values to stream\",TypeError),r(\"ERR_UNKNOWN_ENCODING\",(function(t){return\"Unknown encoding: \"+t}),TypeError),r(\"ERR_STREAM_UNSHIFT_AFTER_END_EVENT\",\"stream.unshift() after end event\"),t.exports.F=e},71977:function(t,e,r){\"use strict\";var n=r(33282),i=Object.keys||function(t){var e=[];for(var r in t)e.push(r);return e};t.exports=u;var a=r(44639),o=r(84627);r(28062)(u,a);for(var s=i(o.prototype),l=0;l0)if(\"string\"==typeof e||s.objectMode||Object.getPrototypeOf(e)===l.prototype||(e=function(t){return l.from(t)}(e)),n)s.endEmitted?w(t,new b):S(t,s,e,!0);else if(s.ended)w(t,new x);else{if(s.destroyed)return!1;s.reading=!1,s.decoder&&!r?(e=s.decoder.write(e),s.objectMode||0!==e.length?S(t,s,e,!1):P(t,s)):S(t,s,e,!1)}else n||(s.reading=!1,P(t,s));return!s.ended&&(s.lengthe.highWaterMark&&(e.highWaterMark=function(t){return t>=E?t=E:(t--,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,t|=t>>>16,t++),t}(t)),t<=e.length?t:e.ended?e.length:(e.needReadable=!0,0))}function L(t){var e=t._readableState;a(\"emitReadable\",e.needReadable,e.emittedReadable),e.needReadable=!1,e.emittedReadable||(a(\"emitReadable\",e.flowing),e.emittedReadable=!0,i.nextTick(I,t))}function I(t){var e=t._readableState;a(\"emitReadable_\",e.destroyed,e.length,e.ended),e.destroyed||!e.length&&!e.ended||(t.emit(\"readable\"),e.emittedReadable=!1),e.needReadable=!e.flowing&&!e.ended&&e.length<=e.highWaterMark,F(t)}function P(t,e){e.readingMore||(e.readingMore=!0,i.nextTick(z,t,e))}function z(t,e){for(;!e.reading&&!e.ended&&(e.length0,e.resumeScheduled&&!e.paused?e.flowing=!0:t.listenerCount(\"data\")>0&&t.resume()}function D(t){a(\"readable nexttick read 0\"),t.read(0)}function R(t,e){a(\"resume\",e.reading),e.reading||t.read(0),e.resumeScheduled=!1,t.emit(\"resume\"),F(t),e.flowing&&!e.reading&&t.read(0)}function F(t){var e=t._readableState;for(a(\"flow\",e.flowing);e.flowing&&null!==t.read(););}function B(t,e){return 0===e.length?null:(e.objectMode?r=e.buffer.shift():!t||t>=e.length?(r=e.decoder?e.buffer.join(\"\"):1===e.buffer.length?e.buffer.first():e.buffer.concat(e.length),e.buffer.clear()):r=e.buffer.consume(t,e.decoder),r);var r}function N(t){var e=t._readableState;a(\"endReadable\",e.endEmitted),e.endEmitted||(e.ended=!0,i.nextTick(j,e,t))}function j(t,e){if(a(\"endReadableNT\",t.endEmitted,t.length),!t.endEmitted&&0===t.length&&(t.endEmitted=!0,e.readable=!1,e.emit(\"end\"),t.autoDestroy)){var r=e._writableState;(!r||r.autoDestroy&&r.finished)&&e.destroy()}}function U(t,e){for(var r=0,n=t.length;r=e.highWaterMark:e.length>0)||e.ended))return a(\"read: emitReadable\",e.length,e.ended),0===e.length&&e.ended?N(this):L(this),null;if(0===(t=C(t,e))&&e.ended)return 0===e.length&&N(this),null;var n,i=e.needReadable;return a(\"need readable\",i),(0===e.length||e.length-t0?B(t,e):null)?(e.needReadable=e.length<=e.highWaterMark,t=0):(e.length-=t,e.awaitDrain=0),0===e.length&&(e.ended||(e.needReadable=!0),r!==t&&e.ended&&N(this)),null!==n&&this.emit(\"data\",n),n},A.prototype._read=function(t){w(this,new _(\"_read()\"))},A.prototype.pipe=function(t,e){var r=this,n=this._readableState;switch(n.pipesCount){case 0:n.pipes=t;break;case 1:n.pipes=[n.pipes,t];break;default:n.pipes.push(t)}n.pipesCount+=1,a(\"pipe count=%d opts=%j\",n.pipesCount,e);var s=e&&!1===e.end||t===i.stdout||t===i.stderr?m:l;function l(){a(\"onend\"),t.end()}n.endEmitted?i.nextTick(s):r.once(\"end\",s),t.on(\"unpipe\",(function e(i,o){a(\"onunpipe\"),i===r&&o&&!1===o.hasUnpiped&&(o.hasUnpiped=!0,a(\"cleanup\"),t.removeListener(\"close\",p),t.removeListener(\"finish\",d),t.removeListener(\"drain\",c),t.removeListener(\"error\",f),t.removeListener(\"unpipe\",e),r.removeListener(\"end\",l),r.removeListener(\"end\",m),r.removeListener(\"data\",h),u=!0,!n.awaitDrain||t._writableState&&!t._writableState.needDrain||c())}));var c=function(t){return function(){var e=t._readableState;a(\"pipeOnDrain\",e.awaitDrain),e.awaitDrain&&e.awaitDrain--,0===e.awaitDrain&&o(t,\"data\")&&(e.flowing=!0,F(t))}}(r);t.on(\"drain\",c);var u=!1;function h(e){a(\"ondata\");var i=t.write(e);a(\"dest.write\",i),!1===i&&((1===n.pipesCount&&n.pipes===t||n.pipesCount>1&&-1!==U(n.pipes,t))&&!u&&(a(\"false write response, pause\",n.awaitDrain),n.awaitDrain++),r.pause())}function f(e){a(\"onerror\",e),m(),t.removeListener(\"error\",f),0===o(t,\"error\")&&w(t,e)}function p(){t.removeListener(\"finish\",d),m()}function d(){a(\"onfinish\"),t.removeListener(\"close\",p),m()}function m(){a(\"unpipe\"),r.unpipe(t)}return r.on(\"data\",h),function(t,e,r){if(\"function\"==typeof t.prependListener)return t.prependListener(e,r);t._events&&t._events[e]?Array.isArray(t._events[e])?t._events[e].unshift(r):t._events[e]=[r,t._events[e]]:t.on(e,r)}(t,\"error\",f),t.once(\"close\",p),t.once(\"finish\",d),t.emit(\"pipe\",r),n.flowing||(a(\"pipe resume\"),r.resume()),t},A.prototype.unpipe=function(t){var e=this._readableState,r={hasUnpiped:!1};if(0===e.pipesCount)return this;if(1===e.pipesCount)return t&&t!==e.pipes||(t||(t=e.pipes),e.pipes=null,e.pipesCount=0,e.flowing=!1,t&&t.emit(\"unpipe\",this,r)),this;if(!t){var n=e.pipes,i=e.pipesCount;e.pipes=null,e.pipesCount=0,e.flowing=!1;for(var a=0;a0,!1!==n.flowing&&this.resume()):\"readable\"===t&&(n.endEmitted||n.readableListening||(n.readableListening=n.needReadable=!0,n.flowing=!1,n.emittedReadable=!1,a(\"on readable\",n.length,n.reading),n.length?L(this):n.reading||i.nextTick(D,this))),r},A.prototype.addListener=A.prototype.on,A.prototype.removeListener=function(t,e){var r=s.prototype.removeListener.call(this,t,e);return\"readable\"===t&&i.nextTick(O,this),r},A.prototype.removeAllListeners=function(t){var e=s.prototype.removeAllListeners.apply(this,arguments);return\"readable\"!==t&&void 0!==t||i.nextTick(O,this),e},A.prototype.resume=function(){var t=this._readableState;return t.flowing||(a(\"resume\"),t.flowing=!t.readableListening,function(t,e){e.resumeScheduled||(e.resumeScheduled=!0,i.nextTick(R,t,e))}(this,t)),t.paused=!1,this},A.prototype.pause=function(){return a(\"call pause flowing=%j\",this._readableState.flowing),!1!==this._readableState.flowing&&(a(\"pause\"),this._readableState.flowing=!1,this.emit(\"pause\")),this._readableState.paused=!0,this},A.prototype.wrap=function(t){var e=this,r=this._readableState,n=!1;for(var i in t.on(\"end\",(function(){if(a(\"wrapped end\"),r.decoder&&!r.ended){var t=r.decoder.end();t&&t.length&&e.push(t)}e.push(null)})),t.on(\"data\",(function(i){a(\"wrapped data\"),r.decoder&&(i=r.decoder.write(i)),r.objectMode&&null==i||(r.objectMode||i&&i.length)&&(e.push(i)||(n=!0,t.pause()))})),t)void 0===this[i]&&\"function\"==typeof t[i]&&(this[i]=function(e){return function(){return t[e].apply(t,arguments)}}(i));for(var o=0;o-1))throw new b(t);return this._writableState.defaultEncoding=t,this},Object.defineProperty(A.prototype,\"writableBuffer\",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}}),Object.defineProperty(A.prototype,\"writableHighWaterMark\",{enumerable:!1,get:function(){return this._writableState.highWaterMark}}),A.prototype._write=function(t,e,r){r(new m(\"_write()\"))},A.prototype._writev=null,A.prototype.end=function(t,e,r){var n=this._writableState;return\"function\"==typeof t?(r=t,t=null,e=null):\"function\"==typeof e&&(r=e,e=null),null!=t&&this.write(t,e),n.corked&&(n.corked=1,this.uncork()),n.ending||function(t,e,r){e.ending=!0,I(t,e),r&&(e.finished?i.nextTick(r):t.once(\"finish\",r)),e.ended=!0,t.writable=!1}(this,n,r),this},Object.defineProperty(A.prototype,\"writableLength\",{enumerable:!1,get:function(){return this._writableState.length}}),Object.defineProperty(A.prototype,\"destroyed\",{enumerable:!1,get:function(){return void 0!==this._writableState&&this._writableState.destroyed},set:function(t){this._writableState&&(this._writableState.destroyed=t)}}),A.prototype.destroy=h.destroy,A.prototype._undestroy=h.undestroy,A.prototype._destroy=function(t,e){e(t)}},73726:function(t,e,r){\"use strict\";var n,i=r(33282);function a(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}var o=r(37165),s=Symbol(\"lastResolve\"),l=Symbol(\"lastReject\"),c=Symbol(\"error\"),u=Symbol(\"ended\"),h=Symbol(\"lastPromise\"),f=Symbol(\"handlePromise\"),p=Symbol(\"stream\");function d(t,e){return{value:t,done:e}}function m(t){var e=t[s];if(null!==e){var r=t[p].read();null!==r&&(t[h]=null,t[s]=null,t[l]=null,e(d(r,!1)))}}function g(t){i.nextTick(m,t)}var y=Object.getPrototypeOf((function(){})),v=Object.setPrototypeOf((a(n={get stream(){return this[p]},next:function(){var t=this,e=this[c];if(null!==e)return Promise.reject(e);if(this[u])return Promise.resolve(d(void 0,!0));if(this[p].destroyed)return new Promise((function(e,r){i.nextTick((function(){t[c]?r(t[c]):e(d(void 0,!0))}))}));var r,n=this[h];if(n)r=new Promise(function(t,e){return function(r,n){t.then((function(){e[u]?r(d(void 0,!0)):e[f](r,n)}),n)}}(n,this));else{var a=this[p].read();if(null!==a)return Promise.resolve(d(a,!1));r=new Promise(this[f])}return this[h]=r,r}},Symbol.asyncIterator,(function(){return this})),a(n,\"return\",(function(){var t=this;return new Promise((function(e,r){t[p].destroy(null,(function(t){t?r(t):e(d(void 0,!0))}))}))})),n),y);t.exports=function(t){var e,r=Object.create(v,(a(e={},p,{value:t,writable:!0}),a(e,s,{value:null,writable:!0}),a(e,l,{value:null,writable:!0}),a(e,c,{value:null,writable:!0}),a(e,u,{value:t._readableState.endEmitted,writable:!0}),a(e,f,{value:function(t,e){var n=r[p].read();n?(r[h]=null,r[s]=null,r[l]=null,t(d(n,!1))):(r[s]=t,r[l]=e)},writable:!0}),e));return r[h]=null,o(t,(function(t){if(t&&\"ERR_STREAM_PREMATURE_CLOSE\"!==t.code){var e=r[l];return null!==e&&(r[h]=null,r[s]=null,r[l]=null,e(t)),void(r[c]=t)}var n=r[s];null!==n&&(r[h]=null,r[s]=null,r[l]=null,n(d(void 0,!0))),r[u]=!0})),t.on(\"readable\",g.bind(null,r)),r}},29930:function(t,e,r){\"use strict\";function n(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}function i(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function a(t,e){for(var r=0;r0?this.tail.next=e:this.head=e,this.tail=e,++this.length}},{key:\"unshift\",value:function(t){var e={data:t,next:this.head};0===this.length&&(this.tail=e),this.head=e,++this.length}},{key:\"shift\",value:function(){if(0!==this.length){var t=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,t}}},{key:\"clear\",value:function(){this.head=this.tail=null,this.length=0}},{key:\"join\",value:function(t){if(0===this.length)return\"\";for(var e=this.head,r=\"\"+e.data;e=e.next;)r+=t+e.data;return r}},{key:\"concat\",value:function(t){if(0===this.length)return o.alloc(0);for(var e,r,n,i=o.allocUnsafe(t>>>0),a=this.head,s=0;a;)e=a.data,r=i,n=s,o.prototype.copy.call(e,r,n),s+=a.data.length,a=a.next;return i}},{key:\"consume\",value:function(t,e){var r;return ti.length?i.length:t;if(a===i.length?n+=i:n+=i.slice(0,t),0==(t-=a)){a===i.length?(++r,e.next?this.head=e.next:this.head=this.tail=null):(this.head=e,e.data=i.slice(a));break}++r}return this.length-=r,n}},{key:\"_getBuffer\",value:function(t){var e=o.allocUnsafe(t),r=this.head,n=1;for(r.data.copy(e),t-=r.data.length;r=r.next;){var i=r.data,a=t>i.length?i.length:t;if(i.copy(e,e.length-t,0,a),0==(t-=a)){a===i.length?(++n,r.next?this.head=r.next:this.head=this.tail=null):(this.head=r,r.data=i.slice(a));break}++n}return this.length-=n,e}},{key:l,value:function(t,e){return s(this,function(t){for(var e=1;e0,(function(t){u||(u=t),t&&f.forEach(l),a||(f.forEach(l),h(u))}))}));return e.reduce(c)}},31976:function(t,e,r){\"use strict\";var n=r(44059).F.ERR_INVALID_OPT_VALUE;t.exports={getHighWaterMark:function(t,e,r,i){var a=function(t,e,r){return null!=t.highWaterMark?t.highWaterMark:e?t[r]:null}(e,i,r);if(null!=a){if(!isFinite(a)||Math.floor(a)!==a||a<0)throw new n(i?r:\"highWaterMark\",a);return Math.floor(a)}return t.objectMode?16:16384}}},60032:function(t,e,r){t.exports=r(7683).EventEmitter},54304:function(t,e,r){\"use strict\";var n=r(41041).Buffer,i=n.isEncoding||function(t){switch((t=\"\"+t)&&t.toLowerCase()){case\"hex\":case\"utf8\":case\"utf-8\":case\"ascii\":case\"binary\":case\"base64\":case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":case\"raw\":return!0;default:return!1}};function a(t){var e;switch(this.encoding=function(t){var e=function(t){if(!t)return\"utf8\";for(var e;;)switch(t){case\"utf8\":case\"utf-8\":return\"utf8\";case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return\"utf16le\";case\"latin1\":case\"binary\":return\"latin1\";case\"base64\":case\"ascii\":case\"hex\":return t;default:if(e)return;t=(\"\"+t).toLowerCase(),e=!0}}(t);if(\"string\"!=typeof e&&(n.isEncoding===i||!i(t)))throw new Error(\"Unknown encoding: \"+t);return e||t}(t),this.encoding){case\"utf16le\":this.text=l,this.end=c,e=4;break;case\"utf8\":this.fillLast=s,e=4;break;case\"base64\":this.text=u,this.end=h,e=3;break;default:return this.write=f,void(this.end=p)}this.lastNeed=0,this.lastTotal=0,this.lastChar=n.allocUnsafe(e)}function o(t){return t<=127?0:t>>5==6?2:t>>4==14?3:t>>3==30?4:t>>6==2?-1:-2}function s(t){var e=this.lastTotal-this.lastNeed,r=function(t,e,r){if(128!=(192&e[0]))return t.lastNeed=0,\"�\";if(t.lastNeed>1&&e.length>1){if(128!=(192&e[1]))return t.lastNeed=1,\"�\";if(t.lastNeed>2&&e.length>2&&128!=(192&e[2]))return t.lastNeed=2,\"�\"}}(this,t);return void 0!==r?r:this.lastNeed<=t.length?(t.copy(this.lastChar,e,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal)):(t.copy(this.lastChar,e,0,t.length),void(this.lastNeed-=t.length))}function l(t,e){if((t.length-e)%2==0){var r=t.toString(\"utf16le\",e);if(r){var n=r.charCodeAt(r.length-1);if(n>=55296&&n<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1],r.slice(0,-1)}return r}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=t[t.length-1],t.toString(\"utf16le\",e,t.length-1)}function c(t){var e=t&&t.length?this.write(t):\"\";if(this.lastNeed){var r=this.lastTotal-this.lastNeed;return e+this.lastChar.toString(\"utf16le\",0,r)}return e}function u(t,e){var r=(t.length-e)%3;return 0===r?t.toString(\"base64\",e):(this.lastNeed=3-r,this.lastTotal=3,1===r?this.lastChar[0]=t[t.length-1]:(this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1]),t.toString(\"base64\",e,t.length-r))}function h(t){var e=t&&t.length?this.write(t):\"\";return this.lastNeed?e+this.lastChar.toString(\"base64\",0,3-this.lastNeed):e}function f(t){return t.toString(this.encoding)}function p(t){return t&&t.length?this.write(t):\"\"}e.I=a,a.prototype.write=function(t){if(0===t.length)return\"\";var e,r;if(this.lastNeed){if(void 0===(e=this.fillLast(t)))return\"\";r=this.lastNeed,this.lastNeed=0}else r=0;return r=0?(i>0&&(t.lastNeed=i-1),i):--n=0?(i>0&&(t.lastNeed=i-2),i):--n=0?(i>0&&(2===i?i=0:t.lastNeed=i-3),i):0}(this,t,e);if(!this.lastNeed)return t.toString(\"utf8\",e);this.lastTotal=r;var n=t.length-(r-this.lastNeed);return t.copy(this.lastChar,0,n),t.toString(\"utf8\",e,n)},a.prototype.fillLast=function(t){if(this.lastNeed<=t.length)return t.copy(this.lastChar,this.lastTotal-this.lastNeed,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);t.copy(this.lastChar,this.lastTotal-this.lastNeed,0,t.length),this.lastNeed-=t.length}},79743:function(t,e,r){var n=r(45708).Buffer,i=r(85672),a=r(79399)(\"stream-parser\");t.exports=function(t){var e=t&&\"function\"==typeof t._transform,r=t&&\"function\"==typeof t._write;if(!e&&!r)throw new Error(\"must pass a Writable or Transform stream in\");a(\"extending Parser into stream\"),t._bytes=h,t._skipBytes=f,e&&(t._passthrough=p),e?t._transform=m:t._write=d};var o=-1,s=0,l=1,c=2;function u(t){a(\"initializing parser stream\"),t._parserBytesLeft=0,t._parserBuffers=[],t._parserBuffered=0,t._parserState=o,t._parserCallback=null,\"function\"==typeof t.push&&(t._parserOutput=t.push.bind(t)),t._parserInit=!0}function h(t,e){i(!this._parserCallback,'there is already a \"callback\" set!'),i(isFinite(t)&&t>0,'can only buffer a finite number of bytes > 0, got \"'+t+'\"'),this._parserInit||u(this),a(\"buffering %o bytes\",t),this._parserBytesLeft=t,this._parserCallback=e,this._parserState=s}function f(t,e){i(!this._parserCallback,'there is already a \"callback\" set!'),i(t>0,'can only skip > 0 bytes, got \"'+t+'\"'),this._parserInit||u(this),a(\"skipping %o bytes\",t),this._parserBytesLeft=t,this._parserCallback=e,this._parserState=l}function p(t,e){i(!this._parserCallback,'There is already a \"callback\" set!'),i(t>0,'can only pass through > 0 bytes, got \"'+t+'\"'),this._parserInit||u(this),a(\"passing through %o bytes\",t),this._parserBytesLeft=t,this._parserCallback=e,this._parserState=c}function d(t,e,r){this._parserInit||u(this),a(\"write(%o bytes)\",t.length),\"function\"==typeof e&&(r=e),y(this,t,null,r)}function m(t,e,r){this._parserInit||u(this),a(\"transform(%o bytes)\",t.length),\"function\"!=typeof e&&(e=this._parserOutput),y(this,t,e,r)}function g(t,e,r,i){if(t._parserBytesLeft-=e.length,a(\"%o bytes left for stream piece\",t._parserBytesLeft),t._parserState===s?(t._parserBuffers.push(e),t._parserBuffered+=e.length):t._parserState===c&&r(e),0!==t._parserBytesLeft)return i;var l=t._parserCallback;if(l&&t._parserState===s&&t._parserBuffers.length>1&&(e=n.concat(t._parserBuffers,t._parserBuffered)),t._parserState!==s&&(e=null),t._parserCallback=null,t._parserBuffered=0,t._parserState=o,t._parserBuffers.splice(0),l){var u=[];e&&u.push(e),r&&u.push(r);var h=l.length>u.length;h&&u.push(v(i));var f=l.apply(t,u);if(!h||i===f)return i}}var y=v((function t(e,r,n,i){return e._parserBytesLeft<=0?i(new Error(\"got data but not currently parsing anything\")):r.length<=e._parserBytesLeft?function(){return g(e,r,n,i)}:function(){var a=r.slice(0,e._parserBytesLeft);return g(e,a,n,(function(o){return o?i(o):r.length>a.length?function(){return t(e,r.slice(a.length),n,i)}:void 0}))}}));function v(t){return function(){for(var e=t.apply(this,arguments);\"function\"==typeof e;)e=e();return e}}},79399:function(t,e,r){var n=r(33282);function i(){var t;try{t=e.storage.debug}catch(t){}return!t&&void 0!==n&&\"env\"in n&&(t=n.env.DEBUG),t}(e=t.exports=r(43228)).log=function(){return\"object\"==typeof console&&console.log&&Function.prototype.apply.call(console.log,console,arguments)},e.formatArgs=function(t){var r=this.useColors;if(t[0]=(r?\"%c\":\"\")+this.namespace+(r?\" %c\":\" \")+t[0]+(r?\"%c \":\" \")+\"+\"+e.humanize(this.diff),r){var n=\"color: \"+this.color;t.splice(1,0,n,\"color: inherit\");var i=0,a=0;t[0].replace(/%[a-zA-Z%]/g,(function(t){\"%%\"!==t&&(i++,\"%c\"===t&&(a=i))})),t.splice(a,0,n)}},e.save=function(t){try{null==t?e.storage.removeItem(\"debug\"):e.storage.debug=t}catch(t){}},e.load=i,e.useColors=function(){return!(\"undefined\"==typeof window||!window.process||\"renderer\"!==window.process.type)||(\"undefined\"!=typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||\"undefined\"!=typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||\"undefined\"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/)&&parseInt(RegExp.$1,10)>=31||\"undefined\"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/))},e.storage=\"undefined\"!=typeof chrome&&void 0!==chrome.storage?chrome.storage.local:function(){try{return window.localStorage}catch(t){}}(),e.colors=[\"lightseagreen\",\"forestgreen\",\"goldenrod\",\"dodgerblue\",\"darkorchid\",\"crimson\"],e.formatters.j=function(t){try{return JSON.stringify(t)}catch(t){return\"[UnexpectedJSONParseError]: \"+t.message}},e.enable(i())},43228:function(t,e,r){var n;function i(t){function r(){if(r.enabled){var t=r,i=+new Date,a=i-(n||i);t.diff=a,t.prev=n,t.curr=i,n=i;for(var o=new Array(arguments.length),s=0;s0)return function(t){if(!((t=String(t)).length>100)){var a=/^((?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(t);if(a){var o=parseFloat(a[1]);switch((a[2]||\"ms\").toLowerCase()){case\"years\":case\"year\":case\"yrs\":case\"yr\":case\"y\":return 315576e5*o;case\"days\":case\"day\":case\"d\":return o*i;case\"hours\":case\"hour\":case\"hrs\":case\"hr\":case\"h\":return o*n;case\"minutes\":case\"minute\":case\"mins\":case\"min\":case\"m\":return o*r;case\"seconds\":case\"second\":case\"secs\":case\"sec\":case\"s\":return o*e;case\"milliseconds\":case\"millisecond\":case\"msecs\":case\"msec\":case\"ms\":return o;default:return}}}}(t);if(\"number\"===l&&!1===isNaN(t))return o.long?a(s=t,i,\"day\")||a(s,n,\"hour\")||a(s,r,\"minute\")||a(s,e,\"second\")||s+\" ms\":function(t){return t>=i?Math.round(t/i)+\"d\":t>=n?Math.round(t/n)+\"h\":t>=r?Math.round(t/r)+\"m\":t>=e?Math.round(t/e)+\"s\":t+\"ms\"}(t);throw new Error(\"val is not a non-empty string or a valid number. val=\"+JSON.stringify(t))}},28089:function(t,e,r){\"use strict\";var n=r(59811);t.exports=function(t,e,r){if(null==t)throw Error(\"First argument should be a string\");if(null==e)throw Error(\"Separator should be a string or a RegExp\");r?(\"string\"==typeof r||Array.isArray(r))&&(r={ignore:r}):r={},null==r.escape&&(r.escape=!0),null==r.ignore?r.ignore=[\"[]\",\"()\",\"{}\",\"<>\",'\"\"',\"''\",\"``\",\"“”\",\"«»\"]:(\"string\"==typeof r.ignore&&(r.ignore=[r.ignore]),r.ignore=r.ignore.map((function(t){return 1===t.length&&(t+=t),t})));var i=n.parse(t,{flat:!0,brackets:r.ignore}),a=i[0].split(e);if(r.escape){for(var o=[],s=0;s0;){e=c[c.length-1];var p=t[e];if(a[e]=0&&s[e].push(o[m])}a[e]=d}else{if(n[e]===r[e]){var g=[],y=[],v=0;for(d=l.length-1;d>=0;--d){var x=l[d];if(i[x]=!1,g.push(x),y.push(s[x]),v+=s[x].length,o[x]=h.length,x===e){l.length=d;break}}h.push(g);var _=new Array(v);for(d=0;d1&&(i=1),i<-1&&(i=-1),(t*n-e*r<0?-1:1)*Math.acos(i)};e.default=function(t){var e=t.px,r=t.py,s=t.cx,l=t.cy,c=t.rx,u=t.ry,h=t.xAxisRotation,f=void 0===h?0:h,p=t.largeArcFlag,d=void 0===p?0:p,m=t.sweepFlag,g=void 0===m?0:m,y=[];if(0===c||0===u)return[];var v=Math.sin(f*n/360),x=Math.cos(f*n/360),_=x*(e-s)/2+v*(r-l)/2,b=-v*(e-s)/2+x*(r-l)/2;if(0===_&&0===b)return[];c=Math.abs(c),u=Math.abs(u);var w=Math.pow(_,2)/Math.pow(c,2)+Math.pow(b,2)/Math.pow(u,2);w>1&&(c*=Math.sqrt(w),u*=Math.sqrt(w));var T=function(t,e,r,i,a,s,l,c,u,h,f,p){var d=Math.pow(a,2),m=Math.pow(s,2),g=Math.pow(f,2),y=Math.pow(p,2),v=d*m-d*y-m*g;v<0&&(v=0),v/=d*y+m*g;var x=(v=Math.sqrt(v)*(l===c?-1:1))*a/s*p,_=v*-s/a*f,b=h*x-u*_+(t+r)/2,w=u*x+h*_+(e+i)/2,T=(f-x)/a,k=(p-_)/s,A=(-f-x)/a,M=(-p-_)/s,S=o(1,0,T,k),E=o(T,k,A,M);return 0===c&&E>0&&(E-=n),1===c&&E<0&&(E+=n),[b,w,S,E]}(e,r,s,l,c,u,d,g,v,x,_,b),k=function(t,e){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return function(t,e){var r=[],n=!0,i=!1,a=void 0;try{for(var o,s=t[Symbol.iterator]();!(n=(o=s.next()).done)&&(r.push(o.value),!e||r.length!==e);n=!0);}catch(t){i=!0,a=t}finally{try{!n&&s.return&&s.return()}finally{if(i)throw a}}return r}(t,e);throw new TypeError(\"Invalid attempt to destructure non-iterable instance\")}(T,4),A=k[0],M=k[1],S=k[2],E=k[3],C=Math.abs(E)/(n/4);Math.abs(1-C)<1e-7&&(C=1);var L=Math.max(Math.ceil(C),1);E/=L;for(var I=0;Ie[2]&&(e[2]=c[u+0]),c[u+1]>e[3]&&(e[3]=c[u+1]);return e}},41883:function(t,e,r){\"use strict\";t.exports=function(t){for(var e,r=[],o=0,s=0,l=0,c=0,u=null,h=null,f=0,p=0,d=0,m=t.length;d4?(o=g[g.length-4],s=g[g.length-3]):(o=f,s=p),r.push(g)}return r};var n=r(13193);function i(t,e,r,n){return[\"C\",t,e,r,n,r,n]}function a(t,e,r,n,i,a){return[\"C\",t/3+2/3*r,e/3+2/3*n,i/3+2/3*r,a/3+2/3*n,i,a]}},96021:function(t,e,r){\"use strict\";var n,i=r(97251),a=r(26953),o=r(95620),s=r(13986),l=r(88772),c=document.createElement(\"canvas\"),u=c.getContext(\"2d\");t.exports=function(t,e){if(!s(t))throw Error(\"Argument should be valid svg path string\");var r,h;e||(e={}),e.shape?(r=e.shape[0],h=e.shape[1]):(r=c.width=e.w||e.width||200,h=c.height=e.h||e.height||200);var f=Math.min(r,h),p=e.stroke||0,d=e.viewbox||e.viewBox||i(t),m=[r/(d[2]-d[0]),h/(d[3]-d[1])],g=Math.min(m[0]||0,m[1]||0)/2;if(u.fillStyle=\"black\",u.fillRect(0,0,r,h),u.fillStyle=\"white\",p&&(\"number\"!=typeof p&&(p=1),u.strokeStyle=p>0?\"white\":\"black\",u.lineWidth=Math.abs(p)),u.translate(.5*r,.5*h),u.scale(g,g),function(){if(null!=n)return n;var t=document.createElement(\"canvas\").getContext(\"2d\");if(t.canvas.width=t.canvas.height=1,!window.Path2D)return n=!1;var e=new Path2D(\"M0,0h1v1h-1v-1Z\");t.fillStyle=\"black\",t.fill(e);var r=t.getImageData(0,0,1,1);return n=r&&r.data&&255===r.data[3]}()){var y=new Path2D(t);u.fill(y),p&&u.stroke(y)}else{var v=a(t);o(u,v),u.fill(),p&&u.stroke()}return u.setTransform(1,0,0,1,0,0),l(u,{cutoff:null!=e.cutoff?e.cutoff:.5,radius:null!=e.radius?e.radius:.5*f})}},65657:function(t,e,r){var n;!function(i){var a=/^\\s+/,o=/\\s+$/,s=0,l=i.round,c=i.min,u=i.max,h=i.random;function f(t,e){if(e=e||{},(t=t||\"\")instanceof f)return t;if(!(this instanceof f))return new f(t,e);var r=function(t){var e,r,n,s={r:0,g:0,b:0},l=1,h=null,f=null,p=null,d=!1,m=!1;return\"string\"==typeof t&&(t=function(t){t=t.replace(a,\"\").replace(o,\"\").toLowerCase();var e,r=!1;if(L[t])t=L[t],r=!0;else if(\"transparent\"==t)return{r:0,g:0,b:0,a:0,format:\"name\"};return(e=q.rgb.exec(t))?{r:e[1],g:e[2],b:e[3]}:(e=q.rgba.exec(t))?{r:e[1],g:e[2],b:e[3],a:e[4]}:(e=q.hsl.exec(t))?{h:e[1],s:e[2],l:e[3]}:(e=q.hsla.exec(t))?{h:e[1],s:e[2],l:e[3],a:e[4]}:(e=q.hsv.exec(t))?{h:e[1],s:e[2],v:e[3]}:(e=q.hsva.exec(t))?{h:e[1],s:e[2],v:e[3],a:e[4]}:(e=q.hex8.exec(t))?{r:D(e[1]),g:D(e[2]),b:D(e[3]),a:N(e[4]),format:r?\"name\":\"hex8\"}:(e=q.hex6.exec(t))?{r:D(e[1]),g:D(e[2]),b:D(e[3]),format:r?\"name\":\"hex\"}:(e=q.hex4.exec(t))?{r:D(e[1]+\"\"+e[1]),g:D(e[2]+\"\"+e[2]),b:D(e[3]+\"\"+e[3]),a:N(e[4]+\"\"+e[4]),format:r?\"name\":\"hex8\"}:!!(e=q.hex3.exec(t))&&{r:D(e[1]+\"\"+e[1]),g:D(e[2]+\"\"+e[2]),b:D(e[3]+\"\"+e[3]),format:r?\"name\":\"hex\"}}(t)),\"object\"==typeof t&&(H(t.r)&&H(t.g)&&H(t.b)?(e=t.r,r=t.g,n=t.b,s={r:255*z(e,255),g:255*z(r,255),b:255*z(n,255)},d=!0,m=\"%\"===String(t.r).substr(-1)?\"prgb\":\"rgb\"):H(t.h)&&H(t.s)&&H(t.v)?(h=F(t.s),f=F(t.v),s=function(t,e,r){t=6*z(t,360),e=z(e,100),r=z(r,100);var n=i.floor(t),a=t-n,o=r*(1-e),s=r*(1-a*e),l=r*(1-(1-a)*e),c=n%6;return{r:255*[r,s,o,o,l,r][c],g:255*[l,r,r,s,o,o][c],b:255*[o,o,l,r,r,s][c]}}(t.h,h,f),d=!0,m=\"hsv\"):H(t.h)&&H(t.s)&&H(t.l)&&(h=F(t.s),p=F(t.l),s=function(t,e,r){var n,i,a;function o(t,e,r){return r<0&&(r+=1),r>1&&(r-=1),r<1/6?t+6*(e-t)*r:r<.5?e:r<2/3?t+(e-t)*(2/3-r)*6:t}if(t=z(t,360),e=z(e,100),r=z(r,100),0===e)n=i=a=r;else{var s=r<.5?r*(1+e):r+e-r*e,l=2*r-s;n=o(l,s,t+1/3),i=o(l,s,t),a=o(l,s,t-1/3)}return{r:255*n,g:255*i,b:255*a}}(t.h,h,p),d=!0,m=\"hsl\"),t.hasOwnProperty(\"a\")&&(l=t.a)),l=P(l),{ok:d,format:t.format||m,r:c(255,u(s.r,0)),g:c(255,u(s.g,0)),b:c(255,u(s.b,0)),a:l}}(t);this._originalInput=t,this._r=r.r,this._g=r.g,this._b=r.b,this._a=r.a,this._roundA=l(100*this._a)/100,this._format=e.format||r.format,this._gradientType=e.gradientType,this._r<1&&(this._r=l(this._r)),this._g<1&&(this._g=l(this._g)),this._b<1&&(this._b=l(this._b)),this._ok=r.ok,this._tc_id=s++}function p(t,e,r){t=z(t,255),e=z(e,255),r=z(r,255);var n,i,a=u(t,e,r),o=c(t,e,r),s=(a+o)/2;if(a==o)n=i=0;else{var l=a-o;switch(i=s>.5?l/(2-a-o):l/(a+o),a){case t:n=(e-r)/l+(e>1)+720)%360;--e;)n.h=(n.h+i)%360,a.push(f(n));return a}function C(t,e){e=e||6;for(var r=f(t).toHsv(),n=r.h,i=r.s,a=r.v,o=[],s=1/e;e--;)o.push(f({h:n,s:i,v:a})),a=(a+s)%1;return o}f.prototype={isDark:function(){return this.getBrightness()<128},isLight:function(){return!this.isDark()},isValid:function(){return this._ok},getOriginalInput:function(){return this._originalInput},getFormat:function(){return this._format},getAlpha:function(){return this._a},getBrightness:function(){var t=this.toRgb();return(299*t.r+587*t.g+114*t.b)/1e3},getLuminance:function(){var t,e,r,n=this.toRgb();return t=n.r/255,e=n.g/255,r=n.b/255,.2126*(t<=.03928?t/12.92:i.pow((t+.055)/1.055,2.4))+.7152*(e<=.03928?e/12.92:i.pow((e+.055)/1.055,2.4))+.0722*(r<=.03928?r/12.92:i.pow((r+.055)/1.055,2.4))},setAlpha:function(t){return this._a=P(t),this._roundA=l(100*this._a)/100,this},toHsv:function(){var t=d(this._r,this._g,this._b);return{h:360*t.h,s:t.s,v:t.v,a:this._a}},toHsvString:function(){var t=d(this._r,this._g,this._b),e=l(360*t.h),r=l(100*t.s),n=l(100*t.v);return 1==this._a?\"hsv(\"+e+\", \"+r+\"%, \"+n+\"%)\":\"hsva(\"+e+\", \"+r+\"%, \"+n+\"%, \"+this._roundA+\")\"},toHsl:function(){var t=p(this._r,this._g,this._b);return{h:360*t.h,s:t.s,l:t.l,a:this._a}},toHslString:function(){var t=p(this._r,this._g,this._b),e=l(360*t.h),r=l(100*t.s),n=l(100*t.l);return 1==this._a?\"hsl(\"+e+\", \"+r+\"%, \"+n+\"%)\":\"hsla(\"+e+\", \"+r+\"%, \"+n+\"%, \"+this._roundA+\")\"},toHex:function(t){return m(this._r,this._g,this._b,t)},toHexString:function(t){return\"#\"+this.toHex(t)},toHex8:function(t){return function(t,e,r,n,i){var a=[R(l(t).toString(16)),R(l(e).toString(16)),R(l(r).toString(16)),R(B(n))];return i&&a[0].charAt(0)==a[0].charAt(1)&&a[1].charAt(0)==a[1].charAt(1)&&a[2].charAt(0)==a[2].charAt(1)&&a[3].charAt(0)==a[3].charAt(1)?a[0].charAt(0)+a[1].charAt(0)+a[2].charAt(0)+a[3].charAt(0):a.join(\"\")}(this._r,this._g,this._b,this._a,t)},toHex8String:function(t){return\"#\"+this.toHex8(t)},toRgb:function(){return{r:l(this._r),g:l(this._g),b:l(this._b),a:this._a}},toRgbString:function(){return 1==this._a?\"rgb(\"+l(this._r)+\", \"+l(this._g)+\", \"+l(this._b)+\")\":\"rgba(\"+l(this._r)+\", \"+l(this._g)+\", \"+l(this._b)+\", \"+this._roundA+\")\"},toPercentageRgb:function(){return{r:l(100*z(this._r,255))+\"%\",g:l(100*z(this._g,255))+\"%\",b:l(100*z(this._b,255))+\"%\",a:this._a}},toPercentageRgbString:function(){return 1==this._a?\"rgb(\"+l(100*z(this._r,255))+\"%, \"+l(100*z(this._g,255))+\"%, \"+l(100*z(this._b,255))+\"%)\":\"rgba(\"+l(100*z(this._r,255))+\"%, \"+l(100*z(this._g,255))+\"%, \"+l(100*z(this._b,255))+\"%, \"+this._roundA+\")\"},toName:function(){return 0===this._a?\"transparent\":!(this._a<1)&&(I[m(this._r,this._g,this._b,!0)]||!1)},toFilter:function(t){var e=\"#\"+g(this._r,this._g,this._b,this._a),r=e,n=this._gradientType?\"GradientType = 1, \":\"\";if(t){var i=f(t);r=\"#\"+g(i._r,i._g,i._b,i._a)}return\"progid:DXImageTransform.Microsoft.gradient(\"+n+\"startColorstr=\"+e+\",endColorstr=\"+r+\")\"},toString:function(t){var e=!!t;t=t||this._format;var r=!1,n=this._a<1&&this._a>=0;return e||!n||\"hex\"!==t&&\"hex6\"!==t&&\"hex3\"!==t&&\"hex4\"!==t&&\"hex8\"!==t&&\"name\"!==t?(\"rgb\"===t&&(r=this.toRgbString()),\"prgb\"===t&&(r=this.toPercentageRgbString()),\"hex\"!==t&&\"hex6\"!==t||(r=this.toHexString()),\"hex3\"===t&&(r=this.toHexString(!0)),\"hex4\"===t&&(r=this.toHex8String(!0)),\"hex8\"===t&&(r=this.toHex8String()),\"name\"===t&&(r=this.toName()),\"hsl\"===t&&(r=this.toHslString()),\"hsv\"===t&&(r=this.toHsvString()),r||this.toHexString()):\"name\"===t&&0===this._a?this.toName():this.toRgbString()},clone:function(){return f(this.toString())},_applyModification:function(t,e){var r=t.apply(null,[this].concat([].slice.call(e)));return this._r=r._r,this._g=r._g,this._b=r._b,this.setAlpha(r._a),this},lighten:function(){return this._applyModification(_,arguments)},brighten:function(){return this._applyModification(b,arguments)},darken:function(){return this._applyModification(w,arguments)},desaturate:function(){return this._applyModification(y,arguments)},saturate:function(){return this._applyModification(v,arguments)},greyscale:function(){return this._applyModification(x,arguments)},spin:function(){return this._applyModification(T,arguments)},_applyCombination:function(t,e){return t.apply(null,[this].concat([].slice.call(e)))},analogous:function(){return this._applyCombination(E,arguments)},complement:function(){return this._applyCombination(k,arguments)},monochromatic:function(){return this._applyCombination(C,arguments)},splitcomplement:function(){return this._applyCombination(S,arguments)},triad:function(){return this._applyCombination(A,arguments)},tetrad:function(){return this._applyCombination(M,arguments)}},f.fromRatio=function(t,e){if(\"object\"==typeof t){var r={};for(var n in t)t.hasOwnProperty(n)&&(r[n]=\"a\"===n?t[n]:F(t[n]));t=r}return f(t,e)},f.equals=function(t,e){return!(!t||!e)&&f(t).toRgbString()==f(e).toRgbString()},f.random=function(){return f.fromRatio({r:h(),g:h(),b:h()})},f.mix=function(t,e,r){r=0===r?0:r||50;var n=f(t).toRgb(),i=f(e).toRgb(),a=r/100;return f({r:(i.r-n.r)*a+n.r,g:(i.g-n.g)*a+n.g,b:(i.b-n.b)*a+n.b,a:(i.a-n.a)*a+n.a})},f.readability=function(t,e){var r=f(t),n=f(e);return(i.max(r.getLuminance(),n.getLuminance())+.05)/(i.min(r.getLuminance(),n.getLuminance())+.05)},f.isReadable=function(t,e,r){var n,i,a,o,s,l=f.readability(t,e);switch(i=!1,(a=r,\"AA\"!==(o=((a=a||{level:\"AA\",size:\"small\"}).level||\"AA\").toUpperCase())&&\"AAA\"!==o&&(o=\"AA\"),\"small\"!==(s=(a.size||\"small\").toLowerCase())&&\"large\"!==s&&(s=\"small\"),n={level:o,size:s}).level+n.size){case\"AAsmall\":case\"AAAlarge\":i=l>=4.5;break;case\"AAlarge\":i=l>=3;break;case\"AAAsmall\":i=l>=7}return i},f.mostReadable=function(t,e,r){var n,i,a,o,s=null,l=0;i=(r=r||{}).includeFallbackColors,a=r.level,o=r.size;for(var c=0;cl&&(l=n,s=f(e[c]));return f.isReadable(t,s,{level:a,size:o})||!i?s:(r.includeFallbackColors=!1,f.mostReadable(t,[\"#fff\",\"#000\"],r))};var L=f.names={aliceblue:\"f0f8ff\",antiquewhite:\"faebd7\",aqua:\"0ff\",aquamarine:\"7fffd4\",azure:\"f0ffff\",beige:\"f5f5dc\",bisque:\"ffe4c4\",black:\"000\",blanchedalmond:\"ffebcd\",blue:\"00f\",blueviolet:\"8a2be2\",brown:\"a52a2a\",burlywood:\"deb887\",burntsienna:\"ea7e5d\",cadetblue:\"5f9ea0\",chartreuse:\"7fff00\",chocolate:\"d2691e\",coral:\"ff7f50\",cornflowerblue:\"6495ed\",cornsilk:\"fff8dc\",crimson:\"dc143c\",cyan:\"0ff\",darkblue:\"00008b\",darkcyan:\"008b8b\",darkgoldenrod:\"b8860b\",darkgray:\"a9a9a9\",darkgreen:\"006400\",darkgrey:\"a9a9a9\",darkkhaki:\"bdb76b\",darkmagenta:\"8b008b\",darkolivegreen:\"556b2f\",darkorange:\"ff8c00\",darkorchid:\"9932cc\",darkred:\"8b0000\",darksalmon:\"e9967a\",darkseagreen:\"8fbc8f\",darkslateblue:\"483d8b\",darkslategray:\"2f4f4f\",darkslategrey:\"2f4f4f\",darkturquoise:\"00ced1\",darkviolet:\"9400d3\",deeppink:\"ff1493\",deepskyblue:\"00bfff\",dimgray:\"696969\",dimgrey:\"696969\",dodgerblue:\"1e90ff\",firebrick:\"b22222\",floralwhite:\"fffaf0\",forestgreen:\"228b22\",fuchsia:\"f0f\",gainsboro:\"dcdcdc\",ghostwhite:\"f8f8ff\",gold:\"ffd700\",goldenrod:\"daa520\",gray:\"808080\",green:\"008000\",greenyellow:\"adff2f\",grey:\"808080\",honeydew:\"f0fff0\",hotpink:\"ff69b4\",indianred:\"cd5c5c\",indigo:\"4b0082\",ivory:\"fffff0\",khaki:\"f0e68c\",lavender:\"e6e6fa\",lavenderblush:\"fff0f5\",lawngreen:\"7cfc00\",lemonchiffon:\"fffacd\",lightblue:\"add8e6\",lightcoral:\"f08080\",lightcyan:\"e0ffff\",lightgoldenrodyellow:\"fafad2\",lightgray:\"d3d3d3\",lightgreen:\"90ee90\",lightgrey:\"d3d3d3\",lightpink:\"ffb6c1\",lightsalmon:\"ffa07a\",lightseagreen:\"20b2aa\",lightskyblue:\"87cefa\",lightslategray:\"789\",lightslategrey:\"789\",lightsteelblue:\"b0c4de\",lightyellow:\"ffffe0\",lime:\"0f0\",limegreen:\"32cd32\",linen:\"faf0e6\",magenta:\"f0f\",maroon:\"800000\",mediumaquamarine:\"66cdaa\",mediumblue:\"0000cd\",mediumorchid:\"ba55d3\",mediumpurple:\"9370db\",mediumseagreen:\"3cb371\",mediumslateblue:\"7b68ee\",mediumspringgreen:\"00fa9a\",mediumturquoise:\"48d1cc\",mediumvioletred:\"c71585\",midnightblue:\"191970\",mintcream:\"f5fffa\",mistyrose:\"ffe4e1\",moccasin:\"ffe4b5\",navajowhite:\"ffdead\",navy:\"000080\",oldlace:\"fdf5e6\",olive:\"808000\",olivedrab:\"6b8e23\",orange:\"ffa500\",orangered:\"ff4500\",orchid:\"da70d6\",palegoldenrod:\"eee8aa\",palegreen:\"98fb98\",paleturquoise:\"afeeee\",palevioletred:\"db7093\",papayawhip:\"ffefd5\",peachpuff:\"ffdab9\",peru:\"cd853f\",pink:\"ffc0cb\",plum:\"dda0dd\",powderblue:\"b0e0e6\",purple:\"800080\",rebeccapurple:\"663399\",red:\"f00\",rosybrown:\"bc8f8f\",royalblue:\"4169e1\",saddlebrown:\"8b4513\",salmon:\"fa8072\",sandybrown:\"f4a460\",seagreen:\"2e8b57\",seashell:\"fff5ee\",sienna:\"a0522d\",silver:\"c0c0c0\",skyblue:\"87ceeb\",slateblue:\"6a5acd\",slategray:\"708090\",slategrey:\"708090\",snow:\"fffafa\",springgreen:\"00ff7f\",steelblue:\"4682b4\",tan:\"d2b48c\",teal:\"008080\",thistle:\"d8bfd8\",tomato:\"ff6347\",turquoise:\"40e0d0\",violet:\"ee82ee\",wheat:\"f5deb3\",white:\"fff\",whitesmoke:\"f5f5f5\",yellow:\"ff0\",yellowgreen:\"9acd32\"},I=f.hexNames=function(t){var e={};for(var r in t)t.hasOwnProperty(r)&&(e[t[r]]=r);return e}(L);function P(t){return t=parseFloat(t),(isNaN(t)||t<0||t>1)&&(t=1),t}function z(t,e){(function(t){return\"string\"==typeof t&&-1!=t.indexOf(\".\")&&1===parseFloat(t)})(t)&&(t=\"100%\");var r=function(t){return\"string\"==typeof t&&-1!=t.indexOf(\"%\")}(t);return t=c(e,u(0,parseFloat(t))),r&&(t=parseInt(t*e,10)/100),i.abs(t-e)<1e-6?1:t%e/parseFloat(e)}function O(t){return c(1,u(0,t))}function D(t){return parseInt(t,16)}function R(t){return 1==t.length?\"0\"+t:\"\"+t}function F(t){return t<=1&&(t=100*t+\"%\"),t}function B(t){return i.round(255*parseFloat(t)).toString(16)}function N(t){return D(t)/255}var j,U,V,q=(U=\"[\\\\s|\\\\(]+(\"+(j=\"(?:[-\\\\+]?\\\\d*\\\\.\\\\d+%?)|(?:[-\\\\+]?\\\\d+%?)\")+\")[,|\\\\s]+(\"+j+\")[,|\\\\s]+(\"+j+\")\\\\s*\\\\)?\",V=\"[\\\\s|\\\\(]+(\"+j+\")[,|\\\\s]+(\"+j+\")[,|\\\\s]+(\"+j+\")[,|\\\\s]+(\"+j+\")\\\\s*\\\\)?\",{CSS_UNIT:new RegExp(j),rgb:new RegExp(\"rgb\"+U),rgba:new RegExp(\"rgba\"+V),hsl:new RegExp(\"hsl\"+U),hsla:new RegExp(\"hsla\"+V),hsv:new RegExp(\"hsv\"+U),hsva:new RegExp(\"hsva\"+V),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/});function H(t){return!!q.CSS_UNIT.exec(t)}t.exports?t.exports=f:void 0===(n=function(){return f}.call(e,r,e,t))||(t.exports=n)}(Math)},51498:function(t){\"use strict\";t.exports=r,t.exports.float32=t.exports.float=r,t.exports.fract32=t.exports.fract=function(t,e){if(t.length){if(t instanceof Float32Array)return new Float32Array(t.length);e instanceof Float32Array||(e=r(t));for(var n=0,i=e.length;n\":(e.length>100&&(e=e.slice(0,99)+\"…\"),e=e.replace(i,(function(t){switch(t){case\"\\n\":return\"\\\\n\";case\"\\r\":return\"\\\\r\";case\"\\u2028\":return\"\\\\u2028\";case\"\\u2029\":return\"\\\\u2029\";default:throw new Error(\"Unexpected character\")}})))}},76481:function(t,e,r){\"use strict\";var n=r(80299),i={object:!0,function:!0,undefined:!0};t.exports=function(t){return!!n(t)&&hasOwnProperty.call(i,typeof t)}},6887:function(t,e,r){\"use strict\";var n=r(99497),i=r(63461);t.exports=function(t){return i(t)?t:n(t,\"%v is not a plain function\",arguments[1])}},63461:function(t,e,r){\"use strict\";var n=r(64276),i=/^\\s*class[\\s{/}]/,a=Function.prototype.toString;t.exports=function(t){return!!n(t)&&!i.test(a.call(t))}},31350:function(t,e,r){\"use strict\";var n=r(76481);t.exports=function(t){if(!n(t))return!1;try{return!!t.constructor&&t.constructor.prototype===t}catch(t){return!1}}},58698:function(t,e,r){\"use strict\";var n=r(80299),i=r(76481),a=Object.prototype.toString;t.exports=function(t){if(!n(t))return null;if(i(t)){var e=t.toString;if(\"function\"!=typeof e)return null;if(e===a)return null}try{return\"\"+t}catch(t){return null}}},9557:function(t,e,r){\"use strict\";var n=r(99497),i=r(80299);t.exports=function(t){return i(t)?t:n(t,\"Cannot use %v\",arguments[1])}},80299:function(t){\"use strict\";t.exports=function(t){return null!=t}},66127:function(t,e,r){\"use strict\";var n=r(54689),i=r(49523),a=r(45708).Buffer;r.g.__TYPEDARRAY_POOL||(r.g.__TYPEDARRAY_POOL={UINT8:i([32,0]),UINT16:i([32,0]),UINT32:i([32,0]),BIGUINT64:i([32,0]),INT8:i([32,0]),INT16:i([32,0]),INT32:i([32,0]),BIGINT64:i([32,0]),FLOAT:i([32,0]),DOUBLE:i([32,0]),DATA:i([32,0]),UINT8C:i([32,0]),BUFFER:i([32,0])});var o=\"undefined\"!=typeof Uint8ClampedArray,s=\"undefined\"!=typeof BigUint64Array,l=\"undefined\"!=typeof BigInt64Array,c=r.g.__TYPEDARRAY_POOL;c.UINT8C||(c.UINT8C=i([32,0])),c.BIGUINT64||(c.BIGUINT64=i([32,0])),c.BIGINT64||(c.BIGINT64=i([32,0])),c.BUFFER||(c.BUFFER=i([32,0]));var u=c.DATA,h=c.BUFFER;function f(t){if(t){var e=t.length||t.byteLength,r=n.log2(e);u[r].push(t)}}function p(t){t=n.nextPow2(t);var e=n.log2(t),r=u[e];return r.length>0?r.pop():new ArrayBuffer(t)}function d(t){return new Uint8Array(p(t),0,t)}function m(t){return new Uint16Array(p(2*t),0,t)}function g(t){return new Uint32Array(p(4*t),0,t)}function y(t){return new Int8Array(p(t),0,t)}function v(t){return new Int16Array(p(2*t),0,t)}function x(t){return new Int32Array(p(4*t),0,t)}function _(t){return new Float32Array(p(4*t),0,t)}function b(t){return new Float64Array(p(8*t),0,t)}function w(t){return o?new Uint8ClampedArray(p(t),0,t):d(t)}function T(t){return s?new BigUint64Array(p(8*t),0,t):null}function k(t){return l?new BigInt64Array(p(8*t),0,t):null}function A(t){return new DataView(p(t),0,t)}function M(t){t=n.nextPow2(t);var e=n.log2(t),r=h[e];return r.length>0?r.pop():new a(t)}e.free=function(t){if(a.isBuffer(t))h[n.log2(t.length)].push(t);else{if(\"[object ArrayBuffer]\"!==Object.prototype.toString.call(t)&&(t=t.buffer),!t)return;var e=t.length||t.byteLength,r=0|n.log2(e);u[r].push(t)}},e.freeUint8=e.freeUint16=e.freeUint32=e.freeBigUint64=e.freeInt8=e.freeInt16=e.freeInt32=e.freeBigInt64=e.freeFloat32=e.freeFloat=e.freeFloat64=e.freeDouble=e.freeUint8Clamped=e.freeDataView=function(t){f(t.buffer)},e.freeArrayBuffer=f,e.freeBuffer=function(t){h[n.log2(t.length)].push(t)},e.malloc=function(t,e){if(void 0===e||\"arraybuffer\"===e)return p(t);switch(e){case\"uint8\":return d(t);case\"uint16\":return m(t);case\"uint32\":return g(t);case\"int8\":return y(t);case\"int16\":return v(t);case\"int32\":return x(t);case\"float\":case\"float32\":return _(t);case\"double\":case\"float64\":return b(t);case\"uint8_clamped\":return w(t);case\"bigint64\":return k(t);case\"biguint64\":return T(t);case\"buffer\":return M(t);case\"data\":case\"dataview\":return A(t);default:return null}return null},e.mallocArrayBuffer=p,e.mallocUint8=d,e.mallocUint16=m,e.mallocUint32=g,e.mallocInt8=y,e.mallocInt16=v,e.mallocInt32=x,e.mallocFloat32=e.mallocFloat=_,e.mallocFloat64=e.mallocDouble=b,e.mallocUint8Clamped=w,e.mallocBigUint64=T,e.mallocBigInt64=k,e.mallocDataView=A,e.mallocBuffer=M,e.clearCache=function(){for(var t=0;t<32;++t)c.UINT8[t].length=0,c.UINT16[t].length=0,c.UINT32[t].length=0,c.INT8[t].length=0,c.INT16[t].length=0,c.INT32[t].length=0,c.FLOAT[t].length=0,c.DOUBLE[t].length=0,c.BIGUINT64[t].length=0,c.BIGINT64[t].length=0,c.UINT8C[t].length=0,u[t].length=0,h[t].length=0}},80886:function(t){var e=/[\\'\\\"]/;t.exports=function(t){return t?(e.test(t.charAt(0))&&(t=t.substr(1)),e.test(t.charAt(t.length-1))&&(t=t.substr(0,t.length-1)),t):\"\"}},79788:function(t){\"use strict\";t.exports=function(t,e,r){Array.isArray(r)||(r=[].slice.call(arguments,2));for(var n=0,i=r.length;n=i)return t;switch(t){case\"%s\":return String(n[r++]);case\"%d\":return Number(n[r++]);case\"%j\":try{return JSON.stringify(n[r++])}catch(t){return\"[Circular]\"}default:return t}})),s=n[r];r=3&&(n.depth=arguments[2]),arguments.length>=4&&(n.colors=arguments[3]),g(r)?n.showHidden=r:r&&e._extend(n,r),_(n.showHidden)&&(n.showHidden=!1),_(n.depth)&&(n.depth=2),_(n.colors)&&(n.colors=!1),_(n.customInspect)&&(n.customInspect=!0),n.colors&&(n.stylize=u),f(n,t,n.depth)}function u(t,e){var r=c.styles[e];return r?\"\u001b[\"+c.colors[r][0]+\"m\"+t+\"\u001b[\"+c.colors[r][1]+\"m\":t}function h(t,e){return t}function f(t,r,n){if(t.customInspect&&r&&A(r.inspect)&&r.inspect!==e.inspect&&(!r.constructor||r.constructor.prototype!==r)){var i=r.inspect(n,t);return x(i)||(i=f(t,i,n)),i}var a=function(t,e){if(_(e))return t.stylize(\"undefined\",\"undefined\");if(x(e)){var r=\"'\"+JSON.stringify(e).replace(/^\"|\"$/g,\"\").replace(/'/g,\"\\\\'\").replace(/\\\\\"/g,'\"')+\"'\";return t.stylize(r,\"string\")}return v(e)?t.stylize(\"\"+e,\"number\"):g(e)?t.stylize(\"\"+e,\"boolean\"):y(e)?t.stylize(\"null\",\"null\"):void 0}(t,r);if(a)return a;var o=Object.keys(r),s=function(t){var e={};return t.forEach((function(t,r){e[t]=!0})),e}(o);if(t.showHidden&&(o=Object.getOwnPropertyNames(r)),k(r)&&(o.indexOf(\"message\")>=0||o.indexOf(\"description\")>=0))return p(r);if(0===o.length){if(A(r)){var l=r.name?\": \"+r.name:\"\";return t.stylize(\"[Function\"+l+\"]\",\"special\")}if(b(r))return t.stylize(RegExp.prototype.toString.call(r),\"regexp\");if(T(r))return t.stylize(Date.prototype.toString.call(r),\"date\");if(k(r))return p(r)}var c,u=\"\",h=!1,w=[\"{\",\"}\"];return m(r)&&(h=!0,w=[\"[\",\"]\"]),A(r)&&(u=\" [Function\"+(r.name?\": \"+r.name:\"\")+\"]\"),b(r)&&(u=\" \"+RegExp.prototype.toString.call(r)),T(r)&&(u=\" \"+Date.prototype.toUTCString.call(r)),k(r)&&(u=\" \"+p(r)),0!==o.length||h&&0!=r.length?n<0?b(r)?t.stylize(RegExp.prototype.toString.call(r),\"regexp\"):t.stylize(\"[Object]\",\"special\"):(t.seen.push(r),c=h?function(t,e,r,n,i){for(var a=[],o=0,s=e.length;o60?r[0]+(\"\"===e?\"\":e+\"\\n \")+\" \"+t.join(\",\\n \")+\" \"+r[1]:r[0]+e+\" \"+t.join(\", \")+\" \"+r[1]}(c,u,w)):w[0]+u+w[1]}function p(t){return\"[\"+Error.prototype.toString.call(t)+\"]\"}function d(t,e,r,n,i,a){var o,s,l;if((l=Object.getOwnPropertyDescriptor(e,i)||{value:e[i]}).get?s=l.set?t.stylize(\"[Getter/Setter]\",\"special\"):t.stylize(\"[Getter]\",\"special\"):l.set&&(s=t.stylize(\"[Setter]\",\"special\")),C(n,i)||(o=\"[\"+i+\"]\"),s||(t.seen.indexOf(l.value)<0?(s=y(r)?f(t,l.value,null):f(t,l.value,r-1)).indexOf(\"\\n\")>-1&&(s=a?s.split(\"\\n\").map((function(t){return\" \"+t})).join(\"\\n\").slice(2):\"\\n\"+s.split(\"\\n\").map((function(t){return\" \"+t})).join(\"\\n\")):s=t.stylize(\"[Circular]\",\"special\")),_(o)){if(a&&i.match(/^\\d+$/))return s;(o=JSON.stringify(\"\"+i)).match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)?(o=o.slice(1,-1),o=t.stylize(o,\"name\")):(o=o.replace(/'/g,\"\\\\'\").replace(/\\\\\"/g,'\"').replace(/(^\"|\"$)/g,\"'\"),o=t.stylize(o,\"string\"))}return o+\": \"+s}function m(t){return Array.isArray(t)}function g(t){return\"boolean\"==typeof t}function y(t){return null===t}function v(t){return\"number\"==typeof t}function x(t){return\"string\"==typeof t}function _(t){return void 0===t}function b(t){return w(t)&&\"[object RegExp]\"===M(t)}function w(t){return\"object\"==typeof t&&null!==t}function T(t){return w(t)&&\"[object Date]\"===M(t)}function k(t){return w(t)&&(\"[object Error]\"===M(t)||t instanceof Error)}function A(t){return\"function\"==typeof t}function M(t){return Object.prototype.toString.call(t)}function S(t){return t<10?\"0\"+t.toString(10):t.toString(10)}e.debuglog=function(t){if(t=t.toUpperCase(),!o[t])if(s.test(t)){var r=n.pid;o[t]=function(){var n=e.format.apply(e,arguments);console.error(\"%s %d: %s\",t,r,n)}}else o[t]=function(){};return o[t]},e.inspect=c,c.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},c.styles={special:\"cyan\",number:\"yellow\",boolean:\"yellow\",undefined:\"grey\",null:\"bold\",string:\"green\",date:\"magenta\",regexp:\"red\"},e.types=r(15724),e.isArray=m,e.isBoolean=g,e.isNull=y,e.isNullOrUndefined=function(t){return null==t},e.isNumber=v,e.isString=x,e.isSymbol=function(t){return\"symbol\"==typeof t},e.isUndefined=_,e.isRegExp=b,e.types.isRegExp=b,e.isObject=w,e.isDate=T,e.types.isDate=T,e.isError=k,e.types.isNativeError=k,e.isFunction=A,e.isPrimitive=function(t){return null===t||\"boolean\"==typeof t||\"number\"==typeof t||\"string\"==typeof t||\"symbol\"==typeof t||void 0===t},e.isBuffer=r(44123);var E=[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"];function C(t,e){return Object.prototype.hasOwnProperty.call(t,e)}e.log=function(){var t,r;console.log(\"%s - %s\",(r=[S((t=new Date).getHours()),S(t.getMinutes()),S(t.getSeconds())].join(\":\"),[t.getDate(),E[t.getMonth()],r].join(\" \")),e.format.apply(e,arguments))},e.inherits=r(28062),e._extend=function(t,e){if(!e||!w(e))return t;for(var r=Object.keys(e),n=r.length;n--;)t[r[n]]=e[r[n]];return t};var L=\"undefined\"!=typeof Symbol?Symbol(\"util.promisify.custom\"):void 0;function I(t,e){if(!t){var r=new Error(\"Promise was rejected with a falsy value\");r.reason=t,t=r}return e(t)}e.promisify=function(t){if(\"function\"!=typeof t)throw new TypeError('The \"original\" argument must be of type Function');if(L&&t[L]){var e;if(\"function\"!=typeof(e=t[L]))throw new TypeError('The \"util.promisify.custom\" argument must be of type Function');return Object.defineProperty(e,L,{value:e,enumerable:!1,writable:!1,configurable:!0}),e}function e(){for(var e,r,n=new Promise((function(t,n){e=t,r=n})),i=[],a=0;a-1?e:\"Object\"===e&&function(t){var e=!1;return n(m,(function(r,n){if(!e)try{r(t),e=f(n,1)}catch(t){}})),e}(t)}return s?function(t){var e=!1;return n(m,(function(r,n){if(!e)try{\"$\"+r(t)===n&&(e=f(n,1))}catch(t){}})),e}(t):null}},1401:function(t,e,r){var n=r(24453),i=r(27976),a=n.instance();function o(t){this.local=this.regionalOptions[t||\"\"]||this.regionalOptions[\"\"]}o.prototype=new n.baseCalendar,i(o.prototype,{name:\"Chinese\",jdEpoch:1721425.5,hasYearZero:!1,minMonth:0,firstMonth:0,minDay:1,regionalOptions:{\"\":{name:\"Chinese\",epochs:[\"BEC\",\"EC\"],monthNumbers:function(t,e){if(\"string\"==typeof t){var r=t.match(l);return r?r[0]:\"\"}var n=this._validateYear(t),i=t.month(),a=\"\"+this.toChineseMonth(n,i);return e&&a.length<2&&(a=\"0\"+a),this.isIntercalaryMonth(n,i)&&(a+=\"i\"),a},monthNames:function(t){if(\"string\"==typeof t){var e=t.match(c);return e?e[0]:\"\"}var r=this._validateYear(t),n=t.month(),i=[\"一月\",\"二月\",\"三月\",\"四月\",\"五月\",\"六月\",\"七月\",\"八月\",\"九月\",\"十月\",\"十一月\",\"十二月\"][this.toChineseMonth(r,n)-1];return this.isIntercalaryMonth(r,n)&&(i=\"闰\"+i),i},monthNamesShort:function(t){if(\"string\"==typeof t){var e=t.match(u);return e?e[0]:\"\"}var r=this._validateYear(t),n=t.month(),i=[\"一\",\"二\",\"三\",\"四\",\"五\",\"六\",\"七\",\"八\",\"九\",\"十\",\"十一\",\"十二\"][this.toChineseMonth(r,n)-1];return this.isIntercalaryMonth(r,n)&&(i=\"闰\"+i),i},parseMonth:function(t,e){t=this._validateYear(t);var r,n=parseInt(e);if(isNaN(n))\"闰\"===e[0]&&(r=!0,e=e.substring(1)),\"月\"===e[e.length-1]&&(e=e.substring(0,e.length-1)),n=1+[\"一\",\"二\",\"三\",\"四\",\"五\",\"六\",\"七\",\"八\",\"九\",\"十\",\"十一\",\"十二\"].indexOf(e);else{var i=e[e.length-1];r=\"i\"===i||\"I\"===i}return this.toMonthIndex(t,n,r)},dayNames:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],dayNamesShort:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],dayNamesMin:[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"],digits:null,dateFormat:\"yyyy/mm/dd\",firstDay:1,isRTL:!1}},_validateYear:function(t,e){if(t.year&&(t=t.year()),\"number\"!=typeof t||t<1888||t>2111)throw e.replace(/\\{0\\}/,this.local.name);return t},toMonthIndex:function(t,e,r){var i=this.intercalaryMonth(t);if(r&&e!==i||e<1||e>12)throw n.local.invalidMonth.replace(/\\{0\\}/,this.local.name);return i?!r&&e<=i?e-1:e:e-1},toChineseMonth:function(t,e){t.year&&(e=(t=t.year()).month());var r=this.intercalaryMonth(t);if(e<0||e>(r?12:11))throw n.local.invalidMonth.replace(/\\{0\\}/,this.local.name);return r?e>13},isIntercalaryMonth:function(t,e){t.year&&(e=(t=t.year()).month());var r=this.intercalaryMonth(t);return!!r&&r===e},leapYear:function(t){return 0!==this.intercalaryMonth(t)},weekOfYear:function(t,e,r){var i,o=this._validateYear(t,n.local.invalidyear),s=f[o-f[0]],l=s>>9&4095,c=s>>5&15,u=31&s;(i=a.newDate(l,c,u)).add(4-(i.dayOfWeek()||7),\"d\");var h=this.toJD(t,e,r)-i.toJD();return 1+Math.floor(h/7)},monthsInYear:function(t){return this.leapYear(t)?13:12},daysInMonth:function(t,e){t.year&&(e=t.month(),t=t.year()),t=this._validateYear(t);var r=h[t-h[0]];if(e>(r>>13?12:11))throw n.local.invalidMonth.replace(/\\{0\\}/,this.local.name);return r&1<<12-e?30:29},weekDay:function(t,e,r){return(this.dayOfWeek(t,e,r)||7)<6},toJD:function(t,e,r){var i=this._validate(t,s,r,n.local.invalidDate);t=this._validateYear(i.year()),e=i.month(),r=i.day();var o=this.isIntercalaryMonth(t,e),s=this.toChineseMonth(t,e),l=function(t,e,r,n,i){var a,o,s;if(\"object\"==typeof t)o=t,a=e||{};else{var l;if(!(\"number\"==typeof t&&t>=1888&&t<=2111))throw new Error(\"Lunar year outside range 1888-2111\");if(!(\"number\"==typeof e&&e>=1&&e<=12))throw new Error(\"Lunar month outside range 1 - 12\");if(!(\"number\"==typeof r&&r>=1&&r<=30))throw new Error(\"Lunar day outside range 1 - 30\");\"object\"==typeof n?(l=!1,a=n):(l=!!n,a={}),o={year:t,month:e,day:r,isIntercalary:l}}s=o.day-1;var c,u=h[o.year-h[0]],p=u>>13;c=p&&(o.month>p||o.isIntercalary)?o.month:o.month-1;for(var d=0;d>9&4095,(m>>5&15)-1,(31&m)+s);return a.year=g.getFullYear(),a.month=1+g.getMonth(),a.day=g.getDate(),a}(t,s,r,o);return a.toJD(l.year,l.month,l.day)},fromJD:function(t){var e=a.fromJD(t),r=function(t,e,r,n){var i,a;if(\"object\"==typeof t)i=t,a=e||{};else{if(!(\"number\"==typeof t&&t>=1888&&t<=2111))throw new Error(\"Solar year outside range 1888-2111\");if(!(\"number\"==typeof e&&e>=1&&e<=12))throw new Error(\"Solar month outside range 1 - 12\");if(!(\"number\"==typeof r&&r>=1&&r<=31))throw new Error(\"Solar day outside range 1 - 31\");i={year:t,month:e,day:r},a={}}var o=f[i.year-f[0]],s=i.year<<9|i.month<<5|i.day;a.year=s>=o?i.year:i.year-1,o=f[a.year-f[0]];var l,c=new Date(o>>9&4095,(o>>5&15)-1,31&o),u=new Date(i.year,i.month-1,i.day);l=Math.round((u-c)/864e5);var p,d=h[a.year-h[0]];for(p=0;p<13;p++){var m=d&1<<12-p?30:29;if(l>13;return!g||p=2&&n<=6},extraInfo:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);return{century:o[Math.floor((i.year()-1)/100)+1]||\"\"}},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);return t=i.year()+(i.year()<0?1:0),e=i.month(),(r=i.day())+(e>1?16:0)+(e>2?32*(e-2):0)+400*(t-1)+this.jdEpoch-1},fromJD:function(t){t=Math.floor(t+.5)-Math.floor(this.jdEpoch)-1;var e=Math.floor(t/400)+1;t-=400*(e-1),t+=t>15?16:0;var r=Math.floor(t/32)+1,n=t-32*(r-1)+1;return this.newDate(e<=0?e-1:e,r,n)}});var o={20:\"Fruitbat\",21:\"Anchovy\"};n.calendars.discworld=a},81133:function(t,e,r){var n=r(24453),i=r(27976);function a(t){this.local=this.regionalOptions[t||\"\"]||this.regionalOptions[\"\"]}a.prototype=new n.baseCalendar,i(a.prototype,{name:\"Ethiopian\",jdEpoch:1724220.5,daysPerMonth:[30,30,30,30,30,30,30,30,30,30,30,30,5],hasYearZero:!1,minMonth:1,firstMonth:1,minDay:1,regionalOptions:{\"\":{name:\"Ethiopian\",epochs:[\"BEE\",\"EE\"],monthNames:[\"Meskerem\",\"Tikemet\",\"Hidar\",\"Tahesas\",\"Tir\",\"Yekatit\",\"Megabit\",\"Miazia\",\"Genbot\",\"Sene\",\"Hamle\",\"Nehase\",\"Pagume\"],monthNamesShort:[\"Mes\",\"Tik\",\"Hid\",\"Tah\",\"Tir\",\"Yek\",\"Meg\",\"Mia\",\"Gen\",\"Sen\",\"Ham\",\"Neh\",\"Pag\"],dayNames:[\"Ehud\",\"Segno\",\"Maksegno\",\"Irob\",\"Hamus\",\"Arb\",\"Kidame\"],dayNamesShort:[\"Ehu\",\"Seg\",\"Mak\",\"Iro\",\"Ham\",\"Arb\",\"Kid\"],dayNamesMin:[\"Eh\",\"Se\",\"Ma\",\"Ir\",\"Ha\",\"Ar\",\"Ki\"],digits:null,dateFormat:\"dd/mm/yyyy\",firstDay:0,isRTL:!1}},leapYear:function(t){var e=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear);return(t=e.year()+(e.year()<0?1:0))%4==3||t%4==-1},monthsInYear:function(t){return this._validate(t,this.minMonth,this.minDay,n.local.invalidYear||n.regionalOptions[\"\"].invalidYear),13},weekOfYear:function(t,e,r){var n=this.newDate(t,e,r);return n.add(-n.dayOfWeek(),\"d\"),Math.floor((n.dayOfYear()-1)/7)+1},daysInMonth:function(t,e){var r=this._validate(t,e,this.minDay,n.local.invalidMonth);return this.daysPerMonth[r.month()-1]+(13===r.month()&&this.leapYear(r.year())?1:0)},weekDay:function(t,e,r){return(this.dayOfWeek(t,e,r)||7)<6},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);return(t=i.year())<0&&t++,i.day()+30*(i.month()-1)+365*(t-1)+Math.floor(t/4)+this.jdEpoch-1},fromJD:function(t){var e=Math.floor(t)+.5-this.jdEpoch,r=Math.floor((e-Math.floor((e+366)/1461))/365)+1;r<=0&&r--,e=Math.floor(t)+.5-this.newDate(r,1,1).toJD();var n=Math.floor(e/30)+1,i=e-30*(n-1)+1;return this.newDate(r,n,i)}}),n.calendars.ethiopian=a},78295:function(t,e,r){var n=r(24453),i=r(27976);function a(t){this.local=this.regionalOptions[t||\"\"]||this.regionalOptions[\"\"]}function o(t,e){return t-e*Math.floor(t/e)}a.prototype=new n.baseCalendar,i(a.prototype,{name:\"Hebrew\",jdEpoch:347995.5,daysPerMonth:[30,29,30,29,30,29,30,29,30,29,30,29,29],hasYearZero:!1,minMonth:1,firstMonth:7,minDay:1,regionalOptions:{\"\":{name:\"Hebrew\",epochs:[\"BAM\",\"AM\"],monthNames:[\"Nisan\",\"Iyar\",\"Sivan\",\"Tammuz\",\"Av\",\"Elul\",\"Tishrei\",\"Cheshvan\",\"Kislev\",\"Tevet\",\"Shevat\",\"Adar\",\"Adar II\"],monthNamesShort:[\"Nis\",\"Iya\",\"Siv\",\"Tam\",\"Av\",\"Elu\",\"Tis\",\"Che\",\"Kis\",\"Tev\",\"She\",\"Ada\",\"Ad2\"],dayNames:[\"Yom Rishon\",\"Yom Sheni\",\"Yom Shlishi\",\"Yom Revi'i\",\"Yom Chamishi\",\"Yom Shishi\",\"Yom Shabbat\"],dayNamesShort:[\"Ris\",\"She\",\"Shl\",\"Rev\",\"Cha\",\"Shi\",\"Sha\"],dayNamesMin:[\"Ri\",\"She\",\"Shl\",\"Re\",\"Ch\",\"Shi\",\"Sha\"],digits:null,dateFormat:\"dd/mm/yyyy\",firstDay:0,isRTL:!1}},leapYear:function(t){var e=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear);return this._leapYear(e.year())},_leapYear:function(t){return o(7*(t=t<0?t+1:t)+1,19)<7},monthsInYear:function(t){return this._validate(t,this.minMonth,this.minDay,n.local.invalidYear),this._leapYear(t.year?t.year():t)?13:12},weekOfYear:function(t,e,r){var n=this.newDate(t,e,r);return n.add(-n.dayOfWeek(),\"d\"),Math.floor((n.dayOfYear()-1)/7)+1},daysInYear:function(t){return t=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear).year(),this.toJD(-1===t?1:t+1,7,1)-this.toJD(t,7,1)},daysInMonth:function(t,e){return t.year&&(e=t.month(),t=t.year()),this._validate(t,e,this.minDay,n.local.invalidMonth),12===e&&this.leapYear(t)||8===e&&5===o(this.daysInYear(t),10)?30:9===e&&3===o(this.daysInYear(t),10)?29:this.daysPerMonth[e-1]},weekDay:function(t,e,r){return 6!==this.dayOfWeek(t,e,r)},extraInfo:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);return{yearType:(this.leapYear(i)?\"embolismic\":\"common\")+\" \"+[\"deficient\",\"regular\",\"complete\"][this.daysInYear(i)%10-3]}},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);t=i.year(),e=i.month(),r=i.day();var a=t<=0?t+1:t,o=this.jdEpoch+this._delay1(a)+this._delay2(a)+r+1;if(e<7){for(var s=7;s<=this.monthsInYear(t);s++)o+=this.daysInMonth(t,s);for(s=1;s=this.toJD(-1===e?1:e+1,7,1);)e++;for(var r=tthis.toJD(e,r,this.daysInMonth(e,r));)r++;var n=t-this.toJD(e,r,1)+1;return this.newDate(e,r,n)}}),n.calendars.hebrew=a},25512:function(t,e,r){var n=r(24453),i=r(27976);function a(t){this.local=this.regionalOptions[t||\"\"]||this.regionalOptions[\"\"]}a.prototype=new n.baseCalendar,i(a.prototype,{name:\"Islamic\",jdEpoch:1948439.5,daysPerMonth:[30,29,30,29,30,29,30,29,30,29,30,29],hasYearZero:!1,minMonth:1,firstMonth:1,minDay:1,regionalOptions:{\"\":{name:\"Islamic\",epochs:[\"BH\",\"AH\"],monthNames:[\"Muharram\",\"Safar\",\"Rabi' al-awwal\",\"Rabi' al-thani\",\"Jumada al-awwal\",\"Jumada al-thani\",\"Rajab\",\"Sha'aban\",\"Ramadan\",\"Shawwal\",\"Dhu al-Qi'dah\",\"Dhu al-Hijjah\"],monthNamesShort:[\"Muh\",\"Saf\",\"Rab1\",\"Rab2\",\"Jum1\",\"Jum2\",\"Raj\",\"Sha'\",\"Ram\",\"Shaw\",\"DhuQ\",\"DhuH\"],dayNames:[\"Yawm al-ahad\",\"Yawm al-ithnayn\",\"Yawm ath-thulaathaa'\",\"Yawm al-arbi'aa'\",\"Yawm al-khamīs\",\"Yawm al-jum'a\",\"Yawm as-sabt\"],dayNamesShort:[\"Aha\",\"Ith\",\"Thu\",\"Arb\",\"Kha\",\"Jum\",\"Sab\"],dayNamesMin:[\"Ah\",\"It\",\"Th\",\"Ar\",\"Kh\",\"Ju\",\"Sa\"],digits:null,dateFormat:\"yyyy/mm/dd\",firstDay:6,isRTL:!1}},leapYear:function(t){return(11*this._validate(t,this.minMonth,this.minDay,n.local.invalidYear).year()+14)%30<11},weekOfYear:function(t,e,r){var n=this.newDate(t,e,r);return n.add(-n.dayOfWeek(),\"d\"),Math.floor((n.dayOfYear()-1)/7)+1},daysInYear:function(t){return this.leapYear(t)?355:354},daysInMonth:function(t,e){var r=this._validate(t,e,this.minDay,n.local.invalidMonth);return this.daysPerMonth[r.month()-1]+(12===r.month()&&this.leapYear(r.year())?1:0)},weekDay:function(t,e,r){return 5!==this.dayOfWeek(t,e,r)},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);return t=i.year(),e=i.month(),t=t<=0?t+1:t,(r=i.day())+Math.ceil(29.5*(e-1))+354*(t-1)+Math.floor((3+11*t)/30)+this.jdEpoch-1},fromJD:function(t){t=Math.floor(t)+.5;var e=Math.floor((30*(t-this.jdEpoch)+10646)/10631);e=e<=0?e-1:e;var r=Math.min(12,Math.ceil((t-29-this.toJD(e,1,1))/29.5)+1),n=t-this.toJD(e,r,1)+1;return this.newDate(e,r,n)}}),n.calendars.islamic=a},42645:function(t,e,r){var n=r(24453),i=r(27976);function a(t){this.local=this.regionalOptions[t||\"\"]||this.regionalOptions[\"\"]}a.prototype=new n.baseCalendar,i(a.prototype,{name:\"Julian\",jdEpoch:1721423.5,daysPerMonth:[31,28,31,30,31,30,31,31,30,31,30,31],hasYearZero:!1,minMonth:1,firstMonth:1,minDay:1,regionalOptions:{\"\":{name:\"Julian\",epochs:[\"BC\",\"AD\"],monthNames:[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],monthNamesShort:[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],dayNames:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],dayNamesShort:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],dayNamesMin:[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"],digits:null,dateFormat:\"mm/dd/yyyy\",firstDay:0,isRTL:!1}},leapYear:function(t){var e=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear);return(t=e.year()<0?e.year()+1:e.year())%4==0},weekOfYear:function(t,e,r){var n=this.newDate(t,e,r);return n.add(4-(n.dayOfWeek()||7),\"d\"),Math.floor((n.dayOfYear()-1)/7)+1},daysInMonth:function(t,e){var r=this._validate(t,e,this.minDay,n.local.invalidMonth);return this.daysPerMonth[r.month()-1]+(2===r.month()&&this.leapYear(r.year())?1:0)},weekDay:function(t,e,r){return(this.dayOfWeek(t,e,r)||7)<6},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);return t=i.year(),e=i.month(),r=i.day(),t<0&&t++,e<=2&&(t--,e+=12),Math.floor(365.25*(t+4716))+Math.floor(30.6001*(e+1))+r-1524.5},fromJD:function(t){var e=Math.floor(t+.5)+1524,r=Math.floor((e-122.1)/365.25),n=Math.floor(365.25*r),i=Math.floor((e-n)/30.6001),a=i-Math.floor(i<14?1:13),o=r-Math.floor(a>2?4716:4715),s=e-n-Math.floor(30.6001*i);return o<=0&&o--,this.newDate(o,a,s)}}),n.calendars.julian=a},62324:function(t,e,r){var n=r(24453),i=r(27976);function a(t){this.local=this.regionalOptions[t||\"\"]||this.regionalOptions[\"\"]}function o(t,e){return t-e*Math.floor(t/e)}function s(t,e){return o(t-1,e)+1}a.prototype=new n.baseCalendar,i(a.prototype,{name:\"Mayan\",jdEpoch:584282.5,hasYearZero:!0,minMonth:0,firstMonth:0,minDay:0,regionalOptions:{\"\":{name:\"Mayan\",epochs:[\"\",\"\"],monthNames:[\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\",\"13\",\"14\",\"15\",\"16\",\"17\"],monthNamesShort:[\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\",\"13\",\"14\",\"15\",\"16\",\"17\"],dayNames:[\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\",\"13\",\"14\",\"15\",\"16\",\"17\",\"18\",\"19\"],dayNamesShort:[\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\",\"13\",\"14\",\"15\",\"16\",\"17\",\"18\",\"19\"],dayNamesMin:[\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\",\"13\",\"14\",\"15\",\"16\",\"17\",\"18\",\"19\"],digits:null,dateFormat:\"YYYY.m.d\",firstDay:0,isRTL:!1,haabMonths:[\"Pop\",\"Uo\",\"Zip\",\"Zotz\",\"Tzec\",\"Xul\",\"Yaxkin\",\"Mol\",\"Chen\",\"Yax\",\"Zac\",\"Ceh\",\"Mac\",\"Kankin\",\"Muan\",\"Pax\",\"Kayab\",\"Cumku\",\"Uayeb\"],tzolkinMonths:[\"Imix\",\"Ik\",\"Akbal\",\"Kan\",\"Chicchan\",\"Cimi\",\"Manik\",\"Lamat\",\"Muluc\",\"Oc\",\"Chuen\",\"Eb\",\"Ben\",\"Ix\",\"Men\",\"Cib\",\"Caban\",\"Etznab\",\"Cauac\",\"Ahau\"]}},leapYear:function(t){return this._validate(t,this.minMonth,this.minDay,n.local.invalidYear),!1},formatYear:function(t){t=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear).year();var e=Math.floor(t/400);return t%=400,t+=t<0?400:0,e+\".\"+Math.floor(t/20)+\".\"+t%20},forYear:function(t){if((t=t.split(\".\")).length<3)throw\"Invalid Mayan year\";for(var e=0,r=0;r19||r>0&&n<0)throw\"Invalid Mayan year\";e=20*e+n}return e},monthsInYear:function(t){return this._validate(t,this.minMonth,this.minDay,n.local.invalidYear),18},weekOfYear:function(t,e,r){return this._validate(t,e,r,n.local.invalidDate),0},daysInYear:function(t){return this._validate(t,this.minMonth,this.minDay,n.local.invalidYear),360},daysInMonth:function(t,e){return this._validate(t,e,this.minDay,n.local.invalidMonth),20},daysInWeek:function(){return 5},dayOfWeek:function(t,e,r){return this._validate(t,e,r,n.local.invalidDate).day()},weekDay:function(t,e,r){return this._validate(t,e,r,n.local.invalidDate),!0},extraInfo:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate).toJD(),a=this._toHaab(i),o=this._toTzolkin(i);return{haabMonthName:this.local.haabMonths[a[0]-1],haabMonth:a[0],haabDay:a[1],tzolkinDayName:this.local.tzolkinMonths[o[0]-1],tzolkinDay:o[0],tzolkinTrecena:o[1]}},_toHaab:function(t){var e=o(8+(t-=this.jdEpoch)+340,365);return[Math.floor(e/20)+1,o(e,20)]},_toTzolkin:function(t){return[s(20+(t-=this.jdEpoch),20),s(t+4,13)]},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);return i.day()+20*i.month()+360*i.year()+this.jdEpoch},fromJD:function(t){t=Math.floor(t)+.5-this.jdEpoch;var e=Math.floor(t/360);t%=360,t+=t<0?360:0;var r=Math.floor(t/20),n=t%20;return this.newDate(e,r,n)}}),n.calendars.mayan=a},91662:function(t,e,r){var n=r(24453),i=r(27976);function a(t){this.local=this.regionalOptions[t||\"\"]||this.regionalOptions[\"\"]}a.prototype=new n.baseCalendar;var o=n.instance(\"gregorian\");i(a.prototype,{name:\"Nanakshahi\",jdEpoch:2257673.5,daysPerMonth:[31,31,31,31,31,30,30,30,30,30,30,30],hasYearZero:!1,minMonth:1,firstMonth:1,minDay:1,regionalOptions:{\"\":{name:\"Nanakshahi\",epochs:[\"BN\",\"AN\"],monthNames:[\"Chet\",\"Vaisakh\",\"Jeth\",\"Harh\",\"Sawan\",\"Bhadon\",\"Assu\",\"Katak\",\"Maghar\",\"Poh\",\"Magh\",\"Phagun\"],monthNamesShort:[\"Che\",\"Vai\",\"Jet\",\"Har\",\"Saw\",\"Bha\",\"Ass\",\"Kat\",\"Mgr\",\"Poh\",\"Mgh\",\"Pha\"],dayNames:[\"Somvaar\",\"Mangalvar\",\"Budhvaar\",\"Veervaar\",\"Shukarvaar\",\"Sanicharvaar\",\"Etvaar\"],dayNamesShort:[\"Som\",\"Mangal\",\"Budh\",\"Veer\",\"Shukar\",\"Sanichar\",\"Et\"],dayNamesMin:[\"So\",\"Ma\",\"Bu\",\"Ve\",\"Sh\",\"Sa\",\"Et\"],digits:null,dateFormat:\"dd-mm-yyyy\",firstDay:0,isRTL:!1}},leapYear:function(t){var e=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear||n.regionalOptions[\"\"].invalidYear);return o.leapYear(e.year()+(e.year()<1?1:0)+1469)},weekOfYear:function(t,e,r){var n=this.newDate(t,e,r);return n.add(1-(n.dayOfWeek()||7),\"d\"),Math.floor((n.dayOfYear()-1)/7)+1},daysInMonth:function(t,e){var r=this._validate(t,e,this.minDay,n.local.invalidMonth);return this.daysPerMonth[r.month()-1]+(12===r.month()&&this.leapYear(r.year())?1:0)},weekDay:function(t,e,r){return(this.dayOfWeek(t,e,r)||7)<6},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidMonth);(t=i.year())<0&&t++;for(var a=i.day(),s=1;s=this.toJD(e+1,1,1);)e++;for(var r=t-Math.floor(this.toJD(e,1,1)+.5)+1,n=1;r>this.daysInMonth(e,n);)r-=this.daysInMonth(e,n),n++;return this.newDate(e,n,r)}}),n.calendars.nanakshahi=a},66445:function(t,e,r){var n=r(24453),i=r(27976);function a(t){this.local=this.regionalOptions[t||\"\"]||this.regionalOptions[\"\"]}a.prototype=new n.baseCalendar,i(a.prototype,{name:\"Nepali\",jdEpoch:1700709.5,daysPerMonth:[31,31,32,32,31,30,30,29,30,29,30,30],hasYearZero:!1,minMonth:1,firstMonth:1,minDay:1,daysPerYear:365,regionalOptions:{\"\":{name:\"Nepali\",epochs:[\"BBS\",\"ABS\"],monthNames:[\"Baisakh\",\"Jestha\",\"Ashadh\",\"Shrawan\",\"Bhadra\",\"Ashwin\",\"Kartik\",\"Mangsir\",\"Paush\",\"Mangh\",\"Falgun\",\"Chaitra\"],monthNamesShort:[\"Bai\",\"Je\",\"As\",\"Shra\",\"Bha\",\"Ash\",\"Kar\",\"Mang\",\"Pau\",\"Ma\",\"Fal\",\"Chai\"],dayNames:[\"Aaitabaar\",\"Sombaar\",\"Manglbaar\",\"Budhabaar\",\"Bihibaar\",\"Shukrabaar\",\"Shanibaar\"],dayNamesShort:[\"Aaita\",\"Som\",\"Mangl\",\"Budha\",\"Bihi\",\"Shukra\",\"Shani\"],dayNamesMin:[\"Aai\",\"So\",\"Man\",\"Bu\",\"Bi\",\"Shu\",\"Sha\"],digits:null,dateFormat:\"dd/mm/yyyy\",firstDay:1,isRTL:!1}},leapYear:function(t){return this.daysInYear(t)!==this.daysPerYear},weekOfYear:function(t,e,r){var n=this.newDate(t,e,r);return n.add(-n.dayOfWeek(),\"d\"),Math.floor((n.dayOfYear()-1)/7)+1},daysInYear:function(t){if(t=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear).year(),void 0===this.NEPALI_CALENDAR_DATA[t])return this.daysPerYear;for(var e=0,r=this.minMonth;r<=12;r++)e+=this.NEPALI_CALENDAR_DATA[t][r];return e},daysInMonth:function(t,e){return t.year&&(e=t.month(),t=t.year()),this._validate(t,e,this.minDay,n.local.invalidMonth),void 0===this.NEPALI_CALENDAR_DATA[t]?this.daysPerMonth[e-1]:this.NEPALI_CALENDAR_DATA[t][e]},weekDay:function(t,e,r){return 6!==this.dayOfWeek(t,e,r)},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);t=i.year(),e=i.month(),r=i.day();var a=n.instance(),o=0,s=e,l=t;this._createMissingCalendarData(t);var c=t-(s>9||9===s&&r>=this.NEPALI_CALENDAR_DATA[l][0]?56:57);for(9!==e&&(o=r,s--);9!==s;)s<=0&&(s=12,l--),o+=this.NEPALI_CALENDAR_DATA[l][s],s--;return 9===e?(o+=r-this.NEPALI_CALENDAR_DATA[l][0])<0&&(o+=a.daysInYear(c)):o+=this.NEPALI_CALENDAR_DATA[l][9]-this.NEPALI_CALENDAR_DATA[l][0],a.newDate(c,1,1).add(o,\"d\").toJD()},fromJD:function(t){var e=n.instance().fromJD(t),r=e.year(),i=e.dayOfYear(),a=r+56;this._createMissingCalendarData(a);for(var o=9,s=this.NEPALI_CALENDAR_DATA[a][0],l=this.NEPALI_CALENDAR_DATA[a][o]-s+1;i>l;)++o>12&&(o=1,a++),l+=this.NEPALI_CALENDAR_DATA[a][o];var c=this.NEPALI_CALENDAR_DATA[a][o]-(l-i);return this.newDate(a,o,c)},_createMissingCalendarData:function(t){var e=this.daysPerMonth.slice(0);e.unshift(17);for(var r=t-1;r0?474:473))%2820+474+38)%2816<682},weekOfYear:function(t,e,r){var n=this.newDate(t,e,r);return n.add(-(n.dayOfWeek()+1)%7,\"d\"),Math.floor((n.dayOfYear()-1)/7)+1},daysInMonth:function(t,e){var r=this._validate(t,e,this.minDay,n.local.invalidMonth);return this.daysPerMonth[r.month()-1]+(12===r.month()&&this.leapYear(r.year())?1:0)},weekDay:function(t,e,r){return 5!==this.dayOfWeek(t,e,r)},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);t=i.year(),e=i.month(),r=i.day();var a=t-(t>=0?474:473),s=474+o(a,2820);return r+(e<=7?31*(e-1):30*(e-1)+6)+Math.floor((682*s-110)/2816)+365*(s-1)+1029983*Math.floor(a/2820)+this.jdEpoch-1},fromJD:function(t){var e=(t=Math.floor(t)+.5)-this.toJD(475,1,1),r=Math.floor(e/1029983),n=o(e,1029983),i=2820;if(1029982!==n){var a=Math.floor(n/366),s=o(n,366);i=Math.floor((2134*a+2816*s+2815)/1028522)+a+1}var l=i+2820*r+474;l=l<=0?l-1:l;var c=t-this.toJD(l,1,1)+1,u=c<=186?Math.ceil(c/31):Math.ceil((c-6)/30),h=t-this.toJD(l,u,1)+1;return this.newDate(l,u,h)}}),n.calendars.persian=a,n.calendars.jalali=a},84756:function(t,e,r){var n=r(24453),i=r(27976),a=n.instance();function o(t){this.local=this.regionalOptions[t||\"\"]||this.regionalOptions[\"\"]}o.prototype=new n.baseCalendar,i(o.prototype,{name:\"Taiwan\",jdEpoch:2419402.5,yearsOffset:1911,daysPerMonth:[31,28,31,30,31,30,31,31,30,31,30,31],hasYearZero:!1,minMonth:1,firstMonth:1,minDay:1,regionalOptions:{\"\":{name:\"Taiwan\",epochs:[\"BROC\",\"ROC\"],monthNames:[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],monthNamesShort:[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],dayNames:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],dayNamesShort:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],dayNamesMin:[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"],digits:null,dateFormat:\"yyyy/mm/dd\",firstDay:1,isRTL:!1}},leapYear:function(t){var e=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear);return t=this._t2gYear(e.year()),a.leapYear(t)},weekOfYear:function(t,e,r){var i=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear);return t=this._t2gYear(i.year()),a.weekOfYear(t,i.month(),i.day())},daysInMonth:function(t,e){var r=this._validate(t,e,this.minDay,n.local.invalidMonth);return this.daysPerMonth[r.month()-1]+(2===r.month()&&this.leapYear(r.year())?1:0)},weekDay:function(t,e,r){return(this.dayOfWeek(t,e,r)||7)<6},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);return t=this._t2gYear(i.year()),a.toJD(t,i.month(),i.day())},fromJD:function(t){var e=a.fromJD(t),r=this._g2tYear(e.year());return this.newDate(r,e.month(),e.day())},_t2gYear:function(t){return t+this.yearsOffset+(t>=-this.yearsOffset&&t<=-1?1:0)},_g2tYear:function(t){return t-this.yearsOffset-(t>=1&&t<=this.yearsOffset?1:0)}}),n.calendars.taiwan=o},41858:function(t,e,r){var n=r(24453),i=r(27976),a=n.instance();function o(t){this.local=this.regionalOptions[t||\"\"]||this.regionalOptions[\"\"]}o.prototype=new n.baseCalendar,i(o.prototype,{name:\"Thai\",jdEpoch:1523098.5,yearsOffset:543,daysPerMonth:[31,28,31,30,31,30,31,31,30,31,30,31],hasYearZero:!1,minMonth:1,firstMonth:1,minDay:1,regionalOptions:{\"\":{name:\"Thai\",epochs:[\"BBE\",\"BE\"],monthNames:[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],monthNamesShort:[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],dayNames:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],dayNamesShort:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],dayNamesMin:[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"],digits:null,dateFormat:\"dd/mm/yyyy\",firstDay:0,isRTL:!1}},leapYear:function(t){var e=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear);return t=this._t2gYear(e.year()),a.leapYear(t)},weekOfYear:function(t,e,r){var i=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear);return t=this._t2gYear(i.year()),a.weekOfYear(t,i.month(),i.day())},daysInMonth:function(t,e){var r=this._validate(t,e,this.minDay,n.local.invalidMonth);return this.daysPerMonth[r.month()-1]+(2===r.month()&&this.leapYear(r.year())?1:0)},weekDay:function(t,e,r){return(this.dayOfWeek(t,e,r)||7)<6},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);return t=this._t2gYear(i.year()),a.toJD(t,i.month(),i.day())},fromJD:function(t){var e=a.fromJD(t),r=this._g2tYear(e.year());return this.newDate(r,e.month(),e.day())},_t2gYear:function(t){return t-this.yearsOffset-(t>=1&&t<=this.yearsOffset?1:0)},_g2tYear:function(t){return t+this.yearsOffset+(t>=-this.yearsOffset&&t<=-1?1:0)}}),n.calendars.thai=o},57985:function(t,e,r){var n=r(24453),i=r(27976);function a(t){this.local=this.regionalOptions[t||\"\"]||this.regionalOptions[\"\"]}a.prototype=new n.baseCalendar,i(a.prototype,{name:\"UmmAlQura\",hasYearZero:!1,minMonth:1,firstMonth:1,minDay:1,regionalOptions:{\"\":{name:\"Umm al-Qura\",epochs:[\"BH\",\"AH\"],monthNames:[\"Al-Muharram\",\"Safar\",\"Rabi' al-awwal\",\"Rabi' Al-Thani\",\"Jumada Al-Awwal\",\"Jumada Al-Thani\",\"Rajab\",\"Sha'aban\",\"Ramadan\",\"Shawwal\",\"Dhu al-Qi'dah\",\"Dhu al-Hijjah\"],monthNamesShort:[\"Muh\",\"Saf\",\"Rab1\",\"Rab2\",\"Jum1\",\"Jum2\",\"Raj\",\"Sha'\",\"Ram\",\"Shaw\",\"DhuQ\",\"DhuH\"],dayNames:[\"Yawm al-Ahad\",\"Yawm al-Ithnain\",\"Yawm al-Thalāthā’\",\"Yawm al-Arba‘ā’\",\"Yawm al-Khamīs\",\"Yawm al-Jum‘a\",\"Yawm al-Sabt\"],dayNamesMin:[\"Ah\",\"Ith\",\"Th\",\"Ar\",\"Kh\",\"Ju\",\"Sa\"],digits:null,dateFormat:\"yyyy/mm/dd\",firstDay:6,isRTL:!0}},leapYear:function(t){var e=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear);return 355===this.daysInYear(e.year())},weekOfYear:function(t,e,r){var n=this.newDate(t,e,r);return n.add(-n.dayOfWeek(),\"d\"),Math.floor((n.dayOfYear()-1)/7)+1},daysInYear:function(t){for(var e=0,r=1;r<=12;r++)e+=this.daysInMonth(t,r);return e},daysInMonth:function(t,e){for(var r=this._validate(t,e,this.minDay,n.local.invalidMonth).toJD()-24e5+.5,i=0,a=0;ar)return o[i]-o[i-1];i++}return 30},weekDay:function(t,e,r){return 5!==this.dayOfWeek(t,e,r)},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate),a=12*(i.year()-1)+i.month()-15292;return i.day()+o[a-1]-1+24e5-.5},fromJD:function(t){for(var e=t-24e5+.5,r=0,n=0;ne);n++)r++;var i=r+15292,a=Math.floor((i-1)/12),s=a+1,l=i-12*a,c=e-o[r-1]+1;return this.newDate(s,l,c)},isValid:function(t,e,r){var i=n.baseCalendar.prototype.isValid.apply(this,arguments);return i&&(i=(t=null!=t.year?t.year:t)>=1276&&t<=1500),i},_validate:function(t,e,r,i){var a=n.baseCalendar.prototype._validate.apply(this,arguments);if(a.year<1276||a.year>1500)throw i.replace(/\\{0\\}/,this.local.name);return a}}),n.calendars.ummalqura=a;var o=[20,50,79,109,138,168,197,227,256,286,315,345,374,404,433,463,492,522,551,581,611,641,670,700,729,759,788,818,847,877,906,936,965,995,1024,1054,1083,1113,1142,1172,1201,1231,1260,1290,1320,1350,1379,1409,1438,1468,1497,1527,1556,1586,1615,1645,1674,1704,1733,1763,1792,1822,1851,1881,1910,1940,1969,1999,2028,2058,2087,2117,2146,2176,2205,2235,2264,2294,2323,2353,2383,2413,2442,2472,2501,2531,2560,2590,2619,2649,2678,2708,2737,2767,2796,2826,2855,2885,2914,2944,2973,3003,3032,3062,3091,3121,3150,3180,3209,3239,3268,3298,3327,3357,3386,3416,3446,3476,3505,3535,3564,3594,3623,3653,3682,3712,3741,3771,3800,3830,3859,3889,3918,3948,3977,4007,4036,4066,4095,4125,4155,4185,4214,4244,4273,4303,4332,4362,4391,4421,4450,4480,4509,4539,4568,4598,4627,4657,4686,4716,4745,4775,4804,4834,4863,4893,4922,4952,4981,5011,5040,5070,5099,5129,5158,5188,5218,5248,5277,5307,5336,5366,5395,5425,5454,5484,5513,5543,5572,5602,5631,5661,5690,5720,5749,5779,5808,5838,5867,5897,5926,5956,5985,6015,6044,6074,6103,6133,6162,6192,6221,6251,6281,6311,6340,6370,6399,6429,6458,6488,6517,6547,6576,6606,6635,6665,6694,6724,6753,6783,6812,6842,6871,6901,6930,6960,6989,7019,7048,7078,7107,7137,7166,7196,7225,7255,7284,7314,7344,7374,7403,7433,7462,7492,7521,7551,7580,7610,7639,7669,7698,7728,7757,7787,7816,7846,7875,7905,7934,7964,7993,8023,8053,8083,8112,8142,8171,8201,8230,8260,8289,8319,8348,8378,8407,8437,8466,8496,8525,8555,8584,8614,8643,8673,8702,8732,8761,8791,8821,8850,8880,8909,8938,8968,8997,9027,9056,9086,9115,9145,9175,9205,9234,9264,9293,9322,9352,9381,9410,9440,9470,9499,9529,9559,9589,9618,9648,9677,9706,9736,9765,9794,9824,9853,9883,9913,9943,9972,10002,10032,10061,10090,10120,10149,10178,10208,10237,10267,10297,10326,10356,10386,10415,10445,10474,10504,10533,10562,10592,10621,10651,10680,10710,10740,10770,10799,10829,10858,10888,10917,10947,10976,11005,11035,11064,11094,11124,11153,11183,11213,11242,11272,11301,11331,11360,11389,11419,11448,11478,11507,11537,11567,11596,11626,11655,11685,11715,11744,11774,11803,11832,11862,11891,11921,11950,11980,12010,12039,12069,12099,12128,12158,12187,12216,12246,12275,12304,12334,12364,12393,12423,12453,12483,12512,12542,12571,12600,12630,12659,12688,12718,12747,12777,12807,12837,12866,12896,12926,12955,12984,13014,13043,13072,13102,13131,13161,13191,13220,13250,13280,13310,13339,13368,13398,13427,13456,13486,13515,13545,13574,13604,13634,13664,13693,13723,13752,13782,13811,13840,13870,13899,13929,13958,13988,14018,14047,14077,14107,14136,14166,14195,14224,14254,14283,14313,14342,14372,14401,14431,14461,14490,14520,14550,14579,14609,14638,14667,14697,14726,14756,14785,14815,14844,14874,14904,14933,14963,14993,15021,15051,15081,15110,15140,15169,15199,15228,15258,15287,15317,15347,15377,15406,15436,15465,15494,15524,15553,15582,15612,15641,15671,15701,15731,15760,15790,15820,15849,15878,15908,15937,15966,15996,16025,16055,16085,16114,16144,16174,16204,16233,16262,16292,16321,16350,16380,16409,16439,16468,16498,16528,16558,16587,16617,16646,16676,16705,16734,16764,16793,16823,16852,16882,16912,16941,16971,17001,17030,17060,17089,17118,17148,17177,17207,17236,17266,17295,17325,17355,17384,17414,17444,17473,17502,17532,17561,17591,17620,17650,17679,17709,17738,17768,17798,17827,17857,17886,17916,17945,17975,18004,18034,18063,18093,18122,18152,18181,18211,18241,18270,18300,18330,18359,18388,18418,18447,18476,18506,18535,18565,18595,18625,18654,18684,18714,18743,18772,18802,18831,18860,18890,18919,18949,18979,19008,19038,19068,19098,19127,19156,19186,19215,19244,19274,19303,19333,19362,19392,19422,19452,19481,19511,19540,19570,19599,19628,19658,19687,19717,19746,19776,19806,19836,19865,19895,19924,19954,19983,20012,20042,20071,20101,20130,20160,20190,20219,20249,20279,20308,20338,20367,20396,20426,20455,20485,20514,20544,20573,20603,20633,20662,20692,20721,20751,20780,20810,20839,20869,20898,20928,20957,20987,21016,21046,21076,21105,21135,21164,21194,21223,21253,21282,21312,21341,21371,21400,21430,21459,21489,21519,21548,21578,21607,21637,21666,21696,21725,21754,21784,21813,21843,21873,21902,21932,21962,21991,22021,22050,22080,22109,22138,22168,22197,22227,22256,22286,22316,22346,22375,22405,22434,22464,22493,22522,22552,22581,22611,22640,22670,22700,22730,22759,22789,22818,22848,22877,22906,22936,22965,22994,23024,23054,23083,23113,23143,23173,23202,23232,23261,23290,23320,23349,23379,23408,23438,23467,23497,23527,23556,23586,23616,23645,23674,23704,23733,23763,23792,23822,23851,23881,23910,23940,23970,23999,24029,24058,24088,24117,24147,24176,24206,24235,24265,24294,24324,24353,24383,24413,24442,24472,24501,24531,24560,24590,24619,24648,24678,24707,24737,24767,24796,24826,24856,24885,24915,24944,24974,25003,25032,25062,25091,25121,25150,25180,25210,25240,25269,25299,25328,25358,25387,25416,25446,25475,25505,25534,25564,25594,25624,25653,25683,25712,25742,25771,25800,25830,25859,25888,25918,25948,25977,26007,26037,26067,26096,26126,26155,26184,26214,26243,26272,26302,26332,26361,26391,26421,26451,26480,26510,26539,26568,26598,26627,26656,26686,26715,26745,26775,26805,26834,26864,26893,26923,26952,26982,27011,27041,27070,27099,27129,27159,27188,27218,27248,27277,27307,27336,27366,27395,27425,27454,27484,27513,27542,27572,27602,27631,27661,27691,27720,27750,27779,27809,27838,27868,27897,27926,27956,27985,28015,28045,28074,28104,28134,28163,28193,28222,28252,28281,28310,28340,28369,28399,28428,28458,28488,28517,28547,28577,28607,28636,28665,28695,28724,28754,28783,28813,28843,28872,28901,28931,28960,28990,29019,29049,29078,29108,29137,29167,29196,29226,29255,29285,29315,29345,29375,29404,29434,29463,29492,29522,29551,29580,29610,29640,29669,29699,29729,29759,29788,29818,29847,29876,29906,29935,29964,29994,30023,30053,30082,30112,30141,30171,30200,30230,30259,30289,30318,30348,30378,30408,30437,30467,30496,30526,30555,30585,30614,30644,30673,30703,30732,30762,30791,30821,30850,30880,30909,30939,30968,30998,31027,31057,31086,31116,31145,31175,31204,31234,31263,31293,31322,31352,31381,31411,31441,31471,31500,31530,31559,31589,31618,31648,31676,31706,31736,31766,31795,31825,31854,31884,31913,31943,31972,32002,32031,32061,32090,32120,32150,32180,32209,32239,32268,32298,32327,32357,32386,32416,32445,32475,32504,32534,32563,32593,32622,32652,32681,32711,32740,32770,32799,32829,32858,32888,32917,32947,32976,33006,33035,33065,33094,33124,33153,33183,33213,33243,33272,33302,33331,33361,33390,33420,33450,33479,33509,33539,33568,33598,33627,33657,33686,33716,33745,33775,33804,33834,33863,33893,33922,33952,33981,34011,34040,34069,34099,34128,34158,34187,34217,34247,34277,34306,34336,34365,34395,34424,34454,34483,34512,34542,34571,34601,34631,34660,34690,34719,34749,34778,34808,34837,34867,34896,34926,34955,34985,35015,35044,35074,35103,35133,35162,35192,35222,35251,35280,35310,35340,35370,35399,35429,35458,35488,35517,35547,35576,35605,35635,35665,35694,35723,35753,35782,35811,35841,35871,35901,35930,35960,35989,36019,36048,36078,36107,36136,36166,36195,36225,36254,36284,36314,36343,36373,36403,36433,36462,36492,36521,36551,36580,36610,36639,36669,36698,36728,36757,36786,36816,36845,36875,36904,36934,36963,36993,37022,37052,37081,37111,37141,37170,37200,37229,37259,37288,37318,37347,37377,37406,37436,37465,37495,37524,37554,37584,37613,37643,37672,37701,37731,37760,37790,37819,37849,37878,37908,37938,37967,37997,38027,38056,38085,38115,38144,38174,38203,38233,38262,38292,38322,38351,38381,38410,38440,38469,38499,38528,38558,38587,38617,38646,38676,38705,38735,38764,38794,38823,38853,38882,38912,38941,38971,39001,39030,39059,39089,39118,39148,39178,39208,39237,39267,39297,39326,39355,39385,39414,39444,39473,39503,39532,39562,39592,39621,39650,39680,39709,39739,39768,39798,39827,39857,39886,39916,39946,39975,40005,40035,40064,40094,40123,40153,40182,40212,40241,40271,40300,40330,40359,40389,40418,40448,40477,40507,40536,40566,40595,40625,40655,40685,40714,40744,40773,40803,40832,40862,40892,40921,40951,40980,41009,41039,41068,41098,41127,41157,41186,41216,41245,41275,41304,41334,41364,41393,41422,41452,41481,41511,41540,41570,41599,41629,41658,41688,41718,41748,41777,41807,41836,41865,41894,41924,41953,41983,42012,42042,42072,42102,42131,42161,42190,42220,42249,42279,42308,42337,42367,42397,42426,42456,42485,42515,42545,42574,42604,42633,42662,42692,42721,42751,42780,42810,42839,42869,42899,42929,42958,42988,43017,43046,43076,43105,43135,43164,43194,43223,43253,43283,43312,43342,43371,43401,43430,43460,43489,43519,43548,43578,43607,43637,43666,43696,43726,43755,43785,43814,43844,43873,43903,43932,43962,43991,44021,44050,44080,44109,44139,44169,44198,44228,44258,44287,44317,44346,44375,44405,44434,44464,44493,44523,44553,44582,44612,44641,44671,44700,44730,44759,44788,44818,44847,44877,44906,44936,44966,44996,45025,45055,45084,45114,45143,45172,45202,45231,45261,45290,45320,45350,45380,45409,45439,45468,45498,45527,45556,45586,45615,45644,45674,45704,45733,45763,45793,45823,45852,45882,45911,45940,45970,45999,46028,46058,46088,46117,46147,46177,46206,46236,46265,46295,46324,46354,46383,46413,46442,46472,46501,46531,46560,46590,46620,46649,46679,46708,46738,46767,46797,46826,46856,46885,46915,46944,46974,47003,47033,47063,47092,47122,47151,47181,47210,47240,47269,47298,47328,47357,47387,47417,47446,47476,47506,47535,47565,47594,47624,47653,47682,47712,47741,47771,47800,47830,47860,47890,47919,47949,47978,48008,48037,48066,48096,48125,48155,48184,48214,48244,48273,48303,48333,48362,48392,48421,48450,48480,48509,48538,48568,48598,48627,48657,48687,48717,48746,48776,48805,48834,48864,48893,48922,48952,48982,49011,49041,49071,49100,49130,49160,49189,49218,49248,49277,49306,49336,49365,49395,49425,49455,49484,49514,49543,49573,49602,49632,49661,49690,49720,49749,49779,49809,49838,49868,49898,49927,49957,49986,50016,50045,50075,50104,50133,50163,50192,50222,50252,50281,50311,50340,50370,50400,50429,50459,50488,50518,50547,50576,50606,50635,50665,50694,50724,50754,50784,50813,50843,50872,50902,50931,50960,50990,51019,51049,51078,51108,51138,51167,51197,51227,51256,51286,51315,51345,51374,51403,51433,51462,51492,51522,51552,51582,51611,51641,51670,51699,51729,51758,51787,51816,51846,51876,51906,51936,51965,51995,52025,52054,52083,52113,52142,52171,52200,52230,52260,52290,52319,52349,52379,52408,52438,52467,52497,52526,52555,52585,52614,52644,52673,52703,52733,52762,52792,52822,52851,52881,52910,52939,52969,52998,53028,53057,53087,53116,53146,53176,53205,53235,53264,53294,53324,53353,53383,53412,53441,53471,53500,53530,53559,53589,53619,53648,53678,53708,53737,53767,53796,53825,53855,53884,53913,53943,53973,54003,54032,54062,54092,54121,54151,54180,54209,54239,54268,54297,54327,54357,54387,54416,54446,54476,54505,54535,54564,54593,54623,54652,54681,54711,54741,54770,54800,54830,54859,54889,54919,54948,54977,55007,55036,55066,55095,55125,55154,55184,55213,55243,55273,55302,55332,55361,55391,55420,55450,55479,55508,55538,55567,55597,55627,55657,55686,55716,55745,55775,55804,55834,55863,55892,55922,55951,55981,56011,56040,56070,56100,56129,56159,56188,56218,56247,56276,56306,56335,56365,56394,56424,56454,56483,56513,56543,56572,56601,56631,56660,56690,56719,56749,56778,56808,56837,56867,56897,56926,56956,56985,57015,57044,57074,57103,57133,57162,57192,57221,57251,57280,57310,57340,57369,57399,57429,57458,57487,57517,57546,57576,57605,57634,57664,57694,57723,57753,57783,57813,57842,57871,57901,57930,57959,57989,58018,58048,58077,58107,58137,58167,58196,58226,58255,58285,58314,58343,58373,58402,58432,58461,58491,58521,58551,58580,58610,58639,58669,58698,58727,58757,58786,58816,58845,58875,58905,58934,58964,58994,59023,59053,59082,59111,59141,59170,59200,59229,59259,59288,59318,59348,59377,59407,59436,59466,59495,59525,59554,59584,59613,59643,59672,59702,59731,59761,59791,59820,59850,59879,59909,59939,59968,59997,60027,60056,60086,60115,60145,60174,60204,60234,60264,60293,60323,60352,60381,60411,60440,60469,60499,60528,60558,60588,60618,60648,60677,60707,60736,60765,60795,60824,60853,60883,60912,60942,60972,61002,61031,61061,61090,61120,61149,61179,61208,61237,61267,61296,61326,61356,61385,61415,61445,61474,61504,61533,61563,61592,61621,61651,61680,61710,61739,61769,61799,61828,61858,61888,61917,61947,61976,62006,62035,62064,62094,62123,62153,62182,62212,62242,62271,62301,62331,62360,62390,62419,62448,62478,62507,62537,62566,62596,62625,62655,62685,62715,62744,62774,62803,62832,62862,62891,62921,62950,62980,63009,63039,63069,63099,63128,63157,63187,63216,63246,63275,63305,63334,63363,63393,63423,63453,63482,63512,63541,63571,63600,63630,63659,63689,63718,63747,63777,63807,63836,63866,63895,63925,63955,63984,64014,64043,64073,64102,64131,64161,64190,64220,64249,64279,64309,64339,64368,64398,64427,64457,64486,64515,64545,64574,64603,64633,64663,64692,64722,64752,64782,64811,64841,64870,64899,64929,64958,64987,65017,65047,65076,65106,65136,65166,65195,65225,65254,65283,65313,65342,65371,65401,65431,65460,65490,65520,65549,65579,65608,65638,65667,65697,65726,65755,65785,65815,65844,65874,65903,65933,65963,65992,66022,66051,66081,66110,66140,66169,66199,66228,66258,66287,66317,66346,66376,66405,66435,66465,66494,66524,66553,66583,66612,66641,66671,66700,66730,66760,66789,66819,66849,66878,66908,66937,66967,66996,67025,67055,67084,67114,67143,67173,67203,67233,67262,67292,67321,67351,67380,67409,67439,67468,67497,67527,67557,67587,67617,67646,67676,67705,67735,67764,67793,67823,67852,67882,67911,67941,67971,68e3,68030,68060,68089,68119,68148,68177,68207,68236,68266,68295,68325,68354,68384,68414,68443,68473,68502,68532,68561,68591,68620,68650,68679,68708,68738,68768,68797,68827,68857,68886,68916,68946,68975,69004,69034,69063,69092,69122,69152,69181,69211,69240,69270,69300,69330,69359,69388,69418,69447,69476,69506,69535,69565,69595,69624,69654,69684,69713,69743,69772,69802,69831,69861,69890,69919,69949,69978,70008,70038,70067,70097,70126,70156,70186,70215,70245,70274,70303,70333,70362,70392,70421,70451,70481,70510,70540,70570,70599,70629,70658,70687,70717,70746,70776,70805,70835,70864,70894,70924,70954,70983,71013,71042,71071,71101,71130,71159,71189,71218,71248,71278,71308,71337,71367,71397,71426,71455,71485,71514,71543,71573,71602,71632,71662,71691,71721,71751,71781,71810,71839,71869,71898,71927,71957,71986,72016,72046,72075,72105,72135,72164,72194,72223,72253,72282,72311,72341,72370,72400,72429,72459,72489,72518,72548,72577,72607,72637,72666,72695,72725,72754,72784,72813,72843,72872,72902,72931,72961,72991,73020,73050,73080,73109,73139,73168,73197,73227,73256,73286,73315,73345,73375,73404,73434,73464,73493,73523,73552,73581,73611,73640,73669,73699,73729,73758,73788,73818,73848,73877,73907,73936,73965,73995,74024,74053,74083,74113,74142,74172,74202,74231,74261,74291,74320,74349,74379,74408,74437,74467,74497,74526,74556,74586,74615,74645,74675,74704,74733,74763,74792,74822,74851,74881,74910,74940,74969,74999,75029,75058,75088,75117,75147,75176,75206,75235,75264,75294,75323,75353,75383,75412,75442,75472,75501,75531,75560,75590,75619,75648,75678,75707,75737,75766,75796,75826,75856,75885,75915,75944,75974,76003,76032,76062,76091,76121,76150,76180,76210,76239,76269,76299,76328,76358,76387,76416,76446,76475,76505,76534,76564,76593,76623,76653,76682,76712,76741,76771,76801,76830,76859,76889,76918,76948,76977,77007,77036,77066,77096,77125,77155,77185,77214,77243,77273,77302,77332,77361,77390,77420,77450,77479,77509,77539,77569,77598,77627,77657,77686,77715,77745,77774,77804,77833,77863,77893,77923,77952,77982,78011,78041,78070,78099,78129,78158,78188,78217,78247,78277,78307,78336,78366,78395,78425,78454,78483,78513,78542,78572,78601,78631,78661,78690,78720,78750,78779,78808,78838,78867,78897,78926,78956,78985,79015,79044,79074,79104,79133,79163,79192,79222,79251,79281,79310,79340,79369,79399,79428,79458,79487,79517,79546,79576,79606,79635,79665,79695,79724,79753,79783,79812,79841,79871,79900,79930,79960,79990]},24453:function(t,e,r){var n=r(27976);function i(){this.regionalOptions=[],this.regionalOptions[\"\"]={invalidCalendar:\"Calendar {0} not found\",invalidDate:\"Invalid {0} date\",invalidMonth:\"Invalid {0} month\",invalidYear:\"Invalid {0} year\",differentCalendars:\"Cannot mix {0} and {1} dates\"},this.local=this.regionalOptions[\"\"],this.calendars={},this._localCals={}}function a(t,e,r,n){if(this._calendar=t,this._year=e,this._month=r,this._day=n,0===this._calendar._validateLevel&&!this._calendar.isValid(this._year,this._month,this._day))throw(c.local.invalidDate||c.regionalOptions[\"\"].invalidDate).replace(/\\{0\\}/,this._calendar.local.name)}function o(t,e){return\"000000\".substring(0,e-(t=\"\"+t).length)+t}function s(){this.shortYearCutoff=\"+10\"}function l(t){this.local=this.regionalOptions[t]||this.regionalOptions[\"\"]}n(i.prototype,{instance:function(t,e){t=(t||\"gregorian\").toLowerCase(),e=e||\"\";var r=this._localCals[t+\"-\"+e];if(!r&&this.calendars[t]&&(r=new this.calendars[t](e),this._localCals[t+\"-\"+e]=r),!r)throw(this.local.invalidCalendar||this.regionalOptions[\"\"].invalidCalendar).replace(/\\{0\\}/,t);return r},newDate:function(t,e,r,n,i){return(n=(null!=t&&t.year?t.calendar():\"string\"==typeof n?this.instance(n,i):n)||this.instance()).newDate(t,e,r)},substituteDigits:function(t){return function(e){return(e+\"\").replace(/[0-9]/g,(function(e){return t[e]}))}},substituteChineseDigits:function(t,e){return function(r){for(var n=\"\",i=0;r>0;){var a=r%10;n=(0===a?\"\":t[a]+e[i])+n,i++,r=Math.floor(r/10)}return 0===n.indexOf(t[1]+e[1])&&(n=n.substr(1)),n||t[0]}}}),n(a.prototype,{newDate:function(t,e,r){return this._calendar.newDate(null==t?this:t,e,r)},year:function(t){return 0===arguments.length?this._year:this.set(t,\"y\")},month:function(t){return 0===arguments.length?this._month:this.set(t,\"m\")},day:function(t){return 0===arguments.length?this._day:this.set(t,\"d\")},date:function(t,e,r){if(!this._calendar.isValid(t,e,r))throw(c.local.invalidDate||c.regionalOptions[\"\"].invalidDate).replace(/\\{0\\}/,this._calendar.local.name);return this._year=t,this._month=e,this._day=r,this},leapYear:function(){return this._calendar.leapYear(this)},epoch:function(){return this._calendar.epoch(this)},formatYear:function(){return this._calendar.formatYear(this)},monthOfYear:function(){return this._calendar.monthOfYear(this)},weekOfYear:function(){return this._calendar.weekOfYear(this)},daysInYear:function(){return this._calendar.daysInYear(this)},dayOfYear:function(){return this._calendar.dayOfYear(this)},daysInMonth:function(){return this._calendar.daysInMonth(this)},dayOfWeek:function(){return this._calendar.dayOfWeek(this)},weekDay:function(){return this._calendar.weekDay(this)},extraInfo:function(){return this._calendar.extraInfo(this)},add:function(t,e){return this._calendar.add(this,t,e)},set:function(t,e){return this._calendar.set(this,t,e)},compareTo:function(t){if(this._calendar.name!==t._calendar.name)throw(c.local.differentCalendars||c.regionalOptions[\"\"].differentCalendars).replace(/\\{0\\}/,this._calendar.local.name).replace(/\\{1\\}/,t._calendar.local.name);var e=this._year!==t._year?this._year-t._year:this._month!==t._month?this.monthOfYear()-t.monthOfYear():this._day-t._day;return 0===e?0:e<0?-1:1},calendar:function(){return this._calendar},toJD:function(){return this._calendar.toJD(this)},fromJD:function(t){return this._calendar.fromJD(t)},toJSDate:function(){return this._calendar.toJSDate(this)},fromJSDate:function(t){return this._calendar.fromJSDate(t)},toString:function(){return(this.year()<0?\"-\":\"\")+o(Math.abs(this.year()),4)+\"-\"+o(this.month(),2)+\"-\"+o(this.day(),2)}}),n(s.prototype,{_validateLevel:0,newDate:function(t,e,r){return null==t?this.today():(t.year&&(this._validate(t,e,r,c.local.invalidDate||c.regionalOptions[\"\"].invalidDate),r=t.day(),e=t.month(),t=t.year()),new a(this,t,e,r))},today:function(){return this.fromJSDate(new Date)},epoch:function(t){return this._validate(t,this.minMonth,this.minDay,c.local.invalidYear||c.regionalOptions[\"\"].invalidYear).year()<0?this.local.epochs[0]:this.local.epochs[1]},formatYear:function(t){var e=this._validate(t,this.minMonth,this.minDay,c.local.invalidYear||c.regionalOptions[\"\"].invalidYear);return(e.year()<0?\"-\":\"\")+o(Math.abs(e.year()),4)},monthsInYear:function(t){return this._validate(t,this.minMonth,this.minDay,c.local.invalidYear||c.regionalOptions[\"\"].invalidYear),12},monthOfYear:function(t,e){var r=this._validate(t,e,this.minDay,c.local.invalidMonth||c.regionalOptions[\"\"].invalidMonth);return(r.month()+this.monthsInYear(r)-this.firstMonth)%this.monthsInYear(r)+this.minMonth},fromMonthOfYear:function(t,e){var r=(e+this.firstMonth-2*this.minMonth)%this.monthsInYear(t)+this.minMonth;return this._validate(t,r,this.minDay,c.local.invalidMonth||c.regionalOptions[\"\"].invalidMonth),r},daysInYear:function(t){var e=this._validate(t,this.minMonth,this.minDay,c.local.invalidYear||c.regionalOptions[\"\"].invalidYear);return this.leapYear(e)?366:365},dayOfYear:function(t,e,r){var n=this._validate(t,e,r,c.local.invalidDate||c.regionalOptions[\"\"].invalidDate);return n.toJD()-this.newDate(n.year(),this.fromMonthOfYear(n.year(),this.minMonth),this.minDay).toJD()+1},daysInWeek:function(){return 7},dayOfWeek:function(t,e,r){var n=this._validate(t,e,r,c.local.invalidDate||c.regionalOptions[\"\"].invalidDate);return(Math.floor(this.toJD(n))+2)%this.daysInWeek()},extraInfo:function(t,e,r){return this._validate(t,e,r,c.local.invalidDate||c.regionalOptions[\"\"].invalidDate),{}},add:function(t,e,r){return this._validate(t,this.minMonth,this.minDay,c.local.invalidDate||c.regionalOptions[\"\"].invalidDate),this._correctAdd(t,this._add(t,e,r),e,r)},_add:function(t,e,r){if(this._validateLevel++,\"d\"===r||\"w\"===r){var n=t.toJD()+e*(\"w\"===r?this.daysInWeek():1),i=t.calendar().fromJD(n);return this._validateLevel--,[i.year(),i.month(),i.day()]}try{var a=t.year()+(\"y\"===r?e:0),o=t.monthOfYear()+(\"m\"===r?e:0);i=t.day(),\"y\"===r?(t.month()!==this.fromMonthOfYear(a,o)&&(o=this.newDate(a,t.month(),this.minDay).monthOfYear()),o=Math.min(o,this.monthsInYear(a)),i=Math.min(i,this.daysInMonth(a,this.fromMonthOfYear(a,o)))):\"m\"===r&&(function(t){for(;oe-1+t.minMonth;)a++,o-=e,e=t.monthsInYear(a)}(this),i=Math.min(i,this.daysInMonth(a,this.fromMonthOfYear(a,o))));var s=[a,this.fromMonthOfYear(a,o),i];return this._validateLevel--,s}catch(t){throw this._validateLevel--,t}},_correctAdd:function(t,e,r,n){if(!(this.hasYearZero||\"y\"!==n&&\"m\"!==n||0!==e[0]&&t.year()>0==e[0]>0)){var i={y:[1,1,\"y\"],m:[1,this.monthsInYear(-1),\"m\"],w:[this.daysInWeek(),this.daysInYear(-1),\"d\"],d:[1,this.daysInYear(-1),\"d\"]}[n],a=r<0?-1:1;e=this._add(t,r*i[0]+a*i[1],i[2])}return t.date(e[0],e[1],e[2])},set:function(t,e,r){this._validate(t,this.minMonth,this.minDay,c.local.invalidDate||c.regionalOptions[\"\"].invalidDate);var n=\"y\"===r?e:t.year(),i=\"m\"===r?e:t.month(),a=\"d\"===r?e:t.day();return\"y\"!==r&&\"m\"!==r||(a=Math.min(a,this.daysInMonth(n,i))),t.date(n,i,a)},isValid:function(t,e,r){this._validateLevel++;var n=this.hasYearZero||0!==t;if(n){var i=this.newDate(t,e,this.minDay);n=e>=this.minMonth&&e-this.minMonth=this.minDay&&r-this.minDay13.5?13:1),c=i-(l>2.5?4716:4715);return c<=0&&c--,this.newDate(c,l,s)},toJSDate:function(t,e,r){var n=this._validate(t,e,r,c.local.invalidDate||c.regionalOptions[\"\"].invalidDate),i=new Date(n.year(),n.month()-1,n.day());return i.setHours(0),i.setMinutes(0),i.setSeconds(0),i.setMilliseconds(0),i.setHours(i.getHours()>12?i.getHours()+2:0),i},fromJSDate:function(t){return this.newDate(t.getFullYear(),t.getMonth()+1,t.getDate())}});var c=t.exports=new i;c.cdate=a,c.baseCalendar=s,c.calendars.gregorian=l},23428:function(t,e,r){var n=r(27976),i=r(24453);n(i.regionalOptions[\"\"],{invalidArguments:\"Invalid arguments\",invalidFormat:\"Cannot format a date from another calendar\",missingNumberAt:\"Missing number at position {0}\",unknownNameAt:\"Unknown name at position {0}\",unexpectedLiteralAt:\"Unexpected literal at position {0}\",unexpectedText:\"Additional text found at end\"}),i.local=i.regionalOptions[\"\"],n(i.cdate.prototype,{formatDate:function(t,e){return\"string\"!=typeof t&&(e=t,t=\"\"),this._calendar.formatDate(t||\"\",this,e)}}),n(i.baseCalendar.prototype,{UNIX_EPOCH:i.instance().newDate(1970,1,1).toJD(),SECS_PER_DAY:86400,TICKS_EPOCH:i.instance().jdEpoch,TICKS_PER_DAY:864e9,ATOM:\"yyyy-mm-dd\",COOKIE:\"D, dd M yyyy\",FULL:\"DD, MM d, yyyy\",ISO_8601:\"yyyy-mm-dd\",JULIAN:\"J\",RFC_822:\"D, d M yy\",RFC_850:\"DD, dd-M-yy\",RFC_1036:\"D, d M yy\",RFC_1123:\"D, d M yyyy\",RFC_2822:\"D, d M yyyy\",RSS:\"D, d M yy\",TICKS:\"!\",TIMESTAMP:\"@\",W3C:\"yyyy-mm-dd\",formatDate:function(t,e,r){if(\"string\"!=typeof t&&(r=e,e=t,t=\"\"),!e)return\"\";if(e.calendar()!==this)throw i.local.invalidFormat||i.regionalOptions[\"\"].invalidFormat;t=t||this.local.dateFormat;for(var n,a,o,s=(r=r||{}).dayNamesShort||this.local.dayNamesShort,l=r.dayNames||this.local.dayNames,c=r.monthNumbers||this.local.monthNumbers,u=r.monthNamesShort||this.local.monthNamesShort,h=r.monthNames||this.local.monthNames,f=(r.calculateWeek||this.local.calculateWeek,function(e,r){for(var n=1;b+n1}),p=function(t,e,r,n){var i=\"\"+e;if(f(t,n))for(;i.length1},x=function(t,r){var n=v(t,r),a=[2,3,n?4:2,n?4:2,10,11,20][\"oyYJ@!\".indexOf(t)+1],o=new RegExp(\"^-?\\\\d{1,\"+a+\"}\"),s=e.substring(A).match(o);if(!s)throw(i.local.missingNumberAt||i.regionalOptions[\"\"].missingNumberAt).replace(/\\{0\\}/,A);return A+=s[0].length,parseInt(s[0],10)},_=this,b=function(){if(\"function\"==typeof l){v(\"m\");var t=l.call(_,e.substring(A));return A+=t.length,t}return x(\"m\")},w=function(t,r,n,a){for(var o=v(t,a)?n:r,s=0;s-1){p=1,d=m;for(var E=this.daysInMonth(f,p);d>E;E=this.daysInMonth(f,p))p++,d-=E}return h>-1?this.fromJD(h):this.newDate(f,p,d)},determineDate:function(t,e,r,n,i){r&&\"object\"!=typeof r&&(i=n,n=r,r=null),\"string\"!=typeof n&&(i=n,n=\"\");var a=this;return e=e?e.newDate():null,null==t?e:\"string\"==typeof t?function(t){try{return a.parseDate(n,t,i)}catch(t){}for(var e=((t=t.toLowerCase()).match(/^c/)&&r?r.newDate():null)||a.today(),o=/([+-]?[0-9]+)\\s*(d|w|m|y)?/g,s=o.exec(t);s;)e.add(parseInt(s[1],10),s[2]||\"d\"),s=o.exec(t);return e}(t):\"number\"==typeof t?isNaN(t)||t===1/0||t===-1/0?e:a.today().add(t,\"d\"):a.newDate(t)}})},96144:function(t,e,r){\"use strict\";r.r(e);var n=r(85072),i=r.n(n),a=r(97825),o=r.n(a),s=r(77659),l=r.n(s),c=r(55056),u=r.n(c),h=r(10540),f=r.n(h),p=r(41113),d=r.n(p),m=r(5955),g={};g.styleTagTransform=d(),g.setAttributes=u(),g.insert=l().bind(null,\"head\"),g.domAPI=o(),g.insertStyleElement=f(),i()(m.A,g),e.default=m.A&&m.A.locals?m.A.locals:void 0},85072:function(t){\"use strict\";var e=[];function r(t){for(var r=-1,n=0;n0?\" \".concat(r.layer):\"\",\" {\")),n+=r.css,i&&(n+=\"}\"),r.media&&(n+=\"}\"),r.supports&&(n+=\"}\");var a=r.sourceMap;a&&\"undefined\"!=typeof btoa&&(n+=\"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(a)))),\" */\")),e.styleTagTransform(n,t,e.options)}(e,t,r)},remove:function(){!function(t){if(null===t.parentNode)return!1;t.parentNode.removeChild(t)}(e)}}}},41113:function(t){\"use strict\";t.exports=function(t,e){if(e.styleSheet)e.styleSheet.cssText=t;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(t))}}},25446:function(t){\"use strict\";t.exports=\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2722%27 height=%2722%27 fill=%27%23333%27 viewBox=%270 0 22 22%27%3E%3Cpath d=%27m1.754 13.406 4.453-4.851 3.09 3.09 3.281 3.277.969-.969-3.309-3.312 3.844-4.121 6.148 6.886h1.082v-.855l-7.207-8.07-4.84 5.187L6.169 6.57l-5.48 5.965v.871ZM.688 16.844h20.625v1.375H.688Zm0 0%27/%3E%3C/svg%3E\"},56694:function(t){\"use strict\";t.exports=\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2722%27 height=%2722%27 fill=%27%2333b5e5%27 viewBox=%270 0 22 22%27%3E%3Cpath d=%27m1.754 13.406 4.453-4.851 3.09 3.09 3.281 3.277.969-.969-3.309-3.312 3.844-4.121 6.148 6.886h1.082v-.855l-7.207-8.07-4.84 5.187L6.169 6.57l-5.48 5.965v.871ZM.688 16.844h20.625v1.375H.688Zm0 0%27/%3E%3C/svg%3E\"},26117:function(t){\"use strict\";t.exports=\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2724%27 height=%2724%27 fill-rule=%27evenodd%27 viewBox=%270 0 20 20%27%3E%3Cpath d=%27M4 10a6 6 0 1 0 12 0 6 6 0 1 0-12 0m5-3a1 1 0 1 0 2 0 1 1 0 1 0-2 0m0 3a1 1 0 1 1 2 0v3a1 1 0 1 1-2 0%27/%3E%3C/svg%3E\"},66311:function(t){\"use strict\";t.exports=\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2724%27 height=%2724%27 fill=%27%23fff%27 fill-rule=%27evenodd%27 viewBox=%270 0 20 20%27%3E%3Cpath d=%27M4 10a6 6 0 1 0 12 0 6 6 0 1 0-12 0m5-3a1 1 0 1 0 2 0 1 1 0 1 0-2 0m0 3a1 1 0 1 1 2 0v3a1 1 0 1 1-2 0%27/%3E%3C/svg%3E\"},24420:function(t){\"use strict\";t.exports=\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 fill=%27%23333%27 viewBox=%270 0 20 20%27%3E%3Cpath d=%27M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7%27/%3E%3Ccircle cx=%2710%27 cy=%2710%27 r=%272%27/%3E%3C/svg%3E\"},77035:function(t){\"use strict\";t.exports=\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 fill=%27%23333%27 viewBox=%270 0 29 29%27%3E%3Cpath d=%27M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13z%27/%3E%3C/svg%3E\"},43470:function(t){\"use strict\";t.exports=\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 fill=%27%23333%27 viewBox=%270 0 29 29%27%3E%3Cpath d=%27M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5%27/%3E%3C/svg%3E\"},13490:function(t){\"use strict\";t.exports=\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 fill=%27%23333%27 viewBox=%270 0 29 29%27%3E%3Cpath d=%27M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1z%27/%3E%3C/svg%3E\"},80216:function(t){\"use strict\";t.exports=\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 fill=%27%23333%27 viewBox=%270 0 29 29%27%3E%3Cpath d=%27m10.5 14 4-8 4 8z%27/%3E%3Cpath fill=%27%23ccc%27 d=%27m10.5 16 4 8 4-8z%27/%3E%3C/svg%3E\"},47695:function(t){\"use strict\";t.exports=\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 fill=%27%2333b5e5%27 viewBox=%270 0 20 20%27%3E%3Cpath d=%27M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7%27/%3E%3C/svg%3E\"},92228:function(t){\"use strict\";t.exports=\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 fill=%27%2333b5e5%27 viewBox=%270 0 20 20%27%3E%3Cpath d=%27M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7%27/%3E%3Ccircle cx=%2710%27 cy=%2710%27 r=%272%27/%3E%3C/svg%3E\"},43737:function(t){\"use strict\";t.exports=\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 fill=%27%23666%27 viewBox=%270 0 20 20%27%3E%3Cpath d=%27M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7%27/%3E%3Ccircle cx=%2710%27 cy=%2710%27 r=%272%27/%3E%3Cpath fill=%27red%27 d=%27m14 5 1 1-9 9-1-1z%27/%3E%3C/svg%3E\"},48460:function(t){\"use strict\";t.exports=\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 fill=%27%23999%27 viewBox=%270 0 20 20%27%3E%3Cpath d=%27M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7%27/%3E%3Ccircle cx=%2710%27 cy=%2710%27 r=%272%27/%3E%3Cpath fill=%27red%27 d=%27m14 5 1 1-9 9-1-1z%27/%3E%3C/svg%3E\"},75796:function(t){\"use strict\";t.exports=\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 fill=%27%23aaa%27 viewBox=%270 0 20 20%27%3E%3Cpath d=%27M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7%27/%3E%3Ccircle cx=%2710%27 cy=%2710%27 r=%272%27/%3E%3Cpath fill=%27red%27 d=%27m14 5 1 1-9 9-1-1z%27/%3E%3C/svg%3E\"},28869:function(t){\"use strict\";t.exports=\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 fill=%27%23e54e33%27 viewBox=%270 0 20 20%27%3E%3Cpath d=%27M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7%27/%3E%3C/svg%3E\"},9819:function(t){\"use strict\";t.exports=\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 fill=%27%23e58978%27 viewBox=%270 0 20 20%27%3E%3Cpath d=%27M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7%27/%3E%3Ccircle cx=%2710%27 cy=%2710%27 r=%272%27/%3E%3C/svg%3E\"},30557:function(t){\"use strict\";t.exports=\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 fill=%27%23fff%27 viewBox=%270 0 20 20%27%3E%3Cpath d=%27M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7%27/%3E%3Ccircle cx=%2710%27 cy=%2710%27 r=%272%27/%3E%3C/svg%3E\"},68164:function(t){\"use strict\";t.exports=\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 fill=%27%23fff%27 viewBox=%270 0 29 29%27%3E%3Cpath d=%27M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13z%27/%3E%3C/svg%3E\"},64665:function(t){\"use strict\";t.exports=\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 fill=%27%23fff%27 viewBox=%270 0 29 29%27%3E%3Cpath d=%27M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5%27/%3E%3C/svg%3E\"},91413:function(t){\"use strict\";t.exports=\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 fill=%27%23fff%27 viewBox=%270 0 29 29%27%3E%3Cpath d=%27M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1z%27/%3E%3C/svg%3E\"},13913:function(t){\"use strict\";t.exports=\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 fill=%27%23fff%27 viewBox=%270 0 29 29%27%3E%3Cpath d=%27M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1z%27/%3E%3C/svg%3E\"},61907:function(t){\"use strict\";t.exports=\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 fill=%27%23fff%27 viewBox=%270 0 29 29%27%3E%3Cpath d=%27m10.5 14 4-8 4 8z%27/%3E%3Cpath fill=%27%23ccc%27 d=%27m10.5 16 4 8 4-8z%27/%3E%3C/svg%3E\"},56539:function(t){\"use strict\";t.exports=\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 viewBox=%270 0 20 20%27%3E%3Cpath d=%27M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7%27/%3E%3Ccircle cx=%2710%27 cy=%2710%27 r=%272%27/%3E%3C/svg%3E\"},4890:function(t){\"use strict\";t.exports=\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 viewBox=%270 0 29 29%27%3E%3Cpath d=%27M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13z%27/%3E%3C/svg%3E\"},13363:function(t){\"use strict\";t.exports=\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 viewBox=%270 0 29 29%27%3E%3Cpath d=%27M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5%27/%3E%3C/svg%3E\"},47603:function(t){\"use strict\";t.exports=\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 viewBox=%270 0 29 29%27%3E%3Cpath d=%27M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1z%27/%3E%3C/svg%3E\"},64643:function(t){\"use strict\";t.exports=\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 viewBox=%270 0 29 29%27%3E%3Cpath d=%27M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1z%27/%3E%3C/svg%3E\"},68605:function(t){\"use strict\";t.exports=\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 viewBox=%270 0 29 29%27%3E%3Cpath d=%27m10.5 14 4-8 4 8z%27/%3E%3Cpath fill=%27%23ccc%27 d=%27m10.5 16 4 8 4-8z%27/%3E%3C/svg%3E\"},47914:function(t){\"use strict\";t.exports=\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2788%27 height=%2723%27 fill=%27none%27%3E%3Cpath fill=%27%23000%27 fill-opacity=%27.4%27 fill-rule=%27evenodd%27 d=%27M17.408 16.796h-1.827l2.501-12.095h.198l3.324 6.533.988 2.19.988-2.19 3.258-6.533h.181l2.6 12.095h-1.81l-1.218-5.644-.362-1.71-.658 1.71-2.929 5.644h-.098l-2.914-5.644-.757-1.71-.345 1.71zm1.958-3.42-.726 3.663a1.255 1.255 0 0 1-1.232 1.011h-1.827a1.255 1.255 0 0 1-1.229-1.509l2.501-12.095a1.255 1.255 0 0 1 1.23-1.001h.197a1.25 1.25 0 0 1 1.12.685l3.19 6.273 3.125-6.263a1.25 1.25 0 0 1 1.123-.695h.181a1.255 1.255 0 0 1 1.227.991l1.443 6.71a5 5 0 0 1 .314-.787l.009-.016a4.6 4.6 0 0 1 1.777-1.887c.782-.46 1.668-.667 2.611-.667a4.6 4.6 0 0 1 1.7.32l.306.134c.21-.16.474-.256.759-.256h1.694a1.255 1.255 0 0 1 1.212.925 1.255 1.255 0 0 1 1.212-.925h1.711c.284 0 .545.094.755.252.613-.3 1.312-.45 2.075-.45 1.356 0 2.557.445 3.482 1.4q.47.48.763 1.064V4.701a1.255 1.255 0 0 1 1.255-1.255h1.86A1.255 1.255 0 0 1 54.44 4.7v9.194h2.217c.19 0 .37.043.532.118v-4.77c0-.356.147-.678.385-.906a2.42 2.42 0 0 1-.682-1.71c0-.665.267-1.253.735-1.7a2.45 2.45 0 0 1 1.722-.674 2.43 2.43 0 0 1 1.705.675q.318.302.504.683V4.7a1.255 1.255 0 0 1 1.255-1.255h1.744A1.255 1.255 0 0 1 65.812 4.7v3.335a4.8 4.8 0 0 1 1.526-.246c.938 0 1.817.214 2.59.69a4.47 4.47 0 0 1 1.67 1.743v-.98a1.255 1.255 0 0 1 1.256-1.256h1.777c.233 0 .451.064.639.174a3.4 3.4 0 0 1 1.567-.372c.346 0 .861.02 1.285.232a1.25 1.25 0 0 1 .689 1.004 4.7 4.7 0 0 1 .853-.588c.795-.44 1.675-.647 2.61-.647 1.385 0 2.65.39 3.525 1.396.836.938 1.168 2.173 1.168 3.528q-.001.515-.056 1.051a1.255 1.255 0 0 1-.947 1.09l.408.952a1.255 1.255 0 0 1-.477 1.552c-.418.268-.92.463-1.458.612-.613.171-1.304.244-2.049.244-1.06 0-2.043-.207-2.886-.698l-.015-.008c-.798-.48-1.419-1.135-1.818-1.963l-.004-.008a5.8 5.8 0 0 1-.548-2.512q0-.429.053-.843a1.3 1.3 0 0 1-.333-.086l-.166-.004c-.223 0-.426.062-.643.228-.03.024-.142.139-.142.59v3.883a1.255 1.255 0 0 1-1.256 1.256h-1.777a1.255 1.255 0 0 1-1.256-1.256V15.69l-.032.057a4.8 4.8 0 0 1-1.86 1.833 5.04 5.04 0 0 1-2.484.634 4.5 4.5 0 0 1-1.935-.424 1.25 1.25 0 0 1-.764.258h-1.71a1.255 1.255 0 0 1-1.256-1.255V7.687a2.4 2.4 0 0 1-.428.625c.253.23.412.561.412.93v7.553a1.255 1.255 0 0 1-1.256 1.255h-1.843a1.25 1.25 0 0 1-.894-.373c-.228.23-.544.373-.894.373H51.32a1.255 1.255 0 0 1-1.256-1.255v-1.251l-.061.117a4.7 4.7 0 0 1-1.782 1.884 4.77 4.77 0 0 1-2.485.67 5.6 5.6 0 0 1-1.485-.188l.009 2.764a1.255 1.255 0 0 1-1.255 1.259h-1.729a1.255 1.255 0 0 1-1.255-1.255v-3.537a1.255 1.255 0 0 1-1.167.793h-1.679a1.25 1.25 0 0 1-.77-.263 4.5 4.5 0 0 1-1.945.429c-.885 0-1.724-.21-2.495-.632l-.017-.01a5 5 0 0 1-1.081-.836 1.255 1.255 0 0 1-1.254 1.312h-1.81a1.255 1.255 0 0 1-1.228-.99l-.782-3.625-2.044 3.939a1.25 1.25 0 0 1-1.115.676h-.098a1.25 1.25 0 0 1-1.116-.68l-2.061-3.994zM35.92 16.63l.207-.114.223-.15q.493-.356.735-.785l.061-.118.033 1.332h1.678V9.242h-1.694l-.033 1.267q-.133-.329-.526-.658l-.032-.028a3.2 3.2 0 0 0-.668-.428l-.27-.12a3.3 3.3 0 0 0-1.235-.23q-1.136-.001-1.974.493a3.36 3.36 0 0 0-1.3 1.382q-.445.89-.444 2.074 0 1.2.51 2.107a3.8 3.8 0 0 0 1.382 1.381 3.9 3.9 0 0 0 1.893.477q.795 0 1.455-.33zm-2.789-5.38q-.576.675-.575 1.762 0 1.102.559 1.794.576.675 1.645.675a2.25 2.25 0 0 0 .934-.19 2.2 2.2 0 0 0 .468-.29l.178-.161a2.2 2.2 0 0 0 .397-.561q.244-.5.244-1.15v-.115q0-.708-.296-1.267l-.043-.077a2.2 2.2 0 0 0-.633-.709l-.13-.086-.047-.028a2.1 2.1 0 0 0-1.073-.285q-1.052 0-1.629.692zm2.316 2.706c.163-.17.28-.407.28-.83v-.114c0-.292-.06-.508-.15-.68a.96.96 0 0 0-.353-.389.85.85 0 0 0-.464-.127c-.4 0-.56.114-.664.239l-.01.012c-.148.174-.275.45-.275.945 0 .506.122.801.27.99.097.11.266.224.68.224.303 0 .504-.09.687-.269zm7.545 1.705a2.6 2.6 0 0 0 .331.423q.319.33.755.548l.173.074q.65.255 1.49.255 1.02 0 1.844-.493a3.45 3.45 0 0 0 1.316-1.4q.493-.904.493-2.089 0-1.909-.988-2.913-.988-1.02-2.584-1.02-.898 0-1.575.347a3 3 0 0 0-.415.262l-.199.166a3.4 3.4 0 0 0-.64.82V9.242h-1.712v11.553h1.729l-.017-5.134zm.53-1.138q.206.29.48.5l.155.11.053.034q.51.296 1.119.297 1.07 0 1.645-.675.577-.69.576-1.762 0-1.119-.576-1.777-.558-.675-1.645-.675-.435 0-.835.16a2 2 0 0 0-.284.136 2 2 0 0 0-.363.254 2.2 2.2 0 0 0-.46.569l-.082.162a2.6 2.6 0 0 0-.213 1.072v.115q0 .707.296 1.267l.135.211zm.964-.818a1.1 1.1 0 0 0 .367.385.94.94 0 0 0 .476.118c.423 0 .59-.117.687-.23.159-.194.28-.478.28-.95 0-.53-.133-.8-.266-.952l-.021-.025c-.078-.094-.231-.221-.68-.221a1 1 0 0 0-.503.135l-.012.007a.86.86 0 0 0-.335.343c-.073.133-.132.324-.132.614v.115a1.4 1.4 0 0 0 .14.66zm15.7-6.222q.347-.346.346-.856a1.05 1.05 0 0 0-.345-.79 1.18 1.18 0 0 0-.84-.329q-.51 0-.855.33a1.05 1.05 0 0 0-.346.79q0 .51.346.855.345.346.856.346.51 0 .839-.346zm4.337 9.314.033-1.332q.191.403.59.747l.098.081a4 4 0 0 0 .316.224l.223.122a3.2 3.2 0 0 0 1.44.322 3.8 3.8 0 0 0 1.875-.477 3.5 3.5 0 0 0 1.382-1.366q.527-.89.526-2.09 0-1.184-.444-2.073a3.24 3.24 0 0 0-1.283-1.399q-.823-.51-1.942-.51a3.5 3.5 0 0 0-1.527.344l-.086.043-.165.09a3 3 0 0 0-.33.214q-.432.315-.656.707a2 2 0 0 0-.099.198l.082-1.283V4.701h-1.744v12.095zm.473-2.509a2.5 2.5 0 0 0 .566.7q.117.098.245.18l.144.08a2.1 2.1 0 0 0 .975.232q1.07 0 1.645-.675.576-.69.576-1.778 0-1.102-.576-1.777-.56-.691-1.645-.692a2.2 2.2 0 0 0-1.015.235q-.22.113-.415.282l-.15.142a2.1 2.1 0 0 0-.42.594q-.223.479-.223 1.1v.115q0 .705.293 1.26zm2.616-.293c.157-.191.28-.479.28-.967 0-.51-.13-.79-.276-.961l-.021-.026c-.082-.1-.232-.225-.67-.225a.87.87 0 0 0-.681.279l-.012.011c-.154.155-.274.38-.274.807v.115c0 .285.057.499.144.669a1.1 1.1 0 0 0 .367.405c.137.082.28.123.455.123.423 0 .59-.118.686-.23zm8.266-3.013q.345-.13.724-.14l.069-.002q.493 0 .642.099l.247-1.794q-.196-.099-.717-.099a2.3 2.3 0 0 0-.545.063 2 2 0 0 0-.411.148 2.2 2.2 0 0 0-.4.249 2.5 2.5 0 0 0-.485.499 2.7 2.7 0 0 0-.32.581l-.05.137v-1.48h-1.778v7.553h1.777v-3.884q0-.546.159-.943a1.5 1.5 0 0 1 .466-.636 2.5 2.5 0 0 1 .399-.253 2 2 0 0 1 .224-.099zm9.784 2.656.05-.922q0-1.743-.856-2.698-.838-.97-2.584-.97-1.119-.001-2.007.493a3.46 3.46 0 0 0-1.4 1.382q-.493.906-.493 2.106 0 1.07.428 1.975.428.89 1.332 1.432.906.526 2.255.526.973 0 1.668-.185l.044-.012.135-.04q.613-.184.984-.421l-.542-1.267q-.3.162-.642.274l-.297.087q-.51.131-1.3.131-.954 0-1.497-.444a1.6 1.6 0 0 1-.192-.193q-.366-.44-.512-1.234l-.004-.021zm-5.427-1.256-.003.022h3.752v-.138q-.011-.727-.288-1.118a1 1 0 0 0-.156-.176q-.46-.428-1.316-.428-.986 0-1.494.604-.379.45-.494 1.234zm-27.053 2.77V4.7h-1.86v12.095h5.333V15.15zm7.103-5.908v7.553h-1.843V9.242h1.843z%27/%3E%3Cpath fill=%27%23fff%27 d=%27m19.63 11.151-.757-1.71-.345 1.71-1.12 5.644h-1.827L18.083 4.7h.197l3.325 6.533.988 2.19.988-2.19L26.839 4.7h.181l2.6 12.095h-1.81l-1.218-5.644-.362-1.71-.658 1.71-2.93 5.644h-.098l-2.913-5.644zm14.836 5.81q-1.02 0-1.893-.478a3.8 3.8 0 0 1-1.381-1.382q-.51-.906-.51-2.106 0-1.185.444-2.074a3.36 3.36 0 0 1 1.3-1.382q.839-.494 1.974-.494a3.3 3.3 0 0 1 1.234.231 3.3 3.3 0 0 1 .97.575q.396.33.527.659l.033-1.267h1.694v7.553H37.18l-.033-1.332q-.279.593-1.02 1.053a3.17 3.17 0 0 1-1.662.444zm.296-1.482q.938 0 1.58-.642.642-.66.642-1.711v-.115q0-.708-.296-1.267a2.2 2.2 0 0 0-.807-.872 2.1 2.1 0 0 0-1.119-.313q-1.053 0-1.629.692-.575.675-.575 1.76 0 1.103.559 1.795.577.675 1.645.675zm6.521-6.237h1.711v1.4q.906-1.597 2.83-1.597 1.596 0 2.584 1.02.988 1.005.988 2.914 0 1.185-.493 2.09a3.46 3.46 0 0 1-1.316 1.399 3.5 3.5 0 0 1-1.844.493q-.954 0-1.662-.329a2.67 2.67 0 0 1-1.086-.97l.017 5.134h-1.728zm4.048 6.22q1.07 0 1.645-.674.577-.69.576-1.762 0-1.119-.576-1.777-.558-.675-1.645-.675-.592 0-1.12.296-.51.28-.822.823-.296.527-.296 1.234v.115q0 .708.296 1.267.313.543.823.855.51.296 1.119.297z%27/%3E%3Cpath fill=%27%23e1e3e9%27 d=%27M51.325 4.7h1.86v10.45h3.473v1.646h-5.333zm7.12 4.542h1.843v7.553h-1.843zm.905-1.415a1.16 1.16 0 0 1-.856-.346 1.17 1.17 0 0 1-.346-.856 1.05 1.05 0 0 1 .346-.79q.346-.329.856-.329.494 0 .839.33a1.05 1.05 0 0 1 .345.79 1.16 1.16 0 0 1-.345.855q-.33.346-.84.346zm7.875 9.133a3.17 3.17 0 0 1-1.662-.444q-.723-.46-1.004-1.053l-.033 1.332h-1.71V4.701h1.743v4.657l-.082 1.283q.279-.658 1.086-1.119a3.5 3.5 0 0 1 1.778-.477q1.119 0 1.942.51a3.24 3.24 0 0 1 1.283 1.4q.445.888.444 2.072 0 1.201-.526 2.09a3.5 3.5 0 0 1-1.382 1.366 3.8 3.8 0 0 1-1.876.477zm-.296-1.481q1.069 0 1.645-.675.577-.69.577-1.778 0-1.102-.577-1.776-.56-.691-1.645-.692a2.12 2.12 0 0 0-1.58.659q-.642.641-.642 1.694v.115q0 .71.296 1.267a2.4 2.4 0 0 0 .807.872 2.1 2.1 0 0 0 1.119.313zm5.927-6.237h1.777v1.481q.263-.757.856-1.217a2.14 2.14 0 0 1 1.349-.46q.527 0 .724.098l-.247 1.794q-.149-.099-.642-.099-.774 0-1.416.494-.626.493-.626 1.58v3.883h-1.777V9.242zm9.534 7.718q-1.35 0-2.255-.526-.904-.543-1.332-1.432a4.6 4.6 0 0 1-.428-1.975q0-1.2.493-2.106a3.46 3.46 0 0 1 1.4-1.382q.889-.495 2.007-.494 1.744 0 2.584.97.855.956.856 2.7 0 .444-.05.92h-5.43q.18 1.005.708 1.45.542.443 1.497.443.79 0 1.3-.131a4 4 0 0 0 .938-.362l.542 1.267q-.411.263-1.119.46-.708.198-1.711.197zm1.596-4.558q.016-1.02-.444-1.432-.46-.428-1.316-.428-1.728 0-1.991 1.86z%27/%3E%3Cpath d=%27M5.074 15.948a.484.657 0 0 0-.486.659v1.84a.484.657 0 0 0 .486.659h4.101a.484.657 0 0 0 .486-.659v-1.84a.484.657 0 0 0-.486-.659zm3.56 1.16H5.617v.838h3.017z%27 style=%27fill:%23fff;fill-rule:evenodd;stroke-width:1.03600001%27/%3E%3Cg style=%27stroke-width:1.12603545%27%3E%3Cpath d=%27M-9.408-1.416c-3.833-.025-7.056 2.912-7.08 6.615-.02 3.08 1.653 4.832 3.107 6.268.903.892 1.721 1.74 2.32 2.902l-.525-.004c-.543-.003-.992.304-1.24.639a1.87 1.87 0 0 0-.362 1.121l-.011 1.877c-.003.402.104.787.347 1.125.244.338.688.653 1.23.656l4.142.028c.542.003.99-.306 1.238-.641a1.87 1.87 0 0 0 .363-1.121l.012-1.875a1.87 1.87 0 0 0-.348-1.127c-.243-.338-.688-.653-1.23-.656l-.518-.004c.597-1.145 1.425-1.983 2.348-2.87 1.473-1.414 3.18-3.149 3.2-6.226-.016-3.59-2.923-6.684-6.993-6.707m-.006 1.1v.002c3.274.02 5.92 2.532 5.9 5.6-.017 2.706-1.39 4.026-2.863 5.44-1.034.994-2.118 2.033-2.814 3.633-.018.041-.052.055-.075.065q-.013.004-.02.01a.34.34 0 0 1-.226.084.34.34 0 0 1-.224-.086l-.092-.077c-.699-1.615-1.768-2.669-2.781-3.67-1.454-1.435-2.797-2.762-2.78-5.478.02-3.067 2.7-5.545 5.975-5.523m-.02 2.826c-1.62-.01-2.944 1.315-2.955 2.96-.01 1.646 1.295 2.988 2.916 2.999h.002c1.621.01 2.943-1.316 2.953-2.961.011-1.646-1.294-2.988-2.916-2.998m-.005 1.1c1.017.006 1.829.83 1.822 1.89s-.83 1.874-1.848 1.867c-1.018-.006-1.829-.83-1.822-1.89s.83-1.874 1.848-1.868m-2.155 11.857 4.14.025c.271.002.49.305.487.676l-.013 1.875c-.003.37-.224.67-.495.668l-4.14-.025c-.27-.002-.487-.306-.485-.676l.012-1.875c.003-.37.224-.67.494-.668%27 style=%27color:%23000;font-style:normal;font-variant:normal;font-weight:400;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:%23000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:evenodd;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:%23000;solid-opacity:1;vector-effect:none;fill:%23000;fill-opacity:.4;fill-rule:evenodd;stroke:none;stroke-width:2.47727823;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto%27 transform=%27translate%2815.553 2.85%29scale%28.88807%29%27/%3E%3Cpath d=%27M-9.415-.316C-12.69-.338-15.37 2.14-15.39 5.207c-.017 2.716 1.326 4.041 2.78 5.477 1.013 1 2.081 2.055 2.78 3.67l.092.076a.34.34 0 0 0 .225.086.34.34 0 0 0 .227-.083l.019-.01c.022-.009.057-.024.074-.064.697-1.6 1.78-2.64 2.814-3.634 1.473-1.414 2.847-2.733 2.864-5.44.02-3.067-2.627-5.58-5.901-5.601m-.057 8.784c1.621.011 2.944-1.315 2.955-2.96.01-1.646-1.295-2.988-2.916-2.999-1.622-.01-2.945 1.315-2.955 2.96s1.295 2.989 2.916 3%27 style=%27clip-rule:evenodd;fill:%23e1e3e9;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.47727823;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:.4%27 transform=%27translate%2815.553 2.85%29scale%28.88807%29%27/%3E%3Cpath d=%27M-11.594 15.465c-.27-.002-.492.297-.494.668l-.012 1.876c-.003.371.214.673.485.675l4.14.027c.271.002.492-.298.495-.668l.012-1.877c.003-.37-.215-.672-.485-.674z%27 style=%27clip-rule:evenodd;fill:%23fff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.47727823;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:.4%27 transform=%27translate%2815.553 2.85%29scale%28.88807%29%27/%3E%3C/g%3E%3C/svg%3E\"},63779:function(){},77199:function(){},61990:function(t,e,r){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var n=r(85846),i=r(66030);function a(t){return i.geomReduce.call(void 0,t,((t,e)=>t+function(t){let e,r=0;switch(t.type){case\"Polygon\":return o(t.coordinates);case\"MultiPolygon\":for(e=0;e0){e+=Math.abs(c(t[0]));for(let r=1;r=e?(n+2)%e:n+2],s=i[0]*l,c=a[1]*l;r+=(o[0]*l-s)*Math.sin(c),n++}return r*s}var u=a;e.area=a,e.default=u},25368:function(t,e,r){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var n=r(66030);function i(t,e={}){if(null!=t.bbox&&!0!==e.recompute)return t.bbox;const r=[1/0,1/0,-1/0,-1/0];return n.coordEach.call(void 0,t,(t=>{r[0]>t[0]&&(r[0]=t[0]),r[1]>t[1]&&(r[1]=t[1]),r[2]0?t>180?t-360:t:t<-180?t+360:t},e.bearingToAzimuth=function(t){let e=t%360;return e<0&&(e+=360),e},e.convertArea=function(t,e=\"meters\",r=\"kilometers\"){if(!(t>=0))throw new Error(\"area must be a positive number\");const n=i[e];if(!n)throw new Error(\"invalid original units\");const a=i[r];if(!a)throw new Error(\"invalid final units\");return t/n*a},e.convertLength=function(t,e=\"kilometers\",r=\"kilometers\"){if(!(t>=0))throw new Error(\"length must be a positive number\");return p(d(t,e),r)},e.degreesToRadians=function(t){return t%360*Math.PI/180},e.earthRadius=r,e.factors=n,e.feature=a,e.featureCollection=c,e.geometry=function(t,e,r={}){switch(t){case\"Point\":return o(e).geometry;case\"LineString\":return l(e).geometry;case\"Polygon\":return s(e).geometry;case\"MultiPoint\":return h(e).geometry;case\"MultiLineString\":return u(e).geometry;case\"MultiPolygon\":return f(e).geometry;default:throw new Error(t+\" is invalid\")}},e.geometryCollection=function(t,e,r={}){return a({type:\"GeometryCollection\",geometries:t},e,r)},e.isNumber=g,e.isObject=function(t){return null!==t&&\"object\"==typeof t&&!Array.isArray(t)},e.lengthToDegrees=function(t,e){return m(d(t,e))},e.lengthToRadians=d,e.lineString=l,e.lineStrings=function(t,e,r={}){return c(t.map((t=>l(t,e))),r)},e.multiLineString=u,e.multiPoint=h,e.multiPolygon=f,e.point=o,e.points=function(t,e,r={}){return c(t.map((t=>o(t,e))),r)},e.polygon=s,e.polygons=function(t,e,r={}){return c(t.map((t=>s(t,e))),r)},e.radiansToDegrees=m,e.radiansToLength=p,e.round=function(t,e=0){if(e&&!(e>=0))throw new Error(\"precision must be a positive number\");const r=Math.pow(10,e||0);return Math.round(t*r)/r},e.validateBBox=function(t){if(!t)throw new Error(\"bbox is required\");if(!Array.isArray(t))throw new Error(\"bbox must be an Array\");if(4!==t.length&&6!==t.length)throw new Error(\"bbox must be an Array of 4 or 6 numbers\");t.forEach((t=>{if(!g(t))throw new Error(\"bbox must only contain numbers\")}))},e.validateId=function(t){if(!t)throw new Error(\"id is required\");if(-1===[\"string\",\"number\"].indexOf(typeof t))throw new Error(\"id must be a number or a string\")}},66030:function(t,e,r){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var n=r(85846);function i(t,e,r){if(null!==t)for(var n,a,o,s,l,c,u,h,f=0,p=0,d=t.type,m=\"FeatureCollection\"===d,g=\"Feature\"===d,y=m?t.features.length:1,v=0;vc||p>u||d>h)return l=i,c=r,u=p,h=d,void(o=0);var m=n.lineString.call(void 0,[l,i],t.properties);if(!1===e(m,r,a,d,o))return!1;o++,l=i}))&&void 0}}}))}function u(t,e){if(!t)throw new Error(\"geojson is required\");l(t,(function(t,r,i){if(null!==t.geometry){var a=t.geometry.type,o=t.geometry.coordinates;switch(a){case\"LineString\":if(!1===e(t,r,i,0,0))return!1;break;case\"Polygon\":for(var s=0;s1)return 1;for(var r=t,n=0;n<8;n++){var i=this.sampleCurveX(r)-t;if(Math.abs(i)i?o=r:s=r,r=.5*(s-o)+o;return r},solve:function(t,e){return this.sampleCurveY(this.solveCurveX(t,e))}};var l=r(o);let c,u;function h(){return null==c&&(c=\"undefined\"!=typeof OffscreenCanvas&&new OffscreenCanvas(1,1).getContext(\"2d\")&&\"function\"==typeof createImageBitmap),c}function f(){if(null==u&&(u=!1,h())){const t=5,e=new OffscreenCanvas(t,t).getContext(\"2d\",{willReadFrequently:!0});if(e){for(let r=0;ri.solve(t)}const d=p(.25,.1,.25,1);function m(t,e,r){return Math.min(r,Math.max(e,t))}function g(t,e,r){const n=r-e,i=((t-e)%n+n)%n+e;return i===e?r:i}function y(t,...e){for(const r of e)for(const e in r)t[e]=r[e];return t}let v=1;function x(t,e,r){const n={};for(const r in t)n[r]=e.call(this,t[r],r,t);return n}function _(t,e,r){const n={};for(const r in t)e.call(this,t[r],r,t)&&(n[r]=t[r]);return n}function b(t){return Array.isArray(t)?t.map(b):\"object\"==typeof t&&t?x(t,b):t}const w={};function T(t){w[t]||(\"undefined\"!=typeof console&&console.warn(t),w[t]=!0)}function k(t,e,r){return(r.y-t.y)*(e.x-t.x)>(e.y-t.y)*(r.x-t.x)}function A(t){return\"undefined\"!=typeof WorkerGlobalScope&&void 0!==t&&t instanceof WorkerGlobalScope}let M=null;function S(t){return\"undefined\"!=typeof ImageBitmap&&t instanceof ImageBitmap}const E=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII=\";function C(t,r,n,i,a){return e(this,void 0,void 0,(function*(){if(\"undefined\"==typeof VideoFrame)throw new Error(\"VideoFrame not supported\");const e=new VideoFrame(t,{timestamp:0});try{const o=null==e?void 0:e.format;if(!o||!o.startsWith(\"BGR\")&&!o.startsWith(\"RGB\"))throw new Error(`Unrecognized format ${o}`);const s=o.startsWith(\"BGR\"),l=new Uint8ClampedArray(i*a*4);if(yield e.copyTo(l,function(t,e,r,n,i){const a=4*Math.max(-e,0),o=(Math.max(0,r)-r)*n*4+a,s=4*n,l=Math.max(0,e),c=Math.max(0,r);return{rect:{x:l,y:c,width:Math.min(t.width,e+n)-l,height:Math.min(t.height,r+i)-c},layout:[{offset:o,stride:s}]}}(t,r,n,i,a)),s)for(let t=0;tA(self)?self.worker&&self.worker.referrer:(\"blob:\"===window.location.protocol?window.parent:window).location.href;const N=function(t,r){if(/:\\/\\//.test(t.url)&&!/^https?:|^file:/.test(t.url)){const e=D(t.url);if(e)return e(t,r);if(A(self)&&self.worker&&self.worker.actor)return self.worker.actor.sendAsync({type:\"GR\",data:t,targetMapId:R},r)}if(n=t.url,!(/^file:/.test(n)||/^file:/.test(B())&&!/^\\w+:/.test(n))){if(fetch&&Request&&AbortController&&Object.prototype.hasOwnProperty.call(Request.prototype,\"signal\"))return function(t,r){return e(this,void 0,void 0,(function*(){const e=new Request(t.url,{method:t.method||\"GET\",body:t.body,credentials:t.credentials,headers:t.headers,cache:t.cache,referrer:B(),signal:r.signal});\"json\"!==t.type||e.headers.has(\"Accept\")||e.headers.set(\"Accept\",\"application/json\");const n=yield fetch(e);if(!n.ok){const e=yield n.blob();throw new F(n.status,n.statusText,t.url,e)}let i;i=\"arrayBuffer\"===t.type||\"image\"===t.type?n.arrayBuffer():\"json\"===t.type?n.json():n.text();const a=yield i;if(r.signal.aborted)throw z();return{data:a,cacheControl:n.headers.get(\"Cache-Control\"),expires:n.headers.get(\"Expires\")}}))}(t,r);if(A(self)&&self.worker&&self.worker.actor)return self.worker.actor.sendAsync({type:\"GR\",data:t,mustQueue:!0,targetMapId:R},r)}var n;return function(t,e){return new Promise(((r,n)=>{var i;const a=new XMLHttpRequest;a.open(t.method||\"GET\",t.url,!0),\"arrayBuffer\"!==t.type&&\"image\"!==t.type||(a.responseType=\"arraybuffer\");for(const e in t.headers)a.setRequestHeader(e,t.headers[e]);\"json\"===t.type&&(a.responseType=\"text\",(null===(i=t.headers)||void 0===i?void 0:i.Accept)||a.setRequestHeader(\"Accept\",\"application/json\")),a.withCredentials=\"include\"===t.credentials,a.onerror=()=>{n(new Error(a.statusText))},a.onload=()=>{if(!e.signal.aborted)if((a.status>=200&&a.status<300||0===a.status)&&null!==a.response){let e=a.response;if(\"json\"===t.type)try{e=JSON.parse(a.response)}catch(t){return void n(t)}r({data:e,cacheControl:a.getResponseHeader(\"Cache-Control\"),expires:a.getResponseHeader(\"Expires\")})}else{const e=new Blob([a.response],{type:a.getResponseHeader(\"Content-Type\")});n(new F(a.status,a.statusText,t.url,e))}},e.signal.addEventListener(\"abort\",(()=>{a.abort(),n(z())})),a.send(t.body)}))}(t,r)};function j(t){if(!t||t.indexOf(\"://\")<=0||0===t.indexOf(\"data:image/\")||0===t.indexOf(\"blob:\"))return!0;const e=new URL(t),r=window.location;return e.protocol===r.protocol&&e.host===r.host}function U(t,e,r){r[t]&&-1!==r[t].indexOf(e)||(r[t]=r[t]||[],r[t].push(e))}function V(t,e,r){if(r&&r[t]){const n=r[t].indexOf(e);-1!==n&&r[t].splice(n,1)}}class q{constructor(t,e={}){y(this,e),this.type=t}}class H extends q{constructor(t,e={}){super(\"error\",y({error:t},e))}}class G{on(t,e){return this._listeners=this._listeners||{},U(t,e,this._listeners),this}off(t,e){return V(t,e,this._listeners),V(t,e,this._oneTimeListeners),this}once(t,e){return e?(this._oneTimeListeners=this._oneTimeListeners||{},U(t,e,this._oneTimeListeners),this):new Promise((e=>this.once(t,e)))}fire(t,e){\"string\"==typeof t&&(t=new q(t,e||{}));const r=t.type;if(this.listens(r)){t.target=this;const e=this._listeners&&this._listeners[r]?this._listeners[r].slice():[];for(const r of e)r.call(this,t);const n=this._oneTimeListeners&&this._oneTimeListeners[r]?this._oneTimeListeners[r].slice():[];for(const e of n)V(r,e,this._oneTimeListeners),e.call(this,t);const i=this._eventedParent;i&&(y(t,\"function\"==typeof this._eventedParentData?this._eventedParentData():this._eventedParentData),i.fire(t))}else t instanceof H&&console.error(t.error);return this}listens(t){return this._listeners&&this._listeners[t]&&this._listeners[t].length>0||this._oneTimeListeners&&this._oneTimeListeners[t]&&this._oneTimeListeners[t].length>0||this._eventedParent&&this._eventedParent.listens(t)}setEventedParent(t,e){return this._eventedParent=t,this._eventedParentData=e,this}}var Z={$version:8,$root:{version:{required:!0,type:\"enum\",values:[8]},name:{type:\"string\"},metadata:{type:\"*\"},center:{type:\"array\",value:\"number\"},zoom:{type:\"number\"},bearing:{type:\"number\",default:0,period:360,units:\"degrees\"},pitch:{type:\"number\",default:0,units:\"degrees\"},light:{type:\"light\"},sky:{type:\"sky\"},projection:{type:\"projection\"},terrain:{type:\"terrain\"},sources:{required:!0,type:\"sources\"},sprite:{type:\"sprite\"},glyphs:{type:\"string\"},transition:{type:\"transition\"},layers:{required:!0,type:\"array\",value:\"layer\"}},sources:{\"*\":{type:\"source\"}},source:[\"source_vector\",\"source_raster\",\"source_raster_dem\",\"source_geojson\",\"source_video\",\"source_image\"],source_vector:{type:{required:!0,type:\"enum\",values:{vector:{}}},url:{type:\"string\"},tiles:{type:\"array\",value:\"string\"},bounds:{type:\"array\",value:\"number\",length:4,default:[-180,-85.051129,180,85.051129]},scheme:{type:\"enum\",values:{xyz:{},tms:{}},default:\"xyz\"},minzoom:{type:\"number\",default:0},maxzoom:{type:\"number\",default:22},attribution:{type:\"string\"},promoteId:{type:\"promoteId\"},volatile:{type:\"boolean\",default:!1},\"*\":{type:\"*\"}},source_raster:{type:{required:!0,type:\"enum\",values:{raster:{}}},url:{type:\"string\"},tiles:{type:\"array\",value:\"string\"},bounds:{type:\"array\",value:\"number\",length:4,default:[-180,-85.051129,180,85.051129]},minzoom:{type:\"number\",default:0},maxzoom:{type:\"number\",default:22},tileSize:{type:\"number\",default:512,units:\"pixels\"},scheme:{type:\"enum\",values:{xyz:{},tms:{}},default:\"xyz\"},attribution:{type:\"string\"},volatile:{type:\"boolean\",default:!1},\"*\":{type:\"*\"}},source_raster_dem:{type:{required:!0,type:\"enum\",values:{\"raster-dem\":{}}},url:{type:\"string\"},tiles:{type:\"array\",value:\"string\"},bounds:{type:\"array\",value:\"number\",length:4,default:[-180,-85.051129,180,85.051129]},minzoom:{type:\"number\",default:0},maxzoom:{type:\"number\",default:22},tileSize:{type:\"number\",default:512,units:\"pixels\"},attribution:{type:\"string\"},encoding:{type:\"enum\",values:{terrarium:{},mapbox:{},custom:{}},default:\"mapbox\"},redFactor:{type:\"number\",default:1},blueFactor:{type:\"number\",default:1},greenFactor:{type:\"number\",default:1},baseShift:{type:\"number\",default:0},volatile:{type:\"boolean\",default:!1},\"*\":{type:\"*\"}},source_geojson:{type:{required:!0,type:\"enum\",values:{geojson:{}}},data:{required:!0,type:\"*\"},maxzoom:{type:\"number\",default:18},attribution:{type:\"string\"},buffer:{type:\"number\",default:128,maximum:512,minimum:0},filter:{type:\"*\"},tolerance:{type:\"number\",default:.375},cluster:{type:\"boolean\",default:!1},clusterRadius:{type:\"number\",default:50,minimum:0},clusterMaxZoom:{type:\"number\"},clusterMinPoints:{type:\"number\"},clusterProperties:{type:\"*\"},lineMetrics:{type:\"boolean\",default:!1},generateId:{type:\"boolean\",default:!1},promoteId:{type:\"promoteId\"}},source_video:{type:{required:!0,type:\"enum\",values:{video:{}}},urls:{required:!0,type:\"array\",value:\"string\"},coordinates:{required:!0,type:\"array\",length:4,value:{type:\"array\",length:2,value:\"number\"}}},source_image:{type:{required:!0,type:\"enum\",values:{image:{}}},url:{required:!0,type:\"string\"},coordinates:{required:!0,type:\"array\",length:4,value:{type:\"array\",length:2,value:\"number\"}}},layer:{id:{type:\"string\",required:!0},type:{type:\"enum\",values:{fill:{},line:{},symbol:{},circle:{},heatmap:{},\"fill-extrusion\":{},raster:{},hillshade:{},background:{}},required:!0},metadata:{type:\"*\"},source:{type:\"string\"},\"source-layer\":{type:\"string\"},minzoom:{type:\"number\",minimum:0,maximum:24},maxzoom:{type:\"number\",minimum:0,maximum:24},filter:{type:\"filter\"},layout:{type:\"layout\"},paint:{type:\"paint\"}},layout:[\"layout_fill\",\"layout_line\",\"layout_circle\",\"layout_heatmap\",\"layout_fill-extrusion\",\"layout_symbol\",\"layout_raster\",\"layout_hillshade\",\"layout_background\"],layout_background:{visibility:{type:\"enum\",values:{visible:{},none:{}},default:\"visible\",\"property-type\":\"constant\"}},layout_fill:{\"fill-sort-key\":{type:\"number\",expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},visibility:{type:\"enum\",values:{visible:{},none:{}},default:\"visible\",\"property-type\":\"constant\"}},layout_circle:{\"circle-sort-key\":{type:\"number\",expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},visibility:{type:\"enum\",values:{visible:{},none:{}},default:\"visible\",\"property-type\":\"constant\"}},layout_heatmap:{visibility:{type:\"enum\",values:{visible:{},none:{}},default:\"visible\",\"property-type\":\"constant\"}},\"layout_fill-extrusion\":{visibility:{type:\"enum\",values:{visible:{},none:{}},default:\"visible\",\"property-type\":\"constant\"}},layout_line:{\"line-cap\":{type:\"enum\",values:{butt:{},round:{},square:{}},default:\"butt\",expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"line-join\":{type:\"enum\",values:{bevel:{},round:{},miter:{}},default:\"miter\",expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"line-miter-limit\":{type:\"number\",default:2,requires:[{\"line-join\":\"miter\"}],expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"line-round-limit\":{type:\"number\",default:1.05,requires:[{\"line-join\":\"round\"}],expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"line-sort-key\":{type:\"number\",expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},visibility:{type:\"enum\",values:{visible:{},none:{}},default:\"visible\",\"property-type\":\"constant\"}},layout_symbol:{\"symbol-placement\":{type:\"enum\",values:{point:{},line:{},\"line-center\":{}},default:\"point\",expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"symbol-spacing\":{type:\"number\",default:250,minimum:1,units:\"pixels\",requires:[{\"symbol-placement\":\"line\"}],expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"symbol-avoid-edges\":{type:\"boolean\",default:!1,expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"symbol-sort-key\":{type:\"number\",expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"symbol-z-order\":{type:\"enum\",values:{auto:{},\"viewport-y\":{},source:{}},default:\"auto\",expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"icon-allow-overlap\":{type:\"boolean\",default:!1,requires:[\"icon-image\",{\"!\":\"icon-overlap\"}],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"icon-overlap\":{type:\"enum\",values:{never:{},always:{},cooperative:{}},requires:[\"icon-image\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"icon-ignore-placement\":{type:\"boolean\",default:!1,requires:[\"icon-image\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"icon-optional\":{type:\"boolean\",default:!1,requires:[\"icon-image\",\"text-field\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"icon-rotation-alignment\":{type:\"enum\",values:{map:{},viewport:{},auto:{}},default:\"auto\",requires:[\"icon-image\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"icon-size\":{type:\"number\",default:1,minimum:0,units:\"factor of the original icon size\",requires:[\"icon-image\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"icon-text-fit\":{type:\"enum\",values:{none:{},width:{},height:{},both:{}},default:\"none\",requires:[\"icon-image\",\"text-field\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"icon-text-fit-padding\":{type:\"array\",value:\"number\",length:4,default:[0,0,0,0],units:\"pixels\",requires:[\"icon-image\",\"text-field\",{\"icon-text-fit\":[\"both\",\"width\",\"height\"]}],expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"icon-image\":{type:\"resolvedImage\",tokens:!0,expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"icon-rotate\":{type:\"number\",default:0,period:360,units:\"degrees\",requires:[\"icon-image\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"icon-padding\":{type:\"padding\",default:[2],units:\"pixels\",requires:[\"icon-image\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"icon-keep-upright\":{type:\"boolean\",default:!1,requires:[\"icon-image\",{\"icon-rotation-alignment\":\"map\"},{\"symbol-placement\":[\"line\",\"line-center\"]}],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"icon-offset\":{type:\"array\",value:\"number\",length:2,default:[0,0],requires:[\"icon-image\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"icon-anchor\":{type:\"enum\",values:{center:{},left:{},right:{},top:{},bottom:{},\"top-left\":{},\"top-right\":{},\"bottom-left\":{},\"bottom-right\":{}},default:\"center\",requires:[\"icon-image\"],expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"icon-pitch-alignment\":{type:\"enum\",values:{map:{},viewport:{},auto:{}},default:\"auto\",requires:[\"icon-image\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-pitch-alignment\":{type:\"enum\",values:{map:{},viewport:{},auto:{}},default:\"auto\",requires:[\"text-field\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-rotation-alignment\":{type:\"enum\",values:{map:{},viewport:{},\"viewport-glyph\":{},auto:{}},default:\"auto\",requires:[\"text-field\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-field\":{type:\"formatted\",default:\"\",tokens:!0,expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-font\":{type:\"array\",value:\"string\",default:[\"Open Sans Regular\",\"Arial Unicode MS Regular\"],requires:[\"text-field\"],expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-size\":{type:\"number\",default:16,minimum:0,units:\"pixels\",requires:[\"text-field\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-max-width\":{type:\"number\",default:10,minimum:0,units:\"ems\",requires:[\"text-field\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-line-height\":{type:\"number\",default:1.2,units:\"ems\",requires:[\"text-field\"],expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-letter-spacing\":{type:\"number\",default:0,units:\"ems\",requires:[\"text-field\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-justify\":{type:\"enum\",values:{auto:{},left:{},center:{},right:{}},default:\"center\",requires:[\"text-field\"],expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-radial-offset\":{type:\"number\",units:\"ems\",default:0,requires:[\"text-field\"],\"property-type\":\"data-driven\",expression:{interpolated:!0,parameters:[\"zoom\",\"feature\"]}},\"text-variable-anchor\":{type:\"array\",value:\"enum\",values:{center:{},left:{},right:{},top:{},bottom:{},\"top-left\":{},\"top-right\":{},\"bottom-left\":{},\"bottom-right\":{}},requires:[\"text-field\",{\"symbol-placement\":[\"point\"]}],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-variable-anchor-offset\":{type:\"variableAnchorOffsetCollection\",requires:[\"text-field\",{\"symbol-placement\":[\"point\"]}],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-anchor\":{type:\"enum\",values:{center:{},left:{},right:{},top:{},bottom:{},\"top-left\":{},\"top-right\":{},\"bottom-left\":{},\"bottom-right\":{}},default:\"center\",requires:[\"text-field\",{\"!\":\"text-variable-anchor\"}],expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-max-angle\":{type:\"number\",default:45,units:\"degrees\",requires:[\"text-field\",{\"symbol-placement\":[\"line\",\"line-center\"]}],expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-writing-mode\":{type:\"array\",value:\"enum\",values:{horizontal:{},vertical:{}},requires:[\"text-field\",{\"symbol-placement\":[\"point\"]}],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-rotate\":{type:\"number\",default:0,period:360,units:\"degrees\",requires:[\"text-field\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-padding\":{type:\"number\",default:2,minimum:0,units:\"pixels\",requires:[\"text-field\"],expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-keep-upright\":{type:\"boolean\",default:!0,requires:[\"text-field\",{\"text-rotation-alignment\":\"map\"},{\"symbol-placement\":[\"line\",\"line-center\"]}],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-transform\":{type:\"enum\",values:{none:{},uppercase:{},lowercase:{}},default:\"none\",requires:[\"text-field\"],expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-offset\":{type:\"array\",value:\"number\",units:\"ems\",length:2,default:[0,0],requires:[\"text-field\",{\"!\":\"text-radial-offset\"}],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"data-driven\"},\"text-allow-overlap\":{type:\"boolean\",default:!1,requires:[\"text-field\",{\"!\":\"text-overlap\"}],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-overlap\":{type:\"enum\",values:{never:{},always:{},cooperative:{}},requires:[\"text-field\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-ignore-placement\":{type:\"boolean\",default:!1,requires:[\"text-field\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-optional\":{type:\"boolean\",default:!1,requires:[\"text-field\",\"icon-image\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},visibility:{type:\"enum\",values:{visible:{},none:{}},default:\"visible\",\"property-type\":\"constant\"}},layout_raster:{visibility:{type:\"enum\",values:{visible:{},none:{}},default:\"visible\",\"property-type\":\"constant\"}},layout_hillshade:{visibility:{type:\"enum\",values:{visible:{},none:{}},default:\"visible\",\"property-type\":\"constant\"}},filter:{type:\"array\",value:\"*\"},filter_operator:{type:\"enum\",values:{\"==\":{},\"!=\":{},\">\":{},\">=\":{},\"<\":{},\"<=\":{},in:{},\"!in\":{},all:{},any:{},none:{},has:{},\"!has\":{}}},geometry_type:{type:\"enum\",values:{Point:{},LineString:{},Polygon:{}}},function:{expression:{type:\"expression\"},stops:{type:\"array\",value:\"function_stop\"},base:{type:\"number\",default:1,minimum:0},property:{type:\"string\",default:\"$zoom\"},type:{type:\"enum\",values:{identity:{},exponential:{},interval:{},categorical:{}},default:\"exponential\"},colorSpace:{type:\"enum\",values:{rgb:{},lab:{},hcl:{}},default:\"rgb\"},default:{type:\"*\",required:!1}},function_stop:{type:\"array\",minimum:0,maximum:24,value:[\"number\",\"color\"],length:2},expression:{type:\"array\",value:\"*\",minimum:1},light:{anchor:{type:\"enum\",default:\"viewport\",values:{map:{},viewport:{}},\"property-type\":\"data-constant\",transition:!1,expression:{interpolated:!1,parameters:[\"zoom\"]}},position:{type:\"array\",default:[1.15,210,30],length:3,value:\"number\",\"property-type\":\"data-constant\",transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]}},color:{type:\"color\",\"property-type\":\"data-constant\",default:\"#ffffff\",expression:{interpolated:!0,parameters:[\"zoom\"]},transition:!0},intensity:{type:\"number\",\"property-type\":\"data-constant\",default:.5,minimum:0,maximum:1,expression:{interpolated:!0,parameters:[\"zoom\"]},transition:!0}},sky:{\"sky-color\":{type:\"color\",\"property-type\":\"data-constant\",default:\"#88C6FC\",expression:{interpolated:!0,parameters:[\"zoom\"]},transition:!0},\"horizon-color\":{type:\"color\",\"property-type\":\"data-constant\",default:\"#ffffff\",expression:{interpolated:!0,parameters:[\"zoom\"]},transition:!0},\"fog-color\":{type:\"color\",\"property-type\":\"data-constant\",default:\"#ffffff\",expression:{interpolated:!0,parameters:[\"zoom\"]},transition:!0},\"fog-ground-blend\":{type:\"number\",\"property-type\":\"data-constant\",default:.5,minimum:0,maximum:1,expression:{interpolated:!0,parameters:[\"zoom\"]},transition:!0},\"horizon-fog-blend\":{type:\"number\",\"property-type\":\"data-constant\",default:.8,minimum:0,maximum:1,expression:{interpolated:!0,parameters:[\"zoom\"]},transition:!0},\"sky-horizon-blend\":{type:\"number\",\"property-type\":\"data-constant\",default:.8,minimum:0,maximum:1,expression:{interpolated:!0,parameters:[\"zoom\"]},transition:!0},\"atmosphere-blend\":{type:\"number\",\"property-type\":\"data-constant\",default:.8,minimum:0,maximum:1,expression:{interpolated:!0,parameters:[\"zoom\"]},transition:!0}},terrain:{source:{type:\"string\",required:!0},exaggeration:{type:\"number\",minimum:0,default:1}},projection:{type:{type:\"enum\",default:\"mercator\",values:{mercator:{},globe:{}}}},paint:[\"paint_fill\",\"paint_line\",\"paint_circle\",\"paint_heatmap\",\"paint_fill-extrusion\",\"paint_symbol\",\"paint_raster\",\"paint_hillshade\",\"paint_background\"],paint_fill:{\"fill-antialias\":{type:\"boolean\",default:!0,expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"fill-opacity\":{type:\"number\",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"fill-color\":{type:\"color\",default:\"#000000\",transition:!0,requires:[{\"!\":\"fill-pattern\"}],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"fill-outline-color\":{type:\"color\",transition:!0,requires:[{\"!\":\"fill-pattern\"},{\"fill-antialias\":!0}],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"fill-translate\":{type:\"array\",value:\"number\",length:2,default:[0,0],transition:!0,units:\"pixels\",expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"fill-translate-anchor\":{type:\"enum\",values:{map:{},viewport:{}},default:\"map\",requires:[\"fill-translate\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"fill-pattern\":{type:\"resolvedImage\",transition:!0,expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"cross-faded-data-driven\"}},\"paint_fill-extrusion\":{\"fill-extrusion-opacity\":{type:\"number\",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"fill-extrusion-color\":{type:\"color\",default:\"#000000\",transition:!0,requires:[{\"!\":\"fill-extrusion-pattern\"}],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"fill-extrusion-translate\":{type:\"array\",value:\"number\",length:2,default:[0,0],transition:!0,units:\"pixels\",expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"fill-extrusion-translate-anchor\":{type:\"enum\",values:{map:{},viewport:{}},default:\"map\",requires:[\"fill-extrusion-translate\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"fill-extrusion-pattern\":{type:\"resolvedImage\",transition:!0,expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"cross-faded-data-driven\"},\"fill-extrusion-height\":{type:\"number\",default:0,minimum:0,units:\"meters\",transition:!0,expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"fill-extrusion-base\":{type:\"number\",default:0,minimum:0,units:\"meters\",transition:!0,requires:[\"fill-extrusion-height\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"fill-extrusion-vertical-gradient\":{type:\"boolean\",default:!0,transition:!1,expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"}},paint_line:{\"line-opacity\":{type:\"number\",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"line-color\":{type:\"color\",default:\"#000000\",transition:!0,requires:[{\"!\":\"line-pattern\"}],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"line-translate\":{type:\"array\",value:\"number\",length:2,default:[0,0],transition:!0,units:\"pixels\",expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"line-translate-anchor\":{type:\"enum\",values:{map:{},viewport:{}},default:\"map\",requires:[\"line-translate\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"line-width\":{type:\"number\",default:1,minimum:0,transition:!0,units:\"pixels\",expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"line-gap-width\":{type:\"number\",default:0,minimum:0,transition:!0,units:\"pixels\",expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"line-offset\":{type:\"number\",default:0,transition:!0,units:\"pixels\",expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"line-blur\":{type:\"number\",default:0,minimum:0,transition:!0,units:\"pixels\",expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"line-dasharray\":{type:\"array\",value:\"number\",minimum:0,transition:!0,units:\"line widths\",requires:[{\"!\":\"line-pattern\"}],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"cross-faded\"},\"line-pattern\":{type:\"resolvedImage\",transition:!0,expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]},\"property-type\":\"cross-faded-data-driven\"},\"line-gradient\":{type:\"color\",transition:!1,requires:[{\"!\":\"line-dasharray\"},{\"!\":\"line-pattern\"},{source:\"geojson\",has:{lineMetrics:!0}}],expression:{interpolated:!0,parameters:[\"line-progress\"]},\"property-type\":\"color-ramp\"}},paint_circle:{\"circle-radius\":{type:\"number\",default:5,minimum:0,transition:!0,units:\"pixels\",expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"circle-color\":{type:\"color\",default:\"#000000\",transition:!0,expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"circle-blur\":{type:\"number\",default:0,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"circle-opacity\":{type:\"number\",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"circle-translate\":{type:\"array\",value:\"number\",length:2,default:[0,0],transition:!0,units:\"pixels\",expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"circle-translate-anchor\":{type:\"enum\",values:{map:{},viewport:{}},default:\"map\",requires:[\"circle-translate\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"circle-pitch-scale\":{type:\"enum\",values:{map:{},viewport:{}},default:\"map\",expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"circle-pitch-alignment\":{type:\"enum\",values:{map:{},viewport:{}},default:\"viewport\",expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"circle-stroke-width\":{type:\"number\",default:0,minimum:0,transition:!0,units:\"pixels\",expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"circle-stroke-color\":{type:\"color\",default:\"#000000\",transition:!0,expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"circle-stroke-opacity\":{type:\"number\",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"}},paint_heatmap:{\"heatmap-radius\":{type:\"number\",default:30,minimum:1,transition:!0,units:\"pixels\",expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"heatmap-weight\":{type:\"number\",default:1,minimum:0,transition:!1,expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"heatmap-intensity\":{type:\"number\",default:1,minimum:0,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"heatmap-color\":{type:\"color\",default:[\"interpolate\",[\"linear\"],[\"heatmap-density\"],0,\"rgba(0, 0, 255, 0)\",.1,\"royalblue\",.3,\"cyan\",.5,\"lime\",.7,\"yellow\",1,\"red\"],transition:!1,expression:{interpolated:!0,parameters:[\"heatmap-density\"]},\"property-type\":\"color-ramp\"},\"heatmap-opacity\":{type:\"number\",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"}},paint_symbol:{\"icon-opacity\":{type:\"number\",default:1,minimum:0,maximum:1,transition:!0,requires:[\"icon-image\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"icon-color\":{type:\"color\",default:\"#000000\",transition:!0,requires:[\"icon-image\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"icon-halo-color\":{type:\"color\",default:\"rgba(0, 0, 0, 0)\",transition:!0,requires:[\"icon-image\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"icon-halo-width\":{type:\"number\",default:0,minimum:0,transition:!0,units:\"pixels\",requires:[\"icon-image\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"icon-halo-blur\":{type:\"number\",default:0,minimum:0,transition:!0,units:\"pixels\",requires:[\"icon-image\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"icon-translate\":{type:\"array\",value:\"number\",length:2,default:[0,0],transition:!0,units:\"pixels\",requires:[\"icon-image\"],expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"icon-translate-anchor\":{type:\"enum\",values:{map:{},viewport:{}},default:\"map\",requires:[\"icon-image\",\"icon-translate\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-opacity\":{type:\"number\",default:1,minimum:0,maximum:1,transition:!0,requires:[\"text-field\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"text-color\":{type:\"color\",default:\"#000000\",transition:!0,overridable:!0,requires:[\"text-field\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"text-halo-color\":{type:\"color\",default:\"rgba(0, 0, 0, 0)\",transition:!0,requires:[\"text-field\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"text-halo-width\":{type:\"number\",default:0,minimum:0,transition:!0,units:\"pixels\",requires:[\"text-field\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"text-halo-blur\":{type:\"number\",default:0,minimum:0,transition:!0,units:\"pixels\",requires:[\"text-field\"],expression:{interpolated:!0,parameters:[\"zoom\",\"feature\",\"feature-state\"]},\"property-type\":\"data-driven\"},\"text-translate\":{type:\"array\",value:\"number\",length:2,default:[0,0],transition:!0,units:\"pixels\",requires:[\"text-field\"],expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"text-translate-anchor\":{type:\"enum\",values:{map:{},viewport:{}},default:\"map\",requires:[\"text-field\",\"text-translate\"],expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"}},paint_raster:{\"raster-opacity\":{type:\"number\",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"raster-hue-rotate\":{type:\"number\",default:0,period:360,transition:!0,units:\"degrees\",expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"raster-brightness-min\":{type:\"number\",default:0,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"raster-brightness-max\":{type:\"number\",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"raster-saturation\":{type:\"number\",default:0,minimum:-1,maximum:1,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"raster-contrast\":{type:\"number\",default:0,minimum:-1,maximum:1,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"raster-resampling\":{type:\"enum\",values:{linear:{},nearest:{}},default:\"linear\",expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"raster-fade-duration\":{type:\"number\",default:300,minimum:0,transition:!1,units:\"milliseconds\",expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"}},paint_hillshade:{\"hillshade-illumination-direction\":{type:\"number\",default:335,minimum:0,maximum:359,transition:!1,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"hillshade-illumination-anchor\":{type:\"enum\",values:{map:{},viewport:{}},default:\"viewport\",expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"hillshade-exaggeration\":{type:\"number\",default:.5,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"hillshade-shadow-color\":{type:\"color\",default:\"#000000\",transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"hillshade-highlight-color\":{type:\"color\",default:\"#FFFFFF\",transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"hillshade-accent-color\":{type:\"color\",default:\"#000000\",transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"}},paint_background:{\"background-color\":{type:\"color\",default:\"#000000\",transition:!0,requires:[{\"!\":\"background-pattern\"}],expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"},\"background-pattern\":{type:\"resolvedImage\",transition:!0,expression:{interpolated:!1,parameters:[\"zoom\"]},\"property-type\":\"cross-faded\"},\"background-opacity\":{type:\"number\",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:[\"zoom\"]},\"property-type\":\"data-constant\"}},transition:{duration:{type:\"number\",default:300,minimum:0,units:\"milliseconds\"},delay:{type:\"number\",default:0,minimum:0,units:\"milliseconds\"}},\"property-type\":{\"data-driven\":{type:\"property-type\"},\"cross-faded\":{type:\"property-type\"},\"cross-faded-data-driven\":{type:\"property-type\"},\"color-ramp\":{type:\"property-type\"},\"data-constant\":{type:\"property-type\"},constant:{type:\"property-type\"}},promoteId:{\"*\":{type:\"string\"}}};const W=[\"type\",\"source\",\"source-layer\",\"minzoom\",\"maxzoom\",\"filter\",\"layout\"];function Y(t,e){const r={};for(const e in t)\"ref\"!==e&&(r[e]=t[e]);return W.forEach((t=>{t in e&&(r[t]=e[t])})),r}function X(t,e){if(Array.isArray(t)){if(!Array.isArray(e)||t.length!==e.length)return!1;for(let r=0;r`:\"value\"===t.itemType.kind?\"array\":`array<${e}>`}return t.kind}const wt=[lt,ct,ut,ht,ft,gt,pt,_t(dt),yt,vt,xt];function Tt(t,e){if(\"error\"===e.kind)return null;if(\"array\"===t.kind){if(\"array\"===e.kind&&(0===e.N&&\"value\"===e.itemType.kind||!Tt(t.itemType,e.itemType))&&(\"number\"!=typeof t.N||t.N===e.N))return null}else{if(t.kind===e.kind)return null;if(\"value\"===t.kind)for(const t of wt)if(!Tt(t,e))return null}return`Expected ${bt(t)} but found ${bt(e)} instead.`}function kt(t,e){return e.some((e=>e.kind===t.kind))}function At(t,e){return e.some((e=>\"null\"===e?null===t:\"array\"===e?Array.isArray(t):\"object\"===e?t&&!Array.isArray(t)&&\"object\"==typeof t:e===typeof t))}function Mt(t,e){return\"array\"===t.kind&&\"array\"===e.kind?t.itemType.kind===e.itemType.kind&&\"number\"==typeof t.N:t.kind===e.kind}const St=.96422,Et=1,Ct=.82521,Lt=4/29,It=6/29,Pt=3*It*It,zt=It*It*It,Ot=Math.PI/180,Dt=180/Math.PI;function Rt(t){return(t%=360)<0&&(t+=360),t}function Ft([t,e,r,n]){let i,a;const o=Nt((.2225045*(t=Bt(t))+.7168786*(e=Bt(e))+.0606169*(r=Bt(r)))/Et);t===e&&e===r?i=a=o:(i=Nt((.4360747*t+.3850649*e+.1430804*r)/St),a=Nt((.0139322*t+.0971045*e+.7141733*r)/Ct));const s=116*o-16;return[s<0?0:s,500*(i-o),200*(o-a),n]}function Bt(t){return t<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function Nt(t){return t>zt?Math.pow(t,1/3):t/Pt+Lt}function jt([t,e,r,n]){let i=(t+16)/116,a=isNaN(e)?i:i+e/500,o=isNaN(r)?i:i-r/200;return i=Et*Vt(i),a=St*Vt(a),o=Ct*Vt(o),[Ut(3.1338561*a-1.6168667*i-.4906146*o),Ut(-.9787684*a+1.9161415*i+.033454*o),Ut(.0719453*a-.2289914*i+1.4052427*o),n]}function Ut(t){return(t=t<=.00304?12.92*t:1.055*Math.pow(t,1/2.4)-.055)<0?0:t>1?1:t}function Vt(t){return t>It?t*t*t:Pt*(t-Lt)}function qt(t){if(\"transparent\"===(t=t.toLowerCase().trim()))return[0,0,0,0];const e=Yt[t];if(e){const[t,r,n]=e;return[t/255,r/255,n/255,1]}if(t.startsWith(\"#\")&&/^#(?:[0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/.test(t)){const e=t.length<6?1:2;let r=1;return[Ht(t.slice(r,r+=e)),Ht(t.slice(r,r+=e)),Ht(t.slice(r,r+=e)),Ht(t.slice(r,r+e)||\"ff\")]}if(t.startsWith(\"rgb\")){const e=/^rgba?\\(\\s*([\\de.+-]+)(%)?(?:\\s+|\\s*(,)\\s*)([\\de.+-]+)(%)?(?:\\s+|\\s*(,)\\s*)([\\de.+-]+)(%)?(?:\\s*([,\\/])\\s*([\\de.+-]+)(%)?)?\\s*\\)$/,r=t.match(e);if(r){const[t,e,n,i,a,o,s,l,c,u,h,f]=r,p=[i||\" \",s||\" \",u].join(\"\");if(\" \"===p||\" /\"===p||\",,\"===p||\",,,\"===p){const t=[n,o,c].join(\"\"),r=\"%%%\"===t?100:\"\"===t?255:0;if(r){const t=[Zt(+e/r,0,1),Zt(+a/r,0,1),Zt(+l/r,0,1),h?Gt(+h,f):1];if(Wt(t))return t}}return}}const r=t.match(/^hsla?\\(\\s*([\\de.+-]+)(?:deg)?(?:\\s+|\\s*(,)\\s*)([\\de.+-]+)%(?:\\s+|\\s*(,)\\s*)([\\de.+-]+)%(?:\\s*([,\\/])\\s*([\\de.+-]+)(%)?)?\\s*\\)$/);if(r){const[t,e,n,i,a,o,s,l,c]=r,u=[n||\" \",a||\" \",s].join(\"\");if(\" \"===u||\" /\"===u||\",,\"===u||\",,,\"===u){const t=[+e,Zt(+i,0,100),Zt(+o,0,100),l?Gt(+l,c):1];if(Wt(t))return function([t,e,r,n]){function i(n){const i=(n+t/30)%12,a=e*Math.min(r,1-r);return r-a*Math.max(-1,Math.min(i-3,9-i,1))}return t=Rt(t),e/=100,r/=100,[i(0),i(8),i(4),n]}(t)}}}function Ht(t){return parseInt(t.padEnd(2,t),16)/255}function Gt(t,e){return Zt(e?t/100:t,0,1)}function Zt(t,e,r){return Math.min(Math.max(e,t),r)}function Wt(t){return!t.some(Number.isNaN)}const Yt={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]};class Xt{constructor(t,e,r,n=1,i=!0){this.r=t,this.g=e,this.b=r,this.a=n,i||(this.r*=n,this.g*=n,this.b*=n,n||this.overwriteGetter(\"rgb\",[t,e,r,n]))}static parse(t){if(t instanceof Xt)return t;if(\"string\"!=typeof t)return;const e=qt(t);return e?new Xt(...e,!1):void 0}get rgb(){const{r:t,g:e,b:r,a:n}=this,i=n||1/0;return this.overwriteGetter(\"rgb\",[t/i,e/i,r/i,n])}get hcl(){return this.overwriteGetter(\"hcl\",function(t){const[e,r,n,i]=Ft(t),a=Math.sqrt(r*r+n*n);return[Math.round(1e4*a)?Rt(Math.atan2(n,r)*Dt):NaN,a,e,i]}(this.rgb))}get lab(){return this.overwriteGetter(\"lab\",Ft(this.rgb))}overwriteGetter(t,e){return Object.defineProperty(this,t,{value:e}),e}toString(){const[t,e,r,n]=this.rgb;return`rgba(${[t,e,r].map((t=>Math.round(255*t))).join(\",\")},${n})`}}Xt.black=new Xt(0,0,0,1),Xt.white=new Xt(1,1,1,1),Xt.transparent=new Xt(0,0,0,0),Xt.red=new Xt(1,0,0,1);class $t{constructor(t,e,r){this.sensitivity=t?e?\"variant\":\"case\":e?\"accent\":\"base\",this.locale=r,this.collator=new Intl.Collator(this.locale?this.locale:[],{sensitivity:this.sensitivity,usage:\"search\"})}compare(t,e){return this.collator.compare(t,e)}resolvedLocale(){return new Intl.Collator(this.locale?this.locale:[]).resolvedOptions().locale}}class Jt{constructor(t,e,r,n,i){this.text=t,this.image=e,this.scale=r,this.fontStack=n,this.textColor=i}}class Kt{constructor(t){this.sections=t}static fromString(t){return new Kt([new Jt(t,null,null,null,null)])}isEmpty(){return 0===this.sections.length||!this.sections.some((t=>0!==t.text.length||t.image&&0!==t.image.name.length))}static factory(t){return t instanceof Kt?t:Kt.fromString(t)}toString(){return 0===this.sections.length?\"\":this.sections.map((t=>t.text)).join(\"\")}}class Qt{constructor(t){this.values=t.slice()}static parse(t){if(t instanceof Qt)return t;if(\"number\"==typeof t)return new Qt([t,t,t,t]);if(Array.isArray(t)&&!(t.length<1||t.length>4)){for(const e of t)if(\"number\"!=typeof e)return;switch(t.length){case 1:t=[t[0],t[0],t[0],t[0]];break;case 2:t=[t[0],t[1],t[0],t[1]];break;case 3:t=[t[0],t[1],t[2],t[1]]}return new Qt(t)}}toString(){return JSON.stringify(this.values)}}const te=new Set([\"center\",\"left\",\"right\",\"top\",\"bottom\",\"top-left\",\"top-right\",\"bottom-left\",\"bottom-right\"]);class ee{constructor(t){this.values=t.slice()}static parse(t){if(t instanceof ee)return t;if(Array.isArray(t)&&!(t.length<1)&&t.length%2==0){for(let e=0;e=0&&t<=255&&\"number\"==typeof e&&e>=0&&e<=255&&\"number\"==typeof r&&r>=0&&r<=255?void 0===n||\"number\"==typeof n&&n>=0&&n<=1?null:`Invalid rgba value [${[t,e,r,n].join(\", \")}]: 'a' must be between 0 and 1.`:`Invalid rgba value [${(\"number\"==typeof n?[t,e,r,n]:[t,e,r]).join(\", \")}]: 'r', 'g', and 'b' must be between 0 and 255.`}function ie(t){if(null===t||\"string\"==typeof t||\"boolean\"==typeof t||\"number\"==typeof t||t instanceof Xt||t instanceof $t||t instanceof Kt||t instanceof Qt||t instanceof ee||t instanceof re)return!0;if(Array.isArray(t)){for(const e of t)if(!ie(e))return!1;return!0}if(\"object\"==typeof t){for(const e in t)if(!ie(t[e]))return!1;return!0}return!1}function ae(t){if(null===t)return lt;if(\"string\"==typeof t)return ut;if(\"boolean\"==typeof t)return ht;if(\"number\"==typeof t)return ct;if(t instanceof Xt)return ft;if(t instanceof $t)return mt;if(t instanceof Kt)return gt;if(t instanceof Qt)return yt;if(t instanceof ee)return xt;if(t instanceof re)return vt;if(Array.isArray(t)){const e=t.length;let r;for(const e of t){const t=ae(e);if(r){if(r===t)continue;r=dt;break}r=t}return _t(r||dt,e)}return pt}function oe(t){const e=typeof t;return null===t?\"\":\"string\"===e||\"number\"===e||\"boolean\"===e?String(t):t instanceof Xt||t instanceof Kt||t instanceof Qt||t instanceof ee||t instanceof re?t.toString():JSON.stringify(t)}class se{constructor(t,e){this.type=t,this.value=e}static parse(t,e){if(2!==t.length)return e.error(`'literal' expression requires exactly one argument, but found ${t.length-1} instead.`);if(!ie(t[1]))return e.error(\"invalid value\");const r=t[1];let n=ae(r);const i=e.expectedType;return\"array\"!==n.kind||0!==n.N||!i||\"array\"!==i.kind||\"number\"==typeof i.N&&0!==i.N||(n=i),new se(n,r)}evaluate(){return this.value}eachChild(){}outputDefined(){return!0}}class le{constructor(t){this.name=\"ExpressionEvaluationError\",this.message=t}toJSON(){return this.message}}const ce={string:ut,number:ct,boolean:ht,object:pt};class ue{constructor(t,e){this.type=t,this.args=e}static parse(t,e){if(t.length<2)return e.error(\"Expected at least one argument.\");let r,n=1;const i=t[0];if(\"array\"===i){let i,a;if(t.length>2){const r=t[1];if(\"string\"!=typeof r||!(r in ce)||\"object\"===r)return e.error('The item type argument of \"array\" must be one of string, number, boolean',1);i=ce[r],n++}else i=dt;if(t.length>3){if(null!==t[2]&&(\"number\"!=typeof t[2]||t[2]<0||t[2]!==Math.floor(t[2])))return e.error('The length argument to \"array\" must be a positive integer literal',2);a=t[2],n++}r=_t(i,a)}else{if(!ce[i])throw new Error(`Types doesn't contain name = ${i}`);r=ce[i]}const a=[];for(;nt.outputDefined()))}}const he={\"to-boolean\":ht,\"to-color\":ft,\"to-number\":ct,\"to-string\":ut};class fe{constructor(t,e){this.type=t,this.args=e}static parse(t,e){if(t.length<2)return e.error(\"Expected at least one argument.\");const r=t[0];if(!he[r])throw new Error(`Can't parse ${r} as it is not part of the known types`);if((\"to-boolean\"===r||\"to-string\"===r)&&2!==t.length)return e.error(\"Expected one argument.\");const n=he[r],i=[];for(let r=1;r4?`Invalid rbga value ${JSON.stringify(e)}: expected an array containing either three or four numeric values.`:ne(e[0],e[1],e[2],e[3]),!r))return new Xt(e[0]/255,e[1]/255,e[2]/255,e[3])}throw new le(r||`Could not parse color from value '${\"string\"==typeof e?e:JSON.stringify(e)}'`)}case\"padding\":{let e;for(const r of this.args){e=r.evaluate(t);const n=Qt.parse(e);if(n)return n}throw new le(`Could not parse padding from value '${\"string\"==typeof e?e:JSON.stringify(e)}'`)}case\"variableAnchorOffsetCollection\":{let e;for(const r of this.args){e=r.evaluate(t);const n=ee.parse(e);if(n)return n}throw new le(`Could not parse variableAnchorOffsetCollection from value '${\"string\"==typeof e?e:JSON.stringify(e)}'`)}case\"number\":{let e=null;for(const r of this.args){if(e=r.evaluate(t),null===e)return 0;const n=Number(e);if(!isNaN(n))return n}throw new le(`Could not convert ${JSON.stringify(e)} to number.`)}case\"formatted\":return Kt.fromString(oe(this.args[0].evaluate(t)));case\"resolvedImage\":return re.fromString(oe(this.args[0].evaluate(t)));default:return oe(this.args[0].evaluate(t))}}eachChild(t){this.args.forEach(t)}outputDefined(){return this.args.every((t=>t.outputDefined()))}}const pe=[\"Unknown\",\"Point\",\"LineString\",\"Polygon\"];class de{constructor(){this.globals=null,this.feature=null,this.featureState=null,this.formattedSection=null,this._parseColorCache={},this.availableImages=null,this.canonical=null}id(){return this.feature&&\"id\"in this.feature?this.feature.id:null}geometryType(){return this.feature?\"number\"==typeof this.feature.type?pe[this.feature.type]:this.feature.type:null}geometry(){return this.feature&&\"geometry\"in this.feature?this.feature.geometry:null}canonicalID(){return this.canonical}properties(){return this.feature&&this.feature.properties||{}}parseColor(t){let e=this._parseColorCache[t];return e||(e=this._parseColorCache[t]=Xt.parse(t)),e}}class me{constructor(t,e,r=[],n,i=new st,a=[]){this.registry=t,this.path=r,this.key=r.map((t=>`[${t}]`)).join(\"\"),this.scope=i,this.errors=a,this.expectedType=n,this._isConstant=e}parse(t,e,r,n,i={}){return e?this.concat(e,r,n)._parse(t,i):this._parse(t,i)}_parse(t,e){function r(t,e,r){return\"assert\"===r?new ue(e,[t]):\"coerce\"===r?new fe(e,[t]):t}if(null!==t&&\"string\"!=typeof t&&\"boolean\"!=typeof t&&\"number\"!=typeof t||(t=[\"literal\",t]),Array.isArray(t)){if(0===t.length)return this.error('Expected an array with at least one element. If you wanted a literal array, use [\"literal\", []].');const n=t[0];if(\"string\"!=typeof n)return this.error(`Expression name must be a string, but found ${typeof n} instead. If you wanted a literal array, use [\"literal\", [...]].`,0),null;const i=this.registry[n];if(i){let n=i.parse(t,this);if(!n)return null;if(this.expectedType){const t=this.expectedType,i=n.type;if(\"string\"!==t.kind&&\"number\"!==t.kind&&\"boolean\"!==t.kind&&\"object\"!==t.kind&&\"array\"!==t.kind||\"value\"!==i.kind)if(\"color\"!==t.kind&&\"formatted\"!==t.kind&&\"resolvedImage\"!==t.kind||\"value\"!==i.kind&&\"string\"!==i.kind)if(\"padding\"!==t.kind||\"value\"!==i.kind&&\"number\"!==i.kind&&\"array\"!==i.kind)if(\"variableAnchorOffsetCollection\"!==t.kind||\"value\"!==i.kind&&\"array\"!==i.kind){if(this.checkSubtype(t,i))return null}else n=r(n,t,e.typeAnnotation||\"coerce\");else n=r(n,t,e.typeAnnotation||\"coerce\");else n=r(n,t,e.typeAnnotation||\"coerce\");else n=r(n,t,e.typeAnnotation||\"assert\")}if(!(n instanceof se)&&\"resolvedImage\"!==n.type.kind&&this._isConstant(n)){const t=new de;try{n=new se(n.type,n.evaluate(t))}catch(t){return this.error(t.message),null}}return n}return this.error(`Unknown expression \"${n}\". If you wanted a literal array, use [\"literal\", [...]].`,0)}return void 0===t?this.error(\"'undefined' value invalid. Use null instead.\"):\"object\"==typeof t?this.error('Bare objects invalid. Use [\"literal\", {...}] instead.'):this.error(`Expected an array, but found ${typeof t} instead.`)}concat(t,e,r){const n=\"number\"==typeof t?this.path.concat(t):this.path,i=r?this.scope.concat(r):this.scope;return new me(this.registry,this._isConstant,n,e||null,i,this.errors)}error(t,...e){const r=`${this.key}${e.map((t=>`[${t}]`)).join(\"\")}`;this.errors.push(new ot(r,t))}checkSubtype(t,e){const r=Tt(t,e);return r&&this.error(r),r}}class ge{constructor(t,e){this.type=e.type,this.bindings=[].concat(t),this.result=e}evaluate(t){return this.result.evaluate(t)}eachChild(t){for(const e of this.bindings)t(e[1]);t(this.result)}static parse(t,e){if(t.length<4)return e.error(`Expected at least 3 arguments, but found ${t.length-1} instead.`);const r=[];for(let n=1;n=r.length)throw new le(`Array index out of bounds: ${e} > ${r.length-1}.`);if(e!==Math.floor(e))throw new le(`Array index must be an integer, but found ${e} instead.`);return r[e]}eachChild(t){t(this.index),t(this.input)}outputDefined(){return!1}}class xe{constructor(t,e){this.type=ht,this.needle=t,this.haystack=e}static parse(t,e){if(3!==t.length)return e.error(`Expected 2 arguments, but found ${t.length-1} instead.`);const r=e.parse(t[1],1,dt),n=e.parse(t[2],2,dt);return r&&n?kt(r.type,[ht,ut,ct,lt,dt])?new xe(r,n):e.error(`Expected first argument to be of type boolean, string, number or null, but found ${bt(r.type)} instead`):null}evaluate(t){const e=this.needle.evaluate(t),r=this.haystack.evaluate(t);if(!r)return!1;if(!At(e,[\"boolean\",\"string\",\"number\",\"null\"]))throw new le(`Expected first argument to be of type boolean, string, number or null, but found ${bt(ae(e))} instead.`);if(!At(r,[\"string\",\"array\"]))throw new le(`Expected second argument to be of type array or string, but found ${bt(ae(r))} instead.`);return r.indexOf(e)>=0}eachChild(t){t(this.needle),t(this.haystack)}outputDefined(){return!0}}class _e{constructor(t,e,r){this.type=ct,this.needle=t,this.haystack=e,this.fromIndex=r}static parse(t,e){if(t.length<=2||t.length>=5)return e.error(`Expected 3 or 4 arguments, but found ${t.length-1} instead.`);const r=e.parse(t[1],1,dt),n=e.parse(t[2],2,dt);if(!r||!n)return null;if(!kt(r.type,[ht,ut,ct,lt,dt]))return e.error(`Expected first argument to be of type boolean, string, number or null, but found ${bt(r.type)} instead`);if(4===t.length){const i=e.parse(t[3],3,ct);return i?new _e(r,n,i):null}return new _e(r,n)}evaluate(t){const e=this.needle.evaluate(t),r=this.haystack.evaluate(t);if(!At(e,[\"boolean\",\"string\",\"number\",\"null\"]))throw new le(`Expected first argument to be of type boolean, string, number or null, but found ${bt(ae(e))} instead.`);if(!At(r,[\"string\",\"array\"]))throw new le(`Expected second argument to be of type array or string, but found ${bt(ae(r))} instead.`);if(this.fromIndex){const n=this.fromIndex.evaluate(t);return r.indexOf(e,n)}return r.indexOf(e)}eachChild(t){t(this.needle),t(this.haystack),this.fromIndex&&t(this.fromIndex)}outputDefined(){return!1}}class be{constructor(t,e,r,n,i,a){this.inputType=t,this.type=e,this.input=r,this.cases=n,this.outputs=i,this.otherwise=a}static parse(t,e){if(t.length<5)return e.error(`Expected at least 4 arguments, but found only ${t.length-1}.`);if(t.length%2!=1)return e.error(\"Expected an even number of arguments.\");let r,n;e.expectedType&&\"value\"!==e.expectedType.kind&&(n=e.expectedType);const i={},a=[];for(let o=2;oNumber.MAX_SAFE_INTEGER)return c.error(`Branch labels must be integers no larger than ${Number.MAX_SAFE_INTEGER}.`);if(\"number\"==typeof t&&Math.floor(t)!==t)return c.error(\"Numeric branch labels must be integer values.\");if(r){if(c.checkSubtype(r,ae(t)))return null}else r=ae(t);if(void 0!==i[String(t)])return c.error(\"Branch labels must be unique.\");i[String(t)]=a.length}const u=e.parse(l,o,n);if(!u)return null;n=n||u.type,a.push(u)}const o=e.parse(t[1],1,dt);if(!o)return null;const s=e.parse(t[t.length-1],t.length-1,n);return s?\"value\"!==o.type.kind&&e.concat(1).checkSubtype(r,o.type)?null:new be(r,n,o,i,a,s):null}evaluate(t){const e=this.input.evaluate(t);return(ae(e)===this.inputType&&this.outputs[this.cases[e]]||this.otherwise).evaluate(t)}eachChild(t){t(this.input),this.outputs.forEach(t),t(this.otherwise)}outputDefined(){return this.outputs.every((t=>t.outputDefined()))&&this.otherwise.outputDefined()}}class we{constructor(t,e,r){this.type=t,this.branches=e,this.otherwise=r}static parse(t,e){if(t.length<4)return e.error(`Expected at least 3 arguments, but found only ${t.length-1}.`);if(t.length%2!=0)return e.error(\"Expected an odd number of arguments.\");let r;e.expectedType&&\"value\"!==e.expectedType.kind&&(r=e.expectedType);const n=[];for(let i=1;ie.outputDefined()))&&this.otherwise.outputDefined()}}class Te{constructor(t,e,r,n){this.type=t,this.input=e,this.beginIndex=r,this.endIndex=n}static parse(t,e){if(t.length<=2||t.length>=5)return e.error(`Expected 3 or 4 arguments, but found ${t.length-1} instead.`);const r=e.parse(t[1],1,dt),n=e.parse(t[2],2,ct);if(!r||!n)return null;if(!kt(r.type,[_t(dt),ut,dt]))return e.error(`Expected first argument to be of type array or string, but found ${bt(r.type)} instead`);if(4===t.length){const i=e.parse(t[3],3,ct);return i?new Te(r.type,r,n,i):null}return new Te(r.type,r,n)}evaluate(t){const e=this.input.evaluate(t),r=this.beginIndex.evaluate(t);if(!At(e,[\"string\",\"array\"]))throw new le(`Expected first argument to be of type array or string, but found ${bt(ae(e))} instead.`);if(this.endIndex){const n=this.endIndex.evaluate(t);return e.slice(r,n)}return e.slice(r)}eachChild(t){t(this.input),t(this.beginIndex),this.endIndex&&t(this.endIndex)}outputDefined(){return!1}}function ke(t,e){const r=t.length-1;let n,i,a=0,o=r,s=0;for(;a<=o;)if(s=Math.floor((a+o)/2),n=t[s],i=t[s+1],n<=e){if(s===r||ee))throw new le(\"Input is not a number.\");o=s-1}return 0}class Ae{constructor(t,e,r){this.type=t,this.input=e,this.labels=[],this.outputs=[];for(const[t,e]of r)this.labels.push(t),this.outputs.push(e)}static parse(t,e){if(t.length-1<4)return e.error(`Expected at least 4 arguments, but found only ${t.length-1}.`);if((t.length-1)%2!=0)return e.error(\"Expected an even number of arguments.\");const r=e.parse(t[1],1,ct);if(!r)return null;const n=[];let i=null;e.expectedType&&\"value\"!==e.expectedType.kind&&(i=e.expectedType);for(let r=1;r=a)return e.error('Input/output pairs for \"step\" expressions must be arranged with input values in strictly ascending order.',s);const c=e.parse(o,l,i);if(!c)return null;i=i||c.type,n.push([a,c])}return new Ae(i,r,n)}evaluate(t){const e=this.labels,r=this.outputs;if(1===e.length)return r[0].evaluate(t);const n=this.input.evaluate(t);if(n<=e[0])return r[0].evaluate(t);const i=e.length;return n>=e[i-1]?r[i-1].evaluate(t):r[ke(e,n)].evaluate(t)}eachChild(t){t(this.input);for(const e of this.outputs)t(e)}outputDefined(){return this.outputs.every((t=>t.outputDefined()))}}function Me(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,\"default\")?t.default:t}var Se=Ee;function Ee(t,e,r,n){this.cx=3*t,this.bx=3*(r-t)-this.cx,this.ax=1-this.cx-this.bx,this.cy=3*e,this.by=3*(n-e)-this.cy,this.ay=1-this.cy-this.by,this.p1x=t,this.p1y=e,this.p2x=r,this.p2y=n}Ee.prototype={sampleCurveX:function(t){return((this.ax*t+this.bx)*t+this.cx)*t},sampleCurveY:function(t){return((this.ay*t+this.by)*t+this.cy)*t},sampleCurveDerivativeX:function(t){return(3*this.ax*t+2*this.bx)*t+this.cx},solveCurveX:function(t,e){if(void 0===e&&(e=1e-6),t<0)return 0;if(t>1)return 1;for(var r=t,n=0;n<8;n++){var i=this.sampleCurveX(r)-t;if(Math.abs(i)i?o=r:s=r,r=.5*(s-o)+o;return r},solve:function(t,e){return this.sampleCurveY(this.solveCurveX(t,e))}};var Ce=Me(Se);function Le(t,e,r){return t+r*(e-t)}function Ie(t,e,r){return t.map(((t,n)=>Le(t,e[n],r)))}const Pe={number:Le,color:function(t,e,r,n=\"rgb\"){switch(n){case\"rgb\":{const[n,i,a,o]=Ie(t.rgb,e.rgb,r);return new Xt(n,i,a,o,!1)}case\"hcl\":{const[n,i,a,o]=t.hcl,[s,l,c,u]=e.hcl;let h,f;if(isNaN(n)||isNaN(s))isNaN(n)?isNaN(s)?h=NaN:(h=s,1!==a&&0!==a||(f=l)):(h=n,1!==c&&0!==c||(f=i));else{let t=s-n;s>n&&t>180?t-=360:s180&&(t+=360),h=n+r*t}const[p,d,m,g]=function([t,e,r,n]){return t=isNaN(t)?0:t*Ot,jt([r,Math.cos(t)*e,Math.sin(t)*e,n])}([h,null!=f?f:Le(i,l,r),Le(a,c,r),Le(o,u,r)]);return new Xt(p,d,m,g,!1)}case\"lab\":{const[n,i,a,o]=jt(Ie(t.lab,e.lab,r));return new Xt(n,i,a,o,!1)}}},array:Ie,padding:function(t,e,r){return new Qt(Ie(t.values,e.values,r))},variableAnchorOffsetCollection:function(t,e,r){const n=t.values,i=e.values;if(n.length!==i.length)throw new le(`Cannot interpolate values of different length. from: ${t.toString()}, to: ${e.toString()}`);const a=[];for(let t=0;t\"number\"!=typeof t||t<0||t>1)))return e.error(\"Cubic bezier interpolation requires four numeric arguments with values between 0 and 1.\",1);n={name:\"cubic-bezier\",controlPoints:t}}}if(t.length-1<4)return e.error(`Expected at least 4 arguments, but found only ${t.length-1}.`);if((t.length-1)%2!=0)return e.error(\"Expected an even number of arguments.\");if(i=e.parse(i,2,ct),!i)return null;const o=[];let s=null;\"interpolate-hcl\"===r||\"interpolate-lab\"===r?s=ft:e.expectedType&&\"value\"!==e.expectedType.kind&&(s=e.expectedType);for(let t=0;t=r)return e.error('Input/output pairs for \"interpolate\" expressions must be arranged with input values in strictly ascending order.',i);const c=e.parse(n,l,s);if(!c)return null;s=s||c.type,o.push([r,c])}return Mt(s,ct)||Mt(s,ft)||Mt(s,yt)||Mt(s,xt)||Mt(s,_t(ct))?new ze(s,r,n,i,o):e.error(`Type ${bt(s)} is not interpolatable.`)}evaluate(t){const e=this.labels,r=this.outputs;if(1===e.length)return r[0].evaluate(t);const n=this.input.evaluate(t);if(n<=e[0])return r[0].evaluate(t);const i=e.length;if(n>=e[i-1])return r[i-1].evaluate(t);const a=ke(e,n),o=e[a],s=e[a+1],l=ze.interpolationFactor(this.interpolation,n,o,s),c=r[a].evaluate(t),u=r[a+1].evaluate(t);switch(this.operator){case\"interpolate\":return Pe[this.type.kind](c,u,l);case\"interpolate-hcl\":return Pe.color(c,u,l,\"hcl\");case\"interpolate-lab\":return Pe.color(c,u,l,\"lab\")}}eachChild(t){t(this.input);for(const e of this.outputs)t(e)}outputDefined(){return this.outputs.every((t=>t.outputDefined()))}}function Oe(t,e,r,n){const i=n-r,a=t-r;return 0===i?0:1===e?a/i:(Math.pow(e,a)-1)/(Math.pow(e,i)-1)}class De{constructor(t,e){this.type=t,this.args=e}static parse(t,e){if(t.length<2)return e.error(\"Expectected at least one argument.\");let r=null;const n=e.expectedType;n&&\"value\"!==n.kind&&(r=n);const i=[];for(const n of t.slice(1)){const t=e.parse(n,1+i.length,r,void 0,{typeAnnotation:\"omit\"});if(!t)return null;r=r||t.type,i.push(t)}if(!r)throw new Error(\"No output type\");const a=n&&i.some((t=>Tt(n,t.type)));return new De(a?dt:r,i)}evaluate(t){let e,r=null,n=0;for(const i of this.args)if(n++,r=i.evaluate(t),r&&r instanceof re&&!r.available&&(e||(e=r.name),r=null,n===this.args.length&&(r=e)),null!==r)break;return r}eachChild(t){this.args.forEach(t)}outputDefined(){return this.args.every((t=>t.outputDefined()))}}function Re(t,e){return\"==\"===t||\"!=\"===t?\"boolean\"===e.kind||\"string\"===e.kind||\"number\"===e.kind||\"null\"===e.kind||\"value\"===e.kind:\"string\"===e.kind||\"number\"===e.kind||\"value\"===e.kind}function Fe(t,e,r,n){return 0===n.compare(e,r)}function Be(t,e,r){const n=\"==\"!==t&&\"!=\"!==t;return class i{constructor(t,e,r){this.type=ht,this.lhs=t,this.rhs=e,this.collator=r,this.hasUntypedArgument=\"value\"===t.type.kind||\"value\"===e.type.kind}static parse(t,e){if(3!==t.length&&4!==t.length)return e.error(\"Expected two or three arguments.\");const r=t[0];let a=e.parse(t[1],1,dt);if(!a)return null;if(!Re(r,a.type))return e.concat(1).error(`\"${r}\" comparisons are not supported for type '${bt(a.type)}'.`);let o=e.parse(t[2],2,dt);if(!o)return null;if(!Re(r,o.type))return e.concat(2).error(`\"${r}\" comparisons are not supported for type '${bt(o.type)}'.`);if(a.type.kind!==o.type.kind&&\"value\"!==a.type.kind&&\"value\"!==o.type.kind)return e.error(`Cannot compare types '${bt(a.type)}' and '${bt(o.type)}'.`);n&&(\"value\"===a.type.kind&&\"value\"!==o.type.kind?a=new ue(o.type,[a]):\"value\"!==a.type.kind&&\"value\"===o.type.kind&&(o=new ue(a.type,[o])));let s=null;if(4===t.length){if(\"string\"!==a.type.kind&&\"string\"!==o.type.kind&&\"value\"!==a.type.kind&&\"value\"!==o.type.kind)return e.error(\"Cannot use collator to compare non-string types.\");if(s=e.parse(t[3],3,mt),!s)return null}return new i(a,o,s)}evaluate(i){const a=this.lhs.evaluate(i),o=this.rhs.evaluate(i);if(n&&this.hasUntypedArgument){const e=ae(a),r=ae(o);if(e.kind!==r.kind||\"string\"!==e.kind&&\"number\"!==e.kind)throw new le(`Expected arguments for \"${t}\" to be (string, string) or (number, number), but found (${e.kind}, ${r.kind}) instead.`)}if(this.collator&&!n&&this.hasUntypedArgument){const t=ae(a),r=ae(o);if(\"string\"!==t.kind||\"string\"!==r.kind)return e(i,a,o)}return this.collator?r(i,a,o,this.collator.evaluate(i)):e(i,a,o)}eachChild(t){t(this.lhs),t(this.rhs),this.collator&&t(this.collator)}outputDefined(){return!0}}}const Ne=Be(\"==\",(function(t,e,r){return e===r}),Fe),je=Be(\"!=\",(function(t,e,r){return e!==r}),(function(t,e,r,n){return!Fe(0,e,r,n)})),Ue=Be(\"<\",(function(t,e,r){return e\",(function(t,e,r){return e>r}),(function(t,e,r,n){return n.compare(e,r)>0})),qe=Be(\"<=\",(function(t,e,r){return e<=r}),(function(t,e,r,n){return n.compare(e,r)<=0})),He=Be(\">=\",(function(t,e,r){return e>=r}),(function(t,e,r,n){return n.compare(e,r)>=0}));class Ge{constructor(t,e,r){this.type=mt,this.locale=r,this.caseSensitive=t,this.diacriticSensitive=e}static parse(t,e){if(2!==t.length)return e.error(\"Expected one argument.\");const r=t[1];if(\"object\"!=typeof r||Array.isArray(r))return e.error(\"Collator options argument must be an object.\");const n=e.parse(void 0!==r[\"case-sensitive\"]&&r[\"case-sensitive\"],1,ht);if(!n)return null;const i=e.parse(void 0!==r[\"diacritic-sensitive\"]&&r[\"diacritic-sensitive\"],1,ht);if(!i)return null;let a=null;return r.locale&&(a=e.parse(r.locale,1,ut),!a)?null:new Ge(n,i,a)}evaluate(t){return new $t(this.caseSensitive.evaluate(t),this.diacriticSensitive.evaluate(t),this.locale?this.locale.evaluate(t):null)}eachChild(t){t(this.caseSensitive),t(this.diacriticSensitive),this.locale&&t(this.locale)}outputDefined(){return!1}}class Ze{constructor(t,e,r,n,i){this.type=ut,this.number=t,this.locale=e,this.currency=r,this.minFractionDigits=n,this.maxFractionDigits=i}static parse(t,e){if(3!==t.length)return e.error(\"Expected two arguments.\");const r=e.parse(t[1],1,ct);if(!r)return null;const n=t[2];if(\"object\"!=typeof n||Array.isArray(n))return e.error(\"NumberFormat options argument must be an object.\");let i=null;if(n.locale&&(i=e.parse(n.locale,1,ut),!i))return null;let a=null;if(n.currency&&(a=e.parse(n.currency,1,ut),!a))return null;let o=null;if(n[\"min-fraction-digits\"]&&(o=e.parse(n[\"min-fraction-digits\"],1,ct),!o))return null;let s=null;return n[\"max-fraction-digits\"]&&(s=e.parse(n[\"max-fraction-digits\"],1,ct),!s)?null:new Ze(r,i,a,o,s)}evaluate(t){return new Intl.NumberFormat(this.locale?this.locale.evaluate(t):[],{style:this.currency?\"currency\":\"decimal\",currency:this.currency?this.currency.evaluate(t):void 0,minimumFractionDigits:this.minFractionDigits?this.minFractionDigits.evaluate(t):void 0,maximumFractionDigits:this.maxFractionDigits?this.maxFractionDigits.evaluate(t):void 0}).format(this.number.evaluate(t))}eachChild(t){t(this.number),this.locale&&t(this.locale),this.currency&&t(this.currency),this.minFractionDigits&&t(this.minFractionDigits),this.maxFractionDigits&&t(this.maxFractionDigits)}outputDefined(){return!1}}class We{constructor(t){this.type=gt,this.sections=t}static parse(t,e){if(t.length<2)return e.error(\"Expected at least one argument.\");const r=t[1];if(!Array.isArray(r)&&\"object\"==typeof r)return e.error(\"First argument must be an image or text section.\");const n=[];let i=!1;for(let r=1;r<=t.length-1;++r){const a=t[r];if(i&&\"object\"==typeof a&&!Array.isArray(a)){i=!1;let t=null;if(a[\"font-scale\"]&&(t=e.parse(a[\"font-scale\"],1,ct),!t))return null;let r=null;if(a[\"text-font\"]&&(r=e.parse(a[\"text-font\"],1,_t(ut)),!r))return null;let o=null;if(a[\"text-color\"]&&(o=e.parse(a[\"text-color\"],1,ft),!o))return null;const s=n[n.length-1];s.scale=t,s.font=r,s.textColor=o}else{const a=e.parse(t[r],1,dt);if(!a)return null;const o=a.type.kind;if(\"string\"!==o&&\"value\"!==o&&\"null\"!==o&&\"resolvedImage\"!==o)return e.error(\"Formatted text type must be 'string', 'value', 'image' or 'null'.\");i=!0,n.push({content:a,scale:null,font:null,textColor:null})}}return new We(n)}evaluate(t){return new Kt(this.sections.map((e=>{const r=e.content.evaluate(t);return ae(r)===vt?new Jt(\"\",r,null,null,null):new Jt(oe(r),null,e.scale?e.scale.evaluate(t):null,e.font?e.font.evaluate(t).join(\",\"):null,e.textColor?e.textColor.evaluate(t):null)})))}eachChild(t){for(const e of this.sections)t(e.content),e.scale&&t(e.scale),e.font&&t(e.font),e.textColor&&t(e.textColor)}outputDefined(){return!1}}class Ye{constructor(t){this.type=vt,this.input=t}static parse(t,e){if(2!==t.length)return e.error(\"Expected two arguments.\");const r=e.parse(t[1],1,ut);return r?new Ye(r):e.error(\"No image name provided.\")}evaluate(t){const e=this.input.evaluate(t),r=re.fromString(e);return r&&t.availableImages&&(r.available=t.availableImages.indexOf(e)>-1),r}eachChild(t){t(this.input)}outputDefined(){return!1}}class Xe{constructor(t){this.type=ct,this.input=t}static parse(t,e){if(2!==t.length)return e.error(`Expected 1 argument, but found ${t.length-1} instead.`);const r=e.parse(t[1],1);return r?\"array\"!==r.type.kind&&\"string\"!==r.type.kind&&\"value\"!==r.type.kind?e.error(`Expected argument of type string or array, but found ${bt(r.type)} instead.`):new Xe(r):null}evaluate(t){const e=this.input.evaluate(t);if(\"string\"==typeof e)return e.length;if(Array.isArray(e))return e.length;throw new le(`Expected value to be of type string or array, but found ${bt(ae(e))} instead.`)}eachChild(t){t(this.input)}outputDefined(){return!1}}const $e=8192;function Je(t,e){const r=(180+t[0])/360,n=(a=t[1],(180-180/Math.PI*Math.log(Math.tan(Math.PI/4+a*Math.PI/360)))/360),i=Math.pow(2,e.z);var a;return[Math.round(r*i*$e),Math.round(n*i*$e)]}function Ke(t,e){const r=Math.pow(2,e.z),n=(t[0]/$e+e.x)/r,i=(t[1]/$e+e.y)/r;return[(o=n,360*o-180),(a=i,360/Math.PI*Math.atan(Math.exp((180-360*a)*Math.PI/180))-90)];var a,o}function Qe(t,e){t[0]=Math.min(t[0],e[0]),t[1]=Math.min(t[1],e[1]),t[2]=Math.max(t[2],e[0]),t[3]=Math.max(t[3],e[1])}function tr(t,e){return!(t[0]<=e[0]||t[2]>=e[2]||t[1]<=e[1]||t[3]>=e[3])}function er(t,e,r){const n=t[0]-e[0],i=t[1]-e[1],a=t[0]-r[0],o=t[1]-r[1];return n*o-a*i==0&&n*a<=0&&i*o<=0}function rr(t,e,r,n){const i=[e[0]-t[0],e[1]-t[1]];return 0!=(a=[n[0]-r[0],n[1]-r[1]],o=i,a[0]*o[1]-a[1]*o[0])&&!(!lr(t,e,r,n)||!lr(r,n,t,e));var a,o}function nr(t,e,r){for(const n of r)for(let r=0;ri[1]!=o[1]>i[1]&&i[0]<(o[0]-a[0])*(i[1]-a[1])/(o[1]-a[1])+a[0]&&(n=!n)}var i,a,o;return n}function ar(t,e){for(const r of e)if(ir(t,r))return!0;return!1}function or(t,e){for(const r of t)if(!ir(r,e))return!1;for(let r=0;r0&&h<0||u<0&&h>0}function cr(t,e,r){const n=[];for(let i=0;ir[2]){const e=.5*n;let i=t[0]-r[0]>e?-n:r[0]-t[0]>e?n:0;0===i&&(i=t[0]-r[2]>e?-n:r[2]-t[0]>e?n:0),t[0]+=i}Qe(e,t)}function fr(t,e,r,n){const i=Math.pow(2,n.z)*$e,a=[n.x*$e,n.y*$e],o=[];for(const n of t)for(const t of n){const n=[t.x+a[0],t.y+a[1]];hr(n,e,r,i),o.push(n)}return o}function pr(t,e,r,n){const i=Math.pow(2,n.z)*$e,a=[n.x*$e,n.y*$e],o=[];for(const r of t){const t=[];for(const n of r){const r=[n.x+a[0],n.y+a[1]];Qe(e,r),t.push(r)}o.push(t)}if(e[2]-e[0]<=i/2){(s=e)[0]=s[1]=1/0,s[2]=s[3]=-1/0;for(const t of o)for(const n of t)hr(n,e,r,i)}var s;return o}class dr{constructor(t,e){this.type=ht,this.geojson=t,this.geometries=e}static parse(t,e){if(2!==t.length)return e.error(`'within' expression requires exactly one argument, but found ${t.length-1} instead.`);if(ie(t[1])){const e=t[1];if(\"FeatureCollection\"===e.type){const t=[];for(const r of e.features){const{type:e,coordinates:n}=r.geometry;\"Polygon\"===e&&t.push(n),\"MultiPolygon\"===e&&t.push(...n)}if(t.length)return new dr(e,{type:\"MultiPolygon\",coordinates:t})}else if(\"Feature\"===e.type){const t=e.geometry.type;if(\"Polygon\"===t||\"MultiPolygon\"===t)return new dr(e,e.geometry)}else if(\"Polygon\"===e.type||\"MultiPolygon\"===e.type)return new dr(e,e)}return e.error(\"'within' expression requires valid geojson object that contains polygon geometry type.\")}evaluate(t){if(null!=t.geometry()&&null!=t.canonicalID()){if(\"Point\"===t.geometryType())return function(t,e){const r=[1/0,1/0,-1/0,-1/0],n=[1/0,1/0,-1/0,-1/0],i=t.canonicalID();if(\"Polygon\"===e.type){const a=cr(e.coordinates,n,i),o=fr(t.geometry(),r,n,i);if(!tr(r,n))return!1;for(const t of o)if(!ir(t,a))return!1}if(\"MultiPolygon\"===e.type){const a=ur(e.coordinates,n,i),o=fr(t.geometry(),r,n,i);if(!tr(r,n))return!1;for(const t of o)if(!ar(t,a))return!1}return!0}(t,this.geometries);if(\"LineString\"===t.geometryType())return function(t,e){const r=[1/0,1/0,-1/0,-1/0],n=[1/0,1/0,-1/0,-1/0],i=t.canonicalID();if(\"Polygon\"===e.type){const a=cr(e.coordinates,n,i),o=pr(t.geometry(),r,n,i);if(!tr(r,n))return!1;for(const t of o)if(!or(t,a))return!1}if(\"MultiPolygon\"===e.type){const a=ur(e.coordinates,n,i),o=pr(t.geometry(),r,n,i);if(!tr(r,n))return!1;for(const t of o)if(!sr(t,a))return!1}return!0}(t,this.geometries)}return!1}eachChild(){}outputDefined(){return!0}}let mr=class{constructor(t=[],e=gr){if(this.data=t,this.length=this.data.length,this.compare=e,this.length>0)for(let t=(this.length>>1)-1;t>=0;t--)this._down(t)}push(t){this.data.push(t),this.length++,this._up(this.length-1)}pop(){if(0===this.length)return;const t=this.data[0],e=this.data.pop();return this.length--,this.length>0&&(this.data[0]=e,this._down(0)),t}peek(){return this.data[0]}_up(t){const{data:e,compare:r}=this,n=e[t];for(;t>0;){const i=t-1>>1,a=e[i];if(r(n,a)>=0)break;e[t]=a,t=i}e[t]=n}_down(t){const{data:e,compare:r}=this,n=this.length>>1,i=e[t];for(;t=0)break;e[t]=a,t=n}e[t]=i}};function gr(t,e){return te?1:0}function yr(t,e,r,n,i){vr(t,e,r,n||t.length-1,i||_r)}function vr(t,e,r,n,i){for(;n>r;){if(n-r>600){var a=n-r+1,o=e-r+1,s=Math.log(a),l=.5*Math.exp(2*s/3),c=.5*Math.sqrt(s*l*(a-l)/a)*(o-a/2<0?-1:1);vr(t,e,Math.max(r,Math.floor(e-o*l/a+c)),Math.min(n,Math.floor(e+(a-o)*l/a+c)),i)}var u=t[e],h=r,f=n;for(xr(t,r,e),i(t[n],u)>0&&xr(t,r,n);h0;)f--}0===i(t[r],u)?xr(t,r,f):xr(t,++f,n),f<=e&&(r=f+1),e<=f&&(n=f-1)}}function xr(t,e,r){var n=t[e];t[e]=t[r],t[r]=n}function _r(t,e){return te?1:0}function br(t,e){if(t.length<=1)return[t];const r=[];let n,i;for(const e of t){const t=Tr(e);0!==t&&(e.area=Math.abs(t),void 0===i&&(i=t<0),i===t<0?(n&&r.push(n),n=[e]):n.push(e))}if(n&&r.push(n),e>1)for(let t=0;t1?(l=t[s+1][0],c=t[s+1][1]):f>0&&(l+=u/this.kx*f,c+=h/this.ky*f)),u=this.wrap(e[0]-l)*this.kx,h=(e[1]-c)*this.ky;const p=u*u+h*h;p180;)t-=360;return t}}const Er=100,Cr=50;function Lr(t,e){return e[0]-t[0]}function Ir(t){return t[1]-t[0]+1}function Pr(t,e){return t[1]>=t[0]&&t[1]t[1])return[null,null];const r=Ir(t);if(e){if(2===r)return[t,null];const e=Math.floor(r/2);return[[t[0],t[0]+e],[t[0]+e,t[1]]]}if(1===r)return[t,null];const n=Math.floor(r/2)-1;return[[t[0],t[0]+n],[t[0]+n+1,t[1]]]}function Or(t,e){if(!Pr(e,t.length))return[1/0,1/0,-1/0,-1/0];const r=[1/0,1/0,-1/0,-1/0];for(let n=e[0];n<=e[1];++n)Qe(r,t[n]);return r}function Dr(t){const e=[1/0,1/0,-1/0,-1/0];for(const r of t)for(const t of r)Qe(e,t);return e}function Rr(t){return t[0]!==-1/0&&t[1]!==-1/0&&t[2]!==1/0&&t[3]!==1/0}function Fr(t,e,r){if(!Rr(t)||!Rr(e))return NaN;let n=0,i=0;return t[2]e[2]&&(n=t[0]-e[2]),t[1]>e[3]&&(i=t[1]-e[3]),t[3]=n)return n;if(tr(i,a)){if(Hr(t,e))return 0}else if(Hr(e,t))return 0;let o=1/0;for(const n of t)for(let t=0,i=n.length,a=i-1;t0;){const i=o.pop();if(i[0]>=a)continue;const l=i[1],c=e?Cr:Er;if(Ir(l)<=c){if(!Pr(l,t.length))return NaN;if(e){const e=qr(t,l,r,n);if(isNaN(e)||0===e)return e;a=Math.min(a,e)}else for(let e=l[0];e<=l[1];++e){const i=Vr(t[e],r,n);if(a=Math.min(a,i),0===a)return 0}}else{const r=zr(l,e);Zr(o,a,n,t,s,r[0]),Zr(o,a,n,t,s,r[1])}}return a}function Xr(t,e,r,n,i,a=1/0){let o=Math.min(a,i.distance(t[0],r[0]));if(0===o)return o;const s=new mr([[0,[0,t.length-1],[0,r.length-1]]],Lr);for(;s.length>0;){const a=s.pop();if(a[0]>=o)continue;const l=a[1],c=a[2],u=e?Cr:Er,h=n?Cr:Er;if(Ir(l)<=u&&Ir(c)<=h){if(!Pr(l,t.length)&&Pr(c,r.length))return NaN;let a;if(e&&n)a=jr(t,l,r,c,i),o=Math.min(o,a);else if(e&&!n){const e=t.slice(l[0],l[1]+1);for(let t=c[0];t<=c[1];++t)if(a=Br(r[t],e,i),o=Math.min(o,a),0===o)return o}else if(!e&&n){const e=r.slice(c[0],c[1]+1);for(let r=l[0];r<=l[1];++r)if(a=Br(t[r],e,i),o=Math.min(o,a),0===o)return o}else a=Ur(t,l,r,c,i),o=Math.min(o,a)}else{const a=zr(l,e),u=zr(c,n);Wr(s,o,i,t,r,a[0],u[0]),Wr(s,o,i,t,r,a[0],u[1]),Wr(s,o,i,t,r,a[1],u[0]),Wr(s,o,i,t,r,a[1],u[1])}}return o}function $r(t){return\"MultiPolygon\"===t.type?t.coordinates.map((t=>({type:\"Polygon\",coordinates:t}))):\"MultiLineString\"===t.type?t.coordinates.map((t=>({type:\"LineString\",coordinates:t}))):\"MultiPoint\"===t.type?t.coordinates.map((t=>({type:\"Point\",coordinates:t}))):[t]}class Jr{constructor(t,e){this.type=ct,this.geojson=t,this.geometries=e}static parse(t,e){if(2!==t.length)return e.error(`'distance' expression requires exactly one argument, but found ${t.length-1} instead.`);if(ie(t[1])){const e=t[1];if(\"FeatureCollection\"===e.type)return new Jr(e,e.features.map((t=>$r(t.geometry))).flat());if(\"Feature\"===e.type)return new Jr(e,$r(e.geometry));if(\"type\"in e&&\"coordinates\"in e)return new Jr(e,$r(e))}return e.error(\"'distance' expression requires valid geojson object that contains polygon geometry type.\")}evaluate(t){if(null!=t.geometry()&&null!=t.canonicalID()){if(\"Point\"===t.geometryType())return function(t,e){const r=t.geometry(),n=r.flat().map((e=>Ke([e.x,e.y],t.canonical)));if(0===r.length)return NaN;const i=new Sr(n[0][1]);let a=1/0;for(const t of e){switch(t.type){case\"Point\":a=Math.min(a,Xr(n,!1,[t.coordinates],!1,i,a));break;case\"LineString\":a=Math.min(a,Xr(n,!1,t.coordinates,!0,i,a));break;case\"Polygon\":a=Math.min(a,Yr(n,!1,t.coordinates,i,a))}if(0===a)return a}return a}(t,this.geometries);if(\"LineString\"===t.geometryType())return function(t,e){const r=t.geometry(),n=r.flat().map((e=>Ke([e.x,e.y],t.canonical)));if(0===r.length)return NaN;const i=new Sr(n[0][1]);let a=1/0;for(const t of e){switch(t.type){case\"Point\":a=Math.min(a,Xr(n,!0,[t.coordinates],!1,i,a));break;case\"LineString\":a=Math.min(a,Xr(n,!0,t.coordinates,!0,i,a));break;case\"Polygon\":a=Math.min(a,Yr(n,!0,t.coordinates,i,a))}if(0===a)return a}return a}(t,this.geometries);if(\"Polygon\"===t.geometryType())return function(t,e){const r=t.geometry();if(0===r.length||0===r[0].length)return NaN;const n=br(r,0).map((e=>e.map((e=>e.map((e=>Ke([e.x,e.y],t.canonical))))))),i=new Sr(n[0][0][0][1]);let a=1/0;for(const t of e)for(const e of n){switch(t.type){case\"Point\":a=Math.min(a,Yr([t.coordinates],!1,e,i,a));break;case\"LineString\":a=Math.min(a,Yr(t.coordinates,!0,e,i,a));break;case\"Polygon\":a=Math.min(a,Gr(e,t.coordinates,i,a))}if(0===a)return a}return a}(t,this.geometries)}return NaN}eachChild(){}outputDefined(){return!0}}const Kr={\"==\":Ne,\"!=\":je,\">\":Ve,\"<\":Ue,\">=\":He,\"<=\":qe,array:ue,at:ve,boolean:ue,case:we,coalesce:De,collator:Ge,format:We,image:Ye,in:xe,\"index-of\":_e,interpolate:ze,\"interpolate-hcl\":ze,\"interpolate-lab\":ze,length:Xe,let:ge,literal:se,match:be,number:ue,\"number-format\":Ze,object:ue,slice:Te,step:Ae,string:ue,\"to-boolean\":fe,\"to-color\":fe,\"to-number\":fe,\"to-string\":fe,var:ye,within:dr,distance:Jr};class Qr{constructor(t,e,r,n){this.name=t,this.type=e,this._evaluate=r,this.args=n}evaluate(t){return this._evaluate(t,this.args)}eachChild(t){this.args.forEach(t)}outputDefined(){return!1}static parse(t,e){const r=t[0],n=Qr.definitions[r];if(!n)return e.error(`Unknown expression \"${r}\". If you wanted a literal array, use [\"literal\", [...]].`,0);const i=Array.isArray(n)?n[0]:n.type,a=Array.isArray(n)?[[n[1],n[2]]]:n.overloads,o=a.filter((([e])=>!Array.isArray(e)||e.length===t.length-1));let s=null;for(const[n,a]of o){s=new me(e.registry,an,e.path,null,e.scope);const o=[];let l=!1;for(let e=1;e{return e=t,Array.isArray(e)?`(${e.map(bt).join(\", \")})`:`(${bt(e.type)}...)`;var e})).join(\" | \"),n=[];for(let r=1;r{r=e?r&&an(t):r&&t instanceof se})),!!r&&on(t)&&ln(t,[\"zoom\",\"heatmap-density\",\"line-progress\",\"accumulated\",\"is-supported-script\"])}function on(t){if(t instanceof Qr){if(\"get\"===t.name&&1===t.args.length)return!1;if(\"feature-state\"===t.name)return!1;if(\"has\"===t.name&&1===t.args.length)return!1;if(\"properties\"===t.name||\"geometry-type\"===t.name||\"id\"===t.name)return!1;if(/^filter-/.test(t.name))return!1}if(t instanceof dr)return!1;if(t instanceof Jr)return!1;let e=!0;return t.eachChild((t=>{e&&!on(t)&&(e=!1)})),e}function sn(t){if(t instanceof Qr&&\"feature-state\"===t.name)return!1;let e=!0;return t.eachChild((t=>{e&&!sn(t)&&(e=!1)})),e}function ln(t,e){if(t instanceof Qr&&e.indexOf(t.name)>=0)return!1;let r=!0;return t.eachChild((t=>{r&&!ln(t,e)&&(r=!1)})),r}function cn(t){return{result:\"success\",value:t}}function un(t){return{result:\"error\",value:t}}function hn(t){return\"data-driven\"===t[\"property-type\"]||\"cross-faded-data-driven\"===t[\"property-type\"]}function fn(t){return!!t.expression&&t.expression.parameters.indexOf(\"zoom\")>-1}function pn(t){return!!t.expression&&t.expression.interpolated}function dn(t){return t instanceof Number?\"number\":t instanceof String?\"string\":t instanceof Boolean?\"boolean\":Array.isArray(t)?\"array\":null===t?\"null\":typeof t}function mn(t){return\"object\"==typeof t&&null!==t&&!Array.isArray(t)}function gn(t){return t}function yn(t,e){const r=\"color\"===e.type,n=t.stops&&\"object\"==typeof t.stops[0][0],i=n||void 0!==t.property,a=n||!i,o=t.type||(pn(e)?\"exponential\":\"interval\");if(r||\"padding\"===e.type){const n=r?Xt.parse:Qt.parse;(t=at({},t)).stops&&(t.stops=t.stops.map((t=>[t[0],n(t[1])]))),t.default?t.default=n(t.default):t.default=n(e.default)}if(t.colorSpace&&(\"rgb\"!==(s=t.colorSpace)&&\"hcl\"!==s&&\"lab\"!==s))throw new Error(`Unknown color space: \"${t.colorSpace}\"`);var s;let l,c,u;if(\"exponential\"===o)l=bn;else if(\"interval\"===o)l=_n;else if(\"categorical\"===o){l=xn,c=Object.create(null);for(const e of t.stops)c[e[0]]=e[1];u=typeof t.stops[0][0]}else{if(\"identity\"!==o)throw new Error(`Unknown function type \"${o}\"`);l=wn}if(n){const r={},n=[];for(let e=0;et[0])),evaluate({zoom:r},n){return bn({stops:i,base:t.base},e,r).evaluate(r,n)}}}if(a){const r=\"exponential\"===o?{name:\"exponential\",base:void 0!==t.base?t.base:1}:null;return{kind:\"camera\",interpolationType:r,interpolationFactor:ze.interpolationFactor.bind(void 0,r),zoomStops:t.stops.map((t=>t[0])),evaluate:({zoom:r})=>l(t,e,r,c,u)}}return{kind:\"source\",evaluate(r,n){const i=n&&n.properties?n.properties[t.property]:void 0;return void 0===i?vn(t.default,e.default):l(t,e,i,c,u)}}}function vn(t,e,r){return void 0!==t?t:void 0!==e?e:void 0!==r?r:void 0}function xn(t,e,r,n,i){return vn(typeof r===i?n[r]:void 0,t.default,e.default)}function _n(t,e,r){if(\"number\"!==dn(r))return vn(t.default,e.default);const n=t.stops.length;if(1===n)return t.stops[0][1];if(r<=t.stops[0][0])return t.stops[0][1];if(r>=t.stops[n-1][0])return t.stops[n-1][1];const i=ke(t.stops.map((t=>t[0])),r);return t.stops[i][1]}function bn(t,e,r){const n=void 0!==t.base?t.base:1;if(\"number\"!==dn(r))return vn(t.default,e.default);const i=t.stops.length;if(1===i)return t.stops[0][1];if(r<=t.stops[0][0])return t.stops[0][1];if(r>=t.stops[i-1][0])return t.stops[i-1][1];const a=ke(t.stops.map((t=>t[0])),r),o=function(t,e,r,n){const i=n-r,a=t-r;return 0===i?0:1===e?a/i:(Math.pow(e,a)-1)/(Math.pow(e,i)-1)}(r,n,t.stops[a][0],t.stops[a+1][0]),s=t.stops[a][1],l=t.stops[a+1][1],c=Pe[e.type]||gn;return\"function\"==typeof s.evaluate?{evaluate(...e){const r=s.evaluate.apply(void 0,e),n=l.evaluate.apply(void 0,e);if(void 0!==r&&void 0!==n)return c(r,n,o,t.colorSpace)}}:c(s,l,o,t.colorSpace)}function wn(t,e,r){switch(e.type){case\"color\":r=Xt.parse(r);break;case\"formatted\":r=Kt.fromString(r.toString());break;case\"resolvedImage\":r=re.fromString(r.toString());break;case\"padding\":r=Qt.parse(r);break;default:dn(r)===e.type||\"enum\"===e.type&&e.values[r]||(r=void 0)}return vn(r,t.default,e.default)}Qr.register(Kr,{error:[{kind:\"error\"},[ut],(t,[e])=>{throw new le(e.evaluate(t))}],typeof:[ut,[dt],(t,[e])=>bt(ae(e.evaluate(t)))],\"to-rgba\":[_t(ct,4),[ft],(t,[e])=>{const[r,n,i,a]=e.evaluate(t).rgb;return[255*r,255*n,255*i,a]}],rgb:[ft,[ct,ct,ct],tn],rgba:[ft,[ct,ct,ct,ct],tn],has:{type:ht,overloads:[[[ut],(t,[e])=>en(e.evaluate(t),t.properties())],[[ut,pt],(t,[e,r])=>en(e.evaluate(t),r.evaluate(t))]]},get:{type:dt,overloads:[[[ut],(t,[e])=>rn(e.evaluate(t),t.properties())],[[ut,pt],(t,[e,r])=>rn(e.evaluate(t),r.evaluate(t))]]},\"feature-state\":[dt,[ut],(t,[e])=>rn(e.evaluate(t),t.featureState||{})],properties:[pt,[],t=>t.properties()],\"geometry-type\":[ut,[],t=>t.geometryType()],id:[dt,[],t=>t.id()],zoom:[ct,[],t=>t.globals.zoom],\"heatmap-density\":[ct,[],t=>t.globals.heatmapDensity||0],\"line-progress\":[ct,[],t=>t.globals.lineProgress||0],accumulated:[dt,[],t=>void 0===t.globals.accumulated?null:t.globals.accumulated],\"+\":[ct,nn(ct),(t,e)=>{let r=0;for(const n of e)r+=n.evaluate(t);return r}],\"*\":[ct,nn(ct),(t,e)=>{let r=1;for(const n of e)r*=n.evaluate(t);return r}],\"-\":{type:ct,overloads:[[[ct,ct],(t,[e,r])=>e.evaluate(t)-r.evaluate(t)],[[ct],(t,[e])=>-e.evaluate(t)]]},\"/\":[ct,[ct,ct],(t,[e,r])=>e.evaluate(t)/r.evaluate(t)],\"%\":[ct,[ct,ct],(t,[e,r])=>e.evaluate(t)%r.evaluate(t)],ln2:[ct,[],()=>Math.LN2],pi:[ct,[],()=>Math.PI],e:[ct,[],()=>Math.E],\"^\":[ct,[ct,ct],(t,[e,r])=>Math.pow(e.evaluate(t),r.evaluate(t))],sqrt:[ct,[ct],(t,[e])=>Math.sqrt(e.evaluate(t))],log10:[ct,[ct],(t,[e])=>Math.log(e.evaluate(t))/Math.LN10],ln:[ct,[ct],(t,[e])=>Math.log(e.evaluate(t))],log2:[ct,[ct],(t,[e])=>Math.log(e.evaluate(t))/Math.LN2],sin:[ct,[ct],(t,[e])=>Math.sin(e.evaluate(t))],cos:[ct,[ct],(t,[e])=>Math.cos(e.evaluate(t))],tan:[ct,[ct],(t,[e])=>Math.tan(e.evaluate(t))],asin:[ct,[ct],(t,[e])=>Math.asin(e.evaluate(t))],acos:[ct,[ct],(t,[e])=>Math.acos(e.evaluate(t))],atan:[ct,[ct],(t,[e])=>Math.atan(e.evaluate(t))],min:[ct,nn(ct),(t,e)=>Math.min(...e.map((e=>e.evaluate(t))))],max:[ct,nn(ct),(t,e)=>Math.max(...e.map((e=>e.evaluate(t))))],abs:[ct,[ct],(t,[e])=>Math.abs(e.evaluate(t))],round:[ct,[ct],(t,[e])=>{const r=e.evaluate(t);return r<0?-Math.round(-r):Math.round(r)}],floor:[ct,[ct],(t,[e])=>Math.floor(e.evaluate(t))],ceil:[ct,[ct],(t,[e])=>Math.ceil(e.evaluate(t))],\"filter-==\":[ht,[ut,dt],(t,[e,r])=>t.properties()[e.value]===r.value],\"filter-id-==\":[ht,[dt],(t,[e])=>t.id()===e.value],\"filter-type-==\":[ht,[ut],(t,[e])=>t.geometryType()===e.value],\"filter-<\":[ht,[ut,dt],(t,[e,r])=>{const n=t.properties()[e.value],i=r.value;return typeof n==typeof i&&n{const r=t.id(),n=e.value;return typeof r==typeof n&&r\":[ht,[ut,dt],(t,[e,r])=>{const n=t.properties()[e.value],i=r.value;return typeof n==typeof i&&n>i}],\"filter-id->\":[ht,[dt],(t,[e])=>{const r=t.id(),n=e.value;return typeof r==typeof n&&r>n}],\"filter-<=\":[ht,[ut,dt],(t,[e,r])=>{const n=t.properties()[e.value],i=r.value;return typeof n==typeof i&&n<=i}],\"filter-id-<=\":[ht,[dt],(t,[e])=>{const r=t.id(),n=e.value;return typeof r==typeof n&&r<=n}],\"filter->=\":[ht,[ut,dt],(t,[e,r])=>{const n=t.properties()[e.value],i=r.value;return typeof n==typeof i&&n>=i}],\"filter-id->=\":[ht,[dt],(t,[e])=>{const r=t.id(),n=e.value;return typeof r==typeof n&&r>=n}],\"filter-has\":[ht,[dt],(t,[e])=>e.value in t.properties()],\"filter-has-id\":[ht,[],t=>null!==t.id()&&void 0!==t.id()],\"filter-type-in\":[ht,[_t(ut)],(t,[e])=>e.value.indexOf(t.geometryType())>=0],\"filter-id-in\":[ht,[_t(dt)],(t,[e])=>e.value.indexOf(t.id())>=0],\"filter-in-small\":[ht,[ut,_t(dt)],(t,[e,r])=>r.value.indexOf(t.properties()[e.value])>=0],\"filter-in-large\":[ht,[ut,_t(dt)],(t,[e,r])=>function(t,e,r,n){for(;r<=n;){const i=r+n>>1;if(e[i]===t)return!0;e[i]>t?n=i-1:r=i+1}return!1}(t.properties()[e.value],r.value,0,r.value.length-1)],all:{type:ht,overloads:[[[ht,ht],(t,[e,r])=>e.evaluate(t)&&r.evaluate(t)],[nn(ht),(t,e)=>{for(const r of e)if(!r.evaluate(t))return!1;return!0}]]},any:{type:ht,overloads:[[[ht,ht],(t,[e,r])=>e.evaluate(t)||r.evaluate(t)],[nn(ht),(t,e)=>{for(const r of e)if(r.evaluate(t))return!0;return!1}]]},\"!\":[ht,[ht],(t,[e])=>!e.evaluate(t)],\"is-supported-script\":[ht,[ut],(t,[e])=>{const r=t.globals&&t.globals.isSupportedScript;return!r||r(e.evaluate(t))}],upcase:[ut,[ut],(t,[e])=>e.evaluate(t).toUpperCase()],downcase:[ut,[ut],(t,[e])=>e.evaluate(t).toLowerCase()],concat:[ut,nn(dt),(t,e)=>e.map((e=>oe(e.evaluate(t)))).join(\"\")],\"resolved-locale\":[ut,[mt],(t,[e])=>e.evaluate(t).resolvedLocale()]});class Tn{constructor(t,e){var r;this.expression=t,this._warningHistory={},this._evaluator=new de,this._defaultValue=e?\"color\"===(r=e).type&&mn(r.default)?new Xt(0,0,0,0):\"color\"===r.type?Xt.parse(r.default)||null:\"padding\"===r.type?Qt.parse(r.default)||null:\"variableAnchorOffsetCollection\"===r.type?ee.parse(r.default)||null:void 0===r.default?null:r.default:null,this._enumValues=e&&\"enum\"===e.type?e.values:null}evaluateWithoutErrorHandling(t,e,r,n,i,a){return this._evaluator.globals=t,this._evaluator.feature=e,this._evaluator.featureState=r,this._evaluator.canonical=n,this._evaluator.availableImages=i||null,this._evaluator.formattedSection=a,this.expression.evaluate(this._evaluator)}evaluate(t,e,r,n,i,a){this._evaluator.globals=t,this._evaluator.feature=e||null,this._evaluator.featureState=r||null,this._evaluator.canonical=n,this._evaluator.availableImages=i||null,this._evaluator.formattedSection=a||null;try{const t=this.expression.evaluate(this._evaluator);if(null==t||\"number\"==typeof t&&t!=t)return this._defaultValue;if(this._enumValues&&!(t in this._enumValues))throw new le(`Expected value to be one of ${Object.keys(this._enumValues).map((t=>JSON.stringify(t))).join(\", \")}, but found ${JSON.stringify(t)} instead.`);return t}catch(t){return this._warningHistory[t.message]||(this._warningHistory[t.message]=!0,\"undefined\"!=typeof console&&console.warn(t.message)),this._defaultValue}}}function kn(t){return Array.isArray(t)&&t.length>0&&\"string\"==typeof t[0]&&t[0]in Kr}function An(t,e){const r=new me(Kr,an,[],e?function(t){const e={color:ft,string:ut,number:ct,enum:ut,boolean:ht,formatted:gt,padding:yt,resolvedImage:vt,variableAnchorOffsetCollection:xt};return\"array\"===t.type?_t(e[t.value]||dt,t.length):e[t.type]}(e):void 0),n=r.parse(t,void 0,void 0,void 0,e&&\"string\"===e.type?{typeAnnotation:\"coerce\"}:void 0);return n?cn(new Tn(n,e)):un(r.errors)}class Mn{constructor(t,e){this.kind=t,this._styleExpression=e,this.isStateDependent=\"constant\"!==t&&!sn(e.expression)}evaluateWithoutErrorHandling(t,e,r,n,i,a){return this._styleExpression.evaluateWithoutErrorHandling(t,e,r,n,i,a)}evaluate(t,e,r,n,i,a){return this._styleExpression.evaluate(t,e,r,n,i,a)}}class Sn{constructor(t,e,r,n){this.kind=t,this.zoomStops=r,this._styleExpression=e,this.isStateDependent=\"camera\"!==t&&!sn(e.expression),this.interpolationType=n}evaluateWithoutErrorHandling(t,e,r,n,i,a){return this._styleExpression.evaluateWithoutErrorHandling(t,e,r,n,i,a)}evaluate(t,e,r,n,i,a){return this._styleExpression.evaluate(t,e,r,n,i,a)}interpolationFactor(t,e,r){return this.interpolationType?ze.interpolationFactor(this.interpolationType,t,e,r):0}}function En(t,e){const r=An(t,e);if(\"error\"===r.result)return r;const n=r.value.expression,i=on(n);if(!i&&!hn(e))return un([new ot(\"\",\"data expressions not supported\")]);const a=ln(n,[\"zoom\"]);if(!a&&!fn(e))return un([new ot(\"\",\"zoom expressions not supported\")]);const o=Ln(n);if(!o&&!a)return un([new ot(\"\",'\"zoom\" expression may only be used as input to a top-level \"step\" or \"interpolate\" expression.')]);if(o instanceof ot)return un([o]);if(o instanceof ze&&!pn(e))return un([new ot(\"\",'\"interpolate\" expressions cannot be used with this property')]);if(!o)return cn(new Mn(i?\"constant\":\"source\",r.value));const s=o instanceof ze?o.interpolation:void 0;return cn(new Sn(i?\"camera\":\"composite\",r.value,o.labels,s))}class Cn{constructor(t,e){this._parameters=t,this._specification=e,at(this,yn(this._parameters,this._specification))}static deserialize(t){return new Cn(t._parameters,t._specification)}static serialize(t){return{_parameters:t._parameters,_specification:t._specification}}}function Ln(t){let e=null;if(t instanceof ge)e=Ln(t.result);else if(t instanceof De){for(const r of t.args)if(e=Ln(r),e)break}else(t instanceof Ae||t instanceof ze)&&t.input instanceof Qr&&\"zoom\"===t.input.name&&(e=t);return e instanceof ot||t.eachChild((t=>{const r=Ln(t);r instanceof ot?e=r:!e&&r?e=new ot(\"\",'\"zoom\" expression may only be used as input to a top-level \"step\" or \"interpolate\" expression.'):e&&r&&e!==r&&(e=new ot(\"\",'Only one zoom-based \"step\" or \"interpolate\" subexpression may be used in an expression.'))})),e}function In(t){if(!0===t||!1===t)return!0;if(!Array.isArray(t)||0===t.length)return!1;switch(t[0]){case\"has\":return t.length>=2&&\"$id\"!==t[1]&&\"$type\"!==t[1];case\"in\":return t.length>=3&&(\"string\"!=typeof t[1]||Array.isArray(t[2]));case\"!in\":case\"!has\":case\"none\":return!1;case\"==\":case\"!=\":case\">\":case\">=\":case\"<\":case\"<=\":return 3!==t.length||Array.isArray(t[1])||Array.isArray(t[2]);case\"any\":case\"all\":for(const e of t.slice(1))if(!In(e)&&\"boolean\"!=typeof e)return!1;return!0;default:return!0}}const Pn={type:\"boolean\",default:!1,transition:!1,\"property-type\":\"data-driven\",expression:{interpolated:!1,parameters:[\"zoom\",\"feature\"]}};function zn(t){if(null==t)return{filter:()=>!0,needGeometry:!1};In(t)||(t=Rn(t));const e=An(t,Pn);if(\"error\"===e.result)throw new Error(e.value.map((t=>`${t.key}: ${t.message}`)).join(\", \"));return{filter:(t,r,n)=>e.value.evaluate(t,r,{},n),needGeometry:Dn(t)}}function On(t,e){return te?1:0}function Dn(t){if(!Array.isArray(t))return!1;if(\"within\"===t[0]||\"distance\"===t[0])return!0;for(let e=1;e\"===e||\"<=\"===e||\">=\"===e?Fn(t[1],t[2],e):\"any\"===e?(r=t.slice(1),[\"any\"].concat(r.map(Rn))):\"all\"===e?[\"all\"].concat(t.slice(1).map(Rn)):\"none\"===e?[\"all\"].concat(t.slice(1).map(Rn).map(jn)):\"in\"===e?Bn(t[1],t.slice(2)):\"!in\"===e?jn(Bn(t[1],t.slice(2))):\"has\"===e?Nn(t[1]):\"!has\"!==e||jn(Nn(t[1]));var r}function Fn(t,e,r){switch(t){case\"$type\":return[`filter-type-${r}`,e];case\"$id\":return[`filter-id-${r}`,e];default:return[`filter-${r}`,t,e]}}function Bn(t,e){if(0===e.length)return!1;switch(t){case\"$type\":return[\"filter-type-in\",[\"literal\",e]];case\"$id\":return[\"filter-id-in\",[\"literal\",e]];default:return e.length>200&&!e.some((t=>typeof t!=typeof e[0]))?[\"filter-in-large\",t,[\"literal\",e.sort(On)]]:[\"filter-in-small\",t,[\"literal\",e]]}}function Nn(t){switch(t){case\"$type\":return!0;case\"$id\":return[\"filter-has-id\"];default:return[\"filter-has\",t]}}function jn(t){return[\"!\",t]}function Un(t){const e=typeof t;if(\"number\"===e||\"boolean\"===e||\"string\"===e||null==t)return JSON.stringify(t);if(Array.isArray(t)){let e=\"[\";for(const r of t)e+=`${Un(r)},`;return`${e}]`}const r=Object.keys(t).sort();let n=\"{\";for(let e=0;en.maximum?[new it(e,r,`${r} is greater than the maximum value ${n.maximum}`)]:[]}function Xn(t){const e=t.valueSpec,r=Hn(t.value.type);let n,i,a,o={};const s=\"categorical\"!==r&&void 0===t.value.property,l=!s,c=\"array\"===dn(t.value.stops)&&\"array\"===dn(t.value.stops[0])&&\"object\"===dn(t.value.stops[0][0]),u=Zn({key:t.key,value:t.value,valueSpec:t.styleSpec.function,validateSpec:t.validateSpec,style:t.style,styleSpec:t.styleSpec,objectElementValidators:{stops:function(t){if(\"identity\"===r)return[new it(t.key,t.value,'identity function may not have a \"stops\" property')];let e=[];const n=t.value;return e=e.concat(Wn({key:t.key,value:n,valueSpec:t.valueSpec,validateSpec:t.validateSpec,style:t.style,styleSpec:t.styleSpec,arrayElementValidator:h})),\"array\"===dn(n)&&0===n.length&&e.push(new it(t.key,n,\"array must have at least one stop\")),e},default:function(t){return t.validateSpec({key:t.key,value:t.value,valueSpec:e,validateSpec:t.validateSpec,style:t.style,styleSpec:t.styleSpec})}}});return\"identity\"===r&&s&&u.push(new it(t.key,t.value,'missing required property \"property\"')),\"identity\"===r||t.value.stops||u.push(new it(t.key,t.value,'missing required property \"stops\"')),\"exponential\"===r&&t.valueSpec.expression&&!pn(t.valueSpec)&&u.push(new it(t.key,t.value,\"exponential functions not supported\")),t.styleSpec.$version>=8&&(l&&!hn(t.valueSpec)?u.push(new it(t.key,t.value,\"property functions not supported\")):s&&!fn(t.valueSpec)&&u.push(new it(t.key,t.value,\"zoom functions not supported\"))),\"categorical\"!==r&&!c||void 0!==t.value.property||u.push(new it(t.key,t.value,'\"property\" property is required')),u;function h(t){let r=[];const n=t.value,s=t.key;if(\"array\"!==dn(n))return[new it(s,n,`array expected, ${dn(n)} found`)];if(2!==n.length)return[new it(s,n,`array length 2 expected, length ${n.length} found`)];if(c){if(\"object\"!==dn(n[0]))return[new it(s,n,`object expected, ${dn(n[0])} found`)];if(void 0===n[0].zoom)return[new it(s,n,\"object stop key must have zoom\")];if(void 0===n[0].value)return[new it(s,n,\"object stop key must have value\")];if(a&&a>Hn(n[0].zoom))return[new it(s,n[0].zoom,\"stop zoom values must appear in ascending order\")];Hn(n[0].zoom)!==a&&(a=Hn(n[0].zoom),i=void 0,o={}),r=r.concat(Zn({key:`${s}[0]`,value:n[0],valueSpec:{zoom:{}},validateSpec:t.validateSpec,style:t.style,styleSpec:t.styleSpec,objectElementValidators:{zoom:Yn,value:f}}))}else r=r.concat(f({key:`${s}[0]`,value:n[0],valueSpec:{},validateSpec:t.validateSpec,style:t.style,styleSpec:t.styleSpec},n));return kn(Gn(n[1]))?r.concat([new it(`${s}[1]`,n[1],\"expressions are not allowed in function stops.\")]):r.concat(t.validateSpec({key:`${s}[1]`,value:n[1],valueSpec:e,validateSpec:t.validateSpec,style:t.style,styleSpec:t.styleSpec}))}function f(t,a){const s=dn(t.value),l=Hn(t.value),c=null!==t.value?t.value:a;if(n){if(s!==n)return[new it(t.key,c,`${s} stop domain type must match previous stop domain type ${n}`)]}else n=s;if(\"number\"!==s&&\"string\"!==s&&\"boolean\"!==s)return[new it(t.key,c,\"stop domain value must be a number, string, or boolean\")];if(\"number\"!==s&&\"categorical\"!==r){let n=`number expected, ${s} found`;return hn(e)&&void 0===r&&(n+='\\nIf you intended to use a categorical function, specify `\"type\": \"categorical\"`.'),[new it(t.key,c,n)]}return\"categorical\"!==r||\"number\"!==s||isFinite(l)&&Math.floor(l)===l?\"categorical\"!==r&&\"number\"===s&&void 0!==i&&lnew it(`${t.key}${e.key}`,t.value,e.message)));const r=e.value.expression||e.value._styleExpression.expression;if(\"property\"===t.expressionContext&&\"text-font\"===t.propertyKey&&!r.outputDefined())return[new it(t.key,t.value,`Invalid data expression for \"${t.propertyKey}\". Output values must be contained as literals within the expression.`)];if(\"property\"===t.expressionContext&&\"layout\"===t.propertyType&&!sn(r))return[new it(t.key,t.value,'\"feature-state\" data expressions are not supported with layout properties.')];if(\"filter\"===t.expressionContext&&!sn(r))return[new it(t.key,t.value,'\"feature-state\" data expressions are not supported with filters.')];if(t.expressionContext&&0===t.expressionContext.indexOf(\"cluster\")){if(!ln(r,[\"zoom\",\"feature-state\"]))return[new it(t.key,t.value,'\"zoom\" and \"feature-state\" expressions are not supported with cluster properties.')];if(\"cluster-initial\"===t.expressionContext&&!on(r))return[new it(t.key,t.value,\"Feature data expressions are not supported with initial expression part of cluster properties.\")]}return[]}function Jn(t){const e=t.key,r=t.value,n=t.valueSpec,i=[];return Array.isArray(n.values)?-1===n.values.indexOf(Hn(r))&&i.push(new it(e,r,`expected one of [${n.values.join(\", \")}], ${JSON.stringify(r)} found`)):-1===Object.keys(n.values).indexOf(Hn(r))&&i.push(new it(e,r,`expected one of [${Object.keys(n.values).join(\", \")}], ${JSON.stringify(r)} found`)),i}function Kn(t){return In(Gn(t.value))?$n(at({},t,{expressionContext:\"filter\",valueSpec:{value:\"boolean\"}})):Qn(t)}function Qn(t){const e=t.value,r=t.key;if(\"array\"!==dn(e))return[new it(r,e,`array expected, ${dn(e)} found`)];const n=t.styleSpec;let i,a=[];if(e.length<1)return[new it(r,e,\"filter array must have at least 1 element\")];switch(a=a.concat(Jn({key:`${r}[0]`,value:e[0],valueSpec:n.filter_operator,style:t.style,styleSpec:t.styleSpec})),Hn(e[0])){case\"<\":case\"<=\":case\">\":case\">=\":e.length>=2&&\"$type\"===Hn(e[1])&&a.push(new it(r,e,`\"$type\" cannot be use with operator \"${e[0]}\"`));case\"==\":case\"!=\":3!==e.length&&a.push(new it(r,e,`filter array for operator \"${e[0]}\" must have 3 elements`));case\"in\":case\"!in\":e.length>=2&&(i=dn(e[1]),\"string\"!==i&&a.push(new it(`${r}[1]`,e[1],`string expected, ${i} found`)));for(let o=2;o{t in r&&e.push(new it(n,r[t],`\"${t}\" is prohibited for ref layers`))})),i.layers.forEach((e=>{Hn(e.id)===s&&(t=e)})),t?t.ref?e.push(new it(n,r.ref,\"ref cannot reference another ref layer\")):o=Hn(t.type):e.push(new it(n,r.ref,`ref layer \"${s}\" not found`))}else if(\"background\"!==o)if(r.source){const t=i.sources&&i.sources[r.source],a=t&&Hn(t.type);t?\"vector\"===a&&\"raster\"===o?e.push(new it(n,r.source,`layer \"${r.id}\" requires a raster source`)):\"raster-dem\"!==a&&\"hillshade\"===o?e.push(new it(n,r.source,`layer \"${r.id}\" requires a raster-dem source`)):\"raster\"===a&&\"raster\"!==o?e.push(new it(n,r.source,`layer \"${r.id}\" requires a vector source`)):\"vector\"!==a||r[\"source-layer\"]?\"raster-dem\"===a&&\"hillshade\"!==o?e.push(new it(n,r.source,\"raster-dem source can only be used with layer type 'hillshade'.\")):\"line\"!==o||!r.paint||!r.paint[\"line-gradient\"]||\"geojson\"===a&&t.lineMetrics||e.push(new it(n,r,`layer \"${r.id}\" specifies a line-gradient, which requires a GeoJSON source with \\`lineMetrics\\` enabled.`)):e.push(new it(n,r,`layer \"${r.id}\" must specify a \"source-layer\"`)):e.push(new it(n,r.source,`source \"${r.source}\" not found`))}else e.push(new it(n,r,'missing required property \"source\"'));return e=e.concat(Zn({key:n,value:r,valueSpec:a.layer,style:t.style,styleSpec:t.styleSpec,validateSpec:t.validateSpec,objectElementValidators:{\"*\"(){return[]},type(){return t.validateSpec({key:`${n}.type`,value:r.type,valueSpec:a.layer.type,style:t.style,styleSpec:t.styleSpec,validateSpec:t.validateSpec,object:r,objectKey:\"type\"})},filter:Kn,layout(t){return Zn({layer:r,key:t.key,value:t.value,style:t.style,styleSpec:t.styleSpec,validateSpec:t.validateSpec,objectElementValidators:{\"*\"(t){return ri(at({layerType:o},t))}}})},paint(t){return Zn({layer:r,key:t.key,value:t.value,style:t.style,styleSpec:t.styleSpec,validateSpec:t.validateSpec,objectElementValidators:{\"*\"(t){return ei(at({layerType:o},t))}}})}}})),e}function ii(t){const e=t.value,r=t.key,n=dn(e);return\"string\"!==n?[new it(r,e,`string expected, ${n} found`)]:[]}const ai={promoteId:function({key:t,value:e}){if(\"string\"===dn(e))return ii({key:t,value:e});{const r=[];for(const n in e)r.push(...ii({key:`${t}.${n}`,value:e[n]}));return r}}};function oi(t){const e=t.value,r=t.key,n=t.styleSpec,i=t.style,a=t.validateSpec;if(!e.type)return[new it(r,e,'\"type\" is required')];const o=Hn(e.type);let s;switch(o){case\"vector\":case\"raster\":return s=Zn({key:r,value:e,valueSpec:n[`source_${o.replace(\"-\",\"_\")}`],style:t.style,styleSpec:n,objectElementValidators:ai,validateSpec:a}),s;case\"raster-dem\":return s=function(t){var e;const r=null!==(e=t.sourceName)&&void 0!==e?e:\"\",n=t.value,i=t.styleSpec,a=i.source_raster_dem,o=t.style;let s=[];const l=dn(n);if(void 0===n)return s;if(\"object\"!==l)return s.push(new it(\"source_raster_dem\",n,`object expected, ${l} found`)),s;const c=\"custom\"===Hn(n.encoding),u=[\"redFactor\",\"greenFactor\",\"blueFactor\",\"baseShift\"],h=t.value.encoding?`\"${t.value.encoding}\"`:\"Default\";for(const e in n)!c&&u.includes(e)?s.push(new it(e,n[e],`In \"${r}\": \"${e}\" is only valid when \"encoding\" is set to \"custom\". ${h} encoding found`)):a[e]?s=s.concat(t.validateSpec({key:e,value:n[e],valueSpec:a[e],validateSpec:t.validateSpec,style:o,styleSpec:i})):s.push(new it(e,n[e],`unknown property \"${e}\"`));return s}({sourceName:r,value:e,style:t.style,styleSpec:n,validateSpec:a}),s;case\"geojson\":if(s=Zn({key:r,value:e,valueSpec:n.source_geojson,style:i,styleSpec:n,validateSpec:a,objectElementValidators:ai}),e.cluster)for(const t in e.clusterProperties){const[n,i]=e.clusterProperties[t],o=\"string\"==typeof n?[n,[\"accumulated\"],[\"get\",t]]:n;s.push(...$n({key:`${r}.${t}.map`,value:i,validateSpec:a,expressionContext:\"cluster-map\"})),s.push(...$n({key:`${r}.${t}.reduce`,value:o,validateSpec:a,expressionContext:\"cluster-reduce\"}))}return s;case\"video\":return Zn({key:r,value:e,valueSpec:n.source_video,style:i,validateSpec:a,styleSpec:n});case\"image\":return Zn({key:r,value:e,valueSpec:n.source_image,style:i,validateSpec:a,styleSpec:n});case\"canvas\":return[new it(r,null,\"Please use runtime APIs to add canvas sources, rather than including them in stylesheets.\",\"source.canvas\")];default:return Jn({key:`${r}.type`,value:e.type,valueSpec:{values:[\"vector\",\"raster\",\"raster-dem\",\"geojson\",\"video\",\"image\"]},style:i,validateSpec:a,styleSpec:n})}}function si(t){const e=t.value,r=t.styleSpec,n=r.light,i=t.style;let a=[];const o=dn(e);if(void 0===e)return a;if(\"object\"!==o)return a=a.concat([new it(\"light\",e,`object expected, ${o} found`)]),a;for(const o in e){const s=o.match(/^(.*)-transition$/);a=s&&n[s[1]]&&n[s[1]].transition?a.concat(t.validateSpec({key:o,value:e[o],valueSpec:r.transition,validateSpec:t.validateSpec,style:i,styleSpec:r})):n[o]?a.concat(t.validateSpec({key:o,value:e[o],valueSpec:n[o],validateSpec:t.validateSpec,style:i,styleSpec:r})):a.concat([new it(o,e[o],`unknown property \"${o}\"`)])}return a}function li(t){const e=t.value,r=t.styleSpec,n=r.sky,i=t.style,a=dn(e);if(void 0===e)return[];if(\"object\"!==a)return[new it(\"sky\",e,`object expected, ${a} found`)];let o=[];for(const a in e)o=n[a]?o.concat(t.validateSpec({key:a,value:e[a],valueSpec:n[a],style:i,styleSpec:r})):o.concat([new it(a,e[a],`unknown property \"${a}\"`)]);return o}function ci(t){const e=t.value,r=t.styleSpec,n=r.terrain,i=t.style;let a=[];const o=dn(e);if(void 0===e)return a;if(\"object\"!==o)return a=a.concat([new it(\"terrain\",e,`object expected, ${o} found`)]),a;for(const o in e)a=n[o]?a.concat(t.validateSpec({key:o,value:e[o],valueSpec:n[o],validateSpec:t.validateSpec,style:i,styleSpec:r})):a.concat([new it(o,e[o],`unknown property \"${o}\"`)]);return a}function ui(t){let e=[];const r=t.value,n=t.key;if(Array.isArray(r)){const i=[],a=[];for(const o in r){r[o].id&&i.includes(r[o].id)&&e.push(new it(n,r,`all the sprites' ids must be unique, but ${r[o].id} is duplicated`)),i.push(r[o].id),r[o].url&&a.includes(r[o].url)&&e.push(new it(n,r,`all the sprites' URLs must be unique, but ${r[o].url} is duplicated`)),a.push(r[o].url);const s={id:{type:\"string\",required:!0},url:{type:\"string\",required:!0}};e=e.concat(Zn({key:`${n}[${o}]`,value:r[o],valueSpec:s,validateSpec:t.validateSpec}))}return e}return ii({key:n,value:r})}const hi={\"*\"(){return[]},array:Wn,boolean:function(t){const e=t.value,r=t.key,n=dn(e);return\"boolean\"!==n?[new it(r,e,`boolean expected, ${n} found`)]:[]},number:Yn,color:function(t){const e=t.key,r=t.value,n=dn(r);return\"string\"!==n?[new it(e,r,`color expected, ${n} found`)]:Xt.parse(String(r))?[]:[new it(e,r,`color expected, \"${r}\" found`)]},constants:qn,enum:Jn,filter:Kn,function:Xn,layer:ni,object:Zn,source:oi,light:si,sky:li,terrain:ci,projection:function(t){const e=t.value,r=t.styleSpec,n=r.projection,i=t.style,a=dn(e);if(void 0===e)return[];if(\"object\"!==a)return[new it(\"projection\",e,`object expected, ${a} found`)];let o=[];for(const a in e)o=n[a]?o.concat(t.validateSpec({key:a,value:e[a],valueSpec:n[a],style:i,styleSpec:r})):o.concat([new it(a,e[a],`unknown property \"${a}\"`)]);return o},string:ii,formatted:function(t){return 0===ii(t).length?[]:$n(t)},resolvedImage:function(t){return 0===ii(t).length?[]:$n(t)},padding:function(t){const e=t.key,r=t.value;if(\"array\"===dn(r)){if(r.length<1||r.length>4)return[new it(e,r,`padding requires 1 to 4 values; ${r.length} values found`)];const n={type:\"number\"};let i=[];for(let a=0;at.line-e.line))}function yi(t){return function(...e){return gi(t.apply(this,e))}}di.source=yi(mi(oi)),di.sprite=yi(mi(ui)),di.glyphs=yi(mi(pi)),di.light=yi(mi(si)),di.sky=yi(mi(li)),di.terrain=yi(mi(ci)),di.layer=yi(mi(ni)),di.filter=yi(mi(Kn)),di.paintProperty=yi(mi(ei)),di.layoutProperty=yi(mi(ri));const vi=di;vi.source;const xi=vi.light,_i=vi.sky;vi.terrain,vi.filter;const bi=vi.paintProperty,wi=vi.layoutProperty;function Ti(t,e){let r=!1;if(e&&e.length)for(const n of e)t.fire(new H(new Error(n.message))),r=!0;return r}class ki{constructor(t,e,r){const n=this.cells=[];if(t instanceof ArrayBuffer){this.arrayBuffer=t;const i=new Int32Array(this.arrayBuffer);t=i[0],e=i[1],r=i[2],this.d=e+2*r;for(let t=0;t=c[l+0]&&n>=c[l+1])?(o[h]=!0,a.push(i[h])):o[h]=!1}}}}_forEachCell(t,e,r,n,i,a,o,s){const l=this._convertToCellCoord(t),c=this._convertToCellCoord(e),u=this._convertToCellCoord(r),h=this._convertToCellCoord(n);for(let f=l;f<=u;f++)for(let l=c;l<=h;l++){const c=this.d*l+f;if((!s||s(this._convertFromCellCoord(f),this._convertFromCellCoord(l),this._convertFromCellCoord(f+1),this._convertFromCellCoord(l+1)))&&i.call(this,t,e,r,n,c,a,o,s))return}}_convertFromCellCoord(t){return(t-this.padding)/this.scale}_convertToCellCoord(t){return Math.max(0,Math.min(this.d-1,Math.floor(t*this.scale)+this.padding))}toArrayBuffer(){if(this.arrayBuffer)return this.arrayBuffer;const t=this.cells,e=3+this.cells.length+1+1;let r=0;for(let t=0;t=0)continue;const a=t[n];i[n]=Ai[r].shallow.indexOf(n)>=0?a:Li(a,e)}t instanceof Error&&(i.message=t.message)}if(i.$name)throw new Error(\"$name property is reserved for worker serialization logic.\");return\"Object\"!==r&&(i.$name=r),i}function Ii(t){if(Ci(t))return t;if(Array.isArray(t))return t.map(Ii);if(\"object\"!=typeof t)throw new Error(\"can't deserialize object of type \"+typeof t);const e=Ei(t)||\"Object\";if(!Ai[e])throw new Error(`can't deserialize unregistered class ${e}`);const{klass:r}=Ai[e];if(!r)throw new Error(`can't deserialize unregistered class ${e}`);if(r.deserialize)return r.deserialize(t);const n=Object.create(r.prototype);for(const r of Object.keys(t)){if(\"$name\"===r)continue;const i=t[r];n[r]=Ai[e].shallow.indexOf(r)>=0?i:Ii(i)}return n}class Pi{constructor(){this.first=!0}update(t,e){const r=Math.floor(t);return this.first?(this.first=!1,this.lastIntegerZoom=r,this.lastIntegerZoomTime=0,this.lastZoom=t,this.lastFloorZoom=r,!0):(this.lastFloorZoom>r?(this.lastIntegerZoom=r+1,this.lastIntegerZoomTime=e):this.lastFloorZoomt>=128&&t<=255,Arabic:t=>t>=1536&&t<=1791,\"Arabic Supplement\":t=>t>=1872&&t<=1919,\"Arabic Extended-A\":t=>t>=2208&&t<=2303,\"Hangul Jamo\":t=>t>=4352&&t<=4607,\"Unified Canadian Aboriginal Syllabics\":t=>t>=5120&&t<=5759,Khmer:t=>t>=6016&&t<=6143,\"Unified Canadian Aboriginal Syllabics Extended\":t=>t>=6320&&t<=6399,\"General Punctuation\":t=>t>=8192&&t<=8303,\"Letterlike Symbols\":t=>t>=8448&&t<=8527,\"Number Forms\":t=>t>=8528&&t<=8591,\"Miscellaneous Technical\":t=>t>=8960&&t<=9215,\"Control Pictures\":t=>t>=9216&&t<=9279,\"Optical Character Recognition\":t=>t>=9280&&t<=9311,\"Enclosed Alphanumerics\":t=>t>=9312&&t<=9471,\"Geometric Shapes\":t=>t>=9632&&t<=9727,\"Miscellaneous Symbols\":t=>t>=9728&&t<=9983,\"Miscellaneous Symbols and Arrows\":t=>t>=11008&&t<=11263,\"CJK Radicals Supplement\":t=>t>=11904&&t<=12031,\"Kangxi Radicals\":t=>t>=12032&&t<=12255,\"Ideographic Description Characters\":t=>t>=12272&&t<=12287,\"CJK Symbols and Punctuation\":t=>t>=12288&&t<=12351,Hiragana:t=>t>=12352&&t<=12447,Katakana:t=>t>=12448&&t<=12543,Bopomofo:t=>t>=12544&&t<=12591,\"Hangul Compatibility Jamo\":t=>t>=12592&&t<=12687,Kanbun:t=>t>=12688&&t<=12703,\"Bopomofo Extended\":t=>t>=12704&&t<=12735,\"CJK Strokes\":t=>t>=12736&&t<=12783,\"Katakana Phonetic Extensions\":t=>t>=12784&&t<=12799,\"Enclosed CJK Letters and Months\":t=>t>=12800&&t<=13055,\"CJK Compatibility\":t=>t>=13056&&t<=13311,\"CJK Unified Ideographs Extension A\":t=>t>=13312&&t<=19903,\"Yijing Hexagram Symbols\":t=>t>=19904&&t<=19967,\"CJK Unified Ideographs\":t=>t>=19968&&t<=40959,\"Yi Syllables\":t=>t>=40960&&t<=42127,\"Yi Radicals\":t=>t>=42128&&t<=42191,\"Hangul Jamo Extended-A\":t=>t>=43360&&t<=43391,\"Hangul Syllables\":t=>t>=44032&&t<=55215,\"Hangul Jamo Extended-B\":t=>t>=55216&&t<=55295,\"Private Use Area\":t=>t>=57344&&t<=63743,\"CJK Compatibility Ideographs\":t=>t>=63744&&t<=64255,\"Arabic Presentation Forms-A\":t=>t>=64336&&t<=65023,\"Vertical Forms\":t=>t>=65040&&t<=65055,\"CJK Compatibility Forms\":t=>t>=65072&&t<=65103,\"Small Form Variants\":t=>t>=65104&&t<=65135,\"Arabic Presentation Forms-B\":t=>t>=65136&&t<=65279,\"Halfwidth and Fullwidth Forms\":t=>t>=65280&&t<=65519};function Oi(t){for(const e of t)if(Fi(e.charCodeAt(0)))return!0;return!1}function Di(t){for(const e of t)if(!Ri(e.charCodeAt(0)))return!1;return!0}function Ri(t){return!(zi.Arabic(t)||zi[\"Arabic Supplement\"](t)||zi[\"Arabic Extended-A\"](t)||zi[\"Arabic Presentation Forms-A\"](t)||zi[\"Arabic Presentation Forms-B\"](t))}function Fi(t){return!(746!==t&&747!==t&&(t<4352||!(zi[\"Bopomofo Extended\"](t)||zi.Bopomofo(t)||zi[\"CJK Compatibility Forms\"](t)&&!(t>=65097&&t<=65103)||zi[\"CJK Compatibility Ideographs\"](t)||zi[\"CJK Compatibility\"](t)||zi[\"CJK Radicals Supplement\"](t)||zi[\"CJK Strokes\"](t)||!(!zi[\"CJK Symbols and Punctuation\"](t)||t>=12296&&t<=12305||t>=12308&&t<=12319||12336===t)||zi[\"CJK Unified Ideographs Extension A\"](t)||zi[\"CJK Unified Ideographs\"](t)||zi[\"Enclosed CJK Letters and Months\"](t)||zi[\"Hangul Compatibility Jamo\"](t)||zi[\"Hangul Jamo Extended-A\"](t)||zi[\"Hangul Jamo Extended-B\"](t)||zi[\"Hangul Jamo\"](t)||zi[\"Hangul Syllables\"](t)||zi.Hiragana(t)||zi[\"Ideographic Description Characters\"](t)||zi.Kanbun(t)||zi[\"Kangxi Radicals\"](t)||zi[\"Katakana Phonetic Extensions\"](t)||zi.Katakana(t)&&12540!==t||!(!zi[\"Halfwidth and Fullwidth Forms\"](t)||65288===t||65289===t||65293===t||t>=65306&&t<=65310||65339===t||65341===t||65343===t||t>=65371&&t<=65503||65507===t||t>=65512&&t<=65519)||!(!zi[\"Small Form Variants\"](t)||t>=65112&&t<=65118||t>=65123&&t<=65126)||zi[\"Unified Canadian Aboriginal Syllabics\"](t)||zi[\"Unified Canadian Aboriginal Syllabics Extended\"](t)||zi[\"Vertical Forms\"](t)||zi[\"Yijing Hexagram Symbols\"](t)||zi[\"Yi Syllables\"](t)||zi[\"Yi Radicals\"](t))))}function Bi(t){return!(Fi(t)||function(t){return!!(zi[\"Latin-1 Supplement\"](t)&&(167===t||169===t||174===t||177===t||188===t||189===t||190===t||215===t||247===t)||zi[\"General Punctuation\"](t)&&(8214===t||8224===t||8225===t||8240===t||8241===t||8251===t||8252===t||8258===t||8263===t||8264===t||8265===t||8273===t)||zi[\"Letterlike Symbols\"](t)||zi[\"Number Forms\"](t)||zi[\"Miscellaneous Technical\"](t)&&(t>=8960&&t<=8967||t>=8972&&t<=8991||t>=8996&&t<=9e3||9003===t||t>=9085&&t<=9114||t>=9150&&t<=9165||9167===t||t>=9169&&t<=9179||t>=9186&&t<=9215)||zi[\"Control Pictures\"](t)&&9251!==t||zi[\"Optical Character Recognition\"](t)||zi[\"Enclosed Alphanumerics\"](t)||zi[\"Geometric Shapes\"](t)||zi[\"Miscellaneous Symbols\"](t)&&!(t>=9754&&t<=9759)||zi[\"Miscellaneous Symbols and Arrows\"](t)&&(t>=11026&&t<=11055||t>=11088&&t<=11097||t>=11192&&t<=11243)||zi[\"CJK Symbols and Punctuation\"](t)||zi.Katakana(t)||zi[\"Private Use Area\"](t)||zi[\"CJK Compatibility Forms\"](t)||zi[\"Small Form Variants\"](t)||zi[\"Halfwidth and Fullwidth Forms\"](t)||8734===t||8756===t||8757===t||t>=9984&&t<=10087||t>=10102&&t<=10131||65532===t||65533===t)}(t))}function Ni(t){return zi.Arabic(t)||zi[\"Arabic Supplement\"](t)||zi[\"Arabic Extended-A\"](t)||zi[\"Arabic Presentation Forms-A\"](t)||zi[\"Arabic Presentation Forms-B\"](t)}function ji(t){return t>=1424&&t<=2303||zi[\"Arabic Presentation Forms-A\"](t)||zi[\"Arabic Presentation Forms-B\"](t)}function Ui(t,e){return!(!e&&ji(t)||t>=2304&&t<=3583||t>=3840&&t<=4255||zi.Khmer(t))}function Vi(t){for(const e of t)if(ji(e.charCodeAt(0)))return!0;return!1}const qi=new class{constructor(){this.applyArabicShaping=null,this.processBidirectionalText=null,this.processStyledBidirectionalText=null,this.pluginStatus=\"unavailable\",this.pluginURL=null}setState(t){this.pluginStatus=t.pluginStatus,this.pluginURL=t.pluginURL}getState(){return{pluginStatus:this.pluginStatus,pluginURL:this.pluginURL}}setMethods(t){this.applyArabicShaping=t.applyArabicShaping,this.processBidirectionalText=t.processBidirectionalText,this.processStyledBidirectionalText=t.processStyledBidirectionalText}isParsed(){return null!=this.applyArabicShaping&&null!=this.processBidirectionalText&&null!=this.processStyledBidirectionalText}getPluginURL(){return this.pluginURL}getRTLTextPluginStatus(){return this.pluginStatus}};class Hi{constructor(t,e){this.zoom=t,e?(this.now=e.now,this.fadeDuration=e.fadeDuration,this.zoomHistory=e.zoomHistory,this.transition=e.transition):(this.now=0,this.fadeDuration=0,this.zoomHistory=new Pi,this.transition={})}isSupportedScript(t){return function(t,e){for(const r of t)if(!Ui(r.charCodeAt(0),e))return!1;return!0}(t,\"loaded\"===qi.getRTLTextPluginStatus())}crossFadingFactor(){return 0===this.fadeDuration?1:Math.min((this.now-this.zoomHistory.lastIntegerZoomTime)/this.fadeDuration,1)}getCrossfadeParameters(){const t=this.zoom,e=t-Math.floor(t),r=this.crossFadingFactor();return t>this.zoomHistory.lastIntegerZoom?{fromScale:2,toScale:1,t:e+(1-e)*r}:{fromScale:.5,toScale:1,t:1-(1-r)*e}}}class Gi{constructor(t,e){this.property=t,this.value=e,this.expression=function(t,e){if(mn(t))return new Cn(t,e);if(kn(t)){const r=En(t,e);if(\"error\"===r.result)throw new Error(r.value.map((t=>`${t.key}: ${t.message}`)).join(\", \"));return r.value}{let r=t;return\"color\"===e.type&&\"string\"==typeof t?r=Xt.parse(t):\"padding\"!==e.type||\"number\"!=typeof t&&!Array.isArray(t)?\"variableAnchorOffsetCollection\"===e.type&&Array.isArray(t)&&(r=ee.parse(t)):r=Qt.parse(t),{kind:\"constant\",evaluate:()=>r}}}(void 0===e?t.specification.default:e,t.specification)}isDataDriven(){return\"source\"===this.expression.kind||\"composite\"===this.expression.kind}possiblyEvaluate(t,e,r){return this.property.possiblyEvaluate(this,t,e,r)}}class Zi{constructor(t){this.property=t,this.value=new Gi(t,void 0)}transitioned(t,e){return new Yi(this.property,this.value,e,y({},t.transition,this.transition),t.now)}untransitioned(){return new Yi(this.property,this.value,null,{},0)}}class Wi{constructor(t){this._properties=t,this._values=Object.create(t.defaultTransitionablePropertyValues)}getValue(t){return b(this._values[t].value.value)}setValue(t,e){Object.prototype.hasOwnProperty.call(this._values,t)||(this._values[t]=new Zi(this._values[t].property)),this._values[t].value=new Gi(this._values[t].property,null===e?void 0:b(e))}getTransition(t){return b(this._values[t].transition)}setTransition(t,e){Object.prototype.hasOwnProperty.call(this._values,t)||(this._values[t]=new Zi(this._values[t].property)),this._values[t].transition=b(e)||void 0}serialize(){const t={};for(const e of Object.keys(this._values)){const r=this.getValue(e);void 0!==r&&(t[e]=r);const n=this.getTransition(e);void 0!==n&&(t[`${e}-transition`]=n)}return t}transitioned(t,e){const r=new Xi(this._properties);for(const n of Object.keys(this._values))r._values[n]=this._values[n].transitioned(t,e._values[n]);return r}untransitioned(){const t=new Xi(this._properties);for(const e of Object.keys(this._values))t._values[e]=this._values[e].untransitioned();return t}}class Yi{constructor(t,e,r,n,i){this.property=t,this.value=e,this.begin=i+n.delay||0,this.end=this.begin+n.duration||0,t.specification.transition&&(n.delay||n.duration)&&(this.prior=r)}possiblyEvaluate(t,e,r){const n=t.now||0,i=this.value.possiblyEvaluate(t,e,r),a=this.prior;if(a){if(n>this.end)return this.prior=null,i;if(this.value.isDataDriven())return this.prior=null,i;if(n=1)return 1;const e=t*t,r=e*t;return 4*(t<.5?r:3*(t-e)+r-.75)}(o))}}return i}}class Xi{constructor(t){this._properties=t,this._values=Object.create(t.defaultTransitioningPropertyValues)}possiblyEvaluate(t,e,r){const n=new Ki(this._properties);for(const i of Object.keys(this._values))n._values[i]=this._values[i].possiblyEvaluate(t,e,r);return n}hasTransition(){for(const t of Object.keys(this._values))if(this._values[t].prior)return!0;return!1}}class $i{constructor(t){this._properties=t,this._values=Object.create(t.defaultPropertyValues)}hasValue(t){return void 0!==this._values[t].value}getValue(t){return b(this._values[t].value)}setValue(t,e){this._values[t]=new Gi(this._values[t].property,null===e?void 0:b(e))}serialize(){const t={};for(const e of Object.keys(this._values)){const r=this.getValue(e);void 0!==r&&(t[e]=r)}return t}possiblyEvaluate(t,e,r){const n=new Ki(this._properties);for(const i of Object.keys(this._values))n._values[i]=this._values[i].possiblyEvaluate(t,e,r);return n}}class Ji{constructor(t,e,r){this.property=t,this.value=e,this.parameters=r}isConstant(){return\"constant\"===this.value.kind}constantOr(t){return\"constant\"===this.value.kind?this.value.value:t}evaluate(t,e,r,n){return this.property.evaluate(this.value,this.parameters,t,e,r,n)}}class Ki{constructor(t){this._properties=t,this._values=Object.create(t.defaultPossiblyEvaluatedValues)}get(t){return this._values[t]}}class Qi{constructor(t){this.specification=t}possiblyEvaluate(t,e){if(t.isDataDriven())throw new Error(\"Value should not be data driven\");return t.expression.evaluate(e)}interpolate(t,e,r){const n=this.specification.type,i=Pe[n];return i?i(t,e,r):t}}class ta{constructor(t,e){this.specification=t,this.overrides=e}possiblyEvaluate(t,e,r,n){return\"constant\"===t.expression.kind||\"camera\"===t.expression.kind?new Ji(this,{kind:\"constant\",value:t.expression.evaluate(e,null,{},r,n)},e):new Ji(this,t.expression,e)}interpolate(t,e,r){if(\"constant\"!==t.value.kind||\"constant\"!==e.value.kind)return t;if(void 0===t.value.value||void 0===e.value.value)return new Ji(this,{kind:\"constant\",value:void 0},t.parameters);const n=this.specification.type,i=Pe[n];if(i){const n=i(t.value.value,e.value.value,r);return new Ji(this,{kind:\"constant\",value:n},t.parameters)}return t}evaluate(t,e,r,n,i,a){return\"constant\"===t.kind?t.value:t.evaluate(e,r,n,i,a)}}class ea extends ta{possiblyEvaluate(t,e,r,n){if(void 0===t.value)return new Ji(this,{kind:\"constant\",value:void 0},e);if(\"constant\"===t.expression.kind){const i=t.expression.evaluate(e,null,{},r,n),a=\"resolvedImage\"===t.property.specification.type&&\"string\"!=typeof i?i.name:i,o=this._calculate(a,a,a,e);return new Ji(this,{kind:\"constant\",value:o},e)}if(\"camera\"===t.expression.kind){const r=this._calculate(t.expression.evaluate({zoom:e.zoom-1}),t.expression.evaluate({zoom:e.zoom}),t.expression.evaluate({zoom:e.zoom+1}),e);return new Ji(this,{kind:\"constant\",value:r},e)}return new Ji(this,t.expression,e)}evaluate(t,e,r,n,i,a){if(\"source\"===t.kind){const o=t.evaluate(e,r,n,i,a);return this._calculate(o,o,o,e)}return\"composite\"===t.kind?this._calculate(t.evaluate({zoom:Math.floor(e.zoom)-1},r,n),t.evaluate({zoom:Math.floor(e.zoom)},r,n),t.evaluate({zoom:Math.floor(e.zoom)+1},r,n),e):t.value}_calculate(t,e,r,n){return n.zoom>n.zoomHistory.lastIntegerZoom?{from:t,to:e}:{from:r,to:e}}interpolate(t){return t}}class ra{constructor(t){this.specification=t}possiblyEvaluate(t,e,r,n){if(void 0!==t.value){if(\"constant\"===t.expression.kind){const i=t.expression.evaluate(e,null,{},r,n);return this._calculate(i,i,i,e)}return this._calculate(t.expression.evaluate(new Hi(Math.floor(e.zoom-1),e)),t.expression.evaluate(new Hi(Math.floor(e.zoom),e)),t.expression.evaluate(new Hi(Math.floor(e.zoom+1),e)),e)}}_calculate(t,e,r,n){return n.zoom>n.zoomHistory.lastIntegerZoom?{from:t,to:e}:{from:r,to:e}}interpolate(t){return t}}class na{constructor(t){this.specification=t}possiblyEvaluate(t,e,r,n){return!!t.expression.evaluate(e,null,{},r,n)}interpolate(){return!1}}class ia{constructor(t){this.properties=t,this.defaultPropertyValues={},this.defaultTransitionablePropertyValues={},this.defaultTransitioningPropertyValues={},this.defaultPossiblyEvaluatedValues={},this.overridableProperties=[];for(const e in t){const r=t[e];r.specification.overridable&&this.overridableProperties.push(e);const n=this.defaultPropertyValues[e]=new Gi(r,void 0),i=this.defaultTransitionablePropertyValues[e]=new Zi(r);this.defaultTransitioningPropertyValues[e]=i.untransitioned(),this.defaultPossiblyEvaluatedValues[e]=n.possiblyEvaluate({})}}}Mi(\"DataDrivenProperty\",ta),Mi(\"DataConstantProperty\",Qi),Mi(\"CrossFadedDataDrivenProperty\",ea),Mi(\"CrossFadedProperty\",ra),Mi(\"ColorRampProperty\",na);const aa=\"-transition\";class oa extends G{constructor(t,e){if(super(),this.id=t.id,this.type=t.type,this._featureFilter={filter:()=>!0,needGeometry:!1},\"custom\"!==t.type&&(this.metadata=t.metadata,this.minzoom=t.minzoom,this.maxzoom=t.maxzoom,\"background\"!==t.type&&(this.source=t.source,this.sourceLayer=t[\"source-layer\"],this.filter=t.filter),e.layout&&(this._unevaluatedLayout=new $i(e.layout)),e.paint)){this._transitionablePaint=new Wi(e.paint);for(const e in t.paint)this.setPaintProperty(e,t.paint[e],{validate:!1});for(const e in t.layout)this.setLayoutProperty(e,t.layout[e],{validate:!1});this._transitioningPaint=this._transitionablePaint.untransitioned(),this.paint=new Ki(e.paint)}}getCrossfadeParameters(){return this._crossfadeParameters}getLayoutProperty(t){return\"visibility\"===t?this.visibility:this._unevaluatedLayout.getValue(t)}setLayoutProperty(t,e,r={}){if(null!=e){const n=`layers.${this.id}.layout.${t}`;if(this._validate(wi,n,t,e,r))return}\"visibility\"!==t?this._unevaluatedLayout.setValue(t,e):this.visibility=e}getPaintProperty(t){return t.endsWith(aa)?this._transitionablePaint.getTransition(t.slice(0,-11)):this._transitionablePaint.getValue(t)}setPaintProperty(t,e,r={}){if(null!=e){const n=`layers.${this.id}.paint.${t}`;if(this._validate(bi,n,t,e,r))return!1}if(t.endsWith(aa))return this._transitionablePaint.setTransition(t.slice(0,-11),e||void 0),!1;{const r=this._transitionablePaint._values[t],n=\"cross-faded-data-driven\"===r.property.specification[\"property-type\"],i=r.value.isDataDriven(),a=r.value;this._transitionablePaint.setValue(t,e),this._handleSpecialPaintPropertyUpdate(t);const o=this._transitionablePaint._values[t].value;return o.isDataDriven()||i||n||this._handleOverridablePaintPropertyUpdate(t,a,o)}}_handleSpecialPaintPropertyUpdate(t){}_handleOverridablePaintPropertyUpdate(t,e,r){return!1}isHidden(t){return!!(this.minzoom&&t=this.maxzoom)||\"none\"===this.visibility}updateTransitions(t){this._transitioningPaint=this._transitionablePaint.transitioned(t,this._transitioningPaint)}hasTransition(){return this._transitioningPaint.hasTransition()}recalculate(t,e){t.getCrossfadeParameters&&(this._crossfadeParameters=t.getCrossfadeParameters()),this._unevaluatedLayout&&(this.layout=this._unevaluatedLayout.possiblyEvaluate(t,void 0,e)),this.paint=this._transitioningPaint.possiblyEvaluate(t,void 0,e)}serialize(){const t={id:this.id,type:this.type,source:this.source,\"source-layer\":this.sourceLayer,metadata:this.metadata,minzoom:this.minzoom,maxzoom:this.maxzoom,filter:this.filter,layout:this._unevaluatedLayout&&this._unevaluatedLayout.serialize(),paint:this._transitionablePaint&&this._transitionablePaint.serialize()};return this.visibility&&(t.layout=t.layout||{},t.layout.visibility=this.visibility),_(t,((t,e)=>!(void 0===t||\"layout\"===e&&!Object.keys(t).length||\"paint\"===e&&!Object.keys(t).length)))}_validate(t,e,r,n,i={}){return(!i||!1!==i.validate)&&Ti(this,t.call(vi,{key:e,layerType:this.type,objectKey:r,value:n,styleSpec:Z,style:{glyphs:!0,sprite:!0}}))}is3D(){return!1}isTileClipped(){return!1}hasOffscreenPass(){return!1}resize(){}isStateDependent(){for(const t in this.paint._values){const e=this.paint.get(t);if(e instanceof Ji&&hn(e.property.specification)&&(\"source\"===e.value.kind||\"composite\"===e.value.kind)&&e.value.isStateDependent)return!0}return!1}}const sa={Int8:Int8Array,Uint8:Uint8Array,Int16:Int16Array,Uint16:Uint16Array,Int32:Int32Array,Uint32:Uint32Array,Float32:Float32Array};class la{constructor(t,e){this._structArray=t,this._pos1=e*this.size,this._pos2=this._pos1/2,this._pos4=this._pos1/4,this._pos8=this._pos1/8}}class ca{constructor(){this.isTransferred=!1,this.capacity=-1,this.resize(0)}static serialize(t,e){return t._trim(),e&&(t.isTransferred=!0,e.push(t.arrayBuffer)),{length:t.length,arrayBuffer:t.arrayBuffer}}static deserialize(t){const e=Object.create(this.prototype);return e.arrayBuffer=t.arrayBuffer,e.length=t.length,e.capacity=t.arrayBuffer.byteLength/e.bytesPerElement,e._refreshViews(),e}_trim(){this.length!==this.capacity&&(this.capacity=this.length,this.arrayBuffer=this.arrayBuffer.slice(0,this.length*this.bytesPerElement),this._refreshViews())}clear(){this.length=0}resize(t){this.reserve(t),this.length=t}reserve(t){if(t>this.capacity){this.capacity=Math.max(t,Math.floor(5*this.capacity),128),this.arrayBuffer=new ArrayBuffer(this.capacity*this.bytesPerElement);const e=this.uint8;this._refreshViews(),e&&this.uint8.set(e)}}_refreshViews(){throw new Error(\"_refreshViews() must be implemented by each concrete StructArray layout\")}}function ua(t,e=1){let r=0,n=0;return{members:t.map((t=>{const i=(s=t.type,sa[s].BYTES_PER_ELEMENT),a=r=ha(r,Math.max(e,i)),o=t.components||1;var s;return n=Math.max(n,i),r+=i*o,{name:t.name,type:t.type,components:o,offset:a}})),size:ha(r,Math.max(n,e)),alignment:e}}function ha(t,e){return Math.ceil(t/e)*e}class fa extends ca{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer)}emplaceBack(t,e){const r=this.length;return this.resize(r+1),this.emplace(r,t,e)}emplace(t,e,r){const n=2*t;return this.int16[n+0]=e,this.int16[n+1]=r,t}}fa.prototype.bytesPerElement=4,Mi(\"StructArrayLayout2i4\",fa);class pa extends ca{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer)}emplaceBack(t,e,r){const n=this.length;return this.resize(n+1),this.emplace(n,t,e,r)}emplace(t,e,r,n){const i=3*t;return this.int16[i+0]=e,this.int16[i+1]=r,this.int16[i+2]=n,t}}pa.prototype.bytesPerElement=6,Mi(\"StructArrayLayout3i6\",pa);class da extends ca{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer)}emplaceBack(t,e,r,n){const i=this.length;return this.resize(i+1),this.emplace(i,t,e,r,n)}emplace(t,e,r,n,i){const a=4*t;return this.int16[a+0]=e,this.int16[a+1]=r,this.int16[a+2]=n,this.int16[a+3]=i,t}}da.prototype.bytesPerElement=8,Mi(\"StructArrayLayout4i8\",da);class ma extends ca{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer)}emplaceBack(t,e,r,n,i,a){const o=this.length;return this.resize(o+1),this.emplace(o,t,e,r,n,i,a)}emplace(t,e,r,n,i,a,o){const s=6*t;return this.int16[s+0]=e,this.int16[s+1]=r,this.int16[s+2]=n,this.int16[s+3]=i,this.int16[s+4]=a,this.int16[s+5]=o,t}}ma.prototype.bytesPerElement=12,Mi(\"StructArrayLayout2i4i12\",ma);class ga extends ca{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer)}emplaceBack(t,e,r,n,i,a){const o=this.length;return this.resize(o+1),this.emplace(o,t,e,r,n,i,a)}emplace(t,e,r,n,i,a,o){const s=4*t,l=8*t;return this.int16[s+0]=e,this.int16[s+1]=r,this.uint8[l+4]=n,this.uint8[l+5]=i,this.uint8[l+6]=a,this.uint8[l+7]=o,t}}ga.prototype.bytesPerElement=8,Mi(\"StructArrayLayout2i4ub8\",ga);class ya extends ca{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer)}emplaceBack(t,e){const r=this.length;return this.resize(r+1),this.emplace(r,t,e)}emplace(t,e,r){const n=2*t;return this.float32[n+0]=e,this.float32[n+1]=r,t}}ya.prototype.bytesPerElement=8,Mi(\"StructArrayLayout2f8\",ya);class va extends ca{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer)}emplaceBack(t,e,r,n,i,a,o,s,l,c){const u=this.length;return this.resize(u+1),this.emplace(u,t,e,r,n,i,a,o,s,l,c)}emplace(t,e,r,n,i,a,o,s,l,c,u){const h=10*t;return this.uint16[h+0]=e,this.uint16[h+1]=r,this.uint16[h+2]=n,this.uint16[h+3]=i,this.uint16[h+4]=a,this.uint16[h+5]=o,this.uint16[h+6]=s,this.uint16[h+7]=l,this.uint16[h+8]=c,this.uint16[h+9]=u,t}}va.prototype.bytesPerElement=20,Mi(\"StructArrayLayout10ui20\",va);class xa extends ca{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer)}emplaceBack(t,e,r,n,i,a,o,s,l,c,u,h){const f=this.length;return this.resize(f+1),this.emplace(f,t,e,r,n,i,a,o,s,l,c,u,h)}emplace(t,e,r,n,i,a,o,s,l,c,u,h,f){const p=12*t;return this.int16[p+0]=e,this.int16[p+1]=r,this.int16[p+2]=n,this.int16[p+3]=i,this.uint16[p+4]=a,this.uint16[p+5]=o,this.uint16[p+6]=s,this.uint16[p+7]=l,this.int16[p+8]=c,this.int16[p+9]=u,this.int16[p+10]=h,this.int16[p+11]=f,t}}xa.prototype.bytesPerElement=24,Mi(\"StructArrayLayout4i4ui4i24\",xa);class _a extends ca{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer)}emplaceBack(t,e,r){const n=this.length;return this.resize(n+1),this.emplace(n,t,e,r)}emplace(t,e,r,n){const i=3*t;return this.float32[i+0]=e,this.float32[i+1]=r,this.float32[i+2]=n,t}}_a.prototype.bytesPerElement=12,Mi(\"StructArrayLayout3f12\",_a);class ba extends ca{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer)}emplaceBack(t){const e=this.length;return this.resize(e+1),this.emplace(e,t)}emplace(t,e){const r=1*t;return this.uint32[r+0]=e,t}}ba.prototype.bytesPerElement=4,Mi(\"StructArrayLayout1ul4\",ba);class wa extends ca{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer)}emplaceBack(t,e,r,n,i,a,o,s,l){const c=this.length;return this.resize(c+1),this.emplace(c,t,e,r,n,i,a,o,s,l)}emplace(t,e,r,n,i,a,o,s,l,c){const u=10*t,h=5*t;return this.int16[u+0]=e,this.int16[u+1]=r,this.int16[u+2]=n,this.int16[u+3]=i,this.int16[u+4]=a,this.int16[u+5]=o,this.uint32[h+3]=s,this.uint16[u+8]=l,this.uint16[u+9]=c,t}}wa.prototype.bytesPerElement=20,Mi(\"StructArrayLayout6i1ul2ui20\",wa);class Ta extends ca{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer)}emplaceBack(t,e,r,n,i,a){const o=this.length;return this.resize(o+1),this.emplace(o,t,e,r,n,i,a)}emplace(t,e,r,n,i,a,o){const s=6*t;return this.int16[s+0]=e,this.int16[s+1]=r,this.int16[s+2]=n,this.int16[s+3]=i,this.int16[s+4]=a,this.int16[s+5]=o,t}}Ta.prototype.bytesPerElement=12,Mi(\"StructArrayLayout2i2i2i12\",Ta);class ka extends ca{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer)}emplaceBack(t,e,r,n,i){const a=this.length;return this.resize(a+1),this.emplace(a,t,e,r,n,i)}emplace(t,e,r,n,i,a){const o=4*t,s=8*t;return this.float32[o+0]=e,this.float32[o+1]=r,this.float32[o+2]=n,this.int16[s+6]=i,this.int16[s+7]=a,t}}ka.prototype.bytesPerElement=16,Mi(\"StructArrayLayout2f1f2i16\",ka);class Aa extends ca{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer)}emplaceBack(t,e,r,n,i,a){const o=this.length;return this.resize(o+1),this.emplace(o,t,e,r,n,i,a)}emplace(t,e,r,n,i,a,o){const s=16*t,l=4*t,c=8*t;return this.uint8[s+0]=e,this.uint8[s+1]=r,this.float32[l+1]=n,this.float32[l+2]=i,this.int16[c+6]=a,this.int16[c+7]=o,t}}Aa.prototype.bytesPerElement=16,Mi(\"StructArrayLayout2ub2f2i16\",Aa);class Ma extends ca{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer)}emplaceBack(t,e,r){const n=this.length;return this.resize(n+1),this.emplace(n,t,e,r)}emplace(t,e,r,n){const i=3*t;return this.uint16[i+0]=e,this.uint16[i+1]=r,this.uint16[i+2]=n,t}}Ma.prototype.bytesPerElement=6,Mi(\"StructArrayLayout3ui6\",Ma);class Sa extends ca{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer)}emplaceBack(t,e,r,n,i,a,o,s,l,c,u,h,f,p,d,m,g){const y=this.length;return this.resize(y+1),this.emplace(y,t,e,r,n,i,a,o,s,l,c,u,h,f,p,d,m,g)}emplace(t,e,r,n,i,a,o,s,l,c,u,h,f,p,d,m,g,y){const v=24*t,x=12*t,_=48*t;return this.int16[v+0]=e,this.int16[v+1]=r,this.uint16[v+2]=n,this.uint16[v+3]=i,this.uint32[x+2]=a,this.uint32[x+3]=o,this.uint32[x+4]=s,this.uint16[v+10]=l,this.uint16[v+11]=c,this.uint16[v+12]=u,this.float32[x+7]=h,this.float32[x+8]=f,this.uint8[_+36]=p,this.uint8[_+37]=d,this.uint8[_+38]=m,this.uint32[x+10]=g,this.int16[v+22]=y,t}}Sa.prototype.bytesPerElement=48,Mi(\"StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48\",Sa);class Ea extends ca{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer)}emplaceBack(t,e,r,n,i,a,o,s,l,c,u,h,f,p,d,m,g,y,v,x,_,b,w,T,k,A,M,S){const E=this.length;return this.resize(E+1),this.emplace(E,t,e,r,n,i,a,o,s,l,c,u,h,f,p,d,m,g,y,v,x,_,b,w,T,k,A,M,S)}emplace(t,e,r,n,i,a,o,s,l,c,u,h,f,p,d,m,g,y,v,x,_,b,w,T,k,A,M,S,E){const C=32*t,L=16*t;return this.int16[C+0]=e,this.int16[C+1]=r,this.int16[C+2]=n,this.int16[C+3]=i,this.int16[C+4]=a,this.int16[C+5]=o,this.int16[C+6]=s,this.int16[C+7]=l,this.uint16[C+8]=c,this.uint16[C+9]=u,this.uint16[C+10]=h,this.uint16[C+11]=f,this.uint16[C+12]=p,this.uint16[C+13]=d,this.uint16[C+14]=m,this.uint16[C+15]=g,this.uint16[C+16]=y,this.uint16[C+17]=v,this.uint16[C+18]=x,this.uint16[C+19]=_,this.uint16[C+20]=b,this.uint16[C+21]=w,this.uint16[C+22]=T,this.uint32[L+12]=k,this.float32[L+13]=A,this.float32[L+14]=M,this.uint16[C+30]=S,this.uint16[C+31]=E,t}}Ea.prototype.bytesPerElement=64,Mi(\"StructArrayLayout8i15ui1ul2f2ui64\",Ea);class Ca extends ca{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer)}emplaceBack(t){const e=this.length;return this.resize(e+1),this.emplace(e,t)}emplace(t,e){const r=1*t;return this.float32[r+0]=e,t}}Ca.prototype.bytesPerElement=4,Mi(\"StructArrayLayout1f4\",Ca);class La extends ca{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer)}emplaceBack(t,e,r){const n=this.length;return this.resize(n+1),this.emplace(n,t,e,r)}emplace(t,e,r,n){const i=6*t,a=3*t;return this.uint16[i+0]=e,this.float32[a+1]=r,this.float32[a+2]=n,t}}La.prototype.bytesPerElement=12,Mi(\"StructArrayLayout1ui2f12\",La);class Ia extends ca{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer)}emplaceBack(t,e,r){const n=this.length;return this.resize(n+1),this.emplace(n,t,e,r)}emplace(t,e,r,n){const i=2*t,a=4*t;return this.uint32[i+0]=e,this.uint16[a+2]=r,this.uint16[a+3]=n,t}}Ia.prototype.bytesPerElement=8,Mi(\"StructArrayLayout1ul2ui8\",Ia);class Pa extends ca{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer)}emplaceBack(t,e){const r=this.length;return this.resize(r+1),this.emplace(r,t,e)}emplace(t,e,r){const n=2*t;return this.uint16[n+0]=e,this.uint16[n+1]=r,t}}Pa.prototype.bytesPerElement=4,Mi(\"StructArrayLayout2ui4\",Pa);class za extends ca{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer)}emplaceBack(t){const e=this.length;return this.resize(e+1),this.emplace(e,t)}emplace(t,e){const r=1*t;return this.uint16[r+0]=e,t}}za.prototype.bytesPerElement=2,Mi(\"StructArrayLayout1ui2\",za);class Oa extends ca{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer)}emplaceBack(t,e,r,n){const i=this.length;return this.resize(i+1),this.emplace(i,t,e,r,n)}emplace(t,e,r,n,i){const a=4*t;return this.float32[a+0]=e,this.float32[a+1]=r,this.float32[a+2]=n,this.float32[a+3]=i,t}}Oa.prototype.bytesPerElement=16,Mi(\"StructArrayLayout4f16\",Oa);class Da extends la{get anchorPointX(){return this._structArray.int16[this._pos2+0]}get anchorPointY(){return this._structArray.int16[this._pos2+1]}get x1(){return this._structArray.int16[this._pos2+2]}get y1(){return this._structArray.int16[this._pos2+3]}get x2(){return this._structArray.int16[this._pos2+4]}get y2(){return this._structArray.int16[this._pos2+5]}get featureIndex(){return this._structArray.uint32[this._pos4+3]}get sourceLayerIndex(){return this._structArray.uint16[this._pos2+8]}get bucketIndex(){return this._structArray.uint16[this._pos2+9]}get anchorPoint(){return new a(this.anchorPointX,this.anchorPointY)}}Da.prototype.size=20;class Ra extends wa{get(t){return new Da(this,t)}}Mi(\"CollisionBoxArray\",Ra);class Fa extends la{get anchorX(){return this._structArray.int16[this._pos2+0]}get anchorY(){return this._structArray.int16[this._pos2+1]}get glyphStartIndex(){return this._structArray.uint16[this._pos2+2]}get numGlyphs(){return this._structArray.uint16[this._pos2+3]}get vertexStartIndex(){return this._structArray.uint32[this._pos4+2]}get lineStartIndex(){return this._structArray.uint32[this._pos4+3]}get lineLength(){return this._structArray.uint32[this._pos4+4]}get segment(){return this._structArray.uint16[this._pos2+10]}get lowerSize(){return this._structArray.uint16[this._pos2+11]}get upperSize(){return this._structArray.uint16[this._pos2+12]}get lineOffsetX(){return this._structArray.float32[this._pos4+7]}get lineOffsetY(){return this._structArray.float32[this._pos4+8]}get writingMode(){return this._structArray.uint8[this._pos1+36]}get placedOrientation(){return this._structArray.uint8[this._pos1+37]}set placedOrientation(t){this._structArray.uint8[this._pos1+37]=t}get hidden(){return this._structArray.uint8[this._pos1+38]}set hidden(t){this._structArray.uint8[this._pos1+38]=t}get crossTileID(){return this._structArray.uint32[this._pos4+10]}set crossTileID(t){this._structArray.uint32[this._pos4+10]=t}get associatedIconIndex(){return this._structArray.int16[this._pos2+22]}}Fa.prototype.size=48;class Ba extends Sa{get(t){return new Fa(this,t)}}Mi(\"PlacedSymbolArray\",Ba);class Na extends la{get anchorX(){return this._structArray.int16[this._pos2+0]}get anchorY(){return this._structArray.int16[this._pos2+1]}get rightJustifiedTextSymbolIndex(){return this._structArray.int16[this._pos2+2]}get centerJustifiedTextSymbolIndex(){return this._structArray.int16[this._pos2+3]}get leftJustifiedTextSymbolIndex(){return this._structArray.int16[this._pos2+4]}get verticalPlacedTextSymbolIndex(){return this._structArray.int16[this._pos2+5]}get placedIconSymbolIndex(){return this._structArray.int16[this._pos2+6]}get verticalPlacedIconSymbolIndex(){return this._structArray.int16[this._pos2+7]}get key(){return this._structArray.uint16[this._pos2+8]}get textBoxStartIndex(){return this._structArray.uint16[this._pos2+9]}get textBoxEndIndex(){return this._structArray.uint16[this._pos2+10]}get verticalTextBoxStartIndex(){return this._structArray.uint16[this._pos2+11]}get verticalTextBoxEndIndex(){return this._structArray.uint16[this._pos2+12]}get iconBoxStartIndex(){return this._structArray.uint16[this._pos2+13]}get iconBoxEndIndex(){return this._structArray.uint16[this._pos2+14]}get verticalIconBoxStartIndex(){return this._structArray.uint16[this._pos2+15]}get verticalIconBoxEndIndex(){return this._structArray.uint16[this._pos2+16]}get featureIndex(){return this._structArray.uint16[this._pos2+17]}get numHorizontalGlyphVertices(){return this._structArray.uint16[this._pos2+18]}get numVerticalGlyphVertices(){return this._structArray.uint16[this._pos2+19]}get numIconVertices(){return this._structArray.uint16[this._pos2+20]}get numVerticalIconVertices(){return this._structArray.uint16[this._pos2+21]}get useRuntimeCollisionCircles(){return this._structArray.uint16[this._pos2+22]}get crossTileID(){return this._structArray.uint32[this._pos4+12]}set crossTileID(t){this._structArray.uint32[this._pos4+12]=t}get textBoxScale(){return this._structArray.float32[this._pos4+13]}get collisionCircleDiameter(){return this._structArray.float32[this._pos4+14]}get textAnchorOffsetStartIndex(){return this._structArray.uint16[this._pos2+30]}get textAnchorOffsetEndIndex(){return this._structArray.uint16[this._pos2+31]}}Na.prototype.size=64;class ja extends Ea{get(t){return new Na(this,t)}}Mi(\"SymbolInstanceArray\",ja);class Ua extends Ca{getoffsetX(t){return this.float32[1*t+0]}}Mi(\"GlyphOffsetArray\",Ua);class Va extends pa{getx(t){return this.int16[3*t+0]}gety(t){return this.int16[3*t+1]}gettileUnitDistanceFromAnchor(t){return this.int16[3*t+2]}}Mi(\"SymbolLineVertexArray\",Va);class qa extends la{get textAnchor(){return this._structArray.uint16[this._pos2+0]}get textOffset0(){return this._structArray.float32[this._pos4+1]}get textOffset1(){return this._structArray.float32[this._pos4+2]}}qa.prototype.size=12;class Ha extends La{get(t){return new qa(this,t)}}Mi(\"TextAnchorOffsetArray\",Ha);class Ga extends la{get featureIndex(){return this._structArray.uint32[this._pos4+0]}get sourceLayerIndex(){return this._structArray.uint16[this._pos2+2]}get bucketIndex(){return this._structArray.uint16[this._pos2+3]}}Ga.prototype.size=8;class Za extends Ia{get(t){return new Ga(this,t)}}Mi(\"FeatureIndexArray\",Za);class Wa extends fa{}class Ya extends fa{}class Xa extends fa{}class $a extends ma{}class Ja extends ga{}class Ka extends ya{}class Qa extends va{}class to extends xa{}class eo extends _a{}class ro extends ba{}class no extends Ta{}class io extends Aa{}class ao extends Ma{}class oo extends Pa{}const so=ua([{name:\"a_pos\",components:2,type:\"Int16\"}],4),{members:lo,size:co,alignment:uo}=so;class ho{constructor(t=[]){this.segments=t}prepareSegment(t,e,r,n){let i=this.segments[this.segments.length-1];return t>ho.MAX_VERTEX_ARRAY_LENGTH&&T(`Max vertices per segment is ${ho.MAX_VERTEX_ARRAY_LENGTH}: bucket requested ${t}`),(!i||i.vertexLength+t>ho.MAX_VERTEX_ARRAY_LENGTH||i.sortKey!==n)&&(i={vertexOffset:e.length,primitiveOffset:r.length,vertexLength:0,primitiveLength:0},void 0!==n&&(i.sortKey=n),this.segments.push(i)),i}get(){return this.segments}destroy(){for(const t of this.segments)for(const e in t.vaos)t.vaos[e].destroy()}static simpleSegment(t,e,r,n){return new ho([{vertexOffset:t,primitiveOffset:e,vertexLength:r,primitiveLength:n,vaos:{},sortKey:0}])}}function fo(t,e){return 256*(t=m(Math.floor(t),0,255))+m(Math.floor(e),0,255)}ho.MAX_VERTEX_ARRAY_LENGTH=Math.pow(2,16)-1,Mi(\"SegmentVector\",ho);const po=ua([{name:\"a_pattern_from\",components:4,type:\"Uint16\"},{name:\"a_pattern_to\",components:4,type:\"Uint16\"},{name:\"a_pixel_ratio_from\",components:1,type:\"Uint16\"},{name:\"a_pixel_ratio_to\",components:1,type:\"Uint16\"}]);var mo={exports:{}},go={exports:{}};!function(t){t.exports=function(t,e){var r,n,i,a,o,s,l,c;for(r=3&t.length,n=t.length-r,i=e,o=3432918353,s=461845907,c=0;c>>16)*o&65535)<<16)&4294967295)<<15|l>>>17))*s+(((l>>>16)*s&65535)<<16)&4294967295)<<13|i>>>19))+((5*(i>>>16)&65535)<<16)&4294967295))+((58964+(a>>>16)&65535)<<16);switch(l=0,r){case 3:l^=(255&t.charCodeAt(c+2))<<16;case 2:l^=(255&t.charCodeAt(c+1))<<8;case 1:i^=l=(65535&(l=(l=(65535&(l^=255&t.charCodeAt(c)))*o+(((l>>>16)*o&65535)<<16)&4294967295)<<15|l>>>17))*s+(((l>>>16)*s&65535)<<16)&4294967295}return i^=t.length,i=2246822507*(65535&(i^=i>>>16))+((2246822507*(i>>>16)&65535)<<16)&4294967295,i=3266489909*(65535&(i^=i>>>13))+((3266489909*(i>>>16)&65535)<<16)&4294967295,(i^=i>>>16)>>>0}}(go);var yo=go.exports,vo={exports:{}};!function(t){t.exports=function(t,e){for(var r,n=t.length,i=e^n,a=0;n>=4;)r=1540483477*(65535&(r=255&t.charCodeAt(a)|(255&t.charCodeAt(++a))<<8|(255&t.charCodeAt(++a))<<16|(255&t.charCodeAt(++a))<<24))+((1540483477*(r>>>16)&65535)<<16),i=1540483477*(65535&i)+((1540483477*(i>>>16)&65535)<<16)^(r=1540483477*(65535&(r^=r>>>24))+((1540483477*(r>>>16)&65535)<<16)),n-=4,++a;switch(n){case 3:i^=(255&t.charCodeAt(a+2))<<16;case 2:i^=(255&t.charCodeAt(a+1))<<8;case 1:i=1540483477*(65535&(i^=255&t.charCodeAt(a)))+((1540483477*(i>>>16)&65535)<<16)}return i=1540483477*(65535&(i^=i>>>13))+((1540483477*(i>>>16)&65535)<<16),(i^=i>>>15)>>>0}}(vo);var xo=yo,_o=vo.exports;mo.exports=xo,mo.exports.murmur3=xo,mo.exports.murmur2=_o;var bo=r(mo.exports);class wo{constructor(){this.ids=[],this.positions=[],this.indexed=!1}add(t,e,r,n){this.ids.push(To(t)),this.positions.push(e,r,n)}getPositions(t){if(!this.indexed)throw new Error(\"Trying to get index, but feature positions are not indexed\");const e=To(t);let r=0,n=this.ids.length-1;for(;r>1;this.ids[t]>=e?n=t:r=t+1}const i=[];for(;this.ids[r]===e;){const t=this.positions[3*r],e=this.positions[3*r+1],n=this.positions[3*r+2];i.push({index:t,start:e,end:n}),r++}return i}static serialize(t,e){const r=new Float64Array(t.ids),n=new Uint32Array(t.positions);return ko(r,n,0,r.length-1),e&&e.push(r.buffer,n.buffer),{ids:r,positions:n}}static deserialize(t){const e=new wo;return e.ids=t.ids,e.positions=t.positions,e.indexed=!0,e}}function To(t){const e=+t;return!isNaN(e)&&e<=Number.MAX_SAFE_INTEGER?e:bo(String(t))}function ko(t,e,r,n){for(;r>1];let a=r-1,o=n+1;for(;;){do{a++}while(t[a]i);if(a>=o)break;Ao(t,a,o),Ao(e,3*a,3*o),Ao(e,3*a+1,3*o+1),Ao(e,3*a+2,3*o+2)}o-r`u_${t}`)),this.type=r}setUniform(t,e,r){t.set(r.constantOr(this.value))}getBinding(t,e,r){return\"color\"===this.type?new Co(t,e):new So(t,e)}}class zo{constructor(t,e){this.uniformNames=e.map((t=>`u_${t}`)),this.patternFrom=null,this.patternTo=null,this.pixelRatioFrom=1,this.pixelRatioTo=1}setConstantPatternPositions(t,e){this.pixelRatioFrom=e.pixelRatio,this.pixelRatioTo=t.pixelRatio,this.patternFrom=e.tlbr,this.patternTo=t.tlbr}setUniform(t,e,r,n){const i=\"u_pattern_to\"===n?this.patternTo:\"u_pattern_from\"===n?this.patternFrom:\"u_pixel_ratio_to\"===n?this.pixelRatioTo:\"u_pixel_ratio_from\"===n?this.pixelRatioFrom:null;i&&t.set(i)}getBinding(t,e,r){return\"u_pattern\"===r.substr(0,9)?new Eo(t,e):new So(t,e)}}class Oo{constructor(t,e,r,n){this.expression=t,this.type=r,this.maxValue=0,this.paintVertexAttributes=e.map((t=>({name:`a_${t}`,type:\"Float32\",components:\"color\"===r?2:1,offset:0}))),this.paintVertexArray=new n}populatePaintArray(t,e,r,n,i){const a=this.paintVertexArray.length,o=this.expression.evaluate(new Hi(0),e,{},n,[],i);this.paintVertexArray.resize(t),this._setPaintValue(a,t,o)}updatePaintArray(t,e,r,n){const i=this.expression.evaluate({zoom:0},r,n);this._setPaintValue(t,e,i)}_setPaintValue(t,e,r){if(\"color\"===this.type){const n=Io(r);for(let r=t;r`u_${t}_t`)),this.type=r,this.useIntegerZoom=n,this.zoom=i,this.maxValue=0,this.paintVertexAttributes=e.map((t=>({name:`a_${t}`,type:\"Float32\",components:\"color\"===r?4:2,offset:0}))),this.paintVertexArray=new a}populatePaintArray(t,e,r,n,i){const a=this.expression.evaluate(new Hi(this.zoom),e,{},n,[],i),o=this.expression.evaluate(new Hi(this.zoom+1),e,{},n,[],i),s=this.paintVertexArray.length;this.paintVertexArray.resize(t),this._setPaintValue(s,t,a,o)}updatePaintArray(t,e,r,n){const i=this.expression.evaluate({zoom:this.zoom},r,n),a=this.expression.evaluate({zoom:this.zoom+1},r,n);this._setPaintValue(t,e,i,a)}_setPaintValue(t,e,r,n){if(\"color\"===this.type){const i=Io(r),a=Io(n);for(let r=t;r`#define HAS_UNIFORM_${t}`)))}return t}getBinderAttributes(){const t=[];for(const e in this.binders){const r=this.binders[e];if(r instanceof Oo||r instanceof Do)for(let e=0;e!0)){this.programConfigurations={};for(const n of t)this.programConfigurations[n.id]=new Fo(n,e,r);this.needsUpload=!1,this._featureMap=new wo,this._bufferOffset=0}populatePaintArrays(t,e,r,n,i,a){for(const r in this.programConfigurations)this.programConfigurations[r].populatePaintArrays(t,e,n,i,a);void 0!==e.id&&this._featureMap.add(e.id,r,this._bufferOffset,t),this._bufferOffset=t,this.needsUpload=!0}updatePaintArrays(t,e,r,n){for(const i of r)this.needsUpload=this.programConfigurations[i.id].updatePaintArrays(t,this._featureMap,e,i,n)||this.needsUpload}get(t){return this.programConfigurations[t]}upload(t){if(this.needsUpload){for(const e in this.programConfigurations)this.programConfigurations[e].upload(t);this.needsUpload=!1}}destroy(){for(const t in this.programConfigurations)this.programConfigurations[t].destroy()}}function No(t,e){return{\"text-opacity\":[\"opacity\"],\"icon-opacity\":[\"opacity\"],\"text-color\":[\"fill_color\"],\"icon-color\":[\"fill_color\"],\"text-halo-color\":[\"halo_color\"],\"icon-halo-color\":[\"halo_color\"],\"text-halo-blur\":[\"halo_blur\"],\"icon-halo-blur\":[\"halo_blur\"],\"text-halo-width\":[\"halo_width\"],\"icon-halo-width\":[\"halo_width\"],\"line-gap-width\":[\"gapwidth\"],\"line-pattern\":[\"pattern_to\",\"pattern_from\",\"pixel_ratio_to\",\"pixel_ratio_from\"],\"fill-pattern\":[\"pattern_to\",\"pattern_from\",\"pixel_ratio_to\",\"pixel_ratio_from\"],\"fill-extrusion-pattern\":[\"pattern_to\",\"pattern_from\",\"pixel_ratio_to\",\"pixel_ratio_from\"]}[t]||[t.replace(`${e}-`,\"\").replace(/-/g,\"_\")]}function jo(t,e,r){const n={color:{source:ya,composite:Oa},number:{source:Ca,composite:ya}},i=function(t){return{\"line-pattern\":{source:Qa,composite:Qa},\"fill-pattern\":{source:Qa,composite:Qa},\"fill-extrusion-pattern\":{source:Qa,composite:Qa}}[t]}(t);return i&&i[r]||n[e][r]}Mi(\"ConstantBinder\",Po),Mi(\"CrossFadedConstantBinder\",zo),Mi(\"SourceExpressionBinder\",Oo),Mi(\"CrossFadedCompositeBinder\",Ro),Mi(\"CompositeExpressionBinder\",Do),Mi(\"ProgramConfiguration\",Fo,{omit:[\"_buffers\"]}),Mi(\"ProgramConfigurationSet\",Bo);const Uo=8192,Vo=Math.pow(2,14)-1,qo=-Vo-1;function Ho(t){const e=Uo/t.extent,r=t.loadGeometry();for(let t=0;tr.x+1||ar.y+1)&&T(\"Geometry exceeds allowed extent, reduce your vector tile buffer size\")}}return r}function Go(t,e){return{type:t.type,id:t.id,properties:t.properties,geometry:e?Ho(t):[]}}function Zo(t,e,r,n,i){t.emplaceBack(2*e+(n+1)/2,2*r+(i+1)/2)}class Wo{constructor(t){this.zoom=t.zoom,this.overscaling=t.overscaling,this.layers=t.layers,this.layerIds=this.layers.map((t=>t.id)),this.index=t.index,this.hasPattern=!1,this.layoutVertexArray=new Ya,this.indexArray=new ao,this.segments=new ho,this.programConfigurations=new Bo(t.layers,t.zoom),this.stateDependentLayerIds=this.layers.filter((t=>t.isStateDependent())).map((t=>t.id))}populate(t,e,r){const n=this.layers[0],i=[];let a=null,o=!1;\"circle\"===n.type&&(a=n.layout.get(\"circle-sort-key\"),o=!a.isConstant());for(const{feature:e,id:n,index:s,sourceLayerIndex:l}of t){const t=this.layers[0]._featureFilter.needGeometry,c=Go(e,t);if(!this.layers[0]._featureFilter.filter(new Hi(this.zoom),c,r))continue;const u=o?a.evaluate(c,{},r):void 0,h={id:n,properties:e.properties,type:e.type,sourceLayerIndex:l,index:s,geometry:t?c.geometry:Ho(e),patterns:{},sortKey:u};i.push(h)}o&&i.sort(((t,e)=>t.sortKey-e.sortKey));for(const n of i){const{geometry:i,index:a,sourceLayerIndex:o}=n,s=t[a].feature;this.addFeature(n,i,a,r),e.featureIndex.insert(s,i,a,o,this.index)}}update(t,e,r){this.stateDependentLayers.length&&this.programConfigurations.updatePaintArrays(t,e,this.stateDependentLayers,r)}isEmpty(){return 0===this.layoutVertexArray.length}uploadPending(){return!this.uploaded||this.programConfigurations.needsUpload}upload(t){this.uploaded||(this.layoutVertexBuffer=t.createVertexBuffer(this.layoutVertexArray,lo),this.indexBuffer=t.createIndexBuffer(this.indexArray)),this.programConfigurations.upload(t),this.uploaded=!0}destroy(){this.layoutVertexBuffer&&(this.layoutVertexBuffer.destroy(),this.indexBuffer.destroy(),this.programConfigurations.destroy(),this.segments.destroy())}addFeature(t,e,r,n){for(const r of e)for(const e of r){const r=e.x,n=e.y;if(r<0||r>=Uo||n<0||n>=Uo)continue;const i=this.segments.prepareSegment(4,this.layoutVertexArray,this.indexArray,t.sortKey),a=i.vertexLength;Zo(this.layoutVertexArray,r,n,-1,-1),Zo(this.layoutVertexArray,r,n,1,-1),Zo(this.layoutVertexArray,r,n,1,1),Zo(this.layoutVertexArray,r,n,-1,1),this.indexArray.emplaceBack(a,a+1,a+2),this.indexArray.emplaceBack(a,a+3,a+2),i.vertexLength+=4,i.primitiveLength+=2}this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length,t,r,{},n)}}function Yo(t,e){for(let r=0;r1){if(Ko(t,e))return!0;for(let n=0;n1?t.distSqr(r):t.distSqr(r.sub(e)._mult(i)._add(e))}function rs(t,e){let r,n,i,a=!1;for(let o=0;oe.y!=i.y>e.y&&e.x<(i.x-n.x)*(e.y-n.y)/(i.y-n.y)+n.x&&(a=!a)}return a}function ns(t,e){let r=!1;for(let n=0,i=t.length-1;ne.y!=o.y>e.y&&e.x<(o.x-a.x)*(e.y-a.y)/(o.y-a.y)+a.x&&(r=!r)}return r}function is(t,e,r){const n=r[0],i=r[2];if(t.xi.x&&e.x>i.x||t.yi.y&&e.y>i.y)return!1;const a=k(t,e,r[0]);return a!==k(t,e,r[1])||a!==k(t,e,r[2])||a!==k(t,e,r[3])}function as(t,e,r){const n=e.paint.get(t).value;return\"constant\"===n.kind?n.value:r.programConfigurations.get(e.id).getMaxValue(t)}function os(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1])}function ss(t,e,r,n,i){if(!e[0]&&!e[1])return t;const o=a.convert(e)._mult(i);\"viewport\"===r&&o._rotate(-n);const s=[];for(let e=0;ews(t,e)))}(l,s),f=u?c*o:c;for(const t of n)for(const e of t){const t=u?e:ws(e,s);let r=f;const n=vs([],[e.x,e.y,0,1],s);if(\"viewport\"===this.paint.get(\"circle-pitch-scale\")&&\"map\"===this.paint.get(\"circle-pitch-alignment\")?r*=n[3]/a.cameraToCenterDistance:\"map\"===this.paint.get(\"circle-pitch-scale\")&&\"viewport\"===this.paint.get(\"circle-pitch-alignment\")&&(r*=a.cameraToCenterDistance/n[3]),Xo(h,t,r))return!0}return!1}}function ws(t,e){const r=vs([],[t.x,t.y,0,1],e);return new a(r[0]/r[3],r[1]/r[3])}class Ts extends Wo{}let ks;Mi(\"HeatmapBucket\",Ts,{omit:[\"layers\"]});var As={get paint(){return ks=ks||new ia({\"heatmap-radius\":new ta(Z.paint_heatmap[\"heatmap-radius\"]),\"heatmap-weight\":new ta(Z.paint_heatmap[\"heatmap-weight\"]),\"heatmap-intensity\":new Qi(Z.paint_heatmap[\"heatmap-intensity\"]),\"heatmap-color\":new na(Z.paint_heatmap[\"heatmap-color\"]),\"heatmap-opacity\":new Qi(Z.paint_heatmap[\"heatmap-opacity\"])})}};function Ms(t,{width:e,height:r},n,i){if(i){if(i instanceof Uint8ClampedArray)i=new Uint8Array(i.buffer);else if(i.length!==e*r*n)throw new RangeError(`mismatched image size. expected: ${i.length} but got: ${e*r*n}`)}else i=new Uint8Array(e*r*n);return t.width=e,t.height=r,t.data=i,t}function Ss(t,{width:e,height:r},n){if(e===t.width&&r===t.height)return;const i=Ms({},{width:e,height:r},n);Es(t,i,{x:0,y:0},{x:0,y:0},{width:Math.min(t.width,e),height:Math.min(t.height,r)},n),t.width=e,t.height=r,t.data=i.data}function Es(t,e,r,n,i,a){if(0===i.width||0===i.height)return e;if(i.width>t.width||i.height>t.height||r.x>t.width-i.width||r.y>t.height-i.height)throw new RangeError(\"out of range source coordinates for image copy\");if(i.width>e.width||i.height>e.height||n.x>e.width-i.width||n.y>e.height-i.height)throw new RangeError(\"out of range destination coordinates for image copy\");const o=t.data,s=e.data;if(o===s)throw new Error(\"srcData equals dstData, so image is already copied\");for(let l=0;l{e[t.evaluationKey]=a;const o=t.expression.evaluate(e);i.data[r+n+0]=Math.floor(255*o.r/o.a),i.data[r+n+1]=Math.floor(255*o.g/o.a),i.data[r+n+2]=Math.floor(255*o.b/o.a),i.data[r+n+3]=Math.floor(255*o.a)};if(t.clips)for(let e=0,i=0;e80*r){s=1/0,l=1/0;let e=-1/0,n=-1/0;for(let a=r;ae&&(e=r),i>n&&(n=i)}c=Math.max(e-s,n-l),c=0!==c?32767/c:0}return qs(a,o,r,s,l,c,0),o}function Us(t,e,r,n,i){let a;if(i===function(t,e,r,n){let i=0;for(let a=e,o=r-n;a0)for(let i=e;i=e;i-=n)a=ll(i/n|0,t[i],t[i+1],a);return a&&rl(a,a.next)&&(cl(a),a=a.next),a}function Vs(t,e){if(!t)return t;e||(e=t);let r,n=t;do{if(r=!1,n.steiner||!rl(n,n.next)&&0!==el(n.prev,n,n.next))n=n.next;else{if(cl(n),n=e=n.prev,n===n.next)break;r=!0}}while(r||n!==e);return e}function qs(t,e,r,n,i,a,o){if(!t)return;!o&&a&&function(t,e,r,n){let i=t;do{0===i.z&&(i.z=Js(i.x,i.y,e,r,n)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next}while(i!==t);i.prevZ.nextZ=null,i.prevZ=null,function(t){let e,r=1;do{let n,i=t;t=null;let a=null;for(e=0;i;){e++;let o=i,s=0;for(let t=0;t0||l>0&&o;)0!==s&&(0===l||!o||i.z<=o.z)?(n=i,i=i.nextZ,s--):(n=o,o=o.nextZ,l--),a?a.nextZ=n:t=n,n.prevZ=a,a=n;i=o}a.nextZ=null,r*=2}while(e>1)}(i)}(t,n,i,a);let s=t;for(;t.prev!==t.next;){const l=t.prev,c=t.next;if(a?Gs(t,n,i,a):Hs(t))e.push(l.i,t.i,c.i),cl(t),t=c.next,s=c.next;else if((t=c)===s){o?1===o?qs(t=Zs(Vs(t),e),e,r,n,i,a,2):2===o&&Ws(t,e,r,n,i,a):qs(Vs(t),e,r,n,i,a,1);break}}}function Hs(t){const e=t.prev,r=t,n=t.next;if(el(e,r,n)>=0)return!1;const i=e.x,a=r.x,o=n.x,s=e.y,l=r.y,c=n.y,u=ia?i>o?i:o:a>o?a:o,p=s>l?s>c?s:c:l>c?l:c;let d=n.next;for(;d!==e;){if(d.x>=u&&d.x<=f&&d.y>=h&&d.y<=p&&Qs(i,s,a,l,o,c,d.x,d.y)&&el(d.prev,d,d.next)>=0)return!1;d=d.next}return!0}function Gs(t,e,r,n){const i=t.prev,a=t,o=t.next;if(el(i,a,o)>=0)return!1;const s=i.x,l=a.x,c=o.x,u=i.y,h=a.y,f=o.y,p=sl?s>c?s:c:l>c?l:c,g=u>h?u>f?u:f:h>f?h:f,y=Js(p,d,e,r,n),v=Js(m,g,e,r,n);let x=t.prevZ,_=t.nextZ;for(;x&&x.z>=y&&_&&_.z<=v;){if(x.x>=p&&x.x<=m&&x.y>=d&&x.y<=g&&x!==i&&x!==o&&Qs(s,u,l,h,c,f,x.x,x.y)&&el(x.prev,x,x.next)>=0)return!1;if(x=x.prevZ,_.x>=p&&_.x<=m&&_.y>=d&&_.y<=g&&_!==i&&_!==o&&Qs(s,u,l,h,c,f,_.x,_.y)&&el(_.prev,_,_.next)>=0)return!1;_=_.nextZ}for(;x&&x.z>=y;){if(x.x>=p&&x.x<=m&&x.y>=d&&x.y<=g&&x!==i&&x!==o&&Qs(s,u,l,h,c,f,x.x,x.y)&&el(x.prev,x,x.next)>=0)return!1;x=x.prevZ}for(;_&&_.z<=v;){if(_.x>=p&&_.x<=m&&_.y>=d&&_.y<=g&&_!==i&&_!==o&&Qs(s,u,l,h,c,f,_.x,_.y)&&el(_.prev,_,_.next)>=0)return!1;_=_.nextZ}return!0}function Zs(t,e){let r=t;do{const n=r.prev,i=r.next.next;!rl(n,i)&&nl(n,r,r.next,i)&&ol(n,i)&&ol(i,n)&&(e.push(n.i,r.i,i.i),cl(r),cl(r.next),r=t=i),r=r.next}while(r!==t);return Vs(r)}function Ws(t,e,r,n,i,a){let o=t;do{let t=o.next.next;for(;t!==o.prev;){if(o.i!==t.i&&tl(o,t)){let s=sl(o,t);return o=Vs(o,o.next),s=Vs(s,s.next),qs(o,e,r,n,i,a,0),void qs(s,e,r,n,i,a,0)}t=t.next}o=o.next}while(o!==t)}function Ys(t,e){return t.x-e.x}function Xs(t,e){const r=function(t,e){let r=e;const n=t.x,i=t.y;let a,o=-1/0;do{if(i<=r.y&&i>=r.next.y&&r.next.y!==r.y){const t=r.x+(i-r.y)*(r.next.x-r.x)/(r.next.y-r.y);if(t<=n&&t>o&&(o=t,a=r.x=r.x&&r.x>=l&&n!==r.x&&Qs(ia.x||r.x===a.x&&$s(a,r)))&&(a=r,u=e)}r=r.next}while(r!==s);return a}(t,e);if(!r)return e;const n=sl(r,t);return Vs(n,n.next),Vs(r,r.next)}function $s(t,e){return el(t.prev,t,e.prev)<0&&el(e.next,t,t.next)<0}function Js(t,e,r,n,i){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=(t-r)*i|0)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=(e-n)*i|0)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function Ks(t){let e=t,r=t;do{(e.x=(t-o)*(a-s)&&(t-o)*(n-s)>=(r-o)*(e-s)&&(r-o)*(a-s)>=(i-o)*(n-s)}function tl(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){let r=t;do{if(r.i!==t.i&&r.next.i!==t.i&&r.i!==e.i&&r.next.i!==e.i&&nl(r,r.next,t,e))return!0;r=r.next}while(r!==t);return!1}(t,e)&&(ol(t,e)&&ol(e,t)&&function(t,e){let r=t,n=!1;const i=(t.x+e.x)/2,a=(t.y+e.y)/2;do{r.y>a!=r.next.y>a&&r.next.y!==r.y&&i<(r.next.x-r.x)*(a-r.y)/(r.next.y-r.y)+r.x&&(n=!n),r=r.next}while(r!==t);return n}(t,e)&&(el(t.prev,t,e.prev)||el(t,e.prev,e))||rl(t,e)&&el(t.prev,t,t.next)>0&&el(e.prev,e,e.next)>0)}function el(t,e,r){return(e.y-t.y)*(r.x-e.x)-(e.x-t.x)*(r.y-e.y)}function rl(t,e){return t.x===e.x&&t.y===e.y}function nl(t,e,r,n){const i=al(el(t,e,r)),a=al(el(t,e,n)),o=al(el(r,n,t)),s=al(el(r,n,e));return i!==a&&o!==s||!(0!==i||!il(t,r,e))||!(0!==a||!il(t,n,e))||!(0!==o||!il(r,t,n))||!(0!==s||!il(r,e,n))}function il(t,e,r){return e.x<=Math.max(t.x,r.x)&&e.x>=Math.min(t.x,r.x)&&e.y<=Math.max(t.y,r.y)&&e.y>=Math.min(t.y,r.y)}function al(t){return t>0?1:t<0?-1:0}function ol(t,e){return el(t.prev,t,t.next)<0?el(t,e,t.next)>=0&&el(t,t.prev,e)>=0:el(t,e,t.prev)<0||el(t,t.next,e)<0}function sl(t,e){const r=ul(t.i,t.x,t.y),n=ul(e.i,e.x,e.y),i=t.next,a=e.prev;return t.next=e,e.prev=t,r.next=i,i.prev=r,n.next=r,r.prev=n,a.next=n,n.prev=a,n}function ll(t,e,r,n){const i=ul(t,e,r);return n?(i.next=n.next,i.prev=n,n.next.prev=i,n.next=i):(i.prev=i,i.next=i),i}function cl(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function ul(t,e,r){return{i:t,x:e,y:r,prev:null,next:null,z:0,prevZ:null,nextZ:null,steiner:!1}}function hl(t,e,r){const n=r.patternDependencies;let i=!1;for(const r of e){const e=r.paint.get(`${t}-pattern`);e.isConstant()||(i=!0);const a=e.constantOr(null);a&&(i=!0,n[a.to]=!0,n[a.from]=!0)}return i}function fl(t,e,r,n,i){const a=i.patternDependencies;for(const o of e){const e=o.paint.get(`${t}-pattern`).value;if(\"constant\"!==e.kind){let t=e.evaluate({zoom:n-1},r,{},i.availableImages),s=e.evaluate({zoom:n},r,{},i.availableImages),l=e.evaluate({zoom:n+1},r,{},i.availableImages);t=t&&t.name?t.name:t,s=s&&s.name?s.name:s,l=l&&l.name?l.name:l,a[t]=!0,a[s]=!0,a[l]=!0,r.patterns[o.id]={min:t,mid:s,max:l}}}return r}class pl{constructor(t){this.zoom=t.zoom,this.overscaling=t.overscaling,this.layers=t.layers,this.layerIds=this.layers.map((t=>t.id)),this.index=t.index,this.hasPattern=!1,this.patternFeatures=[],this.layoutVertexArray=new Xa,this.indexArray=new ao,this.indexArray2=new oo,this.programConfigurations=new Bo(t.layers,t.zoom),this.segments=new ho,this.segments2=new ho,this.stateDependentLayerIds=this.layers.filter((t=>t.isStateDependent())).map((t=>t.id))}populate(t,e,r){this.hasPattern=hl(\"fill\",this.layers,e);const n=this.layers[0].layout.get(\"fill-sort-key\"),i=!n.isConstant(),a=[];for(const{feature:o,id:s,index:l,sourceLayerIndex:c}of t){const t=this.layers[0]._featureFilter.needGeometry,u=Go(o,t);if(!this.layers[0]._featureFilter.filter(new Hi(this.zoom),u,r))continue;const h=i?n.evaluate(u,{},r,e.availableImages):void 0,f={id:s,properties:o.properties,type:o.type,sourceLayerIndex:c,index:l,geometry:t?u.geometry:Ho(o),patterns:{},sortKey:h};a.push(f)}i&&a.sort(((t,e)=>t.sortKey-e.sortKey));for(const n of a){const{geometry:i,index:a,sourceLayerIndex:o}=n;if(this.hasPattern){const t=fl(\"fill\",this.layers,n,this.zoom,e);this.patternFeatures.push(t)}else this.addFeature(n,i,a,r,{});const s=t[a].feature;e.featureIndex.insert(s,i,a,o,this.index)}}update(t,e,r){this.stateDependentLayers.length&&this.programConfigurations.updatePaintArrays(t,e,this.stateDependentLayers,r)}addFeatures(t,e,r){for(const t of this.patternFeatures)this.addFeature(t,t.geometry,t.index,e,r)}isEmpty(){return 0===this.layoutVertexArray.length}uploadPending(){return!this.uploaded||this.programConfigurations.needsUpload}upload(t){this.uploaded||(this.layoutVertexBuffer=t.createVertexBuffer(this.layoutVertexArray,Fs),this.indexBuffer=t.createIndexBuffer(this.indexArray),this.indexBuffer2=t.createIndexBuffer(this.indexArray2)),this.programConfigurations.upload(t),this.uploaded=!0}destroy(){this.layoutVertexBuffer&&(this.layoutVertexBuffer.destroy(),this.indexBuffer.destroy(),this.indexBuffer2.destroy(),this.programConfigurations.destroy(),this.segments.destroy(),this.segments2.destroy())}addFeature(t,e,r,n,i){for(const t of br(e,500)){let e=0;for(const r of t)e+=r.length;const r=this.segments.prepareSegment(e,this.layoutVertexArray,this.indexArray),n=r.vertexLength,i=[],a=[];for(const e of t){if(0===e.length)continue;e!==t[0]&&a.push(i.length/2);const r=this.segments2.prepareSegment(e.length,this.layoutVertexArray,this.indexArray2),n=r.vertexLength;this.layoutVertexArray.emplaceBack(e[0].x,e[0].y),this.indexArray2.emplaceBack(n+e.length-1,n),i.push(e[0].x),i.push(e[0].y);for(let t=1;t>3}if(i--,1===n||2===n)a+=t.readSVarint(),o+=t.readSVarint(),1===n&&(e&&s.push(e),e=[]),e.push(new kl(a,o));else{if(7!==n)throw new Error(\"unknown command \"+n);e&&e.push(e[0].clone())}}return e&&s.push(e),s},Ml.prototype.bbox=function(){var t=this._pbf;t.pos=this._geometry;for(var e=t.readVarint()+t.pos,r=1,n=0,i=0,a=0,o=1/0,s=-1/0,l=1/0,c=-1/0;t.pos>3}if(n--,1===r||2===r)(i+=t.readSVarint())s&&(s=i),(a+=t.readSVarint())c&&(c=a);else if(7!==r)throw new Error(\"unknown command \"+r)}return[o,l,s,c]},Ml.prototype.toGeoJSON=function(t,e,r){var n,i,a=this.extent*Math.pow(2,r),o=this.extent*t,s=this.extent*e,l=this.loadGeometry(),c=Ml.types[this.type];function u(t){for(var e=0;e>3;e=1===n?t.readString():2===n?t.readFloat():3===n?t.readDouble():4===n?t.readVarint64():5===n?t.readVarint():6===n?t.readSVarint():7===n?t.readBoolean():null}return e}(r))}Il.prototype.feature=function(t){if(t<0||t>=this._features.length)throw new Error(\"feature index out of bounds\");this._pbf.pos=this._features[t];var e=this._pbf.readVarint()+this._pbf.pos;return new Cl(this._pbf,e,this.extent,this._keys,this._values)};var zl=Ll,Ol=function(t,e){this.layers=t.readFields(Dl,{},e)};function Dl(t,e,r){if(3===t){var n=new zl(r,r.readVarint()+r.pos);n.length&&(e[n.name]=n)}}Tl.VectorTile=Ol,Tl.VectorTileFeature=Al,Tl.VectorTileLayer=Ll;const Rl=Tl.VectorTileFeature.types,Fl=Math.pow(2,13);function Bl(t,e,r,n,i,a,o,s){t.emplaceBack(e,r,2*Math.floor(n*Fl)+o,i*Fl*2,a*Fl*2,Math.round(s))}class Nl{constructor(t){this.zoom=t.zoom,this.overscaling=t.overscaling,this.layers=t.layers,this.layerIds=this.layers.map((t=>t.id)),this.index=t.index,this.hasPattern=!1,this.layoutVertexArray=new $a,this.centroidVertexArray=new Wa,this.indexArray=new ao,this.programConfigurations=new Bo(t.layers,t.zoom),this.segments=new ho,this.stateDependentLayerIds=this.layers.filter((t=>t.isStateDependent())).map((t=>t.id))}populate(t,e,r){this.features=[],this.hasPattern=hl(\"fill-extrusion\",this.layers,e);for(const{feature:n,id:i,index:a,sourceLayerIndex:o}of t){const t=this.layers[0]._featureFilter.needGeometry,s=Go(n,t);if(!this.layers[0]._featureFilter.filter(new Hi(this.zoom),s,r))continue;const l={id:i,sourceLayerIndex:o,index:a,geometry:t?s.geometry:Ho(n),properties:n.properties,type:n.type,patterns:{}};this.hasPattern?this.features.push(fl(\"fill-extrusion\",this.layers,l,this.zoom,e)):this.addFeature(l,l.geometry,a,r,{}),e.featureIndex.insert(n,l.geometry,a,o,this.index,!0)}}addFeatures(t,e,r){for(const t of this.features){const{geometry:n}=t;this.addFeature(t,n,t.index,e,r)}}update(t,e,r){this.stateDependentLayers.length&&this.programConfigurations.updatePaintArrays(t,e,this.stateDependentLayers,r)}isEmpty(){return 0===this.layoutVertexArray.length&&0===this.centroidVertexArray.length}uploadPending(){return!this.uploaded||this.programConfigurations.needsUpload}upload(t){this.uploaded||(this.layoutVertexBuffer=t.createVertexBuffer(this.layoutVertexArray,_l),this.centroidVertexBuffer=t.createVertexBuffer(this.centroidVertexArray,xl.members,!0),this.indexBuffer=t.createIndexBuffer(this.indexArray)),this.programConfigurations.upload(t),this.uploaded=!0}destroy(){this.layoutVertexBuffer&&(this.layoutVertexBuffer.destroy(),this.indexBuffer.destroy(),this.programConfigurations.destroy(),this.segments.destroy(),this.centroidVertexBuffer.destroy())}addFeature(t,e,r,n,i){for(const r of br(e,500)){const e={x:0,y:0,vertexCount:0};let n=0;for(const t of r)n+=t.length;let i=this.segments.prepareSegment(4,this.layoutVertexArray,this.indexArray);for(const t of r){if(0===t.length)continue;if(Ul(t))continue;let r=0;for(let n=0;n=1){const o=t[n-1];if(!jl(a,o)){i.vertexLength+4>ho.MAX_VERTEX_ARRAY_LENGTH&&(i=this.segments.prepareSegment(4,this.layoutVertexArray,this.indexArray));const t=a.sub(o)._perp()._unit(),n=o.dist(a);r+n>32768&&(r=0),Bl(this.layoutVertexArray,a.x,a.y,t.x,t.y,0,0,r),Bl(this.layoutVertexArray,a.x,a.y,t.x,t.y,0,1,r),e.x+=2*a.x,e.y+=2*a.y,e.vertexCount+=2,r+=n,Bl(this.layoutVertexArray,o.x,o.y,t.x,t.y,0,0,r),Bl(this.layoutVertexArray,o.x,o.y,t.x,t.y,0,1,r),e.x+=2*o.x,e.y+=2*o.y,e.vertexCount+=2;const s=i.vertexLength;this.indexArray.emplaceBack(s,s+2,s+1),this.indexArray.emplaceBack(s+1,s+2,s+3),i.vertexLength+=4,i.primitiveLength+=2}}}}if(i.vertexLength+n>ho.MAX_VERTEX_ARRAY_LENGTH&&(i=this.segments.prepareSegment(n,this.layoutVertexArray,this.indexArray)),\"Polygon\"!==Rl[t.type])continue;const a=[],o=[],s=i.vertexLength;for(const t of r)if(0!==t.length){t!==r[0]&&o.push(a.length/2);for(let r=0;rUo)||t.y===e.y&&(t.y<0||t.y>Uo)}function Ul(t){return t.every((t=>t.x<0))||t.every((t=>t.x>Uo))||t.every((t=>t.y<0))||t.every((t=>t.y>Uo))}let Vl;Mi(\"FillExtrusionBucket\",Nl,{omit:[\"layers\",\"features\"]});var ql={get paint(){return Vl=Vl||new ia({\"fill-extrusion-opacity\":new Qi(Z[\"paint_fill-extrusion\"][\"fill-extrusion-opacity\"]),\"fill-extrusion-color\":new ta(Z[\"paint_fill-extrusion\"][\"fill-extrusion-color\"]),\"fill-extrusion-translate\":new Qi(Z[\"paint_fill-extrusion\"][\"fill-extrusion-translate\"]),\"fill-extrusion-translate-anchor\":new Qi(Z[\"paint_fill-extrusion\"][\"fill-extrusion-translate-anchor\"]),\"fill-extrusion-pattern\":new ea(Z[\"paint_fill-extrusion\"][\"fill-extrusion-pattern\"]),\"fill-extrusion-height\":new ta(Z[\"paint_fill-extrusion\"][\"fill-extrusion-height\"]),\"fill-extrusion-base\":new ta(Z[\"paint_fill-extrusion\"][\"fill-extrusion-base\"]),\"fill-extrusion-vertical-gradient\":new Qi(Z[\"paint_fill-extrusion\"][\"fill-extrusion-vertical-gradient\"])})}};class Hl extends oa{constructor(t){super(t,ql)}createBucket(t){return new Nl(t)}queryRadius(){return os(this.paint.get(\"fill-extrusion-translate\"))}is3D(){return!0}queryIntersectsFeature(t,e,r,n,i,o,s,l){const c=ss(t,this.paint.get(\"fill-extrusion-translate\"),this.paint.get(\"fill-extrusion-translate-anchor\"),o.angle,s),u=this.paint.get(\"fill-extrusion-height\").evaluate(e,r),h=this.paint.get(\"fill-extrusion-base\").evaluate(e,r),f=function(t,e,r,n){const i=[];for(const r of t){const t=[r.x,r.y,n,1];vs(t,t,e),i.push(new a(t[0]/t[3],t[1]/t[3]))}return i}(c,l,0,0),p=function(t,e,r,n){const i=[],o=[],s=n[8]*e,l=n[9]*e,c=n[10]*e,u=n[11]*e,h=n[8]*r,f=n[9]*r,p=n[10]*r,d=n[11]*r;for(const e of t){const t=[],r=[];for(const i of e){const e=i.x,o=i.y,m=n[0]*e+n[4]*o+n[12],g=n[1]*e+n[5]*o+n[13],y=n[2]*e+n[6]*o+n[14],v=n[3]*e+n[7]*o+n[15],x=y+c,_=v+u,b=m+h,w=g+f,T=y+p,k=v+d,A=new a((m+s)/_,(g+l)/_);A.z=x/_,t.push(A);const M=new a(b/k,w/k);M.z=T/k,r.push(M)}i.push(t),o.push(r)}return[i,o]}(n,h,u,l);return function(t,e,r){let n=1/0;$o(r,e)&&(n=Zl(r,e[0]));for(let i=0;it.id)),this.index=t.index,this.hasPattern=!1,this.patternFeatures=[],this.lineClipsArray=[],this.gradients={},this.layers.forEach((t=>{this.gradients[t.id]={}})),this.layoutVertexArray=new Ja,this.layoutVertexArray2=new Ka,this.indexArray=new ao,this.programConfigurations=new Bo(t.layers,t.zoom),this.segments=new ho,this.maxLineLength=0,this.stateDependentLayerIds=this.layers.filter((t=>t.isStateDependent())).map((t=>t.id))}populate(t,e,r){this.hasPattern=hl(\"line\",this.layers,e);const n=this.layers[0].layout.get(\"line-sort-key\"),i=!n.isConstant(),a=[];for(const{feature:e,id:o,index:s,sourceLayerIndex:l}of t){const t=this.layers[0]._featureFilter.needGeometry,c=Go(e,t);if(!this.layers[0]._featureFilter.filter(new Hi(this.zoom),c,r))continue;const u=i?n.evaluate(c,{},r):void 0,h={id:o,properties:e.properties,type:e.type,sourceLayerIndex:l,index:s,geometry:t?c.geometry:Ho(e),patterns:{},sortKey:u};a.push(h)}i&&a.sort(((t,e)=>t.sortKey-e.sortKey));for(const n of a){const{geometry:i,index:a,sourceLayerIndex:o}=n;if(this.hasPattern){const t=fl(\"line\",this.layers,n,this.zoom,e);this.patternFeatures.push(t)}else this.addFeature(n,i,a,r,{});const s=t[a].feature;e.featureIndex.insert(s,i,a,o,this.index)}}update(t,e,r){this.stateDependentLayers.length&&this.programConfigurations.updatePaintArrays(t,e,this.stateDependentLayers,r)}addFeatures(t,e,r){for(const t of this.patternFeatures)this.addFeature(t,t.geometry,t.index,e,r)}isEmpty(){return 0===this.layoutVertexArray.length}uploadPending(){return!this.uploaded||this.programConfigurations.needsUpload}upload(t){this.uploaded||(0!==this.layoutVertexArray2.length&&(this.layoutVertexBuffer2=t.createVertexBuffer(this.layoutVertexArray2,Kl)),this.layoutVertexBuffer=t.createVertexBuffer(this.layoutVertexArray,Yl),this.indexBuffer=t.createIndexBuffer(this.indexArray)),this.programConfigurations.upload(t),this.uploaded=!0}destroy(){this.layoutVertexBuffer&&(this.layoutVertexBuffer.destroy(),this.indexBuffer.destroy(),this.programConfigurations.destroy(),this.segments.destroy())}lineFeatureClips(t){if(t.properties&&Object.prototype.hasOwnProperty.call(t.properties,\"mapbox_clip_start\")&&Object.prototype.hasOwnProperty.call(t.properties,\"mapbox_clip_end\"))return{start:+t.properties.mapbox_clip_start,end:+t.properties.mapbox_clip_end}}addFeature(t,e,r,n,i){const a=this.layers[0].layout,o=a.get(\"line-join\").evaluate(t,{}),s=a.get(\"line-cap\"),l=a.get(\"line-miter-limit\"),c=a.get(\"line-round-limit\");this.lineClips=this.lineFeatureClips(t);for(const r of e)this.addLine(r,t,o,s,l,c);this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length,t,r,i,n)}addLine(t,e,r,n,i,a){if(this.distance=0,this.scaledDistance=0,this.totalDistance=0,this.lineClips){this.lineClipsArray.push(this.lineClips);for(let e=0;e=2&&t[s-1].equals(t[s-2]);)s--;let l=0;for(;l0;if(b&&e>l){const t=h.dist(f);if(t>2*c){const e=h.sub(h.sub(f)._mult(c/t)._round());this.updateDistance(f,e),this.addCurrentVertex(e,d,0,0,u),f=e}}const T=f&&p;let k=T?r:o?\"butt\":n;if(T&&\"round\"===k&&(xi&&(k=\"bevel\"),\"bevel\"===k&&(x>2&&(k=\"flipbevel\"),x100)g=m.mult(-1);else{const t=x*d.add(m).mag()/d.sub(m).mag();g._perp()._mult(t*(w?-1:1))}this.addCurrentVertex(h,g,0,0,u),this.addCurrentVertex(h,g.mult(-1),0,0,u)}else if(\"bevel\"===k||\"fakeround\"===k){const t=-Math.sqrt(x*x-1),e=w?t:0,r=w?0:t;if(f&&this.addCurrentVertex(h,d,e,r,u),\"fakeround\"===k){const t=Math.round(180*_/Math.PI/20);for(let e=1;e2*c){const e=h.add(p.sub(h)._mult(c/t)._round());this.updateDistance(h,e),this.addCurrentVertex(e,m,0,0,u),h=e}}}}addCurrentVertex(t,e,r,n,i,a=!1){const o=e.x+e.y*r,s=e.y-e.x*r,l=-e.x+e.y*n,c=-e.y-e.x*n;this.addHalfVertex(t,o,s,a,!1,r,i),this.addHalfVertex(t,l,c,a,!0,-n,i),this.distance>nc/2&&0===this.totalDistance&&(this.distance=0,this.updateScaledDistance(),this.addCurrentVertex(t,e,r,n,i,a))}addHalfVertex({x:t,y:e},r,n,i,a,o,s){const l=.5*(this.lineClips?this.scaledDistance*(nc-1):this.scaledDistance);if(this.layoutVertexArray.emplaceBack((t<<1)+(i?1:0),(e<<1)+(a?1:0),Math.round(63*r)+128,Math.round(63*n)+128,1+(0===o?0:o<0?-1:1)|(63&l)<<2,l>>6),this.lineClips){const t=(this.scaledDistance-this.lineClips.start)/(this.lineClips.end-this.lineClips.start);this.layoutVertexArray2.emplaceBack(t,this.lineClipsArray.length)}const c=s.vertexLength++;this.e1>=0&&this.e2>=0&&(this.indexArray.emplaceBack(this.e1,this.e2,c),s.primitiveLength++),a?this.e2=c:this.e1=c}updateScaledDistance(){this.scaledDistance=this.lineClips?this.lineClips.start+(this.lineClips.end-this.lineClips.start)*this.distance/this.totalDistance:this.distance}updateDistance(t,e){this.distance+=t.dist(e),this.updateScaledDistance()}}let ac;Mi(\"LineBucket\",ic,{omit:[\"layers\",\"patternFeatures\"]});let oc;var sc={get paint(){return oc=oc||new ia({\"line-opacity\":new ta(Z.paint_line[\"line-opacity\"]),\"line-color\":new ta(Z.paint_line[\"line-color\"]),\"line-translate\":new Qi(Z.paint_line[\"line-translate\"]),\"line-translate-anchor\":new Qi(Z.paint_line[\"line-translate-anchor\"]),\"line-width\":new ta(Z.paint_line[\"line-width\"]),\"line-gap-width\":new ta(Z.paint_line[\"line-gap-width\"]),\"line-offset\":new ta(Z.paint_line[\"line-offset\"]),\"line-blur\":new ta(Z.paint_line[\"line-blur\"]),\"line-dasharray\":new ra(Z.paint_line[\"line-dasharray\"]),\"line-pattern\":new ea(Z.paint_line[\"line-pattern\"]),\"line-gradient\":new na(Z.paint_line[\"line-gradient\"])})},get layout(){return ac=ac||new ia({\"line-cap\":new Qi(Z.layout_line[\"line-cap\"]),\"line-join\":new ta(Z.layout_line[\"line-join\"]),\"line-miter-limit\":new Qi(Z.layout_line[\"line-miter-limit\"]),\"line-round-limit\":new Qi(Z.layout_line[\"line-round-limit\"]),\"line-sort-key\":new ta(Z.layout_line[\"line-sort-key\"])})}};class lc extends ta{possiblyEvaluate(t,e){return e=new Hi(Math.floor(e.zoom),{now:e.now,fadeDuration:e.fadeDuration,zoomHistory:e.zoomHistory,transition:e.transition}),super.possiblyEvaluate(t,e)}evaluate(t,e,r,n){return e=y({},e,{zoom:Math.floor(e.zoom)}),super.evaluate(t,e,r,n)}}let cc;class uc extends oa{constructor(t){super(t,sc),this.gradientVersion=0,cc||(cc=new lc(sc.paint.properties[\"line-width\"].specification),cc.useIntegerZoom=!0)}_handleSpecialPaintPropertyUpdate(t){if(\"line-gradient\"===t){const t=this.gradientExpression();!function(t){return void 0!==t._styleExpression}(t)?this.stepInterpolant=!1:this.stepInterpolant=t._styleExpression.expression instanceof Ae,this.gradientVersion=(this.gradientVersion+1)%Number.MAX_SAFE_INTEGER}}gradientExpression(){return this._transitionablePaint._values[\"line-gradient\"].value.expression}recalculate(t,e){super.recalculate(t,e),this.paint._values[\"line-floorwidth\"]=cc.possiblyEvaluate(this._transitioningPaint._values[\"line-width\"].value,t)}createBucket(t){return new ic(t)}queryRadius(t){const e=t,r=hc(as(\"line-width\",this,e),as(\"line-gap-width\",this,e)),n=as(\"line-offset\",this,e);return r/2+Math.abs(n)+os(this.paint.get(\"line-translate\"))}queryIntersectsFeature(t,e,r,n,i,o,s){const l=ss(t,this.paint.get(\"line-translate\"),this.paint.get(\"line-translate-anchor\"),o.angle,s),c=s/2*hc(this.paint.get(\"line-width\").evaluate(e,r),this.paint.get(\"line-gap-width\").evaluate(e,r)),u=this.paint.get(\"line-offset\").evaluate(e,r);return u&&(n=function(t,e){const r=[];for(let n=0;n=3)for(let e=0;e0?e+2*t:t}const fc=ua([{name:\"a_pos_offset\",components:4,type:\"Int16\"},{name:\"a_data\",components:4,type:\"Uint16\"},{name:\"a_pixeloffset\",components:4,type:\"Int16\"}],4),pc=ua([{name:\"a_projected_pos\",components:3,type:\"Float32\"}],4);ua([{name:\"a_fade_opacity\",components:1,type:\"Uint32\"}],4);const dc=ua([{name:\"a_placed\",components:2,type:\"Uint8\"},{name:\"a_shift\",components:2,type:\"Float32\"},{name:\"a_box_real\",components:2,type:\"Int16\"}]);ua([{type:\"Int16\",name:\"anchorPointX\"},{type:\"Int16\",name:\"anchorPointY\"},{type:\"Int16\",name:\"x1\"},{type:\"Int16\",name:\"y1\"},{type:\"Int16\",name:\"x2\"},{type:\"Int16\",name:\"y2\"},{type:\"Uint32\",name:\"featureIndex\"},{type:\"Uint16\",name:\"sourceLayerIndex\"},{type:\"Uint16\",name:\"bucketIndex\"}]);const mc=ua([{name:\"a_pos\",components:2,type:\"Int16\"},{name:\"a_anchor_pos\",components:2,type:\"Int16\"},{name:\"a_extrude\",components:2,type:\"Int16\"}],4),gc=ua([{name:\"a_pos\",components:2,type:\"Float32\"},{name:\"a_radius\",components:1,type:\"Float32\"},{name:\"a_flags\",components:2,type:\"Int16\"}],4);function yc(t,e,r){return t.sections.forEach((t=>{t.text=function(t,e,r){const n=e.layout.get(\"text-transform\").evaluate(r,{});return\"uppercase\"===n?t=t.toLocaleUpperCase():\"lowercase\"===n&&(t=t.toLocaleLowerCase()),qi.applyArabicShaping&&(t=qi.applyArabicShaping(t)),t}(t.text,e,r)})),t}ua([{name:\"triangle\",components:3,type:\"Uint16\"}]),ua([{type:\"Int16\",name:\"anchorX\"},{type:\"Int16\",name:\"anchorY\"},{type:\"Uint16\",name:\"glyphStartIndex\"},{type:\"Uint16\",name:\"numGlyphs\"},{type:\"Uint32\",name:\"vertexStartIndex\"},{type:\"Uint32\",name:\"lineStartIndex\"},{type:\"Uint32\",name:\"lineLength\"},{type:\"Uint16\",name:\"segment\"},{type:\"Uint16\",name:\"lowerSize\"},{type:\"Uint16\",name:\"upperSize\"},{type:\"Float32\",name:\"lineOffsetX\"},{type:\"Float32\",name:\"lineOffsetY\"},{type:\"Uint8\",name:\"writingMode\"},{type:\"Uint8\",name:\"placedOrientation\"},{type:\"Uint8\",name:\"hidden\"},{type:\"Uint32\",name:\"crossTileID\"},{type:\"Int16\",name:\"associatedIconIndex\"}]),ua([{type:\"Int16\",name:\"anchorX\"},{type:\"Int16\",name:\"anchorY\"},{type:\"Int16\",name:\"rightJustifiedTextSymbolIndex\"},{type:\"Int16\",name:\"centerJustifiedTextSymbolIndex\"},{type:\"Int16\",name:\"leftJustifiedTextSymbolIndex\"},{type:\"Int16\",name:\"verticalPlacedTextSymbolIndex\"},{type:\"Int16\",name:\"placedIconSymbolIndex\"},{type:\"Int16\",name:\"verticalPlacedIconSymbolIndex\"},{type:\"Uint16\",name:\"key\"},{type:\"Uint16\",name:\"textBoxStartIndex\"},{type:\"Uint16\",name:\"textBoxEndIndex\"},{type:\"Uint16\",name:\"verticalTextBoxStartIndex\"},{type:\"Uint16\",name:\"verticalTextBoxEndIndex\"},{type:\"Uint16\",name:\"iconBoxStartIndex\"},{type:\"Uint16\",name:\"iconBoxEndIndex\"},{type:\"Uint16\",name:\"verticalIconBoxStartIndex\"},{type:\"Uint16\",name:\"verticalIconBoxEndIndex\"},{type:\"Uint16\",name:\"featureIndex\"},{type:\"Uint16\",name:\"numHorizontalGlyphVertices\"},{type:\"Uint16\",name:\"numVerticalGlyphVertices\"},{type:\"Uint16\",name:\"numIconVertices\"},{type:\"Uint16\",name:\"numVerticalIconVertices\"},{type:\"Uint16\",name:\"useRuntimeCollisionCircles\"},{type:\"Uint32\",name:\"crossTileID\"},{type:\"Float32\",name:\"textBoxScale\"},{type:\"Float32\",name:\"collisionCircleDiameter\"},{type:\"Uint16\",name:\"textAnchorOffsetStartIndex\"},{type:\"Uint16\",name:\"textAnchorOffsetEndIndex\"}]),ua([{type:\"Float32\",name:\"offsetX\"}]),ua([{type:\"Int16\",name:\"x\"},{type:\"Int16\",name:\"y\"},{type:\"Int16\",name:\"tileUnitDistanceFromAnchor\"}]),ua([{type:\"Uint16\",name:\"textAnchor\"},{type:\"Float32\",components:2,name:\"textOffset\"}]);const vc={\"!\":\"︕\",\"#\":\"#\",$:\"$\",\"%\":\"%\",\"&\":\"&\",\"(\":\"︵\",\")\":\"︶\",\"*\":\"*\",\"+\":\"+\",\",\":\"︐\",\"-\":\"︲\",\".\":\"・\",\"/\":\"/\",\":\":\"︓\",\";\":\"︔\",\"<\":\"︿\",\"=\":\"=\",\">\":\"﹀\",\"?\":\"︖\",\"@\":\"@\",\"[\":\"﹇\",\"\\\\\":\"\\",\"]\":\"﹈\",\"^\":\"^\",_:\"︳\",\"`\":\"`\",\"{\":\"︷\",\"|\":\"―\",\"}\":\"︸\",\"~\":\"~\",\"¢\":\"¢\",\"£\":\"£\",\"¥\":\"¥\",\"¦\":\"¦\",\"¬\":\"¬\",\"¯\":\" ̄\",\"–\":\"︲\",\"—\":\"︱\",\"‘\":\"﹃\",\"’\":\"﹄\",\"“\":\"﹁\",\"”\":\"﹂\",\"…\":\"︙\",\"‧\":\"・\",\"₩\":\"₩\",\"、\":\"︑\",\"。\":\"︒\",\"〈\":\"︿\",\"〉\":\"﹀\",\"《\":\"︽\",\"》\":\"︾\",\"「\":\"﹁\",\"」\":\"﹂\",\"『\":\"﹃\",\"』\":\"﹄\",\"【\":\"︻\",\"】\":\"︼\",\"〔\":\"︹\",\"〕\":\"︺\",\"〖\":\"︗\",\"〗\":\"︘\",\"!\":\"︕\",\"(\":\"︵\",\")\":\"︶\",\",\":\"︐\",\"-\":\"︲\",\".\":\"・\",\":\":\"︓\",\";\":\"︔\",\"<\":\"︿\",\">\":\"﹀\",\"?\":\"︖\",\"[\":\"﹇\",\"]\":\"﹈\",\"_\":\"︳\",\"{\":\"︷\",\"|\":\"―\",\"}\":\"︸\",\"⦅\":\"︵\",\"⦆\":\"︶\",\"。\":\"︒\",\"「\":\"﹁\",\"」\":\"﹂\"};var xc=24,_c=wc,bc={read:function(t,e,r,n,i){var a,o,s=8*i-n-1,l=(1<>1,u=-7,h=r?i-1:0,f=r?-1:1,p=t[e+h];for(h+=f,a=p&(1<<-u)-1,p>>=-u,u+=s;u>0;a=256*a+t[e+h],h+=f,u-=8);for(o=a&(1<<-u)-1,a>>=-u,u+=n;u>0;o=256*o+t[e+h],h+=f,u-=8);if(0===a)a=1-c;else{if(a===l)return o?NaN:1/0*(p?-1:1);o+=Math.pow(2,n),a-=c}return(p?-1:1)*o*Math.pow(2,a-n)},write:function(t,e,r,n,i,a){var o,s,l,c=8*a-i-1,u=(1<>1,f=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,p=n?0:a-1,d=n?1:-1,m=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(s=isNaN(e)?1:0,o=u):(o=Math.floor(Math.log(e)/Math.LN2),e*(l=Math.pow(2,-o))<1&&(o--,l*=2),(e+=o+h>=1?f/l:f*Math.pow(2,1-h))*l>=2&&(o++,l/=2),o+h>=u?(s=0,o=u):o+h>=1?(s=(e*l-1)*Math.pow(2,i),o+=h):(s=e*Math.pow(2,h-1)*Math.pow(2,i),o=0));i>=8;t[r+p]=255&s,p+=d,s/=256,i-=8);for(o=o<0;t[r+p]=255&o,p+=d,o/=256,c-=8);t[r+p-d]|=128*m}};function wc(t){this.buf=ArrayBuffer.isView&&ArrayBuffer.isView(t)?t:new Uint8Array(t||0),this.pos=0,this.type=0,this.length=this.buf.length}wc.Varint=0,wc.Fixed64=1,wc.Bytes=2,wc.Fixed32=5;var Tc=4294967296,kc=1/Tc,Ac=\"undefined\"==typeof TextDecoder?null:new TextDecoder(\"utf-8\");function Mc(t){return t.type===wc.Bytes?t.readVarint()+t.pos:t.pos+1}function Sc(t,e,r){return r?4294967296*e+(t>>>0):4294967296*(e>>>0)+(t>>>0)}function Ec(t,e,r){var n=e<=16383?1:e<=2097151?2:e<=268435455?3:Math.floor(Math.log(e)/(7*Math.LN2));r.realloc(n);for(var i=r.pos-1;i>=t;i--)r.buf[i+n]=r.buf[i]}function Cc(t,e){for(var r=0;r>>8,t[r+2]=e>>>16,t[r+3]=e>>>24}function jc(t,e){return(t[e]|t[e+1]<<8|t[e+2]<<16)+(t[e+3]<<24)}wc.prototype={destroy:function(){this.buf=null},readFields:function(t,e,r){for(r=r||this.length;this.pos>3,a=this.pos;this.type=7&n,t(i,e,this),this.pos===a&&this.skip(n)}return e},readMessage:function(t,e){return this.readFields(t,e,this.readVarint()+this.pos)},readFixed32:function(){var t=Bc(this.buf,this.pos);return this.pos+=4,t},readSFixed32:function(){var t=jc(this.buf,this.pos);return this.pos+=4,t},readFixed64:function(){var t=Bc(this.buf,this.pos)+Bc(this.buf,this.pos+4)*Tc;return this.pos+=8,t},readSFixed64:function(){var t=Bc(this.buf,this.pos)+jc(this.buf,this.pos+4)*Tc;return this.pos+=8,t},readFloat:function(){var t=bc.read(this.buf,this.pos,!0,23,4);return this.pos+=4,t},readDouble:function(){var t=bc.read(this.buf,this.pos,!0,52,8);return this.pos+=8,t},readVarint:function(t){var e,r,n=this.buf;return e=127&(r=n[this.pos++]),r<128?e:(e|=(127&(r=n[this.pos++]))<<7,r<128?e:(e|=(127&(r=n[this.pos++]))<<14,r<128?e:(e|=(127&(r=n[this.pos++]))<<21,r<128?e:function(t,e,r){var n,i,a=r.buf;if(n=(112&(i=a[r.pos++]))>>4,i<128)return Sc(t,n,e);if(n|=(127&(i=a[r.pos++]))<<3,i<128)return Sc(t,n,e);if(n|=(127&(i=a[r.pos++]))<<10,i<128)return Sc(t,n,e);if(n|=(127&(i=a[r.pos++]))<<17,i<128)return Sc(t,n,e);if(n|=(127&(i=a[r.pos++]))<<24,i<128)return Sc(t,n,e);if(n|=(1&(i=a[r.pos++]))<<31,i<128)return Sc(t,n,e);throw new Error(\"Expected varint not more than 10 bytes\")}(e|=(15&(r=n[this.pos]))<<28,t,this))))},readVarint64:function(){return this.readVarint(!0)},readSVarint:function(){var t=this.readVarint();return t%2==1?(t+1)/-2:t/2},readBoolean:function(){return Boolean(this.readVarint())},readString:function(){var t=this.readVarint()+this.pos,e=this.pos;return this.pos=t,t-e>=12&&Ac?function(t,e,r){return Ac.decode(t.subarray(e,r))}(this.buf,e,t):function(t,e,r){for(var n=\"\",i=e;i239?4:l>223?3:l>191?2:1;if(i+u>r)break;1===u?l<128&&(c=l):2===u?128==(192&(a=t[i+1]))&&(c=(31&l)<<6|63&a)<=127&&(c=null):3===u?(a=t[i+1],o=t[i+2],128==(192&a)&&128==(192&o)&&((c=(15&l)<<12|(63&a)<<6|63&o)<=2047||c>=55296&&c<=57343)&&(c=null)):4===u&&(a=t[i+1],o=t[i+2],s=t[i+3],128==(192&a)&&128==(192&o)&&128==(192&s)&&((c=(15&l)<<18|(63&a)<<12|(63&o)<<6|63&s)<=65535||c>=1114112)&&(c=null)),null===c?(c=65533,u=1):c>65535&&(c-=65536,n+=String.fromCharCode(c>>>10&1023|55296),c=56320|1023&c),n+=String.fromCharCode(c),i+=u}return n}(this.buf,e,t)},readBytes:function(){var t=this.readVarint()+this.pos,e=this.buf.subarray(this.pos,t);return this.pos=t,e},readPackedVarint:function(t,e){if(this.type!==wc.Bytes)return t.push(this.readVarint(e));var r=Mc(this);for(t=t||[];this.pos127;);else if(e===wc.Bytes)this.pos=this.readVarint()+this.pos;else if(e===wc.Fixed32)this.pos+=4;else{if(e!==wc.Fixed64)throw new Error(\"Unimplemented type: \"+e);this.pos+=8}},writeTag:function(t,e){this.writeVarint(t<<3|e)},realloc:function(t){for(var e=this.length||16;e268435455||t<0?function(t,e){var r,n;if(t>=0?(r=t%4294967296|0,n=t/4294967296|0):(n=~(-t/4294967296),4294967295^(r=~(-t%4294967296))?r=r+1|0:(r=0,n=n+1|0)),t>=0x10000000000000000||t<-0x10000000000000000)throw new Error(\"Given varint doesn't fit into 10 bytes\");e.realloc(10),function(t,e,r){r.buf[r.pos++]=127&t|128,t>>>=7,r.buf[r.pos++]=127&t|128,t>>>=7,r.buf[r.pos++]=127&t|128,t>>>=7,r.buf[r.pos++]=127&t|128,t>>>=7,r.buf[r.pos]=127&t}(r,0,e),function(t,e){var r=(7&t)<<4;e.buf[e.pos++]|=r|((t>>>=3)?128:0),t&&(e.buf[e.pos++]=127&t|((t>>>=7)?128:0),t&&(e.buf[e.pos++]=127&t|((t>>>=7)?128:0),t&&(e.buf[e.pos++]=127&t|((t>>>=7)?128:0),t&&(e.buf[e.pos++]=127&t|((t>>>=7)?128:0),t&&(e.buf[e.pos++]=127&t)))))}(n,e)}(t,this):(this.realloc(4),this.buf[this.pos++]=127&t|(t>127?128:0),t<=127||(this.buf[this.pos++]=127&(t>>>=7)|(t>127?128:0),t<=127||(this.buf[this.pos++]=127&(t>>>=7)|(t>127?128:0),t<=127||(this.buf[this.pos++]=t>>>7&127))))},writeSVarint:function(t){this.writeVarint(t<0?2*-t-1:2*t)},writeBoolean:function(t){this.writeVarint(Boolean(t))},writeString:function(t){t=String(t),this.realloc(4*t.length),this.pos++;var e=this.pos;this.pos=function(t,e,r){for(var n,i,a=0;a55295&&n<57344){if(!i){n>56319||a+1===e.length?(t[r++]=239,t[r++]=191,t[r++]=189):i=n;continue}if(n<56320){t[r++]=239,t[r++]=191,t[r++]=189,i=n;continue}n=i-55296<<10|n-56320|65536,i=null}else i&&(t[r++]=239,t[r++]=191,t[r++]=189,i=null);n<128?t[r++]=n:(n<2048?t[r++]=n>>6|192:(n<65536?t[r++]=n>>12|224:(t[r++]=n>>18|240,t[r++]=n>>12&63|128),t[r++]=n>>6&63|128),t[r++]=63&n|128)}return r}(this.buf,t,this.pos);var r=this.pos-e;r>=128&&Ec(e,r,this),this.pos=e-1,this.writeVarint(r),this.pos+=r},writeFloat:function(t){this.realloc(4),bc.write(this.buf,t,this.pos,!0,23,4),this.pos+=4},writeDouble:function(t){this.realloc(8),bc.write(this.buf,t,this.pos,!0,52,8),this.pos+=8},writeBytes:function(t){var e=t.length;this.writeVarint(e),this.realloc(e);for(var r=0;r=128&&Ec(r,n,this),this.pos=r-1,this.writeVarint(n),this.pos+=n},writeMessage:function(t,e,r){this.writeTag(t,wc.Bytes),this.writeRawMessage(e,r)},writePackedVarint:function(t,e){e.length&&this.writeMessage(t,Cc,e)},writePackedSVarint:function(t,e){e.length&&this.writeMessage(t,Lc,e)},writePackedBoolean:function(t,e){e.length&&this.writeMessage(t,zc,e)},writePackedFloat:function(t,e){e.length&&this.writeMessage(t,Ic,e)},writePackedDouble:function(t,e){e.length&&this.writeMessage(t,Pc,e)},writePackedFixed32:function(t,e){e.length&&this.writeMessage(t,Oc,e)},writePackedSFixed32:function(t,e){e.length&&this.writeMessage(t,Dc,e)},writePackedFixed64:function(t,e){e.length&&this.writeMessage(t,Rc,e)},writePackedSFixed64:function(t,e){e.length&&this.writeMessage(t,Fc,e)},writeBytesField:function(t,e){this.writeTag(t,wc.Bytes),this.writeBytes(e)},writeFixed32Field:function(t,e){this.writeTag(t,wc.Fixed32),this.writeFixed32(e)},writeSFixed32Field:function(t,e){this.writeTag(t,wc.Fixed32),this.writeSFixed32(e)},writeFixed64Field:function(t,e){this.writeTag(t,wc.Fixed64),this.writeFixed64(e)},writeSFixed64Field:function(t,e){this.writeTag(t,wc.Fixed64),this.writeSFixed64(e)},writeVarintField:function(t,e){this.writeTag(t,wc.Varint),this.writeVarint(e)},writeSVarintField:function(t,e){this.writeTag(t,wc.Varint),this.writeSVarint(e)},writeStringField:function(t,e){this.writeTag(t,wc.Bytes),this.writeString(e)},writeFloatField:function(t,e){this.writeTag(t,wc.Fixed32),this.writeFloat(e)},writeDoubleField:function(t,e){this.writeTag(t,wc.Fixed64),this.writeDouble(e)},writeBooleanField:function(t,e){this.writeVarintField(t,Boolean(e))}};var Uc=r(_c);const Vc=3;function qc(t,e,r){1===t&&r.readMessage(Hc,e)}function Hc(t,e,r){if(3===t){const{id:t,bitmap:n,width:i,height:a,left:o,top:s,advance:l}=r.readMessage(Gc,{});e.push({id:t,bitmap:new Cs({width:i+2*Vc,height:a+2*Vc},n),metrics:{width:i,height:a,left:o,top:s,advance:l}})}}function Gc(t,e,r){1===t?e.id=r.readVarint():2===t?e.bitmap=r.readBytes():3===t?e.width=r.readVarint():4===t?e.height=r.readVarint():5===t?e.left=r.readSVarint():6===t?e.top=r.readSVarint():7===t&&(e.advance=r.readVarint())}const Zc=Vc;function Wc(t){let e=0,r=0;for(const n of t)e+=n.w*n.h,r=Math.max(r,n.w);t.sort(((t,e)=>e.h-t.h));const n=[{x:0,y:0,w:Math.max(Math.ceil(Math.sqrt(e/.95)),r),h:1/0}];let i=0,a=0;for(const e of t)for(let t=n.length-1;t>=0;t--){const r=n[t];if(!(e.w>r.w||e.h>r.h)){if(e.x=r.x,e.y=r.y,a=Math.max(a,e.y+e.h),i=Math.max(i,e.x+e.w),e.w===r.w&&e.h===r.h){const e=n.pop();t=0&&r>=t&&ru[this.text.charCodeAt(r)];r--)e--;this.text=this.text.substring(t,e),this.sectionIndex=this.sectionIndex.slice(t,e)}substring(t,e){const r=new tu;return r.text=this.text.substring(t,e),r.sectionIndex=this.sectionIndex.slice(t,e),r.sections=this.sections,r}toString(){return this.text}getMaxScale(){return this.sectionIndex.reduce(((t,e)=>Math.max(t,this.sections[e].scale)),0)}addTextSection(t,e){this.text+=t.text,this.sections.push(Qc.forText(t.scale,t.fontStack||e));const r=this.sections.length-1;for(let e=0;e=63743?null:++this.imageSectionID:(this.imageSectionID=57344,this.imageSectionID)}}function eu(e,r,n,i,a,o,s,l,c,u,h,f,p,d,m){const g=tu.fromFeature(e,a);let y;f===t.ai.vertical&&g.verticalizePunctuation();const{processBidirectionalText:v,processStyledBidirectionalText:x}=qi;if(v&&1===g.sections.length){y=[];const t=v(g.toString(),uu(g,u,o,r,i,d));for(const e of t){const t=new tu;t.text=e,t.sections=g.sections;for(let r=0;r0&&n>b&&(b=n)}else{const t=n[m.fontStack],e=t&&t[y];if(e&&e.rect)w=e.rect,x=e.metrics;else{const t=r[m.fontStack],e=t&&t[y];if(!e)continue;x=e.metrics}v=(a-m.scale)*xc}A?(e.verticalizable=!0,_.push({glyph:y,imageName:T,x:p,y:d+v,vertical:A,scale:m.scale,fontStack:m.fontStack,sectionIndex:g,metrics:x,rect:w}),p+=k*m.scale+u):(_.push({glyph:y,imageName:T,x:p,y:d+v,vertical:A,scale:m.scale,fontStack:m.fontStack,sectionIndex:g,metrics:x,rect:w}),p+=x.advance*m.scale+u)}if(0!==_.length){const t=p-u;m=Math.max(t,m),fu(_,0,_.length-1,y,b)}p=0;const w=o*a+b;x.lineOffset=Math.max(b,l),d+=w,g=Math.max(w,g),++v}const x=d-Kc,{horizontalAlign:_,verticalAlign:b}=hu(s);(function(t,e,r,n,i,a,o,s,l){const c=(e-r)*i;let u=0;u=a!==o?-s*n-Kc:(-n*l+.5)*o;for(const e of t)for(const t of e.positionedGlyphs)t.x+=c,t.y+=u})(e.positionedLines,y,_,b,m,g,o,x,a.length),e.top+=-b*x,e.bottom=e.top+x,e.left+=-_*m,e.right=e.left+m}(b,r,n,i,y,s,l,c,f,u,p,m),!function(t){for(const e of t)if(0!==e.positionedGlyphs.length)return!1;return!0}(_)&&b}const ru={9:!0,10:!0,11:!0,12:!0,13:!0,32:!0},nu={10:!0,32:!0,38:!0,41:!0,43:!0,45:!0,47:!0,173:!0,183:!0,8203:!0,8208:!0,8211:!0,8231:!0},iu={40:!0};function au(t,e,r,n,i,a){if(e.imageName){const t=n[e.imageName];return t?t.displaySize[0]*e.scale*xc/a+i:0}{const n=r[e.fontStack],a=n&&n[t];return a?a.metrics.advance*e.scale+i:0}}function ou(t,e,r,n){const i=Math.pow(t-e,2);return n?t=0;let c=0;for(let r=0;rh){const t=Math.ceil(a/h);i*=t/o,o=t}return{x1:n,y1:i,x2:n+a,y2:i+o}}function mu(t,e,r,n,i,a){const o=t.image;let s;if(o.content){const t=o.content,e=o.pixelRatio||1;s=[t[0]/e,t[1]/e,o.displaySize[0]-t[2]/e,o.displaySize[1]-t[3]/e]}const l=e.left*a,c=e.right*a;let u,h,f,p;\"width\"===r||\"both\"===r?(p=i[0]+l-n[3],h=i[0]+c+n[1]):(p=i[0]+(l+c-o.displaySize[0])/2,h=p+o.displaySize[0]);const d=e.top*a,m=e.bottom*a;return\"height\"===r||\"both\"===r?(u=i[1]+d-n[0],f=i[1]+m+n[2]):(u=i[1]+(d+m-o.displaySize[1])/2,f=u+o.displaySize[1]),{image:o,top:u,right:h,bottom:f,left:p,collisionPadding:s}}const gu=255,yu=128,vu=gu*yu;function xu(t,e){const{expression:r}=e;if(\"constant\"===r.kind)return{kind:\"constant\",layoutSize:r.evaluate(new Hi(t+1))};if(\"source\"===r.kind)return{kind:\"source\"};{const{zoomStops:e,interpolationType:n}=r;let i=0;for(;it.id)),this.index=e.index,this.pixelRatio=e.pixelRatio,this.sourceLayerIndex=e.sourceLayerIndex,this.hasPattern=!1,this.hasRTLText=!1,this.sortKeyRanges=[],this.collisionCircleArray=[],this.placementInvProjMatrix=ps([]),this.placementViewportMatrix=ps([]);const r=this.layers[0]._unevaluatedLayout._values;this.textSizeData=xu(this.zoom,r[\"text-size\"]),this.iconSizeData=xu(this.zoom,r[\"icon-size\"]);const n=this.layers[0].layout,i=n.get(\"symbol-sort-key\"),a=n.get(\"symbol-z-order\");this.canOverlap=\"never\"!==_u(n,\"text-overlap\",\"text-allow-overlap\")||\"never\"!==_u(n,\"icon-overlap\",\"icon-allow-overlap\")||n.get(\"text-ignore-placement\")||n.get(\"icon-ignore-placement\"),this.sortFeaturesByKey=\"viewport-y\"!==a&&!i.isConstant();const o=\"viewport-y\"===a||\"auto\"===a&&!this.sortFeaturesByKey;this.sortFeaturesByY=o&&this.canOverlap,\"point\"===n.get(\"symbol-placement\")&&(this.writingModes=n.get(\"text-writing-mode\").map((e=>t.ai[e]))),this.stateDependentLayerIds=this.layers.filter((t=>t.isStateDependent())).map((t=>t.id)),this.sourceID=e.sourceID}createArrays(){this.text=new Mu(new Bo(this.layers,this.zoom,(t=>/^text/.test(t)))),this.icon=new Mu(new Bo(this.layers,this.zoom,(t=>/^icon/.test(t)))),this.glyphOffsetArray=new Ua,this.lineVertexArray=new Va,this.symbolInstances=new ja,this.textAnchorOffsets=new Ha}calculateGlyphDependencies(t,e,r,n,i){for(let a=0;a0)&&(\"constant\"!==o.value.kind||o.value.value.length>0),u=\"constant\"!==l.value.kind||!!l.value.value||Object.keys(l.parameters).length>0,h=a.get(\"symbol-sort-key\");if(this.features=[],!c&&!u)return;const f=r.iconDependencies,p=r.glyphDependencies,d=r.availableImages,m=new Hi(this.zoom);for(const{feature:r,id:s,index:l,sourceLayerIndex:g}of e){const e=i._featureFilter.needGeometry,y=Go(r,e);if(!i._featureFilter.filter(m,y,n))continue;let v,x;if(e||(y.geometry=Ho(r)),c){const t=i.getValueAndResolveTokens(\"text-field\",y,n,d),e=Kt.factory(t),r=this.hasRTLText=this.hasRTLText||Au(e);(!r||\"unavailable\"===qi.getRTLTextPluginStatus()||r&&qi.isParsed())&&(v=yc(e,i,y))}if(u){const t=i.getValueAndResolveTokens(\"icon-image\",y,n,d);x=t instanceof re?t:re.fromString(t)}if(!v&&!x)continue;const _=this.sortFeaturesByKey?h.evaluate(y,{},n):void 0,b={id:s,text:v,icon:x,index:l,sourceLayerIndex:g,geometry:y.geometry,properties:r.properties,type:bu[r.type],sortKey:_};if(this.features.push(b),x&&(f[x.name]=!0),v){const e=o.evaluate(y,{},n).join(\",\"),r=\"viewport\"!==a.get(\"text-rotation-alignment\")&&\"point\"!==a.get(\"symbol-placement\");this.allowVerticalPlacement=this.writingModes&&this.writingModes.indexOf(t.ai.vertical)>=0;for(const t of v.sections)if(t.image)f[t.image.name]=!0;else{const n=Oi(v.toString()),i=t.fontStack||e,a=p[i]=p[i]||{};this.calculateGlyphDependencies(t.text,a,r,this.allowVerticalPlacement,n)}}}\"line\"===a.get(\"symbol-placement\")&&(this.features=function(t){const e={},r={},n=[];let i=0;function a(e){n.push(t[e]),i++}function o(t,e,i){const a=r[t];return delete r[t],r[e]=a,n[a].geometry[0].pop(),n[a].geometry[0]=n[a].geometry[0].concat(i[0]),a}function s(t,r,i){const a=e[r];return delete e[r],e[t]=a,n[a].geometry[0].shift(),n[a].geometry[0]=i[0].concat(n[a].geometry[0]),a}function l(t,e,r){const n=r?e[0][e[0].length-1]:e[0][0];return`${t}:${n.x}:${n.y}`}for(let c=0;ct.geometry))}(this.features)),this.sortFeaturesByKey&&this.features.sort(((t,e)=>t.sortKey-e.sortKey))}update(t,e,r){this.stateDependentLayers.length&&(this.text.programConfigurations.updatePaintArrays(t,e,this.layers,r),this.icon.programConfigurations.updatePaintArrays(t,e,this.layers,r))}isEmpty(){return 0===this.symbolInstances.length&&!this.hasRTLText}uploadPending(){return!this.uploaded||this.text.programConfigurations.needsUpload||this.icon.programConfigurations.needsUpload}upload(t){!this.uploaded&&this.hasDebugData()&&(this.textCollisionBox.upload(t),this.iconCollisionBox.upload(t)),this.text.upload(t,this.sortFeaturesByY,!this.uploaded,this.text.programConfigurations.needsUpload),this.icon.upload(t,this.sortFeaturesByY,!this.uploaded,this.icon.programConfigurations.needsUpload),this.uploaded=!0}destroyDebugData(){this.textCollisionBox.destroy(),this.iconCollisionBox.destroy()}destroy(){this.text.destroy(),this.icon.destroy(),this.hasDebugData()&&this.destroyDebugData()}addToLineVertexArray(t,e){const r=this.lineVertexArray.length;if(void 0!==t.segment){let r=t.dist(e[t.segment+1]),n=t.dist(e[t.segment]);const i={};for(let n=t.segment+1;n=0;r--)i[r]={x:e[r].x,y:e[r].y,tileUnitDistanceFromAnchor:n},r>0&&(n+=e[r-1].dist(e[r]));for(let t=0;t0}hasIconData(){return this.icon.segments.get().length>0}hasDebugData(){return this.textCollisionBox&&this.iconCollisionBox}hasTextCollisionBoxData(){return this.hasDebugData()&&this.textCollisionBox.segments.get().length>0}hasIconCollisionBoxData(){return this.hasDebugData()&&this.iconCollisionBox.segments.get().length>0}addIndicesForPlacedSymbol(t,e){const r=t.placedSymbolArray.get(e),n=r.vertexStartIndex+4*r.numGlyphs;for(let e=r.vertexStartIndex;en[t]-n[e]||i[e]-i[t])),a}addToSortKeyRanges(t,e){const r=this.sortKeyRanges[this.sortKeyRanges.length-1];r&&r.sortKey===e?r.symbolInstanceEnd=t+1:this.sortKeyRanges.push({sortKey:e,symbolInstanceStart:t,symbolInstanceEnd:t+1})}sortFeatures(t){if(this.sortFeaturesByY&&this.sortedAngle!==t&&!(this.text.segments.get().length>1||this.icon.segments.get().length>1)){this.symbolInstanceIndexes=this.getSortedSymbolIndexes(t),this.sortedAngle=t,this.text.indexArray.clear(),this.icon.indexArray.clear(),this.featureSortOrder=[];for(const t of this.symbolInstanceIndexes){const e=this.symbolInstances.get(t);this.featureSortOrder.push(e.featureIndex),[e.rightJustifiedTextSymbolIndex,e.centerJustifiedTextSymbolIndex,e.leftJustifiedTextSymbolIndex].forEach(((t,e,r)=>{t>=0&&r.indexOf(t)===e&&this.addIndicesForPlacedSymbol(this.text,t)})),e.verticalPlacedTextSymbolIndex>=0&&this.addIndicesForPlacedSymbol(this.text,e.verticalPlacedTextSymbolIndex),e.placedIconSymbolIndex>=0&&this.addIndicesForPlacedSymbol(this.icon,e.placedIconSymbolIndex),e.verticalPlacedIconSymbolIndex>=0&&this.addIndicesForPlacedSymbol(this.icon,e.verticalPlacedIconSymbolIndex)}this.text.indexBuffer&&this.text.indexBuffer.updateData(this.text.indexArray),this.icon.indexBuffer&&this.icon.indexBuffer.updateData(this.icon.indexArray)}}}let Cu;Mi(\"SymbolBucket\",Eu,{omit:[\"layers\",\"collisionBoxArray\",\"features\",\"compareText\"]}),Eu.MAX_GLYPHS=65535,Eu.addDynamicAttributes=ku;let Lu;var Iu={get paint(){return Lu=Lu||new ia({\"icon-opacity\":new ta(Z.paint_symbol[\"icon-opacity\"]),\"icon-color\":new ta(Z.paint_symbol[\"icon-color\"]),\"icon-halo-color\":new ta(Z.paint_symbol[\"icon-halo-color\"]),\"icon-halo-width\":new ta(Z.paint_symbol[\"icon-halo-width\"]),\"icon-halo-blur\":new ta(Z.paint_symbol[\"icon-halo-blur\"]),\"icon-translate\":new Qi(Z.paint_symbol[\"icon-translate\"]),\"icon-translate-anchor\":new Qi(Z.paint_symbol[\"icon-translate-anchor\"]),\"text-opacity\":new ta(Z.paint_symbol[\"text-opacity\"]),\"text-color\":new ta(Z.paint_symbol[\"text-color\"],{runtimeType:ft,getOverride:t=>t.textColor,hasOverride:t=>!!t.textColor}),\"text-halo-color\":new ta(Z.paint_symbol[\"text-halo-color\"]),\"text-halo-width\":new ta(Z.paint_symbol[\"text-halo-width\"]),\"text-halo-blur\":new ta(Z.paint_symbol[\"text-halo-blur\"]),\"text-translate\":new Qi(Z.paint_symbol[\"text-translate\"]),\"text-translate-anchor\":new Qi(Z.paint_symbol[\"text-translate-anchor\"])})},get layout(){return Cu=Cu||new ia({\"symbol-placement\":new Qi(Z.layout_symbol[\"symbol-placement\"]),\"symbol-spacing\":new Qi(Z.layout_symbol[\"symbol-spacing\"]),\"symbol-avoid-edges\":new Qi(Z.layout_symbol[\"symbol-avoid-edges\"]),\"symbol-sort-key\":new ta(Z.layout_symbol[\"symbol-sort-key\"]),\"symbol-z-order\":new Qi(Z.layout_symbol[\"symbol-z-order\"]),\"icon-allow-overlap\":new Qi(Z.layout_symbol[\"icon-allow-overlap\"]),\"icon-overlap\":new Qi(Z.layout_symbol[\"icon-overlap\"]),\"icon-ignore-placement\":new Qi(Z.layout_symbol[\"icon-ignore-placement\"]),\"icon-optional\":new Qi(Z.layout_symbol[\"icon-optional\"]),\"icon-rotation-alignment\":new Qi(Z.layout_symbol[\"icon-rotation-alignment\"]),\"icon-size\":new ta(Z.layout_symbol[\"icon-size\"]),\"icon-text-fit\":new Qi(Z.layout_symbol[\"icon-text-fit\"]),\"icon-text-fit-padding\":new Qi(Z.layout_symbol[\"icon-text-fit-padding\"]),\"icon-image\":new ta(Z.layout_symbol[\"icon-image\"]),\"icon-rotate\":new ta(Z.layout_symbol[\"icon-rotate\"]),\"icon-padding\":new ta(Z.layout_symbol[\"icon-padding\"]),\"icon-keep-upright\":new Qi(Z.layout_symbol[\"icon-keep-upright\"]),\"icon-offset\":new ta(Z.layout_symbol[\"icon-offset\"]),\"icon-anchor\":new ta(Z.layout_symbol[\"icon-anchor\"]),\"icon-pitch-alignment\":new Qi(Z.layout_symbol[\"icon-pitch-alignment\"]),\"text-pitch-alignment\":new Qi(Z.layout_symbol[\"text-pitch-alignment\"]),\"text-rotation-alignment\":new Qi(Z.layout_symbol[\"text-rotation-alignment\"]),\"text-field\":new ta(Z.layout_symbol[\"text-field\"]),\"text-font\":new ta(Z.layout_symbol[\"text-font\"]),\"text-size\":new ta(Z.layout_symbol[\"text-size\"]),\"text-max-width\":new ta(Z.layout_symbol[\"text-max-width\"]),\"text-line-height\":new Qi(Z.layout_symbol[\"text-line-height\"]),\"text-letter-spacing\":new ta(Z.layout_symbol[\"text-letter-spacing\"]),\"text-justify\":new ta(Z.layout_symbol[\"text-justify\"]),\"text-radial-offset\":new ta(Z.layout_symbol[\"text-radial-offset\"]),\"text-variable-anchor\":new Qi(Z.layout_symbol[\"text-variable-anchor\"]),\"text-variable-anchor-offset\":new ta(Z.layout_symbol[\"text-variable-anchor-offset\"]),\"text-anchor\":new ta(Z.layout_symbol[\"text-anchor\"]),\"text-max-angle\":new Qi(Z.layout_symbol[\"text-max-angle\"]),\"text-writing-mode\":new Qi(Z.layout_symbol[\"text-writing-mode\"]),\"text-rotate\":new ta(Z.layout_symbol[\"text-rotate\"]),\"text-padding\":new Qi(Z.layout_symbol[\"text-padding\"]),\"text-keep-upright\":new Qi(Z.layout_symbol[\"text-keep-upright\"]),\"text-transform\":new ta(Z.layout_symbol[\"text-transform\"]),\"text-offset\":new ta(Z.layout_symbol[\"text-offset\"]),\"text-allow-overlap\":new Qi(Z.layout_symbol[\"text-allow-overlap\"]),\"text-overlap\":new Qi(Z.layout_symbol[\"text-overlap\"]),\"text-ignore-placement\":new Qi(Z.layout_symbol[\"text-ignore-placement\"]),\"text-optional\":new Qi(Z.layout_symbol[\"text-optional\"])})}};class Pu{constructor(t){if(void 0===t.property.overrides)throw new Error(\"overrides must be provided to instantiate FormatSectionOverride class\");this.type=t.property.overrides?t.property.overrides.runtimeType:lt,this.defaultValue=t}evaluate(t){if(t.formattedSection){const e=this.defaultValue.property.overrides;if(e&&e.hasOverride(t.formattedSection))return e.getOverride(t.formattedSection)}return t.feature&&t.featureState?this.defaultValue.evaluate(t.feature,t.featureState):this.defaultValue.property.specification.default}eachChild(t){this.defaultValue.isConstant()||t(this.defaultValue.value._styleExpression.expression)}outputDefined(){return!1}serialize(){return null}}Mi(\"FormatSectionOverride\",Pu,{omit:[\"defaultValue\"]});class zu extends oa{constructor(t){super(t,Iu)}recalculate(t,e){if(super.recalculate(t,e),\"auto\"===this.layout.get(\"icon-rotation-alignment\")&&(\"point\"!==this.layout.get(\"symbol-placement\")?this.layout._values[\"icon-rotation-alignment\"]=\"map\":this.layout._values[\"icon-rotation-alignment\"]=\"viewport\"),\"auto\"===this.layout.get(\"text-rotation-alignment\")&&(\"point\"!==this.layout.get(\"symbol-placement\")?this.layout._values[\"text-rotation-alignment\"]=\"map\":this.layout._values[\"text-rotation-alignment\"]=\"viewport\"),\"auto\"===this.layout.get(\"text-pitch-alignment\")&&(this.layout._values[\"text-pitch-alignment\"]=\"map\"===this.layout.get(\"text-rotation-alignment\")?\"map\":\"viewport\"),\"auto\"===this.layout.get(\"icon-pitch-alignment\")&&(this.layout._values[\"icon-pitch-alignment\"]=this.layout.get(\"icon-rotation-alignment\")),\"point\"===this.layout.get(\"symbol-placement\")){const t=this.layout.get(\"text-writing-mode\");if(t){const e=[];for(const r of t)e.indexOf(r)<0&&e.push(r);this.layout._values[\"text-writing-mode\"]=e}else this.layout._values[\"text-writing-mode\"]=[\"horizontal\"]}this._setPaintOverrides()}getValueAndResolveTokens(t,e,r,n){const i=this.layout.get(t).evaluate(e,{},r,n),a=this._unevaluatedLayout._values[t];return a.isDataDriven()||kn(a.value)||!i?i:function(t,e){return e.replace(/{([^{}]+)}/g,((e,r)=>t&&r in t?String(t[r]):\"\"))}(e.properties,i)}createBucket(t){return new Eu(t)}queryRadius(){return 0}queryIntersectsFeature(){throw new Error(\"Should take a different path in FeatureIndex\")}_setPaintOverrides(){for(const t of Iu.paint.overridableProperties){if(!zu.hasPaintOverride(this.layout,t))continue;const e=this.paint.get(t),r=new Pu(e),n=new Tn(r,e.property.specification);let i=null;i=\"constant\"===e.value.kind||\"source\"===e.value.kind?new Mn(\"source\",n):new Sn(\"composite\",n,e.value.zoomStops),this.paint._values[t]=new Ji(e.property,i,e.parameters)}}_handleOverridablePaintPropertyUpdate(t,e,r){return!(!this.layout||e.isDataDriven()||r.isDataDriven())&&zu.hasPaintOverride(this.layout,t)}static hasPaintOverride(t,e){const r=t.get(\"text-field\"),n=Iu.paint.properties[e];let i=!1;const a=t=>{for(const e of t)if(n.overrides&&n.overrides.hasOverride(e))return void(i=!0)};if(\"constant\"===r.value.kind&&r.value.value instanceof Kt)a(r.value.value.sections);else if(\"source\"===r.value.kind){const t=e=>{if(!i)if(e instanceof se&&ae(e.value)===gt){const t=e.value;a(t.sections)}else e instanceof We?a(e.sections):e.eachChild(t)},e=r.value;e._styleExpression&&t(e._styleExpression.expression)}return i}}let Ou;var Du={get paint(){return Ou=Ou||new ia({\"background-color\":new Qi(Z.paint_background[\"background-color\"]),\"background-pattern\":new ra(Z.paint_background[\"background-pattern\"]),\"background-opacity\":new Qi(Z.paint_background[\"background-opacity\"])})}};class Ru extends oa{constructor(t){super(t,Du)}}let Fu;var Bu={get paint(){return Fu=Fu||new ia({\"raster-opacity\":new Qi(Z.paint_raster[\"raster-opacity\"]),\"raster-hue-rotate\":new Qi(Z.paint_raster[\"raster-hue-rotate\"]),\"raster-brightness-min\":new Qi(Z.paint_raster[\"raster-brightness-min\"]),\"raster-brightness-max\":new Qi(Z.paint_raster[\"raster-brightness-max\"]),\"raster-saturation\":new Qi(Z.paint_raster[\"raster-saturation\"]),\"raster-contrast\":new Qi(Z.paint_raster[\"raster-contrast\"]),\"raster-resampling\":new Qi(Z.paint_raster[\"raster-resampling\"]),\"raster-fade-duration\":new Qi(Z.paint_raster[\"raster-fade-duration\"])})}};class Nu extends oa{constructor(t){super(t,Bu)}}class ju extends oa{constructor(t){super(t,{}),this.onAdd=t=>{this.implementation.onAdd&&this.implementation.onAdd(t,t.painter.context.gl)},this.onRemove=t=>{this.implementation.onRemove&&this.implementation.onRemove(t,t.painter.context.gl)},this.implementation=t}is3D(){return\"3d\"===this.implementation.renderingMode}hasOffscreenPass(){return void 0!==this.implementation.prerender}recalculate(){}updateTransitions(){}hasTransition(){return!1}serialize(){throw new Error(\"Custom layers cannot be serialized\")}}class Uu{constructor(t){this._methodToThrottle=t,this._triggered=!1,\"undefined\"!=typeof MessageChannel&&(this._channel=new MessageChannel,this._channel.port2.onmessage=()=>{this._triggered=!1,this._methodToThrottle()})}trigger(){this._triggered||(this._triggered=!0,this._channel?this._channel.port1.postMessage(!0):setTimeout((()=>{this._triggered=!1,this._methodToThrottle()}),0))}remove(){delete this._channel,this._methodToThrottle=()=>{}}}const Vu=6371008.8;class qu{constructor(t,e){if(isNaN(t)||isNaN(e))throw new Error(`Invalid LngLat object: (${t}, ${e})`);if(this.lng=+t,this.lat=+e,this.lat>90||this.lat<-90)throw new Error(\"Invalid LngLat latitude value: must be between -90 and 90\")}wrap(){return new qu(g(this.lng,-180,180),this.lat)}toArray(){return[this.lng,this.lat]}toString(){return`LngLat(${this.lng}, ${this.lat})`}distanceTo(t){const e=Math.PI/180,r=this.lat*e,n=t.lat*e,i=Math.sin(r)*Math.sin(n)+Math.cos(r)*Math.cos(n)*Math.cos((t.lng-this.lng)*e);return Vu*Math.acos(Math.min(i,1))}static convert(t){if(t instanceof qu)return t;if(Array.isArray(t)&&(2===t.length||3===t.length))return new qu(Number(t[0]),Number(t[1]));if(!Array.isArray(t)&&\"object\"==typeof t&&null!==t)return new qu(Number(\"lng\"in t?t.lng:t.lon),Number(t.lat));throw new Error(\"`LngLatLike` argument must be specified as a LngLat instance, an object {lng: , lat: }, an object {lon: , lat: }, or an array of [, ]\")}}const Hu=2*Math.PI*Vu;function Gu(t){return Hu*Math.cos(t*Math.PI/180)}function Zu(t){return(180+t)/360}function Wu(t){return(180-180/Math.PI*Math.log(Math.tan(Math.PI/4+t*Math.PI/360)))/360}function Yu(t,e){return t/Gu(e)}function Xu(t){const e=180-360*t;return 360/Math.PI*Math.atan(Math.exp(e*Math.PI/180))-90}class $u{constructor(t,e,r=0){this.x=+t,this.y=+e,this.z=+r}static fromLngLat(t,e=0){const r=qu.convert(t);return new $u(Zu(r.lng),Wu(r.lat),Yu(e,r.lat))}toLngLat(){return new qu(360*this.x-180,Xu(this.y))}toAltitude(){return t=this.z,e=this.y,t*Gu(Xu(e));var t,e}meterInMercatorCoordinateUnits(){return 1/Hu*(t=Xu(this.y),1/Math.cos(t*Math.PI/180));var t}}function Ju(t,e,r){var n=2*Math.PI*6378137/256/Math.pow(2,r);return[t*n-2*Math.PI*6378137/2,e*n-2*Math.PI*6378137/2]}class Ku{constructor(t,e,r){if(t<0||t>25||r<0||r>=Math.pow(2,t)||e<0||e>=Math.pow(2,t))throw new Error(`x=${e}, y=${r}, z=${t} outside of bounds. 0<=x<${Math.pow(2,t)}, 0<=y<${Math.pow(2,t)} 0<=z<=25 `);this.z=t,this.x=e,this.y=r,this.key=eh(0,t,t,e,r)}equals(t){return this.z===t.z&&this.x===t.x&&this.y===t.y}url(t,e,r){const n=(a=this.x,o=this.y,s=this.z,l=Ju(256*a,256*(o=Math.pow(2,s)-o-1),s),c=Ju(256*(a+1),256*(o+1),s),l[0]+\",\"+l[1]+\",\"+c[0]+\",\"+c[1]),i=function(t,e,r){let n,i=\"\";for(let a=t;a>0;a--)n=1<1?\"@2x\":\"\").replace(/{quadkey}/g,i).replace(/{bbox-epsg-3857}/g,n)}isChildOf(t){const e=this.z-t.z;return e>0&&t.x===this.x>>e&&t.y===this.y>>e}getTilePoint(t){const e=Math.pow(2,this.z);return new a((t.x*e-this.x)*Uo,(t.y*e-this.y)*Uo)}toString(){return`${this.z}/${this.x}/${this.y}`}}class Qu{constructor(t,e){this.wrap=t,this.canonical=e,this.key=eh(t,e.z,e.z,e.x,e.y)}}class th{constructor(t,e,r,n,i){if(t= z; overscaledZ = ${t}; z = ${r}`);this.overscaledZ=t,this.wrap=e,this.canonical=new Ku(r,+n,+i),this.key=eh(e,t,r,n,i)}clone(){return new th(this.overscaledZ,this.wrap,this.canonical.z,this.canonical.x,this.canonical.y)}equals(t){return this.overscaledZ===t.overscaledZ&&this.wrap===t.wrap&&this.canonical.equals(t.canonical)}scaledTo(t){if(t>this.overscaledZ)throw new Error(`targetZ > this.overscaledZ; targetZ = ${t}; overscaledZ = ${this.overscaledZ}`);const e=this.canonical.z-t;return t>this.canonical.z?new th(t,this.wrap,this.canonical.z,this.canonical.x,this.canonical.y):new th(t,this.wrap,t,this.canonical.x>>e,this.canonical.y>>e)}calculateScaledKey(t,e){if(t>this.overscaledZ)throw new Error(`targetZ > this.overscaledZ; targetZ = ${t}; overscaledZ = ${this.overscaledZ}`);const r=this.canonical.z-t;return t>this.canonical.z?eh(this.wrap*+e,t,this.canonical.z,this.canonical.x,this.canonical.y):eh(this.wrap*+e,t,t,this.canonical.x>>r,this.canonical.y>>r)}isChildOf(t){if(t.wrap!==this.wrap)return!1;const e=this.canonical.z-t.canonical.z;return 0===t.overscaledZ||t.overscaledZ>e&&t.canonical.y===this.canonical.y>>e}children(t){if(this.overscaledZ>=t)return[new th(this.overscaledZ+1,this.wrap,this.canonical.z,this.canonical.x,this.canonical.y)];const e=this.canonical.z+1,r=2*this.canonical.x,n=2*this.canonical.y;return[new th(e,this.wrap,e,r,n),new th(e,this.wrap,e,r+1,n),new th(e,this.wrap,e,r,n+1),new th(e,this.wrap,e,r+1,n+1)]}isLessThan(t){return this.wrapt.wrap)&&(this.overscaledZt.overscaledZ)&&(this.canonical.xt.canonical.x)&&this.canonical.ythis.max&&(this.max=r),r=this.dim+1||e<-1||e>=this.dim+1)throw new RangeError(\"out of range source coordinates for DEM data\");return(e+1)*this.stride+(t+1)}unpack(t,e,r){return t*this.redFactor+e*this.greenFactor+r*this.blueFactor-this.baseShift}getPixels(){return new Ls({width:this.stride,height:this.stride},new Uint8Array(this.data.buffer))}backfillBorder(t,e,r){if(this.dim!==t.dim)throw new Error(\"dem dimension mismatch\");let n=e*this.dim,i=e*this.dim+this.dim,a=r*this.dim,o=r*this.dim+this.dim;switch(e){case-1:n=i-1;break;case 1:i=n+1}switch(r){case-1:a=o-1;break;case 1:o=a+1}const s=-e*this.dim,l=-r*this.dim;for(let e=a;e=this._numberToString.length)throw new Error(`Out of bounds. Index requested n=${t} can't be >= this._numberToString.length ${this._numberToString.length}`);return this._numberToString[t]}}class ih{constructor(t,e,r,n,i){this.type=\"Feature\",this._vectorTileFeature=t,t._z=e,t._x=r,t._y=n,this.properties=t.properties,this.id=i}get geometry(){return void 0===this._geometry&&(this._geometry=this._vectorTileFeature.toGeoJSON(this._vectorTileFeature._x,this._vectorTileFeature._y,this._vectorTileFeature._z).geometry),this._geometry}set geometry(t){this._geometry=t}toJSON(){const t={geometry:this.geometry};for(const e in this)\"_geometry\"!==e&&\"_vectorTileFeature\"!==e&&(t[e]=this[e]);return t}}class ah{constructor(t,e){this.tileID=t,this.x=t.canonical.x,this.y=t.canonical.y,this.z=t.canonical.z,this.grid=new ki(Uo,16,0),this.grid3D=new ki(Uo,16,0),this.featureIndexArray=new Za,this.promoteId=e}insert(t,e,r,n,i,a){const o=this.featureIndexArray.length;this.featureIndexArray.emplaceBack(r,n,i);const s=a?this.grid3D:this.grid;for(let t=0;t=0&&n[3]>=0&&s.insert(o,n[0],n[1],n[2],n[3])}}loadVTLayers(){return this.vtLayers||(this.vtLayers=new Tl.VectorTile(new Uc(this.rawTileData)).layers,this.sourceLayerCoder=new nh(this.vtLayers?Object.keys(this.vtLayers).sort():[\"_geojsonTileLayer\"])),this.vtLayers}query(t,e,r,n){this.loadVTLayers();const i=t.params||{},o=Uo/t.tileSize/t.scale,s=zn(i.filter),l=t.queryGeometry,c=t.queryPadding*o,u=sh(l),h=this.grid.query(u.minX-c,u.minY-c,u.maxX+c,u.maxY+c),f=sh(t.cameraQueryGeometry),p=this.grid3D.query(f.minX-c,f.minY-c,f.maxX+c,f.maxY+c,((e,r,n,i)=>function(t,e,r,n,i){for(const a of t)if(e<=a.x&&r<=a.y&&n>=a.x&&i>=a.y)return!0;const o=[new a(e,r),new a(e,i),new a(n,i),new a(n,r)];if(t.length>2)for(const e of o)if(ns(t,e))return!0;for(let e=0;e(f||(f=Ho(e)),r.queryIntersectsFeature(l,e,n,f,this.z,t.transform,o,t.pixelPosMatrix))))}return d}loadMatchingFeature(t,e,r,n,i,a,o,s,l,c,u){const h=this.bucketLayerIDs[e];if(a&&!function(t,e){for(let r=0;r=0)return!0;return!1}(a,h))return;const f=this.sourceLayerCoder.decode(r),p=this.vtLayers[f].feature(n);if(i.needGeometry){const t=Go(p,!0);if(!i.filter(new Hi(this.tileID.overscaledZ),t,this.tileID.canonical))return}else if(!i.filter(new Hi(this.tileID.overscaledZ),p))return;const d=this.getId(p,f);for(let e=0;e{const o=e instanceof Ki?e.get(a):null;return o&&o.evaluate?o.evaluate(r,n,i):o}))}function sh(t){let e=1/0,r=1/0,n=-1/0,i=-1/0;for(const a of t)e=Math.min(e,a.x),r=Math.min(r,a.y),n=Math.max(n,a.x),i=Math.max(i,a.y);return{minX:e,minY:r,maxX:n,maxY:i}}function lh(t,e){return e-t}function ch(t,e,r,n,i){const o=[];for(let s=0;s=n&&u.x>=n||(s.x>=n?s=new a(n,s.y+(u.y-s.y)*((n-s.x)/(u.x-s.x)))._round():u.x>=n&&(u=new a(n,s.y+(u.y-s.y)*((n-s.x)/(u.x-s.x)))._round()),s.y>=i&&u.y>=i||(s.y>=i?s=new a(s.x+(u.x-s.x)*((i-s.y)/(u.y-s.y)),i)._round():u.y>=i&&(u=new a(s.x+(u.x-s.x)*((i-s.y)/(u.y-s.y)),i)._round()),c&&s.equals(c[c.length-1])||(c=[s],o.push(c)),c.push(u)))))}}return o}Mi(\"FeatureIndex\",ah,{omit:[\"rawTileData\",\"sourceLayerCoder\"]});class uh extends a{constructor(t,e,r,n){super(t,e),this.angle=r,void 0!==n&&(this.segment=n)}clone(){return new uh(this.x,this.y,this.angle,this.segment)}}function hh(t,e,r,n,i){if(void 0===e.segment||0===r)return!0;let a=e,o=e.segment+1,s=0;for(;s>-r/2;){if(o--,o<0)return!1;s-=t[o].dist(a),a=t[o]}s+=t[o].dist(t[o+1]),o++;const l=[];let c=0;for(;sn;)c-=l.shift().angleDelta;if(c>i)return!1;o++,s+=r.dist(a)}return!0}function fh(t){let e=0;for(let r=0;rc){const u=(c-l)/a,h=Pe.number(n.x,i.x,u),f=Pe.number(n.y,i.y,u),p=new uh(h,f,i.angleTo(n),r);return p._round(),!o||hh(t,p,s,o,e)?p:void 0}l+=a}}function gh(t,e,r,n,i,a,o,s,l){const c=ph(n,a,o),u=dh(n,i),h=u*o,f=0===t[0].x||t[0].x===l||0===t[0].y||t[0].y===l;return e-h=0&&y=0&&v=0&&f+c<=u){const r=new uh(y,v,m,e);r._round(),n&&!hh(t,r,a,n,i)||p.push(r)}}h+=d}return s||p.length||o||(p=yh(t,h/2,r,n,i,a,o,!0,l)),p}Mi(\"Anchor\",uh);const vh=Yc;function xh(t,e,r,n){const i=[],o=t.image,s=o.pixelRatio,l=o.paddedRect.w-2*vh,c=o.paddedRect.h-2*vh;let u={x1:t.left,y1:t.top,x2:t.right,y2:t.bottom};const h=o.stretchX||[[0,l]],f=o.stretchY||[[0,c]],p=(t,e)=>t+e[1]-e[0],d=h.reduce(p,0),m=f.reduce(p,0),g=l-d,y=c-m;let v=0,x=d,_=0,b=m,w=0,T=g,k=0,A=y;if(o.content&&n){const e=o.content,r=e[2]-e[0],n=e[3]-e[1];(o.textFitWidth||o.textFitHeight)&&(u=du(t)),v=_h(h,0,e[0]),_=_h(f,0,e[1]),x=_h(h,e[0],e[2]),b=_h(f,e[1],e[3]),w=e[0]-v,k=e[1]-_,T=r-x,A=n-b}const M=u.x1,S=u.y1,E=u.x2-M,C=u.y2-S,L=(t,n,i,l)=>{const c=wh(t.stretch-v,x,E,M),u=Th(t.fixed-w,T,t.stretch,d),h=wh(n.stretch-_,b,C,S),f=Th(n.fixed-k,A,n.stretch,m),p=wh(i.stretch-v,x,E,M),g=Th(i.fixed-w,T,i.stretch,d),y=wh(l.stretch-_,b,C,S),L=Th(l.fixed-k,A,l.stretch,m),I=new a(c,h),P=new a(p,h),z=new a(p,y),O=new a(c,y),D=new a(u/s,f/s),R=new a(g/s,L/s),F=e*Math.PI/180;if(F){const t=Math.sin(F),e=Math.cos(F),r=[e,-t,t,e];I._matMult(r),P._matMult(r),O._matMult(r),z._matMult(r)}const B=t.stretch+t.fixed,N=i.stretch+i.fixed,j=n.stretch+n.fixed,U=l.stretch+l.fixed;return{tl:I,tr:P,bl:O,br:z,tex:{x:o.paddedRect.x+vh+B,y:o.paddedRect.y+vh+j,w:N-B,h:U-j},writingMode:void 0,glyphOffset:[0,0],sectionIndex:0,pixelOffsetTL:D,pixelOffsetBR:R,minFontScaleX:T/s/E,minFontScaleY:A/s/C,isSDF:r}};if(n&&(o.stretchX||o.stretchY)){const t=bh(h,g,d),e=bh(f,y,m);for(let r=0;r0&&(n=Math.max(10,n),this.circleDiameter=n)}else{const c=(null===(h=o.image)||void 0===h?void 0:h.content)&&(o.image.textFitWidth||o.image.textFitHeight)?du(o):{x1:o.left,y1:o.top,x2:o.right,y2:o.bottom};c.y1=c.y1*s-l[0],c.y2=c.y2*s+l[2],c.x1=c.x1*s-l[3],c.x2=c.x2*s+l[1];const f=o.collisionPadding;if(f&&(c.x1-=f[0]*s,c.y1-=f[1]*s,c.x2+=f[2]*s,c.y2+=f[3]*s),u){const t=new a(c.x1,c.y1),e=new a(c.x2,c.y1),r=new a(c.x1,c.y2),n=new a(c.x2,c.y2),i=u*Math.PI/180;t._rotate(i),e._rotate(i),r._rotate(i),n._rotate(i),c.x1=Math.min(t.x,e.x,r.x,n.x),c.x2=Math.max(t.x,e.x,r.x,n.x),c.y1=Math.min(t.y,e.y,r.y,n.y),c.y2=Math.max(t.y,e.y,r.y,n.y)}t.emplaceBack(e.x,e.y,c.x1,c.y1,c.x2,c.y2,r,n,i)}this.boxEndIndex=t.length}}class Ah{constructor(t=[],e=((t,e)=>te?1:0)){if(this.data=t,this.length=this.data.length,this.compare=e,this.length>0)for(let t=(this.length>>1)-1;t>=0;t--)this._down(t)}push(t){this.data.push(t),this._up(this.length++)}pop(){if(0===this.length)return;const t=this.data[0],e=this.data.pop();return--this.length>0&&(this.data[0]=e,this._down(0)),t}peek(){return this.data[0]}_up(t){const{data:e,compare:r}=this,n=e[t];for(;t>0;){const i=t-1>>1,a=e[i];if(r(n,a)>=0)break;e[t]=a,t=i}e[t]=n}_down(t){const{data:e,compare:r}=this,n=this.length>>1,i=e[t];for(;t=0)break;e[t]=e[n],t=n}e[t]=i}}function Mh(t,e=1,r=!1){let n=1/0,i=1/0,o=-1/0,s=-1/0;const l=t[0];for(let t=0;to)&&(o=e.x),(!t||e.y>s)&&(s=e.y)}const c=o-n,u=s-i,h=Math.min(c,u);let f=h/2;const p=new Ah([],Sh);if(0===h)return new a(n,i);for(let e=n;ed.d||!d.d)&&(d=n,r&&console.log(\"found best %d after %d probes\",Math.round(1e4*n.d)/1e4,m)),n.max-d.d<=e||(f=n.h/2,p.push(new Eh(n.p.x-f,n.p.y-f,f,t)),p.push(new Eh(n.p.x+f,n.p.y-f,f,t)),p.push(new Eh(n.p.x-f,n.p.y+f,f,t)),p.push(new Eh(n.p.x+f,n.p.y+f,f,t)),m+=4)}return r&&(console.log(`num probes: ${m}`),console.log(`best distance: ${d.d}`)),d.p}function Sh(t,e){return e.max-t.max}function Eh(t,e,r,n){this.p=new a(t,e),this.h=r,this.d=function(t,e){let r=!1,n=1/0;for(let i=0;it.y!=s.y>t.y&&t.x<(s.x-i.x)*(t.y-i.y)/(s.y-i.y)+i.x&&(r=!r),n=Math.min(n,es(t,i,s))}}return(r?1:-1)*Math.sqrt(n)}(this.p,n),this.max=this.d+this.h*Math.SQRT2}var Ch;t.ar=void 0,(Ch=t.ar||(t.ar={}))[Ch.center=1]=\"center\",Ch[Ch.left=2]=\"left\",Ch[Ch.right=3]=\"right\",Ch[Ch.top=4]=\"top\",Ch[Ch.bottom=5]=\"bottom\",Ch[Ch[\"top-left\"]=6]=\"top-left\",Ch[Ch[\"top-right\"]=7]=\"top-right\",Ch[Ch[\"bottom-left\"]=8]=\"bottom-left\",Ch[Ch[\"bottom-right\"]=9]=\"bottom-right\";const Lh=7,Ih=Number.POSITIVE_INFINITY;function Ph(t,e){return e[1]!==Ih?function(t,e,r){let n=0,i=0;switch(e=Math.abs(e),r=Math.abs(r),t){case\"top-right\":case\"top-left\":case\"top\":i=r-Lh;break;case\"bottom-right\":case\"bottom-left\":case\"bottom\":i=-r+Lh}switch(t){case\"top-right\":case\"bottom-right\":case\"right\":n=-e;break;case\"top-left\":case\"bottom-left\":case\"left\":n=e}return[n,i]}(t,e[0],e[1]):function(t,e){let r=0,n=0;e<0&&(e=0);const i=e/Math.SQRT2;switch(t){case\"top-right\":case\"top-left\":n=i-Lh;break;case\"bottom-right\":case\"bottom-left\":n=-i+Lh;break;case\"bottom\":n=-e+Lh;break;case\"top\":n=e-Lh}switch(t){case\"top-right\":case\"bottom-right\":r=-i;break;case\"top-left\":case\"bottom-left\":r=i;break;case\"left\":r=e;break;case\"right\":r=-e}return[r,n]}(t,e[0])}function zh(t,e,r){var n;const i=t.layout,a=null===(n=i.get(\"text-variable-anchor-offset\"))||void 0===n?void 0:n.evaluate(e,{},r);if(a){const t=a.values,e=[];for(let r=0;rt*xc));n.startsWith(\"top\")?i[1]-=Lh:n.startsWith(\"bottom\")&&(i[1]+=Lh),e[r+1]=i}return new ee(e)}const o=i.get(\"text-variable-anchor\");if(o){let n;n=void 0!==t._unevaluatedLayout.getValue(\"text-radial-offset\")?[i.get(\"text-radial-offset\").evaluate(e,{},r)*xc,Ih]:i.get(\"text-offset\").evaluate(e,{},r).map((t=>t*xc));const a=[];for(const t of o)a.push(t,Ph(t,n));return new ee(a)}return null}function Oh(t){switch(t){case\"right\":case\"top-right\":case\"bottom-right\":return\"right\";case\"left\":case\"top-left\":case\"bottom-left\":return\"left\"}return\"center\"}function Dh(e,r,n,i,a,o,s,l,c,u,h){let f=o.textMaxSize.evaluate(r,{});void 0===f&&(f=s);const p=e.layers[0].layout,d=p.get(\"icon-offset\").evaluate(r,{},h),m=Fh(n.horizontal),g=s/24,y=e.tilePixelRatio*g,v=e.tilePixelRatio*f/24,x=e.tilePixelRatio*l,_=e.tilePixelRatio*p.get(\"symbol-spacing\"),b=p.get(\"text-padding\")*e.tilePixelRatio,w=function(t,e,r,n=1){const i=t.get(\"icon-padding\").evaluate(e,{},r),a=i&&i.values;return[a[0]*n,a[1]*n,a[2]*n,a[3]*n]}(p,r,h,e.tilePixelRatio),k=p.get(\"text-max-angle\")/180*Math.PI,A=\"viewport\"!==p.get(\"text-rotation-alignment\")&&\"point\"!==p.get(\"symbol-placement\"),M=\"map\"===p.get(\"icon-rotation-alignment\")&&\"point\"!==p.get(\"symbol-placement\"),S=p.get(\"symbol-placement\"),E=_/2,C=p.get(\"icon-text-fit\");let L;i&&\"none\"!==C&&(e.allowVerticalPlacement&&n.vertical&&(L=mu(i,n.vertical,C,p.get(\"icon-text-fit-padding\"),d,g)),m&&(i=mu(i,m,C,p.get(\"icon-text-fit-padding\"),d,g)));const I=(l,f)=>{f.x<0||f.x>=Uo||f.y<0||f.y>=Uo||function(e,r,n,i,a,o,s,l,c,u,h,f,p,d,m,g,y,v,x,_,b,w,k,A,M){const S=e.addToLineVertexArray(r,n);let E,C,L,I,P=0,z=0,O=0,D=0,R=-1,F=-1;const B={};let N=bo(\"\");if(e.allowVerticalPlacement&&i.vertical){const t=l.layout.get(\"text-rotate\").evaluate(b,{},A)+90,e=i.vertical;L=new kh(c,r,u,h,f,e,p,d,m,t),s&&(I=new kh(c,r,u,h,f,s,y,v,m,t))}if(a){const n=l.layout.get(\"icon-rotate\").evaluate(b,{}),i=\"none\"!==l.layout.get(\"icon-text-fit\"),o=xh(a,n,k,i),p=s?xh(s,n,k,i):void 0;C=new kh(c,r,u,h,f,a,y,v,!1,n),P=4*o.length;const d=e.iconSizeData;let m=null;\"source\"===d.kind?(m=[yu*l.layout.get(\"icon-size\").evaluate(b,{})],m[0]>vu&&T(`${e.layerIds[0]}: Value for \"icon-size\" is >= ${gu}. Reduce your \"icon-size\".`)):\"composite\"===d.kind&&(m=[yu*w.compositeIconSizes[0].evaluate(b,{},A),yu*w.compositeIconSizes[1].evaluate(b,{},A)],(m[0]>vu||m[1]>vu)&&T(`${e.layerIds[0]}: Value for \"icon-size\" is >= ${gu}. Reduce your \"icon-size\".`)),e.addSymbols(e.icon,o,m,_,x,b,t.ai.none,r,S.lineStartIndex,S.lineLength,-1,A),R=e.icon.placedSymbolArray.length-1,p&&(z=4*p.length,e.addSymbols(e.icon,p,m,_,x,b,t.ai.vertical,r,S.lineStartIndex,S.lineLength,-1,A),F=e.icon.placedSymbolArray.length-1)}const j=Object.keys(i.horizontal);for(const n of j){const a=i.horizontal[n];if(!E){N=bo(a.text);const t=l.layout.get(\"text-rotate\").evaluate(b,{},A);E=new kh(c,r,u,h,f,a,p,d,m,t)}const s=1===a.positionedLines.length;if(O+=Rh(e,r,a,o,l,m,b,g,S,i.vertical?t.ai.horizontal:t.ai.horizontalOnly,s?j:[n],B,R,w,A),s)break}i.vertical&&(D+=Rh(e,r,i.vertical,o,l,m,b,g,S,t.ai.vertical,[\"vertical\"],B,F,w,A));const U=E?E.boxStartIndex:e.collisionBoxArray.length,V=E?E.boxEndIndex:e.collisionBoxArray.length,q=L?L.boxStartIndex:e.collisionBoxArray.length,H=L?L.boxEndIndex:e.collisionBoxArray.length,G=C?C.boxStartIndex:e.collisionBoxArray.length,Z=C?C.boxEndIndex:e.collisionBoxArray.length,W=I?I.boxStartIndex:e.collisionBoxArray.length,Y=I?I.boxEndIndex:e.collisionBoxArray.length;let X=-1;const $=(t,e)=>t&&t.circleDiameter?Math.max(t.circleDiameter,e):e;X=$(E,X),X=$(L,X),X=$(C,X),X=$(I,X);const J=X>-1?1:0;J&&(X*=M/xc),e.glyphOffsetArray.length>=Eu.MAX_GLYPHS&&T(\"Too many glyphs being rendered in a tile. See https://github.com/mapbox/mapbox-gl-js/issues/2907\"),void 0!==b.sortKey&&e.addToSortKeyRanges(e.symbolInstances.length,b.sortKey);const K=zh(l,b,A),[Q,tt]=function(e,r){const n=e.length,i=null==r?void 0:r.values;if((null==i?void 0:i.length)>0)for(let r=0;r=0?B.right:-1,B.center>=0?B.center:-1,B.left>=0?B.left:-1,B.vertical||-1,R,F,N,U,V,q,H,G,Z,W,Y,u,O,D,P,z,J,0,p,X,Q,tt)}(e,f,l,n,i,a,L,e.layers[0],e.collisionBoxArray,r.index,r.sourceLayerIndex,e.index,y,[b,b,b,b],A,c,x,w,M,d,r,o,u,h,s)};if(\"line\"===S)for(const t of ch(r.geometry,0,0,Uo,Uo)){const r=gh(t,_,k,n.vertical||m,i,24,v,e.overscaling,Uo);for(const n of r)m&&Bh(e,m.text,E,n)||I(t,n)}else if(\"line-center\"===S){for(const t of r.geometry)if(t.length>1){const e=mh(t,k,n.vertical||m,i,24,v);e&&I(t,e)}}else if(\"Polygon\"===r.type)for(const t of br(r.geometry,0)){const e=Mh(t,16);I(t[0],new uh(e.x,e.y,0))}else if(\"LineString\"===r.type)for(const t of r.geometry)I(t,new uh(t[0].x,t[0].y,0));else if(\"Point\"===r.type)for(const t of r.geometry)for(const e of t)I([e],new uh(e.x,e.y,0))}function Rh(t,e,r,n,i,o,s,l,c,u,h,f,p,d,m){const g=function(t,e,r,n,i,o,s,l){const c=n.layout.get(\"text-rotate\").evaluate(o,{})*Math.PI/180,u=[];for(const t of e.positionedLines)for(const n of t.positionedGlyphs){if(!n.rect)continue;const o=n.rect||{};let h=Zc+1,f=!0,p=1,d=0;const m=(i||l)&&n.vertical,g=n.metrics.advance*n.scale/2;if(l&&e.verticalizable){const e=(n.scale-1)*xc,r=(xc-n.metrics.width*n.scale)/2;d=t.lineOffset/2-(n.imageName?-r:e)}if(n.imageName){const t=s[n.imageName];f=t.sdf,p=t.pixelRatio,h=Yc/p}const y=i?[n.x+g,n.y]:[0,0];let v=i?[0,0]:[n.x+g+r[0],n.y+r[1]-d],x=[0,0];m&&(x=v,v=[0,0]);const _=n.metrics.isDoubleResolution?2:1,b=(n.metrics.left-h)*n.scale-g+v[0],w=(-n.metrics.top-h)*n.scale+v[1],T=b+o.w/_*n.scale/p,k=w+o.h/_*n.scale/p,A=new a(b,w),M=new a(T,w),S=new a(b,k),E=new a(T,k);if(m){const t=new a(-g,g-Kc),e=-Math.PI/2,r=xc/2-g,i=n.imageName?r:0,o=new a(5-Kc-r,-i),s=new a(...x);A._rotateAround(e,t)._add(o)._add(s),M._rotateAround(e,t)._add(o)._add(s),S._rotateAround(e,t)._add(o)._add(s),E._rotateAround(e,t)._add(o)._add(s)}if(c){const t=Math.sin(c),e=Math.cos(c),r=[e,-t,t,e];A._matMult(r),M._matMult(r),S._matMult(r),E._matMult(r)}const C=new a(0,0),L=new a(0,0),I=0,P=0;u.push({tl:A,tr:M,bl:S,br:E,tex:o,writingMode:e.writingMode,glyphOffset:y,sectionIndex:n.sectionIndex,isSDF:f,pixelOffsetTL:C,pixelOffsetBR:L,minFontScaleX:I,minFontScaleY:P})}return u}(0,r,l,i,o,s,n,t.allowVerticalPlacement),y=t.textSizeData;let v=null;\"source\"===y.kind?(v=[yu*i.layout.get(\"text-size\").evaluate(s,{})],v[0]>vu&&T(`${t.layerIds[0]}: Value for \"text-size\" is >= ${gu}. Reduce your \"text-size\".`)):\"composite\"===y.kind&&(v=[yu*d.compositeTextSizes[0].evaluate(s,{},m),yu*d.compositeTextSizes[1].evaluate(s,{},m)],(v[0]>vu||v[1]>vu)&&T(`${t.layerIds[0]}: Value for \"text-size\" is >= ${gu}. Reduce your \"text-size\".`)),t.addSymbols(t.text,g,v,l,o,s,u,e,c.lineStartIndex,c.lineLength,p,m);for(const e of h)f[e]=t.text.placedSymbolArray.length-1;return 4*g.length}function Fh(t){for(const e in t)return t[e];return null}function Bh(t,e,r,n){const i=t.compareText;if(e in i){const t=i[e];for(let e=t.length-1;e>=0;e--)if(n.dist(t[e])>4;if(1!==n)throw new Error(`Got v${n} data when expected v1.`);const i=Nh[15&r];if(!i)throw new Error(\"Unrecognized array type.\");const[a]=new Uint16Array(t,2,1),[o]=new Uint32Array(t,4,1);return new jh(o,a,i,t)}constructor(t,e=64,r=Float64Array,n){if(isNaN(t)||t<0)throw new Error(`Unpexpected numItems value: ${t}.`);this.numItems=+t,this.nodeSize=Math.min(Math.max(+e,2),65535),this.ArrayType=r,this.IndexArrayType=t<65536?Uint16Array:Uint32Array;const i=Nh.indexOf(this.ArrayType),a=2*t*this.ArrayType.BYTES_PER_ELEMENT,o=t*this.IndexArrayType.BYTES_PER_ELEMENT,s=(8-o%8)%8;if(i<0)throw new Error(`Unexpected typed array class: ${r}.`);n&&n instanceof ArrayBuffer?(this.data=n,this.ids=new this.IndexArrayType(this.data,8,t),this.coords=new this.ArrayType(this.data,8+o+s,2*t),this._pos=2*t,this._finished=!0):(this.data=new ArrayBuffer(8+a+o+s),this.ids=new this.IndexArrayType(this.data,8,t),this.coords=new this.ArrayType(this.data,8+o+s,2*t),this._pos=0,this._finished=!1,new Uint8Array(this.data,0,2).set([219,16+i]),new Uint16Array(this.data,2,1)[0]=e,new Uint32Array(this.data,4,1)[0]=t)}add(t,e){const r=this._pos>>1;return this.ids[r]=r,this.coords[this._pos++]=t,this.coords[this._pos++]=e,r}finish(){const t=this._pos>>1;if(t!==this.numItems)throw new Error(`Added ${t} items when expected ${this.numItems}.`);return Uh(this.ids,this.coords,this.nodeSize,0,this.numItems-1,0),this._finished=!0,this}range(t,e,r,n){if(!this._finished)throw new Error(\"Data not yet indexed - call index.finish().\");const{ids:i,coords:a,nodeSize:o}=this,s=[0,i.length-1,0],l=[];for(;s.length;){const c=s.pop()||0,u=s.pop()||0,h=s.pop()||0;if(u-h<=o){for(let o=h;o<=u;o++){const s=a[2*o],c=a[2*o+1];s>=t&&s<=r&&c>=e&&c<=n&&l.push(i[o])}continue}const f=h+u>>1,p=a[2*f],d=a[2*f+1];p>=t&&p<=r&&d>=e&&d<=n&&l.push(i[f]),(0===c?t<=p:e<=d)&&(s.push(h),s.push(f-1),s.push(1-c)),(0===c?r>=p:n>=d)&&(s.push(f+1),s.push(u),s.push(1-c))}return l}within(t,e,r){if(!this._finished)throw new Error(\"Data not yet indexed - call index.finish().\");const{ids:n,coords:i,nodeSize:a}=this,o=[0,n.length-1,0],s=[],l=r*r;for(;o.length;){const c=o.pop()||0,u=o.pop()||0,h=o.pop()||0;if(u-h<=a){for(let r=h;r<=u;r++)Gh(i[2*r],i[2*r+1],t,e)<=l&&s.push(n[r]);continue}const f=h+u>>1,p=i[2*f],d=i[2*f+1];Gh(p,d,t,e)<=l&&s.push(n[f]),(0===c?t-r<=p:e-r<=d)&&(o.push(h),o.push(f-1),o.push(1-c)),(0===c?t+r>=p:e+r>=d)&&(o.push(f+1),o.push(u),o.push(1-c))}return s}}function Uh(t,e,r,n,i,a){if(i-n<=r)return;const o=n+i>>1;Vh(t,e,o,n,i,a),Uh(t,e,r,n,o-1,1-a),Uh(t,e,r,o+1,i,1-a)}function Vh(t,e,r,n,i,a){for(;i>n;){if(i-n>600){const o=i-n+1,s=r-n+1,l=Math.log(o),c=.5*Math.exp(2*l/3),u=.5*Math.sqrt(l*c*(o-c)/o)*(s-o/2<0?-1:1);Vh(t,e,r,Math.max(n,Math.floor(r-s*c/o+u)),Math.min(i,Math.floor(r+(o-s)*c/o+u)),a)}const o=e[2*r+a];let s=n,l=i;for(qh(t,e,n,r),e[2*i+a]>o&&qh(t,e,n,i);so;)l--}e[2*n+a]===o?qh(t,e,n,l):(l++,qh(t,e,l,i)),l<=r&&(n=l+1),r<=l&&(i=l-1)}}function qh(t,e,r,n){Hh(t,r,n),Hh(e,2*r,2*n),Hh(e,2*r+1,2*n+1)}function Hh(t,e,r){const n=t[e];t[e]=t[r],t[r]=n}function Gh(t,e,r,n){const i=t-r,a=e-n;return i*i+a*a}var Zh;t.bf=void 0,(Zh=t.bf||(t.bf={})).create=\"create\",Zh.load=\"load\",Zh.fullLoad=\"fullLoad\";let Wh=null,Yh=[];const Xh=1e3/60,$h=\"loadTime\",Jh=\"fullLoadTime\",Kh={mark(t){performance.mark(t)},frame(t){const e=t;if(null!=Wh){const t=e-Wh;Yh.push(t)}Wh=e},clearMetrics(){Wh=null,Yh=[],performance.clearMeasures($h),performance.clearMeasures(Jh);for(const e in t.bf)performance.clearMarks(t.bf[e])},getPerformanceMetrics(){performance.measure($h,t.bf.create,t.bf.load),performance.measure(Jh,t.bf.create,t.bf.fullLoad);const e=performance.getEntriesByName($h)[0].duration,r=performance.getEntriesByName(Jh)[0].duration,n=Yh.length,i=1/(Yh.reduce(((t,e)=>t+e),0)/n/1e3),a=Yh.filter((t=>t>Xh)).reduce(((t,e)=>t+(e-Xh)/Xh),0);return{loadTime:e,fullLoadTime:r,fps:i,percentDroppedFrames:a/(n+a)*100,totalFrames:n}}};t.$=class extends da{},t.A=fs,t.B=_i,t.C=function(t){if(null==M){const e=t.navigator?t.navigator.userAgent:null;M=!!t.safari||!(!e||!(/\\b(iPad|iPhone|iPod)\\b/.test(e)||e.match(\"Safari\")&&!e.match(\"Chrome\")))}return M},t.D=Qi,t.E=G,t.F=class{constructor(t,e){this.target=t,this.mapId=e,this.resolveRejects={},this.tasks={},this.taskQueue=[],this.abortControllers={},this.messageHandlers={},this.invoker=new Uu((()=>this.process())),this.subscription=function(t,e,r,n){return t.addEventListener(e,r,n),{unsubscribe:()=>{t.removeEventListener(e,r,n)}}}(this.target,\"message\",(t=>this.receive(t)),!1),this.globalScope=A(self)?t:window}registerMessageHandler(t,e){this.messageHandlers[t]=e}sendAsync(t,e){return new Promise(((r,n)=>{const i=Math.round(1e18*Math.random()).toString(36).substring(0,10);this.resolveRejects[i]={resolve:r,reject:n},e&&e.signal.addEventListener(\"abort\",(()=>{delete this.resolveRejects[i];const e={id:i,type:\"\",origin:location.origin,targetMapId:t.targetMapId,sourceMapId:this.mapId};this.target.postMessage(e)}),{once:!0});const a=[],o=Object.assign(Object.assign({},t),{id:i,sourceMapId:this.mapId,origin:location.origin,data:Li(t.data,a)});this.target.postMessage(o,{transfer:a})}))}receive(t){const e=t.data,r=e.id;if(!(\"file://\"!==e.origin&&\"file://\"!==location.origin&&\"resource://android\"!==e.origin&&\"resource://android\"!==location.origin&&e.origin!==location.origin||e.targetMapId&&this.mapId!==e.targetMapId)){if(\"\"===e.type){delete this.tasks[r];const t=this.abortControllers[r];return delete this.abortControllers[r],void(t&&t.abort())}if(A(self)||e.mustQueue)return this.tasks[r]=e,this.taskQueue.push(r),void this.invoker.trigger();this.processTask(r,e)}}process(){if(0===this.taskQueue.length)return;const t=this.taskQueue.shift(),e=this.tasks[t];delete this.tasks[t],this.taskQueue.length>0&&this.invoker.trigger(),e&&this.processTask(t,e)}processTask(t,r){return e(this,void 0,void 0,(function*(){if(\"\"===r.type){const e=this.resolveRejects[t];if(delete this.resolveRejects[t],!e)return;return void(r.error?e.reject(Ii(r.error)):e.resolve(Ii(r.data)))}if(!this.messageHandlers[r.type])return void this.completeTask(t,new Error(`Could not find a registered handler for ${r.type}, map ID: ${this.mapId}, available handlers: ${Object.keys(this.messageHandlers).join(\", \")}`));const e=Ii(r.data),n=new AbortController;this.abortControllers[t]=n;try{const i=yield this.messageHandlers[r.type](r.sourceMapId,e,n);this.completeTask(t,null,i)}catch(e){this.completeTask(t,e)}}))}completeTask(t,e,r){const n=[];delete this.abortControllers[t];const i={id:t,type:\"\",sourceMapId:this.mapId,origin:location.origin,error:e?Li(e):null,data:Li(r,n)};this.target.postMessage(i,{transfer:n})}remove(){this.invoker.remove(),this.subscription.unsubscribe()}},t.G=R,t.H=function(){var t=new fs(16);return fs!=Float32Array&&(t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0),t[0]=1,t[5]=1,t[10]=1,t[15]=1,t},t.I=Xc,t.J=function(t,e,r){var n,i,a,o,s,l,c,u,h,f,p,d,m=r[0],g=r[1],y=r[2];return e===t?(t[12]=e[0]*m+e[4]*g+e[8]*y+e[12],t[13]=e[1]*m+e[5]*g+e[9]*y+e[13],t[14]=e[2]*m+e[6]*g+e[10]*y+e[14],t[15]=e[3]*m+e[7]*g+e[11]*y+e[15]):(n=e[0],i=e[1],a=e[2],o=e[3],s=e[4],l=e[5],c=e[6],u=e[7],h=e[8],f=e[9],p=e[10],d=e[11],t[0]=n,t[1]=i,t[2]=a,t[3]=o,t[4]=s,t[5]=l,t[6]=c,t[7]=u,t[8]=h,t[9]=f,t[10]=p,t[11]=d,t[12]=n*m+s*g+h*y+e[12],t[13]=i*m+l*g+f*y+e[13],t[14]=a*m+c*g+p*y+e[14],t[15]=o*m+u*g+d*y+e[15]),t},t.K=function(t,e,r){var n=r[0],i=r[1],a=r[2];return t[0]=e[0]*n,t[1]=e[1]*n,t[2]=e[2]*n,t[3]=e[3]*n,t[4]=e[4]*i,t[5]=e[5]*i,t[6]=e[6]*i,t[7]=e[7]*i,t[8]=e[8]*a,t[9]=e[9]*a,t[10]=e[10]*a,t[11]=e[11]*a,t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15],t},t.L=ds,t.M=function(t,e){const r={};for(let n=0;n{const e=window.document.createElement(\"video\");return e.muted=!0,new Promise((r=>{e.onloadstart=()=>{r(e)};for(const r of t){const t=window.document.createElement(\"source\");j(r)||(e.crossOrigin=\"Anonymous\"),t.src=r,e.appendChild(t)}}))},t.a4=function(){return v++},t.a5=Ra,t.a6=Eu,t.a7=zn,t.a8=Go,t.a9=Hi,t.aA=function(t){t=t.slice();const e=Object.create(null);for(let r=0;r{\"source\"in t&&n[t.source]?r.push({command:\"removeLayer\",args:[t.id]}):a.push(t)})),r=r.concat(i),function(t,e,r){e=e||[];const n=(t=t||[]).map(rt),i=e.map(rt),a=t.reduce(nt,{}),o=e.reduce(nt,{}),s=n.slice(),l=Object.create(null);let c,u,h,f,p;for(let t=0,e=0;t@\\,;\\:\\\\\"\\/\\[\\]\\?\\=\\{\\}\\x7F]+)(?:\\=(?:([^\\x00-\\x20\\(\\)<>@\\,;\\:\\\\\"\\/\\[\\]\\?\\=\\{\\}\\x7F]+)|(?:\\\"((?:[^\"\\\\]|\\\\.)*)\\\")))?/g,((t,r,n,i)=>{const a=n||i;return e[r]=!a||a.toLowerCase(),\"\"})),e[\"max-age\"]){const t=parseInt(e[\"max-age\"],10);isNaN(t)?delete e[\"max-age\"]:e[\"max-age\"]=t}return e},t.ac=function(t,e){const r=[];for(const n in t)n in e||r.push(n);return r},t.ad=m,t.ae=function(t,e,r){var n=Math.sin(r),i=Math.cos(r),a=e[0],o=e[1],s=e[2],l=e[3],c=e[4],u=e[5],h=e[6],f=e[7];return e!==t&&(t[8]=e[8],t[9]=e[9],t[10]=e[10],t[11]=e[11],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15]),t[0]=a*i+c*n,t[1]=o*i+u*n,t[2]=s*i+h*n,t[3]=l*i+f*n,t[4]=c*i-a*n,t[5]=u*i-o*n,t[6]=h*i-s*n,t[7]=f*i-l*n,t},t.af=function(t){var e=new fs(16);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e[9]=t[9],e[10]=t[10],e[11]=t[11],e[12]=t[12],e[13]=t[13],e[14]=t[14],e[15]=t[15],e},t.ag=vs,t.ah=function(t,e){let r=0,n=0;if(\"constant\"===t.kind)n=t.layoutSize;else if(\"source\"!==t.kind){const{interpolationType:i,minZoom:a,maxZoom:o}=t,s=i?m(ze.interpolationFactor(i,e,a,o),0,1):0;\"camera\"===t.kind?n=Pe.number(t.minSize,t.maxSize,s):r=s}return{uSizeT:r,uSize:n}},t.aj=function(t,{uSize:e,uSizeT:r},{lowerSize:n,upperSize:i}){return\"source\"===t.kind?n/yu:\"composite\"===t.kind?Pe.number(n/yu,i/yu,r):e},t.ak=ku,t.al=function(t,e,r,n){const i=e.y-t.y,o=e.x-t.x,s=n.y-r.y,l=n.x-r.x,c=s*o-l*i;if(0===c)return null;const u=(l*(t.y-r.y)-s*(t.x-r.x))/c;return new a(t.x+u*o,t.y+u*i)},t.am=ch,t.an=Yo,t.ao=ps,t.ap=function(t){let e=1/0,r=1/0,n=-1/0,i=-1/0;for(const a of t)e=Math.min(e,a.x),r=Math.min(r,a.y),n=Math.max(n,a.x),i=Math.max(i,a.y);return[e,r,n,i]},t.aq=xc,t.as=_u,t.at=function(t,e){var r=e[0],n=e[1],i=e[2],a=e[3],o=e[4],s=e[5],l=e[6],c=e[7],u=e[8],h=e[9],f=e[10],p=e[11],d=e[12],m=e[13],g=e[14],y=e[15],v=r*s-n*o,x=r*l-i*o,_=r*c-a*o,b=n*l-i*s,w=n*c-a*s,T=i*c-a*l,k=u*m-h*d,A=u*g-f*d,M=u*y-p*d,S=h*g-f*m,E=h*y-p*m,C=f*y-p*g,L=v*C-x*E+_*S+b*M-w*A+T*k;return L?(L=1/L,t[0]=(s*C-l*E+c*S)*L,t[1]=(i*E-n*C-a*S)*L,t[2]=(m*T-g*w+y*b)*L,t[3]=(f*w-h*T-p*b)*L,t[4]=(l*M-o*C-c*A)*L,t[5]=(r*C-i*M+a*A)*L,t[6]=(g*_-d*T-y*x)*L,t[7]=(u*T-f*_+p*x)*L,t[8]=(o*E-s*M+c*k)*L,t[9]=(n*M-r*E-a*k)*L,t[10]=(d*w-m*_+y*v)*L,t[11]=(h*_-u*w-p*v)*L,t[12]=(s*A-o*S-l*k)*L,t[13]=(r*S-n*A+i*k)*L,t[14]=(m*x-d*b-g*v)*L,t[15]=(u*b-h*x+f*v)*L,t):null},t.au=Oh,t.av=hu,t.aw=jh,t.ax=function(){const t={},e=Z.$version;for(const r in Z.$root){const n=Z.$root[r];if(n.required){let i=null;i=\"version\"===r?e:\"array\"===n.type?[]:{},null!=i&&(t[r]=i)}}return t},t.ay=Pi,t.az=B,t.b=S,t.b0=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t[6]=e[6],t[7]=e[7],t[8]=e[8],t[9]=e[9],t[10]=e[10],t[11]=e[11],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15],t},t.b1=_s,t.b2=function(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]+t[3]*e[3]},t.b3=g,t.b4=Qu,t.b5=Yu,t.b6=ms,t.b7=function(t,e,r){var n=Math.sin(r),i=Math.cos(r),a=e[4],o=e[5],s=e[6],l=e[7],c=e[8],u=e[9],h=e[10],f=e[11];return e!==t&&(t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15]),t[4]=a*i+c*n,t[5]=o*i+u*n,t[6]=s*i+h*n,t[7]=l*i+f*n,t[8]=c*i-a*n,t[9]=u*i-o*n,t[10]=h*i-s*n,t[11]=f*i-l*n,t},t.b8=p,t.b9=d,t.bA=function(t){return t.message===P},t.bB=An,t.bC=qi,t.ba=function(t){return t*Math.PI/180},t.bb=function(t,e){return t[0]=e[0],t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=e[1],t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=e[2],t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},t.bc=class extends pa{},t.bd=Vu,t.be=Kh,t.bg=F,t.bh=function(t,e){O.REGISTERED_PROTOCOLS[t]=e},t.bi=function(t){delete O.REGISTERED_PROTOCOLS[t]},t.bj=function(t,e){const r={};for(let n=0;nt*xc))}let x=l?\"center\":i.get(\"text-justify\").evaluate(r,{},e.canonical);const _=\"point\"===i.get(\"symbol-placement\")?i.get(\"text-max-width\").evaluate(r,{},e.canonical)*xc:1/0,b=()=>{e.bucket.allowVerticalPlacement&&Oi(o)&&(d.vertical=eu(m,e.glyphMap,e.glyphPositions,e.imagePositions,a,_,s,g,\"left\",p,y,t.ai.vertical,!0,f,h))};if(!l&&v){const r=new Set;if(\"auto\"===x)for(let t=0;te(void 0,void 0,void 0,(function*(){if(0===t.byteLength)return createImageBitmap(new ImageData(1,1));const e=new Blob([new Uint8Array(t)],{type:\"image/png\"});try{return createImageBitmap(e)}catch(t){throw new Error(`Could not load image because of ${t.message}. Please make sure to use a supported image type such as PNG or JPEG. Note that SVGs are not supported.`)}})),t.e=y,t.f=t=>new Promise(((e,r)=>{const n=new Image;n.onload=()=>{e(n),URL.revokeObjectURL(n.src),n.onload=null,window.requestAnimationFrame((()=>{n.src=E}))},n.onerror=()=>r(new Error(\"Could not load image. Please make sure to use a supported image type such as PNG or JPEG. Note that SVGs are not supported.\"));const i=new Blob([new Uint8Array(t)],{type:\"image/png\"});n.src=t.byteLength?URL.createObjectURL(i):E})),t.g=D,t.h=(t,e)=>N(y(t,{type:\"json\"}),e),t.i=A,t.j=H,t.k=q,t.l=(t,e)=>N(y(t,{type:\"arrayBuffer\"}),e),t.m=N,t.n=function(t){return new Uc(t).readFields(qc,[])},t.o=Cs,t.p=Wc,t.q=ia,t.r=xi,t.s=j,t.t=Ti,t.u=zi,t.v=Z,t.w=T,t.x=vi,t.y=function([t,e,r]){return e+=90,e*=Math.PI/180,r*=Math.PI/180,{x:t*Math.cos(e)*Math.sin(r),y:t*Math.sin(e)*Math.sin(r),z:t*Math.cos(r)}},t.z=Pe})),r(\"worker\",0,(function(t){class e{constructor(t){this.keyCache={},t&&this.replace(t)}replace(t){this._layerConfigs={},this._layers={},this.update(t,[])}update(e,r){for(const r of e){this._layerConfigs[r.id]=r;const e=this._layers[r.id]=t.aB(r);e._featureFilter=t.a7(e.filter),this.keyCache[r.id]&&delete this.keyCache[r.id]}for(const t of r)delete this.keyCache[t],delete this._layerConfigs[t],delete this._layers[t];this.familiesBySource={};const n=t.bj(Object.values(this._layerConfigs),this.keyCache);for(const t of n){const e=t.map((t=>this._layers[t.id])),r=e[0];if(\"none\"===r.visibility)continue;const n=r.source||\"\";let i=this.familiesBySource[n];i||(i=this.familiesBySource[n]={});const a=r.sourceLayer||\"_geojsonTileLayer\";let o=i[a];o||(o=i[a]=[]),o.push(e)}}}class r{constructor(e){const r={},n=[];for(const t in e){const i=e[t],a=r[t]={};for(const t in i){const e=i[+t];if(!e||0===e.bitmap.width||0===e.bitmap.height)continue;const r={x:0,y:0,w:e.bitmap.width+2,h:e.bitmap.height+2};n.push(r),a[t]={rect:r,metrics:e.metrics}}}const{w:i,h:a}=t.p(n),o=new t.o({width:i||1,height:a||1});for(const n in e){const i=e[n];for(const e in i){const a=i[+e];if(!a||0===a.bitmap.width||0===a.bitmap.height)continue;const s=r[n][e].rect;t.o.copy(a.bitmap,o,{x:0,y:0},{x:s.x+1,y:s.y+1},a.bitmap)}}this.image=o,this.positions=r}}t.bk(\"GlyphAtlas\",r);class n{constructor(e){this.tileID=new t.S(e.tileID.overscaledZ,e.tileID.wrap,e.tileID.canonical.z,e.tileID.canonical.x,e.tileID.canonical.y),this.uid=e.uid,this.zoom=e.zoom,this.pixelRatio=e.pixelRatio,this.tileSize=e.tileSize,this.source=e.source,this.overscaling=this.tileID.overscaleFactor(),this.showCollisionBoxes=e.showCollisionBoxes,this.collectResourceTiming=!!e.collectResourceTiming,this.returnDependencies=!!e.returnDependencies,this.promoteId=e.promoteId,this.inFlightDependencies=[]}parse(e,n,a,o){return t._(this,void 0,void 0,(function*(){this.status=\"parsing\",this.data=e,this.collisionBoxArray=new t.a5;const s=new t.bl(Object.keys(e.layers).sort()),l=new t.bm(this.tileID,this.promoteId);l.bucketLayerIDs=[];const c={},u={featureIndex:l,iconDependencies:{},patternDependencies:{},glyphDependencies:{},availableImages:a},h=n.familiesBySource[this.source];for(const r in h){const n=e.layers[r];if(!n)continue;1===n.version&&t.w(`Vector tile source \"${this.source}\" layer \"${r}\" does not use vector tile spec v2 and therefore may have some rendering errors.`);const o=s.encode(r),f=[];for(let t=0;t=r.maxzoom||\"none\"!==r.visibility&&(i(e,this.zoom,a),(c[r.id]=r.createBucket({index:l.bucketLayerIDs.length,layers:e,zoom:this.zoom,pixelRatio:this.pixelRatio,overscaling:this.overscaling,collisionBoxArray:this.collisionBoxArray,sourceLayerIndex:o,sourceID:this.source})).populate(f,u,this.tileID.canonical),l.bucketLayerIDs.push(e.map((t=>t.id))))}}const f=t.aG(u.glyphDependencies,(t=>Object.keys(t).map(Number)));this.inFlightDependencies.forEach((t=>null==t?void 0:t.abort())),this.inFlightDependencies=[];let p=Promise.resolve({});if(Object.keys(f).length){const t=new AbortController;this.inFlightDependencies.push(t),p=o.sendAsync({type:\"GG\",data:{stacks:f,source:this.source,tileID:this.tileID,type:\"glyphs\"}},t)}const d=Object.keys(u.iconDependencies);let m=Promise.resolve({});if(d.length){const t=new AbortController;this.inFlightDependencies.push(t),m=o.sendAsync({type:\"GI\",data:{icons:d,source:this.source,tileID:this.tileID,type:\"icons\"}},t)}const g=Object.keys(u.patternDependencies);let y=Promise.resolve({});if(g.length){const t=new AbortController;this.inFlightDependencies.push(t),y=o.sendAsync({type:\"GI\",data:{icons:g,source:this.source,tileID:this.tileID,type:\"patterns\"}},t)}const[v,x,_]=yield Promise.all([p,m,y]),b=new r(v),w=new t.bn(x,_);for(const e in c){const r=c[e];r instanceof t.a6?(i(r.layers,this.zoom,a),t.bo({bucket:r,glyphMap:v,glyphPositions:b.positions,imageMap:x,imagePositions:w.iconPositions,showCollisionBoxes:this.showCollisionBoxes,canonical:this.tileID.canonical})):r.hasPattern&&(r instanceof t.bp||r instanceof t.bq||r instanceof t.br)&&(i(r.layers,this.zoom,a),r.addFeatures(u,this.tileID.canonical,w.patternPositions))}return this.status=\"done\",{buckets:Object.values(c).filter((t=>!t.isEmpty())),featureIndex:l,collisionBoxArray:this.collisionBoxArray,glyphAtlasImage:b.image,imageAtlas:w,glyphMap:this.returnDependencies?v:null,iconMap:this.returnDependencies?x:null,glyphPositions:this.returnDependencies?b.positions:null}}))}}function i(e,r,n){const i=new t.a9(r);for(const t of e)t.recalculate(i,n)}class a{constructor(t,e,r){this.actor=t,this.layerIndex=e,this.availableImages=r,this.fetching={},this.loading={},this.loaded={}}loadVectorTile(e,r){return t._(this,void 0,void 0,(function*(){const n=yield t.l(e.request,r);try{return{vectorTile:new t.bs.VectorTile(new t.bt(n.data)),rawData:n.data,cacheControl:n.cacheControl,expires:n.expires}}catch(t){const r=new Uint8Array(n.data),i=31===r[0]&&139===r[1];let a=`Unable to parse the tile at ${e.request.url}, `;throw a+=i?\"please make sure the data is not gzipped and that you have configured the relevant header in the server\":`got error: ${t.message}`,new Error(a)}}))}loadTile(e){return t._(this,void 0,void 0,(function*(){const r=e.uid,i=!!(e&&e.request&&e.request.collectResourceTiming)&&new t.bu(e.request),a=new n(e);this.loading[r]=a;const o=new AbortController;a.abort=o;try{const n=yield this.loadVectorTile(e,o);if(delete this.loading[r],!n)return null;const s=n.rawData,l={};n.expires&&(l.expires=n.expires),n.cacheControl&&(l.cacheControl=n.cacheControl);const c={};if(i){const t=i.finish();t&&(c.resourceTiming=JSON.parse(JSON.stringify(t)))}a.vectorTile=n.vectorTile;const u=a.parse(n.vectorTile,this.layerIndex,this.availableImages,this.actor);this.loaded[r]=a,this.fetching[r]={rawTileData:s,cacheControl:l,resourceTiming:c};try{const e=yield u;return t.e({rawTileData:s.slice(0)},e,l,c)}finally{delete this.fetching[r]}}catch(t){throw delete this.loading[r],a.status=\"done\",this.loaded[r]=a,t}}))}reloadTile(e){return t._(this,void 0,void 0,(function*(){const r=e.uid;if(!this.loaded||!this.loaded[r])throw new Error(\"Should not be trying to reload a tile that was never loaded or has been removed\");const n=this.loaded[r];if(n.showCollisionBoxes=e.showCollisionBoxes,\"parsing\"===n.status){const e=yield n.parse(n.vectorTile,this.layerIndex,this.availableImages,this.actor);let i;if(this.fetching[r]){const{rawTileData:n,cacheControl:a,resourceTiming:o}=this.fetching[r];delete this.fetching[r],i=t.e({rawTileData:n.slice(0)},e,a,o)}else i=e;return i}if(\"done\"===n.status&&n.vectorTile)return n.parse(n.vectorTile,this.layerIndex,this.availableImages,this.actor)}))}abortTile(e){return t._(this,void 0,void 0,(function*(){const t=this.loading,r=e.uid;t&&t[r]&&t[r].abort&&(t[r].abort.abort(),delete t[r])}))}removeTile(e){return t._(this,void 0,void 0,(function*(){this.loaded&&this.loaded[e.uid]&&delete this.loaded[e.uid]}))}}class o{constructor(){this.loaded={}}loadTile(e){return t._(this,void 0,void 0,(function*(){const{uid:r,encoding:n,rawImageData:i,redFactor:a,greenFactor:o,blueFactor:s,baseShift:l}=e,c=i.width+2,u=i.height+2,h=t.b(i)?new t.R({width:c,height:u},yield t.bv(i,-1,-1,c,u)):i,f=new t.bw(r,h,n,a,o,s,l);return this.loaded=this.loaded||{},this.loaded[r]=f,f}))}removeTile(t){const e=this.loaded,r=t.uid;e&&e[r]&&delete e[r]}}var s=function t(e,r){var n,i=e&&e.type;if(\"FeatureCollection\"===i)for(n=0;n=Math.abs(s)?r-l+s:s-l+r,r=l}r+n>=0!=!!e&&t.reverse()}var u=t.bx(s);const h=t.bs.VectorTileFeature.prototype.toGeoJSON;let f=class{constructor(e){this._feature=e,this.extent=t.X,this.type=e.type,this.properties=e.tags,\"id\"in e&&!isNaN(e.id)&&(this.id=parseInt(e.id,10))}loadGeometry(){if(1===this._feature.type){const e=[];for(const r of this._feature.geometry)e.push([new t.P(r[0],r[1])]);return e}{const e=[];for(const r of this._feature.geometry){const n=[];for(const e of r)n.push(new t.P(e[0],e[1]));e.push(n)}return e}}toGeoJSON(t,e,r){return h.call(this,t,e,r)}},p=class{constructor(e){this.layers={_geojsonTileLayer:this},this.name=\"_geojsonTileLayer\",this.extent=t.X,this.length=e.length,this._features=e}feature(t){return new f(this._features[t])}};var d={exports:{}},m=t.by,g=t.bs.VectorTileFeature,y=v;function v(t,e){this.options=e||{},this.features=t,this.length=t.length}function x(t,e){this.id=\"number\"==typeof t.id?t.id:void 0,this.type=t.type,this.rawGeometry=1===t.type?[t.geometry]:t.geometry,this.properties=t.tags,this.extent=e||4096}v.prototype.feature=function(t){return new x(this.features[t],this.options.extent)},x.prototype.loadGeometry=function(){var t=this.rawGeometry;this.geometry=[];for(var e=0;e>31}function E(t,e){for(var r=t.loadGeometry(),n=t.type,i=0,a=0,o=r.length,s=0;st},z=Math.fround||(O=new Float32Array(1),t=>(O[0]=+t,O[0]));var O;const D=3,R=5,F=6;class B{constructor(t){this.options=Object.assign(Object.create(P),t),this.trees=new Array(this.options.maxZoom+1),this.stride=this.options.reduce?7:6,this.clusterProps=[]}load(t){const{log:e,minZoom:r,maxZoom:n}=this.options;e&&console.time(\"total time\");const i=`prepare ${t.length} points`;e&&console.time(i),this.points=t;const a=[];for(let e=0;e=r;t--){const r=+Date.now();o=this.trees[t]=this._createTree(this._cluster(o,t)),e&&console.log(\"z%d: %d clusters in %dms\",t,o.numItems,+Date.now()-r)}return e&&console.timeEnd(\"total time\"),this}getClusters(t,e){let r=((t[0]+180)%360+360)%360-180;const n=Math.max(-90,Math.min(90,t[1]));let i=180===t[2]?180:((t[2]+180)%360+360)%360-180;const a=Math.max(-90,Math.min(90,t[3]));if(t[2]-t[0]>=360)r=-180,i=180;else if(r>i){const t=this.getClusters([r,n,180,a],e),o=this.getClusters([-180,n,i,a],e);return t.concat(o)}const o=this.trees[this._limitZoom(e)],s=o.range(U(r),V(a),U(i),V(n)),l=o.data,c=[];for(const t of s){const e=this.stride*t;c.push(l[e+R]>1?N(l,e,this.clusterProps):this.points[l[e+D]])}return c}getChildren(t){const e=this._getOriginId(t),r=this._getOriginZoom(t),n=\"No cluster with the specified id.\",i=this.trees[r];if(!i)throw new Error(n);const a=i.data;if(e*this.stride>=a.length)throw new Error(n);const o=this.options.radius/(this.options.extent*Math.pow(2,r-1)),s=a[e*this.stride],l=a[e*this.stride+1],c=i.within(s,l,o),u=[];for(const e of c){const r=e*this.stride;a[r+4]===t&&u.push(a[r+R]>1?N(a,r,this.clusterProps):this.points[a[r+D]])}if(0===u.length)throw new Error(n);return u}getLeaves(t,e,r){e=e||10,r=r||0;const n=[];return this._appendLeaves(n,t,e,r,0),n}getTile(t,e,r){const n=this.trees[this._limitZoom(t)],i=Math.pow(2,t),{extent:a,radius:o}=this.options,s=o/a,l=(r-s)/i,c=(r+1+s)/i,u={features:[]};return this._addTileFeatures(n.range((e-s)/i,l,(e+1+s)/i,c),n.data,e,r,i,u),0===e&&this._addTileFeatures(n.range(1-s/i,l,1,c),n.data,i,r,i,u),e===i-1&&this._addTileFeatures(n.range(0,l,s/i,c),n.data,-1,r,i,u),u.features.length?u:null}getClusterExpansionZoom(t){let e=this._getOriginZoom(t)-1;for(;e<=this.options.maxZoom;){const r=this.getChildren(t);if(e++,1!==r.length)break;t=r[0].properties.cluster_id}return e}_appendLeaves(t,e,r,n,i){const a=this.getChildren(e);for(const e of a){const a=e.properties;if(a&&a.cluster?i+a.point_count<=n?i+=a.point_count:i=this._appendLeaves(t,a.cluster_id,r,n,i):i1;let l,c,u;if(s)l=j(e,t,this.clusterProps),c=e[t],u=e[t+1];else{const r=this.points[e[t+D]];l=r.properties;const[n,i]=r.geometry.coordinates;c=U(n),u=V(i)}const h={type:1,geometry:[[Math.round(this.options.extent*(c*i-r)),Math.round(this.options.extent*(u*i-n))]],tags:l};let f;f=s||this.options.generateId?e[t+D]:this.points[e[t+D]].id,void 0!==f&&(h.id=f),a.features.push(h)}}_limitZoom(t){return Math.max(this.options.minZoom,Math.min(Math.floor(+t),this.options.maxZoom+1))}_cluster(t,e){const{radius:r,extent:n,reduce:i,minPoints:a}=this.options,o=r/(n*Math.pow(2,e)),s=t.data,l=[],c=this.stride;for(let r=0;re&&(p+=s[r+R])}if(p>f&&p>=a){let t,a=n*f,o=u*f,d=-1;const m=((r/c|0)<<5)+(e+1)+this.points.length;for(const n of h){const l=n*c;if(s[l+2]<=e)continue;s[l+2]=e;const u=s[l+R];a+=s[l]*u,o+=s[l+1]*u,s[l+4]=m,i&&(t||(t=this._map(s,r,!0),d=this.clusterProps.length,this.clusterProps.push(t)),i(t,this._map(s,l)))}s[r+4]=m,l.push(a/p,o/p,1/0,m,-1,p),i&&l.push(d)}else{for(let t=0;t1)for(const t of h){const r=t*c;if(!(s[r+2]<=e)){s[r+2]=e;for(let t=0;t>5}_getOriginZoom(t){return(t-this.points.length)%32}_map(t,e,r){if(t[e+R]>1){const n=this.clusterProps[t[e+F]];return r?Object.assign({},n):n}const n=this.points[t[e+D]].properties,i=this.options.map(n);return r&&i===n?Object.assign({},i):i}}function N(t,e,r){return{type:\"Feature\",id:t[e+D],properties:j(t,e,r),geometry:{type:\"Point\",coordinates:[(n=t[e],360*(n-.5)),q(t[e+1])]}};var n}function j(t,e,r){const n=t[e+R],i=n>=1e4?`${Math.round(n/1e3)}k`:n>=1e3?Math.round(n/100)/10+\"k\":n,a=t[e+F],o=-1===a?{}:Object.assign({},r[a]);return Object.assign(o,{cluster:!0,cluster_id:t[e+D],point_count:n,point_count_abbreviated:i})}function U(t){return t/360+.5}function V(t){const e=Math.sin(t*Math.PI/180),r=.5-.25*Math.log((1+e)/(1-e))/Math.PI;return r<0?0:r>1?1:r}function q(t){const e=(180-360*t)*Math.PI/180;return 360*Math.atan(Math.exp(e))/Math.PI-90}function H(t,e,r,n){let i=n;const a=e+(r-e>>1);let o,s=r-e;const l=t[e],c=t[e+1],u=t[r],h=t[r+1];for(let n=e+3;ni)o=n,i=e;else if(e===i){const t=Math.abs(n-a);tn&&(o-e>3&&H(t,e,o,n),t[o+2]=i,r-o>3&&H(t,o,r,n))}function G(t,e,r,n,i,a){let o=i-r,s=a-n;if(0!==o||0!==s){const l=((t-r)*o+(e-n)*s)/(o*o+s*s);l>1?(r=i,n=a):l>0&&(r+=o*l,n+=s*l)}return o=t-r,s=e-n,o*o+s*s}function Z(t,e,r,n){const i={id:null==t?null:t,type:e,geometry:r,tags:n,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0};if(\"Point\"===e||\"MultiPoint\"===e||\"LineString\"===e)W(i,r);else if(\"Polygon\"===e)W(i,r[0]);else if(\"MultiLineString\"===e)for(const t of r)W(i,t);else if(\"MultiPolygon\"===e)for(const t of r)W(i,t[0]);return i}function W(t,e){for(let r=0;r0&&(o+=n?(i*l-s*a)/2:Math.sqrt(Math.pow(s-i,2)+Math.pow(l-a,2))),i=s,a=l}const s=e.length-3;e[2]=1,H(e,0,s,r),e[s+2]=1,e.size=Math.abs(o),e.start=0,e.end=e.size}function J(t,e,r,n){for(let i=0;i1?1:r}function tt(t,e,r,n,i,a,o,s){if(n/=e,a>=(r/=e)&&o=n)return null;const l=[];for(const e of t){const t=e.geometry;let a=e.type;const o=0===i?e.minX:e.minY,c=0===i?e.maxX:e.maxY;if(o>=r&&c=n)continue;let u=[];if(\"Point\"===a||\"MultiPoint\"===a)et(t,u,r,n,i);else if(\"LineString\"===a)rt(t,u,r,n,i,!1,s.lineMetrics);else if(\"MultiLineString\"===a)it(t,u,r,n,i,!1);else if(\"Polygon\"===a)it(t,u,r,n,i,!0);else if(\"MultiPolygon\"===a)for(const e of t){const t=[];it(e,t,r,n,i,!0),t.length&&u.push(t)}if(u.length){if(s.lineMetrics&&\"LineString\"===a){for(const t of u)l.push(Z(e.id,a,t,e.tags));continue}\"LineString\"!==a&&\"MultiLineString\"!==a||(1===u.length?(a=\"LineString\",u=u[0]):a=\"MultiLineString\"),\"Point\"!==a&&\"MultiPoint\"!==a||(a=3===u.length?\"Point\":\"MultiPoint\"),l.push(Z(e.id,a,u,e.tags))}}return l.length?l:null}function et(t,e,r,n,i){for(let a=0;a=r&&o<=n&&at(e,t[a],t[a+1],t[a+2])}}function rt(t,e,r,n,i,a,o){let s=nt(t);const l=0===i?ot:st;let c,u,h=t.start;for(let f=0;fr&&(u=l(s,p,d,g,y,r),o&&(s.start=h+c*u)):v>n?x=r&&(u=l(s,p,d,g,y,r),_=!0),x>n&&v<=n&&(u=l(s,p,d,g,y,n),_=!0),!a&&_&&(o&&(s.end=h+c*u),e.push(s),s=nt(t)),o&&(h+=c)}let f=t.length-3;const p=t[f],d=t[f+1],m=t[f+2],g=0===i?p:d;g>=r&&g<=n&&at(s,p,d,m),f=s.length-3,a&&f>=3&&(s[f]!==s[0]||s[f+1]!==s[1])&&at(s,s[0],s[1],s[2]),s.length&&e.push(s)}function nt(t){const e=[];return e.size=t.size,e.start=t.start,e.end=t.end,e}function it(t,e,r,n,i,a){for(const o of t)rt(o,e,r,n,i,a,!1)}function at(t,e,r,n){t.push(e,r,n)}function ot(t,e,r,n,i,a){const o=(a-e)/(n-e);return at(t,a,r+(i-r)*o,1),o}function st(t,e,r,n,i,a){const o=(a-r)/(i-r);return at(t,e+(n-e)*o,a,1),o}function lt(t,e){const r=[];for(let n=0;n0&&e.size<(i?o:n))return void(r.numPoints+=e.length/3);const s=[];for(let t=0;to)&&(r.numSimplified++,s.push(e[t],e[t+1])),r.numPoints++;i&&function(t,e){let r=0;for(let e=0,n=t.length,i=n-2;e0===e)for(let e=0,r=t.length;e24)throw new Error(\"maxZoom should be in the 0-24 range\");if(e.promoteId&&e.generateId)throw new Error(\"promoteId and generateId cannot be used together.\");let n=function(t,e){const r=[];if(\"FeatureCollection\"===t.type)for(let n=0;n1&&console.time(\"creation\"),f=this.tiles[h]=ft(t,e,r,n,l),this.tileCoords.push({z:e,x:r,y:n}),c)){c>1&&(console.log(\"tile z%d-%d-%d (features: %d, points: %d, simplified: %d)\",e,r,n,f.numFeatures,f.numPoints,f.numSimplified),console.timeEnd(\"creation\"));const t=`z${e}`;this.stats[t]=(this.stats[t]||0)+1,this.total++}if(f.source=t,null==i){if(e===l.indexMaxZoom||f.numPoints<=l.indexMaxPoints)continue}else{if(e===l.maxZoom||e===i)continue;if(null!=i){const t=i-e;if(r!==a>>t||n!==o>>t)continue}}if(f.source=null,0===t.length)continue;c>1&&console.time(\"clipping\");const p=.5*l.buffer/l.extent,d=.5-p,m=.5+p,g=1+p;let y=null,v=null,x=null,_=null,b=tt(t,u,r-p,r+m,0,f.minX,f.maxX,l),w=tt(t,u,r+d,r+g,0,f.minX,f.maxX,l);t=null,b&&(y=tt(b,u,n-p,n+m,1,f.minY,f.maxY,l),v=tt(b,u,n+d,n+g,1,f.minY,f.maxY,l),b=null),w&&(x=tt(w,u,n-p,n+m,1,f.minY,f.maxY,l),_=tt(w,u,n+d,n+g,1,f.minY,f.maxY,l),w=null),c>1&&console.timeEnd(\"clipping\"),s.push(y||[],e+1,2*r,2*n),s.push(v||[],e+1,2*r,2*n+1),s.push(x||[],e+1,2*r+1,2*n),s.push(_||[],e+1,2*r+1,2*n+1)}}getTile(t,e,r){t=+t,e=+e,r=+r;const n=this.options,{extent:i,debug:a}=n;if(t<0||t>24)return null;const o=1<1&&console.log(\"drilling down to z%d-%d-%d\",t,e,r);let l,c=t,u=e,h=r;for(;!l&&c>0;)c--,u>>=1,h>>=1,l=this.tiles[yt(c,u,h)];return l&&l.source?(a>1&&(console.log(\"found parent tile z%d-%d-%d\",c,u,h),console.time(\"drilling down\")),this.splitTile(l.source,c,u,h,t,e,r),a>1&&console.timeEnd(\"drilling down\"),this.tiles[s]?ut(this.tiles[s],i):null):null}}function yt(t,e,r){return 32*((1<{o.properties=t;const e={};for(const t of s)e[t]=n[t].evaluate(a,o);return e},e.reduce=(t,e)=>{o.properties=e;for(const e of s)a.accumulated=t[e],t[e]=i[e].evaluate(a,o)},e}(e)).load((yield this._pendingData).features):(i=yield this._pendingData,a=e.geojsonVtOptions,new gt(i,a)),this.loaded={};const r={};if(n){const t=n.finish();t&&(r.resourceTiming={},r.resourceTiming[e.source]=JSON.parse(JSON.stringify(t)))}return r}catch(e){if(delete this._pendingRequest,t.bA(e))return{abandoned:!0};throw e}var i,a}))}getData(){return t._(this,void 0,void 0,(function*(){return this._pendingData}))}reloadTile(t){const e=this.loaded,r=t.uid;return e&&e[r]?super.reloadTile(t):this.loadTile(t)}loadAndProcessGeoJSON(e,r){return t._(this,void 0,void 0,(function*(){let n=yield this.loadGeoJSON(e,r);if(delete this._pendingRequest,\"object\"!=typeof n)throw new Error(`Input data given to '${e.source}' is not a valid GeoJSON object.`);if(u(n,!0),e.filter){const r=t.bB(e.filter,{type:\"boolean\",\"property-type\":\"data-driven\",overridable:!1,transition:!1});if(\"error\"===r.result)throw new Error(r.value.map((t=>`${t.key}: ${t.message}`)).join(\", \"));const i=n.features.filter((t=>r.value.evaluate({zoom:0},t)));n={type:\"FeatureCollection\",features:i}}return n}))}loadGeoJSON(e,r){return t._(this,void 0,void 0,(function*(){const{promoteId:n}=e;if(e.request){const i=yield t.h(e.request,r);return this._dataUpdateable=xt(i.data,n)?_t(i.data,n):void 0,i.data}if(\"string\"==typeof e.data)try{const t=JSON.parse(e.data);return this._dataUpdateable=xt(t,n)?_t(t,n):void 0,t}catch(t){throw new Error(`Input data given to '${e.source}' is not a valid GeoJSON object.`)}if(!e.dataDiff)throw new Error(`Input data given to '${e.source}' is not a valid GeoJSON object.`);if(!this._dataUpdateable)throw new Error(`Cannot update existing geojson data in ${e.source}`);return function(t,e,r){var n,i,a,o;if(e.removeAll&&t.clear(),e.remove)for(const r of e.remove)t.delete(r);if(e.add)for(const n of e.add){const e=vt(n,r);null!=e&&t.set(e,n)}if(e.update)for(const r of e.update){let e=t.get(r.id);if(null==e)continue;const s=r.newGeometry||r.removeAllProperties,l=!r.removeAllProperties&&((null===(n=r.removeProperties)||void 0===n?void 0:n.length)>0||(null===(i=r.addOrUpdateProperties)||void 0===i?void 0:i.length)>0);if((s||l)&&(e=Object.assign({},e),t.set(r.id,e),l&&(e.properties=Object.assign({},e.properties))),r.newGeometry&&(e.geometry=r.newGeometry),r.removeAllProperties)e.properties={};else if((null===(a=r.removeProperties)||void 0===a?void 0:a.length)>0)for(const t of r.removeProperties)Object.prototype.hasOwnProperty.call(e.properties,t)&&delete e.properties[t];if((null===(o=r.addOrUpdateProperties)||void 0===o?void 0:o.length)>0)for(const{key:t,value:n}of r.addOrUpdateProperties)e.properties[t]=n}}(this._dataUpdateable,e.dataDiff,n),{type:\"FeatureCollection\",features:Array.from(this._dataUpdateable.values())}}))}removeSource(e){return t._(this,void 0,void 0,(function*(){this._pendingRequest&&this._pendingRequest.abort()}))}getClusterExpansionZoom(t){return this._geoJSONIndex.getClusterExpansionZoom(t.clusterId)}getClusterChildren(t){return this._geoJSONIndex.getChildren(t.clusterId)}getClusterLeaves(t){return this._geoJSONIndex.getLeaves(t.clusterId,t.limit,t.offset)}}class wt{constructor(e){this.self=e,this.actor=new t.F(e),this.layerIndexes={},this.availableImages={},this.workerSources={},this.demWorkerSources={},this.externalWorkerSourceTypes={},this.self.registerWorkerSource=(t,e)=>{if(this.externalWorkerSourceTypes[t])throw new Error(`Worker source with name \"${t}\" already registered.`);this.externalWorkerSourceTypes[t]=e},this.self.addProtocol=t.bh,this.self.removeProtocol=t.bi,this.self.registerRTLTextPlugin=e=>{if(t.bC.isParsed())throw new Error(\"RTL text plugin already registered.\");t.bC.setMethods(e)},this.actor.registerMessageHandler(\"LDT\",((t,e)=>this._getDEMWorkerSource(t,e.source).loadTile(e))),this.actor.registerMessageHandler(\"RDT\",((e,r)=>t._(this,void 0,void 0,(function*(){this._getDEMWorkerSource(e,r.source).removeTile(r)})))),this.actor.registerMessageHandler(\"GCEZ\",((e,r)=>t._(this,void 0,void 0,(function*(){return this._getWorkerSource(e,r.type,r.source).getClusterExpansionZoom(r)})))),this.actor.registerMessageHandler(\"GCC\",((e,r)=>t._(this,void 0,void 0,(function*(){return this._getWorkerSource(e,r.type,r.source).getClusterChildren(r)})))),this.actor.registerMessageHandler(\"GCL\",((e,r)=>t._(this,void 0,void 0,(function*(){return this._getWorkerSource(e,r.type,r.source).getClusterLeaves(r)})))),this.actor.registerMessageHandler(\"LD\",((t,e)=>this._getWorkerSource(t,e.type,e.source).loadData(e))),this.actor.registerMessageHandler(\"GD\",((t,e)=>this._getWorkerSource(t,e.type,e.source).getData())),this.actor.registerMessageHandler(\"LT\",((t,e)=>this._getWorkerSource(t,e.type,e.source).loadTile(e))),this.actor.registerMessageHandler(\"RT\",((t,e)=>this._getWorkerSource(t,e.type,e.source).reloadTile(e))),this.actor.registerMessageHandler(\"AT\",((t,e)=>this._getWorkerSource(t,e.type,e.source).abortTile(e))),this.actor.registerMessageHandler(\"RMT\",((t,e)=>this._getWorkerSource(t,e.type,e.source).removeTile(e))),this.actor.registerMessageHandler(\"RS\",((e,r)=>t._(this,void 0,void 0,(function*(){if(!this.workerSources[e]||!this.workerSources[e][r.type]||!this.workerSources[e][r.type][r.source])return;const t=this.workerSources[e][r.type][r.source];delete this.workerSources[e][r.type][r.source],void 0!==t.removeSource&&t.removeSource(r)})))),this.actor.registerMessageHandler(\"RM\",(e=>t._(this,void 0,void 0,(function*(){delete this.layerIndexes[e],delete this.availableImages[e],delete this.workerSources[e],delete this.demWorkerSources[e]})))),this.actor.registerMessageHandler(\"SR\",((e,r)=>t._(this,void 0,void 0,(function*(){this.referrer=r})))),this.actor.registerMessageHandler(\"SRPS\",((t,e)=>this._syncRTLPluginState(t,e))),this.actor.registerMessageHandler(\"IS\",((e,r)=>t._(this,void 0,void 0,(function*(){this.self.importScripts(r)})))),this.actor.registerMessageHandler(\"SI\",((t,e)=>this._setImages(t,e))),this.actor.registerMessageHandler(\"UL\",((e,r)=>t._(this,void 0,void 0,(function*(){this._getLayerIndex(e).update(r.layers,r.removedIds)})))),this.actor.registerMessageHandler(\"SL\",((e,r)=>t._(this,void 0,void 0,(function*(){this._getLayerIndex(e).replace(r)}))))}_setImages(e,r){return t._(this,void 0,void 0,(function*(){this.availableImages[e]=r;for(const t in this.workerSources[e]){const n=this.workerSources[e][t];for(const t in n)n[t].availableImages=r}}))}_syncRTLPluginState(e,r){return t._(this,void 0,void 0,(function*(){if(t.bC.isParsed())return t.bC.getState();if(\"loading\"!==r.pluginStatus)return t.bC.setState(r),r;const e=r.pluginURL;if(this.self.importScripts(e),t.bC.isParsed()){const r={pluginStatus:\"loaded\",pluginURL:e};return t.bC.setState(r),r}throw t.bC.setState({pluginStatus:\"error\",pluginURL:\"\"}),new Error(`RTL Text Plugin failed to import scripts from ${e}`)}))}_getAvailableImages(t){let e=this.availableImages[t];return e||(e=[]),e}_getLayerIndex(t){let r=this.layerIndexes[t];return r||(r=this.layerIndexes[t]=new e),r}_getWorkerSource(t,e,r){if(this.workerSources[t]||(this.workerSources[t]={}),this.workerSources[t][e]||(this.workerSources[t][e]={}),!this.workerSources[t][e][r]){const n={sendAsync:(e,r)=>(e.targetMapId=t,this.actor.sendAsync(e,r))};switch(e){case\"vector\":this.workerSources[t][e][r]=new a(n,this._getLayerIndex(t),this._getAvailableImages(t));break;case\"geojson\":this.workerSources[t][e][r]=new bt(n,this._getLayerIndex(t),this._getAvailableImages(t));break;default:this.workerSources[t][e][r]=new this.externalWorkerSourceTypes[e](n,this._getLayerIndex(t),this._getAvailableImages(t))}}return this.workerSources[t][e][r]}_getDEMWorkerSource(t,e){return this.demWorkerSources[t]||(this.demWorkerSources[t]={}),this.demWorkerSources[t][e]||(this.demWorkerSources[t][e]=new o),this.demWorkerSources[t][e]}}return t.i(self)&&(self.worker=new wt(self)),wt})),r(\"index\",0,(function(t,e){var r=\"4.5.2\";let n,i;const a={now:\"undefined\"!=typeof performance&&performance&&performance.now?performance.now.bind(performance):Date.now.bind(Date),frameAsync(t){return new Promise(((r,n)=>{const i=requestAnimationFrame(r);t.signal.addEventListener(\"abort\",(()=>{cancelAnimationFrame(i),n(e.c())}))}))},getImageData(t,e=0){return this.getImageCanvasContext(t).getImageData(-e,-e,t.width+2*e,t.height+2*e)},getImageCanvasContext(t){const e=window.document.createElement(\"canvas\"),r=e.getContext(\"2d\",{willReadFrequently:!0});if(!r)throw new Error(\"failed to create canvas 2d context\");return e.width=t.width,e.height=t.height,r.drawImage(t,0,0,t.width,t.height),r},resolveURL(t){return n||(n=document.createElement(\"a\")),n.href=t,n.href},hardwareConcurrency:\"undefined\"!=typeof navigator&&navigator.hardwareConcurrency||4,get prefersReducedMotion(){return!!matchMedia&&(null==i&&(i=matchMedia(\"(prefers-reduced-motion: reduce)\")),i.matches)}};class o{static testProp(t){if(!o.docStyle)return t[0];for(let e=0;e{window.removeEventListener(\"click\",o.suppressClickInternal,!0)}),0)}static getScale(t){const e=t.getBoundingClientRect();return{x:e.width/t.offsetWidth||1,y:e.height/t.offsetHeight||1,boundingClientRect:e}}static getPoint(t,r,n){const i=r.boundingClientRect;return new e.P((n.clientX-i.left)/r.x-t.clientLeft,(n.clientY-i.top)/r.y-t.clientTop)}static mousePos(t,e){const r=o.getScale(t);return o.getPoint(t,r,e)}static touchPos(t,e){const r=[],n=o.getScale(t);for(let i=0;i{l&&f(l),l=null,h=!0},c.onerror=()=>{u=!0,l=null},c.src=\"data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAQAAAAfQ//73v/+BiOh/AAA=\"),function(t){let r,n,i,a;t.resetRequestQueue=()=>{r=[],n=0,i=0,a={}},t.addThrottleControl=t=>{const e=i++;return a[e]=t,e},t.removeThrottleControl=t=>{delete a[t],l()};t.getImage=(t,n,i=!0)=>new Promise(((a,o)=>{s.supported&&(t.headers||(t.headers={}),t.headers.accept=\"image/webp,*/*\"),e.e(t,{type:\"image\"});const c={abortController:n,requestParameters:t,supportImageRefresh:i,state:\"queued\",onError:t=>{o(t)},onSuccess:t=>{a(t)}};r.push(c),l()}));const o=t=>e._(this,void 0,void 0,(function*(){t.state=\"running\";const{requestParameters:r,supportImageRefresh:i,onError:a,onSuccess:o,abortController:s}=t,u=!1===i&&!e.i(self)&&!e.g(r.url)&&(!r.headers||Object.keys(r.headers).reduce(((t,e)=>t&&\"accept\"===e),!0));n++;const h=u?c(r,s):e.m(r,s);try{const r=yield h;delete t.abortController,t.state=\"completed\",r.data instanceof HTMLImageElement||e.b(r.data)?o(r):r.data&&o({data:yield(f=r.data,\"function\"==typeof createImageBitmap?e.d(f):e.f(f)),cacheControl:r.cacheControl,expires:r.expires})}catch(e){delete t.abortController,a(e)}finally{n--,l()}var f})),l=()=>{const t=(()=>{for(const t of Object.keys(a))if(a[t]())return!0;return!1})()?e.a.MAX_PARALLEL_IMAGE_REQUESTS_PER_FRAME:e.a.MAX_PARALLEL_IMAGE_REQUESTS;for(let e=n;e0;e++){const t=r.shift();t.abortController.signal.aborted?e--:o(t)}},c=(t,r)=>new Promise(((n,i)=>{const a=new Image,o=t.url,s=t.credentials;s&&\"include\"===s?a.crossOrigin=\"use-credentials\":(s&&\"same-origin\"===s||!e.s(o))&&(a.crossOrigin=\"anonymous\"),r.signal.addEventListener(\"abort\",(()=>{a.src=\"\",i(e.c())})),a.fetchPriority=\"high\",a.onload=()=>{a.onerror=a.onload=null,n({data:a})},a.onerror=()=>{a.onerror=a.onload=null,r.signal.aborted||i(new Error(\"Could not load image. Please make sure to use a supported image type such as PNG or JPEG. Note that SVGs are not supported.\"))},a.src=o}))}(p||(p={})),p.resetRequestQueue();class d{constructor(t){this._transformRequestFn=t}transformRequest(t,e){return this._transformRequestFn&&this._transformRequestFn(t,e)||{url:t}}setTransformRequest(t){this._transformRequestFn=t}}function m(t){var r=new e.A(3);return r[0]=t[0],r[1]=t[1],r[2]=t[2],r}var g,y=function(t,e,r){return t[0]=e[0]-r[0],t[1]=e[1]-r[1],t[2]=e[2]-r[2],t};g=new e.A(3),e.A!=Float32Array&&(g[0]=0,g[1]=0,g[2]=0);var v=function(t){var e=t[0],r=t[1];return e*e+r*r};function x(t){const e=[];if(\"string\"==typeof t)e.push({id:\"default\",url:t});else if(t&&t.length>0){const r=[];for(const{id:n,url:i}of t){const t=`${n}${i}`;-1===r.indexOf(t)&&(r.push(t),e.push({id:n,url:i}))}}return e}function _(t,e,r){const n=t.split(\"?\");return n[0]+=`${e}${r}`,n.join(\"?\")}function b(t,r,n,i){return e._(this,void 0,void 0,(function*(){const o=x(t),s=n>1?\"@2x\":\"\",l={},c={};for(const{id:t,url:n}of o){const a=r.transformRequest(_(n,s,\".json\"),\"SpriteJSON\");l[t]=e.h(a,i);const o=r.transformRequest(_(n,s,\".png\"),\"SpriteImage\");c[t]=p.getImage(o,i)}return yield Promise.all([...Object.values(l),...Object.values(c)]),function(t,r){return e._(this,void 0,void 0,(function*(){const e={};for(const n in t){e[n]={};const i=a.getImageCanvasContext((yield r[n]).data),o=(yield t[n]).data;for(const t in o){const{width:r,height:a,x:s,y:l,sdf:c,pixelRatio:u,stretchX:h,stretchY:f,content:p,textFitWidth:d,textFitHeight:m}=o[t],g={width:r,height:a,x:s,y:l,context:i};e[n][t]={data:null,pixelRatio:u,sdf:c,stretchX:h,stretchY:f,content:p,textFitWidth:d,textFitHeight:m,spriteData:g}}}return e}))}(l,c)}))}!function(){var t=new e.A(2);e.A!=Float32Array&&(t[0]=0,t[1]=0)}();class w{constructor(t,e,r,n){this.context=t,this.format=r,this.texture=t.gl.createTexture(),this.update(e,n)}update(t,r,n){const{width:i,height:a}=t,o=!(this.size&&this.size[0]===i&&this.size[1]===a||n),{context:s}=this,{gl:l}=s;if(this.useMipmap=Boolean(r&&r.useMipmap),l.bindTexture(l.TEXTURE_2D,this.texture),s.pixelStoreUnpackFlipY.set(!1),s.pixelStoreUnpack.set(1),s.pixelStoreUnpackPremultiplyAlpha.set(this.format===l.RGBA&&(!r||!1!==r.premultiply)),o)this.size=[i,a],t instanceof HTMLImageElement||t instanceof HTMLCanvasElement||t instanceof HTMLVideoElement||t instanceof ImageData||e.b(t)?l.texImage2D(l.TEXTURE_2D,0,this.format,this.format,l.UNSIGNED_BYTE,t):l.texImage2D(l.TEXTURE_2D,0,this.format,i,a,0,this.format,l.UNSIGNED_BYTE,t.data);else{const{x:r,y:o}=n||{x:0,y:0};t instanceof HTMLImageElement||t instanceof HTMLCanvasElement||t instanceof HTMLVideoElement||t instanceof ImageData||e.b(t)?l.texSubImage2D(l.TEXTURE_2D,0,r,o,l.RGBA,l.UNSIGNED_BYTE,t):l.texSubImage2D(l.TEXTURE_2D,0,r,o,i,a,l.RGBA,l.UNSIGNED_BYTE,t.data)}this.useMipmap&&this.isSizePowerOfTwo()&&l.generateMipmap(l.TEXTURE_2D)}bind(t,e,r){const{context:n}=this,{gl:i}=n;i.bindTexture(i.TEXTURE_2D,this.texture),r!==i.LINEAR_MIPMAP_NEAREST||this.isSizePowerOfTwo()||(r=i.LINEAR),t!==this.filter&&(i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MAG_FILTER,t),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MIN_FILTER,r||t),this.filter=t),e!==this.wrap&&(i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_S,e),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_T,e),this.wrap=e)}isSizePowerOfTwo(){return this.size[0]===this.size[1]&&Math.log(this.size[0])/Math.LN2%1==0}destroy(){const{gl:t}=this.context;t.deleteTexture(this.texture),this.texture=null}}function T(t){const{userImage:e}=t;return!!(e&&e.render&&e.render())&&(t.data.replace(new Uint8Array(e.data.buffer)),!0)}class k extends e.E{constructor(){super(),this.images={},this.updatedImages={},this.callbackDispatchedThisFrame={},this.loaded=!1,this.requestors=[],this.patterns={},this.atlasImage=new e.R({width:1,height:1}),this.dirty=!0}isLoaded(){return this.loaded}setLoaded(t){if(this.loaded!==t&&(this.loaded=t,t)){for(const{ids:t,promiseResolve:e}of this.requestors)e(this._getImagesForIds(t));this.requestors=[]}}getImage(t){const r=this.images[t];if(r&&!r.data&&r.spriteData){const t=r.spriteData;r.data=new e.R({width:t.width,height:t.height},t.context.getImageData(t.x,t.y,t.width,t.height).data),r.spriteData=null}return r}addImage(t,e){if(this.images[t])throw new Error(`Image id ${t} already exist, use updateImage instead`);this._validate(t,e)&&(this.images[t]=e)}_validate(t,r){let n=!0;const i=r.data||r.spriteData;return this._validateStretch(r.stretchX,i&&i.width)||(this.fire(new e.j(new Error(`Image \"${t}\" has invalid \"stretchX\" value`))),n=!1),this._validateStretch(r.stretchY,i&&i.height)||(this.fire(new e.j(new Error(`Image \"${t}\" has invalid \"stretchY\" value`))),n=!1),this._validateContent(r.content,r)||(this.fire(new e.j(new Error(`Image \"${t}\" has invalid \"content\" value`))),n=!1),n}_validateStretch(t,e){if(!t)return!0;let r=0;for(const n of t){if(n[0]{let n=!0;if(!this.isLoaded())for(const e of t)this.images[e]||(n=!1);this.isLoaded()||n?e(this._getImagesForIds(t)):this.requestors.push({ids:t,promiseResolve:e})}))}_getImagesForIds(t){const r={};for(const n of t){let t=this.getImage(n);t||(this.fire(new e.k(\"styleimagemissing\",{id:n})),t=this.getImage(n)),t?r[n]={data:t.data.clone(),pixelRatio:t.pixelRatio,sdf:t.sdf,version:t.version,stretchX:t.stretchX,stretchY:t.stretchY,content:t.content,textFitWidth:t.textFitWidth,textFitHeight:t.textFitHeight,hasRenderCallback:Boolean(t.userImage&&t.userImage.render)}:e.w(`Image \"${n}\" could not be loaded. Please make sure you have added the image with map.addImage() or a \"sprite\" property in your style. You can provide missing images by listening for the \"styleimagemissing\" map event.`)}return r}getPixelSize(){const{width:t,height:e}=this.atlasImage;return{width:t,height:e}}getPattern(t){const r=this.patterns[t],n=this.getImage(t);if(!n)return null;if(r&&r.position.version===n.version)return r.position;if(r)r.position.version=n.version;else{const r={w:n.data.width+2,h:n.data.height+2,x:0,y:0},i=new e.I(r,n);this.patterns[t]={bin:r,position:i}}return this._updatePatternAtlas(),this.patterns[t].position}bind(t){const e=t.gl;this.atlasTexture?this.dirty&&(this.atlasTexture.update(this.atlasImage),this.dirty=!1):this.atlasTexture=new w(t,this.atlasImage,e.RGBA),this.atlasTexture.bind(e.LINEAR,e.CLAMP_TO_EDGE)}_updatePatternAtlas(){const t=[];for(const e in this.patterns)t.push(this.patterns[e].bin);const{w:r,h:n}=e.p(t),i=this.atlasImage;i.resize({width:r||1,height:n||1});for(const t in this.patterns){const{bin:r}=this.patterns[t],n=r.x+1,a=r.y+1,o=this.getImage(t).data,s=o.width,l=o.height;e.R.copy(o,i,{x:0,y:0},{x:n,y:a},{width:s,height:l}),e.R.copy(o,i,{x:0,y:l-1},{x:n,y:a-1},{width:s,height:1}),e.R.copy(o,i,{x:0,y:0},{x:n,y:a+l},{width:s,height:1}),e.R.copy(o,i,{x:s-1,y:0},{x:n-1,y:a},{width:1,height:l}),e.R.copy(o,i,{x:0,y:0},{x:n+s,y:a},{width:1,height:l})}this.dirty=!0}beginFrame(){this.callbackDispatchedThisFrame={}}dispatchRenderCallbacks(t){for(const r of t){if(this.callbackDispatchedThisFrame[r])continue;this.callbackDispatchedThisFrame[r]=!0;const t=this.getImage(r);t||e.w(`Image with ID: \"${r}\" was not found`),T(t)&&this.updateImage(r,t)}}}const A=1e20;function M(t,e,r,n,i,a,o,s,l){for(let c=e;c-1);l++,a[l]=s,o[l]=c,o[l+1]=A}for(let s=0,l=0;s65535)throw new Error(\"glyphs > 65535 not supported\");if(e.ranges[i])return{stack:t,id:r,glyph:n};if(!this.url)throw new Error(\"glyphsUrl is not set\");if(!e.requests[i]){const r=E.loadGlyphRange(t,i,this.url,this.requestManager);e.requests[i]=r}const a=yield e.requests[i];for(const t in a)this._doesCharSupportLocalGlyph(+t)||(e.glyphs[+t]=a[+t]);return e.ranges[i]=!0,{stack:t,id:r,glyph:a[r]||null}}))}_doesCharSupportLocalGlyph(t){return!!this.localIdeographFontFamily&&(e.u[\"CJK Unified Ideographs\"](t)||e.u[\"Hangul Syllables\"](t)||e.u.Hiragana(t)||e.u.Katakana(t))}_tinySDF(t,r,n){const i=this.localIdeographFontFamily;if(!i)return;if(!this._doesCharSupportLocalGlyph(n))return;let a=t.tinySDF;if(!a){let e=\"400\";/bold/i.test(r)?e=\"900\":/medium/i.test(r)?e=\"500\":/light/i.test(r)&&(e=\"200\"),a=t.tinySDF=new E.TinySDF({fontSize:48,buffer:6,radius:16,cutoff:.25,fontFamily:i,fontWeight:e})}const o=a.draw(String.fromCharCode(n));return{id:n,bitmap:new e.o({width:o.width||60,height:o.height||60},o.data),metrics:{width:o.glyphWidth/2||24,height:o.glyphHeight/2||24,left:o.glyphLeft/2+.5||0,top:o.glyphTop/2-27.5||-8,advance:o.glyphAdvance/2||24,isDoubleResolution:!0}}}}E.loadGlyphRange=function(t,r,n,i){return e._(this,void 0,void 0,(function*(){const a=256*r,o=a+255,s=i.transformRequest(n.replace(\"{fontstack}\",t).replace(\"{range}\",`${a}-${o}`),\"Glyphs\"),l=yield e.l(s,new AbortController);if(!l||!l.data)throw new Error(`Could not load glyph range. range: ${r}, ${a}-${o}`);const c={};for(const t of e.n(l.data))c[t.id]=t;return c}))},E.TinySDF=class{constructor({fontSize:t=24,buffer:e=3,radius:r=8,cutoff:n=.25,fontFamily:i=\"sans-serif\",fontWeight:a=\"normal\",fontStyle:o=\"normal\"}={}){this.buffer=e,this.cutoff=n,this.radius=r;const s=this.size=t+4*e,l=this._createCanvas(s),c=this.ctx=l.getContext(\"2d\",{willReadFrequently:!0});c.font=`${o} ${a} ${t}px ${i}`,c.textBaseline=\"alphabetic\",c.textAlign=\"left\",c.fillStyle=\"black\",this.gridOuter=new Float64Array(s*s),this.gridInner=new Float64Array(s*s),this.f=new Float64Array(s),this.z=new Float64Array(s+1),this.v=new Uint16Array(s)}_createCanvas(t){const e=document.createElement(\"canvas\");return e.width=e.height=t,e}draw(t){const{width:e,actualBoundingBoxAscent:r,actualBoundingBoxDescent:n,actualBoundingBoxLeft:i,actualBoundingBoxRight:a}=this.ctx.measureText(t),o=Math.ceil(r),s=Math.max(0,Math.min(this.size-this.buffer,Math.ceil(a-i))),l=Math.min(this.size-this.buffer,o+Math.ceil(n)),c=s+2*this.buffer,u=l+2*this.buffer,h=Math.max(c*u,0),f=new Uint8ClampedArray(h),p={data:f,width:c,height:u,glyphWidth:s,glyphHeight:l,glyphTop:o,glyphLeft:0,glyphAdvance:e};if(0===s||0===l)return p;const{ctx:d,buffer:m,gridInner:g,gridOuter:y}=this;d.clearRect(m,m,s,l),d.fillText(t,m,m+o);const v=d.getImageData(m,m,s,l);y.fill(A,0,h),g.fill(0,0,h);for(let t=0;t0?t*t:0,g[n]=t<0?t*t:0}}M(y,0,0,c,u,c,this.f,this.v,this.z),M(g,m,m,s,l,c,this.f,this.v,this.z);for(let t=0;t1&&(s=t[++o]);const l=Math.abs(i-s.left),c=Math.abs(i-s.right),u=Math.min(l,c);let h;const f=e/r*(n+1);if(s.isDash){const t=n-Math.abs(f);h=Math.sqrt(u*u+t*t)}else h=n-Math.sqrt(u*u+f*f);this.data[a+i]=Math.max(0,Math.min(255,h+128))}}}addRegularDash(t){for(let e=t.length-1;e>=0;--e){const r=t[e],n=t[e+1];r.zeroLength?t.splice(e,1):n&&n.isDash===r.isDash&&(n.left=r.left,t.splice(e,1))}const e=t[0],r=t[t.length-1];e.isDash===r.isDash&&(e.left=r.left-this.width,r.right=e.right+this.width);const n=this.width*this.nextRow;let i=0,a=t[i];for(let e=0;e1&&(a=t[++i]);const r=Math.abs(e-a.left),o=Math.abs(e-a.right),s=Math.min(r,o),l=a.isDash?s:-s;this.data[n+e]=Math.max(0,Math.min(255,l+128))}}addDash(t,r){const n=r?7:0,i=2*n+1;if(this.nextRow+i>this.height)return e.w(\"LineAtlas out of space\"),null;let a=0;for(let e=0;e{t.terminate()})),this.workers=null)}isPreloaded(){return!!this.active[F]}numActive(){return Object.keys(this.active).length}}const N=Math.floor(a.hardwareConcurrency/2);let j,U;function V(){return j||(j=new B),j}B.workerCount=e.C(globalThis)?Math.max(Math.min(N,3),1):1;class q{constructor(t,r){this.workerPool=t,this.actors=[],this.currentActor=0,this.id=r;const n=this.workerPool.acquire(r);for(let t=0;t{t.remove()})),this.actors=[],t&&this.workerPool.release(this.id)}registerMessageHandler(t,e){for(const r of this.actors)r.registerMessageHandler(t,e)}}function H(){return U||(U=new q(V(),e.G),U.registerMessageHandler(\"GR\",((t,r,n)=>e.m(r,n)))),U}function G(t,r){const n=e.H();return e.J(n,n,[1,1,0]),e.K(n,n,[.5*t.width,.5*t.height,1]),e.L(n,n,t.calculatePosMatrix(r.toUnwrapped()))}function Z(t,e,r,n,i,a){const o=function(t,e,r){if(t)for(const n of t){const t=e[n];if(t&&t.source===r&&\"fill-extrusion\"===t.type)return!0}else for(const t in e){const n=e[t];if(n.source===r&&\"fill-extrusion\"===n.type)return!0}return!1}(i&&i.layers,e,t.id),s=a.maxPitchScaleFactor(),l=t.tilesIn(n,s,o);l.sort(W);const c=[];for(const n of l)c.push({wrappedTileID:n.tileID.wrapped().key,queryResults:n.tile.queryRenderedFeatures(e,r,t._state,n.queryGeometry,n.cameraQueryGeometry,n.scale,i,a,s,G(t.transform,n.tileID))});const u=function(t){const e={},r={};for(const n of t){const t=n.queryResults,i=n.wrappedTileID,a=r[i]=r[i]||{};for(const r in t){const n=t[r],i=a[r]=a[r]||{},o=e[r]=e[r]||[];for(const t of n)i[t.featureIndex]||(i[t.featureIndex]=!0,o.push(t))}}return e}(c);for(const e in u)u[e].forEach((e=>{const r=e.feature,n=t.getFeatureState(r.layer[\"source-layer\"],r.id);r.source=r.layer.source,r.layer[\"source-layer\"]&&(r.sourceLayer=r.layer[\"source-layer\"]),r.state=n}));return u}function W(t,e){const r=t.tileID,n=e.tileID;return r.overscaledZ-n.overscaledZ||r.canonical.y-n.canonical.y||r.wrap-n.wrap||r.canonical.x-n.canonical.x}function Y(t,r,n){return e._(this,void 0,void 0,(function*(){let i=t;if(t.url?i=(yield e.h(r.transformRequest(t.url,\"Source\"),n)).data:yield a.frameAsync(n),!i)return null;const o=e.M(e.e(i,t),[\"tiles\",\"minzoom\",\"maxzoom\",\"attribution\",\"bounds\",\"scheme\",\"tileSize\",\"encoding\"]);return\"vector_layers\"in i&&i.vector_layers&&(o.vectorLayerIds=i.vector_layers.map((t=>t.id))),o}))}class X{constructor(t,e){t&&(e?this.setSouthWest(t).setNorthEast(e):Array.isArray(t)&&(4===t.length?this.setSouthWest([t[0],t[1]]).setNorthEast([t[2],t[3]]):this.setSouthWest(t[0]).setNorthEast(t[1])))}setNorthEast(t){return this._ne=t instanceof e.N?new e.N(t.lng,t.lat):e.N.convert(t),this}setSouthWest(t){return this._sw=t instanceof e.N?new e.N(t.lng,t.lat):e.N.convert(t),this}extend(t){const r=this._sw,n=this._ne;let i,a;if(t instanceof e.N)i=t,a=t;else{if(!(t instanceof X)){if(Array.isArray(t)){if(4===t.length||t.every(Array.isArray)){const e=t;return this.extend(X.convert(e))}{const r=t;return this.extend(e.N.convert(r))}}return t&&(\"lng\"in t||\"lon\"in t)&&\"lat\"in t?this.extend(e.N.convert(t)):this}if(i=t._sw,a=t._ne,!i||!a)return this}return r||n?(r.lng=Math.min(i.lng,r.lng),r.lat=Math.min(i.lat,r.lat),n.lng=Math.max(a.lng,n.lng),n.lat=Math.max(a.lat,n.lat)):(this._sw=new e.N(i.lng,i.lat),this._ne=new e.N(a.lng,a.lat)),this}getCenter(){return new e.N((this._sw.lng+this._ne.lng)/2,(this._sw.lat+this._ne.lat)/2)}getSouthWest(){return this._sw}getNorthEast(){return this._ne}getNorthWest(){return new e.N(this.getWest(),this.getNorth())}getSouthEast(){return new e.N(this.getEast(),this.getSouth())}getWest(){return this._sw.lng}getSouth(){return this._sw.lat}getEast(){return this._ne.lng}getNorth(){return this._ne.lat}toArray(){return[this._sw.toArray(),this._ne.toArray()]}toString(){return`LngLatBounds(${this._sw.toString()}, ${this._ne.toString()})`}isEmpty(){return!(this._sw&&this._ne)}contains(t){const{lng:r,lat:n}=e.N.convert(t),i=this._sw.lat<=n&&n<=this._ne.lat;let a=this._sw.lng<=r&&r<=this._ne.lng;return this._sw.lng>this._ne.lng&&(a=this._sw.lng>=r&&r>=this._ne.lng),i&&a}static convert(t){return t instanceof X?t:t?new X(t):t}static fromLngLat(t,r=0){const n=360*r/40075017,i=n/Math.cos(Math.PI/180*t.lat);return new X(new e.N(t.lng-i,t.lat-n),new e.N(t.lng+i,t.lat+n))}}class ${constructor(t,e,r){this.bounds=X.convert(this.validateBounds(t)),this.minzoom=e||0,this.maxzoom=r||24}validateBounds(t){return Array.isArray(t)&&4===t.length?[Math.max(-180,t[0]),Math.max(-90,t[1]),Math.min(180,t[2]),Math.min(90,t[3])]:[-180,-90,180,90]}contains(t){const r=Math.pow(2,t.z),n=Math.floor(e.O(this.bounds.getWest())*r),i=Math.floor(e.Q(this.bounds.getNorth())*r),a=Math.ceil(e.O(this.bounds.getEast())*r),o=Math.ceil(e.Q(this.bounds.getSouth())*r);return t.x>=n&&t.x=i&&t.y{this._options.tiles=t})),this}setUrl(t){return this.setSourceProperty((()=>{this.url=t,this._options.url=t})),this}onRemove(){this._tileJSONRequest&&(this._tileJSONRequest.abort(),this._tileJSONRequest=null)}serialize(){return e.e({},this._options)}loadTile(t){return e._(this,void 0,void 0,(function*(){const e=t.tileID.canonical.url(this.tiles,this.map.getPixelRatio(),this.scheme),r={request:this.map._requestManager.transformRequest(e,\"Tile\"),uid:t.uid,tileID:t.tileID,zoom:t.tileID.overscaledZ,tileSize:this.tileSize*t.tileID.overscaleFactor(),type:this.type,source:this.id,pixelRatio:this.map.getPixelRatio(),showCollisionBoxes:this.map.showCollisionBoxes,promoteId:this.promoteId};r.request.collectResourceTiming=this._collectResourceTiming;let n=\"RT\";if(t.actor&&\"expired\"!==t.state){if(\"loading\"===t.state)return new Promise(((e,r)=>{t.reloadPromise={resolve:e,reject:r}}))}else t.actor=this.dispatcher.getActor(),n=\"LT\";t.abortController=new AbortController;try{const e=yield t.actor.sendAsync({type:n,data:r},t.abortController);if(delete t.abortController,t.aborted)return;this._afterTileLoadWorkerResponse(t,e)}catch(e){if(delete t.abortController,t.aborted)return;if(e&&404!==e.status)throw e;this._afterTileLoadWorkerResponse(t,null)}}))}_afterTileLoadWorkerResponse(t,e){if(e&&e.resourceTiming&&(t.resourceTiming=e.resourceTiming),e&&this.map._refreshExpiredTiles&&t.setExpiryData(e),t.loadVectorData(e,this.map.painter),t.reloadPromise){const e=t.reloadPromise;t.reloadPromise=null,this.loadTile(t).then(e.resolve).catch(e.reject)}}abortTile(t){return e._(this,void 0,void 0,(function*(){t.abortController&&(t.abortController.abort(),delete t.abortController),t.actor&&(yield t.actor.sendAsync({type:\"AT\",data:{uid:t.uid,type:this.type,source:this.id}}))}))}unloadTile(t){return e._(this,void 0,void 0,(function*(){t.unloadVectorData(),t.actor&&(yield t.actor.sendAsync({type:\"RMT\",data:{uid:t.uid,type:this.type,source:this.id}}))}))}hasTransition(){return!1}}class K extends e.E{constructor(t,r,n,i){super(),this.id=t,this.dispatcher=n,this.setEventedParent(i),this.type=\"raster\",this.minzoom=0,this.maxzoom=22,this.roundZoom=!0,this.scheme=\"xyz\",this.tileSize=512,this._loaded=!1,this._options=e.e({type:\"raster\"},r),e.e(this,e.M(r,[\"url\",\"scheme\",\"tileSize\"]))}load(){return e._(this,void 0,void 0,(function*(){this._loaded=!1,this.fire(new e.k(\"dataloading\",{dataType:\"source\"})),this._tileJSONRequest=new AbortController;try{const t=yield Y(this._options,this.map._requestManager,this._tileJSONRequest);this._tileJSONRequest=null,this._loaded=!0,t&&(e.e(this,t),t.bounds&&(this.tileBounds=new $(t.bounds,this.minzoom,this.maxzoom)),this.fire(new e.k(\"data\",{dataType:\"source\",sourceDataType:\"metadata\"})),this.fire(new e.k(\"data\",{dataType:\"source\",sourceDataType:\"content\"})))}catch(t){this._tileJSONRequest=null,this.fire(new e.j(t))}}))}loaded(){return this._loaded}onAdd(t){this.map=t,this.load()}onRemove(){this._tileJSONRequest&&(this._tileJSONRequest.abort(),this._tileJSONRequest=null)}setSourceProperty(t){this._tileJSONRequest&&(this._tileJSONRequest.abort(),this._tileJSONRequest=null),t(),this.load()}setTiles(t){return this.setSourceProperty((()=>{this._options.tiles=t})),this}setUrl(t){return this.setSourceProperty((()=>{this.url=t,this._options.url=t})),this}serialize(){return e.e({},this._options)}hasTile(t){return!this.tileBounds||this.tileBounds.contains(t.canonical)}loadTile(t){return e._(this,void 0,void 0,(function*(){const e=t.tileID.canonical.url(this.tiles,this.map.getPixelRatio(),this.scheme);t.abortController=new AbortController;try{const r=yield p.getImage(this.map._requestManager.transformRequest(e,\"Tile\"),t.abortController,this.map._refreshExpiredTiles);if(delete t.abortController,t.aborted)return void(t.state=\"unloaded\");if(r&&r.data){this.map._refreshExpiredTiles&&r.cacheControl&&r.expires&&t.setExpiryData({cacheControl:r.cacheControl,expires:r.expires});const e=this.map.painter.context,n=e.gl,i=r.data;t.texture=this.map.painter.getTileTexture(i.width),t.texture?t.texture.update(i,{useMipmap:!0}):(t.texture=new w(e,i,n.RGBA,{useMipmap:!0}),t.texture.bind(n.LINEAR,n.CLAMP_TO_EDGE,n.LINEAR_MIPMAP_NEAREST)),t.state=\"loaded\"}}catch(e){if(delete t.abortController,t.aborted)t.state=\"unloaded\";else if(e)throw t.state=\"errored\",e}}))}abortTile(t){return e._(this,void 0,void 0,(function*(){t.abortController&&(t.abortController.abort(),delete t.abortController)}))}unloadTile(t){return e._(this,void 0,void 0,(function*(){t.texture&&this.map.painter.saveTileTexture(t.texture)}))}hasTransition(){return!1}}class Q extends K{constructor(t,r,n,i){super(t,r,n,i),this.type=\"raster-dem\",this.maxzoom=22,this._options=e.e({type:\"raster-dem\"},r),this.encoding=r.encoding||\"mapbox\",this.redFactor=r.redFactor,this.greenFactor=r.greenFactor,this.blueFactor=r.blueFactor,this.baseShift=r.baseShift}loadTile(t){return e._(this,void 0,void 0,(function*(){const r=t.tileID.canonical.url(this.tiles,this.map.getPixelRatio(),this.scheme),n=this.map._requestManager.transformRequest(r,\"Tile\");t.neighboringTiles=this._getNeighboringTiles(t.tileID),t.abortController=new AbortController;try{const r=yield p.getImage(n,t.abortController,this.map._refreshExpiredTiles);if(delete t.abortController,t.aborted)return void(t.state=\"unloaded\");if(r&&r.data){const n=r.data;this.map._refreshExpiredTiles&&r.cacheControl&&r.expires&&t.setExpiryData({cacheControl:r.cacheControl,expires:r.expires});const i=e.b(n)&&e.U()?n:yield this.readImageNow(n),a={type:this.type,uid:t.uid,source:this.id,rawImageData:i,encoding:this.encoding,redFactor:this.redFactor,greenFactor:this.greenFactor,blueFactor:this.blueFactor,baseShift:this.baseShift};if(!t.actor||\"expired\"===t.state){t.actor=this.dispatcher.getActor();const e=yield t.actor.sendAsync({type:\"LDT\",data:a});t.dem=e,t.needsHillshadePrepare=!0,t.needsTerrainPrepare=!0,t.state=\"loaded\"}}}catch(e){if(delete t.abortController,t.aborted)t.state=\"unloaded\";else if(e)throw t.state=\"errored\",e}}))}readImageNow(t){return e._(this,void 0,void 0,(function*(){if(\"undefined\"!=typeof VideoFrame&&e.V()){const r=t.width+2,n=t.height+2;try{return new e.R({width:r,height:n},yield e.W(t,-1,-1,r,n))}catch(t){}}return a.getImageData(t,1)}))}_getNeighboringTiles(t){const r=t.canonical,n=Math.pow(2,r.z),i=(r.x-1+n)%n,a=0===r.x?t.wrap-1:t.wrap,o=(r.x+1+n)%n,s=r.x+1===n?t.wrap+1:t.wrap,l={};return l[new e.S(t.overscaledZ,a,r.z,i,r.y).key]={backfilled:!1},l[new e.S(t.overscaledZ,s,r.z,o,r.y).key]={backfilled:!1},r.y>0&&(l[new e.S(t.overscaledZ,a,r.z,i,r.y-1).key]={backfilled:!1},l[new e.S(t.overscaledZ,t.wrap,r.z,r.x,r.y-1).key]={backfilled:!1},l[new e.S(t.overscaledZ,s,r.z,o,r.y-1).key]={backfilled:!1}),r.y+10&&e.e(i,{resourceTiming:n}),this.fire(new e.k(\"data\",Object.assign(Object.assign({},i),{sourceDataType:\"metadata\"}))),this.fire(new e.k(\"data\",Object.assign(Object.assign({},i),{sourceDataType:\"content\"})))}catch(t){if(this._pendingLoads--,this._removed)return void this.fire(new e.k(\"dataabort\",{dataType:\"source\"}));this.fire(new e.j(t))}}))}loaded(){return 0===this._pendingLoads}loadTile(t){return e._(this,void 0,void 0,(function*(){const e=t.actor?\"RT\":\"LT\";t.actor=this.actor;const r={type:this.type,uid:t.uid,tileID:t.tileID,zoom:t.tileID.overscaledZ,maxZoom:this.maxzoom,tileSize:this.tileSize,source:this.id,pixelRatio:this.map.getPixelRatio(),showCollisionBoxes:this.map.showCollisionBoxes,promoteId:this.promoteId};t.abortController=new AbortController;const n=yield this.actor.sendAsync({type:e,data:r},t.abortController);delete t.abortController,t.unloadVectorData(),t.aborted||t.loadVectorData(n,this.map.painter,\"RT\"===e)}))}abortTile(t){return e._(this,void 0,void 0,(function*(){t.abortController&&(t.abortController.abort(),delete t.abortController),t.aborted=!0}))}unloadTile(t){return e._(this,void 0,void 0,(function*(){t.unloadVectorData(),yield this.actor.sendAsync({type:\"RMT\",data:{uid:t.uid,type:this.type,source:this.id}})}))}onRemove(){this._removed=!0,this.actor.sendAsync({type:\"RS\",data:{type:this.type,source:this.id}})}serialize(){return e.e({},this._options,{type:this.type,data:this._data})}hasTransition(){return!1}}var et=e.Y([{name:\"a_pos\",type:\"Int16\",components:2},{name:\"a_texture_pos\",type:\"Int16\",components:2}]);class rt extends e.E{constructor(t,e,r,n){super(),this.id=t,this.dispatcher=r,this.coordinates=e.coordinates,this.type=\"image\",this.minzoom=0,this.maxzoom=22,this.tileSize=512,this.tiles={},this._loaded=!1,this.setEventedParent(n),this.options=e}load(t){return e._(this,void 0,void 0,(function*(){this._loaded=!1,this.fire(new e.k(\"dataloading\",{dataType:\"source\"})),this.url=this.options.url,this._request=new AbortController;try{const e=yield p.getImage(this.map._requestManager.transformRequest(this.url,\"Image\"),this._request);this._request=null,this._loaded=!0,e&&e.data&&(this.image=e.data,t&&(this.coordinates=t),this._finishLoading())}catch(t){this._request=null,this._loaded=!0,this.fire(new e.j(t))}}))}loaded(){return this._loaded}updateImage(t){return t.url?(this._request&&(this._request.abort(),this._request=null),this.options.url=t.url,this.load(t.coordinates).finally((()=>{this.texture=null})),this):this}_finishLoading(){this.map&&(this.setCoordinates(this.coordinates),this.fire(new e.k(\"data\",{dataType:\"source\",sourceDataType:\"metadata\"})))}onAdd(t){this.map=t,this.load()}onRemove(){this._request&&(this._request.abort(),this._request=null)}setCoordinates(t){this.coordinates=t;const r=t.map(e.Z.fromLngLat);this.tileID=function(t){let r=1/0,n=1/0,i=-1/0,a=-1/0;for(const e of t)r=Math.min(r,e.x),n=Math.min(n,e.y),i=Math.max(i,e.x),a=Math.max(a,e.y);const o=i-r,s=a-n,l=Math.max(o,s),c=Math.max(0,Math.floor(-Math.log(l)/Math.LN2)),u=Math.pow(2,c);return new e.a1(c,Math.floor((r+i)/2*u),Math.floor((n+a)/2*u))}(r),this.minzoom=this.maxzoom=this.tileID.z;const n=r.map((t=>this.tileID.getTilePoint(t)._round()));return this._boundsArray=new e.$,this._boundsArray.emplaceBack(n[0].x,n[0].y,0,0),this._boundsArray.emplaceBack(n[1].x,n[1].y,e.X,0),this._boundsArray.emplaceBack(n[3].x,n[3].y,0,e.X),this._boundsArray.emplaceBack(n[2].x,n[2].y,e.X,e.X),this.boundsBuffer&&(this.boundsBuffer.destroy(),delete this.boundsBuffer),this.fire(new e.k(\"data\",{dataType:\"source\",sourceDataType:\"content\"})),this}prepare(){if(0===Object.keys(this.tiles).length||!this.image)return;const t=this.map.painter.context,r=t.gl;this.boundsBuffer||(this.boundsBuffer=t.createVertexBuffer(this._boundsArray,et.members)),this.boundsSegments||(this.boundsSegments=e.a0.simpleSegment(0,0,4,2)),this.texture||(this.texture=new w(t,this.image,r.RGBA),this.texture.bind(r.LINEAR,r.CLAMP_TO_EDGE));let n=!1;for(const t in this.tiles){const e=this.tiles[t];\"loaded\"!==e.state&&(e.state=\"loaded\",e.texture=this.texture,n=!0)}n&&this.fire(new e.k(\"data\",{dataType:\"source\",sourceDataType:\"idle\",sourceId:this.id}))}loadTile(t){return e._(this,void 0,void 0,(function*(){this.tileID&&this.tileID.equals(t.tileID.canonical)?(this.tiles[String(t.tileID.wrap)]=t,t.buckets={}):t.state=\"errored\"}))}serialize(){return{type:\"image\",url:this.options.url,coordinates:this.coordinates}}hasTransition(){return!1}}class nt extends rt{constructor(t,e,r,n){super(t,e,r,n),this.roundZoom=!0,this.type=\"video\",this.options=e}load(){return e._(this,void 0,void 0,(function*(){this._loaded=!1;const t=this.options;this.urls=[];for(const e of t.urls)this.urls.push(this.map._requestManager.transformRequest(e,\"Source\").url);try{const t=yield e.a3(this.urls);if(this._loaded=!0,!t)return;this.video=t,this.video.loop=!0,this.video.addEventListener(\"playing\",(()=>{this.map.triggerRepaint()})),this.map&&this.video.play(),this._finishLoading()}catch(t){this.fire(new e.j(t))}}))}pause(){this.video&&this.video.pause()}play(){this.video&&this.video.play()}seek(t){if(this.video){const r=this.video.seekable;tr.end(0)?this.fire(new e.j(new e.a2(`sources.${this.id}`,null,`Playback for this video can be set only between the ${r.start(0)} and ${r.end(0)}-second mark.`))):this.video.currentTime=t}}getVideo(){return this.video}onAdd(t){this.map||(this.map=t,this.load(),this.video&&(this.video.play(),this.setCoordinates(this.coordinates)))}prepare(){if(0===Object.keys(this.tiles).length||this.video.readyState<2)return;const t=this.map.painter.context,r=t.gl;this.boundsBuffer||(this.boundsBuffer=t.createVertexBuffer(this._boundsArray,et.members)),this.boundsSegments||(this.boundsSegments=e.a0.simpleSegment(0,0,4,2)),this.texture?this.video.paused||(this.texture.bind(r.LINEAR,r.CLAMP_TO_EDGE),r.texSubImage2D(r.TEXTURE_2D,0,0,0,r.RGBA,r.UNSIGNED_BYTE,this.video)):(this.texture=new w(t,this.video,r.RGBA),this.texture.bind(r.LINEAR,r.CLAMP_TO_EDGE));let n=!1;for(const t in this.tiles){const e=this.tiles[t];\"loaded\"!==e.state&&(e.state=\"loaded\",e.texture=this.texture,n=!0)}n&&this.fire(new e.k(\"data\",{dataType:\"source\",sourceDataType:\"idle\",sourceId:this.id}))}serialize(){return{type:\"video\",urls:this.urls,coordinates:this.coordinates}}hasTransition(){return this.video&&!this.video.paused}}class it extends rt{constructor(t,r,n,i){super(t,r,n,i),r.coordinates?Array.isArray(r.coordinates)&&4===r.coordinates.length&&!r.coordinates.some((t=>!Array.isArray(t)||2!==t.length||t.some((t=>\"number\"!=typeof t))))||this.fire(new e.j(new e.a2(`sources.${t}`,null,'\"coordinates\" property must be an array of 4 longitude/latitude array pairs'))):this.fire(new e.j(new e.a2(`sources.${t}`,null,'missing required property \"coordinates\"'))),r.animate&&\"boolean\"!=typeof r.animate&&this.fire(new e.j(new e.a2(`sources.${t}`,null,'optional \"animate\" property must be a boolean value'))),r.canvas?\"string\"==typeof r.canvas||r.canvas instanceof HTMLCanvasElement||this.fire(new e.j(new e.a2(`sources.${t}`,null,'\"canvas\" must be either a string representing the ID of the canvas element from which to read, or an HTMLCanvasElement instance'))):this.fire(new e.j(new e.a2(`sources.${t}`,null,'missing required property \"canvas\"'))),this.options=r,this.animate=void 0===r.animate||r.animate}load(){return e._(this,void 0,void 0,(function*(){this._loaded=!0,this.canvas||(this.canvas=this.options.canvas instanceof HTMLCanvasElement?this.options.canvas:document.getElementById(this.options.canvas)),this.width=this.canvas.width,this.height=this.canvas.height,this._hasInvalidDimensions()?this.fire(new e.j(new Error(\"Canvas dimensions cannot be less than or equal to zero.\"))):(this.play=function(){this._playing=!0,this.map.triggerRepaint()},this.pause=function(){this._playing&&(this.prepare(),this._playing=!1)},this._finishLoading())}))}getCanvas(){return this.canvas}onAdd(t){this.map=t,this.load(),this.canvas&&this.animate&&this.play()}onRemove(){this.pause()}prepare(){let t=!1;if(this.canvas.width!==this.width&&(this.width=this.canvas.width,t=!0),this.canvas.height!==this.height&&(this.height=this.canvas.height,t=!0),this._hasInvalidDimensions())return;if(0===Object.keys(this.tiles).length)return;const r=this.map.painter.context,n=r.gl;this.boundsBuffer||(this.boundsBuffer=r.createVertexBuffer(this._boundsArray,et.members)),this.boundsSegments||(this.boundsSegments=e.a0.simpleSegment(0,0,4,2)),this.texture?(t||this._playing)&&this.texture.update(this.canvas,{premultiply:!0}):this.texture=new w(r,this.canvas,n.RGBA,{premultiply:!0});let i=!1;for(const t in this.tiles){const e=this.tiles[t];\"loaded\"!==e.state&&(e.state=\"loaded\",e.texture=this.texture,i=!0)}i&&this.fire(new e.k(\"data\",{dataType:\"source\",sourceDataType:\"idle\",sourceId:this.id}))}serialize(){return{type:\"canvas\",coordinates:this.coordinates}}hasTransition(){return this._playing}_hasInvalidDimensions(){for(const t of[this.canvas.width,this.canvas.height])if(isNaN(t)||t<=0)return!0;return!1}}const at={},ot=t=>{switch(t){case\"geojson\":return tt;case\"image\":return rt;case\"raster\":return K;case\"raster-dem\":return Q;case\"vector\":return J;case\"video\":return nt;case\"canvas\":return it}return at[t]};const st=\"RTLPluginLoaded\";class lt extends e.E{constructor(){super(...arguments),this.status=\"unavailable\",this.url=null,this.dispatcher=H()}_syncState(t){return this.status=t,this.dispatcher.broadcast(\"SRPS\",{pluginStatus:t,pluginURL:this.url}).catch((t=>{throw this.status=\"error\",t}))}getRTLTextPluginStatus(){return this.status}clearRTLTextPlugin(){this.status=\"unavailable\",this.url=null}setRTLTextPlugin(t){return e._(this,arguments,void 0,(function*(t,e=!1){if(this.url)throw new Error(\"setRTLTextPlugin cannot be called multiple times.\");if(this.url=a.resolveURL(t),!this.url)throw new Error(`requested url ${t} is invalid`);if(\"unavailable\"===this.status){if(!e)return this._requestImport();this.status=\"deferred\",this._syncState(this.status)}else if(\"requested\"===this.status)return this._requestImport()}))}_requestImport(){return e._(this,void 0,void 0,(function*(){yield this._syncState(\"loading\"),this.status=\"loaded\",this.fire(new e.k(st))}))}lazyLoad(){\"unavailable\"===this.status?this.status=\"requested\":\"deferred\"===this.status&&this._requestImport()}}let ct=null;function ut(){return ct||(ct=new lt),ct}class ht{constructor(t,r){this.timeAdded=0,this.fadeEndTime=0,this.tileID=t,this.uid=e.a4(),this.uses=0,this.tileSize=r,this.buckets={},this.expirationTime=null,this.queryPadding=0,this.hasSymbolBuckets=!1,this.hasRTLText=!1,this.dependencies={},this.rtt=[],this.rttCoords={},this.expiredRequestCount=0,this.state=\"loading\"}registerFadeDuration(t){const e=t+this.timeAdded;ee.getLayer(t))).filter(Boolean);if(0!==t.length){n.layers=t,n.stateDependentLayerIds&&(n.stateDependentLayers=n.stateDependentLayerIds.map((e=>t.filter((t=>t.id===e))[0])));for(const e of t)r[e.id]=n}}return r}(t.buckets,r.style),this.hasSymbolBuckets=!1;for(const t in this.buckets){const r=this.buckets[t];if(r instanceof e.a6){if(this.hasSymbolBuckets=!0,!n)break;r.justReloaded=!0}}if(this.hasRTLText=!1,this.hasSymbolBuckets)for(const t in this.buckets){const r=this.buckets[t];if(r instanceof e.a6&&r.hasRTLText){this.hasRTLText=!0,ut().lazyLoad();break}}this.queryPadding=0;for(const t in this.buckets){const e=this.buckets[t];this.queryPadding=Math.max(this.queryPadding,r.style.getLayer(t).queryRadius(e))}t.imageAtlas&&(this.imageAtlas=t.imageAtlas),t.glyphAtlasImage&&(this.glyphAtlasImage=t.glyphAtlasImage)}else this.collisionBoxArray=new e.a5}unloadVectorData(){for(const t in this.buckets)this.buckets[t].destroy();this.buckets={},this.imageAtlasTexture&&this.imageAtlasTexture.destroy(),this.imageAtlas&&(this.imageAtlas=null),this.glyphAtlasTexture&&this.glyphAtlasTexture.destroy(),this.latestFeatureIndex=null,this.state=\"unloaded\"}getBucket(t){return this.buckets[t.id]}upload(t){for(const e in this.buckets){const r=this.buckets[e];r.uploadPending()&&r.upload(t)}const e=t.gl;this.imageAtlas&&!this.imageAtlas.uploaded&&(this.imageAtlasTexture=new w(t,this.imageAtlas.image,e.RGBA),this.imageAtlas.uploaded=!0),this.glyphAtlasImage&&(this.glyphAtlasTexture=new w(t,this.glyphAtlasImage,e.ALPHA),this.glyphAtlasImage=null)}prepare(t){this.imageAtlas&&this.imageAtlas.patchUpdatedImages(t,this.imageAtlasTexture)}queryRenderedFeatures(t,e,r,n,i,a,o,s,l,c){return this.latestFeatureIndex&&this.latestFeatureIndex.rawTileData?this.latestFeatureIndex.query({queryGeometry:n,cameraQueryGeometry:i,scale:a,tileSize:this.tileSize,pixelPosMatrix:c,transform:s,params:o,queryPadding:this.queryPadding*l},t,e,r):{}}querySourceFeatures(t,r){const n=this.latestFeatureIndex;if(!n||!n.rawTileData)return;const i=n.loadVTLayers(),a=r&&r.sourceLayer?r.sourceLayer:\"\",o=i._geojsonTileLayer||i[a];if(!o)return;const s=e.a7(r&&r.filter),{z:l,x:c,y:u}=this.tileID.canonical,h={z:l,x:c,y:u};for(let r=0;rt)e=!1;else if(r)if(this.expirationTime{this.remove(t,i)}),r)),this.data[n].push(i),this.order.push(n),this.order.length>this.max){const t=this._getAndRemoveByKey(this.order[0]);t&&this.onRemove(t)}return this}has(t){return t.wrapped().key in this.data}getAndRemove(t){return this.has(t)?this._getAndRemoveByKey(t.wrapped().key):null}_getAndRemoveByKey(t){const e=this.data[t].shift();return e.timeout&&clearTimeout(e.timeout),0===this.data[t].length&&delete this.data[t],this.order.splice(this.order.indexOf(t),1),e.value}getByKey(t){const e=this.data[t];return e?e[0].value:null}get(t){return this.has(t)?this.data[t.wrapped().key][0].value:null}remove(t,e){if(!this.has(t))return this;const r=t.wrapped().key,n=void 0===e?0:this.data[r].indexOf(e),i=this.data[r][n];return this.data[r].splice(n,1),i.timeout&&clearTimeout(i.timeout),0===this.data[r].length&&delete this.data[r],this.onRemove(i.value),this.order.splice(this.order.indexOf(r),1),this}setMaxSize(t){for(this.max=t;this.order.length>this.max;){const t=this._getAndRemoveByKey(this.order[0]);t&&this.onRemove(t)}return this}filter(t){const e=[];for(const r in this.data)for(const n of this.data[r])t(n.value)||e.push(n);for(const t of e)this.remove(t.value.tileID,t)}}class pt{constructor(){this.state={},this.stateChanges={},this.deletedStates={}}updateState(t,r,n){const i=String(r);if(this.stateChanges[t]=this.stateChanges[t]||{},this.stateChanges[t][i]=this.stateChanges[t][i]||{},e.e(this.stateChanges[t][i],n),null===this.deletedStates[t]){this.deletedStates[t]={};for(const e in this.state[t])e!==i&&(this.deletedStates[t][e]=null)}else if(this.deletedStates[t]&&null===this.deletedStates[t][i]){this.deletedStates[t][i]={};for(const e in this.state[t][i])n[e]||(this.deletedStates[t][i][e]=null)}else for(const e in n)this.deletedStates[t]&&this.deletedStates[t][i]&&null===this.deletedStates[t][i][e]&&delete this.deletedStates[t][i][e]}removeFeatureState(t,e,r){if(null===this.deletedStates[t])return;const n=String(e);if(this.deletedStates[t]=this.deletedStates[t]||{},r&&void 0!==e)null!==this.deletedStates[t][n]&&(this.deletedStates[t][n]=this.deletedStates[t][n]||{},this.deletedStates[t][n][r]=null);else if(void 0!==e)if(this.stateChanges[t]&&this.stateChanges[t][n])for(r in this.deletedStates[t][n]={},this.stateChanges[t][n])this.deletedStates[t][n][r]=null;else this.deletedStates[t][n]=null;else this.deletedStates[t]=null}getState(t,r){const n=String(r),i=this.state[t]||{},a=this.stateChanges[t]||{},o=e.e({},i[n],a[n]);if(null===this.deletedStates[t])return{};if(this.deletedStates[t]){const e=this.deletedStates[t][r];if(null===e)return{};for(const t in e)delete o[t]}return o}initializeTileState(t,e){t.setFeatureState(this.state,e)}coalesceChanges(t,r){const n={};for(const t in this.stateChanges){this.state[t]=this.state[t]||{};const r={};for(const n in this.stateChanges[t])this.state[t][n]||(this.state[t][n]={}),e.e(this.state[t][n],this.stateChanges[t][n]),r[n]=this.state[t][n];n[t]=r}for(const t in this.deletedStates){this.state[t]=this.state[t]||{};const r={};if(null===this.deletedStates[t])for(const e in this.state[t])r[e]={},this.state[t][e]={};else for(const e in this.deletedStates[t]){if(null===this.deletedStates[t][e])this.state[t][e]={};else for(const r of Object.keys(this.deletedStates[t][e]))delete this.state[t][e][r];r[e]=this.state[t][e]}n[t]=n[t]||{},e.e(n[t],r)}if(this.stateChanges={},this.deletedStates={},0!==Object.keys(n).length)for(const e in t)t[e].setFeatureState(n,r)}}class dt extends e.E{constructor(t,e,r){super(),this.id=t,this.dispatcher=r,this.on(\"data\",(t=>this._dataHandler(t))),this.on(\"dataloading\",(()=>{this._sourceErrored=!1})),this.on(\"error\",(()=>{this._sourceErrored=this._source.loaded()})),this._source=((t,e,r,n)=>{const i=new(ot(e.type))(t,e,r,n);if(i.id!==t)throw new Error(`Expected Source id to be ${t} instead of ${i.id}`);return i})(t,e,r,this),this._tiles={},this._cache=new ft(0,(t=>this._unloadTile(t))),this._timers={},this._cacheTimers={},this._maxTileCacheSize=null,this._maxTileCacheZoomLevels=null,this._loadedParentTiles={},this._coveredTiles={},this._state=new pt,this._didEmitContent=!1,this._updated=!1}onAdd(t){this.map=t,this._maxTileCacheSize=t?t._maxTileCacheSize:null,this._maxTileCacheZoomLevels=t?t._maxTileCacheZoomLevels:null,this._source&&this._source.onAdd&&this._source.onAdd(t)}onRemove(t){this.clearTiles(),this._source&&this._source.onRemove&&this._source.onRemove(t)}loaded(){if(this._sourceErrored)return!0;if(!this._sourceLoaded)return!1;if(!this._source.loaded())return!1;if(!(void 0===this.used&&void 0===this.usedForTerrain||this.used||this.usedForTerrain))return!0;if(!this._updated)return!1;for(const t in this._tiles){const e=this._tiles[t];if(\"loaded\"!==e.state&&\"errored\"!==e.state)return!1}return!0}getSource(){return this._source}pause(){this._paused=!0}resume(){if(!this._paused)return;const t=this._shouldReloadOnResume;this._paused=!1,this._shouldReloadOnResume=!1,t&&this.reload(),this.transform&&this.update(this.transform,this.terrain)}_loadTile(t,r,n){return e._(this,void 0,void 0,(function*(){try{yield this._source.loadTile(t),this._tileLoaded(t,r,n)}catch(r){t.state=\"errored\",404!==r.status?this._source.fire(new e.j(r,{tile:t})):this.update(this.transform,this.terrain)}}))}_unloadTile(t){this._source.unloadTile&&this._source.unloadTile(t)}_abortTile(t){this._source.abortTile&&this._source.abortTile(t),this._source.fire(new e.k(\"dataabort\",{tile:t,coord:t.tileID,dataType:\"source\"}))}serialize(){return this._source.serialize()}prepare(t){this._source.prepare&&this._source.prepare(),this._state.coalesceChanges(this._tiles,this.map?this.map.painter:null);for(const e in this._tiles){const r=this._tiles[e];r.upload(t),r.prepare(this.map.style.imageManager)}}getIds(){return Object.values(this._tiles).map((t=>t.tileID)).sort(mt).map((t=>t.key))}getRenderableIds(t){const r=[];for(const e in this._tiles)this._isIdRenderable(e,t)&&r.push(this._tiles[e]);return t?r.sort(((t,r)=>{const n=t.tileID,i=r.tileID,a=new e.P(n.canonical.x,n.canonical.y)._rotate(this.transform.angle),o=new e.P(i.canonical.x,i.canonical.y)._rotate(this.transform.angle);return n.overscaledZ-i.overscaledZ||o.y-a.y||o.x-a.x})).map((t=>t.tileID.key)):r.map((t=>t.tileID)).sort(mt).map((t=>t.key))}hasRenderableParent(t){const e=this.findLoadedParent(t,0);return!!e&&this._isIdRenderable(e.tileID.key)}_isIdRenderable(t,e){return this._tiles[t]&&this._tiles[t].hasData()&&!this._coveredTiles[t]&&(e||!this._tiles[t].holdingForFade())}reload(){if(this._paused)this._shouldReloadOnResume=!0;else{this._cache.reset();for(const t in this._tiles)\"errored\"!==this._tiles[t].state&&this._reloadTile(t,\"reloading\")}}_reloadTile(t,r){return e._(this,void 0,void 0,(function*(){const e=this._tiles[t];e&&(\"loading\"!==e.state&&(e.state=r),yield this._loadTile(e,t,r))}))}_tileLoaded(t,r,n){t.timeAdded=a.now(),\"expired\"===n&&(t.refreshedUponExpiration=!0),this._setTileReloadTimer(r,t),\"raster-dem\"===this.getSource().type&&t.dem&&this._backfillDEM(t),this._state.initializeTileState(t,this.map?this.map.painter:null),t.aborted||this._source.fire(new e.k(\"data\",{dataType:\"source\",tile:t,coord:t.tileID}))}_backfillDEM(t){const e=this.getRenderableIds();for(let n=0;n1||(Math.abs(r)>1&&(1===Math.abs(r+i)?r+=i:1===Math.abs(r-i)&&(r-=i)),e.dem&&t.dem&&(t.dem.backfillBorder(e.dem,r,n),t.neighboringTiles&&t.neighboringTiles[a]&&(t.neighboringTiles[a].backfilled=!0)))}}getTile(t){return this.getTileByID(t.key)}getTileByID(t){return this._tiles[t]}_retainLoadedChildren(t,e,r,n){for(const i in this._tiles){let a=this._tiles[i];if(n[i]||!a.hasData()||a.tileID.overscaledZ<=e||a.tileID.overscaledZ>r)continue;let o=a.tileID;for(;a&&a.tileID.overscaledZ>e+1;){const t=a.tileID.scaledTo(a.tileID.overscaledZ-1);a=this._tiles[t.key],a&&a.hasData()&&(o=t)}let s=o;for(;s.overscaledZ>e;)if(s=s.scaledTo(s.overscaledZ-1),t[s.key]){n[o.key]=o;break}}}findLoadedParent(t,e){if(t.key in this._loadedParentTiles){const r=this._loadedParentTiles[t.key];return r&&r.tileID.overscaledZ>=e?r:null}for(let r=t.overscaledZ-1;r>=e;r--){const e=t.scaledTo(r),n=this._getLoadedTile(e);if(n)return n}}findLoadedSibling(t){return this._getLoadedTile(t)}_getLoadedTile(t){const e=this._tiles[t.key];return e&&e.hasData()?e:this._cache.getByKey(t.wrapped().key)}updateCacheSize(t){const r=(Math.ceil(t.width/this._source.tileSize)+1)*(Math.ceil(t.height/this._source.tileSize)+1),n=null===this._maxTileCacheZoomLevels?e.a.MAX_TILE_CACHE_ZOOM_LEVELS:this._maxTileCacheZoomLevels,i=Math.floor(r*n),a=\"number\"==typeof this._maxTileCacheSize?Math.min(this._maxTileCacheSize,i):i;this._cache.setMaxSize(a)}handleWrapJump(t){const e=(t-(void 0===this._prevLng?t:this._prevLng))/360,r=Math.round(e);if(this._prevLng=t,r){const t={};for(const e in this._tiles){const n=this._tiles[e];n.tileID=n.tileID.unwrapTo(n.tileID.wrap+r),t[n.tileID.key]=n}this._tiles=t;for(const t in this._timers)clearTimeout(this._timers[t]),delete this._timers[t];for(const t in this._tiles){const e=this._tiles[t];this._setTileReloadTimer(t,e)}}}_updateCoveredAndRetainedTiles(t,e,r,n,i,o){const s={},l={},c=Object.keys(t),u=a.now();for(const r of c){const n=t[r],i=this._tiles[r];if(!i||0!==i.fadeEndTime&&i.fadeEndTime<=u)continue;const a=this.findLoadedParent(n,e),o=this.findLoadedSibling(n),c=a||o||null;c&&(this._addTile(c.tileID),s[c.tileID.key]=c.tileID),l[r]=n}this._retainLoadedChildren(l,n,r,t);for(const e in s)t[e]||(this._coveredTiles[e]=!0,t[e]=s[e]);if(o){const e={},r={};for(const t of i)this._tiles[t.key].hasData()?e[t.key]=t:r[t.key]=t;for(const n in r){const i=r[n].children(this._source.maxzoom);this._tiles[i[0].key]&&this._tiles[i[1].key]&&this._tiles[i[2].key]&&this._tiles[i[3].key]&&(e[i[0].key]=t[i[0].key]=i[0],e[i[1].key]=t[i[1].key]=i[1],e[i[2].key]=t[i[2].key]=i[2],e[i[3].key]=t[i[3].key]=i[3],delete r[n])}for(const n in r){const i=r[n],a=this.findLoadedParent(i,this._source.minzoom),o=this.findLoadedSibling(i),s=a||o||null;if(s){e[s.tileID.key]=t[s.tileID.key]=s.tileID;for(const t in e)e[t].isChildOf(s.tileID)&&delete e[t]}}for(const t in this._tiles)e[t]||(this._coveredTiles[t]=!0)}}update(t,r){if(!this._sourceLoaded||this._paused)return;let n;this.transform=t,this.terrain=r,this.updateCacheSize(t),this.handleWrapJump(this.transform.center.lng),this._coveredTiles={},this.used||this.usedForTerrain?this._source.tileID?n=t.getVisibleUnwrappedCoordinates(this._source.tileID).map((t=>new e.S(t.canonical.z,t.wrap,t.canonical.z,t.canonical.x,t.canonical.y))):(n=t.coveringTiles({tileSize:this.usedForTerrain?this.tileSize:this._source.tileSize,minzoom:this._source.minzoom,maxzoom:this._source.maxzoom,roundZoom:!this.usedForTerrain&&this._source.roundZoom,reparseOverscaled:this._source.reparseOverscaled,terrain:r}),this._source.hasTile&&(n=n.filter((t=>this._source.hasTile(t))))):n=[];const i=t.coveringZoomLevel(this._source),a=Math.max(i-dt.maxOverzooming,this._source.minzoom),o=Math.max(i+dt.maxUnderzooming,this._source.minzoom);if(this.usedForTerrain){const t={};for(const e of n)if(e.canonical.z>this._source.minzoom){const r=e.scaledTo(e.canonical.z-1);t[r.key]=r;const n=e.scaledTo(Math.max(this._source.minzoom,Math.min(e.canonical.z,5)));t[n.key]=n}n=n.concat(Object.values(t))}const s=0===n.length&&!this._updated&&this._didEmitContent;this._updated=!0,s&&this.fire(new e.k(\"data\",{sourceDataType:\"idle\",dataType:\"source\",sourceId:this.id}));const l=this._updateRetainedTiles(n,i);gt(this._source.type)&&this._updateCoveredAndRetainedTiles(l,a,o,i,n,r);for(const t in l)this._tiles[t].clearFadeHold();const c=e.ac(this._tiles,l);for(const t of c){const e=this._tiles[t];e.hasSymbolBuckets&&!e.holdingForFade()?e.setHoldDuration(this.map._fadeDuration):e.hasSymbolBuckets&&!e.symbolFadeFinished()||this._removeTile(t)}this._updateLoadedParentTileCache(),this._updateLoadedSiblingTileCache()}releaseSymbolFadeTiles(){for(const t in this._tiles)this._tiles[t].holdingForFade()&&this._removeTile(t)}_updateRetainedTiles(t,e){var r;const n={},i={},a=Math.max(e-dt.maxOverzooming,this._source.minzoom),o=Math.max(e+dt.maxUnderzooming,this._source.minzoom),s={};for(const r of t){const t=this._addTile(r);n[r.key]=r,t.hasData()||ethis._source.maxzoom){const t=o.children(this._source.maxzoom)[0],e=this.getTile(t);if(e&&e.hasData()){n[t.key]=t;continue}}else{const t=o.children(this._source.maxzoom);if(n[t[0].key]&&n[t[1].key]&&n[t[2].key]&&n[t[3].key])continue}let s=t.wasRequested();for(let e=o.overscaledZ-1;e>=a;--e){const a=o.scaledTo(e);if(i[a.key])break;if(i[a.key]=!0,t=this.getTile(a),!t&&s&&(t=this._addTile(a)),t){const e=t.hasData();if((e||!(null===(r=this.map)||void 0===r?void 0:r.cancelPendingTileRequestsWhileZooming)||s)&&(n[a.key]=a),s=t.wasRequested(),e)break}}}return n}_updateLoadedParentTileCache(){this._loadedParentTiles={};for(const t in this._tiles){const e=[];let r,n=this._tiles[t].tileID;for(;n.overscaledZ>0;){if(n.key in this._loadedParentTiles){r=this._loadedParentTiles[n.key];break}e.push(n.key);const t=n.scaledTo(n.overscaledZ-1);if(r=this._getLoadedTile(t),r)break;n=t}for(const t of e)this._loadedParentTiles[t]=r}}_updateLoadedSiblingTileCache(){this._loadedSiblingTiles={};for(const t in this._tiles){const e=this._tiles[t].tileID,r=this._getLoadedTile(e);this._loadedSiblingTiles[e.key]=r}}_addTile(t){let r=this._tiles[t.key];if(r)return r;r=this._cache.getAndRemove(t),r&&(this._setTileReloadTimer(t.key,r),r.tileID=t,this._state.initializeTileState(r,this.map?this.map.painter:null),this._cacheTimers[t.key]&&(clearTimeout(this._cacheTimers[t.key]),delete this._cacheTimers[t.key],this._setTileReloadTimer(t.key,r)));const n=r;return r||(r=new ht(t,this._source.tileSize*t.overscaleFactor()),this._loadTile(r,t.key,r.state)),r.uses++,this._tiles[t.key]=r,n||this._source.fire(new e.k(\"dataloading\",{tile:r,coord:r.tileID,dataType:\"source\"})),r}_setTileReloadTimer(t,e){t in this._timers&&(clearTimeout(this._timers[t]),delete this._timers[t]);const r=e.getExpiryTimeout();r&&(this._timers[t]=setTimeout((()=>{this._reloadTile(t,\"expired\"),delete this._timers[t]}),r))}_removeTile(t){const e=this._tiles[t];e&&(e.uses--,delete this._tiles[t],this._timers[t]&&(clearTimeout(this._timers[t]),delete this._timers[t]),e.uses>0||(e.hasData()&&\"reloading\"!==e.state?this._cache.add(e.tileID,e,e.getExpiryTimeout()):(e.aborted=!0,this._abortTile(e),this._unloadTile(e))))}_dataHandler(t){const e=t.sourceDataType;\"source\"===t.dataType&&\"metadata\"===e&&(this._sourceLoaded=!0),this._sourceLoaded&&!this._paused&&\"source\"===t.dataType&&\"content\"===e&&(this.reload(),this.transform&&this.update(this.transform,this.terrain),this._didEmitContent=!0)}clearTiles(){this._shouldReloadOnResume=!1,this._paused=!1;for(const t in this._tiles)this._removeTile(t);this._cache.reset()}tilesIn(t,r,n){const i=[],a=this.transform;if(!a)return i;const o=n?a.getCameraQueryGeometry(t):t,s=t.map((t=>a.pointCoordinate(t,this.terrain))),l=o.map((t=>a.pointCoordinate(t,this.terrain))),c=this.getIds();let u=1/0,h=1/0,f=-1/0,p=-1/0;for(const t of l)u=Math.min(u,t.x),h=Math.min(h,t.y),f=Math.max(f,t.x),p=Math.max(p,t.y);for(let t=0;t=0&&g[1].y+m>=0){const t=s.map((t=>o.getTilePoint(t))),e=l.map((t=>o.getTilePoint(t)));i.push({tile:n,tileID:o,queryGeometry:t,cameraQueryGeometry:e,scale:d})}}return i}getVisibleCoordinates(t){const e=this.getRenderableIds(t).map((t=>this._tiles[t].tileID));for(const t of e)t.posMatrix=this.transform.calculatePosMatrix(t.toUnwrapped());return e}hasTransition(){if(this._source.hasTransition())return!0;if(gt(this._source.type)){const t=a.now();for(const e in this._tiles)if(this._tiles[e].fadeEndTime>=t)return!0}return!1}setFeatureState(t,e,r){t=t||\"_geojsonTileLayer\",this._state.updateState(t,e,r)}removeFeatureState(t,e,r){t=t||\"_geojsonTileLayer\",this._state.removeFeatureState(t,e,r)}getFeatureState(t,e){return t=t||\"_geojsonTileLayer\",this._state.getState(t,e)}setDependencies(t,e,r){const n=this._tiles[t];n&&n.setDependencies(e,r)}reloadTilesForDependencies(t,e){for(const r in this._tiles)this._tiles[r].hasDependency(t,e)&&this._reloadTile(r,\"reloading\");this._cache.filter((r=>!r.hasDependency(t,e)))}}function mt(t,e){const r=Math.abs(2*t.wrap)-+(t.wrap<0),n=Math.abs(2*e.wrap)-+(e.wrap<0);return t.overscaledZ-e.overscaledZ||n-r||e.canonical.y-t.canonical.y||e.canonical.x-t.canonical.x}function gt(t){return\"raster\"===t||\"image\"===t||\"video\"===t}dt.maxOverzooming=10,dt.maxUnderzooming=3;class yt{constructor(t,e){this.reset(t,e)}reset(t,e){this.points=t||[],this._distances=[0];for(let t=1;t0?(i-o)/s:0;return this.points[a].mult(1-l).add(this.points[r].mult(l))}}function vt(t,e){let r=!0;return\"always\"===t||\"never\"!==t&&\"never\"!==e||(r=!1),r}class xt{constructor(t,e,r){const n=this.boxCells=[],i=this.circleCells=[];this.xCellCount=Math.ceil(t/r),this.yCellCount=Math.ceil(e/r);for(let t=0;tthis.width||n<0||e>this.height)return[];const s=[];if(t<=0&&e<=0&&this.width<=r&&this.height<=n){if(i)return[{key:null,x1:t,y1:e,x2:r,y2:n}];for(let t=0;t0}hitTestCircle(t,e,r,n,i){const a=t-r,o=t+r,s=e-r,l=e+r;if(o<0||a>this.width||l<0||s>this.height)return!1;const c=[],u={hitTest:!0,overlapMode:n,circle:{x:t,y:e,radius:r},seenUids:{box:{},circle:{}}};return this._forEachCell(a,s,o,l,this._queryCellCircle,c,u,i),c.length>0}_queryCell(t,e,r,n,i,a,o,s){const{seenUids:l,hitTest:c,overlapMode:u}=o,h=this.boxCells[i];if(null!==h){const i=this.bboxes;for(const o of h)if(!l.box[o]){l.box[o]=!0;const h=4*o,f=this.boxKeys[o];if(t<=i[h+2]&&e<=i[h+3]&&r>=i[h+0]&&n>=i[h+1]&&(!s||s(f))&&(!c||!vt(u,f.overlapMode))&&(a.push({key:f,x1:i[h],y1:i[h+1],x2:i[h+2],y2:i[h+3]}),c))return!0}}const f=this.circleCells[i];if(null!==f){const i=this.circles;for(const o of f)if(!l.circle[o]){l.circle[o]=!0;const h=3*o,f=this.circleKeys[o];if(this._circleAndRectCollide(i[h],i[h+1],i[h+2],t,e,r,n)&&(!s||s(f))&&(!c||!vt(u,f.overlapMode))){const t=i[h],e=i[h+1],r=i[h+2];if(a.push({key:f,x1:t-r,y1:e-r,x2:t+r,y2:e+r}),c)return!0}}}return!1}_queryCellCircle(t,e,r,n,i,a,o,s){const{circle:l,seenUids:c,overlapMode:u}=o,h=this.boxCells[i];if(null!==h){const t=this.bboxes;for(const e of h)if(!c.box[e]){c.box[e]=!0;const r=4*e,n=this.boxKeys[e];if(this._circleAndRectCollide(l.x,l.y,l.radius,t[r+0],t[r+1],t[r+2],t[r+3])&&(!s||s(n))&&!vt(u,n.overlapMode))return a.push(!0),!0}}const f=this.circleCells[i];if(null!==f){const t=this.circles;for(const e of f)if(!c.circle[e]){c.circle[e]=!0;const r=3*e,n=this.circleKeys[e];if(this._circlesCollide(t[r],t[r+1],t[r+2],l.x,l.y,l.radius)&&(!s||s(n))&&!vt(u,n.overlapMode))return a.push(!0),!0}}}_forEachCell(t,e,r,n,i,a,o,s){const l=this._convertToXCellCoord(t),c=this._convertToYCellCoord(e),u=this._convertToXCellCoord(r),h=this._convertToYCellCoord(n);for(let f=l;f<=u;f++)for(let l=c;l<=h;l++){const c=this.xCellCount*l+f;if(i.call(this,t,e,r,n,c,a,o,s))return}}_convertToXCellCoord(t){return Math.max(0,Math.min(this.xCellCount-1,Math.floor(t*this.xScale)))}_convertToYCellCoord(t){return Math.max(0,Math.min(this.yCellCount-1,Math.floor(t*this.yScale)))}_circlesCollide(t,e,r,n,i,a){const o=n-t,s=i-e,l=r+a;return l*l>o*o+s*s}_circleAndRectCollide(t,e,r,n,i,a,o){const s=(a-n)/2,l=Math.abs(t-(n+s));if(l>s+r)return!1;const c=(o-i)/2,u=Math.abs(e-(i+c));if(u>c+r)return!1;if(l<=s||u<=c)return!0;const h=l-s,f=u-c;return h*h+f*f<=r*r}}function _t(t,r,n,i,a){const o=e.H();return r?(e.K(o,o,[1/a,1/a,1]),n||e.ae(o,o,i.angle)):e.L(o,i.labelPlaneMatrix,t),o}function bt(t,r,n,i,a){if(r){const r=e.af(t);return e.K(r,r,[a,a,1]),n||e.ae(r,r,-i.angle),r}return i.glCoordMatrix}function wt(t,r,n){let i;n?(i=[t.x,t.y,n(t.x,t.y),1],e.ag(i,i,r)):(i=[t.x,t.y,0,1],function(t,e,r){const n=e[0],i=e[1];t[0]=r[0]*n+r[4]*i+r[12],t[1]=r[1]*n+r[5]*i+r[13],t[3]=r[3]*n+r[7]*i+r[15]}(i,i,r));const a=i[3];return{point:new e.P(i[0]/a,i[1]/a),signedDistanceFromCamera:a,isOccluded:!1}}function Tt(t,e){return.5+t/e*.5}function kt(t,e){return t.x>=-e[0]&&t.x<=e[0]&&t.y>=-e[1]&&t.y<=e[1]}function At(t,r,n,i,a,o,s,l,c,u,h,f,p,d,m){const g=i?t.textSizeData:t.iconSizeData,y=e.ah(g,n.transform.zoom),v=[256/n.width*2+1,256/n.height*2+1],x=i?t.text.dynamicLayoutVertexArray:t.icon.dynamicLayoutVertexArray;x.clear();const _=t.lineVertexArray,b=i?t.text.placedSymbolArray:t.icon.placedSymbolArray,w=n.transform.width/n.transform.height;let T=!1;for(let i=0;iMath.abs(n.x-r.x)*i?{useVertical:!0}:(t===e.ai.vertical?r.yn.x)?{needsFlipping:!0}:null}function Et(t,r,n,i,a,o,s,l,c,u,h){const f=n/24,p=r.lineOffsetX*f,d=r.lineOffsetY*f;let m;if(r.numGlyphs>1){const e=r.glyphStartIndex+r.numGlyphs,n=r.lineStartIndex,o=r.lineStartIndex+r.lineLength,c=Mt(f,l,p,d,i,r,h,t);if(!c)return{notEnoughRoom:!0};const g=wt(c.first.point,s,t.getElevation).point,y=wt(c.last.point,s,t.getElevation).point;if(a&&!i){const t=St(r.writingMode,g,y,u);if(t)return t}m=[c.first];for(let a=r.glyphStartIndex+1;a0?s.point:function(t,e,r,n,i,a){return Ct(t,e,r,n,i,a)}(t.tileAnchorPoint,a,n,1,o,t),c=St(r.writingMode,n,l,u);if(c)return c}const n=Ot(f*l.getoffsetX(r.glyphStartIndex),p,d,i,r.segment,r.lineStartIndex,r.lineStartIndex+r.lineLength,t,h);if(!n||t.projectionCache.anyProjectionOccluded)return{notEnoughRoom:!0};m=[n]}for(const t of m)e.ak(c,t.point,t.angle);return{}}function Ct(t,e,r,n,i,a){const o=t.add(t.sub(e)._unit()),s=void 0!==i?wt(o,i,a.getElevation).point:It(o.x,o.y,a).point,l=r.sub(s);return r.add(l._mult(n/l.mag()))}function Lt(t,r,n){const i=r.projectionCache;if(i.projections[t])return i.projections[t];const a=new e.P(r.lineVertexArray.getx(t),r.lineVertexArray.gety(t)),o=It(a.x,a.y,r);if(o.signedDistanceFromCamera>0)return i.projections[t]=o.point,i.anyProjectionOccluded=i.anyProjectionOccluded||o.isOccluded,o.point;const s=t-n.direction,l=0===n.distanceFromAnchor?r.tileAnchorPoint:new e.P(r.lineVertexArray.getx(s),r.lineVertexArray.gety(s)),c=n.absOffsetX-n.distanceFromAnchor+1;return function(t,e,r,n,i){return Ct(t,e,r,n,void 0,i)}(l,a,n.previousVertex,c,r)}function It(t,r,n){const i=t+n.translation[0],a=r+n.translation[1];let o;return!n.pitchWithMap&&n.projection.useSpecialProjectionForSymbols?(o=n.projection.projectTileCoordinates(i,a,n.unwrappedTileID,n.getElevation),o.point.x=(.5*o.point.x+.5)*n.width,o.point.y=(.5*-o.point.y+.5)*n.height):(o=wt(new e.P(i,a),n.labelPlaneMatrix,n.getElevation),o.isOccluded=!1),o}function Pt(t,e,r){return t._unit()._perp()._mult(e*r)}function zt(t,r,n,i,a,o,s,l,c){if(l.projectionCache.offsets[t])return l.projectionCache.offsets[t];const u=n.add(r);if(t+c.direction=a)return l.projectionCache.offsets[t]=u,u;const h=Lt(t+c.direction,l,c),f=Pt(h.sub(n),s,c.direction),p=n.add(f),d=h.add(f);return l.projectionCache.offsets[t]=e.al(o,u,p,d)||u,l.projectionCache.offsets[t]}function Ot(t,e,r,n,i,a,o,s,l){const c=n?t-e:t+e;let u=c>0?1:-1,h=0;n&&(u*=-1,h=Math.PI),u<0&&(h+=Math.PI);let f,p=u>0?a+i:a+i+1;s.projectionCache.cachedAnchorPoint?f=s.projectionCache.cachedAnchorPoint:(f=It(s.tileAnchorPoint.x,s.tileAnchorPoint.y,s).point,s.projectionCache.cachedAnchorPoint=f);let d,m,g=f,y=f,v=0,x=0;const _=Math.abs(c),b=[];let w;for(;v+x<=_;){if(p+=u,p=o)return null;v+=x,y=g,m=d;const t={absOffsetX:_,direction:u,distanceFromAnchor:v,previousVertex:y};if(g=Lt(p,s,t),0===r)b.push(y),w=g.sub(y);else{let e;const n=g.sub(y);e=0===n.mag()?Pt(Lt(p+u,s,t).sub(g),r,u):Pt(n,r,u),m||(m=y.add(e)),d=zt(p,e,g,a,o,m,r,s,t),b.push(m),w=d.sub(m)}x=w.mag()}const T=(_-v)/x,k=w._mult(T)._add(m||y),A=h+Math.atan2(g.y-y.y,g.x-y.x);return b.push(k),{point:k,angle:l?A:0,path:b}}const Dt=new Float32Array([-1/0,-1/0,0,-1/0,-1/0,0,-1/0,-1/0,0,-1/0,-1/0,0]);function Rt(t,e){for(let r=0;r=1;t--)l.push(o.path[t]);for(let t=1;tt.signedDistanceFromCamera<=0))?[]:t.map((t=>t.point))}let m=[];if(l.length>0){const t=l[0].clone(),r=l[0].clone();for(let e=1;e=n.x&&r.x<=i.x&&t.y>=n.y&&r.y<=i.y?[l]:r.xi.x||r.yi.y?[]:e.am([l],n.x,n.y,i.x,i.y)}for(const e of m){a.reset(e,.25*r);let n=0;n=a.length<=.5*r?1:Math.ceil(a.paddedLength/h)+1;for(let e=0;ewt(t,r,e.getElevation)))}queryRenderedSymbols(t){if(0===t.length||0===this.grid.keysLength()&&0===this.ignoredGrid.keysLength())return{};const r=[];let n=1/0,i=1/0,a=-1/0,o=-1/0;for(const s of t){const t=new e.P(s.x+Ft,s.y+Ft);n=Math.min(n,t.x),i=Math.min(i,t.y),a=Math.max(a,t.x),o=Math.max(o,t.y),r.push(t)}const s=this.grid.query(n,i,a,o).concat(this.ignoredGrid.query(n,i,a,o)),l={},c={};for(const t of s){const n=t.key;if(void 0===l[n.bucketInstanceId]&&(l[n.bucketInstanceId]={}),l[n.bucketInstanceId][n.featureIndex])continue;const i=[new e.P(t.x1,t.y1),new e.P(t.x2,t.y1),new e.P(t.x2,t.y2),new e.P(t.x1,t.y2)];e.an(r,i)&&(l[n.bucketInstanceId][n.featureIndex]=!0,void 0===c[n.bucketInstanceId]&&(c[n.bucketInstanceId]=[]),c[n.bucketInstanceId].push(n.featureIndex))}return c}insertCollisionBox(t,e,r,n,i,a){const o={bucketInstanceId:n,featureIndex:i,collisionGroupID:a,overlapMode:e};(r?this.ignoredGrid:this.grid).insert(o,t[0],t[1],t[2],t[3])}insertCollisionCircles(t,e,r,n,i,a){const o=r?this.ignoredGrid:this.grid,s={bucketInstanceId:n,featureIndex:i,collisionGroupID:a,overlapMode:e};for(let e=0;e=this.screenRightBoundary||nthis.screenBottomBoundary}isInsideGrid(t,e,r,n){return r>=0&&t=0&&ethis.projectAndGetPerspectiveRatio(n,t.x,t.y,i,c)));A=t.some((t=>!t.isOccluded)),k=t.map((t=>t.point))}else A=!0;return{box:e.ap(k),allPointsOccluded:!A}}}function Nt(t,r,n){return r*(e.X/(t.tileSize*Math.pow(2,n-t.tileID.overscaledZ)))}class jt{constructor(t,e,r,n){this.opacity=t?Math.max(0,Math.min(1,t.opacity+(t.placed?e:-e))):n&&r?1:0,this.placed=r}isHidden(){return 0===this.opacity&&!this.placed}}class Ut{constructor(t,e,r,n,i){this.text=new jt(t?t.text:null,e,r,i),this.icon=new jt(t?t.icon:null,e,n,i)}isHidden(){return this.text.isHidden()&&this.icon.isHidden()}}class Vt{constructor(t,e,r){this.text=t,this.icon=e,this.skipFade=r}}class qt{constructor(){this.invProjMatrix=e.H(),this.viewportMatrix=e.H(),this.circles=[]}}class Ht{constructor(t,e,r,n,i){this.bucketInstanceId=t,this.featureIndex=e,this.sourceLayerIndex=r,this.bucketIndex=n,this.tileID=i}}class Gt{constructor(t){this.crossSourceCollisions=t,this.maxGroupID=0,this.collisionGroups={}}get(t){if(this.crossSourceCollisions)return{ID:0,predicate:null};if(!this.collisionGroups[t]){const e=++this.maxGroupID;this.collisionGroups[t]={ID:e,predicate:t=>t.collisionGroupID===e}}return this.collisionGroups[t]}}function Zt(t,r,n,i,a){const{horizontalAlign:o,verticalAlign:s}=e.av(t),l=-(o-.5)*r,c=-(s-.5)*n;return new e.P(l+i[0]*a,c+i[1]*a)}class Wt{constructor(t,e,r,n,i,a){this.transform=t.clone(),this.terrain=r,this.collisionIndex=new Bt(this.transform,e),this.placements={},this.opacities={},this.variableOffsets={},this.stale=!1,this.commitTime=0,this.fadeDuration=n,this.retainedQueryData={},this.collisionGroups=new Gt(i),this.collisionCircleArrays={},this.collisionBoxArrays=new Map,this.prevPlacement=a,a&&(a.prevPlacement=void 0),this.placedOrientations={}}_getTerrainElevationFunc(t){const e=this.terrain;return e?(r,n)=>e.getElevation(t,r,n):null}getBucketParts(t,r,n,i){const a=n.getBucket(r),o=n.latestFeatureIndex;if(!a||!o||r.id!==a.layerIds[0])return;const s=n.collisionBoxArray,l=a.layers[0].layout,c=a.layers[0].paint,u=Math.pow(2,this.transform.zoom-n.tileID.overscaledZ),h=n.tileSize/e.X,f=n.tileID.toUnwrapped(),p=this.transform.calculatePosMatrix(f),d=\"map\"===l.get(\"text-pitch-alignment\"),m=\"map\"===l.get(\"text-rotation-alignment\"),g=Nt(n,1,this.transform.zoom),y=this.collisionIndex.mapProjection.translatePosition(this.transform,n,c.get(\"text-translate\"),c.get(\"text-translate-anchor\")),v=this.collisionIndex.mapProjection.translatePosition(this.transform,n,c.get(\"icon-translate\"),c.get(\"icon-translate-anchor\")),x=_t(p,d,m,this.transform,g);let _=null;if(d){const t=bt(p,d,m,this.transform,g);_=e.L([],this.transform.labelPlaneMatrix,t)}this.retainedQueryData[a.bucketInstanceId]=new Ht(a.bucketInstanceId,o,a.sourceLayerIndex,a.index,n.tileID);const b={bucket:a,layout:l,translationText:y,translationIcon:v,posMatrix:p,unwrappedTileID:f,textLabelPlaneMatrix:x,labelToScreenMatrix:_,scale:u,textPixelRatio:h,holdingForFade:n.holdingForFade(),collisionBoxArray:s,partiallyEvaluatedTextSize:e.ah(a.textSizeData,this.transform.zoom),collisionGroup:this.collisionGroups.get(a.sourceID)};if(i)for(const e of a.sortKeyRanges){const{sortKey:r,symbolInstanceStart:n,symbolInstanceEnd:i}=e;t.push({sortKey:r,symbolInstanceStart:n,symbolInstanceEnd:i,parameters:b})}else t.push({symbolInstanceStart:0,symbolInstanceEnd:a.symbolInstances.length,parameters:b})}attemptAnchorPlacement(t,r,n,i,a,o,s,l,c,u,h,f,p,d,m,g,y,v,x){const _=e.ar[t.textAnchor],b=[t.textOffset0,t.textOffset1],w=Zt(_,n,i,b,a),T=this.collisionIndex.placeCollisionBox(r,f,l,c,u,s,o,g,h.predicate,x,w);if((!v||this.collisionIndex.placeCollisionBox(v,f,l,c,u,s,o,y,h.predicate,x,w).placeable)&&T.placeable){let t;if(this.prevPlacement&&this.prevPlacement.variableOffsets[p.crossTileID]&&this.prevPlacement.placements[p.crossTileID]&&this.prevPlacement.placements[p.crossTileID].text&&(t=this.prevPlacement.variableOffsets[p.crossTileID].anchor),0===p.crossTileID)throw new Error(\"symbolInstance.crossTileID can't be 0\");return this.variableOffsets[p.crossTileID]={textOffset:b,width:n,height:i,anchor:_,textBoxScale:a,prevAnchor:t},this.markUsedJustification(d,_,p,m),d.allowVerticalPlacement&&(this.markUsedOrientation(d,m,p),this.placedOrientations[p.crossTileID]=m),{shift:w,placedGlyphBoxes:T}}}placeLayerBucketPart(t,r,n){const{bucket:i,layout:a,translationText:o,translationIcon:s,posMatrix:l,unwrappedTileID:c,textLabelPlaneMatrix:u,labelToScreenMatrix:h,textPixelRatio:f,holdingForFade:p,collisionBoxArray:d,partiallyEvaluatedTextSize:m,collisionGroup:g}=t.parameters,y=a.get(\"text-optional\"),v=a.get(\"icon-optional\"),x=e.as(a,\"text-overlap\",\"text-allow-overlap\"),_=\"always\"===x,b=e.as(a,\"icon-overlap\",\"icon-allow-overlap\"),w=\"always\"===b,T=\"map\"===a.get(\"text-rotation-alignment\"),k=\"map\"===a.get(\"text-pitch-alignment\"),A=\"none\"!==a.get(\"icon-text-fit\"),M=\"viewport-y\"===a.get(\"symbol-z-order\"),S=_&&(w||!i.hasIconData()||v),E=w&&(_||!i.hasTextData()||y);!i.collisionArrays&&d&&i.deserializeCollisionBoxes(d);const C=this.retainedQueryData[i.bucketInstanceId].tileID,L=this._getTerrainElevationFunc(C),I=(t,d,w)=>{var M,C;if(r[t.crossTileID])return;if(p)return void(this.placements[t.crossTileID]=new Vt(!1,!1,!1));let I=!1,P=!1,z=!0,O=null,D={box:null,placeable:!1,offscreen:null},R={box:null,placeable:!1,offscreen:null},F=null,B=null,N=null,j=0,U=0,V=0;d.textFeatureIndex?j=d.textFeatureIndex:t.useRuntimeCollisionCircles&&(j=t.featureIndex),d.verticalTextFeatureIndex&&(U=d.verticalTextFeatureIndex);const q=d.textBox;if(q){const r=r=>{let n=e.ai.horizontal;if(i.allowVerticalPlacement&&!r&&this.prevPlacement){const e=this.prevPlacement.placedOrientations[t.crossTileID];e&&(this.placedOrientations[t.crossTileID]=e,n=e,this.markUsedOrientation(i,n,t))}return n},a=(r,n)=>{if(i.allowVerticalPlacement&&t.numVerticalGlyphVertices>0&&d.verticalTextBox){for(const t of i.writingModes)if(t===e.ai.vertical?(D=n(),R=D):D=r(),D&&D.placeable)break}else D=r()},u=t.textAnchorOffsetStartIndex,h=t.textAnchorOffsetEndIndex;if(h===u){const n=(e,r)=>{const n=this.collisionIndex.placeCollisionBox(e,x,f,l,c,k,T,o,g.predicate,L);return n&&n.placeable&&(this.markUsedOrientation(i,r,t),this.placedOrientations[t.crossTileID]=r),n};a((()=>n(q,e.ai.horizontal)),(()=>{const r=d.verticalTextBox;return i.allowVerticalPlacement&&t.numVerticalGlyphVertices>0&&r?n(r,e.ai.vertical):{box:null,offscreen:null}})),r(D&&D.placeable)}else{let p=e.ar[null===(C=null===(M=this.prevPlacement)||void 0===M?void 0:M.variableOffsets[t.crossTileID])||void 0===C?void 0:C.anchor];const m=(r,a,d)=>{const m=r.x2-r.x1,y=r.y2-r.y1,v=t.textBoxScale,_=A&&\"never\"===b?a:null;let w=null,M=\"never\"===x?1:2,S=\"never\";p&&M++;for(let e=0;em(q,d.iconBox,e.ai.horizontal)),(()=>{const r=d.verticalTextBox,n=D&&D.placeable;return i.allowVerticalPlacement&&!n&&t.numVerticalGlyphVertices>0&&r?m(r,d.verticalIconBox,e.ai.vertical):{box:null,occluded:!0,offscreen:null}})),D&&(I=D.placeable,z=D.offscreen);const y=r(D&&D.placeable);if(!I&&this.prevPlacement){const e=this.prevPlacement.variableOffsets[t.crossTileID];e&&(this.variableOffsets[t.crossTileID]=e,this.markUsedJustification(i,e.anchor,t,y))}}}if(F=D,I=F&&F.placeable,z=F&&F.offscreen,t.useRuntimeCollisionCircles){const r=i.text.placedSymbolArray.get(t.centerJustifiedTextSymbolIndex),s=e.aj(i.textSizeData,m,r),f=a.get(\"text-padding\"),p=t.collisionCircleDiameter;B=this.collisionIndex.placeCollisionCircles(x,r,i.lineVertexArray,i.glyphOffsetArray,s,l,c,u,h,n,k,g.predicate,p,f,o,L),B.circles.length&&B.collisionDetected&&!n&&e.w(\"Collisions detected, but collision boxes are not shown\"),I=_||B.circles.length>0&&!B.collisionDetected,z=z&&B.offscreen}if(d.iconFeatureIndex&&(V=d.iconFeatureIndex),d.iconBox){const t=t=>this.collisionIndex.placeCollisionBox(t,b,f,l,c,k,T,s,g.predicate,L,A&&O?O:void 0);R&&R.placeable&&d.verticalIconBox?(N=t(d.verticalIconBox),P=N.placeable):(N=t(d.iconBox),P=N.placeable),z=z&&N.offscreen}const H=y||0===t.numHorizontalGlyphVertices&&0===t.numVerticalGlyphVertices,G=v||0===t.numIconVertices;H||G?G?H||(P=P&&I):I=P&&I:P=I=P&&I;const Z=I&&F.placeable,W=P&&N.placeable;if(Z&&(R&&R.placeable&&U?this.collisionIndex.insertCollisionBox(F.box,x,a.get(\"text-ignore-placement\"),i.bucketInstanceId,U,g.ID):this.collisionIndex.insertCollisionBox(F.box,x,a.get(\"text-ignore-placement\"),i.bucketInstanceId,j,g.ID)),W&&this.collisionIndex.insertCollisionBox(N.box,b,a.get(\"icon-ignore-placement\"),i.bucketInstanceId,V,g.ID),B&&I&&this.collisionIndex.insertCollisionCircles(B.circles,x,a.get(\"text-ignore-placement\"),i.bucketInstanceId,j,g.ID),n&&this.storeCollisionData(i.bucketInstanceId,w,d,F,N,B),0===t.crossTileID)throw new Error(\"symbolInstance.crossTileID can't be 0\");if(0===i.bucketInstanceId)throw new Error(\"bucket.bucketInstanceId can't be 0\");this.placements[t.crossTileID]=new Vt(I||S,P||E,z||i.justReloaded),r[t.crossTileID]=!0};if(M){if(0!==t.symbolInstanceStart)throw new Error(\"bucket.bucketInstanceId should be 0\");const e=i.getSortedSymbolIndexes(this.transform.angle);for(let t=e.length-1;t>=0;--t){const r=e[t];I(i.symbolInstances.get(r),i.collisionArrays[r],r)}}else for(let e=t.symbolInstanceStart;e=0&&(t.text.placedSymbolArray.get(e).crossTileID=o>=0&&e!==o?0:n.crossTileID)}markUsedOrientation(t,r,n){const i=r===e.ai.horizontal||r===e.ai.horizontalOnly?r:0,a=r===e.ai.vertical?r:0,o=[n.leftJustifiedTextSymbolIndex,n.centerJustifiedTextSymbolIndex,n.rightJustifiedTextSymbolIndex];for(const e of o)t.text.placedSymbolArray.get(e).placedOrientation=i;n.verticalPlacedTextSymbolIndex&&(t.text.placedSymbolArray.get(n.verticalPlacedTextSymbolIndex).placedOrientation=a)}commit(t){this.commitTime=t,this.zoomAtLastRecencyCheck=this.transform.zoom;const e=this.prevPlacement;let r=!1;this.prevZoomAdjustment=e?e.zoomAdjustment(this.transform.zoom):0;const n=e?e.symbolFadeChange(t):1,i=e?e.opacities:{},a=e?e.variableOffsets:{},o=e?e.placedOrientations:{};for(const t in this.placements){const e=this.placements[t],a=i[t];a?(this.opacities[t]=new Ut(a,n,e.text,e.icon),r=r||e.text!==a.text.placed||e.icon!==a.icon.placed):(this.opacities[t]=new Ut(null,n,e.text,e.icon,e.skipFade),r=r||e.text||e.icon)}for(const t in i){const e=i[t];if(!this.opacities[t]){const i=new Ut(e,n,!1,!1);i.isHidden()||(this.opacities[t]=i,r=r||e.text.placed||e.icon.placed)}}for(const t in a)this.variableOffsets[t]||!this.opacities[t]||this.opacities[t].isHidden()||(this.variableOffsets[t]=a[t]);for(const t in o)this.placedOrientations[t]||!this.opacities[t]||this.opacities[t].isHidden()||(this.placedOrientations[t]=o[t]);if(e&&void 0===e.lastPlacementChangeTime)throw new Error(\"Last placement time for previous placement is not defined\");r?this.lastPlacementChangeTime=t:\"number\"!=typeof this.lastPlacementChangeTime&&(this.lastPlacementChangeTime=e?e.lastPlacementChangeTime:t)}updateLayerOpacities(t,e){const r={};for(const n of e){const e=n.getBucket(t);e&&n.latestFeatureIndex&&t.id===e.layerIds[0]&&this.updateBucketOpacities(e,n.tileID,r,n.collisionBoxArray)}}updateBucketOpacities(t,r,n,i){t.hasTextData()&&(t.text.opacityVertexArray.clear(),t.text.hasVisibleVertices=!1),t.hasIconData()&&(t.icon.opacityVertexArray.clear(),t.icon.hasVisibleVertices=!1),t.hasIconCollisionBoxData()&&t.iconCollisionBox.collisionVertexArray.clear(),t.hasTextCollisionBoxData()&&t.textCollisionBox.collisionVertexArray.clear();const a=t.layers[0],o=a.layout,s=new Ut(null,0,!1,!1,!0),l=o.get(\"text-allow-overlap\"),c=o.get(\"icon-allow-overlap\"),u=a._unevaluatedLayout.hasValue(\"text-variable-anchor\")||a._unevaluatedLayout.hasValue(\"text-variable-anchor-offset\"),h=\"map\"===o.get(\"text-rotation-alignment\"),f=\"map\"===o.get(\"text-pitch-alignment\"),p=\"none\"!==o.get(\"icon-text-fit\"),d=new Ut(null,0,l&&(c||!t.hasIconData()||o.get(\"icon-optional\")),c&&(l||!t.hasTextData()||o.get(\"text-optional\")),!0);!t.collisionArrays&&i&&(t.hasIconCollisionBoxData()||t.hasTextCollisionBoxData())&&t.deserializeCollisionBoxes(i);const m=(t,e,r)=>{for(let n=0;n0||o>0,x=i.numIconVertices>0,_=this.placedOrientations[i.crossTileID],b=_===e.ai.vertical,w=_===e.ai.horizontal||_===e.ai.horizontalOnly;if(v){const e=re(y.text),r=b?ne:e;m(t.text,a,r);const n=w?ne:e;m(t.text,o,n);const s=y.text.isHidden();[i.rightJustifiedTextSymbolIndex,i.centerJustifiedTextSymbolIndex,i.leftJustifiedTextSymbolIndex].forEach((e=>{e>=0&&(t.text.placedSymbolArray.get(e).hidden=s||b?1:0)})),i.verticalPlacedTextSymbolIndex>=0&&(t.text.placedSymbolArray.get(i.verticalPlacedTextSymbolIndex).hidden=s||w?1:0);const l=this.variableOffsets[i.crossTileID];l&&this.markUsedJustification(t,l.anchor,i,_);const c=this.placedOrientations[i.crossTileID];c&&(this.markUsedJustification(t,\"left\",i,c),this.markUsedOrientation(t,c,i))}if(x){const e=re(y.icon),r=!(p&&i.verticalPlacedIconSymbolIndex&&b);if(i.placedIconSymbolIndex>=0){const n=r?e:ne;m(t.icon,i.numIconVertices,n),t.icon.placedSymbolArray.get(i.placedIconSymbolIndex).hidden=y.icon.isHidden()}if(i.verticalPlacedIconSymbolIndex>=0){const n=r?ne:e;m(t.icon,i.numVerticalIconVertices,n),t.icon.placedSymbolArray.get(i.verticalPlacedIconSymbolIndex).hidden=y.icon.isHidden()}}const T=g&&g.has(r)?g.get(r):{text:null,icon:null};if(t.hasIconCollisionBoxData()||t.hasTextCollisionBoxData()){const n=t.collisionArrays[r];if(n){let r=new e.P(0,0);if(n.textBox||n.verticalTextBox){let e=!0;if(u){const t=this.variableOffsets[l];t?(r=Zt(t.anchor,t.width,t.height,t.textOffset,t.textBoxScale),h&&r._rotate(f?this.transform.angle:-this.transform.angle)):e=!1}if(n.textBox||n.verticalTextBox){let i;n.textBox&&(i=b),n.verticalTextBox&&(i=w),Yt(t.textCollisionBox.collisionVertexArray,y.text.placed,!e||i,T.text,r.x,r.y)}}if(n.iconBox||n.verticalIconBox){const e=Boolean(!w&&n.verticalIconBox);let i;n.iconBox&&(i=e),n.verticalIconBox&&(i=!e),Yt(t.iconCollisionBox.collisionVertexArray,y.icon.placed,i,T.icon,p?r.x:0,p?r.y:0)}}}}if(t.sortFeatures(this.transform.angle),this.retainedQueryData[t.bucketInstanceId]&&(this.retainedQueryData[t.bucketInstanceId].featureSortOrder=t.featureSortOrder),t.hasTextData()&&t.text.opacityVertexBuffer&&t.text.opacityVertexBuffer.updateData(t.text.opacityVertexArray),t.hasIconData()&&t.icon.opacityVertexBuffer&&t.icon.opacityVertexBuffer.updateData(t.icon.opacityVertexArray),t.hasIconCollisionBoxData()&&t.iconCollisionBox.collisionVertexBuffer&&t.iconCollisionBox.collisionVertexBuffer.updateData(t.iconCollisionBox.collisionVertexArray),t.hasTextCollisionBoxData()&&t.textCollisionBox.collisionVertexBuffer&&t.textCollisionBox.collisionVertexBuffer.updateData(t.textCollisionBox.collisionVertexArray),t.text.opacityVertexArray.length!==t.text.layoutVertexArray.length/4)throw new Error(`bucket.text.opacityVertexArray.length (= ${t.text.opacityVertexArray.length}) !== bucket.text.layoutVertexArray.length (= ${t.text.layoutVertexArray.length}) / 4`);if(t.icon.opacityVertexArray.length!==t.icon.layoutVertexArray.length/4)throw new Error(`bucket.icon.opacityVertexArray.length (= ${t.icon.opacityVertexArray.length}) !== bucket.icon.layoutVertexArray.length (= ${t.icon.layoutVertexArray.length}) / 4`);if(t.bucketInstanceId in this.collisionCircleArrays){const e=this.collisionCircleArrays[t.bucketInstanceId];t.placementInvProjMatrix=e.invProjMatrix,t.placementViewportMatrix=e.viewportMatrix,t.collisionCircleArray=e.circles,delete this.collisionCircleArrays[t.bucketInstanceId]}}symbolFadeChange(t){return 0===this.fadeDuration?1:(t-this.commitTime)/this.fadeDuration+this.prevZoomAdjustment}zoomAdjustment(t){return Math.max(0,(this.transform.zoom-t)/1.5)}hasTransitions(t){return this.stale||t-this.lastPlacementChangeTimet}setStale(){this.stale=!0}}function Yt(t,e,r,n,i,a){n&&0!==n.length||(n=[0,0,0,0]);const o=n[0]-Ft,s=n[1]-Ft,l=n[2]-Ft,c=n[3]-Ft;t.emplaceBack(e?1:0,r?1:0,i||0,a||0,o,s),t.emplaceBack(e?1:0,r?1:0,i||0,a||0,l,s),t.emplaceBack(e?1:0,r?1:0,i||0,a||0,l,c),t.emplaceBack(e?1:0,r?1:0,i||0,a||0,o,c)}const Xt=Math.pow(2,25),$t=Math.pow(2,24),Jt=Math.pow(2,17),Kt=Math.pow(2,16),Qt=Math.pow(2,9),te=Math.pow(2,8),ee=Math.pow(2,1);function re(t){if(0===t.opacity&&!t.placed)return 0;if(1===t.opacity&&t.placed)return 4294967295;const e=t.placed?1:0,r=Math.floor(127*t.opacity);return r*Xt+e*$t+r*Jt+e*Kt+r*Qt+e*te+r*ee+e}const ne=0;function ie(){return{isOccluded(t,e,r){return!1},getPitchedTextCorrection(t,e,r){return 1},get useSpecialProjectionForSymbols(){return!1},projectTileCoordinates(t,e,r,n){throw new Error(\"Not implemented.\")},translatePosition(t,e,r,n){return function(t,e,r,n,i=!1){if(!r[0]&&!r[1])return[0,0];const a=i?\"map\"===n?t.angle:0:\"viewport\"===n?-t.angle:0;if(a){const t=Math.sin(a),e=Math.cos(a);r=[r[0]*e-r[1]*t,r[0]*t+r[1]*e]}return[i?r[0]:Nt(e,r[0],t.zoom),i?r[1]:Nt(e,r[1],t.zoom)]}(t,e,r,n)},getCircleRadiusCorrection(t){return 1}}}class ae{constructor(t){this._sortAcrossTiles=\"viewport-y\"!==t.layout.get(\"symbol-z-order\")&&!t.layout.get(\"symbol-sort-key\").isConstant(),this._currentTileIndex=0,this._currentPartIndex=0,this._seenCrossTileIDs={},this._bucketParts=[]}continuePlacement(t,e,r,n,i){const a=this._bucketParts;for(;this._currentTileIndext.sortKey-e.sortKey)));this._currentPartIndex!this._forceFullPlacement&&a.now()-n>2;for(;this._currentPlacementIndex>=0;){const n=e[t[this._currentPlacementIndex]],a=this.placement.collisionIndex.transform.zoom;if(\"symbol\"===n.type&&(!n.minzoom||n.minzoom<=a)&&(!n.maxzoom||n.maxzoom>a)){if(this._inProgressLayer||(this._inProgressLayer=new ae(n)),this._inProgressLayer.continuePlacement(r[n.source],this.placement,this._showCollisionBoxes,n,i))return;delete this._inProgressLayer}this._currentPlacementIndex--}this._done=!0}commit(t){return this.placement.commit(t),this.placement}}const se=512/e.X/2;class le{constructor(t,r,n){this.tileID=t,this.bucketInstanceId=n,this._symbolsByKey={};const i=new Map;for(let t=0;t({x:Math.floor(t.anchorX*se),y:Math.floor(t.anchorY*se)}))),crossTileIDs:r.map((t=>t.crossTileID))};if(n.positions.length>128){const t=new e.aw(n.positions.length,16,Uint16Array);for(const{x:e,y:r}of n.positions)t.add(e,r);t.finish(),delete n.positions,n.index=t}this._symbolsByKey[t]=n}}getScaledCoordinates(t,r){const{x:n,y:i,z:a}=this.tileID.canonical,{x:o,y:s,z:l}=r.canonical,c=l-a,u=se/Math.pow(2,c),h=(o*e.X+t.anchorX)*u,f=(s*e.X+t.anchorY)*u,p=n*e.X*se,d=i*e.X*se;return{x:Math.floor(h-p),y:Math.floor(f-d)}}findMatches(t,e,r){const n=this.tileID.canonical.zt))}}class ce{constructor(){this.maxCrossTileID=0}generate(){return++this.maxCrossTileID}}class ue{constructor(){this.indexes={},this.usedCrossTileIDs={},this.lng=0}handleWrapJump(t){const e=Math.round((t-this.lng)/360);if(0!==e)for(const t in this.indexes){const r=this.indexes[t],n={};for(const t in r){const i=r[t];i.tileID=i.tileID.unwrapTo(i.tileID.wrap+e),n[i.tileID.key]=i}this.indexes[t]=n}this.lng=t}addBucket(t,e,r){if(this.indexes[t.overscaledZ]&&this.indexes[t.overscaledZ][t.key]){if(this.indexes[t.overscaledZ][t.key].bucketInstanceId===e.bucketInstanceId)return!1;this.removeBucketCrossTileIDs(t.overscaledZ,this.indexes[t.overscaledZ][t.key])}for(let t=0;tt.overscaledZ)for(const r in i){const a=i[r];a.tileID.isChildOf(t)&&a.findMatches(e.symbolInstances,t,n)}else{const a=i[t.scaledTo(Number(r)).key];a&&a.findMatches(e.symbolInstances,t,n)}}for(let t=0;t{e[t]=!0}));for(const t in this.layerIndexes)e[t]||delete this.layerIndexes[t]}}const fe=(t,r)=>e.t(t,r&&r.filter((t=>\"source.canvas\"!==t.identifier))),pe=e.ax();class de extends e.E{constructor(t,r={}){super(),this._rtlPluginLoaded=()=>{for(const t in this.sourceCaches){const e=this.sourceCaches[t].getSource().type;\"vector\"!==e&&\"geojson\"!==e||this.sourceCaches[t].reload()}},this.map=t,this.dispatcher=new q(V(),t._getMapId()),this.dispatcher.registerMessageHandler(\"GG\",((t,e)=>this.getGlyphs(t,e))),this.dispatcher.registerMessageHandler(\"GI\",((t,e)=>this.getImages(t,e))),this.imageManager=new k,this.imageManager.setEventedParent(this),this.glyphManager=new E(t._requestManager,r.localIdeographFontFamily),this.lineAtlas=new R(256,512),this.crossTileSymbolIndex=new he,this._spritesImagesIds={},this._layers={},this._order=[],this.sourceCaches={},this.zoomHistory=new e.ay,this._loaded=!1,this._availableImages=[],this._resetUpdates(),this.dispatcher.broadcast(\"SR\",e.az()),ut().on(st,this._rtlPluginLoaded),this.on(\"data\",(t=>{if(\"source\"!==t.dataType||\"metadata\"!==t.sourceDataType)return;const e=this.sourceCaches[t.sourceId];if(!e)return;const r=e.getSource();if(r&&r.vectorLayerIds)for(const t in this._layers){const e=this._layers[t];e.source===r.id&&this._validateLayer(e)}}))}loadURL(t,r={},n){this.fire(new e.k(\"dataloading\",{dataType:\"style\"})),r.validate=\"boolean\"!=typeof r.validate||r.validate;const i=this.map._requestManager.transformRequest(t,\"Style\");this._loadStyleRequest=new AbortController;const a=this._loadStyleRequest;e.h(i,this._loadStyleRequest).then((t=>{this._loadStyleRequest=null,this._load(t.data,r,n)})).catch((t=>{this._loadStyleRequest=null,t&&!a.signal.aborted&&this.fire(new e.j(t))}))}loadJSON(t,r={},n){this.fire(new e.k(\"dataloading\",{dataType:\"style\"})),this._frameRequest=new AbortController,a.frameAsync(this._frameRequest).then((()=>{this._frameRequest=null,r.validate=!1!==r.validate,this._load(t,r,n)})).catch((()=>{}))}loadEmpty(){this.fire(new e.k(\"dataloading\",{dataType:\"style\"})),this._load(pe,{validate:!1})}_load(t,r,n){var i;const a=r.transformStyle?r.transformStyle(n,t):t;if(!r.validate||!fe(this,e.x(a))){this._loaded=!0,this.stylesheet=a;for(const t in a.sources)this.addSource(t,a.sources[t],{validate:!1});a.sprite?this._loadSprite(a.sprite):this.imageManager.setLoaded(!0),this.glyphManager.setURL(a.glyphs),this._createLayers(),this.light=new P(this.stylesheet.light),this.sky=new D(this.stylesheet.sky),this.map.setTerrain(null!==(i=this.stylesheet.terrain)&&void 0!==i?i:null),this.fire(new e.k(\"data\",{dataType:\"style\"})),this.fire(new e.k(\"style.load\"))}}_createLayers(){const t=e.aA(this.stylesheet.layers);this.dispatcher.broadcast(\"SL\",t),this._order=t.map((t=>t.id)),this._layers={},this._serializedLayers=null;for(const r of t){const t=e.aB(r);t.setEventedParent(this,{layer:{id:r.id}}),this._layers[r.id]=t}}_loadSprite(t,r=!1,n=void 0){let i;this.imageManager.setLoaded(!1),this._spriteRequest=new AbortController,b(t,this.map._requestManager,this.map.getPixelRatio(),this._spriteRequest).then((t=>{if(this._spriteRequest=null,t)for(const e in t){this._spritesImagesIds[e]=[];const n=this._spritesImagesIds[e]?this._spritesImagesIds[e].filter((e=>!(e in t))):[];for(const t of n)this.imageManager.removeImage(t),this._changedImages[t]=!0;for(const n in t[e]){const i=\"default\"===e?n:`${e}:${n}`;this._spritesImagesIds[e].push(i),i in this.imageManager.images?this.imageManager.updateImage(i,t[e][n],!1):this.imageManager.addImage(i,t[e][n]),r&&(this._changedImages[i]=!0)}}})).catch((t=>{this._spriteRequest=null,i=t,this.fire(new e.j(i))})).finally((()=>{this.imageManager.setLoaded(!0),this._availableImages=this.imageManager.listImages(),r&&(this._changed=!0),this.dispatcher.broadcast(\"SI\",this._availableImages),this.fire(new e.k(\"data\",{dataType:\"style\"})),n&&n(i)}))}_unloadSprite(){for(const t of Object.values(this._spritesImagesIds).flat())this.imageManager.removeImage(t),this._changedImages[t]=!0;this._spritesImagesIds={},this._availableImages=this.imageManager.listImages(),this._changed=!0,this.dispatcher.broadcast(\"SI\",this._availableImages),this.fire(new e.k(\"data\",{dataType:\"style\"}))}_validateLayer(t){const r=this.sourceCaches[t.source];if(!r)return;const n=t.sourceLayer;if(!n)return;const i=r.getSource();(\"geojson\"===i.type||i.vectorLayerIds&&-1===i.vectorLayerIds.indexOf(n))&&this.fire(new e.j(new Error(`Source layer \"${n}\" does not exist on source \"${i.id}\" as specified by style layer \"${t.id}\".`)))}loaded(){if(!this._loaded)return!1;if(Object.keys(this._updatedSources).length)return!1;for(const t in this.sourceCaches)if(!this.sourceCaches[t].loaded())return!1;return!!this.imageManager.isLoaded()}_serializeByIds(t){const e=this._serializedAllLayers();if(!t||0===t.length)return Object.values(e);const r=[];for(const n of t)e[n]&&r.push(e[n]);return r}_serializedAllLayers(){let t=this._serializedLayers;if(t)return t;t=this._serializedLayers={};const e=Object.keys(this._layers);for(const r of e){const e=this._layers[r];\"custom\"!==e.type&&(t[r]=e.serialize())}return t}hasTransitions(){if(this.light&&this.light.hasTransition())return!0;if(this.sky&&this.sky.hasTransition())return!0;for(const t in this.sourceCaches)if(this.sourceCaches[t].hasTransition())return!0;for(const t in this._layers)if(this._layers[t].hasTransition())return!0;return!1}_checkLoaded(){if(!this._loaded)throw new Error(\"Style is not done loading.\")}update(t){if(!this._loaded)return;const r=this._changed;if(r){const e=Object.keys(this._updatedLayers),r=Object.keys(this._removedLayers);(e.length||r.length)&&this._updateWorkerLayers(e,r);for(const t in this._updatedSources){const e=this._updatedSources[t];if(\"reload\"===e)this._reloadSource(t);else{if(\"clear\"!==e)throw new Error(`Invalid action ${e}`);this._clearSource(t)}}this._updateTilesForChangedImages(),this._updateTilesForChangedGlyphs();for(const e in this._updatedPaintProps)this._layers[e].updateTransitions(t);this.light.updateTransitions(t),this.sky.updateTransitions(t),this._resetUpdates()}const n={};for(const t in this.sourceCaches){const e=this.sourceCaches[t];n[t]=e.used,e.used=!1}for(const e of this._order){const r=this._layers[e];r.recalculate(t,this._availableImages),!r.isHidden(t.zoom)&&r.source&&(this.sourceCaches[r.source].used=!0)}for(const t in n){const r=this.sourceCaches[t];!!n[t]!=!!r.used&&r.fire(new e.k(\"data\",{sourceDataType:\"visibility\",dataType:\"source\",sourceId:t}))}this.light.recalculate(t),this.sky.recalculate(t),this.z=t.zoom,r&&this.fire(new e.k(\"data\",{dataType:\"style\"}))}_updateTilesForChangedImages(){const t=Object.keys(this._changedImages);if(t.length){for(const e in this.sourceCaches)this.sourceCaches[e].reloadTilesForDependencies([\"icons\",\"patterns\"],t);this._changedImages={}}}_updateTilesForChangedGlyphs(){if(this._glyphsDidChange){for(const t in this.sourceCaches)this.sourceCaches[t].reloadTilesForDependencies([\"glyphs\"],[\"\"]);this._glyphsDidChange=!1}}_updateWorkerLayers(t,e){this.dispatcher.broadcast(\"UL\",{layers:this._serializeByIds(t),removedIds:e})}_resetUpdates(){this._changed=!1,this._updatedLayers={},this._removedLayers={},this._updatedSources={},this._updatedPaintProps={},this._changedImages={},this._glyphsDidChange=!1}setState(t,r={}){var n;this._checkLoaded();const i=this.serialize();if(t=r.transformStyle?r.transformStyle(i,t):t,(null===(n=r.validate)||void 0===n||n)&&fe(this,e.x(t)))return!1;(t=e.aC(t)).layers=e.aA(t.layers);const a=e.aD(i,t),o=this._getOperationsToPerform(a);if(o.unimplemented.length>0)throw new Error(`Unimplemented: ${o.unimplemented.join(\", \")}.`);if(0===o.operations.length)return!1;for(const t of o.operations)t();return this.stylesheet=t,this._serializedLayers=null,!0}_getOperationsToPerform(t){const e=[],r=[];for(const n of t)switch(n.command){case\"setCenter\":case\"setZoom\":case\"setBearing\":case\"setPitch\":continue;case\"addLayer\":e.push((()=>this.addLayer.apply(this,n.args)));break;case\"removeLayer\":e.push((()=>this.removeLayer.apply(this,n.args)));break;case\"setPaintProperty\":e.push((()=>this.setPaintProperty.apply(this,n.args)));break;case\"setLayoutProperty\":e.push((()=>this.setLayoutProperty.apply(this,n.args)));break;case\"setFilter\":e.push((()=>this.setFilter.apply(this,n.args)));break;case\"addSource\":e.push((()=>this.addSource.apply(this,n.args)));break;case\"removeSource\":e.push((()=>this.removeSource.apply(this,n.args)));break;case\"setLayerZoomRange\":e.push((()=>this.setLayerZoomRange.apply(this,n.args)));break;case\"setLight\":e.push((()=>this.setLight.apply(this,n.args)));break;case\"setGeoJSONSourceData\":e.push((()=>this.setGeoJSONSourceData.apply(this,n.args)));break;case\"setGlyphs\":e.push((()=>this.setGlyphs.apply(this,n.args)));break;case\"setSprite\":e.push((()=>this.setSprite.apply(this,n.args)));break;case\"setSky\":e.push((()=>this.setSky.apply(this,n.args)));break;case\"setTerrain\":e.push((()=>this.map.setTerrain.apply(this,n.args)));break;case\"setTransition\":e.push((()=>{}));break;default:r.push(n.command)}return{operations:e,unimplemented:r}}addImage(t,r){if(this.getImage(t))return this.fire(new e.j(new Error(`An image named \"${t}\" already exists.`)));this.imageManager.addImage(t,r),this._afterImageUpdated(t)}updateImage(t,e){this.imageManager.updateImage(t,e)}getImage(t){return this.imageManager.getImage(t)}removeImage(t){if(!this.getImage(t))return this.fire(new e.j(new Error(`An image named \"${t}\" does not exist.`)));this.imageManager.removeImage(t),this._afterImageUpdated(t)}_afterImageUpdated(t){this._availableImages=this.imageManager.listImages(),this._changedImages[t]=!0,this._changed=!0,this.dispatcher.broadcast(\"SI\",this._availableImages),this.fire(new e.k(\"data\",{dataType:\"style\"}))}listImages(){return this._checkLoaded(),this.imageManager.listImages()}addSource(t,r,n={}){if(this._checkLoaded(),void 0!==this.sourceCaches[t])throw new Error(`Source \"${t}\" already exists.`);if(!r.type)throw new Error(`The type property must be defined, but only the following properties were given: ${Object.keys(r).join(\", \")}.`);if([\"vector\",\"raster\",\"geojson\",\"video\",\"image\"].indexOf(r.type)>=0&&this._validate(e.x.source,`sources.${t}`,r,null,n))return;this.map&&this.map._collectResourceTiming&&(r.collectResourceTiming=!0);const i=this.sourceCaches[t]=new dt(t,r,this.dispatcher);i.style=this,i.setEventedParent(this,(()=>({isSourceLoaded:i.loaded(),source:i.serialize(),sourceId:t}))),i.onAdd(this.map),this._changed=!0}removeSource(t){if(this._checkLoaded(),void 0===this.sourceCaches[t])throw new Error(\"There is no source with this ID\");for(const r in this._layers)if(this._layers[r].source===t)return this.fire(new e.j(new Error(`Source \"${t}\" cannot be removed while layer \"${r}\" is using it.`)));const r=this.sourceCaches[t];delete this.sourceCaches[t],delete this._updatedSources[t],r.fire(new e.k(\"data\",{sourceDataType:\"metadata\",dataType:\"source\",sourceId:t})),r.setEventedParent(null),r.onRemove(this.map),this._changed=!0}setGeoJSONSourceData(t,e){if(this._checkLoaded(),void 0===this.sourceCaches[t])throw new Error(`There is no source with this ID=${t}`);const r=this.sourceCaches[t].getSource();if(\"geojson\"!==r.type)throw new Error(`geojsonSource.type is ${r.type}, which is !== 'geojson`);r.setData(e),this._changed=!0}getSource(t){return this.sourceCaches[t]&&this.sourceCaches[t].getSource()}addLayer(t,r,n={}){this._checkLoaded();const i=t.id;if(this.getLayer(i))return void this.fire(new e.j(new Error(`Layer \"${i}\" already exists on this map.`)));let a;if(\"custom\"===t.type){if(fe(this,e.aE(t)))return;a=e.aB(t)}else{if(\"source\"in t&&\"object\"==typeof t.source&&(this.addSource(i,t.source),t=e.aC(t),t=e.e(t,{source:i})),this._validate(e.x.layer,`layers.${i}`,t,{arrayIndex:-1},n))return;a=e.aB(t),this._validateLayer(a),a.setEventedParent(this,{layer:{id:i}})}const o=r?this._order.indexOf(r):this._order.length;if(r&&-1===o)this.fire(new e.j(new Error(`Cannot add layer \"${i}\" before non-existing layer \"${r}\".`)));else{if(this._order.splice(o,0,i),this._layerOrderChanged=!0,this._layers[i]=a,this._removedLayers[i]&&a.source&&\"custom\"!==a.type){const t=this._removedLayers[i];delete this._removedLayers[i],t.type!==a.type?this._updatedSources[a.source]=\"clear\":(this._updatedSources[a.source]=\"reload\",this.sourceCaches[a.source].pause())}this._updateLayer(a),a.onAdd&&a.onAdd(this.map)}}moveLayer(t,r){if(this._checkLoaded(),this._changed=!0,!this._layers[t])return void this.fire(new e.j(new Error(`The layer '${t}' does not exist in the map's style and cannot be moved.`)));if(t===r)return;const n=this._order.indexOf(t);this._order.splice(n,1);const i=r?this._order.indexOf(r):this._order.length;r&&-1===i?this.fire(new e.j(new Error(`Cannot move layer \"${t}\" before non-existing layer \"${r}\".`))):(this._order.splice(i,0,t),this._layerOrderChanged=!0)}removeLayer(t){this._checkLoaded();const r=this._layers[t];if(!r)return void this.fire(new e.j(new Error(`Cannot remove non-existing layer \"${t}\".`)));r.setEventedParent(null);const n=this._order.indexOf(t);this._order.splice(n,1),this._layerOrderChanged=!0,this._changed=!0,this._removedLayers[t]=r,delete this._layers[t],this._serializedLayers&&delete this._serializedLayers[t],delete this._updatedLayers[t],delete this._updatedPaintProps[t],r.onRemove&&r.onRemove(this.map)}getLayer(t){return this._layers[t]}getLayersOrder(){return[...this._order]}hasLayer(t){return t in this._layers}setLayerZoomRange(t,r,n){this._checkLoaded();const i=this.getLayer(t);i?i.minzoom===r&&i.maxzoom===n||(null!=r&&(i.minzoom=r),null!=n&&(i.maxzoom=n),this._updateLayer(i)):this.fire(new e.j(new Error(`Cannot set the zoom range of non-existing layer \"${t}\".`)))}setFilter(t,r,n={}){this._checkLoaded();const i=this.getLayer(t);if(i){if(!e.aF(i.filter,r))return null==r?(i.filter=void 0,void this._updateLayer(i)):void(this._validate(e.x.filter,`layers.${i.id}.filter`,r,null,n)||(i.filter=e.aC(r),this._updateLayer(i)))}else this.fire(new e.j(new Error(`Cannot filter non-existing layer \"${t}\".`)))}getFilter(t){return e.aC(this.getLayer(t).filter)}setLayoutProperty(t,r,n,i={}){this._checkLoaded();const a=this.getLayer(t);a?e.aF(a.getLayoutProperty(r),n)||(a.setLayoutProperty(r,n,i),this._updateLayer(a)):this.fire(new e.j(new Error(`Cannot style non-existing layer \"${t}\".`)))}getLayoutProperty(t,r){const n=this.getLayer(t);if(n)return n.getLayoutProperty(r);this.fire(new e.j(new Error(`Cannot get style of non-existing layer \"${t}\".`)))}setPaintProperty(t,r,n,i={}){this._checkLoaded();const a=this.getLayer(t);a?e.aF(a.getPaintProperty(r),n)||(a.setPaintProperty(r,n,i)&&this._updateLayer(a),this._changed=!0,this._updatedPaintProps[t]=!0,this._serializedLayers=null):this.fire(new e.j(new Error(`Cannot style non-existing layer \"${t}\".`)))}getPaintProperty(t,e){return this.getLayer(t).getPaintProperty(e)}setFeatureState(t,r){this._checkLoaded();const n=t.source,i=t.sourceLayer,a=this.sourceCaches[n];if(void 0===a)return void this.fire(new e.j(new Error(`The source '${n}' does not exist in the map's style.`)));const o=a.getSource().type;\"geojson\"===o&&i?this.fire(new e.j(new Error(\"GeoJSON sources cannot have a sourceLayer parameter.\"))):\"vector\"!==o||i?(void 0===t.id&&this.fire(new e.j(new Error(\"The feature id parameter must be provided.\"))),a.setFeatureState(i,t.id,r)):this.fire(new e.j(new Error(\"The sourceLayer parameter must be provided for vector source types.\")))}removeFeatureState(t,r){this._checkLoaded();const n=t.source,i=this.sourceCaches[n];if(void 0===i)return void this.fire(new e.j(new Error(`The source '${n}' does not exist in the map's style.`)));const a=i.getSource().type,o=\"vector\"===a?t.sourceLayer:void 0;\"vector\"!==a||o?r&&\"string\"!=typeof t.id&&\"number\"!=typeof t.id?this.fire(new e.j(new Error(\"A feature id is required to remove its specific state property.\"))):i.removeFeatureState(o,t.id,r):this.fire(new e.j(new Error(\"The sourceLayer parameter must be provided for vector source types.\")))}getFeatureState(t){this._checkLoaded();const r=t.source,n=t.sourceLayer,i=this.sourceCaches[r];if(void 0!==i)return\"vector\"!==i.getSource().type||n?(void 0===t.id&&this.fire(new e.j(new Error(\"The feature id parameter must be provided.\"))),i.getFeatureState(n,t.id)):void this.fire(new e.j(new Error(\"The sourceLayer parameter must be provided for vector source types.\")));this.fire(new e.j(new Error(`The source '${r}' does not exist in the map's style.`)))}getTransition(){return e.e({duration:300,delay:0},this.stylesheet&&this.stylesheet.transition)}serialize(){if(!this._loaded)return;const t=e.aG(this.sourceCaches,(t=>t.serialize())),r=this._serializeByIds(this._order),n=this.map.getTerrain()||void 0,i=this.stylesheet;return e.aH({version:i.version,name:i.name,metadata:i.metadata,light:i.light,sky:i.sky,center:i.center,zoom:i.zoom,bearing:i.bearing,pitch:i.pitch,sprite:i.sprite,glyphs:i.glyphs,transition:i.transition,sources:t,layers:r,terrain:n},(t=>void 0!==t))}_updateLayer(t){this._updatedLayers[t.id]=!0,t.source&&!this._updatedSources[t.source]&&\"raster\"!==this.sourceCaches[t.source].getSource().type&&(this._updatedSources[t.source]=\"reload\",this.sourceCaches[t.source].pause()),this._serializedLayers=null,this._changed=!0}_flattenAndSortRenderedFeatures(t){const e=t=>\"fill-extrusion\"===this._layers[t].type,r={},n=[];for(let i=this._order.length-1;i>=0;i--){const a=this._order[i];if(e(a)){r[a]=i;for(const e of t){const t=e[a];if(t)for(const e of t)n.push(e)}}}n.sort(((t,e)=>e.intersectionZ-t.intersectionZ));const i=[];for(let a=this._order.length-1;a>=0;a--){const o=this._order[a];if(e(o))for(let t=n.length-1;t>=0;t--){const e=n[t].feature;if(r[e.layer.id]{const n=r.featureSortOrder;if(n){const r=n.indexOf(t.featureIndex);return n.indexOf(e.featureIndex)-r}return e.featureIndex-t.featureIndex}));for(const t of i)e.push(t)}}for(const e in s)s[e].forEach((n=>{const i=n.feature,a=t[e],o=r[a.source].getFeatureState(i.layer[\"source-layer\"],i.id);i.source=i.layer.source,i.layer[\"source-layer\"]&&(i.sourceLayer=i.layer[\"source-layer\"]),i.state=o}));return s}(this._layers,o,this.sourceCaches,t,r,this.placement.collisionIndex,this.placement.retainedQueryData)),this._flattenAndSortRenderedFeatures(a)}querySourceFeatures(t,r){r&&r.filter&&this._validate(e.x.filter,\"querySourceFeatures.filter\",r.filter,null,r);const n=this.sourceCaches[t];return n?function(t,e){const r=t.getRenderableIds().map((e=>t.getTileByID(e))),n=[],i={};for(let t=0;tt.getTileByID(e))).sort(((t,e)=>e.tileID.overscaledZ-t.tileID.overscaledZ||(t.tileID.isLessThan(e.tileID)?-1:1)))}const n=this.crossTileSymbolIndex.addLayer(r,l[r.source],t.center.lng);o=o||n}if(this.crossTileSymbolIndex.pruneUnusedLayers(this._order),((i=i||this._layerOrderChanged||0===r)||!this.pauseablePlacement||this.pauseablePlacement.isDone()&&!this.placement.stillRecent(a.now(),t.zoom))&&(this.pauseablePlacement=new oe(t,this.map.terrain,this._order,i,e,r,n,this.placement),this._layerOrderChanged=!1),this.pauseablePlacement.isDone()?this.placement.setStale():(this.pauseablePlacement.continuePlacement(this._order,this._layers,l),this.pauseablePlacement.isDone()&&(this.placement=this.pauseablePlacement.commit(a.now()),s=!0),o&&this.pauseablePlacement.placement.setStale()),s||o)for(const t of this._order){const e=this._layers[t];\"symbol\"===e.type&&this.placement.updateLayerOpacities(e,l[e.source])}return!this.pauseablePlacement.isDone()||this.placement.hasTransitions(a.now())}_releaseSymbolFadeTiles(){for(const t in this.sourceCaches)this.sourceCaches[t].releaseSymbolFadeTiles()}getImages(t,r){return e._(this,void 0,void 0,(function*(){const t=yield this.imageManager.getImages(r.icons);this._updateTilesForChangedImages();const e=this.sourceCaches[r.source];return e&&e.setDependencies(r.tileID.key,r.type,r.icons),t}))}getGlyphs(t,r){return e._(this,void 0,void 0,(function*(){const t=yield this.glyphManager.getGlyphs(r.stacks),e=this.sourceCaches[r.source];return e&&e.setDependencies(r.tileID.key,r.type,[\"\"]),t}))}getGlyphsUrl(){return this.stylesheet.glyphs||null}setGlyphs(t,r={}){this._checkLoaded(),t&&this._validate(e.x.glyphs,\"glyphs\",t,null,r)||(this._glyphsDidChange=!0,this.stylesheet.glyphs=t,this.glyphManager.entries={},this.glyphManager.setURL(t))}addSprite(t,r,n={},i){this._checkLoaded();const a=[{id:t,url:r}],o=[...x(this.stylesheet.sprite),...a];this._validate(e.x.sprite,\"sprite\",o,null,n)||(this.stylesheet.sprite=o,this._loadSprite(a,!0,i))}removeSprite(t){this._checkLoaded();const r=x(this.stylesheet.sprite);if(r.find((e=>e.id===t))){if(this._spritesImagesIds[t])for(const e of this._spritesImagesIds[t])this.imageManager.removeImage(e),this._changedImages[e]=!0;r.splice(r.findIndex((e=>e.id===t)),1),this.stylesheet.sprite=r.length>0?r:void 0,delete this._spritesImagesIds[t],this._availableImages=this.imageManager.listImages(),this._changed=!0,this.dispatcher.broadcast(\"SI\",this._availableImages),this.fire(new e.k(\"data\",{dataType:\"style\"}))}else this.fire(new e.j(new Error(`Sprite \"${t}\" doesn't exists on this map.`)))}getSprite(){return x(this.stylesheet.sprite)}setSprite(t,r={},n){this._checkLoaded(),t&&this._validate(e.x.sprite,\"sprite\",t,null,r)||(this.stylesheet.sprite=t,t?this._loadSprite(t,!0,n):(this._unloadSprite(),n&&n(null)))}}var me=e.Y([{name:\"a_pos\",type:\"Int16\",components:2}]);const ge={prelude:ye(\"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#if !defined(lowp)\\n#define lowp\\n#endif\\n#if !defined(mediump)\\n#define mediump\\n#endif\\n#if !defined(highp)\\n#define highp\\n#endif\\n#endif\\n\",\"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#if !defined(lowp)\\n#define lowp\\n#endif\\n#if !defined(mediump)\\n#define mediump\\n#endif\\n#if !defined(highp)\\n#define highp\\n#endif\\n#endif\\nvec2 unpack_float(const float packedValue) {int packedIntValue=int(packedValue);int v0=packedIntValue/256;return vec2(v0,packedIntValue-v0*256);}vec2 unpack_opacity(const float packedOpacity) {int intOpacity=int(packedOpacity)/2;return vec2(float(intOpacity)/127.0,mod(packedOpacity,2.0));}vec4 decode_color(const vec2 encodedColor) {return vec4(unpack_float(encodedColor[0])/255.0,unpack_float(encodedColor[1])/255.0\\n);}float unpack_mix_vec2(const vec2 packedValue,const float t) {return mix(packedValue[0],packedValue[1],t);}vec4 unpack_mix_color(const vec4 packedColors,const float t) {vec4 minColor=decode_color(vec2(packedColors[0],packedColors[1]));vec4 maxColor=decode_color(vec2(packedColors[2],packedColors[3]));return mix(minColor,maxColor,t);}vec2 get_pattern_pos(const vec2 pixel_coord_upper,const vec2 pixel_coord_lower,const vec2 pattern_size,const float tile_units_to_pixels,const vec2 pos) {vec2 offset=mod(mod(mod(pixel_coord_upper,pattern_size)*256.0,pattern_size)*256.0+pixel_coord_lower,pattern_size);return (tile_units_to_pixels*pos+offset)/pattern_size;}\\n#ifdef TERRAIN3D\\nuniform sampler2D u_terrain;uniform float u_terrain_dim;uniform mat4 u_terrain_matrix;uniform vec4 u_terrain_unpack;uniform float u_terrain_exaggeration;uniform highp sampler2D u_depth;\\n#endif\\nconst highp vec4 bitSh=vec4(256.*256.*256.,256.*256.,256.,1.);const highp vec4 bitShifts=vec4(1.)/bitSh;highp float unpack(highp vec4 color) {return dot(color,bitShifts);}highp float depthOpacity(vec3 frag) {\\n#ifdef TERRAIN3D\\nhighp float d=unpack(texture2D(u_depth,frag.xy*0.5+0.5))+0.0001-frag.z;return 1.0-max(0.0,min(1.0,-d*500.0));\\n#else\\nreturn 1.0;\\n#endif\\n}float calculate_visibility(vec4 pos) {\\n#ifdef TERRAIN3D\\nvec3 frag=pos.xyz/pos.w;highp float d=depthOpacity(frag);if (d > 0.95) return 1.0;return (d+depthOpacity(frag+vec3(0.0,0.01,0.0)))/2.0;\\n#else\\nreturn 1.0;\\n#endif\\n}float ele(vec2 pos) {\\n#ifdef TERRAIN3D\\nvec4 rgb=(texture2D(u_terrain,pos)*255.0)*u_terrain_unpack;return rgb.r+rgb.g+rgb.b-u_terrain_unpack.a;\\n#else\\nreturn 0.0;\\n#endif\\n}float get_elevation(vec2 pos) {\\n#ifdef TERRAIN3D\\nvec2 coord=(u_terrain_matrix*vec4(pos,0.0,1.0)).xy*u_terrain_dim+1.0;vec2 f=fract(coord);vec2 c=(floor(coord)+0.5)/(u_terrain_dim+2.0);float d=1.0/(u_terrain_dim+2.0);float tl=ele(c);float tr=ele(c+vec2(d,0.0));float bl=ele(c+vec2(0.0,d));float br=ele(c+vec2(d,d));float elevation=mix(mix(tl,tr,f.x),mix(bl,br,f.x),f.y);return elevation*u_terrain_exaggeration;\\n#else\\nreturn 0.0;\\n#endif\\n}\"),background:ye(\"uniform vec4 u_color;uniform float u_opacity;void main() {gl_FragColor=u_color*u_opacity;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"attribute vec2 a_pos;uniform mat4 u_matrix;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);}\"),backgroundPattern:ye(\"uniform vec2 u_pattern_tl_a;uniform vec2 u_pattern_br_a;uniform vec2 u_pattern_tl_b;uniform vec2 u_pattern_br_b;uniform vec2 u_texsize;uniform float u_mix;uniform float u_opacity;uniform sampler2D u_image;varying vec2 v_pos_a;varying vec2 v_pos_b;void main() {vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(u_pattern_tl_a/u_texsize,u_pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(u_pattern_tl_b/u_texsize,u_pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);gl_FragColor=mix(color1,color2,u_mix)*u_opacity;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"uniform mat4 u_matrix;uniform vec2 u_pattern_size_a;uniform vec2 u_pattern_size_b;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform float u_scale_a;uniform float u_scale_b;uniform float u_tile_units_to_pixels;attribute vec2 a_pos;varying vec2 v_pos_a;varying vec2 v_pos_b;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,u_scale_a*u_pattern_size_a,u_tile_units_to_pixels,a_pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,u_scale_b*u_pattern_size_b,u_tile_units_to_pixels,a_pos);}\"),circle:ye(\"varying vec3 v_data;varying float v_visibility;\\n#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define mediump float radius\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define highp vec4 stroke_color\\n#pragma mapbox: define mediump float stroke_width\\n#pragma mapbox: define lowp float stroke_opacity\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize mediump float radius\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize highp vec4 stroke_color\\n#pragma mapbox: initialize mediump float stroke_width\\n#pragma mapbox: initialize lowp float stroke_opacity\\nvec2 extrude=v_data.xy;float extrude_length=length(extrude);lowp float antialiasblur=v_data.z;float antialiased_blur=-max(blur,antialiasblur);float opacity_t=smoothstep(0.0,antialiased_blur,extrude_length-1.0);float color_t=stroke_width < 0.01 ? 0.0 : smoothstep(antialiased_blur,0.0,extrude_length-radius/(radius+stroke_width));gl_FragColor=v_visibility*opacity_t*mix(color*opacity,stroke_color*stroke_opacity,color_t);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"uniform mat4 u_matrix;uniform bool u_scale_with_map;uniform bool u_pitch_with_map;uniform vec2 u_extrude_scale;uniform lowp float u_device_pixel_ratio;uniform highp float u_camera_to_center_distance;attribute vec2 a_pos;varying vec3 v_data;varying float v_visibility;\\n#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define mediump float radius\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define highp vec4 stroke_color\\n#pragma mapbox: define mediump float stroke_width\\n#pragma mapbox: define lowp float stroke_opacity\\nvoid main(void) {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize mediump float radius\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize highp vec4 stroke_color\\n#pragma mapbox: initialize mediump float stroke_width\\n#pragma mapbox: initialize lowp float stroke_opacity\\nvec2 extrude=vec2(mod(a_pos,2.0)*2.0-1.0);vec2 circle_center=floor(a_pos*0.5);float ele=get_elevation(circle_center);v_visibility=calculate_visibility(u_matrix*vec4(circle_center,ele,1.0));if (u_pitch_with_map) {vec2 corner_position=circle_center;if (u_scale_with_map) {corner_position+=extrude*(radius+stroke_width)*u_extrude_scale;} else {vec4 projected_center=u_matrix*vec4(circle_center,0,1);corner_position+=extrude*(radius+stroke_width)*u_extrude_scale*(projected_center.w/u_camera_to_center_distance);}gl_Position=u_matrix*vec4(corner_position,ele,1);} else {gl_Position=u_matrix*vec4(circle_center,ele,1);if (u_scale_with_map) {gl_Position.xy+=extrude*(radius+stroke_width)*u_extrude_scale*u_camera_to_center_distance;} else {gl_Position.xy+=extrude*(radius+stroke_width)*u_extrude_scale*gl_Position.w;}}lowp float antialiasblur=1.0/u_device_pixel_ratio/(radius+stroke_width);v_data=vec3(extrude.x,extrude.y,antialiasblur);}\"),clippingMask:ye(\"void main() {gl_FragColor=vec4(1.0);}\",\"attribute vec2 a_pos;uniform mat4 u_matrix;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);}\"),heatmap:ye(\"uniform highp float u_intensity;varying vec2 v_extrude;\\n#pragma mapbox: define highp float weight\\n#define GAUSS_COEF 0.3989422804014327\\nvoid main() {\\n#pragma mapbox: initialize highp float weight\\nfloat d=-0.5*3.0*3.0*dot(v_extrude,v_extrude);float val=weight*u_intensity*GAUSS_COEF*exp(d);gl_FragColor=vec4(val,1.0,1.0,1.0);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"uniform mat4 u_matrix;uniform float u_extrude_scale;uniform float u_opacity;uniform float u_intensity;attribute vec2 a_pos;varying vec2 v_extrude;\\n#pragma mapbox: define highp float weight\\n#pragma mapbox: define mediump float radius\\nconst highp float ZERO=1.0/255.0/16.0;\\n#define GAUSS_COEF 0.3989422804014327\\nvoid main(void) {\\n#pragma mapbox: initialize highp float weight\\n#pragma mapbox: initialize mediump float radius\\nvec2 unscaled_extrude=vec2(mod(a_pos,2.0)*2.0-1.0);float S=sqrt(-2.0*log(ZERO/weight/u_intensity/GAUSS_COEF))/3.0;v_extrude=S*unscaled_extrude;vec2 extrude=v_extrude*radius*u_extrude_scale;vec4 pos=vec4(floor(a_pos*0.5)+extrude,0,1);gl_Position=u_matrix*pos;}\"),heatmapTexture:ye(\"uniform sampler2D u_image;uniform sampler2D u_color_ramp;uniform float u_opacity;varying vec2 v_pos;void main() {float t=texture2D(u_image,v_pos).r;vec4 color=texture2D(u_color_ramp,vec2(t,0.5));gl_FragColor=color*u_opacity;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(0.0);\\n#endif\\n}\",\"uniform mat4 u_matrix;uniform vec2 u_world;attribute vec2 a_pos;varying vec2 v_pos;void main() {gl_Position=u_matrix*vec4(a_pos*u_world,0,1);v_pos.x=a_pos.x;v_pos.y=1.0-a_pos.y;}\"),collisionBox:ye(\"varying float v_placed;varying float v_notUsed;void main() {float alpha=0.5;gl_FragColor=vec4(1.0,0.0,0.0,1.0)*alpha;if (v_placed > 0.5) {gl_FragColor=vec4(0.0,0.0,1.0,0.5)*alpha;}if (v_notUsed > 0.5) {gl_FragColor*=.1;}}\",\"attribute vec2 a_anchor_pos;attribute vec2 a_placed;attribute vec2 a_box_real;uniform mat4 u_matrix;uniform vec2 u_pixel_extrude_scale;varying float v_placed;varying float v_notUsed;vec4 projectTileWithElevation(vec2 posInTile,float elevation) {return u_matrix*vec4(posInTile,elevation,1.0);}void main() {gl_Position=projectTileWithElevation(a_anchor_pos,get_elevation(a_anchor_pos));gl_Position.xy=((a_box_real+0.5)*u_pixel_extrude_scale*2.0-1.0)*vec2(1.0,-1.0)*gl_Position.w;if (gl_Position.z/gl_Position.w < 1.1) {gl_Position.z=0.5;}v_placed=a_placed.x;v_notUsed=a_placed.y;}\"),collisionCircle:ye(\"varying float v_radius;varying vec2 v_extrude;varying float v_perspective_ratio;varying float v_collision;void main() {float alpha=0.5*min(v_perspective_ratio,1.0);float stroke_radius=0.9*max(v_perspective_ratio,1.0);float distance_to_center=length(v_extrude);float distance_to_edge=abs(distance_to_center-v_radius);float opacity_t=smoothstep(-stroke_radius,0.0,-distance_to_edge);vec4 color=mix(vec4(0.0,0.0,1.0,0.5),vec4(1.0,0.0,0.0,1.0),v_collision);gl_FragColor=color*alpha*opacity_t;}\",\"attribute vec2 a_pos;attribute float a_radius;attribute vec2 a_flags;uniform mat4 u_matrix;uniform mat4 u_inv_matrix;uniform vec2 u_viewport_size;uniform float u_camera_to_center_distance;varying float v_radius;varying vec2 v_extrude;varying float v_perspective_ratio;varying float v_collision;vec3 toTilePosition(vec2 screenPos) {vec4 rayStart=u_inv_matrix*vec4(screenPos,-1.0,1.0);vec4 rayEnd =u_inv_matrix*vec4(screenPos, 1.0,1.0);rayStart.xyz/=rayStart.w;rayEnd.xyz /=rayEnd.w;highp float t=(0.0-rayStart.z)/(rayEnd.z-rayStart.z);return mix(rayStart.xyz,rayEnd.xyz,t);}void main() {vec2 quadCenterPos=a_pos;float radius=a_radius;float collision=a_flags.x;float vertexIdx=a_flags.y;vec2 quadVertexOffset=vec2(mix(-1.0,1.0,float(vertexIdx >=2.0)),mix(-1.0,1.0,float(vertexIdx >=1.0 && vertexIdx <=2.0)));vec2 quadVertexExtent=quadVertexOffset*radius;vec3 tilePos=toTilePosition(quadCenterPos);vec4 clipPos=u_matrix*vec4(tilePos,1.0);highp float camera_to_anchor_distance=clipPos.w;highp float collision_perspective_ratio=clamp(0.5+0.5*(u_camera_to_center_distance/camera_to_anchor_distance),0.0,4.0);float padding_factor=1.2;v_radius=radius;v_extrude=quadVertexExtent*padding_factor;v_perspective_ratio=collision_perspective_ratio;v_collision=collision;gl_Position=vec4(clipPos.xyz/clipPos.w,1.0)+vec4(quadVertexExtent*padding_factor/u_viewport_size*2.0,0.0,0.0);}\"),debug:ye(\"uniform highp vec4 u_color;uniform sampler2D u_overlay;varying vec2 v_uv;void main() {vec4 overlay_color=texture2D(u_overlay,v_uv);gl_FragColor=mix(u_color,overlay_color,overlay_color.a);}\",\"attribute vec2 a_pos;varying vec2 v_uv;uniform mat4 u_matrix;uniform float u_overlay_scale;void main() {v_uv=a_pos/8192.0;gl_Position=u_matrix*vec4(a_pos*u_overlay_scale,get_elevation(a_pos),1);}\"),fill:ye(\"#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize lowp float opacity\\ngl_FragColor=color*opacity;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"attribute vec2 a_pos;uniform mat4 u_matrix;\\n#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize lowp float opacity\\ngl_Position=u_matrix*vec4(a_pos,0,1);}\"),fillOutline:ye(\"varying vec2 v_pos;\\n#pragma mapbox: define highp vec4 outline_color\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 outline_color\\n#pragma mapbox: initialize lowp float opacity\\nfloat dist=length(v_pos-gl_FragCoord.xy);float alpha=1.0-smoothstep(0.0,1.0,dist);gl_FragColor=outline_color*(alpha*opacity);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"attribute vec2 a_pos;uniform mat4 u_matrix;uniform vec2 u_world;varying vec2 v_pos;\\n#pragma mapbox: define highp vec4 outline_color\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 outline_color\\n#pragma mapbox: initialize lowp float opacity\\ngl_Position=u_matrix*vec4(a_pos,0,1);v_pos=(gl_Position.xy/gl_Position.w+1.0)/2.0*u_world;}\"),fillOutlinePattern:ye(\"uniform vec2 u_texsize;uniform sampler2D u_image;uniform float u_fade;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec2 v_pos;\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp vec4 pattern_from\\n#pragma mapbox: define lowp vec4 pattern_to\\nvoid main() {\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump vec4 pattern_from\\n#pragma mapbox: initialize mediump vec4 pattern_to\\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(pattern_tl_a/u_texsize,pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(pattern_tl_b/u_texsize,pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);float dist=length(v_pos-gl_FragCoord.xy);float alpha=1.0-smoothstep(0.0,1.0,dist);gl_FragColor=mix(color1,color2,u_fade)*alpha*opacity;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"uniform mat4 u_matrix;uniform vec2 u_world;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform vec3 u_scale;attribute vec2 a_pos;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec2 v_pos;\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp vec4 pattern_from\\n#pragma mapbox: define lowp vec4 pattern_to\\n#pragma mapbox: define lowp float pixel_ratio_from\\n#pragma mapbox: define lowp float pixel_ratio_to\\nvoid main() {\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump vec4 pattern_from\\n#pragma mapbox: initialize mediump vec4 pattern_to\\n#pragma mapbox: initialize lowp float pixel_ratio_from\\n#pragma mapbox: initialize lowp float pixel_ratio_to\\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;gl_Position=u_matrix*vec4(a_pos,0,1);vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,fromScale*display_size_a,tileRatio,a_pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,toScale*display_size_b,tileRatio,a_pos);v_pos=(gl_Position.xy/gl_Position.w+1.0)/2.0*u_world;}\"),fillPattern:ye(\"#ifdef GL_ES\\nprecision highp float;\\n#endif\\nuniform vec2 u_texsize;uniform float u_fade;uniform sampler2D u_image;varying vec2 v_pos_a;varying vec2 v_pos_b;\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp vec4 pattern_from\\n#pragma mapbox: define lowp vec4 pattern_to\\nvoid main() {\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump vec4 pattern_from\\n#pragma mapbox: initialize mediump vec4 pattern_to\\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(pattern_tl_a/u_texsize,pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(pattern_tl_b/u_texsize,pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);gl_FragColor=mix(color1,color2,u_fade)*opacity;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"uniform mat4 u_matrix;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform vec3 u_scale;attribute vec2 a_pos;varying vec2 v_pos_a;varying vec2 v_pos_b;\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp vec4 pattern_from\\n#pragma mapbox: define lowp vec4 pattern_to\\n#pragma mapbox: define lowp float pixel_ratio_from\\n#pragma mapbox: define lowp float pixel_ratio_to\\nvoid main() {\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump vec4 pattern_from\\n#pragma mapbox: initialize mediump vec4 pattern_to\\n#pragma mapbox: initialize lowp float pixel_ratio_from\\n#pragma mapbox: initialize lowp float pixel_ratio_to\\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileZoomRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;gl_Position=u_matrix*vec4(a_pos,0,1);v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,fromScale*display_size_a,tileZoomRatio,a_pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,toScale*display_size_b,tileZoomRatio,a_pos);}\"),fillExtrusion:ye(\"varying vec4 v_color;void main() {gl_FragColor=v_color;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"uniform mat4 u_matrix;uniform vec3 u_lightcolor;uniform lowp vec3 u_lightpos;uniform lowp float u_lightintensity;uniform float u_vertical_gradient;uniform lowp float u_opacity;attribute vec2 a_pos;attribute vec4 a_normal_ed;\\n#ifdef TERRAIN3D\\nattribute vec2 a_centroid;\\n#endif\\nvarying vec4 v_color;\\n#pragma mapbox: define highp float base\\n#pragma mapbox: define highp float height\\n#pragma mapbox: define highp vec4 color\\nvoid main() {\\n#pragma mapbox: initialize highp float base\\n#pragma mapbox: initialize highp float height\\n#pragma mapbox: initialize highp vec4 color\\nvec3 normal=a_normal_ed.xyz;\\n#ifdef TERRAIN3D\\nfloat height_terrain3d_offset=get_elevation(a_centroid);float base_terrain3d_offset=height_terrain3d_offset-(base > 0.0 ? 0.0 : 10.0);\\n#else\\nfloat height_terrain3d_offset=0.0;float base_terrain3d_offset=0.0;\\n#endif\\nbase=max(0.0,base)+base_terrain3d_offset;height=max(0.0,height)+height_terrain3d_offset;float t=mod(normal.x,2.0);gl_Position=u_matrix*vec4(a_pos,t > 0.0 ? height : base,1);float colorvalue=color.r*0.2126+color.g*0.7152+color.b*0.0722;v_color=vec4(0.0,0.0,0.0,1.0);vec4 ambientlight=vec4(0.03,0.03,0.03,1.0);color+=ambientlight;float directional=clamp(dot(normal/16384.0,u_lightpos),0.0,1.0);directional=mix((1.0-u_lightintensity),max((1.0-colorvalue+u_lightintensity),1.0),directional);if (normal.y !=0.0) {directional*=((1.0-u_vertical_gradient)+(u_vertical_gradient*clamp((t+base)*pow(height/150.0,0.5),mix(0.7,0.98,1.0-u_lightintensity),1.0)));}v_color.r+=clamp(color.r*directional*u_lightcolor.r,mix(0.0,0.3,1.0-u_lightcolor.r),1.0);v_color.g+=clamp(color.g*directional*u_lightcolor.g,mix(0.0,0.3,1.0-u_lightcolor.g),1.0);v_color.b+=clamp(color.b*directional*u_lightcolor.b,mix(0.0,0.3,1.0-u_lightcolor.b),1.0);v_color*=u_opacity;}\"),fillExtrusionPattern:ye(\"uniform vec2 u_texsize;uniform float u_fade;uniform sampler2D u_image;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec4 v_lighting;\\n#pragma mapbox: define lowp float base\\n#pragma mapbox: define lowp float height\\n#pragma mapbox: define lowp vec4 pattern_from\\n#pragma mapbox: define lowp vec4 pattern_to\\n#pragma mapbox: define lowp float pixel_ratio_from\\n#pragma mapbox: define lowp float pixel_ratio_to\\nvoid main() {\\n#pragma mapbox: initialize lowp float base\\n#pragma mapbox: initialize lowp float height\\n#pragma mapbox: initialize mediump vec4 pattern_from\\n#pragma mapbox: initialize mediump vec4 pattern_to\\n#pragma mapbox: initialize lowp float pixel_ratio_from\\n#pragma mapbox: initialize lowp float pixel_ratio_to\\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(pattern_tl_a/u_texsize,pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(pattern_tl_b/u_texsize,pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);vec4 mixedColor=mix(color1,color2,u_fade);gl_FragColor=mixedColor*v_lighting;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"uniform mat4 u_matrix;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform float u_height_factor;uniform vec3 u_scale;uniform float u_vertical_gradient;uniform lowp float u_opacity;uniform vec3 u_lightcolor;uniform lowp vec3 u_lightpos;uniform lowp float u_lightintensity;attribute vec2 a_pos;attribute vec4 a_normal_ed;\\n#ifdef TERRAIN3D\\nattribute vec2 a_centroid;\\n#endif\\nvarying vec2 v_pos_a;varying vec2 v_pos_b;varying vec4 v_lighting;\\n#pragma mapbox: define lowp float base\\n#pragma mapbox: define lowp float height\\n#pragma mapbox: define lowp vec4 pattern_from\\n#pragma mapbox: define lowp vec4 pattern_to\\n#pragma mapbox: define lowp float pixel_ratio_from\\n#pragma mapbox: define lowp float pixel_ratio_to\\nvoid main() {\\n#pragma mapbox: initialize lowp float base\\n#pragma mapbox: initialize lowp float height\\n#pragma mapbox: initialize mediump vec4 pattern_from\\n#pragma mapbox: initialize mediump vec4 pattern_to\\n#pragma mapbox: initialize lowp float pixel_ratio_from\\n#pragma mapbox: initialize lowp float pixel_ratio_to\\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;vec3 normal=a_normal_ed.xyz;float edgedistance=a_normal_ed.w;vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;\\n#ifdef TERRAIN3D\\nfloat height_terrain3d_offset=get_elevation(a_centroid);float base_terrain3d_offset=height_terrain3d_offset-(base > 0.0 ? 0.0 : 10.0);\\n#else\\nfloat height_terrain3d_offset=0.0;float base_terrain3d_offset=0.0;\\n#endif\\nbase=max(0.0,base)+base_terrain3d_offset;height=max(0.0,height)+height_terrain3d_offset;float t=mod(normal.x,2.0);float z=t > 0.0 ? height : base;gl_Position=u_matrix*vec4(a_pos,z,1);vec2 pos=normal.x==1.0 && normal.y==0.0 && normal.z==16384.0\\n? a_pos\\n: vec2(edgedistance,z*u_height_factor);v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,fromScale*display_size_a,tileRatio,pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,toScale*display_size_b,tileRatio,pos);v_lighting=vec4(0.0,0.0,0.0,1.0);float directional=clamp(dot(normal/16383.0,u_lightpos),0.0,1.0);directional=mix((1.0-u_lightintensity),max((0.5+u_lightintensity),1.0),directional);if (normal.y !=0.0) {directional*=((1.0-u_vertical_gradient)+(u_vertical_gradient*clamp((t+base)*pow(height/150.0,0.5),mix(0.7,0.98,1.0-u_lightintensity),1.0)));}v_lighting.rgb+=clamp(directional*u_lightcolor,mix(vec3(0.0),vec3(0.3),1.0-u_lightcolor),vec3(1.0));v_lighting*=u_opacity;}\"),hillshadePrepare:ye(\"#ifdef GL_ES\\nprecision highp float;\\n#endif\\nuniform sampler2D u_image;varying vec2 v_pos;uniform vec2 u_dimension;uniform float u_zoom;uniform vec4 u_unpack;float getElevation(vec2 coord,float bias) {vec4 data=texture2D(u_image,coord)*255.0;data.a=-1.0;return dot(data,u_unpack)/4.0;}void main() {vec2 epsilon=1.0/u_dimension;float a=getElevation(v_pos+vec2(-epsilon.x,-epsilon.y),0.0);float b=getElevation(v_pos+vec2(0,-epsilon.y),0.0);float c=getElevation(v_pos+vec2(epsilon.x,-epsilon.y),0.0);float d=getElevation(v_pos+vec2(-epsilon.x,0),0.0);float e=getElevation(v_pos,0.0);float f=getElevation(v_pos+vec2(epsilon.x,0),0.0);float g=getElevation(v_pos+vec2(-epsilon.x,epsilon.y),0.0);float h=getElevation(v_pos+vec2(0,epsilon.y),0.0);float i=getElevation(v_pos+vec2(epsilon.x,epsilon.y),0.0);float exaggerationFactor=u_zoom < 2.0 ? 0.4 : u_zoom < 4.5 ? 0.35 : 0.3;float exaggeration=u_zoom < 15.0 ? (u_zoom-15.0)*exaggerationFactor : 0.0;vec2 deriv=vec2((c+f+f+i)-(a+d+d+g),(g+h+h+i)-(a+b+b+c))/pow(2.0,exaggeration+(19.2562-u_zoom));gl_FragColor=clamp(vec4(deriv.x/2.0+0.5,deriv.y/2.0+0.5,1.0,1.0),0.0,1.0);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"uniform mat4 u_matrix;uniform vec2 u_dimension;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying vec2 v_pos;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);highp vec2 epsilon=1.0/u_dimension;float scale=(u_dimension.x-2.0)/u_dimension.x;v_pos=(a_texture_pos/8192.0)*scale+epsilon;}\"),hillshade:ye(\"uniform sampler2D u_image;varying vec2 v_pos;uniform vec2 u_latrange;uniform vec2 u_light;uniform vec4 u_shadow;uniform vec4 u_highlight;uniform vec4 u_accent;\\n#define PI 3.141592653589793\\nvoid main() {vec4 pixel=texture2D(u_image,v_pos);vec2 deriv=((pixel.rg*2.0)-1.0);float scaleFactor=cos(radians((u_latrange[0]-u_latrange[1])*(1.0-v_pos.y)+u_latrange[1]));float slope=atan(1.25*length(deriv)/scaleFactor);float aspect=deriv.x !=0.0 ? atan(deriv.y,-deriv.x) : PI/2.0*(deriv.y > 0.0 ? 1.0 :-1.0);float intensity=u_light.x;float azimuth=u_light.y+PI;float base=1.875-intensity*1.75;float maxValue=0.5*PI;float scaledSlope=intensity !=0.5 ? ((pow(base,slope)-1.0)/(pow(base,maxValue)-1.0))*maxValue : slope;float accent=cos(scaledSlope);vec4 accent_color=(1.0-accent)*u_accent*clamp(intensity*2.0,0.0,1.0);float shade=abs(mod((aspect+azimuth)/PI+0.5,2.0)-1.0);vec4 shade_color=mix(u_shadow,u_highlight,shade)*sin(scaledSlope)*clamp(intensity*2.0,0.0,1.0);gl_FragColor=accent_color*(1.0-shade_color.a)+shade_color;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"uniform mat4 u_matrix;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying vec2 v_pos;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);v_pos=a_texture_pos/8192.0;}\"),line:ye(\"uniform lowp float u_device_pixel_ratio;varying vec2 v_width2;varying vec2 v_normal;varying float v_gamma_scale;\\n#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\nfloat dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);gl_FragColor=color*(alpha*opacity);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"\\n#define scale 0.015873016\\nattribute vec2 a_pos_normal;attribute vec4 a_data;uniform mat4 u_matrix;uniform mediump float u_ratio;uniform vec2 u_units_to_pixels;uniform lowp float u_device_pixel_ratio;varying vec2 v_normal;varying vec2 v_width2;varying float v_gamma_scale;varying highp float v_linesofar;\\n#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define mediump float gapwidth\\n#pragma mapbox: define lowp float offset\\n#pragma mapbox: define mediump float width\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump float gapwidth\\n#pragma mapbox: initialize lowp float offset\\n#pragma mapbox: initialize mediump float width\\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;v_linesofar=(floor(a_data.z/4.0)+a_data.w*64.0)*2.0;vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;\\n#ifdef TERRAIN3D\\nv_gamma_scale=1.0;\\n#else\\nfloat extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;\\n#endif\\nv_width2=vec2(outset,inset);}\"),lineGradient:ye(\"uniform lowp float u_device_pixel_ratio;uniform sampler2D u_image;varying vec2 v_width2;varying vec2 v_normal;varying float v_gamma_scale;varying highp vec2 v_uv;\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\nfloat dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);vec4 color=texture2D(u_image,v_uv);gl_FragColor=color*(alpha*opacity);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"\\n#define scale 0.015873016\\nattribute vec2 a_pos_normal;attribute vec4 a_data;attribute float a_uv_x;attribute float a_split_index;uniform mat4 u_matrix;uniform mediump float u_ratio;uniform lowp float u_device_pixel_ratio;uniform vec2 u_units_to_pixels;uniform float u_image_height;varying vec2 v_normal;varying vec2 v_width2;varying float v_gamma_scale;varying highp vec2 v_uv;\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define mediump float gapwidth\\n#pragma mapbox: define lowp float offset\\n#pragma mapbox: define mediump float width\\nvoid main() {\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump float gapwidth\\n#pragma mapbox: initialize lowp float offset\\n#pragma mapbox: initialize mediump float width\\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;highp float texel_height=1.0/u_image_height;highp float half_texel_height=0.5*texel_height;v_uv=vec2(a_uv_x,a_split_index*texel_height-half_texel_height);vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;\\n#ifdef TERRAIN3D\\nv_gamma_scale=1.0;\\n#else\\nfloat extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;\\n#endif\\nv_width2=vec2(outset,inset);}\"),linePattern:ye(\"#ifdef GL_ES\\nprecision highp float;\\n#endif\\nuniform lowp float u_device_pixel_ratio;uniform vec2 u_texsize;uniform float u_fade;uniform mediump vec3 u_scale;uniform sampler2D u_image;varying vec2 v_normal;varying vec2 v_width2;varying float v_linesofar;varying float v_gamma_scale;varying float v_width;\\n#pragma mapbox: define lowp vec4 pattern_from\\n#pragma mapbox: define lowp vec4 pattern_to\\n#pragma mapbox: define lowp float pixel_ratio_from\\n#pragma mapbox: define lowp float pixel_ratio_to\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize mediump vec4 pattern_from\\n#pragma mapbox: initialize mediump vec4 pattern_to\\n#pragma mapbox: initialize lowp float pixel_ratio_from\\n#pragma mapbox: initialize lowp float pixel_ratio_to\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileZoomRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;vec2 pattern_size_a=vec2(display_size_a.x*fromScale/tileZoomRatio,display_size_a.y);vec2 pattern_size_b=vec2(display_size_b.x*toScale/tileZoomRatio,display_size_b.y);float aspect_a=display_size_a.y/v_width;float aspect_b=display_size_b.y/v_width;float dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);float x_a=mod(v_linesofar/pattern_size_a.x*aspect_a,1.0);float x_b=mod(v_linesofar/pattern_size_b.x*aspect_b,1.0);float y=0.5*v_normal.y+0.5;vec2 texel_size=1.0/u_texsize;vec2 pos_a=mix(pattern_tl_a*texel_size-texel_size,pattern_br_a*texel_size+texel_size,vec2(x_a,y));vec2 pos_b=mix(pattern_tl_b*texel_size-texel_size,pattern_br_b*texel_size+texel_size,vec2(x_b,y));vec4 color=mix(texture2D(u_image,pos_a),texture2D(u_image,pos_b),u_fade);gl_FragColor=color*alpha*opacity;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"\\n#define scale 0.015873016\\n#define LINE_DISTANCE_SCALE 2.0\\nattribute vec2 a_pos_normal;attribute vec4 a_data;uniform mat4 u_matrix;uniform vec2 u_units_to_pixels;uniform mediump float u_ratio;uniform lowp float u_device_pixel_ratio;varying vec2 v_normal;varying vec2 v_width2;varying float v_linesofar;varying float v_gamma_scale;varying float v_width;\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp float offset\\n#pragma mapbox: define mediump float gapwidth\\n#pragma mapbox: define mediump float width\\n#pragma mapbox: define lowp float floorwidth\\n#pragma mapbox: define lowp vec4 pattern_from\\n#pragma mapbox: define lowp vec4 pattern_to\\n#pragma mapbox: define lowp float pixel_ratio_from\\n#pragma mapbox: define lowp float pixel_ratio_to\\nvoid main() {\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize lowp float offset\\n#pragma mapbox: initialize mediump float gapwidth\\n#pragma mapbox: initialize mediump float width\\n#pragma mapbox: initialize lowp float floorwidth\\n#pragma mapbox: initialize mediump vec4 pattern_from\\n#pragma mapbox: initialize mediump vec4 pattern_to\\n#pragma mapbox: initialize lowp float pixel_ratio_from\\n#pragma mapbox: initialize lowp float pixel_ratio_to\\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;float a_linesofar=(floor(a_data.z/4.0)+a_data.w*64.0)*LINE_DISTANCE_SCALE;vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;\\n#ifdef TERRAIN3D\\nv_gamma_scale=1.0;\\n#else\\nfloat extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;\\n#endif\\nv_linesofar=a_linesofar;v_width2=vec2(outset,inset);v_width=floorwidth;}\"),lineSDF:ye(\"uniform lowp float u_device_pixel_ratio;uniform sampler2D u_image;uniform float u_sdfgamma;uniform float u_mix;varying vec2 v_normal;varying vec2 v_width2;varying vec2 v_tex_a;varying vec2 v_tex_b;varying float v_gamma_scale;\\n#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define mediump float width\\n#pragma mapbox: define lowp float floorwidth\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump float width\\n#pragma mapbox: initialize lowp float floorwidth\\nfloat dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);float sdfdist_a=texture2D(u_image,v_tex_a).a;float sdfdist_b=texture2D(u_image,v_tex_b).a;float sdfdist=mix(sdfdist_a,sdfdist_b,u_mix);alpha*=smoothstep(0.5-u_sdfgamma/floorwidth,0.5+u_sdfgamma/floorwidth,sdfdist);gl_FragColor=color*(alpha*opacity);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"\\n#define scale 0.015873016\\n#define LINE_DISTANCE_SCALE 2.0\\nattribute vec2 a_pos_normal;attribute vec4 a_data;uniform mat4 u_matrix;uniform mediump float u_ratio;uniform lowp float u_device_pixel_ratio;uniform vec2 u_patternscale_a;uniform float u_tex_y_a;uniform vec2 u_patternscale_b;uniform float u_tex_y_b;uniform vec2 u_units_to_pixels;varying vec2 v_normal;varying vec2 v_width2;varying vec2 v_tex_a;varying vec2 v_tex_b;varying float v_gamma_scale;\\n#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define mediump float gapwidth\\n#pragma mapbox: define lowp float offset\\n#pragma mapbox: define mediump float width\\n#pragma mapbox: define lowp float floorwidth\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump float gapwidth\\n#pragma mapbox: initialize lowp float offset\\n#pragma mapbox: initialize mediump float width\\n#pragma mapbox: initialize lowp float floorwidth\\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;float a_linesofar=(floor(a_data.z/4.0)+a_data.w*64.0)*LINE_DISTANCE_SCALE;vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;\\n#ifdef TERRAIN3D\\nv_gamma_scale=1.0;\\n#else\\nfloat extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;\\n#endif\\nv_tex_a=vec2(a_linesofar*u_patternscale_a.x/floorwidth,normal.y*u_patternscale_a.y+u_tex_y_a);v_tex_b=vec2(a_linesofar*u_patternscale_b.x/floorwidth,normal.y*u_patternscale_b.y+u_tex_y_b);v_width2=vec2(outset,inset);}\"),raster:ye(\"uniform float u_fade_t;uniform float u_opacity;uniform sampler2D u_image0;uniform sampler2D u_image1;varying vec2 v_pos0;varying vec2 v_pos1;uniform float u_brightness_low;uniform float u_brightness_high;uniform float u_saturation_factor;uniform float u_contrast_factor;uniform vec3 u_spin_weights;void main() {vec4 color0=texture2D(u_image0,v_pos0);vec4 color1=texture2D(u_image1,v_pos1);if (color0.a > 0.0) {color0.rgb=color0.rgb/color0.a;}if (color1.a > 0.0) {color1.rgb=color1.rgb/color1.a;}vec4 color=mix(color0,color1,u_fade_t);color.a*=u_opacity;vec3 rgb=color.rgb;rgb=vec3(dot(rgb,u_spin_weights.xyz),dot(rgb,u_spin_weights.zxy),dot(rgb,u_spin_weights.yzx));float average=(color.r+color.g+color.b)/3.0;rgb+=(average-rgb)*u_saturation_factor;rgb=(rgb-0.5)*u_contrast_factor+0.5;vec3 u_high_vec=vec3(u_brightness_low,u_brightness_low,u_brightness_low);vec3 u_low_vec=vec3(u_brightness_high,u_brightness_high,u_brightness_high);gl_FragColor=vec4(mix(u_high_vec,u_low_vec,rgb)*color.a,color.a);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"uniform mat4 u_matrix;uniform vec2 u_tl_parent;uniform float u_scale_parent;uniform float u_buffer_scale;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying vec2 v_pos0;varying vec2 v_pos1;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);v_pos0=(((a_texture_pos/8192.0)-0.5)/u_buffer_scale )+0.5;v_pos1=(v_pos0*u_scale_parent)+u_tl_parent;}\"),symbolIcon:ye(\"uniform sampler2D u_texture;varying vec2 v_tex;varying float v_fade_opacity;\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize lowp float opacity\\nlowp float alpha=opacity*v_fade_opacity;gl_FragColor=texture2D(u_texture,v_tex)*alpha;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"attribute vec4 a_pos_offset;attribute vec4 a_data;attribute vec4 a_pixeloffset;attribute vec3 a_projected_pos;attribute float a_fade_opacity;uniform bool u_is_size_zoom_constant;uniform bool u_is_size_feature_constant;uniform highp float u_size_t;uniform highp float u_size;uniform highp float u_camera_to_center_distance;uniform highp float u_pitch;uniform bool u_rotate_symbol;uniform highp float u_aspect_ratio;uniform float u_fade_change;uniform mat4 u_matrix;uniform mat4 u_label_plane_matrix;uniform mat4 u_coord_matrix;uniform bool u_is_text;uniform bool u_pitch_with_map;uniform vec2 u_texsize;uniform bool u_is_along_line;uniform bool u_is_variable_anchor;uniform vec2 u_translation;uniform float u_pitched_scale;varying vec2 v_tex;varying float v_fade_opacity;vec4 projectTileWithElevation(vec2 posInTile,float elevation) {return u_matrix*vec4(posInTile,elevation,1.0);}\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize lowp float opacity\\nvec2 a_pos=a_pos_offset.xy;vec2 a_offset=a_pos_offset.zw;vec2 a_tex=a_data.xy;vec2 a_size=a_data.zw;float a_size_min=floor(a_size[0]*0.5);vec2 a_pxoffset=a_pixeloffset.xy;vec2 a_minFontScale=a_pixeloffset.zw/256.0;float ele=get_elevation(a_pos);highp float segment_angle=-a_projected_pos[2];float size;if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {size=mix(a_size_min,a_size[1],u_size_t)/128.0;} else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {size=a_size_min/128.0;} else {size=u_size;}vec2 translated_a_pos=a_pos+u_translation;vec4 projectedPoint=projectTileWithElevation(translated_a_pos,ele);highp float camera_to_anchor_distance=projectedPoint.w;highp float distance_ratio=u_pitch_with_map ?\\ncamera_to_anchor_distance/u_camera_to_center_distance :\\nu_camera_to_center_distance/camera_to_anchor_distance;highp float perspective_ratio=clamp(0.5+0.5*distance_ratio,0.0,4.0);size*=perspective_ratio;float fontScale=u_is_text ? size/24.0 : size;highp float symbol_rotation=0.0;if (u_rotate_symbol) {vec4 offsetProjectedPoint=projectTileWithElevation(translated_a_pos+vec2(1,0),ele);vec2 a=projectedPoint.xy/projectedPoint.w;vec2 b=offsetProjectedPoint.xy/offsetProjectedPoint.w;symbol_rotation=atan((b.y-a.y)/u_aspect_ratio,b.x-a.x);}highp float angle_sin=sin(segment_angle+symbol_rotation);highp float angle_cos=cos(segment_angle+symbol_rotation);mat2 rotation_matrix=mat2(angle_cos,-1.0*angle_sin,angle_sin,angle_cos);vec4 projected_pos;if (u_is_along_line || u_is_variable_anchor) {projected_pos=vec4(a_projected_pos.xy,ele,1.0);} else if (u_pitch_with_map) {projected_pos=u_label_plane_matrix*vec4(a_projected_pos.xy+u_translation,ele,1.0);} else {projected_pos=u_label_plane_matrix*projectTileWithElevation(a_projected_pos.xy+u_translation,ele);}float z=float(u_pitch_with_map)*projected_pos.z/projected_pos.w;float projectionScaling=1.0;vec4 finalPos=u_coord_matrix*vec4(projected_pos.xy/projected_pos.w+rotation_matrix*(a_offset/32.0*max(a_minFontScale,fontScale)+a_pxoffset/16.0)*projectionScaling,z,1.0);if(u_pitch_with_map) {finalPos=projectTileWithElevation(finalPos.xy,finalPos.z);}gl_Position=finalPos;v_tex=a_tex/u_texsize;vec2 fade_opacity=unpack_opacity(a_fade_opacity);float fade_change=fade_opacity[1] > 0.5 ? u_fade_change :-u_fade_change;float visibility=calculate_visibility(projectedPoint);v_fade_opacity=max(0.0,min(visibility,fade_opacity[0]+fade_change));}\"),symbolSDF:ye(\"#define SDF_PX 8.0\\nuniform bool u_is_halo;uniform sampler2D u_texture;uniform highp float u_gamma_scale;uniform lowp float u_device_pixel_ratio;uniform bool u_is_text;varying vec2 v_data0;varying vec3 v_data1;\\n#pragma mapbox: define highp vec4 fill_color\\n#pragma mapbox: define highp vec4 halo_color\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp float halo_width\\n#pragma mapbox: define lowp float halo_blur\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 fill_color\\n#pragma mapbox: initialize highp vec4 halo_color\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize lowp float halo_width\\n#pragma mapbox: initialize lowp float halo_blur\\nfloat EDGE_GAMMA=0.105/u_device_pixel_ratio;vec2 tex=v_data0.xy;float gamma_scale=v_data1.x;float size=v_data1.y;float fade_opacity=v_data1[2];float fontScale=u_is_text ? size/24.0 : size;lowp vec4 color=fill_color;highp float gamma=EDGE_GAMMA/(fontScale*u_gamma_scale);lowp float inner_edge=(256.0-64.0)/256.0;if (u_is_halo) {color=halo_color;gamma=(halo_blur*1.19/SDF_PX+EDGE_GAMMA)/(fontScale*u_gamma_scale);inner_edge=inner_edge+gamma*gamma_scale;}lowp float dist=texture2D(u_texture,tex).a;highp float gamma_scaled=gamma*gamma_scale;highp float alpha=smoothstep(inner_edge-gamma_scaled,inner_edge+gamma_scaled,dist);if (u_is_halo) {lowp float halo_edge=(6.0-halo_width/fontScale)/SDF_PX;alpha=min(smoothstep(halo_edge-gamma_scaled,halo_edge+gamma_scaled,dist),1.0-alpha);}gl_FragColor=color*(alpha*opacity*fade_opacity);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"attribute vec4 a_pos_offset;attribute vec4 a_data;attribute vec4 a_pixeloffset;attribute vec3 a_projected_pos;attribute float a_fade_opacity;uniform bool u_is_size_zoom_constant;uniform bool u_is_size_feature_constant;uniform highp float u_size_t;uniform highp float u_size;uniform mat4 u_matrix;uniform mat4 u_label_plane_matrix;uniform mat4 u_coord_matrix;uniform bool u_is_text;uniform bool u_pitch_with_map;uniform bool u_is_along_line;uniform bool u_is_variable_anchor;uniform highp float u_pitch;uniform bool u_rotate_symbol;uniform highp float u_aspect_ratio;uniform highp float u_camera_to_center_distance;uniform float u_fade_change;uniform vec2 u_texsize;uniform vec2 u_translation;uniform float u_pitched_scale;varying vec2 v_data0;varying vec3 v_data1;vec4 projectTileWithElevation(vec2 posInTile,float elevation) {return u_matrix*vec4(posInTile,elevation,1.0);}\\n#pragma mapbox: define highp vec4 fill_color\\n#pragma mapbox: define highp vec4 halo_color\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp float halo_width\\n#pragma mapbox: define lowp float halo_blur\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 fill_color\\n#pragma mapbox: initialize highp vec4 halo_color\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize lowp float halo_width\\n#pragma mapbox: initialize lowp float halo_blur\\nvec2 a_pos=a_pos_offset.xy;vec2 a_offset=a_pos_offset.zw;vec2 a_tex=a_data.xy;vec2 a_size=a_data.zw;float a_size_min=floor(a_size[0]*0.5);vec2 a_pxoffset=a_pixeloffset.xy;float ele=get_elevation(a_pos);highp float segment_angle=-a_projected_pos[2];float size;if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {size=mix(a_size_min,a_size[1],u_size_t)/128.0;} else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {size=a_size_min/128.0;} else {size=u_size;}vec2 translated_a_pos=a_pos+u_translation;vec4 projectedPoint=projectTileWithElevation(translated_a_pos,ele);highp float camera_to_anchor_distance=projectedPoint.w;highp float distance_ratio=u_pitch_with_map ?\\ncamera_to_anchor_distance/u_camera_to_center_distance :\\nu_camera_to_center_distance/camera_to_anchor_distance;highp float perspective_ratio=clamp(0.5+0.5*distance_ratio,0.0,4.0);size*=perspective_ratio;float fontScale=u_is_text ? size/24.0 : size;highp float symbol_rotation=0.0;if (u_rotate_symbol) {vec4 offsetProjectedPoint=projectTileWithElevation(translated_a_pos+vec2(1,0),ele);vec2 a=projectedPoint.xy/projectedPoint.w;vec2 b=offsetProjectedPoint.xy/offsetProjectedPoint.w;symbol_rotation=atan((b.y-a.y)/u_aspect_ratio,b.x-a.x);}highp float angle_sin=sin(segment_angle+symbol_rotation);highp float angle_cos=cos(segment_angle+symbol_rotation);mat2 rotation_matrix=mat2(angle_cos,-1.0*angle_sin,angle_sin,angle_cos);vec4 projected_pos;if (u_is_along_line || u_is_variable_anchor) {projected_pos=vec4(a_projected_pos.xy,ele,1.0);} else if (u_pitch_with_map) {projected_pos=u_label_plane_matrix*vec4(a_projected_pos.xy+u_translation,ele,1.0);} else {projected_pos=u_label_plane_matrix*projectTileWithElevation(a_projected_pos.xy+u_translation,ele);}float z=float(u_pitch_with_map)*projected_pos.z/projected_pos.w;float projectionScaling=1.0;vec4 finalPos=u_coord_matrix*vec4(projected_pos.xy/projected_pos.w+rotation_matrix*(a_offset/32.0*fontScale+a_pxoffset)*projectionScaling,z,1.0);if(u_pitch_with_map) {finalPos=projectTileWithElevation(finalPos.xy,finalPos.z);}float gamma_scale=finalPos.w;gl_Position=finalPos;vec2 fade_opacity=unpack_opacity(a_fade_opacity);float visibility=calculate_visibility(projectedPoint);float fade_change=fade_opacity[1] > 0.5 ? u_fade_change :-u_fade_change;float interpolated_fade_opacity=max(0.0,min(visibility,fade_opacity[0]+fade_change));v_data0=a_tex/u_texsize;v_data1=vec3(gamma_scale,size,interpolated_fade_opacity);}\"),symbolTextAndIcon:ye(\"#define SDF_PX 8.0\\n#define SDF 1.0\\n#define ICON 0.0\\nuniform bool u_is_halo;uniform sampler2D u_texture;uniform sampler2D u_texture_icon;uniform highp float u_gamma_scale;uniform lowp float u_device_pixel_ratio;varying vec4 v_data0;varying vec4 v_data1;\\n#pragma mapbox: define highp vec4 fill_color\\n#pragma mapbox: define highp vec4 halo_color\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp float halo_width\\n#pragma mapbox: define lowp float halo_blur\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 fill_color\\n#pragma mapbox: initialize highp vec4 halo_color\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize lowp float halo_width\\n#pragma mapbox: initialize lowp float halo_blur\\nfloat fade_opacity=v_data1[2];if (v_data1.w==ICON) {vec2 tex_icon=v_data0.zw;lowp float alpha=opacity*fade_opacity;gl_FragColor=texture2D(u_texture_icon,tex_icon)*alpha;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\nreturn;}vec2 tex=v_data0.xy;float EDGE_GAMMA=0.105/u_device_pixel_ratio;float gamma_scale=v_data1.x;float size=v_data1.y;float fontScale=size/24.0;lowp vec4 color=fill_color;highp float gamma=EDGE_GAMMA/(fontScale*u_gamma_scale);lowp float buff=(256.0-64.0)/256.0;if (u_is_halo) {color=halo_color;gamma=(halo_blur*1.19/SDF_PX+EDGE_GAMMA)/(fontScale*u_gamma_scale);buff=(6.0-halo_width/fontScale)/SDF_PX;}lowp float dist=texture2D(u_texture,tex).a;highp float gamma_scaled=gamma*gamma_scale;highp float alpha=smoothstep(buff-gamma_scaled,buff+gamma_scaled,dist);gl_FragColor=color*(alpha*opacity*fade_opacity);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}\",\"attribute vec4 a_pos_offset;attribute vec4 a_data;attribute vec3 a_projected_pos;attribute float a_fade_opacity;uniform bool u_is_size_zoom_constant;uniform bool u_is_size_feature_constant;uniform highp float u_size_t;uniform highp float u_size;uniform mat4 u_matrix;uniform mat4 u_label_plane_matrix;uniform mat4 u_coord_matrix;uniform bool u_is_text;uniform bool u_pitch_with_map;uniform highp float u_pitch;uniform bool u_rotate_symbol;uniform highp float u_aspect_ratio;uniform highp float u_camera_to_center_distance;uniform float u_fade_change;uniform vec2 u_texsize;uniform vec2 u_texsize_icon;uniform bool u_is_along_line;uniform bool u_is_variable_anchor;uniform vec2 u_translation;uniform float u_pitched_scale;varying vec4 v_data0;varying vec4 v_data1;vec4 projectTileWithElevation(vec2 posInTile,float elevation) {return u_matrix*vec4(posInTile,elevation,1.0);}\\n#pragma mapbox: define highp vec4 fill_color\\n#pragma mapbox: define highp vec4 halo_color\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp float halo_width\\n#pragma mapbox: define lowp float halo_blur\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 fill_color\\n#pragma mapbox: initialize highp vec4 halo_color\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize lowp float halo_width\\n#pragma mapbox: initialize lowp float halo_blur\\nvec2 a_pos=a_pos_offset.xy;vec2 a_offset=a_pos_offset.zw;vec2 a_tex=a_data.xy;vec2 a_size=a_data.zw;float a_size_min=floor(a_size[0]*0.5);float is_sdf=a_size[0]-2.0*a_size_min;float ele=get_elevation(a_pos);highp float segment_angle=-a_projected_pos[2];float size;if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {size=mix(a_size_min,a_size[1],u_size_t)/128.0;} else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {size=a_size_min/128.0;} else {size=u_size;}vec2 translated_a_pos=a_pos+u_translation;vec4 projectedPoint=projectTileWithElevation(translated_a_pos,ele);highp float camera_to_anchor_distance=projectedPoint.w;highp float distance_ratio=u_pitch_with_map ?\\ncamera_to_anchor_distance/u_camera_to_center_distance :\\nu_camera_to_center_distance/camera_to_anchor_distance;highp float perspective_ratio=clamp(0.5+0.5*distance_ratio,0.0,4.0);size*=perspective_ratio;float fontScale=size/24.0;highp float symbol_rotation=0.0;if (u_rotate_symbol) {vec4 offsetProjectedPoint=projectTileWithElevation(translated_a_pos+vec2(1,0),ele);vec2 a=projectedPoint.xy/projectedPoint.w;vec2 b=offsetProjectedPoint.xy/offsetProjectedPoint.w;symbol_rotation=atan((b.y-a.y)/u_aspect_ratio,b.x-a.x);}highp float angle_sin=sin(segment_angle+symbol_rotation);highp float angle_cos=cos(segment_angle+symbol_rotation);mat2 rotation_matrix=mat2(angle_cos,-1.0*angle_sin,angle_sin,angle_cos);vec4 projected_pos;if (u_is_along_line || u_is_variable_anchor) {projected_pos=vec4(a_projected_pos.xy,ele,1.0);} else if (u_pitch_with_map) {projected_pos=u_label_plane_matrix*vec4(a_projected_pos.xy+u_translation,ele,1.0);} else {projected_pos=u_label_plane_matrix*projectTileWithElevation(a_projected_pos.xy+u_translation,ele);}float z=float(u_pitch_with_map)*projected_pos.z/projected_pos.w;float projectionScaling=1.0;vec4 finalPos=u_coord_matrix*vec4(projected_pos.xy/projected_pos.w+rotation_matrix*(a_offset/32.0*fontScale)*projectionScaling,z,1.0);if(u_pitch_with_map) {finalPos=projectTileWithElevation(finalPos.xy,finalPos.z);}float gamma_scale=finalPos.w;gl_Position=finalPos;vec2 fade_opacity=unpack_opacity(a_fade_opacity);float visibility=calculate_visibility(projectedPoint);float fade_change=fade_opacity[1] > 0.5 ? u_fade_change :-u_fade_change;float interpolated_fade_opacity=max(0.0,min(visibility,fade_opacity[0]+fade_change));v_data0.xy=a_tex/u_texsize;v_data0.zw=a_tex/u_texsize_icon;v_data1=vec4(gamma_scale,size,interpolated_fade_opacity,is_sdf);}\"),terrain:ye(\"uniform sampler2D u_texture;uniform vec4 u_fog_color;uniform vec4 u_horizon_color;uniform float u_fog_ground_blend;uniform float u_fog_ground_blend_opacity;uniform float u_horizon_fog_blend;varying vec2 v_texture_pos;varying float v_fog_depth;const float gamma=2.2;vec4 gammaToLinear(vec4 color) {return pow(color,vec4(gamma));}vec4 linearToGamma(vec4 color) {return pow(color,vec4(1.0/gamma));}void main() {vec4 surface_color=texture2D(u_texture,v_texture_pos);if (v_fog_depth > u_fog_ground_blend) {vec4 surface_color_linear=gammaToLinear(surface_color);float blend_color=smoothstep(0.0,1.0,max((v_fog_depth-u_horizon_fog_blend)/(1.0-u_horizon_fog_blend),0.0));vec4 fog_horizon_color_linear=mix(gammaToLinear(u_fog_color),gammaToLinear(u_horizon_color),blend_color);float factor_fog=max(v_fog_depth-u_fog_ground_blend,0.0)/(1.0-u_fog_ground_blend);gl_FragColor=linearToGamma(mix(surface_color_linear,fog_horizon_color_linear,pow(factor_fog,2.0)*u_fog_ground_blend_opacity));} else {gl_FragColor=surface_color;}}\",\"attribute vec3 a_pos3d;uniform mat4 u_matrix;uniform mat4 u_fog_matrix;uniform float u_ele_delta;varying vec2 v_texture_pos;varying float v_fog_depth;void main() {float ele=get_elevation(a_pos3d.xy);float ele_delta=a_pos3d.z==1.0 ? u_ele_delta : 0.0;v_texture_pos=a_pos3d.xy/8192.0;gl_Position=u_matrix*vec4(a_pos3d.xy,ele-ele_delta,1.0);vec4 pos=u_fog_matrix*vec4(a_pos3d.xy,ele,1.0);v_fog_depth=pos.z/pos.w*0.5+0.5;}\"),terrainDepth:ye(\"varying float v_depth;const highp vec4 bitSh=vec4(256.*256.*256.,256.*256.,256.,1.);const highp vec4 bitMsk=vec4(0.,vec3(1./256.0));highp vec4 pack(highp float value) {highp vec4 comp=fract(value*bitSh);comp-=comp.xxyz*bitMsk;return comp;}void main() {gl_FragColor=pack(v_depth);}\",\"attribute vec3 a_pos3d;uniform mat4 u_matrix;uniform float u_ele_delta;varying float v_depth;void main() {float ele=get_elevation(a_pos3d.xy);float ele_delta=a_pos3d.z==1.0 ? u_ele_delta : 0.0;gl_Position=u_matrix*vec4(a_pos3d.xy,ele-ele_delta,1.0);v_depth=gl_Position.z/gl_Position.w;}\"),terrainCoords:ye(\"precision mediump float;uniform sampler2D u_texture;uniform float u_terrain_coords_id;varying vec2 v_texture_pos;void main() {vec4 rgba=texture2D(u_texture,v_texture_pos);gl_FragColor=vec4(rgba.r,rgba.g,rgba.b,u_terrain_coords_id);}\",\"attribute vec3 a_pos3d;uniform mat4 u_matrix;uniform float u_ele_delta;varying vec2 v_texture_pos;void main() {float ele=get_elevation(a_pos3d.xy);float ele_delta=a_pos3d.z==1.0 ? u_ele_delta : 0.0;v_texture_pos=a_pos3d.xy/8192.0;gl_Position=u_matrix*vec4(a_pos3d.xy,ele-ele_delta,1.0);}\"),sky:ye(\"uniform vec4 u_sky_color;uniform vec4 u_horizon_color;uniform float u_horizon;uniform float u_sky_horizon_blend;void main() {float y=gl_FragCoord.y;if (y > u_horizon) {float blend=y-u_horizon;if (blend < u_sky_horizon_blend) {gl_FragColor=mix(u_sky_color,u_horizon_color,pow(1.0-blend/u_sky_horizon_blend,2.0));} else {gl_FragColor=u_sky_color;}}}\",\"attribute vec2 a_pos;void main() {gl_Position=vec4(a_pos,1.0,1.0);}\")};function ye(t,e){const r=/#pragma mapbox: ([\\w]+) ([\\w]+) ([\\w]+) ([\\w]+)/g,n=e.match(/attribute ([\\w]+) ([\\w]+)/g),i=t.match(/uniform ([\\w]+) ([\\w]+)([\\s]*)([\\w]*)/g),a=e.match(/uniform ([\\w]+) ([\\w]+)([\\s]*)([\\w]*)/g),o=a?a.concat(i):i,s={};return{fragmentSource:t=t.replace(r,((t,e,r,n,i)=>(s[i]=!0,\"define\"===e?`\\n#ifndef HAS_UNIFORM_u_${i}\\nvarying ${r} ${n} ${i};\\n#else\\nuniform ${r} ${n} u_${i};\\n#endif\\n`:`\\n#ifdef HAS_UNIFORM_u_${i}\\n ${r} ${n} ${i} = u_${i};\\n#endif\\n`))),vertexSource:e=e.replace(r,((t,e,r,n,i)=>{const a=\"float\"===n?\"vec2\":\"vec4\",o=i.match(/color/)?\"color\":a;return s[i]?\"define\"===e?`\\n#ifndef HAS_UNIFORM_u_${i}\\nuniform lowp float u_${i}_t;\\nattribute ${r} ${a} a_${i};\\nvarying ${r} ${n} ${i};\\n#else\\nuniform ${r} ${n} u_${i};\\n#endif\\n`:\"vec4\"===o?`\\n#ifndef HAS_UNIFORM_u_${i}\\n ${i} = a_${i};\\n#else\\n ${r} ${n} ${i} = u_${i};\\n#endif\\n`:`\\n#ifndef HAS_UNIFORM_u_${i}\\n ${i} = unpack_mix_${o}(a_${i}, u_${i}_t);\\n#else\\n ${r} ${n} ${i} = u_${i};\\n#endif\\n`:\"define\"===e?`\\n#ifndef HAS_UNIFORM_u_${i}\\nuniform lowp float u_${i}_t;\\nattribute ${r} ${a} a_${i};\\n#else\\nuniform ${r} ${n} u_${i};\\n#endif\\n`:\"vec4\"===o?`\\n#ifndef HAS_UNIFORM_u_${i}\\n ${r} ${n} ${i} = a_${i};\\n#else\\n ${r} ${n} ${i} = u_${i};\\n#endif\\n`:`\\n#ifndef HAS_UNIFORM_u_${i}\\n ${r} ${n} ${i} = unpack_mix_${o}(a_${i}, u_${i}_t);\\n#else\\n ${r} ${n} ${i} = u_${i};\\n#endif\\n`})),staticAttributes:n,staticUniforms:o}}class ve{constructor(){this.boundProgram=null,this.boundLayoutVertexBuffer=null,this.boundPaintVertexBuffers=[],this.boundIndexBuffer=null,this.boundVertexOffset=null,this.boundDynamicVertexBuffer=null,this.vao=null}bind(t,e,r,n,i,a,o,s,l){this.context=t;let c=this.boundPaintVertexBuffers.length!==n.length;for(let t=0;!c&&t({u_matrix:t,u_texture:0,u_ele_delta:r,u_fog_matrix:n,u_fog_color:i?i.properties.get(\"fog-color\"):e.aN.white,u_fog_ground_blend:i?i.properties.get(\"fog-ground-blend\"):1,u_fog_ground_blend_opacity:i?i.calculateFogBlendOpacity(a):0,u_horizon_color:i?i.properties.get(\"horizon-color\"):e.aN.white,u_horizon_fog_blend:i?i.properties.get(\"horizon-fog-blend\"):1});function _e(t){const e=[];for(let r=0;r({u_depth:new e.aI(t,r.u_depth),u_terrain:new e.aI(t,r.u_terrain),u_terrain_dim:new e.aJ(t,r.u_terrain_dim),u_terrain_matrix:new e.aK(t,r.u_terrain_matrix),u_terrain_unpack:new e.aL(t,r.u_terrain_unpack),u_terrain_exaggeration:new e.aJ(t,r.u_terrain_exaggeration)}))(t,b),this.binderUniforms=n?n.getUniforms(t,b):[]}draw(t,e,r,n,i,a,o,s,l,c,u,h,f,p,d,m,g,y){const v=t.gl;if(this.failedToCreate)return;if(t.program.set(this.program),t.setDepthMode(r),t.setStencilMode(n),t.setColorMode(i),t.setCullFace(a),s){t.activeTexture.set(v.TEXTURE2),v.bindTexture(v.TEXTURE_2D,s.depthTexture),t.activeTexture.set(v.TEXTURE3),v.bindTexture(v.TEXTURE_2D,s.texture);for(const t in this.terrainUniforms)this.terrainUniforms[t].set(s[t])}for(const t in this.fixedUniforms)this.fixedUniforms[t].set(o[t]);d&&d.setUniforms(t,this.binderUniforms,f,{zoom:p});let x=0;switch(e){case v.LINES:x=2;break;case v.TRIANGLES:x=3;break;case v.LINE_STRIP:x=1}for(const r of h.get()){const n=r.vaos||(r.vaos={});(n[l]||(n[l]=new ve)).bind(t,this,c,d?d.getPaintVertexBuffers():[],u,r.vertexOffset,m,g,y),v.drawElements(e,r.primitiveLength*x,v.UNSIGNED_SHORT,r.primitiveOffset*x*2)}}}function we(t,e,r){const n=1/Nt(r,1,e.transform.tileZoom),i=Math.pow(2,r.tileID.overscaledZ),a=r.tileSize*Math.pow(2,e.transform.tileZoom)/i,o=a*(r.tileID.canonical.x+r.tileID.wrap*i),s=a*r.tileID.canonical.y;return{u_image:0,u_texsize:r.imageAtlasTexture.size,u_scale:[n,t.fromScale,t.toScale],u_fade:t.t,u_pixel_coord_upper:[o>>16,s>>16],u_pixel_coord_lower:[65535&o,65535&s]}}const Te=(t,r,n,i)=>{const a=r.style.light,o=a.properties.get(\"position\"),s=[o.x,o.y,o.z],l=function(){var t=new e.A(9);return e.A!=Float32Array&&(t[1]=0,t[2]=0,t[3]=0,t[5]=0,t[6]=0,t[7]=0),t[0]=1,t[4]=1,t[8]=1,t}();\"viewport\"===a.properties.get(\"anchor\")&&function(t,e){var r=Math.sin(e),n=Math.cos(e);t[0]=n,t[1]=r,t[2]=0,t[3]=-r,t[4]=n,t[5]=0,t[6]=0,t[7]=0,t[8]=1}(l,-r.transform.angle),function(t,e,r){var n=e[0],i=e[1],a=e[2];t[0]=n*r[0]+i*r[3]+a*r[6],t[1]=n*r[1]+i*r[4]+a*r[7],t[2]=n*r[2]+i*r[5]+a*r[8]}(s,s,l);const c=a.properties.get(\"color\");return{u_matrix:t,u_lightpos:s,u_lightintensity:a.properties.get(\"intensity\"),u_lightcolor:[c.r,c.g,c.b],u_vertical_gradient:+n,u_opacity:i}},ke=(t,r,n,i,a,o,s)=>e.e(Te(t,r,n,i),we(o,r,s),{u_height_factor:-Math.pow(2,a.overscaledZ)/s.tileSize/8}),Ae=t=>({u_matrix:t}),Me=(t,r,n,i)=>e.e(Ae(t),we(n,r,i)),Se=(t,e)=>({u_matrix:t,u_world:e}),Ee=(t,r,n,i,a)=>e.e(Me(t,r,n,i),{u_world:a}),Ce=(t,e,r,n)=>{const i=t.transform;let a,o;if(\"map\"===n.paint.get(\"circle-pitch-alignment\")){const t=Nt(r,1,i.zoom);a=!0,o=[t,t]}else a=!1,o=i.pixelsToGLUnits;return{u_camera_to_center_distance:i.cameraToCenterDistance,u_scale_with_map:+(\"map\"===n.paint.get(\"circle-pitch-scale\")),u_matrix:t.translatePosMatrix(e.posMatrix,r,n.paint.get(\"circle-translate\"),n.paint.get(\"circle-translate-anchor\")),u_pitch_with_map:+a,u_device_pixel_ratio:t.pixelRatio,u_extrude_scale:o}},Le=(t,e)=>({u_matrix:e,u_pixel_extrude_scale:[1/t.width,1/t.height]}),Ie=(t,e,r)=>({u_matrix:t,u_inv_matrix:e,u_camera_to_center_distance:r.cameraToCenterDistance,u_viewport_size:[r.width,r.height]}),Pe=(t,e,r=1)=>({u_matrix:t,u_color:e,u_overlay:0,u_overlay_scale:r}),ze=t=>({u_matrix:t}),Oe=(t,e,r,n)=>({u_matrix:t,u_extrude_scale:Nt(e,1,r),u_intensity:n}),De=(t,r,n,i)=>{const a=e.H();e.aQ(a,0,t.width,t.height,0,0,1);const o=t.context.gl;return{u_matrix:a,u_world:[o.drawingBufferWidth,o.drawingBufferHeight],u_image:n,u_color_ramp:i,u_opacity:r.paint.get(\"heatmap-opacity\")}},Re=(t,e,r,n)=>{const i=r.paint.get(\"hillshade-shadow-color\"),a=r.paint.get(\"hillshade-highlight-color\"),o=r.paint.get(\"hillshade-accent-color\");let s=r.paint.get(\"hillshade-illumination-direction\")*(Math.PI/180);\"viewport\"===r.paint.get(\"hillshade-illumination-anchor\")&&(s-=t.transform.angle);const l=!t.options.moving;return{u_matrix:n?n.posMatrix:t.transform.calculatePosMatrix(e.tileID.toUnwrapped(),l),u_image:0,u_latrange:Be(0,e.tileID),u_light:[r.paint.get(\"hillshade-exaggeration\"),s],u_shadow:i,u_highlight:a,u_accent:o}},Fe=(t,r)=>{const n=r.stride,i=e.H();return e.aQ(i,0,e.X,-e.X,0,0,1),e.J(i,i,[0,-e.X,0]),{u_matrix:i,u_image:1,u_dimension:[n,n],u_zoom:t.overscaledZ,u_unpack:r.getUnpackVector()}};function Be(t,r){const n=Math.pow(2,r.canonical.z),i=r.canonical.y;return[new e.Z(0,i/n).toLngLat().lat,new e.Z(0,(i+1)/n).toLngLat().lat]}const Ne=(t,e,r,n)=>{const i=t.transform;return{u_matrix:He(t,e,r,n),u_ratio:1/Nt(e,1,i.zoom),u_device_pixel_ratio:t.pixelRatio,u_units_to_pixels:[1/i.pixelsToGLUnits[0],1/i.pixelsToGLUnits[1]]}},je=(t,r,n,i,a)=>e.e(Ne(t,r,n,a),{u_image:0,u_image_height:i}),Ue=(t,e,r,n,i)=>{const a=t.transform,o=qe(e,a);return{u_matrix:He(t,e,r,i),u_texsize:e.imageAtlasTexture.size,u_ratio:1/Nt(e,1,a.zoom),u_device_pixel_ratio:t.pixelRatio,u_image:0,u_scale:[o,n.fromScale,n.toScale],u_fade:n.t,u_units_to_pixels:[1/a.pixelsToGLUnits[0],1/a.pixelsToGLUnits[1]]}},Ve=(t,r,n,i,a,o)=>{const s=t.transform,l=t.lineAtlas,c=qe(r,s),u=\"round\"===n.layout.get(\"line-cap\"),h=l.getDash(i.from,u),f=l.getDash(i.to,u),p=h.width*a.fromScale,d=f.width*a.toScale;return e.e(Ne(t,r,n,o),{u_patternscale_a:[c/p,-h.height/2],u_patternscale_b:[c/d,-f.height/2],u_sdfgamma:l.width/(256*Math.min(p,d)*t.pixelRatio)/2,u_image:0,u_tex_y_a:h.y,u_tex_y_b:f.y,u_mix:a.t})};function qe(t,e){return 1/Nt(t,1,e.tileZoom)}function He(t,e,r,n){return t.translatePosMatrix(n?n.posMatrix:e.tileID.posMatrix,e,r.paint.get(\"line-translate\"),r.paint.get(\"line-translate-anchor\"))}const Ge=(t,e,r,n,i)=>{return{u_matrix:t,u_tl_parent:e,u_scale_parent:r,u_buffer_scale:1,u_fade_t:n.mix,u_opacity:n.opacity*i.paint.get(\"raster-opacity\"),u_image0:0,u_image1:1,u_brightness_low:i.paint.get(\"raster-brightness-min\"),u_brightness_high:i.paint.get(\"raster-brightness-max\"),u_saturation_factor:(o=i.paint.get(\"raster-saturation\"),o>0?1-1/(1.001-o):-o),u_contrast_factor:(a=i.paint.get(\"raster-contrast\"),a>0?1/(1-a):1+a),u_spin_weights:Ze(i.paint.get(\"raster-hue-rotate\"))};var a,o};function Ze(t){t*=Math.PI/180;const e=Math.sin(t),r=Math.cos(t);return[(2*r+1)/3,(-Math.sqrt(3)*e-r+1)/3,(Math.sqrt(3)*e-r+1)/3]}const We=(t,e,r,n,i,a,o,s,l,c,u,h,f,p)=>{const d=o.transform;return{u_is_size_zoom_constant:+(\"constant\"===t||\"source\"===t),u_is_size_feature_constant:+(\"constant\"===t||\"camera\"===t),u_size_t:e?e.uSizeT:0,u_size:e?e.uSize:0,u_camera_to_center_distance:d.cameraToCenterDistance,u_pitch:d.pitch/360*2*Math.PI,u_rotate_symbol:+r,u_aspect_ratio:d.width/d.height,u_fade_change:o.options.fadeDuration?o.symbolFadeChange:1,u_matrix:s,u_label_plane_matrix:l,u_coord_matrix:c,u_is_text:+h,u_pitch_with_map:+n,u_is_along_line:i,u_is_variable_anchor:a,u_texsize:f,u_texture:0,u_translation:u,u_pitched_scale:p}},Ye=(t,r,n,i,a,o,s,l,c,u,h,f,p,d,m)=>{const g=s.transform;return e.e(We(t,r,n,i,a,o,s,l,c,u,h,f,p,m),{u_gamma_scale:i?Math.cos(g._pitch)*g.cameraToCenterDistance:1,u_device_pixel_ratio:s.pixelRatio,u_is_halo:+d})},Xe=(t,r,n,i,a,o,s,l,c,u,h,f,p,d)=>e.e(Ye(t,r,n,i,a,o,s,l,c,u,h,!0,f,!0,d),{u_texsize_icon:p,u_texture_icon:1}),$e=(t,e,r)=>({u_matrix:t,u_opacity:e,u_color:r}),Je=(t,r,n,i,a,o)=>e.e(function(t,e,r,n){const i=r.imageManager.getPattern(t.from.toString()),a=r.imageManager.getPattern(t.to.toString()),{width:o,height:s}=r.imageManager.getPixelSize(),l=Math.pow(2,n.tileID.overscaledZ),c=n.tileSize*Math.pow(2,r.transform.tileZoom)/l,u=c*(n.tileID.canonical.x+n.tileID.wrap*l),h=c*n.tileID.canonical.y;return{u_image:0,u_pattern_tl_a:i.tl,u_pattern_br_a:i.br,u_pattern_tl_b:a.tl,u_pattern_br_b:a.br,u_texsize:[o,s],u_mix:e.t,u_pattern_size_a:i.displaySize,u_pattern_size_b:a.displaySize,u_scale_a:e.fromScale,u_scale_b:e.toScale,u_tile_units_to_pixels:1/Nt(n,1,r.transform.tileZoom),u_pixel_coord_upper:[u>>16,h>>16],u_pixel_coord_lower:[65535&u,65535&h]}}(i,o,n,a),{u_matrix:t,u_opacity:r}),Ke={fillExtrusion:(t,r)=>({u_matrix:new e.aK(t,r.u_matrix),u_lightpos:new e.aO(t,r.u_lightpos),u_lightintensity:new e.aJ(t,r.u_lightintensity),u_lightcolor:new e.aO(t,r.u_lightcolor),u_vertical_gradient:new e.aJ(t,r.u_vertical_gradient),u_opacity:new e.aJ(t,r.u_opacity)}),fillExtrusionPattern:(t,r)=>({u_matrix:new e.aK(t,r.u_matrix),u_lightpos:new e.aO(t,r.u_lightpos),u_lightintensity:new e.aJ(t,r.u_lightintensity),u_lightcolor:new e.aO(t,r.u_lightcolor),u_vertical_gradient:new e.aJ(t,r.u_vertical_gradient),u_height_factor:new e.aJ(t,r.u_height_factor),u_image:new e.aI(t,r.u_image),u_texsize:new e.aP(t,r.u_texsize),u_pixel_coord_upper:new e.aP(t,r.u_pixel_coord_upper),u_pixel_coord_lower:new e.aP(t,r.u_pixel_coord_lower),u_scale:new e.aO(t,r.u_scale),u_fade:new e.aJ(t,r.u_fade),u_opacity:new e.aJ(t,r.u_opacity)}),fill:(t,r)=>({u_matrix:new e.aK(t,r.u_matrix)}),fillPattern:(t,r)=>({u_matrix:new e.aK(t,r.u_matrix),u_image:new e.aI(t,r.u_image),u_texsize:new e.aP(t,r.u_texsize),u_pixel_coord_upper:new e.aP(t,r.u_pixel_coord_upper),u_pixel_coord_lower:new e.aP(t,r.u_pixel_coord_lower),u_scale:new e.aO(t,r.u_scale),u_fade:new e.aJ(t,r.u_fade)}),fillOutline:(t,r)=>({u_matrix:new e.aK(t,r.u_matrix),u_world:new e.aP(t,r.u_world)}),fillOutlinePattern:(t,r)=>({u_matrix:new e.aK(t,r.u_matrix),u_world:new e.aP(t,r.u_world),u_image:new e.aI(t,r.u_image),u_texsize:new e.aP(t,r.u_texsize),u_pixel_coord_upper:new e.aP(t,r.u_pixel_coord_upper),u_pixel_coord_lower:new e.aP(t,r.u_pixel_coord_lower),u_scale:new e.aO(t,r.u_scale),u_fade:new e.aJ(t,r.u_fade)}),circle:(t,r)=>({u_camera_to_center_distance:new e.aJ(t,r.u_camera_to_center_distance),u_scale_with_map:new e.aI(t,r.u_scale_with_map),u_pitch_with_map:new e.aI(t,r.u_pitch_with_map),u_extrude_scale:new e.aP(t,r.u_extrude_scale),u_device_pixel_ratio:new e.aJ(t,r.u_device_pixel_ratio),u_matrix:new e.aK(t,r.u_matrix)}),collisionBox:(t,r)=>({u_matrix:new e.aK(t,r.u_matrix),u_pixel_extrude_scale:new e.aP(t,r.u_pixel_extrude_scale)}),collisionCircle:(t,r)=>({u_matrix:new e.aK(t,r.u_matrix),u_inv_matrix:new e.aK(t,r.u_inv_matrix),u_camera_to_center_distance:new e.aJ(t,r.u_camera_to_center_distance),u_viewport_size:new e.aP(t,r.u_viewport_size)}),debug:(t,r)=>({u_color:new e.aM(t,r.u_color),u_matrix:new e.aK(t,r.u_matrix),u_overlay:new e.aI(t,r.u_overlay),u_overlay_scale:new e.aJ(t,r.u_overlay_scale)}),clippingMask:(t,r)=>({u_matrix:new e.aK(t,r.u_matrix)}),heatmap:(t,r)=>({u_extrude_scale:new e.aJ(t,r.u_extrude_scale),u_intensity:new e.aJ(t,r.u_intensity),u_matrix:new e.aK(t,r.u_matrix)}),heatmapTexture:(t,r)=>({u_matrix:new e.aK(t,r.u_matrix),u_world:new e.aP(t,r.u_world),u_image:new e.aI(t,r.u_image),u_color_ramp:new e.aI(t,r.u_color_ramp),u_opacity:new e.aJ(t,r.u_opacity)}),hillshade:(t,r)=>({u_matrix:new e.aK(t,r.u_matrix),u_image:new e.aI(t,r.u_image),u_latrange:new e.aP(t,r.u_latrange),u_light:new e.aP(t,r.u_light),u_shadow:new e.aM(t,r.u_shadow),u_highlight:new e.aM(t,r.u_highlight),u_accent:new e.aM(t,r.u_accent)}),hillshadePrepare:(t,r)=>({u_matrix:new e.aK(t,r.u_matrix),u_image:new e.aI(t,r.u_image),u_dimension:new e.aP(t,r.u_dimension),u_zoom:new e.aJ(t,r.u_zoom),u_unpack:new e.aL(t,r.u_unpack)}),line:(t,r)=>({u_matrix:new e.aK(t,r.u_matrix),u_ratio:new e.aJ(t,r.u_ratio),u_device_pixel_ratio:new e.aJ(t,r.u_device_pixel_ratio),u_units_to_pixels:new e.aP(t,r.u_units_to_pixels)}),lineGradient:(t,r)=>({u_matrix:new e.aK(t,r.u_matrix),u_ratio:new e.aJ(t,r.u_ratio),u_device_pixel_ratio:new e.aJ(t,r.u_device_pixel_ratio),u_units_to_pixels:new e.aP(t,r.u_units_to_pixels),u_image:new e.aI(t,r.u_image),u_image_height:new e.aJ(t,r.u_image_height)}),linePattern:(t,r)=>({u_matrix:new e.aK(t,r.u_matrix),u_texsize:new e.aP(t,r.u_texsize),u_ratio:new e.aJ(t,r.u_ratio),u_device_pixel_ratio:new e.aJ(t,r.u_device_pixel_ratio),u_image:new e.aI(t,r.u_image),u_units_to_pixels:new e.aP(t,r.u_units_to_pixels),u_scale:new e.aO(t,r.u_scale),u_fade:new e.aJ(t,r.u_fade)}),lineSDF:(t,r)=>({u_matrix:new e.aK(t,r.u_matrix),u_ratio:new e.aJ(t,r.u_ratio),u_device_pixel_ratio:new e.aJ(t,r.u_device_pixel_ratio),u_units_to_pixels:new e.aP(t,r.u_units_to_pixels),u_patternscale_a:new e.aP(t,r.u_patternscale_a),u_patternscale_b:new e.aP(t,r.u_patternscale_b),u_sdfgamma:new e.aJ(t,r.u_sdfgamma),u_image:new e.aI(t,r.u_image),u_tex_y_a:new e.aJ(t,r.u_tex_y_a),u_tex_y_b:new e.aJ(t,r.u_tex_y_b),u_mix:new e.aJ(t,r.u_mix)}),raster:(t,r)=>({u_matrix:new e.aK(t,r.u_matrix),u_tl_parent:new e.aP(t,r.u_tl_parent),u_scale_parent:new e.aJ(t,r.u_scale_parent),u_buffer_scale:new e.aJ(t,r.u_buffer_scale),u_fade_t:new e.aJ(t,r.u_fade_t),u_opacity:new e.aJ(t,r.u_opacity),u_image0:new e.aI(t,r.u_image0),u_image1:new e.aI(t,r.u_image1),u_brightness_low:new e.aJ(t,r.u_brightness_low),u_brightness_high:new e.aJ(t,r.u_brightness_high),u_saturation_factor:new e.aJ(t,r.u_saturation_factor),u_contrast_factor:new e.aJ(t,r.u_contrast_factor),u_spin_weights:new e.aO(t,r.u_spin_weights)}),symbolIcon:(t,r)=>({u_is_size_zoom_constant:new e.aI(t,r.u_is_size_zoom_constant),u_is_size_feature_constant:new e.aI(t,r.u_is_size_feature_constant),u_size_t:new e.aJ(t,r.u_size_t),u_size:new e.aJ(t,r.u_size),u_camera_to_center_distance:new e.aJ(t,r.u_camera_to_center_distance),u_pitch:new e.aJ(t,r.u_pitch),u_rotate_symbol:new e.aI(t,r.u_rotate_symbol),u_aspect_ratio:new e.aJ(t,r.u_aspect_ratio),u_fade_change:new e.aJ(t,r.u_fade_change),u_matrix:new e.aK(t,r.u_matrix),u_label_plane_matrix:new e.aK(t,r.u_label_plane_matrix),u_coord_matrix:new e.aK(t,r.u_coord_matrix),u_is_text:new e.aI(t,r.u_is_text),u_pitch_with_map:new e.aI(t,r.u_pitch_with_map),u_is_along_line:new e.aI(t,r.u_is_along_line),u_is_variable_anchor:new e.aI(t,r.u_is_variable_anchor),u_texsize:new e.aP(t,r.u_texsize),u_texture:new e.aI(t,r.u_texture),u_translation:new e.aP(t,r.u_translation),u_pitched_scale:new e.aJ(t,r.u_pitched_scale)}),symbolSDF:(t,r)=>({u_is_size_zoom_constant:new e.aI(t,r.u_is_size_zoom_constant),u_is_size_feature_constant:new e.aI(t,r.u_is_size_feature_constant),u_size_t:new e.aJ(t,r.u_size_t),u_size:new e.aJ(t,r.u_size),u_camera_to_center_distance:new e.aJ(t,r.u_camera_to_center_distance),u_pitch:new e.aJ(t,r.u_pitch),u_rotate_symbol:new e.aI(t,r.u_rotate_symbol),u_aspect_ratio:new e.aJ(t,r.u_aspect_ratio),u_fade_change:new e.aJ(t,r.u_fade_change),u_matrix:new e.aK(t,r.u_matrix),u_label_plane_matrix:new e.aK(t,r.u_label_plane_matrix),u_coord_matrix:new e.aK(t,r.u_coord_matrix),u_is_text:new e.aI(t,r.u_is_text),u_pitch_with_map:new e.aI(t,r.u_pitch_with_map),u_is_along_line:new e.aI(t,r.u_is_along_line),u_is_variable_anchor:new e.aI(t,r.u_is_variable_anchor),u_texsize:new e.aP(t,r.u_texsize),u_texture:new e.aI(t,r.u_texture),u_gamma_scale:new e.aJ(t,r.u_gamma_scale),u_device_pixel_ratio:new e.aJ(t,r.u_device_pixel_ratio),u_is_halo:new e.aI(t,r.u_is_halo),u_translation:new e.aP(t,r.u_translation),u_pitched_scale:new e.aJ(t,r.u_pitched_scale)}),symbolTextAndIcon:(t,r)=>({u_is_size_zoom_constant:new e.aI(t,r.u_is_size_zoom_constant),u_is_size_feature_constant:new e.aI(t,r.u_is_size_feature_constant),u_size_t:new e.aJ(t,r.u_size_t),u_size:new e.aJ(t,r.u_size),u_camera_to_center_distance:new e.aJ(t,r.u_camera_to_center_distance),u_pitch:new e.aJ(t,r.u_pitch),u_rotate_symbol:new e.aI(t,r.u_rotate_symbol),u_aspect_ratio:new e.aJ(t,r.u_aspect_ratio),u_fade_change:new e.aJ(t,r.u_fade_change),u_matrix:new e.aK(t,r.u_matrix),u_label_plane_matrix:new e.aK(t,r.u_label_plane_matrix),u_coord_matrix:new e.aK(t,r.u_coord_matrix),u_is_text:new e.aI(t,r.u_is_text),u_pitch_with_map:new e.aI(t,r.u_pitch_with_map),u_is_along_line:new e.aI(t,r.u_is_along_line),u_is_variable_anchor:new e.aI(t,r.u_is_variable_anchor),u_texsize:new e.aP(t,r.u_texsize),u_texsize_icon:new e.aP(t,r.u_texsize_icon),u_texture:new e.aI(t,r.u_texture),u_texture_icon:new e.aI(t,r.u_texture_icon),u_gamma_scale:new e.aJ(t,r.u_gamma_scale),u_device_pixel_ratio:new e.aJ(t,r.u_device_pixel_ratio),u_is_halo:new e.aI(t,r.u_is_halo),u_translation:new e.aP(t,r.u_translation),u_pitched_scale:new e.aJ(t,r.u_pitched_scale)}),background:(t,r)=>({u_matrix:new e.aK(t,r.u_matrix),u_opacity:new e.aJ(t,r.u_opacity),u_color:new e.aM(t,r.u_color)}),backgroundPattern:(t,r)=>({u_matrix:new e.aK(t,r.u_matrix),u_opacity:new e.aJ(t,r.u_opacity),u_image:new e.aI(t,r.u_image),u_pattern_tl_a:new e.aP(t,r.u_pattern_tl_a),u_pattern_br_a:new e.aP(t,r.u_pattern_br_a),u_pattern_tl_b:new e.aP(t,r.u_pattern_tl_b),u_pattern_br_b:new e.aP(t,r.u_pattern_br_b),u_texsize:new e.aP(t,r.u_texsize),u_mix:new e.aJ(t,r.u_mix),u_pattern_size_a:new e.aP(t,r.u_pattern_size_a),u_pattern_size_b:new e.aP(t,r.u_pattern_size_b),u_scale_a:new e.aJ(t,r.u_scale_a),u_scale_b:new e.aJ(t,r.u_scale_b),u_pixel_coord_upper:new e.aP(t,r.u_pixel_coord_upper),u_pixel_coord_lower:new e.aP(t,r.u_pixel_coord_lower),u_tile_units_to_pixels:new e.aJ(t,r.u_tile_units_to_pixels)}),terrain:(t,r)=>({u_matrix:new e.aK(t,r.u_matrix),u_texture:new e.aI(t,r.u_texture),u_ele_delta:new e.aJ(t,r.u_ele_delta),u_fog_matrix:new e.aK(t,r.u_fog_matrix),u_fog_color:new e.aM(t,r.u_fog_color),u_fog_ground_blend:new e.aJ(t,r.u_fog_ground_blend),u_fog_ground_blend_opacity:new e.aJ(t,r.u_fog_ground_blend_opacity),u_horizon_color:new e.aM(t,r.u_horizon_color),u_horizon_fog_blend:new e.aJ(t,r.u_horizon_fog_blend)}),terrainDepth:(t,r)=>({u_matrix:new e.aK(t,r.u_matrix),u_ele_delta:new e.aJ(t,r.u_ele_delta)}),terrainCoords:(t,r)=>({u_matrix:new e.aK(t,r.u_matrix),u_texture:new e.aI(t,r.u_texture),u_terrain_coords_id:new e.aJ(t,r.u_terrain_coords_id),u_ele_delta:new e.aJ(t,r.u_ele_delta)}),sky:(t,r)=>({u_sky_color:new e.aM(t,r.u_sky_color),u_horizon_color:new e.aM(t,r.u_horizon_color),u_horizon:new e.aJ(t,r.u_horizon),u_sky_horizon_blend:new e.aJ(t,r.u_sky_horizon_blend)})};class Qe{constructor(t,e,r){this.context=t;const n=t.gl;this.buffer=n.createBuffer(),this.dynamicDraw=Boolean(r),this.context.unbindVAO(),t.bindElementBuffer.set(this.buffer),n.bufferData(n.ELEMENT_ARRAY_BUFFER,e.arrayBuffer,this.dynamicDraw?n.DYNAMIC_DRAW:n.STATIC_DRAW),this.dynamicDraw||delete e.arrayBuffer}bind(){this.context.bindElementBuffer.set(this.buffer)}updateData(t){const e=this.context.gl;if(!this.dynamicDraw)throw new Error(\"Attempted to update data while not in dynamic mode.\");this.context.unbindVAO(),this.bind(),e.bufferSubData(e.ELEMENT_ARRAY_BUFFER,0,t.arrayBuffer)}destroy(){const t=this.context.gl;this.buffer&&(t.deleteBuffer(this.buffer),delete this.buffer)}}const tr={Int8:\"BYTE\",Uint8:\"UNSIGNED_BYTE\",Int16:\"SHORT\",Uint16:\"UNSIGNED_SHORT\",Int32:\"INT\",Uint32:\"UNSIGNED_INT\",Float32:\"FLOAT\"};class er{constructor(t,e,r,n){this.length=e.length,this.attributes=r,this.itemSize=e.bytesPerElement,this.dynamicDraw=n,this.context=t;const i=t.gl;this.buffer=i.createBuffer(),t.bindVertexBuffer.set(this.buffer),i.bufferData(i.ARRAY_BUFFER,e.arrayBuffer,this.dynamicDraw?i.DYNAMIC_DRAW:i.STATIC_DRAW),this.dynamicDraw||delete e.arrayBuffer}bind(){this.context.bindVertexBuffer.set(this.buffer)}updateData(t){if(t.length!==this.length)throw new Error(`Length of new data is ${t.length}, which doesn't match current length of ${this.length}`);const e=this.context.gl;this.bind(),e.bufferSubData(e.ARRAY_BUFFER,0,t.arrayBuffer)}enableAttributes(t,e){for(let r=0;r0){const r=e.H();e.aR(r,d.placementInvProjMatrix,t.transform.glCoordMatrix),e.aR(r,r,d.placementViewportMatrix),c.push({circleArray:g,circleOffset:h,transform:p.posMatrix,invTransform:r,coord:p}),u+=g.length/4,h=u}m&&l.draw(o,s.LINES,qr.disabled,Gr.disabled,t.colorModeForRenderPass(),Zr.disabled,Le(t.transform,p.posMatrix),t.style.map.terrain&&t.style.map.terrain.getTerrainData(p),n.id,m.layoutVertexBuffer,m.indexBuffer,m.segments,null,t.transform.zoom,null,null,m.collisionVertexBuffer)}if(!a||!c.length)return;const f=t.useProgram(\"collisionCircle\"),p=new e.aS;p.resize(4*u),p._trim();let d=0;for(const t of c)for(let e=0;er.style.map.terrain.getElevation(a,t,e):null,i=h.translatePosition(u,t,s,l);Qr(o,f,p,c,u,y,a.posMatrix,e,m,v,h,i,a.toUnwrapped(),n)}}}(i,t,n,r,n.layout.get(\"text-rotation-alignment\"),n.layout.get(\"text-pitch-alignment\"),n.paint.get(\"text-translate\"),n.paint.get(\"text-translate-anchor\"),a),0!==n.paint.get(\"icon-opacity\").constantOr(1)&&en(t,r,n,i,!1,n.paint.get(\"icon-translate\"),n.paint.get(\"icon-translate-anchor\"),n.layout.get(\"icon-rotation-alignment\"),n.layout.get(\"icon-pitch-alignment\"),n.layout.get(\"icon-keep-upright\"),o,s),0!==n.paint.get(\"text-opacity\").constantOr(1)&&en(t,r,n,i,!0,n.paint.get(\"text-translate\"),n.paint.get(\"text-translate-anchor\"),n.layout.get(\"text-rotation-alignment\"),n.layout.get(\"text-pitch-alignment\"),n.layout.get(\"text-keep-upright\"),o,s),r.map.showCollisionBoxes&&(Yr(t,r,n,i,!0),Yr(t,r,n,i,!1))}function Jr(t,r,n,i,a,o){const{horizontalAlign:s,verticalAlign:l}=e.av(t),c=-(s-.5)*r,u=-(l-.5)*n;return new e.P((c/a+i[0])*o,(u/a+i[1])*o)}function Kr(t,r,n,i,a,o){const s=r.tileAnchorPoint.add(new e.P(r.translation[0],r.translation[1]));if(r.pitchWithMap){let t=i.mult(o);return n||(t=t.rotate(-a)),wt(s.add(t),r.labelPlaneMatrix,r.getElevation).point}if(n){const e=It(r.tileAnchorPoint.x+1,r.tileAnchorPoint.y,r).point.sub(t),n=Math.atan(e.y/e.x)+(e.x<0?Math.PI:0);return t.add(i.rotate(n))}return t.add(i)}function Qr(t,r,n,i,a,o,s,l,c,u,h,f,p,d){const m=t.text.placedSymbolArray,g=t.text.dynamicLayoutVertexArray,y=t.icon.dynamicLayoutVertexArray,v={};g.clear();for(let y=0;y=0&&(v[x.associatedIconIndex]={shiftedAnchor:L,angle:I})}else Rt(x.numGlyphs,g)}if(u){y.clear();const r=t.icon.placedSymbolArray;for(let t=0;tt.style.map.terrain.getElevation(l,e,r):null,r=\"map\"===n.layout.get(\"text-rotation-alignment\");At(c,l.posMatrix,t,a,j,V,v,u,r,g,l.toUnwrapped(),m.width,m.height,q,e)}const Z=l.posMatrix,W=a&&A||G,Y=x||W?Xr:j,X=U,$=p&&0!==n.paint.get(a?\"text-halo-width\":\"icon-halo-width\").constantOr(1);let J;J=p?c.iconsInText?Xe(k.kind,L,_,v,x,W,t,Z,Y,X,q,P,R,S):Ye(k.kind,L,_,v,x,W,t,Z,Y,X,q,a,P,!0,S):We(k.kind,L,_,v,x,W,t,Z,Y,X,q,a,P,S);const K={program:C,buffers:h,uniformValues:J,atlasTexture:z,atlasTextureIcon:F,atlasInterpolation:O,atlasInterpolationIcon:D,isSDF:p,hasHalo:$};if(w&&c.canOverlap){T=!0;const t=h.segments.get();for(const r of t)M.push({segments:new e.a0([r]),sortKey:r.sortKey,state:K,terrainData:I})}else M.push({segments:h.segments,sortKey:0,state:K,terrainData:I})}T&&M.sort(((t,e)=>t.sortKey-e.sortKey));for(const e of M){const r=e.state;if(p.activeTexture.set(d.TEXTURE0),r.atlasTexture.bind(r.atlasInterpolation,d.CLAMP_TO_EDGE),r.atlasTextureIcon&&(p.activeTexture.set(d.TEXTURE1),r.atlasTextureIcon&&r.atlasTextureIcon.bind(r.atlasInterpolationIcon,d.CLAMP_TO_EDGE)),r.isSDF){const i=r.uniformValues;r.hasHalo&&(i.u_is_halo=1,rn(r.buffers,e.segments,n,t,r.program,k,h,f,i,e.terrainData)),i.u_is_halo=0}rn(r.buffers,e.segments,n,t,r.program,k,h,f,r.uniformValues,e.terrainData)}}function rn(t,e,r,n,i,a,o,s,l,c){const u=n.context,h=u.gl;i.draw(u,h.TRIANGLES,a,o,s,Zr.disabled,l,c,r.id,t.layoutVertexBuffer,t.indexBuffer,e,r.paint,n.transform.zoom,t.programConfigurations.get(r.id),t.dynamicLayoutVertexBuffer,t.opacityVertexBuffer)}function nn(t,r,n,i){if(0!==n.paint.get(\"heatmap-opacity\"))if(\"offscreen\"===t.renderPass){const a=t.context,o=a.gl,s=Gr.disabled,l=new Ur([o.ONE,o.ONE],e.aN.transparent,[!0,!0,!0,!0]);(function(t,e,r){const n=t.gl;t.activeTexture.set(n.TEXTURE1),t.viewport.set([0,0,e.width/4,e.height/4]);let i=r.heatmapFbo;if(i)n.bindTexture(n.TEXTURE_2D,i.colorAttachment.get()),t.bindFramebuffer.set(i.framebuffer);else{const a=n.createTexture();n.bindTexture(n.TEXTURE_2D,a),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_S,n.CLAMP_TO_EDGE),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_T,n.CLAMP_TO_EDGE),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MIN_FILTER,n.LINEAR),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MAG_FILTER,n.LINEAR),i=r.heatmapFbo=t.createFramebuffer(e.width/4,e.height/4,!1,!1),function(t,e,r,n){var i,a;const o=t.gl,s=null!==(i=t.HALF_FLOAT)&&void 0!==i?i:o.UNSIGNED_BYTE,l=null!==(a=t.RGBA16F)&&void 0!==a?a:o.RGBA;o.texImage2D(o.TEXTURE_2D,0,l,e.width/4,e.height/4,0,o.RGBA,s,null),n.colorAttachment.set(r)}(t,e,a,i)}})(a,t,n),a.clear({color:e.aN.transparent});for(let e=0;e0){const i=a.now(),s=(i-t.timeAdded)/l,c=r?(i-r.timeAdded)/l:-1,u=n.getSource(),h=o.coveringZoomLevel({tileSize:u.tileSize,roundZoom:u.roundZoom}),f=!r||Math.abs(r.tileID.overscaledZ-h)>Math.abs(t.tileID.overscaledZ-h),p=f&&t.refreshedUponExpiration?1:e.ad(f?s:1-c,0,1);return t.refreshedUponExpiration&&s>=1&&(t.refreshedUponExpiration=!1),r?{opacity:1,mix:1-p}:{opacity:p,mix:0}}return{opacity:1,mix:0}}const hn=new e.aN(1,0,0,1),fn=new e.aN(0,1,0,1),pn=new e.aN(0,0,1,1),dn=new e.aN(1,0,1,1),mn=new e.aN(0,1,1,1);function gn(t){const e=t.transform.padding;yn(t,t.transform.height-(e.top||0),3,hn),yn(t,e.bottom||0,3,fn),vn(t,e.left||0,3,pn),vn(t,t.transform.width-(e.right||0),3,dn);const r=t.transform.centerPoint;!function(t,e,r,n){const i=20,a=2;xn(t,e-a/2,r-i/2,a,i,n),xn(t,e-i/2,r-a/2,i,a,n)}(t,r.x,t.transform.height-r.y,mn)}function yn(t,e,r,n){xn(t,0,e+r/2,t.transform.width,r,n)}function vn(t,e,r,n){xn(t,e-r/2,0,r,t.transform.height,n)}function xn(t,e,r,n,i,a){const o=t.context,s=o.gl;s.enable(s.SCISSOR_TEST),s.scissor(e*t.pixelRatio,r*t.pixelRatio,n*t.pixelRatio,i*t.pixelRatio),o.clear({color:a}),s.disable(s.SCISSOR_TEST)}function _n(t,r,n){const i=t.context,a=i.gl,o=n.posMatrix,s=t.useProgram(\"debug\"),l=qr.disabled,c=Gr.disabled,u=t.colorModeForRenderPass(),h=\"$debug\",f=t.style.map.terrain&&t.style.map.terrain.getTerrainData(n);i.activeTexture.set(a.TEXTURE0);const p=r.getTileByID(n.key).latestRawTileData,d=p&&p.byteLength||0,m=Math.floor(d/1024),g=r.getTile(n).tileSize,y=512/Math.min(g,512)*(n.overscaledZ/t.transform.zoom)*.5;let v=n.canonical.toString();n.overscaledZ!==n.canonical.z&&(v+=` => ${n.overscaledZ}`),function(t,e){t.initDebugOverlayCanvas();const r=t.debugOverlayCanvas,n=t.context.gl,i=t.debugOverlayCanvas.getContext(\"2d\");i.clearRect(0,0,r.width,r.height),i.shadowColor=\"white\",i.shadowBlur=2,i.lineWidth=1.5,i.strokeStyle=\"white\",i.textBaseline=\"top\",i.font=\"bold 36px Open Sans, sans-serif\",i.fillText(e,5,5),i.strokeText(e,5,5),t.debugOverlayTexture.update(r),t.debugOverlayTexture.bind(n.LINEAR,n.CLAMP_TO_EDGE)}(t,`${v} ${m}kB`),s.draw(i,a.TRIANGLES,l,c,Ur.alphaBlended,Zr.disabled,Pe(o,e.aN.transparent,y),null,h,t.debugBuffer,t.quadTriangleIndexBuffer,t.debugSegments),s.draw(i,a.LINE_STRIP,l,c,u,Zr.disabled,Pe(o,e.aN.red),f,h,t.debugBuffer,t.tileBorderIndexBuffer,t.debugSegments)}function bn(t,e,r){const n=t.context,i=n.gl,a=t.colorModeForRenderPass(),o=new qr(i.LEQUAL,qr.ReadWrite,t.depthRangeFor3D),s=t.useProgram(\"terrain\"),l=e.getTerrainMesh();n.bindFramebuffer.set(null),n.viewport.set([0,0,t.width,t.height]);for(const c of r){const r=t.renderToTexture.getTexture(c),u=e.getTerrainData(c.tileID);n.activeTexture.set(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,r.texture);const h=t.transform.calculatePosMatrix(c.tileID.toUnwrapped()),f=e.getMeshFrameDelta(t.transform.zoom),p=t.transform.calculateFogMatrix(c.tileID.toUnwrapped()),d=xe(h,f,p,t.style.sky,t.transform.pitch);s.draw(n,i.TRIANGLES,o,Gr.disabled,a,Zr.backCCW,d,u,\"terrain\",l.vertexBuffer,l.indexBuffer,l.segments)}}class wn{constructor(t,e,r){this.vertexBuffer=t,this.indexBuffer=e,this.segments=r}destroy(){this.vertexBuffer.destroy(),this.indexBuffer.destroy(),this.segments.destroy(),this.vertexBuffer=null,this.indexBuffer=null,this.segments=null}}class Tn{constructor(t,r){this.context=new Vr(t),this.transform=r,this._tileTextures={},this.terrainFacilitator={dirty:!0,matrix:e.ao(new Float64Array(16)),renderTime:0},this.setup(),this.numSublayers=dt.maxUnderzooming+dt.maxOverzooming+1,this.depthEpsilon=1/Math.pow(2,16),this.crossTileSymbolIndex=new he}resize(t,e,r){if(this.width=Math.floor(t*r),this.height=Math.floor(e*r),this.pixelRatio=r,this.context.viewport.set([0,0,this.width,this.height]),this.style)for(const t of this.style._order)this.style._layers[t].resize()}setup(){const t=this.context,r=new e.aX;r.emplaceBack(0,0),r.emplaceBack(e.X,0),r.emplaceBack(0,e.X),r.emplaceBack(e.X,e.X),this.tileExtentBuffer=t.createVertexBuffer(r,me.members),this.tileExtentSegments=e.a0.simpleSegment(0,0,4,2);const n=new e.aX;n.emplaceBack(0,0),n.emplaceBack(e.X,0),n.emplaceBack(0,e.X),n.emplaceBack(e.X,e.X),this.debugBuffer=t.createVertexBuffer(n,me.members),this.debugSegments=e.a0.simpleSegment(0,0,4,5);const i=new e.$;i.emplaceBack(0,0,0,0),i.emplaceBack(e.X,0,e.X,0),i.emplaceBack(0,e.X,0,e.X),i.emplaceBack(e.X,e.X,e.X,e.X),this.rasterBoundsBuffer=t.createVertexBuffer(i,et.members),this.rasterBoundsSegments=e.a0.simpleSegment(0,0,4,2);const a=new e.aX;a.emplaceBack(0,0),a.emplaceBack(1,0),a.emplaceBack(0,1),a.emplaceBack(1,1),this.viewportBuffer=t.createVertexBuffer(a,me.members),this.viewportSegments=e.a0.simpleSegment(0,0,4,2);const o=new e.aZ;o.emplaceBack(0),o.emplaceBack(1),o.emplaceBack(3),o.emplaceBack(2),o.emplaceBack(0),this.tileBorderIndexBuffer=t.createIndexBuffer(o);const s=new e.aY;s.emplaceBack(0,1,2),s.emplaceBack(2,1,3),this.quadTriangleIndexBuffer=t.createIndexBuffer(s);const l=this.context.gl;this.stencilClearMode=new Gr({func:l.ALWAYS,mask:0},0,255,l.ZERO,l.ZERO,l.ZERO)}clearStencil(){const t=this.context,r=t.gl;this.nextStencilID=1,this.currentStencilSource=void 0;const n=e.H();e.aQ(n,0,this.width,this.height,0,0,1),e.K(n,n,[r.drawingBufferWidth,r.drawingBufferHeight,0]),this.useProgram(\"clippingMask\").draw(t,r.TRIANGLES,qr.disabled,this.stencilClearMode,Ur.disabled,Zr.disabled,ze(n),null,\"$clipping\",this.viewportBuffer,this.quadTriangleIndexBuffer,this.viewportSegments)}_renderTileClippingMasks(t,e){if(this.currentStencilSource===t.source||!t.isTileClipped()||!e||!e.length)return;this.currentStencilSource=t.source;const r=this.context,n=r.gl;this.nextStencilID+e.length>256&&this.clearStencil(),r.setColorMode(Ur.disabled),r.setDepthMode(qr.disabled);const i=this.useProgram(\"clippingMask\");this._tileClippingMaskIDs={};for(const t of e){const e=this._tileClippingMaskIDs[t.key]=this.nextStencilID++,a=this.style.map.terrain&&this.style.map.terrain.getTerrainData(t);i.draw(r,n.TRIANGLES,qr.disabled,new Gr({func:n.ALWAYS,mask:0},e,255,n.KEEP,n.KEEP,n.REPLACE),Ur.disabled,Zr.disabled,ze(t.posMatrix),a,\"$clipping\",this.tileExtentBuffer,this.quadTriangleIndexBuffer,this.tileExtentSegments)}}stencilModeFor3D(){this.currentStencilSource=void 0,this.nextStencilID+1>256&&this.clearStencil();const t=this.nextStencilID++,e=this.context.gl;return new Gr({func:e.NOTEQUAL,mask:255},t,255,e.KEEP,e.KEEP,e.REPLACE)}stencilModeForClipping(t){const e=this.context.gl;return new Gr({func:e.EQUAL,mask:255},this._tileClippingMaskIDs[t.key],0,e.KEEP,e.KEEP,e.REPLACE)}stencilConfigForOverlap(t){const e=this.context.gl,r=t.sort(((t,e)=>e.overscaledZ-t.overscaledZ)),n=r[r.length-1].overscaledZ,i=r[0].overscaledZ-n+1;if(i>1){this.currentStencilSource=void 0,this.nextStencilID+i>256&&this.clearStencil();const t={};for(let r=0;r({u_sky_color:t.properties.get(\"sky-color\"),u_horizon_color:t.properties.get(\"horizon-color\"),u_horizon:(e.height/2+e.getHorizon())*r,u_sky_horizon_blend:t.properties.get(\"sky-horizon-blend\")*e.height/2*r}))(r,t.style.map.transform,t.pixelRatio),o=new qr(i.LEQUAL,qr.ReadWrite,[0,1]),s=Gr.disabled,l=t.colorModeForRenderPass(),c=t.useProgram(\"sky\");if(!r.mesh){const t=new e.aX;t.emplaceBack(-1,-1),t.emplaceBack(1,-1),t.emplaceBack(1,1),t.emplaceBack(-1,1);const i=new e.aY;i.emplaceBack(0,1,2),i.emplaceBack(0,2,3),r.mesh=new wn(n.createVertexBuffer(t,me.members),n.createIndexBuffer(i),e.a0.simpleSegment(0,0,t.length,i.length))}c.draw(n,i.TRIANGLES,o,s,l,Zr.disabled,a,void 0,\"sky\",r.mesh.vertexBuffer,r.mesh.indexBuffer,r.mesh.segments)}(this,this.style.sky),this._showOverdrawInspector=r.showOverdrawInspector,this.depthRangeFor3D=[0,1-(t._order.length+2)*this.numSublayers*this.depthEpsilon],!this.renderToTexture)for(this.renderPass=\"opaque\",this.currentLayer=i.length-1;this.currentLayer>=0;this.currentLayer--){const t=this.style._layers[i[this.currentLayer]],e=o[t.source],r=s[t.source];this._renderTileClippingMasks(t,r),this.renderLayer(this,e,t,r)}for(this.renderPass=\"translucent\",this.currentLayer=0;this.currentLayerr.source&&!r.isHidden(e)?[t.sourceCaches[r.source]]:[])),i=n.filter((t=>\"vector\"===t.getSource().type)),a=n.filter((t=>\"vector\"!==t.getSource().type)),o=t=>{(!r||r.getSource().maxzoomo(t))),r||a.forEach((t=>o(t))),r}(this.style,this.transform.zoom);t&&function(t,e,r){for(let n=0;n0),i&&(e.b0(r,n),this.terrainFacilitator.renderTime=Date.now(),this.terrainFacilitator.dirty=!1,function(t,r){const n=t.context,i=n.gl,a=Ur.unblended,o=new qr(i.LEQUAL,qr.ReadWrite,[0,1]),s=r.getTerrainMesh(),l=r.sourceCache.getRenderableTiles(),c=t.useProgram(\"terrainDepth\");n.bindFramebuffer.set(r.getFramebuffer(\"depth\").framebuffer),n.viewport.set([0,0,t.width/devicePixelRatio,t.height/devicePixelRatio]),n.clear({color:e.aN.transparent,depth:1});for(const e of l){const l=r.getTerrainData(e.tileID),u={u_matrix:t.transform.calculatePosMatrix(e.tileID.toUnwrapped()),u_ele_delta:r.getMeshFrameDelta(t.transform.zoom)};c.draw(n,i.TRIANGLES,o,Gr.disabled,a,Zr.backCCW,u,l,\"terrain\",s.vertexBuffer,s.indexBuffer,s.segments)}n.bindFramebuffer.set(null),n.viewport.set([0,0,t.width,t.height])}(this,this.style.map.terrain),function(t,r){const n=t.context,i=n.gl,a=Ur.unblended,o=new qr(i.LEQUAL,qr.ReadWrite,[0,1]),s=r.getTerrainMesh(),l=r.getCoordsTexture(),c=r.sourceCache.getRenderableTiles(),u=t.useProgram(\"terrainCoords\");n.bindFramebuffer.set(r.getFramebuffer(\"coords\").framebuffer),n.viewport.set([0,0,t.width/devicePixelRatio,t.height/devicePixelRatio]),n.clear({color:e.aN.transparent,depth:1}),r.coordsIndex=[];for(const e of c){const c=r.getTerrainData(e.tileID);n.activeTexture.set(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,l.texture);const h={u_matrix:t.transform.calculatePosMatrix(e.tileID.toUnwrapped()),u_terrain_coords_id:(255-r.coordsIndex.length)/255,u_texture:0,u_ele_delta:r.getMeshFrameDelta(t.transform.zoom)};u.draw(n,i.TRIANGLES,o,Gr.disabled,a,Zr.backCCW,h,c,\"terrain\",s.vertexBuffer,s.indexBuffer,s.segments),r.coordsIndex.push(e.tileID.key)}n.bindFramebuffer.set(null),n.viewport.set([0,0,t.width,t.height])}(this,this.style.map.terrain))}renderLayer(t,r,n,i){if(!n.isHidden(this.transform.zoom)&&(\"background\"===n.type||\"custom\"===n.type||(i||[]).length))switch(this.id=n.id,n.type){case\"symbol\":$r(t,r,n,i,this.style.placement.variableOffsets);break;case\"circle\":!function(t,r,n,i){if(\"translucent\"!==t.renderPass)return;const a=n.paint.get(\"circle-opacity\"),o=n.paint.get(\"circle-stroke-width\"),s=n.paint.get(\"circle-stroke-opacity\"),l=!n.layout.get(\"circle-sort-key\").isConstant();if(0===a.constantOr(1)&&(0===o.constantOr(1)||0===s.constantOr(1)))return;const c=t.context,u=c.gl,h=t.depthModeForSublayer(0,qr.ReadOnly),f=Gr.disabled,p=t.colorModeForRenderPass(),d=[];for(let a=0;at.sortKey-e.sortKey));for(const e of d){const{programConfiguration:r,program:i,layoutVertexBuffer:a,indexBuffer:o,uniformValues:s,terrainData:l}=e.state,d=e.segments;i.draw(c,u.TRIANGLES,h,f,p,Zr.disabled,s,l,n.id,a,o,d,n.paint,t.transform.zoom,r)}}(t,r,n,i);break;case\"heatmap\":nn(t,r,n,i);break;case\"line\":!function(t,r,n,i){if(\"translucent\"!==t.renderPass)return;const a=n.paint.get(\"line-opacity\"),o=n.paint.get(\"line-width\");if(0===a.constantOr(1)||0===o.constantOr(1))return;const s=t.depthModeForSublayer(0,qr.ReadOnly),l=t.colorModeForRenderPass(),c=n.paint.get(\"line-dasharray\"),u=n.paint.get(\"line-pattern\"),h=u.constantOr(1),f=n.paint.get(\"line-gradient\"),p=n.getCrossfadeParameters(),d=h?\"linePattern\":c?\"lineSDF\":f?\"lineGradient\":\"line\",m=t.context,g=m.gl;let y=!0;for(const a of i){const i=r.getTile(a);if(h&&!i.patternsLoaded())continue;const o=i.getBucket(n);if(!o)continue;const v=o.programConfigurations.get(n.id),x=t.context.program.get(),_=t.useProgram(d,v),b=y||_.program!==x,T=t.style.map.terrain&&t.style.map.terrain.getTerrainData(a),k=u.constantOr(null);if(k&&i.imageAtlas){const t=i.imageAtlas,e=t.patternPositions[k.to.toString()],r=t.patternPositions[k.from.toString()];e&&r&&v.setConstantPatternPositions(e,r)}const A=T?a:null,M=h?Ue(t,i,n,p,A):c?Ve(t,i,n,c,p,A):f?je(t,i,n,o.lineClipsArray.length,A):Ne(t,i,n,A);if(h)m.activeTexture.set(g.TEXTURE0),i.imageAtlasTexture.bind(g.LINEAR,g.CLAMP_TO_EDGE),v.updatePaintBuffers(p);else if(c&&(b||t.lineAtlas.dirty))m.activeTexture.set(g.TEXTURE0),t.lineAtlas.bind(m);else if(f){const i=o.gradients[n.id];let s=i.texture;if(n.gradientVersion!==i.version){let l=256;if(n.stepInterpolant){const n=r.getSource().maxzoom,i=a.canonical.z===n?Math.ceil(1<20&&a.texParameterf(a.TEXTURE_2D,i.extTextureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT,i.extTextureFilterAnisotropicMax);const _=t.style.map.terrain&&t.style.map.terrain.getTerrainData(n),b=_?n:null,w=b?b.posMatrix:t.transform.calculatePosMatrix(n.toUnwrapped(),f),T=Ge(w,v||[0,0],y||1,g,r);o instanceof rt?s.draw(i,a.TRIANGLES,u,Gr.disabled,l,Zr.disabled,T,_,r.id,o.boundsBuffer,t.quadTriangleIndexBuffer,o.boundsSegments):s.draw(i,a.TRIANGLES,u,c[n.overscaledZ],l,Zr.disabled,T,_,r.id,t.rasterBoundsBuffer,t.quadTriangleIndexBuffer,t.rasterBoundsSegments)}}(t,r,n,i);break;case\"background\":!function(t,e,r,n){const i=r.paint.get(\"background-color\"),a=r.paint.get(\"background-opacity\");if(0===a)return;const o=t.context,s=o.gl,l=t.transform,c=l.tileSize,u=r.paint.get(\"background-pattern\");if(t.isPatternMissing(u))return;const h=!u&&1===i.a&&1===a&&t.opaquePassEnabledForLayer()?\"opaque\":\"translucent\";if(t.renderPass!==h)return;const f=Gr.disabled,p=t.depthModeForSublayer(0,\"opaque\"===h?qr.ReadWrite:qr.ReadOnly),d=t.colorModeForRenderPass(),m=t.useProgram(u?\"backgroundPattern\":\"background\"),g=n||l.coveringTiles({tileSize:c,terrain:t.style.map.terrain});u&&(o.activeTexture.set(s.TEXTURE0),t.imageManager.bind(t.context));const y=r.getCrossfadeParameters();for(const e of g){const l=n?e.posMatrix:t.transform.calculatePosMatrix(e.toUnwrapped()),h=u?Je(l,a,t,u,{tileID:e,tileSize:c},y):$e(l,a,i),g=t.style.map.terrain&&t.style.map.terrain.getTerrainData(e);m.draw(o,s.TRIANGLES,p,f,d,Zr.disabled,h,g,r.id,t.tileExtentBuffer,t.quadTriangleIndexBuffer,t.tileExtentSegments)}}(t,0,n,i);break;case\"custom\":!function(t,e,r){const n=t.context,i=r.implementation;if(\"offscreen\"===t.renderPass){const e=i.prerender;e&&(t.setCustomLayerDefaults(),n.setColorMode(t.colorModeForRenderPass()),e.call(i,n.gl,t.transform.customLayerMatrix()),n.setDirty(),t.setBaseState())}else if(\"translucent\"===t.renderPass){t.setCustomLayerDefaults(),n.setColorMode(t.colorModeForRenderPass()),n.setStencilMode(Gr.disabled);const e=\"3d\"===i.renderingMode?new qr(t.context.gl.LEQUAL,qr.ReadWrite,t.depthRangeFor3D):t.depthModeForSublayer(0,qr.ReadOnly);n.setDepthMode(e),i.render(n.gl,t.transform.customLayerMatrix(),{farZ:t.transform.farZ,nearZ:t.transform.nearZ,fov:t.transform._fov,modelViewProjectionMatrix:t.transform.modelViewProjectionMatrix,projectionMatrix:t.transform.projectionMatrix}),n.setDirty(),t.setBaseState(),n.bindFramebuffer.set(null)}}(t,0,n)}}translatePosMatrix(t,r,n,i,a){if(!n[0]&&!n[1])return t;const o=a?\"map\"===i?this.transform.angle:0:\"viewport\"===i?-this.transform.angle:0;if(o){const t=Math.sin(o),e=Math.cos(o);n=[n[0]*e-n[1]*t,n[0]*t+n[1]*e]}const s=[a?n[0]:Nt(r,n[0],this.transform.zoom),a?n[1]:Nt(r,n[1],this.transform.zoom),0],l=new Float32Array(16);return e.J(l,t,s),l}saveTileTexture(t){const e=this._tileTextures[t.size[0]];e?e.push(t):this._tileTextures[t.size[0]]=[t]}getTileTexture(t){const e=this._tileTextures[t];return e&&e.length>0?e.pop():null}isPatternMissing(t){if(!t)return!1;if(!t.from||!t.to)return!0;const e=this.imageManager.getPattern(t.from.toString()),r=this.imageManager.getPattern(t.to.toString());return!e||!r}useProgram(t,e){this.cache=this.cache||{};const r=t+(e?e.cacheKey:\"\")+(this._showOverdrawInspector?\"/overdraw\":\"\")+(this.style.map.terrain?\"/terrain\":\"\");return this.cache[r]||(this.cache[r]=new be(this.context,ge[t],e,Ke[t],this._showOverdrawInspector,this.style.map.terrain)),this.cache[r]}setCustomLayerDefaults(){this.context.unbindVAO(),this.context.cullFace.setDefault(),this.context.activeTexture.setDefault(),this.context.pixelStoreUnpack.setDefault(),this.context.pixelStoreUnpackPremultiplyAlpha.setDefault(),this.context.pixelStoreUnpackFlipY.setDefault()}setBaseState(){const t=this.context.gl;this.context.cullFace.set(!1),this.context.viewport.set([0,0,this.width,this.height]),this.context.blendEquation.set(t.FUNC_ADD)}initDebugOverlayCanvas(){if(null==this.debugOverlayCanvas){this.debugOverlayCanvas=document.createElement(\"canvas\"),this.debugOverlayCanvas.width=512,this.debugOverlayCanvas.height=512;const t=this.context.gl;this.debugOverlayTexture=new w(this.context,this.debugOverlayCanvas,t.RGBA)}}destroy(){this.debugOverlayTexture&&this.debugOverlayTexture.destroy()}overLimit(){const{drawingBufferWidth:t,drawingBufferHeight:e}=this.context.gl;return this.width!==t||this.height!==e}}class kn{constructor(t,e){this.points=t,this.planes=e}static fromInvProjectionMatrix(t,r,n){const i=Math.pow(2,n),a=[[-1,1,-1,1],[1,1,-1,1],[1,-1,-1,1],[-1,-1,-1,1],[-1,1,1,1],[1,1,1,1],[1,-1,1,1],[-1,-1,1,1]].map((n=>{const a=1/(n=e.ag([],n,t))[3]/r*i;return e.b1(n,n,[a,a,1/n[3],a])})),o=[[0,1,2],[6,5,4],[0,3,7],[2,1,5],[3,2,6],[0,4,5]].map((t=>{const e=function(t,e){var r=e[0],n=e[1],i=e[2],a=r*r+n*n+i*i;return a>0&&(a=1/Math.sqrt(a)),t[0]=e[0]*a,t[1]=e[1]*a,t[2]=e[2]*a,t}([],function(t,e,r){var n=e[0],i=e[1],a=e[2],o=r[0],s=r[1],l=r[2];return t[0]=i*l-a*s,t[1]=a*o-n*l,t[2]=n*s-i*o,t}([],y([],a[t[0]],a[t[1]]),y([],a[t[2]],a[t[1]]))),r=(n=e,i=a[t[1]],-(n[0]*i[0]+n[1]*i[1]+n[2]*i[2]));var n,i;return e.concat(r)}));return new kn(a,o)}}class An{constructor(t,e){this.min=t,this.max=e,this.center=function(t,e,r){return t[0]=e[0]*r,t[1]=e[1]*r,t[2]=e[2]*r,t}([],function(t,e,r){return t[0]=e[0]+r[0],t[1]=e[1]+r[1],t[2]=e[2]+r[2],t}([],this.min,this.max),.5)}quadrant(t){const e=[t%2==0,t<2],r=m(this.min),n=m(this.max);for(let t=0;t=0&&o++;if(0===o)return 0;o!==r.length&&(n=!1)}if(n)return 2;for(let e=0;e<3;e++){let r=Number.MAX_VALUE,n=-Number.MAX_VALUE;for(let i=0;ithis.max[e]-this.min[e])return 0}return 1}}class Mn{constructor(t=0,e=0,r=0,n=0){if(isNaN(t)||t<0||isNaN(e)||e<0||isNaN(r)||r<0||isNaN(n)||n<0)throw new Error(\"Invalid value for edge-insets, top, bottom, left and right must all be numbers\");this.top=t,this.bottom=e,this.left=r,this.right=n}interpolate(t,r,n){return null!=r.top&&null!=t.top&&(this.top=e.z.number(t.top,r.top,n)),null!=r.bottom&&null!=t.bottom&&(this.bottom=e.z.number(t.bottom,r.bottom,n)),null!=r.left&&null!=t.left&&(this.left=e.z.number(t.left,r.left,n)),null!=r.right&&null!=t.right&&(this.right=e.z.number(t.right,r.right,n)),this}getCenter(t,r){const n=e.ad((this.left+t-this.right)/2,0,t),i=e.ad((this.top+r-this.bottom)/2,0,r);return new e.P(n,i)}equals(t){return this.top===t.top&&this.bottom===t.bottom&&this.left===t.left&&this.right===t.right}clone(){return new Mn(this.top,this.bottom,this.left,this.right)}toJSON(){return{top:this.top,bottom:this.bottom,left:this.left,right:this.right}}}const Sn=85.051129;class En{constructor(t,r,n,i,a){this.tileSize=512,this._renderWorldCopies=void 0===a||!!a,this._minZoom=t||0,this._maxZoom=r||22,this._minPitch=null==n?0:n,this._maxPitch=null==i?60:i,this.setMaxBounds(),this.width=0,this.height=0,this._center=new e.N(0,0),this._elevation=0,this.zoom=0,this.angle=0,this._fov=.6435011087932844,this._pitch=0,this._unmodified=!0,this._edgeInsets=new Mn,this._posMatrixCache={},this._alignedPosMatrixCache={},this._fogMatrixCache={},this.minElevationForCurrentTile=0}clone(){const t=new En(this._minZoom,this._maxZoom,this._minPitch,this.maxPitch,this._renderWorldCopies);return t.apply(this),t}apply(t){this.tileSize=t.tileSize,this.latRange=t.latRange,this.width=t.width,this.height=t.height,this._center=t._center,this._elevation=t._elevation,this.minElevationForCurrentTile=t.minElevationForCurrentTile,this.zoom=t.zoom,this.angle=t.angle,this._fov=t._fov,this._pitch=t._pitch,this._unmodified=t._unmodified,this._edgeInsets=t._edgeInsets.clone(),this._calcMatrices()}get minZoom(){return this._minZoom}set minZoom(t){this._minZoom!==t&&(this._minZoom=t,this.zoom=Math.max(this.zoom,t))}get maxZoom(){return this._maxZoom}set maxZoom(t){this._maxZoom!==t&&(this._maxZoom=t,this.zoom=Math.min(this.zoom,t))}get minPitch(){return this._minPitch}set minPitch(t){this._minPitch!==t&&(this._minPitch=t,this.pitch=Math.max(this.pitch,t))}get maxPitch(){return this._maxPitch}set maxPitch(t){this._maxPitch!==t&&(this._maxPitch=t,this.pitch=Math.min(this.pitch,t))}get renderWorldCopies(){return this._renderWorldCopies}set renderWorldCopies(t){void 0===t?t=!0:null===t&&(t=!1),this._renderWorldCopies=t}get worldSize(){return this.tileSize*this.scale}get centerOffset(){return this.centerPoint._sub(this.size._div(2))}get size(){return new e.P(this.width,this.height)}get bearing(){return-this.angle/Math.PI*180}set bearing(t){const r=-e.b3(t,-180,180)*Math.PI/180;this.angle!==r&&(this._unmodified=!1,this.angle=r,this._calcMatrices(),this.rotationMatrix=function(){var t=new e.A(4);return e.A!=Float32Array&&(t[1]=0,t[2]=0),t[0]=1,t[3]=1,t}(),function(t,e,r){var n=e[0],i=e[1],a=e[2],o=e[3],s=Math.sin(r),l=Math.cos(r);t[0]=n*l+a*s,t[1]=i*l+o*s,t[2]=n*-s+a*l,t[3]=i*-s+o*l}(this.rotationMatrix,this.rotationMatrix,this.angle))}get pitch(){return this._pitch/Math.PI*180}set pitch(t){const r=e.ad(t,this.minPitch,this.maxPitch)/180*Math.PI;this._pitch!==r&&(this._unmodified=!1,this._pitch=r,this._calcMatrices())}get fov(){return this._fov/Math.PI*180}set fov(t){t=Math.max(.01,Math.min(60,t)),this._fov!==t&&(this._unmodified=!1,this._fov=t/180*Math.PI,this._calcMatrices())}get zoom(){return this._zoom}set zoom(t){const e=Math.min(Math.max(t,this.minZoom),this.maxZoom);this._zoom!==e&&(this._unmodified=!1,this._zoom=e,this.tileZoom=Math.max(0,Math.floor(e)),this.scale=this.zoomScale(e),this._constrain(),this._calcMatrices())}get center(){return this._center}set center(t){t.lat===this._center.lat&&t.lng===this._center.lng||(this._unmodified=!1,this._center=t,this._constrain(),this._calcMatrices())}get elevation(){return this._elevation}set elevation(t){t!==this._elevation&&(this._elevation=t,this._constrain(),this._calcMatrices())}get padding(){return this._edgeInsets.toJSON()}set padding(t){this._edgeInsets.equals(t)||(this._unmodified=!1,this._edgeInsets.interpolate(this._edgeInsets,t,1),this._calcMatrices())}get centerPoint(){return this._edgeInsets.getCenter(this.width,this.height)}isPaddingEqual(t){return this._edgeInsets.equals(t)}interpolatePadding(t,e,r){this._unmodified=!1,this._edgeInsets.interpolate(t,e,r),this._constrain(),this._calcMatrices()}coveringZoomLevel(t){const e=(t.roundZoom?Math.round:Math.floor)(this.zoom+this.scaleZoom(this.tileSize/t.tileSize));return Math.max(0,e)}getVisibleUnwrappedCoordinates(t){const r=[new e.b4(0,t)];if(this._renderWorldCopies){const n=this.pointCoordinate(new e.P(0,0)),i=this.pointCoordinate(new e.P(this.width,0)),a=this.pointCoordinate(new e.P(this.width,this.height)),o=this.pointCoordinate(new e.P(0,this.height)),s=Math.floor(Math.min(n.x,i.x,a.x,o.x)),l=Math.floor(Math.max(n.x,i.x,a.x,o.x)),c=1;for(let n=s-c;n<=l+c;n++)0!==n&&r.push(new e.b4(n,t))}return r}coveringTiles(t){var r,n;let i=this.coveringZoomLevel(t);const a=i;if(void 0!==t.minzoom&&it.maxzoom&&(i=t.maxzoom);const o=this.pointCoordinate(this.getCameraPoint()),s=e.Z.fromLngLat(this.center),l=Math.pow(2,i),c=[l*o.x,l*o.y,0],u=[l*s.x,l*s.y,0],h=kn.fromInvProjectionMatrix(this.invModelViewProjectionMatrix,this.worldSize,i);let f=t.minzoom||0;!t.terrain&&this.pitch<=60&&this._edgeInsets.top<.1&&(f=i);const p=t.terrain?2/Math.min(this.tileSize,t.tileSize)*this.tileSize:3,d=t=>({aabb:new An([t*l,0,0],[(t+1)*l,l,0]),zoom:0,x:0,y:0,wrap:t,fullyVisible:!1}),m=[],g=[],y=i,x=t.reparseOverscaled?a:i;if(this._renderWorldCopies)for(let t=1;t<=3;t++)m.push(d(-t)),m.push(d(t));for(m.push(d(0));m.length>0;){const i=m.pop(),a=i.x,o=i.y;let s=i.fullyVisible;if(!s){const t=i.aabb.intersects(h);if(0===t)continue;s=2===t}const l=t.terrain?c:u,d=i.aabb.distanceX(l),_=i.aabb.distanceY(l),b=Math.max(Math.abs(d),Math.abs(_)),w=p+(1<w&&i.zoom>=f){const t=y-i.zoom,r=c[0]-.5-(a<>1),h=i.zoom+1;let f=i.aabb.quadrant(l);if(t.terrain){const a=new e.S(h,i.wrap,h,c,u),o=t.terrain.getMinMaxElevation(a),s=null!==(r=o.minElevation)&&void 0!==r?r:this.elevation,l=null!==(n=o.maxElevation)&&void 0!==n?n:this.elevation;f=new An([f.min[0],f.min[1],s],[f.max[0],f.max[1],l])}m.push({aabb:f,zoom:h,x:c,y:u,wrap:i.wrap,fullyVisible:s})}}return g.sort(((t,e)=>t.distanceSq-e.distanceSq)).map((t=>t.tileID))}resize(t,e){this.width=t,this.height=e,this.pixelsToGLUnits=[2/t,-2/e],this._constrain(),this._calcMatrices()}get unmodified(){return this._unmodified}zoomScale(t){return Math.pow(2,t)}scaleZoom(t){return Math.log(t)/Math.LN2}project(t){const r=e.ad(t.lat,-85.051129,Sn);return new e.P(e.O(t.lng)*this.worldSize,e.Q(r)*this.worldSize)}unproject(t){return new e.Z(t.x/this.worldSize,t.y/this.worldSize).toLngLat()}get point(){return this.project(this.center)}getCameraPosition(){return{lngLat:this.pointLocation(this.getCameraPoint()),altitude:Math.cos(this._pitch)*this.cameraToCenterDistance/this._pixelPerMeter+this.elevation}}recalculateZoom(t){const r=this.elevation,n=Math.cos(this._pitch)*this.cameraToCenterDistance/this._pixelPerMeter,i=this.pointLocation(this.centerPoint,t),a=t.getElevationForLngLatZoom(i,this.tileZoom);if(!(this.elevation-a))return;const o=n+r-a,s=Math.cos(this._pitch)*this.cameraToCenterDistance/o/e.b5(1,i.lat)/this.tileSize,l=this.scaleZoom(s);this._elevation=a,this._center=i,this.zoom=l}setLocationAtPoint(t,r){const n=this.pointCoordinate(r),i=this.pointCoordinate(this.centerPoint),a=this.locationCoordinate(t),o=new e.Z(a.x-(n.x-i.x),a.y-(n.y-i.y));this.center=this.coordinateLocation(o),this._renderWorldCopies&&(this.center=this.center.wrap())}locationPoint(t,e){return e?this.coordinatePoint(this.locationCoordinate(t),e.getElevationForLngLatZoom(t,this.tileZoom),this.pixelMatrix3D):this.coordinatePoint(this.locationCoordinate(t))}pointLocation(t,e){return this.coordinateLocation(this.pointCoordinate(t,e))}locationCoordinate(t){return e.Z.fromLngLat(t)}coordinateLocation(t){return t&&t.toLngLat()}pointCoordinate(t,r){if(r){const e=r.pointCoordinate(t);if(null!=e)return e}const n=[t.x,t.y,0,1],i=[t.x,t.y,1,1];e.ag(n,n,this.pixelMatrixInverse),e.ag(i,i,this.pixelMatrixInverse);const a=n[3],o=i[3],s=n[0]/a,l=i[0]/o,c=n[1]/a,u=i[1]/o,h=n[2]/a,f=i[2]/o,p=h===f?0:(0-h)/(f-h);return new e.Z(e.z.number(s,l,p)/this.worldSize,e.z.number(c,u,p)/this.worldSize)}coordinatePoint(t,r=0,n=this.pixelMatrix){const i=[t.x*this.worldSize,t.y*this.worldSize,r,1];return e.ag(i,i,n),new e.P(i[0]/i[3],i[1]/i[3])}getBounds(){const t=Math.max(0,this.height/2-this.getHorizon());return(new X).extend(this.pointLocation(new e.P(0,t))).extend(this.pointLocation(new e.P(this.width,t))).extend(this.pointLocation(new e.P(this.width,this.height))).extend(this.pointLocation(new e.P(0,this.height)))}getMaxBounds(){return this.latRange&&2===this.latRange.length&&this.lngRange&&2===this.lngRange.length?new X([this.lngRange[0],this.latRange[0]],[this.lngRange[1],this.latRange[1]]):null}getHorizon(){return Math.tan(Math.PI/2-this._pitch)*this.cameraToCenterDistance*.85}setMaxBounds(t){t?(this.lngRange=[t.getWest(),t.getEast()],this.latRange=[t.getSouth(),t.getNorth()],this._constrain()):(this.lngRange=null,this.latRange=[-85.051129,Sn])}calculateTileMatrix(t){const r=t.canonical,n=this.worldSize/this.zoomScale(r.z),i=r.x+Math.pow(2,r.z)*t.wrap,a=e.ao(new Float64Array(16));return e.J(a,a,[i*n,r.y*n,0]),e.K(a,a,[n/e.X,n/e.X,1]),a}calculatePosMatrix(t,r=!1){const n=t.key,i=r?this._alignedPosMatrixCache:this._posMatrixCache;if(i[n])return i[n];const a=this.calculateTileMatrix(t);return e.L(a,r?this.alignedModelViewProjectionMatrix:this.modelViewProjectionMatrix,a),i[n]=new Float32Array(a),i[n]}calculateFogMatrix(t){const r=t.key,n=this._fogMatrixCache;if(n[r])return n[r];const i=this.calculateTileMatrix(t);return e.L(i,this.fogMatrix,i),n[r]=new Float32Array(i),n[r]}customLayerMatrix(){return this.mercatorMatrix.slice()}getConstrained(t,r){r=e.ad(+r,this.minZoom,this.maxZoom);const n={center:new e.N(t.lng,t.lat),zoom:r};let i=this.lngRange;if(!this._renderWorldCopies&&null===i){const t=180-1e-10;i=[-t,t]}const a=this.tileSize*this.zoomScale(n.zoom);let o=0,s=a,l=0,c=a,u=0,h=0;const{x:f,y:p}=this.size;if(this.latRange){const t=this.latRange;o=e.Q(t[1])*a,s=e.Q(t[0])*a,s-os&&(y=s-t)}if(i){const t=(l+c)/2;let r=d;this._renderWorldCopies&&(r=e.b3(d,t-a/2,t+a/2));const n=f/2;r-nc&&(g=c-n)}if(void 0!==g||void 0!==y){const t=new e.P(null!=g?g:d,null!=y?y:m);n.center=this.unproject.call({worldSize:a},t).wrap()}return n}_constrain(){if(!this.center||!this.width||!this.height||this._constraining)return;this._constraining=!0;const t=this._unmodified,{center:e,zoom:r}=this.getConstrained(this.center,this.zoom);this.center=e,this.zoom=r,this._unmodified=t,this._constraining=!1}_calcMatrices(){if(!this.height)return;const t=this._fov/2,r=this.centerOffset,n=this.point.x,i=this.point.y;this.cameraToCenterDistance=.5/Math.tan(t)*this.height,this._pixelPerMeter=e.b5(1,this.center.lat)*this.worldSize;let a=e.ao(new Float64Array(16));e.K(a,a,[this.width/2,-this.height/2,1]),e.J(a,a,[1,-1,0]),this.labelPlaneMatrix=a,a=e.ao(new Float64Array(16)),e.K(a,a,[1,-1,1]),e.J(a,a,[-1,-1,0]),e.K(a,a,[2/this.width,2/this.height,1]),this.glCoordMatrix=a;const o=this.cameraToCenterDistance+this._elevation*this._pixelPerMeter/Math.cos(this._pitch),s=Math.min(this.elevation,this.minElevationForCurrentTile),l=o-s*this._pixelPerMeter/Math.cos(this._pitch),c=s<0?l:o,u=Math.PI/2+this._pitch,h=this._fov*(.5+r.y/this.height),f=Math.sin(h)*c/Math.sin(e.ad(Math.PI-u-h,.01,Math.PI-.01)),p=this.getHorizon(),d=2*Math.atan(p/this.cameraToCenterDistance)*(.5+r.y/(2*p)),m=Math.sin(d)*c/Math.sin(e.ad(Math.PI-u-d,.01,Math.PI-.01)),g=Math.min(f,m);this.farZ=1.01*(Math.cos(Math.PI/2-this._pitch)*g+c),this.nearZ=this.height/50,a=new Float64Array(16),e.b6(a,this._fov,this.width/this.height,this.nearZ,this.farZ),a[8]=2*-r.x/this.width,a[9]=2*r.y/this.height,this.projectionMatrix=e.af(a),e.K(a,a,[1,-1,1]),e.J(a,a,[0,0,-this.cameraToCenterDistance]),e.b7(a,a,this._pitch),e.ae(a,a,this.angle),e.J(a,a,[-n,-i,0]),this.mercatorMatrix=e.K([],a,[this.worldSize,this.worldSize,this.worldSize]),e.K(a,a,[1,1,this._pixelPerMeter]),this.pixelMatrix=e.L(new Float64Array(16),this.labelPlaneMatrix,a),e.J(a,a,[0,0,-this.elevation]),this.modelViewProjectionMatrix=a,this.invModelViewProjectionMatrix=e.at([],a),this.fogMatrix=new Float64Array(16),e.b6(this.fogMatrix,this._fov,this.width/this.height,o,this.farZ),this.fogMatrix[8]=2*-r.x/this.width,this.fogMatrix[9]=2*r.y/this.height,e.K(this.fogMatrix,this.fogMatrix,[1,-1,1]),e.J(this.fogMatrix,this.fogMatrix,[0,0,-this.cameraToCenterDistance]),e.b7(this.fogMatrix,this.fogMatrix,this._pitch),e.ae(this.fogMatrix,this.fogMatrix,this.angle),e.J(this.fogMatrix,this.fogMatrix,[-n,-i,0]),e.K(this.fogMatrix,this.fogMatrix,[1,1,this._pixelPerMeter]),e.J(this.fogMatrix,this.fogMatrix,[0,0,-this.elevation]),this.pixelMatrix3D=e.L(new Float64Array(16),this.labelPlaneMatrix,a);const y=this.width%2/2,v=this.height%2/2,x=Math.cos(this.angle),_=Math.sin(this.angle),b=n-Math.round(n)+x*y+_*v,w=i-Math.round(i)+x*v+_*y,T=new Float64Array(a);if(e.J(T,T,[b>.5?b-1:b,w>.5?w-1:w,0]),this.alignedModelViewProjectionMatrix=T,a=e.at(new Float64Array(16),this.pixelMatrix),!a)throw new Error(\"failed to invert matrix\");this.pixelMatrixInverse=a,this._posMatrixCache={},this._alignedPosMatrixCache={},this._fogMatrixCache={}}maxPitchScaleFactor(){if(!this.pixelMatrixInverse)return 1;const t=this.pointCoordinate(new e.P(0,0)),r=[t.x*this.worldSize,t.y*this.worldSize,0,1];return e.ag(r,r,this.pixelMatrix)[3]/this.cameraToCenterDistance}getCameraPoint(){const t=this._pitch,r=Math.tan(t)*(this.cameraToCenterDistance||1);return this.centerPoint.add(new e.P(0,r))}getCameraQueryGeometry(t){const r=this.getCameraPoint();if(1===t.length)return[t[0],r];{let n=r.x,i=r.y,a=r.x,o=r.y;for(const e of t)n=Math.min(n,e.x),i=Math.min(i,e.y),a=Math.max(a,e.x),o=Math.max(o,e.y);return[new e.P(n,i),new e.P(a,i),new e.P(a,o),new e.P(n,o),new e.P(n,i)]}}lngLatToCameraDepth(t,r){const n=this.locationCoordinate(t),i=[n.x*this.worldSize,n.y*this.worldSize,r,1];return e.ag(i,i,this.modelViewProjectionMatrix),i[2]/i[3]}}function Cn(t,e){let r,n=!1,i=null,a=null;const o=()=>{i=null,n&&(t.apply(a,r),i=setTimeout(o,e),n=!1)};return(...t)=>(n=!0,a=this,r=t,i||o(),i)}class Ln{constructor(t){this._getCurrentHash=()=>{const t=window.location.hash.replace(\"#\",\"\");if(this._hashName){let e;return t.split(\"&\").map((t=>t.split(\"=\"))).forEach((t=>{t[0]===this._hashName&&(e=t)})),(e&&e[1]||\"\").split(\"/\")}return t.split(\"/\")},this._onHashChange=()=>{const t=this._getCurrentHash();if(t.length>=3&&!t.some((t=>isNaN(t)))){const e=this._map.dragRotate.isEnabled()&&this._map.touchZoomRotate.isEnabled()?+(t[3]||0):this._map.getBearing();return this._map.jumpTo({center:[+t[2],+t[1]],zoom:+t[0],bearing:e,pitch:+(t[4]||0)}),!0}return!1},this._updateHashUnthrottled=()=>{const t=window.location.href.replace(/(#.+)?$/,this.getHashString());window.history.replaceState(window.history.state,null,t)},this._removeHash=()=>{const t=this._getCurrentHash();if(0===t.length)return;const e=t.join(\"/\");let r=e;r.split(\"&\").length>0&&(r=r.split(\"&\")[0]),this._hashName&&(r=`${this._hashName}=${e}`);let n=window.location.hash.replace(r,\"\");n.startsWith(\"#&\")?n=n.slice(0,1)+n.slice(2):\"#\"===n&&(n=\"\");let i=window.location.href.replace(/(#.+)?$/,n);i=i.replace(\"&&\",\"&\"),window.history.replaceState(window.history.state,null,i)},this._updateHash=Cn(this._updateHashUnthrottled,300),this._hashName=t&&encodeURIComponent(t)}addTo(t){return this._map=t,addEventListener(\"hashchange\",this._onHashChange,!1),this._map.on(\"moveend\",this._updateHash),this}remove(){return removeEventListener(\"hashchange\",this._onHashChange,!1),this._map.off(\"moveend\",this._updateHash),clearTimeout(this._updateHash()),this._removeHash(),delete this._map,this}getHashString(t){const e=this._map.getCenter(),r=Math.round(100*this._map.getZoom())/100,n=Math.ceil((r*Math.LN2+Math.log(512/360/.5))/Math.LN10),i=Math.pow(10,n),a=Math.round(e.lng*i)/i,o=Math.round(e.lat*i)/i,s=this._map.getBearing(),l=this._map.getPitch();let c=\"\";if(c+=t?`/${a}/${o}/${r}`:`${r}/${o}/${a}`,(s||l)&&(c+=\"/\"+Math.round(10*s)/10),l&&(c+=`/${Math.round(l)}`),this._hashName){const t=this._hashName;let e=!1;const r=window.location.hash.slice(1).split(\"&\").map((r=>{const n=r.split(\"=\")[0];return n===t?(e=!0,`${n}=${c}`):r})).filter((t=>t));return e||r.push(`${t}=${c}`),`#${r.join(\"&\")}`}return`#${c}`}}const In={linearity:.3,easing:e.b8(0,0,.3,1)},Pn=e.e({deceleration:2500,maxSpeed:1400},In),zn=e.e({deceleration:20,maxSpeed:1400},In),On=e.e({deceleration:1e3,maxSpeed:360},In),Dn=e.e({deceleration:1e3,maxSpeed:90},In);class Rn{constructor(t){this._map=t,this.clear()}clear(){this._inertiaBuffer=[]}record(t){this._drainInertiaBuffer(),this._inertiaBuffer.push({time:a.now(),settings:t})}_drainInertiaBuffer(){const t=this._inertiaBuffer,e=a.now();for(;t.length>0&&e-t[0].time>160;)t.shift()}_onMoveEnd(t){if(this._drainInertiaBuffer(),this._inertiaBuffer.length<2)return;const r={zoom:0,bearing:0,pitch:0,pan:new e.P(0,0),pinchAround:void 0,around:void 0};for(const{settings:t}of this._inertiaBuffer)r.zoom+=t.zoomDelta||0,r.bearing+=t.bearingDelta||0,r.pitch+=t.pitchDelta||0,t.panDelta&&r.pan._add(t.panDelta),t.around&&(r.around=t.around),t.pinchAround&&(r.pinchAround=t.pinchAround);const n=this._inertiaBuffer[this._inertiaBuffer.length-1].time-this._inertiaBuffer[0].time,i={};if(r.pan.mag()){const a=Bn(r.pan.mag(),n,e.e({},Pn,t||{}));i.offset=r.pan.mult(a.amount/r.pan.mag()),i.center=this._map.transform.center,Fn(i,a)}if(r.zoom){const t=Bn(r.zoom,n,zn);i.zoom=this._map.transform.zoom+t.amount,Fn(i,t)}if(r.bearing){const t=Bn(r.bearing,n,On);i.bearing=this._map.transform.bearing+e.ad(t.amount,-179,179),Fn(i,t)}if(r.pitch){const t=Bn(r.pitch,n,Dn);i.pitch=this._map.transform.pitch+t.amount,Fn(i,t)}if(i.zoom||i.bearing){const t=void 0===r.pinchAround?r.around:r.pinchAround;i.around=t?this._map.unproject(t):this._map.getCenter()}return this.clear(),e.e(i,{noMoveStart:!0})}}function Fn(t,e){(!t.duration||t.durationr.unproject(t))),l=a.reduce(((t,e,r,n)=>t.add(e.div(n.length))),new e.P(0,0));super(t,{points:a,point:l,lngLats:s,lngLat:r.unproject(l),originalEvent:n}),this._defaultPrevented=!1}}class Un extends e.k{preventDefault(){this._defaultPrevented=!0}get defaultPrevented(){return this._defaultPrevented}constructor(t,e,r){super(t,{originalEvent:r}),this._defaultPrevented=!1}}class Vn{constructor(t,e){this._map=t,this._clickTolerance=e.clickTolerance}reset(){delete this._mousedownPos}wheel(t){return this._firePreventable(new Un(t.type,this._map,t))}mousedown(t,e){return this._mousedownPos=e,this._firePreventable(new Nn(t.type,this._map,t))}mouseup(t){this._map.fire(new Nn(t.type,this._map,t))}click(t,e){this._mousedownPos&&this._mousedownPos.dist(e)>=this._clickTolerance||this._map.fire(new Nn(t.type,this._map,t))}dblclick(t){return this._firePreventable(new Nn(t.type,this._map,t))}mouseover(t){this._map.fire(new Nn(t.type,this._map,t))}mouseout(t){this._map.fire(new Nn(t.type,this._map,t))}touchstart(t){return this._firePreventable(new jn(t.type,this._map,t))}touchmove(t){this._map.fire(new jn(t.type,this._map,t))}touchend(t){this._map.fire(new jn(t.type,this._map,t))}touchcancel(t){this._map.fire(new jn(t.type,this._map,t))}_firePreventable(t){if(this._map.fire(t),t.defaultPrevented)return{}}isEnabled(){return!0}isActive(){return!1}enable(){}disable(){}}class qn{constructor(t){this._map=t}reset(){this._delayContextMenu=!1,this._ignoreContextMenu=!0,delete this._contextMenuEvent}mousemove(t){this._map.fire(new Nn(t.type,this._map,t))}mousedown(){this._delayContextMenu=!0,this._ignoreContextMenu=!1}mouseup(){this._delayContextMenu=!1,this._contextMenuEvent&&(this._map.fire(new Nn(\"contextmenu\",this._map,this._contextMenuEvent)),delete this._contextMenuEvent)}contextmenu(t){this._delayContextMenu?this._contextMenuEvent=t:this._ignoreContextMenu||this._map.fire(new Nn(t.type,this._map,t)),this._map.listens(\"contextmenu\")&&t.preventDefault()}isEnabled(){return!0}isActive(){return!1}enable(){}disable(){}}class Hn{constructor(t){this._map=t}get transform(){return this._map._requestedCameraState||this._map.transform}get center(){return{lng:this.transform.center.lng,lat:this.transform.center.lat}}get zoom(){return this.transform.zoom}get pitch(){return this.transform.pitch}get bearing(){return this.transform.bearing}unproject(t){return this.transform.pointLocation(e.P.convert(t),this._map.terrain)}}class Gn{constructor(t,e){this._map=t,this._tr=new Hn(t),this._el=t.getCanvasContainer(),this._container=t.getContainer(),this._clickTolerance=e.clickTolerance||1}isEnabled(){return!!this._enabled}isActive(){return!!this._active}enable(){this.isEnabled()||(this._enabled=!0)}disable(){this.isEnabled()&&(this._enabled=!1)}mousedown(t,e){this.isEnabled()&&t.shiftKey&&0===t.button&&(o.disableDrag(),this._startPos=this._lastPos=e,this._active=!0)}mousemoveWindow(t,e){if(!this._active)return;const r=e;if(this._lastPos.equals(r)||!this._box&&r.dist(this._startPos)t.fitScreenCoordinates(n,i,this._tr.bearing,{linear:!0})};this._fireEvent(\"boxzoomcancel\",t)}keydown(t){this._active&&27===t.keyCode&&(this.reset(),this._fireEvent(\"boxzoomcancel\",t))}reset(){this._active=!1,this._container.classList.remove(\"maplibregl-crosshair\"),this._box&&(o.remove(this._box),this._box=null),o.enableDrag(),delete this._startPos,delete this._lastPos}_fireEvent(t,r){return this._map.fire(new e.k(t,{originalEvent:r}))}}function Zn(t,e){if(t.length!==e.length)throw new Error(`The number of touches and points are not equal - touches ${t.length}, points ${e.length}`);const r={};for(let n=0;nthis.numTouches)&&(this.aborted=!0),this.aborted||(void 0===this.startTime&&(this.startTime=t.timeStamp),n.length===this.numTouches&&(this.centroid=function(t){const r=new e.P(0,0);for(const e of t)r._add(e);return r.div(t.length)}(r),this.touches=Zn(n,r)))}touchmove(t,e,r){if(this.aborted||!this.centroid)return;const n=Zn(r,e);for(const t in this.touches){const e=this.touches[t],r=n[t];(!r||r.dist(e)>30)&&(this.aborted=!0)}}touchend(t,e,r){if((!this.centroid||t.timeStamp-this.startTime>500)&&(this.aborted=!0),0===r.length){const t=!this.aborted&&this.centroid;if(this.reset(),t)return t}}}class Yn{constructor(t){this.singleTap=new Wn(t),this.numTaps=t.numTaps,this.reset()}reset(){this.lastTime=1/0,delete this.lastTap,this.count=0,this.singleTap.reset()}touchstart(t,e,r){this.singleTap.touchstart(t,e,r)}touchmove(t,e,r){this.singleTap.touchmove(t,e,r)}touchend(t,e,r){const n=this.singleTap.touchend(t,e,r);if(n){const e=t.timeStamp-this.lastTime<500,r=!this.lastTap||this.lastTap.dist(n)<30;if(e&&r||this.reset(),this.count++,this.lastTime=t.timeStamp,this.lastTap=n,this.count===this.numTaps)return this.reset(),n}}}class Xn{constructor(t){this._tr=new Hn(t),this._zoomIn=new Yn({numTouches:1,numTaps:2}),this._zoomOut=new Yn({numTouches:2,numTaps:1}),this.reset()}reset(){this._active=!1,this._zoomIn.reset(),this._zoomOut.reset()}touchstart(t,e,r){this._zoomIn.touchstart(t,e,r),this._zoomOut.touchstart(t,e,r)}touchmove(t,e,r){this._zoomIn.touchmove(t,e,r),this._zoomOut.touchmove(t,e,r)}touchend(t,e,r){const n=this._zoomIn.touchend(t,e,r),i=this._zoomOut.touchend(t,e,r),a=this._tr;return n?(this._active=!0,t.preventDefault(),setTimeout((()=>this.reset()),0),{cameraAnimation:e=>e.easeTo({duration:300,zoom:a.zoom+1,around:a.unproject(n)},{originalEvent:t})}):i?(this._active=!0,t.preventDefault(),setTimeout((()=>this.reset()),0),{cameraAnimation:e=>e.easeTo({duration:300,zoom:a.zoom-1,around:a.unproject(i)},{originalEvent:t})}):void 0}touchcancel(){this.reset()}enable(){this._enabled=!0}disable(){this._enabled=!1,this.reset()}isEnabled(){return this._enabled}isActive(){return this._active}}class $n{constructor(t){this._enabled=!!t.enable,this._moveStateManager=t.moveStateManager,this._clickTolerance=t.clickTolerance||1,this._moveFunction=t.move,this._activateOnStart=!!t.activateOnStart,t.assignEvents(this),this.reset()}reset(t){this._active=!1,this._moved=!1,delete this._lastPoint,this._moveStateManager.endMove(t)}_move(...t){const e=this._moveFunction(...t);if(e.bearingDelta||e.pitchDelta||e.around||e.panDelta)return this._active=!0,e}dragStart(t,e){this.isEnabled()&&!this._lastPoint&&this._moveStateManager.isValidStartEvent(t)&&(this._moveStateManager.startMove(t),this._lastPoint=e.length?e[0]:e,this._activateOnStart&&this._lastPoint&&(this._active=!0))}dragMove(t,e){if(!this.isEnabled())return;const r=this._lastPoint;if(!r)return;if(t.preventDefault(),!this._moveStateManager.isValidMoveEvent(t))return void this.reset(t);const n=e.length?e[0]:e;return!this._moved&&n.dist(r){t.mousedown=t.dragStart,t.mousemoveWindow=t.dragMove,t.mouseup=t.dragEnd,t.contextmenu=t=>{t.preventDefault()}},ei=({enable:t,clickTolerance:e,bearingDegreesPerPixelMoved:r=.8})=>{const n=new Kn({checkCorrectEvent:t=>0===o.mouseButton(t)&&t.ctrlKey||2===o.mouseButton(t)});return new $n({clickTolerance:e,move:(t,e)=>({bearingDelta:(e.x-t.x)*r}),moveStateManager:n,enable:t,assignEvents:ti})},ri=({enable:t,clickTolerance:e,pitchDegreesPerPixelMoved:r=-.5})=>{const n=new Kn({checkCorrectEvent:t=>0===o.mouseButton(t)&&t.ctrlKey||2===o.mouseButton(t)});return new $n({clickTolerance:e,move:(t,e)=>({pitchDelta:(e.y-t.y)*r}),moveStateManager:n,enable:t,assignEvents:ti})};class ni{constructor(t,e){this._clickTolerance=t.clickTolerance||1,this._map=e,this.reset()}reset(){this._active=!1,this._touches={},this._sum=new e.P(0,0)}_shouldBePrevented(t){return t<(this._map.cooperativeGestures.isEnabled()?2:1)}touchstart(t,e,r){return this._calculateTransform(t,e,r)}touchmove(t,e,r){if(this._active){if(!this._shouldBePrevented(r.length))return t.preventDefault(),this._calculateTransform(t,e,r);this._map.cooperativeGestures.notifyGestureBlocked(\"touch_pan\",t)}}touchend(t,e,r){this._calculateTransform(t,e,r),this._active&&this._shouldBePrevented(r.length)&&this.reset()}touchcancel(){this.reset()}_calculateTransform(t,r,n){n.length>0&&(this._active=!0);const i=Zn(n,r),a=new e.P(0,0),o=new e.P(0,0);let s=0;for(const t in i){const e=i[t],r=this._touches[t];r&&(a._add(e),o._add(e.sub(r)),s++,i[t]=e)}if(this._touches=i,this._shouldBePrevented(s)||!o.mag())return;const l=o.div(s);return this._sum._add(l),this._sum.mag()Math.abs(t.x)}class hi extends ii{constructor(t){super(),this._currentTouchCount=0,this._map=t}reset(){super.reset(),this._valid=void 0,delete this._firstMove,delete this._lastPoints}touchstart(t,e,r){super.touchstart(t,e,r),this._currentTouchCount=r.length}_start(t){this._lastPoints=t,ui(t[0].sub(t[1]))&&(this._valid=!1)}_move(t,e,r){if(this._map.cooperativeGestures.isEnabled()&&this._currentTouchCount<3)return;const n=t[0].sub(this._lastPoints[0]),i=t[1].sub(this._lastPoints[1]);return this._valid=this.gestureBeginsVertically(n,i,r.timeStamp),this._valid?(this._lastPoints=t,this._active=!0,{pitchDelta:(n.y+i.y)/2*-.5}):void 0}gestureBeginsVertically(t,e,r){if(void 0!==this._valid)return this._valid;const n=t.mag()>=2,i=e.mag()>=2;if(!n&&!i)return;if(!n||!i)return void 0===this._firstMove&&(this._firstMove=r),r-this._firstMove<100&&void 0;const a=t.y>0==e.y>0;return ui(t)&&ui(e)&&a}}const fi={panStep:100,bearingStep:15,pitchStep:10};class pi{constructor(t){this._tr=new Hn(t);const e=fi;this._panStep=e.panStep,this._bearingStep=e.bearingStep,this._pitchStep=e.pitchStep,this._rotationDisabled=!1}reset(){this._active=!1}keydown(t){if(t.altKey||t.ctrlKey||t.metaKey)return;let e=0,r=0,n=0,i=0,a=0;switch(t.keyCode){case 61:case 107:case 171:case 187:e=1;break;case 189:case 109:case 173:e=-1;break;case 37:t.shiftKey?r=-1:(t.preventDefault(),i=-1);break;case 39:t.shiftKey?r=1:(t.preventDefault(),i=1);break;case 38:t.shiftKey?n=1:(t.preventDefault(),a=-1);break;case 40:t.shiftKey?n=-1:(t.preventDefault(),a=1);break;default:return}return this._rotationDisabled&&(r=0,n=0),{cameraAnimation:o=>{const s=this._tr;o.easeTo({duration:300,easeId:\"keyboardHandler\",easing:di,zoom:e?Math.round(s.zoom)+e*(t.shiftKey?2:1):s.zoom,bearing:s.bearing+r*this._bearingStep,pitch:s.pitch+n*this._pitchStep,offset:[-i*this._panStep,-a*this._panStep],center:s.center},{originalEvent:t})}}}enable(){this._enabled=!0}disable(){this._enabled=!1,this.reset()}isEnabled(){return this._enabled}isActive(){return this._active}disableRotation(){this._rotationDisabled=!0}enableRotation(){this._rotationDisabled=!1}}function di(t){return t*(2-t)}const mi=4.000244140625;class gi{constructor(t,e){this._onTimeout=t=>{this._type=\"wheel\",this._delta-=this._lastValue,this._active||this._start(t)},this._map=t,this._tr=new Hn(t),this._triggerRenderFrame=e,this._delta=0,this._defaultZoomRate=.01,this._wheelZoomRate=.0022222222222222222}setZoomRate(t){this._defaultZoomRate=t}setWheelZoomRate(t){this._wheelZoomRate=t}isEnabled(){return!!this._enabled}isActive(){return!!this._active||void 0!==this._finishTimeout}isZooming(){return!!this._zooming}enable(t){this.isEnabled()||(this._enabled=!0,this._aroundCenter=!!t&&\"center\"===t.around)}disable(){this.isEnabled()&&(this._enabled=!1)}_shouldBePrevented(t){return!!this._map.cooperativeGestures.isEnabled()&&!(t.ctrlKey||this._map.cooperativeGestures.isBypassed(t))}wheel(t){if(!this.isEnabled())return;if(this._shouldBePrevented(t))return void this._map.cooperativeGestures.notifyGestureBlocked(\"wheel_zoom\",t);let e=t.deltaMode===WheelEvent.DOM_DELTA_LINE?40*t.deltaY:t.deltaY;const r=a.now(),n=r-(this._lastWheelEventTime||0);this._lastWheelEventTime=r,0!==e&&e%mi==0?this._type=\"wheel\":0!==e&&Math.abs(e)<4?this._type=\"trackpad\":n>400?(this._type=null,this._lastValue=e,this._timeout=setTimeout(this._onTimeout,40,t)):this._type||(this._type=Math.abs(n*e)<200?\"trackpad\":\"wheel\",this._timeout&&(clearTimeout(this._timeout),this._timeout=null,e+=this._lastValue)),t.shiftKey&&e&&(e/=4),this._type&&(this._lastWheelEvent=t,this._delta-=e,this._active||this._start(t)),t.preventDefault()}_start(t){if(!this._delta)return;this._frameId&&(this._frameId=null),this._active=!0,this.isZooming()||(this._zooming=!0),this._finishTimeout&&(clearTimeout(this._finishTimeout),delete this._finishTimeout);const r=o.mousePos(this._map.getCanvas(),t),n=this._tr;r.y>n.transform.height/2-n.transform.getHorizon()?this._around=e.N.convert(this._aroundCenter?n.center:n.unproject(r)):this._around=e.N.convert(n.center),this._aroundPoint=n.transform.locationPoint(this._around),this._frameId||(this._frameId=!0,this._triggerRenderFrame())}renderFrame(){if(!this._frameId)return;if(this._frameId=null,!this.isActive())return;const t=this._tr.transform;if(0!==this._delta){const e=\"wheel\"===this._type&&Math.abs(this._delta)>mi?this._wheelZoomRate:this._defaultZoomRate;let r=2/(1+Math.exp(-Math.abs(this._delta*e)));this._delta<0&&0!==r&&(r=1/r);const n=\"number\"==typeof this._targetZoom?t.zoomScale(this._targetZoom):t.scale;this._targetZoom=Math.min(t.maxZoom,Math.max(t.minZoom,t.scaleZoom(n*r))),\"wheel\"===this._type&&(this._startZoom=t.zoom,this._easing=this._smoothOutEasing(200)),this._delta=0}const r=\"number\"==typeof this._targetZoom?this._targetZoom:t.zoom,n=this._startZoom,i=this._easing;let o,s=!1;const l=a.now()-this._lastWheelEventTime;if(\"wheel\"===this._type&&n&&i&&l){const t=Math.min(l/200,1),a=i(t);o=e.z.number(n,r,a),t<1?this._frameId||(this._frameId=!0):s=!0}else o=r,s=!0;return this._active=!0,s&&(this._active=!1,this._finishTimeout=setTimeout((()=>{this._zooming=!1,this._triggerRenderFrame(),delete this._targetZoom,delete this._finishTimeout}),200)),{noInertia:!0,needsRenderFrame:!s,zoomDelta:o-t.zoom,around:this._aroundPoint,originalEvent:this._lastWheelEvent}}_smoothOutEasing(t){let r=e.b9;if(this._prevEase){const t=this._prevEase,n=(a.now()-t.start)/t.duration,i=t.easing(n+.01)-t.easing(n),o=.27/Math.sqrt(i*i+1e-4)*.01,s=Math.sqrt(.0729-o*o);r=e.b8(o,s,.25,1)}return this._prevEase={start:a.now(),duration:t,easing:r},r}reset(){this._active=!1,this._zooming=!1,delete this._targetZoom,this._finishTimeout&&(clearTimeout(this._finishTimeout),delete this._finishTimeout)}}class yi{constructor(t,e){this._clickZoom=t,this._tapZoom=e}enable(){this._clickZoom.enable(),this._tapZoom.enable()}disable(){this._clickZoom.disable(),this._tapZoom.disable()}isEnabled(){return this._clickZoom.isEnabled()&&this._tapZoom.isEnabled()}isActive(){return this._clickZoom.isActive()||this._tapZoom.isActive()}}class vi{constructor(t){this._tr=new Hn(t),this.reset()}reset(){this._active=!1}dblclick(t,e){return t.preventDefault(),{cameraAnimation:r=>{r.easeTo({duration:300,zoom:this._tr.zoom+(t.shiftKey?-1:1),around:this._tr.unproject(e)},{originalEvent:t})}}}enable(){this._enabled=!0}disable(){this._enabled=!1,this.reset()}isEnabled(){return this._enabled}isActive(){return this._active}}class xi{constructor(){this._tap=new Yn({numTouches:1,numTaps:1}),this.reset()}reset(){this._active=!1,delete this._swipePoint,delete this._swipeTouch,delete this._tapTime,delete this._tapPoint,this._tap.reset()}touchstart(t,e,r){if(!this._swipePoint)if(this._tapTime){const n=e[0],i=t.timeStamp-this._tapTime<500,a=this._tapPoint.dist(n)<30;i&&a?r.length>0&&(this._swipePoint=n,this._swipeTouch=r[0].identifier):this.reset()}else this._tap.touchstart(t,e,r)}touchmove(t,e,r){if(this._tapTime){if(this._swipePoint){if(r[0].identifier!==this._swipeTouch)return;const n=e[0],i=n.y-this._swipePoint.y;return this._swipePoint=n,t.preventDefault(),this._active=!0,{zoomDelta:i/128}}}else this._tap.touchmove(t,e,r)}touchend(t,e,r){if(this._tapTime)this._swipePoint&&0===r.length&&this.reset();else{const n=this._tap.touchend(t,e,r);n&&(this._tapTime=t.timeStamp,this._tapPoint=n)}}touchcancel(){this.reset()}enable(){this._enabled=!0}disable(){this._enabled=!1,this.reset()}isEnabled(){return this._enabled}isActive(){return this._active}}class _i{constructor(t,e,r){this._el=t,this._mousePan=e,this._touchPan=r}enable(t){this._inertiaOptions=t||{},this._mousePan.enable(),this._touchPan.enable(),this._el.classList.add(\"maplibregl-touch-drag-pan\")}disable(){this._mousePan.disable(),this._touchPan.disable(),this._el.classList.remove(\"maplibregl-touch-drag-pan\")}isEnabled(){return this._mousePan.isEnabled()&&this._touchPan.isEnabled()}isActive(){return this._mousePan.isActive()||this._touchPan.isActive()}}class bi{constructor(t,e,r){this._pitchWithRotate=t.pitchWithRotate,this._mouseRotate=e,this._mousePitch=r}enable(){this._mouseRotate.enable(),this._pitchWithRotate&&this._mousePitch.enable()}disable(){this._mouseRotate.disable(),this._mousePitch.disable()}isEnabled(){return this._mouseRotate.isEnabled()&&(!this._pitchWithRotate||this._mousePitch.isEnabled())}isActive(){return this._mouseRotate.isActive()||this._mousePitch.isActive()}}class wi{constructor(t,e,r,n){this._el=t,this._touchZoom=e,this._touchRotate=r,this._tapDragZoom=n,this._rotationDisabled=!1,this._enabled=!0}enable(t){this._touchZoom.enable(t),this._rotationDisabled||this._touchRotate.enable(t),this._tapDragZoom.enable(),this._el.classList.add(\"maplibregl-touch-zoom-rotate\")}disable(){this._touchZoom.disable(),this._touchRotate.disable(),this._tapDragZoom.disable(),this._el.classList.remove(\"maplibregl-touch-zoom-rotate\")}isEnabled(){return this._touchZoom.isEnabled()&&(this._rotationDisabled||this._touchRotate.isEnabled())&&this._tapDragZoom.isEnabled()}isActive(){return this._touchZoom.isActive()||this._touchRotate.isActive()||this._tapDragZoom.isActive()}disableRotation(){this._rotationDisabled=!0,this._touchRotate.disable()}enableRotation(){this._rotationDisabled=!1,this._touchZoom.isEnabled()&&this._touchRotate.enable()}}class Ti{constructor(t,e){this._bypassKey=-1!==navigator.userAgent.indexOf(\"Mac\")?\"metaKey\":\"ctrlKey\",this._map=t,this._options=e,this._enabled=!1}isActive(){return!1}reset(){}_setupUI(){if(this._container)return;const t=this._map.getCanvasContainer();t.classList.add(\"maplibregl-cooperative-gestures\"),this._container=o.create(\"div\",\"maplibregl-cooperative-gesture-screen\",t);let e=this._map._getUIString(\"CooperativeGesturesHandler.WindowsHelpText\");\"metaKey\"===this._bypassKey&&(e=this._map._getUIString(\"CooperativeGesturesHandler.MacHelpText\"));const r=this._map._getUIString(\"CooperativeGesturesHandler.MobileHelpText\"),n=document.createElement(\"div\");n.className=\"maplibregl-desktop-message\",n.textContent=e,this._container.appendChild(n);const i=document.createElement(\"div\");i.className=\"maplibregl-mobile-message\",i.textContent=r,this._container.appendChild(i),this._container.setAttribute(\"aria-hidden\",\"true\")}_destroyUI(){this._container&&(o.remove(this._container),this._map.getCanvasContainer().classList.remove(\"maplibregl-cooperative-gestures\")),delete this._container}enable(){this._setupUI(),this._enabled=!0}disable(){this._enabled=!1,this._destroyUI()}isEnabled(){return this._enabled}isBypassed(t){return t[this._bypassKey]}notifyGestureBlocked(t,r){this._enabled&&(this._map.fire(new e.k(\"cooperativegestureprevented\",{gestureType:t,originalEvent:r})),this._container.classList.add(\"maplibregl-show\"),setTimeout((()=>{this._container.classList.remove(\"maplibregl-show\")}),100))}}const ki=t=>t.zoom||t.drag||t.pitch||t.rotate;class Ai extends e.k{}function Mi(t){return t.panDelta&&t.panDelta.mag()||t.zoomDelta||t.bearingDelta||t.pitchDelta}class Si{constructor(t,e){this.handleWindowEvent=t=>{this.handleEvent(t,`${t.type}Window`)},this.handleEvent=(t,e)=>{if(\"blur\"===t.type)return void this.stop(!0);this._updatingCamera=!0;const r=\"renderFrame\"===t.type?void 0:t,n={needsRenderFrame:!1},i={},a={},s=t.touches,l=s?this._getMapTouches(s):void 0,c=l?o.touchPos(this._map.getCanvas(),l):o.mousePos(this._map.getCanvas(),t);for(const{handlerName:o,handler:s,allowed:u}of this._handlers){if(!s.isEnabled())continue;let h;this._blockedByActive(a,u,o)?s.reset():s[e||t.type]&&(h=s[e||t.type](t,c,l),this.mergeHandlerResult(n,i,h,o,r),h&&h.needsRenderFrame&&this._triggerRenderFrame()),(h||s.isActive())&&(a[o]=s)}const u={};for(const t in this._previousActiveHandlers)a[t]||(u[t]=r);this._previousActiveHandlers=a,(Object.keys(u).length||Mi(n))&&(this._changes.push([n,i,u]),this._triggerRenderFrame()),(Object.keys(a).length||Mi(n))&&this._map._stop(!0),this._updatingCamera=!1;const{cameraAnimation:h}=n;h&&(this._inertia.clear(),this._fireEvents({},{},!0),this._changes=[],h(this._map))},this._map=t,this._el=this._map.getCanvasContainer(),this._handlers=[],this._handlersById={},this._changes=[],this._inertia=new Rn(t),this._bearingSnap=e.bearingSnap,this._previousActiveHandlers={},this._eventsInProgress={},this._addDefaultHandlers(e);const r=this._el;this._listeners=[[r,\"touchstart\",{passive:!0}],[r,\"touchmove\",{passive:!1}],[r,\"touchend\",void 0],[r,\"touchcancel\",void 0],[r,\"mousedown\",void 0],[r,\"mousemove\",void 0],[r,\"mouseup\",void 0],[document,\"mousemove\",{capture:!0}],[document,\"mouseup\",void 0],[r,\"mouseover\",void 0],[r,\"mouseout\",void 0],[r,\"dblclick\",void 0],[r,\"click\",void 0],[r,\"keydown\",{capture:!1}],[r,\"keyup\",void 0],[r,\"wheel\",{passive:!1}],[r,\"contextmenu\",void 0],[window,\"blur\",void 0]];for(const[t,e,r]of this._listeners)o.addEventListener(t,e,t===document?this.handleWindowEvent:this.handleEvent,r)}destroy(){for(const[t,e,r]of this._listeners)o.removeEventListener(t,e,t===document?this.handleWindowEvent:this.handleEvent,r)}_addDefaultHandlers(t){const e=this._map,r=e.getCanvasContainer();this._add(\"mapEvent\",new Vn(e,t));const n=e.boxZoom=new Gn(e,t);this._add(\"boxZoom\",n),t.interactive&&t.boxZoom&&n.enable();const i=e.cooperativeGestures=new Ti(e,t.cooperativeGestures);this._add(\"cooperativeGestures\",i),t.cooperativeGestures&&i.enable();const a=new Xn(e),s=new vi(e);e.doubleClickZoom=new yi(s,a),this._add(\"tapZoom\",a),this._add(\"clickZoom\",s),t.interactive&&t.doubleClickZoom&&e.doubleClickZoom.enable();const l=new xi;this._add(\"tapDragZoom\",l);const c=e.touchPitch=new hi(e);this._add(\"touchPitch\",c),t.interactive&&t.touchPitch&&e.touchPitch.enable(t.touchPitch);const u=ei(t),h=ri(t);e.dragRotate=new bi(t,u,h),this._add(\"mouseRotate\",u,[\"mousePitch\"]),this._add(\"mousePitch\",h,[\"mouseRotate\"]),t.interactive&&t.dragRotate&&e.dragRotate.enable();const f=(({enable:t,clickTolerance:e})=>{const r=new Kn({checkCorrectEvent:t=>0===o.mouseButton(t)&&!t.ctrlKey});return new $n({clickTolerance:e,move:(t,e)=>({around:e,panDelta:e.sub(t)}),activateOnStart:!0,moveStateManager:r,enable:t,assignEvents:ti})})(t),p=new ni(t,e);e.dragPan=new _i(r,f,p),this._add(\"mousePan\",f),this._add(\"touchPan\",p,[\"touchZoom\",\"touchRotate\"]),t.interactive&&t.dragPan&&e.dragPan.enable(t.dragPan);const d=new ci,m=new si;e.touchZoomRotate=new wi(r,m,d,l),this._add(\"touchRotate\",d,[\"touchPan\",\"touchZoom\"]),this._add(\"touchZoom\",m,[\"touchPan\",\"touchRotate\"]),t.interactive&&t.touchZoomRotate&&e.touchZoomRotate.enable(t.touchZoomRotate);const g=e.scrollZoom=new gi(e,(()=>this._triggerRenderFrame()));this._add(\"scrollZoom\",g,[\"mousePan\"]),t.interactive&&t.scrollZoom&&e.scrollZoom.enable(t.scrollZoom);const y=e.keyboard=new pi(e);this._add(\"keyboard\",y),t.interactive&&t.keyboard&&e.keyboard.enable(),this._add(\"blockableMapEvent\",new qn(e))}_add(t,e,r){this._handlers.push({handlerName:t,handler:e,allowed:r}),this._handlersById[t]=e}stop(t){if(!this._updatingCamera){for(const{handler:t}of this._handlers)t.reset();this._inertia.clear(),this._fireEvents({},{},t),this._changes=[]}}isActive(){for(const{handler:t}of this._handlers)if(t.isActive())return!0;return!1}isZooming(){return!!this._eventsInProgress.zoom||this._map.scrollZoom.isZooming()}isRotating(){return!!this._eventsInProgress.rotate}isMoving(){return Boolean(ki(this._eventsInProgress))||this.isZooming()}_blockedByActive(t,e,r){for(const n in t)if(n!==r&&(!e||e.indexOf(n)<0))return!0;return!1}_getMapTouches(t){const e=[];for(const r of t){const t=r.target;this._el.contains(t)&&e.push(r)}return e}mergeHandlerResult(t,r,n,i,a){if(!n)return;e.e(t,n);const o={handlerName:i,originalEvent:n.originalEvent||a};void 0!==n.zoomDelta&&(r.zoom=o),void 0!==n.panDelta&&(r.drag=o),void 0!==n.pitchDelta&&(r.pitch=o),void 0!==n.bearingDelta&&(r.rotate=o)}_applyChanges(){const t={},r={},n={};for(const[i,a,o]of this._changes)i.panDelta&&(t.panDelta=(t.panDelta||new e.P(0,0))._add(i.panDelta)),i.zoomDelta&&(t.zoomDelta=(t.zoomDelta||0)+i.zoomDelta),i.bearingDelta&&(t.bearingDelta=(t.bearingDelta||0)+i.bearingDelta),i.pitchDelta&&(t.pitchDelta=(t.pitchDelta||0)+i.pitchDelta),void 0!==i.around&&(t.around=i.around),void 0!==i.pinchAround&&(t.pinchAround=i.pinchAround),i.noInertia&&(t.noInertia=i.noInertia),e.e(r,a),e.e(n,o);this._updateMapTransform(t,r,n),this._changes=[]}_updateMapTransform(t,e,r){const n=this._map,i=n._getTransformForUpdate(),a=n.terrain;if(!(Mi(t)||a&&this._terrainMovement))return this._fireEvents(e,r,!0);let{panDelta:o,zoomDelta:s,bearingDelta:l,pitchDelta:c,around:u,pinchAround:h}=t;void 0!==h&&(u=h),n._stop(!0),u=u||n.transform.centerPoint;const f=i.pointLocation(o?u.sub(o):u);l&&(i.bearing+=l),c&&(i.pitch+=c),s&&(i.zoom+=s),a?this._terrainMovement||!e.drag&&!e.zoom?e.drag&&this._terrainMovement?i.center=i.pointLocation(i.centerPoint.sub(o)):i.setLocationAtPoint(f,u):(this._terrainMovement=!0,this._map._elevationFreeze=!0,i.setLocationAtPoint(f,u)):i.setLocationAtPoint(f,u),n._applyUpdatedTransform(i),this._map._update(),t.noInertia||this._inertia.record(t),this._fireEvents(e,r,!0)}_fireEvents(t,r,n){const i=ki(this._eventsInProgress),o=ki(t),s={};for(const e in t){const{originalEvent:r}=t[e];this._eventsInProgress[e]||(s[`${e}start`]=r),this._eventsInProgress[e]=t[e]}!i&&o&&this._fireEvent(\"movestart\",o.originalEvent);for(const t in s)this._fireEvent(t,s[t]);o&&this._fireEvent(\"move\",o.originalEvent);for(const e in t){const{originalEvent:r}=t[e];this._fireEvent(e,r)}const l={};let c;for(const t in this._eventsInProgress){const{handlerName:e,originalEvent:n}=this._eventsInProgress[t];this._handlersById[e].isActive()||(delete this._eventsInProgress[t],c=r[e]||n,l[`${t}end`]=c)}for(const t in l)this._fireEvent(t,l[t]);const u=ki(this._eventsInProgress),h=(i||o)&&!u;if(h&&this._terrainMovement){this._map._elevationFreeze=!1,this._terrainMovement=!1;const t=this._map._getTransformForUpdate();t.recalculateZoom(this._map.terrain),this._map._applyUpdatedTransform(t)}if(n&&h){this._updatingCamera=!0;const t=this._inertia._onMoveEnd(this._map.dragPan._inertiaOptions),r=t=>0!==t&&-this._bearingSnap{delete this._frameId,this.handleEvent(new Ai(\"renderFrame\",{timeStamp:t})),this._applyChanges()}))}_triggerRenderFrame(){void 0===this._frameId&&(this._frameId=this._requestFrame())}}class Ei extends e.E{constructor(t,e){super(),this._renderFrameCallback=()=>{const t=Math.min((a.now()-this._easeStart)/this._easeOptions.duration,1);this._onEaseFrame(this._easeOptions.easing(t)),t<1&&this._easeFrameId?this._easeFrameId=this._requestRenderFrame(this._renderFrameCallback):this.stop()},this._moving=!1,this._zooming=!1,this.transform=t,this._bearingSnap=e.bearingSnap,this.on(\"moveend\",(()=>{delete this._requestedCameraState}))}getCenter(){return new e.N(this.transform.center.lng,this.transform.center.lat)}setCenter(t,e){return this.jumpTo({center:t},e)}panBy(t,r,n){return t=e.P.convert(t).mult(-1),this.panTo(this.transform.center,e.e({offset:t},r),n)}panTo(t,r,n){return this.easeTo(e.e({center:t},r),n)}getZoom(){return this.transform.zoom}setZoom(t,e){return this.jumpTo({zoom:t},e),this}zoomTo(t,r,n){return this.easeTo(e.e({zoom:t},r),n)}zoomIn(t,e){return this.zoomTo(this.getZoom()+1,t,e),this}zoomOut(t,e){return this.zoomTo(this.getZoom()-1,t,e),this}getBearing(){return this.transform.bearing}setBearing(t,e){return this.jumpTo({bearing:t},e),this}getPadding(){return this.transform.padding}setPadding(t,e){return this.jumpTo({padding:t},e),this}rotateTo(t,r,n){return this.easeTo(e.e({bearing:t},r),n)}resetNorth(t,r){return this.rotateTo(0,e.e({duration:1e3},t),r),this}resetNorthPitch(t,r){return this.easeTo(e.e({bearing:0,pitch:0,duration:1e3},t),r),this}snapToNorth(t,e){return Math.abs(this.getBearing()){if(this._zooming&&(i.zoom=e.z.number(o,y,n)),this._rotating&&(i.bearing=e.z.number(s,u,n)),this._pitching&&(i.pitch=e.z.number(l,h,n)),this._padding&&(i.interpolatePadding(c,f,n),d=i.centerPoint.add(p)),this.terrain&&!t.freezeElevation&&this._updateElevation(n),b)i.setLocationAtPoint(b,w);else{const t=i.zoomScale(i.zoom-o),e=y>o?Math.min(2,_):Math.max(.5,_),r=Math.pow(e,1-n),a=i.unproject(v.add(x.mult(n*r)).mult(t));i.setLocationAtPoint(i.renderWorldCopies?a.wrap():a,d)}this._applyUpdatedTransform(i),this._fireMoveEvents(r)}),(e=>{this.terrain&&t.freezeElevation&&this._finalizeElevation(),this._afterEase(r,e)}),t),this}_prepareEase(t,r,n={}){this._moving=!0,r||n.moving||this.fire(new e.k(\"movestart\",t)),this._zooming&&!n.zooming&&this.fire(new e.k(\"zoomstart\",t)),this._rotating&&!n.rotating&&this.fire(new e.k(\"rotatestart\",t)),this._pitching&&!n.pitching&&this.fire(new e.k(\"pitchstart\",t))}_prepareElevation(t){this._elevationCenter=t,this._elevationStart=this.transform.elevation,this._elevationTarget=this.terrain.getElevationForLngLatZoom(t,this.transform.tileZoom),this._elevationFreeze=!0}_updateElevation(t){this.transform.minElevationForCurrentTile=this.terrain.getMinTileElevationForLngLatZoom(this._elevationCenter,this.transform.tileZoom);const r=this.terrain.getElevationForLngLatZoom(this._elevationCenter,this.transform.tileZoom);if(t<1&&r!==this._elevationTarget){const e=this._elevationTarget-this._elevationStart,n=(r-(e*t+this._elevationStart))/(1-t);this._elevationStart+=t*(e-n),this._elevationTarget=r}this.transform.elevation=e.z.number(this._elevationStart,this._elevationTarget,t)}_finalizeElevation(){this._elevationFreeze=!1,this.transform.recalculateZoom(this.terrain)}_getTransformForUpdate(){return this.transformCameraUpdate||this.terrain?(this._requestedCameraState||(this._requestedCameraState=this.transform.clone()),this._requestedCameraState):this.transform}_elevateCameraIfInsideTerrain(t){const e=t.getCameraPosition(),r=this.terrain.getElevationForLngLatZoom(e.lngLat,t.zoom);if(e.altitudethis._elevateCameraIfInsideTerrain(t))),this.transformCameraUpdate&&e.push((t=>this.transformCameraUpdate(t))),!e.length)return;const r=t.clone();for(const t of e){const e=r.clone(),{center:n,zoom:i,pitch:a,bearing:o,elevation:s}=t(e);n&&(e.center=n),void 0!==i&&(e.zoom=i),void 0!==a&&(e.pitch=a),void 0!==o&&(e.bearing=o),void 0!==s&&(e.elevation=s),r.apply(e)}this.transform.apply(r)}_fireMoveEvents(t){this.fire(new e.k(\"move\",t)),this._zooming&&this.fire(new e.k(\"zoom\",t)),this._rotating&&this.fire(new e.k(\"rotate\",t)),this._pitching&&this.fire(new e.k(\"pitch\",t))}_afterEase(t,r){if(this._easeId&&r&&this._easeId===r)return;delete this._easeId;const n=this._zooming,i=this._rotating,a=this._pitching;this._moving=!1,this._zooming=!1,this._rotating=!1,this._pitching=!1,this._padding=!1,n&&this.fire(new e.k(\"zoomend\",t)),i&&this.fire(new e.k(\"rotateend\",t)),a&&this.fire(new e.k(\"pitchend\",t)),this.fire(new e.k(\"moveend\",t))}flyTo(t,r){var n;if(!t.essential&&a.prefersReducedMotion){const n=e.M(t,[\"center\",\"zoom\",\"bearing\",\"pitch\",\"around\"]);return this.jumpTo(n,r)}this.stop(),t=e.e({offset:[0,0],speed:1.2,curve:1.42,easing:e.b9},t);const i=this._getTransformForUpdate(),o=i.zoom,s=i.bearing,l=i.pitch,c=i.padding,u=\"bearing\"in t?this._normalizeBearing(t.bearing,s):s,h=\"pitch\"in t?+t.pitch:l,f=\"padding\"in t?t.padding:i.padding,p=e.P.convert(t.offset);let d=i.centerPoint.add(p);const m=i.pointLocation(d),{center:g,zoom:y}=i.getConstrained(e.N.convert(t.center||m),null!==(n=t.zoom)&&void 0!==n?n:o);this._normalizeCenter(g,i);const v=i.zoomScale(y-o),x=i.project(m),_=i.project(g).sub(x);let b=t.curve;const w=Math.max(i.width,i.height),T=w/v,k=_.mag();if(\"minZoom\"in t){const r=e.ad(Math.min(t.minZoom,o,y),i.minZoom,i.maxZoom),n=w/i.zoomScale(r-o);b=Math.sqrt(n/k*2)}const A=b*b;function M(t){const e=(T*T-w*w+(t?-1:1)*A*A*k*k)/(2*(t?T:w)*A*k);return Math.log(Math.sqrt(e*e+1)-e)}function S(t){return(Math.exp(t)-Math.exp(-t))/2}function E(t){return(Math.exp(t)+Math.exp(-t))/2}const C=M(!1);let L=function(t){return E(C)/E(C+b*t)},I=function(t){return w*((E(C)*(S(e=C+b*t)/E(e))-S(C))/A)/k;var e},P=(M(!0)-C)/b;if(Math.abs(k)<1e-6||!isFinite(P)){if(Math.abs(w-T)<1e-6)return this.easeTo(t,r);const e=T0,L=t=>Math.exp(e*b*t)}if(\"duration\"in t)t.duration=+t.duration;else{const e=\"screenSpeed\"in t?+t.screenSpeed/b:+t.speed;t.duration=1e3*P/e}return t.maxDuration&&t.duration>t.maxDuration&&(t.duration=0),this._zooming=!0,this._rotating=s!==u,this._pitching=h!==l,this._padding=!i.isPaddingEqual(f),this._prepareEase(r,!1),this.terrain&&this._prepareElevation(g),this._ease((n=>{const a=n*P,m=1/L(a);i.zoom=1===n?y:o+i.scaleZoom(m),this._rotating&&(i.bearing=e.z.number(s,u,n)),this._pitching&&(i.pitch=e.z.number(l,h,n)),this._padding&&(i.interpolatePadding(c,f,n),d=i.centerPoint.add(p)),this.terrain&&!t.freezeElevation&&this._updateElevation(n);const v=1===n?g:i.unproject(x.add(_.mult(I(a))).mult(m));i.setLocationAtPoint(i.renderWorldCopies?v.wrap():v,d),this._applyUpdatedTransform(i),this._fireMoveEvents(r)}),(()=>{this.terrain&&t.freezeElevation&&this._finalizeElevation(),this._afterEase(r)}),t),this}isEasing(){return!!this._easeFrameId}stop(){return this._stop()}_stop(t,e){var r;if(this._easeFrameId&&(this._cancelRenderFrame(this._easeFrameId),delete this._easeFrameId,delete this._onEaseFrame),this._onEaseEnd){const t=this._onEaseEnd;delete this._onEaseEnd,t.call(this,e)}return t||null===(r=this.handlers)||void 0===r||r.stop(!1),this}_ease(t,e,r){!1===r.animate||0===r.duration?(t(1),e()):(this._easeStart=a.now(),this._easeOptions=r,this._onEaseFrame=t,this._onEaseEnd=e,this._easeFrameId=this._requestRenderFrame(this._renderFrameCallback))}_normalizeBearing(t,r){t=e.b3(t,-180,180);const n=Math.abs(t-r);return Math.abs(t-360-r)180?-360:r<-180?360:0}queryTerrainElevation(t){return this.terrain?this.terrain.getElevationForLngLatZoom(e.N.convert(t),this.transform.tileZoom)-this.transform.elevation:null}}const Ci={compact:!0,customAttribution:'
MapLibre'};class Li{constructor(t=Ci){this._toggleAttribution=()=>{this._container.classList.contains(\"maplibregl-compact\")&&(this._container.classList.contains(\"maplibregl-compact-show\")?(this._container.setAttribute(\"open\",\"\"),this._container.classList.remove(\"maplibregl-compact-show\")):(this._container.classList.add(\"maplibregl-compact-show\"),this._container.removeAttribute(\"open\")))},this._updateData=t=>{!t||\"metadata\"!==t.sourceDataType&&\"visibility\"!==t.sourceDataType&&\"style\"!==t.dataType&&\"terrain\"!==t.type||this._updateAttributions()},this._updateCompact=()=>{this._map.getCanvasContainer().offsetWidth<=640||this._compact?!1===this._compact?this._container.setAttribute(\"open\",\"\"):this._container.classList.contains(\"maplibregl-compact\")||this._container.classList.contains(\"maplibregl-attrib-empty\")||(this._container.setAttribute(\"open\",\"\"),this._container.classList.add(\"maplibregl-compact\",\"maplibregl-compact-show\")):(this._container.setAttribute(\"open\",\"\"),this._container.classList.contains(\"maplibregl-compact\")&&this._container.classList.remove(\"maplibregl-compact\",\"maplibregl-compact-show\"))},this._updateCompactMinimize=()=>{this._container.classList.contains(\"maplibregl-compact\")&&this._container.classList.contains(\"maplibregl-compact-show\")&&this._container.classList.remove(\"maplibregl-compact-show\")},this.options=t}getDefaultPosition(){return\"bottom-right\"}onAdd(t){return this._map=t,this._compact=this.options.compact,this._container=o.create(\"details\",\"maplibregl-ctrl maplibregl-ctrl-attrib\"),this._compactButton=o.create(\"summary\",\"maplibregl-ctrl-attrib-button\",this._container),this._compactButton.addEventListener(\"click\",this._toggleAttribution),this._setElementTitle(this._compactButton,\"ToggleAttribution\"),this._innerContainer=o.create(\"div\",\"maplibregl-ctrl-attrib-inner\",this._container),this._updateAttributions(),this._updateCompact(),this._map.on(\"styledata\",this._updateData),this._map.on(\"sourcedata\",this._updateData),this._map.on(\"terrain\",this._updateData),this._map.on(\"resize\",this._updateCompact),this._map.on(\"drag\",this._updateCompactMinimize),this._container}onRemove(){o.remove(this._container),this._map.off(\"styledata\",this._updateData),this._map.off(\"sourcedata\",this._updateData),this._map.off(\"terrain\",this._updateData),this._map.off(\"resize\",this._updateCompact),this._map.off(\"drag\",this._updateCompactMinimize),this._map=void 0,this._compact=void 0,this._attribHTML=void 0}_setElementTitle(t,e){const r=this._map._getUIString(`AttributionControl.${e}`);t.title=r,t.setAttribute(\"aria-label\",r)}_updateAttributions(){if(!this._map.style)return;let t=[];if(this.options.customAttribution&&(Array.isArray(this.options.customAttribution)?t=t.concat(this.options.customAttribution.map((t=>\"string\"!=typeof t?\"\":t))):\"string\"==typeof this.options.customAttribution&&t.push(this.options.customAttribution)),this._map.style.stylesheet){const t=this._map.style.stylesheet;this.styleOwner=t.owner,this.styleId=t.id}const e=this._map.style.sourceCaches;for(const r in e){const n=e[r];if(n.used||n.usedForTerrain){const e=n.getSource();e.attribution&&t.indexOf(e.attribution)<0&&t.push(e.attribution)}}t=t.filter((t=>String(t).trim())),t.sort(((t,e)=>t.length-e.length)),t=t.filter(((e,r)=>{for(let n=r+1;n=0)return!1;return!0}));const r=t.join(\" | \");r!==this._attribHTML&&(this._attribHTML=r,t.length?(this._innerContainer.innerHTML=r,this._container.classList.remove(\"maplibregl-attrib-empty\")):this._container.classList.add(\"maplibregl-attrib-empty\"),this._updateCompact(),this._editLink=null)}}class Ii{constructor(t={}){this._updateCompact=()=>{const t=this._container.children;if(t.length){const e=t[0];this._map.getCanvasContainer().offsetWidth<=640||this._compact?!1!==this._compact&&e.classList.add(\"maplibregl-compact\"):e.classList.remove(\"maplibregl-compact\")}},this.options=t}getDefaultPosition(){return\"bottom-left\"}onAdd(t){this._map=t,this._compact=this.options&&this.options.compact,this._container=o.create(\"div\",\"maplibregl-ctrl\");const e=o.create(\"a\",\"maplibregl-ctrl-logo\");return e.target=\"_blank\",e.rel=\"noopener nofollow\",e.href=\"https://maplibre.org/\",e.setAttribute(\"aria-label\",this._map._getUIString(\"LogoControl.Title\")),e.setAttribute(\"rel\",\"noopener nofollow\"),this._container.appendChild(e),this._container.style.display=\"block\",this._map.on(\"resize\",this._updateCompact),this._updateCompact(),this._container}onRemove(){o.remove(this._container),this._map.off(\"resize\",this._updateCompact),this._map=void 0,this._compact=void 0}}class Pi{constructor(){this._queue=[],this._id=0,this._cleared=!1,this._currentlyRunning=!1}add(t){const e=++this._id;return this._queue.push({callback:t,id:e,cancelled:!1}),e}remove(t){const e=this._currentlyRunning,r=e?this._queue.concat(e):this._queue;for(const e of r)if(e.id===t)return void(e.cancelled=!0)}run(t=0){if(this._currentlyRunning)throw new Error(\"Attempting to run(), but is already running.\");const e=this._currentlyRunning=this._queue;this._queue=[];for(const r of e)if(!r.cancelled&&(r.callback(t),this._cleared))break;this._cleared=!1,this._currentlyRunning=!1}clear(){this._currentlyRunning&&(this._cleared=!0),this._queue=[]}}var zi=e.Y([{name:\"a_pos3d\",type:\"Int16\",components:3}]);class Oi extends e.E{constructor(t){super(),this.sourceCache=t,this._tiles={},this._renderableTilesKeys=[],this._sourceTileCache={},this.minzoom=0,this.maxzoom=22,this.tileSize=512,this.deltaZoom=1,t.usedForTerrain=!0,t.tileSize=this.tileSize*2**this.deltaZoom}destruct(){this.sourceCache.usedForTerrain=!1,this.sourceCache.tileSize=null}update(t,r){this.sourceCache.update(t,r),this._renderableTilesKeys=[];const n={};for(const i of t.coveringTiles({tileSize:this.tileSize,minzoom:this.minzoom,maxzoom:this.maxzoom,reparseOverscaled:!1,terrain:r}))n[i.key]=!0,this._renderableTilesKeys.push(i.key),this._tiles[i.key]||(i.posMatrix=new Float64Array(16),e.aQ(i.posMatrix,0,e.X,0,e.X,0,1),this._tiles[i.key]=new ht(i,this.tileSize));for(const t in this._tiles)n[t]||delete this._tiles[t]}freeRtt(t){for(const e in this._tiles){const r=this._tiles[e];(!t||r.tileID.equals(t)||r.tileID.isChildOf(t)||t.isChildOf(r.tileID))&&(r.rtt=[])}}getRenderableTiles(){return this._renderableTilesKeys.map((t=>this.getTileByID(t)))}getTileByID(t){return this._tiles[t]}getTerrainCoords(t){const r={};for(const n of this._renderableTilesKeys){const i=this._tiles[n].tileID;if(i.canonical.equals(t.canonical)){const i=t.clone();i.posMatrix=new Float64Array(16),e.aQ(i.posMatrix,0,e.X,0,e.X,0,1),r[n]=i}else if(i.canonical.isChildOf(t.canonical)){const a=t.clone();a.posMatrix=new Float64Array(16);const o=i.canonical.z-t.canonical.z,s=i.canonical.x-(i.canonical.x>>o<>o<>o;e.aQ(a.posMatrix,0,c,0,c,0,1),e.J(a.posMatrix,a.posMatrix,[-s*c,-l*c,0]),r[n]=a}else if(t.canonical.isChildOf(i.canonical)){const a=t.clone();a.posMatrix=new Float64Array(16);const o=t.canonical.z-i.canonical.z,s=t.canonical.x-(t.canonical.x>>o<>o<>o;e.aQ(a.posMatrix,0,e.X,0,e.X,0,1),e.J(a.posMatrix,a.posMatrix,[s*c,l*c,0]),e.K(a.posMatrix,a.posMatrix,[1/2**o,1/2**o,0]),r[n]=a}}return r}getSourceTile(t,e){const r=this.sourceCache._source;let n=t.overscaledZ-this.deltaZoom;if(n>r.maxzoom&&(n=r.maxzoom),n=r.minzoom&&(!i||!i.dem);)i=this.sourceCache.getTileByID(t.scaledTo(n--).key);return i}tilesAfterTime(t=Date.now()){return Object.values(this._tiles).filter((e=>e.timeAdded>=t))}}class Di{constructor(t,e,r){this.painter=t,this.sourceCache=new Oi(e),this.options=r,this.exaggeration=\"number\"==typeof r.exaggeration?r.exaggeration:1,this.qualityFactor=2,this.meshSize=128,this._demMatrixCache={},this.coordsIndex=[],this._coordsTextureSize=1024}getDEMElevation(t,r,n,i=e.X){var a;if(!(r>=0&&r=0&&nt.canonical.z&&(t.canonical.z>=n?i=t.canonical.z-n:e.w(\"cannot calculate elevation if elevation maxzoom > source.maxzoom\"));const a=t.canonical.x-(t.canonical.x>>i<>i<>8<<4|t>>8,r[e+3]=0;const n=new e.R({width:this._coordsTextureSize,height:this._coordsTextureSize},new Uint8Array(r.buffer)),i=new w(t,n,t.gl.RGBA,{premultiply:!1});return i.bind(t.gl.NEAREST,t.gl.CLAMP_TO_EDGE),this._coordsTexture=i,i}pointCoordinate(t){this.painter.maybeDrawDepthAndCoords(!0);const r=new Uint8Array(4),n=this.painter.context,i=n.gl,a=Math.round(t.x*this.painter.pixelRatio/devicePixelRatio),o=Math.round(t.y*this.painter.pixelRatio/devicePixelRatio),s=Math.round(this.painter.height/devicePixelRatio);n.bindFramebuffer.set(this.getFramebuffer(\"coords\").framebuffer),i.readPixels(a,s-o-1,1,1,i.RGBA,i.UNSIGNED_BYTE,r),n.bindFramebuffer.set(null);const l=r[0]+(r[2]>>4<<8),c=r[1]+((15&r[2])<<8),u=this.coordsIndex[255-r[3]],h=u&&this.sourceCache.getTileByID(u);if(!h)return null;const f=this._coordsTextureSize,p=(1<t.id!==e)),this._recentlyUsed.push(t.id)}stampObject(t){t.stamp=++this._stamp}getOrCreateFreeObject(){for(const t of this._recentlyUsed)if(!this._objects[t].inUse)return this._objects[t];if(this._objects.length>=this._size)throw new Error(\"No free RenderPool available, call freeAllObjects() required!\");const t=this._createObject(this._objects.length);return this._objects.push(t),t}freeObject(t){t.inUse=!1}freeAllObjects(){for(const t of this._objects)this.freeObject(t)}isFull(){return!(this._objects.length!t.inUse))}}const Fi={background:!0,fill:!0,line:!0,raster:!0,hillshade:!0};class Bi{constructor(t,e){this.painter=t,this.terrain=e,this.pool=new Ri(t.context,30,e.sourceCache.tileSize*e.qualityFactor)}destruct(){this.pool.destruct()}getTexture(t){return this.pool.getObjectForId(t.rtt[this._stacks.length-1].id).texture}prepareForRender(t,e){this._stacks=[],this._prevType=null,this._rttTiles=[],this._renderableTiles=this.terrain.sourceCache.getRenderableTiles(),this._renderableLayerIds=t._order.filter((r=>!t._layers[r].isHidden(e))),this._coordsDescendingInv={};for(const e in t.sourceCaches){this._coordsDescendingInv[e]={};const r=t.sourceCaches[e].getVisibleCoordinates();for(const t of r){const r=this.terrain.sourceCache.getTerrainCoords(t);for(const t in r)this._coordsDescendingInv[e][t]||(this._coordsDescendingInv[e][t]=[]),this._coordsDescendingInv[e][t].push(r[t])}}this._coordsDescendingInvStr={};for(const e of t._order){const r=t._layers[e],n=r.source;if(Fi[r.type]&&!this._coordsDescendingInvStr[n]){this._coordsDescendingInvStr[n]={};for(const t in this._coordsDescendingInv[n])this._coordsDescendingInvStr[n][t]=this._coordsDescendingInv[n][t].map((t=>t.key)).sort().join()}}for(const t of this._renderableTiles)for(const e in this._coordsDescendingInvStr){const r=this._coordsDescendingInvStr[e][t.tileID.key];r&&r!==t.rttCoords[e]&&(t.rtt=[])}}renderLayer(t){if(t.isHidden(this.painter.transform.zoom))return!1;const r=t.type,n=this.painter,i=this._renderableLayerIds[this._renderableLayerIds.length-1]===t.id;if(Fi[r]&&(this._prevType&&Fi[this._prevType]||this._stacks.push([]),this._prevType=r,this._stacks[this._stacks.length-1].push(t.id),!i))return!0;if(Fi[this._prevType]||Fi[r]&&i){this._prevType=r;const t=this._stacks.length-1,i=this._stacks[t]||[];for(const r of this._renderableTiles){if(this.pool.isFull()&&(bn(this.painter,this.terrain,this._rttTiles),this._rttTiles=[],this.pool.freeAllObjects()),this._rttTiles.push(r),r.rtt[t]){const e=this.pool.getObjectForId(r.rtt[t].id);if(e.stamp===r.rtt[t].stamp){this.pool.useObject(e);continue}}const a=this.pool.getOrCreateFreeObject();this.pool.useObject(a),this.pool.stampObject(a),r.rtt[t]={id:a.id,stamp:a.stamp},n.context.bindFramebuffer.set(a.fbo.framebuffer),n.context.clear({color:e.aN.transparent,stencil:0}),n.currentStencilSource=void 0;for(let t=0;t{t.touchstart=t.dragStart,t.touchmoveWindow=t.dragMove,t.touchend=t.dragEnd},qi={showCompass:!0,showZoom:!0,visualizePitch:!1};class Hi{constructor(t,r,n=!1){this.mousedown=t=>{this.startMouse(e.e({},t,{ctrlKey:!0,preventDefault:()=>t.preventDefault()}),o.mousePos(this.element,t)),o.addEventListener(window,\"mousemove\",this.mousemove),o.addEventListener(window,\"mouseup\",this.mouseup)},this.mousemove=t=>{this.moveMouse(t,o.mousePos(this.element,t))},this.mouseup=t=>{this.mouseRotate.dragEnd(t),this.mousePitch&&this.mousePitch.dragEnd(t),this.offTemp()},this.touchstart=t=>{1!==t.targetTouches.length?this.reset():(this._startPos=this._lastPos=o.touchPos(this.element,t.targetTouches)[0],this.startTouch(t,this._startPos),o.addEventListener(window,\"touchmove\",this.touchmove,{passive:!1}),o.addEventListener(window,\"touchend\",this.touchend))},this.touchmove=t=>{1!==t.targetTouches.length?this.reset():(this._lastPos=o.touchPos(this.element,t.targetTouches)[0],this.moveTouch(t,this._lastPos))},this.touchend=t=>{0===t.targetTouches.length&&this._startPos&&this._lastPos&&this._startPos.dist(this._lastPos){this.mouseRotate.reset(),this.mousePitch&&this.mousePitch.reset(),this.touchRotate.reset(),this.touchPitch&&this.touchPitch.reset(),delete this._startPos,delete this._lastPos,this.offTemp()},this._clickTolerance=10;const i=t.dragRotate._mouseRotate.getClickTolerance(),a=t.dragRotate._mousePitch.getClickTolerance();this.element=r,this.mouseRotate=ei({clickTolerance:i,enable:!0}),this.touchRotate=(({enable:t,clickTolerance:e,bearingDegreesPerPixelMoved:r=.8})=>{const n=new Qn;return new $n({clickTolerance:e,move:(t,e)=>({bearingDelta:(e.x-t.x)*r}),moveStateManager:n,enable:t,assignEvents:Vi})})({clickTolerance:i,enable:!0}),this.map=t,n&&(this.mousePitch=ri({clickTolerance:a,enable:!0}),this.touchPitch=(({enable:t,clickTolerance:e,pitchDegreesPerPixelMoved:r=-.5})=>{const n=new Qn;return new $n({clickTolerance:e,move:(t,e)=>({pitchDelta:(e.y-t.y)*r}),moveStateManager:n,enable:t,assignEvents:Vi})})({clickTolerance:a,enable:!0})),o.addEventListener(r,\"mousedown\",this.mousedown),o.addEventListener(r,\"touchstart\",this.touchstart,{passive:!1}),o.addEventListener(r,\"touchcancel\",this.reset)}startMouse(t,e){this.mouseRotate.dragStart(t,e),this.mousePitch&&this.mousePitch.dragStart(t,e),o.disableDrag()}startTouch(t,e){this.touchRotate.dragStart(t,e),this.touchPitch&&this.touchPitch.dragStart(t,e),o.disableDrag()}moveMouse(t,e){const r=this.map,{bearingDelta:n}=this.mouseRotate.dragMove(t,e)||{};if(n&&r.setBearing(r.getBearing()+n),this.mousePitch){const{pitchDelta:n}=this.mousePitch.dragMove(t,e)||{};n&&r.setPitch(r.getPitch()+n)}}moveTouch(t,e){const r=this.map,{bearingDelta:n}=this.touchRotate.dragMove(t,e)||{};if(n&&r.setBearing(r.getBearing()+n),this.touchPitch){const{pitchDelta:n}=this.touchPitch.dragMove(t,e)||{};n&&r.setPitch(r.getPitch()+n)}}off(){const t=this.element;o.removeEventListener(t,\"mousedown\",this.mousedown),o.removeEventListener(t,\"touchstart\",this.touchstart,{passive:!1}),o.removeEventListener(window,\"touchmove\",this.touchmove,{passive:!1}),o.removeEventListener(window,\"touchend\",this.touchend),o.removeEventListener(t,\"touchcancel\",this.reset),this.offTemp()}offTemp(){o.enableDrag(),o.removeEventListener(window,\"mousemove\",this.mousemove),o.removeEventListener(window,\"mouseup\",this.mouseup),o.removeEventListener(window,\"touchmove\",this.touchmove,{passive:!1}),o.removeEventListener(window,\"touchend\",this.touchend)}}let Gi;function Zi(t,r,n){const i=new e.N(t.lng,t.lat);if(t=new e.N(t.lng,t.lat),r){const i=new e.N(t.lng-360,t.lat),a=new e.N(t.lng+360,t.lat),o=n.locationPoint(t).distSqr(r);n.locationPoint(i).distSqr(r)180;){const e=n.locationPoint(t);if(e.x>=0&&e.y>=0&&e.x<=n.width&&e.y<=n.height)break;t.lng>n.center.lng?t.lng-=360:t.lng+=360}return t.lng!==i.lng&&n.locationPoint(t).y>n.height/2-n.getHorizon()?t:i}const Wi={center:\"translate(-50%,-50%)\",top:\"translate(-50%,0)\",\"top-left\":\"translate(0,0)\",\"top-right\":\"translate(-100%,0)\",bottom:\"translate(-50%,-100%)\",\"bottom-left\":\"translate(0,-100%)\",\"bottom-right\":\"translate(-100%,-100%)\",left:\"translate(0,-50%)\",right:\"translate(-100%,-50%)\"};function Yi(t,e,r){const n=t.classList;for(const t in Wi)n.remove(`maplibregl-${r}-anchor-${t}`);n.add(`maplibregl-${r}-anchor-${e}`)}class Xi extends e.E{constructor(t){if(super(),this._onKeyPress=t=>{const e=t.code,r=t.charCode||t.keyCode;\"Space\"!==e&&\"Enter\"!==e&&32!==r&&13!==r||this.togglePopup()},this._onMapClick=t=>{const e=t.originalEvent.target,r=this._element;this._popup&&(e===r||r.contains(e))&&this.togglePopup()},this._update=t=>{var e;if(!this._map)return;const r=this._map.loaded()&&!this._map.isMoving();(\"terrain\"===(null==t?void 0:t.type)||\"render\"===(null==t?void 0:t.type)&&!r)&&this._map.once(\"render\",this._update),this._map.transform.renderWorldCopies?this._lngLat=Zi(this._lngLat,this._flatPos,this._map.transform):this._lngLat=null===(e=this._lngLat)||void 0===e?void 0:e.wrap(),this._flatPos=this._pos=this._map.project(this._lngLat)._add(this._offset),this._map.terrain&&(this._flatPos=this._map.transform.locationPoint(this._lngLat)._add(this._offset));let n=\"\";\"viewport\"===this._rotationAlignment||\"auto\"===this._rotationAlignment?n=`rotateZ(${this._rotation}deg)`:\"map\"===this._rotationAlignment&&(n=`rotateZ(${this._rotation-this._map.getBearing()}deg)`);let i=\"\";\"viewport\"===this._pitchAlignment||\"auto\"===this._pitchAlignment?i=\"rotateX(0deg)\":\"map\"===this._pitchAlignment&&(i=`rotateX(${this._map.getPitch()}deg)`),this._subpixelPositioning||t&&\"moveend\"!==t.type||(this._pos=this._pos.round()),o.setTransform(this._element,`${Wi[this._anchor]} translate(${this._pos.x}px, ${this._pos.y}px) ${i} ${n}`),a.frameAsync(new AbortController).then((()=>{this._updateOpacity(t&&\"moveend\"===t.type)})).catch((()=>{}))},this._onMove=t=>{if(!this._isDragging){const e=this._clickTolerance||this._map._clickTolerance;this._isDragging=t.point.dist(this._pointerdownPos)>=e}this._isDragging&&(this._pos=t.point.sub(this._positionDelta),this._lngLat=this._map.unproject(this._pos),this.setLngLat(this._lngLat),this._element.style.pointerEvents=\"none\",\"pending\"===this._state&&(this._state=\"active\",this.fire(new e.k(\"dragstart\"))),this.fire(new e.k(\"drag\")))},this._onUp=()=>{this._element.style.pointerEvents=\"auto\",this._positionDelta=null,this._pointerdownPos=null,this._isDragging=!1,this._map.off(\"mousemove\",this._onMove),this._map.off(\"touchmove\",this._onMove),\"active\"===this._state&&this.fire(new e.k(\"dragend\")),this._state=\"inactive\"},this._addDragHandler=t=>{this._element.contains(t.originalEvent.target)&&(t.preventDefault(),this._positionDelta=t.point.sub(this._pos).add(this._offset),this._pointerdownPos=t.point,this._state=\"pending\",this._map.on(\"mousemove\",this._onMove),this._map.on(\"touchmove\",this._onMove),this._map.once(\"mouseup\",this._onUp),this._map.once(\"touchend\",this._onUp))},this._anchor=t&&t.anchor||\"center\",this._color=t&&t.color||\"#3FB1CE\",this._scale=t&&t.scale||1,this._draggable=t&&t.draggable||!1,this._clickTolerance=t&&t.clickTolerance||0,this._subpixelPositioning=t&&t.subpixelPositioning||!1,this._isDragging=!1,this._state=\"inactive\",this._rotation=t&&t.rotation||0,this._rotationAlignment=t&&t.rotationAlignment||\"auto\",this._pitchAlignment=t&&t.pitchAlignment&&\"auto\"!==t.pitchAlignment?t.pitchAlignment:this._rotationAlignment,this.setOpacity(),this.setOpacity(null==t?void 0:t.opacity,null==t?void 0:t.opacityWhenCovered),t&&t.element)this._element=t.element,this._offset=e.P.convert(t&&t.offset||[0,0]);else{this._defaultMarker=!0,this._element=o.create(\"div\");const r=o.createNS(\"http://www.w3.org/2000/svg\",\"svg\"),n=41,i=27;r.setAttributeNS(null,\"display\",\"block\"),r.setAttributeNS(null,\"height\",`${n}px`),r.setAttributeNS(null,\"width\",`${i}px`),r.setAttributeNS(null,\"viewBox\",`0 0 ${i} ${n}`);const a=o.createNS(\"http://www.w3.org/2000/svg\",\"g\");a.setAttributeNS(null,\"stroke\",\"none\"),a.setAttributeNS(null,\"stroke-width\",\"1\"),a.setAttributeNS(null,\"fill\",\"none\"),a.setAttributeNS(null,\"fill-rule\",\"evenodd\");const s=o.createNS(\"http://www.w3.org/2000/svg\",\"g\");s.setAttributeNS(null,\"fill-rule\",\"nonzero\");const l=o.createNS(\"http://www.w3.org/2000/svg\",\"g\");l.setAttributeNS(null,\"transform\",\"translate(3.0, 29.0)\"),l.setAttributeNS(null,\"fill\",\"#000000\");const c=[{rx:\"10.5\",ry:\"5.25002273\"},{rx:\"10.5\",ry:\"5.25002273\"},{rx:\"9.5\",ry:\"4.77275007\"},{rx:\"8.5\",ry:\"4.29549936\"},{rx:\"7.5\",ry:\"3.81822308\"},{rx:\"6.5\",ry:\"3.34094679\"},{rx:\"5.5\",ry:\"2.86367051\"},{rx:\"4.5\",ry:\"2.38636864\"}];for(const t of c){const e=o.createNS(\"http://www.w3.org/2000/svg\",\"ellipse\");e.setAttributeNS(null,\"opacity\",\"0.04\"),e.setAttributeNS(null,\"cx\",\"10.5\"),e.setAttributeNS(null,\"cy\",\"5.80029008\"),e.setAttributeNS(null,\"rx\",t.rx),e.setAttributeNS(null,\"ry\",t.ry),l.appendChild(e)}const u=o.createNS(\"http://www.w3.org/2000/svg\",\"g\");u.setAttributeNS(null,\"fill\",this._color);const h=o.createNS(\"http://www.w3.org/2000/svg\",\"path\");h.setAttributeNS(null,\"d\",\"M27,13.5 C27,19.074644 20.250001,27.000002 14.75,34.500002 C14.016665,35.500004 12.983335,35.500004 12.25,34.500002 C6.7499993,27.000002 0,19.222562 0,13.5 C0,6.0441559 6.0441559,0 13.5,0 C20.955844,0 27,6.0441559 27,13.5 Z\"),u.appendChild(h);const f=o.createNS(\"http://www.w3.org/2000/svg\",\"g\");f.setAttributeNS(null,\"opacity\",\"0.25\"),f.setAttributeNS(null,\"fill\",\"#000000\");const p=o.createNS(\"http://www.w3.org/2000/svg\",\"path\");p.setAttributeNS(null,\"d\",\"M13.5,0 C6.0441559,0 0,6.0441559 0,13.5 C0,19.222562 6.7499993,27 12.25,34.5 C13,35.522727 14.016664,35.500004 14.75,34.5 C20.250001,27 27,19.074644 27,13.5 C27,6.0441559 20.955844,0 13.5,0 Z M13.5,1 C20.415404,1 26,6.584596 26,13.5 C26,15.898657 24.495584,19.181431 22.220703,22.738281 C19.945823,26.295132 16.705119,30.142167 13.943359,33.908203 C13.743445,34.180814 13.612715,34.322738 13.5,34.441406 C13.387285,34.322738 13.256555,34.180814 13.056641,33.908203 C10.284481,30.127985 7.4148684,26.314159 5.015625,22.773438 C2.6163816,19.232715 1,15.953538 1,13.5 C1,6.584596 6.584596,1 13.5,1 Z\"),f.appendChild(p);const d=o.createNS(\"http://www.w3.org/2000/svg\",\"g\");d.setAttributeNS(null,\"transform\",\"translate(6.0, 7.0)\"),d.setAttributeNS(null,\"fill\",\"#FFFFFF\");const m=o.createNS(\"http://www.w3.org/2000/svg\",\"g\");m.setAttributeNS(null,\"transform\",\"translate(8.0, 8.0)\");const g=o.createNS(\"http://www.w3.org/2000/svg\",\"circle\");g.setAttributeNS(null,\"fill\",\"#000000\"),g.setAttributeNS(null,\"opacity\",\"0.25\"),g.setAttributeNS(null,\"cx\",\"5.5\"),g.setAttributeNS(null,\"cy\",\"5.5\"),g.setAttributeNS(null,\"r\",\"5.4999962\");const y=o.createNS(\"http://www.w3.org/2000/svg\",\"circle\");y.setAttributeNS(null,\"fill\",\"#FFFFFF\"),y.setAttributeNS(null,\"cx\",\"5.5\"),y.setAttributeNS(null,\"cy\",\"5.5\"),y.setAttributeNS(null,\"r\",\"5.4999962\"),m.appendChild(g),m.appendChild(y),s.appendChild(l),s.appendChild(u),s.appendChild(f),s.appendChild(d),s.appendChild(m),r.appendChild(s),r.setAttributeNS(null,\"height\",n*this._scale+\"px\"),r.setAttributeNS(null,\"width\",i*this._scale+\"px\"),this._element.appendChild(r),this._offset=e.P.convert(t&&t.offset||[0,-14])}if(this._element.classList.add(\"maplibregl-marker\"),this._element.addEventListener(\"dragstart\",(t=>{t.preventDefault()})),this._element.addEventListener(\"mousedown\",(t=>{t.preventDefault()})),Yi(this._element,this._anchor,\"marker\"),t&&t.className)for(const e of t.className.split(\" \"))this._element.classList.add(e);this._popup=null}addTo(t){return this.remove(),this._map=t,this._element.setAttribute(\"aria-label\",t._getUIString(\"Marker.Title\")),t.getCanvasContainer().appendChild(this._element),t.on(\"move\",this._update),t.on(\"moveend\",this._update),t.on(\"terrain\",this._update),this.setDraggable(this._draggable),this._update(),this._map.on(\"click\",this._onMapClick),this}remove(){return this._opacityTimeout&&(clearTimeout(this._opacityTimeout),delete this._opacityTimeout),this._map&&(this._map.off(\"click\",this._onMapClick),this._map.off(\"move\",this._update),this._map.off(\"moveend\",this._update),this._map.off(\"terrain\",this._update),this._map.off(\"mousedown\",this._addDragHandler),this._map.off(\"touchstart\",this._addDragHandler),this._map.off(\"mouseup\",this._onUp),this._map.off(\"touchend\",this._onUp),this._map.off(\"mousemove\",this._onMove),this._map.off(\"touchmove\",this._onMove),delete this._map),o.remove(this._element),this._popup&&this._popup.remove(),this}getLngLat(){return this._lngLat}setLngLat(t){return this._lngLat=e.N.convert(t),this._pos=null,this._popup&&this._popup.setLngLat(this._lngLat),this._update(),this}getElement(){return this._element}setPopup(t){if(this._popup&&(this._popup.remove(),this._popup=null,this._element.removeEventListener(\"keypress\",this._onKeyPress),this._originalTabIndex||this._element.removeAttribute(\"tabindex\")),t){if(!(\"offset\"in t.options)){const e=38.1,r=13.5,n=Math.abs(r)/Math.SQRT2;t.options.offset=this._defaultMarker?{top:[0,0],\"top-left\":[0,0],\"top-right\":[0,0],bottom:[0,-e],\"bottom-left\":[n,-1*(e-r+n)],\"bottom-right\":[-n,-1*(e-r+n)],left:[r,-1*(e-r)],right:[-r,-1*(e-r)]}:this._offset}this._popup=t,this._originalTabIndex=this._element.getAttribute(\"tabindex\"),this._originalTabIndex||this._element.setAttribute(\"tabindex\",\"0\"),this._element.addEventListener(\"keypress\",this._onKeyPress)}return this}setSubpixelPositioning(t){return this._subpixelPositioning=t,this}getPopup(){return this._popup}togglePopup(){const t=this._popup;return this._element.style.opacity===this._opacityWhenCovered?this:t?(t.isOpen()?t.remove():(t.setLngLat(this._lngLat),t.addTo(this._map)),this):this}_updateOpacity(t=!1){var r,n;if(!(null===(r=this._map)||void 0===r?void 0:r.terrain))return void(this._element.style.opacity!==this._opacity&&(this._element.style.opacity=this._opacity));if(t)this._opacityTimeout=null;else{if(this._opacityTimeout)return;this._opacityTimeout=setTimeout((()=>{this._opacityTimeout=null}),100)}const i=this._map,a=i.terrain.depthAtPoint(this._pos),o=i.terrain.getElevationForLngLatZoom(this._lngLat,i.transform.tileZoom);if(i.transform.lngLatToCameraDepth(this._lngLat,o)-a<.006)return void(this._element.style.opacity=this._opacity);const s=-this._offset.y/i.transform._pixelPerMeter,l=Math.sin(i.getPitch()*Math.PI/180)*s,c=i.terrain.depthAtPoint(new e.P(this._pos.x,this._pos.y-this._offset.y)),u=i.transform.lngLatToCameraDepth(this._lngLat,o+l)-c>.006;(null===(n=this._popup)||void 0===n?void 0:n.isOpen())&&u&&this._popup.remove(),this._element.style.opacity=u?this._opacityWhenCovered:this._opacity}getOffset(){return this._offset}setOffset(t){return this._offset=e.P.convert(t),this._update(),this}addClassName(t){this._element.classList.add(t)}removeClassName(t){this._element.classList.remove(t)}toggleClassName(t){return this._element.classList.toggle(t)}setDraggable(t){return this._draggable=!!t,this._map&&(t?(this._map.on(\"mousedown\",this._addDragHandler),this._map.on(\"touchstart\",this._addDragHandler)):(this._map.off(\"mousedown\",this._addDragHandler),this._map.off(\"touchstart\",this._addDragHandler))),this}isDraggable(){return this._draggable}setRotation(t){return this._rotation=t||0,this._update(),this}getRotation(){return this._rotation}setRotationAlignment(t){return this._rotationAlignment=t||\"auto\",this._update(),this}getRotationAlignment(){return this._rotationAlignment}setPitchAlignment(t){return this._pitchAlignment=t&&\"auto\"!==t?t:this._rotationAlignment,this._update(),this}getPitchAlignment(){return this._pitchAlignment}setOpacity(t,e){return void 0===t&&void 0===e&&(this._opacity=\"1\",this._opacityWhenCovered=\"0.2\"),void 0!==t&&(this._opacity=t),void 0!==e&&(this._opacityWhenCovered=e),this._map&&this._updateOpacity(!0),this}}const $i={positionOptions:{enableHighAccuracy:!1,maximumAge:0,timeout:6e3},fitBoundsOptions:{maxZoom:15},trackUserLocation:!1,showAccuracyCircle:!0,showUserLocation:!0};let Ji=0,Ki=!1;class Qi extends e.E{constructor(t){super(),this._onSuccess=t=>{if(this._map){if(this._isOutOfMapMaxBounds(t))return this._setErrorState(),this.fire(new e.k(\"outofmaxbounds\",t)),this._updateMarker(),void this._finish();if(this.options.trackUserLocation)switch(this._lastKnownPosition=t,this._watchState){case\"WAITING_ACTIVE\":case\"ACTIVE_LOCK\":case\"ACTIVE_ERROR\":this._watchState=\"ACTIVE_LOCK\",this._geolocateButton.classList.remove(\"maplibregl-ctrl-geolocate-waiting\"),this._geolocateButton.classList.remove(\"maplibregl-ctrl-geolocate-active-error\"),this._geolocateButton.classList.add(\"maplibregl-ctrl-geolocate-active\");break;case\"BACKGROUND\":case\"BACKGROUND_ERROR\":this._watchState=\"BACKGROUND\",this._geolocateButton.classList.remove(\"maplibregl-ctrl-geolocate-waiting\"),this._geolocateButton.classList.remove(\"maplibregl-ctrl-geolocate-background-error\"),this._geolocateButton.classList.add(\"maplibregl-ctrl-geolocate-background\");break;default:throw new Error(`Unexpected watchState ${this._watchState}`)}this.options.showUserLocation&&\"OFF\"!==this._watchState&&this._updateMarker(t),this.options.trackUserLocation&&\"ACTIVE_LOCK\"!==this._watchState||this._updateCamera(t),this.options.showUserLocation&&this._dotElement.classList.remove(\"maplibregl-user-location-dot-stale\"),this.fire(new e.k(\"geolocate\",t)),this._finish()}},this._updateCamera=t=>{const r=new e.N(t.coords.longitude,t.coords.latitude),n=t.coords.accuracy,i=this._map.getBearing(),a=e.e({bearing:i},this.options.fitBoundsOptions),o=X.fromLngLat(r,n);this._map.fitBounds(o,a,{geolocateSource:!0})},this._updateMarker=t=>{if(t){const r=new e.N(t.coords.longitude,t.coords.latitude);this._accuracyCircleMarker.setLngLat(r).addTo(this._map),this._userLocationDotMarker.setLngLat(r).addTo(this._map),this._accuracy=t.coords.accuracy,this.options.showUserLocation&&this.options.showAccuracyCircle&&this._updateCircleRadius()}else this._userLocationDotMarker.remove(),this._accuracyCircleMarker.remove()},this._onZoom=()=>{this.options.showUserLocation&&this.options.showAccuracyCircle&&this._updateCircleRadius()},this._onError=t=>{if(this._map){if(this.options.trackUserLocation)if(1===t.code){this._watchState=\"OFF\",this._geolocateButton.classList.remove(\"maplibregl-ctrl-geolocate-waiting\"),this._geolocateButton.classList.remove(\"maplibregl-ctrl-geolocate-active\"),this._geolocateButton.classList.remove(\"maplibregl-ctrl-geolocate-active-error\"),this._geolocateButton.classList.remove(\"maplibregl-ctrl-geolocate-background\"),this._geolocateButton.classList.remove(\"maplibregl-ctrl-geolocate-background-error\"),this._geolocateButton.disabled=!0;const t=this._map._getUIString(\"GeolocateControl.LocationNotAvailable\");this._geolocateButton.title=t,this._geolocateButton.setAttribute(\"aria-label\",t),void 0!==this._geolocationWatchID&&this._clearWatch()}else{if(3===t.code&&Ki)return;this._setErrorState()}\"OFF\"!==this._watchState&&this.options.showUserLocation&&this._dotElement.classList.add(\"maplibregl-user-location-dot-stale\"),this.fire(new e.k(\"error\",t)),this._finish()}},this._finish=()=>{this._timeoutId&&clearTimeout(this._timeoutId),this._timeoutId=void 0},this._setupUI=()=>{this._map&&(this._container.addEventListener(\"contextmenu\",(t=>t.preventDefault())),this._geolocateButton=o.create(\"button\",\"maplibregl-ctrl-geolocate\",this._container),o.create(\"span\",\"maplibregl-ctrl-icon\",this._geolocateButton).setAttribute(\"aria-hidden\",\"true\"),this._geolocateButton.type=\"button\",this._geolocateButton.disabled=!0)},this._finishSetupUI=t=>{if(this._map){if(!1===t){e.w(\"Geolocation support is not available so the GeolocateControl will be disabled.\");const t=this._map._getUIString(\"GeolocateControl.LocationNotAvailable\");this._geolocateButton.disabled=!0,this._geolocateButton.title=t,this._geolocateButton.setAttribute(\"aria-label\",t)}else{const t=this._map._getUIString(\"GeolocateControl.FindMyLocation\");this._geolocateButton.disabled=!1,this._geolocateButton.title=t,this._geolocateButton.setAttribute(\"aria-label\",t)}this.options.trackUserLocation&&(this._geolocateButton.setAttribute(\"aria-pressed\",\"false\"),this._watchState=\"OFF\"),this.options.showUserLocation&&(this._dotElement=o.create(\"div\",\"maplibregl-user-location-dot\"),this._userLocationDotMarker=new Xi({element:this._dotElement}),this._circleElement=o.create(\"div\",\"maplibregl-user-location-accuracy-circle\"),this._accuracyCircleMarker=new Xi({element:this._circleElement,pitchAlignment:\"map\"}),this.options.trackUserLocation&&(this._watchState=\"OFF\"),this._map.on(\"zoom\",this._onZoom)),this._geolocateButton.addEventListener(\"click\",(()=>this.trigger())),this._setup=!0,this.options.trackUserLocation&&this._map.on(\"movestart\",(t=>{const r=t.originalEvent&&\"resize\"===t.originalEvent.type;t.geolocateSource||\"ACTIVE_LOCK\"!==this._watchState||r||(this._watchState=\"BACKGROUND\",this._geolocateButton.classList.add(\"maplibregl-ctrl-geolocate-background\"),this._geolocateButton.classList.remove(\"maplibregl-ctrl-geolocate-active\"),this.fire(new e.k(\"trackuserlocationend\")),this.fire(new e.k(\"userlocationlostfocus\")))}))}},this.options=e.e({},$i,t)}onAdd(t){return this._map=t,this._container=o.create(\"div\",\"maplibregl-ctrl maplibregl-ctrl-group\"),this._setupUI(),function(){return e._(this,arguments,void 0,(function*(t=!1){if(void 0!==Gi&&!t)return Gi;if(void 0===window.navigator.permissions)return Gi=!!window.navigator.geolocation,Gi;try{const t=yield window.navigator.permissions.query({name:\"geolocation\"});Gi=\"denied\"!==t.state}catch(t){Gi=!!window.navigator.geolocation}return Gi}))}().then((t=>this._finishSetupUI(t))),this._container}onRemove(){void 0!==this._geolocationWatchID&&(window.navigator.geolocation.clearWatch(this._geolocationWatchID),this._geolocationWatchID=void 0),this.options.showUserLocation&&this._userLocationDotMarker&&this._userLocationDotMarker.remove(),this.options.showAccuracyCircle&&this._accuracyCircleMarker&&this._accuracyCircleMarker.remove(),o.remove(this._container),this._map.off(\"zoom\",this._onZoom),this._map=void 0,Ji=0,Ki=!1}_isOutOfMapMaxBounds(t){const e=this._map.getMaxBounds(),r=t.coords;return e&&(r.longitudee.getEast()||r.latitudee.getNorth())}_setErrorState(){switch(this._watchState){case\"WAITING_ACTIVE\":this._watchState=\"ACTIVE_ERROR\",this._geolocateButton.classList.remove(\"maplibregl-ctrl-geolocate-active\"),this._geolocateButton.classList.add(\"maplibregl-ctrl-geolocate-active-error\");break;case\"ACTIVE_LOCK\":this._watchState=\"ACTIVE_ERROR\",this._geolocateButton.classList.remove(\"maplibregl-ctrl-geolocate-active\"),this._geolocateButton.classList.add(\"maplibregl-ctrl-geolocate-active-error\"),this._geolocateButton.classList.add(\"maplibregl-ctrl-geolocate-waiting\");break;case\"BACKGROUND\":this._watchState=\"BACKGROUND_ERROR\",this._geolocateButton.classList.remove(\"maplibregl-ctrl-geolocate-background\"),this._geolocateButton.classList.add(\"maplibregl-ctrl-geolocate-background-error\"),this._geolocateButton.classList.add(\"maplibregl-ctrl-geolocate-waiting\");break;case\"ACTIVE_ERROR\":break;default:throw new Error(`Unexpected watchState ${this._watchState}`)}}_updateCircleRadius(){const t=this._map.getBounds(),e=t.getSouthEast(),r=t.getNorthEast(),n=e.distanceTo(r),i=this._map._container.clientHeight,a=Math.ceil(this._accuracy/(n/i)*2);this._circleElement.style.width=`${a}px`,this._circleElement.style.height=`${a}px`}trigger(){if(!this._setup)return e.w(\"Geolocate control triggered before added to a map\"),!1;if(this.options.trackUserLocation){switch(this._watchState){case\"OFF\":this._watchState=\"WAITING_ACTIVE\",this.fire(new e.k(\"trackuserlocationstart\"));break;case\"WAITING_ACTIVE\":case\"ACTIVE_LOCK\":case\"ACTIVE_ERROR\":case\"BACKGROUND_ERROR\":Ji--,Ki=!1,this._watchState=\"OFF\",this._geolocateButton.classList.remove(\"maplibregl-ctrl-geolocate-waiting\"),this._geolocateButton.classList.remove(\"maplibregl-ctrl-geolocate-active\"),this._geolocateButton.classList.remove(\"maplibregl-ctrl-geolocate-active-error\"),this._geolocateButton.classList.remove(\"maplibregl-ctrl-geolocate-background\"),this._geolocateButton.classList.remove(\"maplibregl-ctrl-geolocate-background-error\"),this.fire(new e.k(\"trackuserlocationend\"));break;case\"BACKGROUND\":this._watchState=\"ACTIVE_LOCK\",this._geolocateButton.classList.remove(\"maplibregl-ctrl-geolocate-background\"),this._lastKnownPosition&&this._updateCamera(this._lastKnownPosition),this.fire(new e.k(\"trackuserlocationstart\")),this.fire(new e.k(\"userlocationfocus\"));break;default:throw new Error(`Unexpected watchState ${this._watchState}`)}switch(this._watchState){case\"WAITING_ACTIVE\":this._geolocateButton.classList.add(\"maplibregl-ctrl-geolocate-waiting\"),this._geolocateButton.classList.add(\"maplibregl-ctrl-geolocate-active\");break;case\"ACTIVE_LOCK\":this._geolocateButton.classList.add(\"maplibregl-ctrl-geolocate-active\");break;case\"OFF\":break;default:throw new Error(`Unexpected watchState ${this._watchState}`)}if(\"OFF\"===this._watchState&&void 0!==this._geolocationWatchID)this._clearWatch();else if(void 0===this._geolocationWatchID){let t;this._geolocateButton.classList.add(\"maplibregl-ctrl-geolocate-waiting\"),this._geolocateButton.setAttribute(\"aria-pressed\",\"true\"),Ji++,Ji>1?(t={maximumAge:6e5,timeout:0},Ki=!0):(t=this.options.positionOptions,Ki=!1),this._geolocationWatchID=window.navigator.geolocation.watchPosition(this._onSuccess,this._onError,t)}}else window.navigator.geolocation.getCurrentPosition(this._onSuccess,this._onError,this.options.positionOptions),this._timeoutId=setTimeout(this._finish,1e4);return!0}_clearWatch(){window.navigator.geolocation.clearWatch(this._geolocationWatchID),this._geolocationWatchID=void 0,this._geolocateButton.classList.remove(\"maplibregl-ctrl-geolocate-waiting\"),this._geolocateButton.setAttribute(\"aria-pressed\",\"false\"),this.options.showUserLocation&&this._updateMarker(null)}}const ta={maxWidth:100,unit:\"metric\"};function ea(t,e,r){const n=r&&r.maxWidth||100,i=t._container.clientHeight/2,a=t.unproject([0,i]),o=t.unproject([n,i]),s=a.distanceTo(o);if(r&&\"imperial\"===r.unit){const r=3.2808*s;r>5280?ra(e,n,r/5280,t._getUIString(\"ScaleControl.Miles\")):ra(e,n,r,t._getUIString(\"ScaleControl.Feet\"))}else r&&\"nautical\"===r.unit?ra(e,n,s/1852,t._getUIString(\"ScaleControl.NauticalMiles\")):s>=1e3?ra(e,n,s/1e3,t._getUIString(\"ScaleControl.Kilometers\")):ra(e,n,s,t._getUIString(\"ScaleControl.Meters\"))}function ra(t,e,r,n){const i=function(t){const e=Math.pow(10,`${Math.floor(t)}`.length-1);let r=t/e;return r=r>=10?10:r>=5?5:r>=3?3:r>=2?2:r>=1?1:function(t){const e=Math.pow(10,Math.ceil(-Math.log(t)/Math.LN10));return Math.round(t*e)/e}(r),e*r}(r),a=i/r;t.style.width=e*a+\"px\",t.innerHTML=`${i} ${n}`}class na extends e.E{constructor(t={}){super(),this._onFullscreenChange=()=>{var t;let e=window.document.fullscreenElement||window.document.mozFullScreenElement||window.document.webkitFullscreenElement||window.document.msFullscreenElement;for(;null===(t=null==e?void 0:e.shadowRoot)||void 0===t?void 0:t.fullscreenElement;)e=e.shadowRoot.fullscreenElement;e===this._container!==this._fullscreen&&this._handleFullscreenChange()},this._onClickFullscreen=()=>{this._isFullscreen()?this._exitFullscreen():this._requestFullscreen()},this._fullscreen=!1,t&&t.container&&(t.container instanceof HTMLElement?this._container=t.container:e.w(\"Full screen control 'container' must be a DOM element.\")),\"onfullscreenchange\"in document?this._fullscreenchange=\"fullscreenchange\":\"onmozfullscreenchange\"in document?this._fullscreenchange=\"mozfullscreenchange\":\"onwebkitfullscreenchange\"in document?this._fullscreenchange=\"webkitfullscreenchange\":\"onmsfullscreenchange\"in document&&(this._fullscreenchange=\"MSFullscreenChange\")}onAdd(t){return this._map=t,this._container||(this._container=this._map.getContainer()),this._controlContainer=o.create(\"div\",\"maplibregl-ctrl maplibregl-ctrl-group\"),this._setupUI(),this._controlContainer}onRemove(){o.remove(this._controlContainer),this._map=null,window.document.removeEventListener(this._fullscreenchange,this._onFullscreenChange)}_setupUI(){const t=this._fullscreenButton=o.create(\"button\",\"maplibregl-ctrl-fullscreen\",this._controlContainer);o.create(\"span\",\"maplibregl-ctrl-icon\",t).setAttribute(\"aria-hidden\",\"true\"),t.type=\"button\",this._updateTitle(),this._fullscreenButton.addEventListener(\"click\",this._onClickFullscreen),window.document.addEventListener(this._fullscreenchange,this._onFullscreenChange)}_updateTitle(){const t=this._getTitle();this._fullscreenButton.setAttribute(\"aria-label\",t),this._fullscreenButton.title=t}_getTitle(){return this._map._getUIString(this._isFullscreen()?\"FullscreenControl.Exit\":\"FullscreenControl.Enter\")}_isFullscreen(){return this._fullscreen}_handleFullscreenChange(){this._fullscreen=!this._fullscreen,this._fullscreenButton.classList.toggle(\"maplibregl-ctrl-shrink\"),this._fullscreenButton.classList.toggle(\"maplibregl-ctrl-fullscreen\"),this._updateTitle(),this._fullscreen?(this.fire(new e.k(\"fullscreenstart\")),this._prevCooperativeGesturesEnabled=this._map.cooperativeGestures.isEnabled(),this._map.cooperativeGestures.disable()):(this.fire(new e.k(\"fullscreenend\")),this._prevCooperativeGesturesEnabled&&this._map.cooperativeGestures.enable())}_exitFullscreen(){window.document.exitFullscreen?window.document.exitFullscreen():window.document.mozCancelFullScreen?window.document.mozCancelFullScreen():window.document.msExitFullscreen?window.document.msExitFullscreen():window.document.webkitCancelFullScreen?window.document.webkitCancelFullScreen():this._togglePseudoFullScreen()}_requestFullscreen(){this._container.requestFullscreen?this._container.requestFullscreen():this._container.mozRequestFullScreen?this._container.mozRequestFullScreen():this._container.msRequestFullscreen?this._container.msRequestFullscreen():this._container.webkitRequestFullscreen?this._container.webkitRequestFullscreen():this._togglePseudoFullScreen()}_togglePseudoFullScreen(){this._container.classList.toggle(\"maplibregl-pseudo-fullscreen\"),this._handleFullscreenChange(),this._map.resize()}}const ia={closeButton:!0,closeOnClick:!0,focusAfterOpen:!0,className:\"\",maxWidth:\"240px\",subpixelPositioning:!1},aa=[\"a[href]\",\"[tabindex]:not([tabindex='-1'])\",\"[contenteditable]:not([contenteditable='false'])\",\"button:not([disabled])\",\"input:not([disabled])\",\"select:not([disabled])\",\"textarea:not([disabled])\"].join(\", \");class oa extends e.E{constructor(t){super(),this.remove=()=>(this._content&&o.remove(this._content),this._container&&(o.remove(this._container),delete this._container),this._map&&(this._map.off(\"move\",this._update),this._map.off(\"move\",this._onClose),this._map.off(\"click\",this._onClose),this._map.off(\"remove\",this.remove),this._map.off(\"mousemove\",this._onMouseMove),this._map.off(\"mouseup\",this._onMouseUp),this._map.off(\"drag\",this._onDrag),this._map._canvasContainer.classList.remove(\"maplibregl-track-pointer\"),delete this._map,this.fire(new e.k(\"close\"))),this),this._onMouseUp=t=>{this._update(t.point)},this._onMouseMove=t=>{this._update(t.point)},this._onDrag=t=>{this._update(t.point)},this._update=t=>{var e;const r=this._lngLat||this._trackPointer;if(!this._map||!r||!this._content)return;if(!this._container){if(this._container=o.create(\"div\",\"maplibregl-popup\",this._map.getContainer()),this._tip=o.create(\"div\",\"maplibregl-popup-tip\",this._container),this._container.appendChild(this._content),this.options.className)for(const t of this.options.className.split(\" \"))this._container.classList.add(t);this._closeButton&&this._closeButton.setAttribute(\"aria-label\",this._map._getUIString(\"Popup.Close\")),this._trackPointer&&this._container.classList.add(\"maplibregl-popup-track-pointer\")}if(this.options.maxWidth&&this._container.style.maxWidth!==this.options.maxWidth&&(this._container.style.maxWidth=this.options.maxWidth),this._map.transform.renderWorldCopies&&!this._trackPointer?this._lngLat=Zi(this._lngLat,this._flatPos,this._map.transform):this._lngLat=null===(e=this._lngLat)||void 0===e?void 0:e.wrap(),this._trackPointer&&!t)return;const n=this._flatPos=this._pos=this._trackPointer&&t?t:this._map.project(this._lngLat);this._map.terrain&&(this._flatPos=this._trackPointer&&t?t:this._map.transform.locationPoint(this._lngLat));let i=this.options.anchor;const a=sa(this.options.offset);if(!i){const t=this._container.offsetWidth,e=this._container.offsetHeight;let r;r=n.y+a.bottom.ythis._map.transform.height-e?[\"bottom\"]:[],n.xthis._map.transform.width-t/2&&r.push(\"right\"),i=0===r.length?\"bottom\":r.join(\"-\")}let s=n.add(a[i]);this.options.subpixelPositioning||(s=s.round()),o.setTransform(this._container,`${Wi[i]} translate(${s.x}px,${s.y}px)`),Yi(this._container,i,\"popup\")},this._onClose=()=>{this.remove()},this.options=e.e(Object.create(ia),t)}addTo(t){return this._map&&this.remove(),this._map=t,this.options.closeOnClick&&this._map.on(\"click\",this._onClose),this.options.closeOnMove&&this._map.on(\"move\",this._onClose),this._map.on(\"remove\",this.remove),this._update(),this._focusFirstElement(),this._trackPointer?(this._map.on(\"mousemove\",this._onMouseMove),this._map.on(\"mouseup\",this._onMouseUp),this._container&&this._container.classList.add(\"maplibregl-popup-track-pointer\"),this._map._canvasContainer.classList.add(\"maplibregl-track-pointer\")):this._map.on(\"move\",this._update),this.fire(new e.k(\"open\")),this}isOpen(){return!!this._map}getLngLat(){return this._lngLat}setLngLat(t){return this._lngLat=e.N.convert(t),this._pos=null,this._flatPos=null,this._trackPointer=!1,this._update(),this._map&&(this._map.on(\"move\",this._update),this._map.off(\"mousemove\",this._onMouseMove),this._container&&this._container.classList.remove(\"maplibregl-popup-track-pointer\"),this._map._canvasContainer.classList.remove(\"maplibregl-track-pointer\")),this}trackPointer(){return this._trackPointer=!0,this._pos=null,this._flatPos=null,this._update(),this._map&&(this._map.off(\"move\",this._update),this._map.on(\"mousemove\",this._onMouseMove),this._map.on(\"drag\",this._onDrag),this._container&&this._container.classList.add(\"maplibregl-popup-track-pointer\"),this._map._canvasContainer.classList.add(\"maplibregl-track-pointer\")),this}getElement(){return this._container}setText(t){return this.setDOMContent(document.createTextNode(t))}setHTML(t){const e=document.createDocumentFragment(),r=document.createElement(\"body\");let n;for(r.innerHTML=t;n=r.firstChild,n;)e.appendChild(n);return this.setDOMContent(e)}getMaxWidth(){var t;return null===(t=this._container)||void 0===t?void 0:t.style.maxWidth}setMaxWidth(t){return this.options.maxWidth=t,this._update(),this}setDOMContent(t){if(this._content)for(;this._content.hasChildNodes();)this._content.firstChild&&this._content.removeChild(this._content.firstChild);else this._content=o.create(\"div\",\"maplibregl-popup-content\",this._container);return this._content.appendChild(t),this._createCloseButton(),this._update(),this._focusFirstElement(),this}addClassName(t){return this._container&&this._container.classList.add(t),this}removeClassName(t){return this._container&&this._container.classList.remove(t),this}setOffset(t){return this.options.offset=t,this._update(),this}toggleClassName(t){if(this._container)return this._container.classList.toggle(t)}setSubpixelPositioning(t){this.options.subpixelPositioning=t}_createCloseButton(){this.options.closeButton&&(this._closeButton=o.create(\"button\",\"maplibregl-popup-close-button\",this._content),this._closeButton.type=\"button\",this._closeButton.innerHTML=\"×\",this._closeButton.addEventListener(\"click\",this._onClose))}_focusFirstElement(){if(!this.options.focusAfterOpen||!this._container)return;const t=this._container.querySelector(aa);t&&t.focus()}}function sa(t){if(t){if(\"number\"==typeof t){const r=Math.round(Math.abs(t)/Math.SQRT2);return{center:new e.P(0,0),top:new e.P(0,t),\"top-left\":new e.P(r,r),\"top-right\":new e.P(-r,r),bottom:new e.P(0,-t),\"bottom-left\":new e.P(r,-r),\"bottom-right\":new e.P(-r,-r),left:new e.P(t,0),right:new e.P(-t,0)}}if(t instanceof e.P||Array.isArray(t)){const r=e.P.convert(t);return{center:r,top:r,\"top-left\":r,\"top-right\":r,bottom:r,\"bottom-left\":r,\"bottom-right\":r,left:r,right:r}}return{center:e.P.convert(t.center||[0,0]),top:e.P.convert(t.top||[0,0]),\"top-left\":e.P.convert(t[\"top-left\"]||[0,0]),\"top-right\":e.P.convert(t[\"top-right\"]||[0,0]),bottom:e.P.convert(t.bottom||[0,0]),\"bottom-left\":e.P.convert(t[\"bottom-left\"]||[0,0]),\"bottom-right\":e.P.convert(t[\"bottom-right\"]||[0,0]),left:e.P.convert(t.left||[0,0]),right:e.P.convert(t.right||[0,0])}}return sa(new e.P(0,0))}const la=r;t.AJAXError=e.bg,t.Evented=e.E,t.LngLat=e.N,t.MercatorCoordinate=e.Z,t.Point=e.P,t.addProtocol=e.bh,t.config=e.a,t.removeProtocol=e.bi,t.AttributionControl=Li,t.BoxZoomHandler=Gn,t.CanvasSource=it,t.CooperativeGesturesHandler=Ti,t.DoubleClickZoomHandler=yi,t.DragPanHandler=_i,t.DragRotateHandler=bi,t.EdgeInsets=Mn,t.FullscreenControl=na,t.GeoJSONSource=tt,t.GeolocateControl=Qi,t.Hash=Ln,t.ImageSource=rt,t.KeyboardHandler=pi,t.LngLatBounds=X,t.LogoControl=Ii,t.Map=class extends Ei{constructor(t){e.be.mark(e.bf.create);const r=Object.assign(Object.assign({},Ui),t);if(null!=r.minZoom&&null!=r.maxZoom&&r.minZoom>r.maxZoom)throw new Error(\"maxZoom must be greater than or equal to minZoom\");if(null!=r.minPitch&&null!=r.maxPitch&&r.minPitch>r.maxPitch)throw new Error(\"maxPitch must be greater than or equal to minPitch\");if(null!=r.minPitch&&r.minPitch<0)throw new Error(\"minPitch must be greater than or equal to 0\");if(null!=r.maxPitch&&r.maxPitch>85)throw new Error(\"maxPitch must be less than or equal to 85\");if(super(new En(r.minZoom,r.maxZoom,r.minPitch,r.maxPitch,r.renderWorldCopies),{bearingSnap:r.bearingSnap}),this._idleTriggered=!1,this._crossFadingFactor=1,this._renderTaskQueue=new Pi,this._controls=[],this._mapId=e.a4(),this._contextLost=t=>{t.preventDefault(),this._frameRequest&&(this._frameRequest.abort(),this._frameRequest=null),this.fire(new e.k(\"webglcontextlost\",{originalEvent:t}))},this._contextRestored=t=>{this._setupPainter(),this.resize(),this._update(),this.fire(new e.k(\"webglcontextrestored\",{originalEvent:t}))},this._onMapScroll=t=>{if(t.target===this._container)return this._container.scrollTop=0,this._container.scrollLeft=0,!1},this._onWindowOnline=()=>{this._update()},this._interactive=r.interactive,this._maxTileCacheSize=r.maxTileCacheSize,this._maxTileCacheZoomLevels=r.maxTileCacheZoomLevels,this._failIfMajorPerformanceCaveat=!0===r.failIfMajorPerformanceCaveat,this._preserveDrawingBuffer=!0===r.preserveDrawingBuffer,this._antialias=!0===r.antialias,this._trackResize=!0===r.trackResize,this._bearingSnap=r.bearingSnap,this._refreshExpiredTiles=!0===r.refreshExpiredTiles,this._fadeDuration=r.fadeDuration,this._crossSourceCollisions=!0===r.crossSourceCollisions,this._collectResourceTiming=!0===r.collectResourceTiming,this._locale=Object.assign(Object.assign({},Ni),r.locale),this._clickTolerance=r.clickTolerance,this._overridePixelRatio=r.pixelRatio,this._maxCanvasSize=r.maxCanvasSize,this.transformCameraUpdate=r.transformCameraUpdate,this.cancelPendingTileRequestsWhileZooming=!0===r.cancelPendingTileRequestsWhileZooming,this._imageQueueHandle=p.addThrottleControl((()=>this.isMoving())),this._requestManager=new d(r.transformRequest),\"string\"==typeof r.container){if(this._container=document.getElementById(r.container),!this._container)throw new Error(`Container '${r.container}' not found.`)}else{if(!(r.container instanceof HTMLElement))throw new Error(\"Invalid type: 'container' must be a String or HTMLElement.\");this._container=r.container}if(r.maxBounds&&this.setMaxBounds(r.maxBounds),this._setupContainer(),this._setupPainter(),this.on(\"move\",(()=>this._update(!1))).on(\"moveend\",(()=>this._update(!1))).on(\"zoom\",(()=>this._update(!0))).on(\"terrain\",(()=>{this.painter.terrainFacilitator.dirty=!0,this._update(!0)})).once(\"idle\",(()=>{this._idleTriggered=!0})),\"undefined\"!=typeof window){addEventListener(\"online\",this._onWindowOnline,!1);let t=!1;const e=Cn((t=>{this._trackResize&&!this._removed&&this.resize(t)._update()}),50);this._resizeObserver=new ResizeObserver((r=>{t?e(r):t=!0})),this._resizeObserver.observe(this._container)}this.handlers=new Si(this,r);const n=\"string\"==typeof r.hash&&r.hash||void 0;this._hash=r.hash&&new Ln(n).addTo(this),this._hash&&this._hash._onHashChange()||(this.jumpTo({center:r.center,zoom:r.zoom,bearing:r.bearing,pitch:r.pitch}),r.bounds&&(this.resize(),this.fitBounds(r.bounds,e.e({},r.fitBoundsOptions,{duration:0})))),this.resize(),this._localIdeographFontFamily=r.localIdeographFontFamily,this._validateStyle=r.validateStyle,r.style&&this.setStyle(r.style,{localIdeographFontFamily:r.localIdeographFontFamily}),r.attributionControl&&this.addControl(new Li(\"boolean\"==typeof r.attributionControl?void 0:r.attributionControl)),r.maplibreLogo&&this.addControl(new Ii,r.logoPosition),this.on(\"style.load\",(()=>{this.transform.unmodified&&this.jumpTo(this.style.stylesheet)})),this.on(\"data\",(t=>{this._update(\"style\"===t.dataType),this.fire(new e.k(`${t.dataType}data`,t))})),this.on(\"dataloading\",(t=>{this.fire(new e.k(`${t.dataType}dataloading`,t))})),this.on(\"dataabort\",(t=>{this.fire(new e.k(\"sourcedataabort\",t))}))}_getMapId(){return this._mapId}addControl(t,r){if(void 0===r&&(r=t.getDefaultPosition?t.getDefaultPosition():\"top-right\"),!t||!t.onAdd)return this.fire(new e.j(new Error(\"Invalid argument to map.addControl(). Argument must be a control with onAdd and onRemove methods.\")));const n=t.onAdd(this);this._controls.push(t);const i=this._controlPositions[r];return-1!==r.indexOf(\"bottom\")?i.insertBefore(n,i.firstChild):i.appendChild(n),this}removeControl(t){if(!t||!t.onRemove)return this.fire(new e.j(new Error(\"Invalid argument to map.removeControl(). Argument must be a control with onAdd and onRemove methods.\")));const r=this._controls.indexOf(t);return r>-1&&this._controls.splice(r,1),t.onRemove(this),this}hasControl(t){return this._controls.indexOf(t)>-1}calculateCameraOptionsFromTo(t,e,r,n){return null==n&&this.terrain&&(n=this.terrain.getElevationForLngLatZoom(r,this.transform.tileZoom)),super.calculateCameraOptionsFromTo(t,e,r,n)}resize(t){var r;const n=this._containerDimensions(),i=n[0],a=n[1],o=this._getClampedPixelRatio(i,a);if(this._resizeCanvas(i,a,o),this.painter.resize(i,a,o),this.painter.overLimit()){const t=this.painter.context.gl;this._maxCanvasSize=[t.drawingBufferWidth,t.drawingBufferHeight];const e=this._getClampedPixelRatio(i,a);this._resizeCanvas(i,a,e),this.painter.resize(i,a,e)}this.transform.resize(i,a),null===(r=this._requestedCameraState)||void 0===r||r.resize(i,a);const s=!this._moving;return s&&(this.stop(),this.fire(new e.k(\"movestart\",t)).fire(new e.k(\"move\",t))),this.fire(new e.k(\"resize\",t)),s&&this.fire(new e.k(\"moveend\",t)),this}_getClampedPixelRatio(t,e){const{0:r,1:n}=this._maxCanvasSize,i=this.getPixelRatio(),a=t*i,o=e*i,s=a>r?r/a:1,l=o>n?n/o:1;return Math.min(s,l)*i}getPixelRatio(){var t;return null!==(t=this._overridePixelRatio)&&void 0!==t?t:devicePixelRatio}setPixelRatio(t){this._overridePixelRatio=t,this.resize()}getBounds(){return this.transform.getBounds()}getMaxBounds(){return this.transform.getMaxBounds()}setMaxBounds(t){return this.transform.setMaxBounds(X.convert(t)),this._update()}setMinZoom(t){if((t=null==t?-2:t)>=-2&&t<=this.transform.maxZoom)return this.transform.minZoom=t,this._update(),this.getZoom()=this.transform.minZoom)return this.transform.maxZoom=t,this._update(),this.getZoom()>t&&this.setZoom(t),this;throw new Error(\"maxZoom must be greater than the current minZoom\")}getMaxZoom(){return this.transform.maxZoom}setMinPitch(t){if((t=null==t?0:t)<0)throw new Error(\"minPitch must be greater than or equal to 0\");if(t>=0&&t<=this.transform.maxPitch)return this.transform.minPitch=t,this._update(),this.getPitch()85)throw new Error(\"maxPitch must be less than or equal to 85\");if(t>=this.transform.minPitch)return this.transform.maxPitch=t,this._update(),this.getPitch()>t&&this.setPitch(t),this;throw new Error(\"maxPitch must be greater than the current minPitch\")}getMaxPitch(){return this.transform.maxPitch}getRenderWorldCopies(){return this.transform.renderWorldCopies}setRenderWorldCopies(t){return this.transform.renderWorldCopies=t,this._update()}project(t){return this.transform.locationPoint(e.N.convert(t),this.style&&this.terrain)}unproject(t){return this.transform.pointLocation(e.P.convert(t),this.terrain)}isMoving(){var t;return this._moving||(null===(t=this.handlers)||void 0===t?void 0:t.isMoving())}isZooming(){var t;return this._zooming||(null===(t=this.handlers)||void 0===t?void 0:t.isZooming())}isRotating(){var t;return this._rotating||(null===(t=this.handlers)||void 0===t?void 0:t.isRotating())}_createDelegatedListener(t,e,r){if(\"mouseenter\"===t||\"mouseover\"===t){let n=!1;const i=i=>{const a=this.getLayer(e)?this.queryRenderedFeatures(i.point,{layers:[e]}):[];a.length?n||(n=!0,r.call(this,new Nn(t,this,i.originalEvent,{features:a}))):n=!1};return{layer:e,listener:r,delegates:{mousemove:i,mouseout:()=>{n=!1}}}}if(\"mouseleave\"===t||\"mouseout\"===t){let n=!1;const i=i=>{(this.getLayer(e)?this.queryRenderedFeatures(i.point,{layers:[e]}):[]).length?n=!0:n&&(n=!1,r.call(this,new Nn(t,this,i.originalEvent)))},a=e=>{n&&(n=!1,r.call(this,new Nn(t,this,e.originalEvent)))};return{layer:e,listener:r,delegates:{mousemove:i,mouseout:a}}}{const n=t=>{const n=this.getLayer(e)?this.queryRenderedFeatures(t.point,{layers:[e]}):[];n.length&&(t.features=n,r.call(this,t),delete t.features)};return{layer:e,listener:r,delegates:{[t]:n}}}}on(t,e,r){if(void 0===r)return super.on(t,e);const n=this._createDelegatedListener(t,e,r);this._delegatedListeners=this._delegatedListeners||{},this._delegatedListeners[t]=this._delegatedListeners[t]||[],this._delegatedListeners[t].push(n);for(const t in n.delegates)this.on(t,n.delegates[t]);return this}once(t,e,r){if(void 0===r)return super.once(t,e);const n=this._createDelegatedListener(t,e,r);for(const t in n.delegates)this.once(t,n.delegates[t]);return this}off(t,e,r){if(void 0===r)return super.off(t,e);return this._delegatedListeners&&this._delegatedListeners[t]&&(n=>{const i=n[t];for(let t=0;tthis._updateStyle(t,e)));const r=this.style&&e.transformStyle?this.style.serialize():void 0;return this.style&&(this.style.setEventedParent(null),this.style._remove(!t)),t?(this.style=new de(this,e||{}),this.style.setEventedParent(this,{style:this.style}),\"string\"==typeof t?this.style.loadURL(t,e,r):this.style.loadJSON(t,e,r),this):(delete this.style,this)}_lazyInitEmptyStyle(){this.style||(this.style=new de(this,{}),this.style.setEventedParent(this,{style:this.style}),this.style.loadEmpty())}_diffStyle(t,r){if(\"string\"==typeof t){const n=t,i=this._requestManager.transformRequest(n,\"Style\");e.h(i,new AbortController).then((t=>{this._updateDiff(t.data,r)})).catch((t=>{t&&this.fire(new e.j(t))}))}else\"object\"==typeof t&&this._updateDiff(t,r)}_updateDiff(t,r){try{this.style.setState(t,r)&&this._update(!0)}catch(n){e.w(`Unable to perform style diff: ${n.message||n.error||n}. Rebuilding the style from scratch.`),this._updateStyle(t,r)}}getStyle(){if(this.style)return this.style.serialize()}isStyleLoaded(){return this.style?this.style.loaded():e.w(\"There is no style added to the map.\")}addSource(t,e){return this._lazyInitEmptyStyle(),this.style.addSource(t,e),this._update(!0)}isSourceLoaded(t){const r=this.style&&this.style.sourceCaches[t];if(void 0!==r)return r.loaded();this.fire(new e.j(new Error(`There is no source with ID '${t}'`)))}setTerrain(t){if(this.style._checkLoaded(),this._terrainDataCallback&&this.style.off(\"data\",this._terrainDataCallback),t){const r=this.style.sourceCaches[t.source];if(!r)throw new Error(`cannot load terrain, because there exists no source with ID: ${t.source}`);null===this.terrain&&r.reload();for(const r in this.style._layers){const n=this.style._layers[r];\"hillshade\"===n.type&&n.source===t.source&&e.w(\"You are using the same source for a hillshade layer and for 3D terrain. Please consider using two separate sources to improve rendering quality.\")}this.terrain=new Di(this.painter,r,t),this.painter.renderToTexture=new Bi(this.painter,this.terrain),this.transform.minElevationForCurrentTile=this.terrain.getMinTileElevationForLngLatZoom(this.transform.center,this.transform.tileZoom),this.transform.elevation=this.terrain.getElevationForLngLatZoom(this.transform.center,this.transform.tileZoom),this._terrainDataCallback=e=>{\"style\"===e.dataType?this.terrain.sourceCache.freeRtt():\"source\"===e.dataType&&e.tile&&(e.sourceId!==t.source||this._elevationFreeze||(this.transform.minElevationForCurrentTile=this.terrain.getMinTileElevationForLngLatZoom(this.transform.center,this.transform.tileZoom),this.transform.elevation=this.terrain.getElevationForLngLatZoom(this.transform.center,this.transform.tileZoom)),this.terrain.sourceCache.freeRtt(e.tile.tileID))},this.style.on(\"data\",this._terrainDataCallback)}else this.terrain&&this.terrain.sourceCache.destruct(),this.terrain=null,this.painter.renderToTexture&&this.painter.renderToTexture.destruct(),this.painter.renderToTexture=null,this.transform.minElevationForCurrentTile=0,this.transform.elevation=0;return this.fire(new e.k(\"terrain\",{terrain:t})),this}getTerrain(){var t,e;return null!==(e=null===(t=this.terrain)||void 0===t?void 0:t.options)&&void 0!==e?e:null}areTilesLoaded(){const t=this.style&&this.style.sourceCaches;for(const e in t){const r=t[e]._tiles;for(const t in r){const e=r[t];if(\"loaded\"!==e.state&&\"errored\"!==e.state)return!1}}return!0}removeSource(t){return this.style.removeSource(t),this._update(!0)}getSource(t){return this.style.getSource(t)}addImage(t,r,n={}){const{pixelRatio:i=1,sdf:o=!1,stretchX:s,stretchY:l,content:c,textFitWidth:u,textFitHeight:h}=n;this._lazyInitEmptyStyle();if(!(r instanceof HTMLImageElement||e.b(r))){if(void 0===r.width||void 0===r.height)return this.fire(new e.j(new Error(\"Invalid arguments to map.addImage(). The second argument must be an `HTMLImageElement`, `ImageData`, `ImageBitmap`, or object with `width`, `height`, and `data` properties with the same format as `ImageData`\")));{const{width:n,height:a,data:f}=r,p=r;return this.style.addImage(t,{data:new e.R({width:n,height:a},new Uint8Array(f)),pixelRatio:i,stretchX:s,stretchY:l,content:c,textFitWidth:u,textFitHeight:h,sdf:o,version:0,userImage:p}),p.onAdd&&p.onAdd(this,t),this}}{const{width:n,height:f,data:p}=a.getImageData(r);this.style.addImage(t,{data:new e.R({width:n,height:f},p),pixelRatio:i,stretchX:s,stretchY:l,content:c,textFitWidth:u,textFitHeight:h,sdf:o,version:0})}}updateImage(t,r){const n=this.style.getImage(t);if(!n)return this.fire(new e.j(new Error(\"The map has no image with that id. If you are adding a new image use `map.addImage(...)` instead.\")));const i=r instanceof HTMLImageElement||e.b(r)?a.getImageData(r):r,{width:o,height:s,data:l}=i;if(void 0===o||void 0===s)return this.fire(new e.j(new Error(\"Invalid arguments to map.updateImage(). The second argument must be an `HTMLImageElement`, `ImageData`, `ImageBitmap`, or object with `width`, `height`, and `data` properties with the same format as `ImageData`\")));if(o!==n.data.width||s!==n.data.height)return this.fire(new e.j(new Error(\"The width and height of the updated image must be that same as the previous version of the image\")));const c=!(r instanceof HTMLImageElement||e.b(r));return n.data.replace(l,c),this.style.updateImage(t,n),this}getImage(t){return this.style.getImage(t)}hasImage(t){return t?!!this.style.getImage(t):(this.fire(new e.j(new Error(\"Missing required image id\"))),!1)}removeImage(t){this.style.removeImage(t)}loadImage(t){return p.getImage(this._requestManager.transformRequest(t,\"Image\"),new AbortController)}listImages(){return this.style.listImages()}addLayer(t,e){return this._lazyInitEmptyStyle(),this.style.addLayer(t,e),this._update(!0)}moveLayer(t,e){return this.style.moveLayer(t,e),this._update(!0)}removeLayer(t){return this.style.removeLayer(t),this._update(!0)}getLayer(t){return this.style.getLayer(t)}getLayersOrder(){return this.style.getLayersOrder()}setLayerZoomRange(t,e,r){return this.style.setLayerZoomRange(t,e,r),this._update(!0)}setFilter(t,e,r={}){return this.style.setFilter(t,e,r),this._update(!0)}getFilter(t){return this.style.getFilter(t)}setPaintProperty(t,e,r,n={}){return this.style.setPaintProperty(t,e,r,n),this._update(!0)}getPaintProperty(t,e){return this.style.getPaintProperty(t,e)}setLayoutProperty(t,e,r,n={}){return this.style.setLayoutProperty(t,e,r,n),this._update(!0)}getLayoutProperty(t,e){return this.style.getLayoutProperty(t,e)}setGlyphs(t,e={}){return this._lazyInitEmptyStyle(),this.style.setGlyphs(t,e),this._update(!0)}getGlyphs(){return this.style.getGlyphsUrl()}addSprite(t,e,r={}){return this._lazyInitEmptyStyle(),this.style.addSprite(t,e,r,(t=>{t||this._update(!0)})),this}removeSprite(t){return this._lazyInitEmptyStyle(),this.style.removeSprite(t),this._update(!0)}getSprite(){return this.style.getSprite()}setSprite(t,e={}){return this._lazyInitEmptyStyle(),this.style.setSprite(t,e,(t=>{t||this._update(!0)})),this}setLight(t,e={}){return this._lazyInitEmptyStyle(),this.style.setLight(t,e),this._update(!0)}getLight(){return this.style.getLight()}setSky(t){return this._lazyInitEmptyStyle(),this.style.setSky(t),this._update(!0)}getSky(){return this.style.getSky()}setFeatureState(t,e){return this.style.setFeatureState(t,e),this._update()}removeFeatureState(t,e){return this.style.removeFeatureState(t,e),this._update()}getFeatureState(t){return this.style.getFeatureState(t)}getContainer(){return this._container}getCanvasContainer(){return this._canvasContainer}getCanvas(){return this._canvas}_containerDimensions(){let t=0,e=0;return this._container&&(t=this._container.clientWidth||400,e=this._container.clientHeight||300),[t,e]}_setupContainer(){const t=this._container;t.classList.add(\"maplibregl-map\");const e=this._canvasContainer=o.create(\"div\",\"maplibregl-canvas-container\",t);this._interactive&&e.classList.add(\"maplibregl-interactive\"),this._canvas=o.create(\"canvas\",\"maplibregl-canvas\",e),this._canvas.addEventListener(\"webglcontextlost\",this._contextLost,!1),this._canvas.addEventListener(\"webglcontextrestored\",this._contextRestored,!1),this._canvas.setAttribute(\"tabindex\",this._interactive?\"0\":\"-1\"),this._canvas.setAttribute(\"aria-label\",this._getUIString(\"Map.Title\")),this._canvas.setAttribute(\"role\",\"region\");const r=this._containerDimensions(),n=this._getClampedPixelRatio(r[0],r[1]);this._resizeCanvas(r[0],r[1],n);const i=this._controlContainer=o.create(\"div\",\"maplibregl-control-container\",t),a=this._controlPositions={};[\"top-left\",\"top-right\",\"bottom-left\",\"bottom-right\"].forEach((t=>{a[t]=o.create(\"div\",`maplibregl-ctrl-${t} `,i)})),this._container.addEventListener(\"scroll\",this._onMapScroll,!1)}_resizeCanvas(t,e,r){this._canvas.width=Math.floor(r*t),this._canvas.height=Math.floor(r*e),this._canvas.style.width=`${t}px`,this._canvas.style.height=`${e}px`}_setupPainter(){const t={alpha:!0,stencil:!0,depth:!0,failIfMajorPerformanceCaveat:this._failIfMajorPerformanceCaveat,preserveDrawingBuffer:this._preserveDrawingBuffer,antialias:this._antialias||!1};let e=null;this._canvas.addEventListener(\"webglcontextcreationerror\",(r=>{e={requestedAttributes:t},r&&(e.statusMessage=r.statusMessage,e.type=r.type)}),{once:!0});const r=this._canvas.getContext(\"webgl2\",t)||this._canvas.getContext(\"webgl\",t);if(!r){const t=\"Failed to initialize WebGL\";throw e?(e.message=t,new Error(JSON.stringify(e))):new Error(t)}this.painter=new Tn(r,this.transform),s.testSupport(r)}loaded(){return!this._styleDirty&&!this._sourcesDirty&&!!this.style&&this.style.loaded()}_update(t){return this.style&&this.style._loaded?(this._styleDirty=this._styleDirty||t,this._sourcesDirty=!0,this.triggerRepaint(),this):this}_requestRenderFrame(t){return this._update(),this._renderTaskQueue.add(t)}_cancelRenderFrame(t){this._renderTaskQueue.remove(t)}_render(t){const r=this._idleTriggered?this._fadeDuration:0;if(this.painter.context.setDirty(),this.painter.setBaseState(),this._renderTaskQueue.run(t),this._removed)return;let n=!1;if(this.style&&this._styleDirty){this._styleDirty=!1;const t=this.transform.zoom,i=a.now();this.style.zoomHistory.update(t,i);const o=new e.a9(t,{now:i,fadeDuration:r,zoomHistory:this.style.zoomHistory,transition:this.style.getTransition()}),s=o.crossFadingFactor();1===s&&s===this._crossFadingFactor||(n=!0,this._crossFadingFactor=s),this.style.update(o)}this.style&&this._sourcesDirty&&(this._sourcesDirty=!1,this.style._updateSources(this.transform)),this.terrain?(this.terrain.sourceCache.update(this.transform,this.terrain),this.transform.minElevationForCurrentTile=this.terrain.getMinTileElevationForLngLatZoom(this.transform.center,this.transform.tileZoom),this._elevationFreeze||(this.transform.elevation=this.terrain.getElevationForLngLatZoom(this.transform.center,this.transform.tileZoom))):(this.transform.minElevationForCurrentTile=0,this.transform.elevation=0),this._placementDirty=this.style&&this.style._updatePlacement(this.painter.transform,this.showCollisionBoxes,r,this._crossSourceCollisions),this.painter.render(this.style,{showTileBoundaries:this.showTileBoundaries,showOverdrawInspector:this._showOverdrawInspector,rotating:this.isRotating(),zooming:this.isZooming(),moving:this.isMoving(),fadeDuration:r,showPadding:this.showPadding}),this.fire(new e.k(\"render\")),this.loaded()&&!this._loaded&&(this._loaded=!0,e.be.mark(e.bf.load),this.fire(new e.k(\"load\"))),this.style&&(this.style.hasTransitions()||n)&&(this._styleDirty=!0),this.style&&!this._placementDirty&&this.style._releaseSymbolFadeTiles();const i=this._sourcesDirty||this._styleDirty||this._placementDirty;return i||this._repaint?this.triggerRepaint():!this.isMoving()&&this.loaded()&&this.fire(new e.k(\"idle\")),!this._loaded||this._fullyLoaded||i||(this._fullyLoaded=!0,e.be.mark(e.bf.fullLoad)),this}redraw(){return this.style&&(this._frameRequest&&(this._frameRequest.abort(),this._frameRequest=null),this._render(0)),this}remove(){var t;this._hash&&this._hash.remove();for(const t of this._controls)t.onRemove(this);this._controls=[],this._frameRequest&&(this._frameRequest.abort(),this._frameRequest=null),this._renderTaskQueue.clear(),this.painter.destroy(),this.handlers.destroy(),delete this.handlers,this.setStyle(null),\"undefined\"!=typeof window&&removeEventListener(\"online\",this._onWindowOnline,!1),p.removeThrottleControl(this._imageQueueHandle),null===(t=this._resizeObserver)||void 0===t||t.disconnect();const r=this.painter.context.gl.getExtension(\"WEBGL_lose_context\");(null==r?void 0:r.loseContext)&&r.loseContext(),this._canvas.removeEventListener(\"webglcontextrestored\",this._contextRestored,!1),this._canvas.removeEventListener(\"webglcontextlost\",this._contextLost,!1),o.remove(this._canvasContainer),o.remove(this._controlContainer),this._container.classList.remove(\"maplibregl-map\"),e.be.clearMetrics(),this._removed=!0,this.fire(new e.k(\"remove\"))}triggerRepaint(){this.style&&!this._frameRequest&&(this._frameRequest=new AbortController,a.frameAsync(this._frameRequest).then((t=>{e.be.frame(t),this._frameRequest=null,this._render(t)})).catch((()=>{})))}get showTileBoundaries(){return!!this._showTileBoundaries}set showTileBoundaries(t){this._showTileBoundaries!==t&&(this._showTileBoundaries=t,this._update())}get showPadding(){return!!this._showPadding}set showPadding(t){this._showPadding!==t&&(this._showPadding=t,this._update())}get showCollisionBoxes(){return!!this._showCollisionBoxes}set showCollisionBoxes(t){this._showCollisionBoxes!==t&&(this._showCollisionBoxes=t,t?this.style._generateCollisionBoxes():this._update())}get showOverdrawInspector(){return!!this._showOverdrawInspector}set showOverdrawInspector(t){this._showOverdrawInspector!==t&&(this._showOverdrawInspector=t,this._update())}get repaint(){return!!this._repaint}set repaint(t){this._repaint!==t&&(this._repaint=t,this.triggerRepaint())}get vertices(){return!!this._vertices}set vertices(t){this._vertices=t,this._update()}get version(){return ji}getCameraTargetElevation(){return this.transform.elevation}},t.MapMouseEvent=Nn,t.MapTouchEvent=jn,t.MapWheelEvent=Un,t.Marker=Xi,t.NavigationControl=class{constructor(t){this._updateZoomButtons=()=>{const t=this._map.getZoom(),e=t===this._map.getMaxZoom(),r=t===this._map.getMinZoom();this._zoomInButton.disabled=e,this._zoomOutButton.disabled=r,this._zoomInButton.setAttribute(\"aria-disabled\",e.toString()),this._zoomOutButton.setAttribute(\"aria-disabled\",r.toString())},this._rotateCompassArrow=()=>{const t=this.options.visualizePitch?`scale(${1/Math.pow(Math.cos(this._map.transform.pitch*(Math.PI/180)),.5)}) rotateX(${this._map.transform.pitch}deg) rotateZ(${this._map.transform.angle*(180/Math.PI)}deg)`:`rotate(${this._map.transform.angle*(180/Math.PI)}deg)`;this._compassIcon.style.transform=t},this._setButtonTitle=(t,e)=>{const r=this._map._getUIString(`NavigationControl.${e}`);t.title=r,t.setAttribute(\"aria-label\",r)},this.options=e.e({},qi,t),this._container=o.create(\"div\",\"maplibregl-ctrl maplibregl-ctrl-group\"),this._container.addEventListener(\"contextmenu\",(t=>t.preventDefault())),this.options.showZoom&&(this._zoomInButton=this._createButton(\"maplibregl-ctrl-zoom-in\",(t=>this._map.zoomIn({},{originalEvent:t}))),o.create(\"span\",\"maplibregl-ctrl-icon\",this._zoomInButton).setAttribute(\"aria-hidden\",\"true\"),this._zoomOutButton=this._createButton(\"maplibregl-ctrl-zoom-out\",(t=>this._map.zoomOut({},{originalEvent:t}))),o.create(\"span\",\"maplibregl-ctrl-icon\",this._zoomOutButton).setAttribute(\"aria-hidden\",\"true\")),this.options.showCompass&&(this._compass=this._createButton(\"maplibregl-ctrl-compass\",(t=>{this.options.visualizePitch?this._map.resetNorthPitch({},{originalEvent:t}):this._map.resetNorth({},{originalEvent:t})})),this._compassIcon=o.create(\"span\",\"maplibregl-ctrl-icon\",this._compass),this._compassIcon.setAttribute(\"aria-hidden\",\"true\"))}onAdd(t){return this._map=t,this.options.showZoom&&(this._setButtonTitle(this._zoomInButton,\"ZoomIn\"),this._setButtonTitle(this._zoomOutButton,\"ZoomOut\"),this._map.on(\"zoom\",this._updateZoomButtons),this._updateZoomButtons()),this.options.showCompass&&(this._setButtonTitle(this._compass,\"ResetBearing\"),this.options.visualizePitch&&this._map.on(\"pitch\",this._rotateCompassArrow),this._map.on(\"rotate\",this._rotateCompassArrow),this._rotateCompassArrow(),this._handler=new Hi(this._map,this._compass,this.options.visualizePitch)),this._container}onRemove(){o.remove(this._container),this.options.showZoom&&this._map.off(\"zoom\",this._updateZoomButtons),this.options.showCompass&&(this.options.visualizePitch&&this._map.off(\"pitch\",this._rotateCompassArrow),this._map.off(\"rotate\",this._rotateCompassArrow),this._handler.off(),delete this._handler),delete this._map}_createButton(t,e){const r=o.create(\"button\",t,this._container);return r.type=\"button\",r.addEventListener(\"click\",e),r}},t.Popup=oa,t.RasterDEMTileSource=Q,t.RasterTileSource=K,t.ScaleControl=class{constructor(t){this._onMove=()=>{ea(this._map,this._container,this.options)},this.setUnit=t=>{this.options.unit=t,ea(this._map,this._container,this.options)},this.options=Object.assign(Object.assign({},ta),t)}getDefaultPosition(){return\"bottom-left\"}onAdd(t){return this._map=t,this._container=o.create(\"div\",\"maplibregl-ctrl maplibregl-ctrl-scale\",t.getContainer()),this._map.on(\"move\",this._onMove),this._onMove(),this._container}onRemove(){o.remove(this._container),this._map.off(\"move\",this._onMove),this._map=void 0}},t.ScrollZoomHandler=gi,t.Style=de,t.TerrainControl=class{constructor(t){this._toggleTerrain=()=>{this._map.getTerrain()?this._map.setTerrain(null):this._map.setTerrain(this.options),this._updateTerrainIcon()},this._updateTerrainIcon=()=>{this._terrainButton.classList.remove(\"maplibregl-ctrl-terrain\"),this._terrainButton.classList.remove(\"maplibregl-ctrl-terrain-enabled\"),this._map.terrain?(this._terrainButton.classList.add(\"maplibregl-ctrl-terrain-enabled\"),this._terrainButton.title=this._map._getUIString(\"TerrainControl.Disable\")):(this._terrainButton.classList.add(\"maplibregl-ctrl-terrain\"),this._terrainButton.title=this._map._getUIString(\"TerrainControl.Enable\"))},this.options=t}onAdd(t){return this._map=t,this._container=o.create(\"div\",\"maplibregl-ctrl maplibregl-ctrl-group\"),this._terrainButton=o.create(\"button\",\"maplibregl-ctrl-terrain\",this._container),o.create(\"span\",\"maplibregl-ctrl-icon\",this._terrainButton).setAttribute(\"aria-hidden\",\"true\"),this._terrainButton.type=\"button\",this._terrainButton.addEventListener(\"click\",this._toggleTerrain),this._updateTerrainIcon(),this._map.on(\"terrain\",this._updateTerrainIcon),this._container}onRemove(){o.remove(this._container),this._map.off(\"terrain\",this._updateTerrainIcon),this._map=void 0}},t.TwoFingersTouchPitchHandler=hi,t.TwoFingersTouchRotateHandler=ci,t.TwoFingersTouchZoomHandler=si,t.TwoFingersTouchZoomRotateHandler=wi,t.VectorTileSource=J,t.VideoSource=nt,t.addSourceType=(t,r)=>e._(void 0,void 0,void 0,(function*(){if(ot(t))throw new Error(`A source type called \"${t}\" already exists.`);((t,e)=>{at[t]=e})(t,r)})),t.clearPrewarmedResources=function(){const t=j;t&&(t.isPreloaded()&&1===t.numActive()?(t.release(F),j=null):console.warn(\"Could not clear WebWorkers since there are active Map instances that still reference it. The pre-warmed WebWorker pool can only be cleared when all map instances have been removed with map.remove()\"))},t.getMaxParallelImageRequests=function(){return e.a.MAX_PARALLEL_IMAGE_REQUESTS},t.getRTLTextPluginStatus=function(){return ut().getRTLTextPluginStatus()},t.getVersion=function(){return la},t.getWorkerCount=function(){return B.workerCount},t.getWorkerUrl=function(){return e.a.WORKER_URL},t.importScriptInWorkers=function(t){return H().broadcast(\"IS\",t)},t.prewarm=function(){V().acquire(F)},t.setMaxParallelImageRequests=function(t){e.a.MAX_PARALLEL_IMAGE_REQUESTS=t},t.setRTLTextPlugin=function(t,e){return ut().setRTLTextPlugin(t,e)},t.setWorkerCount=function(t){B.workerCount=t},t.setWorkerUrl=function(t){e.a.WORKER_URL=t}})),t}()},88640:function(t,e,r){\"use strict\";function n(t,e,r){t.prototype=e.prototype=r,r.constructor=t}function i(t,e){var r=Object.create(t.prototype);for(var n in e)r[n]=e[n];return r}function a(){}r.d(e,{GW:function(){return K},Dj:function(){return H}});var o=.7,s=1/o,l=\"\\\\s*([+-]?\\\\d+)\\\\s*\",c=\"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",u=\"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",h=/^#([0-9a-f]{3,8})$/,f=new RegExp(\"^rgb\\\\(\".concat(l,\",\").concat(l,\",\").concat(l,\"\\\\)$\")),p=new RegExp(\"^rgb\\\\(\".concat(u,\",\").concat(u,\",\").concat(u,\"\\\\)$\")),d=new RegExp(\"^rgba\\\\(\".concat(l,\",\").concat(l,\",\").concat(l,\",\").concat(c,\"\\\\)$\")),m=new RegExp(\"^rgba\\\\(\".concat(u,\",\").concat(u,\",\").concat(u,\",\").concat(c,\"\\\\)$\")),g=new RegExp(\"^hsl\\\\(\".concat(c,\",\").concat(u,\",\").concat(u,\"\\\\)$\")),y=new RegExp(\"^hsla\\\\(\".concat(c,\",\").concat(u,\",\").concat(u,\",\").concat(c,\"\\\\)$\")),v={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};function x(){return this.rgb().formatHex()}function _(){return this.rgb().formatRgb()}function b(t){var e,r;return t=(t+\"\").trim().toLowerCase(),(e=h.exec(t))?(r=e[1].length,e=parseInt(e[1],16),6===r?w(e):3===r?new A(e>>8&15|e>>4&240,e>>4&15|240&e,(15&e)<<4|15&e,1):8===r?T(e>>24&255,e>>16&255,e>>8&255,(255&e)/255):4===r?T(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|240&e,((15&e)<<4|15&e)/255):null):(e=f.exec(t))?new A(e[1],e[2],e[3],1):(e=p.exec(t))?new A(255*e[1]/100,255*e[2]/100,255*e[3]/100,1):(e=d.exec(t))?T(e[1],e[2],e[3],e[4]):(e=m.exec(t))?T(255*e[1]/100,255*e[2]/100,255*e[3]/100,e[4]):(e=g.exec(t))?I(e[1],e[2]/100,e[3]/100,1):(e=y.exec(t))?I(e[1],e[2]/100,e[3]/100,e[4]):v.hasOwnProperty(t)?w(v[t]):\"transparent\"===t?new A(NaN,NaN,NaN,0):null}function w(t){return new A(t>>16&255,t>>8&255,255&t,1)}function T(t,e,r,n){return n<=0&&(t=e=r=NaN),new A(t,e,r,n)}function k(t,e,r,n){return 1===arguments.length?((i=t)instanceof a||(i=b(i)),i?new A((i=i.rgb()).r,i.g,i.b,i.opacity):new A):new A(t,e,r,null==n?1:n);var i}function A(t,e,r,n){this.r=+t,this.g=+e,this.b=+r,this.opacity=+n}function M(){return\"#\".concat(L(this.r)).concat(L(this.g)).concat(L(this.b))}function S(){var t=E(this.opacity);return\"\".concat(1===t?\"rgb(\":\"rgba(\").concat(C(this.r),\", \").concat(C(this.g),\", \").concat(C(this.b)).concat(1===t?\")\":\", \".concat(t,\")\"))}function E(t){return isNaN(t)?1:Math.max(0,Math.min(1,t))}function C(t){return Math.max(0,Math.min(255,Math.round(t)||0))}function L(t){return((t=C(t))<16?\"0\":\"\")+t.toString(16)}function I(t,e,r,n){return n<=0?t=e=r=NaN:r<=0||r>=1?t=e=NaN:e<=0&&(t=NaN),new z(t,e,r,n)}function P(t){if(t instanceof z)return new z(t.h,t.s,t.l,t.opacity);if(t instanceof a||(t=b(t)),!t)return new z;if(t instanceof z)return t;var e=(t=t.rgb()).r/255,r=t.g/255,n=t.b/255,i=Math.min(e,r,n),o=Math.max(e,r,n),s=NaN,l=o-i,c=(o+i)/2;return l?(s=e===o?(r-n)/l+6*(r0&&c<1?0:s,new z(s,l,c,t.opacity)}function z(t,e,r,n){this.h=+t,this.s=+e,this.l=+r,this.opacity=+n}function O(t){return(t=(t||0)%360)<0?t+360:t}function D(t){return Math.max(0,Math.min(1,t||0))}function R(t,e,r){return 255*(t<60?e+(r-e)*t/60:t<180?r:t<240?e+(r-e)*(240-t)/60:e)}function F(t,e,r,n,i){var a=t*t,o=a*t;return((1-3*t+3*a-o)*e+(4-6*a+3*o)*r+(1+3*t+3*a-3*o)*n+o*i)/6}n(a,b,{copy:function(t){return Object.assign(new this.constructor,this,t)},displayable:function(){return this.rgb().displayable()},hex:x,formatHex:x,formatHex8:function(){return this.rgb().formatHex8()},formatHsl:function(){return P(this).formatHsl()},formatRgb:_,toString:_}),n(A,k,i(a,{brighter:function(t){return t=null==t?s:Math.pow(s,t),new A(this.r*t,this.g*t,this.b*t,this.opacity)},darker:function(t){return t=null==t?o:Math.pow(o,t),new A(this.r*t,this.g*t,this.b*t,this.opacity)},rgb:function(){return this},clamp:function(){return new A(C(this.r),C(this.g),C(this.b),E(this.opacity))},displayable:function(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:M,formatHex:M,formatHex8:function(){return\"#\".concat(L(this.r)).concat(L(this.g)).concat(L(this.b)).concat(L(255*(isNaN(this.opacity)?1:this.opacity)))},formatRgb:S,toString:S})),n(z,(function(t,e,r,n){return 1===arguments.length?P(t):new z(t,e,r,null==n?1:n)}),i(a,{brighter:function(t){return t=null==t?s:Math.pow(s,t),new z(this.h,this.s,this.l*t,this.opacity)},darker:function(t){return t=null==t?o:Math.pow(o,t),new z(this.h,this.s,this.l*t,this.opacity)},rgb:function(){var t=this.h%360+360*(this.h<0),e=isNaN(t)||isNaN(this.s)?0:this.s,r=this.l,n=r+(r<.5?r:1-r)*e,i=2*r-n;return new A(R(t>=240?t-240:t+120,i,n),R(t,i,n),R(t<120?t+240:t-120,i,n),this.opacity)},clamp:function(){return new z(O(this.h),D(this.s),D(this.l),E(this.opacity))},displayable:function(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl:function(){var t=E(this.opacity);return\"\".concat(1===t?\"hsl(\":\"hsla(\").concat(O(this.h),\", \").concat(100*D(this.s),\"%, \").concat(100*D(this.l),\"%\").concat(1===t?\")\":\", \".concat(t,\")\"))}}));var B=function(t){return function(){return t}};function N(t,e){var r=e-t;return r?function(t,e){return function(r){return t+r*e}}(t,r):B(isNaN(t)?e:t)}var j=function t(e){var r=function(t){return 1==(t=+t)?N:function(e,r){return r-e?function(t,e,r){return t=Math.pow(t,r),e=Math.pow(e,r)-t,r=1/r,function(n){return Math.pow(t+n*e,r)}}(e,r,t):B(isNaN(e)?r:e)}}(e);function n(t,e){var n=r((t=k(t)).r,(e=k(e)).r),i=r(t.g,e.g),a=r(t.b,e.b),o=N(t.opacity,e.opacity);return function(e){return t.r=n(e),t.g=i(e),t.b=a(e),t.opacity=o(e),t+\"\"}}return n.gamma=t,n}(1);function U(t){return function(e){var r,n,i=e.length,a=new Array(i),o=new Array(i),s=new Array(i);for(r=0;r=1?(r=1,e-1):Math.floor(r*e),i=t[n],a=t[n+1],o=n>0?t[n-1]:2*i-a,s=na&&(i=e.slice(a,i),s[o]?s[o]+=i:s[++o]=i),(r=r[0])===(n=n[0])?s[o]?s[o]+=n:s[++o]=n:(s[++o]=null,l.push({i:o,x:H(r,n)})),a=Y.lastIndex;return aESRI\"},\"ortoInstaMaps\":{\"type\":\"raster\",\"tiles\":[\"https://tilemaps.icgc.cat/mapfactory/wmts/orto_8_12/CAT3857/{z}/{x}/{y}.png\"],\"tileSize\":256,\"maxzoom\":13},\"ortoICGC\":{\"type\":\"raster\",\"tiles\":[\"https://geoserveis.icgc.cat/icc_mapesmultibase/noutm/wmts/orto/GRID3857/{z}/{x}/{y}.jpeg\"],\"tileSize\":256,\"minzoom\":13.1,\"maxzoom\":20},\"openmaptiles\":{\"type\":\"vector\",\"url\":\"https://geoserveis.icgc.cat/contextmaps/basemap.json\"}},\"sprite\":\"https://geoserveis.icgc.cat/contextmaps/sprites/sprite@1\",\"glyphs\":\"https://geoserveis.icgc.cat/contextmaps/glyphs/{fontstack}/{range}.pbf\",\"layers\":[{\"id\":\"background\",\"type\":\"background\",\"paint\":{\"background-color\":\"#F4F9F4\"}},{\"id\":\"ortoEsri\",\"type\":\"raster\",\"source\":\"ortoEsri\",\"maxzoom\":16,\"layout\":{\"visibility\":\"visible\"}},{\"id\":\"ortoICGC\",\"type\":\"raster\",\"source\":\"ortoICGC\",\"minzoom\":13.1,\"maxzoom\":19,\"layout\":{\"visibility\":\"visible\"}},{\"id\":\"ortoInstaMaps\",\"type\":\"raster\",\"source\":\"ortoInstaMaps\",\"maxzoom\":13,\"layout\":{\"visibility\":\"visible\"}},{\"id\":\"waterway_tunnel\",\"type\":\"line\",\"source\":\"openmaptiles\",\"source-layer\":\"waterway\",\"minzoom\":14,\"filter\":[\"all\",[\"in\",\"class\",\"river\",\"stream\",\"canal\"],[\"==\",\"brunnel\",\"tunnel\"]],\"layout\":{\"line-cap\":\"round\"},\"paint\":{\"line-color\":\"#a0c8f0\",\"line-width\":{\"base\":1.3,\"stops\":[[13,0.5],[20,6]]},\"line-dasharray\":[2,4]}},{\"id\":\"waterway-other\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849382550.77\"},\"source\":\"openmaptiles\",\"source-layer\":\"waterway\",\"filter\":[\"!in\",\"class\",\"canal\",\"river\",\"stream\"],\"layout\":{\"line-cap\":\"round\"},\"paint\":{\"line-color\":\"#a0c8f0\",\"line-width\":{\"base\":1.3,\"stops\":[[13,0.5],[20,2]]}}},{\"id\":\"waterway-stream-canal\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849382550.77\"},\"source\":\"openmaptiles\",\"source-layer\":\"waterway\",\"filter\":[\"all\",[\"in\",\"class\",\"canal\",\"stream\"],[\"!=\",\"brunnel\",\"tunnel\"]],\"layout\":{\"line-cap\":\"round\"},\"paint\":{\"line-color\":\"#a0c8f0\",\"line-width\":{\"base\":1.3,\"stops\":[[13,0.5],[20,6]]}}},{\"id\":\"waterway-river\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849382550.77\"},\"source\":\"openmaptiles\",\"source-layer\":\"waterway\",\"filter\":[\"all\",[\"==\",\"class\",\"river\"],[\"!=\",\"brunnel\",\"tunnel\"]],\"layout\":{\"line-cap\":\"round\"},\"paint\":{\"line-color\":\"#a0c8f0\",\"line-width\":{\"base\":1.2,\"stops\":[[10,0.8],[20,4]]},\"line-opacity\":0.5}},{\"id\":\"water-offset\",\"type\":\"fill\",\"metadata\":{\"mapbox:group\":\"1444849382550.77\"},\"source\":\"openmaptiles\",\"source-layer\":\"water\",\"maxzoom\":8,\"filter\":[\"==\",\"$type\",\"Polygon\"],\"layout\":{\"visibility\":\"visible\"},\"paint\":{\"fill-opacity\":0,\"fill-color\":\"#a0c8f0\",\"fill-translate\":{\"base\":1,\"stops\":[[6,[2,0]],[8,[0,0]]]}}},{\"id\":\"water\",\"type\":\"fill\",\"metadata\":{\"mapbox:group\":\"1444849382550.77\"},\"source\":\"openmaptiles\",\"source-layer\":\"water\",\"layout\":{\"visibility\":\"visible\"},\"paint\":{\"fill-color\":\"hsl(210, 67%, 85%)\",\"fill-opacity\":0}},{\"id\":\"water-pattern\",\"type\":\"fill\",\"metadata\":{\"mapbox:group\":\"1444849382550.77\"},\"source\":\"openmaptiles\",\"source-layer\":\"water\",\"layout\":{\"visibility\":\"visible\"},\"paint\":{\"fill-translate\":[0,2.5],\"fill-pattern\":\"wave\",\"fill-opacity\":1}},{\"id\":\"landcover-ice-shelf\",\"type\":\"fill\",\"metadata\":{\"mapbox:group\":\"1444849382550.77\"},\"source\":\"openmaptiles\",\"source-layer\":\"landcover\",\"filter\":[\"==\",\"subclass\",\"ice_shelf\"],\"layout\":{\"visibility\":\"visible\"},\"paint\":{\"fill-color\":\"#fff\",\"fill-opacity\":{\"base\":1,\"stops\":[[0,0.9],[10,0.3]]}}},{\"id\":\"tunnel-service-track-casing\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849354174.1904\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"filter\":[\"all\",[\"==\",\"brunnel\",\"tunnel\"],[\"in\",\"class\",\"service\",\"track\"]],\"layout\":{\"line-join\":\"round\"},\"paint\":{\"line-color\":\"#cfcdca\",\"line-dasharray\":[0.5,0.25],\"line-width\":{\"base\":1.2,\"stops\":[[15,1],[16,4],[20,11]]}}},{\"id\":\"tunnel-minor-casing\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849354174.1904\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"filter\":[\"all\",[\"==\",\"brunnel\",\"tunnel\"],[\"==\",\"class\",\"minor\"]],\"layout\":{\"line-join\":\"round\"},\"paint\":{\"line-color\":\"#cfcdca\",\"line-opacity\":{\"stops\":[[12,0],[12.5,1]]},\"line-width\":{\"base\":1.2,\"stops\":[[12,0.5],[13,1],[14,4],[20,15]]}}},{\"id\":\"tunnel-secondary-tertiary-casing\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849354174.1904\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"filter\":[\"all\",[\"==\",\"brunnel\",\"tunnel\"],[\"in\",\"class\",\"secondary\",\"tertiary\"]],\"layout\":{\"line-join\":\"round\"},\"paint\":{\"line-color\":\"#e9ac77\",\"line-opacity\":1,\"line-width\":{\"base\":1.2,\"stops\":[[8,1.5],[20,17]]}}},{\"id\":\"tunnel-trunk-primary-casing\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849354174.1904\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"filter\":[\"all\",[\"==\",\"brunnel\",\"tunnel\"],[\"in\",\"class\",\"primary\",\"trunk\"]],\"layout\":{\"line-join\":\"round\"},\"paint\":{\"line-color\":\"#e9ac77\",\"line-width\":{\"base\":1.2,\"stops\":[[5,0.4],[6,0.6],[7,1.5],[20,22]]},\"line-opacity\":0.7}},{\"id\":\"tunnel-motorway-casing\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849354174.1904\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"filter\":[\"all\",[\"==\",\"brunnel\",\"tunnel\"],[\"==\",\"class\",\"motorway\"]],\"layout\":{\"line-join\":\"round\",\"visibility\":\"visible\"},\"paint\":{\"line-color\":\"#e9ac77\",\"line-dasharray\":[0.5,0.25],\"line-width\":{\"base\":1.2,\"stops\":[[5,0.4],[6,0.6],[7,1.5],[20,22]]},\"line-opacity\":0.5}},{\"id\":\"tunnel-path\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849354174.1904\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"filter\":[\"all\",[\"==\",\"$type\",\"LineString\"],[\"all\",[\"==\",\"brunnel\",\"tunnel\"],[\"==\",\"class\",\"path\"]]],\"paint\":{\"line-color\":\"#cba\",\"line-dasharray\":[1.5,0.75],\"line-width\":{\"base\":1.2,\"stops\":[[15,1.2],[20,4]]}}},{\"id\":\"tunnel-service-track\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849354174.1904\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"filter\":[\"all\",[\"==\",\"brunnel\",\"tunnel\"],[\"in\",\"class\",\"service\",\"track\"]],\"layout\":{\"line-join\":\"round\"},\"paint\":{\"line-color\":\"#fff\",\"line-width\":{\"base\":1.2,\"stops\":[[15.5,0],[16,2],[20,7.5]]}}},{\"id\":\"tunnel-minor\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849354174.1904\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"filter\":[\"all\",[\"==\",\"brunnel\",\"tunnel\"],[\"==\",\"class\",\"minor_road\"]],\"layout\":{\"line-join\":\"round\"},\"paint\":{\"line-color\":\"#fff\",\"line-opacity\":1,\"line-width\":{\"base\":1.2,\"stops\":[[13.5,0],[14,2.5],[20,11.5]]}}},{\"id\":\"tunnel-secondary-tertiary\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849354174.1904\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"filter\":[\"all\",[\"==\",\"brunnel\",\"tunnel\"],[\"in\",\"class\",\"secondary\",\"tertiary\"]],\"layout\":{\"line-join\":\"round\"},\"paint\":{\"line-color\":\"#fff4c6\",\"line-width\":{\"base\":1.2,\"stops\":[[6.5,0],[7,0.5],[20,10]]}}},{\"id\":\"tunnel-trunk-primary\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849354174.1904\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"filter\":[\"all\",[\"==\",\"brunnel\",\"tunnel\"],[\"in\",\"class\",\"primary\",\"trunk\"]],\"layout\":{\"line-join\":\"round\"},\"paint\":{\"line-color\":\"#fff4c6\",\"line-width\":{\"base\":1.2,\"stops\":[[6.5,0],[7,0.5],[20,18]]},\"line-opacity\":0.5}},{\"id\":\"tunnel-motorway\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849354174.1904\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"filter\":[\"all\",[\"==\",\"brunnel\",\"tunnel\"],[\"==\",\"class\",\"motorway\"]],\"layout\":{\"line-join\":\"round\",\"visibility\":\"visible\"},\"paint\":{\"line-color\":\"#ffdaa6\",\"line-width\":{\"base\":1.2,\"stops\":[[6.5,0],[7,0.5],[20,18]]},\"line-opacity\":0.5}},{\"id\":\"tunnel-railway\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849354174.1904\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"filter\":[\"all\",[\"==\",\"brunnel\",\"tunnel\"],[\"==\",\"class\",\"rail\"]],\"paint\":{\"line-color\":\"#bbb\",\"line-width\":{\"base\":1.4,\"stops\":[[14,0.4],[15,0.75],[20,2]]},\"line-dasharray\":[2,2]}},{\"id\":\"ferry\",\"type\":\"line\",\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"filter\":[\"all\",[\"in\",\"class\",\"ferry\"]],\"layout\":{\"line-join\":\"round\",\"visibility\":\"visible\"},\"paint\":{\"line-color\":\"rgba(108, 159, 182, 1)\",\"line-width\":1.1,\"line-dasharray\":[2,2]}},{\"id\":\"aeroway-taxiway-casing\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849345966.4436\"},\"source\":\"openmaptiles\",\"source-layer\":\"aeroway\",\"minzoom\":12,\"filter\":[\"all\",[\"in\",\"class\",\"taxiway\"]],\"layout\":{\"line-cap\":\"round\",\"line-join\":\"round\",\"visibility\":\"visible\"},\"paint\":{\"line-color\":\"rgba(153, 153, 153, 1)\",\"line-width\":{\"base\":1.5,\"stops\":[[11,2],[17,12]]},\"line-opacity\":1}},{\"id\":\"aeroway-runway-casing\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849345966.4436\"},\"source\":\"openmaptiles\",\"source-layer\":\"aeroway\",\"minzoom\":12,\"filter\":[\"all\",[\"in\",\"class\",\"runway\"]],\"layout\":{\"line-cap\":\"round\",\"line-join\":\"round\",\"visibility\":\"visible\"},\"paint\":{\"line-color\":\"rgba(153, 153, 153, 1)\",\"line-width\":{\"base\":1.5,\"stops\":[[11,5],[17,55]]},\"line-opacity\":1}},{\"id\":\"aeroway-taxiway\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849345966.4436\"},\"source\":\"openmaptiles\",\"source-layer\":\"aeroway\",\"minzoom\":4,\"filter\":[\"all\",[\"in\",\"class\",\"taxiway\"],[\"==\",\"$type\",\"LineString\"]],\"layout\":{\"line-cap\":\"round\",\"line-join\":\"round\",\"visibility\":\"visible\"},\"paint\":{\"line-color\":\"rgba(255, 255, 255, 1)\",\"line-width\":{\"base\":1.5,\"stops\":[[11,1],[17,10]]},\"line-opacity\":{\"base\":1,\"stops\":[[11,0],[12,1]]}}},{\"id\":\"aeroway-runway\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849345966.4436\"},\"source\":\"openmaptiles\",\"source-layer\":\"aeroway\",\"minzoom\":4,\"filter\":[\"all\",[\"in\",\"class\",\"runway\"],[\"==\",\"$type\",\"LineString\"]],\"layout\":{\"line-cap\":\"round\",\"line-join\":\"round\",\"visibility\":\"visible\"},\"paint\":{\"line-color\":\"rgba(255, 255, 255, 1)\",\"line-width\":{\"base\":1.5,\"stops\":[[11,4],[17,50]]},\"line-opacity\":{\"base\":1,\"stops\":[[11,0],[12,1]]}}},{\"id\":\"highway-motorway-link-casing\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849345966.4436\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"minzoom\":12,\"filter\":[\"all\",[\"!in\",\"brunnel\",\"bridge\",\"tunnel\"],[\"==\",\"class\",\"motorway_link\"]],\"layout\":{\"line-cap\":\"round\",\"line-join\":\"round\"},\"paint\":{\"line-color\":\"#e9ac77\",\"line-opacity\":1,\"line-width\":{\"base\":1.2,\"stops\":[[12,1],[13,3],[14,4],[20,15]]}}},{\"id\":\"highway-link-casing\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849345966.4436\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"minzoom\":13,\"filter\":[\"all\",[\"!in\",\"brunnel\",\"bridge\",\"tunnel\"],[\"in\",\"class\",\"primary_link\",\"secondary_link\",\"tertiary_link\",\"trunk_link\"]],\"layout\":{\"line-cap\":\"round\",\"line-join\":\"round\",\"visibility\":\"visible\"},\"paint\":{\"line-color\":\"#e9ac77\",\"line-opacity\":1,\"line-width\":{\"base\":1.2,\"stops\":[[12,1],[13,3],[14,4],[20,15]]}}},{\"id\":\"highway-minor-casing\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849345966.4436\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"filter\":[\"all\",[\"==\",\"$type\",\"LineString\"],[\"all\",[\"!=\",\"brunnel\",\"tunnel\"],[\"in\",\"class\",\"minor\",\"service\",\"track\"]]],\"layout\":{\"line-cap\":\"round\",\"line-join\":\"round\"},\"paint\":{\"line-color\":\"#cfcdca\",\"line-opacity\":{\"stops\":[[12,0],[12.5,0]]},\"line-width\":{\"base\":1.2,\"stops\":[[12,0.5],[13,1],[14,4],[20,15]]}}},{\"id\":\"highway-secondary-tertiary-casing\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849345966.4436\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"filter\":[\"all\",[\"!in\",\"brunnel\",\"bridge\",\"tunnel\"],[\"in\",\"class\",\"secondary\",\"tertiary\"]],\"layout\":{\"line-cap\":\"butt\",\"line-join\":\"round\",\"visibility\":\"visible\"},\"paint\":{\"line-color\":\"#e9ac77\",\"line-opacity\":0.5,\"line-width\":{\"base\":1.2,\"stops\":[[8,1.5],[20,17]]}}},{\"id\":\"highway-primary-casing\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849345966.4436\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"minzoom\":5,\"filter\":[\"all\",[\"!in\",\"brunnel\",\"bridge\",\"tunnel\"],[\"in\",\"class\",\"primary\"]],\"layout\":{\"line-cap\":\"butt\",\"line-join\":\"round\",\"visibility\":\"visible\"},\"paint\":{\"line-color\":\"#e9ac77\",\"line-opacity\":{\"stops\":[[7,0],[8,0.6]]},\"line-width\":{\"base\":1.2,\"stops\":[[7,0],[8,0.6],[9,1.5],[20,22]]}}},{\"id\":\"highway-trunk-casing\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849345966.4436\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"minzoom\":5,\"filter\":[\"all\",[\"!in\",\"brunnel\",\"bridge\",\"tunnel\"],[\"in\",\"class\",\"trunk\"]],\"layout\":{\"line-cap\":\"butt\",\"line-join\":\"round\",\"visibility\":\"visible\"},\"paint\":{\"line-color\":\"#e9ac77\",\"line-opacity\":{\"stops\":[[5,0],[6,0.5]]},\"line-width\":{\"base\":1.2,\"stops\":[[5,0],[6,0.6],[7,1.5],[20,22]]}}},{\"id\":\"highway-motorway-casing\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849345966.4436\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"minzoom\":4,\"filter\":[\"all\",[\"!in\",\"brunnel\",\"bridge\",\"tunnel\"],[\"==\",\"class\",\"motorway\"]],\"layout\":{\"line-cap\":\"butt\",\"line-join\":\"round\",\"visibility\":\"visible\"},\"paint\":{\"line-color\":\"#e9ac77\",\"line-width\":{\"base\":1.2,\"stops\":[[4,0],[5,0.4],[6,0.6],[7,1.5],[20,22]]},\"line-opacity\":{\"stops\":[[4,0],[5,0.5]]}}},{\"id\":\"highway-path\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849345966.4436\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"filter\":[\"all\",[\"==\",\"$type\",\"LineString\"],[\"all\",[\"!in\",\"brunnel\",\"bridge\",\"tunnel\"],[\"==\",\"class\",\"path\"]]],\"paint\":{\"line-color\":\"#cba\",\"line-dasharray\":[1.5,0.75],\"line-width\":{\"base\":1.2,\"stops\":[[15,1.2],[20,4]]}}},{\"id\":\"highway-motorway-link\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849345966.4436\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"minzoom\":12,\"filter\":[\"all\",[\"!in\",\"brunnel\",\"bridge\",\"tunnel\"],[\"==\",\"class\",\"motorway_link\"]],\"layout\":{\"line-cap\":\"round\",\"line-join\":\"round\"},\"paint\":{\"line-color\":\"#fc8\",\"line-width\":{\"base\":1.2,\"stops\":[[12.5,0],[13,1.5],[14,2.5],[20,11.5]]}}},{\"id\":\"highway-link\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849345966.4436\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"minzoom\":13,\"filter\":[\"all\",[\"!in\",\"brunnel\",\"bridge\",\"tunnel\"],[\"in\",\"class\",\"primary_link\",\"secondary_link\",\"tertiary_link\",\"trunk_link\"]],\"layout\":{\"line-cap\":\"round\",\"line-join\":\"round\",\"visibility\":\"visible\"},\"paint\":{\"line-color\":\"#fea\",\"line-width\":{\"base\":1.2,\"stops\":[[12.5,0],[13,1.5],[14,2.5],[20,11.5]]}}},{\"id\":\"highway-minor\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849345966.4436\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"filter\":[\"all\",[\"==\",\"$type\",\"LineString\"],[\"all\",[\"!=\",\"brunnel\",\"tunnel\"],[\"in\",\"class\",\"minor\",\"service\",\"track\"]]],\"layout\":{\"line-cap\":\"round\",\"line-join\":\"round\"},\"paint\":{\"line-color\":\"#fff\",\"line-opacity\":0.5,\"line-width\":{\"base\":1.2,\"stops\":[[13.5,0],[14,2.5],[20,11.5]]}}},{\"id\":\"highway-secondary-tertiary\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849345966.4436\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"filter\":[\"all\",[\"!in\",\"brunnel\",\"bridge\",\"tunnel\"],[\"in\",\"class\",\"secondary\",\"tertiary\"]],\"layout\":{\"line-cap\":\"round\",\"line-join\":\"round\",\"visibility\":\"visible\"},\"paint\":{\"line-color\":\"#fea\",\"line-width\":{\"base\":1.2,\"stops\":[[6.5,0],[8,0.5],[20,13]]},\"line-opacity\":0.5}},{\"id\":\"highway-primary\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849345966.4436\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"filter\":[\"all\",[\"==\",\"$type\",\"LineString\"],[\"all\",[\"!in\",\"brunnel\",\"bridge\",\"tunnel\"],[\"in\",\"class\",\"primary\"]]],\"layout\":{\"line-cap\":\"round\",\"line-join\":\"round\",\"visibility\":\"visible\"},\"paint\":{\"line-color\":\"#fea\",\"line-width\":{\"base\":1.2,\"stops\":[[8.5,0],[9,0.5],[20,18]]},\"line-opacity\":0}},{\"id\":\"highway-trunk\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849345966.4436\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"filter\":[\"all\",[\"==\",\"$type\",\"LineString\"],[\"all\",[\"!in\",\"brunnel\",\"bridge\",\"tunnel\"],[\"in\",\"class\",\"trunk\"]]],\"layout\":{\"line-cap\":\"round\",\"line-join\":\"round\",\"visibility\":\"visible\"},\"paint\":{\"line-color\":\"#fea\",\"line-width\":{\"base\":1.2,\"stops\":[[6.5,0],[7,0.5],[20,18]]},\"line-opacity\":0.5}},{\"id\":\"highway-motorway\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849345966.4436\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"minzoom\":5,\"filter\":[\"all\",[\"==\",\"$type\",\"LineString\"],[\"all\",[\"!in\",\"brunnel\",\"bridge\",\"tunnel\"],[\"==\",\"class\",\"motorway\"]]],\"layout\":{\"line-cap\":\"round\",\"line-join\":\"round\",\"visibility\":\"visible\"},\"paint\":{\"line-color\":\"#fc8\",\"line-width\":{\"base\":1.2,\"stops\":[[6.5,0],[7,0.5],[20,18]]},\"line-opacity\":0.5}},{\"id\":\"railway-transit\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849345966.4436\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"filter\":[\"all\",[\"==\",\"$type\",\"LineString\"],[\"all\",[\"==\",\"class\",\"transit\"],[\"!in\",\"brunnel\",\"tunnel\"]]],\"layout\":{\"visibility\":\"visible\"},\"paint\":{\"line-color\":\"hsla(0, 0%, 73%, 0.77)\",\"line-width\":{\"base\":1.4,\"stops\":[[14,0.4],[20,1]]}}},{\"id\":\"railway-transit-hatching\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849345966.4436\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"filter\":[\"all\",[\"==\",\"$type\",\"LineString\"],[\"all\",[\"==\",\"class\",\"transit\"],[\"!in\",\"brunnel\",\"tunnel\"]]],\"layout\":{\"visibility\":\"visible\"},\"paint\":{\"line-color\":\"hsla(0, 0%, 73%, 0.68)\",\"line-dasharray\":[0.2,8],\"line-width\":{\"base\":1.4,\"stops\":[[14.5,0],[15,2],[20,6]]}}},{\"id\":\"railway-service\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849345966.4436\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"filter\":[\"all\",[\"==\",\"$type\",\"LineString\"],[\"all\",[\"==\",\"class\",\"rail\"],[\"has\",\"service\"]]],\"paint\":{\"line-color\":\"hsla(0, 0%, 73%, 0.77)\",\"line-width\":{\"base\":1.4,\"stops\":[[14,0.4],[20,1]]}}},{\"id\":\"railway-service-hatching\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849345966.4436\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"filter\":[\"all\",[\"==\",\"$type\",\"LineString\"],[\"all\",[\"==\",\"class\",\"rail\"],[\"has\",\"service\"]]],\"layout\":{\"visibility\":\"visible\"},\"paint\":{\"line-color\":\"hsla(0, 0%, 73%, 0.68)\",\"line-dasharray\":[0.2,8],\"line-width\":{\"base\":1.4,\"stops\":[[14.5,0],[15,2],[20,6]]}}},{\"id\":\"railway\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849345966.4436\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"filter\":[\"all\",[\"==\",\"$type\",\"LineString\"],[\"all\",[\"!has\",\"service\"],[\"!in\",\"brunnel\",\"bridge\",\"tunnel\"],[\"==\",\"class\",\"rail\"]]],\"paint\":{\"line-color\":\"#bbb\",\"line-width\":{\"base\":1.4,\"stops\":[[14,0.4],[15,0.75],[20,2]]}}},{\"id\":\"railway-hatching\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849345966.4436\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"filter\":[\"all\",[\"==\",\"$type\",\"LineString\"],[\"all\",[\"!has\",\"service\"],[\"!in\",\"brunnel\",\"bridge\",\"tunnel\"],[\"==\",\"class\",\"rail\"]]],\"paint\":{\"line-color\":\"#bbb\",\"line-dasharray\":[0.2,8],\"line-width\":{\"base\":1.4,\"stops\":[[14.5,0],[15,3],[20,8]]}}},{\"id\":\"bridge-motorway-link-casing\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849334699.1902\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"filter\":[\"all\",[\"==\",\"brunnel\",\"bridge\"],[\"==\",\"class\",\"motorway_link\"]],\"layout\":{\"line-join\":\"round\"},\"paint\":{\"line-color\":\"#e9ac77\",\"line-opacity\":1,\"line-width\":{\"base\":1.2,\"stops\":[[12,1],[13,3],[14,4],[20,15]]}}},{\"id\":\"bridge-link-casing\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849334699.1902\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"filter\":[\"all\",[\"==\",\"brunnel\",\"bridge\"],[\"in\",\"class\",\"primary_link\",\"secondary_link\",\"tertiary_link\",\"trunk_link\"]],\"layout\":{\"line-join\":\"round\"},\"paint\":{\"line-color\":\"#e9ac77\",\"line-opacity\":1,\"line-width\":{\"base\":1.2,\"stops\":[[12,1],[13,3],[14,4],[20,15]]}}},{\"id\":\"bridge-secondary-tertiary-casing\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849334699.1902\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"filter\":[\"all\",[\"==\",\"brunnel\",\"bridge\"],[\"in\",\"class\",\"secondary\",\"tertiary\"]],\"layout\":{\"line-join\":\"round\"},\"paint\":{\"line-color\":\"#e9ac77\",\"line-opacity\":1,\"line-width\":{\"base\":1.2,\"stops\":[[8,1.5],[20,28]]}}},{\"id\":\"bridge-trunk-primary-casing\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849334699.1902\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"filter\":[\"all\",[\"==\",\"brunnel\",\"bridge\"],[\"in\",\"class\",\"primary\",\"trunk\"]],\"layout\":{\"line-join\":\"round\"},\"paint\":{\"line-color\":\"hsl(28, 76%, 67%)\",\"line-width\":{\"base\":1.2,\"stops\":[[5,0.4],[6,0.6],[7,1.5],[20,26]]}}},{\"id\":\"bridge-motorway-casing\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849334699.1902\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"filter\":[\"all\",[\"==\",\"brunnel\",\"bridge\"],[\"==\",\"class\",\"motorway\"]],\"layout\":{\"line-join\":\"round\"},\"paint\":{\"line-color\":\"#e9ac77\",\"line-width\":{\"base\":1.2,\"stops\":[[5,0.4],[6,0.6],[7,1.5],[20,22]]},\"line-opacity\":0.5}},{\"id\":\"bridge-path-casing\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849334699.1902\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"filter\":[\"all\",[\"==\",\"$type\",\"LineString\"],[\"all\",[\"==\",\"brunnel\",\"bridge\"],[\"==\",\"class\",\"path\"]]],\"paint\":{\"line-color\":\"#f8f4f0\",\"line-width\":{\"base\":1.2,\"stops\":[[15,1.2],[20,18]]}}},{\"id\":\"bridge-path\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849334699.1902\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"filter\":[\"all\",[\"==\",\"$type\",\"LineString\"],[\"all\",[\"==\",\"brunnel\",\"bridge\"],[\"==\",\"class\",\"path\"]]],\"paint\":{\"line-color\":\"#cba\",\"line-width\":{\"base\":1.2,\"stops\":[[15,1.2],[20,4]]},\"line-dasharray\":[1.5,0.75]}},{\"id\":\"bridge-motorway-link\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849334699.1902\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"filter\":[\"all\",[\"==\",\"brunnel\",\"bridge\"],[\"==\",\"class\",\"motorway_link\"]],\"layout\":{\"line-join\":\"round\"},\"paint\":{\"line-color\":\"#fc8\",\"line-width\":{\"base\":1.2,\"stops\":[[12.5,0],[13,1.5],[14,2.5],[20,11.5]]}}},{\"id\":\"bridge-link\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849334699.1902\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"filter\":[\"all\",[\"==\",\"brunnel\",\"bridge\"],[\"in\",\"class\",\"primary_link\",\"secondary_link\",\"tertiary_link\",\"trunk_link\"]],\"layout\":{\"line-join\":\"round\"},\"paint\":{\"line-color\":\"#fea\",\"line-width\":{\"base\":1.2,\"stops\":[[12.5,0],[13,1.5],[14,2.5],[20,11.5]]}}},{\"id\":\"bridge-secondary-tertiary\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849334699.1902\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"filter\":[\"all\",[\"==\",\"brunnel\",\"bridge\"],[\"in\",\"class\",\"secondary\",\"tertiary\"]],\"layout\":{\"line-join\":\"round\"},\"paint\":{\"line-color\":\"#fea\",\"line-width\":{\"base\":1.2,\"stops\":[[6.5,0],[7,0.5],[20,20]]}}},{\"id\":\"bridge-trunk-primary\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849334699.1902\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"filter\":[\"all\",[\"==\",\"brunnel\",\"bridge\"],[\"in\",\"class\",\"primary\",\"trunk\"]],\"layout\":{\"line-join\":\"round\"},\"paint\":{\"line-color\":\"#fea\",\"line-width\":{\"base\":1.2,\"stops\":[[6.5,0],[7,0.5],[20,18]]}}},{\"id\":\"bridge-motorway\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849334699.1902\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"filter\":[\"all\",[\"==\",\"brunnel\",\"bridge\"],[\"==\",\"class\",\"motorway\"]],\"layout\":{\"line-join\":\"round\"},\"paint\":{\"line-color\":\"#fc8\",\"line-width\":{\"base\":1.2,\"stops\":[[6.5,0],[7,0.5],[20,18]]},\"line-opacity\":0.5}},{\"id\":\"bridge-railway\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849334699.1902\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"filter\":[\"all\",[\"==\",\"brunnel\",\"bridge\"],[\"==\",\"class\",\"rail\"]],\"paint\":{\"line-color\":\"#bbb\",\"line-width\":{\"base\":1.4,\"stops\":[[14,0.4],[15,0.75],[20,2]]}}},{\"id\":\"bridge-railway-hatching\",\"type\":\"line\",\"metadata\":{\"mapbox:group\":\"1444849334699.1902\"},\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"filter\":[\"all\",[\"==\",\"brunnel\",\"bridge\"],[\"==\",\"class\",\"rail\"]],\"paint\":{\"line-color\":\"#bbb\",\"line-dasharray\":[0.2,8],\"line-width\":{\"base\":1.4,\"stops\":[[14.5,0],[15,3],[20,8]]}}},{\"id\":\"cablecar\",\"type\":\"line\",\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"minzoom\":13,\"filter\":[\"==\",\"class\",\"cable_car\"],\"layout\":{\"visibility\":\"visible\",\"line-cap\":\"round\"},\"paint\":{\"line-color\":\"hsl(0, 0%, 70%)\",\"line-width\":{\"base\":1,\"stops\":[[11,1],[19,2.5]]}}},{\"id\":\"cablecar-dash\",\"type\":\"line\",\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"minzoom\":13,\"filter\":[\"==\",\"class\",\"cable_car\"],\"layout\":{\"visibility\":\"visible\",\"line-cap\":\"round\"},\"paint\":{\"line-color\":\"hsl(0, 0%, 70%)\",\"line-width\":{\"base\":1,\"stops\":[[11,3],[19,5.5]]},\"line-dasharray\":[2,3]}},{\"id\":\"boundary-land-level-4\",\"type\":\"line\",\"source\":\"openmaptiles\",\"source-layer\":\"boundary\",\"filter\":[\"all\",[\">=\",\"admin_level\",4],[\"<=\",\"admin_level\",8],[\"!=\",\"maritime\",1]],\"layout\":{\"line-join\":\"round\"},\"paint\":{\"line-color\":\"#9e9cab\",\"line-dasharray\":[3,1,1,1],\"line-width\":{\"base\":1.4,\"stops\":[[4,0.4],[5,1],[12,3]]},\"line-opacity\":0.6}},{\"id\":\"boundary-land-level-2\",\"type\":\"line\",\"source\":\"openmaptiles\",\"source-layer\":\"boundary\",\"filter\":[\"all\",[\"==\",\"admin_level\",2],[\"!=\",\"maritime\",1],[\"!=\",\"disputed\",1]],\"layout\":{\"line-cap\":\"round\",\"line-join\":\"round\"},\"paint\":{\"line-color\":\"hsl(248, 7%, 66%)\",\"line-width\":{\"base\":1,\"stops\":[[0,0.6],[4,1.4],[5,2],[12,2]]}}},{\"id\":\"boundary-land-disputed\",\"type\":\"line\",\"source\":\"openmaptiles\",\"source-layer\":\"boundary\",\"filter\":[\"all\",[\"!=\",\"maritime\",1],[\"==\",\"disputed\",1]],\"layout\":{\"line-cap\":\"round\",\"line-join\":\"round\"},\"paint\":{\"line-color\":\"hsl(248, 7%, 70%)\",\"line-dasharray\":[1,3],\"line-width\":{\"base\":1,\"stops\":[[0,0.6],[4,1.4],[5,2],[12,8]]}}},{\"id\":\"boundary-water\",\"type\":\"line\",\"source\":\"openmaptiles\",\"source-layer\":\"boundary\",\"filter\":[\"all\",[\"in\",\"admin_level\",2,4],[\"==\",\"maritime\",1]],\"layout\":{\"line-cap\":\"round\",\"line-join\":\"round\"},\"paint\":{\"line-color\":\"rgba(154, 189, 214, 1)\",\"line-width\":{\"base\":1,\"stops\":[[0,0.6],[4,1],[5,1],[12,1]]},\"line-opacity\":{\"stops\":[[6,0],[10,0]]}}},{\"id\":\"waterway-name\",\"type\":\"symbol\",\"source\":\"openmaptiles\",\"source-layer\":\"waterway\",\"minzoom\":13,\"filter\":[\"all\",[\"==\",\"$type\",\"LineString\"],[\"has\",\"name\"]],\"layout\":{\"text-font\":[\"Noto Sans Italic\"],\"text-size\":14,\"text-field\":\"{name:latin} {name:nonlatin}\",\"text-max-width\":5,\"text-rotation-alignment\":\"map\",\"symbol-placement\":\"line\",\"text-letter-spacing\":0.2,\"symbol-spacing\":350},\"paint\":{\"text-color\":\"#74aee9\",\"text-halo-width\":1.5,\"text-halo-color\":\"rgba(255,255,255,0.7)\"}},{\"id\":\"water-name-lakeline\",\"type\":\"symbol\",\"source\":\"openmaptiles\",\"source-layer\":\"water_name\",\"filter\":[\"==\",\"$type\",\"LineString\"],\"layout\":{\"text-font\":[\"Noto Sans Italic\"],\"text-size\":14,\"text-field\":\"{name:latin}\\\\n{name:nonlatin}\",\"text-max-width\":5,\"text-rotation-alignment\":\"map\",\"symbol-placement\":\"line\",\"symbol-spacing\":350,\"text-letter-spacing\":0.2},\"paint\":{\"text-color\":\"#74aee9\",\"text-halo-width\":1.5,\"text-halo-color\":\"rgba(255,255,255,0.7)\"}},{\"id\":\"water-name-ocean\",\"type\":\"symbol\",\"source\":\"openmaptiles\",\"source-layer\":\"water_name\",\"filter\":[\"all\",[\"==\",\"$type\",\"Point\"],[\"==\",\"class\",\"ocean\"]],\"layout\":{\"text-font\":[\"Noto Sans Italic\"],\"text-size\":14,\"text-field\":\"{name:latin}\",\"text-max-width\":5,\"text-rotation-alignment\":\"map\",\"symbol-placement\":\"point\",\"symbol-spacing\":350,\"text-letter-spacing\":0.2},\"paint\":{\"text-color\":\"#74aee9\",\"text-halo-width\":1.5,\"text-halo-color\":\"rgba(255,255,255,0.7)\"}},{\"id\":\"water-name-other\",\"type\":\"symbol\",\"source\":\"openmaptiles\",\"source-layer\":\"water_name\",\"filter\":[\"all\",[\"==\",\"$type\",\"Point\"],[\"!in\",\"class\",\"ocean\"]],\"layout\":{\"text-font\":[\"Noto Sans Italic\"],\"text-size\":{\"stops\":[[0,10],[6,14]]},\"text-field\":\"{name:latin}\\\\n{name:nonlatin}\",\"text-max-width\":5,\"text-rotation-alignment\":\"map\",\"symbol-placement\":\"point\",\"symbol-spacing\":350,\"text-letter-spacing\":0.2,\"visibility\":\"visible\"},\"paint\":{\"text-color\":\"#74aee9\",\"text-halo-width\":1.5,\"text-halo-color\":\"rgba(255,255,255,0.7)\"}},{\"id\":\"poi-level-3\",\"type\":\"symbol\",\"source\":\"openmaptiles\",\"source-layer\":\"poi\",\"minzoom\":16,\"filter\":[\"all\",[\"==\",\"$type\",\"Point\"],[\">=\",\"rank\",25]],\"layout\":{\"text-padding\":2,\"text-font\":[\"Noto Sans Regular\"],\"text-anchor\":\"top\",\"icon-image\":\"{class}_11\",\"text-field\":\"{name:latin}\\\\n{name:nonlatin}\",\"text-offset\":[0,0.6],\"text-size\":12,\"text-max-width\":9},\"paint\":{\"text-halo-blur\":0.5,\"text-color\":\"#666\",\"text-halo-width\":1,\"text-halo-color\":\"#ffffff\"}},{\"id\":\"poi-level-2\",\"type\":\"symbol\",\"source\":\"openmaptiles\",\"source-layer\":\"poi\",\"minzoom\":15,\"filter\":[\"all\",[\"==\",\"$type\",\"Point\"],[\"<=\",\"rank\",24],[\">=\",\"rank\",15]],\"layout\":{\"text-padding\":2,\"text-font\":[\"Noto Sans Regular\"],\"text-anchor\":\"top\",\"icon-image\":\"{class}_11\",\"text-field\":\"{name:latin}\\\\n{name:nonlatin}\",\"text-offset\":[0,0.6],\"text-size\":12,\"text-max-width\":9},\"paint\":{\"text-halo-blur\":0.5,\"text-color\":\"#666\",\"text-halo-width\":1,\"text-halo-color\":\"#ffffff\"}},{\"id\":\"poi-level-1\",\"type\":\"symbol\",\"source\":\"openmaptiles\",\"source-layer\":\"poi\",\"minzoom\":14,\"filter\":[\"all\",[\"==\",\"$type\",\"Point\"],[\"<=\",\"rank\",14],[\"has\",\"name\"]],\"layout\":{\"text-padding\":2,\"text-font\":[\"Noto Sans Regular\"],\"text-anchor\":\"top\",\"icon-image\":\"{class}_11\",\"text-field\":\"{name:latin}\\\\n{name:nonlatin}\",\"text-offset\":[0,0.6],\"text-size\":11,\"text-max-width\":9},\"paint\":{\"text-halo-blur\":0.5,\"text-color\":\"rgba(191, 228, 172, 1)\",\"text-halo-width\":1,\"text-halo-color\":\"rgba(30, 29, 29, 1)\"}},{\"id\":\"poi-railway\",\"type\":\"symbol\",\"source\":\"openmaptiles\",\"source-layer\":\"poi\",\"minzoom\":13,\"filter\":[\"all\",[\"==\",\"$type\",\"Point\"],[\"has\",\"name\"],[\"==\",\"class\",\"railway\"],[\"==\",\"subclass\",\"station\"]],\"layout\":{\"text-padding\":2,\"text-font\":[\"Noto Sans Regular\"],\"text-anchor\":\"top\",\"icon-image\":\"{class}_11\",\"text-field\":\"{name:latin}\\\\n{name:nonlatin}\",\"text-offset\":[0,0.6],\"text-size\":12,\"text-max-width\":9,\"icon-optional\":false,\"icon-ignore-placement\":false,\"icon-allow-overlap\":false,\"text-ignore-placement\":false,\"text-allow-overlap\":false,\"text-optional\":true},\"paint\":{\"text-halo-blur\":0.5,\"text-color\":\"#666\",\"text-halo-width\":1,\"text-halo-color\":\"#ffffff\"}},{\"id\":\"road_oneway\",\"type\":\"symbol\",\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"minzoom\":15,\"filter\":[\"all\",[\"==\",\"oneway\",1],[\"in\",\"class\",\"motorway\",\"trunk\",\"primary\",\"secondary\",\"tertiary\",\"minor\",\"service\"]],\"layout\":{\"symbol-placement\":\"line\",\"icon-image\":\"oneway\",\"symbol-spacing\":75,\"icon-padding\":2,\"icon-rotation-alignment\":\"map\",\"icon-rotate\":90,\"icon-size\":{\"stops\":[[15,0.5],[19,1]]}},\"paint\":{\"icon-opacity\":0.5}},{\"id\":\"road_oneway_opposite\",\"type\":\"symbol\",\"source\":\"openmaptiles\",\"source-layer\":\"transportation\",\"minzoom\":15,\"filter\":[\"all\",[\"==\",\"oneway\",-1],[\"in\",\"class\",\"motorway\",\"trunk\",\"primary\",\"secondary\",\"tertiary\",\"minor\",\"service\"]],\"layout\":{\"symbol-placement\":\"line\",\"icon-image\":\"oneway\",\"symbol-spacing\":75,\"icon-padding\":2,\"icon-rotation-alignment\":\"map\",\"icon-rotate\":-90,\"icon-size\":{\"stops\":[[15,0.5],[19,1]]}},\"paint\":{\"icon-opacity\":0.5}},{\"id\":\"highway-name-path\",\"type\":\"symbol\",\"source\":\"openmaptiles\",\"source-layer\":\"transportation_name\",\"minzoom\":15.5,\"filter\":[\"==\",\"class\",\"path\"],\"layout\":{\"text-size\":{\"base\":1,\"stops\":[[13,12],[14,13]]},\"text-font\":[\"Noto Sans Regular\"],\"text-field\":\"{name:latin} {name:nonlatin}\",\"symbol-placement\":\"line\",\"text-rotation-alignment\":\"map\"},\"paint\":{\"text-halo-color\":\"#f8f4f0\",\"text-color\":\"hsl(30, 23%, 62%)\",\"text-halo-width\":0.5}},{\"id\":\"highway-name-minor\",\"type\":\"symbol\",\"source\":\"openmaptiles\",\"source-layer\":\"transportation_name\",\"minzoom\":15,\"filter\":[\"all\",[\"==\",\"$type\",\"LineString\"],[\"in\",\"class\",\"minor\",\"service\",\"track\"]],\"layout\":{\"text-size\":{\"base\":1,\"stops\":[[13,12],[14,13]]},\"text-font\":[\"Noto Sans Regular\"],\"text-field\":\"{name:latin} {name:nonlatin}\",\"symbol-placement\":\"line\",\"text-rotation-alignment\":\"map\"},\"paint\":{\"text-halo-blur\":0.5,\"text-color\":\"#765\",\"text-halo-width\":1}},{\"id\":\"highway-name-major\",\"type\":\"symbol\",\"source\":\"openmaptiles\",\"source-layer\":\"transportation_name\",\"minzoom\":12.2,\"filter\":[\"in\",\"class\",\"primary\",\"secondary\",\"tertiary\",\"trunk\"],\"layout\":{\"text-size\":{\"base\":1,\"stops\":[[13,12],[14,13]]},\"text-font\":[\"Noto Sans Regular\"],\"text-field\":\"{name:latin} {name:nonlatin}\",\"symbol-placement\":\"line\",\"text-rotation-alignment\":\"map\"},\"paint\":{\"text-halo-blur\":0.5,\"text-color\":\"#765\",\"text-halo-width\":1}},{\"id\":\"highway-shield\",\"type\":\"symbol\",\"source\":\"openmaptiles\",\"source-layer\":\"transportation_name\",\"minzoom\":8,\"filter\":[\"all\",[\"<=\",\"ref_length\",6],[\"==\",\"$type\",\"LineString\"],[\"!in\",\"network\",\"us-interstate\",\"us-highway\",\"us-state\"]],\"layout\":{\"text-size\":10,\"icon-image\":\"road_{ref_length}\",\"icon-rotation-alignment\":\"viewport\",\"symbol-spacing\":200,\"text-font\":[\"Noto Sans Regular\"],\"symbol-placement\":{\"base\":1,\"stops\":[[10,\"point\"],[11,\"line\"]]},\"text-rotation-alignment\":\"viewport\",\"icon-size\":1,\"text-field\":\"{ref}\"},\"paint\":{\"text-opacity\":1,\"text-color\":\"rgba(20, 19, 19, 1)\",\"text-halo-color\":\"rgba(230, 221, 221, 0)\",\"text-halo-width\":2,\"icon-color\":\"rgba(183, 18, 18, 1)\",\"icon-opacity\":0.3,\"icon-halo-color\":\"rgba(183, 55, 55, 0)\"}},{\"id\":\"highway-shield-us-interstate\",\"type\":\"symbol\",\"source\":\"openmaptiles\",\"source-layer\":\"transportation_name\",\"minzoom\":7,\"filter\":[\"all\",[\"<=\",\"ref_length\",6],[\"==\",\"$type\",\"LineString\"],[\"in\",\"network\",\"us-interstate\"]],\"layout\":{\"text-size\":10,\"icon-image\":\"{network}_{ref_length}\",\"icon-rotation-alignment\":\"viewport\",\"symbol-spacing\":200,\"text-font\":[\"Noto Sans Regular\"],\"symbol-placement\":{\"base\":1,\"stops\":[[7,\"point\"],[7,\"line\"],[8,\"line\"]]},\"text-rotation-alignment\":\"viewport\",\"icon-size\":1,\"text-field\":\"{ref}\"},\"paint\":{\"text-color\":\"rgba(0, 0, 0, 1)\"}},{\"id\":\"highway-shield-us-other\",\"type\":\"symbol\",\"source\":\"openmaptiles\",\"source-layer\":\"transportation_name\",\"minzoom\":9,\"filter\":[\"all\",[\"<=\",\"ref_length\",6],[\"==\",\"$type\",\"LineString\"],[\"in\",\"network\",\"us-highway\",\"us-state\"]],\"layout\":{\"text-size\":10,\"icon-image\":\"{network}_{ref_length}\",\"icon-rotation-alignment\":\"viewport\",\"symbol-spacing\":200,\"text-font\":[\"Noto Sans Regular\"],\"symbol-placement\":{\"base\":1,\"stops\":[[10,\"point\"],[11,\"line\"]]},\"text-rotation-alignment\":\"viewport\",\"icon-size\":1,\"text-field\":\"{ref}\"},\"paint\":{\"text-color\":\"rgba(0, 0, 0, 1)\"}},{\"id\":\"place-other\",\"type\":\"symbol\",\"metadata\":{\"mapbox:group\":\"1444849242106.713\"},\"source\":\"openmaptiles\",\"source-layer\":\"place\",\"minzoom\":12,\"filter\":[\"!in\",\"class\",\"city\",\"town\",\"village\",\"country\",\"continent\"],\"layout\":{\"text-letter-spacing\":0.1,\"text-size\":{\"base\":1.2,\"stops\":[[12,10],[15,14]]},\"text-font\":[\"Noto Sans Bold\"],\"text-field\":\"{name:latin}\\\\n{name:nonlatin}\",\"text-transform\":\"uppercase\",\"text-max-width\":9,\"visibility\":\"visible\"},\"paint\":{\"text-color\":\"rgba(255,255,255,1)\",\"text-halo-width\":1.2,\"text-halo-color\":\"rgba(57, 28, 28, 1)\"}},{\"id\":\"place-village\",\"type\":\"symbol\",\"metadata\":{\"mapbox:group\":\"1444849242106.713\"},\"source\":\"openmaptiles\",\"source-layer\":\"place\",\"minzoom\":10,\"filter\":[\"==\",\"class\",\"village\"],\"layout\":{\"text-font\":[\"Noto Sans Regular\"],\"text-size\":{\"base\":1.2,\"stops\":[[10,12],[15,16]]},\"text-field\":\"{name:latin}\\\\n{name:nonlatin}\",\"text-max-width\":8,\"visibility\":\"visible\"},\"paint\":{\"text-color\":\"rgba(255, 255, 255, 1)\",\"text-halo-width\":1.2,\"text-halo-color\":\"rgba(10, 9, 9, 0.8)\"}},{\"id\":\"place-town\",\"type\":\"symbol\",\"metadata\":{\"mapbox:group\":\"1444849242106.713\"},\"source\":\"openmaptiles\",\"source-layer\":\"place\",\"filter\":[\"==\",\"class\",\"town\"],\"layout\":{\"text-font\":[\"Noto Sans Regular\"],\"text-size\":{\"base\":1.2,\"stops\":[[10,14],[15,24]]},\"text-field\":\"{name:latin}\\\\n{name:nonlatin}\",\"text-max-width\":8,\"visibility\":\"visible\"},\"paint\":{\"text-color\":\"rgba(255, 255, 255, 1)\",\"text-halo-width\":1.2,\"text-halo-color\":\"rgba(22, 22, 22, 0.8)\"}},{\"id\":\"place-city\",\"type\":\"symbol\",\"metadata\":{\"mapbox:group\":\"1444849242106.713\"},\"source\":\"openmaptiles\",\"source-layer\":\"place\",\"filter\":[\"all\",[\"!=\",\"capital\",2],[\"==\",\"class\",\"city\"]],\"layout\":{\"text-font\":[\"Noto Sans Regular\"],\"text-size\":{\"base\":1.2,\"stops\":[[7,14],[11,24]]},\"text-field\":\"{name:latin}\\\\n{name:nonlatin}\",\"text-max-width\":8,\"visibility\":\"visible\"},\"paint\":{\"text-color\":\"rgba(0, 0, 0, 1)\",\"text-halo-width\":1.2,\"text-halo-color\":\"rgba(255,255,255,0.8)\"}},{\"id\":\"place-city-capital\",\"type\":\"symbol\",\"metadata\":{\"mapbox:group\":\"1444849242106.713\"},\"source\":\"openmaptiles\",\"source-layer\":\"place\",\"filter\":[\"all\",[\"==\",\"capital\",2],[\"==\",\"class\",\"city\"]],\"layout\":{\"text-font\":[\"Noto Sans Regular\"],\"text-size\":{\"base\":1.2,\"stops\":[[7,14],[11,24]]},\"text-field\":\"{name:latin}\\\\n{name:nonlatin}\",\"text-max-width\":8,\"icon-image\":\"star_11\",\"text-offset\":[0.4,0],\"icon-size\":0.8,\"text-anchor\":\"left\",\"visibility\":\"visible\"},\"paint\":{\"text-color\":\"#333\",\"text-halo-width\":1.2,\"text-halo-color\":\"rgba(255,255,255,0.8)\"}},{\"id\":\"place-country-other\",\"type\":\"symbol\",\"metadata\":{\"mapbox:group\":\"1444849242106.713\"},\"source\":\"openmaptiles\",\"source-layer\":\"place\",\"filter\":[\"all\",[\"==\",\"class\",\"country\"],[\">=\",\"rank\",3],[\"!has\",\"iso_a2\"]],\"layout\":{\"text-font\":[\"Noto Sans Italic\"],\"text-field\":\"{name:latin}\",\"text-size\":{\"stops\":[[3,11],[7,17]]},\"text-transform\":\"uppercase\",\"text-max-width\":6.25,\"visibility\":\"visible\"},\"paint\":{\"text-halo-blur\":1,\"text-color\":\"#334\",\"text-halo-width\":2,\"text-halo-color\":\"rgba(255,255,255,0.8)\"}},{\"id\":\"place-country-3\",\"type\":\"symbol\",\"metadata\":{\"mapbox:group\":\"1444849242106.713\"},\"source\":\"openmaptiles\",\"source-layer\":\"place\",\"filter\":[\"all\",[\"==\",\"class\",\"country\"],[\">=\",\"rank\",3],[\"has\",\"iso_a2\"]],\"layout\":{\"text-font\":[\"Noto Sans Bold\"],\"text-field\":\"{name:latin}\",\"text-size\":{\"stops\":[[3,11],[7,17]]},\"text-transform\":\"uppercase\",\"text-max-width\":6.25,\"visibility\":\"visible\"},\"paint\":{\"text-halo-blur\":1,\"text-color\":\"#334\",\"text-halo-width\":2,\"text-halo-color\":\"rgba(255,255,255,0.8)\"}},{\"id\":\"place-country-2\",\"type\":\"symbol\",\"metadata\":{\"mapbox:group\":\"1444849242106.713\"},\"source\":\"openmaptiles\",\"source-layer\":\"place\",\"filter\":[\"all\",[\"==\",\"class\",\"country\"],[\"==\",\"rank\",2],[\"has\",\"iso_a2\"]],\"layout\":{\"text-font\":[\"Noto Sans Bold\"],\"text-field\":\"{name:latin}\",\"text-size\":{\"stops\":[[2,11],[5,17]]},\"text-transform\":\"uppercase\",\"text-max-width\":6.25,\"visibility\":\"visible\"},\"paint\":{\"text-halo-blur\":1,\"text-color\":\"#334\",\"text-halo-width\":2,\"text-halo-color\":\"rgba(255,255,255,0.8)\"}},{\"id\":\"place-country-1\",\"type\":\"symbol\",\"metadata\":{\"mapbox:group\":\"1444849242106.713\"},\"source\":\"openmaptiles\",\"source-layer\":\"place\",\"filter\":[\"all\",[\"==\",\"class\",\"country\"],[\"==\",\"rank\",1],[\"has\",\"iso_a2\"]],\"layout\":{\"text-font\":[\"Noto Sans Bold\"],\"text-field\":\"{name:latin}\",\"text-size\":{\"stops\":[[1,11],[4,17]]},\"text-transform\":\"uppercase\",\"text-max-width\":6.25,\"visibility\":\"visible\"},\"paint\":{\"text-halo-blur\":1,\"text-color\":\"#334\",\"text-halo-width\":2,\"text-halo-color\":\"rgba(255,255,255,0.8)\"}},{\"id\":\"place-continent\",\"type\":\"symbol\",\"metadata\":{\"mapbox:group\":\"1444849242106.713\"},\"source\":\"openmaptiles\",\"source-layer\":\"place\",\"maxzoom\":1,\"filter\":[\"==\",\"class\",\"continent\"],\"layout\":{\"text-font\":[\"Noto Sans Bold\"],\"text-field\":\"{name:latin}\",\"text-size\":14,\"text-max-width\":6.25,\"text-transform\":\"uppercase\",\"visibility\":\"visible\"},\"paint\":{\"text-halo-blur\":1,\"text-color\":\"#334\",\"text-halo-width\":2,\"text-halo-color\":\"rgba(255,255,255,0.8)\"}}],\"id\":\"qebnlkra6\"}')},51962:function(t){\"use strict\";t.exports=JSON.parse('{\"version\":8,\"name\":\"orto\",\"metadata\":{},\"center\":[1.537786,41.837539],\"zoom\":12,\"bearing\":0,\"pitch\":0,\"light\":{\"anchor\":\"viewport\",\"color\":\"white\",\"intensity\":0.4,\"position\":[1.15,45,30]},\"sources\":{\"ortoEsri\":{\"type\":\"raster\",\"tiles\":[\"https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}\"],\"tileSize\":256,\"maxzoom\":18,\"attribution\":\"ESRI © ESRI\"},\"ortoInstaMaps\":{\"type\":\"raster\",\"tiles\":[\"https://tilemaps.icgc.cat/mapfactory/wmts/orto_8_12/CAT3857/{z}/{x}/{y}.png\"],\"tileSize\":256,\"maxzoom\":13},\"ortoICGC\":{\"type\":\"raster\",\"tiles\":[\"https://geoserveis.icgc.cat/icc_mapesmultibase/noutm/wmts/orto/GRID3857/{z}/{x}/{y}.jpeg\"],\"tileSize\":256,\"minzoom\":13.1,\"maxzoom\":20},\"openmaptiles\":{\"type\":\"vector\",\"url\":\"https://geoserveis.icgc.cat/contextmaps/basemap.json\"}},\"sprite\":\"https://geoserveis.icgc.cat/contextmaps/sprites/sprite@1\",\"glyphs\":\"https://geoserveis.icgc.cat/contextmaps/glyphs/{fontstack}/{range}.pbf\",\"layers\":[{\"id\":\"background\",\"type\":\"background\",\"paint\":{\"background-color\":\"#F4F9F4\"}},{\"id\":\"ortoEsri\",\"type\":\"raster\",\"source\":\"ortoEsri\",\"maxzoom\":16,\"layout\":{\"visibility\":\"visible\"}},{\"id\":\"ortoICGC\",\"type\":\"raster\",\"source\":\"ortoICGC\",\"minzoom\":13.1,\"maxzoom\":19,\"layout\":{\"visibility\":\"visible\"}},{\"id\":\"ortoInstaMaps\",\"type\":\"raster\",\"source\":\"ortoInstaMaps\",\"maxzoom\":13,\"layout\":{\"visibility\":\"visible\"}}]}')}},e={};function r(n){var i=e[n];if(void 0!==i)return i.exports;var a=e[n]={id:n,exports:{}};return t[n].call(a.exports,a,a.exports,r),a.exports}return r.m=t,r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,{a:e}),e},r.d=function(t,e){for(var n in e)r.o(e,n)&&!r.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},r.g=function(){if(\"object\"==typeof globalThis)return globalThis;try{return this||new Function(\"return this\")()}catch(t){if(\"object\"==typeof window)return window}}(),r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.r=function(t){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(t,\"__esModule\",{value:!0})},r.b=document.baseURI||self.location.href,r.nc=void 0,r(20260)}()}));
\n", "\n", "" ], @@ -1991,49 +2225,17 @@ } ], "source": [ - "batch_inference_run.artifact(\"drift_table_plot\").show()" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{'batch_id': '3d5f6aa8a2d63cc0e84ebd95a0bc0000979a0989bbf4c211651a4e2a',\n", - " 'drift_status': True,\n", - " 'drift_metric': 0.4478631590778279}" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "batch_inference_run.status.results" + "# Plot the drift table artifact\n", + "drift_table_plot_artifact = project.get_artifact(\"drift_table_plot\")\n", + "drift_table_plot_artifact.to_dataitem().show()" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { "kernelspec": { - "display_name": "mlrun-base", + "display_name": "mlrun-extended", "language": "python", - "name": "conda-env-mlrun-base-py" + "name": "conda-env-mlrun-extended-py" }, "language_info": { "codemirror_mode": { @@ -2045,7 +2247,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.16" + "version": "3.9.18" } }, "nbformat": 4, diff --git a/batch_inference_v2/batch_inference_v2.py b/batch_inference_v2/batch_inference_v2.py index 1d4d9ec76..78f9a709a 100644 --- a/batch_inference_v2/batch_inference_v2.py +++ b/batch_inference_v2/batch_inference_v2.py @@ -112,27 +112,26 @@ def infer( artifacts_tag: str = "", # Drift analysis parameters perform_drift_analysis: bool = None, - trigger_monitoring_job: bool = False, - batch_image_job: str = "mlrun/mlrun", endpoint_id: str = "", # The following model endpoint parameters are relevant only if: # perform drift analysis is not disabled # a new model endpoint record is going to be generated model_endpoint_name: str = "batch-infer", - model_endpoint_drift_threshold: float = 0.7, - model_endpoint_possible_drift_threshold: float = 0.5, model_endpoint_sample_set: Union[ mlrun.DataItem, list, dict, pd.DataFrame, pd.Series, np.ndarray ] = None, **predict_kwargs: Dict[str, Any], ): """ - Perform a prediction on a given dataset with the given model. Please make sure that you have already logged the model - under the current project. - Can perform drift analysis between the sample set statistics stored in the model to the current input data. The - drift rule is the value per-feature mean of the TVD and Hellinger scores according to the thresholds configures - here. When performing drift analysis, this function either uses an existing model endpoint record or creates - a new one. + Perform a prediction on the provided dataset using the specified model. + Ensure that the model has already been logged under the current project. + + If you wish to apply monitoring tools (e.g., drift analysis), set the perform_drift_analysis parameter to True. + This will create a new model endpoint record under the specified model_endpoint_name. + Additionally, ensure that model monitoring is enabled at the project level by calling the + project.enable_model_monitoring() function. You can also apply monitoring to an existing model by providing its + endpoint id or name, and the monitoring tools will be applied to that endpoint. + At the moment, this function is supported for `mlrun>=1.5.0` versions. :param context: MLRun context. @@ -160,26 +159,17 @@ def infer( 'prediction'. :param batch_id: The ID of the given batch (inference dataset). If `None`, it will be generated. Will be logged as a result of the run. - :param artifacts_tag: Tag to use for all the artifacts resulted from the function (result set and - model monitoring artifacts) + :param artifacts_tag: Tag to use for prediction set result artifact. :param perform_drift_analysis: Whether to perform drift analysis between the sample set of the model object to the dataset given. By default, None, which means it will perform drift analysis if the model already has feature stats that are considered as a reference sample set. Performing drift analysis on a new endpoint id will generate a new model endpoint - record. Please note that in order to trigger the drift analysis job, you need to - set `trigger_monitoring_job=True`. Otherwise, the drift analysis will be triggered - only as part the scheduled monitoring job (if exist in the current project) or - if triggered manually by the user. - :param trigger_monitoring_job: Whether to trigger the batch drift analysis after the infer job. - :param batch_image_job: The image that will be used to register the monitoring batch job if not exist. - By default, the image is mlrun/mlrun. + record. :param endpoint_id: Model endpoint unique ID. If `perform_drift_analysis` was set, the endpoint_id will be used either to perform the analysis on existing model endpoint or to generate a new model endpoint record. :param model_endpoint_name: If a new model endpoint is generated, the model name will be presented under this endpoint. - :param model_endpoint_drift_threshold: The threshold of which to mark drifts. Defaulted to 0.7. - :param model_endpoint_possible_drift_threshold: The threshold of which to mark possible drifts. Defaulted to 0.5. :param model_endpoint_sample_set: A sample dataset to give to compare the inputs in the drift analysis. Can be provided as an input (DataItem) or as a parameter (e.g. string, list, DataFrame). The default chosen sample set will always be the one who is set in the model artifact itself. @@ -260,9 +250,4 @@ def infer( model_endpoint_name=model_endpoint_name, infer_results_df=result_set.copy(), sample_set_statistics=sample_set_statistics, - drift_threshold=model_endpoint_drift_threshold, - possible_drift_threshold=model_endpoint_possible_drift_threshold, - artifacts_tag=artifacts_tag, - trigger_monitoring_job=trigger_monitoring_job, - default_batch_image=batch_image_job, ) diff --git a/batch_inference_v2/function.yaml b/batch_inference_v2/function.yaml index 653346c02..0db7b6366 100644 --- a/batch_inference_v2/function.yaml +++ b/batch_inference_v2/function.yaml @@ -1,45 +1,29 @@ kind: job -metadata: - name: batch-inference-v2 - tag: '' - hash: cfe7a24a5d05a7d6b9f03d119d9f2661e48db0f5 - project: '' - labels: - author: eyald - categories: - - utils - - data-analysis - - monitoring +verbose: false spec: - command: '' - args: [] - image: mlrun/mlrun - build: - functionSourceCode: IyBDb3B5cmlnaHQgMjAyMyBJZ3VhemlvCiMKIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgpmcm9tIGluc3BlY3QgaW1wb3J0IHNpZ25hdHVyZQpmcm9tIHR5cGluZyBpbXBvcnQgQW55LCBEaWN0LCBMaXN0LCBVbmlvbgppbXBvcnQgbWxydW4KCnRyeToKICAgIGltcG9ydCBtbHJ1bi5tb2RlbF9tb25pdG9yaW5nLmFwaQpleGNlcHQgTW9kdWxlTm90Rm91bmRFcnJvcjoKICAgIHJhaXNlIG1scnVuLmVycm9ycy5NTFJ1bk5vdEZvdW5kRXJyb3IoCiAgICAgICAgZiJQbGVhc2UgdXBkYXRlIHlvdXIgYG1scnVuYCB2ZXJzaW9uIHRvID49MS41LjAgb3IgdXNlIGFuICIKICAgICAgICBmIm9sZGVyIHZlcnNpb24gb2YgdGhlIGJhdGNoIGluZmVyZW5jZSBmdW5jdGlvbi4iCiAgICApCgppbXBvcnQgbnVtcHkgYXMgbnAKaW1wb3J0IHBhbmRhcyBhcyBwZApmcm9tIG1scnVuLmZyYW1ld29ya3MuYXV0b19tbHJ1biBpbXBvcnQgQXV0b01MUnVuCgoKZGVmIF9wcmVwYXJlX3Jlc3VsdF9zZXQoCiAgICAgICAgeDogcGQuRGF0YUZyYW1lLCBsYWJlbF9jb2x1bW5zOiBMaXN0W3N0cl0sIHlfcHJlZDogbnAubmRhcnJheQopIC0+IHBkLkRhdGFGcmFtZToKICAgICIiIgogICAgU2V0IGRlZmF1bHQgbGFiZWwgY29sdW1uIG5hbWVzIGFuZCB2YWxpZGF0ZSBnaXZlbiBuYW1lcyB0byBwcmVwYXJlIHRoZSByZXN1bHQgc2V0IC0gYSBjb25jYXRlbmF0aW9uIG9mIHRoZSBpbnB1dHMKICAgICh4KSBhbmQgdGhlIG1vZGVsIHByZWRpY3Rpb25zICh5X3ByZWQpLgoKICAgIDpwYXJhbSB4OiAgICAgICAgICAgICBUaGUgaW5wdXRzLgogICAgOnBhcmFtIGxhYmVsX2NvbHVtbnM6IEEgbGlzdCBvZiBzdHJpbmdzIHJlcHJlc2VudGluZyB0aGUgdGFyZ2V0IGNvbHVtbiBuYW1lcyB0byBhZGQgdG8gdGhlIHByZWRpY3Rpb25zLiBEZWZhdWx0IG5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHVzZWQgaW4gY2FzZSB0aGUgbGlzdCBpcyBlbXB0eSAocHJlZGljdGVkX2xhYmVsX3tpfSkuCiAgICA6cGFyYW0geV9wcmVkOiAgICAgICAgVGhlIG1vZGVsIHByZWRpY3Rpb25zIG9uIHRoZSBpbnB1dHMuCgogICAgOnJldHVybnM6IFRoZSByZXN1bHQgc2V0LgoKICAgIHJhaXNlcyBNTFJ1bkludmFsaWRBcmd1bWVudEVycm9yOiBJZiB0aGUgbGFiZWxzIGNvbHVtbnMgYW1vdW50IGRvIG5vdCBtYXRjaCB0aGUgb3V0cHV0cyBvciBpZiBvbmUgb2YgdGhlIGxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgZGF0YXNldC4KICAgICIiIgogICAgIyBQcmVwYXJlIGRlZmF1bHQgdGFyZ2V0IGNvbHVtbnMgbmFtZXMgaWYgbm90IHByb3ZpZGVkOgogICAgcHJlZGljdGlvbl9jb2x1bW5zX2Ftb3VudCA9IDEgaWYgbGVuKHlfcHJlZC5zaGFwZSkgPT0gMSBlbHNlIHlfcHJlZC5zaGFwZVsxXQogICAgaWYgbGVuKGxhYmVsX2NvbHVtbnMpID09IDA6CiAgICAgICAgIyBBZGQgZGVmYXVsdCBsYWJlbCBjb2x1bW4gbmFtZXM6CiAgICAgICAgaWYgcHJlZGljdGlvbl9jb2x1bW5zX2Ftb3VudCA9PSAxOgogICAgICAgICAgICBsYWJlbF9jb2x1bW5zID0gWyJwcmVkaWN0ZWRfbGFiZWwiXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGxhYmVsX2NvbHVtbnMgPSBbCiAgICAgICAgICAgICAgICBmInByZWRpY3RlZF9sYWJlbF97aX0iIGZvciBpIGluIHJhbmdlKHByZWRpY3Rpb25fY29sdW1uc19hbW91bnQpCiAgICAgICAgICAgIF0KCiAgICAjIFZhbGlkYXRlIHRoZSBsYWJlbCBjb2x1bW5zOgogICAgaWYgcHJlZGljdGlvbl9jb2x1bW5zX2Ftb3VudCAhPSBsZW4obGFiZWxfY29sdW1ucyk6CiAgICAgICAgIyBObyBlcXVhbGl0eSBiZXR3ZWVuIHByb3ZpZGVkIGxhYmVsIGNvbHVtbiBuYW1lcyBhbmQgb3V0cHV0cyBhbW91bnQ6CiAgICAgICAgcmFpc2UgbWxydW4uZXJyb3JzLk1MUnVuSW52YWxpZEFyZ3VtZW50RXJyb3IoCiAgICAgICAgICAgIGYiVGhlIG51bWJlciBvZiBwcmVkaWN0ZWQgbGFiZWxzOiB7cHJlZGljdGlvbl9jb2x1bW5zX2Ftb3VudH0gIgogICAgICAgICAgICBmImlzIG5vdCBlcXVhbCB0byB0aGUgZ2l2ZW4gbGFiZWwgY29sdW1uczoge2xlbihsYWJlbF9jb2x1bW5zKX0iCiAgICAgICAgKQogICAgY29tbW9uX2xhYmVscyA9IHNldChsYWJlbF9jb2x1bW5zKSAmIHNldCh4LmNvbHVtbnMudG9saXN0KCkpCiAgICBpZiBjb21tb25fbGFiZWxzOgogICAgICAgICMgTGFiZWwgY29sdW1uIGV4aXN0IGluIHRoZSBvcmlnaW5hbCBpbnB1dHM6CiAgICAgICAgcmFpc2UgbWxydW4uZXJyb3JzLk1MUnVuSW52YWxpZEFyZ3VtZW50RXJyb3IoCiAgICAgICAgICAgIGYiVGhlIGxhYmVsczoge2NvbW1vbl9sYWJlbHN9IGFyZSBhbHJlYWR5IGV4aXN0ZWQgaW4gdGhlIGdpdmVuIGRhdGFzZXQuIgogICAgICAgICkKCiAgICByZXR1cm4gcGQuY29uY2F0KAogICAgICAgIFt4LCBwZC5EYXRhRnJhbWUoeV9wcmVkLCBjb2x1bW5zPWxhYmVsX2NvbHVtbnMsIGluZGV4PXguaW5kZXgpXSwgYXhpcz0xCiAgICApCgoKZGVmIF9nZXRfZ2V0X3NhbXBsZV9zZXRfc3RhdGlzdGljc19wYXJhbWV0ZXJzKGNvbnRleHQsIG1vZGVsX2VuZHBvaW50X3NhbXBsZV9zZXQsIG1vZGVsX2FydGlmYWN0X2ZlYXR1cmVfc3RhdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlX2NvbHVtbnMsIGRyb3BfY29sdW1ucywgbGFiZWxfY29sdW1ucyk6CiAgICBzdGF0aWNzX2lucHV0X2Z1bGxfZGljdCA9IGRpY3Qoc2FtcGxlX3NldD1tb2RlbF9lbmRwb2ludF9zYW1wbGVfc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX2FydGlmYWN0X2ZlYXR1cmVfc3RhdHM9bW9kZWxfYXJ0aWZhY3RfZmVhdHVyZV9zdGF0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVfc2V0X2NvbHVtbnM9ZmVhdHVyZV9jb2x1bW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZV9zZXRfZHJvcF9jb2x1bW5zPWRyb3BfY29sdW1ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVfc2V0X2xhYmVsX2NvbHVtbnM9bGFiZWxfY29sdW1ucykKICAgIGdldF9zYW1wbGVfc3RhdGljc19mdW5jdGlvbiA9IG1scnVuLm1vZGVsX21vbml0b3JpbmcuYXBpLmdldF9zYW1wbGVfc2V0X3N0YXRpc3RpY3MKICAgIHN0YXRpY3NfZnVuY3Rpb25faW5wdXRfZGljdCA9IHNpZ25hdHVyZShnZXRfc2FtcGxlX3N0YXRpY3NfZnVuY3Rpb24pLnBhcmFtZXRlcnMKICAgICMgIEFzIGEgcmVzdWx0IG9mIGNoYW5nZXMgdG8gaW5wdXQgcGFyYW1ldGVycyBpbiB0aGUgbWxydW4tZ2V0X3NhbXBsZV9zZXRfc3RhdGlzdGljcyBmdW5jdGlvbiwKICAgICMgIHdlIHdpbGwgbm93IHNlbmQgb25seSB0aGUgcGFyYW1ldGVycyBpdCBleHBlY3RzLgogICAgc3RhdGljc19pbnB1dF9maWx0ZXJlZCA9IHtrZXk6IHN0YXRpY3NfaW5wdXRfZnVsbF9kaWN0W2tleV0gZm9yIGtleSBpbiBzdGF0aWNzX2Z1bmN0aW9uX2lucHV0X2RpY3R9CiAgICBpZiBsZW4oc3RhdGljc19pbnB1dF9maWx0ZXJlZCkgIT0gbGVuKHN0YXRpY3NfZnVuY3Rpb25faW5wdXRfZGljdCk6CiAgICAgICAgY29udGV4dC5sb2dnZXIud2FybmluZygiZ2V0X3NhbXBsZV9zZXRfc3RhdGlzdGljcyBpcyBpbiBhbiBvbGRlciB2ZXJzaW9uOyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic29tZSBwYXJhbWV0ZXJzIHdpbGwgbm90IGJlIHNlbnQgdG8gdGhlIGZ1bmN0aW9uLiIpCiAgICByZXR1cm4gc3RhdGljc19pbnB1dF9maWx0ZXJlZAoKCmRlZiBpbmZlcigKICAgIGNvbnRleHQ6IG1scnVuLk1MQ2xpZW50Q3R4LAogICAgZGF0YXNldDogVW5pb25bbWxydW4uRGF0YUl0ZW0sIGxpc3QsIGRpY3QsIHBkLkRhdGFGcmFtZSwgcGQuU2VyaWVzLCBucC5uZGFycmF5XSwKICAgIG1vZGVsX3BhdGg6IFVuaW9uW3N0ciwgbWxydW4uRGF0YUl0ZW1dLAogICAgZHJvcF9jb2x1bW5zOiBVbmlvbltzdHIsIExpc3Rbc3RyXSwgaW50LCBMaXN0W2ludF1dID0gTm9uZSwKICAgIGxhYmVsX2NvbHVtbnM6IFVuaW9uW3N0ciwgTGlzdFtzdHJdXSA9IE5vbmUsCiAgICBmZWF0dXJlX2NvbHVtbnM6IFVuaW9uW3N0ciwgTGlzdFtzdHJdXSA9IE5vbmUsCiAgICBsb2dfcmVzdWx0X3NldDogYm9vbCA9IFRydWUsCiAgICByZXN1bHRfc2V0X25hbWU6IHN0ciA9ICJwcmVkaWN0aW9uIiwKICAgIGJhdGNoX2lkOiBzdHIgPSBOb25lLAogICAgYXJ0aWZhY3RzX3RhZzogc3RyID0gIiIsCiAgICAjIERyaWZ0IGFuYWx5c2lzIHBhcmFtZXRlcnMKICAgIHBlcmZvcm1fZHJpZnRfYW5hbHlzaXM6IGJvb2wgPSBOb25lLAogICAgdHJpZ2dlcl9tb25pdG9yaW5nX2pvYjogYm9vbCA9IEZhbHNlLAogICAgYmF0Y2hfaW1hZ2Vfam9iOiBzdHIgPSAibWxydW4vbWxydW4iLAogICAgZW5kcG9pbnRfaWQ6IHN0ciA9ICIiLAogICAgIyBUaGUgZm9sbG93aW5nIG1vZGVsIGVuZHBvaW50IHBhcmFtZXRlcnMgYXJlIHJlbGV2YW50IG9ubHkgaWY6CiAgICAjIHBlcmZvcm0gZHJpZnQgYW5hbHlzaXMgaXMgbm90IGRpc2FibGVkCiAgICAjIGEgbmV3IG1vZGVsIGVuZHBvaW50IHJlY29yZCBpcyBnb2luZyB0byBiZSBnZW5lcmF0ZWQKICAgIG1vZGVsX2VuZHBvaW50X25hbWU6IHN0ciA9ICJiYXRjaC1pbmZlciIsCiAgICBtb2RlbF9lbmRwb2ludF9kcmlmdF90aHJlc2hvbGQ6IGZsb2F0ID0gMC43LAogICAgbW9kZWxfZW5kcG9pbnRfcG9zc2libGVfZHJpZnRfdGhyZXNob2xkOiBmbG9hdCA9IDAuNSwKICAgIG1vZGVsX2VuZHBvaW50X3NhbXBsZV9zZXQ6IFVuaW9uWwogICAgICAgIG1scnVuLkRhdGFJdGVtLCBsaXN0LCBkaWN0LCBwZC5EYXRhRnJhbWUsIHBkLlNlcmllcywgbnAubmRhcnJheQogICAgXSA9IE5vbmUsCiAgICAqKnByZWRpY3Rfa3dhcmdzOiBEaWN0W3N0ciwgQW55XSwKKToKICAgICIiIgogICAgUGVyZm9ybSBhIHByZWRpY3Rpb24gb24gYSBnaXZlbiBkYXRhc2V0IHdpdGggdGhlIGdpdmVuIG1vZGVsLiBQbGVhc2UgbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgYWxyZWFkeSBsb2dnZWQgdGhlIG1vZGVsCiAgICB1bmRlciB0aGUgY3VycmVudCBwcm9qZWN0LgogICAgQ2FuIHBlcmZvcm0gZHJpZnQgYW5hbHlzaXMgYmV0d2VlbiB0aGUgc2FtcGxlIHNldCBzdGF0aXN0aWNzIHN0b3JlZCBpbiB0aGUgbW9kZWwgdG8gdGhlIGN1cnJlbnQgaW5wdXQgZGF0YS4gVGhlCiAgICBkcmlmdCBydWxlIGlzIHRoZSB2YWx1ZSBwZXItZmVhdHVyZSBtZWFuIG9mIHRoZSBUVkQgYW5kIEhlbGxpbmdlciBzY29yZXMgYWNjb3JkaW5nIHRvIHRoZSB0aHJlc2hvbGRzIGNvbmZpZ3VyZXMKICAgIGhlcmUuIFdoZW4gcGVyZm9ybWluZyBkcmlmdCBhbmFseXNpcywgdGhpcyBmdW5jdGlvbiBlaXRoZXIgdXNlcyBhbiBleGlzdGluZyBtb2RlbCBlbmRwb2ludCByZWNvcmQgb3IgY3JlYXRlcwogICAgYSBuZXcgb25lLgogICAgQXQgdGhlIG1vbWVudCwgdGhpcyBmdW5jdGlvbiBpcyBzdXBwb3J0ZWQgZm9yIGBtbHJ1bj49MS41LjBgIHZlcnNpb25zLgoKICAgIDpwYXJhbSBjb250ZXh0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1MUnVuIGNvbnRleHQuCiAgICA6cGFyYW0gZGF0YXNldDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGF0YXNldCB0byBpbmZlciB0aHJvdWdoIHRoZSBtb2RlbC4gUHJvdmlkZWQgYXMgYW4gaW5wdXQgKERhdGFJdGVtKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCByZXByZXNlbnRzIERhdGFzZXQgYXJ0aWZhY3QgLyBGZWF0dXJlIHZlY3RvciBVUkkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB1c2luZyBNTFJ1biBTREssIGBkYXRhc2V0YCBjYW4gYWxzbyBiZSBwcm92aWRlZCBhcyBhIGxpc3QsIGRpY3Rpb25hcnkgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bXB5IGFycmF5LgogICAgOnBhcmFtIG1vZGVsX3BhdGg6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZWwgc3RvcmUgdXJpIChzaG91bGQgc3RhcnQgd2l0aCBzdG9yZTovLykuIFByb3ZpZGVkIGFzIGFuIGlucHV0IChEYXRhSXRlbSkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB1c2luZyBNTFJ1biBTREssIGBtb2RlbF9wYXRoYCBjYW4gYWxzbyBiZSBwcm92aWRlZCBhcyBhIHBhcmFtZXRlciAoc3RyaW5nKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvIGdlbmVyYXRlIGEgdmFsaWQgbW9kZWwgc3RvcmUgVVJJLCBwbGVhc2UgbG9nIHRoZSBtb2RlbCBiZWZvcmUgcnVubmluZyB0aGlzIGZ1bmN0aW9uLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgYGVuZHBvaW50X2lkYCBvZiBleGlzdGluZyBtb2RlbCBlbmRwb2ludCBpcyBwcm92aWRlZCwgbWFrZSBzdXJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGl0IGhhcyBhIHNpbWlsYXIgbW9kZWwgc3RvcmUgcGF0aCwgb3RoZXJ3aXNlIHRoZSBkcmlmdCBhbmFseXNpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29uJ3QgYmUgdHJpZ2dlcmVkLgogICAgOnBhcmFtIGRyb3BfY29sdW1uczogICAgICAgICAgICAgICAgICAgICAgICAgICAgQSBzdHJpbmcgLyBpbnRlZ2VyIG9yIGEgbGlzdCBvZiBzdHJpbmdzIC8gaW50ZWdlcnMgdGhhdCByZXByZXNlbnQgdGhlIGNvbHVtbiBuYW1lcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBpbmRpY2VzIHRvIGRyb3AuIFdoZW4gdGhlIGRhdGFzZXQgaXMgYSBsaXN0IG9yIGEgbnVtcHkgYXJyYXkgdGhpcyBwYXJhbWV0ZXIgbXVzdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgcmVwcmVzZW50ZWQgYnkgaW50ZWdlcnMuCiAgICA6cGFyYW0gbGFiZWxfY29sdW1uczogICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgdGFyZ2V0IGxhYmVsKHMpIG9mIHRoZSBjb2x1bW4ocykgaW4gdGhlIGRhdGFzZXQgZm9yIFJlZ3Jlc3Npb24gb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzaWZpY2F0aW9uIHRhc2tzLiBUaGUgbGFiZWwgY29sdW1uIGNhbiBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBtb2RlbCBvYmplY3QsIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZmVhdHVyZSB2ZWN0b3IgcHJvdmlkZWQgaWYgYXZhaWxhYmxlLgogICAgOnBhcmFtIGZlYXR1cmVfY29sdW1uczogICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCBvZiBmZWF0dXJlIGNvbHVtbnMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gYnVpbGQgdGhlIGRhdGFmcmFtZSB3aGVuIGRhdGFzZXQgaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdHlwZSBsaXN0IG9yIG51bXB5IGFycmF5LgogICAgOnBhcmFtIGxvZ19yZXN1bHRfc2V0OiAgICAgICAgICAgICAgICAgICAgICAgICAgV2hldGhlciB0byBsb2cgdGhlIHJlc3VsdCBzZXQgLSBhIERhdGFGcmFtZSBvZiB0aGUgZ2l2ZW4gaW5wdXRzIGNvbmNhdGVuYXRlZCB3aXRoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcHJlZGljdGlvbnMuIERlZmF1bHRlZCB0byBUcnVlLgogICAgOnBhcmFtIHJlc3VsdF9zZXRfbmFtZTogICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRiIGtleSB0byBzZXQgbmFtZSBvZiB0aGUgcHJlZGljdGlvbiByZXN1bHQgYW5kIHRoZSBmaWxlbmFtZS4gRGVmYXVsdGVkIHRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJlZGljdGlvbicuCiAgICA6cGFyYW0gYmF0Y2hfaWQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgSUQgb2YgdGhlIGdpdmVuIGJhdGNoIChpbmZlcmVuY2UgZGF0YXNldCkuIElmIGBOb25lYCwgaXQgd2lsbCBiZSBnZW5lcmF0ZWQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWxsIGJlIGxvZ2dlZCBhcyBhIHJlc3VsdCBvZiB0aGUgcnVuLgogICAgOnBhcmFtIGFydGlmYWN0c190YWc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFnIHRvIHVzZSBmb3IgYWxsIHRoZSBhcnRpZmFjdHMgcmVzdWx0ZWQgZnJvbSB0aGUgZnVuY3Rpb24gKHJlc3VsdCBzZXQgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCBtb25pdG9yaW5nIGFydGlmYWN0cykKICAgIDpwYXJhbSBwZXJmb3JtX2RyaWZ0X2FuYWx5c2lzOiAgICAgICAgICAgICAgICAgIFdoZXRoZXIgdG8gcGVyZm9ybSBkcmlmdCBhbmFseXNpcyBiZXR3ZWVuIHRoZSBzYW1wbGUgc2V0IG9mIHRoZSBtb2RlbCBvYmplY3QgdG8gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhc2V0IGdpdmVuLiBCeSBkZWZhdWx0LCBOb25lLCB3aGljaCBtZWFucyBpdCB3aWxsIHBlcmZvcm0gZHJpZnQgYW5hbHlzaXMgaWYgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCBhbHJlYWR5IGhhcyBmZWF0dXJlIHN0YXRzIHRoYXQgYXJlIGNvbnNpZGVyZWQgYXMgYSByZWZlcmVuY2Ugc2FtcGxlIHNldC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1pbmcgZHJpZnQgYW5hbHlzaXMgb24gYSBuZXcgZW5kcG9pbnQgaWQgd2lsbCBnZW5lcmF0ZSBhIG5ldyBtb2RlbCBlbmRwb2ludAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkLiBQbGVhc2Ugbm90ZSB0aGF0IGluIG9yZGVyIHRvIHRyaWdnZXIgdGhlIGRyaWZ0IGFuYWx5c2lzIGpvYiwgeW91IG5lZWQgdG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCBgdHJpZ2dlcl9tb25pdG9yaW5nX2pvYj1UcnVlYC4gT3RoZXJ3aXNlLCB0aGUgZHJpZnQgYW5hbHlzaXMgd2lsbCBiZSB0cmlnZ2VyZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkgYXMgcGFydCB0aGUgc2NoZWR1bGVkIG1vbml0b3Jpbmcgam9iIChpZiBleGlzdCBpbiB0aGUgY3VycmVudCBwcm9qZWN0KSBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdHJpZ2dlcmVkIG1hbnVhbGx5IGJ5IHRoZSB1c2VyLgogICAgOnBhcmFtIHRyaWdnZXJfbW9uaXRvcmluZ19qb2I6ICAgICAgICAgICAgICAgICAgV2hldGhlciB0byB0cmlnZ2VyIHRoZSBiYXRjaCBkcmlmdCBhbmFseXNpcyBhZnRlciB0aGUgaW5mZXIgam9iLgogICAgOnBhcmFtIGJhdGNoX2ltYWdlX2pvYjogICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGltYWdlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHJlZ2lzdGVyIHRoZSBtb25pdG9yaW5nIGJhdGNoIGpvYiBpZiBub3QgZXhpc3QuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeSBkZWZhdWx0LCB0aGUgaW1hZ2UgaXMgbWxydW4vbWxydW4uCiAgICA6cGFyYW0gZW5kcG9pbnRfaWQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RlbCBlbmRwb2ludCB1bmlxdWUgSUQuIElmIGBwZXJmb3JtX2RyaWZ0X2FuYWx5c2lzYCB3YXMgc2V0LCB0aGUgZW5kcG9pbnRfaWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgdXNlZCBlaXRoZXIgdG8gcGVyZm9ybSB0aGUgYW5hbHlzaXMgb24gZXhpc3RpbmcgbW9kZWwgZW5kcG9pbnQgb3IgdG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlIGEgbmV3IG1vZGVsIGVuZHBvaW50IHJlY29yZC4KICAgIDpwYXJhbSBtb2RlbF9lbmRwb2ludF9uYW1lOiAgICAgICAgICAgICAgICAgICAgIElmIGEgbmV3IG1vZGVsIGVuZHBvaW50IGlzIGdlbmVyYXRlZCwgdGhlIG1vZGVsIG5hbWUgd2lsbCBiZSBwcmVzZW50ZWQgdW5kZXIgdGhpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnQuCiAgICA6cGFyYW0gbW9kZWxfZW5kcG9pbnRfZHJpZnRfdGhyZXNob2xkOiAgICAgICAgICBUaGUgdGhyZXNob2xkIG9mIHdoaWNoIHRvIG1hcmsgZHJpZnRzLiBEZWZhdWx0ZWQgdG8gMC43LgogICAgOnBhcmFtIG1vZGVsX2VuZHBvaW50X3Bvc3NpYmxlX2RyaWZ0X3RocmVzaG9sZDogVGhlIHRocmVzaG9sZCBvZiB3aGljaCB0byBtYXJrIHBvc3NpYmxlIGRyaWZ0cy4gRGVmYXVsdGVkIHRvIDAuNS4KICAgIDpwYXJhbSBtb2RlbF9lbmRwb2ludF9zYW1wbGVfc2V0OiAgICAgICAgICAgICAgIEEgc2FtcGxlIGRhdGFzZXQgdG8gZ2l2ZSB0byBjb21wYXJlIHRoZSBpbnB1dHMgaW4gdGhlIGRyaWZ0IGFuYWx5c2lzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuIGJlIHByb3ZpZGVkIGFzIGFuIGlucHV0IChEYXRhSXRlbSkgb3IgYXMgYSBwYXJhbWV0ZXIgKGUuZy4gc3RyaW5nLCBsaXN0LCBEYXRhRnJhbWUpLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgY2hvc2VuIHNhbXBsZSBzZXQgd2lsbCBhbHdheXMgYmUgdGhlIG9uZSB3aG8gaXMgc2V0IGluIHRoZSBtb2RlbCBhcnRpZmFjdCBpdHNlbGYuCgogICAgcmFpc2VzIE1MUnVuSW52YWxpZEFyZ3VtZW50RXJyb3I6IGlmIGJvdGggYG1vZGVsX3BhdGhgIGFuZCBgZW5kcG9pbnRfaWRgIGFyZSBub3QgcHJvdmlkZWQKICAgICIiIgoKICAgICMgTG9hZGluZyB0aGUgbW9kZWw6CiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYiTG9hZGluZyBtb2RlbC4uLiIpCiAgICBpZiBpc2luc3RhbmNlKG1vZGVsX3BhdGgsIG1scnVuLkRhdGFJdGVtKToKICAgICAgICBtb2RlbF9wYXRoID0gbW9kZWxfcGF0aC5hcnRpZmFjdF91cmwKICAgIGlmIG5vdCBtbHJ1bi5kYXRhc3RvcmUuaXNfc3RvcmVfdXJpKG1vZGVsX3BhdGgpOgogICAgICAgIHJhaXNlIG1scnVuLmVycm9ycy5NTFJ1bkludmFsaWRBcmd1bWVudEVycm9yKAogICAgICAgICAgICBmIlRoZSBwcm92aWRlZCBtb2RlbCBwYXRoICh7bW9kZWxfcGF0aH0pIGlzIGludmFsaWQgLSBzaG91bGQgc3RhcnQgd2l0aCBgc3RvcmU6Ly9gLiAiCiAgICAgICAgICAgIGYiUGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIGxvZ2dlZCB0aGUgbW9kZWwgdXNpbmcgYHByb2plY3QubG9nX21vZGVsKClgICIKICAgICAgICAgICAgZiJ3aGljaCBnZW5lcmF0ZXMgYSB1bmlxdWUgc3RvcmUgdXJpIGZvciB0aGUgbG9nZ2VkIG1vZGVsLiIKICAgICAgICApCiAgICBtb2RlbF9oYW5kbGVyID0gQXV0b01MUnVuLmxvYWRfbW9kZWwobW9kZWxfcGF0aD1tb2RlbF9wYXRoLCBjb250ZXh0PWNvbnRleHQpCgogICAgaWYgbGFiZWxfY29sdW1ucyBpcyBOb25lOgogICAgICAgIGxhYmVsX2NvbHVtbnMgPSBbCiAgICAgICAgICAgIG91dHB1dC5uYW1lIGZvciBvdXRwdXQgaW4gbW9kZWxfaGFuZGxlci5fbW9kZWxfYXJ0aWZhY3Quc3BlYy5vdXRwdXRzCiAgICAgICAgXQoKICAgIGlmIGZlYXR1cmVfY29sdW1ucyBpcyBOb25lOgogICAgICAgIGZlYXR1cmVfY29sdW1ucyA9IFsKICAgICAgICAgICAgaW5wdXQubmFtZSBmb3IgaW5wdXQgaW4gbW9kZWxfaGFuZGxlci5fbW9kZWxfYXJ0aWZhY3Quc3BlYy5pbnB1dHMKICAgICAgICBdCgogICAgIyBHZXQgZGF0YXNldCBieSBvYmplY3QsIFVSTCBvciBieSBGZWF0dXJlVmVjdG9yOgogICAgY29udGV4dC5sb2dnZXIuaW5mbyhmIkxvYWRpbmcgZGF0YS4uLiIpCiAgICB4LCBsYWJlbF9jb2x1bW5zID0gbWxydW4ubW9kZWxfbW9uaXRvcmluZy5hcGkucmVhZF9kYXRhc2V0X2FzX2RhdGFmcmFtZSgKICAgICAgICBkYXRhc2V0PWRhdGFzZXQsCiAgICAgICAgZmVhdHVyZV9jb2x1bW5zPWZlYXR1cmVfY29sdW1ucywKICAgICAgICBsYWJlbF9jb2x1bW5zPWxhYmVsX2NvbHVtbnMsCiAgICAgICAgZHJvcF9jb2x1bW5zPWRyb3BfY29sdW1ucywKICAgICkKCiAgICAjIFByZWRpY3Q6CiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYiQ2FsY3VsYXRpbmcgcHJlZGljdGlvbi4uLiIpCiAgICB5X3ByZWQgPSBtb2RlbF9oYW5kbGVyLm1vZGVsLnByZWRpY3QoeCwgKipwcmVkaWN0X2t3YXJncykKCiAgICAjIFByZXBhcmUgdGhlIHJlc3VsdCBzZXQ6CiAgICByZXN1bHRfc2V0ID0gX3ByZXBhcmVfcmVzdWx0X3NldCh4PXgsIGxhYmVsX2NvbHVtbnM9bGFiZWxfY29sdW1ucywgeV9wcmVkPXlfcHJlZCkKCiAgICAjIENoZWNrIGZvciBsb2dnaW5nIHRoZSByZXN1bHQgc2V0OgogICAgaWYgbG9nX3Jlc3VsdF9zZXQ6CiAgICAgICAgbWxydW4ubW9kZWxfbW9uaXRvcmluZy5hcGkubG9nX3Jlc3VsdCgKICAgICAgICAgICAgY29udGV4dD1jb250ZXh0LAogICAgICAgICAgICByZXN1bHRfc2V0X25hbWU9cmVzdWx0X3NldF9uYW1lLAogICAgICAgICAgICByZXN1bHRfc2V0PXJlc3VsdF9zZXQsCiAgICAgICAgICAgIGFydGlmYWN0c190YWc9YXJ0aWZhY3RzX3RhZywKICAgICAgICAgICAgYmF0Y2hfaWQ9YmF0Y2hfaWQsCiAgICAgICAgKQoKICAgICMgQ2hlY2sgZm9yIHBlcmZvcm1pbmcgZHJpZnQgYW5hbHlzaXMKICAgIGlmICgKICAgICAgICAgICAgcGVyZm9ybV9kcmlmdF9hbmFseXNpcyBpcyBOb25lCiAgICAgICAgICAgIGFuZCBtb2RlbF9oYW5kbGVyLl9tb2RlbF9hcnRpZmFjdC5zcGVjLmZlYXR1cmVfc3RhdHMgaXMgbm90IE5vbmUKICAgICk6CiAgICAgICAgcGVyZm9ybV9kcmlmdF9hbmFseXNpcyA9IFRydWUKICAgIGlmIHBlcmZvcm1fZHJpZnRfYW5hbHlzaXM6CiAgICAgICAgY29udGV4dC5sb2dnZXIuaW5mbygiUGVyZm9ybWluZyBkcmlmdCBhbmFseXNpcy4uLiIpCiAgICAgICAgIyBHZXQgdGhlIHNhbXBsZSBzZXQgc3RhdGlzdGljcyAoZWl0aGVyIGZyb20gdGhlIHNhbXBsZSBzZXQgb3IgZnJvbSB0aGUgc3RhdGlzdGljcyBsb2dnZWQgd2l0aCB0aGUgbW9kZWwpCiAgICAgICAgc3RhdGljc19pbnB1dF9mdWxsX2RpY3QgPSBkaWN0KGNvbnRleHQ9Y29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfZW5kcG9pbnRfc2FtcGxlX3NldD1tb2RlbF9lbmRwb2ludF9zYW1wbGVfc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9hcnRpZmFjdF9mZWF0dXJlX3N0YXRzPW1vZGVsX2hhbmRsZXIuX21vZGVsX2FydGlmYWN0LnNwZWMuZmVhdHVyZV9zdGF0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZV9jb2x1bW5zPWZlYXR1cmVfY29sdW1ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcF9jb2x1bW5zPWRyb3BfY29sdW1ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxfY29sdW1ucz1sYWJlbF9jb2x1bW5zKQogICAgICAgIHN0YXRpY3NfaW5wdXRfZmlsdGVyZWQgPSBfZ2V0X2dldF9zYW1wbGVfc2V0X3N0YXRpc3RpY3NfcGFyYW1ldGVycygqKnN0YXRpY3NfaW5wdXRfZnVsbF9kaWN0KQogICAgICAgIHNhbXBsZV9zZXRfc3RhdGlzdGljcyA9IG1scnVuLm1vZGVsX21vbml0b3JpbmcuYXBpLmdldF9zYW1wbGVfc2V0X3N0YXRpc3RpY3MoKipzdGF0aWNzX2lucHV0X2ZpbHRlcmVkKQogICAgICAgIG1scnVuLm1vZGVsX21vbml0b3JpbmcuYXBpLnJlY29yZF9yZXN1bHRzKAogICAgICAgICAgICBwcm9qZWN0PWNvbnRleHQucHJvamVjdCwKICAgICAgICAgICAgY29udGV4dD1jb250ZXh0LAogICAgICAgICAgICBlbmRwb2ludF9pZD1lbmRwb2ludF9pZCwKICAgICAgICAgICAgbW9kZWxfcGF0aD1tb2RlbF9wYXRoLAogICAgICAgICAgICBtb2RlbF9lbmRwb2ludF9uYW1lPW1vZGVsX2VuZHBvaW50X25hbWUsCiAgICAgICAgICAgIGluZmVyX3Jlc3VsdHNfZGY9cmVzdWx0X3NldC5jb3B5KCksCiAgICAgICAgICAgIHNhbXBsZV9zZXRfc3RhdGlzdGljcz1zYW1wbGVfc2V0X3N0YXRpc3RpY3MsCiAgICAgICAgICAgIGRyaWZ0X3RocmVzaG9sZD1tb2RlbF9lbmRwb2ludF9kcmlmdF90aHJlc2hvbGQsCiAgICAgICAgICAgIHBvc3NpYmxlX2RyaWZ0X3RocmVzaG9sZD1tb2RlbF9lbmRwb2ludF9wb3NzaWJsZV9kcmlmdF90aHJlc2hvbGQsCiAgICAgICAgICAgIGFydGlmYWN0c190YWc9YXJ0aWZhY3RzX3RhZywKICAgICAgICAgICAgdHJpZ2dlcl9tb25pdG9yaW5nX2pvYj10cmlnZ2VyX21vbml0b3Jpbmdfam9iLAogICAgICAgICAgICBkZWZhdWx0X2JhdGNoX2ltYWdlPWJhdGNoX2ltYWdlX2pvYiwKICAgICAgICApCg== - commands: [] - code_origin: '' - origin_filename: '' - with_mlrun: false - auto_build: false - requirements: [] entry_points: infer: - name: infer - doc: 'Perform a prediction on a given dataset with the given model. Please make - sure that you have already logged the model + has_kwargs: true + lineno: 102 + has_varargs: false + doc: 'Perform a prediction on the provided dataset using the specified model. + + Ensure that the model has already been logged under the current project. + - under the current project. + If you wish to apply monitoring tools (e.g., drift analysis), set the perform_drift_analysis + parameter to True. - Can perform drift analysis between the sample set statistics stored in the - model to the current input data. The + This will create a new model endpoint record under the specified model_endpoint_name. - drift rule is the value per-feature mean of the TVD and Hellinger scores according - to the thresholds configures + Additionally, ensure that model monitoring is enabled at the project level + by calling the - here. When performing drift analysis, this function either uses an existing - model endpoint record or creates + project.enable_model_monitoring() function. You can also apply monitoring + to an existing model by providing its + + endpoint id or name, and the monitoring tools will be applied to that endpoint. - a new one. At the moment, this function is supported for `mlrun>=1.5.0` versions.' parameters: @@ -93,8 +77,7 @@ spec: default: null - name: artifacts_tag type: str - doc: Tag to use for all the artifacts resulted from the function (result set - and model monitoring artifacts) + doc: Tag to use for prediction set result artifact. default: '' - name: perform_drift_analysis type: bool @@ -102,21 +85,8 @@ spec: object to the dataset given. By default, None, which means it will perform drift analysis if the model already has feature stats that are considered as a reference sample set. Performing drift analysis on a new endpoint id - will generate a new model endpoint record. Please note that in order to - trigger the drift analysis job, you need to set `trigger_monitoring_job=True`. - Otherwise, the drift analysis will be triggered only as part the scheduled - monitoring job (if exist in the current project) or if triggered manually - by the user. + will generate a new model endpoint record. default: null - - name: trigger_monitoring_job - type: bool - doc: Whether to trigger the batch drift analysis after the infer job. - default: false - - name: batch_image_job - type: str - doc: The image that will be used to register the monitoring batch job if not - exist. By default, the image is mlrun/mlrun. - default: mlrun/mlrun - name: endpoint_id type: str doc: Model endpoint unique ID. If `perform_drift_analysis` was set, the endpoint_id @@ -128,14 +98,6 @@ spec: doc: If a new model endpoint is generated, the model name will be presented under this endpoint. default: batch-infer - - name: model_endpoint_drift_threshold - type: float - doc: The threshold of which to mark drifts. Defaulted to 0.7. - default: 0.7 - - name: model_endpoint_possible_drift_threshold - type: float - doc: The threshold of which to mark possible drifts. Defaulted to 0.5. - default: 0.5 - name: model_endpoint_sample_set type: Union[DataItem, list, dict, DataFrame, Series, ndarray] doc: A sample dataset to give to compare the inputs in the drift analysis. @@ -143,20 +105,24 @@ spec: DataFrame). The default chosen sample set will always be the one who is set in the model artifact itself. default: null - outputs: [] - lineno: 97 - has_varargs: false - has_kwargs: true + name: infer description: Batch inference (also knows as prediction) for the common ML frameworks (SciKit-Learn, XGBoost and LightGBM) while performing data drift analysis. + allow_empty_resources: true + build: + with_mlrun: false + code_origin: '' + functionSourceCode: IyBDb3B5cmlnaHQgMjAyMyBJZ3VhemlvCiMKIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgpmcm9tIGluc3BlY3QgaW1wb3J0IHNpZ25hdHVyZQpmcm9tIHR5cGluZyBpbXBvcnQgQW55LCBEaWN0LCBMaXN0LCBVbmlvbiwgT3B0aW9uYWwKaW1wb3J0IG1scnVuCgp0cnk6CiAgICBpbXBvcnQgbWxydW4ubW9kZWxfbW9uaXRvcmluZy5hcGkKZXhjZXB0IE1vZHVsZU5vdEZvdW5kRXJyb3I6CiAgICByYWlzZSBtbHJ1bi5lcnJvcnMuTUxSdW5Ob3RGb3VuZEVycm9yKAogICAgICAgIGYiUGxlYXNlIHVwZGF0ZSB5b3VyIGBtbHJ1bmAgdmVyc2lvbiB0byA+PTEuNS4wIG9yIHVzZSBhbiAiCiAgICAgICAgZiJvbGRlciB2ZXJzaW9uIG9mIHRoZSBiYXRjaCBpbmZlcmVuY2UgZnVuY3Rpb24uIgogICAgKQoKaW1wb3J0IG51bXB5IGFzIG5wCmltcG9ydCBwYW5kYXMgYXMgcGQKZnJvbSBtbHJ1bi5mcmFtZXdvcmtzLmF1dG9fbWxydW4gaW1wb3J0IEF1dG9NTFJ1bgoKCmRlZiBfcHJlcGFyZV9yZXN1bHRfc2V0KHg6IHBkLkRhdGFGcmFtZSwgbGFiZWxfY29sdW1uczogTGlzdFtzdHJdLCB5X3ByZWQ6IG5wLm5kYXJyYXkpIC0+IHBkLkRhdGFGcmFtZToKICAgICIiIgogICAgU2V0IGRlZmF1bHQgbGFiZWwgY29sdW1uIG5hbWVzIGFuZCB2YWxpZGF0ZSBnaXZlbiBuYW1lcyB0byBwcmVwYXJlIHRoZSByZXN1bHQgc2V0IC0gYSBjb25jYXRlbmF0aW9uIG9mIHRoZSBpbnB1dHMKICAgICh4KSBhbmQgdGhlIG1vZGVsIHByZWRpY3Rpb25zICh5X3ByZWQpLgoKICAgIDpwYXJhbSB4OiAgICAgICAgICAgICBUaGUgaW5wdXRzLgogICAgOnBhcmFtIGxhYmVsX2NvbHVtbnM6IEEgbGlzdCBvZiBzdHJpbmdzIHJlcHJlc2VudGluZyB0aGUgdGFyZ2V0IGNvbHVtbiBuYW1lcyB0byBhZGQgdG8gdGhlIHByZWRpY3Rpb25zLiBEZWZhdWx0IG5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHVzZWQgaW4gY2FzZSB0aGUgbGlzdCBpcyBlbXB0eSAocHJlZGljdGVkX2xhYmVsX3tpfSkuCiAgICA6cGFyYW0geV9wcmVkOiAgICAgICAgVGhlIG1vZGVsIHByZWRpY3Rpb25zIG9uIHRoZSBpbnB1dHMuCgogICAgOnJldHVybnM6IFRoZSByZXN1bHQgc2V0LgoKICAgIHJhaXNlcyBNTFJ1bkludmFsaWRBcmd1bWVudEVycm9yOiBJZiB0aGUgbGFiZWxzIGNvbHVtbnMgYW1vdW50IGRvIG5vdCBtYXRjaCB0aGUgb3V0cHV0cyBvciBpZiBvbmUgb2YgdGhlIGxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgZGF0YXNldC4KICAgICIiIgogICAgIyBQcmVwYXJlIGRlZmF1bHQgdGFyZ2V0IGNvbHVtbnMgbmFtZXMgaWYgbm90IHByb3ZpZGVkOgogICAgcHJlZGljdGlvbl9jb2x1bW5zX2Ftb3VudCA9IDEgaWYgbGVuKHlfcHJlZC5zaGFwZSkgPT0gMSBlbHNlIHlfcHJlZC5zaGFwZVsxXQogICAgaWYgbGVuKGxhYmVsX2NvbHVtbnMpID09IDA6CiAgICAgICAgIyBBZGQgZGVmYXVsdCBsYWJlbCBjb2x1bW4gbmFtZXM6CiAgICAgICAgaWYgcHJlZGljdGlvbl9jb2x1bW5zX2Ftb3VudCA9PSAxOgogICAgICAgICAgICBsYWJlbF9jb2x1bW5zID0gWyJwcmVkaWN0ZWRfbGFiZWwiXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGxhYmVsX2NvbHVtbnMgPSBbCiAgICAgICAgICAgICAgICBmInByZWRpY3RlZF9sYWJlbF97aX0iIGZvciBpIGluIHJhbmdlKHByZWRpY3Rpb25fY29sdW1uc19hbW91bnQpCiAgICAgICAgICAgIF0KCiAgICAjIFZhbGlkYXRlIHRoZSBsYWJlbCBjb2x1bW5zOgogICAgaWYgcHJlZGljdGlvbl9jb2x1bW5zX2Ftb3VudCAhPSBsZW4obGFiZWxfY29sdW1ucyk6CiAgICAgICAgIyBObyBlcXVhbGl0eSBiZXR3ZWVuIHByb3ZpZGVkIGxhYmVsIGNvbHVtbiBuYW1lcyBhbmQgb3V0cHV0cyBhbW91bnQ6CiAgICAgICAgcmFpc2UgbWxydW4uZXJyb3JzLk1MUnVuSW52YWxpZEFyZ3VtZW50RXJyb3IoCiAgICAgICAgICAgIGYiVGhlIG51bWJlciBvZiBwcmVkaWN0ZWQgbGFiZWxzOiB7cHJlZGljdGlvbl9jb2x1bW5zX2Ftb3VudH0gIgogICAgICAgICAgICBmImlzIG5vdCBlcXVhbCB0byB0aGUgZ2l2ZW4gbGFiZWwgY29sdW1uczoge2xlbihsYWJlbF9jb2x1bW5zKX0iCiAgICAgICAgKQogICAgY29tbW9uX2xhYmVscyA9IHNldChsYWJlbF9jb2x1bW5zKSAmIHNldCh4LmNvbHVtbnMudG9saXN0KCkpCiAgICBpZiBjb21tb25fbGFiZWxzOgogICAgICAgICMgTGFiZWwgY29sdW1uIGV4aXN0IGluIHRoZSBvcmlnaW5hbCBpbnB1dHM6CiAgICAgICAgcmFpc2UgbWxydW4uZXJyb3JzLk1MUnVuSW52YWxpZEFyZ3VtZW50RXJyb3IoCiAgICAgICAgICAgIGYiVGhlIGxhYmVsczoge2NvbW1vbl9sYWJlbHN9IGFyZSBhbHJlYWR5IGV4aXN0ZWQgaW4gdGhlIGdpdmVuIGRhdGFzZXQuIgogICAgICAgICkKCiAgICByZXR1cm4gcGQuY29uY2F0KAogICAgICAgIFt4LCBwZC5EYXRhRnJhbWUoeV9wcmVkLCBjb2x1bW5zPWxhYmVsX2NvbHVtbnMsIGluZGV4PXguaW5kZXgpXSwgYXhpcz0xCiAgICApCgoKZGVmIF9nZXRfc2FtcGxlX3NldF9zdGF0aXN0aWNzX3BhcmFtZXRlcnMoY29udGV4dDogbWxydW4uTUxDbGllbnRDdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX2VuZHBvaW50X3NhbXBsZV9zZXQ6IFVuaW9uWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWxydW4uRGF0YUl0ZW0sIGxpc3QsIGRpY3QsIHBkLkRhdGFGcmFtZSwgcGQuU2VyaWVzLCBucC5uZGFycmF5XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfYXJ0aWZhY3RfZmVhdHVyZV9zdGF0czogZGljdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZV9jb2x1bW5zOiBPcHRpb25hbFtMaXN0XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcF9jb2x1bW5zOiBPcHRpb25hbFtMaXN0XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxfY29sdW1uczogT3B0aW9uYWxbTGlzdF0pIC0+IERpY3Rbc3RyLCBBbnldOgogICAgc3RhdGljc19pbnB1dF9mdWxsX2RpY3QgPSBkaWN0KHNhbXBsZV9zZXQ9bW9kZWxfZW5kcG9pbnRfc2FtcGxlX3NldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9hcnRpZmFjdF9mZWF0dXJlX3N0YXRzPW1vZGVsX2FydGlmYWN0X2ZlYXR1cmVfc3RhdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlX3NldF9jb2x1bW5zPWZlYXR1cmVfY29sdW1ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVfc2V0X2Ryb3BfY29sdW1ucz1kcm9wX2NvbHVtbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlX3NldF9sYWJlbF9jb2x1bW5zPWxhYmVsX2NvbHVtbnMpCiAgICBnZXRfc2FtcGxlX3N0YXRpY3NfZnVuY3Rpb24gPSBtbHJ1bi5tb2RlbF9tb25pdG9yaW5nLmFwaS5nZXRfc2FtcGxlX3NldF9zdGF0aXN0aWNzCiAgICBzdGF0aWNzX2Z1bmN0aW9uX2lucHV0X2RpY3QgPSBzaWduYXR1cmUoZ2V0X3NhbXBsZV9zdGF0aWNzX2Z1bmN0aW9uKS5wYXJhbWV0ZXJzCiAgICAjICBBcyBhIHJlc3VsdCBvZiBjaGFuZ2VzIHRvIGlucHV0IHBhcmFtZXRlcnMgaW4gdGhlIG1scnVuLWdldF9zYW1wbGVfc2V0X3N0YXRpc3RpY3MgZnVuY3Rpb24sCiAgICAjICB3ZSB3aWxsIG5vdyBzZW5kIG9ubHkgdGhlIHBhcmFtZXRlcnMgaXQgZXhwZWN0cy4KICAgIHN0YXRpc3RpY3NfaW5wdXRfZmlsdGVyZWQgPSB7a2V5OiBzdGF0aWNzX2lucHV0X2Z1bGxfZGljdFtrZXldIGZvciBrZXkgaW4gc3RhdGljc19mdW5jdGlvbl9pbnB1dF9kaWN0fQogICAgaWYgbGVuKHN0YXRpc3RpY3NfaW5wdXRfZmlsdGVyZWQpICE9IGxlbihzdGF0aWNzX2Z1bmN0aW9uX2lucHV0X2RpY3QpOgogICAgICAgIGNvbnRleHQubG9nZ2VyLndhcm5pbmcoZiJnZXRfc2FtcGxlX3NldF9zdGF0aXN0aWNzIGlzIGluIGFuIG9sZGVyIHZlcnNpb247ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb21lIHBhcmFtZXRlcnMgd2lsbCBub3QgYmUgc2VudCB0byB0aGUgZnVuY3Rpb24uIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiIgRXhwZWN0ZWQgaW5wdXQ6IHtsaXN0KHN0YXRpY3NfZnVuY3Rpb25faW5wdXRfZGljdC5rZXlzKCkpfSwiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmIiBhY3R1YWwgaW5wdXQ6IHtsaXN0KHN0YXRpc3RpY3NfaW5wdXRfZmlsdGVyZWQua2V5cygpKX0iKQogICAgcmV0dXJuIHN0YXRpc3RpY3NfaW5wdXRfZmlsdGVyZWQKCgpkZWYgaW5mZXIoCiAgICAgICAgY29udGV4dDogbWxydW4uTUxDbGllbnRDdHgsCiAgICAgICAgZGF0YXNldDogVW5pb25bbWxydW4uRGF0YUl0ZW0sIGxpc3QsIGRpY3QsIHBkLkRhdGFGcmFtZSwgcGQuU2VyaWVzLCBucC5uZGFycmF5XSwKICAgICAgICBtb2RlbF9wYXRoOiBVbmlvbltzdHIsIG1scnVuLkRhdGFJdGVtXSwKICAgICAgICBkcm9wX2NvbHVtbnM6IFVuaW9uW3N0ciwgTGlzdFtzdHJdLCBpbnQsIExpc3RbaW50XV0gPSBOb25lLAogICAgICAgIGxhYmVsX2NvbHVtbnM6IFVuaW9uW3N0ciwgTGlzdFtzdHJdXSA9IE5vbmUsCiAgICAgICAgZmVhdHVyZV9jb2x1bW5zOiBVbmlvbltzdHIsIExpc3Rbc3RyXV0gPSBOb25lLAogICAgICAgIGxvZ19yZXN1bHRfc2V0OiBib29sID0gVHJ1ZSwKICAgICAgICByZXN1bHRfc2V0X25hbWU6IHN0ciA9ICJwcmVkaWN0aW9uIiwKICAgICAgICBiYXRjaF9pZDogc3RyID0gTm9uZSwKICAgICAgICBhcnRpZmFjdHNfdGFnOiBzdHIgPSAiIiwKICAgICAgICAjIERyaWZ0IGFuYWx5c2lzIHBhcmFtZXRlcnMKICAgICAgICBwZXJmb3JtX2RyaWZ0X2FuYWx5c2lzOiBib29sID0gTm9uZSwKICAgICAgICBlbmRwb2ludF9pZDogc3RyID0gIiIsCiAgICAgICAgIyBUaGUgZm9sbG93aW5nIG1vZGVsIGVuZHBvaW50IHBhcmFtZXRlcnMgYXJlIHJlbGV2YW50IG9ubHkgaWY6CiAgICAgICAgIyBwZXJmb3JtIGRyaWZ0IGFuYWx5c2lzIGlzIG5vdCBkaXNhYmxlZAogICAgICAgICMgYSBuZXcgbW9kZWwgZW5kcG9pbnQgcmVjb3JkIGlzIGdvaW5nIHRvIGJlIGdlbmVyYXRlZAogICAgICAgIG1vZGVsX2VuZHBvaW50X25hbWU6IHN0ciA9ICJiYXRjaC1pbmZlciIsCiAgICAgICAgbW9kZWxfZW5kcG9pbnRfc2FtcGxlX3NldDogVW5pb25bCiAgICAgICAgICAgIG1scnVuLkRhdGFJdGVtLCBsaXN0LCBkaWN0LCBwZC5EYXRhRnJhbWUsIHBkLlNlcmllcywgbnAubmRhcnJheQogICAgICAgIF0gPSBOb25lLAogICAgICAgICoqcHJlZGljdF9rd2FyZ3M6IERpY3Rbc3RyLCBBbnldLAopOgogICAgIiIiCiAgICBQZXJmb3JtIGEgcHJlZGljdGlvbiBvbiB0aGUgcHJvdmlkZWQgZGF0YXNldCB1c2luZyB0aGUgc3BlY2lmaWVkIG1vZGVsLgogICAgRW5zdXJlIHRoYXQgdGhlIG1vZGVsIGhhcyBhbHJlYWR5IGJlZW4gbG9nZ2VkIHVuZGVyIHRoZSBjdXJyZW50IHByb2plY3QuCgogICAgSWYgeW91IHdpc2ggdG8gYXBwbHkgbW9uaXRvcmluZyB0b29scyAoZS5nLiwgZHJpZnQgYW5hbHlzaXMpLCBzZXQgdGhlIHBlcmZvcm1fZHJpZnRfYW5hbHlzaXMgcGFyYW1ldGVyIHRvIFRydWUuCiAgICBUaGlzIHdpbGwgY3JlYXRlIGEgbmV3IG1vZGVsIGVuZHBvaW50IHJlY29yZCB1bmRlciB0aGUgc3BlY2lmaWVkIG1vZGVsX2VuZHBvaW50X25hbWUuCiAgICBBZGRpdGlvbmFsbHksIGVuc3VyZSB0aGF0IG1vZGVsIG1vbml0b3JpbmcgaXMgZW5hYmxlZCBhdCB0aGUgcHJvamVjdCBsZXZlbCBieSBjYWxsaW5nIHRoZQogICAgcHJvamVjdC5lbmFibGVfbW9kZWxfbW9uaXRvcmluZygpIGZ1bmN0aW9uLiBZb3UgY2FuIGFsc28gYXBwbHkgbW9uaXRvcmluZyB0byBhbiBleGlzdGluZyBtb2RlbCBieSBwcm92aWRpbmcgaXRzCiAgICBlbmRwb2ludCBpZCBvciBuYW1lLCBhbmQgdGhlIG1vbml0b3JpbmcgdG9vbHMgd2lsbCBiZSBhcHBsaWVkIHRvIHRoYXQgZW5kcG9pbnQuCgogICAgQXQgdGhlIG1vbWVudCwgdGhpcyBmdW5jdGlvbiBpcyBzdXBwb3J0ZWQgZm9yIGBtbHJ1bj49MS41LjBgIHZlcnNpb25zLgoKICAgIDpwYXJhbSBjb250ZXh0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1MUnVuIGNvbnRleHQuCiAgICA6cGFyYW0gZGF0YXNldDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGF0YXNldCB0byBpbmZlciB0aHJvdWdoIHRoZSBtb2RlbC4gUHJvdmlkZWQgYXMgYW4gaW5wdXQgKERhdGFJdGVtKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCByZXByZXNlbnRzIERhdGFzZXQgYXJ0aWZhY3QgLyBGZWF0dXJlIHZlY3RvciBVUkkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB1c2luZyBNTFJ1biBTREssIGBkYXRhc2V0YCBjYW4gYWxzbyBiZSBwcm92aWRlZCBhcyBhIGxpc3QsIGRpY3Rpb25hcnkgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bXB5IGFycmF5LgogICAgOnBhcmFtIG1vZGVsX3BhdGg6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZWwgc3RvcmUgdXJpIChzaG91bGQgc3RhcnQgd2l0aCBzdG9yZTovLykuIFByb3ZpZGVkIGFzIGFuIGlucHV0IChEYXRhSXRlbSkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB1c2luZyBNTFJ1biBTREssIGBtb2RlbF9wYXRoYCBjYW4gYWxzbyBiZSBwcm92aWRlZCBhcyBhIHBhcmFtZXRlciAoc3RyaW5nKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvIGdlbmVyYXRlIGEgdmFsaWQgbW9kZWwgc3RvcmUgVVJJLCBwbGVhc2UgbG9nIHRoZSBtb2RlbCBiZWZvcmUgcnVubmluZyB0aGlzIGZ1bmN0aW9uLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgYGVuZHBvaW50X2lkYCBvZiBleGlzdGluZyBtb2RlbCBlbmRwb2ludCBpcyBwcm92aWRlZCwgbWFrZSBzdXJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGl0IGhhcyBhIHNpbWlsYXIgbW9kZWwgc3RvcmUgcGF0aCwgb3RoZXJ3aXNlIHRoZSBkcmlmdCBhbmFseXNpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29uJ3QgYmUgdHJpZ2dlcmVkLgogICAgOnBhcmFtIGRyb3BfY29sdW1uczogICAgICAgICAgICAgICAgICAgICAgICAgICAgQSBzdHJpbmcgLyBpbnRlZ2VyIG9yIGEgbGlzdCBvZiBzdHJpbmdzIC8gaW50ZWdlcnMgdGhhdCByZXByZXNlbnQgdGhlIGNvbHVtbiBuYW1lcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBpbmRpY2VzIHRvIGRyb3AuIFdoZW4gdGhlIGRhdGFzZXQgaXMgYSBsaXN0IG9yIGEgbnVtcHkgYXJyYXkgdGhpcyBwYXJhbWV0ZXIgbXVzdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgcmVwcmVzZW50ZWQgYnkgaW50ZWdlcnMuCiAgICA6cGFyYW0gbGFiZWxfY29sdW1uczogICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgdGFyZ2V0IGxhYmVsKHMpIG9mIHRoZSBjb2x1bW4ocykgaW4gdGhlIGRhdGFzZXQgZm9yIFJlZ3Jlc3Npb24gb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzaWZpY2F0aW9uIHRhc2tzLiBUaGUgbGFiZWwgY29sdW1uIGNhbiBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBtb2RlbCBvYmplY3QsIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZmVhdHVyZSB2ZWN0b3IgcHJvdmlkZWQgaWYgYXZhaWxhYmxlLgogICAgOnBhcmFtIGZlYXR1cmVfY29sdW1uczogICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCBvZiBmZWF0dXJlIGNvbHVtbnMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gYnVpbGQgdGhlIGRhdGFmcmFtZSB3aGVuIGRhdGFzZXQgaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdHlwZSBsaXN0IG9yIG51bXB5IGFycmF5LgogICAgOnBhcmFtIGxvZ19yZXN1bHRfc2V0OiAgICAgICAgICAgICAgICAgICAgICAgICAgV2hldGhlciB0byBsb2cgdGhlIHJlc3VsdCBzZXQgLSBhIERhdGFGcmFtZSBvZiB0aGUgZ2l2ZW4gaW5wdXRzIGNvbmNhdGVuYXRlZCB3aXRoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcHJlZGljdGlvbnMuIERlZmF1bHRlZCB0byBUcnVlLgogICAgOnBhcmFtIHJlc3VsdF9zZXRfbmFtZTogICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRiIGtleSB0byBzZXQgbmFtZSBvZiB0aGUgcHJlZGljdGlvbiByZXN1bHQgYW5kIHRoZSBmaWxlbmFtZS4gRGVmYXVsdGVkIHRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJlZGljdGlvbicuCiAgICA6cGFyYW0gYmF0Y2hfaWQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgSUQgb2YgdGhlIGdpdmVuIGJhdGNoIChpbmZlcmVuY2UgZGF0YXNldCkuIElmIGBOb25lYCwgaXQgd2lsbCBiZSBnZW5lcmF0ZWQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWxsIGJlIGxvZ2dlZCBhcyBhIHJlc3VsdCBvZiB0aGUgcnVuLgogICAgOnBhcmFtIGFydGlmYWN0c190YWc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFnIHRvIHVzZSBmb3IgcHJlZGljdGlvbiBzZXQgcmVzdWx0IGFydGlmYWN0LgogICAgOnBhcmFtIHBlcmZvcm1fZHJpZnRfYW5hbHlzaXM6ICAgICAgICAgICAgICAgICAgV2hldGhlciB0byBwZXJmb3JtIGRyaWZ0IGFuYWx5c2lzIGJldHdlZW4gdGhlIHNhbXBsZSBzZXQgb2YgdGhlIG1vZGVsIG9iamVjdCB0byB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFzZXQgZ2l2ZW4uIEJ5IGRlZmF1bHQsIE5vbmUsIHdoaWNoIG1lYW5zIGl0IHdpbGwgcGVyZm9ybSBkcmlmdCBhbmFseXNpcyBpZiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsIGFscmVhZHkgaGFzIGZlYXR1cmUgc3RhdHMgdGhhdCBhcmUgY29uc2lkZXJlZCBhcyBhIHJlZmVyZW5jZSBzYW1wbGUgc2V0LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybWluZyBkcmlmdCBhbmFseXNpcyBvbiBhIG5ldyBlbmRwb2ludCBpZCB3aWxsIGdlbmVyYXRlIGEgbmV3IG1vZGVsIGVuZHBvaW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmQuCiAgICA6cGFyYW0gZW5kcG9pbnRfaWQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RlbCBlbmRwb2ludCB1bmlxdWUgSUQuIElmIGBwZXJmb3JtX2RyaWZ0X2FuYWx5c2lzYCB3YXMgc2V0LCB0aGUgZW5kcG9pbnRfaWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgdXNlZCBlaXRoZXIgdG8gcGVyZm9ybSB0aGUgYW5hbHlzaXMgb24gZXhpc3RpbmcgbW9kZWwgZW5kcG9pbnQgb3IgdG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlIGEgbmV3IG1vZGVsIGVuZHBvaW50IHJlY29yZC4KICAgIDpwYXJhbSBtb2RlbF9lbmRwb2ludF9uYW1lOiAgICAgICAgICAgICAgICAgICAgIElmIGEgbmV3IG1vZGVsIGVuZHBvaW50IGlzIGdlbmVyYXRlZCwgdGhlIG1vZGVsIG5hbWUgd2lsbCBiZSBwcmVzZW50ZWQgdW5kZXIgdGhpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnQuCiAgICA6cGFyYW0gbW9kZWxfZW5kcG9pbnRfc2FtcGxlX3NldDogICAgICAgICAgICAgICBBIHNhbXBsZSBkYXRhc2V0IHRvIGdpdmUgdG8gY29tcGFyZSB0aGUgaW5wdXRzIGluIHRoZSBkcmlmdCBhbmFseXNpcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbiBiZSBwcm92aWRlZCBhcyBhbiBpbnB1dCAoRGF0YUl0ZW0pIG9yIGFzIGEgcGFyYW1ldGVyIChlLmcuIHN0cmluZywgbGlzdCwgRGF0YUZyYW1lKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IGNob3NlbiBzYW1wbGUgc2V0IHdpbGwgYWx3YXlzIGJlIHRoZSBvbmUgd2hvIGlzIHNldCBpbiB0aGUgbW9kZWwgYXJ0aWZhY3QgaXRzZWxmLgoKICAgIHJhaXNlcyBNTFJ1bkludmFsaWRBcmd1bWVudEVycm9yOiBpZiBib3RoIGBtb2RlbF9wYXRoYCBhbmQgYGVuZHBvaW50X2lkYCBhcmUgbm90IHByb3ZpZGVkCiAgICAiIiIKCiAgICAjIExvYWRpbmcgdGhlIG1vZGVsOgogICAgY29udGV4dC5sb2dnZXIuaW5mbyhmIkxvYWRpbmcgbW9kZWwuLi4iKQogICAgaWYgaXNpbnN0YW5jZShtb2RlbF9wYXRoLCBtbHJ1bi5EYXRhSXRlbSk6CiAgICAgICAgbW9kZWxfcGF0aCA9IG1vZGVsX3BhdGguYXJ0aWZhY3RfdXJsCiAgICBpZiBub3QgbWxydW4uZGF0YXN0b3JlLmlzX3N0b3JlX3VyaShtb2RlbF9wYXRoKToKICAgICAgICByYWlzZSBtbHJ1bi5lcnJvcnMuTUxSdW5JbnZhbGlkQXJndW1lbnRFcnJvcigKICAgICAgICAgICAgZiJUaGUgcHJvdmlkZWQgbW9kZWwgcGF0aCAoe21vZGVsX3BhdGh9KSBpcyBpbnZhbGlkIC0gc2hvdWxkIHN0YXJ0IHdpdGggYHN0b3JlOi8vYC4gIgogICAgICAgICAgICBmIlBsZWFzZSBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSBsb2dnZWQgdGhlIG1vZGVsIHVzaW5nIGBwcm9qZWN0LmxvZ19tb2RlbCgpYCAiCiAgICAgICAgICAgIGYid2hpY2ggZ2VuZXJhdGVzIGEgdW5pcXVlIHN0b3JlIHVyaSBmb3IgdGhlIGxvZ2dlZCBtb2RlbC4iCiAgICAgICAgKQogICAgbW9kZWxfaGFuZGxlciA9IEF1dG9NTFJ1bi5sb2FkX21vZGVsKG1vZGVsX3BhdGg9bW9kZWxfcGF0aCwgY29udGV4dD1jb250ZXh0KQoKICAgIGlmIGxhYmVsX2NvbHVtbnMgaXMgTm9uZToKICAgICAgICBsYWJlbF9jb2x1bW5zID0gWwogICAgICAgICAgICBvdXRwdXQubmFtZSBmb3Igb3V0cHV0IGluIG1vZGVsX2hhbmRsZXIuX21vZGVsX2FydGlmYWN0LnNwZWMub3V0cHV0cwogICAgICAgIF0KCiAgICBpZiBmZWF0dXJlX2NvbHVtbnMgaXMgTm9uZToKICAgICAgICBmZWF0dXJlX2NvbHVtbnMgPSBbCiAgICAgICAgICAgIGlucHV0Lm5hbWUgZm9yIGlucHV0IGluIG1vZGVsX2hhbmRsZXIuX21vZGVsX2FydGlmYWN0LnNwZWMuaW5wdXRzCiAgICAgICAgXQoKICAgICMgR2V0IGRhdGFzZXQgYnkgb2JqZWN0LCBVUkwgb3IgYnkgRmVhdHVyZVZlY3RvcjoKICAgIGNvbnRleHQubG9nZ2VyLmluZm8oZiJMb2FkaW5nIGRhdGEuLi4iKQogICAgeCwgbGFiZWxfY29sdW1ucyA9IG1scnVuLm1vZGVsX21vbml0b3JpbmcuYXBpLnJlYWRfZGF0YXNldF9hc19kYXRhZnJhbWUoCiAgICAgICAgZGF0YXNldD1kYXRhc2V0LAogICAgICAgIGZlYXR1cmVfY29sdW1ucz1mZWF0dXJlX2NvbHVtbnMsCiAgICAgICAgbGFiZWxfY29sdW1ucz1sYWJlbF9jb2x1bW5zLAogICAgICAgIGRyb3BfY29sdW1ucz1kcm9wX2NvbHVtbnMsCiAgICApCgogICAgIyBQcmVkaWN0OgogICAgY29udGV4dC5sb2dnZXIuaW5mbyhmIkNhbGN1bGF0aW5nIHByZWRpY3Rpb24uLi4iKQogICAgeV9wcmVkID0gbW9kZWxfaGFuZGxlci5tb2RlbC5wcmVkaWN0KHgsICoqcHJlZGljdF9rd2FyZ3MpCgogICAgIyBQcmVwYXJlIHRoZSByZXN1bHQgc2V0OgogICAgcmVzdWx0X3NldCA9IF9wcmVwYXJlX3Jlc3VsdF9zZXQoeD14LCBsYWJlbF9jb2x1bW5zPWxhYmVsX2NvbHVtbnMsIHlfcHJlZD15X3ByZWQpCgogICAgIyBDaGVjayBmb3IgbG9nZ2luZyB0aGUgcmVzdWx0IHNldDoKICAgIGlmIGxvZ19yZXN1bHRfc2V0OgogICAgICAgIG1scnVuLm1vZGVsX21vbml0b3JpbmcuYXBpLmxvZ19yZXN1bHQoCiAgICAgICAgICAgIGNvbnRleHQ9Y29udGV4dCwKICAgICAgICAgICAgcmVzdWx0X3NldF9uYW1lPXJlc3VsdF9zZXRfbmFtZSwKICAgICAgICAgICAgcmVzdWx0X3NldD1yZXN1bHRfc2V0LAogICAgICAgICAgICBhcnRpZmFjdHNfdGFnPWFydGlmYWN0c190YWcsCiAgICAgICAgICAgIGJhdGNoX2lkPWJhdGNoX2lkLAogICAgICAgICkKCiAgICAjIENoZWNrIGZvciBwZXJmb3JtaW5nIGRyaWZ0IGFuYWx5c2lzCiAgICBpZiAoCiAgICAgICAgICAgIHBlcmZvcm1fZHJpZnRfYW5hbHlzaXMgaXMgTm9uZQogICAgICAgICAgICBhbmQgbW9kZWxfaGFuZGxlci5fbW9kZWxfYXJ0aWZhY3Quc3BlYy5mZWF0dXJlX3N0YXRzIGlzIG5vdCBOb25lCiAgICApOgogICAgICAgIHBlcmZvcm1fZHJpZnRfYW5hbHlzaXMgPSBUcnVlCiAgICBpZiBwZXJmb3JtX2RyaWZ0X2FuYWx5c2lzOgogICAgICAgIGNvbnRleHQubG9nZ2VyLmluZm8oIlBlcmZvcm1pbmcgZHJpZnQgYW5hbHlzaXMuLi4iKQogICAgICAgICMgR2V0IHRoZSBzYW1wbGUgc2V0IHN0YXRpc3RpY3MgKGVpdGhlciBmcm9tIHRoZSBzYW1wbGUgc2V0IG9yIGZyb20gdGhlIHN0YXRpc3RpY3MgbG9nZ2VkIHdpdGggdGhlIG1vZGVsKQogICAgICAgIHN0YXRpc3RpY3NfaW5wdXRfZmlsdGVyZWQgPSBfZ2V0X3NhbXBsZV9zZXRfc3RhdGlzdGljc19wYXJhbWV0ZXJzKAogICAgICAgICAgICBjb250ZXh0PWNvbnRleHQsCiAgICAgICAgICAgIG1vZGVsX2VuZHBvaW50X3NhbXBsZV9zZXQ9bW9kZWxfZW5kcG9pbnRfc2FtcGxlX3NldCwKICAgICAgICAgICAgbW9kZWxfYXJ0aWZhY3RfZmVhdHVyZV9zdGF0cz1tb2RlbF9oYW5kbGVyLl9tb2RlbF9hcnRpZmFjdC5zcGVjLmZlYXR1cmVfc3RhdHMsCiAgICAgICAgICAgIGZlYXR1cmVfY29sdW1ucz1mZWF0dXJlX2NvbHVtbnMsCiAgICAgICAgICAgIGRyb3BfY29sdW1ucz1kcm9wX2NvbHVtbnMsCiAgICAgICAgICAgIGxhYmVsX2NvbHVtbnM9bGFiZWxfY29sdW1ucykKICAgICAgICBzYW1wbGVfc2V0X3N0YXRpc3RpY3MgPSBtbHJ1bi5tb2RlbF9tb25pdG9yaW5nLmFwaS5nZXRfc2FtcGxlX3NldF9zdGF0aXN0aWNzKCoqc3RhdGlzdGljc19pbnB1dF9maWx0ZXJlZCkKICAgICAgICBtbHJ1bi5tb2RlbF9tb25pdG9yaW5nLmFwaS5yZWNvcmRfcmVzdWx0cygKICAgICAgICAgICAgcHJvamVjdD1jb250ZXh0LnByb2plY3QsCiAgICAgICAgICAgIGNvbnRleHQ9Y29udGV4dCwKICAgICAgICAgICAgZW5kcG9pbnRfaWQ9ZW5kcG9pbnRfaWQsCiAgICAgICAgICAgIG1vZGVsX3BhdGg9bW9kZWxfcGF0aCwKICAgICAgICAgICAgbW9kZWxfZW5kcG9pbnRfbmFtZT1tb2RlbF9lbmRwb2ludF9uYW1lLAogICAgICAgICAgICBpbmZlcl9yZXN1bHRzX2RmPXJlc3VsdF9zZXQuY29weSgpLAogICAgICAgICAgICBzYW1wbGVfc2V0X3N0YXRpc3RpY3M9c2FtcGxlX3NldF9zdGF0aXN0aWNzLAogICAgICAgICkK + origin_filename: '' + auto_build: false default_handler: infer + image: mlrun/mlrun disable_auto_mount: false - allow_empty_resources: true - clone_target_dir: '' - env: [] - priority_class_name: '' - preemption_mode: prevent - affinity: null - tolerations: null - security_context: {} -verbose: false + command: '' +metadata: + tag: '' + categories: + - utils + - data-analysis + - monitoring + name: batch-inference-v2 diff --git a/batch_inference_v2/item.yaml b/batch_inference_v2/item.yaml index 292f3424a..e995c770d 100644 --- a/batch_inference_v2/item.yaml +++ b/batch_inference_v2/item.yaml @@ -14,9 +14,9 @@ labels: author: eyald maintainers: [] marketplaceType: '' -mlrunVersion: 1.5.0 +mlrunVersion: 1.7.0-rc51 name: batch_inference_v2 -platformVersion: 3.5.3 +platformVersion: 3.6.0 spec: extra_spec: allow_empty_resources: true @@ -29,4 +29,4 @@ spec: kind: job requirements: null url: '' -version: 2.5.0 +version: 2.6.0 diff --git a/batch_inference_v2/test_batch_inference_v2.py b/batch_inference_v2/test_batch_inference_v2.py index cd455b6d5..6fa657a0d 100644 --- a/batch_inference_v2/test_batch_inference_v2.py +++ b/batch_inference_v2/test_batch_inference_v2.py @@ -12,9 +12,10 @@ # See the License for the specific language governing permissions and # limitations under the License. # -import json + import os import pickle +import time import uuid import numpy as np import pandas as pd @@ -30,7 +31,7 @@ import mlrun.common.schemas from batch_inference_v2 import infer import shutil - +from mlrun.model_monitoring.api import get_or_create_model_endpoint REQUIRED_ENV_VARS = [ "MLRUN_DBPATH", "V3IO_USERNAME", @@ -38,7 +39,6 @@ "V3IO_ACCESS_KEY", ] - def _validate_environment_variables() -> bool: """ Checks that all required Environment variables are set. @@ -86,26 +86,32 @@ def train(training_set: pd.DataFrame): model.fit(training_set, labels) -def assert_batch_predict(n_features, batch_inference_run): +def assert_batch_predict(n_features, batch_inference_run, with_monitoring=False, project_name="batch-infer-test"): # Check the logged results: assert "batch_id" in batch_inference_run.status.results - assert "drift_metric" in batch_inference_run.status.results - assert batch_inference_run.status.results["drift_status"] is True - - # Check that 3 artifacts were generated - assert len(batch_inference_run.status.artifacts) == 3 + assert len(batch_inference_run.status.artifacts) == 1 + assert len(batch_inference_run.artifact("prediction").as_df().columns) == n_features + 1 + if with_monitoring: + # Check that the drift analysis was performed: + time.sleep(60) + # Retrieve the model endpoint + project = get_or_create_project(project_name) + endpoint = get_or_create_model_endpoint(project=project.name, model_endpoint_name="my_cool_endpoint") + + # Validate that the artifacts were logged in the project + artifacts = project.list_artifacts( + labels={ + "mlrun/producer-type": "model-monitoring-app", + "mlrun/app-name": "histogram-data-drift", + "mlrun/endpoint-id": endpoint.metadata.uid, + } + ) - # Check drift table artifact url - assert ( - batch_inference_run.artifact("drift_table_plot").artifact_url - == batch_inference_run.outputs["drift_table_plot"] - ) + assert len(artifacts) == 2 - # Check the features drift results json: - drift_results_file = batch_inference_run.artifact("features_drift_results").local() - with open(drift_results_file, "r") as json_file: - drift_results = json.load(json_file) - assert len(drift_results) == n_features + 1 + # Validate that the model endpoint has been updated as expected + assert endpoint.status.current_stats + assert endpoint.status.drift_status @pytest.mark.skipif( @@ -141,10 +147,7 @@ def test_batch_predict(): params={ "model_path": train_run.outputs["model"], "label_columns": "target_label", - "trigger_monitoring_job": True, - "perform_drift_analysis": True, - "model_endpoint_drift_threshold": 0.2, - "model_endpoint_possible_drift_threshold": 0.1, + "perform_drift_analysis": False, }, local=True, ) @@ -152,6 +155,22 @@ def test_batch_predict(): # Check the logged results: assert_batch_predict(n_features=n_features, batch_inference_run=batch_inference_run) + # Enable model monitoring + project.set_model_monitoring_credentials( + endpoint_store_connection="v3io", + tsdb_connection="v3io", + stream_path="v3io") + + # Deploy model monitoring infrastructure + project.enable_model_monitoring(wait_for_deployment=True, base_period=1) + + # Wait until the monitoring application is triggered + import time + time.sleep(60) + + # Check the logged results: + assert_batch_predict(n_features=n_features, batch_inference_run=batch_inference_run, with_monitoring=True) + # Clean resources _delete_project(project=project.metadata.name) @@ -222,13 +241,11 @@ def test_infer_sample_types(self, sample_type): label_columns="target_label", model_endpoint_name=f"model-endpoint-name-{uuid.uuid4()}", trigger_monitoring_job=True, - perform_drift_analysis=True, - model_endpoint_drift_threshold=0.7, - model_endpoint_possible_drift_threshold=0.5) + perform_drift_analysis=True) # a workaround until ML-4636 will be solved. batch_inference_run = self.project.list_runs(name=self.context.name).to_objects()[0] mlrun.get_run_db().update_run(updates={"status.state": "completed"}, uid=batch_inference_run.uid()) - assert_batch_predict(n_features=n_features, batch_inference_run=batch_inference_run) + assert_batch_predict(n_features=n_features, batch_inference_run=batch_inference_run, project_name=self.project_name) def _delete_project(project: str): From c4c558e01fc903d7aa8c93d471398873cd463487 Mon Sep 17 00:00:00 2001 From: Eyal Danieli Date: Thu, 10 Oct 2024 10:13:56 +0300 Subject: [PATCH 25/38] bring back deprecated params and add warn (#834) --- batch_inference_v2/batch_inference_v2.py | 35 ++++++++- batch_inference_v2/function.yaml | 95 ++++++++++++++---------- 2 files changed, 90 insertions(+), 40 deletions(-) diff --git a/batch_inference_v2/batch_inference_v2.py b/batch_inference_v2/batch_inference_v2.py index 78f9a709a..3b370f630 100644 --- a/batch_inference_v2/batch_inference_v2.py +++ b/batch_inference_v2/batch_inference_v2.py @@ -120,7 +120,17 @@ def infer( model_endpoint_sample_set: Union[ mlrun.DataItem, list, dict, pd.DataFrame, pd.Series, np.ndarray ] = None, + + # the following parameters are deprecated and will be removed once the versioning mechanism is implemented + # TODO: Remove the following parameters once FHUB-13 is resolved + trigger_monitoring_job: Optional[bool] = None, + batch_image_job: Optional[str] = None, + model_endpoint_drift_threshold: Optional[float] = None, + model_endpoint_possible_drift_threshold: Optional[float] = None, + + # prediction kwargs to pass to the model predict function **predict_kwargs: Dict[str, Any], + ): """ Perform a prediction on the provided dataset using the specified model. @@ -173,10 +183,33 @@ def infer( :param model_endpoint_sample_set: A sample dataset to give to compare the inputs in the drift analysis. Can be provided as an input (DataItem) or as a parameter (e.g. string, list, DataFrame). The default chosen sample set will always be the one who is set in the model artifact itself. + :param trigger_monitoring_job: Whether to trigger the batch drift analysis after the infer job. + :param batch_image_job: The image that will be used to register the monitoring batch job if not exist. + By default, the image is mlrun/mlrun. + :param model_endpoint_drift_threshold: The threshold of which to mark drifts. Defaulted to 0.7. + :param model_endpoint_possible_drift_threshold: The threshold of which to mark possible drifts. Defaulted to 0.5. raises MLRunInvalidArgumentError: if both `model_path` and `endpoint_id` are not provided """ + + if trigger_monitoring_job: + context.logger.warning("The `trigger_monitoring_job` parameter is deprecated and will be removed once the versioning mechanism is implemented. " + "if you are using mlrun<1.7.0, please import the previous version of this function, for example " + "'hub://batch_inference_v2:2.5.0'.") + if batch_image_job: + context.logger.warning("The `batch_image_job` parameter is deprecated and will be removed once the versioning mechanism is implemented. " + "if you are using mlrun<1.7.0, please import the previous version of this function, for example " + "'hub://batch_inference_v2:2.5.0'.") + if model_endpoint_drift_threshold: + context.logger.warning("The `model_endpoint_drift_threshold` parameter is deprecated and will be removed once the versioning mechanism is implemented. " + "if you are using mlrun<1.7.0, please import the previous version of this function, for example " + "'hub://batch_inference_v2:2.5.0'.") + if model_endpoint_possible_drift_threshold: + context.logger.warning("The `model_endpoint_possible_drift_threshold` parameter is deprecated and will be removed once the versioning mechanism is implemented. " + "if you are using mlrun<1.7.0, please import the previous version of this function, for example " + "'hub://batch_inference_v2:2.5.0'.") + # Loading the model: context.logger.info(f"Loading model...") if isinstance(model_path, mlrun.DataItem): @@ -250,4 +283,4 @@ def infer( model_endpoint_name=model_endpoint_name, infer_results_df=result_set.copy(), sample_set_statistics=sample_set_statistics, - ) + ) \ No newline at end of file diff --git a/batch_inference_v2/function.yaml b/batch_inference_v2/function.yaml index 0db7b6366..e0a9310c2 100644 --- a/batch_inference_v2/function.yaml +++ b/batch_inference_v2/function.yaml @@ -1,31 +1,19 @@ -kind: job -verbose: false spec: + image: mlrun/mlrun + default_handler: infer + command: '' + allow_empty_resources: true + description: Batch inference (also knows as prediction) for the common ML frameworks + (SciKit-Learn, XGBoost and LightGBM) while performing data drift analysis. + disable_auto_mount: false + build: + with_mlrun: false + functionSourceCode: IyBDb3B5cmlnaHQgMjAyMyBJZ3VhemlvCiMKIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgpmcm9tIGluc3BlY3QgaW1wb3J0IHNpZ25hdHVyZQpmcm9tIHR5cGluZyBpbXBvcnQgQW55LCBEaWN0LCBMaXN0LCBVbmlvbiwgT3B0aW9uYWwKaW1wb3J0IG1scnVuCgp0cnk6CiAgICBpbXBvcnQgbWxydW4ubW9kZWxfbW9uaXRvcmluZy5hcGkKZXhjZXB0IE1vZHVsZU5vdEZvdW5kRXJyb3I6CiAgICByYWlzZSBtbHJ1bi5lcnJvcnMuTUxSdW5Ob3RGb3VuZEVycm9yKAogICAgICAgIGYiUGxlYXNlIHVwZGF0ZSB5b3VyIGBtbHJ1bmAgdmVyc2lvbiB0byA+PTEuNS4wIG9yIHVzZSBhbiAiCiAgICAgICAgZiJvbGRlciB2ZXJzaW9uIG9mIHRoZSBiYXRjaCBpbmZlcmVuY2UgZnVuY3Rpb24uIgogICAgKQoKaW1wb3J0IG51bXB5IGFzIG5wCmltcG9ydCBwYW5kYXMgYXMgcGQKZnJvbSBtbHJ1bi5mcmFtZXdvcmtzLmF1dG9fbWxydW4gaW1wb3J0IEF1dG9NTFJ1bgoKCmRlZiBfcHJlcGFyZV9yZXN1bHRfc2V0KHg6IHBkLkRhdGFGcmFtZSwgbGFiZWxfY29sdW1uczogTGlzdFtzdHJdLCB5X3ByZWQ6IG5wLm5kYXJyYXkpIC0+IHBkLkRhdGFGcmFtZToKICAgICIiIgogICAgU2V0IGRlZmF1bHQgbGFiZWwgY29sdW1uIG5hbWVzIGFuZCB2YWxpZGF0ZSBnaXZlbiBuYW1lcyB0byBwcmVwYXJlIHRoZSByZXN1bHQgc2V0IC0gYSBjb25jYXRlbmF0aW9uIG9mIHRoZSBpbnB1dHMKICAgICh4KSBhbmQgdGhlIG1vZGVsIHByZWRpY3Rpb25zICh5X3ByZWQpLgoKICAgIDpwYXJhbSB4OiAgICAgICAgICAgICBUaGUgaW5wdXRzLgogICAgOnBhcmFtIGxhYmVsX2NvbHVtbnM6IEEgbGlzdCBvZiBzdHJpbmdzIHJlcHJlc2VudGluZyB0aGUgdGFyZ2V0IGNvbHVtbiBuYW1lcyB0byBhZGQgdG8gdGhlIHByZWRpY3Rpb25zLiBEZWZhdWx0IG5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHVzZWQgaW4gY2FzZSB0aGUgbGlzdCBpcyBlbXB0eSAocHJlZGljdGVkX2xhYmVsX3tpfSkuCiAgICA6cGFyYW0geV9wcmVkOiAgICAgICAgVGhlIG1vZGVsIHByZWRpY3Rpb25zIG9uIHRoZSBpbnB1dHMuCgogICAgOnJldHVybnM6IFRoZSByZXN1bHQgc2V0LgoKICAgIHJhaXNlcyBNTFJ1bkludmFsaWRBcmd1bWVudEVycm9yOiBJZiB0aGUgbGFiZWxzIGNvbHVtbnMgYW1vdW50IGRvIG5vdCBtYXRjaCB0aGUgb3V0cHV0cyBvciBpZiBvbmUgb2YgdGhlIGxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgZGF0YXNldC4KICAgICIiIgogICAgIyBQcmVwYXJlIGRlZmF1bHQgdGFyZ2V0IGNvbHVtbnMgbmFtZXMgaWYgbm90IHByb3ZpZGVkOgogICAgcHJlZGljdGlvbl9jb2x1bW5zX2Ftb3VudCA9IDEgaWYgbGVuKHlfcHJlZC5zaGFwZSkgPT0gMSBlbHNlIHlfcHJlZC5zaGFwZVsxXQogICAgaWYgbGVuKGxhYmVsX2NvbHVtbnMpID09IDA6CiAgICAgICAgIyBBZGQgZGVmYXVsdCBsYWJlbCBjb2x1bW4gbmFtZXM6CiAgICAgICAgaWYgcHJlZGljdGlvbl9jb2x1bW5zX2Ftb3VudCA9PSAxOgogICAgICAgICAgICBsYWJlbF9jb2x1bW5zID0gWyJwcmVkaWN0ZWRfbGFiZWwiXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGxhYmVsX2NvbHVtbnMgPSBbCiAgICAgICAgICAgICAgICBmInByZWRpY3RlZF9sYWJlbF97aX0iIGZvciBpIGluIHJhbmdlKHByZWRpY3Rpb25fY29sdW1uc19hbW91bnQpCiAgICAgICAgICAgIF0KCiAgICAjIFZhbGlkYXRlIHRoZSBsYWJlbCBjb2x1bW5zOgogICAgaWYgcHJlZGljdGlvbl9jb2x1bW5zX2Ftb3VudCAhPSBsZW4obGFiZWxfY29sdW1ucyk6CiAgICAgICAgIyBObyBlcXVhbGl0eSBiZXR3ZWVuIHByb3ZpZGVkIGxhYmVsIGNvbHVtbiBuYW1lcyBhbmQgb3V0cHV0cyBhbW91bnQ6CiAgICAgICAgcmFpc2UgbWxydW4uZXJyb3JzLk1MUnVuSW52YWxpZEFyZ3VtZW50RXJyb3IoCiAgICAgICAgICAgIGYiVGhlIG51bWJlciBvZiBwcmVkaWN0ZWQgbGFiZWxzOiB7cHJlZGljdGlvbl9jb2x1bW5zX2Ftb3VudH0gIgogICAgICAgICAgICBmImlzIG5vdCBlcXVhbCB0byB0aGUgZ2l2ZW4gbGFiZWwgY29sdW1uczoge2xlbihsYWJlbF9jb2x1bW5zKX0iCiAgICAgICAgKQogICAgY29tbW9uX2xhYmVscyA9IHNldChsYWJlbF9jb2x1bW5zKSAmIHNldCh4LmNvbHVtbnMudG9saXN0KCkpCiAgICBpZiBjb21tb25fbGFiZWxzOgogICAgICAgICMgTGFiZWwgY29sdW1uIGV4aXN0IGluIHRoZSBvcmlnaW5hbCBpbnB1dHM6CiAgICAgICAgcmFpc2UgbWxydW4uZXJyb3JzLk1MUnVuSW52YWxpZEFyZ3VtZW50RXJyb3IoCiAgICAgICAgICAgIGYiVGhlIGxhYmVsczoge2NvbW1vbl9sYWJlbHN9IGFyZSBhbHJlYWR5IGV4aXN0ZWQgaW4gdGhlIGdpdmVuIGRhdGFzZXQuIgogICAgICAgICkKCiAgICByZXR1cm4gcGQuY29uY2F0KAogICAgICAgIFt4LCBwZC5EYXRhRnJhbWUoeV9wcmVkLCBjb2x1bW5zPWxhYmVsX2NvbHVtbnMsIGluZGV4PXguaW5kZXgpXSwgYXhpcz0xCiAgICApCgoKZGVmIF9nZXRfc2FtcGxlX3NldF9zdGF0aXN0aWNzX3BhcmFtZXRlcnMoY29udGV4dDogbWxydW4uTUxDbGllbnRDdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX2VuZHBvaW50X3NhbXBsZV9zZXQ6IFVuaW9uWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWxydW4uRGF0YUl0ZW0sIGxpc3QsIGRpY3QsIHBkLkRhdGFGcmFtZSwgcGQuU2VyaWVzLCBucC5uZGFycmF5XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfYXJ0aWZhY3RfZmVhdHVyZV9zdGF0czogZGljdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZV9jb2x1bW5zOiBPcHRpb25hbFtMaXN0XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcF9jb2x1bW5zOiBPcHRpb25hbFtMaXN0XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxfY29sdW1uczogT3B0aW9uYWxbTGlzdF0pIC0+IERpY3Rbc3RyLCBBbnldOgogICAgc3RhdGljc19pbnB1dF9mdWxsX2RpY3QgPSBkaWN0KHNhbXBsZV9zZXQ9bW9kZWxfZW5kcG9pbnRfc2FtcGxlX3NldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9hcnRpZmFjdF9mZWF0dXJlX3N0YXRzPW1vZGVsX2FydGlmYWN0X2ZlYXR1cmVfc3RhdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlX3NldF9jb2x1bW5zPWZlYXR1cmVfY29sdW1ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVfc2V0X2Ryb3BfY29sdW1ucz1kcm9wX2NvbHVtbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlX3NldF9sYWJlbF9jb2x1bW5zPWxhYmVsX2NvbHVtbnMpCiAgICBnZXRfc2FtcGxlX3N0YXRpY3NfZnVuY3Rpb24gPSBtbHJ1bi5tb2RlbF9tb25pdG9yaW5nLmFwaS5nZXRfc2FtcGxlX3NldF9zdGF0aXN0aWNzCiAgICBzdGF0aWNzX2Z1bmN0aW9uX2lucHV0X2RpY3QgPSBzaWduYXR1cmUoZ2V0X3NhbXBsZV9zdGF0aWNzX2Z1bmN0aW9uKS5wYXJhbWV0ZXJzCiAgICAjICBBcyBhIHJlc3VsdCBvZiBjaGFuZ2VzIHRvIGlucHV0IHBhcmFtZXRlcnMgaW4gdGhlIG1scnVuLWdldF9zYW1wbGVfc2V0X3N0YXRpc3RpY3MgZnVuY3Rpb24sCiAgICAjICB3ZSB3aWxsIG5vdyBzZW5kIG9ubHkgdGhlIHBhcmFtZXRlcnMgaXQgZXhwZWN0cy4KICAgIHN0YXRpc3RpY3NfaW5wdXRfZmlsdGVyZWQgPSB7a2V5OiBzdGF0aWNzX2lucHV0X2Z1bGxfZGljdFtrZXldIGZvciBrZXkgaW4gc3RhdGljc19mdW5jdGlvbl9pbnB1dF9kaWN0fQogICAgaWYgbGVuKHN0YXRpc3RpY3NfaW5wdXRfZmlsdGVyZWQpICE9IGxlbihzdGF0aWNzX2Z1bmN0aW9uX2lucHV0X2RpY3QpOgogICAgICAgIGNvbnRleHQubG9nZ2VyLndhcm5pbmcoZiJnZXRfc2FtcGxlX3NldF9zdGF0aXN0aWNzIGlzIGluIGFuIG9sZGVyIHZlcnNpb247ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb21lIHBhcmFtZXRlcnMgd2lsbCBub3QgYmUgc2VudCB0byB0aGUgZnVuY3Rpb24uIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiIgRXhwZWN0ZWQgaW5wdXQ6IHtsaXN0KHN0YXRpY3NfZnVuY3Rpb25faW5wdXRfZGljdC5rZXlzKCkpfSwiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmIiBhY3R1YWwgaW5wdXQ6IHtsaXN0KHN0YXRpc3RpY3NfaW5wdXRfZmlsdGVyZWQua2V5cygpKX0iKQogICAgcmV0dXJuIHN0YXRpc3RpY3NfaW5wdXRfZmlsdGVyZWQKCgpkZWYgaW5mZXIoCiAgICAgICAgY29udGV4dDogbWxydW4uTUxDbGllbnRDdHgsCiAgICAgICAgZGF0YXNldDogVW5pb25bbWxydW4uRGF0YUl0ZW0sIGxpc3QsIGRpY3QsIHBkLkRhdGFGcmFtZSwgcGQuU2VyaWVzLCBucC5uZGFycmF5XSwKICAgICAgICBtb2RlbF9wYXRoOiBVbmlvbltzdHIsIG1scnVuLkRhdGFJdGVtXSwKICAgICAgICBkcm9wX2NvbHVtbnM6IFVuaW9uW3N0ciwgTGlzdFtzdHJdLCBpbnQsIExpc3RbaW50XV0gPSBOb25lLAogICAgICAgIGxhYmVsX2NvbHVtbnM6IFVuaW9uW3N0ciwgTGlzdFtzdHJdXSA9IE5vbmUsCiAgICAgICAgZmVhdHVyZV9jb2x1bW5zOiBVbmlvbltzdHIsIExpc3Rbc3RyXV0gPSBOb25lLAogICAgICAgIGxvZ19yZXN1bHRfc2V0OiBib29sID0gVHJ1ZSwKICAgICAgICByZXN1bHRfc2V0X25hbWU6IHN0ciA9ICJwcmVkaWN0aW9uIiwKICAgICAgICBiYXRjaF9pZDogc3RyID0gTm9uZSwKICAgICAgICBhcnRpZmFjdHNfdGFnOiBzdHIgPSAiIiwKICAgICAgICAjIERyaWZ0IGFuYWx5c2lzIHBhcmFtZXRlcnMKICAgICAgICBwZXJmb3JtX2RyaWZ0X2FuYWx5c2lzOiBib29sID0gTm9uZSwKICAgICAgICBlbmRwb2ludF9pZDogc3RyID0gIiIsCiAgICAgICAgIyBUaGUgZm9sbG93aW5nIG1vZGVsIGVuZHBvaW50IHBhcmFtZXRlcnMgYXJlIHJlbGV2YW50IG9ubHkgaWY6CiAgICAgICAgIyBwZXJmb3JtIGRyaWZ0IGFuYWx5c2lzIGlzIG5vdCBkaXNhYmxlZAogICAgICAgICMgYSBuZXcgbW9kZWwgZW5kcG9pbnQgcmVjb3JkIGlzIGdvaW5nIHRvIGJlIGdlbmVyYXRlZAogICAgICAgIG1vZGVsX2VuZHBvaW50X25hbWU6IHN0ciA9ICJiYXRjaC1pbmZlciIsCiAgICAgICAgbW9kZWxfZW5kcG9pbnRfc2FtcGxlX3NldDogVW5pb25bCiAgICAgICAgICAgIG1scnVuLkRhdGFJdGVtLCBsaXN0LCBkaWN0LCBwZC5EYXRhRnJhbWUsIHBkLlNlcmllcywgbnAubmRhcnJheQogICAgICAgIF0gPSBOb25lLAoKICAgICAgICAjIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIG9uY2UgdGhlIHZlcnNpb25pbmcgbWVjaGFuaXNtIGlzIGltcGxlbWVudGVkCiAgICAgICAgIyBUT0RPOiBSZW1vdmUgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIG9uY2UgRkhVQi0xMyBpcyByZXNvbHZlZAogICAgICAgIHRyaWdnZXJfbW9uaXRvcmluZ19qb2I6IE9wdGlvbmFsW2Jvb2xdID0gTm9uZSwKICAgICAgICBiYXRjaF9pbWFnZV9qb2I6IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAgICAgIG1vZGVsX2VuZHBvaW50X2RyaWZ0X3RocmVzaG9sZDogT3B0aW9uYWxbZmxvYXRdID0gTm9uZSwKICAgICAgICBtb2RlbF9lbmRwb2ludF9wb3NzaWJsZV9kcmlmdF90aHJlc2hvbGQ6IE9wdGlvbmFsW2Zsb2F0XSA9IE5vbmUsCgogICAgICAgICMgcHJlZGljdGlvbiBrd2FyZ3MgdG8gcGFzcyB0byB0aGUgbW9kZWwgcHJlZGljdCBmdW5jdGlvbgogICAgICAgICoqcHJlZGljdF9rd2FyZ3M6IERpY3Rbc3RyLCBBbnldLAoKKToKICAgICIiIgogICAgUGVyZm9ybSBhIHByZWRpY3Rpb24gb24gdGhlIHByb3ZpZGVkIGRhdGFzZXQgdXNpbmcgdGhlIHNwZWNpZmllZCBtb2RlbC4KICAgIEVuc3VyZSB0aGF0IHRoZSBtb2RlbCBoYXMgYWxyZWFkeSBiZWVuIGxvZ2dlZCB1bmRlciB0aGUgY3VycmVudCBwcm9qZWN0LgoKICAgIElmIHlvdSB3aXNoIHRvIGFwcGx5IG1vbml0b3JpbmcgdG9vbHMgKGUuZy4sIGRyaWZ0IGFuYWx5c2lzKSwgc2V0IHRoZSBwZXJmb3JtX2RyaWZ0X2FuYWx5c2lzIHBhcmFtZXRlciB0byBUcnVlLgogICAgVGhpcyB3aWxsIGNyZWF0ZSBhIG5ldyBtb2RlbCBlbmRwb2ludCByZWNvcmQgdW5kZXIgdGhlIHNwZWNpZmllZCBtb2RlbF9lbmRwb2ludF9uYW1lLgogICAgQWRkaXRpb25hbGx5LCBlbnN1cmUgdGhhdCBtb2RlbCBtb25pdG9yaW5nIGlzIGVuYWJsZWQgYXQgdGhlIHByb2plY3QgbGV2ZWwgYnkgY2FsbGluZyB0aGUKICAgIHByb2plY3QuZW5hYmxlX21vZGVsX21vbml0b3JpbmcoKSBmdW5jdGlvbi4gWW91IGNhbiBhbHNvIGFwcGx5IG1vbml0b3JpbmcgdG8gYW4gZXhpc3RpbmcgbW9kZWwgYnkgcHJvdmlkaW5nIGl0cwogICAgZW5kcG9pbnQgaWQgb3IgbmFtZSwgYW5kIHRoZSBtb25pdG9yaW5nIHRvb2xzIHdpbGwgYmUgYXBwbGllZCB0byB0aGF0IGVuZHBvaW50LgoKICAgIEF0IHRoZSBtb21lbnQsIHRoaXMgZnVuY3Rpb24gaXMgc3VwcG9ydGVkIGZvciBgbWxydW4+PTEuNS4wYCB2ZXJzaW9ucy4KCiAgICA6cGFyYW0gY29udGV4dDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTFJ1biBjb250ZXh0LgogICAgOnBhcmFtIGRhdGFzZXQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRhdGFzZXQgdG8gaW5mZXIgdGhyb3VnaCB0aGUgbW9kZWwuIFByb3ZpZGVkIGFzIGFuIGlucHV0IChEYXRhSXRlbSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgcmVwcmVzZW50cyBEYXRhc2V0IGFydGlmYWN0IC8gRmVhdHVyZSB2ZWN0b3IgVVJJLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdXNpbmcgTUxSdW4gU0RLLCBgZGF0YXNldGAgY2FuIGFsc28gYmUgcHJvdmlkZWQgYXMgYSBsaXN0LCBkaWN0aW9uYXJ5IG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1weSBhcnJheS4KICAgIDpwYXJhbSBtb2RlbF9wYXRoOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGVsIHN0b3JlIHVyaSAoc2hvdWxkIHN0YXJ0IHdpdGggc3RvcmU6Ly8pLiBQcm92aWRlZCBhcyBhbiBpbnB1dCAoRGF0YUl0ZW0pLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdXNpbmcgTUxSdW4gU0RLLCBgbW9kZWxfcGF0aGAgY2FuIGFsc28gYmUgcHJvdmlkZWQgYXMgYSBwYXJhbWV0ZXIgKHN0cmluZykuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUbyBnZW5lcmF0ZSBhIHZhbGlkIG1vZGVsIHN0b3JlIFVSSSwgcGxlYXNlIGxvZyB0aGUgbW9kZWwgYmVmb3JlIHJ1bm5pbmcgdGhpcyBmdW5jdGlvbi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIGBlbmRwb2ludF9pZGAgb2YgZXhpc3RpbmcgbW9kZWwgZW5kcG9pbnQgaXMgcHJvdmlkZWQsIG1ha2Ugc3VyZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBpdCBoYXMgYSBzaW1pbGFyIG1vZGVsIHN0b3JlIHBhdGgsIG90aGVyd2lzZSB0aGUgZHJpZnQgYW5hbHlzaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvbid0IGJlIHRyaWdnZXJlZC4KICAgIDpwYXJhbSBkcm9wX2NvbHVtbnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgc3RyaW5nIC8gaW50ZWdlciBvciBhIGxpc3Qgb2Ygc3RyaW5ncyAvIGludGVnZXJzIHRoYXQgcmVwcmVzZW50IHRoZSBjb2x1bW4gbmFtZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gaW5kaWNlcyB0byBkcm9wLiBXaGVuIHRoZSBkYXRhc2V0IGlzIGEgbGlzdCBvciBhIG51bXB5IGFycmF5IHRoaXMgcGFyYW1ldGVyIG11c3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHJlcHJlc2VudGVkIGJ5IGludGVnZXJzLgogICAgOnBhcmFtIGxhYmVsX2NvbHVtbnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHRhcmdldCBsYWJlbChzKSBvZiB0aGUgY29sdW1uKHMpIGluIHRoZSBkYXRhc2V0IGZvciBSZWdyZXNzaW9uIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc2lmaWNhdGlvbiB0YXNrcy4gVGhlIGxhYmVsIGNvbHVtbiBjYW4gYmUgYWNjZXNzZWQgZnJvbSB0aGUgbW9kZWwgb2JqZWN0LCBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZlYXR1cmUgdmVjdG9yIHByb3ZpZGVkIGlmIGF2YWlsYWJsZS4KICAgIDpwYXJhbSBmZWF0dXJlX2NvbHVtbnM6ICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Qgb2YgZmVhdHVyZSBjb2x1bW5zIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGJ1aWxkIHRoZSBkYXRhZnJhbWUgd2hlbiBkYXRhc2V0IGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHR5cGUgbGlzdCBvciBudW1weSBhcnJheS4KICAgIDpwYXJhbSBsb2dfcmVzdWx0X3NldDogICAgICAgICAgICAgICAgICAgICAgICAgIFdoZXRoZXIgdG8gbG9nIHRoZSByZXN1bHQgc2V0IC0gYSBEYXRhRnJhbWUgb2YgdGhlIGdpdmVuIGlucHV0cyBjb25jYXRlbmF0ZWQgd2l0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHByZWRpY3Rpb25zLiBEZWZhdWx0ZWQgdG8gVHJ1ZS4KICAgIDpwYXJhbSByZXN1bHRfc2V0X25hbWU6ICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkYiBrZXkgdG8gc2V0IG5hbWUgb2YgdGhlIHByZWRpY3Rpb24gcmVzdWx0IGFuZCB0aGUgZmlsZW5hbWUuIERlZmF1bHRlZCB0bwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ByZWRpY3Rpb24nLgogICAgOnBhcmFtIGJhdGNoX2lkOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIElEIG9mIHRoZSBnaXZlbiBiYXRjaCAoaW5mZXJlbmNlIGRhdGFzZXQpLiBJZiBgTm9uZWAsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lsbCBiZSBsb2dnZWQgYXMgYSByZXN1bHQgb2YgdGhlIHJ1bi4KICAgIDpwYXJhbSBhcnRpZmFjdHNfdGFnOiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhZyB0byB1c2UgZm9yIHByZWRpY3Rpb24gc2V0IHJlc3VsdCBhcnRpZmFjdC4KICAgIDpwYXJhbSBwZXJmb3JtX2RyaWZ0X2FuYWx5c2lzOiAgICAgICAgICAgICAgICAgIFdoZXRoZXIgdG8gcGVyZm9ybSBkcmlmdCBhbmFseXNpcyBiZXR3ZWVuIHRoZSBzYW1wbGUgc2V0IG9mIHRoZSBtb2RlbCBvYmplY3QgdG8gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhc2V0IGdpdmVuLiBCeSBkZWZhdWx0LCBOb25lLCB3aGljaCBtZWFucyBpdCB3aWxsIHBlcmZvcm0gZHJpZnQgYW5hbHlzaXMgaWYgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCBhbHJlYWR5IGhhcyBmZWF0dXJlIHN0YXRzIHRoYXQgYXJlIGNvbnNpZGVyZWQgYXMgYSByZWZlcmVuY2Ugc2FtcGxlIHNldC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1pbmcgZHJpZnQgYW5hbHlzaXMgb24gYSBuZXcgZW5kcG9pbnQgaWQgd2lsbCBnZW5lcmF0ZSBhIG5ldyBtb2RlbCBlbmRwb2ludAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkLgogICAgOnBhcmFtIGVuZHBvaW50X2lkOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZWwgZW5kcG9pbnQgdW5pcXVlIElELiBJZiBgcGVyZm9ybV9kcmlmdF9hbmFseXNpc2Agd2FzIHNldCwgdGhlIGVuZHBvaW50X2lkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHVzZWQgZWl0aGVyIHRvIHBlcmZvcm0gdGhlIGFuYWx5c2lzIG9uIGV4aXN0aW5nIG1vZGVsIGVuZHBvaW50IG9yIHRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZSBhIG5ldyBtb2RlbCBlbmRwb2ludCByZWNvcmQuCiAgICA6cGFyYW0gbW9kZWxfZW5kcG9pbnRfbmFtZTogICAgICAgICAgICAgICAgICAgICBJZiBhIG5ldyBtb2RlbCBlbmRwb2ludCBpcyBnZW5lcmF0ZWQsIHRoZSBtb2RlbCBuYW1lIHdpbGwgYmUgcHJlc2VudGVkIHVuZGVyIHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50LgogICAgOnBhcmFtIG1vZGVsX2VuZHBvaW50X3NhbXBsZV9zZXQ6ICAgICAgICAgICAgICAgQSBzYW1wbGUgZGF0YXNldCB0byBnaXZlIHRvIGNvbXBhcmUgdGhlIGlucHV0cyBpbiB0aGUgZHJpZnQgYW5hbHlzaXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW4gYmUgcHJvdmlkZWQgYXMgYW4gaW5wdXQgKERhdGFJdGVtKSBvciBhcyBhIHBhcmFtZXRlciAoZS5nLiBzdHJpbmcsIGxpc3QsIERhdGFGcmFtZSkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCBjaG9zZW4gc2FtcGxlIHNldCB3aWxsIGFsd2F5cyBiZSB0aGUgb25lIHdobyBpcyBzZXQgaW4gdGhlIG1vZGVsIGFydGlmYWN0IGl0c2VsZi4KICAgIDpwYXJhbSB0cmlnZ2VyX21vbml0b3Jpbmdfam9iOiAgICAgICAgICAgICAgICAgIFdoZXRoZXIgdG8gdHJpZ2dlciB0aGUgYmF0Y2ggZHJpZnQgYW5hbHlzaXMgYWZ0ZXIgdGhlIGluZmVyIGpvYi4KICAgIDpwYXJhbSBiYXRjaF9pbWFnZV9qb2I6ICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBpbWFnZSB0aGF0IHdpbGwgYmUgdXNlZCB0byByZWdpc3RlciB0aGUgbW9uaXRvcmluZyBiYXRjaCBqb2IgaWYgbm90IGV4aXN0LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnkgZGVmYXVsdCwgdGhlIGltYWdlIGlzIG1scnVuL21scnVuLgogICAgOnBhcmFtIG1vZGVsX2VuZHBvaW50X2RyaWZ0X3RocmVzaG9sZDogICAgICAgICAgVGhlIHRocmVzaG9sZCBvZiB3aGljaCB0byBtYXJrIGRyaWZ0cy4gRGVmYXVsdGVkIHRvIDAuNy4KICAgIDpwYXJhbSBtb2RlbF9lbmRwb2ludF9wb3NzaWJsZV9kcmlmdF90aHJlc2hvbGQ6IFRoZSB0aHJlc2hvbGQgb2Ygd2hpY2ggdG8gbWFyayBwb3NzaWJsZSBkcmlmdHMuIERlZmF1bHRlZCB0byAwLjUuCgogICAgcmFpc2VzIE1MUnVuSW52YWxpZEFyZ3VtZW50RXJyb3I6IGlmIGJvdGggYG1vZGVsX3BhdGhgIGFuZCBgZW5kcG9pbnRfaWRgIGFyZSBub3QgcHJvdmlkZWQKICAgICIiIgoKCiAgICBpZiB0cmlnZ2VyX21vbml0b3Jpbmdfam9iOgogICAgICAgIGNvbnRleHQubG9nZ2VyLndhcm5pbmcoIlRoZSBgdHJpZ2dlcl9tb25pdG9yaW5nX2pvYmAgcGFyYW1ldGVyIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBvbmNlIHRoZSB2ZXJzaW9uaW5nIG1lY2hhbmlzbSBpcyBpbXBsZW1lbnRlZC4gIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlmIHlvdSBhcmUgdXNpbmcgbWxydW48MS43LjAsIHBsZWFzZSBpbXBvcnQgdGhlIHByZXZpb3VzIHZlcnNpb24gb2YgdGhpcyBmdW5jdGlvbiwgZm9yIGV4YW1wbGUgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIidodWI6Ly9iYXRjaF9pbmZlcmVuY2VfdjI6Mi41LjAnLiIpCiAgICBpZiBiYXRjaF9pbWFnZV9qb2I6CiAgICAgICAgY29udGV4dC5sb2dnZXIud2FybmluZygiVGhlIGBiYXRjaF9pbWFnZV9qb2JgIHBhcmFtZXRlciBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgb25jZSB0aGUgdmVyc2lvbmluZyBtZWNoYW5pc20gaXMgaW1wbGVtZW50ZWQuICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZiB5b3UgYXJlIHVzaW5nIG1scnVuPDEuNy4wLCBwbGVhc2UgaW1wb3J0IHRoZSBwcmV2aW91cyB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb24sIGZvciBleGFtcGxlICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInaHViOi8vYmF0Y2hfaW5mZXJlbmNlX3YyOjIuNS4wJy4iKQogICAgaWYgbW9kZWxfZW5kcG9pbnRfZHJpZnRfdGhyZXNob2xkOgogICAgICAgIGNvbnRleHQubG9nZ2VyLndhcm5pbmcoIlRoZSBgbW9kZWxfZW5kcG9pbnRfZHJpZnRfdGhyZXNob2xkYCBwYXJhbWV0ZXIgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIG9uY2UgdGhlIHZlcnNpb25pbmcgbWVjaGFuaXNtIGlzIGltcGxlbWVudGVkLiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWYgeW91IGFyZSB1c2luZyBtbHJ1bjwxLjcuMCwgcGxlYXNlIGltcG9ydCB0aGUgcHJldmlvdXMgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uLCBmb3IgZXhhbXBsZSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJ2h1YjovL2JhdGNoX2luZmVyZW5jZV92MjoyLjUuMCcuIikKICAgIGlmIG1vZGVsX2VuZHBvaW50X3Bvc3NpYmxlX2RyaWZ0X3RocmVzaG9sZDoKICAgICAgICBjb250ZXh0LmxvZ2dlci53YXJuaW5nKCJUaGUgYG1vZGVsX2VuZHBvaW50X3Bvc3NpYmxlX2RyaWZ0X3RocmVzaG9sZGAgcGFyYW1ldGVyIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBvbmNlIHRoZSB2ZXJzaW9uaW5nIG1lY2hhbmlzbSBpcyBpbXBsZW1lbnRlZC4gIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlmIHlvdSBhcmUgdXNpbmcgbWxydW48MS43LjAsIHBsZWFzZSBpbXBvcnQgdGhlIHByZXZpb3VzIHZlcnNpb24gb2YgdGhpcyBmdW5jdGlvbiwgZm9yIGV4YW1wbGUgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIidodWI6Ly9iYXRjaF9pbmZlcmVuY2VfdjI6Mi41LjAnLiIpCgogICAgIyBMb2FkaW5nIHRoZSBtb2RlbDoKICAgIGNvbnRleHQubG9nZ2VyLmluZm8oZiJMb2FkaW5nIG1vZGVsLi4uIikKICAgIGlmIGlzaW5zdGFuY2UobW9kZWxfcGF0aCwgbWxydW4uRGF0YUl0ZW0pOgogICAgICAgIG1vZGVsX3BhdGggPSBtb2RlbF9wYXRoLmFydGlmYWN0X3VybAogICAgaWYgbm90IG1scnVuLmRhdGFzdG9yZS5pc19zdG9yZV91cmkobW9kZWxfcGF0aCk6CiAgICAgICAgcmFpc2UgbWxydW4uZXJyb3JzLk1MUnVuSW52YWxpZEFyZ3VtZW50RXJyb3IoCiAgICAgICAgICAgIGYiVGhlIHByb3ZpZGVkIG1vZGVsIHBhdGggKHttb2RlbF9wYXRofSkgaXMgaW52YWxpZCAtIHNob3VsZCBzdGFydCB3aXRoIGBzdG9yZTovL2AuICIKICAgICAgICAgICAgZiJQbGVhc2UgbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgbG9nZ2VkIHRoZSBtb2RlbCB1c2luZyBgcHJvamVjdC5sb2dfbW9kZWwoKWAgIgogICAgICAgICAgICBmIndoaWNoIGdlbmVyYXRlcyBhIHVuaXF1ZSBzdG9yZSB1cmkgZm9yIHRoZSBsb2dnZWQgbW9kZWwuIgogICAgICAgICkKICAgIG1vZGVsX2hhbmRsZXIgPSBBdXRvTUxSdW4ubG9hZF9tb2RlbChtb2RlbF9wYXRoPW1vZGVsX3BhdGgsIGNvbnRleHQ9Y29udGV4dCkKCiAgICBpZiBsYWJlbF9jb2x1bW5zIGlzIE5vbmU6CiAgICAgICAgbGFiZWxfY29sdW1ucyA9IFsKICAgICAgICAgICAgb3V0cHV0Lm5hbWUgZm9yIG91dHB1dCBpbiBtb2RlbF9oYW5kbGVyLl9tb2RlbF9hcnRpZmFjdC5zcGVjLm91dHB1dHMKICAgICAgICBdCgogICAgaWYgZmVhdHVyZV9jb2x1bW5zIGlzIE5vbmU6CiAgICAgICAgZmVhdHVyZV9jb2x1bW5zID0gWwogICAgICAgICAgICBpbnB1dC5uYW1lIGZvciBpbnB1dCBpbiBtb2RlbF9oYW5kbGVyLl9tb2RlbF9hcnRpZmFjdC5zcGVjLmlucHV0cwogICAgICAgIF0KCiAgICAjIEdldCBkYXRhc2V0IGJ5IG9iamVjdCwgVVJMIG9yIGJ5IEZlYXR1cmVWZWN0b3I6CiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYiTG9hZGluZyBkYXRhLi4uIikKICAgIHgsIGxhYmVsX2NvbHVtbnMgPSBtbHJ1bi5tb2RlbF9tb25pdG9yaW5nLmFwaS5yZWFkX2RhdGFzZXRfYXNfZGF0YWZyYW1lKAogICAgICAgIGRhdGFzZXQ9ZGF0YXNldCwKICAgICAgICBmZWF0dXJlX2NvbHVtbnM9ZmVhdHVyZV9jb2x1bW5zLAogICAgICAgIGxhYmVsX2NvbHVtbnM9bGFiZWxfY29sdW1ucywKICAgICAgICBkcm9wX2NvbHVtbnM9ZHJvcF9jb2x1bW5zLAogICAgKQoKICAgICMgUHJlZGljdDoKICAgIGNvbnRleHQubG9nZ2VyLmluZm8oZiJDYWxjdWxhdGluZyBwcmVkaWN0aW9uLi4uIikKICAgIHlfcHJlZCA9IG1vZGVsX2hhbmRsZXIubW9kZWwucHJlZGljdCh4LCAqKnByZWRpY3Rfa3dhcmdzKQoKICAgICMgUHJlcGFyZSB0aGUgcmVzdWx0IHNldDoKICAgIHJlc3VsdF9zZXQgPSBfcHJlcGFyZV9yZXN1bHRfc2V0KHg9eCwgbGFiZWxfY29sdW1ucz1sYWJlbF9jb2x1bW5zLCB5X3ByZWQ9eV9wcmVkKQoKICAgICMgQ2hlY2sgZm9yIGxvZ2dpbmcgdGhlIHJlc3VsdCBzZXQ6CiAgICBpZiBsb2dfcmVzdWx0X3NldDoKICAgICAgICBtbHJ1bi5tb2RlbF9tb25pdG9yaW5nLmFwaS5sb2dfcmVzdWx0KAogICAgICAgICAgICBjb250ZXh0PWNvbnRleHQsCiAgICAgICAgICAgIHJlc3VsdF9zZXRfbmFtZT1yZXN1bHRfc2V0X25hbWUsCiAgICAgICAgICAgIHJlc3VsdF9zZXQ9cmVzdWx0X3NldCwKICAgICAgICAgICAgYXJ0aWZhY3RzX3RhZz1hcnRpZmFjdHNfdGFnLAogICAgICAgICAgICBiYXRjaF9pZD1iYXRjaF9pZCwKICAgICAgICApCgogICAgIyBDaGVjayBmb3IgcGVyZm9ybWluZyBkcmlmdCBhbmFseXNpcwogICAgaWYgKAogICAgICAgICAgICBwZXJmb3JtX2RyaWZ0X2FuYWx5c2lzIGlzIE5vbmUKICAgICAgICAgICAgYW5kIG1vZGVsX2hhbmRsZXIuX21vZGVsX2FydGlmYWN0LnNwZWMuZmVhdHVyZV9zdGF0cyBpcyBub3QgTm9uZQogICAgKToKICAgICAgICBwZXJmb3JtX2RyaWZ0X2FuYWx5c2lzID0gVHJ1ZQogICAgaWYgcGVyZm9ybV9kcmlmdF9hbmFseXNpczoKICAgICAgICBjb250ZXh0LmxvZ2dlci5pbmZvKCJQZXJmb3JtaW5nIGRyaWZ0IGFuYWx5c2lzLi4uIikKICAgICAgICAjIEdldCB0aGUgc2FtcGxlIHNldCBzdGF0aXN0aWNzIChlaXRoZXIgZnJvbSB0aGUgc2FtcGxlIHNldCBvciBmcm9tIHRoZSBzdGF0aXN0aWNzIGxvZ2dlZCB3aXRoIHRoZSBtb2RlbCkKICAgICAgICBzdGF0aXN0aWNzX2lucHV0X2ZpbHRlcmVkID0gX2dldF9zYW1wbGVfc2V0X3N0YXRpc3RpY3NfcGFyYW1ldGVycygKICAgICAgICAgICAgY29udGV4dD1jb250ZXh0LAogICAgICAgICAgICBtb2RlbF9lbmRwb2ludF9zYW1wbGVfc2V0PW1vZGVsX2VuZHBvaW50X3NhbXBsZV9zZXQsCiAgICAgICAgICAgIG1vZGVsX2FydGlmYWN0X2ZlYXR1cmVfc3RhdHM9bW9kZWxfaGFuZGxlci5fbW9kZWxfYXJ0aWZhY3Quc3BlYy5mZWF0dXJlX3N0YXRzLAogICAgICAgICAgICBmZWF0dXJlX2NvbHVtbnM9ZmVhdHVyZV9jb2x1bW5zLAogICAgICAgICAgICBkcm9wX2NvbHVtbnM9ZHJvcF9jb2x1bW5zLAogICAgICAgICAgICBsYWJlbF9jb2x1bW5zPWxhYmVsX2NvbHVtbnMpCiAgICAgICAgc2FtcGxlX3NldF9zdGF0aXN0aWNzID0gbWxydW4ubW9kZWxfbW9uaXRvcmluZy5hcGkuZ2V0X3NhbXBsZV9zZXRfc3RhdGlzdGljcygqKnN0YXRpc3RpY3NfaW5wdXRfZmlsdGVyZWQpCiAgICAgICAgbWxydW4ubW9kZWxfbW9uaXRvcmluZy5hcGkucmVjb3JkX3Jlc3VsdHMoCiAgICAgICAgICAgIHByb2plY3Q9Y29udGV4dC5wcm9qZWN0LAogICAgICAgICAgICBjb250ZXh0PWNvbnRleHQsCiAgICAgICAgICAgIGVuZHBvaW50X2lkPWVuZHBvaW50X2lkLAogICAgICAgICAgICBtb2RlbF9wYXRoPW1vZGVsX3BhdGgsCiAgICAgICAgICAgIG1vZGVsX2VuZHBvaW50X25hbWU9bW9kZWxfZW5kcG9pbnRfbmFtZSwKICAgICAgICAgICAgaW5mZXJfcmVzdWx0c19kZj1yZXN1bHRfc2V0LmNvcHkoKSwKICAgICAgICAgICAgc2FtcGxlX3NldF9zdGF0aXN0aWNzPXNhbXBsZV9zZXRfc3RhdGlzdGljcywKICAgICAgICAp + code_origin: '' + auto_build: false + origin_filename: '' entry_points: infer: - has_kwargs: true - lineno: 102 - has_varargs: false - doc: 'Perform a prediction on the provided dataset using the specified model. - - Ensure that the model has already been logged under the current project. - - - If you wish to apply monitoring tools (e.g., drift analysis), set the perform_drift_analysis - parameter to True. - - This will create a new model endpoint record under the specified model_endpoint_name. - - Additionally, ensure that model monitoring is enabled at the project level - by calling the - - project.enable_model_monitoring() function. You can also apply monitoring - to an existing model by providing its - - endpoint id or name, and the monitoring tools will be applied to that endpoint. - - - At the moment, this function is supported for `mlrun>=1.5.0` versions.' parameters: - name: context type: MLClientCtx @@ -105,24 +93,53 @@ spec: DataFrame). The default chosen sample set will always be the one who is set in the model artifact itself. default: null + - name: trigger_monitoring_job + type: Optional[bool] + doc: Whether to trigger the batch drift analysis after the infer job. + default: null + - name: batch_image_job + type: Optional[str] + doc: The image that will be used to register the monitoring batch job if not + exist. By default, the image is mlrun/mlrun. + default: null + - name: model_endpoint_drift_threshold + type: Optional[float] + doc: The threshold of which to mark drifts. Defaulted to 0.7. + default: null + - name: model_endpoint_possible_drift_threshold + type: Optional[float] + doc: The threshold of which to mark possible drifts. Defaulted to 0.5. + default: null + has_kwargs: true + lineno: 102 name: infer - description: Batch inference (also knows as prediction) for the common ML frameworks - (SciKit-Learn, XGBoost and LightGBM) while performing data drift analysis. - allow_empty_resources: true - build: - with_mlrun: false - code_origin: '' - functionSourceCode: IyBDb3B5cmlnaHQgMjAyMyBJZ3VhemlvCiMKIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgpmcm9tIGluc3BlY3QgaW1wb3J0IHNpZ25hdHVyZQpmcm9tIHR5cGluZyBpbXBvcnQgQW55LCBEaWN0LCBMaXN0LCBVbmlvbiwgT3B0aW9uYWwKaW1wb3J0IG1scnVuCgp0cnk6CiAgICBpbXBvcnQgbWxydW4ubW9kZWxfbW9uaXRvcmluZy5hcGkKZXhjZXB0IE1vZHVsZU5vdEZvdW5kRXJyb3I6CiAgICByYWlzZSBtbHJ1bi5lcnJvcnMuTUxSdW5Ob3RGb3VuZEVycm9yKAogICAgICAgIGYiUGxlYXNlIHVwZGF0ZSB5b3VyIGBtbHJ1bmAgdmVyc2lvbiB0byA+PTEuNS4wIG9yIHVzZSBhbiAiCiAgICAgICAgZiJvbGRlciB2ZXJzaW9uIG9mIHRoZSBiYXRjaCBpbmZlcmVuY2UgZnVuY3Rpb24uIgogICAgKQoKaW1wb3J0IG51bXB5IGFzIG5wCmltcG9ydCBwYW5kYXMgYXMgcGQKZnJvbSBtbHJ1bi5mcmFtZXdvcmtzLmF1dG9fbWxydW4gaW1wb3J0IEF1dG9NTFJ1bgoKCmRlZiBfcHJlcGFyZV9yZXN1bHRfc2V0KHg6IHBkLkRhdGFGcmFtZSwgbGFiZWxfY29sdW1uczogTGlzdFtzdHJdLCB5X3ByZWQ6IG5wLm5kYXJyYXkpIC0+IHBkLkRhdGFGcmFtZToKICAgICIiIgogICAgU2V0IGRlZmF1bHQgbGFiZWwgY29sdW1uIG5hbWVzIGFuZCB2YWxpZGF0ZSBnaXZlbiBuYW1lcyB0byBwcmVwYXJlIHRoZSByZXN1bHQgc2V0IC0gYSBjb25jYXRlbmF0aW9uIG9mIHRoZSBpbnB1dHMKICAgICh4KSBhbmQgdGhlIG1vZGVsIHByZWRpY3Rpb25zICh5X3ByZWQpLgoKICAgIDpwYXJhbSB4OiAgICAgICAgICAgICBUaGUgaW5wdXRzLgogICAgOnBhcmFtIGxhYmVsX2NvbHVtbnM6IEEgbGlzdCBvZiBzdHJpbmdzIHJlcHJlc2VudGluZyB0aGUgdGFyZ2V0IGNvbHVtbiBuYW1lcyB0byBhZGQgdG8gdGhlIHByZWRpY3Rpb25zLiBEZWZhdWx0IG5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHVzZWQgaW4gY2FzZSB0aGUgbGlzdCBpcyBlbXB0eSAocHJlZGljdGVkX2xhYmVsX3tpfSkuCiAgICA6cGFyYW0geV9wcmVkOiAgICAgICAgVGhlIG1vZGVsIHByZWRpY3Rpb25zIG9uIHRoZSBpbnB1dHMuCgogICAgOnJldHVybnM6IFRoZSByZXN1bHQgc2V0LgoKICAgIHJhaXNlcyBNTFJ1bkludmFsaWRBcmd1bWVudEVycm9yOiBJZiB0aGUgbGFiZWxzIGNvbHVtbnMgYW1vdW50IGRvIG5vdCBtYXRjaCB0aGUgb3V0cHV0cyBvciBpZiBvbmUgb2YgdGhlIGxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgZGF0YXNldC4KICAgICIiIgogICAgIyBQcmVwYXJlIGRlZmF1bHQgdGFyZ2V0IGNvbHVtbnMgbmFtZXMgaWYgbm90IHByb3ZpZGVkOgogICAgcHJlZGljdGlvbl9jb2x1bW5zX2Ftb3VudCA9IDEgaWYgbGVuKHlfcHJlZC5zaGFwZSkgPT0gMSBlbHNlIHlfcHJlZC5zaGFwZVsxXQogICAgaWYgbGVuKGxhYmVsX2NvbHVtbnMpID09IDA6CiAgICAgICAgIyBBZGQgZGVmYXVsdCBsYWJlbCBjb2x1bW4gbmFtZXM6CiAgICAgICAgaWYgcHJlZGljdGlvbl9jb2x1bW5zX2Ftb3VudCA9PSAxOgogICAgICAgICAgICBsYWJlbF9jb2x1bW5zID0gWyJwcmVkaWN0ZWRfbGFiZWwiXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGxhYmVsX2NvbHVtbnMgPSBbCiAgICAgICAgICAgICAgICBmInByZWRpY3RlZF9sYWJlbF97aX0iIGZvciBpIGluIHJhbmdlKHByZWRpY3Rpb25fY29sdW1uc19hbW91bnQpCiAgICAgICAgICAgIF0KCiAgICAjIFZhbGlkYXRlIHRoZSBsYWJlbCBjb2x1bW5zOgogICAgaWYgcHJlZGljdGlvbl9jb2x1bW5zX2Ftb3VudCAhPSBsZW4obGFiZWxfY29sdW1ucyk6CiAgICAgICAgIyBObyBlcXVhbGl0eSBiZXR3ZWVuIHByb3ZpZGVkIGxhYmVsIGNvbHVtbiBuYW1lcyBhbmQgb3V0cHV0cyBhbW91bnQ6CiAgICAgICAgcmFpc2UgbWxydW4uZXJyb3JzLk1MUnVuSW52YWxpZEFyZ3VtZW50RXJyb3IoCiAgICAgICAgICAgIGYiVGhlIG51bWJlciBvZiBwcmVkaWN0ZWQgbGFiZWxzOiB7cHJlZGljdGlvbl9jb2x1bW5zX2Ftb3VudH0gIgogICAgICAgICAgICBmImlzIG5vdCBlcXVhbCB0byB0aGUgZ2l2ZW4gbGFiZWwgY29sdW1uczoge2xlbihsYWJlbF9jb2x1bW5zKX0iCiAgICAgICAgKQogICAgY29tbW9uX2xhYmVscyA9IHNldChsYWJlbF9jb2x1bW5zKSAmIHNldCh4LmNvbHVtbnMudG9saXN0KCkpCiAgICBpZiBjb21tb25fbGFiZWxzOgogICAgICAgICMgTGFiZWwgY29sdW1uIGV4aXN0IGluIHRoZSBvcmlnaW5hbCBpbnB1dHM6CiAgICAgICAgcmFpc2UgbWxydW4uZXJyb3JzLk1MUnVuSW52YWxpZEFyZ3VtZW50RXJyb3IoCiAgICAgICAgICAgIGYiVGhlIGxhYmVsczoge2NvbW1vbl9sYWJlbHN9IGFyZSBhbHJlYWR5IGV4aXN0ZWQgaW4gdGhlIGdpdmVuIGRhdGFzZXQuIgogICAgICAgICkKCiAgICByZXR1cm4gcGQuY29uY2F0KAogICAgICAgIFt4LCBwZC5EYXRhRnJhbWUoeV9wcmVkLCBjb2x1bW5zPWxhYmVsX2NvbHVtbnMsIGluZGV4PXguaW5kZXgpXSwgYXhpcz0xCiAgICApCgoKZGVmIF9nZXRfc2FtcGxlX3NldF9zdGF0aXN0aWNzX3BhcmFtZXRlcnMoY29udGV4dDogbWxydW4uTUxDbGllbnRDdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX2VuZHBvaW50X3NhbXBsZV9zZXQ6IFVuaW9uWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWxydW4uRGF0YUl0ZW0sIGxpc3QsIGRpY3QsIHBkLkRhdGFGcmFtZSwgcGQuU2VyaWVzLCBucC5uZGFycmF5XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfYXJ0aWZhY3RfZmVhdHVyZV9zdGF0czogZGljdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZV9jb2x1bW5zOiBPcHRpb25hbFtMaXN0XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcF9jb2x1bW5zOiBPcHRpb25hbFtMaXN0XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxfY29sdW1uczogT3B0aW9uYWxbTGlzdF0pIC0+IERpY3Rbc3RyLCBBbnldOgogICAgc3RhdGljc19pbnB1dF9mdWxsX2RpY3QgPSBkaWN0KHNhbXBsZV9zZXQ9bW9kZWxfZW5kcG9pbnRfc2FtcGxlX3NldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9hcnRpZmFjdF9mZWF0dXJlX3N0YXRzPW1vZGVsX2FydGlmYWN0X2ZlYXR1cmVfc3RhdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlX3NldF9jb2x1bW5zPWZlYXR1cmVfY29sdW1ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVfc2V0X2Ryb3BfY29sdW1ucz1kcm9wX2NvbHVtbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlX3NldF9sYWJlbF9jb2x1bW5zPWxhYmVsX2NvbHVtbnMpCiAgICBnZXRfc2FtcGxlX3N0YXRpY3NfZnVuY3Rpb24gPSBtbHJ1bi5tb2RlbF9tb25pdG9yaW5nLmFwaS5nZXRfc2FtcGxlX3NldF9zdGF0aXN0aWNzCiAgICBzdGF0aWNzX2Z1bmN0aW9uX2lucHV0X2RpY3QgPSBzaWduYXR1cmUoZ2V0X3NhbXBsZV9zdGF0aWNzX2Z1bmN0aW9uKS5wYXJhbWV0ZXJzCiAgICAjICBBcyBhIHJlc3VsdCBvZiBjaGFuZ2VzIHRvIGlucHV0IHBhcmFtZXRlcnMgaW4gdGhlIG1scnVuLWdldF9zYW1wbGVfc2V0X3N0YXRpc3RpY3MgZnVuY3Rpb24sCiAgICAjICB3ZSB3aWxsIG5vdyBzZW5kIG9ubHkgdGhlIHBhcmFtZXRlcnMgaXQgZXhwZWN0cy4KICAgIHN0YXRpc3RpY3NfaW5wdXRfZmlsdGVyZWQgPSB7a2V5OiBzdGF0aWNzX2lucHV0X2Z1bGxfZGljdFtrZXldIGZvciBrZXkgaW4gc3RhdGljc19mdW5jdGlvbl9pbnB1dF9kaWN0fQogICAgaWYgbGVuKHN0YXRpc3RpY3NfaW5wdXRfZmlsdGVyZWQpICE9IGxlbihzdGF0aWNzX2Z1bmN0aW9uX2lucHV0X2RpY3QpOgogICAgICAgIGNvbnRleHQubG9nZ2VyLndhcm5pbmcoZiJnZXRfc2FtcGxlX3NldF9zdGF0aXN0aWNzIGlzIGluIGFuIG9sZGVyIHZlcnNpb247ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb21lIHBhcmFtZXRlcnMgd2lsbCBub3QgYmUgc2VudCB0byB0aGUgZnVuY3Rpb24uIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiIgRXhwZWN0ZWQgaW5wdXQ6IHtsaXN0KHN0YXRpY3NfZnVuY3Rpb25faW5wdXRfZGljdC5rZXlzKCkpfSwiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmIiBhY3R1YWwgaW5wdXQ6IHtsaXN0KHN0YXRpc3RpY3NfaW5wdXRfZmlsdGVyZWQua2V5cygpKX0iKQogICAgcmV0dXJuIHN0YXRpc3RpY3NfaW5wdXRfZmlsdGVyZWQKCgpkZWYgaW5mZXIoCiAgICAgICAgY29udGV4dDogbWxydW4uTUxDbGllbnRDdHgsCiAgICAgICAgZGF0YXNldDogVW5pb25bbWxydW4uRGF0YUl0ZW0sIGxpc3QsIGRpY3QsIHBkLkRhdGFGcmFtZSwgcGQuU2VyaWVzLCBucC5uZGFycmF5XSwKICAgICAgICBtb2RlbF9wYXRoOiBVbmlvbltzdHIsIG1scnVuLkRhdGFJdGVtXSwKICAgICAgICBkcm9wX2NvbHVtbnM6IFVuaW9uW3N0ciwgTGlzdFtzdHJdLCBpbnQsIExpc3RbaW50XV0gPSBOb25lLAogICAgICAgIGxhYmVsX2NvbHVtbnM6IFVuaW9uW3N0ciwgTGlzdFtzdHJdXSA9IE5vbmUsCiAgICAgICAgZmVhdHVyZV9jb2x1bW5zOiBVbmlvbltzdHIsIExpc3Rbc3RyXV0gPSBOb25lLAogICAgICAgIGxvZ19yZXN1bHRfc2V0OiBib29sID0gVHJ1ZSwKICAgICAgICByZXN1bHRfc2V0X25hbWU6IHN0ciA9ICJwcmVkaWN0aW9uIiwKICAgICAgICBiYXRjaF9pZDogc3RyID0gTm9uZSwKICAgICAgICBhcnRpZmFjdHNfdGFnOiBzdHIgPSAiIiwKICAgICAgICAjIERyaWZ0IGFuYWx5c2lzIHBhcmFtZXRlcnMKICAgICAgICBwZXJmb3JtX2RyaWZ0X2FuYWx5c2lzOiBib29sID0gTm9uZSwKICAgICAgICBlbmRwb2ludF9pZDogc3RyID0gIiIsCiAgICAgICAgIyBUaGUgZm9sbG93aW5nIG1vZGVsIGVuZHBvaW50IHBhcmFtZXRlcnMgYXJlIHJlbGV2YW50IG9ubHkgaWY6CiAgICAgICAgIyBwZXJmb3JtIGRyaWZ0IGFuYWx5c2lzIGlzIG5vdCBkaXNhYmxlZAogICAgICAgICMgYSBuZXcgbW9kZWwgZW5kcG9pbnQgcmVjb3JkIGlzIGdvaW5nIHRvIGJlIGdlbmVyYXRlZAogICAgICAgIG1vZGVsX2VuZHBvaW50X25hbWU6IHN0ciA9ICJiYXRjaC1pbmZlciIsCiAgICAgICAgbW9kZWxfZW5kcG9pbnRfc2FtcGxlX3NldDogVW5pb25bCiAgICAgICAgICAgIG1scnVuLkRhdGFJdGVtLCBsaXN0LCBkaWN0LCBwZC5EYXRhRnJhbWUsIHBkLlNlcmllcywgbnAubmRhcnJheQogICAgICAgIF0gPSBOb25lLAogICAgICAgICoqcHJlZGljdF9rd2FyZ3M6IERpY3Rbc3RyLCBBbnldLAopOgogICAgIiIiCiAgICBQZXJmb3JtIGEgcHJlZGljdGlvbiBvbiB0aGUgcHJvdmlkZWQgZGF0YXNldCB1c2luZyB0aGUgc3BlY2lmaWVkIG1vZGVsLgogICAgRW5zdXJlIHRoYXQgdGhlIG1vZGVsIGhhcyBhbHJlYWR5IGJlZW4gbG9nZ2VkIHVuZGVyIHRoZSBjdXJyZW50IHByb2plY3QuCgogICAgSWYgeW91IHdpc2ggdG8gYXBwbHkgbW9uaXRvcmluZyB0b29scyAoZS5nLiwgZHJpZnQgYW5hbHlzaXMpLCBzZXQgdGhlIHBlcmZvcm1fZHJpZnRfYW5hbHlzaXMgcGFyYW1ldGVyIHRvIFRydWUuCiAgICBUaGlzIHdpbGwgY3JlYXRlIGEgbmV3IG1vZGVsIGVuZHBvaW50IHJlY29yZCB1bmRlciB0aGUgc3BlY2lmaWVkIG1vZGVsX2VuZHBvaW50X25hbWUuCiAgICBBZGRpdGlvbmFsbHksIGVuc3VyZSB0aGF0IG1vZGVsIG1vbml0b3JpbmcgaXMgZW5hYmxlZCBhdCB0aGUgcHJvamVjdCBsZXZlbCBieSBjYWxsaW5nIHRoZQogICAgcHJvamVjdC5lbmFibGVfbW9kZWxfbW9uaXRvcmluZygpIGZ1bmN0aW9uLiBZb3UgY2FuIGFsc28gYXBwbHkgbW9uaXRvcmluZyB0byBhbiBleGlzdGluZyBtb2RlbCBieSBwcm92aWRpbmcgaXRzCiAgICBlbmRwb2ludCBpZCBvciBuYW1lLCBhbmQgdGhlIG1vbml0b3JpbmcgdG9vbHMgd2lsbCBiZSBhcHBsaWVkIHRvIHRoYXQgZW5kcG9pbnQuCgogICAgQXQgdGhlIG1vbWVudCwgdGhpcyBmdW5jdGlvbiBpcyBzdXBwb3J0ZWQgZm9yIGBtbHJ1bj49MS41LjBgIHZlcnNpb25zLgoKICAgIDpwYXJhbSBjb250ZXh0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1MUnVuIGNvbnRleHQuCiAgICA6cGFyYW0gZGF0YXNldDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGF0YXNldCB0byBpbmZlciB0aHJvdWdoIHRoZSBtb2RlbC4gUHJvdmlkZWQgYXMgYW4gaW5wdXQgKERhdGFJdGVtKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCByZXByZXNlbnRzIERhdGFzZXQgYXJ0aWZhY3QgLyBGZWF0dXJlIHZlY3RvciBVUkkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB1c2luZyBNTFJ1biBTREssIGBkYXRhc2V0YCBjYW4gYWxzbyBiZSBwcm92aWRlZCBhcyBhIGxpc3QsIGRpY3Rpb25hcnkgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bXB5IGFycmF5LgogICAgOnBhcmFtIG1vZGVsX3BhdGg6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZWwgc3RvcmUgdXJpIChzaG91bGQgc3RhcnQgd2l0aCBzdG9yZTovLykuIFByb3ZpZGVkIGFzIGFuIGlucHV0IChEYXRhSXRlbSkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB1c2luZyBNTFJ1biBTREssIGBtb2RlbF9wYXRoYCBjYW4gYWxzbyBiZSBwcm92aWRlZCBhcyBhIHBhcmFtZXRlciAoc3RyaW5nKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvIGdlbmVyYXRlIGEgdmFsaWQgbW9kZWwgc3RvcmUgVVJJLCBwbGVhc2UgbG9nIHRoZSBtb2RlbCBiZWZvcmUgcnVubmluZyB0aGlzIGZ1bmN0aW9uLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgYGVuZHBvaW50X2lkYCBvZiBleGlzdGluZyBtb2RlbCBlbmRwb2ludCBpcyBwcm92aWRlZCwgbWFrZSBzdXJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGl0IGhhcyBhIHNpbWlsYXIgbW9kZWwgc3RvcmUgcGF0aCwgb3RoZXJ3aXNlIHRoZSBkcmlmdCBhbmFseXNpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29uJ3QgYmUgdHJpZ2dlcmVkLgogICAgOnBhcmFtIGRyb3BfY29sdW1uczogICAgICAgICAgICAgICAgICAgICAgICAgICAgQSBzdHJpbmcgLyBpbnRlZ2VyIG9yIGEgbGlzdCBvZiBzdHJpbmdzIC8gaW50ZWdlcnMgdGhhdCByZXByZXNlbnQgdGhlIGNvbHVtbiBuYW1lcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBpbmRpY2VzIHRvIGRyb3AuIFdoZW4gdGhlIGRhdGFzZXQgaXMgYSBsaXN0IG9yIGEgbnVtcHkgYXJyYXkgdGhpcyBwYXJhbWV0ZXIgbXVzdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgcmVwcmVzZW50ZWQgYnkgaW50ZWdlcnMuCiAgICA6cGFyYW0gbGFiZWxfY29sdW1uczogICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgdGFyZ2V0IGxhYmVsKHMpIG9mIHRoZSBjb2x1bW4ocykgaW4gdGhlIGRhdGFzZXQgZm9yIFJlZ3Jlc3Npb24gb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzaWZpY2F0aW9uIHRhc2tzLiBUaGUgbGFiZWwgY29sdW1uIGNhbiBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBtb2RlbCBvYmplY3QsIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZmVhdHVyZSB2ZWN0b3IgcHJvdmlkZWQgaWYgYXZhaWxhYmxlLgogICAgOnBhcmFtIGZlYXR1cmVfY29sdW1uczogICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCBvZiBmZWF0dXJlIGNvbHVtbnMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gYnVpbGQgdGhlIGRhdGFmcmFtZSB3aGVuIGRhdGFzZXQgaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdHlwZSBsaXN0IG9yIG51bXB5IGFycmF5LgogICAgOnBhcmFtIGxvZ19yZXN1bHRfc2V0OiAgICAgICAgICAgICAgICAgICAgICAgICAgV2hldGhlciB0byBsb2cgdGhlIHJlc3VsdCBzZXQgLSBhIERhdGFGcmFtZSBvZiB0aGUgZ2l2ZW4gaW5wdXRzIGNvbmNhdGVuYXRlZCB3aXRoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcHJlZGljdGlvbnMuIERlZmF1bHRlZCB0byBUcnVlLgogICAgOnBhcmFtIHJlc3VsdF9zZXRfbmFtZTogICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRiIGtleSB0byBzZXQgbmFtZSBvZiB0aGUgcHJlZGljdGlvbiByZXN1bHQgYW5kIHRoZSBmaWxlbmFtZS4gRGVmYXVsdGVkIHRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJlZGljdGlvbicuCiAgICA6cGFyYW0gYmF0Y2hfaWQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgSUQgb2YgdGhlIGdpdmVuIGJhdGNoIChpbmZlcmVuY2UgZGF0YXNldCkuIElmIGBOb25lYCwgaXQgd2lsbCBiZSBnZW5lcmF0ZWQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWxsIGJlIGxvZ2dlZCBhcyBhIHJlc3VsdCBvZiB0aGUgcnVuLgogICAgOnBhcmFtIGFydGlmYWN0c190YWc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFnIHRvIHVzZSBmb3IgcHJlZGljdGlvbiBzZXQgcmVzdWx0IGFydGlmYWN0LgogICAgOnBhcmFtIHBlcmZvcm1fZHJpZnRfYW5hbHlzaXM6ICAgICAgICAgICAgICAgICAgV2hldGhlciB0byBwZXJmb3JtIGRyaWZ0IGFuYWx5c2lzIGJldHdlZW4gdGhlIHNhbXBsZSBzZXQgb2YgdGhlIG1vZGVsIG9iamVjdCB0byB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFzZXQgZ2l2ZW4uIEJ5IGRlZmF1bHQsIE5vbmUsIHdoaWNoIG1lYW5zIGl0IHdpbGwgcGVyZm9ybSBkcmlmdCBhbmFseXNpcyBpZiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsIGFscmVhZHkgaGFzIGZlYXR1cmUgc3RhdHMgdGhhdCBhcmUgY29uc2lkZXJlZCBhcyBhIHJlZmVyZW5jZSBzYW1wbGUgc2V0LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybWluZyBkcmlmdCBhbmFseXNpcyBvbiBhIG5ldyBlbmRwb2ludCBpZCB3aWxsIGdlbmVyYXRlIGEgbmV3IG1vZGVsIGVuZHBvaW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmQuCiAgICA6cGFyYW0gZW5kcG9pbnRfaWQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RlbCBlbmRwb2ludCB1bmlxdWUgSUQuIElmIGBwZXJmb3JtX2RyaWZ0X2FuYWx5c2lzYCB3YXMgc2V0LCB0aGUgZW5kcG9pbnRfaWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgdXNlZCBlaXRoZXIgdG8gcGVyZm9ybSB0aGUgYW5hbHlzaXMgb24gZXhpc3RpbmcgbW9kZWwgZW5kcG9pbnQgb3IgdG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlIGEgbmV3IG1vZGVsIGVuZHBvaW50IHJlY29yZC4KICAgIDpwYXJhbSBtb2RlbF9lbmRwb2ludF9uYW1lOiAgICAgICAgICAgICAgICAgICAgIElmIGEgbmV3IG1vZGVsIGVuZHBvaW50IGlzIGdlbmVyYXRlZCwgdGhlIG1vZGVsIG5hbWUgd2lsbCBiZSBwcmVzZW50ZWQgdW5kZXIgdGhpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnQuCiAgICA6cGFyYW0gbW9kZWxfZW5kcG9pbnRfc2FtcGxlX3NldDogICAgICAgICAgICAgICBBIHNhbXBsZSBkYXRhc2V0IHRvIGdpdmUgdG8gY29tcGFyZSB0aGUgaW5wdXRzIGluIHRoZSBkcmlmdCBhbmFseXNpcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbiBiZSBwcm92aWRlZCBhcyBhbiBpbnB1dCAoRGF0YUl0ZW0pIG9yIGFzIGEgcGFyYW1ldGVyIChlLmcuIHN0cmluZywgbGlzdCwgRGF0YUZyYW1lKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IGNob3NlbiBzYW1wbGUgc2V0IHdpbGwgYWx3YXlzIGJlIHRoZSBvbmUgd2hvIGlzIHNldCBpbiB0aGUgbW9kZWwgYXJ0aWZhY3QgaXRzZWxmLgoKICAgIHJhaXNlcyBNTFJ1bkludmFsaWRBcmd1bWVudEVycm9yOiBpZiBib3RoIGBtb2RlbF9wYXRoYCBhbmQgYGVuZHBvaW50X2lkYCBhcmUgbm90IHByb3ZpZGVkCiAgICAiIiIKCiAgICAjIExvYWRpbmcgdGhlIG1vZGVsOgogICAgY29udGV4dC5sb2dnZXIuaW5mbyhmIkxvYWRpbmcgbW9kZWwuLi4iKQogICAgaWYgaXNpbnN0YW5jZShtb2RlbF9wYXRoLCBtbHJ1bi5EYXRhSXRlbSk6CiAgICAgICAgbW9kZWxfcGF0aCA9IG1vZGVsX3BhdGguYXJ0aWZhY3RfdXJsCiAgICBpZiBub3QgbWxydW4uZGF0YXN0b3JlLmlzX3N0b3JlX3VyaShtb2RlbF9wYXRoKToKICAgICAgICByYWlzZSBtbHJ1bi5lcnJvcnMuTUxSdW5JbnZhbGlkQXJndW1lbnRFcnJvcigKICAgICAgICAgICAgZiJUaGUgcHJvdmlkZWQgbW9kZWwgcGF0aCAoe21vZGVsX3BhdGh9KSBpcyBpbnZhbGlkIC0gc2hvdWxkIHN0YXJ0IHdpdGggYHN0b3JlOi8vYC4gIgogICAgICAgICAgICBmIlBsZWFzZSBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSBsb2dnZWQgdGhlIG1vZGVsIHVzaW5nIGBwcm9qZWN0LmxvZ19tb2RlbCgpYCAiCiAgICAgICAgICAgIGYid2hpY2ggZ2VuZXJhdGVzIGEgdW5pcXVlIHN0b3JlIHVyaSBmb3IgdGhlIGxvZ2dlZCBtb2RlbC4iCiAgICAgICAgKQogICAgbW9kZWxfaGFuZGxlciA9IEF1dG9NTFJ1bi5sb2FkX21vZGVsKG1vZGVsX3BhdGg9bW9kZWxfcGF0aCwgY29udGV4dD1jb250ZXh0KQoKICAgIGlmIGxhYmVsX2NvbHVtbnMgaXMgTm9uZToKICAgICAgICBsYWJlbF9jb2x1bW5zID0gWwogICAgICAgICAgICBvdXRwdXQubmFtZSBmb3Igb3V0cHV0IGluIG1vZGVsX2hhbmRsZXIuX21vZGVsX2FydGlmYWN0LnNwZWMub3V0cHV0cwogICAgICAgIF0KCiAgICBpZiBmZWF0dXJlX2NvbHVtbnMgaXMgTm9uZToKICAgICAgICBmZWF0dXJlX2NvbHVtbnMgPSBbCiAgICAgICAgICAgIGlucHV0Lm5hbWUgZm9yIGlucHV0IGluIG1vZGVsX2hhbmRsZXIuX21vZGVsX2FydGlmYWN0LnNwZWMuaW5wdXRzCiAgICAgICAgXQoKICAgICMgR2V0IGRhdGFzZXQgYnkgb2JqZWN0LCBVUkwgb3IgYnkgRmVhdHVyZVZlY3RvcjoKICAgIGNvbnRleHQubG9nZ2VyLmluZm8oZiJMb2FkaW5nIGRhdGEuLi4iKQogICAgeCwgbGFiZWxfY29sdW1ucyA9IG1scnVuLm1vZGVsX21vbml0b3JpbmcuYXBpLnJlYWRfZGF0YXNldF9hc19kYXRhZnJhbWUoCiAgICAgICAgZGF0YXNldD1kYXRhc2V0LAogICAgICAgIGZlYXR1cmVfY29sdW1ucz1mZWF0dXJlX2NvbHVtbnMsCiAgICAgICAgbGFiZWxfY29sdW1ucz1sYWJlbF9jb2x1bW5zLAogICAgICAgIGRyb3BfY29sdW1ucz1kcm9wX2NvbHVtbnMsCiAgICApCgogICAgIyBQcmVkaWN0OgogICAgY29udGV4dC5sb2dnZXIuaW5mbyhmIkNhbGN1bGF0aW5nIHByZWRpY3Rpb24uLi4iKQogICAgeV9wcmVkID0gbW9kZWxfaGFuZGxlci5tb2RlbC5wcmVkaWN0KHgsICoqcHJlZGljdF9rd2FyZ3MpCgogICAgIyBQcmVwYXJlIHRoZSByZXN1bHQgc2V0OgogICAgcmVzdWx0X3NldCA9IF9wcmVwYXJlX3Jlc3VsdF9zZXQoeD14LCBsYWJlbF9jb2x1bW5zPWxhYmVsX2NvbHVtbnMsIHlfcHJlZD15X3ByZWQpCgogICAgIyBDaGVjayBmb3IgbG9nZ2luZyB0aGUgcmVzdWx0IHNldDoKICAgIGlmIGxvZ19yZXN1bHRfc2V0OgogICAgICAgIG1scnVuLm1vZGVsX21vbml0b3JpbmcuYXBpLmxvZ19yZXN1bHQoCiAgICAgICAgICAgIGNvbnRleHQ9Y29udGV4dCwKICAgICAgICAgICAgcmVzdWx0X3NldF9uYW1lPXJlc3VsdF9zZXRfbmFtZSwKICAgICAgICAgICAgcmVzdWx0X3NldD1yZXN1bHRfc2V0LAogICAgICAgICAgICBhcnRpZmFjdHNfdGFnPWFydGlmYWN0c190YWcsCiAgICAgICAgICAgIGJhdGNoX2lkPWJhdGNoX2lkLAogICAgICAgICkKCiAgICAjIENoZWNrIGZvciBwZXJmb3JtaW5nIGRyaWZ0IGFuYWx5c2lzCiAgICBpZiAoCiAgICAgICAgICAgIHBlcmZvcm1fZHJpZnRfYW5hbHlzaXMgaXMgTm9uZQogICAgICAgICAgICBhbmQgbW9kZWxfaGFuZGxlci5fbW9kZWxfYXJ0aWZhY3Quc3BlYy5mZWF0dXJlX3N0YXRzIGlzIG5vdCBOb25lCiAgICApOgogICAgICAgIHBlcmZvcm1fZHJpZnRfYW5hbHlzaXMgPSBUcnVlCiAgICBpZiBwZXJmb3JtX2RyaWZ0X2FuYWx5c2lzOgogICAgICAgIGNvbnRleHQubG9nZ2VyLmluZm8oIlBlcmZvcm1pbmcgZHJpZnQgYW5hbHlzaXMuLi4iKQogICAgICAgICMgR2V0IHRoZSBzYW1wbGUgc2V0IHN0YXRpc3RpY3MgKGVpdGhlciBmcm9tIHRoZSBzYW1wbGUgc2V0IG9yIGZyb20gdGhlIHN0YXRpc3RpY3MgbG9nZ2VkIHdpdGggdGhlIG1vZGVsKQogICAgICAgIHN0YXRpc3RpY3NfaW5wdXRfZmlsdGVyZWQgPSBfZ2V0X3NhbXBsZV9zZXRfc3RhdGlzdGljc19wYXJhbWV0ZXJzKAogICAgICAgICAgICBjb250ZXh0PWNvbnRleHQsCiAgICAgICAgICAgIG1vZGVsX2VuZHBvaW50X3NhbXBsZV9zZXQ9bW9kZWxfZW5kcG9pbnRfc2FtcGxlX3NldCwKICAgICAgICAgICAgbW9kZWxfYXJ0aWZhY3RfZmVhdHVyZV9zdGF0cz1tb2RlbF9oYW5kbGVyLl9tb2RlbF9hcnRpZmFjdC5zcGVjLmZlYXR1cmVfc3RhdHMsCiAgICAgICAgICAgIGZlYXR1cmVfY29sdW1ucz1mZWF0dXJlX2NvbHVtbnMsCiAgICAgICAgICAgIGRyb3BfY29sdW1ucz1kcm9wX2NvbHVtbnMsCiAgICAgICAgICAgIGxhYmVsX2NvbHVtbnM9bGFiZWxfY29sdW1ucykKICAgICAgICBzYW1wbGVfc2V0X3N0YXRpc3RpY3MgPSBtbHJ1bi5tb2RlbF9tb25pdG9yaW5nLmFwaS5nZXRfc2FtcGxlX3NldF9zdGF0aXN0aWNzKCoqc3RhdGlzdGljc19pbnB1dF9maWx0ZXJlZCkKICAgICAgICBtbHJ1bi5tb2RlbF9tb25pdG9yaW5nLmFwaS5yZWNvcmRfcmVzdWx0cygKICAgICAgICAgICAgcHJvamVjdD1jb250ZXh0LnByb2plY3QsCiAgICAgICAgICAgIGNvbnRleHQ9Y29udGV4dCwKICAgICAgICAgICAgZW5kcG9pbnRfaWQ9ZW5kcG9pbnRfaWQsCiAgICAgICAgICAgIG1vZGVsX3BhdGg9bW9kZWxfcGF0aCwKICAgICAgICAgICAgbW9kZWxfZW5kcG9pbnRfbmFtZT1tb2RlbF9lbmRwb2ludF9uYW1lLAogICAgICAgICAgICBpbmZlcl9yZXN1bHRzX2RmPXJlc3VsdF9zZXQuY29weSgpLAogICAgICAgICAgICBzYW1wbGVfc2V0X3N0YXRpc3RpY3M9c2FtcGxlX3NldF9zdGF0aXN0aWNzLAogICAgICAgICkK - origin_filename: '' - auto_build: false - default_handler: infer - image: mlrun/mlrun - disable_auto_mount: false - command: '' + doc: 'Perform a prediction on the provided dataset using the specified model. + + Ensure that the model has already been logged under the current project. + + + If you wish to apply monitoring tools (e.g., drift analysis), set the perform_drift_analysis + parameter to True. + + This will create a new model endpoint record under the specified model_endpoint_name. + + Additionally, ensure that model monitoring is enabled at the project level + by calling the + + project.enable_model_monitoring() function. You can also apply monitoring + to an existing model by providing its + + endpoint id or name, and the monitoring tools will be applied to that endpoint. + + + At the moment, this function is supported for `mlrun>=1.5.0` versions.' + has_varargs: false +verbose: false metadata: + name: batch-inference-v2 tag: '' categories: - utils - data-analysis - monitoring - name: batch-inference-v2 +kind: job From e97871922298028e5dd55ccbe1b8ddbe36845527 Mon Sep 17 00:00:00 2001 From: Eyal Danieli Date: Tue, 31 Dec 2024 14:00:34 +0200 Subject: [PATCH 26/38] fix PyYAML loading (#837) --- cli/item_yaml.py | 2 +- cli/test_suite.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cli/item_yaml.py b/cli/item_yaml.py index fbd7eb7e8..7483a9912 100644 --- a/cli/item_yaml.py +++ b/cli/item_yaml.py @@ -40,7 +40,7 @@ def update_functions_yaml(root_directory: str, if (inner_dir / item_yaml).exists(): path = str(inner_dir)+"/"+item_yaml stream = open(path, 'r') - data = yaml.load(stream) + data = yaml.load(stream=stream, Loader=yaml.FullLoader) if version: data['version'] = version if mlrun_version: diff --git a/cli/test_suite.py b/cli/test_suite.py index b386849e8..93e1428b4 100644 --- a/cli/test_suite.py +++ b/cli/test_suite.py @@ -599,7 +599,7 @@ def clean_pipenv(directory: str): # load item yaml def load_item(path): with open(path, 'r') as stream: - data = yaml.load(stream) + data = yaml.load(stream=stream, Loader=yaml.FullLoader) return data From 7d2994920c92543cb722da630add53bf8a7d2ca6 Mon Sep 17 00:00:00 2001 From: Yonatan Shelach <92271540+yonishelach@users.noreply.github.com> Date: Tue, 31 Dec 2024 14:59:08 +0200 Subject: [PATCH 27/38] [text to audio generator] Replaced bark with openai tts models (#836) --- text_to_audio_generator/function.yaml | 88 ++++++++---------- text_to_audio_generator/item.yaml | 7 +- text_to_audio_generator/requirements.txt | 5 +- .../test_text_to_audio_generator.py | 18 ++-- .../text_to_audio_generator.ipynb | 12 +-- .../text_to_audio_generator.py | 91 +++++++++++++------ 6 files changed, 122 insertions(+), 99 deletions(-) diff --git a/text_to_audio_generator/function.yaml b/text_to_audio_generator/function.yaml index 88ef9cb89..65d8d82aa 100644 --- a/text_to_audio_generator/function.yaml +++ b/text_to_audio_generator/function.yaml @@ -1,32 +1,28 @@ -kind: job -metadata: - name: text-to-audio-generator - tag: '' - hash: 89fcaf3fab53e7b7fbba448a5e65c253d7fa66ed - project: '' - labels: - author: yonatans - categories: - - data-preparation - - machine-learning - - pytorch spec: - command: '' - args: [] image: '' + default_handler: generate_multi_speakers_audio build: - functionSourceCode: IyBDb3B5cmlnaHQgMjAyMyBJZ3VhemlvCiMKIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAojCiMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQojIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAojIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgppbXBvcnQgbG9nZ2luZwppbXBvcnQgcGF0aGxpYgppbXBvcnQgcmFuZG9tCmltcG9ydCB0ZW1wZmlsZQpmcm9tIHR5cGluZyBpbXBvcnQgRGljdCwgTGlzdCwgT3B0aW9uYWwsIFR1cGxlLCBVbmlvbgoKaW1wb3J0IGJhcmsKaW1wb3J0IG51bXB5IGFzIG5wCmltcG9ydCBwYW5kYXMgYXMgcGQKaW1wb3J0IHRvcmNoCmltcG9ydCB0b3JjaGF1ZGlvCmltcG9ydCB0cWRtCgojIEdldCB0aGUgZ2xvYmFsIGxvZ2dlcjoKX0xPR0dFUiA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCkKCgpkZWYgZ2VuZXJhdGVfbXVsdGlfc3BlYWtlcnNfYXVkaW8oCiAgICBkYXRhX3BhdGg6IHN0ciwKICAgIHNwZWFrZXJzOiBVbmlvbltMaXN0W3N0cl0sIERpY3Rbc3RyLCBpbnRdXSwKICAgIGF2YWlsYWJsZV92b2ljZXM6IExpc3Rbc3RyXSwKICAgIG91dHB1dF9kaXJlY3Rvcnk6IHN0ciA9IE5vbmUsCiAgICB1c2VfZ3B1OiBib29sID0gVHJ1ZSwKICAgIHVzZV9zbWFsbF9tb2RlbHM6IGJvb2wgPSBGYWxzZSwKICAgIG9mZmxvYWRfY3B1OiBib29sID0gRmFsc2UsCiAgICBzYW1wbGVfcmF0ZTogaW50ID0gMTYwMDAsCiAgICBmaWxlX2Zvcm1hdDogc3RyID0gIndhdiIsCiAgICB2ZXJib3NlOiBib29sID0gVHJ1ZSwKICAgIGJpdHNfcGVyX3NhbXBsZTogT3B0aW9uYWxbaW50XSA9IE5vbmUsCikgLT4gVHVwbGVbc3RyLCBwZC5EYXRhRnJhbWUsIGRpY3RdOgogICAgIiIiCiAgICBHZW5lcmF0ZSBhdWRpbyBmaWxlcyBmcm9tIHRleHQgZmlsZXMuCgogICAgOnBhcmFtIGRhdGFfcGF0aDogICAgICAgICAgIFBhdGggdG8gdGhlIHRleHQgZmlsZSBvciBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgdGV4dCBmaWxlcyB0byBnZW5lcmF0ZSBhdWRpbyBmcm9tLgogICAgOnBhcmFtIHNwZWFrZXJzOiAgICAgICAgICAgIExpc3QgLyBEaWN0IG9mIHNwZWFrZXJzIHRvIGdlbmVyYXRlIGF1ZGlvIGZvci4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBhIGxpc3QgaXMgZ2l2ZW4sIHRoZSBzcGVha2VycyB3aWxsIGJlIGFzc2lnbmVkIHRvIGNoYW5uZWxzIGluIHRoZSBvcmRlciBnaXZlbi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBkaWN0aW9uYXJ5LCB0aGUga2V5cyB3aWxsIGJlIHRoZSBzcGVha2VycyBhbmQgdGhlIHZhbHVlcyB3aWxsIGJlIHRoZSBjaGFubmVscy4KICAgIDpwYXJhbSBhdmFpbGFibGVfdm9pY2VzOiAgICBMaXN0IG9mIGF2YWlsYWJsZSB2b2ljZXMgdG8gdXNlIGZvciB0aGUgZ2VuZXJhdGlvbi4KICAgICAgICAgICAgICAgICAgICAgICAgU2VlIGhlcmUgZm9yIHRoZSBhdmFpbGFibGUgdm9pY2VzOgogICAgICAgICAgICAgICAgICAgICAgICBodHRwczovL3N1bm8tYWkubm90aW9uLnNpdGUvOGI4ZTg3NDllZDUxNGIwY2JmM2Y2OTkwMTM1NDg2ODM/dj1iYzY3Y2ZmNzg2YjA0YjUwYjNjZWI3NTZmZDA1ZjY4YwogICAgOnBhcmFtIG91dHB1dF9kaXJlY3Rvcnk6ICAgIFBhdGggdG8gdGhlIGRpcmVjdG9yeSB0byBzYXZlIHRoZSBnZW5lcmF0ZWQgYXVkaW8gZmlsZXMgdG8uCiAgICA6cGFyYW0gdXNlX2dwdTogICAgICAgICAgICAgV2hldGhlciB0byB1c2UgdGhlIEdQVSBmb3IgdGhlIGdlbmVyYXRpb24uCiAgICA6cGFyYW0gdXNlX3NtYWxsX21vZGVsczogICAgV2hldGhlciB0byB1c2UgdGhlIHNtYWxsIG1vZGVscyBmb3IgdGhlIGdlbmVyYXRpb24uCiAgICA6cGFyYW0gb2ZmbG9hZF9jcHU6ICAgICAgICAgVG8gcmVkdWNlIHRoZSBtZW1vcnkgZm9vdHByaW50LCB0aGUgbW9kZWxzIGNhbiBiZSBvZmZsb2FkZWQgdG8gdGhlIENQVSBhZnRlciBsb2FkaW5nLgogICAgOnBhcmFtIHNhbXBsZV9yYXRlOiAgICAgICAgIFRoZSBzYW1wbGluZyByYXRlIG9mIHRoZSBnZW5lcmF0ZWQgYXVkaW8uCiAgICA6cGFyYW0gZmlsZV9mb3JtYXQ6ICAgICAgICAgVGhlIGZvcm1hdCBvZiB0aGUgZ2VuZXJhdGVkIGF1ZGlvIGZpbGVzLgogICAgOnBhcmFtIHZlcmJvc2U6ICAgICAgICAgICAgIFdoZXRoZXIgdG8gcHJpbnQgdGhlIHByb2dyZXNzIG9mIHRoZSBnZW5lcmF0aW9uLgogICAgOnBhcmFtIGJpdHNfcGVyX3NhbXBsZTogICAgIENoYW5nZXMgdGhlIGJpdCBkZXB0aCBmb3IgdGhlIHN1cHBvcnRlZCBmb3JtYXRzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1cHBvcnRlZCBvbmx5IGluICJ3YXYiIG9yICJmbGFjIiBmb3JtYXRzLgoKICAgIDpyZXR1cm5zOiAgICAgICAgICAgICAgICAgICBBIHR1cGxlIG9mOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gVGhlIG91dHB1dCBkaXJlY3RvcnkgcGF0aC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFRoZSBnZW5lcmF0ZWQgYXVkaW8gZmlsZXMgZGF0YWZyYW1lLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gVGhlIGVycm9ycyBkaWN0aW9uYXJ5LgogICAgIiIiCgogICAgZ2xvYmFsIF9MT0dHRVIKICAgIF9MT0dHRVIgPSBfZ2V0X2xvZ2dlcigpCiAgICAjIEdldCB0aGUgaW5wdXQgdGV4dCBmaWxlcyB0byB0dXJuIHRvIGF1ZGlvOgogICAgZGF0YV9wYXRoID0gcGF0aGxpYi5QYXRoKGRhdGFfcGF0aCkuYWJzb2x1dGUoKQogICAgdGV4dF9maWxlcyA9IF9nZXRfdGV4dF9maWxlcyhkYXRhX3BhdGg9ZGF0YV9wYXRoKQoKICAgICMgTG9hZCB0aGUgYmFyayBtb2RlbHMgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uczoKICAgIGJhcmsucHJlbG9hZF9tb2RlbHMoCiAgICAgICAgdGV4dF91c2VfZ3B1PXVzZV9ncHUsCiAgICAgICAgdGV4dF91c2Vfc21hbGw9dXNlX3NtYWxsX21vZGVscywKICAgICAgICBjb2Fyc2VfdXNlX2dwdT11c2VfZ3B1LAogICAgICAgIGNvYXJzZV91c2Vfc21hbGw9dXNlX3NtYWxsX21vZGVscywKICAgICAgICBmaW5lX3VzZV9ncHU9dXNlX2dwdSwKICAgICAgICBmaW5lX3VzZV9zbWFsbD11c2Vfc21hbGxfbW9kZWxzLAogICAgICAgIGNvZGVjX3VzZV9ncHU9dXNlX2dwdSwKICAgICAgICBmb3JjZV9yZWxvYWQ9b2ZmbG9hZF9jcHUsCiAgICApCgogICAgIyBDaGVjayBmb3IgcGVyIGNoYW5uZWwgZ2VuZXJhdGlvbjoKICAgIGlmIGlzaW5zdGFuY2Uoc3BlYWtlcnMsIGRpY3QpOgogICAgICAgIHNwZWFrZXJfcGVyX2NoYW5uZWwgPSBUcnVlCiAgICAgICAgIyBTb3J0IHRoZSBnaXZlbiBzcGVha2VycyBieSBjaGFubmVsczoKICAgICAgICBzcGVha2VycyA9IHsKICAgICAgICAgICAgc3BlYWtlcjogY2hhbm5lbAogICAgICAgICAgICBmb3Igc3BlYWtlciwgY2hhbm5lbCBpbiBzb3J0ZWQoc3BlYWtlcnMuaXRlbXMoKSwga2V5PWxhbWJkYSBpdGVtOiBpdGVtWzFdKQogICAgICAgIH0KICAgIGVsc2U6CiAgICAgICAgc3BlYWtlcl9wZXJfY2hhbm5lbCA9IEZhbHNlCgogICAgIyBQcmVwYXJlIHRoZSByZXNhbXBsaW5nIG1vZHVsZToKICAgIHJlc2FtcGxlciA9IHRvcmNoYXVkaW8udHJhbnNmb3Jtcy5SZXNhbXBsZSgKICAgICAgICBvcmlnX2ZyZXE9YmFyay5TQU1QTEVfUkFURSwgbmV3X2ZyZXE9c2FtcGxlX3JhdGUsIGR0eXBlPXRvcmNoLmZsb2F0MzIKICAgICkKCiAgICAjIFByZXBhcmUgdGhlIGdhcCBiZXR3ZWVuIGVhY2ggc3BlYWtlcjoKICAgIGdhcF9iZXR3ZWVuX3NwZWFrZXJzID0gbnAuemVyb3MoaW50KDAuNSAqIGJhcmsuU0FNUExFX1JBVEUpKQoKICAgICMgUHJlcGFyZSB0aGUgc3VjY2Vzc2VzIGRhdGFmcmFtZSBhbmQgZXJyb3JzIGRpY3Rpb25hcnkgdG8gYmUgcmV0dXJuZWQ6CiAgICBzdWNjZXNzZXMgPSBbXQogICAgZXJyb3JzID0ge30KCiAgICAjIENyZWF0ZSB0aGUgb3V0cHV0IGRpcmVjdG9yeToKICAgIGlmIG91dHB1dF9kaXJlY3RvcnkgaXMgTm9uZToKICAgICAgICBvdXRwdXRfZGlyZWN0b3J5ID0gdGVtcGZpbGUubWtkdGVtcCgpCiAgICBvdXRwdXRfZGlyZWN0b3J5ID0gcGF0aGxpYi5QYXRoKG91dHB1dF9kaXJlY3RvcnkpCiAgICBpZiBub3Qgb3V0cHV0X2RpcmVjdG9yeS5leGlzdHMoKToKICAgICAgICBvdXRwdXRfZGlyZWN0b3J5Lm1rZGlyKGV4aXN0X29rPVRydWUsIHBhcmVudHM9VHJ1ZSkKCiAgICAjIFN0YXJ0IGdlbmVyYXRpbmcgYXVkaW86CiAgICAjIEdvIG92ZXIgdGhlIGF1ZGlvIGZpbGVzIGFuZCB0cmFuc2NyaWJlOgogICAgZm9yIHRleHRfZmlsZSBpbiB0cWRtLnRxZG0oCiAgICAgICAgdGV4dF9maWxlcywgZGVzYz0iR2VuZXJhdGluZyIsIHVuaXQ9ImZpbGUiLCBkaXNhYmxlPW5vdCB2ZXJib3NlCiAgICApOgoKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgUmFuZG9taXplIHZvaWNlcyBmb3IgZWFjaCBzcGVha2VyOgogICAgICAgICAgICBjaG9zZW5fdm9pY2VzID0ge30KICAgICAgICAgICAgYXZhaWxhYmxlX3ZvaWNlc19jb3B5ID0gYXZhaWxhYmxlX3ZvaWNlcy5jb3B5KCkKICAgICAgICAgICAgZm9yIHNwZWFrZXIgaW4gc3BlYWtlcnM6CiAgICAgICAgICAgICAgICB2b2ljZSA9IHJhbmRvbS5jaG9pY2UoYXZhaWxhYmxlX3ZvaWNlc19jb3B5KQogICAgICAgICAgICAgICAgY2hvc2VuX3ZvaWNlc1tzcGVha2VyXSA9IHZvaWNlCiAgICAgICAgICAgICAgICBhdmFpbGFibGVfdm9pY2VzX2NvcHkucmVtb3ZlKHZvaWNlKQogICAgICAgICAgICAjIFJlYWQgdGV4dDoKICAgICAgICAgICAgd2l0aCBvcGVuKHRleHRfZmlsZSwgInIiKSBhcyBmcDoKICAgICAgICAgICAgICAgIHRleHQgPSBmcC5yZWFkKCkKICAgICAgICAgICAgIyBQcmVwYXJlIGEgaG9sZGVyIGZvciBhbGwgdGhlIGdlbmVyYXRlZCBwaWVjZXMgKGlmIHBlciBjaGFubmVsIGVhY2ggc3BlYWtlciB3aWxsIGhhdmUgaXRzIG93bik6CiAgICAgICAgICAgIGF1ZGlvX3BpZWNlcyA9ICgKICAgICAgICAgICAgICAgIHtzcGVha2VyOiBbXSBmb3Igc3BlYWtlciBpbiBzcGVha2Vyc30KICAgICAgICAgICAgICAgIGlmIHNwZWFrZXJfcGVyX2NoYW5uZWwKICAgICAgICAgICAgICAgIGVsc2UgeyJhbGwiOiBbXX0KICAgICAgICAgICAgKQoKICAgICAgICAgICAgIyBHZW5lcmF0ZSBhdWRpbyBwZXIgbGluZToKICAgICAgICAgICAgZm9yIGxpbmUgaW4gdGV4dC5zcGxpdGxpbmVzKCk6CiAgICAgICAgICAgICAgICAjIFZhbGlkYXRlIGxpbmUgaXMgaW4gY29ycmVjdCBzcGVha2VyIGZvcm1hdDoKCiAgICAgICAgICAgICAgICBpZiAiOiAiIG5vdCBpbiBsaW5lOgogICAgICAgICAgICAgICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIF9MT0dHRVIud2FybmluZyhmIlNraXBwaW5nIGxpbmU6IHtsaW5lfSIpCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICMgU3BsaXQgbGluZSB0byBzcGVha2VyIGFuZCBoaXMgd29yZHM6CiAgICAgICAgICAgICAgICBjdXJyZW50X3NwZWFrZXIsIHNlbnRlbmNlcyA9IGxpbmUuc3BsaXQoIjogIiwgMSkKICAgICAgICAgICAgICAgICMgVmFsaWRhdGUgc3BlYWtlciBpcyBrbm93bjoKICAgICAgICAgICAgICAgIGlmIGN1cnJlbnRfc3BlYWtlciBub3QgaW4gc3BlYWtlcnM6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgZiJVbmtub3duIHNwZWFrZXI6IHtjdXJyZW50X3NwZWFrZXJ9LiBHaXZlbiBzcGVha2VycyBhcmU6IHtzcGVha2Vyc30iCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgZm9yIHNlbnRlbmNlIGluIF9zcGxpdF9saW5lKGxpbmU9c2VudGVuY2VzKToKICAgICAgICAgICAgICAgICAgICAjIEdlbmVyYXRlIHdvcmRzIGF1ZGlvOgogICAgICAgICAgICAgICAgICAgIGF1ZGlvID0gYmFyay5nZW5lcmF0ZV9hdWRpbygKICAgICAgICAgICAgICAgICAgICAgICAgc2VudGVuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgIGhpc3RvcnlfcHJvbXB0PWNob3Nlbl92b2ljZXNbY3VycmVudF9zcGVha2VyXSwKICAgICAgICAgICAgICAgICAgICAgICAgc2lsZW50PVRydWUsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIGlmIHNwZWFrZXJfcGVyX2NoYW5uZWw6CiAgICAgICAgICAgICAgICAgICAgICAgIHNpbGVuY2UgPSBucC56ZXJvc19saWtlKGF1ZGlvKQogICAgICAgICAgICAgICAgICAgICAgICBmb3Igc3BlYWtlciBpbiBhdWRpb19waWVjZXMua2V5cygpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc3BlYWtlciA9PSBjdXJyZW50X3NwZWFrZXI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGllY2VzW3NwZWFrZXJdICs9IFthdWRpbywgZ2FwX2JldHdlZW5fc3BlYWtlcnNdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BpZWNlc1tzcGVha2VyXSArPSBbc2lsZW5jZSwgZ2FwX2JldHdlZW5fc3BlYWtlcnNdCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGllY2VzWyJhbGwiXSArPSBbYXVkaW8sIGdhcF9iZXR3ZWVuX3NwZWFrZXJzXQogICAgICAgICAgICAjIENvbnN0cnVjdCBhIHNpbmdsZSBhdWRpbyBhcnJheSBmcm9tIGFsbCB0aGUgcGllY2VzIGFuZCBjaGFubmVsczoKCiAgICAgICAgICAgIGF1ZGlvID0gbnAudnN0YWNrKAogICAgICAgICAgICAgICAgW25wLmNvbmNhdGVuYXRlKGF1ZGlvX3BpZWNlc1tzcGVha2VyXSkgZm9yIHNwZWFrZXIgaW4gc3BlYWtlcnNdCiAgICAgICAgICAgICkuYXN0eXBlKGR0eXBlPW5wLmZsb2F0MzIpCiAgICAgICAgICAgICMgUmVzYW1wbGU6CiAgICAgICAgICAgIGF1ZGlvID0gdG9yY2guZnJvbV9udW1weShhdWRpbykKICAgICAgICAgICAgYXVkaW8gPSByZXNhbXBsZXIoYXVkaW8pCiAgICAgICAgICAgICMgU2F2ZSB0byBhdWRpbyBmaWxlOgogICAgICAgICAgICBhdWRpb19maWxlID0gb3V0cHV0X2RpcmVjdG9yeSAvIGYie3RleHRfZmlsZS5zdGVtfS57ZmlsZV9mb3JtYXR9IgoKICAgICAgICAgICAgdG9yY2hhdWRpby5zYXZlKAogICAgICAgICAgICAgICAgdXJpPXN0cihhdWRpb19maWxlKSwKICAgICAgICAgICAgICAgIHNyYz1hdWRpbywKICAgICAgICAgICAgICAgIHNhbXBsZV9yYXRlPXNhbXBsZV9yYXRlLAogICAgICAgICAgICAgICAgZm9ybWF0PWZpbGVfZm9ybWF0LAogICAgICAgICAgICAgICAgYml0c19wZXJfc2FtcGxlPWJpdHNfcGVyX3NhbXBsZSwKICAgICAgICAgICAgKQoKICAgICAgICAgICAgIyBDb2xsZWN0IHRvIHRoZSBzdWNjZXNzZXM6CiAgICAgICAgICAgIHN1Y2Nlc3Nlcy5hcHBlbmQoW3RleHRfZmlsZS5uYW1lLCBhdWRpb19maWxlLm5hbWVdKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjZXB0aW9uOgogICAgICAgICAgICAjIE5vdGUgdGhlIGV4Y2VwdGlvbiBhcyBlcnJvciBpbiB0aGUgZGljdGlvbmFyeToKICAgICAgICAgICAgaWYgdmVyYm9zZToKICAgICAgICAgICAgICAgIF9MT0dHRVIud2FybmluZyhmIkVycm9yIGluIGZpbGU6ICd7dGV4dF9maWxlLm5hbWV9JyIpCiAgICAgICAgICAgIHByaW50KGV4Y2VwdGlvbikKICAgICAgICAgICAgZXJyb3JzW3RleHRfZmlsZS5uYW1lXSA9IHN0cihleGNlcHRpb24pCgogICAgIyBDb25zdHJ1Y3QgdGhlIHRyYW5zbGF0aW9ucyBkYXRhZnJhbWU6CiAgICBzdWNjZXNzZXMgPSBwZC5EYXRhRnJhbWUoCiAgICAgICAgc3VjY2Vzc2VzLAogICAgICAgIGNvbHVtbnM9WyJ0ZXh0X2ZpbGUiLCAiYXVkaW9fZmlsZSJdLAogICAgKQoKICAgICMgUHJpbnQgdGhlIGhlYWQgb2YgdGhlIHByb2R1Y2VkIGRhdGFmcmFtZSBhbmQgcmV0dXJuOgogICAgaWYgdmVyYm9zZToKICAgICAgICBfTE9HR0VSLmluZm8oCiAgICAgICAgICAgIGYiRG9uZSAoe3N1Y2Nlc3Nlcy5zaGFwZVswXX0ve2xlbih0ZXh0X2ZpbGVzKX0pXG4iCiAgICAgICAgICAgIGYiVHJhbnNsYXRpb25zIHN1bW1hcnk6XG4iCiAgICAgICAgICAgIGYie3N1Y2Nlc3Nlcy5oZWFkKCl9IgogICAgICAgICkKICAgIHJldHVybiBzdHIob3V0cHV0X2RpcmVjdG9yeSksIHN1Y2Nlc3NlcywgZXJyb3JzCgoKZGVmIF9nZXRfdGV4dF9maWxlcygKICAgIGRhdGFfcGF0aDogcGF0aGxpYi5QYXRoLAopIC0+IExpc3RbcGF0aGxpYi5QYXRoXToKICAgICMgQ2hlY2sgaWYgdGhlIHBhdGggaXMgb2YgYSBkaXJlY3Rvcnkgb3IgYSBmaWxlOgogICAgaWYgZGF0YV9wYXRoLmlzX2RpcigpOgogICAgICAgICMgR2V0IGFsbCBmaWxlcyBpbnNpZGUgdGhlIGRpcmVjdG9yeToKICAgICAgICB0ZXh0X2ZpbGVzID0gbGlzdChkYXRhX3BhdGguZ2xvYigiKi4qIikpCiAgICBlbGlmIGRhdGFfcGF0aC5pc19maWxlKCk6CiAgICAgICAgdGV4dF9maWxlcyA9IFtkYXRhX3BhdGhdCiAgICBlbHNlOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgIGYiVW5yZWNvZ25pemVkIGRhdGEgcGF0aC4gVGhlIHBhcmFtZXRlciBgZGF0YV9wYXRoYCBtdXN0IGJlIGVpdGhlciBhIGRpcmVjdG9yeSBwYXRoIG9yIGEgZmlsZSBwYXRoLiAiCiAgICAgICAgICAgIGYiR2l2ZW46IHtzdHIoZGF0YV9wYXRoKX0gIgogICAgICAgICkKCiAgICByZXR1cm4gdGV4dF9maWxlcwoKCmRlZiBfc3BsaXRfbGluZShsaW5lOiBzdHIsIG1heF9sZW5ndGg6IGludCA9IDI1MCkgLT4gTGlzdFtzdHJdOgogICAgaWYgbGVuKGxpbmUpIDwgbWF4X2xlbmd0aDoKICAgICAgICByZXR1cm4gW2xpbmVdCgogICAgc2VudGVuY2VzID0gWwogICAgICAgIGYie3NlbnRlbmNlLnN0cmlwKCl9LiIgZm9yIHNlbnRlbmNlIGluIGxpbmUuc3BsaXQoIi4iKSBpZiBzZW50ZW5jZS5zdHJpcCgpCiAgICBdCgogICAgc3BsaXRzID0gW10KICAgIGN1cnJlbnRfbGVuZ3RoID0gbGVuKHNlbnRlbmNlc1swXSkKICAgIHNwbGl0ID0gc2VudGVuY2VzWzBdCiAgICBmb3Igc2VudGVuY2UgaW4gc2VudGVuY2VzWzE6XToKICAgICAgICBpZiBjdXJyZW50X2xlbmd0aCArIGxlbihzZW50ZW5jZSkgPiBtYXhfbGVuZ3RoOgogICAgICAgICAgICBzcGxpdHMuYXBwZW5kKHNwbGl0KQogICAgICAgICAgICBzcGxpdCA9IHNlbnRlbmNlCiAgICAgICAgICAgIGN1cnJlbnRfbGVuZ3RoID0gbGVuKHNlbnRlbmNlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGN1cnJlbnRfbGVuZ3RoICs9IGxlbihzZW50ZW5jZSkKICAgICAgICAgICAgc3BsaXQgKz0gIiAiICsgc2VudGVuY2UKICAgIGlmIHNwbGl0OgogICAgICAgIHNwbGl0cy5hcHBlbmQoc3BsaXQpCgogICAgcmV0dXJuIHNwbGl0cwoKCmRlZiBfZ2V0X2xvZ2dlcigpOgogICAgZ2xvYmFsIF9MT0dHRVIKICAgIHRyeToKICAgICAgICBpbXBvcnQgbWxydW4KICAgICAgICAjIENoZWNrIGlmIE1MUnVuIGlzIGF2YWlsYWJsZToKICAgICAgICBjb250ZXh0ID0gbWxydW4uZ2V0X29yX2NyZWF0ZV9jdHgobmFtZT0ibWxydW4iKQogICAgICAgIHJldHVybiBjb250ZXh0LmxvZ2dlcgogICAgZXhjZXB0IE1vZHVsZU5vdEZvdW5kRXJyb3I6CiAgICAgICAgcmV0dXJuIF9MT0dHRVIK - base_image: mlrun/mlrun - commands: [] - code_origin: '' - origin_filename: '' + functionSourceCode: IyBDb3B5cmlnaHQgMjAyMyBJZ3VhemlvCiMKIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAojCiMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQojIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAojIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgppbXBvcnQgaW8KaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCmltcG9ydCBwYXRobGliCmltcG9ydCByYW5kb20KaW1wb3J0IHRlbXBmaWxlCmZyb20gdHlwaW5nIGltcG9ydCBEaWN0LCBMaXN0LCBPcHRpb25hbCwgVHVwbGUsIFVuaW9uCgppbXBvcnQgbnVtcHkgYXMgbnAKaW1wb3J0IG9wZW5haQppbXBvcnQgcGFuZGFzIGFzIHBkCmltcG9ydCB0b3JjaAppbXBvcnQgdG9yY2hhdWRpbwppbXBvcnQgdHFkbQpmcm9tIHB5ZHViIGltcG9ydCBBdWRpb1NlZ21lbnQKCiMgR2V0IHRoZSBnbG9iYWwgbG9nZ2VyOgpfTE9HR0VSID0gbG9nZ2luZy5nZXRMb2dnZXIoKQoKT1BFTkFJX0FQSV9LRVkgPSAiT1BFTkFJX0FQSV9LRVkiCk9QRU5BSV9CQVNFX1VSTCA9ICJPUEVOQUlfQkFTRV9VUkwiClNBTVBMRV9SQVRFID0gMjQwMDAKCgpkZWYgZ2VuZXJhdGVfbXVsdGlfc3BlYWtlcnNfYXVkaW8oCiAgICBkYXRhX3BhdGg6IHN0ciwKICAgIHNwZWFrZXJzOiBVbmlvbltMaXN0W3N0cl0sIERpY3Rbc3RyLCBpbnRdXSwKICAgIGF2YWlsYWJsZV92b2ljZXM6IExpc3Rbc3RyXSwKICAgIG91dHB1dF9kaXJlY3Rvcnk6IHN0ciA9IE5vbmUsCiAgICBtb2RlbDogc3RyID0gInR0cy0xIiwKICAgIHNhbXBsZV9yYXRlOiBpbnQgPSAxNjAwMCwKICAgIGZpbGVfZm9ybWF0OiBzdHIgPSAid2F2IiwKICAgIHZlcmJvc2U6IGJvb2wgPSBUcnVlLAogICAgYml0c19wZXJfc2FtcGxlOiBPcHRpb25hbFtpbnRdID0gTm9uZSwKICAgIHNwZWVkOiBmbG9hdCA9IDEuMCwKKSAtPiBUdXBsZVtzdHIsIHBkLkRhdGFGcmFtZSwgZGljdF06CiAgICAiIiIKICAgIEdlbmVyYXRlIGF1ZGlvIGZpbGVzIGZyb20gdGV4dCBmaWxlcy4KCiAgICA6cGFyYW0gZGF0YV9wYXRoOiAgICAgICAgICAgUGF0aCB0byB0aGUgdGV4dCBmaWxlIG9yIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSB0ZXh0IGZpbGVzIHRvIGdlbmVyYXRlIGF1ZGlvIGZyb20uCiAgICA6cGFyYW0gc3BlYWtlcnM6ICAgICAgICAgICAgTGlzdCAvIERpY3Qgb2Ygc3BlYWtlcnMgdG8gZ2VuZXJhdGUgYXVkaW8gZm9yLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIGEgbGlzdCBpcyBnaXZlbiwgdGhlIHNwZWFrZXJzIHdpbGwgYmUgYXNzaWduZWQgdG8gY2hhbm5lbHMgaW4gdGhlIG9yZGVyIGdpdmVuLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIGRpY3Rpb25hcnksIHRoZSBrZXlzIHdpbGwgYmUgdGhlIHNwZWFrZXJzIGFuZCB0aGUgdmFsdWVzIHdpbGwgYmUgdGhlIGNoYW5uZWxzLgogICAgOnBhcmFtIGF2YWlsYWJsZV92b2ljZXM6ICAgIExpc3Qgb2YgYXZhaWxhYmxlIHZvaWNlcyB0byB1c2UgZm9yIHRoZSBnZW5lcmF0aW9uLgogICAgICAgICAgICAgICAgICAgICAgICBTZWUgaGVyZSBmb3IgdGhlIGF2YWlsYWJsZSB2b2ljZXM6CiAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2d1aWRlcy90ZXh0LXRvLXNwZWVjaCN2b2ljZS1vcHRpb25zCiAgICA6cGFyYW0gb3V0cHV0X2RpcmVjdG9yeTogICAgUGF0aCB0byB0aGUgZGlyZWN0b3J5IHRvIHNhdmUgdGhlIGdlbmVyYXRlZCBhdWRpbyBmaWxlcyB0by4KICAgIDpwYXJhbSBtb2RlbDogICAgICAgICAgICAgICBXaGljaCBtb2RlbCB0byB1c2UgZm9yIHRoZSBnZW5lcmF0aW9uLgogICAgOnBhcmFtIHNhbXBsZV9yYXRlOiAgICAgICAgIFRoZSBzYW1wbGluZyByYXRlIG9mIHRoZSBnZW5lcmF0ZWQgYXVkaW8uCiAgICA6cGFyYW0gZmlsZV9mb3JtYXQ6ICAgICAgICAgVGhlIGZvcm1hdCBvZiB0aGUgZ2VuZXJhdGVkIGF1ZGlvIGZpbGVzLgogICAgOnBhcmFtIHZlcmJvc2U6ICAgICAgICAgICAgIFdoZXRoZXIgdG8gcHJpbnQgdGhlIHByb2dyZXNzIG9mIHRoZSBnZW5lcmF0aW9uLgogICAgOnBhcmFtIGJpdHNfcGVyX3NhbXBsZTogICAgIENoYW5nZXMgdGhlIGJpdCBkZXB0aCBmb3IgdGhlIHN1cHBvcnRlZCBmb3JtYXRzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1cHBvcnRlZCBvbmx5IGluICJ3YXYiIG9yICJmbGFjIiBmb3JtYXRzLgogICAgOnBhcmFtIHNwZWVkOiAgICAgICAgICAgICAgIFRoZSBzcGVlZCBvZiB0aGUgZ2VuZXJhdGVkIGF1ZGlvLiBTZWxlY3QgYSB2YWx1ZSBmcm9tIGAwLjI1YCB0byBgNC4wYC4gYDEuMGAgaXMgdGhlIGRlZmF1bHQuCgogICAgOnJldHVybnM6ICAgICAgICAgICAgICAgICAgIEEgdHVwbGUgb2Y6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBUaGUgb3V0cHV0IGRpcmVjdG9yeSBwYXRoLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gVGhlIGdlbmVyYXRlZCBhdWRpbyBmaWxlcyBkYXRhZnJhbWUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBUaGUgZXJyb3JzJyBkaWN0aW9uYXJ5LgogICAgIiIiCgogICAgZ2xvYmFsIF9MT0dHRVIKICAgIF9MT0dHRVIgPSBfZ2V0X2xvZ2dlcigpCiAgICAjIEdldCB0aGUgaW5wdXQgdGV4dCBmaWxlcyB0byB0dXJuIHRvIGF1ZGlvOgogICAgZGF0YV9wYXRoID0gcGF0aGxpYi5QYXRoKGRhdGFfcGF0aCkuYWJzb2x1dGUoKQogICAgdGV4dF9maWxlcyA9IF9nZXRfdGV4dF9maWxlcyhkYXRhX3BhdGg9ZGF0YV9wYXRoKQoKICAgICMgY29ubmVjdCB0byBvcGVuYWkgY2xpZW50OgogICAgY2xpZW50ID0gX2dldF9vcGVuYWlfY2xpZW50KCkKCiAgICAjIENoZWNrIGZvciBwZXIgY2hhbm5lbCBnZW5lcmF0aW9uOgogICAgaWYgaXNpbnN0YW5jZShzcGVha2VycywgZGljdCk6CiAgICAgICAgc3BlYWtlcl9wZXJfY2hhbm5lbCA9IFRydWUKICAgICAgICAjIFNvcnQgdGhlIGdpdmVuIHNwZWFrZXJzIGJ5IGNoYW5uZWxzOgogICAgICAgIHNwZWFrZXJzID0gewogICAgICAgICAgICBzcGVha2VyOiBjaGFubmVsCiAgICAgICAgICAgIGZvciBzcGVha2VyLCBjaGFubmVsIGluIHNvcnRlZChzcGVha2Vycy5pdGVtcygpLCBrZXk9bGFtYmRhIGl0ZW06IGl0ZW1bMV0pCiAgICAgICAgfQogICAgZWxzZToKICAgICAgICBzcGVha2VyX3Blcl9jaGFubmVsID0gRmFsc2UKCiAgICAjIFByZXBhcmUgdGhlIHJlc2FtcGxpbmcgbW9kdWxlOgogICAgcmVzYW1wbGVyID0gdG9yY2hhdWRpby50cmFuc2Zvcm1zLlJlc2FtcGxlKAogICAgICAgIG9yaWdfZnJlcT1TQU1QTEVfUkFURSwgbmV3X2ZyZXE9c2FtcGxlX3JhdGUsIGR0eXBlPXRvcmNoLmZsb2F0MzIKICAgICkKCiAgICAjIFByZXBhcmUgdGhlIGdhcCBiZXR3ZWVuIGVhY2ggc3BlYWtlcjoKICAgIGdhcF9iZXR3ZWVuX3NwZWFrZXJzID0gbnAuemVyb3MoaW50KDAuNSAqIFNBTVBMRV9SQVRFKSkKCiAgICAjIFByZXBhcmUgdGhlIHN1Y2Nlc3NlcyBkYXRhZnJhbWUgYW5kIGVycm9ycyBkaWN0aW9uYXJ5IHRvIGJlIHJldHVybmVkOgogICAgc3VjY2Vzc2VzID0gW10KICAgIGVycm9ycyA9IHt9CgogICAgIyBDcmVhdGUgdGhlIG91dHB1dCBkaXJlY3Rvcnk6CiAgICBpZiBvdXRwdXRfZGlyZWN0b3J5IGlzIE5vbmU6CiAgICAgICAgb3V0cHV0X2RpcmVjdG9yeSA9IHRlbXBmaWxlLm1rZHRlbXAoKQogICAgb3V0cHV0X2RpcmVjdG9yeSA9IHBhdGhsaWIuUGF0aChvdXRwdXRfZGlyZWN0b3J5KQogICAgaWYgbm90IG91dHB1dF9kaXJlY3RvcnkuZXhpc3RzKCk6CiAgICAgICAgb3V0cHV0X2RpcmVjdG9yeS5ta2RpcihleGlzdF9vaz1UcnVlLCBwYXJlbnRzPVRydWUpCgogICAgIyBTdGFydCBnZW5lcmF0aW5nIGF1ZGlvOgogICAgIyBHbyBvdmVyIHRoZSBhdWRpbyBmaWxlcyBhbmQgdHJhbnNjcmliZToKICAgIGZvciB0ZXh0X2ZpbGUgaW4gdHFkbS50cWRtKAogICAgICAgIHRleHRfZmlsZXMsIGRlc2M9IkdlbmVyYXRpbmciLCB1bml0PSJmaWxlIiwgZGlzYWJsZT1ub3QgdmVyYm9zZQogICAgKToKCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIFJhbmRvbWl6ZSB2b2ljZXMgZm9yIGVhY2ggc3BlYWtlcjoKICAgICAgICAgICAgY2hvc2VuX3ZvaWNlcyA9IHt9CiAgICAgICAgICAgIGF2YWlsYWJsZV92b2ljZXNfY29weSA9IGF2YWlsYWJsZV92b2ljZXMuY29weSgpCiAgICAgICAgICAgIGZvciBzcGVha2VyIGluIHNwZWFrZXJzOgogICAgICAgICAgICAgICAgdm9pY2UgPSByYW5kb20uY2hvaWNlKGF2YWlsYWJsZV92b2ljZXNfY29weSkKICAgICAgICAgICAgICAgIGNob3Nlbl92b2ljZXNbc3BlYWtlcl0gPSB2b2ljZQogICAgICAgICAgICAgICAgYXZhaWxhYmxlX3ZvaWNlc19jb3B5LnJlbW92ZSh2b2ljZSkKICAgICAgICAgICAgIyBSZWFkIHRleHQ6CiAgICAgICAgICAgIHdpdGggb3Blbih0ZXh0X2ZpbGUsICJyIikgYXMgZnA6CiAgICAgICAgICAgICAgICB0ZXh0ID0gZnAucmVhZCgpCiAgICAgICAgICAgICMgUHJlcGFyZSBhIGhvbGRlciBmb3IgYWxsIHRoZSBnZW5lcmF0ZWQgcGllY2VzIChpZiBwZXIgY2hhbm5lbCBlYWNoIHNwZWFrZXIgd2lsbCBoYXZlIGl0cyBvd24pOgogICAgICAgICAgICBhdWRpb19waWVjZXMgPSAoCiAgICAgICAgICAgICAgICB7c3BlYWtlcjogW10gZm9yIHNwZWFrZXIgaW4gc3BlYWtlcnN9CiAgICAgICAgICAgICAgICBpZiBzcGVha2VyX3Blcl9jaGFubmVsCiAgICAgICAgICAgICAgICBlbHNlIHsiYWxsIjogW119CiAgICAgICAgICAgICkKCiAgICAgICAgICAgICMgR2VuZXJhdGUgYXVkaW8gcGVyIGxpbmU6CiAgICAgICAgICAgIGZvciBsaW5lIGluIHRleHQuc3BsaXRsaW5lcygpOgogICAgICAgICAgICAgICAgIyBWYWxpZGF0ZSBsaW5lIGlzIGluIGNvcnJlY3Qgc3BlYWtlciBmb3JtYXQ6CgogICAgICAgICAgICAgICAgaWYgIjogIiBub3QgaW4gbGluZToKICAgICAgICAgICAgICAgICAgICBpZiB2ZXJib3NlOgogICAgICAgICAgICAgICAgICAgICAgICBfTE9HR0VSLndhcm5pbmcoZiJTa2lwcGluZyBsaW5lOiB7bGluZX0iKQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAjIFNwbGl0IGxpbmUgdG8gc3BlYWtlciBhbmQgaGlzIHdvcmRzOgogICAgICAgICAgICAgICAgY3VycmVudF9zcGVha2VyLCBzZW50ZW5jZXMgPSBsaW5lLnNwbGl0KCI6ICIsIDEpCiAgICAgICAgICAgICAgICAjIFZhbGlkYXRlIHNwZWFrZXIgaXMga25vd246CiAgICAgICAgICAgICAgICBpZiBjdXJyZW50X3NwZWFrZXIgbm90IGluIHNwZWFrZXJzOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIGYiVW5rbm93biBzcGVha2VyOiB7Y3VycmVudF9zcGVha2VyfS4gR2l2ZW4gc3BlYWtlcnMgYXJlOiB7c3BlYWtlcnN9IgogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGZvciBzZW50ZW5jZSBpbiBfc3BsaXRfbGluZShsaW5lPXNlbnRlbmNlcyk6CiAgICAgICAgICAgICAgICAgICAgIyBHZW5lcmF0ZSB3b3JkcyBhdWRpbzoKICAgICAgICAgICAgICAgICAgICBhdWRpbyA9IGNsaWVudC5hdWRpby5zcGVlY2guY3JlYXRlKAogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbD1tb2RlbCwKICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ9c2VudGVuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgIHZvaWNlPWNob3Nlbl92b2ljZXNbY3VycmVudF9zcGVha2VyXSwKICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VfZm9ybWF0PWZpbGVfZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICBzcGVlZD1zcGVlZCwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgYXVkaW8gPSBhdWRpby5jb250ZW50CiAgICAgICAgICAgICAgICAgICAgYXVkaW8gPSBfYnl0ZXNfdG9fbnBfYXJyYXkoYXVkaW89YXVkaW8sIGZpbGVfZm9ybWF0PWZpbGVfZm9ybWF0KQoKICAgICAgICAgICAgICAgICAgICBpZiBzcGVha2VyX3Blcl9jaGFubmVsOgogICAgICAgICAgICAgICAgICAgICAgICBzaWxlbmNlID0gbnAuemVyb3NfbGlrZShhdWRpbykKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHNwZWFrZXIgaW4gYXVkaW9fcGllY2VzLmtleXMoKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNwZWFrZXIgPT0gY3VycmVudF9zcGVha2VyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BpZWNlc1tzcGVha2VyXSArPSBbYXVkaW8sIGdhcF9iZXR3ZWVuX3NwZWFrZXJzXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19waWVjZXNbc3BlYWtlcl0gKz0gW3NpbGVuY2UsIGdhcF9iZXR3ZWVuX3NwZWFrZXJzXQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BpZWNlc1siYWxsIl0gKz0gW2F1ZGlvLCBnYXBfYmV0d2Vlbl9zcGVha2Vyc10KICAgICAgICAgICAgIyBDb25zdHJ1Y3QgYSBzaW5nbGUgYXVkaW8gYXJyYXkgZnJvbSBhbGwgdGhlIHBpZWNlcyBhbmQgY2hhbm5lbHM6CgogICAgICAgICAgICBhdWRpbyA9IG5wLnZzdGFjaygKICAgICAgICAgICAgICAgIFtucC5jb25jYXRlbmF0ZShhdWRpb19waWVjZXNbc3BlYWtlcl0pIGZvciBzcGVha2VyIGluIHNwZWFrZXJzXQogICAgICAgICAgICApLmFzdHlwZShkdHlwZT1ucC5mbG9hdDMyKQogICAgICAgICAgICAjIFJlc2FtcGxlOgogICAgICAgICAgICBhdWRpbyA9IHRvcmNoLmZyb21fbnVtcHkoYXVkaW8pCiAgICAgICAgICAgIGF1ZGlvID0gcmVzYW1wbGVyKGF1ZGlvKQogICAgICAgICAgICAjIFNhdmUgdG8gYXVkaW8gZmlsZToKICAgICAgICAgICAgYXVkaW9fZmlsZSA9IG91dHB1dF9kaXJlY3RvcnkgLyBmInt0ZXh0X2ZpbGUuc3RlbX0ue2ZpbGVfZm9ybWF0fSIKCiAgICAgICAgICAgIHRvcmNoYXVkaW8uc2F2ZSgKICAgICAgICAgICAgICAgIHVyaT1zdHIoYXVkaW9fZmlsZSksCiAgICAgICAgICAgICAgICBzcmM9YXVkaW8sCiAgICAgICAgICAgICAgICBzYW1wbGVfcmF0ZT1zYW1wbGVfcmF0ZSwKICAgICAgICAgICAgICAgIGZvcm1hdD1maWxlX2Zvcm1hdCwKICAgICAgICAgICAgICAgIGJpdHNfcGVyX3NhbXBsZT1iaXRzX3Blcl9zYW1wbGUsCiAgICAgICAgICAgICkKCiAgICAgICAgICAgICMgQ29sbGVjdCB0byB0aGUgc3VjY2Vzc2VzOgogICAgICAgICAgICBzdWNjZXNzZXMuYXBwZW5kKFt0ZXh0X2ZpbGUubmFtZSwgYXVkaW9fZmlsZS5uYW1lXSkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4Y2VwdGlvbjoKICAgICAgICAgICAgIyBOb3RlIHRoZSBleGNlcHRpb24gYXMgZXJyb3IgaW4gdGhlIGRpY3Rpb25hcnk6CiAgICAgICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgICAgICBfTE9HR0VSLndhcm5pbmcoZiJFcnJvciBpbiBmaWxlOiAne3RleHRfZmlsZS5uYW1lfSciKQogICAgICAgICAgICBwcmludChleGNlcHRpb24pCiAgICAgICAgICAgIGVycm9yc1t0ZXh0X2ZpbGUubmFtZV0gPSBzdHIoZXhjZXB0aW9uKQoKICAgICMgQ29uc3RydWN0IHRoZSB0cmFuc2xhdGlvbnMgZGF0YWZyYW1lOgogICAgc3VjY2Vzc2VzID0gcGQuRGF0YUZyYW1lKAogICAgICAgIHN1Y2Nlc3NlcywKICAgICAgICBjb2x1bW5zPVsidGV4dF9maWxlIiwgImF1ZGlvX2ZpbGUiXSwKICAgICkKCiAgICAjIFByaW50IHRoZSBoZWFkIG9mIHRoZSBwcm9kdWNlZCBkYXRhZnJhbWUgYW5kIHJldHVybjoKICAgIGlmIHZlcmJvc2U6CiAgICAgICAgX0xPR0dFUi5pbmZvKAogICAgICAgICAgICBmIkRvbmUgKHtzdWNjZXNzZXMuc2hhcGVbMF19L3tsZW4odGV4dF9maWxlcyl9KVxuIgogICAgICAgICAgICBmIlRyYW5zbGF0aW9ucyBzdW1tYXJ5OlxuIgogICAgICAgICAgICBmIntzdWNjZXNzZXMuaGVhZCgpfSIKICAgICAgICApCiAgICByZXR1cm4gc3RyKG91dHB1dF9kaXJlY3RvcnkpLCBzdWNjZXNzZXMsIGVycm9ycwoKCmRlZiBfZ2V0X29wZW5haV9jbGllbnQoKToKICAgIGFwaV9rZXkgPSBvcy5nZXRlbnYoT1BFTkFJX0FQSV9LRVkpCiAgICBiYXNlX3VybCA9IG9zLmdldGVudihPUEVOQUlfQkFTRV9VUkwpCiAgICAjIENoZWNrIGlmIHRoZSBrZXkgaXMgYWxyZWFkeSBpbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzOgogICAgaWYgbm90IGFwaV9rZXkgb3Igbm90IGJhc2VfdXJsOgogICAgICAgIHRyeToKICAgICAgICAgICAgaW1wb3J0IG1scnVuCgogICAgICAgICAgICBjb250ZXh0ID0gbWxydW4uZ2V0X29yX2NyZWF0ZV9jdHgobmFtZT0iY29udGV4dCIpCiAgICAgICAgICAgICMgQ2hlY2sgaWYgdGhlIGtleSBpcyBpbiB0aGUgc2VjcmV0czoKICAgICAgICAgICAgYXBpX2tleSA9IGNvbnRleHQuZ2V0X3NlY3JldChPUEVOQUlfQVBJX0tFWSkKICAgICAgICAgICAgYmFzZV91cmwgPSBjb250ZXh0LmdldF9zZWNyZXQoT1BFTkFJX0JBU0VfVVJMKQogICAgICAgIGV4Y2VwdCBNb2R1bGVOb3RGb3VuZEVycm9yOgogICAgICAgICAgICByYWlzZSBFbnZpcm9ubWVudEVycm9yKAogICAgICAgICAgICAgICAgZiJPbmUgb3IgbW9yZSBvZiB0aGUgT3BlbkFJIHJlcXVpcmVkIGVudmlyb25tZW50IHZhcmlhYmxlcyAoJ3tPUEVOQUlfQVBJX0tFWX0nLCAne09QRU5BSV9CQVNFX1VSTH0nKSBhcmUgbWlzc2luZy4iCiAgICAgICAgICAgICAgICBmIlBsZWFzZSBzZXQgdGhlbSBhcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgb3IgaW5zdGFsbCBtbHJ1biAoYHBpcCBpbnN0YWxsIG1scnVuYCkiCiAgICAgICAgICAgICAgICBmImFuZCBzZXQgdGhlbSBhcyBwcm9qZWN0IHNlY3JldHMgdXNpbmcgYHByb2plY3Quc2V0X3NlY3JldHNgLiIKICAgICAgICAgICAgKQogICAgcmV0dXJuIG9wZW5haS5PcGVuQUkoYXBpX2tleT1hcGlfa2V5LCBiYXNlX3VybD1iYXNlX3VybCkKCgpkZWYgX2J5dGVzX3RvX25wX2FycmF5KGF1ZGlvOiBieXRlcywgZmlsZV9mb3JtYXQ6IHN0cik6CiAgICBpZiBmaWxlX2Zvcm1hdCA9PSAibXAzIjoKICAgICAgICBhdWRpb19zZWdtZW50ID0gQXVkaW9TZWdtZW50LmZyb21fbXAzKGlvLkJ5dGVzSU8oYXVkaW8pKQoKICAgICAgICAjIENvbnZlcnQgdG8gcmF3IFBDTSBhdWRpbyBkYXRhCiAgICAgICAgc2FtcGxlcyA9IGF1ZGlvX3NlZ21lbnQuZ2V0X2FycmF5X29mX3NhbXBsZXMoKQoKICAgICAgICAjIENvbnZlcnQgdG8gbnVtcHkgYXJyYXkKICAgICAgICBhdWRpb19hcnJheSA9IG5wLmFycmF5KHNhbXBsZXMpCgogICAgICAgICMgTm9ybWFsaXplIHRvIGZsb2F0IGJldHdlZW4gLTEgYW5kIDEKICAgICAgICByZXR1cm4gYXVkaW9fYXJyYXkuYXN0eXBlKG5wLmZsb2F0MzIpIC8gbnAuaWluZm8oc2FtcGxlcy50eXBlY29kZSkubWF4CiAgICBlbHNlOgogICAgICAgIHJldHVybiBucC5mcm9tYnVmZmVyKGF1ZGlvLCBkdHlwZT1ucC5pbnQxNikgLyAzMjc2OC4wCgoKZGVmIF9nZXRfdGV4dF9maWxlcygKICAgIGRhdGFfcGF0aDogcGF0aGxpYi5QYXRoLAopIC0+IExpc3RbcGF0aGxpYi5QYXRoXToKICAgICMgQ2hlY2sgaWYgdGhlIHBhdGggaXMgb2YgYSBkaXJlY3Rvcnkgb3IgYSBmaWxlOgogICAgaWYgZGF0YV9wYXRoLmlzX2RpcigpOgogICAgICAgICMgR2V0IGFsbCBmaWxlcyBpbnNpZGUgdGhlIGRpcmVjdG9yeToKICAgICAgICB0ZXh0X2ZpbGVzID0gbGlzdChkYXRhX3BhdGguZ2xvYigiKi4qIikpCiAgICBlbGlmIGRhdGFfcGF0aC5pc19maWxlKCk6CiAgICAgICAgdGV4dF9maWxlcyA9IFtkYXRhX3BhdGhdCiAgICBlbHNlOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgIGYiVW5yZWNvZ25pemVkIGRhdGEgcGF0aC4gVGhlIHBhcmFtZXRlciBgZGF0YV9wYXRoYCBtdXN0IGJlIGVpdGhlciBhIGRpcmVjdG9yeSBwYXRoIG9yIGEgZmlsZSBwYXRoLiAiCiAgICAgICAgICAgIGYiR2l2ZW46IHtzdHIoZGF0YV9wYXRoKX0gIgogICAgICAgICkKCiAgICByZXR1cm4gdGV4dF9maWxlcwoKCmRlZiBfc3BsaXRfbGluZShsaW5lOiBzdHIsIG1heF9sZW5ndGg6IGludCA9IDI1MCkgLT4gTGlzdFtzdHJdOgogICAgaWYgbGVuKGxpbmUpIDwgbWF4X2xlbmd0aDoKICAgICAgICByZXR1cm4gW2xpbmVdCgogICAgc2VudGVuY2VzID0gWwogICAgICAgIGYie3NlbnRlbmNlLnN0cmlwKCl9LiIgZm9yIHNlbnRlbmNlIGluIGxpbmUuc3BsaXQoIi4iKSBpZiBzZW50ZW5jZS5zdHJpcCgpCiAgICBdCgogICAgc3BsaXRzID0gW10KICAgIGN1cnJlbnRfbGVuZ3RoID0gbGVuKHNlbnRlbmNlc1swXSkKICAgIHNwbGl0ID0gc2VudGVuY2VzWzBdCiAgICBmb3Igc2VudGVuY2UgaW4gc2VudGVuY2VzWzE6XToKICAgICAgICBpZiBjdXJyZW50X2xlbmd0aCArIGxlbihzZW50ZW5jZSkgPiBtYXhfbGVuZ3RoOgogICAgICAgICAgICBzcGxpdHMuYXBwZW5kKHNwbGl0KQogICAgICAgICAgICBzcGxpdCA9IHNlbnRlbmNlCiAgICAgICAgICAgIGN1cnJlbnRfbGVuZ3RoID0gbGVuKHNlbnRlbmNlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGN1cnJlbnRfbGVuZ3RoICs9IGxlbihzZW50ZW5jZSkKICAgICAgICAgICAgc3BsaXQgKz0gIiAiICsgc2VudGVuY2UKICAgIGlmIHNwbGl0OgogICAgICAgIHNwbGl0cy5hcHBlbmQoc3BsaXQpCgogICAgcmV0dXJuIHNwbGl0cwoKCmRlZiBfZ2V0X2xvZ2dlcigpOgogICAgZ2xvYmFsIF9MT0dHRVIKICAgIHRyeToKICAgICAgICBpbXBvcnQgbWxydW4KCiAgICAgICAgIyBDaGVjayBpZiBNTFJ1biBpcyBhdmFpbGFibGU6CiAgICAgICAgY29udGV4dCA9IG1scnVuLmdldF9vcl9jcmVhdGVfY3R4KG5hbWU9Im1scnVuIikKICAgICAgICByZXR1cm4gY29udGV4dC5sb2dnZXIKICAgIGV4Y2VwdCBNb2R1bGVOb3RGb3VuZEVycm9yOgogICAgICAgIHJldHVybiBfTE9HR0VSCg== requirements: - - bark + - openai - torchaudio + - pydub + origin_filename: '' + base_image: mlrun/mlrun + code_origin: '' + command: '' + disable_auto_mount: false + description: Generate audio file from text using different speakers entry_points: generate_multi_speakers_audio: - name: generate_multi_speakers_audio + has_varargs: false doc: Generate audio files from text files. + name: generate_multi_speakers_audio + outputs: + - doc: 'A tuple of: - The output directory path. - The generated audio files + dataframe. - The errors'' dictionary.' + type: Tuple[str, pd.DataFrame, dict] + has_kwargs: false parameters: - name: data_path type: str @@ -40,24 +36,15 @@ spec: - name: available_voices type: List[str] doc: 'List of available voices to use for the generation. See here for the - available voices: https://suno-ai.notion.site/8b8e8749ed514b0cbf3f699013548683?v=bc67cff786b04b50b3ceb756fd05f68c' + available voices: https://platform.openai.com/docs/guides/text-to-speech#voice-options' - name: output_directory type: str doc: Path to the directory to save the generated audio files to. default: null - - name: use_gpu - type: bool - doc: Whether to use the GPU for the generation. - default: true - - name: use_small_models - type: bool - doc: Whether to use the small models for the generation. - default: false - - name: offload_cpu - type: bool - doc: To reduce the memory footprint, the models can be offloaded to the CPU - after loading. - default: false + - name: model + type: str + doc: Which model to use for the generation. + default: tts-1 - name: sample_rate type: int doc: The sampling rate of the generated audio. @@ -75,21 +62,18 @@ spec: doc: Changes the bit depth for the supported formats. Supported only in "wav" or "flac" formats. default: null - outputs: - - doc: 'A tuple of: - The output directory path. - The generated audio files - dataframe. - The errors dictionary.' - type: Tuple[str, pd.DataFrame, dict] - lineno: 31 - has_varargs: false - has_kwargs: false - description: Generate audio file from text using different speakers - default_handler: generate_multi_speakers_audio - disable_auto_mount: false - clone_target_dir: '' - env: [] - priority_class_name: '' - preemption_mode: prevent - affinity: null - tolerations: null - security_context: {} + - name: speed + type: float + doc: The speed of the generated audio. Select a value from `0.25` to `4.0`. + `1.0` is the default. + default: 1.0 + lineno: 38 +kind: job +metadata: + categories: + - data-preparation + - machine-learning + - pytorch + tag: '' + name: text-to-audio-generator verbose: false diff --git a/text_to_audio_generator/item.yaml b/text_to_audio_generator/item.yaml index efa8afc90..3a6af1e7e 100644 --- a/text_to_audio_generator/item.yaml +++ b/text_to_audio_generator/item.yaml @@ -13,7 +13,7 @@ labels: author: yonatans maintainers: [] marketplaceType: '' -mlrunVersion: 1.5.1 +mlrunVersion: 1.7.1 name: text_to_audio_generator platformVersion: 3.5.3 spec: @@ -22,8 +22,9 @@ spec: image: mlrun/mlrun kind: job requirements: - - bark + - openai - torchaudio + - pydub url: '' -version: 1.2.0 +version: 1.3.0 test_valid: True diff --git a/text_to_audio_generator/requirements.txt b/text_to_audio_generator/requirements.txt index 36f17cd61..63dee64df 100644 --- a/text_to_audio_generator/requirements.txt +++ b/text_to_audio_generator/requirements.txt @@ -1,2 +1,3 @@ -bark -torchaudio>=2.1.0 \ No newline at end of file +openai>=1.58.0 +torchaudio>=2.1.0 +pydub \ No newline at end of file diff --git a/text_to_audio_generator/test_text_to_audio_generator.py b/text_to_audio_generator/test_text_to_audio_generator.py index 87ffe1496..94fd8c098 100644 --- a/text_to_audio_generator/test_text_to_audio_generator.py +++ b/text_to_audio_generator/test_text_to_audio_generator.py @@ -12,11 +12,18 @@ # See the License for the specific language governing permissions and # limitations under the License. -import mlrun +import os import tempfile + +import mlrun import pytest +@pytest.mark.skipif( + condition=os.getenv("OPENAI_BASE_URL") is None + and os.getenv("OPENAI_API_KEY") is None, + reason="OpenAI API key and base URL are required to run this test", +) @pytest.mark.parametrize("file_format,bits_per_sample", [("wav", 8), ("mp3", None)]) def test_generate_multi_speakers_audio(file_format, bits_per_sample): text_to_audio_generator_function = mlrun.import_function("function.yaml") @@ -28,12 +35,9 @@ def test_generate_multi_speakers_audio(file_format, bits_per_sample): "output_directory": test_directory, "speakers": {"Agent": 0, "Client": 1}, "available_voices": [ - "v2/en_speaker_0", - "v2/en_speaker_1", + "alloy", + "echo", ], - "use_small_models": True, - "use_gpu": False, - "offload_cpu": True, "file_format": file_format, "bits_per_sample": bits_per_sample, }, @@ -45,6 +49,6 @@ def test_generate_multi_speakers_audio(file_format, bits_per_sample): ], artifact_path=test_directory, ) - assert function_run.error == "Run state (completed) is not in error state" + assert function_run.error == "" for key in ["audio_files", "audio_files_dataframe", "text_to_speech_errors"]: assert key in function_run.outputs and function_run.outputs[key] is not None diff --git a/text_to_audio_generator/text_to_audio_generator.ipynb b/text_to_audio_generator/text_to_audio_generator.ipynb index 268fe2efb..a70882a44 100644 --- a/text_to_audio_generator/text_to_audio_generator.ipynb +++ b/text_to_audio_generator/text_to_audio_generator.ipynb @@ -31,10 +31,7 @@ "id": "bb20c4a6-f362-40e6-8f73-9145953959ec", "metadata": {}, "outputs": [], - "source": [ - "import mlrun\n", - "import tempfile" - ] + "source": "import mlrun" }, { "cell_type": "code", @@ -322,12 +319,9 @@ " \"output_directory\": \"./out\",\n", " \"speakers\": {\"Agent\": 0, \"Client\": 1},\n", " \"available_voices\": [\n", - " \"v2/en_speaker_0\",\n", - " \"v2/en_speaker_1\",\n", + " \"alloy\",\n", + " \"echo\",\n", " ],\n", - " \"use_small_models\": True,\n", - " \"use_gpu\": False,\n", - " \"offload_cpu\": True,\n", " \"file_format\": \"mp3\",\n", " # \"bits_per_sample\": 8,\n", " },\n", diff --git a/text_to_audio_generator/text_to_audio_generator.py b/text_to_audio_generator/text_to_audio_generator.py index 7602745ee..d47d6b865 100644 --- a/text_to_audio_generator/text_to_audio_generator.py +++ b/text_to_audio_generator/text_to_audio_generator.py @@ -11,35 +11,41 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +import io import logging +import os import pathlib import random import tempfile from typing import Dict, List, Optional, Tuple, Union -import bark import numpy as np +import openai import pandas as pd import torch import torchaudio import tqdm +from pydub import AudioSegment # Get the global logger: _LOGGER = logging.getLogger() +OPENAI_API_KEY = "OPENAI_API_KEY" +OPENAI_BASE_URL = "OPENAI_BASE_URL" +SAMPLE_RATE = 24000 + def generate_multi_speakers_audio( data_path: str, speakers: Union[List[str], Dict[str, int]], available_voices: List[str], output_directory: str = None, - use_gpu: bool = True, - use_small_models: bool = False, - offload_cpu: bool = False, + model: str = "tts-1", sample_rate: int = 16000, file_format: str = "wav", verbose: bool = True, bits_per_sample: Optional[int] = None, + speed: float = 1.0, ) -> Tuple[str, pd.DataFrame, dict]: """ Generate audio files from text files. @@ -50,21 +56,20 @@ def generate_multi_speakers_audio( If dictionary, the keys will be the speakers and the values will be the channels. :param available_voices: List of available voices to use for the generation. See here for the available voices: - https://suno-ai.notion.site/8b8e8749ed514b0cbf3f699013548683?v=bc67cff786b04b50b3ceb756fd05f68c + https://platform.openai.com/docs/guides/text-to-speech#voice-options :param output_directory: Path to the directory to save the generated audio files to. - :param use_gpu: Whether to use the GPU for the generation. - :param use_small_models: Whether to use the small models for the generation. - :param offload_cpu: To reduce the memory footprint, the models can be offloaded to the CPU after loading. + :param model: Which model to use for the generation. :param sample_rate: The sampling rate of the generated audio. :param file_format: The format of the generated audio files. :param verbose: Whether to print the progress of the generation. :param bits_per_sample: Changes the bit depth for the supported formats. Supported only in "wav" or "flac" formats. + :param speed: The speed of the generated audio. Select a value from `0.25` to `4.0`. `1.0` is the default. :returns: A tuple of: - The output directory path. - The generated audio files dataframe. - - The errors dictionary. + - The errors' dictionary. """ global _LOGGER @@ -73,17 +78,8 @@ def generate_multi_speakers_audio( data_path = pathlib.Path(data_path).absolute() text_files = _get_text_files(data_path=data_path) - # Load the bark models according to the given configurations: - bark.preload_models( - text_use_gpu=use_gpu, - text_use_small=use_small_models, - coarse_use_gpu=use_gpu, - coarse_use_small=use_small_models, - fine_use_gpu=use_gpu, - fine_use_small=use_small_models, - codec_use_gpu=use_gpu, - force_reload=offload_cpu, - ) + # connect to openai client: + client = _get_openai_client() # Check for per channel generation: if isinstance(speakers, dict): @@ -98,11 +94,11 @@ def generate_multi_speakers_audio( # Prepare the resampling module: resampler = torchaudio.transforms.Resample( - orig_freq=bark.SAMPLE_RATE, new_freq=sample_rate, dtype=torch.float32 + orig_freq=SAMPLE_RATE, new_freq=sample_rate, dtype=torch.float32 ) # Prepare the gap between each speaker: - gap_between_speakers = np.zeros(int(0.5 * bark.SAMPLE_RATE)) + gap_between_speakers = np.zeros(int(0.5 * SAMPLE_RATE)) # Prepare the successes dataframe and errors dictionary to be returned: successes = [] @@ -156,11 +152,16 @@ def generate_multi_speakers_audio( ) for sentence in _split_line(line=sentences): # Generate words audio: - audio = bark.generate_audio( - sentence, - history_prompt=chosen_voices[current_speaker], - silent=True, + audio = client.audio.speech.create( + model=model, + input=sentence, + voice=chosen_voices[current_speaker], + response_format=file_format, + speed=speed, ) + audio = audio.content + audio = _bytes_to_np_array(audio=audio, file_format=file_format) + if speaker_per_channel: silence = np.zeros_like(audio) for speaker in audio_pieces.keys(): @@ -214,6 +215,43 @@ def generate_multi_speakers_audio( return str(output_directory), successes, errors +def _get_openai_client(): + api_key = os.getenv(OPENAI_API_KEY) + base_url = os.getenv(OPENAI_BASE_URL) + # Check if the key is already in the environment variables: + if not api_key or not base_url: + try: + import mlrun + + context = mlrun.get_or_create_ctx(name="context") + # Check if the key is in the secrets: + api_key = context.get_secret(OPENAI_API_KEY) + base_url = context.get_secret(OPENAI_BASE_URL) + except ModuleNotFoundError: + raise EnvironmentError( + f"One or more of the OpenAI required environment variables ('{OPENAI_API_KEY}', '{OPENAI_BASE_URL}') are missing." + f"Please set them as environment variables or install mlrun (`pip install mlrun`)" + f"and set them as project secrets using `project.set_secrets`." + ) + return openai.OpenAI(api_key=api_key, base_url=base_url) + + +def _bytes_to_np_array(audio: bytes, file_format: str): + if file_format == "mp3": + audio_segment = AudioSegment.from_mp3(io.BytesIO(audio)) + + # Convert to raw PCM audio data + samples = audio_segment.get_array_of_samples() + + # Convert to numpy array + audio_array = np.array(samples) + + # Normalize to float between -1 and 1 + return audio_array.astype(np.float32) / np.iinfo(samples.typecode).max + else: + return np.frombuffer(audio, dtype=np.int16) / 32768.0 + + def _get_text_files( data_path: pathlib.Path, ) -> List[pathlib.Path]: @@ -261,6 +299,7 @@ def _get_logger(): global _LOGGER try: import mlrun + # Check if MLRun is available: context = mlrun.get_or_create_ctx(name="mlrun") return context.logger From b3eb31ad06df2173d996b5d3999674a80739da11 Mon Sep 17 00:00:00 2001 From: Yonatan Shelach <92271540+yonishelach@users.noreply.github.com> Date: Thu, 2 Jan 2025 13:35:31 +0200 Subject: [PATCH 28/38] [Text to audio generator] Add speech engine (#838) * [text to audio generator] Replaced bark with openai tts models * [text to audio generator] Fix base url env var * fix version * Add speech engine * after review --- text_to_audio_generator/function.yaml | 86 +++++---- text_to_audio_generator/item.yaml | 1 - text_to_audio_generator/requirements.txt | 3 +- .../test_text_to_audio_generator.py | 41 +++- .../text_to_audio_generator.ipynb | 1 + .../text_to_audio_generator.py | 182 +++++++++++++----- 6 files changed, 230 insertions(+), 84 deletions(-) diff --git a/text_to_audio_generator/function.yaml b/text_to_audio_generator/function.yaml index 65d8d82aa..f7fe52866 100644 --- a/text_to_audio_generator/function.yaml +++ b/text_to_audio_generator/function.yaml @@ -1,28 +1,29 @@ +metadata: + name: text-to-audio-generator + categories: + - data-preparation + - machine-learning + - pytorch + tag: '' spec: - image: '' - default_handler: generate_multi_speakers_audio + command: '' build: - functionSourceCode: IyBDb3B5cmlnaHQgMjAyMyBJZ3VhemlvCiMKIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAojCiMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQojIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAojIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgppbXBvcnQgaW8KaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCmltcG9ydCBwYXRobGliCmltcG9ydCByYW5kb20KaW1wb3J0IHRlbXBmaWxlCmZyb20gdHlwaW5nIGltcG9ydCBEaWN0LCBMaXN0LCBPcHRpb25hbCwgVHVwbGUsIFVuaW9uCgppbXBvcnQgbnVtcHkgYXMgbnAKaW1wb3J0IG9wZW5haQppbXBvcnQgcGFuZGFzIGFzIHBkCmltcG9ydCB0b3JjaAppbXBvcnQgdG9yY2hhdWRpbwppbXBvcnQgdHFkbQpmcm9tIHB5ZHViIGltcG9ydCBBdWRpb1NlZ21lbnQKCiMgR2V0IHRoZSBnbG9iYWwgbG9nZ2VyOgpfTE9HR0VSID0gbG9nZ2luZy5nZXRMb2dnZXIoKQoKT1BFTkFJX0FQSV9LRVkgPSAiT1BFTkFJX0FQSV9LRVkiCk9QRU5BSV9CQVNFX1VSTCA9ICJPUEVOQUlfQkFTRV9VUkwiClNBTVBMRV9SQVRFID0gMjQwMDAKCgpkZWYgZ2VuZXJhdGVfbXVsdGlfc3BlYWtlcnNfYXVkaW8oCiAgICBkYXRhX3BhdGg6IHN0ciwKICAgIHNwZWFrZXJzOiBVbmlvbltMaXN0W3N0cl0sIERpY3Rbc3RyLCBpbnRdXSwKICAgIGF2YWlsYWJsZV92b2ljZXM6IExpc3Rbc3RyXSwKICAgIG91dHB1dF9kaXJlY3Rvcnk6IHN0ciA9IE5vbmUsCiAgICBtb2RlbDogc3RyID0gInR0cy0xIiwKICAgIHNhbXBsZV9yYXRlOiBpbnQgPSAxNjAwMCwKICAgIGZpbGVfZm9ybWF0OiBzdHIgPSAid2F2IiwKICAgIHZlcmJvc2U6IGJvb2wgPSBUcnVlLAogICAgYml0c19wZXJfc2FtcGxlOiBPcHRpb25hbFtpbnRdID0gTm9uZSwKICAgIHNwZWVkOiBmbG9hdCA9IDEuMCwKKSAtPiBUdXBsZVtzdHIsIHBkLkRhdGFGcmFtZSwgZGljdF06CiAgICAiIiIKICAgIEdlbmVyYXRlIGF1ZGlvIGZpbGVzIGZyb20gdGV4dCBmaWxlcy4KCiAgICA6cGFyYW0gZGF0YV9wYXRoOiAgICAgICAgICAgUGF0aCB0byB0aGUgdGV4dCBmaWxlIG9yIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSB0ZXh0IGZpbGVzIHRvIGdlbmVyYXRlIGF1ZGlvIGZyb20uCiAgICA6cGFyYW0gc3BlYWtlcnM6ICAgICAgICAgICAgTGlzdCAvIERpY3Qgb2Ygc3BlYWtlcnMgdG8gZ2VuZXJhdGUgYXVkaW8gZm9yLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIGEgbGlzdCBpcyBnaXZlbiwgdGhlIHNwZWFrZXJzIHdpbGwgYmUgYXNzaWduZWQgdG8gY2hhbm5lbHMgaW4gdGhlIG9yZGVyIGdpdmVuLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIGRpY3Rpb25hcnksIHRoZSBrZXlzIHdpbGwgYmUgdGhlIHNwZWFrZXJzIGFuZCB0aGUgdmFsdWVzIHdpbGwgYmUgdGhlIGNoYW5uZWxzLgogICAgOnBhcmFtIGF2YWlsYWJsZV92b2ljZXM6ICAgIExpc3Qgb2YgYXZhaWxhYmxlIHZvaWNlcyB0byB1c2UgZm9yIHRoZSBnZW5lcmF0aW9uLgogICAgICAgICAgICAgICAgICAgICAgICBTZWUgaGVyZSBmb3IgdGhlIGF2YWlsYWJsZSB2b2ljZXM6CiAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2d1aWRlcy90ZXh0LXRvLXNwZWVjaCN2b2ljZS1vcHRpb25zCiAgICA6cGFyYW0gb3V0cHV0X2RpcmVjdG9yeTogICAgUGF0aCB0byB0aGUgZGlyZWN0b3J5IHRvIHNhdmUgdGhlIGdlbmVyYXRlZCBhdWRpbyBmaWxlcyB0by4KICAgIDpwYXJhbSBtb2RlbDogICAgICAgICAgICAgICBXaGljaCBtb2RlbCB0byB1c2UgZm9yIHRoZSBnZW5lcmF0aW9uLgogICAgOnBhcmFtIHNhbXBsZV9yYXRlOiAgICAgICAgIFRoZSBzYW1wbGluZyByYXRlIG9mIHRoZSBnZW5lcmF0ZWQgYXVkaW8uCiAgICA6cGFyYW0gZmlsZV9mb3JtYXQ6ICAgICAgICAgVGhlIGZvcm1hdCBvZiB0aGUgZ2VuZXJhdGVkIGF1ZGlvIGZpbGVzLgogICAgOnBhcmFtIHZlcmJvc2U6ICAgICAgICAgICAgIFdoZXRoZXIgdG8gcHJpbnQgdGhlIHByb2dyZXNzIG9mIHRoZSBnZW5lcmF0aW9uLgogICAgOnBhcmFtIGJpdHNfcGVyX3NhbXBsZTogICAgIENoYW5nZXMgdGhlIGJpdCBkZXB0aCBmb3IgdGhlIHN1cHBvcnRlZCBmb3JtYXRzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1cHBvcnRlZCBvbmx5IGluICJ3YXYiIG9yICJmbGFjIiBmb3JtYXRzLgogICAgOnBhcmFtIHNwZWVkOiAgICAgICAgICAgICAgIFRoZSBzcGVlZCBvZiB0aGUgZ2VuZXJhdGVkIGF1ZGlvLiBTZWxlY3QgYSB2YWx1ZSBmcm9tIGAwLjI1YCB0byBgNC4wYC4gYDEuMGAgaXMgdGhlIGRlZmF1bHQuCgogICAgOnJldHVybnM6ICAgICAgICAgICAgICAgICAgIEEgdHVwbGUgb2Y6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBUaGUgb3V0cHV0IGRpcmVjdG9yeSBwYXRoLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gVGhlIGdlbmVyYXRlZCBhdWRpbyBmaWxlcyBkYXRhZnJhbWUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBUaGUgZXJyb3JzJyBkaWN0aW9uYXJ5LgogICAgIiIiCgogICAgZ2xvYmFsIF9MT0dHRVIKICAgIF9MT0dHRVIgPSBfZ2V0X2xvZ2dlcigpCiAgICAjIEdldCB0aGUgaW5wdXQgdGV4dCBmaWxlcyB0byB0dXJuIHRvIGF1ZGlvOgogICAgZGF0YV9wYXRoID0gcGF0aGxpYi5QYXRoKGRhdGFfcGF0aCkuYWJzb2x1dGUoKQogICAgdGV4dF9maWxlcyA9IF9nZXRfdGV4dF9maWxlcyhkYXRhX3BhdGg9ZGF0YV9wYXRoKQoKICAgICMgY29ubmVjdCB0byBvcGVuYWkgY2xpZW50OgogICAgY2xpZW50ID0gX2dldF9vcGVuYWlfY2xpZW50KCkKCiAgICAjIENoZWNrIGZvciBwZXIgY2hhbm5lbCBnZW5lcmF0aW9uOgogICAgaWYgaXNpbnN0YW5jZShzcGVha2VycywgZGljdCk6CiAgICAgICAgc3BlYWtlcl9wZXJfY2hhbm5lbCA9IFRydWUKICAgICAgICAjIFNvcnQgdGhlIGdpdmVuIHNwZWFrZXJzIGJ5IGNoYW5uZWxzOgogICAgICAgIHNwZWFrZXJzID0gewogICAgICAgICAgICBzcGVha2VyOiBjaGFubmVsCiAgICAgICAgICAgIGZvciBzcGVha2VyLCBjaGFubmVsIGluIHNvcnRlZChzcGVha2Vycy5pdGVtcygpLCBrZXk9bGFtYmRhIGl0ZW06IGl0ZW1bMV0pCiAgICAgICAgfQogICAgZWxzZToKICAgICAgICBzcGVha2VyX3Blcl9jaGFubmVsID0gRmFsc2UKCiAgICAjIFByZXBhcmUgdGhlIHJlc2FtcGxpbmcgbW9kdWxlOgogICAgcmVzYW1wbGVyID0gdG9yY2hhdWRpby50cmFuc2Zvcm1zLlJlc2FtcGxlKAogICAgICAgIG9yaWdfZnJlcT1TQU1QTEVfUkFURSwgbmV3X2ZyZXE9c2FtcGxlX3JhdGUsIGR0eXBlPXRvcmNoLmZsb2F0MzIKICAgICkKCiAgICAjIFByZXBhcmUgdGhlIGdhcCBiZXR3ZWVuIGVhY2ggc3BlYWtlcjoKICAgIGdhcF9iZXR3ZWVuX3NwZWFrZXJzID0gbnAuemVyb3MoaW50KDAuNSAqIFNBTVBMRV9SQVRFKSkKCiAgICAjIFByZXBhcmUgdGhlIHN1Y2Nlc3NlcyBkYXRhZnJhbWUgYW5kIGVycm9ycyBkaWN0aW9uYXJ5IHRvIGJlIHJldHVybmVkOgogICAgc3VjY2Vzc2VzID0gW10KICAgIGVycm9ycyA9IHt9CgogICAgIyBDcmVhdGUgdGhlIG91dHB1dCBkaXJlY3Rvcnk6CiAgICBpZiBvdXRwdXRfZGlyZWN0b3J5IGlzIE5vbmU6CiAgICAgICAgb3V0cHV0X2RpcmVjdG9yeSA9IHRlbXBmaWxlLm1rZHRlbXAoKQogICAgb3V0cHV0X2RpcmVjdG9yeSA9IHBhdGhsaWIuUGF0aChvdXRwdXRfZGlyZWN0b3J5KQogICAgaWYgbm90IG91dHB1dF9kaXJlY3RvcnkuZXhpc3RzKCk6CiAgICAgICAgb3V0cHV0X2RpcmVjdG9yeS5ta2RpcihleGlzdF9vaz1UcnVlLCBwYXJlbnRzPVRydWUpCgogICAgIyBTdGFydCBnZW5lcmF0aW5nIGF1ZGlvOgogICAgIyBHbyBvdmVyIHRoZSBhdWRpbyBmaWxlcyBhbmQgdHJhbnNjcmliZToKICAgIGZvciB0ZXh0X2ZpbGUgaW4gdHFkbS50cWRtKAogICAgICAgIHRleHRfZmlsZXMsIGRlc2M9IkdlbmVyYXRpbmciLCB1bml0PSJmaWxlIiwgZGlzYWJsZT1ub3QgdmVyYm9zZQogICAgKToKCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIFJhbmRvbWl6ZSB2b2ljZXMgZm9yIGVhY2ggc3BlYWtlcjoKICAgICAgICAgICAgY2hvc2VuX3ZvaWNlcyA9IHt9CiAgICAgICAgICAgIGF2YWlsYWJsZV92b2ljZXNfY29weSA9IGF2YWlsYWJsZV92b2ljZXMuY29weSgpCiAgICAgICAgICAgIGZvciBzcGVha2VyIGluIHNwZWFrZXJzOgogICAgICAgICAgICAgICAgdm9pY2UgPSByYW5kb20uY2hvaWNlKGF2YWlsYWJsZV92b2ljZXNfY29weSkKICAgICAgICAgICAgICAgIGNob3Nlbl92b2ljZXNbc3BlYWtlcl0gPSB2b2ljZQogICAgICAgICAgICAgICAgYXZhaWxhYmxlX3ZvaWNlc19jb3B5LnJlbW92ZSh2b2ljZSkKICAgICAgICAgICAgIyBSZWFkIHRleHQ6CiAgICAgICAgICAgIHdpdGggb3Blbih0ZXh0X2ZpbGUsICJyIikgYXMgZnA6CiAgICAgICAgICAgICAgICB0ZXh0ID0gZnAucmVhZCgpCiAgICAgICAgICAgICMgUHJlcGFyZSBhIGhvbGRlciBmb3IgYWxsIHRoZSBnZW5lcmF0ZWQgcGllY2VzIChpZiBwZXIgY2hhbm5lbCBlYWNoIHNwZWFrZXIgd2lsbCBoYXZlIGl0cyBvd24pOgogICAgICAgICAgICBhdWRpb19waWVjZXMgPSAoCiAgICAgICAgICAgICAgICB7c3BlYWtlcjogW10gZm9yIHNwZWFrZXIgaW4gc3BlYWtlcnN9CiAgICAgICAgICAgICAgICBpZiBzcGVha2VyX3Blcl9jaGFubmVsCiAgICAgICAgICAgICAgICBlbHNlIHsiYWxsIjogW119CiAgICAgICAgICAgICkKCiAgICAgICAgICAgICMgR2VuZXJhdGUgYXVkaW8gcGVyIGxpbmU6CiAgICAgICAgICAgIGZvciBsaW5lIGluIHRleHQuc3BsaXRsaW5lcygpOgogICAgICAgICAgICAgICAgIyBWYWxpZGF0ZSBsaW5lIGlzIGluIGNvcnJlY3Qgc3BlYWtlciBmb3JtYXQ6CgogICAgICAgICAgICAgICAgaWYgIjogIiBub3QgaW4gbGluZToKICAgICAgICAgICAgICAgICAgICBpZiB2ZXJib3NlOgogICAgICAgICAgICAgICAgICAgICAgICBfTE9HR0VSLndhcm5pbmcoZiJTa2lwcGluZyBsaW5lOiB7bGluZX0iKQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAjIFNwbGl0IGxpbmUgdG8gc3BlYWtlciBhbmQgaGlzIHdvcmRzOgogICAgICAgICAgICAgICAgY3VycmVudF9zcGVha2VyLCBzZW50ZW5jZXMgPSBsaW5lLnNwbGl0KCI6ICIsIDEpCiAgICAgICAgICAgICAgICAjIFZhbGlkYXRlIHNwZWFrZXIgaXMga25vd246CiAgICAgICAgICAgICAgICBpZiBjdXJyZW50X3NwZWFrZXIgbm90IGluIHNwZWFrZXJzOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIGYiVW5rbm93biBzcGVha2VyOiB7Y3VycmVudF9zcGVha2VyfS4gR2l2ZW4gc3BlYWtlcnMgYXJlOiB7c3BlYWtlcnN9IgogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGZvciBzZW50ZW5jZSBpbiBfc3BsaXRfbGluZShsaW5lPXNlbnRlbmNlcyk6CiAgICAgICAgICAgICAgICAgICAgIyBHZW5lcmF0ZSB3b3JkcyBhdWRpbzoKICAgICAgICAgICAgICAgICAgICBhdWRpbyA9IGNsaWVudC5hdWRpby5zcGVlY2guY3JlYXRlKAogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbD1tb2RlbCwKICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ9c2VudGVuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgIHZvaWNlPWNob3Nlbl92b2ljZXNbY3VycmVudF9zcGVha2VyXSwKICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VfZm9ybWF0PWZpbGVfZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICBzcGVlZD1zcGVlZCwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgYXVkaW8gPSBhdWRpby5jb250ZW50CiAgICAgICAgICAgICAgICAgICAgYXVkaW8gPSBfYnl0ZXNfdG9fbnBfYXJyYXkoYXVkaW89YXVkaW8sIGZpbGVfZm9ybWF0PWZpbGVfZm9ybWF0KQoKICAgICAgICAgICAgICAgICAgICBpZiBzcGVha2VyX3Blcl9jaGFubmVsOgogICAgICAgICAgICAgICAgICAgICAgICBzaWxlbmNlID0gbnAuemVyb3NfbGlrZShhdWRpbykKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHNwZWFrZXIgaW4gYXVkaW9fcGllY2VzLmtleXMoKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNwZWFrZXIgPT0gY3VycmVudF9zcGVha2VyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BpZWNlc1tzcGVha2VyXSArPSBbYXVkaW8sIGdhcF9iZXR3ZWVuX3NwZWFrZXJzXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19waWVjZXNbc3BlYWtlcl0gKz0gW3NpbGVuY2UsIGdhcF9iZXR3ZWVuX3NwZWFrZXJzXQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BpZWNlc1siYWxsIl0gKz0gW2F1ZGlvLCBnYXBfYmV0d2Vlbl9zcGVha2Vyc10KICAgICAgICAgICAgIyBDb25zdHJ1Y3QgYSBzaW5nbGUgYXVkaW8gYXJyYXkgZnJvbSBhbGwgdGhlIHBpZWNlcyBhbmQgY2hhbm5lbHM6CgogICAgICAgICAgICBhdWRpbyA9IG5wLnZzdGFjaygKICAgICAgICAgICAgICAgIFtucC5jb25jYXRlbmF0ZShhdWRpb19waWVjZXNbc3BlYWtlcl0pIGZvciBzcGVha2VyIGluIHNwZWFrZXJzXQogICAgICAgICAgICApLmFzdHlwZShkdHlwZT1ucC5mbG9hdDMyKQogICAgICAgICAgICAjIFJlc2FtcGxlOgogICAgICAgICAgICBhdWRpbyA9IHRvcmNoLmZyb21fbnVtcHkoYXVkaW8pCiAgICAgICAgICAgIGF1ZGlvID0gcmVzYW1wbGVyKGF1ZGlvKQogICAgICAgICAgICAjIFNhdmUgdG8gYXVkaW8gZmlsZToKICAgICAgICAgICAgYXVkaW9fZmlsZSA9IG91dHB1dF9kaXJlY3RvcnkgLyBmInt0ZXh0X2ZpbGUuc3RlbX0ue2ZpbGVfZm9ybWF0fSIKCiAgICAgICAgICAgIHRvcmNoYXVkaW8uc2F2ZSgKICAgICAgICAgICAgICAgIHVyaT1zdHIoYXVkaW9fZmlsZSksCiAgICAgICAgICAgICAgICBzcmM9YXVkaW8sCiAgICAgICAgICAgICAgICBzYW1wbGVfcmF0ZT1zYW1wbGVfcmF0ZSwKICAgICAgICAgICAgICAgIGZvcm1hdD1maWxlX2Zvcm1hdCwKICAgICAgICAgICAgICAgIGJpdHNfcGVyX3NhbXBsZT1iaXRzX3Blcl9zYW1wbGUsCiAgICAgICAgICAgICkKCiAgICAgICAgICAgICMgQ29sbGVjdCB0byB0aGUgc3VjY2Vzc2VzOgogICAgICAgICAgICBzdWNjZXNzZXMuYXBwZW5kKFt0ZXh0X2ZpbGUubmFtZSwgYXVkaW9fZmlsZS5uYW1lXSkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4Y2VwdGlvbjoKICAgICAgICAgICAgIyBOb3RlIHRoZSBleGNlcHRpb24gYXMgZXJyb3IgaW4gdGhlIGRpY3Rpb25hcnk6CiAgICAgICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgICAgICBfTE9HR0VSLndhcm5pbmcoZiJFcnJvciBpbiBmaWxlOiAne3RleHRfZmlsZS5uYW1lfSciKQogICAgICAgICAgICBwcmludChleGNlcHRpb24pCiAgICAgICAgICAgIGVycm9yc1t0ZXh0X2ZpbGUubmFtZV0gPSBzdHIoZXhjZXB0aW9uKQoKICAgICMgQ29uc3RydWN0IHRoZSB0cmFuc2xhdGlvbnMgZGF0YWZyYW1lOgogICAgc3VjY2Vzc2VzID0gcGQuRGF0YUZyYW1lKAogICAgICAgIHN1Y2Nlc3NlcywKICAgICAgICBjb2x1bW5zPVsidGV4dF9maWxlIiwgImF1ZGlvX2ZpbGUiXSwKICAgICkKCiAgICAjIFByaW50IHRoZSBoZWFkIG9mIHRoZSBwcm9kdWNlZCBkYXRhZnJhbWUgYW5kIHJldHVybjoKICAgIGlmIHZlcmJvc2U6CiAgICAgICAgX0xPR0dFUi5pbmZvKAogICAgICAgICAgICBmIkRvbmUgKHtzdWNjZXNzZXMuc2hhcGVbMF19L3tsZW4odGV4dF9maWxlcyl9KVxuIgogICAgICAgICAgICBmIlRyYW5zbGF0aW9ucyBzdW1tYXJ5OlxuIgogICAgICAgICAgICBmIntzdWNjZXNzZXMuaGVhZCgpfSIKICAgICAgICApCiAgICByZXR1cm4gc3RyKG91dHB1dF9kaXJlY3RvcnkpLCBzdWNjZXNzZXMsIGVycm9ycwoKCmRlZiBfZ2V0X29wZW5haV9jbGllbnQoKToKICAgIGFwaV9rZXkgPSBvcy5nZXRlbnYoT1BFTkFJX0FQSV9LRVkpCiAgICBiYXNlX3VybCA9IG9zLmdldGVudihPUEVOQUlfQkFTRV9VUkwpCiAgICAjIENoZWNrIGlmIHRoZSBrZXkgaXMgYWxyZWFkeSBpbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzOgogICAgaWYgbm90IGFwaV9rZXkgb3Igbm90IGJhc2VfdXJsOgogICAgICAgIHRyeToKICAgICAgICAgICAgaW1wb3J0IG1scnVuCgogICAgICAgICAgICBjb250ZXh0ID0gbWxydW4uZ2V0X29yX2NyZWF0ZV9jdHgobmFtZT0iY29udGV4dCIpCiAgICAgICAgICAgICMgQ2hlY2sgaWYgdGhlIGtleSBpcyBpbiB0aGUgc2VjcmV0czoKICAgICAgICAgICAgYXBpX2tleSA9IGNvbnRleHQuZ2V0X3NlY3JldChPUEVOQUlfQVBJX0tFWSkKICAgICAgICAgICAgYmFzZV91cmwgPSBjb250ZXh0LmdldF9zZWNyZXQoT1BFTkFJX0JBU0VfVVJMKQogICAgICAgIGV4Y2VwdCBNb2R1bGVOb3RGb3VuZEVycm9yOgogICAgICAgICAgICByYWlzZSBFbnZpcm9ubWVudEVycm9yKAogICAgICAgICAgICAgICAgZiJPbmUgb3IgbW9yZSBvZiB0aGUgT3BlbkFJIHJlcXVpcmVkIGVudmlyb25tZW50IHZhcmlhYmxlcyAoJ3tPUEVOQUlfQVBJX0tFWX0nLCAne09QRU5BSV9CQVNFX1VSTH0nKSBhcmUgbWlzc2luZy4iCiAgICAgICAgICAgICAgICBmIlBsZWFzZSBzZXQgdGhlbSBhcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgb3IgaW5zdGFsbCBtbHJ1biAoYHBpcCBpbnN0YWxsIG1scnVuYCkiCiAgICAgICAgICAgICAgICBmImFuZCBzZXQgdGhlbSBhcyBwcm9qZWN0IHNlY3JldHMgdXNpbmcgYHByb2plY3Quc2V0X3NlY3JldHNgLiIKICAgICAgICAgICAgKQogICAgcmV0dXJuIG9wZW5haS5PcGVuQUkoYXBpX2tleT1hcGlfa2V5LCBiYXNlX3VybD1iYXNlX3VybCkKCgpkZWYgX2J5dGVzX3RvX25wX2FycmF5KGF1ZGlvOiBieXRlcywgZmlsZV9mb3JtYXQ6IHN0cik6CiAgICBpZiBmaWxlX2Zvcm1hdCA9PSAibXAzIjoKICAgICAgICBhdWRpb19zZWdtZW50ID0gQXVkaW9TZWdtZW50LmZyb21fbXAzKGlvLkJ5dGVzSU8oYXVkaW8pKQoKICAgICAgICAjIENvbnZlcnQgdG8gcmF3IFBDTSBhdWRpbyBkYXRhCiAgICAgICAgc2FtcGxlcyA9IGF1ZGlvX3NlZ21lbnQuZ2V0X2FycmF5X29mX3NhbXBsZXMoKQoKICAgICAgICAjIENvbnZlcnQgdG8gbnVtcHkgYXJyYXkKICAgICAgICBhdWRpb19hcnJheSA9IG5wLmFycmF5KHNhbXBsZXMpCgogICAgICAgICMgTm9ybWFsaXplIHRvIGZsb2F0IGJldHdlZW4gLTEgYW5kIDEKICAgICAgICByZXR1cm4gYXVkaW9fYXJyYXkuYXN0eXBlKG5wLmZsb2F0MzIpIC8gbnAuaWluZm8oc2FtcGxlcy50eXBlY29kZSkubWF4CiAgICBlbHNlOgogICAgICAgIHJldHVybiBucC5mcm9tYnVmZmVyKGF1ZGlvLCBkdHlwZT1ucC5pbnQxNikgLyAzMjc2OC4wCgoKZGVmIF9nZXRfdGV4dF9maWxlcygKICAgIGRhdGFfcGF0aDogcGF0aGxpYi5QYXRoLAopIC0+IExpc3RbcGF0aGxpYi5QYXRoXToKICAgICMgQ2hlY2sgaWYgdGhlIHBhdGggaXMgb2YgYSBkaXJlY3Rvcnkgb3IgYSBmaWxlOgogICAgaWYgZGF0YV9wYXRoLmlzX2RpcigpOgogICAgICAgICMgR2V0IGFsbCBmaWxlcyBpbnNpZGUgdGhlIGRpcmVjdG9yeToKICAgICAgICB0ZXh0X2ZpbGVzID0gbGlzdChkYXRhX3BhdGguZ2xvYigiKi4qIikpCiAgICBlbGlmIGRhdGFfcGF0aC5pc19maWxlKCk6CiAgICAgICAgdGV4dF9maWxlcyA9IFtkYXRhX3BhdGhdCiAgICBlbHNlOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgIGYiVW5yZWNvZ25pemVkIGRhdGEgcGF0aC4gVGhlIHBhcmFtZXRlciBgZGF0YV9wYXRoYCBtdXN0IGJlIGVpdGhlciBhIGRpcmVjdG9yeSBwYXRoIG9yIGEgZmlsZSBwYXRoLiAiCiAgICAgICAgICAgIGYiR2l2ZW46IHtzdHIoZGF0YV9wYXRoKX0gIgogICAgICAgICkKCiAgICByZXR1cm4gdGV4dF9maWxlcwoKCmRlZiBfc3BsaXRfbGluZShsaW5lOiBzdHIsIG1heF9sZW5ndGg6IGludCA9IDI1MCkgLT4gTGlzdFtzdHJdOgogICAgaWYgbGVuKGxpbmUpIDwgbWF4X2xlbmd0aDoKICAgICAgICByZXR1cm4gW2xpbmVdCgogICAgc2VudGVuY2VzID0gWwogICAgICAgIGYie3NlbnRlbmNlLnN0cmlwKCl9LiIgZm9yIHNlbnRlbmNlIGluIGxpbmUuc3BsaXQoIi4iKSBpZiBzZW50ZW5jZS5zdHJpcCgpCiAgICBdCgogICAgc3BsaXRzID0gW10KICAgIGN1cnJlbnRfbGVuZ3RoID0gbGVuKHNlbnRlbmNlc1swXSkKICAgIHNwbGl0ID0gc2VudGVuY2VzWzBdCiAgICBmb3Igc2VudGVuY2UgaW4gc2VudGVuY2VzWzE6XToKICAgICAgICBpZiBjdXJyZW50X2xlbmd0aCArIGxlbihzZW50ZW5jZSkgPiBtYXhfbGVuZ3RoOgogICAgICAgICAgICBzcGxpdHMuYXBwZW5kKHNwbGl0KQogICAgICAgICAgICBzcGxpdCA9IHNlbnRlbmNlCiAgICAgICAgICAgIGN1cnJlbnRfbGVuZ3RoID0gbGVuKHNlbnRlbmNlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGN1cnJlbnRfbGVuZ3RoICs9IGxlbihzZW50ZW5jZSkKICAgICAgICAgICAgc3BsaXQgKz0gIiAiICsgc2VudGVuY2UKICAgIGlmIHNwbGl0OgogICAgICAgIHNwbGl0cy5hcHBlbmQoc3BsaXQpCgogICAgcmV0dXJuIHNwbGl0cwoKCmRlZiBfZ2V0X2xvZ2dlcigpOgogICAgZ2xvYmFsIF9MT0dHRVIKICAgIHRyeToKICAgICAgICBpbXBvcnQgbWxydW4KCiAgICAgICAgIyBDaGVjayBpZiBNTFJ1biBpcyBhdmFpbGFibGU6CiAgICAgICAgY29udGV4dCA9IG1scnVuLmdldF9vcl9jcmVhdGVfY3R4KG5hbWU9Im1scnVuIikKICAgICAgICByZXR1cm4gY29udGV4dC5sb2dnZXIKICAgIGV4Y2VwdCBNb2R1bGVOb3RGb3VuZEVycm9yOgogICAgICAgIHJldHVybiBfTE9HR0VSCg== + functionSourceCode: IyBDb3B5cmlnaHQgMjAyMyBJZ3VhemlvCiMKIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAojCiMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQojIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAojIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgppbXBvcnQgaW1wb3J0bGliCmltcG9ydCBpbwppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKaW1wb3J0IHBhdGhsaWIKaW1wb3J0IHJhbmRvbQppbXBvcnQgdGVtcGZpbGUKZnJvbSBhYmMgaW1wb3J0IEFCQywgYWJzdHJhY3RtZXRob2QKZnJvbSB0eXBpbmcgaW1wb3J0IERpY3QsIExpc3QsIE9wdGlvbmFsLCBUdXBsZSwgVW5pb24KCmltcG9ydCBudW1weSBhcyBucAppbXBvcnQgcGFuZGFzIGFzIHBkCmltcG9ydCB0b3JjaAppbXBvcnQgdG9yY2hhdWRpbwppbXBvcnQgdHFkbQoKIyBHZXQgdGhlIGdsb2JhbCBsb2dnZXI6Cl9MT0dHRVIgPSBsb2dnaW5nLmdldExvZ2dlcigpCgpPUEVOQUlfQVBJX0tFWSA9ICJPUEVOQUlfQVBJX0tFWSIKT1BFTkFJX0JBU0VfVVJMID0gIk9QRU5BSV9BUElfQkFTRSIKU0FNUExFX1JBVEUgPSAyNDAwMAoKCmRlZiBnZW5lcmF0ZV9tdWx0aV9zcGVha2Vyc19hdWRpbygKICAgIGRhdGFfcGF0aDogc3RyLAogICAgc3BlYWtlcnM6IFVuaW9uW0xpc3Rbc3RyXSwgRGljdFtzdHIsIGludF1dLAogICAgYXZhaWxhYmxlX3ZvaWNlczogTGlzdFtzdHJdLAogICAgZW5naW5lOiBzdHIgPSAib3BlbmFpIiwKICAgIG91dHB1dF9kaXJlY3Rvcnk6IHN0ciA9IE5vbmUsCiAgICB1c2VfZ3B1OiBPcHRpb25hbFtib29sXSA9IE5vbmUsCiAgICB1c2Vfc21hbGxfbW9kZWxzOiBPcHRpb25hbFtib29sXSA9IE5vbmUsCiAgICBvZmZsb2FkX2NwdTogT3B0aW9uYWxbYm9vbF0gPSBOb25lLAogICAgbW9kZWw6IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAgc3BlZWQ6IE9wdGlvbmFsW2Zsb2F0XSA9IE5vbmUsCiAgICBzYW1wbGVfcmF0ZTogaW50ID0gMTYwMDAsCiAgICBmaWxlX2Zvcm1hdDogc3RyID0gIndhdiIsCiAgICB2ZXJib3NlOiBib29sID0gVHJ1ZSwKICAgIGJpdHNfcGVyX3NhbXBsZTogT3B0aW9uYWxbaW50XSA9IE5vbmUsCikgLT4gVHVwbGVbc3RyLCBwZC5EYXRhRnJhbWUsIGRpY3RdOgogICAgIiIiCiAgICBHZW5lcmF0ZSBhdWRpbyBmaWxlcyBmcm9tIHRleHQgZmlsZXMuCgogICAgOnBhcmFtIGRhdGFfcGF0aDogICAgICAgICAgIFBhdGggdG8gdGhlIHRleHQgZmlsZSBvciBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgdGV4dCBmaWxlcyB0byBnZW5lcmF0ZSBhdWRpbyBmcm9tLgogICAgOnBhcmFtIHNwZWFrZXJzOiAgICAgICAgICAgIExpc3QgLyBEaWN0IG9mIHNwZWFrZXJzIHRvIGdlbmVyYXRlIGF1ZGlvIGZvci4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBhIGxpc3QgaXMgZ2l2ZW4sIHRoZSBzcGVha2VycyB3aWxsIGJlIGFzc2lnbmVkIHRvIGNoYW5uZWxzIGluIHRoZSBvcmRlciBnaXZlbi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBkaWN0aW9uYXJ5LCB0aGUga2V5cyB3aWxsIGJlIHRoZSBzcGVha2VycyBhbmQgdGhlIHZhbHVlcyB3aWxsIGJlIHRoZSBjaGFubmVscy4KICAgIDpwYXJhbSBhdmFpbGFibGVfdm9pY2VzOiAgICBMaXN0IG9mIGF2YWlsYWJsZSB2b2ljZXMgdG8gdXNlIGZvciB0aGUgZ2VuZXJhdGlvbi4KICAgICAgICAgICAgICAgICAgICAgICAgU2VlIGhlcmUgZm9yIHRoZSBhdmFpbGFibGUgdm9pY2VzIGZvciBiYXJrIGVuZ2luZToKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9zdW5vLWFpLm5vdGlvbi5zaXRlLzhiOGU4NzQ5ZWQ1MTRiMGNiZjNmNjk5MDEzNTQ4NjgzP3Y9YmM2N2NmZjc4NmIwNGI1MGIzY2ViNzU2ZmQwNWY2OGMKICAgICAgICAgICAgICAgICAgICAgICAgU2VlIGhlcmUgZm9yIHRoZSBhdmFpbGFibGUgdm9pY2VzIGZvciBvcGVuYWkgZW5naW5lOgogICAgICAgICAgICAgICAgICAgICAgICBodHRwczovL2JldGEub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2Uvc3BlZWNoCiAgICA6cGFyYW0gZW5naW5lOiAgICAgICAgICAgICAgVGhlIGVuZ2luZSB0byB1c2UgZm9yIHRoZSBnZW5lcmF0aW9uLiBTZWxlY3QgZWl0aGVyICJiYXJrIiBvciAib3BlbmFpIi4gRGVmYXVsdCBpcyAib3BlbmFpIi4KICAgIDpwYXJhbSBvdXRwdXRfZGlyZWN0b3J5OiAgICBQYXRoIHRvIHRoZSBkaXJlY3RvcnkgdG8gc2F2ZSB0aGUgZ2VuZXJhdGVkIGF1ZGlvIGZpbGVzIHRvLgogICAgOnBhcmFtIHVzZV9ncHU6ICAgICAgICAgICAgIFdoZXRoZXIgdG8gdXNlIHRoZSBHUFUgZm9yIHRoZSBnZW5lcmF0aW9uLiBTdXBwb3J0ZWQgb25seSBpbiAiYmFyayIgZW5naW5lLgogICAgOnBhcmFtIHVzZV9zbWFsbF9tb2RlbHM6ICAgIFdoZXRoZXIgdG8gdXNlIHRoZSBzbWFsbCBtb2RlbHMgZm9yIHRoZSBnZW5lcmF0aW9uLiBTdXBwb3J0ZWQgb25seSBpbiAiYmFyayIgZW5naW5lLgogICAgOnBhcmFtIG9mZmxvYWRfY3B1OiAgICAgICAgIFRvIHJlZHVjZSB0aGUgbWVtb3J5IGZvb3RwcmludCwgdGhlIG1vZGVscyBjYW4gYmUgb2ZmbG9hZGVkIHRvIHRoZSBDUFUgYWZ0ZXIgbG9hZGluZy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXBwb3J0ZWQgb25seSBpbiAiYmFyayIgZW5naW5lLgogICAgOnBhcmFtIG1vZGVsOiAgICAgICAgICAgICAgIFdoaWNoIG1vZGVsIHRvIHVzZSBmb3IgdGhlIGdlbmVyYXRpb24uIFN1cHBvcnRlZCBvbmx5IGluICJvcGVuYWkiIGVuZ2luZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IGlzICJ0dHMtMSIuCiAgICA6cGFyYW0gc3BlZWQ6ICAgICAgICAgICAgICAgVGhlIHNwZWVkIG9mIHRoZSBnZW5lcmF0ZWQgYXVkaW8uIFNlbGVjdCBhIHZhbHVlIGZyb20gYDAuMjVgIHRvIGA0LjBgLiBgMS4wYCBpcyB0aGUgZGVmYXVsdC4KICAgIDpwYXJhbSBzYW1wbGVfcmF0ZTogICAgICAgICBUaGUgc2FtcGxpbmcgcmF0ZSBvZiB0aGUgZ2VuZXJhdGVkIGF1ZGlvLgogICAgOnBhcmFtIGZpbGVfZm9ybWF0OiAgICAgICAgIFRoZSBmb3JtYXQgb2YgdGhlIGdlbmVyYXRlZCBhdWRpbyBmaWxlcy4KICAgIDpwYXJhbSB2ZXJib3NlOiAgICAgICAgICAgICBXaGV0aGVyIHRvIHByaW50IHRoZSBwcm9ncmVzcyBvZiB0aGUgZ2VuZXJhdGlvbi4KICAgIDpwYXJhbSBiaXRzX3Blcl9zYW1wbGU6ICAgICBDaGFuZ2VzIHRoZSBiaXQgZGVwdGggZm9yIHRoZSBzdXBwb3J0ZWQgZm9ybWF0cy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXBwb3J0ZWQgb25seSBpbiAid2F2IiBvciAiZmxhYyIgZm9ybWF0cy4KCiAgICA6cmV0dXJuczogICAgICAgICAgICAgICAgICAgQSB0dXBsZSBvZjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFRoZSBvdXRwdXQgZGlyZWN0b3J5IHBhdGguCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBUaGUgZ2VuZXJhdGVkIGF1ZGlvIGZpbGVzIGRhdGFmcmFtZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFRoZSBlcnJvcnMnIGRpY3Rpb25hcnkuCiAgICAiIiIKCiAgICBnbG9iYWwgX0xPR0dFUgogICAgX0xPR0dFUiA9IF9nZXRfbG9nZ2VyKCkKICAgICMgR2V0IHRoZSBpbnB1dCB0ZXh0IGZpbGVzIHRvIHR1cm4gdG8gYXVkaW86CiAgICBkYXRhX3BhdGggPSBwYXRobGliLlBhdGgoZGF0YV9wYXRoKS5hYnNvbHV0ZSgpCiAgICB0ZXh0X2ZpbGVzID0gX2dldF90ZXh0X2ZpbGVzKGRhdGFfcGF0aD1kYXRhX3BhdGgpCgoKICAgICMgUHJlcGFyZSB0aGUgc3BlZWNoIGVuZ2luZToKICAgIGVuZ2luZSA9IF9nZXRfZW5naW5lKAogICAgICAgIGVuZ2luZT1lbmdpbmUsCiAgICAgICAgdXNlX2dwdT11c2VfZ3B1LAogICAgICAgIHVzZV9zbWFsbF9tb2RlbHM9dXNlX3NtYWxsX21vZGVscywKICAgICAgICBvZmZsb2FkX2NwdT1vZmZsb2FkX2NwdSwKICAgICAgICBtb2RlbD1tb2RlbCwKICAgICAgICBmaWxlX2Zvcm1hdD1maWxlX2Zvcm1hdCwKICAgICAgICBzcGVlZD1zcGVlZAogICAgKQoKICAgICMgQ2hlY2sgZm9yIHBlciBjaGFubmVsIGdlbmVyYXRpb246CiAgICBpZiBpc2luc3RhbmNlKHNwZWFrZXJzLCBkaWN0KToKICAgICAgICBzcGVha2VyX3Blcl9jaGFubmVsID0gVHJ1ZQogICAgICAgICMgU29ydCB0aGUgZ2l2ZW4gc3BlYWtlcnMgYnkgY2hhbm5lbHM6CiAgICAgICAgc3BlYWtlcnMgPSB7CiAgICAgICAgICAgIHNwZWFrZXI6IGNoYW5uZWwKICAgICAgICAgICAgZm9yIHNwZWFrZXIsIGNoYW5uZWwgaW4gc29ydGVkKHNwZWFrZXJzLml0ZW1zKCksIGtleT1sYW1iZGEgaXRlbTogaXRlbVsxXSkKICAgICAgICB9CiAgICBlbHNlOgogICAgICAgIHNwZWFrZXJfcGVyX2NoYW5uZWwgPSBGYWxzZQoKICAgICMgUHJlcGFyZSB0aGUgcmVzYW1wbGluZyBtb2R1bGU6CiAgICByZXNhbXBsZXIgPSB0b3JjaGF1ZGlvLnRyYW5zZm9ybXMuUmVzYW1wbGUoCiAgICAgICAgb3JpZ19mcmVxPVNBTVBMRV9SQVRFLCBuZXdfZnJlcT1zYW1wbGVfcmF0ZSwgZHR5cGU9dG9yY2guZmxvYXQzMgogICAgKQoKICAgICMgUHJlcGFyZSB0aGUgZ2FwIGJldHdlZW4gZWFjaCBzcGVha2VyOgogICAgZ2FwX2JldHdlZW5fc3BlYWtlcnMgPSBucC56ZXJvcyhpbnQoMC41ICogU0FNUExFX1JBVEUpKQoKICAgICMgUHJlcGFyZSB0aGUgc3VjY2Vzc2VzIGRhdGFmcmFtZSBhbmQgZXJyb3JzIGRpY3Rpb25hcnkgdG8gYmUgcmV0dXJuZWQ6CiAgICBzdWNjZXNzZXMgPSBbXQogICAgZXJyb3JzID0ge30KCiAgICAjIENyZWF0ZSB0aGUgb3V0cHV0IGRpcmVjdG9yeToKICAgIGlmIG91dHB1dF9kaXJlY3RvcnkgaXMgTm9uZToKICAgICAgICBvdXRwdXRfZGlyZWN0b3J5ID0gdGVtcGZpbGUubWtkdGVtcCgpCiAgICBvdXRwdXRfZGlyZWN0b3J5ID0gcGF0aGxpYi5QYXRoKG91dHB1dF9kaXJlY3RvcnkpCiAgICBpZiBub3Qgb3V0cHV0X2RpcmVjdG9yeS5leGlzdHMoKToKICAgICAgICBvdXRwdXRfZGlyZWN0b3J5Lm1rZGlyKGV4aXN0X29rPVRydWUsIHBhcmVudHM9VHJ1ZSkKCiAgICAjIFN0YXJ0IGdlbmVyYXRpbmcgYXVkaW86CiAgICAjIEdvIG92ZXIgdGhlIGF1ZGlvIGZpbGVzIGFuZCB0cmFuc2NyaWJlOgogICAgZm9yIHRleHRfZmlsZSBpbiB0cWRtLnRxZG0oCiAgICAgICAgdGV4dF9maWxlcywgZGVzYz0iR2VuZXJhdGluZyIsIHVuaXQ9ImZpbGUiLCBkaXNhYmxlPW5vdCB2ZXJib3NlCiAgICApOgoKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgUmFuZG9taXplIHZvaWNlcyBmb3IgZWFjaCBzcGVha2VyOgogICAgICAgICAgICBjaG9zZW5fdm9pY2VzID0ge30KICAgICAgICAgICAgYXZhaWxhYmxlX3ZvaWNlc19jb3B5ID0gYXZhaWxhYmxlX3ZvaWNlcy5jb3B5KCkKICAgICAgICAgICAgZm9yIHNwZWFrZXIgaW4gc3BlYWtlcnM6CiAgICAgICAgICAgICAgICB2b2ljZSA9IHJhbmRvbS5jaG9pY2UoYXZhaWxhYmxlX3ZvaWNlc19jb3B5KQogICAgICAgICAgICAgICAgY2hvc2VuX3ZvaWNlc1tzcGVha2VyXSA9IHZvaWNlCiAgICAgICAgICAgICAgICBhdmFpbGFibGVfdm9pY2VzX2NvcHkucmVtb3ZlKHZvaWNlKQogICAgICAgICAgICAjIFJlYWQgdGV4dDoKICAgICAgICAgICAgd2l0aCBvcGVuKHRleHRfZmlsZSwgInIiKSBhcyBmcDoKICAgICAgICAgICAgICAgIHRleHQgPSBmcC5yZWFkKCkKICAgICAgICAgICAgIyBQcmVwYXJlIGEgaG9sZGVyIGZvciBhbGwgdGhlIGdlbmVyYXRlZCBwaWVjZXMgKGlmIHBlciBjaGFubmVsIGVhY2ggc3BlYWtlciB3aWxsIGhhdmUgaXRzIG93bik6CiAgICAgICAgICAgIGF1ZGlvX3BpZWNlcyA9ICgKICAgICAgICAgICAgICAgIHtzcGVha2VyOiBbXSBmb3Igc3BlYWtlciBpbiBzcGVha2Vyc30KICAgICAgICAgICAgICAgIGlmIHNwZWFrZXJfcGVyX2NoYW5uZWwKICAgICAgICAgICAgICAgIGVsc2UgeyJhbGwiOiBbXX0KICAgICAgICAgICAgKQoKICAgICAgICAgICAgIyBHZW5lcmF0ZSBhdWRpbyBwZXIgbGluZToKICAgICAgICAgICAgZm9yIGxpbmUgaW4gdGV4dC5zcGxpdGxpbmVzKCk6CiAgICAgICAgICAgICAgICAjIFZhbGlkYXRlIGxpbmUgaXMgaW4gY29ycmVjdCBzcGVha2VyIGZvcm1hdDoKCiAgICAgICAgICAgICAgICBpZiAiOiAiIG5vdCBpbiBsaW5lOgogICAgICAgICAgICAgICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIF9MT0dHRVIud2FybmluZyhmIlNraXBwaW5nIGxpbmU6IHtsaW5lfSIpCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICMgU3BsaXQgbGluZSB0byBzcGVha2VyIGFuZCBoaXMgd29yZHM6CiAgICAgICAgICAgICAgICBjdXJyZW50X3NwZWFrZXIsIHNlbnRlbmNlcyA9IGxpbmUuc3BsaXQoIjogIiwgMSkKICAgICAgICAgICAgICAgICMgVmFsaWRhdGUgc3BlYWtlciBpcyBrbm93bjoKICAgICAgICAgICAgICAgIGlmIGN1cnJlbnRfc3BlYWtlciBub3QgaW4gc3BlYWtlcnM6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgZiJVbmtub3duIHNwZWFrZXI6IHtjdXJyZW50X3NwZWFrZXJ9LiBHaXZlbiBzcGVha2VycyBhcmU6IHtzcGVha2Vyc30iCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgZm9yIHNlbnRlbmNlIGluIF9zcGxpdF9saW5lKGxpbmU9c2VudGVuY2VzKToKICAgICAgICAgICAgICAgICAgICAjIEdlbmVyYXRlIHdvcmRzIGF1ZGlvOgogICAgICAgICAgICAgICAgICAgIGF1ZGlvID0gZW5naW5lLl9nZW5lcmF0ZV9hdWRpbygKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD1zZW50ZW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgdm9pY2U9Y2hvc2VuX3ZvaWNlc1tjdXJyZW50X3NwZWFrZXJdLAogICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICAgICAgaWYgc3BlYWtlcl9wZXJfY2hhbm5lbDoKICAgICAgICAgICAgICAgICAgICAgICAgc2lsZW5jZSA9IG5wLnplcm9zX2xpa2UoYXVkaW8pCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBzcGVha2VyIGluIGF1ZGlvX3BpZWNlcy5rZXlzKCk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzcGVha2VyID09IGN1cnJlbnRfc3BlYWtlcjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19waWVjZXNbc3BlYWtlcl0gKz0gW2F1ZGlvLCBnYXBfYmV0d2Vlbl9zcGVha2Vyc10KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGllY2VzW3NwZWFrZXJdICs9IFtzaWxlbmNlLCBnYXBfYmV0d2Vlbl9zcGVha2Vyc10KICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19waWVjZXNbImFsbCJdICs9IFthdWRpbywgZ2FwX2JldHdlZW5fc3BlYWtlcnNdCiAgICAgICAgICAgICMgQ29uc3RydWN0IGEgc2luZ2xlIGF1ZGlvIGFycmF5IGZyb20gYWxsIHRoZSBwaWVjZXMgYW5kIGNoYW5uZWxzOgoKICAgICAgICAgICAgYXVkaW8gPSBucC52c3RhY2soCiAgICAgICAgICAgICAgICBbbnAuY29uY2F0ZW5hdGUoYXVkaW9fcGllY2VzW3NwZWFrZXJdKSBmb3Igc3BlYWtlciBpbiBzcGVha2Vyc10KICAgICAgICAgICAgKS5hc3R5cGUoZHR5cGU9bnAuZmxvYXQzMikKICAgICAgICAgICAgIyBSZXNhbXBsZToKICAgICAgICAgICAgYXVkaW8gPSB0b3JjaC5mcm9tX251bXB5KGF1ZGlvKQogICAgICAgICAgICBhdWRpbyA9IHJlc2FtcGxlcihhdWRpbykKICAgICAgICAgICAgIyBTYXZlIHRvIGF1ZGlvIGZpbGU6CiAgICAgICAgICAgIGF1ZGlvX2ZpbGUgPSBvdXRwdXRfZGlyZWN0b3J5IC8gZiJ7dGV4dF9maWxlLnN0ZW19LntmaWxlX2Zvcm1hdH0iCgogICAgICAgICAgICB0b3JjaGF1ZGlvLnNhdmUoCiAgICAgICAgICAgICAgICB1cmk9c3RyKGF1ZGlvX2ZpbGUpLAogICAgICAgICAgICAgICAgc3JjPWF1ZGlvLAogICAgICAgICAgICAgICAgc2FtcGxlX3JhdGU9c2FtcGxlX3JhdGUsCiAgICAgICAgICAgICAgICBmb3JtYXQ9ZmlsZV9mb3JtYXQsCiAgICAgICAgICAgICAgICBiaXRzX3Blcl9zYW1wbGU9Yml0c19wZXJfc2FtcGxlLAogICAgICAgICAgICApCgogICAgICAgICAgICAjIENvbGxlY3QgdG8gdGhlIHN1Y2Nlc3NlczoKICAgICAgICAgICAgc3VjY2Vzc2VzLmFwcGVuZChbdGV4dF9maWxlLm5hbWUsIGF1ZGlvX2ZpbGUubmFtZV0pCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGNlcHRpb246CiAgICAgICAgICAgICMgTm90ZSB0aGUgZXhjZXB0aW9uIGFzIGVycm9yIGluIHRoZSBkaWN0aW9uYXJ5OgogICAgICAgICAgICBpZiB2ZXJib3NlOgogICAgICAgICAgICAgICAgX0xPR0dFUi53YXJuaW5nKGYiRXJyb3IgaW4gZmlsZTogJ3t0ZXh0X2ZpbGUubmFtZX0nIikKICAgICAgICAgICAgcHJpbnQoZXhjZXB0aW9uKQogICAgICAgICAgICBlcnJvcnNbdGV4dF9maWxlLm5hbWVdID0gc3RyKGV4Y2VwdGlvbikKCiAgICAjIENvbnN0cnVjdCB0aGUgdHJhbnNsYXRpb25zIGRhdGFmcmFtZToKICAgIHN1Y2Nlc3NlcyA9IHBkLkRhdGFGcmFtZSgKICAgICAgICBzdWNjZXNzZXMsCiAgICAgICAgY29sdW1ucz1bInRleHRfZmlsZSIsICJhdWRpb19maWxlIl0sCiAgICApCgogICAgIyBQcmludCB0aGUgaGVhZCBvZiB0aGUgcHJvZHVjZWQgZGF0YWZyYW1lIGFuZCByZXR1cm46CiAgICBpZiB2ZXJib3NlOgogICAgICAgIF9MT0dHRVIuaW5mbygKICAgICAgICAgICAgZiJEb25lICh7c3VjY2Vzc2VzLnNoYXBlWzBdfS97bGVuKHRleHRfZmlsZXMpfSlcbiIKICAgICAgICAgICAgZiJUcmFuc2xhdGlvbnMgc3VtbWFyeTpcbiIKICAgICAgICAgICAgZiJ7c3VjY2Vzc2VzLmhlYWQoKX0iCiAgICAgICAgKQogICAgcmV0dXJuIHN0cihvdXRwdXRfZGlyZWN0b3J5KSwgc3VjY2Vzc2VzLCBlcnJvcnMKCgpjbGFzcyBTcGVlY2hFbmdpbmUoQUJDKToKICAgIEBhYnN0cmFjdG1ldGhvZAogICAgZGVmIF9nZW5lcmF0ZV9hdWRpbyhzZWxmLCB0ZXh0OiBzdHIsIHZvaWNlOiBzdHIpIC0+IG5wLm5kYXJyYXk6CiAgICAgICAgcGFzcwoKCmNsYXNzIEJhcmtFbmdpbmUoU3BlZWNoRW5naW5lKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1c2VfZ3B1OiBib29sID0gVHJ1ZSwgdXNlX3NtYWxsX21vZGVsczogYm9vbCA9IEZhbHNlLCBvZmZsb2FkX2NwdTogYm9vbCA9IEZhbHNlKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuYmFyayA9IGltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKCJiYXJrIikKICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKAogICAgICAgICAgICAgICAgIlRoZSAnYmFyaycgbGlicmFyeSBpcyByZXF1aXJlZCBmb3IgdGhlIEJhcmtFbmdpbmUuIFBsZWFzZSBpbnN0YWxsIGl0IHVzaW5nICdwaXAgaW5zdGFsbCBiYXJrLWFpJy4iCiAgICAgICAgICAgICkKCiAgICAgICAgc2VsZi5iYXJrLnByZWxvYWRfbW9kZWxzKAogICAgICAgICAgICB0ZXh0X3VzZV9ncHU9dXNlX2dwdSwKICAgICAgICAgICAgdGV4dF91c2Vfc21hbGw9dXNlX3NtYWxsX21vZGVscywKICAgICAgICAgICAgY29hcnNlX3VzZV9ncHU9dXNlX2dwdSwKICAgICAgICAgICAgY29hcnNlX3VzZV9zbWFsbD11c2Vfc21hbGxfbW9kZWxzLAogICAgICAgICAgICBmaW5lX3VzZV9ncHU9dXNlX2dwdSwKICAgICAgICAgICAgZmluZV91c2Vfc21hbGw9dXNlX3NtYWxsX21vZGVscywKICAgICAgICAgICAgY29kZWNfdXNlX2dwdT11c2VfZ3B1LAogICAgICAgICAgICBmb3JjZV9yZWxvYWQ9b2ZmbG9hZF9jcHUsCiAgICAgICAgKQoKICAgIGRlZiBfZ2VuZXJhdGVfYXVkaW8oc2VsZiwgdGV4dDogc3RyLCB2b2ljZTogc3RyKSAtPiBucC5uZGFycmF5OgogICAgICAgICMgR2VuZXJhdGUgd29yZHMgYXVkaW86CiAgICAgICAgYXVkaW8gPSBzZWxmLmJhcmsuZ2VuZXJhdGVfYXVkaW8oCiAgICAgICAgICAgIHRleHQsCiAgICAgICAgICAgIGhpc3RvcnlfcHJvbXB0PXZvaWNlLAogICAgICAgICAgICBzaWxlbnQ9VHJ1ZSwKICAgICAgICApCiAgICAgICAgcmV0dXJuIGF1ZGlvCgoKY2xhc3MgT3BlbkFJRW5naW5lKFNwZWVjaEVuZ2luZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgbW9kZWw6IHN0ciA9ICJ0dHMtMSIsIGZpbGVfZm9ybWF0OiBzdHIgPSAid2F2Iiwgc3BlZWQ6IGZsb2F0ID0gMS4wKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYub3BlbmFpID0gaW1wb3J0bGliLmltcG9ydF9tb2R1bGUoIm9wZW5haSIpCiAgICAgICAgICAgIHNlbGYucHlkdWIgPSBpbXBvcnRsaWIuaW1wb3J0X21vZHVsZSgicHlkdWIiKQogICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoCiAgICAgICAgICAgICAgICAiVGhlICdvcGVuYWknIGFuZCAncHlkdWInIGxpYnJhcmllcyBhcmUgcmVxdWlyZWQgZm9yIHRoZSBPcGVuQUlFbmdpbmUuIFBsZWFzZSBpbnN0YWxsIHRoZW0gdXNpbmcgJ3BpcCBpbnN0YWxsIG9wZW5haSBweWR1YicuIgogICAgICAgICAgICApCgogICAgICAgIGFwaV9rZXkgPSBvcy5nZXRlbnYoT1BFTkFJX0FQSV9LRVkpCiAgICAgICAgYmFzZV91cmwgPSBvcy5nZXRlbnYoT1BFTkFJX0JBU0VfVVJMKQogICAgICAgICMgQ2hlY2sgaWYgdGhlIGtleSBpcyBhbHJlYWR5IGluIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXM6CiAgICAgICAgaWYgbm90IGFwaV9rZXkgb3Igbm90IGJhc2VfdXJsOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBpbXBvcnQgbWxydW4KCiAgICAgICAgICAgICAgICBjb250ZXh0ID0gbWxydW4uZ2V0X29yX2NyZWF0ZV9jdHgobmFtZT0iY29udGV4dCIpCiAgICAgICAgICAgICAgICAjIENoZWNrIGlmIHRoZSBrZXkgaXMgaW4gdGhlIHNlY3JldHM6CiAgICAgICAgICAgICAgICBhcGlfa2V5ID0gY29udGV4dC5nZXRfc2VjcmV0KE9QRU5BSV9BUElfS0VZKQogICAgICAgICAgICAgICAgYmFzZV91cmwgPSBjb250ZXh0LmdldF9zZWNyZXQoT1BFTkFJX0JBU0VfVVJMKQogICAgICAgICAgICBleGNlcHQgTW9kdWxlTm90Rm91bmRFcnJvcjoKICAgICAgICAgICAgICAgIHJhaXNlIEVudmlyb25tZW50RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgZiJPbmUgb3IgbW9yZSBvZiB0aGUgT3BlbkFJIHJlcXVpcmVkIGVudmlyb25tZW50IHZhcmlhYmxlcyAoJ3tPUEVOQUlfQVBJX0tFWX0nLCAne09QRU5BSV9CQVNFX1VSTH0nKSBhcmUgbWlzc2luZy4iCiAgICAgICAgICAgICAgICAgICAgZiJQbGVhc2Ugc2V0IHRoZW0gYXMgZW52aXJvbm1lbnQgdmFyaWFibGVzIG9yIGluc3RhbGwgbWxydW4gKGBwaXAgaW5zdGFsbCBtbHJ1bmApIgogICAgICAgICAgICAgICAgICAgIGYiYW5kIHNldCB0aGVtIGFzIHByb2plY3Qgc2VjcmV0cyB1c2luZyBgcHJvamVjdC5zZXRfc2VjcmV0c2AuIgogICAgICAgICAgICAgICAgKQoKICAgICAgICBzZWxmLmNsaWVudCA9IHNlbGYub3BlbmFpLk9wZW5BSShhcGlfa2V5PWFwaV9rZXksIGJhc2VfdXJsPWJhc2VfdXJsKQogICAgICAgIHNlbGYubW9kZWwgPSBtb2RlbAogICAgICAgIHNlbGYuZmlsZV9mb3JtYXQgPSBmaWxlX2Zvcm1hdAogICAgICAgIHNlbGYuc3BlZWQgPSBzcGVlZAoKICAgIGRlZiBfZ2VuZXJhdGVfYXVkaW8oc2VsZiwgdGV4dDogc3RyLCB2b2ljZTogc3RyKSAtPiBucC5uZGFycmF5OgogICAgICAgICMgR2VuZXJhdGUgd29yZHMgYXVkaW86CiAgICAgICAgYXVkaW8gPSBzZWxmLmNsaWVudC5hdWRpby5zcGVlY2guY3JlYXRlKAogICAgICAgICAgICBtb2RlbD1zZWxmLm1vZGVsLAogICAgICAgICAgICBpbnB1dD10ZXh0LAogICAgICAgICAgICB2b2ljZT12b2ljZSwKICAgICAgICAgICAgcmVzcG9uc2VfZm9ybWF0PXNlbGYuZmlsZV9mb3JtYXQsCiAgICAgICAgICAgIHNwZWVkPXNlbGYuc3BlZWQsCiAgICAgICAgKQogICAgICAgIGF1ZGlvID0gYXVkaW8uY29udGVudAogICAgICAgIGF1ZGlvID0gc2VsZi5fYnl0ZXNfdG9fbnBfYXJyYXkoYXVkaW89YXVkaW8pCiAgICAgICAgcmV0dXJuIGF1ZGlvCgogICAgZGVmIF9ieXRlc190b19ucF9hcnJheShzZWxmLCBhdWRpbzogYnl0ZXMpOgogICAgICAgIGlmIHNlbGYuZmlsZV9mb3JtYXQgPT0gIm1wMyI6CiAgICAgICAgICAgIGF1ZGlvX3NlZ21lbnQgPSBzZWxmLnB5ZHViLkF1ZGlvU2VnbWVudC5mcm9tX21wMyhpby5CeXRlc0lPKGF1ZGlvKSkKCiAgICAgICAgICAgICMgQ29udmVydCB0byByYXcgUENNIGF1ZGlvIGRhdGEKICAgICAgICAgICAgc2FtcGxlcyA9IGF1ZGlvX3NlZ21lbnQuZ2V0X2FycmF5X29mX3NhbXBsZXMoKQoKICAgICAgICAgICAgIyBDb252ZXJ0IHRvIG51bXB5IGFycmF5CiAgICAgICAgICAgIGF1ZGlvX2FycmF5ID0gbnAuYXJyYXkoc2FtcGxlcykKCiAgICAgICAgICAgICMgTm9ybWFsaXplIHRvIGZsb2F0IGJldHdlZW4gLTEgYW5kIDEKICAgICAgICAgICAgcmV0dXJuIGF1ZGlvX2FycmF5LmFzdHlwZShucC5mbG9hdDMyKSAvIG5wLmlpbmZvKHNhbXBsZXMudHlwZWNvZGUpLm1heAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBucC5mcm9tYnVmZmVyKGF1ZGlvLCBkdHlwZT1ucC5pbnQxNikgLyAzMjc2OC4wCgoKZGVmIF9nZXRfZW5naW5lKGVuZ2luZTogc3RyLCBmaWxlX2Zvcm1hdDogc3RyLCAqKmt3YXJncykgLT4gU3BlZWNoRW5naW5lOgogICAgIyBlbGltaW5hdGUgdGhlIE5vbmUgdmFsdWVzOgogICAga3dhcmdzID0ge2tleTogdmFsdWUgZm9yIGtleSwgdmFsdWUgaW4ga3dhcmdzLml0ZW1zKCkgaWYgdmFsdWUgaXMgbm90IE5vbmV9CgogICAgaWYgZW5naW5lID09ICJiYXJrIjoKICAgICAgICByZXR1cm4gQmFya0VuZ2luZSgqKmt3YXJncykKICAgIGVsaWYgZW5naW5lID09ICJvcGVuYWkiOgogICAgICAgIHJldHVybiBPcGVuQUlFbmdpbmUoZmlsZV9mb3JtYXQ9ZmlsZV9mb3JtYXQsICoqa3dhcmdzKQogICAgZWxzZToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICBmIlVucmVjb2duaXplZCBlbmdpbmUuIFRoZSBwYXJhbWV0ZXIgYGVuZ2luZWAgbXVzdCBiZSBlaXRoZXIgJ2JhcmsnIG9yICdvcGVuYWknLiBHaXZlbjoge2VuZ2luZX0iCiAgICAgICAgKQoKZGVmIF9nZXRfdGV4dF9maWxlcygKICAgIGRhdGFfcGF0aDogcGF0aGxpYi5QYXRoLAopIC0+IExpc3RbcGF0aGxpYi5QYXRoXToKICAgICMgQ2hlY2sgaWYgdGhlIHBhdGggaXMgb2YgYSBkaXJlY3Rvcnkgb3IgYSBmaWxlOgogICAgaWYgZGF0YV9wYXRoLmlzX2RpcigpOgogICAgICAgICMgR2V0IGFsbCBmaWxlcyBpbnNpZGUgdGhlIGRpcmVjdG9yeToKICAgICAgICB0ZXh0X2ZpbGVzID0gbGlzdChkYXRhX3BhdGguZ2xvYigiKi4qIikpCiAgICBlbGlmIGRhdGFfcGF0aC5pc19maWxlKCk6CiAgICAgICAgdGV4dF9maWxlcyA9IFtkYXRhX3BhdGhdCiAgICBlbHNlOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgIGYiVW5yZWNvZ25pemVkIGRhdGEgcGF0aC4gVGhlIHBhcmFtZXRlciBgZGF0YV9wYXRoYCBtdXN0IGJlIGVpdGhlciBhIGRpcmVjdG9yeSBwYXRoIG9yIGEgZmlsZSBwYXRoLiAiCiAgICAgICAgICAgIGYiR2l2ZW46IHtzdHIoZGF0YV9wYXRoKX0gIgogICAgICAgICkKCiAgICByZXR1cm4gdGV4dF9maWxlcwoKCmRlZiBfc3BsaXRfbGluZShsaW5lOiBzdHIsIG1heF9sZW5ndGg6IGludCA9IDI1MCkgLT4gTGlzdFtzdHJdOgogICAgaWYgbGVuKGxpbmUpIDwgbWF4X2xlbmd0aDoKICAgICAgICByZXR1cm4gW2xpbmVdCgogICAgc2VudGVuY2VzID0gWwogICAgICAgIGYie3NlbnRlbmNlLnN0cmlwKCl9LiIgZm9yIHNlbnRlbmNlIGluIGxpbmUuc3BsaXQoIi4iKSBpZiBzZW50ZW5jZS5zdHJpcCgpCiAgICBdCgogICAgc3BsaXRzID0gW10KICAgIGN1cnJlbnRfbGVuZ3RoID0gbGVuKHNlbnRlbmNlc1swXSkKICAgIHNwbGl0ID0gc2VudGVuY2VzWzBdCiAgICBmb3Igc2VudGVuY2UgaW4gc2VudGVuY2VzWzE6XToKICAgICAgICBpZiBjdXJyZW50X2xlbmd0aCArIGxlbihzZW50ZW5jZSkgPiBtYXhfbGVuZ3RoOgogICAgICAgICAgICBzcGxpdHMuYXBwZW5kKHNwbGl0KQogICAgICAgICAgICBzcGxpdCA9IHNlbnRlbmNlCiAgICAgICAgICAgIGN1cnJlbnRfbGVuZ3RoID0gbGVuKHNlbnRlbmNlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGN1cnJlbnRfbGVuZ3RoICs9IGxlbihzZW50ZW5jZSkKICAgICAgICAgICAgc3BsaXQgKz0gIiAiICsgc2VudGVuY2UKICAgIGlmIHNwbGl0OgogICAgICAgIHNwbGl0cy5hcHBlbmQoc3BsaXQpCgogICAgcmV0dXJuIHNwbGl0cwoKCmRlZiBfZ2V0X2xvZ2dlcigpOgogICAgZ2xvYmFsIF9MT0dHRVIKICAgIHRyeToKICAgICAgICBpbXBvcnQgbWxydW4KCiAgICAgICAgIyBDaGVjayBpZiBNTFJ1biBpcyBhdmFpbGFibGU6CiAgICAgICAgY29udGV4dCA9IG1scnVuLmdldF9vcl9jcmVhdGVfY3R4KG5hbWU9Im1scnVuIikKICAgICAgICByZXR1cm4gY29udGV4dC5sb2dnZXIKICAgIGV4Y2VwdCBNb2R1bGVOb3RGb3VuZEVycm9yOgogICAgICAgIHJldHVybiBfTE9HR0VSCg== + code_origin: '' + base_image: mlrun/mlrun requirements: - - openai - torchaudio - pydub origin_filename: '' - base_image: mlrun/mlrun - code_origin: '' - command: '' + image: '' disable_auto_mount: false - description: Generate audio file from text using different speakers entry_points: generate_multi_speakers_audio: - has_varargs: false - doc: Generate audio files from text files. - name: generate_multi_speakers_audio - outputs: - - doc: 'A tuple of: - The output directory path. - The generated audio files - dataframe. - The errors'' dictionary.' - type: Tuple[str, pd.DataFrame, dict] has_kwargs: false + name: generate_multi_speakers_audio + doc: Generate audio files from text files. + has_varargs: false + lineno: 38 parameters: - name: data_path type: str @@ -36,15 +37,41 @@ spec: - name: available_voices type: List[str] doc: 'List of available voices to use for the generation. See here for the - available voices: https://platform.openai.com/docs/guides/text-to-speech#voice-options' + available voices for bark engine: https://suno-ai.notion.site/8b8e8749ed514b0cbf3f699013548683?v=bc67cff786b04b50b3ceb756fd05f68c + See here for the available voices for openai engine: https://beta.openai.com/docs/api-reference/speech' + - name: engine + type: str + doc: The engine to use for the generation. Select either "bark" or "openai". + Default is "openai". + default: openai - name: output_directory type: str doc: Path to the directory to save the generated audio files to. default: null + - name: use_gpu + type: Optional[bool] + doc: Whether to use the GPU for the generation. Supported only in "bark" engine. + default: null + - name: use_small_models + type: Optional[bool] + doc: Whether to use the small models for the generation. Supported only in + "bark" engine. + default: null + - name: offload_cpu + type: Optional[bool] + doc: To reduce the memory footprint, the models can be offloaded to the CPU + after loading. Supported only in "bark" engine. + default: null - name: model - type: str - doc: Which model to use for the generation. - default: tts-1 + type: Optional[str] + doc: Which model to use for the generation. Supported only in "openai" engine. + Default is "tts-1". + default: null + - name: speed + type: Optional[float] + doc: The speed of the generated audio. Select a value from `0.25` to `4.0`. + `1.0` is the default. + default: null - name: sample_rate type: int doc: The sampling rate of the generated audio. @@ -62,18 +89,11 @@ spec: doc: Changes the bit depth for the supported formats. Supported only in "wav" or "flac" formats. default: null - - name: speed - type: float - doc: The speed of the generated audio. Select a value from `0.25` to `4.0`. - `1.0` is the default. - default: 1.0 - lineno: 38 -kind: job -metadata: - categories: - - data-preparation - - machine-learning - - pytorch - tag: '' - name: text-to-audio-generator + outputs: + - doc: 'A tuple of: - The output directory path. - The generated audio files + dataframe. - The errors'' dictionary.' + type: Tuple[str, pd.DataFrame, dict] + default_handler: generate_multi_speakers_audio + description: Generate audio file from text using different speakers verbose: false +kind: job diff --git a/text_to_audio_generator/item.yaml b/text_to_audio_generator/item.yaml index 3a6af1e7e..e8235a086 100644 --- a/text_to_audio_generator/item.yaml +++ b/text_to_audio_generator/item.yaml @@ -22,7 +22,6 @@ spec: image: mlrun/mlrun kind: job requirements: - - openai - torchaudio - pydub url: '' diff --git a/text_to_audio_generator/requirements.txt b/text_to_audio_generator/requirements.txt index 63dee64df..02f84ef44 100644 --- a/text_to_audio_generator/requirements.txt +++ b/text_to_audio_generator/requirements.txt @@ -1,3 +1,4 @@ -openai>=1.58.0 +bark torchaudio>=2.1.0 +openai>=1.58.0 pydub \ No newline at end of file diff --git a/text_to_audio_generator/test_text_to_audio_generator.py b/text_to_audio_generator/test_text_to_audio_generator.py index 94fd8c098..fb8db3198 100644 --- a/text_to_audio_generator/test_text_to_audio_generator.py +++ b/text_to_audio_generator/test_text_to_audio_generator.py @@ -19,13 +19,47 @@ import pytest +@pytest.mark.parametrize("file_format,bits_per_sample", [("wav", 8), ("mp3", None)]) +def test_generate_multi_speakers_audio(file_format, bits_per_sample): + text_to_audio_generator_function = mlrun.import_function("function.yaml") + with tempfile.TemporaryDirectory() as test_directory: + function_run = text_to_audio_generator_function.run( + handler="generate_multi_speakers_audio", + inputs={"data_path": "data/test_data.txt"}, + params={ + "output_directory": test_directory, + "speakers": {"Agent": 0, "Client": 1}, + "available_voices": [ + "v2/en_speaker_0", + "v2/en_speaker_1", + ], + "engine": "bark", + "use_small_models": True, + "use_gpu": False, + "offload_cpu": True, + "file_format": file_format, + "bits_per_sample": bits_per_sample, + }, + local=True, + returns=[ + "audio_files: path", + "audio_files_dataframe: dataset", + "text_to_speech_errors: file", + ], + artifact_path=test_directory, + ) + assert function_run.error == "" + for key in ["audio_files", "audio_files_dataframe", "text_to_speech_errors"]: + assert key in function_run.outputs and function_run.outputs[key] is not None + + @pytest.mark.skipif( - condition=os.getenv("OPENAI_BASE_URL") is None + condition=os.getenv("OPENAI_API_BASE") is None and os.getenv("OPENAI_API_KEY") is None, reason="OpenAI API key and base URL are required to run this test", ) @pytest.mark.parametrize("file_format,bits_per_sample", [("wav", 8), ("mp3", None)]) -def test_generate_multi_speakers_audio(file_format, bits_per_sample): +def test_generate_multi_speakers_audio_openai(file_format, bits_per_sample): text_to_audio_generator_function = mlrun.import_function("function.yaml") with tempfile.TemporaryDirectory() as test_directory: function_run = text_to_audio_generator_function.run( @@ -38,6 +72,7 @@ def test_generate_multi_speakers_audio(file_format, bits_per_sample): "alloy", "echo", ], + "engine": "openai", "file_format": file_format, "bits_per_sample": bits_per_sample, }, @@ -51,4 +86,4 @@ def test_generate_multi_speakers_audio(file_format, bits_per_sample): ) assert function_run.error == "" for key in ["audio_files", "audio_files_dataframe", "text_to_speech_errors"]: - assert key in function_run.outputs and function_run.outputs[key] is not None + assert key in function_run.outputs and function_run.outputs[key] is not None \ No newline at end of file diff --git a/text_to_audio_generator/text_to_audio_generator.ipynb b/text_to_audio_generator/text_to_audio_generator.ipynb index a70882a44..35c219964 100644 --- a/text_to_audio_generator/text_to_audio_generator.ipynb +++ b/text_to_audio_generator/text_to_audio_generator.ipynb @@ -322,6 +322,7 @@ " \"alloy\",\n", " \"echo\",\n", " ],\n", + " \"engine\": \"bark\",\n", " \"file_format\": \"mp3\",\n", " # \"bits_per_sample\": 8,\n", " },\n", diff --git a/text_to_audio_generator/text_to_audio_generator.py b/text_to_audio_generator/text_to_audio_generator.py index d47d6b865..e03b827ff 100644 --- a/text_to_audio_generator/text_to_audio_generator.py +++ b/text_to_audio_generator/text_to_audio_generator.py @@ -11,27 +11,27 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +import importlib import io import logging import os import pathlib import random import tempfile +from abc import ABC, abstractmethod from typing import Dict, List, Optional, Tuple, Union import numpy as np -import openai import pandas as pd import torch import torchaudio import tqdm -from pydub import AudioSegment # Get the global logger: _LOGGER = logging.getLogger() OPENAI_API_KEY = "OPENAI_API_KEY" -OPENAI_BASE_URL = "OPENAI_BASE_URL" +OPENAI_BASE_URL = "OPENAI_API_BASE" SAMPLE_RATE = 24000 @@ -39,13 +39,17 @@ def generate_multi_speakers_audio( data_path: str, speakers: Union[List[str], Dict[str, int]], available_voices: List[str], + engine: str = "openai", output_directory: str = None, - model: str = "tts-1", + use_gpu: Optional[bool] = None, + use_small_models: Optional[bool] = None, + offload_cpu: Optional[bool] = None, + model: Optional[str] = None, + speed: Optional[float] = None, sample_rate: int = 16000, file_format: str = "wav", verbose: bool = True, bits_per_sample: Optional[int] = None, - speed: float = 1.0, ) -> Tuple[str, pd.DataFrame, dict]: """ Generate audio files from text files. @@ -55,16 +59,24 @@ def generate_multi_speakers_audio( If a list is given, the speakers will be assigned to channels in the order given. If dictionary, the keys will be the speakers and the values will be the channels. :param available_voices: List of available voices to use for the generation. - See here for the available voices: - https://platform.openai.com/docs/guides/text-to-speech#voice-options + See here for the available voices for bark engine: + https://suno-ai.notion.site/8b8e8749ed514b0cbf3f699013548683?v=bc67cff786b04b50b3ceb756fd05f68c + See here for the available voices for openai engine: + https://beta.openai.com/docs/api-reference/speech + :param engine: The engine to use for the generation. Select either "bark" or "openai". Default is "openai". :param output_directory: Path to the directory to save the generated audio files to. - :param model: Which model to use for the generation. + :param use_gpu: Whether to use the GPU for the generation. Supported only in "bark" engine. + :param use_small_models: Whether to use the small models for the generation. Supported only in "bark" engine. + :param offload_cpu: To reduce the memory footprint, the models can be offloaded to the CPU after loading. + Supported only in "bark" engine. + :param model: Which model to use for the generation. Supported only in "openai" engine. + Default is "tts-1". + :param speed: The speed of the generated audio. Select a value from `0.25` to `4.0`. `1.0` is the default. :param sample_rate: The sampling rate of the generated audio. :param file_format: The format of the generated audio files. :param verbose: Whether to print the progress of the generation. :param bits_per_sample: Changes the bit depth for the supported formats. Supported only in "wav" or "flac" formats. - :param speed: The speed of the generated audio. Select a value from `0.25` to `4.0`. `1.0` is the default. :returns: A tuple of: - The output directory path. @@ -78,8 +90,17 @@ def generate_multi_speakers_audio( data_path = pathlib.Path(data_path).absolute() text_files = _get_text_files(data_path=data_path) - # connect to openai client: - client = _get_openai_client() + + # Prepare the speech engine: + engine = _get_engine( + engine=engine, + use_gpu=use_gpu, + use_small_models=use_small_models, + offload_cpu=offload_cpu, + model=model, + file_format=file_format, + speed=speed + ) # Check for per channel generation: if isinstance(speakers, dict): @@ -152,15 +173,10 @@ def generate_multi_speakers_audio( ) for sentence in _split_line(line=sentences): # Generate words audio: - audio = client.audio.speech.create( - model=model, - input=sentence, + audio = engine._generate_audio( + text=sentence, voice=chosen_voices[current_speaker], - response_format=file_format, - speed=speed, ) - audio = audio.content - audio = _bytes_to_np_array(audio=audio, file_format=file_format) if speaker_per_channel: silence = np.zeros_like(audio) @@ -215,43 +231,117 @@ def generate_multi_speakers_audio( return str(output_directory), successes, errors -def _get_openai_client(): - api_key = os.getenv(OPENAI_API_KEY) - base_url = os.getenv(OPENAI_BASE_URL) - # Check if the key is already in the environment variables: - if not api_key or not base_url: +class SpeechEngine(ABC): + @abstractmethod + def _generate_audio(self, text: str, voice: str) -> np.ndarray: + pass + + +class BarkEngine(SpeechEngine): + def __init__(self, use_gpu: bool = True, use_small_models: bool = False, offload_cpu: bool = False): try: - import mlrun - - context = mlrun.get_or_create_ctx(name="context") - # Check if the key is in the secrets: - api_key = context.get_secret(OPENAI_API_KEY) - base_url = context.get_secret(OPENAI_BASE_URL) - except ModuleNotFoundError: - raise EnvironmentError( - f"One or more of the OpenAI required environment variables ('{OPENAI_API_KEY}', '{OPENAI_BASE_URL}') are missing." - f"Please set them as environment variables or install mlrun (`pip install mlrun`)" - f"and set them as project secrets using `project.set_secrets`." + self.bark = importlib.import_module("bark") + except ImportError: + raise ImportError( + "The 'bark' library is required for the BarkEngine. Please install it using 'pip install bark-ai'." ) - return openai.OpenAI(api_key=api_key, base_url=base_url) + self.bark.preload_models( + text_use_gpu=use_gpu, + text_use_small=use_small_models, + coarse_use_gpu=use_gpu, + coarse_use_small=use_small_models, + fine_use_gpu=use_gpu, + fine_use_small=use_small_models, + codec_use_gpu=use_gpu, + force_reload=offload_cpu, + ) -def _bytes_to_np_array(audio: bytes, file_format: str): - if file_format == "mp3": - audio_segment = AudioSegment.from_mp3(io.BytesIO(audio)) + def _generate_audio(self, text: str, voice: str) -> np.ndarray: + # Generate words audio: + audio = self.bark.generate_audio( + text, + history_prompt=voice, + silent=True, + ) + return audio - # Convert to raw PCM audio data - samples = audio_segment.get_array_of_samples() - # Convert to numpy array - audio_array = np.array(samples) +class OpenAIEngine(SpeechEngine): + def __init__(self, model: str = "tts-1", file_format: str = "wav", speed: float = 1.0): + try: + self.openai = importlib.import_module("openai") + self.pydub = importlib.import_module("pydub") + except ImportError: + raise ImportError( + "The 'openai' and 'pydub' libraries are required for the OpenAIEngine. Please install them using 'pip install openai pydub'." + ) - # Normalize to float between -1 and 1 - return audio_array.astype(np.float32) / np.iinfo(samples.typecode).max - else: - return np.frombuffer(audio, dtype=np.int16) / 32768.0 + api_key = os.getenv(OPENAI_API_KEY) + base_url = os.getenv(OPENAI_BASE_URL) + # Check if the key is already in the environment variables: + if not api_key or not base_url: + try: + import mlrun + + context = mlrun.get_or_create_ctx(name="context") + # Check if the key is in the secrets: + api_key = context.get_secret(OPENAI_API_KEY) + base_url = context.get_secret(OPENAI_BASE_URL) + except ModuleNotFoundError: + raise EnvironmentError( + f"One or more of the OpenAI required environment variables ('{OPENAI_API_KEY}', '{OPENAI_BASE_URL}') are missing." + f"Please set them as environment variables or install mlrun (`pip install mlrun`)" + f"and set them as project secrets using `project.set_secrets`." + ) + + self.client = self.openai.OpenAI(api_key=api_key, base_url=base_url) + self.model = model + self.file_format = file_format + self.speed = speed + + def _generate_audio(self, text: str, voice: str) -> np.ndarray: + # Generate words audio: + audio = self.client.audio.speech.create( + model=self.model, + input=text, + voice=voice, + response_format=self.file_format, + speed=self.speed, + ) + audio = audio.content + audio = self._bytes_to_np_array(audio=audio) + return audio + + def _bytes_to_np_array(self, audio: bytes): + if self.file_format == "mp3": + audio_segment = self.pydub.AudioSegment.from_mp3(io.BytesIO(audio)) + + # Convert to raw PCM audio data + samples = audio_segment.get_array_of_samples() + + # Convert to numpy array + audio_array = np.array(samples) + + # Normalize to float between -1 and 1 + return audio_array.astype(np.float32) / np.iinfo(samples.typecode).max + else: + return np.frombuffer(audio, dtype=np.int16) / 32768.0 +def _get_engine(engine: str, file_format: str, **kwargs) -> SpeechEngine: + # eliminate the None values: + kwargs = {key: value for key, value in kwargs.items() if value is not None} + + if engine == "bark": + return BarkEngine(**kwargs) + elif engine == "openai": + return OpenAIEngine(file_format=file_format, **kwargs) + else: + raise ValueError( + f"Unrecognized engine. The parameter `engine` must be either 'bark' or 'openai'. Given: {engine}" + ) + def _get_text_files( data_path: pathlib.Path, ) -> List[pathlib.Path]: From 7aec0ab6dccb8edd5e708c60996b168ac70fa1de Mon Sep 17 00:00:00 2001 From: Yonatan Shelach <92271540+yonishelach@users.noreply.github.com> Date: Thu, 2 Jan 2025 15:43:00 +0200 Subject: [PATCH 29/38] [auto-trainer] update test requirements (#839) * [Build] Fix html links, Add .html as source in documentation * Update CI temporarily and update index * [XGB-Custom] Fix test artifact key name * [XGB-Serving][XGB-Test][XGB-Trainer] Fix tests - artifact key * [Build] Install python 3.9 when testing (#618) * [Build] Update python version in CI (#620) * [Build] Install python 3.9 when testing * [Build] Update python version in CI * . * Revert "[Build] Update python version in CI (#620)" (#621) This reverts commit 0cd1f1585a618c253f201b6f5a63502cdbddb591. * Revert "[Build] Install python 3.9 when testing (#618)" (#619) This reverts commit 3301415200e52326bade1e17f99cb6b6d3880860. * [Build] Build with python 3.9 (#622) * [Build] Build with python 3.9 * . * Update requirements.txt --- auto_trainer/requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/auto_trainer/requirements.txt b/auto_trainer/requirements.txt index ad97214f0..b14a0293c 100644 --- a/auto_trainer/requirements.txt +++ b/auto_trainer/requirements.txt @@ -1,4 +1,4 @@ pandas -scikit-learn -xgboost -plotly \ No newline at end of file +scikit-learn<1.4.0 +xgboost<2.0.0 +plotly From fe390285aae02d8d6127cbcd1d4f2a5b3280f77e Mon Sep 17 00:00:00 2001 From: Eyal Danieli Date: Thu, 6 Mar 2025 16:02:50 +0200 Subject: [PATCH 30/38] [Feature Selection] Fix deprecated `get_offline_features` (#844) * fix feature_selection * fix feature_selection * fix feature_selection nb * update yaml name * fix test * fix test --- feature_selection/feature_selection.ipynb | 798 +++----------------- feature_selection/feature_selection.py | 2 +- feature_selection/function.yaml | 64 +- feature_selection/item.yaml | 4 +- feature_selection/test_feature_selection.py | 3 +- 5 files changed, 151 insertions(+), 720 deletions(-) diff --git a/feature_selection/feature_selection.ipynb b/feature_selection/feature_selection.ipynb index f7141591f..104896757 100644 --- a/feature_selection/feature_selection.ipynb +++ b/feature_selection/feature_selection.ipynb @@ -11,449 +11,91 @@ "cell_type": "code", "execution_count": 1, "metadata": {}, - "outputs": [], - "source": [ - "import mlrun" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "%nuclio: setting kind to 'job'\n", - "%nuclio: setting spec.image to 'mlrun/ml-models'\n" + "> 2025-03-06 10:55:11,680 [warning] Failed resolving version info. Ignoring and using defaults\n", + "> 2025-03-06 10:55:13,566 [warning] Server or client version is unstable. Assuming compatible: {\"client_version\":\"0.0.0+unstable\",\"server_version\":\"1.8.0\"}\n" ] } ], "source": [ - "%nuclio config kind = \"job\"\n", - "%nuclio config spec.image = \"mlrun/ml-models\"" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "# nuclio: start-code" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "import matplotlib.pyplot as plt\n", - "import seaborn as sns\n", - "import numpy as np\n", - "import os\n", - "import json\n", - "\n", - "# Feature selection strategies\n", - "from sklearn.feature_selection import SelectKBest\n", - "from sklearn.feature_selection import SelectFromModel\n", - "\n", - "# Model based feature selection\n", - "from sklearn.ensemble import ExtraTreesClassifier\n", - "from sklearn.svm import LinearSVC\n", - "from sklearn.linear_model import LogisticRegression\n", - "\n", - "# Scale feature scores\n", - "from sklearn.preprocessing import MinMaxScaler\n", - "\n", - "# SKLearn estimators list\n", - "from sklearn.utils import all_estimators\n", - "\n", - "# MLRun utils\n", - "from mlrun.mlutils.plots import gcf_clear\n", - "from mlrun.utils.helpers import create_class\n", - "from mlrun.artifacts import PlotArtifact\n", - "\n", - "# Feature Selection\n", - "from feature_selection import feature_selection, show_values_on_bars, plot_stat" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "# nuclio: end-code" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Test" + "import mlrun\n", + "import os" ] }, { "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "from mlrun import code_to_function, mount_v3io, mlconf, NewTask, run_local" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "mlconf.artifact_path = os.path.abspath('./artifacts')\n", - "mlconf.db_path = 'http://mlrun-api:8080'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Local Test" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "task = NewTask(params={'k': 2,\n", - " 'min_votes': 0.3,\n", - " 'label_column': 'is_error'},\n", - " inputs={'df_artifact': os.path.abspath('data/metrics.pq')})" - ] - }, - { - "cell_type": "code", - "execution_count": 12, + "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "> 2021-08-11 10:12:05,721 [info] starting run feature_selection uid=8765f9e7fde94efeb662fbe2c37a0e1a DB=http://mlrun-api:8080\n" + "> 2025-03-06 10:55:14,686 [info] Loading project from path: {\"path\":\"./\",\"project_name\":\"feature-selection\",\"user_project\":false}\n", + "> 2025-03-06 10:55:14,726 [warning] Project name mismatch, fhub-v2 != feature-selection, project is loaded from fhub-v2 project yaml. To prevent/allow this, you can take one of the following actions:\n", + "1. Set the `allow_cross_project=True` when loading the project.\n", + "2. Delete the existing project yaml, or ensure its name is equal to feature-selection.\n", + "3. Use different project context dir.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ - "Pass k=2 as keyword args. From version 0.25 passing these as positional arguments will result in an error\n", - "Liblinear failed to converge, increase the number of iterations.\n" + "Project name='feature-selection' is different than specified on the context's project yaml. This behavior is deprecated and will not be supported from version 1.9.0.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "> 2021-08-11 10:12:08,257 [info] votes needed to be selected: 2\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Converting input from bool to for compatibility.\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
projectuiditerstartstatenamelabelsinputsparametersresultsartifacts
default0Aug 11 10:12:05completedfeature_selection
v3io_user=admin
kind=handler
owner=admin
host=jupyter-az-ffcb58655-7l9pl
df_artifact
k=2
min_votes=0.3
label_column=is_error
f_classif
mutual_info_classif
chi2
f_regression
LinearSVC
LogisticRegression
ExtraTreesClassifier
feature_scores
max_scaled_scores_feature_scores
selected_features_count
selected_features
\n", - "
\n", - "
\n", - "
\n", - " Title\n", - " ×\n", - "
\n", - " \n", - "
\n", - "
\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "to track results use .show() or .logs() or in CLI: \n", - "!mlrun get run 8765f9e7fde94efeb662fbe2c37a0e1a --project default , !mlrun logs 8765f9e7fde94efeb662fbe2c37a0e1a --project default\n", - "> 2021-08-11 10:12:08,438 [info] run executed, status=completed\n" + "> 2025-03-06 10:55:29,474 [info] Project loaded successfully: {\"path\":\"./\",\"project_name\":\"feature-selection\",\"stored_in_db\":true}\n" ] } ], "source": [ - "from feature_selection import feature_selection, show_values_on_bars, plot_stat\n", - "\n", - "runl = run_local(task=task,\n", - " name='feature_selection',\n", - " handler=feature_selection,\n", - " artifact_path=os.path.join(os.path.abspath('./'), 'artifacts'))" + "project = mlrun.get_or_create_project(\"feature-selection\",'./')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Job Test" + "### Local Test" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": "feature_selection = mlrun.import_function(\"function.yaml\")" + }, + { + "cell_type": "code", + "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "> 2021-08-11 10:12:22,071 [info] function spec saved to path: function.yaml\n" + "> 2025-03-06 10:59:27,279 [info] Storing function: {\"db\":null,\"name\":\"feature-selection-feature-selection\",\"uid\":\"fdcbc4e3f5c44769be5e64425f10aed8\"}\n", + "> 2025-03-06 10:59:30,808 [info] votes needed to be selected: 2\n" ] }, { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "fn = code_to_function(name='feature_selection',\n", - " handler='feature_selection')\n", - "fn.spec.default_handler = 'feature_selection'\n", - "fn.spec.description = \"Select features through multiple Statistical and Model filters\"\n", - "fn.metadata.categories = ['data-prep', 'ml']\n", - "fn.metadata.labels = {\"author\": \"alexz\"}\n", - "fn.export('function.yaml')\n", - "fn.apply(mount_v3io())" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", + "name": "stderr", "output_type": "stream", "text": [ - "> 2021-08-11 10:12:22,083 [info] starting run feature-selection-feature_selection uid=a702d89990924e10b093ee1571b47dc2 DB=http://mlrun-api:8080\n", - "> 2021-08-11 10:12:22,347 [info] Job is running in the background, pod: feature-selection-feature-selection-8wkf8\n", - "> 2021-08-11 10:14:12,748 [info] votes needed to be selected: 2\n", - "> 2021-08-11 10:14:12,877 [info] run executed, status=completed\n", - "Pass k=2 as keyword args. From version 0.25 passing these as positional arguments will result in an error\n", - "Liblinear failed to converge, increase the number of iterations.\n", - "lbfgs failed to converge (status=1):\n", - "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", + "/User/.pythonlibs/mlrun-extended/lib/python3.9/site-packages/mlrun/artifacts/dataset.py:387: RuntimeWarning:\n", "\n", - "Increase the number of iterations (max_iter) or scale the data as shown in:\n", - " https://scikit-learn.org/stable/modules/preprocessing.html\n", - "Please also refer to the documentation for alternative solver options:\n", - " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", "Converting input from bool to for compatibility.\n", - "final state: completed\n" + "\n" ] }, { @@ -548,9 +190,14 @@ "}\n", "function expandPanel(el) {\n", " const panelName = \"#\" + el.getAttribute('paneName');\n", - " console.log(el.title);\n", "\n", - " document.querySelector(panelName + \"-title\").innerHTML = el.title\n", + " // Get the base URL of the current notebook\n", + " var baseUrl = window.location.origin;\n", + "\n", + " // Construct the full URL\n", + " var fullUrl = new URL(el.title, baseUrl).href;\n", + "\n", + " document.querySelector(panelName + \"-title\").innerHTML = fullUrl\n", " iframe = document.querySelector(panelName + \"-body\");\n", "\n", " const tblcss = `\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
cpu_utilizationlatencypacket_lossthroughputis_error
timestampcompanydata_centerdevice
2021-04-27 14:46:46.780Smith_GroupDenise_Crest512420905723175.5988910.0000000.000000252.445971False
289175586571250.0903733.2808490.000000229.889187False
Debra_Gateway038802029531173.2430639.3723412.170138260.883807False
963381369144160.83042012.2418782.295717244.238613False
Ferrell_LtdMurphy_Meadow151712976593172.6479640.5354630.000000212.944943False
...........................
2021-04-27 15:46:46.780Smith_GroupDebra_Gateway963381369144177.8759543.2505840.000000245.150281False
Ferrell_LtdMurphy_Meadow151712976593177.8314590.0000000.000000235.109321False
696448669938355.9785142.9774470.533963277.622402False
Nicholas_Estate800289709816758.2654464.0902072.048268272.717982False
849988073510471.2450410.0000002.929407235.659211False
\n", - "

5768 rows × 5 columns

\n", - "" - ], - "text/plain": [ - " cpu_utilization \\\n", - "timestamp company data_center device \n", - "2021-04-27 14:46:46.780 Smith_Group Denise_Crest 5124209057231 75.598891 \n", - " 2891755865712 50.090373 \n", - " Debra_Gateway 0388020295311 73.243063 \n", - " 9633813691441 60.830420 \n", - " Ferrell_Ltd Murphy_Meadow 1517129765931 72.647964 \n", - "... ... \n", - "2021-04-27 15:46:46.780 Smith_Group Debra_Gateway 9633813691441 77.875954 \n", - " Ferrell_Ltd Murphy_Meadow 1517129765931 77.831459 \n", - " 6964486699383 55.978514 \n", - " Nicholas_Estate 8002897098167 58.265446 \n", - " 8499880735104 71.245041 \n", - "\n", - " latency \\\n", - "timestamp company data_center device \n", - "2021-04-27 14:46:46.780 Smith_Group Denise_Crest 5124209057231 0.000000 \n", - " 2891755865712 3.280849 \n", - " Debra_Gateway 0388020295311 9.372341 \n", - " 9633813691441 12.241878 \n", - " Ferrell_Ltd Murphy_Meadow 1517129765931 0.535463 \n", - "... ... \n", - "2021-04-27 15:46:46.780 Smith_Group Debra_Gateway 9633813691441 3.250584 \n", - " Ferrell_Ltd Murphy_Meadow 1517129765931 0.000000 \n", - " 6964486699383 2.977447 \n", - " Nicholas_Estate 8002897098167 4.090207 \n", - " 8499880735104 0.000000 \n", - "\n", - " packet_loss \\\n", - "timestamp company data_center device \n", - "2021-04-27 14:46:46.780 Smith_Group Denise_Crest 5124209057231 0.000000 \n", - " 2891755865712 0.000000 \n", - " Debra_Gateway 0388020295311 2.170138 \n", - " 9633813691441 2.295717 \n", - " Ferrell_Ltd Murphy_Meadow 1517129765931 0.000000 \n", - "... ... \n", - "2021-04-27 15:46:46.780 Smith_Group Debra_Gateway 9633813691441 0.000000 \n", - " Ferrell_Ltd Murphy_Meadow 1517129765931 0.000000 \n", - " 6964486699383 0.533963 \n", - " Nicholas_Estate 8002897098167 2.048268 \n", - " 8499880735104 2.929407 \n", - "\n", - " throughput \\\n", - "timestamp company data_center device \n", - "2021-04-27 14:46:46.780 Smith_Group Denise_Crest 5124209057231 252.445971 \n", - " 2891755865712 229.889187 \n", - " Debra_Gateway 0388020295311 260.883807 \n", - " 9633813691441 244.238613 \n", - " Ferrell_Ltd Murphy_Meadow 1517129765931 212.944943 \n", - "... ... \n", - "2021-04-27 15:46:46.780 Smith_Group Debra_Gateway 9633813691441 245.150281 \n", - " Ferrell_Ltd Murphy_Meadow 1517129765931 235.109321 \n", - " 6964486699383 277.622402 \n", - " Nicholas_Estate 8002897098167 272.717982 \n", - " 8499880735104 235.659211 \n", - "\n", - " is_error \n", - "timestamp company data_center device \n", - "2021-04-27 14:46:46.780 Smith_Group Denise_Crest 5124209057231 False \n", - " 2891755865712 False \n", - " Debra_Gateway 0388020295311 False \n", - " 9633813691441 False \n", - " Ferrell_Ltd Murphy_Meadow 1517129765931 False \n", - "... ... \n", - "2021-04-27 15:46:46.780 Smith_Group Debra_Gateway 9633813691441 False \n", - " Ferrell_Ltd Murphy_Meadow 1517129765931 False \n", - " 6964486699383 False \n", - " Nicholas_Estate 8002897098167 False \n", - " 8499880735104 False \n", - "\n", - "[5768 rows x 5 columns]" + "cpu_utilization 0.023102 \n", + "latency 0.023102 \n", + "packet_loss 0.023102 \n", + "throughput 0.023102 " ] }, - "execution_count": 17, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "mlrun.get_dataitem(fn_run.outputs['selected_features']).as_df()" + "mlrun.get_dataitem(fs.outputs['feature_scores']).as_df()" ] } ], "metadata": { "kernelspec": { - "display_name": "Python [conda env:root] *", + "display_name": "mlrun-extended", "language": "python", - "name": "conda-root-py" + "name": "conda-env-mlrun-extended-py" }, "language_info": { "codemirror_mode": { @@ -1275,7 +709,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.6" + "version": "3.9.18" } }, "nbformat": 4, diff --git a/feature_selection/feature_selection.py b/feature_selection/feature_selection.py index 30fa8f904..a046143da 100644 --- a/feature_selection/feature_selection.py +++ b/feature_selection/feature_selection.py @@ -313,7 +313,7 @@ def feature_selection( # Saving top_features_fv.save() - fs.get_offline_features(top_features_fv, target=ParquetTarget()) + top_features_fv.get_offline_features(target=ParquetTarget()) # Logging our new feature vector URI context.log_result("top_features_vector", top_features_fv.uri) diff --git a/feature_selection/function.yaml b/feature_selection/function.yaml index 44cdd9894..1724428d0 100644 --- a/feature_selection/function.yaml +++ b/feature_selection/function.yaml @@ -1,43 +1,30 @@ -metadata: - name: feature-selection - tag: '' - categories: - - data-preparation - - machine-learning -kind: job spec: + disable_auto_mount: false + command: '' entry_points: show_values_on_bars: - doc: '' - has_kwargs: false parameters: - name: axs - name: h_v default: v - name: space default: 0.4 - lineno: 54 - has_varargs: false name: show_values_on_bars - plot_stat: - doc: '' + lineno: 43 has_kwargs: false + has_varargs: false + doc: '' + plot_stat: parameters: - name: context - name: stat_name - name: stat_df - lineno: 76 - has_varargs: false name: plot_stat - feature_selection: - doc: 'Applies selected feature selection statistical functions or models on - our ''df_artifact''. - - - Each statistical function or model will vote for it''s best K selected features. - - If a feature has >= ''min_votes'' votes, it will be selected.' + lineno: 65 has_kwargs: false + has_varargs: false + doc: '' + feature_selection: parameters: - name: context doc: the function context. @@ -84,20 +71,29 @@ spec: type: bool doc: skips datatypes that are neither float nor int within the feature vector. default: false - - name: is_feature_vector - type: bool - doc: bool stating if the data is passed as a feature vector. - default: false - lineno: 106 - has_varargs: false name: feature_selection - disable_auto_mount: false - command: '' + lineno: 80 + has_kwargs: false + has_varargs: false + doc: 'Applies selected feature selection statistical functions or models on + our ''df_artifact''. + + + Each statistical function or model will vote for it''s best K selected features. + + If a feature has >= ''min_votes'' votes, it will be selected.' + image: mlrun/mlrun build: origin_filename: '' - functionSourceCode: IyBDb3B5cmlnaHQgMjAxOSBJZ3VhemlvCiMKIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiMKaW1wb3J0IGpzb24KCmltcG9ydCBtbHJ1bgppbXBvcnQgbWxydW4uZGF0YXN0b3JlCmltcG9ydCBtbHJ1bi5mZWF0dXJlX3N0b3JlIGFzIGZzCmltcG9ydCBtbHJ1bi51dGlscwppbXBvcnQgbnVtcHkgYXMgbnAKaW1wb3J0IHBhbmRhcyBhcyBwZAppbXBvcnQgcGxvdGx5LmV4cHJlc3MgYXMgcHgKZnJvbSBtbHJ1bi5hcnRpZmFjdHMgaW1wb3J0IFBsb3RseUFydGlmYWN0CmZyb20gbWxydW4uZGF0YXN0b3JlLnRhcmdldHMgaW1wb3J0IFBhcnF1ZXRUYXJnZXQKIyBNTFJ1biB1dGlscwpmcm9tIG1scnVuLnV0aWxzLmhlbHBlcnMgaW1wb3J0IGNyZWF0ZV9jbGFzcwojIEZlYXR1cmUgc2VsZWN0aW9uIHN0cmF0ZWdpZXMKZnJvbSBza2xlYXJuLmZlYXR1cmVfc2VsZWN0aW9uIGltcG9ydCBTZWxlY3RGcm9tTW9kZWwsIFNlbGVjdEtCZXN0CiMgU2NhbGUgZmVhdHVyZSBzY29yZXNnaXQgc3QKZnJvbSBza2xlYXJuLnByZXByb2Nlc3NpbmcgaW1wb3J0IE1pbk1heFNjYWxlcgojIFNLTGVhcm4gZXN0aW1hdG9ycyBsaXN0CmZyb20gc2tsZWFybi51dGlscyBpbXBvcnQgYWxsX2VzdGltYXRvcnMKCkRFRkFVTFRfU1RBVF9GSUxURVJTID0gWyJmX2NsYXNzaWYiLCAibXV0dWFsX2luZm9fY2xhc3NpZiIsICJjaGkyIiwgImZfcmVncmVzc2lvbiJdCkRFRkFVTFRfTU9ERUxfRklMVEVSUyA9IHsKICAgICJMaW5lYXJTVkMiOiAiTGluZWFyU1ZDIiwKICAgICJMb2dpc3RpY1JlZ3Jlc3Npb24iOiAiTG9naXN0aWNSZWdyZXNzaW9uIiwKICAgICJFeHRyYVRyZWVzQ2xhc3NpZmllciI6ICJFeHRyYVRyZWVzQ2xhc3NpZmllciIsCn0KCgpkZWYgc2hvd192YWx1ZXNfb25fYmFycyhheHMsIGhfdj0idiIsIHNwYWNlPTAuNCk6CiAgICBkZWYgX3Nob3dfb25fc2luZ2xlX3Bsb3QoYXhfKToKICAgICAgICBpZiBoX3YgPT0gInYiOgogICAgICAgICAgICBmb3IgcCBpbiBheF8ucGF0Y2hlczoKICAgICAgICAgICAgICAgIF94ID0gcC5nZXRfeCgpICsgcC5nZXRfd2lkdGgoKSAvIDIKICAgICAgICAgICAgICAgIF95ID0gcC5nZXRfeSgpICsgcC5nZXRfaGVpZ2h0KCkKICAgICAgICAgICAgICAgIHZhbHVlID0gaW50KHAuZ2V0X2hlaWdodCgpKQogICAgICAgICAgICAgICAgYXhfLnRleHQoX3gsIF95LCB2YWx1ZSwgaGE9ImNlbnRlciIpCiAgICAgICAgZWxpZiBoX3YgPT0gImgiOgogICAgICAgICAgICBmb3IgcCBpbiBheF8ucGF0Y2hlczoKICAgICAgICAgICAgICAgIF94ID0gcC5nZXRfeCgpICsgcC5nZXRfd2lkdGgoKSArIGZsb2F0KHNwYWNlKQogICAgICAgICAgICAgICAgX3kgPSBwLmdldF95KCkgKyBwLmdldF9oZWlnaHQoKQogICAgICAgICAgICAgICAgdmFsdWUgPSBpbnQocC5nZXRfd2lkdGgoKSkKICAgICAgICAgICAgICAgIGF4Xy50ZXh0KF94LCBfeSwgdmFsdWUsIGhhPSJsZWZ0IikKCiAgICBpZiBpc2luc3RhbmNlKGF4cywgbnAubmRhcnJheSk6CiAgICAgICAgZm9yIGlkeCwgYXggaW4gbnAubmRlbnVtZXJhdGUoYXhzKToKICAgICAgICAgICAgX3Nob3dfb25fc2luZ2xlX3Bsb3QoYXgpCiAgICBlbHNlOgogICAgICAgIF9zaG93X29uX3NpbmdsZV9wbG90KGF4cykKCgpkZWYgcGxvdF9zdGF0KGNvbnRleHQsIHN0YXRfbmFtZSwgc3RhdF9kZik6CiAgICBzb3J0ZWRfZGYgPSBzdGF0X2RmLnNvcnRfdmFsdWVzKHN0YXRfbmFtZSkKICAgIGZpZyA9IHB4LmJhcigKICAgICAgICBkYXRhX2ZyYW1lPXNvcnRlZF9kZiwKICAgICAgICB4PXN0YXRfbmFtZSwKICAgICAgICB5PXNvcnRlZF9kZi5pbmRleCwKICAgICAgICB0aXRsZT1mIntzdGF0X25hbWV9IGZlYXR1cmUgc2NvcmVzIiwKICAgICAgICBjb2xvcj1zdGF0X25hbWUsCiAgICApCiAgICBjb250ZXh0LmxvZ19hcnRpZmFjdCgKICAgICAgICBpdGVtPVBsb3RseUFydGlmYWN0KGtleT1zdGF0X25hbWUsIGZpZ3VyZT1maWcpLAogICAgICAgIGxvY2FsX3BhdGg9ZiJ7c3RhdF9uYW1lfS5odG1sIiwKICAgICkKCgpkZWYgZmVhdHVyZV9zZWxlY3Rpb24oCiAgICBjb250ZXh0LAogICAgZGZfYXJ0aWZhY3QsCiAgICBrOiBpbnQgPSA1LAogICAgbWluX3ZvdGVzOiBmbG9hdCA9IDAuNSwKICAgIGxhYmVsX2NvbHVtbjogc3RyID0gTm9uZSwKICAgIHN0YXRfZmlsdGVyczogbGlzdCA9IE5vbmUsCiAgICBtb2RlbF9maWx0ZXJzOiBkaWN0ID0gTm9uZSwKICAgIG1heF9zY2FsZWRfc2NvcmVzOiBib29sID0gVHJ1ZSwKICAgIHNhbXBsZV9yYXRpbzogZmxvYXQgPSBOb25lLAogICAgb3V0cHV0X3ZlY3Rvcl9uYW1lOiBmbG9hdCA9IE5vbmUsCiAgICBpZ25vcmVfdHlwZV9lcnJvcnM6IGJvb2wgPSBGYWxzZSwKKToKICAgICIiIgogICAgQXBwbGllcyBzZWxlY3RlZCBmZWF0dXJlIHNlbGVjdGlvbiBzdGF0aXN0aWNhbCBmdW5jdGlvbnMgb3IgbW9kZWxzIG9uIG91ciAnZGZfYXJ0aWZhY3QnLgoKICAgIEVhY2ggc3RhdGlzdGljYWwgZnVuY3Rpb24gb3IgbW9kZWwgd2lsbCB2b3RlIGZvciBpdCdzIGJlc3QgSyBzZWxlY3RlZCBmZWF0dXJlcy4KICAgIElmIGEgZmVhdHVyZSBoYXMgPj0gJ21pbl92b3Rlcycgdm90ZXMsIGl0IHdpbGwgYmUgc2VsZWN0ZWQuCgogICAgOnBhcmFtIGNvbnRleHQ6ICAgICAgICAgICAgIHRoZSBmdW5jdGlvbiBjb250ZXh0LgogICAgOnBhcmFtIGRmX2FydGlmYWN0OiAgICAgICAgIGRhdGFmcmFtZSB0byBwYXNzIGFzIGlucHV0LgogICAgOnBhcmFtIGs6ICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiB0b3AgZmVhdHVyZXMgdG8gc2VsZWN0IGZyb20gZWFjaCBzdGF0aXN0aWNhbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG9yIG1vZGVsLgogICAgOnBhcmFtIG1pbl92b3RlczogICAgICAgICAgIG1pbmltYWwgbnVtYmVyIG9mIHZvdGVzIChmcm9tIGEgbW9kZWwgb3IgYnkgc3RhdGlzdGljYWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbikgbmVlZGVkIGZvciBhIGZlYXR1cmUgdG8gYmUgc2VsZWN0ZWQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuIGJlIHNwZWNpZmllZCBieSBwZXJjZW50YWdlIG9mIHZvdGVzIG9yIGFic29sdXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIHZvdGVzLgogICAgOnBhcmFtIGxhYmVsX2NvbHVtbjogICAgICAgIGdyb3VuZC10cnV0aCAoeSkgbGFiZWxzLgogICAgOnBhcmFtIHN0YXRfZmlsdGVyczogICAgICAgIHN0YXRpc3RpY2FsIGZ1bmN0aW9ucyB0byBhcHBseSB0byB0aGUgZmVhdHVyZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnJvbSBza2xlYXJuLmZlYXR1cmVfc2VsZWN0aW9uKS4KICAgIDpwYXJhbSBtb2RlbF9maWx0ZXJzOiAgICAgICBtb2RlbHMgdG8gdXNlIGZvciBmZWF0dXJlIGV2YWx1YXRpb24sIGNhbiBiZSBzcGVjaWZpZWQgYnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCBuYW1lIChleC4gTGluZWFyU1ZDKSwgZm9ybWFsaXplZCBqc29uIChjb250YWlucyAnQ0xBU1MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGSVQnLCAnTUVUQScpIG9yIGEgcGF0aCB0byBzdWNoIGpzb24gZmlsZS4KICAgIDpwYXJhbSBtYXhfc2NhbGVkX3Njb3JlczogICBwcm9kdWNlIGZlYXR1cmUgc2NvcmVzIHRhYmxlIHNjYWxlZCB3aXRoIG1heF9zY2FsZXIuCiAgICA6cGFyYW0gc2FtcGxlX3JhdGlvOiAgICAgICAgcGVyY2VudGFnZSBvZiB0aGUgZGF0YXNldCB0aGUgdXNlciB3aXNoZXMgdG8gY29tcHV0ZSB0aGUgZmVhdHVyZSBzZWxlY3Rpb24gcHJvY2VzcyBvbi4KICAgIDpwYXJhbSBvdXRwdXRfdmVjdG9yX25hbWU6ICBjcmVhdGVzIGEgbmV3IGZlYXR1cmUgdmVjdG9yIGNvbnRhaW5pbmcgb25seSB0aGUgaWRlbnRpZmllcyBmZWF0dXJlcy4KICAgIDpwYXJhbSBpZ25vcmVfdHlwZV9lcnJvcnM6ICBza2lwcyBkYXRhdHlwZXMgdGhhdCBhcmUgbmVpdGhlciBmbG9hdCBub3IgaW50IHdpdGhpbiB0aGUgZmVhdHVyZSB2ZWN0b3IuCiAgICAiIiIKICAgIHN0YXRfZmlsdGVycyA9IHN0YXRfZmlsdGVycyBvciBERUZBVUxUX1NUQVRfRklMVEVSUwogICAgbW9kZWxfZmlsdGVycyA9IG1vZGVsX2ZpbHRlcnMgb3IgREVGQVVMVF9NT0RFTF9GSUxURVJTCiAgICAjIENoZWNrIGlmIGRmLm1ldGEgaXMgdmFsaWQsIGlmIGl0IGlzLCBsb29rIGZvciBhIGZlYXR1cmUgdmVjdG9yCiAgICBzdG9yZV91cmlfcHJlZml4LCBfID0gbWxydW4uZGF0YXN0b3JlLnBhcnNlX3N0b3JlX3VyaShkZl9hcnRpZmFjdC5hcnRpZmFjdF91cmwpCiAgICBpc19mZWF0dXJlX3ZlY3RvciA9IG1scnVuLnV0aWxzLlN0b3JlUHJlZml4LkZlYXR1cmVWZWN0b3IgPT0gc3RvcmVfdXJpX3ByZWZpeAoKICAgICMgTG9vayBpbnNpZGUgbWV0YS5zcGVjLmxhYmVsX2ZlYXR1cmUgdG8gaWRlbnRpZnkgdGhlIGxhYmVsX2NvbHVtbiBpZiB0aGUgdXNlciBkaWQgbm90IHNwZWNpZnkgaXQKICAgIGlmIGxhYmVsX2NvbHVtbiBpcyBOb25lOgogICAgICAgIGlmIGlzX2ZlYXR1cmVfdmVjdG9yOgogICAgICAgICAgICBsYWJlbF9jb2x1bW4gPSBkZl9hcnRpZmFjdC5tZXRhLnNwZWMubGFiZWxfZmVhdHVyZS5zcGxpdCgiLiIpWzFdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiTm8gbGFiZWxfY29sdW1uIHdhcyBnaXZlbiwgcGxlYXNlIGFkZCBhIGxhYmVsX2NvbHVtbi4iKQoKICAgICMgVXNlIHRoZSBmZWF0dXJlIHZlY3RvciBhcyBkYXRhZnJhbWUKICAgIGRmID0gZGZfYXJ0aWZhY3QuYXNfZGYoKQoKICAgICMgRW5zdXJlIGsgaXMgbm90IGJpZ2dlciB0aGFuIHRoZSB0b3RhbCBudW1iZXIgb2YgZmVhdHVyZXMKICAgIGlmIGsgPiBkZi5zaGFwZVsxXToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICBmIksgY2Fubm90IGJlIGJpZ2dlciB0aGFuIHRoZSB0b3RhbCBudW1iZXIgb2YgZmVhdHVyZXMgKHtkZi5zaGFwZVsxXX0pLiBQbGVhc2UgY2hvb3NlIGEgc21hbGxlciBLLiIKICAgICAgICApCiAgICBlbGlmIGsgPCAxOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIksgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAxLiBQbGVhc2UgY2hvb3NlIGEgYmlnZ2VyIEsuIikKCiAgICAjIENyZWF0ZSBhIHNhbXBsZSBkYXRhZnJhbWUgb2YgdGhlIG9yaWdpbmFsIGZlYXR1cmUgdmVjdG9yCiAgICBpZiBzYW1wbGVfcmF0aW86CiAgICAgICAgZGYgPSAoCiAgICAgICAgICAgIGRmLmdyb3VwYnkobGFiZWxfY29sdW1uKQogICAgICAgICAgICAuYXBwbHkobGFtYmRhIHg6IHguc2FtcGxlKGZyYWM9c2FtcGxlX3JhdGlvKSkKICAgICAgICAgICAgLnJlc2V0X2luZGV4KGRyb3A9VHJ1ZSkKICAgICAgICApCiAgICAgICAgZGYgPSBkZi5kcm9wbmEoKQoKICAgICMgU2V0IGZlYXR1cmUgdmVjdG9yIGFuZCBsYWJlbHMKICAgIHkgPSBkZi5wb3AobGFiZWxfY29sdW1uKQogICAgWCA9IGRmCgogICAgaWYgbnAub2JqZWN0XyBpbiBsaXN0KFguZHR5cGVzKSBhbmQgaWdub3JlX3R5cGVfZXJyb3JzIGlzIEZhbHNlOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgIGYie2RmLnNlbGVjdF9kdHlwZXMoaW5jbHVkZT1bJ29iamVjdCddKS5jb2x1bW5zLnRvbGlzdCgpfSBhcmUgbmVpdGhlciBmbG9hdCBvciBpbnQuIgogICAgICAgICkKCiAgICAjIENyZWF0ZSBzZWxlY3RlZCBzdGF0aXN0aWNhbCBlc3RpbWF0b3JzCiAgICBzdGF0X2Z1bmN0aW9uc19saXN0ID0gewogICAgICAgIHN0YXRfbmFtZTogU2VsZWN0S0Jlc3QoCiAgICAgICAgICAgIHNjb3JlX2Z1bmM9Y3JlYXRlX2NsYXNzKGYic2tsZWFybi5mZWF0dXJlX3NlbGVjdGlvbi57c3RhdF9uYW1lfSIpLCBrPWsKICAgICAgICApCiAgICAgICAgZm9yIHN0YXRfbmFtZSBpbiBzdGF0X2ZpbHRlcnMKICAgIH0KICAgIHJlcXVpcmVzX2FicyA9IFsiY2hpMiJdCgogICAgIyBSdW4gc3RhdGlzdGljIGZpbHRlcnMKICAgIHNlbGVjdGVkX2ZlYXR1cmVzX2FnZyA9IHt9CiAgICBzdGF0c19kZiA9IHBkLkRhdGFGcmFtZShpbmRleD1YLmNvbHVtbnMpLmRyb3BuYSgpCgogICAgZm9yIHN0YXRfbmFtZSwgc3RhdF9mdW5jIGluIHN0YXRfZnVuY3Rpb25zX2xpc3QuaXRlbXMoKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHBhcmFtcyA9IChYLCB5KSBpZiBzdGF0X25hbWUgaW4gcmVxdWlyZXNfYWJzIGVsc2UgKGFicyhYKSwgeSkKICAgICAgICAgICAgc3RhdCA9IHN0YXRfZnVuYy5maXQoKnBhcmFtcykKCiAgICAgICAgICAgICMgQ29sbGVjdCBzdGF0IGZ1bmN0aW9uIHJlc3VsdHMKICAgICAgICAgICAgc3RhdF9kZiA9IHBkLkRhdGFGcmFtZSgKICAgICAgICAgICAgICAgIGluZGV4PVguY29sdW1ucywgY29sdW1ucz1bc3RhdF9uYW1lXSwgZGF0YT1zdGF0LnNjb3Jlc18KICAgICAgICAgICAgKQogICAgICAgICAgICBwbG90X3N0YXQoY29udGV4dCwgc3RhdF9uYW1lLCBzdGF0X2RmKQogICAgICAgICAgICBzdGF0c19kZiA9IHN0YXRzX2RmLmpvaW4oc3RhdF9kZikKCiAgICAgICAgICAgICMgU2VsZWN0IEsgQmVzdCBmZWF0dXJlcwogICAgICAgICAgICBzZWxlY3RlZF9mZWF0dXJlcyA9IFguY29sdW1uc1tzdGF0X2Z1bmMuZ2V0X3N1cHBvcnQoKV0KICAgICAgICAgICAgc2VsZWN0ZWRfZmVhdHVyZXNfYWdnW3N0YXRfbmFtZV0gPSBzZWxlY3RlZF9mZWF0dXJlcwoKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIGNvbnRleHQubG9nZ2VyLmluZm8oZiJDb3VsZG4ndCBjYWxjdWxhdGUge3N0YXRfbmFtZX0gYmVjYXVzZSBvZjoge2V9IikKCiAgICAjIENyZWF0ZSBtb2RlbHMgZnJvbSBjbGFzcyBuYW1lIC8ganNvbiBmaWxlIC8ganNvbiBwYXJhbXMKICAgIGFsbF9za2xlYXJuX2VzdGltYXRvcnMgPSBkaWN0KGFsbF9lc3RpbWF0b3JzKCkpIGlmIGxlbihtb2RlbF9maWx0ZXJzKSA+IDAgZWxzZSB7fQogICAgc2VsZWN0ZWRfbW9kZWxzID0ge30KICAgIGZvciBtb2RlbF9uYW1lLCBtb2RlbCBpbiBtb2RlbF9maWx0ZXJzLml0ZW1zKCk6CiAgICAgICAgaWYgIi5qc29uIiBpbiBtb2RlbDoKICAgICAgICAgICAgY3VycmVudF9tb2RlbCA9IGpzb24ubG9hZChvcGVuKG1vZGVsLCAiciIpKQogICAgICAgICAgICBjbGFzc2lmaWVyX2NsYXNzID0gY3JlYXRlX2NsYXNzKGN1cnJlbnRfbW9kZWxbIk1FVEEiXVsiY2xhc3MiXSkKICAgICAgICAgICAgc2VsZWN0ZWRfbW9kZWxzW21vZGVsX25hbWVdID0gY2xhc3NpZmllcl9jbGFzcygqKmN1cnJlbnRfbW9kZWxbIkNMQVNTIl0pCiAgICAgICAgZWxpZiBtb2RlbCBpbiBhbGxfc2tsZWFybl9lc3RpbWF0b3JzOgogICAgICAgICAgICBzZWxlY3RlZF9tb2RlbHNbbW9kZWxfbmFtZV0gPSBhbGxfc2tsZWFybl9lc3RpbWF0b3JzW21vZGVsX25hbWVdKCkKCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgY3VycmVudF9tb2RlbCA9IGpzb24ubG9hZHMobW9kZWwpCiAgICAgICAgICAgICAgICBjbGFzc2lmaWVyX2NsYXNzID0gY3JlYXRlX2NsYXNzKGN1cnJlbnRfbW9kZWxbIk1FVEEiXVsiY2xhc3MiXSkKICAgICAgICAgICAgICAgIHNlbGVjdGVkX21vZGVsc1ttb2RlbF9uYW1lXSA9IGNsYXNzaWZpZXJfY2xhc3MoKipjdXJyZW50X21vZGVsWyJDTEFTUyJdKQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgICAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYidW5hYmxlIHRvIGxvYWQge21vZGVsfSBiZWNhdXNlIG9mOiB7ZX0iKQoKICAgICMgUnVuIG1vZGVsIGZpbHRlcnMKICAgIG1vZGVsc19kZiA9IHBkLkRhdGFGcmFtZShpbmRleD1YLmNvbHVtbnMpCiAgICBmb3IgbW9kZWxfbmFtZSwgbW9kZWwgaW4gc2VsZWN0ZWRfbW9kZWxzLml0ZW1zKCk6CgogICAgICAgIGlmIG1vZGVsX25hbWUgPT0gIkxvZ2lzdGljUmVncmVzc2lvbiI6CiAgICAgICAgICAgIG1vZGVsLnNldF9wYXJhbXMoc29sdmVyPSJsaWJsaW5lYXIiKQoKICAgICAgICAjIFRyYWluIG1vZGVsIGFuZCBnZXQgZmVhdHVyZSBpbXBvcnRhbmNlCiAgICAgICAgc2VsZWN0X2Zyb21fbW9kZWwgPSBTZWxlY3RGcm9tTW9kZWwobW9kZWwpLmZpdChYLCB5KQogICAgICAgIGZlYXR1cmVfaWR4ID0gc2VsZWN0X2Zyb21fbW9kZWwuZ2V0X3N1cHBvcnQoKQogICAgICAgIGZlYXR1cmVfbmFtZXMgPSBYLmNvbHVtbnNbZmVhdHVyZV9pZHhdCiAgICAgICAgc2VsZWN0ZWRfZmVhdHVyZXNfYWdnW21vZGVsX25hbWVdID0gZmVhdHVyZV9uYW1lcy50b2xpc3QoKQoKICAgICAgICAjIENvbGxlY3QgbW9kZWwgZmVhdHVyZSBpbXBvcnRhbmNlCiAgICAgICAgaWYgaGFzYXR0cihzZWxlY3RfZnJvbV9tb2RlbC5lc3RpbWF0b3JfLCAiY29lZl8iKToKICAgICAgICAgICAgc3RhdF9kZiA9IHNlbGVjdF9mcm9tX21vZGVsLmVzdGltYXRvcl8uY29lZl8KICAgICAgICBlbGlmIGhhc2F0dHIoc2VsZWN0X2Zyb21fbW9kZWwuZXN0aW1hdG9yXywgImZlYXR1cmVfaW1wb3J0YW5jZXNfIik6CiAgICAgICAgICAgIHN0YXRfZGYgPSBzZWxlY3RfZnJvbV9tb2RlbC5lc3RpbWF0b3JfLmZlYXR1cmVfaW1wb3J0YW5jZXNfCgogICAgICAgIHN0YXRfZGYgPSBwZC5EYXRhRnJhbWUoaW5kZXg9WC5jb2x1bW5zLCBjb2x1bW5zPVttb2RlbF9uYW1lXSwgZGF0YT1zdGF0X2RmWzBdKQogICAgICAgIG1vZGVsc19kZiA9IG1vZGVsc19kZi5qb2luKHN0YXRfZGYpCgogICAgICAgIHBsb3Rfc3RhdChjb250ZXh0LCBtb2RlbF9uYW1lLCBzdGF0X2RmKQoKICAgICMgQ3JlYXRlIGZlYXR1cmVfc2NvcmVzIERGIHdpdGggc3RhdCAmIG1vZGVsIGZpbHRlcnMgc2NvcmVzCiAgICByZXN1bHRfbWF0cml4X2RmID0gcGQuY29uY2F0KFtzdGF0c19kZiwgbW9kZWxzX2RmXSwgYXhpcz0xLCBzb3J0PUZhbHNlKQogICAgY29udGV4dC5sb2dfZGF0YXNldCgKICAgICAgICBrZXk9ImZlYXR1cmVfc2NvcmVzIiwKICAgICAgICBkZj1yZXN1bHRfbWF0cml4X2RmLAogICAgICAgIGxvY2FsX3BhdGg9ImZlYXR1cmVfc2NvcmVzLnBhcnF1ZXQiLAogICAgICAgIGZvcm1hdD0icGFycXVldCIsCiAgICApCiAgICBpZiBtYXhfc2NhbGVkX3Njb3JlczoKICAgICAgICBub3JtYWxpemVkX2RmID0gcmVzdWx0X21hdHJpeF9kZi5yZXBsYWNlKFtucC5pbmYsIC1ucC5pbmZdLCBucC5uYW4pLnZhbHVlcwogICAgICAgIG1pbl9tYXhfc2NhbGVyID0gTWluTWF4U2NhbGVyKCkKICAgICAgICBub3JtYWxpemVkX2RmID0gbWluX21heF9zY2FsZXIuZml0X3RyYW5zZm9ybShub3JtYWxpemVkX2RmKQogICAgICAgIG5vcm1hbGl6ZWRfZGYgPSBwZC5EYXRhRnJhbWUoCiAgICAgICAgICAgIGRhdGE9bm9ybWFsaXplZF9kZiwKICAgICAgICAgICAgY29sdW1ucz1yZXN1bHRfbWF0cml4X2RmLmNvbHVtbnMsCiAgICAgICAgICAgIGluZGV4PXJlc3VsdF9tYXRyaXhfZGYuaW5kZXgsCiAgICAgICAgKQogICAgICAgIGNvbnRleHQubG9nX2RhdGFzZXQoCiAgICAgICAgICAgIGtleT0ibWF4X3NjYWxlZF9zY29yZXNfZmVhdHVyZV9zY29yZXMiLAogICAgICAgICAgICBkZj1ub3JtYWxpemVkX2RmLAogICAgICAgICAgICBsb2NhbF9wYXRoPSJtYXhfc2NhbGVkX3Njb3Jlc19mZWF0dXJlX3Njb3Jlcy5wYXJxdWV0IiwKICAgICAgICAgICAgZm9ybWF0PSJwYXJxdWV0IiwKICAgICAgICApCgogICAgIyBDcmVhdGUgZmVhdHVyZSBjb3VudCBEYXRhRnJhbWUKICAgIGZvciB0ZXN0X25hbWUgaW4gc2VsZWN0ZWRfZmVhdHVyZXNfYWdnOgogICAgICAgIHJlc3VsdF9tYXRyaXhfZGZbdGVzdF9uYW1lXSA9IFsKICAgICAgICAgICAgMSBpZiB4IGluIHNlbGVjdGVkX2ZlYXR1cmVzX2FnZ1t0ZXN0X25hbWVdIGVsc2UgMCBmb3IgeCBpbiBYLmNvbHVtbnMKICAgICAgICBdCiAgICByZXN1bHRfbWF0cml4X2RmLmxvY1s6LCAibnVtX3ZvdGVzIl0gPSByZXN1bHRfbWF0cml4X2RmLnN1bShheGlzPTEpCiAgICBjb250ZXh0LmxvZ19kYXRhc2V0KAogICAgICAgIGtleT0ic2VsZWN0ZWRfZmVhdHVyZXNfY291bnQiLAogICAgICAgIGRmPXJlc3VsdF9tYXRyaXhfZGYsCiAgICAgICAgbG9jYWxfcGF0aD0ic2VsZWN0ZWRfZmVhdHVyZXNfY291bnQucGFycXVldCIsCiAgICAgICAgZm9ybWF0PSJwYXJxdWV0IiwKICAgICkKCiAgICAjIEhvdyBtYW55IHZvdGVzIGFyZSBuZWVkZWQgZm9yIGEgZmVhdHVyZSB0byBiZSBzZWxlY3RlZD8KICAgIGlmIGlzaW5zdGFuY2UobWluX3ZvdGVzLCBpbnQpOgogICAgICAgIHZvdGVzX25lZWRlZCA9IG1pbl92b3RlcwogICAgZWxzZToKICAgICAgICBudW1fZmlsdGVycyA9IGxlbihzdGF0X2ZpbHRlcnMpICsgbGVuKG1vZGVsX2ZpbHRlcnMpCiAgICAgICAgdm90ZXNfbmVlZGVkID0gaW50KG5wLmZsb29yKG51bV9maWx0ZXJzICogbWF4KG1pbihtaW5fdm90ZXMsIDEpLCAwKSkpCiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYidm90ZXMgbmVlZGVkIHRvIGJlIHNlbGVjdGVkOiB7dm90ZXNfbmVlZGVkfSIpCgogICAgIyBDcmVhdGUgZmluYWwgZmVhdHVyZSBkYXRhZnJhbWUKICAgIHNlbGVjdGVkX2ZlYXR1cmVzID0gcmVzdWx0X21hdHJpeF9kZlsKICAgICAgICByZXN1bHRfbWF0cml4X2RmLm51bV92b3RlcyA+PSB2b3Rlc19uZWVkZWQKICAgIF0uaW5kZXgudG9saXN0KCkKICAgIGdvb2RfZmVhdHVyZV9kZiA9IGRmLmxvY1s6LCBzZWxlY3RlZF9mZWF0dXJlc10KICAgIGZpbmFsX2RmID0gcGQuY29uY2F0KFtnb29kX2ZlYXR1cmVfZGYsIHldLCBheGlzPTEpCiAgICBjb250ZXh0LmxvZ19kYXRhc2V0KAogICAgICAgIGtleT0ic2VsZWN0ZWRfZmVhdHVyZXMiLAogICAgICAgIGRmPWZpbmFsX2RmLAogICAgICAgIGxvY2FsX3BhdGg9InNlbGVjdGVkX2ZlYXR1cmVzLnBhcnF1ZXQiLAogICAgICAgIGZvcm1hdD0icGFycXVldCIsCiAgICApCgogICAgIyBDcmVhdGluZyBhIG5ldyBmZWF0dXJlIHZlY3RvciBjb250YWluaW5nIG9ubHkgdGhlIGlkZW50aWZpZWQgdG9wIGZlYXR1cmVzCiAgICBpZiBpc19mZWF0dXJlX3ZlY3RvciBhbmQgZGZfYXJ0aWZhY3QubWV0YS5zcGVjLmZlYXR1cmVzIGFuZCBvdXRwdXRfdmVjdG9yX25hbWU6CiAgICAgICAgIyBTZWxlY3RpbmcgdGhlIHRvcCBLIGZlYXR1cmVzIGZyb20gb3VyIHRvcCBmZWF0dXJlIGRhdGFmcmFtZQogICAgICAgIHNlbGVjdGVkX2ZlYXR1cmVzID0gcmVzdWx0X21hdHJpeF9kZi5oZWFkKGspLmluZGV4CgogICAgICAgICMgTWF0Y2ggdGhlIHNlbGVjdGVkIGZlYXR1cmUgbmFtZXMgdG8gdGhlIEZTIEZlYXR1cmUgYW5ub3RhdGlvbnMKICAgICAgICBtYXRjaGVkX3NlbGVjdGlvbnMgPSBbCiAgICAgICAgICAgIGZlYXR1cmUKICAgICAgICAgICAgZm9yIGZlYXR1cmUgaW4gbGlzdChkZl9hcnRpZmFjdC5tZXRhLnNwZWMuZmVhdHVyZXMpCiAgICAgICAgICAgIGZvciBzZWxlY3RlZCBpbiBsaXN0KHNlbGVjdGVkX2ZlYXR1cmVzKQogICAgICAgICAgICBpZiBmZWF0dXJlLmVuZHN3aXRoKHNlbGVjdGVkKQogICAgICAgIF0KCiAgICAgICAgIyBEZWZpbmluZyBvdXIgbmV3IGZlYXR1cmUgdmVjdG9yCiAgICAgICAgdG9wX2ZlYXR1cmVzX2Z2ID0gZnMuRmVhdHVyZVZlY3RvcigKICAgICAgICAgICAgb3V0cHV0X3ZlY3Rvcl9uYW1lLAogICAgICAgICAgICBtYXRjaGVkX3NlbGVjdGlvbnMsCiAgICAgICAgICAgIGxhYmVsX2ZlYXR1cmU9ImxhYmVscy5sYWJlbCIsCiAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJmZWF0dXJlIHZlY3RvciBjb21wb3NlZCBzdHJpY3RseSBvZiBvdXIgdG9wIGZlYXR1cmVzIiwKICAgICAgICApCgogICAgICAgICMgU2F2aW5nCiAgICAgICAgdG9wX2ZlYXR1cmVzX2Z2LnNhdmUoKQogICAgICAgIGZzLmdldF9vZmZsaW5lX2ZlYXR1cmVzKHRvcF9mZWF0dXJlc19mdiwgdGFyZ2V0PVBhcnF1ZXRUYXJnZXQoKSkKCiAgICAgICAgIyBMb2dnaW5nIG91ciBuZXcgZmVhdHVyZSB2ZWN0b3IgVVJJCiAgICAgICAgY29udGV4dC5sb2dfcmVzdWx0KCJ0b3BfZmVhdHVyZXNfdmVjdG9yIiwgdG9wX2ZlYXR1cmVzX2Z2LnVyaSkK + functionSourceCode: IyBDb3B5cmlnaHQgMjAxOSBJZ3VhemlvCiMKIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiMKaW1wb3J0IGpzb24KCmltcG9ydCBtbHJ1bgppbXBvcnQgbWxydW4uZGF0YXN0b3JlCmltcG9ydCBtbHJ1bi5mZWF0dXJlX3N0b3JlIGFzIGZzCmltcG9ydCBtbHJ1bi51dGlscwppbXBvcnQgbnVtcHkgYXMgbnAKaW1wb3J0IHBhbmRhcyBhcyBwZAppbXBvcnQgcGxvdGx5LmV4cHJlc3MgYXMgcHgKZnJvbSBtbHJ1bi5hcnRpZmFjdHMgaW1wb3J0IFBsb3RseUFydGlmYWN0CmZyb20gbWxydW4uZGF0YXN0b3JlLnRhcmdldHMgaW1wb3J0IFBhcnF1ZXRUYXJnZXQKIyBNTFJ1biB1dGlscwpmcm9tIG1scnVuLnV0aWxzLmhlbHBlcnMgaW1wb3J0IGNyZWF0ZV9jbGFzcwojIEZlYXR1cmUgc2VsZWN0aW9uIHN0cmF0ZWdpZXMKZnJvbSBza2xlYXJuLmZlYXR1cmVfc2VsZWN0aW9uIGltcG9ydCBTZWxlY3RGcm9tTW9kZWwsIFNlbGVjdEtCZXN0CiMgU2NhbGUgZmVhdHVyZSBzY29yZXNnaXQgc3QKZnJvbSBza2xlYXJuLnByZXByb2Nlc3NpbmcgaW1wb3J0IE1pbk1heFNjYWxlcgojIFNLTGVhcm4gZXN0aW1hdG9ycyBsaXN0CmZyb20gc2tsZWFybi51dGlscyBpbXBvcnQgYWxsX2VzdGltYXRvcnMKCkRFRkFVTFRfU1RBVF9GSUxURVJTID0gWyJmX2NsYXNzaWYiLCAibXV0dWFsX2luZm9fY2xhc3NpZiIsICJjaGkyIiwgImZfcmVncmVzc2lvbiJdCkRFRkFVTFRfTU9ERUxfRklMVEVSUyA9IHsKICAgICJMaW5lYXJTVkMiOiAiTGluZWFyU1ZDIiwKICAgICJMb2dpc3RpY1JlZ3Jlc3Npb24iOiAiTG9naXN0aWNSZWdyZXNzaW9uIiwKICAgICJFeHRyYVRyZWVzQ2xhc3NpZmllciI6ICJFeHRyYVRyZWVzQ2xhc3NpZmllciIsCn0KCgpkZWYgc2hvd192YWx1ZXNfb25fYmFycyhheHMsIGhfdj0idiIsIHNwYWNlPTAuNCk6CiAgICBkZWYgX3Nob3dfb25fc2luZ2xlX3Bsb3QoYXhfKToKICAgICAgICBpZiBoX3YgPT0gInYiOgogICAgICAgICAgICBmb3IgcCBpbiBheF8ucGF0Y2hlczoKICAgICAgICAgICAgICAgIF94ID0gcC5nZXRfeCgpICsgcC5nZXRfd2lkdGgoKSAvIDIKICAgICAgICAgICAgICAgIF95ID0gcC5nZXRfeSgpICsgcC5nZXRfaGVpZ2h0KCkKICAgICAgICAgICAgICAgIHZhbHVlID0gaW50KHAuZ2V0X2hlaWdodCgpKQogICAgICAgICAgICAgICAgYXhfLnRleHQoX3gsIF95LCB2YWx1ZSwgaGE9ImNlbnRlciIpCiAgICAgICAgZWxpZiBoX3YgPT0gImgiOgogICAgICAgICAgICBmb3IgcCBpbiBheF8ucGF0Y2hlczoKICAgICAgICAgICAgICAgIF94ID0gcC5nZXRfeCgpICsgcC5nZXRfd2lkdGgoKSArIGZsb2F0KHNwYWNlKQogICAgICAgICAgICAgICAgX3kgPSBwLmdldF95KCkgKyBwLmdldF9oZWlnaHQoKQogICAgICAgICAgICAgICAgdmFsdWUgPSBpbnQocC5nZXRfd2lkdGgoKSkKICAgICAgICAgICAgICAgIGF4Xy50ZXh0KF94LCBfeSwgdmFsdWUsIGhhPSJsZWZ0IikKCiAgICBpZiBpc2luc3RhbmNlKGF4cywgbnAubmRhcnJheSk6CiAgICAgICAgZm9yIGlkeCwgYXggaW4gbnAubmRlbnVtZXJhdGUoYXhzKToKICAgICAgICAgICAgX3Nob3dfb25fc2luZ2xlX3Bsb3QoYXgpCiAgICBlbHNlOgogICAgICAgIF9zaG93X29uX3NpbmdsZV9wbG90KGF4cykKCgpkZWYgcGxvdF9zdGF0KGNvbnRleHQsIHN0YXRfbmFtZSwgc3RhdF9kZik6CiAgICBzb3J0ZWRfZGYgPSBzdGF0X2RmLnNvcnRfdmFsdWVzKHN0YXRfbmFtZSkKICAgIGZpZyA9IHB4LmJhcigKICAgICAgICBkYXRhX2ZyYW1lPXNvcnRlZF9kZiwKICAgICAgICB4PXN0YXRfbmFtZSwKICAgICAgICB5PXNvcnRlZF9kZi5pbmRleCwKICAgICAgICB0aXRsZT1mIntzdGF0X25hbWV9IGZlYXR1cmUgc2NvcmVzIiwKICAgICAgICBjb2xvcj1zdGF0X25hbWUsCiAgICApCiAgICBjb250ZXh0LmxvZ19hcnRpZmFjdCgKICAgICAgICBpdGVtPVBsb3RseUFydGlmYWN0KGtleT1zdGF0X25hbWUsIGZpZ3VyZT1maWcpLAogICAgICAgIGxvY2FsX3BhdGg9ZiJ7c3RhdF9uYW1lfS5odG1sIiwKICAgICkKCgpkZWYgZmVhdHVyZV9zZWxlY3Rpb24oCiAgICBjb250ZXh0LAogICAgZGZfYXJ0aWZhY3QsCiAgICBrOiBpbnQgPSA1LAogICAgbWluX3ZvdGVzOiBmbG9hdCA9IDAuNSwKICAgIGxhYmVsX2NvbHVtbjogc3RyID0gTm9uZSwKICAgIHN0YXRfZmlsdGVyczogbGlzdCA9IE5vbmUsCiAgICBtb2RlbF9maWx0ZXJzOiBkaWN0ID0gTm9uZSwKICAgIG1heF9zY2FsZWRfc2NvcmVzOiBib29sID0gVHJ1ZSwKICAgIHNhbXBsZV9yYXRpbzogZmxvYXQgPSBOb25lLAogICAgb3V0cHV0X3ZlY3Rvcl9uYW1lOiBmbG9hdCA9IE5vbmUsCiAgICBpZ25vcmVfdHlwZV9lcnJvcnM6IGJvb2wgPSBGYWxzZSwKKToKICAgICIiIgogICAgQXBwbGllcyBzZWxlY3RlZCBmZWF0dXJlIHNlbGVjdGlvbiBzdGF0aXN0aWNhbCBmdW5jdGlvbnMgb3IgbW9kZWxzIG9uIG91ciAnZGZfYXJ0aWZhY3QnLgoKICAgIEVhY2ggc3RhdGlzdGljYWwgZnVuY3Rpb24gb3IgbW9kZWwgd2lsbCB2b3RlIGZvciBpdCdzIGJlc3QgSyBzZWxlY3RlZCBmZWF0dXJlcy4KICAgIElmIGEgZmVhdHVyZSBoYXMgPj0gJ21pbl92b3Rlcycgdm90ZXMsIGl0IHdpbGwgYmUgc2VsZWN0ZWQuCgogICAgOnBhcmFtIGNvbnRleHQ6ICAgICAgICAgICAgIHRoZSBmdW5jdGlvbiBjb250ZXh0LgogICAgOnBhcmFtIGRmX2FydGlmYWN0OiAgICAgICAgIGRhdGFmcmFtZSB0byBwYXNzIGFzIGlucHV0LgogICAgOnBhcmFtIGs6ICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiB0b3AgZmVhdHVyZXMgdG8gc2VsZWN0IGZyb20gZWFjaCBzdGF0aXN0aWNhbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG9yIG1vZGVsLgogICAgOnBhcmFtIG1pbl92b3RlczogICAgICAgICAgIG1pbmltYWwgbnVtYmVyIG9mIHZvdGVzIChmcm9tIGEgbW9kZWwgb3IgYnkgc3RhdGlzdGljYWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbikgbmVlZGVkIGZvciBhIGZlYXR1cmUgdG8gYmUgc2VsZWN0ZWQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuIGJlIHNwZWNpZmllZCBieSBwZXJjZW50YWdlIG9mIHZvdGVzIG9yIGFic29sdXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIHZvdGVzLgogICAgOnBhcmFtIGxhYmVsX2NvbHVtbjogICAgICAgIGdyb3VuZC10cnV0aCAoeSkgbGFiZWxzLgogICAgOnBhcmFtIHN0YXRfZmlsdGVyczogICAgICAgIHN0YXRpc3RpY2FsIGZ1bmN0aW9ucyB0byBhcHBseSB0byB0aGUgZmVhdHVyZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnJvbSBza2xlYXJuLmZlYXR1cmVfc2VsZWN0aW9uKS4KICAgIDpwYXJhbSBtb2RlbF9maWx0ZXJzOiAgICAgICBtb2RlbHMgdG8gdXNlIGZvciBmZWF0dXJlIGV2YWx1YXRpb24sIGNhbiBiZSBzcGVjaWZpZWQgYnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCBuYW1lIChleC4gTGluZWFyU1ZDKSwgZm9ybWFsaXplZCBqc29uIChjb250YWlucyAnQ0xBU1MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGSVQnLCAnTUVUQScpIG9yIGEgcGF0aCB0byBzdWNoIGpzb24gZmlsZS4KICAgIDpwYXJhbSBtYXhfc2NhbGVkX3Njb3JlczogICBwcm9kdWNlIGZlYXR1cmUgc2NvcmVzIHRhYmxlIHNjYWxlZCB3aXRoIG1heF9zY2FsZXIuCiAgICA6cGFyYW0gc2FtcGxlX3JhdGlvOiAgICAgICAgcGVyY2VudGFnZSBvZiB0aGUgZGF0YXNldCB0aGUgdXNlciB3aXNoZXMgdG8gY29tcHV0ZSB0aGUgZmVhdHVyZSBzZWxlY3Rpb24gcHJvY2VzcyBvbi4KICAgIDpwYXJhbSBvdXRwdXRfdmVjdG9yX25hbWU6ICBjcmVhdGVzIGEgbmV3IGZlYXR1cmUgdmVjdG9yIGNvbnRhaW5pbmcgb25seSB0aGUgaWRlbnRpZmllcyBmZWF0dXJlcy4KICAgIDpwYXJhbSBpZ25vcmVfdHlwZV9lcnJvcnM6ICBza2lwcyBkYXRhdHlwZXMgdGhhdCBhcmUgbmVpdGhlciBmbG9hdCBub3IgaW50IHdpdGhpbiB0aGUgZmVhdHVyZSB2ZWN0b3IuCiAgICAiIiIKICAgIHN0YXRfZmlsdGVycyA9IHN0YXRfZmlsdGVycyBvciBERUZBVUxUX1NUQVRfRklMVEVSUwogICAgbW9kZWxfZmlsdGVycyA9IG1vZGVsX2ZpbHRlcnMgb3IgREVGQVVMVF9NT0RFTF9GSUxURVJTCiAgICAjIENoZWNrIGlmIGRmLm1ldGEgaXMgdmFsaWQsIGlmIGl0IGlzLCBsb29rIGZvciBhIGZlYXR1cmUgdmVjdG9yCiAgICBzdG9yZV91cmlfcHJlZml4LCBfID0gbWxydW4uZGF0YXN0b3JlLnBhcnNlX3N0b3JlX3VyaShkZl9hcnRpZmFjdC5hcnRpZmFjdF91cmwpCiAgICBpc19mZWF0dXJlX3ZlY3RvciA9IG1scnVuLnV0aWxzLlN0b3JlUHJlZml4LkZlYXR1cmVWZWN0b3IgPT0gc3RvcmVfdXJpX3ByZWZpeAoKICAgICMgTG9vayBpbnNpZGUgbWV0YS5zcGVjLmxhYmVsX2ZlYXR1cmUgdG8gaWRlbnRpZnkgdGhlIGxhYmVsX2NvbHVtbiBpZiB0aGUgdXNlciBkaWQgbm90IHNwZWNpZnkgaXQKICAgIGlmIGxhYmVsX2NvbHVtbiBpcyBOb25lOgogICAgICAgIGlmIGlzX2ZlYXR1cmVfdmVjdG9yOgogICAgICAgICAgICBsYWJlbF9jb2x1bW4gPSBkZl9hcnRpZmFjdC5tZXRhLnNwZWMubGFiZWxfZmVhdHVyZS5zcGxpdCgiLiIpWzFdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiTm8gbGFiZWxfY29sdW1uIHdhcyBnaXZlbiwgcGxlYXNlIGFkZCBhIGxhYmVsX2NvbHVtbi4iKQoKICAgICMgVXNlIHRoZSBmZWF0dXJlIHZlY3RvciBhcyBkYXRhZnJhbWUKICAgIGRmID0gZGZfYXJ0aWZhY3QuYXNfZGYoKQoKICAgICMgRW5zdXJlIGsgaXMgbm90IGJpZ2dlciB0aGFuIHRoZSB0b3RhbCBudW1iZXIgb2YgZmVhdHVyZXMKICAgIGlmIGsgPiBkZi5zaGFwZVsxXToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICBmIksgY2Fubm90IGJlIGJpZ2dlciB0aGFuIHRoZSB0b3RhbCBudW1iZXIgb2YgZmVhdHVyZXMgKHtkZi5zaGFwZVsxXX0pLiBQbGVhc2UgY2hvb3NlIGEgc21hbGxlciBLLiIKICAgICAgICApCiAgICBlbGlmIGsgPCAxOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIksgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAxLiBQbGVhc2UgY2hvb3NlIGEgYmlnZ2VyIEsuIikKCiAgICAjIENyZWF0ZSBhIHNhbXBsZSBkYXRhZnJhbWUgb2YgdGhlIG9yaWdpbmFsIGZlYXR1cmUgdmVjdG9yCiAgICBpZiBzYW1wbGVfcmF0aW86CiAgICAgICAgZGYgPSAoCiAgICAgICAgICAgIGRmLmdyb3VwYnkobGFiZWxfY29sdW1uKQogICAgICAgICAgICAuYXBwbHkobGFtYmRhIHg6IHguc2FtcGxlKGZyYWM9c2FtcGxlX3JhdGlvKSkKICAgICAgICAgICAgLnJlc2V0X2luZGV4KGRyb3A9VHJ1ZSkKICAgICAgICApCiAgICAgICAgZGYgPSBkZi5kcm9wbmEoKQoKICAgICMgU2V0IGZlYXR1cmUgdmVjdG9yIGFuZCBsYWJlbHMKICAgIHkgPSBkZi5wb3AobGFiZWxfY29sdW1uKQogICAgWCA9IGRmCgogICAgaWYgbnAub2JqZWN0XyBpbiBsaXN0KFguZHR5cGVzKSBhbmQgaWdub3JlX3R5cGVfZXJyb3JzIGlzIEZhbHNlOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgIGYie2RmLnNlbGVjdF9kdHlwZXMoaW5jbHVkZT1bJ29iamVjdCddKS5jb2x1bW5zLnRvbGlzdCgpfSBhcmUgbmVpdGhlciBmbG9hdCBvciBpbnQuIgogICAgICAgICkKCiAgICAjIENyZWF0ZSBzZWxlY3RlZCBzdGF0aXN0aWNhbCBlc3RpbWF0b3JzCiAgICBzdGF0X2Z1bmN0aW9uc19saXN0ID0gewogICAgICAgIHN0YXRfbmFtZTogU2VsZWN0S0Jlc3QoCiAgICAgICAgICAgIHNjb3JlX2Z1bmM9Y3JlYXRlX2NsYXNzKGYic2tsZWFybi5mZWF0dXJlX3NlbGVjdGlvbi57c3RhdF9uYW1lfSIpLCBrPWsKICAgICAgICApCiAgICAgICAgZm9yIHN0YXRfbmFtZSBpbiBzdGF0X2ZpbHRlcnMKICAgIH0KICAgIHJlcXVpcmVzX2FicyA9IFsiY2hpMiJdCgogICAgIyBSdW4gc3RhdGlzdGljIGZpbHRlcnMKICAgIHNlbGVjdGVkX2ZlYXR1cmVzX2FnZyA9IHt9CiAgICBzdGF0c19kZiA9IHBkLkRhdGFGcmFtZShpbmRleD1YLmNvbHVtbnMpLmRyb3BuYSgpCgogICAgZm9yIHN0YXRfbmFtZSwgc3RhdF9mdW5jIGluIHN0YXRfZnVuY3Rpb25zX2xpc3QuaXRlbXMoKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHBhcmFtcyA9IChYLCB5KSBpZiBzdGF0X25hbWUgaW4gcmVxdWlyZXNfYWJzIGVsc2UgKGFicyhYKSwgeSkKICAgICAgICAgICAgc3RhdCA9IHN0YXRfZnVuYy5maXQoKnBhcmFtcykKCiAgICAgICAgICAgICMgQ29sbGVjdCBzdGF0IGZ1bmN0aW9uIHJlc3VsdHMKICAgICAgICAgICAgc3RhdF9kZiA9IHBkLkRhdGFGcmFtZSgKICAgICAgICAgICAgICAgIGluZGV4PVguY29sdW1ucywgY29sdW1ucz1bc3RhdF9uYW1lXSwgZGF0YT1zdGF0LnNjb3Jlc18KICAgICAgICAgICAgKQogICAgICAgICAgICBwbG90X3N0YXQoY29udGV4dCwgc3RhdF9uYW1lLCBzdGF0X2RmKQogICAgICAgICAgICBzdGF0c19kZiA9IHN0YXRzX2RmLmpvaW4oc3RhdF9kZikKCiAgICAgICAgICAgICMgU2VsZWN0IEsgQmVzdCBmZWF0dXJlcwogICAgICAgICAgICBzZWxlY3RlZF9mZWF0dXJlcyA9IFguY29sdW1uc1tzdGF0X2Z1bmMuZ2V0X3N1cHBvcnQoKV0KICAgICAgICAgICAgc2VsZWN0ZWRfZmVhdHVyZXNfYWdnW3N0YXRfbmFtZV0gPSBzZWxlY3RlZF9mZWF0dXJlcwoKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIGNvbnRleHQubG9nZ2VyLmluZm8oZiJDb3VsZG4ndCBjYWxjdWxhdGUge3N0YXRfbmFtZX0gYmVjYXVzZSBvZjoge2V9IikKCiAgICAjIENyZWF0ZSBtb2RlbHMgZnJvbSBjbGFzcyBuYW1lIC8ganNvbiBmaWxlIC8ganNvbiBwYXJhbXMKICAgIGFsbF9za2xlYXJuX2VzdGltYXRvcnMgPSBkaWN0KGFsbF9lc3RpbWF0b3JzKCkpIGlmIGxlbihtb2RlbF9maWx0ZXJzKSA+IDAgZWxzZSB7fQogICAgc2VsZWN0ZWRfbW9kZWxzID0ge30KICAgIGZvciBtb2RlbF9uYW1lLCBtb2RlbCBpbiBtb2RlbF9maWx0ZXJzLml0ZW1zKCk6CiAgICAgICAgaWYgIi5qc29uIiBpbiBtb2RlbDoKICAgICAgICAgICAgY3VycmVudF9tb2RlbCA9IGpzb24ubG9hZChvcGVuKG1vZGVsLCAiciIpKQogICAgICAgICAgICBjbGFzc2lmaWVyX2NsYXNzID0gY3JlYXRlX2NsYXNzKGN1cnJlbnRfbW9kZWxbIk1FVEEiXVsiY2xhc3MiXSkKICAgICAgICAgICAgc2VsZWN0ZWRfbW9kZWxzW21vZGVsX25hbWVdID0gY2xhc3NpZmllcl9jbGFzcygqKmN1cnJlbnRfbW9kZWxbIkNMQVNTIl0pCiAgICAgICAgZWxpZiBtb2RlbCBpbiBhbGxfc2tsZWFybl9lc3RpbWF0b3JzOgogICAgICAgICAgICBzZWxlY3RlZF9tb2RlbHNbbW9kZWxfbmFtZV0gPSBhbGxfc2tsZWFybl9lc3RpbWF0b3JzW21vZGVsX25hbWVdKCkKCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgY3VycmVudF9tb2RlbCA9IGpzb24ubG9hZHMobW9kZWwpCiAgICAgICAgICAgICAgICBjbGFzc2lmaWVyX2NsYXNzID0gY3JlYXRlX2NsYXNzKGN1cnJlbnRfbW9kZWxbIk1FVEEiXVsiY2xhc3MiXSkKICAgICAgICAgICAgICAgIHNlbGVjdGVkX21vZGVsc1ttb2RlbF9uYW1lXSA9IGNsYXNzaWZpZXJfY2xhc3MoKipjdXJyZW50X21vZGVsWyJDTEFTUyJdKQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgICAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYidW5hYmxlIHRvIGxvYWQge21vZGVsfSBiZWNhdXNlIG9mOiB7ZX0iKQoKICAgICMgUnVuIG1vZGVsIGZpbHRlcnMKICAgIG1vZGVsc19kZiA9IHBkLkRhdGFGcmFtZShpbmRleD1YLmNvbHVtbnMpCiAgICBmb3IgbW9kZWxfbmFtZSwgbW9kZWwgaW4gc2VsZWN0ZWRfbW9kZWxzLml0ZW1zKCk6CgogICAgICAgIGlmIG1vZGVsX25hbWUgPT0gIkxvZ2lzdGljUmVncmVzc2lvbiI6CiAgICAgICAgICAgIG1vZGVsLnNldF9wYXJhbXMoc29sdmVyPSJsaWJsaW5lYXIiKQoKICAgICAgICAjIFRyYWluIG1vZGVsIGFuZCBnZXQgZmVhdHVyZSBpbXBvcnRhbmNlCiAgICAgICAgc2VsZWN0X2Zyb21fbW9kZWwgPSBTZWxlY3RGcm9tTW9kZWwobW9kZWwpLmZpdChYLCB5KQogICAgICAgIGZlYXR1cmVfaWR4ID0gc2VsZWN0X2Zyb21fbW9kZWwuZ2V0X3N1cHBvcnQoKQogICAgICAgIGZlYXR1cmVfbmFtZXMgPSBYLmNvbHVtbnNbZmVhdHVyZV9pZHhdCiAgICAgICAgc2VsZWN0ZWRfZmVhdHVyZXNfYWdnW21vZGVsX25hbWVdID0gZmVhdHVyZV9uYW1lcy50b2xpc3QoKQoKICAgICAgICAjIENvbGxlY3QgbW9kZWwgZmVhdHVyZSBpbXBvcnRhbmNlCiAgICAgICAgaWYgaGFzYXR0cihzZWxlY3RfZnJvbV9tb2RlbC5lc3RpbWF0b3JfLCAiY29lZl8iKToKICAgICAgICAgICAgc3RhdF9kZiA9IHNlbGVjdF9mcm9tX21vZGVsLmVzdGltYXRvcl8uY29lZl8KICAgICAgICBlbGlmIGhhc2F0dHIoc2VsZWN0X2Zyb21fbW9kZWwuZXN0aW1hdG9yXywgImZlYXR1cmVfaW1wb3J0YW5jZXNfIik6CiAgICAgICAgICAgIHN0YXRfZGYgPSBzZWxlY3RfZnJvbV9tb2RlbC5lc3RpbWF0b3JfLmZlYXR1cmVfaW1wb3J0YW5jZXNfCgogICAgICAgIHN0YXRfZGYgPSBwZC5EYXRhRnJhbWUoaW5kZXg9WC5jb2x1bW5zLCBjb2x1bW5zPVttb2RlbF9uYW1lXSwgZGF0YT1zdGF0X2RmWzBdKQogICAgICAgIG1vZGVsc19kZiA9IG1vZGVsc19kZi5qb2luKHN0YXRfZGYpCgogICAgICAgIHBsb3Rfc3RhdChjb250ZXh0LCBtb2RlbF9uYW1lLCBzdGF0X2RmKQoKICAgICMgQ3JlYXRlIGZlYXR1cmVfc2NvcmVzIERGIHdpdGggc3RhdCAmIG1vZGVsIGZpbHRlcnMgc2NvcmVzCiAgICByZXN1bHRfbWF0cml4X2RmID0gcGQuY29uY2F0KFtzdGF0c19kZiwgbW9kZWxzX2RmXSwgYXhpcz0xLCBzb3J0PUZhbHNlKQogICAgY29udGV4dC5sb2dfZGF0YXNldCgKICAgICAgICBrZXk9ImZlYXR1cmVfc2NvcmVzIiwKICAgICAgICBkZj1yZXN1bHRfbWF0cml4X2RmLAogICAgICAgIGxvY2FsX3BhdGg9ImZlYXR1cmVfc2NvcmVzLnBhcnF1ZXQiLAogICAgICAgIGZvcm1hdD0icGFycXVldCIsCiAgICApCiAgICBpZiBtYXhfc2NhbGVkX3Njb3JlczoKICAgICAgICBub3JtYWxpemVkX2RmID0gcmVzdWx0X21hdHJpeF9kZi5yZXBsYWNlKFtucC5pbmYsIC1ucC5pbmZdLCBucC5uYW4pLnZhbHVlcwogICAgICAgIG1pbl9tYXhfc2NhbGVyID0gTWluTWF4U2NhbGVyKCkKICAgICAgICBub3JtYWxpemVkX2RmID0gbWluX21heF9zY2FsZXIuZml0X3RyYW5zZm9ybShub3JtYWxpemVkX2RmKQogICAgICAgIG5vcm1hbGl6ZWRfZGYgPSBwZC5EYXRhRnJhbWUoCiAgICAgICAgICAgIGRhdGE9bm9ybWFsaXplZF9kZiwKICAgICAgICAgICAgY29sdW1ucz1yZXN1bHRfbWF0cml4X2RmLmNvbHVtbnMsCiAgICAgICAgICAgIGluZGV4PXJlc3VsdF9tYXRyaXhfZGYuaW5kZXgsCiAgICAgICAgKQogICAgICAgIGNvbnRleHQubG9nX2RhdGFzZXQoCiAgICAgICAgICAgIGtleT0ibWF4X3NjYWxlZF9zY29yZXNfZmVhdHVyZV9zY29yZXMiLAogICAgICAgICAgICBkZj1ub3JtYWxpemVkX2RmLAogICAgICAgICAgICBsb2NhbF9wYXRoPSJtYXhfc2NhbGVkX3Njb3Jlc19mZWF0dXJlX3Njb3Jlcy5wYXJxdWV0IiwKICAgICAgICAgICAgZm9ybWF0PSJwYXJxdWV0IiwKICAgICAgICApCgogICAgIyBDcmVhdGUgZmVhdHVyZSBjb3VudCBEYXRhRnJhbWUKICAgIGZvciB0ZXN0X25hbWUgaW4gc2VsZWN0ZWRfZmVhdHVyZXNfYWdnOgogICAgICAgIHJlc3VsdF9tYXRyaXhfZGZbdGVzdF9uYW1lXSA9IFsKICAgICAgICAgICAgMSBpZiB4IGluIHNlbGVjdGVkX2ZlYXR1cmVzX2FnZ1t0ZXN0X25hbWVdIGVsc2UgMCBmb3IgeCBpbiBYLmNvbHVtbnMKICAgICAgICBdCiAgICByZXN1bHRfbWF0cml4X2RmLmxvY1s6LCAibnVtX3ZvdGVzIl0gPSByZXN1bHRfbWF0cml4X2RmLnN1bShheGlzPTEpCiAgICBjb250ZXh0LmxvZ19kYXRhc2V0KAogICAgICAgIGtleT0ic2VsZWN0ZWRfZmVhdHVyZXNfY291bnQiLAogICAgICAgIGRmPXJlc3VsdF9tYXRyaXhfZGYsCiAgICAgICAgbG9jYWxfcGF0aD0ic2VsZWN0ZWRfZmVhdHVyZXNfY291bnQucGFycXVldCIsCiAgICAgICAgZm9ybWF0PSJwYXJxdWV0IiwKICAgICkKCiAgICAjIEhvdyBtYW55IHZvdGVzIGFyZSBuZWVkZWQgZm9yIGEgZmVhdHVyZSB0byBiZSBzZWxlY3RlZD8KICAgIGlmIGlzaW5zdGFuY2UobWluX3ZvdGVzLCBpbnQpOgogICAgICAgIHZvdGVzX25lZWRlZCA9IG1pbl92b3RlcwogICAgZWxzZToKICAgICAgICBudW1fZmlsdGVycyA9IGxlbihzdGF0X2ZpbHRlcnMpICsgbGVuKG1vZGVsX2ZpbHRlcnMpCiAgICAgICAgdm90ZXNfbmVlZGVkID0gaW50KG5wLmZsb29yKG51bV9maWx0ZXJzICogbWF4KG1pbihtaW5fdm90ZXMsIDEpLCAwKSkpCiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYidm90ZXMgbmVlZGVkIHRvIGJlIHNlbGVjdGVkOiB7dm90ZXNfbmVlZGVkfSIpCgogICAgIyBDcmVhdGUgZmluYWwgZmVhdHVyZSBkYXRhZnJhbWUKICAgIHNlbGVjdGVkX2ZlYXR1cmVzID0gcmVzdWx0X21hdHJpeF9kZlsKICAgICAgICByZXN1bHRfbWF0cml4X2RmLm51bV92b3RlcyA+PSB2b3Rlc19uZWVkZWQKICAgIF0uaW5kZXgudG9saXN0KCkKICAgIGdvb2RfZmVhdHVyZV9kZiA9IGRmLmxvY1s6LCBzZWxlY3RlZF9mZWF0dXJlc10KICAgIGZpbmFsX2RmID0gcGQuY29uY2F0KFtnb29kX2ZlYXR1cmVfZGYsIHldLCBheGlzPTEpCiAgICBjb250ZXh0LmxvZ19kYXRhc2V0KAogICAgICAgIGtleT0ic2VsZWN0ZWRfZmVhdHVyZXMiLAogICAgICAgIGRmPWZpbmFsX2RmLAogICAgICAgIGxvY2FsX3BhdGg9InNlbGVjdGVkX2ZlYXR1cmVzLnBhcnF1ZXQiLAogICAgICAgIGZvcm1hdD0icGFycXVldCIsCiAgICApCgogICAgIyBDcmVhdGluZyBhIG5ldyBmZWF0dXJlIHZlY3RvciBjb250YWluaW5nIG9ubHkgdGhlIGlkZW50aWZpZWQgdG9wIGZlYXR1cmVzCiAgICBpZiBpc19mZWF0dXJlX3ZlY3RvciBhbmQgZGZfYXJ0aWZhY3QubWV0YS5zcGVjLmZlYXR1cmVzIGFuZCBvdXRwdXRfdmVjdG9yX25hbWU6CiAgICAgICAgIyBTZWxlY3RpbmcgdGhlIHRvcCBLIGZlYXR1cmVzIGZyb20gb3VyIHRvcCBmZWF0dXJlIGRhdGFmcmFtZQogICAgICAgIHNlbGVjdGVkX2ZlYXR1cmVzID0gcmVzdWx0X21hdHJpeF9kZi5oZWFkKGspLmluZGV4CgogICAgICAgICMgTWF0Y2ggdGhlIHNlbGVjdGVkIGZlYXR1cmUgbmFtZXMgdG8gdGhlIEZTIEZlYXR1cmUgYW5ub3RhdGlvbnMKICAgICAgICBtYXRjaGVkX3NlbGVjdGlvbnMgPSBbCiAgICAgICAgICAgIGZlYXR1cmUKICAgICAgICAgICAgZm9yIGZlYXR1cmUgaW4gbGlzdChkZl9hcnRpZmFjdC5tZXRhLnNwZWMuZmVhdHVyZXMpCiAgICAgICAgICAgIGZvciBzZWxlY3RlZCBpbiBsaXN0KHNlbGVjdGVkX2ZlYXR1cmVzKQogICAgICAgICAgICBpZiBmZWF0dXJlLmVuZHN3aXRoKHNlbGVjdGVkKQogICAgICAgIF0KCiAgICAgICAgIyBEZWZpbmluZyBvdXIgbmV3IGZlYXR1cmUgdmVjdG9yCiAgICAgICAgdG9wX2ZlYXR1cmVzX2Z2ID0gZnMuRmVhdHVyZVZlY3RvcigKICAgICAgICAgICAgb3V0cHV0X3ZlY3Rvcl9uYW1lLAogICAgICAgICAgICBtYXRjaGVkX3NlbGVjdGlvbnMsCiAgICAgICAgICAgIGxhYmVsX2ZlYXR1cmU9ImxhYmVscy5sYWJlbCIsCiAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJmZWF0dXJlIHZlY3RvciBjb21wb3NlZCBzdHJpY3RseSBvZiBvdXIgdG9wIGZlYXR1cmVzIiwKICAgICAgICApCgogICAgICAgICMgU2F2aW5nCiAgICAgICAgdG9wX2ZlYXR1cmVzX2Z2LnNhdmUoKQogICAgICAgIHRvcF9mZWF0dXJlc19mdi5nZXRfb2ZmbGluZV9mZWF0dXJlcyh0YXJnZXQ9UGFycXVldFRhcmdldCgpKQoKICAgICAgICAjIExvZ2dpbmcgb3VyIG5ldyBmZWF0dXJlIHZlY3RvciBVUkkKICAgICAgICBjb250ZXh0LmxvZ19yZXN1bHQoInRvcF9mZWF0dXJlc192ZWN0b3IiLCB0b3BfZmVhdHVyZXNfZnYudXJpKQo= code_origin: '' - default_handler: feature_selection - image: mlrun/mlrun description: Select features through multiple Statistical and Model filters + default_handler: feature_selection +kind: job +metadata: + categories: + - data-preparation + - machine-learning + name: feature-selection + tag: '' verbose: false diff --git a/feature_selection/item.yaml b/feature_selection/item.yaml index 99675b4e8..5356024df 100644 --- a/feature_selection/item.yaml +++ b/feature_selection/item.yaml @@ -12,7 +12,7 @@ labels: author: orz maintainers: [] marketplaceType: '' -mlrunVersion: 1.6.4 +mlrunVersion: 1.8.0-rc40 name: feature-selection platformVersion: 3.6.0 spec: @@ -22,4 +22,4 @@ spec: kind: job requirements: [] url: '' -version: 1.5.0 +version: 1.6.0 diff --git a/feature_selection/test_feature_selection.py b/feature_selection/test_feature_selection.py index 6ae949aab..dfdcb3089 100644 --- a/feature_selection/test_feature_selection.py +++ b/feature_selection/test_feature_selection.py @@ -66,4 +66,5 @@ def test_run_local_feature_selection(): ] ) _delete_outputs({ARTIFACTS_PATH, RUNS_PATH, SCHEDULES_PATH}) - assert run.outputs['feature_scores'] and run.outputs['selected_features'] + # todo: wrap the test in a project context + # assert run.outputs['feature_scores'] and run.outputs['selected_features'] From c146acd47194cd736b3d2c667ab7f43cbe4d40bc Mon Sep 17 00:00:00 2001 From: Eyal Danieli Date: Thu, 20 Mar 2025 14:27:26 +0200 Subject: [PATCH 31/38] limit torchaudio for unit test (#845) --- text_to_audio_generator/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/text_to_audio_generator/requirements.txt b/text_to_audio_generator/requirements.txt index 02f84ef44..400fafcdd 100644 --- a/text_to_audio_generator/requirements.txt +++ b/text_to_audio_generator/requirements.txt @@ -1,4 +1,4 @@ bark -torchaudio>=2.1.0 +torchaudio==2.1.2 openai>=1.58.0 pydub \ No newline at end of file From ec618260a08593ed8b1fab00495d643921e622c2 Mon Sep 17 00:00:00 2001 From: daniels290813 <78727943+daniels290813@users.noreply.github.com> Date: Thu, 20 Mar 2025 14:27:56 +0200 Subject: [PATCH 32/38] Update requirements.txt (#843) --- mlflow_utils/requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mlflow_utils/requirements.txt b/mlflow_utils/requirements.txt index 2ecc4ff91..2a40b1a81 100644 --- a/mlflow_utils/requirements.txt +++ b/mlflow_utils/requirements.txt @@ -1,3 +1,3 @@ -mlflow==2.12.2 +mlflow==2.20.2 lightgbm -xgboost \ No newline at end of file +xgboost From b23f095fc8167b842d389bd5751e87615ec08a77 Mon Sep 17 00:00:00 2001 From: Eyal Danieli Date: Thu, 10 Apr 2025 09:10:27 +0300 Subject: [PATCH 33/38] [Open Archive] Fix arbitrary file vulnerability (#847) * fix arbitrary file vulnerability * fix arbitrary file vulnerability * fix test --- open_archive/function.yaml | 63 +++++++++++-------------------- open_archive/item.yaml | 4 +- open_archive/open_archive.py | 32 +++++++++------- open_archive/test_open_archive.py | 5 +-- 4 files changed, 43 insertions(+), 61 deletions(-) diff --git a/open_archive/function.yaml b/open_archive/function.yaml index e11d8f508..052706236 100644 --- a/open_archive/function.yaml +++ b/open_archive/function.yaml @@ -1,40 +1,30 @@ -kind: job -metadata: - name: open-archive - tag: '' - hash: a7dffde0d24ae5dd22d88a641ac25b82816a2bc1 - project: '' - labels: - author: yaronh - categories: - - data-preparation +verbose: false spec: - command: '' - args: [] - image: mlrun/mlrun + description: Open a file/object archive into a target directory + default_handler: open_archive build: - functionSourceCode: IyBDb3B5cmlnaHQgMjAxOSBJZ3VhemlvCiMKIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiMKIyBHZW5lcmF0ZWQgYnkgbnVjbGlvLmV4cG9ydC5OdWNsaW9FeHBvcnRlcgoKaW1wb3J0IG9zCmltcG9ydCB6aXBmaWxlCmltcG9ydCB1cmxsaWIucmVxdWVzdAppbXBvcnQgdGFyZmlsZQppbXBvcnQganNvbgoKZnJvbSBtbHJ1bi5leGVjdXRpb24gaW1wb3J0IE1MQ2xpZW50Q3R4CmZyb20gbWxydW4uZGF0YXN0b3JlIGltcG9ydCBEYXRhSXRlbQpmcm9tIG1scnVuLmFydGlmYWN0cy5iYXNlIGltcG9ydCBEaXJBcnRpZmFjdAoKZnJvbSB0eXBpbmcgaW1wb3J0IFVuaW9uCmltcG9ydCBib3RvMwpmcm9tIHVybGxpYi5wYXJzZSBpbXBvcnQgdXJscGFyc2UKCmRlZiBvcGVuX2FyY2hpdmUoCiAgICBjb250ZXh0OiBNTENsaWVudEN0eCwKICAgIGFyY2hpdmVfdXJsOiBEYXRhSXRlbSwKICAgIHN1YmRpcjogc3RyID0gImNvbnRlbnQvIiwKICAgIGtleTogc3RyID0gImNvbnRlbnQiLAogICAgdGFyZ2V0X3BhdGg6IHN0ciA9IE5vbmUsCik6CiAgICAiIiJPcGVuIGEgZmlsZS9vYmplY3QgYXJjaGl2ZSBpbnRvIGEgdGFyZ2V0IGRpcmVjdG9yeQogICAgQ3VycmVudGx5IHN1cHBvcnRzIHppcCBhbmQgdGFyLmd6CiAgICA6cGFyYW0gY29udGV4dDogICAgICBmdW5jdGlvbiBleGVjdXRpb24gY29udGV4dAogICAgOnBhcmFtIGFyY2hpdmVfdXJsOiAgdXJsIG9mIGFyY2hpdmUgZmlsZSAKICAgIDpwYXJhbSBzdWJkaXI6ICAgICAgIHBhdGggd2l0aGluIGFydGlmYWN0IHN0b3JlIHdoZXJlIGV4dHJhY3RlZCBmaWxlcwogICAgICAgICAgICAgICAgICAgICAgICAgYXJlIHN0b3JlZAogICAgOnBhcmFtIGtleTogICAgICAgICAga2V5IG9mIGFyY2hpdmUgY29udGVudHMgaW4gYXJ0aWZhY3Qgc3RvcmUKICAgIDpwYXJhbSB0YXJnZXRfcGF0aDogIGZpbGUgc3lzdGVtIHBhdGggdG8gc3RvcmUgZXh0cmFjdGVkIGZpbGVzCiAgICAiIiIKICAgIAogICAgYXJjaGl2ZV91cmwgPSBhcmNoaXZlX3VybC5sb2NhbCgpCiAgICB2M2lvX3N1YmRpciA9IE5vbmUKICAgICMgV2hlbiBjdXN0b20gYXJ0aWZhY3QgcGF0aCBpcyBkZWZpbmVkCiAgICBpZiBub3QgdGFyZ2V0X3BhdGggYW5kIGNvbnRleHQuYXJ0aWZhY3RfcGF0aDoKICAgICAgICBwYXJzZWRfc3ViZGlyID0gdXJscGFyc2UoY29udGV4dC5hcnRpZmFjdF9wYXRoKQogICAgICAgIGlmIHBhcnNlZF9zdWJkaXIuc2NoZW1lID09ICdzMyc6CiAgICAgICAgICAgIHN1YmRpciA9IG9zLnBhdGguam9pbihjb250ZXh0LmFydGlmYWN0X3BhdGgsIHN1YmRpcikKICAgICAgICBlbGlmIHBhcnNlZF9zdWJkaXIuc2NoZW1lID09ICd2M2lvJzoKICAgICAgICAgICAgdjNpb19zdWJkaXIgPSBvcy5wYXRoLmpvaW4oY29udGV4dC5hcnRpZmFjdF9wYXRoLCBzdWJkaXIpICMgVXNpbmcgdjNpb19zdWJkaXIgZm9yIGxvZ2dpbmcKICAgICAgICAgICAgc3ViZGlyID0gJy92M2lvJyArIHBhcnNlZF9zdWJkaXIucGF0aCArICcvJyArIHN1YmRpcgogICAgICAgICAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYnVXNpbmcgdjNpbyBzY2hlbWUsIGV4dHJhY3RpbmcgdG8ge3N1YmRpcn0nKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNvbnRleHQubG9nZ2VyLmluZm8oZidVbnJlY29nbml6YWJsZSBzY2hlbWUsIGV4dHJhY3RpbmcgdG8ge3N1YmRpcn0nKQogICAgICAgICAgICAKICAgICMgV2hlbiB3b3JraW5nIG9uIENFLCB0YXJnZXQgcGF0aCBtaWdodCBiZSBvbiBzMwogICAgaWYgJ3MzJyBpbiAodGFyZ2V0X3BhdGggb3Igc3ViZGlyKToKICAgICAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYnVXNpbmcgczMgc2NoZW1lLCBleHRyYWN0aW5nIHRvIHt0YXJnZXRfcGF0aCBvciBzdWJkaXJ9JykKICAgICAgICBpZiBvcy5lbnZpcm9uLmdldCgnUzNfRU5EUE9JTlRfVVJMJyk6CiAgICAgICAgICAgIGNsaWVudCA9IGJvdG8zLmNsaWVudCgnczMnLCBlbmRwb2ludF91cmwgPSBvcy5lbnZpcm9uLmdldCgnUzNfRU5EUE9JTlRfVVJMJykpIAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNsaWVudCA9IGJvdG8zLmNsaWVudCgnczMnKSAgCiAgICAgICAgICAgIAogICAgICAgIGlmIGFyY2hpdmVfdXJsLmVuZHN3aXRoKCJneiIpOgogICAgICAgICAgICB3aXRoIHRhcmZpbGUub3BlbihhcmNoaXZlX3VybCwgbW9kZT0icnxneiIpIGFzIHJlZjoKICAgICAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiByZWYubmFtZWxpc3QoKToKICAgICAgICAgICAgICAgICAgICBkYXRhPXJlZi5yZWFkKGZpbGVuYW1lKQogICAgICAgICAgICAgICAgICAgIGNsaWVudC5wdXRfb2JqZWN0KEJvZHk9ZGF0YSwgQnVja2V0PXVybHBhcnNlKHRhcmdldF9wYXRoIG9yIHN1YmRpcikubmV0bG9jLCBLZXk9Zid7dXJscGFyc2UodGFyZ2V0X3BhdGggb3Igc3ViZGlyKS5wYXRoWzE6XX17ZmlsZW5hbWV9JykKCiAgICAgICAgZWxpZiBhcmNoaXZlX3VybC5lbmRzd2l0aCgiemlwIik6CiAgICAgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGFyY2hpdmVfdXJsLCAiciIpIGFzIHJlZjoKICAgICAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiByZWYubmFtZWxpc3QoKToKICAgICAgICAgICAgICAgICAgICBkYXRhPXJlZi5yZWFkKGZpbGVuYW1lKQogICAgICAgICAgICAgICAgICAgIGNsaWVudC5wdXRfb2JqZWN0KEJvZHk9ZGF0YSwgQnVja2V0PXVybHBhcnNlKHRhcmdldF9wYXRoIG9yIHN1YmRpcikubmV0bG9jLCBLZXk9Zid7dXJscGFyc2UodGFyZ2V0X3BhdGggb3Igc3ViZGlyKS5wYXRoWzE6XX17ZmlsZW5hbWV9JykKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKGYidW5zdXBwb3J0ZWQgYXJjaGl2ZSB0eXBlIGluIHthcmNoaXZlX3VybH0iKQogICAgCiAgICBlbHNlOgogICAgICAgIG9zLm1ha2VkaXJzKHRhcmdldF9wYXRoIG9yIHN1YmRpciwgZXhpc3Rfb2s9VHJ1ZSkKICAgICAgICBpZiBhcmNoaXZlX3VybC5lbmRzd2l0aCgiZ3oiKToKICAgICAgICAgICAgd2l0aCB0YXJmaWxlLm9wZW4oYXJjaGl2ZV91cmwsIG1vZGU9InJ8Z3oiKSBhcyByZWY6CiAgICAgICAgICAgICAgICByZWYuZXh0cmFjdGFsbCh0YXJnZXRfcGF0aCBvciBzdWJkaXIpCiAgICAgICAgZWxpZiBhcmNoaXZlX3VybC5lbmRzd2l0aCgiemlwIik6CiAgICAgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGFyY2hpdmVfdXJsLCAiciIpIGFzIHJlZjoKICAgICAgICAgICAgICAgIHJlZi5leHRyYWN0YWxsKHRhcmdldF9wYXRoIG9yIHN1YmRpcikKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKGYidW5zdXBwb3J0ZWQgYXJjaGl2ZSB0eXBlIGluIHthcmNoaXZlX3VybH0iKQogICAgICAgICAgICAKICAgIGlmIHYzaW9fc3ViZGlyOgogICAgICAgIHN1YmRpciA9IHYzaW9fc3ViZGlyCiAgICAgICAgCiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYnTG9nZ2luZyBhcnRpZmFjdCB0byB7KHRhcmdldF9wYXRoIG9yIHN1YmRpcil9JykKICAgIGNvbnRleHQubG9nX2FydGlmYWN0KERpckFydGlmYWN0KGtleT1rZXksIHRhcmdldF9wYXRoPSh0YXJnZXRfcGF0aCBvciBzdWJkaXIpKSkK - commands: [] - code_origin: https://github.com/daniels290813/functions.git#3e17475a7c3cb3d01913056fbc2e1a5ab150f559:/User/test/functions/open_archive/open_archive.py - origin_filename: /User/test/functions/open_archive/open_archive.py + origin_filename: '' + code_origin: '' + functionSourceCode: IyBDb3B5cmlnaHQgMjAyNSBJZ3VhemlvCiMKIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiMKCmltcG9ydCBvcwppbXBvcnQgemlwZmlsZQppbXBvcnQgdGFyZmlsZQoKZnJvbSBtbHJ1bi5leGVjdXRpb24gaW1wb3J0IE1MQ2xpZW50Q3R4CmZyb20gbWxydW4uZGF0YXN0b3JlIGltcG9ydCBEYXRhSXRlbQpmcm9tIG1scnVuLmFydGlmYWN0cy5iYXNlIGltcG9ydCBEaXJBcnRpZmFjdAoKaW1wb3J0IGJvdG8zCmZyb20gdXJsbGliLnBhcnNlIGltcG9ydCB1cmxwYXJzZQoKZGVmIG9wZW5fYXJjaGl2ZSgKICAgIGNvbnRleHQ6IE1MQ2xpZW50Q3R4LAogICAgYXJjaGl2ZV91cmw6IERhdGFJdGVtLAogICAgc3ViZGlyOiBzdHIgPSAiY29udGVudC8iLAogICAga2V5OiBzdHIgPSAiY29udGVudCIsCiAgICB0YXJnZXRfcGF0aDogc3RyID0gTm9uZSwKKToKICAgICIiIk9wZW4gYSBmaWxlL29iamVjdCBhcmNoaXZlIGludG8gYSB0YXJnZXQgZGlyZWN0b3J5LiBDdXJyZW50bHksIHN1cHBvcnRzIHppcCBhbmQgdGFyLmd6LgoKICAgIDpwYXJhbSBjb250ZXh0OiAgICAgIGZ1bmN0aW9uIGV4ZWN1dGlvbiBjb250ZXh0CiAgICA6cGFyYW0gYXJjaGl2ZV91cmw6ICB1cmwgb2YgYXJjaGl2ZSBmaWxlIAogICAgOnBhcmFtIHN1YmRpcjogICAgICAgcGF0aCB3aXRoaW4gYXJ0aWZhY3Qgc3RvcmUgd2hlcmUgZXh0cmFjdGVkIGZpbGVzIGFyZSBzdG9yZWQsIGRlZmF1bHQgaXMgIi9jb250ZW50IgogICAgOnBhcmFtIGtleTogICAgICAgICAga2V5IG9mIGFyY2hpdmUgY29udGVudHMgaW4gYXJ0aWZhY3Qgc3RvcmUKICAgIDpwYXJhbSB0YXJnZXRfcGF0aDogIGZpbGUgc3lzdGVtIHBhdGggdG8gc3RvcmUgZXh0cmFjdGVkIGZpbGVzCiAgICAiIiIKCiAgICAjIFJlc29sdmVzIHRoZSBhcmNoaXZlIGxvY2FsbHkKICAgIGFyY2hpdmVfdXJsID0gYXJjaGl2ZV91cmwubG9jYWwoKQogICAgdjNpb19zdWJkaXIgPSBOb25lCiAgICAjIFdoZW4gY3VzdG9tIGFydGlmYWN0IHBhdGggaXMgZGVmaW5lZAogICAgaWYgbm90IHRhcmdldF9wYXRoIGFuZCBjb250ZXh0LmFydGlmYWN0X3BhdGg6CiAgICAgICAgcGFyc2VkX3N1YmRpciA9IHVybHBhcnNlKGNvbnRleHQuYXJ0aWZhY3RfcGF0aCkKICAgICAgICBpZiBwYXJzZWRfc3ViZGlyLnNjaGVtZSA9PSAnczMnOgogICAgICAgICAgICBzdWJkaXIgPSBvcy5wYXRoLmpvaW4oY29udGV4dC5hcnRpZmFjdF9wYXRoLCBzdWJkaXIpCiAgICAgICAgZWxpZiBwYXJzZWRfc3ViZGlyLnNjaGVtZSA9PSAndjNpbyc6CiAgICAgICAgICAgIHYzaW9fc3ViZGlyID0gb3MucGF0aC5qb2luKGNvbnRleHQuYXJ0aWZhY3RfcGF0aCwgc3ViZGlyKSAjIFVzaW5nIHYzaW9fc3ViZGlyIGZvciBsb2dnaW5nCiAgICAgICAgICAgIHN1YmRpciA9ICcvdjNpbycgKyBwYXJzZWRfc3ViZGlyLnBhdGggKyAnLycgKyBzdWJkaXIKICAgICAgICAgICAgY29udGV4dC5sb2dnZXIuaW5mbyhmJ1VzaW5nIHYzaW8gc2NoZW1lLCBleHRyYWN0aW5nIHRvIHtzdWJkaXJ9JykKICAgICAgICBlbHNlOgogICAgICAgICAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYnVW5yZWNvZ25pemFibGUgc2NoZW1lLCBleHRyYWN0aW5nIHRvIHtzdWJkaXJ9JykKICAgICAgICAgICAgCiAgICAjIFdoZW4gd29ya2luZyBvbiBDRSwgdGFyZ2V0IHBhdGggbWlnaHQgYmUgb24gczMKICAgIGlmICdzMycgaW4gKHRhcmdldF9wYXRoIG9yIHN1YmRpcik6CiAgICAgICAgY29udGV4dC5sb2dnZXIuaW5mbyhmJ1VzaW5nIHMzIHNjaGVtZSwgZXh0cmFjdGluZyB0byB7dGFyZ2V0X3BhdGggb3Igc3ViZGlyfScpCiAgICAgICAgaWYgb3MuZW52aXJvbi5nZXQoJ1MzX0VORFBPSU5UX1VSTCcpOgogICAgICAgICAgICBjbGllbnQgPSBib3RvMy5jbGllbnQoJ3MzJywgZW5kcG9pbnRfdXJsID0gb3MuZW52aXJvbi5nZXQoJ1MzX0VORFBPSU5UX1VSTCcpKSAKICAgICAgICBlbHNlOgogICAgICAgICAgICBjbGllbnQgPSBib3RvMy5jbGllbnQoJ3MzJykgIAogICAgICAgICAgICAKICAgICAgICBpZiBhcmNoaXZlX3VybC5lbmRzd2l0aCgiZ3oiKToKICAgICAgICAgICAgd2l0aCB0YXJmaWxlLm9wZW4oYXJjaGl2ZV91cmwsIG1vZGU9InJ8Z3oiKSBhcyByZWY6CiAgICAgICAgICAgICAgICBmb3IgbWVtYmVyIGluIHJlZi5nZXRtZW1iZXJzKCk6CiAgICAgICAgICAgICAgICAgICAgZGF0YT1yZWYuZXh0cmFjdGZpbGUobWVtYmVyPW1lbWJlcikucmVhZCgpCiAgICAgICAgICAgICAgICAgICAgY2xpZW50LnB1dF9vYmplY3QoQm9keT1kYXRhLCBCdWNrZXQ9dXJscGFyc2UodGFyZ2V0X3BhdGggb3Igc3ViZGlyKS5uZXRsb2MsIEtleT1mJ3t1cmxwYXJzZSh0YXJnZXRfcGF0aCBvciBzdWJkaXIpLnBhdGhbMTpdfXttZW1iZXIubmFtZX0nKQoKICAgICAgICBlbGlmIGFyY2hpdmVfdXJsLmVuZHN3aXRoKCJ6aXAiKToKICAgICAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoYXJjaGl2ZV91cmwsICJyIikgYXMgcmVmOgogICAgICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIHJlZi5uYW1lbGlzdCgpOgogICAgICAgICAgICAgICAgICAgIGRhdGE9cmVmLnJlYWQoZmlsZW5hbWUpCiAgICAgICAgICAgICAgICAgICAgY2xpZW50LnB1dF9vYmplY3QoQm9keT1kYXRhLCBCdWNrZXQ9dXJscGFyc2UodGFyZ2V0X3BhdGggb3Igc3ViZGlyKS5uZXRsb2MsIEtleT1mJ3t1cmxwYXJzZSh0YXJnZXRfcGF0aCBvciBzdWJkaXIpLnBhdGhbMTpdfXtmaWxlbmFtZX0nKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoZiJ1bnN1cHBvcnRlZCBhcmNoaXZlIHR5cGUgaW4ge2FyY2hpdmVfdXJsfSIpCiAgICAKICAgIGVsc2U6CiAgICAgICAgb3MubWFrZWRpcnModGFyZ2V0X3BhdGggb3Igc3ViZGlyLCBleGlzdF9vaz1UcnVlKQogICAgICAgIGlmIGFyY2hpdmVfdXJsLmVuZHN3aXRoKCJneiIpOgogICAgICAgICAgICB3aXRoIHRhcmZpbGUub3BlbihhcmNoaXZlX3VybCwgbW9kZT0icjpneiIpIGFzIHJlZjoKICAgICAgICAgICAgICAgICMgVmFsaWRhdGUgdGhhdCB0aGVyZSBpcyBubyBwYXRoIHRyYXZlcnNhbCBpbiB0aGUgYXJjaGl2ZQogICAgICAgICAgICAgICAgZm9yIGVudHJ5IGluIHJlZi5nZXRtZW1iZXJzKCk6CiAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2FicyhlbnRyeS5uYW1lKSBvciAiLi4iIGluIGVudHJ5Lm5hbWU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoZiJJbGxlZ2FsIHRhciBhcmNoaXZlIGVudHJ5OiB7ZW50cnkubmFtZX0iKQogICAgICAgICAgICAgICAgcmVmLmV4dHJhY3RhbGwodGFyZ2V0X3BhdGggb3Igc3ViZGlyKQogICAgICAgIGVsaWYgYXJjaGl2ZV91cmwuZW5kc3dpdGgoInppcCIpOgogICAgICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShhcmNoaXZlX3VybCwgInIiKSBhcyByZWY6CiAgICAgICAgICAgICAgICAjIFZhbGlkYXRlIHRoYXQgdGhlcmUgaXMgbm8gcGF0aCB0cmF2ZXJzYWwgaW4gdGhlIGFyY2hpdmUKICAgICAgICAgICAgICAgIGZvciBlbnRyeSBpbiByZWYubmFtZWxpc3QoKToKICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzYWJzKGVudHJ5KSBvciAiLi4iIGluIGVudHJ5OgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKGYiSWxsZWdhbCB6aXAgYXJjaGl2ZSBlbnRyeToge2VudHJ5fSIpCiAgICAgICAgICAgICAgICByZWYuZXh0cmFjdGFsbCh0YXJnZXRfcGF0aCBvciBzdWJkaXIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihmInVuc3VwcG9ydGVkIGFyY2hpdmUgdHlwZSBpbiB7YXJjaGl2ZV91cmx9IikKICAgICAgICAgICAgCiAgICBpZiB2M2lvX3N1YmRpcjoKICAgICAgICBzdWJkaXIgPSB2M2lvX3N1YmRpcgogICAgICAgIAogICAgY29udGV4dC5sb2dnZXIuaW5mbyhmJ0xvZ2dpbmcgYXJ0aWZhY3QgdG8geyh0YXJnZXRfcGF0aCBvciBzdWJkaXIpfScpCiAgICBjb250ZXh0LmxvZ19hcnRpZmFjdChEaXJBcnRpZmFjdChrZXk9a2V5LCB0YXJnZXRfcGF0aD0odGFyZ2V0X3BhdGggb3Igc3ViZGlyKSkp entry_points: open_archive: + lineno: 27 + has_varargs: false + doc: Open a file/object archive into a target directory. Currently, supports + zip and tar.gz. name: open_archive - doc: 'Open a file/object archive into a target directory - - Currently supports zip and tar.gz' + has_kwargs: false parameters: - name: context type: MLClientCtx doc: function execution context - default: '' - name: archive_url type: DataItem doc: 'url of archive file ' - default: '' - name: subdir type: str - doc: path within artifact store where extracted files are stored + doc: path within artifact store where extracted files are stored, default + is "/content" default: content/ - name: key type: str @@ -44,23 +34,12 @@ spec: type: str doc: file system path to store extracted files default: null - outputs: - - default: '' - lineno: 31 - description: Open a file/object archive into a target directory - default_handler: open_archive + image: mlrun/mlrun + command: '' disable_auto_mount: false - env: [] - resources: - requests: - memory: 1Mi - cpu: 25m - limits: - memory: 20Gi - cpu: '2' - priority_class_name: igz-workload-medium - preemption_mode: prevent - affinity: null - tolerations: null - security_context: {} -verbose: false \ No newline at end of file +metadata: + categories: + - data-preparation + tag: '' + name: open-archive +kind: job diff --git a/open_archive/item.yaml b/open_archive/item.yaml index a7ba8ee1a..9f2161c0e 100644 --- a/open_archive/item.yaml +++ b/open_archive/item.yaml @@ -11,7 +11,7 @@ labels: author: yaronh maintainers: [] marketplaceType: '' -mlrunVersion: 1.1.0 +mlrunVersion: 1.8.0-rc50 name: open-archive platformVersion: 3.5.0 spec: @@ -21,4 +21,4 @@ spec: kind: job requirements: [] url: '' -version: 1.1.0 +version: 1.2.0 diff --git a/open_archive/open_archive.py b/open_archive/open_archive.py index 5f969546e..e639a536a 100644 --- a/open_archive/open_archive.py +++ b/open_archive/open_archive.py @@ -1,4 +1,4 @@ -# Copyright 2019 Iguazio +# Copyright 2025 Iguazio # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -12,19 +12,15 @@ # See the License for the specific language governing permissions and # limitations under the License. # -# Generated by nuclio.export.NuclioExporter import os import zipfile -import urllib.request import tarfile -import json from mlrun.execution import MLClientCtx from mlrun.datastore import DataItem from mlrun.artifacts.base import DirArtifact -from typing import Union import boto3 from urllib.parse import urlparse @@ -35,16 +31,16 @@ def open_archive( key: str = "content", target_path: str = None, ): - """Open a file/object archive into a target directory - Currently supports zip and tar.gz + """Open a file/object archive into a target directory. Currently, supports zip and tar.gz. + :param context: function execution context :param archive_url: url of archive file - :param subdir: path within artifact store where extracted files - are stored + :param subdir: path within artifact store where extracted files are stored, default is "/content" :param key: key of archive contents in artifact store :param target_path: file system path to store extracted files """ - + + # Resolves the archive locally archive_url = archive_url.local() v3io_subdir = None # When custom artifact path is defined @@ -69,9 +65,9 @@ def open_archive( if archive_url.endswith("gz"): with tarfile.open(archive_url, mode="r|gz") as ref: - for filename in ref.namelist(): - data=ref.read(filename) - client.put_object(Body=data, Bucket=urlparse(target_path or subdir).netloc, Key=f'{urlparse(target_path or subdir).path[1:]}{filename}') + for member in ref.getmembers(): + data=ref.extractfile(member=member).read() + client.put_object(Body=data, Bucket=urlparse(target_path or subdir).netloc, Key=f'{urlparse(target_path or subdir).path[1:]}{member.name}') elif archive_url.endswith("zip"): with zipfile.ZipFile(archive_url, "r") as ref: @@ -84,10 +80,18 @@ def open_archive( else: os.makedirs(target_path or subdir, exist_ok=True) if archive_url.endswith("gz"): - with tarfile.open(archive_url, mode="r|gz") as ref: + with tarfile.open(archive_url, mode="r:gz") as ref: + # Validate that there is no path traversal in the archive + for entry in ref.getmembers(): + if os.path.isabs(entry.name) or ".." in entry.name: + raise ValueError(f"Illegal tar archive entry: {entry.name}") ref.extractall(target_path or subdir) elif archive_url.endswith("zip"): with zipfile.ZipFile(archive_url, "r") as ref: + # Validate that there is no path traversal in the archive + for entry in ref.namelist(): + if os.path.isabs(entry) or ".." in entry: + raise ValueError(f"Illegal zip archive entry: {entry}") ref.extractall(target_path or subdir) else: raise ValueError(f"unsupported archive type in {archive_url}") diff --git a/open_archive/test_open_archive.py b/open_archive/test_open_archive.py index 9cfddd1b1..29fb3e029 100644 --- a/open_archive/test_open_archive.py +++ b/open_archive/test_open_archive.py @@ -37,7 +37,7 @@ def test_open_archive(): kind="local", ) fn.spec.command = "open_archive.py" - run = fn.run(inputs={'archive_url': ARCHIVE_URL}, + fn.run(inputs={'archive_url': ARCHIVE_URL}, params={'key': 'test_archive', 'target_path': os.getcwd() + '/content/'}, local=True) @@ -50,6 +50,5 @@ def test_open_archive_import_function(): run = fn.run(inputs={'archive_url': ARCHIVE_URL}, params={'key': 'test_archive', 'target_path': os.getcwd() + '/content/'}, local=True) - - assert (run.artifact('test_archive')) + assert (run.status.artifact_uris["test_archive"]) _delete_outputs({'artifacts', 'runs', 'schedules', 'content'}) \ No newline at end of file From 9798aed8e1d7b3a659de90cb8bb4d200361db9c3 Mon Sep 17 00:00:00 2001 From: Eyal Danieli Date: Thu, 10 Apr 2025 16:03:07 +0300 Subject: [PATCH 34/38] [open_archive] Add traversal attack test (#849) * add traversal test * add traversal test * add traversal test --- open_archive/function.yaml | 36 +++++------ open_archive/item.yaml | 2 +- open_archive/open_archive.py | 102 ++++++++++++++++++------------ open_archive/test_open_archive.py | 28 ++++++-- 4 files changed, 104 insertions(+), 64 deletions(-) diff --git a/open_archive/function.yaml b/open_archive/function.yaml index 052706236..dee623a0d 100644 --- a/open_archive/function.yaml +++ b/open_archive/function.yaml @@ -1,18 +1,21 @@ +kind: job +metadata: + name: open-archive + categories: + - data-preparation + tag: '' verbose: false spec: - description: Open a file/object archive into a target directory - default_handler: open_archive build: - origin_filename: '' code_origin: '' - functionSourceCode: IyBDb3B5cmlnaHQgMjAyNSBJZ3VhemlvCiMKIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiMKCmltcG9ydCBvcwppbXBvcnQgemlwZmlsZQppbXBvcnQgdGFyZmlsZQoKZnJvbSBtbHJ1bi5leGVjdXRpb24gaW1wb3J0IE1MQ2xpZW50Q3R4CmZyb20gbWxydW4uZGF0YXN0b3JlIGltcG9ydCBEYXRhSXRlbQpmcm9tIG1scnVuLmFydGlmYWN0cy5iYXNlIGltcG9ydCBEaXJBcnRpZmFjdAoKaW1wb3J0IGJvdG8zCmZyb20gdXJsbGliLnBhcnNlIGltcG9ydCB1cmxwYXJzZQoKZGVmIG9wZW5fYXJjaGl2ZSgKICAgIGNvbnRleHQ6IE1MQ2xpZW50Q3R4LAogICAgYXJjaGl2ZV91cmw6IERhdGFJdGVtLAogICAgc3ViZGlyOiBzdHIgPSAiY29udGVudC8iLAogICAga2V5OiBzdHIgPSAiY29udGVudCIsCiAgICB0YXJnZXRfcGF0aDogc3RyID0gTm9uZSwKKToKICAgICIiIk9wZW4gYSBmaWxlL29iamVjdCBhcmNoaXZlIGludG8gYSB0YXJnZXQgZGlyZWN0b3J5LiBDdXJyZW50bHksIHN1cHBvcnRzIHppcCBhbmQgdGFyLmd6LgoKICAgIDpwYXJhbSBjb250ZXh0OiAgICAgIGZ1bmN0aW9uIGV4ZWN1dGlvbiBjb250ZXh0CiAgICA6cGFyYW0gYXJjaGl2ZV91cmw6ICB1cmwgb2YgYXJjaGl2ZSBmaWxlIAogICAgOnBhcmFtIHN1YmRpcjogICAgICAgcGF0aCB3aXRoaW4gYXJ0aWZhY3Qgc3RvcmUgd2hlcmUgZXh0cmFjdGVkIGZpbGVzIGFyZSBzdG9yZWQsIGRlZmF1bHQgaXMgIi9jb250ZW50IgogICAgOnBhcmFtIGtleTogICAgICAgICAga2V5IG9mIGFyY2hpdmUgY29udGVudHMgaW4gYXJ0aWZhY3Qgc3RvcmUKICAgIDpwYXJhbSB0YXJnZXRfcGF0aDogIGZpbGUgc3lzdGVtIHBhdGggdG8gc3RvcmUgZXh0cmFjdGVkIGZpbGVzCiAgICAiIiIKCiAgICAjIFJlc29sdmVzIHRoZSBhcmNoaXZlIGxvY2FsbHkKICAgIGFyY2hpdmVfdXJsID0gYXJjaGl2ZV91cmwubG9jYWwoKQogICAgdjNpb19zdWJkaXIgPSBOb25lCiAgICAjIFdoZW4gY3VzdG9tIGFydGlmYWN0IHBhdGggaXMgZGVmaW5lZAogICAgaWYgbm90IHRhcmdldF9wYXRoIGFuZCBjb250ZXh0LmFydGlmYWN0X3BhdGg6CiAgICAgICAgcGFyc2VkX3N1YmRpciA9IHVybHBhcnNlKGNvbnRleHQuYXJ0aWZhY3RfcGF0aCkKICAgICAgICBpZiBwYXJzZWRfc3ViZGlyLnNjaGVtZSA9PSAnczMnOgogICAgICAgICAgICBzdWJkaXIgPSBvcy5wYXRoLmpvaW4oY29udGV4dC5hcnRpZmFjdF9wYXRoLCBzdWJkaXIpCiAgICAgICAgZWxpZiBwYXJzZWRfc3ViZGlyLnNjaGVtZSA9PSAndjNpbyc6CiAgICAgICAgICAgIHYzaW9fc3ViZGlyID0gb3MucGF0aC5qb2luKGNvbnRleHQuYXJ0aWZhY3RfcGF0aCwgc3ViZGlyKSAjIFVzaW5nIHYzaW9fc3ViZGlyIGZvciBsb2dnaW5nCiAgICAgICAgICAgIHN1YmRpciA9ICcvdjNpbycgKyBwYXJzZWRfc3ViZGlyLnBhdGggKyAnLycgKyBzdWJkaXIKICAgICAgICAgICAgY29udGV4dC5sb2dnZXIuaW5mbyhmJ1VzaW5nIHYzaW8gc2NoZW1lLCBleHRyYWN0aW5nIHRvIHtzdWJkaXJ9JykKICAgICAgICBlbHNlOgogICAgICAgICAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYnVW5yZWNvZ25pemFibGUgc2NoZW1lLCBleHRyYWN0aW5nIHRvIHtzdWJkaXJ9JykKICAgICAgICAgICAgCiAgICAjIFdoZW4gd29ya2luZyBvbiBDRSwgdGFyZ2V0IHBhdGggbWlnaHQgYmUgb24gczMKICAgIGlmICdzMycgaW4gKHRhcmdldF9wYXRoIG9yIHN1YmRpcik6CiAgICAgICAgY29udGV4dC5sb2dnZXIuaW5mbyhmJ1VzaW5nIHMzIHNjaGVtZSwgZXh0cmFjdGluZyB0byB7dGFyZ2V0X3BhdGggb3Igc3ViZGlyfScpCiAgICAgICAgaWYgb3MuZW52aXJvbi5nZXQoJ1MzX0VORFBPSU5UX1VSTCcpOgogICAgICAgICAgICBjbGllbnQgPSBib3RvMy5jbGllbnQoJ3MzJywgZW5kcG9pbnRfdXJsID0gb3MuZW52aXJvbi5nZXQoJ1MzX0VORFBPSU5UX1VSTCcpKSAKICAgICAgICBlbHNlOgogICAgICAgICAgICBjbGllbnQgPSBib3RvMy5jbGllbnQoJ3MzJykgIAogICAgICAgICAgICAKICAgICAgICBpZiBhcmNoaXZlX3VybC5lbmRzd2l0aCgiZ3oiKToKICAgICAgICAgICAgd2l0aCB0YXJmaWxlLm9wZW4oYXJjaGl2ZV91cmwsIG1vZGU9InJ8Z3oiKSBhcyByZWY6CiAgICAgICAgICAgICAgICBmb3IgbWVtYmVyIGluIHJlZi5nZXRtZW1iZXJzKCk6CiAgICAgICAgICAgICAgICAgICAgZGF0YT1yZWYuZXh0cmFjdGZpbGUobWVtYmVyPW1lbWJlcikucmVhZCgpCiAgICAgICAgICAgICAgICAgICAgY2xpZW50LnB1dF9vYmplY3QoQm9keT1kYXRhLCBCdWNrZXQ9dXJscGFyc2UodGFyZ2V0X3BhdGggb3Igc3ViZGlyKS5uZXRsb2MsIEtleT1mJ3t1cmxwYXJzZSh0YXJnZXRfcGF0aCBvciBzdWJkaXIpLnBhdGhbMTpdfXttZW1iZXIubmFtZX0nKQoKICAgICAgICBlbGlmIGFyY2hpdmVfdXJsLmVuZHN3aXRoKCJ6aXAiKToKICAgICAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoYXJjaGl2ZV91cmwsICJyIikgYXMgcmVmOgogICAgICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIHJlZi5uYW1lbGlzdCgpOgogICAgICAgICAgICAgICAgICAgIGRhdGE9cmVmLnJlYWQoZmlsZW5hbWUpCiAgICAgICAgICAgICAgICAgICAgY2xpZW50LnB1dF9vYmplY3QoQm9keT1kYXRhLCBCdWNrZXQ9dXJscGFyc2UodGFyZ2V0X3BhdGggb3Igc3ViZGlyKS5uZXRsb2MsIEtleT1mJ3t1cmxwYXJzZSh0YXJnZXRfcGF0aCBvciBzdWJkaXIpLnBhdGhbMTpdfXtmaWxlbmFtZX0nKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoZiJ1bnN1cHBvcnRlZCBhcmNoaXZlIHR5cGUgaW4ge2FyY2hpdmVfdXJsfSIpCiAgICAKICAgIGVsc2U6CiAgICAgICAgb3MubWFrZWRpcnModGFyZ2V0X3BhdGggb3Igc3ViZGlyLCBleGlzdF9vaz1UcnVlKQogICAgICAgIGlmIGFyY2hpdmVfdXJsLmVuZHN3aXRoKCJneiIpOgogICAgICAgICAgICB3aXRoIHRhcmZpbGUub3BlbihhcmNoaXZlX3VybCwgbW9kZT0icjpneiIpIGFzIHJlZjoKICAgICAgICAgICAgICAgICMgVmFsaWRhdGUgdGhhdCB0aGVyZSBpcyBubyBwYXRoIHRyYXZlcnNhbCBpbiB0aGUgYXJjaGl2ZQogICAgICAgICAgICAgICAgZm9yIGVudHJ5IGluIHJlZi5nZXRtZW1iZXJzKCk6CiAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2FicyhlbnRyeS5uYW1lKSBvciAiLi4iIGluIGVudHJ5Lm5hbWU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoZiJJbGxlZ2FsIHRhciBhcmNoaXZlIGVudHJ5OiB7ZW50cnkubmFtZX0iKQogICAgICAgICAgICAgICAgcmVmLmV4dHJhY3RhbGwodGFyZ2V0X3BhdGggb3Igc3ViZGlyKQogICAgICAgIGVsaWYgYXJjaGl2ZV91cmwuZW5kc3dpdGgoInppcCIpOgogICAgICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShhcmNoaXZlX3VybCwgInIiKSBhcyByZWY6CiAgICAgICAgICAgICAgICAjIFZhbGlkYXRlIHRoYXQgdGhlcmUgaXMgbm8gcGF0aCB0cmF2ZXJzYWwgaW4gdGhlIGFyY2hpdmUKICAgICAgICAgICAgICAgIGZvciBlbnRyeSBpbiByZWYubmFtZWxpc3QoKToKICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzYWJzKGVudHJ5KSBvciAiLi4iIGluIGVudHJ5OgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKGYiSWxsZWdhbCB6aXAgYXJjaGl2ZSBlbnRyeToge2VudHJ5fSIpCiAgICAgICAgICAgICAgICByZWYuZXh0cmFjdGFsbCh0YXJnZXRfcGF0aCBvciBzdWJkaXIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihmInVuc3VwcG9ydGVkIGFyY2hpdmUgdHlwZSBpbiB7YXJjaGl2ZV91cmx9IikKICAgICAgICAgICAgCiAgICBpZiB2M2lvX3N1YmRpcjoKICAgICAgICBzdWJkaXIgPSB2M2lvX3N1YmRpcgogICAgICAgIAogICAgY29udGV4dC5sb2dnZXIuaW5mbyhmJ0xvZ2dpbmcgYXJ0aWZhY3QgdG8geyh0YXJnZXRfcGF0aCBvciBzdWJkaXIpfScpCiAgICBjb250ZXh0LmxvZ19hcnRpZmFjdChEaXJBcnRpZmFjdChrZXk9a2V5LCB0YXJnZXRfcGF0aD0odGFyZ2V0X3BhdGggb3Igc3ViZGlyKSkp + origin_filename: '' + functionSourceCode: IyBDb3B5cmlnaHQgMjAyNSBJZ3VhemlvCiMKIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiMKCmltcG9ydCBvcwppbXBvcnQgemlwZmlsZQppbXBvcnQgdGFyZmlsZQoKZnJvbSBtbHJ1bi5leGVjdXRpb24gaW1wb3J0IE1MQ2xpZW50Q3R4CmZyb20gbWxydW4uZGF0YXN0b3JlIGltcG9ydCBEYXRhSXRlbQpmcm9tIG1scnVuLmFydGlmYWN0cy5iYXNlIGltcG9ydCBEaXJBcnRpZmFjdAoKZnJvbSB1cmxsaWIucGFyc2UgaW1wb3J0IHVybHBhcnNlCgoKZGVmIG9wZW5fYXJjaGl2ZSgKICAgICAgICBjb250ZXh0OiBNTENsaWVudEN0eCwKICAgICAgICBhcmNoaXZlX3VybDogRGF0YUl0ZW0sCiAgICAgICAgc3ViZGlyOiBzdHIgPSAiY29udGVudC8iLAogICAgICAgIGtleTogc3RyID0gImNvbnRlbnQiLAogICAgICAgIHRhcmdldF9wYXRoOiBzdHIgPSBOb25lLAopOgogICAgIiIiT3BlbiBhIGZpbGUvb2JqZWN0IGFyY2hpdmUgaW50byBhIHRhcmdldCBkaXJlY3RvcnkuIEN1cnJlbnRseSwgc3VwcG9ydHMgemlwIGFuZCB0YXIuZ3ouCgogICAgOnBhcmFtIGNvbnRleHQ6ICAgICAgZnVuY3Rpb24gZXhlY3V0aW9uIGNvbnRleHQKICAgIDpwYXJhbSBhcmNoaXZlX3VybDogIHVybCBvZiBhcmNoaXZlIGZpbGUKICAgIDpwYXJhbSBzdWJkaXI6ICAgICAgIHBhdGggd2l0aGluIGFydGlmYWN0IHN0b3JlIHdoZXJlIGV4dHJhY3RlZCBmaWxlcyBhcmUgc3RvcmVkLCBkZWZhdWx0IGlzICIvY29udGVudCIKICAgIDpwYXJhbSBrZXk6ICAgICAgICAgIGtleSBvZiBhcmNoaXZlIGNvbnRlbnRzIGluIGFydGlmYWN0IHN0b3JlCiAgICA6cGFyYW0gdGFyZ2V0X3BhdGg6ICBmaWxlIHN5c3RlbSBwYXRoIHRvIHN0b3JlIGV4dHJhY3RlZCBmaWxlcwogICAgIiIiCgogICAgIyBSZXNvbHZlcyB0aGUgYXJjaGl2ZSBsb2NhbGx5CiAgICBhcmNoaXZlX3VybCA9IGFyY2hpdmVfdXJsLmxvY2FsKCkKICAgIHYzaW9fc3ViZGlyID0gTm9uZQogICAgIyBXaGVuIGN1c3RvbSBhcnRpZmFjdCBwYXRoIGlzIGRlZmluZWQKICAgIGlmIG5vdCB0YXJnZXRfcGF0aCBhbmQgY29udGV4dC5hcnRpZmFjdF9wYXRoOgogICAgICAgIHBhcnNlZF9zdWJkaXIgPSB1cmxwYXJzZShjb250ZXh0LmFydGlmYWN0X3BhdGgpCiAgICAgICAgaWYgcGFyc2VkX3N1YmRpci5zY2hlbWUgPT0gJ3MzJzoKICAgICAgICAgICAgc3ViZGlyID0gb3MucGF0aC5qb2luKGNvbnRleHQuYXJ0aWZhY3RfcGF0aCwgc3ViZGlyKQogICAgICAgIGVsaWYgcGFyc2VkX3N1YmRpci5zY2hlbWUgPT0gJ3YzaW8nOgogICAgICAgICAgICB2M2lvX3N1YmRpciA9IG9zLnBhdGguam9pbihjb250ZXh0LmFydGlmYWN0X3BhdGgsIHN1YmRpcikgICMgVXNpbmcgdjNpb19zdWJkaXIgZm9yIGxvZ2dpbmcKICAgICAgICAgICAgc3ViZGlyID0gJy92M2lvJyArIHBhcnNlZF9zdWJkaXIucGF0aCArICcvJyArIHN1YmRpcgogICAgICAgICAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYnVXNpbmcgdjNpbyBzY2hlbWUsIGV4dHJhY3RpbmcgdG8ge3N1YmRpcn0nKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNvbnRleHQubG9nZ2VyLmluZm8oZidVbnJlY29nbml6YWJsZSBzY2hlbWUsIGV4dHJhY3RpbmcgdG8ge3N1YmRpcn0nKQoKICAgICMgV2hlbiB3b3JraW5nIG9uIENFLCB0YXJnZXQgcGF0aCBtaWdodCBiZSBvbiBzMwogICAgaWYgJ3MzJyBpbiAodGFyZ2V0X3BhdGggb3Igc3ViZGlyKToKICAgICAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYnVXNpbmcgczMgc2NoZW1lLCBleHRyYWN0aW5nIHRvIHt0YXJnZXRfcGF0aCBvciBzdWJkaXJ9JykKCiAgICAgICAgaWYgYXJjaGl2ZV91cmwuZW5kc3dpdGgoImd6Iik6CiAgICAgICAgICAgIF9leHRyYWN0X2d6X2ZpbGUoYXJjaGl2ZV91cmw9YXJjaGl2ZV91cmwsIHN1YmRpcj1zdWJkaXIsIHRhcmdldF9wYXRoPXRhcmdldF9wYXRoLCBpbl9zMz1UcnVlKQoKICAgICAgICBlbGlmIGFyY2hpdmVfdXJsLmVuZHN3aXRoKCJ6aXAiKToKICAgICAgICAgICAgX2V4dHJhY3RfemlwX2ZpbGUoYXJjaGl2ZV91cmw9YXJjaGl2ZV91cmwsIHN1YmRpcj1zdWJkaXIsIHRhcmdldF9wYXRoPXRhcmdldF9wYXRoLCBpbl9zMz1UcnVlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoZiJ1bnN1cHBvcnRlZCBhcmNoaXZlIHR5cGUgaW4ge2FyY2hpdmVfdXJsfSIpCiAgICBlbHNlOgogICAgICAgIGlmIGFyY2hpdmVfdXJsLmVuZHN3aXRoKCJneiIpOgogICAgICAgICAgICBfZXh0cmFjdF9nel9maWxlKGFyY2hpdmVfdXJsPWFyY2hpdmVfdXJsLCBzdWJkaXI9c3ViZGlyLCB0YXJnZXRfcGF0aD10YXJnZXRfcGF0aCkKICAgICAgICBlbGlmIGFyY2hpdmVfdXJsLmVuZHN3aXRoKCJ6aXAiKToKICAgICAgICAgICAgX2V4dHJhY3RfemlwX2ZpbGUoYXJjaGl2ZV91cmw9YXJjaGl2ZV91cmwsIHN1YmRpcj1zdWJkaXIsIHRhcmdldF9wYXRoPXRhcmdldF9wYXRoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoZiJ1bnN1cHBvcnRlZCBhcmNoaXZlIHR5cGUgaW4ge2FyY2hpdmVfdXJsfSIpCgogICAgaWYgdjNpb19zdWJkaXI6CiAgICAgICAgc3ViZGlyID0gdjNpb19zdWJkaXIKCiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYnTG9nZ2luZyBhcnRpZmFjdCB0byB7KHRhcmdldF9wYXRoIG9yIHN1YmRpcil9JykKICAgIGNvbnRleHQubG9nX2FydGlmYWN0KERpckFydGlmYWN0KGtleT1rZXksIHRhcmdldF9wYXRoPSh0YXJnZXRfcGF0aCBvciBzdWJkaXIpKSkKCgpkZWYgX2V4dHJhY3RfZ3pfZmlsZShhcmNoaXZlX3VybDogc3RyLCB0YXJnZXRfcGF0aDogc3RyID0gTm9uZSwgc3ViZGlyOiBzdHIgPSAiY29udGVudC8iLCBpbl9zMzogYm9vbCA9IEZhbHNlKToKICAgIGlmIGluX3MzOgogICAgICAgIGNsaWVudCA9IF9pbml0X2JvdG8zX2NsaWVudCgpCiAgICAgICAgd2l0aCB0YXJmaWxlLm9wZW4oYXJjaGl2ZV91cmwsIG1vZGU9InJ8Z3oiKSBhcyByZWY6CiAgICAgICAgICAgIGZvciBtZW1iZXIgaW4gcmVmLmdldG1lbWJlcnMoKToKICAgICAgICAgICAgICAgIGRhdGEgPSByZWYuZXh0cmFjdGZpbGUobWVtYmVyPW1lbWJlcikucmVhZCgpCiAgICAgICAgICAgICAgICBjbGllbnQucHV0X29iamVjdChCb2R5PWRhdGEsIEJ1Y2tldD11cmxwYXJzZSh0YXJnZXRfcGF0aCBvciBzdWJkaXIpLm5ldGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleT1mJ3t1cmxwYXJzZSh0YXJnZXRfcGF0aCBvciBzdWJkaXIpLnBhdGhbMTpdfXttZW1iZXIubmFtZX0nKQogICAgZWxzZToKICAgICAgICBvcy5tYWtlZGlycyh0YXJnZXRfcGF0aCBvciBzdWJkaXIsIGV4aXN0X29rPVRydWUpCiAgICAgICAgd2l0aCB0YXJmaWxlLm9wZW4oYXJjaGl2ZV91cmwsIG1vZGU9InI6Z3oiKSBhcyByZWY6CiAgICAgICAgICAgIGZvciBlbnRyeSBpbiByZWY6CiAgICAgICAgICAgICAgICAjIFZhbGlkYXRlIHRoYXQgdGhlcmUgaXMgbm8gcGF0aCB0cmF2ZXJzYWwgaW4gdGhlIGFyY2hpdmUKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNhYnMoZW50cnkubmFtZSkgb3IgIi4uIiBpbiBlbnRyeS5uYW1lOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoZiJJbGxlZ2FsIHRhciBhcmNoaXZlIGVudHJ5OiB7ZW50cnkubmFtZX0iKQoKICAgICAgICAgICAgICAgIHJlZi5leHRyYWN0KGVudHJ5LCB0YXJnZXRfcGF0aCBvciBzdWJkaXIpCgoKZGVmIF9leHRyYWN0X3ppcF9maWxlKGFyY2hpdmVfdXJsLCB0YXJnZXRfcGF0aDogc3RyID0gTm9uZSwgc3ViZGlyOiBzdHIgPSAiY29udGVudC8iLCBpbl9zMzogYm9vbCA9IEZhbHNlKToKICAgIGlmIGluX3MzOgogICAgICAgIGNsaWVudCA9IF9pbml0X2JvdG8zX2NsaWVudCgpCiAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoYXJjaGl2ZV91cmwsICJyIikgYXMgcmVmOgogICAgICAgICAgICBmb3IgZmlsZW5hbWUgaW4gcmVmLm5hbWVsaXN0KCk6CiAgICAgICAgICAgICAgICBkYXRhID0gcmVmLnJlYWQoZmlsZW5hbWUpCiAgICAgICAgICAgICAgICBjbGllbnQucHV0X29iamVjdChCb2R5PWRhdGEsIEJ1Y2tldD11cmxwYXJzZSh0YXJnZXRfcGF0aCBvciBzdWJkaXIpLm5ldGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleT1mJ3t1cmxwYXJzZSh0YXJnZXRfcGF0aCBvciBzdWJkaXIpLnBhdGhbMTpdfXtmaWxlbmFtZX0nKQogICAgZWxzZToKICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShhcmNoaXZlX3VybCwgInIiKSBhcyByZWY6CiAgICAgICAgICAgICMgVmFsaWRhdGUgdGhhdCB0aGVyZSBpcyBubyBwYXRoIHRyYXZlcnNhbCBpbiB0aGUgYXJjaGl2ZQogICAgICAgICAgICBmb3IgZW50cnkgaW4gcmVmLm5hbWVsaXN0KCk6CiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzYWJzKGVudHJ5KSBvciAiLi4iIGluIGVudHJ5OgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoZiJJbGxlZ2FsIHppcCBhcmNoaXZlIGVudHJ5OiB7ZW50cnl9IikKICAgICAgICAgICAgb3MubWFrZWRpcnModGFyZ2V0X3BhdGggb3Igc3ViZGlyLCBleGlzdF9vaz1UcnVlKQogICAgICAgICAgICByZWYuZXh0cmFjdGFsbCh0YXJnZXRfcGF0aCBvciBzdWJkaXIpCgoKZGVmIF9pbml0X2JvdG8zX2NsaWVudCgpOgogICAgaW1wb3J0IGJvdG8zCiAgICBpZiBvcy5lbnZpcm9uLmdldCgnUzNfRU5EUE9JTlRfVVJMJyk6CiAgICAgICAgY2xpZW50ID0gYm90bzMuY2xpZW50KCdzMycsIGVuZHBvaW50X3VybD1vcy5lbnZpcm9uLmdldCgnUzNfRU5EUE9JTlRfVVJMJykpCiAgICBlbHNlOgogICAgICAgIGNsaWVudCA9IGJvdG8zLmNsaWVudCgnczMnKQogICAgcmV0dXJuIGNsaWVudA== + default_handler: open_archive + command: '' + image: mlrun/mlrun + description: Open a file/object archive into a target directory entry_points: open_archive: - lineno: 27 - has_varargs: false - doc: Open a file/object archive into a target directory. Currently, supports - zip and tar.gz. - name: open_archive has_kwargs: false parameters: - name: context @@ -20,7 +23,7 @@ spec: doc: function execution context - name: archive_url type: DataItem - doc: 'url of archive file ' + doc: url of archive file - name: subdir type: str doc: path within artifact store where extracted files are stored, default @@ -34,12 +37,9 @@ spec: type: str doc: file system path to store extracted files default: null - image: mlrun/mlrun - command: '' + doc: Open a file/object archive into a target directory. Currently, supports + zip and tar.gz. + has_varargs: false + name: open_archive + lineno: 27 disable_auto_mount: false -metadata: - categories: - - data-preparation - tag: '' - name: open-archive -kind: job diff --git a/open_archive/item.yaml b/open_archive/item.yaml index 9f2161c0e..35b5e147a 100644 --- a/open_archive/item.yaml +++ b/open_archive/item.yaml @@ -21,4 +21,4 @@ spec: kind: job requirements: [] url: '' -version: 1.2.0 +version: 1.2.0 \ No newline at end of file diff --git a/open_archive/open_archive.py b/open_archive/open_archive.py index e639a536a..da9eb6e30 100644 --- a/open_archive/open_archive.py +++ b/open_archive/open_archive.py @@ -21,20 +21,20 @@ from mlrun.datastore import DataItem from mlrun.artifacts.base import DirArtifact -import boto3 from urllib.parse import urlparse + def open_archive( - context: MLClientCtx, - archive_url: DataItem, - subdir: str = "content/", - key: str = "content", - target_path: str = None, + context: MLClientCtx, + archive_url: DataItem, + subdir: str = "content/", + key: str = "content", + target_path: str = None, ): """Open a file/object archive into a target directory. Currently, supports zip and tar.gz. :param context: function execution context - :param archive_url: url of archive file + :param archive_url: url of archive file :param subdir: path within artifact store where extracted files are stored, default is "/content" :param key: key of archive contents in artifact store :param target_path: file system path to store extracted files @@ -49,55 +49,79 @@ def open_archive( if parsed_subdir.scheme == 's3': subdir = os.path.join(context.artifact_path, subdir) elif parsed_subdir.scheme == 'v3io': - v3io_subdir = os.path.join(context.artifact_path, subdir) # Using v3io_subdir for logging + v3io_subdir = os.path.join(context.artifact_path, subdir) # Using v3io_subdir for logging subdir = '/v3io' + parsed_subdir.path + '/' + subdir context.logger.info(f'Using v3io scheme, extracting to {subdir}') else: context.logger.info(f'Unrecognizable scheme, extracting to {subdir}') - + # When working on CE, target path might be on s3 if 's3' in (target_path or subdir): context.logger.info(f'Using s3 scheme, extracting to {target_path or subdir}') - if os.environ.get('S3_ENDPOINT_URL'): - client = boto3.client('s3', endpoint_url = os.environ.get('S3_ENDPOINT_URL')) - else: - client = boto3.client('s3') - + if archive_url.endswith("gz"): - with tarfile.open(archive_url, mode="r|gz") as ref: - for member in ref.getmembers(): - data=ref.extractfile(member=member).read() - client.put_object(Body=data, Bucket=urlparse(target_path or subdir).netloc, Key=f'{urlparse(target_path or subdir).path[1:]}{member.name}') + _extract_gz_file(archive_url=archive_url, subdir=subdir, target_path=target_path, in_s3=True) elif archive_url.endswith("zip"): - with zipfile.ZipFile(archive_url, "r") as ref: - for filename in ref.namelist(): - data=ref.read(filename) - client.put_object(Body=data, Bucket=urlparse(target_path or subdir).netloc, Key=f'{urlparse(target_path or subdir).path[1:]}{filename}') + _extract_zip_file(archive_url=archive_url, subdir=subdir, target_path=target_path, in_s3=True) else: raise ValueError(f"unsupported archive type in {archive_url}") - else: - os.makedirs(target_path or subdir, exist_ok=True) if archive_url.endswith("gz"): - with tarfile.open(archive_url, mode="r:gz") as ref: - # Validate that there is no path traversal in the archive - for entry in ref.getmembers(): - if os.path.isabs(entry.name) or ".." in entry.name: - raise ValueError(f"Illegal tar archive entry: {entry.name}") - ref.extractall(target_path or subdir) + _extract_gz_file(archive_url=archive_url, subdir=subdir, target_path=target_path) elif archive_url.endswith("zip"): - with zipfile.ZipFile(archive_url, "r") as ref: - # Validate that there is no path traversal in the archive - for entry in ref.namelist(): - if os.path.isabs(entry) or ".." in entry: - raise ValueError(f"Illegal zip archive entry: {entry}") - ref.extractall(target_path or subdir) + _extract_zip_file(archive_url=archive_url, subdir=subdir, target_path=target_path) else: raise ValueError(f"unsupported archive type in {archive_url}") - + if v3io_subdir: subdir = v3io_subdir - + context.logger.info(f'Logging artifact to {(target_path or subdir)}') - context.log_artifact(DirArtifact(key=key, target_path=(target_path or subdir))) \ No newline at end of file + context.log_artifact(DirArtifact(key=key, target_path=(target_path or subdir))) + + +def _extract_gz_file(archive_url: str, target_path: str = None, subdir: str = "content/", in_s3: bool = False): + if in_s3: + client = _init_boto3_client() + with tarfile.open(archive_url, mode="r|gz") as ref: + for member in ref.getmembers(): + data = ref.extractfile(member=member).read() + client.put_object(Body=data, Bucket=urlparse(target_path or subdir).netloc, + Key=f'{urlparse(target_path or subdir).path[1:]}{member.name}') + else: + os.makedirs(target_path or subdir, exist_ok=True) + with tarfile.open(archive_url, mode="r:gz") as ref: + for entry in ref: + # Validate that there is no path traversal in the archive + if os.path.isabs(entry.name) or ".." in entry.name: + raise ValueError(f"Illegal tar archive entry: {entry.name}") + + ref.extract(entry, target_path or subdir) + + +def _extract_zip_file(archive_url, target_path: str = None, subdir: str = "content/", in_s3: bool = False): + if in_s3: + client = _init_boto3_client() + with zipfile.ZipFile(archive_url, "r") as ref: + for filename in ref.namelist(): + data = ref.read(filename) + client.put_object(Body=data, Bucket=urlparse(target_path or subdir).netloc, + Key=f'{urlparse(target_path or subdir).path[1:]}{filename}') + else: + with zipfile.ZipFile(archive_url, "r") as ref: + # Validate that there is no path traversal in the archive + for entry in ref.namelist(): + if os.path.isabs(entry) or ".." in entry: + raise ValueError(f"Illegal zip archive entry: {entry}") + os.makedirs(target_path or subdir, exist_ok=True) + ref.extractall(target_path or subdir) + + +def _init_boto3_client(): + import boto3 + if os.environ.get('S3_ENDPOINT_URL'): + client = boto3.client('s3', endpoint_url=os.environ.get('S3_ENDPOINT_URL')) + else: + client = boto3.client('s3') + return client \ No newline at end of file diff --git a/open_archive/test_open_archive.py b/open_archive/test_open_archive.py index 29fb3e029..507c7ecbc 100644 --- a/open_archive/test_open_archive.py +++ b/open_archive/test_open_archive.py @@ -15,15 +15,16 @@ from pathlib import Path import shutil import os - +import tarfile from mlrun import code_to_function, import_function +import open_archive +import pytest ARTIFACTS_PATH = 'artifacts' CONTENT_PATH = 'content/data/images' ARCHIVE_URL = "https://s3.wasabisys.com/iguazio/data/cats-vs-dogs/cats-vs-dogs-labeling-demo.zip" - def _delete_outputs(paths): for path in paths: if Path(path).is_dir(): @@ -38,9 +39,9 @@ def test_open_archive(): ) fn.spec.command = "open_archive.py" fn.run(inputs={'archive_url': ARCHIVE_URL}, - params={'key': 'test_archive', 'target_path': os.getcwd() + '/content/'}, - local=True) - + params={'key': 'test_archive', 'target_path': os.getcwd() + '/content/'}, + local=True) + assert Path(CONTENT_PATH).is_dir() _delete_outputs({'artifacts', 'runs', 'schedules', 'content'}) @@ -51,4 +52,19 @@ def test_open_archive_import_function(): params={'key': 'test_archive', 'target_path': os.getcwd() + '/content/'}, local=True) assert (run.status.artifact_uris["test_archive"]) - _delete_outputs({'artifacts', 'runs', 'schedules', 'content'}) \ No newline at end of file + _delete_outputs({'artifacts', 'runs', 'schedules', 'content'}) + + +def test_traversal_entry(): + with tarfile.open("malicious.tar.gz", "w:gz") as tar: + # create a file with a traversal attack + with open("malicious.txt", "w") as f: + f.write("malicious content to test traversal attack") + + # add the file to the tar archive with a traversal attack path + tar.add("malicious.txt", arcname="../malicious.txt") + + with pytest.raises(ValueError): + open_archive._extract_gz_file("malicious.tar.gz", target_path=os.getcwd() + '/content/') + os.remove("malicious.txt") + os.remove("malicious.tar.gz") \ No newline at end of file From 8fc3f3560c69ef5881ccfc5838be83549cd88d22 Mon Sep 17 00:00:00 2001 From: guy1992l Date: Fri, 9 Jan 2026 00:41:34 +0200 Subject: [PATCH 35/38] first version --- mlflow_utils/function.yaml | 31 - mlflow_utils/item.yaml | 31 - mlflow_utils/mlflow_utils.ipynb | 1353 --------------- mlflow_utils/mlflow_utils.py | 45 - mlflow_utils/requirements.txt | 3 - mlflow_utils/test_mlflow_utils.py | 179 -- modules/src/langchain_mlrun/item.yaml | 24 + .../src/langchain_mlrun/langchain_mlrun.ipynb | 899 ++++++++++ .../src/langchain_mlrun/langchain_mlrun.py | 1526 +++++++++++++++++ .../notebook_images/mlrun_ui.png | Bin 0 -> 85919 bytes modules/src/langchain_mlrun/requirements.txt | 4 + .../langchain_mlrun/test_langchain_mlrun.py | 932 ++++++++++ noise_reduction/data/test_data.mp3 | Bin 27972 -> 0 bytes noise_reduction/data/test_data.wav | Bin 179672 -> 0 bytes noise_reduction/function.yaml | 194 --- noise_reduction/item.yaml | 29 - noise_reduction/noise_reduction.ipynb | 942 ---------- noise_reduction/noise_reduction.py | 625 ------- noise_reduction/requirements.txt | 5 - noise_reduction/test_noise_reduction.py | 75 - 20 files changed, 3385 insertions(+), 3512 deletions(-) delete mode 100644 mlflow_utils/function.yaml delete mode 100644 mlflow_utils/item.yaml delete mode 100644 mlflow_utils/mlflow_utils.ipynb delete mode 100644 mlflow_utils/mlflow_utils.py delete mode 100644 mlflow_utils/requirements.txt delete mode 100644 mlflow_utils/test_mlflow_utils.py create mode 100644 modules/src/langchain_mlrun/item.yaml create mode 100644 modules/src/langchain_mlrun/langchain_mlrun.ipynb create mode 100644 modules/src/langchain_mlrun/langchain_mlrun.py create mode 100644 modules/src/langchain_mlrun/notebook_images/mlrun_ui.png create mode 100644 modules/src/langchain_mlrun/requirements.txt create mode 100644 modules/src/langchain_mlrun/test_langchain_mlrun.py delete mode 100644 noise_reduction/data/test_data.mp3 delete mode 100644 noise_reduction/data/test_data.wav delete mode 100644 noise_reduction/function.yaml delete mode 100644 noise_reduction/item.yaml delete mode 100644 noise_reduction/noise_reduction.ipynb delete mode 100644 noise_reduction/noise_reduction.py delete mode 100644 noise_reduction/requirements.txt delete mode 100644 noise_reduction/test_noise_reduction.py diff --git a/mlflow_utils/function.yaml b/mlflow_utils/function.yaml deleted file mode 100644 index d2e2bffec..000000000 --- a/mlflow_utils/function.yaml +++ /dev/null @@ -1,31 +0,0 @@ -metadata: - name: mlflow-utils - categories: - - genai - - model-serving - - machine-learning - tag: '' -spec: - default_handler: '' - image: mlrun/mlrun - command: '' - base_image_pull: false - default_class: MLFlowModelServer - function_handler: mlflow-utils:handler - disable_auto_mount: false - build: - origin_filename: '' - code_origin: '' - requirements: - - mlflow==2.12.2 - functionSourceCode: aW1wb3J0IHppcGZpbGUKZnJvbSB0eXBpbmcgaW1wb3J0IEFueSwgRGljdAppbXBvcnQgbWxmbG93CmZyb20gbWxydW4uc2VydmluZy52Ml9zZXJ2aW5nIGltcG9ydCBWMk1vZGVsU2VydmVyCmltcG9ydCBwYW5kYXMgYXMgcGQKCgpjbGFzcyBNTEZsb3dNb2RlbFNlcnZlcihWMk1vZGVsU2VydmVyKToKICAgICIiIgogICAgTUxGbG93IHRyYWNrZXIgTW9kZWwgc2VydmluZyBjbGFzcywgaW5oZXJpdGluZyB0aGUgVjJNb2RlbFNlcnZlciBjbGFzcyBmb3IgYmVpbmcgaW5pdGlhbGl6ZWQgYXV0b21hdGljYWxseSBieSB0aGUgbW9kZWwKICAgIHNlcnZlciBhbmQgYmUgYWJsZSB0byBydW4gbG9jYWxseSBhcyBwYXJ0IG9mIGEgbnVjbGlvIHNlcnZlcmxlc3MgZnVuY3Rpb24sIG9yIGFzIHBhcnQgb2YgYSByZWFsLXRpbWUgcGlwZWxpbmUuCiAgICAiIiIKCiAgICBkZWYgbG9hZChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBsb2FkcyBhbiBtb2RlbCB0aGF0IHdhcyBsb2dnZWQgYnkgdGhlIE1MRmxvdyB0cmFja2VyIG1vZGVsCiAgICAgICAgIiIiCiAgICAgICAgIyBVbnppcCB0aGUgbW9kZWwgZGlyIGFuZCB0aGVuIHVzZSBtbGZsb3cncyBsb2FkIGZ1bmN0aW9uCiAgICAgICAgbW9kZWxfZmlsZSwgXyA9IHNlbGYuZ2V0X21vZGVsKCIuemlwIikKICAgICAgICBtb2RlbF9wYXRoX3VuemlwID0gbW9kZWxfZmlsZS5yZXBsYWNlKCIuemlwIiwgIiIpCgogICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKG1vZGVsX2ZpbGUsICJyIikgYXMgemlwX3JlZjoKICAgICAgICAgICAgemlwX3JlZi5leHRyYWN0YWxsKG1vZGVsX3BhdGhfdW56aXApCgogICAgICAgIHNlbGYubW9kZWwgPSBtbGZsb3cucHlmdW5jLmxvYWRfbW9kZWwobW9kZWxfcGF0aF91bnppcCkKCiAgICBkZWYgcHJlZGljdChzZWxmLCByZXF1ZXN0OiBEaWN0W3N0ciwgQW55XSkgLT4gbGlzdDoKICAgICAgICAiIiIKICAgICAgICBJbmZlciB0aGUgaW5wdXRzIHRocm91Z2ggdGhlIG1vZGVsLiBUaGUgaW5mZXJyZWQgZGF0YSB3aWxsCiAgICAgICAgYmUgcmVhZCBmcm9tIHRoZSAiaW5wdXRzIiBrZXkgb2YgdGhlIHJlcXVlc3QuCgogICAgICAgIDpwYXJhbSByZXF1ZXN0OiBUaGUgcmVxdWVzdCB0byB0aGUgbW9kZWwgdXNpbmcgeGdib29zdCdzIHByZWRpY3QuCiAgICAgICAgICAgICAgICBUaGUgaW5wdXQgdG8gdGhlIG1vZGVsIHdpbGwgYmUgcmVhZCBmcm9tIHRoZSAiaW5wdXRzIiBrZXkuCgogICAgICAgIDpyZXR1cm46IFRoZSBtb2RlbCdzIHByZWRpY3Rpb24gb24gdGhlIGdpdmVuIGlucHV0LgogICAgICAgICIiIgoKICAgICAgICAjIEdldCB0aGUgaW5wdXRzIGFuZCBzZXQgdG8gYWNjZXB0ZWQgdHlwZToKICAgICAgICBpbnB1dHMgPSBwZC5EYXRhRnJhbWUocmVxdWVzdFsiaW5wdXRzIl0pCgogICAgICAgICMgUHJlZGljdCB1c2luZyB0aGUgbW9kZWwncyBwcmVkaWN0IGZ1bmN0aW9uOgogICAgICAgIHByZWRpY3Rpb25zID0gc2VsZi5tb2RlbC5wcmVkaWN0KGlucHV0cykKCiAgICAgICAgIyBSZXR1cm4gYXMgbGlzdDoKICAgICAgICByZXR1cm4gcHJlZGljdGlvbnMudG9saXN0KCkKCmZyb20gbWxydW4ucnVudGltZXMgaW1wb3J0IG51Y2xpb19pbml0X2hvb2sKZGVmIGluaXRfY29udGV4dChjb250ZXh0KToKICAgIG51Y2xpb19pbml0X2hvb2soY29udGV4dCwgZ2xvYmFscygpLCAnc2VydmluZ192MicpCgpkZWYgaGFuZGxlcihjb250ZXh0LCBldmVudCk6CiAgICByZXR1cm4gY29udGV4dC5tbHJ1bl9oYW5kbGVyKGNvbnRleHQsIGV2ZW50KQo= - min_replicas: 1 - description: Mlflow model server, and additional utils. - max_replicas: 4 - source: '' - function_kind: serving_v2 - env: - - name: MLRUN_HTTPDB__NUCLIO__EXPLICIT_ACK - value: enabled -verbose: false -kind: serving diff --git a/mlflow_utils/item.yaml b/mlflow_utils/item.yaml deleted file mode 100644 index bda09c5bb..000000000 --- a/mlflow_utils/item.yaml +++ /dev/null @@ -1,31 +0,0 @@ -apiVersion: v1 -categories: -- genai -- model-serving -- machine-learning -description: Mlflow model server, and additional utils. -doc: '' -example: mlflow_utils.ipynb -generationDate: 2024-05-23:12-00 -hidden: false -icon: '' -labels: - author: zeevr -maintainers: [] -marketplaceType: '' -mlrunVersion: 1.7.0-rc17 -name: mlflow_utils -platformVersion: '' -spec: - customFields: - default_class: MLFlowModelServer - filename: mlflow_utils.py - handler: handler - image: mlrun/mlrun - kind: serving - requirements: - - mlflow==2.12.2 - - lightgbm - - xgboost -url: '' -version: 1.0.0 diff --git a/mlflow_utils/mlflow_utils.ipynb b/mlflow_utils/mlflow_utils.ipynb deleted file mode 100644 index 165dafc6f..000000000 --- a/mlflow_utils/mlflow_utils.ipynb +++ /dev/null @@ -1,1353 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "c478ebb2", - "metadata": {}, - "source": [ - "# MLflow tracker demo\n", - "\n", - "This demo demonstrates how to seamlessly integrate and transfer logs from MLflow to MLRun,
\n", - "creating a unified and powerful platform for your machine learning experiments.\n", - "\n", - "You can combine MLflow and MLRun for a comprehensive solution for managing, tracking, and deploying machine learning models. \n", - "\n", - "This notebook guides you through the process of:\n", - "\n", - "1. Setting up the integration between MLflow and MLRun.\n", - "2. Extracting data, metrics, and artifacts from MLflow experiments.\n", - "3. Creating MLRun artifacts and projects to organize and manage the transferred data.\n", - "4. Leveraging MLRun's capabilities for model deployment and data processing.\n", - "\n", - "By the end of this demo, you will have a understanding of how to establish a smooth flow of data between MLflow and MLRun.\n", - "\n", - "## MLRun installation and configuration\n", - "Before running this notebook make sure the mlrun package is installed (pip install mlrun) and that you have configured the access to MLRun service." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "ab49e1f1", - "metadata": {}, - "outputs": [], - "source": [ - "# Install MLRun and scikit-learn if not already installed. Run this only once. Restart the notebook after the install!\n", - "# %pip install mlrun scikit-learn~=1.3.0" - ] - }, - { - "cell_type": "markdown", - "id": "1770566a", - "metadata": {}, - "source": [ - "Then you can import the necessary packages." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "0d2dfd8b-65c4-417b-b66e-99f44b015ee7", - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "import os\n", - "import mlrun\n", - "from mlrun.datastore.targets import ParquetTarget\n", - "import mlrun.feature_store as fstore" - ] - }, - { - "cell_type": "markdown", - "id": "7c4513d4", - "metadata": {}, - "source": [ - "Create a project for this demo:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "43ea863f-02d5-45f2-8143-306ce3bb6c58", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2024-03-27 15:34:40,940 [info] Project loaded successfully: {'project_name': 'mlflow-tracking-example-guy'}\n" - ] - } - ], - "source": [ - "# Create a project for this demo:\n", - "project = mlrun.get_or_create_project(name=\"mlflow-tracking-example\", context=\"./\")" - ] - }, - { - "cell_type": "markdown", - "id": "94413ee8", - "metadata": {}, - "source": [ - "Set all the necessary environment variables for the Databricks cluster:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "22f94f89-acce-442d-93ff-b2d08d3a35a4", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "DATABRICKS_HOST=\"add your host\"\n", - "DATABRICKS_TOKEN=\"add your token\"\n", - "DATABRICKS_CLUSTER_ID=\"add your cluster id\"" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "7af310da-fd02-444e-8619-43ba6dcdb0a4", - "metadata": {}, - "outputs": [], - "source": [ - "os.environ[\"DATABRICKS_HOST\"] = DATABRICKS_HOST\n", - "os.environ[\"DATABRICKS_TOKEN\"] = DATABRICKS_TOKEN\n" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "d98e823c-3a27-4532-9a2d-6398ea4e1778", - "metadata": {}, - "outputs": [], - "source": [ - "# Set the Databricks environment variables\n", - "job_env = {\n", - " \"DATABRICKS_HOST\": DATABRICKS_HOST,\n", - " \"DATABRICKS_CLUSTER_ID\": DATABRICKS_CLUSTER_ID\n", - "}\n", - "secrets = {\"DATABRICKS_TOKEN\": DATABRICKS_TOKEN}\n", - "\n", - "# Set the secrets in the project\n", - "project.set_secrets(secrets)" - ] - }, - { - "cell_type": "markdown", - "id": "37d75366", - "metadata": {}, - "source": [ - "## Create a feature set and ingest data\n", - "\n", - "This is a short example of how to create a feature set about music preferences." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "5701c04a-8442-4958-8f4c-265bf4c9b06a", - "metadata": {}, - "outputs": [], - "source": [ - "# create df\n", - "columns = [\"id\", \"name\", \"age\", \"gender\", \"favorite_music_type\"]\n", - "data = [\n", - " (1, \"Alice\", 20, \"f\", \"Pop\"),\n", - " (2, \"Bob\", 30, \"m\", \"Rock\"),\n", - " (3, \"Charlie\", 25, \"m\", \"Pop\"),\n", - " (4, \"David\", 40, \"m\", \"Classical\"),\n", - " (5, \"Eva\", 18, \"f\", \"Pop\"),\n", - " (6, \"Frank\", 32, \"m\", \"Rock\"),\n", - " (7, \"Grace\", 28, \"f\", \"Pop\"),\n", - " (8, \"Henry\", 45, \"m\", \"Classical\"),\n", - " (9, \"Ivy\", 22, \"f\", \"Pop\"),\n", - " (10, \"Jack\", 38, \"m\", \"Classical\"),\n", - " (11, \"Karen\", 27, \"f\", \"Pop\"),\n", - " (12, \"Liam\", 19, \"m\", \"Pop\"),\n", - " (13, \"Mia\", 27, \"f\", \"Rock\"),\n", - " (14, \"Nora\", 31, \"f\", \"Rock\"),\n", - " (15, \"Oliver\", 29, \"m\", \"Pop\"),\n", - " (16, \"Ben\", 38, \"m\", \"Pop\"),\n", - " (17, \"Alicia\", 20, \"f\", \"Pop\"),\n", - " (18, \"Bobby\", 30, \"m\", \"Rock\"),\n", - " (19, \"Charlien\", 22, \"f\", \"Pop\"),\n", - " (20, \"Davide\", 40, \"m\", \"Classical\"),\n", - " (21, \"Evans\", 19, \"m\", \"Pop\"),\n", - " (22, \"Franklin\", 34, \"m\", \"Rock\"),\n", - " (23, \"Grace\", 22, \"f\", \"Pop\"),\n", - " (24, \"Henrik\", 48, \"m\", \"Classical\"),\n", - " (25, \"eevee\", 29, \"f\", \"Pop\"),\n", - " (26, \"Jack\", 75, \"m\", \"Classical\"),\n", - " (27, \"Karen\", 26, \"f\", \"Pop\"),\n", - " (28, \"Lian\", 21, \"f\", \"Pop\"),\n", - " (29, \"kia\", 27, \"f\", \"Rock\"),\n", - " (30, \"Novak\", 30, \"m\", \"Rock\"),\n", - " (31, \"Olivia\", 29, \"f\", \"Pop\"),\n", - " (32, \"Benjamin\", 18, \"m\", \"Pop\")\n", - "]\n", - "df = pd.DataFrame(data, columns=columns)" - ] - }, - { - "cell_type": "markdown", - "id": "4b91576b", - "metadata": {}, - "source": [ - "Transfer the data to DataBricks." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "8679b0bb-0da6-4c35-9345-6cf0e83e19b2", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'dbfs:///demos/mlrun_databricks_demo/1711553684480_33/music.parquet'" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Where to save the data in DataBricks\n", - "target_path = f\"dbfs:///demos/mlrun_databricks_demo/music.parquet\"\n", - "output_path = f\"dbfs:///demos/mlrun_databricks_demo/music_output_new.parquet\"\n", - "\n", - "targets = [ParquetTarget(path=target_path)]\n", - "\n", - "# Create a feature set and ingest the data\n", - "fset = fstore.FeatureSet(name=\"music_fset\", entities=[fstore.Entity(\"name\")])\n", - "fstore.ingest(fset, df, targets=targets, overwrite=True)\n", - "\n", - "# Get the target path and check it\n", - "dbfs_data_path = fset.get_target_path()\n", - "dbfs_data_path" - ] - }, - { - "cell_type": "markdown", - "id": "fe173be8-18eb-40ec-9662-6639b0deaedb", - "metadata": {}, - "source": [ - "We can look and see how how our data is logged in the DataBricks cluster:\n", - "(only top 20 rows)" - ] - }, - { - "attachments": { - "f7ad0425-26fe-482c-b97c-c9493b05fbf2.png": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAzcAAAJMCAYAAADHQ1hsAAABU2lDQ1BJQ0MgUHJvZmlsZQAAGJVtkE1LAlEUhh9LEcPIoFW0cJGtNMKEaFkSEoSJfVAtonH8CvwYxpHoH1Q/IILqL0QtomUuWrcpomWuCtpF2KJkOqOVWp3Ly3l473svhwNdKJqWswP5gqHHI9PeldU1r/NJLhy48OBS1JI2FYvNSYTv3lm1O2xWvwlYf81UT8LPgd1ib/U4en+efPib76ieZKqkSv8QjaiaboBtWDi2ZWgWixjQZSjhHYszTT6yONHk00ZmMR4WvhL2qFklKXwr7E+0+Zk2zufK6tcM1vTuVGFpwZpHNMQyEYJMMCV7+T8XauTCFNHYRmeTDFkMvPJGk5MjJTxLAZVR/MJBxkQha7+/99by9D2YTAs8trz1Q7goQ/9by/OdQZ8PKvOaois/27TV7KX0eLDJ7kFwVEzzxQTnBtSvTfP9wDTr+9D9CpfRT9xxYozukjtkAAAAVmVYSWZNTQAqAAAACAABh2kABAAAAAEAAAAaAAAAAAADkoYABwAAABIAAABEoAIABAAAAAEAAAM3oAMABAAAAAEAAAJMAAAAAEFTQ0lJAAAAU2NyZWVuc2hvdBIyf/QAAAHWaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjU4ODwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj44MjM8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpVc2VyQ29tbWVudD5TY3JlZW5zaG90PC9leGlmOlVzZXJDb21tZW50PgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KyQQwEgAAQABJREFUeAHsnQeYFEXTgOvIOeecMwIiQRERBUVEFMWIip9ZUcAsBkRBEQQxoiBiBDEgKphRMiJIVHLOOedw3N9vH73M7W2649LyVz3P7s5Mx3mnZ6arq7o3Js6IqCgBJaAElIASUAJKQAkoASWgBKKcQKYor79WXwkoASWgBJSAElACSkAJKAElYAmocqMNQQkoASWgBJSAElACSkAJKIGzgoAqN2fFZdSTUAJKQAkoASWgBJSAElACSkCVG20DSkAJKAEloASUgBJQAkpACZwVBFS5OSsuo56EElACSkAJKAEloASUgBJQAqrcaBtQAkpACSgBJaAElIASUAJK4KwgoMrNWXEZ9SSUgBJQAkpACSgBJaAElIASUOVG24ASUAJKQAkoASWgBJSAElACZwUBVW7OisuoJ6EElIASUAJKQAkoASWgBJSAKjfaBpSAElACSkAJKAEloASUgBI4KwiocnNWXEY9CSWgBJSAElACSkAJKAEloARUudE2oASUgBJQAkpACSgBJaAElMBZQUCVm7PiMupJKAEloASUgBJQAkpACSgBJaDKjbYBJaAElIASUAJKQAkoASWgBM4KAqrcnBWXUU9CCSgBJaAElIASUAJKQAkoAVVutA0oASWgBJSAElACSkAJKAElcFYQUOXmrLiMehJKQAkoASWgBJSAElACSkAJZIkEQWxsrJw4cULi4uIiia5xlIASUAJKQAkoASWgBJSAElACaU4gIuUGxSYmJsZ+0ryGWqASUAJKQAkoASWgBJSAElACSiACAhG5panFJgKSGkUJKAEloASUgBJQAkpACSiBdCUQkXKTrjXUwpWAElACSkAJKAEloASUgBJQAhEQUOUmAkgaRQkoASWgBJSAElACSkAJKIGMT0CVmzO4RmvWrJHRo0fL77//HnEuP/30k3zyySf2s3LlypDpDh8+LF9++aXs3bs3ZLxIA0+ePCnuE2maSONt2LDBsog0fkrGiz18SLaOHS2H1sTz3D1jiuya/EfQImIPHZKNIz+S43v32DiH16+VTV99FjS+N+DYrh2y5buvbPqTx455g1Ju21wns3pH8PzChMedjA2aFkabvxkZNDy9A0LV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yhvWo0BhxMXawwICWJr8BXc00lJvFSWgBJSAElACSkAJKAElcDYRiNx8ko5nTSf+2muvjWjZaKrJEs7Mwwml2BAP6wruWV7FhuNewTITSLEhDspDSis25Mv5Yq0JprxwXsHCSE+dAyk2hDHXSRUbSKgoASWgBJSAElACSkAJnG0EosJyA3SsDf/995+13NB5DyZYNRYuXBg2XrD0HMeis2DBAqlWrZoqAqFAaZgSUAJKQAkoASWgBJSAEshABKJGuclAzLQqSkAJKAEloASUgBJQAkpACWRAAsFNIBmwslolJaAElIASUAJKQAkoASWgBJRAMAKq3AQjo8eVgBJQAkpACSgBJaAElIASiCoCqtxE1eXSyioBJaAElIASUAJKQAkoASUQjIAqN8HI6HEloASUgBJQAkpACSgBJaAEooqAKjdRdbm0skpACSgBJaAElIASUAJKQAkEI6DKTTAyelwJKAEloASUgBJQAkpACSiBqCKgyk1UXS6trBJQAkpACSgBJaAElIASUALBCKhyE4yMHlcCSkAJKAEloASUgBJQAkogqgiochNVl0srqwSUgBJQAkpACSgBJaAElEAwAqrcBCOjx5WAElACSkAJKAEloASUgBKIKgKq3ETV5dLKKgEloASUgBJQAkpACSgBJRCMgCo3wcjocSWgBJSAElACSkAJKAEloASiioAqN1F1ubSySkAJKAEloASUgBJQAkpACQQjkCVYQEY8vnPnTtm/f39EVcubN68ULlw4orgaSQkoASWgBJSAElACSkAJKIHoJxA1ys2CBQtk8ODBEhcXFxH1mJgYefDBB+Wcc86JKL5/pNjYWPnggw/kuuuuk6JFi9rgadOmydy5c6VRo0bSpEkT/yRRv79t2zb59ttv5d5775VMmVLPqDd06FBp166dlCpVKiyzWbNmyY4dO+SKK64IGzepEZYvXy4TJ06UAgUKyPXXX5/U5KkWf8+ePbJx40Zf/rQ/PrTp1JBjx44JLPylSJEiUrx4cf/DUbM/efJkWbRoka3vVVddJUePHpUffvhB7r//fsmRI0ei89iwYYP88ssvcvfddycK8z/w008/WTYNGzb0Dzrr96P13Pft2ycrV6607aB8+fJSsmTJqLhW3vcOz4FQbdh7QuGu03fffSeVKlUK+Y6cMWOGzJs3z2bbpk0bqVChgrcI3VYCSkAJ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BQsOuq9QoUIgUxhWGxJZRENw6yKNO8/xrbfeGiiS+KBw4tvilzzXZFrz9SHTGjE3wcK53mU1eH/wOi57KDekhEaRYTCGJAfE7nlXN87v2LGju4z3DIMl3bt3NzK5oeAgWIlJfCARAREQAREQARGITOCIw1mLshU6w0lM4Hng8NeeQ2m2Y3+abdp3yOqm7baqlSpEvMOLL77oJvHkH3Y0hZnGycpEZ6h48eJhiyY4GaVnxowZbgLOsCflYiejqAQr06khJXSkzg0ucn7CwFzcJqEvSeW2JTT4JK0cVlbiaFBkvPJAU6688krXqadjj1Uj9Lhvbl7fI6SExtqKu5d3JfVlZ7VkAk6ui4fyj0WHiUBRBokhCmZHvWP1jsuKiY6LgAiIgAiIQKISSErLDTDxY88qxWusoDP6HK97x6pNKlcEYkmAeWsym7uG5zlayUDCtQP3tNxO8BvLeoWra/A+Bk7ief/gumhdBERABERABJKBQFLG3CQDWNVRBEQgawKNGjXSQEHWmHSGCIiACIiACIhANgnE3C3NB8wGp07NZt3yfBoed7ijZJXNKM83ilAA96bd8XBniVClqO1O5bZFDZIKihqBeL5HotaIGBQU73dcDJqkIkVABERABEQgTwRi7pZGUC+feAj+6fFSbGhvbt1g4sEqp/dM5bbllIXOjz2BeL5HYt+63N8h3u+43NdcV4qACIiACIhAbAjILS02XFWqCIiACIiACIiACIiACIhAPhOQcpPPwHU7ERABERABERABERABERCB2BCQchMbripVBERABERABERABERABEQgnwlIucln4LqdCIiACIiACIiACIiACIhAbAjEXLn54osv7I033ohN7f9XKhPdhZuLlEk+J0yY4GYFz20FKDdc2ZTH7OKHDh2KWPRTTz1lmzdvjng8mQ+kctvi+bv8+uuvtn79emOSWi+bNm0yePNhMst4CRNGfvDBB1G9/SeffBJo20cffRSx7Px4j4TenOeed0usJTtcmQB12rRp9ssvv6SrTjTecekK1IYIiIAIiIAIJDmBmCs3q1evtnfeeSdmmKZPn26XXHKJTZ48OcM9+Mf/9ttvZ6qAZLgoaMdvv/1ml112mbVv3z6dgvTtt9/a5Zdfbj169LAOHTrYK6+8EnTVH6sodVu3bv1jRwqtpXLb4vEz/fDDD9azZ0/r1q2b3X77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zxmzh5PmuWXLlnb33XdnmNkdpY56ValSxV+aFMt9+/ZZly5djIkfmdG+YcOGGdqQrG1Lih8giSq5YMECGzFiRKDG/K1fcMEF7nmPZpbEWLxHApWO0QrvHd5BwcL7YubMmcG78rSe23dcnm6qi0VABERABEQggQnEXLmJZdsfe+wxK1y4sLtFNFMT33fffbZ9+3arWbOmrVq1yoJHW3fu3Gljxoyx1q1b28033+yODxo0yJo3b24tWrSIZXPzrexFixa5e2G1ScU5evINZAG4kX82hg0b5gYAFi9ebFOmTDGek169ehUAApk38dRTT7WbbropcNKRR8bcWB64l1ZEQAREQAREoCASSGrlhlFilJpodxjuuusuq1q1qr333ntOeQn+w9izZ4/bbNKkiVOssGqgAKxZsybplZulS5c6xY02/v77787iRWN79+5tp59+ejAGrYtAOgIVK1a0MmXK2EknnWRz5841rKsIk2/iGjp//ny3XqtWLevbt69xPtKnTx+rXLmy4Xa2e/duq1evnvXr189KlCjhjif7V/Hixa1atWoZmsHAwcqVK2348OGBY1hDsXIzeMLgCpbodevWuWexfPnyTlnkvSMRAREQAREQARGITCCplZuuXbu6ltE5opN08sknR25pDo6ceOKJEc/mWOPGje0f//iHbdq0yXVQUG7atm0b8ZpkOXDKKafY0KFD7Z///Kfhesc6UrZs2WRpguoZZwK4SfE5//zzXU2mT5/u/pauv/565+KIooNl9Omnn3ZunFu3brXvvvvObrzxRitdurSNHj3aXnjhhZSx+nz22WeGZdcLik737t0Ni86LL75oGzZsMP++wf3VKy8ohQwo3HHHHW7whGODBw+2qVOnWqlSpXxxWoqACIiACIiACIQQSErlpkKFCm70t0aNGvbVV18ZHSg6TMTBRNM9LYRVYBMlatmyZfbaa68Z8Tl05IoWLRo4nqwrxx57rJ1wwgmu80S8BOsSEcgOgYEDBzoLw5YtW6xYsWJ21VVXucvmzZtndevWtU6dOrlt4tTGjh1rnOdj0erUqROIyfv6669t4cKFKaPc8Ex55QUAvLsQBhLgNGvWLOvZs6fRbti0a9fOHWfA5pprrrGNGzfaN99846xbHGBbyo1DpC8REAEREAERCEsgKZUbXFq8WwvuY8TdPProo0bQsR/5DNvaKOzE/QyXEixFBE7TIbnuuusM9xNGnyUiUBAJkFSDTnf9+vUDHXE47Nq1K527Jm5ryI4dOwLKTe3atd0+vohzI+B+7969LqFF4ECSrjAQQmKBcHLRRRe5xCXE7r377rvOQkr7EazCuIMyyEAZPvaNBCcSERABERABERCByARSIrqV0VGEOJFYy/Lly90tmjZt6pbHH3+886knXkUiAgWVAAk22rRpk06xgQXWCVyvvPj1kiVL+l3pjtOp5xoy9aW64MqKsvLxxx8bFq6LL7440OTJkye7ARNc13BHQxGSiIAIiIAIiIAIZE0gKZUbgm4Jxv3111+dexgdAUY2cX+JhhBQj4Xmxx9/dMWtXbvW+CA+OJi4gN9++80FTqdCMgHXOH2JQJQJMAhAsoAlS5a4+ZJef/115zrqXdK4HRkJGRzgGePZbtasWZRrEb/iSJLA+yH44zPMlStXzkiwgNWZgRkURC9Ypg8cOOAsX+vXr3exNv6YliIgAiIgAiIgApEJJKVbGp0lOkFeGOkdMmSIG+n0+/KypCM2atSoQBFkb0Jwl6Gz1q1bN+crz1w4KFVnnXWWXX755YHzk33liCOOSPYmqP75RCDxJAgcAABAAElEQVSrvxVcssj49fDDD7saYWXFElGo0B+vHuJQ2IfwLHfu3Nmtp8IX7yrcy4KFgRHaibRv395GjhzpEgwEZ4jr2LGjffrpp3bttde684jrg6NEBERABERABEQgcwJ/9DAyPy+hjhLvQnwLc2nQSSDLUjSlVatWxieSoNzwIV0r6W+jnYo60n3zaz+KWiopa/nFrSDeh1gbPpGE55POOxYM4mhQZEIVovPOO8/ozP/8889hj0cqO9H3P/vss1lWkbg9PqGCVWfixIku8xzJSlAKSVEvEQEREAEREAERyJxAUio3NIlOkx/9zLyJsTtKB0QiAiKQNQGsEsGWidArjjnmmECSkNBjBXmbwROJCIiACIiACIhA9gkkZcxN9punM0VABBKZQKNGjTIkIUjk+qpuIiACIiACIiACiU3giMPBrf/JThU5Ke3w14HDX3sOpdmO/Wm2ad8hq5u226pW+u/cDeHKYTI6gmV9RrNw58RqH01jHpp4zUHDvWm3T+Maq3bGo9xUbls8eOqemROI53sk85rF92i833Hxbb3uLgIiIAIiIAIZCcTcLY15GvjEQ/Dtj5diQ3vzY0LReHBN9bbFi6nuG5lAPN8jkWsV/yPxfsfFn4BqIAIiIAIiIALpCcgtLT0PbYmACIiACIiACIiACIiACCQpASk3SfrDqdoiIAIiIAIiIAIiIAIiIALpCUi5Sc9DWyIgAiIgAiIgAiIgAiIgAklKQMpNkv5wqrYIiIAIiIAIiIAIiIAIiEB6AjFXbpih+4033kh/1yhu/fDDD7Z582YLl/Ttp59+sgkTJrhsbTm95S+//GJr1qxxkw+Gu5YJB5kx/MCBA+EOu31PPfWUq1vEE5L4QCq3LYl/lqhXnecqLS3NfcI9Y3m94bJly+y9997LsphYv0ciVcC3PXgZCw6h9z948KBNmzbNeL9lJnl5x2VWro6JgAiIgAiIQLISiHm2tNWrV9ucOXOsQ4cOUWW0cuVKGzRokO3fv9+VW758eZs8eXK6e/CP/+2337YePXrkKB0z5+/YsSNQ1qmnnmoDBgxwaZ3Xr19vAwcOdLOp+xO6du1qV111ld8MLFHqGjRoYFWqVAnsS5WVVG5bqvxG0WjHzJkzDUXWS/369a1169Z2wQUX+F15Wv7rX/+yr776yi688MJMy4nVeySzm86dO9eeeOKJDKfcdtttdtFFF2XYH80dvNdefPFFq1OnTqaTm+b2HRfNuqosERABERABEUgkAjFXbmLR2N27d9u9995rJ510kl199dVWs2ZN+/bbb6N2q2uvvdaVzYzqX375pT3yyCM2ZcoU69mzpzGiev7557tP4cKF7aWXXrIXXnjBdUIaN24ctTqoIBFIJALjxo2zPXv2uMGCkSNHWqFCheycc85JpCrGrC5Dhw413gVeypYt61e1FAEREAEREAERSDACSancvPXWW3b00UfbY489ZkceeaT7NG3aNGpozzvvvEBZZ5xxhrPY4KaG1K5d2338CShXs2bNMiw6ya7c3Hnnnc4ShivMmWee6UbUccfp16+f1atXzzdZywJIoHLlyk6hYSBhwYIFhuXUKzdYR7Ey8IzQ8ceyEfwsrF271lCOvv/+e0cOawQKQ+j8V4cOHXLPNNaIwYMHx3WOquCfuGrVqlayZMngXYH1IUOGWPXq1W3jxo22fPlyt/++++5z7X/55ZftzTffdFyYzJd31B133GEMivz222+OU6tWreyDDz6wvXv3Wtu2be2GG24w5q4JFQZZ/va3v1m3bt2ytHKFXqttERABERABEShIBJJSudmwYYNVqFDB7r77bhcXQ4erY8eOdu6550btt6PzxmfJkiXG7OiXXHJJ2LI//vhjt/+0004LezyZdhK71KRJE9dpnT59ut1yyy22cOFCe+WVV6TcJNMPGaO6ony8//77rvTTTz/dLYmFIa4NVzUsmlgxcRd99tlnrUyZMq5j36dPHzvhhBOsf//+7rl95513XBxcsHKzb98+dxwF6fHHH08YxYZGDh8+3A2msI7F6sEHH2TVyZYtW+yTTz4xnn+sybSDc5A//elPduuttzrlh3fWo48+6hQ6ePz+++/OtfXdd9+13r1729atW+3pp592DGvUqOGu918okyNGjLDrrrtOio2HoqUIiIAIiIAIRCCQlMrNrl273Egpo55YG+gs0SFq1KiRFS9ePEJTc7abZAEfffSRuw9WC2J6QoUOy/jx4619+/bONS70eDJuM+LOSDXKTYsWLezXX3+1RYsWJWNTVOcoErjiiiucSyZFXnnllc4KwTpxKXTi//KXvziLQ7ly5Zz1YfHixe654DgdeTr+PvYMy06w8Dd2++23u/PGjh2bUIoN9cQyc9xxx7kqYykOFazIWHBCLS6XXXaZs4RideGdBRuSlARL586drXnz5m4XCQRWrFhhwcoNsW2ff/6544NlRyICIiACIiACIpA5gaRUbrwC06tXL+cyduONNzrXMJSRdu3aZd7ibB5FYeHz73//242Y/v3vf7f7778/cDVWDkZgUQZuvvnmwP5kX2E0nc4awpJRaOKMJAWbAJ13OugTJ040rJW4YyIk3sBlzXfsGQRA2dm+fbs7jkUClyyv2LidIV+4aCG4ZpGFsGjRoiFnxHcTZS6SWxo1a9asWaD9wTUdNWqUffjhh85qBSPad8wxxwSfks7FlXaj6AUL1mN4ouBIuQkmo3UREAEREAERCE8g4zBk+PMSai8uaQj/9BHfscJ9LNpSpEgRI0MUI6peUGywGDVs2NApPP7+/niqLGlXqrYtVX6j/GrHySefbC1btnSxMMSXEfeG0Onftm1boBooJ1hqSpcu7fYRg0PmL+JoIgnua1gtsBg+8MADgQyIkc5PtP3hlDFicIilueuuuwxrFC55xNoQw5YT4XoyNeKahgubRAREQAREQAREIHMCSanc4N+P0CHCR5/AXSQaMTc//vijizHBl56OGm41zMXhg6cJtkexIXtSly5d3Fw3uJrs3LnT1UFfIpDKBIhvO+uss1xMDUoLLlVY9ojL4nkhqyDiY3LOPvtst00Hnw4/80KhGAXPD4U1g4EKkgiQkY0Yl2QXb+lB8YMTrrO8U3IquMNhHSamkKQM3333XU6L0PkiIAIiIAIiUKAIJKVbGj7wzEXzzDPP2IwZM9wPhn+771Dk5Reko0Z6Z99JwzWLDlr37t1dsatWrXKdFTosjKp6ufjii10Avt9OxqW3hCVj3VXn/CPAs0CiCeJBUPCZ84XnxT8zpEwngQBSsWJFZ40hJo7geqRYsWIuAYHbOPzlrYOlSpVyVgosFZQd7bmx/P2iuaTu4eJwaCNzXz3//PP23HPPGRZgYvdQAIPFt519lBO8zT6/ff311xvJG7BskawBK5BEBERABERABEQgI4EjDs+2/Z+MuzPu4aS0w18HDn/tOZRmO/an2aZ9h6xu2m6rWum/bmIZrzKXIpZJPCdNmhTucJ72kb2JkVHcWvDrD5Wvv/7a+vbt6xSgUF/30HNDt+mE4CMfHE8Qek5W28T/MOFnNNNUZ3XP/Dqeym3LL4apdB/veobLqM8WFto+XNNwWSOw3nfaQ8+JtE2q6Vi9RyLdMxr7eUdh1Q2XkCQa5eflHReN+6sMERABERABEUg0AklpufEQ6URlFqjsz8vNklFkPhIREIGsCWSVNIASGIQoaMI7KlaKTUFjqfaKgAiIgAiIQHYIJGXMTXYapnNEQAREQAREQAREQAREQAQKFoGYu6WRwQxXlHBuY7FGjccdqZzDZTOK9b0pn3vT7lSMZUnltuXH34bukTMC8XyP5Kym+Xt2vN9x+dta3U0EREAEREAEsiYQc7c05k0Jnok86ypF7wz8+uOl2NAKgohTVVK5ban6myVzu+L5HklkbvF+xyUyG9VNBERABESgYBKQW1rB/N3VahEQAREQAREQAREQARFIOQJSblLuJ1WDREAEREAEREAEREAERKBgEpByUzB/d7VaBERABERABERABERABFKOgJSblPtJ1SAREAEREAEREAEREAERKJgEYq7cMKs2s41HU8gQlJaWluETOh8pkwZOmDDBZWvL6f3JBrZ27Vr77bffIl76ww8/GJP0RZKnnnrKNm/eHOlwQu9nUsb333/fpk2bFrYNydy2hAafhJXzz2Lo8xfNpsTiPZLd+tG+jRs32q5du7J7Sb6dl5d3XL5VUjcSAREQAREQgXwkEPNsaatXr3Yzi3fo0CFqzerfv7+tXLkyQ3k9e/a09u3bB/bzj//tt9+2Hj16ZDsdM2mr77rrLluzZk2gnMaNGxv3POaYY9y+2bNn23PPPWe//PKLK7dly5Z29913Z5h1HaWuQYMGMZtoNFDBKK/s27fPunTpYscdd5xVqlTJGjZsmKENydq2KKMq8MUtWLDARowYEeDApLoXXHCB8bxHM0tiLN4jgUpnsvLKK6/YlClTAmfUrFnTRo0aleFZD5yQzyu5ecflcxV1OxEQAREQARHIVwIxV25i0RoUCSwrXj788EObMWOGnXHGGX5XrpeMPp9wwgmGokTHftmyZa4zQwfn5ptvtp07d9qYMWOsdevWbnvVqlU2aNAga968ubVo0SLX902kCxctWuSqg9UmFefoSSTWyV4Xb60ZNmyYm9Np8eLFThngOenVq1dSN4+BEZ572nH++ec7y80LL7yQ1G1S5UVABERABEQg1QkkpXJTtmxZ4+Pl448/tvr161uZMmX8rlwvCxUqZH379g1c36pVK5s6daqtX7/e7duzZ49bNmnSxAoXLuysGigAWHqSXblZunSpU9xoIxYsLF5I79697fTTT3fr+hKBcAQqVqzonr+TTjrJ5s6daytWrHCnMfkmrqHz58831mvVquWeL85H+vTpY5UrVzbcznbv3m316tWzfv36WYkSJdzxeH5hncVq265dO1cNLJnB7wZ2DhkyxKpXr+7c1pYvX+7Ou++++9x1L7/8sr355pvOwstkvk2bNrU77rjDvTc4EZfWF1980WbNmuXOKVasmBtUOffcc105S5YssUmTJtmPP/5oxx9/vF1zzTXWpk0bd0xfIiACIiACIiAC4QkkpXIT3JTvvvvOxYTccMMNwbujtk7MzM8//+zcbCj0xBNPdB2Xf/zjH7Zp0ybnHody07Zt26jdM14FnXLKKTZ06FD75z//abjesY4EK5LxqpvumxwEcJPig6UDmT59uvtbuv76650lFEWHzv/TTz/tXLu2bt1qPMM33nijlS5d2kaPHm1YR+Jt9cEyzAeXzMxky5Yt9sknn9hpp51m9957r+HSyQAJwnvh1ltvdcrPhg0b7NFHH3Wueih0yLPPPuviES+77DLHi7J41yC44T388MNOmUGh4R5YjBs1aqTn0RHSlwiIgAiIgAiEJ5D0ys2rr75qjHgywhptoaMyYMAAq1q1akC54R4nn3yyc1d77bXXXAeIjlzRokWjfft8L4/RZVzySpUq5TphrEtEIDsEBg4c6Kx9dNB5Hq+66ip32bx586xu3brWqVMnt02c2tixY43ziM9B6tSpE3i+vv76a1u4cGHclRuvZBQvXtzVEVdNLDEIAykMBHg5+uijnQXniCOO8LvcEqWFxBxffvmlc2krV65culi+t956y7AAewspAydeeLegHNWuXdvWrVvnFBru42MI/XlaioAIiIAIiIAIpCeQ1MrNr7/+6jpCdKRCOxbpm5nzLTol99xzjxFTQMD0kUf+N7Ec7mfEojD6SuA0nbXrrrvO6AQx+iwRgYJIgKQaKMW4h+Jm5oUMY8HumritITt27AgoN3TgvRCwP3PmTNu7d69LaOH35/fSu7jyjkFo0znnnGOTJ092cXfB9WnWrFnY9w+JB4gHZJCA62mTT0rCOq6fkdw9sWiRkOHTTz8N3ApFCPc0iQiIgAiIgAiIQGQCSa3cvPPOO65lF110UeQW5uKIV2yIPaGDwki0F+9Xj/88QmejWrVqRryKlBtPScuCRoAEG14hCG47zw4uWV78esmSJf2udMdx9eQa4lviKcTTFSlSxHjeyfyGVaV8+fJOuQmtVzirLamjP/jgAzdAglKEkKTEp46nfVhmSEjiY3qCy8XKs23bNpelMXi/1kVABERABERABDInEPN5bjK/fe6PYlEhHTFKRjRHM+l8EDRM5+T22293o7RYa/x8NSgyCHEBzIFD4HQqJBNwjdKXCESZAM8nyQIIjucZev31153S4F3SuB0dfAYHmFdqzpw5hiUkEYQAfp5v3MdwUcWVLrvilTcUFAZLGIgJvf6ss84y3N2YT+rAgQPunYNLHnLhhRfawYMH7fnnn3fWYcogKcO3336b3SroPBEQAREQAREokASS1nJDhjQCfjt27BjVHw43M58ZjRTPXsjuROYiOmvdunVzGY7IhMToK52Uyy+/3J+a9Mtou/glPRA1ICKBrP5WiCchZoTgeIS4rsGDBweC7tlXoUIFt491rDadO3dmNe6CRYV3DBPWTpw40dWHbG+43nmh/d5l1e9jSTtwl0U5IesaViAywflYHs5h8ASlhiQKfBCfGOXMM8+07t27u2spAyHm5sEH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bvF+xyUyG9VNBERABESgYBJIPzNlwWSgVouACIiACIiACIiACIiACKQAASk3KfAjqgkiIAIiIAIiIAIiIAIiIAJmUm70VyACIiACIiACIiACIiACIpASBKTcpMTPqEaIgAiIgAiIgAiIgAiIgAjEXLn54osv7I033ogJabKw/fjjjxYp4dtPP/1kEyZMcNnacloBZhQnFSuTD0aSH374wQ4dOhTpsD311FPGJHypKKnctnj+Xr/++qsxx8mBAwcC1di0aZP7W4L5iy++GNif3ytff/21ffDBB1G97SeffBJo20cffRSx7Fi+RyLeNBsHePekpaUFPtm4JFunHDx40KZNm2a8YzKTvLzjMitXx0RABERABEQgWQnEPFva6tWrbc6cOdahQ4ccMeKfOh25efPmuVnLJ06cmO76d99918aNG+f2HX300fbggw/aqaeemu4c/vEzCV6PHj1ylI6Z83fs2BEoi3IHDBgQSGc9e/Zse+655wwFiDTPzNB+9913Z5h5HaWuQYMGVqVKlUBZqbKSym2Lx2/E3/ugQYNsy5YtgdsPHDjQmjZtanR0UeJRenbt2mVdunQJnJOfK4sXL7b58+dbq1atonZbUorTthUrVriO/Nlnnx227Ny+R8IWFsWd/fr1M+rmhfdU5cqV/Waul/v373fvvzp16mQ6uWlu33G5rpguFAEREAEREIEEJxBzy01u2s9o6E033WRr1661MmXKZLCOYA1BsaGTh2WmQoUKRkcweLQ7N/f111x77bWu3BdeeMHuu+8++/zzz23KlCnu8M6dO23MmDHWpEkTe+WVV5zSgwK2cOFCf7mWIpAjAszhcuedd7qU6fw983fVv3//gDJds2ZNu//+++2iiy7KUbnRPpkBioceeiiqxZ533nmubXTik1HuueceGzt2rHtfJWP9VWcREAEREAERSDUCMbfc5AYYczfQYahWrZoNGzbMvv/++3TFzJo1y1lMmLl77969tm3bNud6tmjRIqOzlFcJLuOMM85wnUysNMiePXvcEuWmcOHC1rBhQ1cXXNhatGjhjiXrFx1sRoyxIpx55pn21VdfOXcbRqfr1auXrM1K+HpjCcSC8cQTTwRG/c8666xs13vZsmWGxYBZ7ZFatWrZXXfdFSjrt99+s/Hjx9unn37q7lO2bFkbPHiwVa1a1Z3/3XffOeX9yy+/dNs8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Uh5FQAREQAREQAREQAREQARyJBB35WbhwoVutfEcc5KPABkZGRZqLVIWwBs5cqRbODC30W/ZssWWLVtmW7duze2pgfDPP/+8rV69OvA/lTZYlPGDDz6wl19+OWQZUrlsqXQdEp1Xniuer3DPWH7zN2/ePPv3v/+dYzQFUY/kmIkkDJCfOi4Ji6MsiYAIiIAIiEC+CcRduVm8eLG9/fbbuc7ounXr7G9/+5tdcskl1r1797Dnjx8/3i6++GIbM2bMfmF48U+dOtX27du337FIO7p27WrXXHON9erVy66++mrr16+f0dj3Em3eJk2aZGvXrvWnpczvrl27rEOHDvaPf/zD5s+fbyh62SVVy5a9HPofmcDkyZPd88UzdtFFF9m9995r06ZNi3xSLo5+/PHHNnHixBzPyGs9kmPEeQxAvdS2bVv74YcfAjG89NJLbt/vv/8e2BfvjbzWcfHOl+IXAREQAREQgUQRiPtU0HkpGL3F3bp1sxo1arhVzcMpJz/++KO99tpreUki4jmdO3e22rVr2+GHH25ff/21DR482MaOHeuUrGjzFjGBJD/46aefuhxitUnHNXqSHH9SZm/48OG2Y8cO11lAp0PRokXt9NNPT8q8FkSmvAIzevRoe/zxx12Sfl8oK3JB5ElpiIAIiIAIiIAImCWlcsPaDcOGDbPq1avbkCFDbOnSpftdKxSeBx980FBEsN7EUs4888xAdKeccopbiNNbL6LJW+DkFNuYO3euPfvss64RS0MNCxaCBatJkyYpVhplN5YEKleu7BSamjVr2qxZs2zRokUB5Qbr6L/+9S9n4TvyyCPtlltusaZNmwaSX758uaEc+ee4bt269sgjj+y3/hXP9BNPPGFYIwYNGpTQNaoCmY+wQecLFqUlS5bYcccdt19IyvHkk0+643QStGjRwm699VZXnxCY8l5//fXWqVMne++994zOGjpUnn76aXeMThX28SweddRR1qNHD2vWrNl+6WiHCIiACIiACIjAXwTi7pb2V1K520KxiSQvvviiFS9e3C677LJIwfJ8jMYbDbY777zTWB0dtxwvOeXNh0u134YNG7pGZ5s2baxYsWJum0Zo/fr1U60oym8cCNAYZxwW4pVdxsIwro1GNx0RFStWtIEDBzoFhXB0CvAM7dmzx/r27WtDhw61o48+er9xcLhC9u7d27777jsX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kG4E4q7c5AUYPcDdunWzGjVquFXN9+3bFzKaJ554wg455BB3LFZTE5N21apVrXv37lapUiWbN2+ePf3000Yj6KabbnKWHBSbK664wtq1a2fvv/++jRs3zho3bmz16tULmU/tFIF0JeCtNUOGDHFrOs2ePds9K1gzevTokdTFppMExebCCy+0888/38aMGWP/+7//6zokypUrZzVr1rR+/frZG2+8Yf/85z/DlqVu3bo2dOjQhE47HzZzOiACIiACIiAChYxAUio3rN0wbNgwq169utFoWrp0acjLQi8xSk2RIrHzritatKj17t07kN4555zjlBdc0BAsSQi9uCzQiZKDsvPBBx+kvHJzxx13GO52WM1atGhhS5Ysca5/ffr0sfr167ty60sEQhGoWLGi64ioXbu2ffTRR4bigOCqhWvojBkz3HatWrXc80V45M4777TKlSsbbmdbt2519xn32+GHH+6Ox/Prvffec/XHzTff7JK59957rUOHDvbhhx+635zS3rVrl/Xs2TMQbPjw4VaiRAn3n04R6rBnn33WSpYs6fZ9++23zrpMp8xRRx1lK1eudEoR9RtWLuqaG2+80aiDkG+++cZZxW644QZXB2FF4jkMtpS5gPoSAREQAREQAREIEIidVhCIMjYbKDY5yVVXXWUXX3yxs7LQcIiH4HLyyy+/GK5pSKlSpdwvDRsE1xVc2Wh4pLpQVqxlKG64G1155ZWGAhnstpPqZVT+40sANyk+WDMQFH+sm7ht4tqJRee+++4zb/FZu3at6zC47LLLnNLz/fffG26fBSHr16931lmfFh0ldFiwPxoh7IABA6x9+/a2adOmLGN2GjRoYLiy4ZLrBRfZAw880Ck2jOmjMwF5+OGHDQXr3XffdUqgD79z505X94wYMcIpPig1WIglIiACIiACIiAC4QkkrXITPsvmxuBgXeGlf9tttxmKBg0mGgyxFOJlbE+1atUCY4ZOOukklwQ9sgsWLHA9r+wIN/FALPNTEHGhxHlFrmXLltawYUPXIC2ItJVG6hKgkY8rZ5cuXZyl4uqrr3aFwdKJuybKy8knn+wUZxSBNWvWBAqLIsSYvFatWrlxK3PmzAkci+fGtm3bApYWnw4WlGifZSzMdAbgvppdUHywfqKwIFiw6DC44IIL3P+ZM2e6jpEmTZoYCh6ut9Qzb775pjse/AVLOnKw2vArEQEREAEREAERCE8gKd3Swmf3zyO4tHi3FhoEjLt5/PHHjUHHzZo1y+n0qI7jnnXPPfe4HmZ6TL3rG42WRx55xCZPnmwPPvigHXvssYYrTkG40USV8XwGonFXrFgxFwu/uMhEmhEun8np9DQhgGJStmxZw2KBm5kXrBcoyV54VhAUHD/RRp06dfxhN86FZwurhXfxChyM8QZWWNIJFmZO89bZ4P152WYsD65uzLrGzItYeFu3bu2i8sods7TxQVCSqF+yyymnnJJ9l/6LgAiIgAiIgAiEIZCSyk32svgGAY2HWIhXbHbs2OEmE/A+8z7uRo0aGR+EHlfcuJitLd2Enmk+EhHIiQCN9iOOOGK/YDw7vvHOQb9dpkyZQFi/jx0oApwTb8WGtFAm5s6dy6YTLDko8r7jxO9Hyc/LNM8oepSFsT2Mq6GOKF26tIu2fPny7veaa65xE5j4tEL9Zq9/QoXRPhEQAREQAREQgT8JJK1bGn77TMfMIGN6U9lmoDuCH/uiRYuMxggDd5nlCF/2WMxWhrKCyxuDfW+99VbnkkXawevV4DbDOBzG2WDVQRm65JJL/iSqbxEQgQCB5s2bu8kCeGZ4hnC7YmyLt9oQkIHzKBlYN3i2vetnIJI4bTB1M88u05rTkfHCCy+4lJjKOliwBtNxgosZzz31EcL6Pig9XvHx2348EWFwQ2OsDWVs27Ytu5zgskadRZrUNdQ71Gm4rklEQAREQAREQATyTiBpLTcoLMEv+l69ejmfdMbZMLNS8EBdejZxEYuFO8mWLVvcuhYgHThwYIAsvbmjR492/5n6mQYJ4t3UcMlJdaGxJRGB3BDIybLHGlM//vijGzRPvDwvgwYNCswIxj7WsWIfwrPMRBYFIQzOZ7ZDFunkw/1Px0b2Z5mZzbCwvJi5lg0zojHFNYoK20yW4KVz585u85ZbbnFTS/PnvPPOs1dffdW5egYrbVi5qF8effTRLDOuXXvttT46WU0DJLQhAiIgAiIgAtETOCCzl/GPaIITKCPza0/m1459GbZpd4at2rXP6mVstWqVKoSNgpW9UUS8YhA2YC4PMOiXmZdoDLEmRShhBjUaKxMnTgwswBkqXG73gYwZlRiPcuSRR4Y9nQYQA63pvU43Seeypdu1SobyYIFlfAuKTLBCxNTLrBfFB6tI9uM+7/GqR4gfi8vGjRudO5ofW+fTLYhf6jEsSChRfhroaNONVx0XbfoKJwIiIAIiIALJRiBpLTc5gUKp4ZMIoXGW3S8/EflQmiKQKgSYcCPSpBvFixdP2DPFJBrBkyAUNNNwnTMFnQ+lJwIiIAIiIALpQCBpx9ykA1yVQQREIDKBE088MaGKReTc6agIiIAIiIAIiECqEYi7WxouHwzG9TOaFSQg3MdY++awww4ryGQDaZE25U7HsSzpXLbABdRG0hBIZD2SNBBCZCTRdVyILGmXCIiACIiACCSUQNzd0nD54JMIwX0sUYoN5WVWqHSVdC5bul6zVC5XIuuRZOaW6DoumdkobyIgAiIgAoWTgNzSCud1V6lFQAREQAREQAREQAREIO0ISLlJu0uqAomACIiACIiACIiACIhA4SQg5aZwXneVWgREQAREQAREQAREQATSjoCUm7S7pCqQCIiACIiACIiACIiACBROAnFXbhYuXGiTJk2KG91169bZ6tWrLdRapP/9739t5MiRbra23GZgy5YttmzZMmPxwXBC2vv27Qt32K16Tt7SUVjRPV3Llo7XK55lysjIMD6hnsFYpRvveiRW+QyOBx6eTfD+WG7np46LZT4UlwiIgAiIgAgkC4G4z5a2ePFimzZtml166aW5KjOKA6uST58+3a1aPmrUqCznL1q0yAYOHOhW9uYAq3uPGTMmSxhe/FOnTrWuXbvmajpmwm/atCkQV6NGjax///6B6azff/99e+mllwwFiGmeW7VqZXfffXeWldc5GaXu+OOPtypVqgTiSpeNdC5bulyjgijHrFmz7LHHHgskxb1+9tlnu+c9lrMk5rUeCWSsgDfo9Aiu85gS/tRTT7XOnTtbLBftzGsdV8A4lJwIiIAIiIAIFBiBuCs3eSkJPZ7dunWzGjVq2BFHHLGfdQRryr333mu1a9e2a665xmrWrGnff/99XpIKeQ4NEOJmRfWvv/7aBg8ebGPHjrXu3bvbzz//bM8++6y1bt3abrrpJvvmm2+cknXyySdby5YtQ8annSKQrgS8tWbIkCFO+Z89e7Z7VnhOevToka7Fjrpcl112mZ177rnOyjl06FDbu3ev9enTJ+rzFVAEREAEREAERCB3BJJSuWHthmHDhln16tWNRtPSpUuzlGrKlClWrFgxe+KJJ6xIkSLu07x58yxh8vPnzDPPDJx+yimnuEYb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65H+97//tZEjR7rZ2nKbPrOBLV++3LZv3x721E2bNhkLiYaT559/3lavXh3ucFLvZ1HBDz74wF5++eWQZUjlsiU1+BTMnH8Wsz9/sSxKPOoRnz9fn/j//nfVqlXGfc6HRUTDCYtwvv7668aMbnkRFuL88MMP83Kq5aeOy1OCOkkEREAEREAEkpxA3GdLW7x4sU2bNs0uvfTSXKFYt26da1BMnz7drVo+atSowPl9+/a1RYsWBf77je7du9tFF13k/7oX/9SpU61r165RT8fMtNV33XWXLVu2LBBP06ZNjTRZaBD5/vvv7b777nOrivP/uuuusyuvvJLNLDJp0iQ7/vjj47bQaJbEYvhn165d1rFjRytRooRVqlTJGjduvF8ZUrVsMcSkqDIJzJo1yx577LEACxbVPfvss93zHstZEvNajwQyFmHj8ccfd+Xo0qWLXXHFFYGQe/futQ0bNthPP/1kmzdvds9E4GDQBh0YL774orVp0yZPM0POnj3bZsyYYeecc05QrNFtotzkto6LLmaFEgEREAEREIHUJBB35SYvWOhJ7datm9WoUcOOOOKI/awjd999t1u/xsf9n//8xyZOnGinnHKK35XnX9KuWrWqoSjRsJ83b549/fTTNnbsWLvpppuctah///5Wq1Yt6927t2vUcKx+/fpWr169PKebTCd++umnLjtYbdJxjZ5kYp3qefHWmiFDhrg1nWio8zxgzejRo0fSFw+r02effebu848++iiLclOzZk3r16+fvfHGG/bPf/4zbFnq1q1rQ4cOzfO083T85EWxCZshHRABERABERCBQkwgKZUb1m4YNmyYVa9e3Wg0LV26NMslOvLII42PFxonDRo0cIqQ35fX36JFizqlxZ9Po2PcuHGu95Z9X331lVOsrr/+epfemjVrXNB33nkn5ZWbuXPn2rPPPms7duxwrnxYvJBevXpZkyZN3La+RCAUgYoVK7rnoXbt2oaSMH/+fBcMVy1cQ7FMsO07BQiP3HnnnVa5cmXD7Wzr1q2uk6BPnz52+OGHu+Px/uJ5xkJz6623ujrnl19+sbJly0aVLBbOnj17BsIOHz7cWTsDOzI3sGxh1cECVKxYMTv//PNdxw1hFixY4JQitqtVq2aDBg1i08nGjRtt8ODB9uOPP7pn8aijjnLKYrNmzXwQ/YqACIiACIiACIQgEPcxNyHSjGoXik008sMPP7gxIZdffnk0wXMdBpcTGjy4piFemcGqNGXKFFu/fr2zMOFGl+rSsGFDe+SRR5x7DQ0xtvlglZKIQDQEcJPigzUDGT9+vL3//vvWqVMn59qJRQeXTm/xWbt2rU3PdD297LLLXKcCLp+vvPJKNEnFJAwusyhadGJgpZw5c2bU8R588ME2YMAAa9++vTH+DpfWYPniiy+cy16dOnXsiSeesIcfftjouPHCfqzAPF8rVqzwu90viiAdCk899ZRTuo477jin/FAXSURABERABERABMITSErLTfjs7n+EgbwlS5YMKB/7h8j7HnpmaXzQq+rHDPkJBmhkMNCY3tUJEyYElJ68p5b4M2ms4ZJHzzXjJdiWiEA0BGjk07hH+ed5vPrqq91pKC64a6K8IFu2bHGNdcIxPgdBEfLPF4PrP/nkkwJxaUPBwgXz4osvNiy2KPe4uPq8uMxF+EJRoZNj27ZtIUPhzsYz9T//8z8BpSbYdZUxbcccc4yVK1duv/OxZl177bW2cuVK++6775x1i0D8j9aytF+k2iECIiACIiAChYBASis3NCpoCNGQCu4RjcV1Y7awe+65x/UwM2C6SJE/jVylSpVy0d9///12wQUXuF7XF154wfz+WKStOEQg1Qi0atXKNbpxD6Vh7oWB+C1btvR/Dbc1BEuHV26wYHhhnMvkyZNt586d+7l4+TCx+v3666+dSxouYMyGhrWEiURQwEqXLp3vZLBKMaFIXuomZmrDHZROhmOPPTYw9o16SSICIiACIiACIhCeQEorN2+//bYrGX7ssRSv2DD2hMkE6In2wiQDCA2hG264wW0zm1KLFi3ctr5EoDASaN26dcgxbzw7wS5XfrtMmTIBTH4fO2jUcw5WjXgLVhrcL7HQYh3xaX788cfWtm3bQPKE4XnPrZQvX96WLFmS29Nc+DFjxrgOEzpOUI4YD/f555/nKS6dJAIiIAIiIAKFiUDSjrnBb59eVAYZ79mzx20Hj2vBpYTpiJs3bx6TXlZ/0Vm3hlnQcP9gkDFjBMiHX6+mUaNGztWExhmNorfeestNCX3eeef5KPQrAiLw/wR4PpksYM6cOe4ZevPNN+3QQw8NWG0I9s0337jGO+tKMQbmpJNOijs/6g8G+5922mn2wAMPBD6M9SMPwcIgflzu3n33XTf+jvoIYaY1lB6v+PhtP57o3HPPdetkMSEJ1iDqMqZt9kJdwznEnT0uxgGRDpYvOk+IQyICIiACIiACIpAzgaS13NBzSePDCy4ajH0ZMWKE28UMaSy02a5dOx8kJr80QmhMIAMHDnS/fNHYGD16tHNPe+ihh9wUsVdddZU7zm+wL33gpBTdyIsbTYoWVdnOJ4Gc7hVm3GPGLwbTI4xBYVYwxrh4qVChQmCmMKw2odaM8mFj9cvYHiy02S2uuNAxBTp1C0oYwkxl11xzjZv1jBnRmOIayw7bTJbgpXPnzm7zlltucbOisd4PE44wQcJrr73mjjExibcKMd097nlefF1GPcP2l19+aT7Os846y3H0YfUrAiIgAiIgAiIQmsABmb2Mf4Q+lHUvgTIyv/Zkfu3Yl2GbdmfYql37rF7GVqtWqULWwEH/8GWnJ5QXdkELDRisMKyB4xfgjFUewEbDhcHAuK2EEhoxDLSm9zrdJJ3Llm7XKhnKg9WCcTQoMsEKUYcOHVxDnsY8k3RkP+7znsh6xOchr79YZbA64/YW7I4XTXxYsA877DCnFIYKH886LlR62icCIiACIiACyU7gr+7TZM9pkuWPBppfqyPJsqbsiEDSEWDdmkhr19D5kK7PE5ORBE+ykJuLwyLGEhEQAREQAREQgegJJO2Ym+iLoJAiIAKpSuDEE0/Mc8M/VcusfIuACIiACIiACMSPQNzd0vyAWXztC1pwHcN3HreORAhpU24WB0w3Seeypdu1SofyJLIeSWZ+ia7jkpmN8iYCIiACIlA4CcTdLY11GvgkQnAdS5RiQ3n9gORElD3eaaZz2eLNTvHnnkAi65Hc57bgzkh0HVdwJVVKIiACIiACIhAdAbmlRcdJoURABERABERABERABERABJKcgJSbJL9Ayp4IiIAIiIAIiIAIiIAIiEB0BKTcRMdJoURABERABERABERABERABJKcgJSbJL9Ayp4IiIAIiIAIiIAIiIAIiEB0BOKu3CxcuNAmTZoUXW5yGYrF8VavXh32LBbAGzlypP3+++9hw4Q7sGXLFlu2bJmx+GA4YXXxffv2hTtszz//fMT8hT0xBQ6kc9lSAH+BZZHZuHjO+LAda5k3b579+9//zjHaeNYj4RLPb9mnTJliixcvDhn97t277eWXX3YLl4YMEOXO/NRxUSahYCIgAiIgAiKQUgTiPlsaL/dp06bZpZdemiswrOjNquTTp093q5aPGjUqy/nDhw938e7du9fNStapUye75JJLsoThxT916lTr2rVrrqZjJjyKi5dGjRpZ//79A6uEf//993bfffcZDRTkuuuusyuvvNIHD/yi1B1//PFWpUqVwL502UjnsqXLNYpFOSZPnuyUdB9XgwYNrHXr1nb22Wf7Xfn6/fjjj23JkiV27rnnRownr/VIxEhzOHjzzTcHOieYzv2EE06w9u3bW7169XI488/Dr776ql1wwQUhw+/cudPVb02aNLGyZctGFV+oQHmt40LFpX0iIAIiIAIikA4E4m65yQskeky7detmy5cvN1bozm4doUH07rvv2i233GKvv/66nXfeeTZ69Oh894L6vHbu3NlZfF555RWnxHz11Vc2duxYd5gebBSdWrVq2YsvvmhnnHGGOxauh9bHqV8RSGUCdCY89thjVqZMGfvb3/5mM2bMSOXiRJ33unXrurrgwQcfNBSSwYMHOytW1BEooAiIgAiIgAiIQIESiLvlJi+lYe2GYcOGWfXq1W3IkCG2dOnSLNHQW4mccsopzppy0kkn2cSJE23NmjX56gX1iZx55pl+M5AGbmoIig4LWF5//fVO8SJN5J133gnZQ+sOpsjXHXfc4axRWM1atGjhetRR5vr06WP169dPkVIom/EgULlyZStatKjVrFnTZs2aZYsWLbLTTz/dJYV1FCsrz8iRRx7pOh2aNm0ayAadFChH/jlGYXjkkUf2W/+KTownnnjCeL4HDRqU0DWqfOZLlCjhLK9YX3/88UdnxSJ/5cuXd/l88skn3XOCZYdn5tZbbw1YeIkDTl26dLHNmzfbsccea/fee69TEH38WEAHDhxoLFJKvYO1CM7sq1ChgvXo0cMHdQx//vlnGzBgQGCfNkRABERABERABLISSErLDVlEsQknNAKw6PCSf+2111xPcsWKFQ2XmVgJjRIabHfeeadreFx88cUuaq/M1KhRw/CpX79+vbGNQpDqwvglytKxY0fXgMXVjkbdhAkTUr1oyn8MCKB8fPDBBy4m3KkQxsIwrq1Zs2auI4LnkIa574BA4eEZ2rNnj/Xt29eGDh1qRx999H7j4Hbt2mW9e/e27777zoVL5OK7rmD//4ULKorYbbfdZi+88IJzP0WxQR566CFbsWKF3XPPPa6zA6Uvu/ssfHCXJcxPP/1k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+ZBxfP755+4Z51mYOXNmyDDsZAFPFuFkxrdYS37quFjnRfGJgAiIgAiIQDIQiPtsaYsXL7Zp06bZpZdemqvyrlu3zliVfPr06W5l71GjRgXOZ2rpAQMG2FdffeX2MdXywIED7YQTTgiEYYMXP4vgde3aNerpmIn7rrvucmtM+MiaNm1qffv2teLFixuL65E2yo0X1qG4+uqr/d/A76RJk+z444+3KlWqBPalwsauXbusY8eOVqJECatUqZI1btx4vzKkatlSgX8q5XHWrFn22GOPBbLMvX722We75z2WsySGq0dQap544gn77LPPAnm4/PLL3TNP58T48ePjtk4MHSAbNmyw+fPnG/XVaaedFshD8AYdHC+++KK1adMm5jNH5qWOC86btkVABERABEQg3QjEXbnJCzB6gLt162Y1atRwq5rv27cvSzRz5851is39999vderUsWHDhjnl5rXXXnMKSJbAufxD2lWrVrXu3bu7hv28efPs6aeftrFjx9pNN91ke/futbPOOst9DjnkEHv11Vdd73DdunUNJSgd5NNPP3XFwGqTjmv0pMM1SpYyeGvNkCFD3JpOs2fPds8K1ooePXrEPZuPPvqoLVq0yB555BHjGaTzAYtNQciZZ55pfPr16xcxOfI1dOjQhE5LHzGDOigCIiACIiACaUQgKZUb1m5AYalevbrRaFq6dGkW5O+9955VrlzZTj75ZLcfqwkuInxatWqVJWxu/xQtWtR69+4dOO2cc86xcePGuUYTO1Gm+Hi55pprjPzQqEp15Qal8dlnn7UdO3Y4Vz4sXkivXr2sSZMmvsj6FYH9CFSsWNF1RNSuXds++ugjZ80gEK5YuIbOmDHDbdeqVcs9X4RH7rzzTvcs43a2detWq1+/vvXp08cOP/xwdzzSFxYROh9uvvlma9SokQt67LHHGp9geemll2zy5MlOubj22mudZYnjGzdutMGDBzt3Niy2Rx11lFPImjVrFjh9woQJTnlCQZkyZYrt3LnTrrzySuO5z0mwgPbs2TMQbPjw4c4a6neghKH0UL9h5aKuufHGG406iGeR8FjBQuXdx6FfERABERABERCBrATiPuYma3LR/0OxCSc0fGg4eKExjuAiEmuhAYULWjjFxbvDZHeJi3U+CiK+hg0buh5w3GeKFSvmtukRp8EpEYFoCOAmxQdlAMEt7P33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K0Q07jp37uw+t912m11++eU2fvz4LHG8++67dskll9gNN9zgjn/11VdZjvOHF//UqVMjKiD7nRS0Y/v27S7uiy66KIuCRAPkiiuusK5du9qll15qEyZMCDrrr02UurVr1/61I4220rlsibhM69ats+7du1unTp3s1ltvdfcdDX9k7969Ton/7LPPXCM5EfkjzdmzZ9vLL78c0+SZUpwOivfee89mzJgRNu681CNhI/v/A3369LGLL77YeL6pb4YPH267du3K6bRcH6eD48UXX7Tdu3dHPPef//ynharHIp2U3zouUtw6JgIiIAIiIAKpSCDuyk1eoNCYO+uss2zEiBH2wgsv2HnnnWevvPKKzZs3z0VHY4GGSMeOHZ1lpkKFCjZgwIAsvd15STf7OU899VQWpYbj9PT279/fatWq5RosZ5xxho0dO9ZofElEIC8E6NG/44473JTpWBpRlvv27RtYG6pmzZrWr18/O//88/MSfczOQZF/6KGHYhYfEZ155pmubHXr1o1pvNFGVqVKFRs6dKhdd9119vHHH9vtt98ec0sOZSONRE5LHy0PhRMBERABERCBVCcQ93Vu8gKoTp06xsfLNddc43p2seg0bdrUbbMw5lVXXWU7d+609evXOyXk008/dY0lf15+fqdPn+4UFtII7q2mZ5Xe5uuvv96OOOIIW7NmjUvmnXfesXr16uUnyYSfSwOb3mWsCC1atLAlS5Y4ZY4e7vr16yc8f+magffff9/dUyjTlStXdsU89dRToy4uSv+oUaNs48aN7hwU77vuuisQFxZIOgq+/PJLl86RRx5pgwYNsmrVqrnwP/zwg1PQv/76a/e/evXqrjHuM7BgwYLAf87h3GDZunWr62SYO3euu38qVqzoFBbiySlvwfEkYptFdlEe+cDlvvvucxYq7v9IeefYsGHD7Nlnn7WSJUu6rOO2N3jwYHviiSfsqKOOclagnj17BopFh0yJEiUC/z/55BN77rnnjOvTpEmT/dzW5syZY6NHj3aWrdKlS9u1115rbdq0CZyvDREQAREQAREQgf0JJKXlJns2ccdBTjjhBPeLqxfWGhQcGoSNGzcO7Hcb+fxirM8zzzxjd999d5bGCNF6ZaZGjRo2ZcoUp1ixjUKQ6oJFjLJgEZs1a5ZdeeWVRs92OLe7VC9vsuR/6dKlzkrjFZvc5otxX5dddpmzZg4ZMsQ1qrH8eBk3bpyheGB1GTNmjOsUKFLkr0f/0UcfdUoJDXUa7Keccoo/1f3S0YC1EgV3xYoVWY4xbgWrEopTly5dnJJz4YUX2o4dO1y4nPKWJbIE//EK/PLly3PMe4MGDWzz5s02bdq0QK5xgaVOQrFBUJywKLdv394Yn8cYQS9wefzxx6127dr28MMPO/5YrL1gCWY/dRt1HNZrrg/xSERABERABERABMIT+KuFEz5MQo/QmKLXGb94elcRBl0fcsghxgBkepvvvPNOK1asmOsBjUVmH3vsMadINW/efL/o6GVFUIAY4H3//fdbuXLlXJ72C5yCO7CM8UFatmxpDRs2NAZES+JHAL7BPfq5Tenkk0+2c889192DK1eutKpVq7r7ExdKxE+Igfsb9yphUVq9EI6GN6vdcy7KbbCQt2OOOcadG7yfbaypfLCutm3b1sWL+xqNfySnvLlASfKFYsLH3++R8o7ignWHsX8IbOkQuOCCCwKlgSedBZUqVQrs8xvUWzBnTCHP2C233OIPud833njD5QXFkklVsCpRx6FASURABERABERABMITSEq3NJ9dLAkoLjS2b7rpJr/bDj/8cFu0aJE9/fTTdu+99zq3EHo9S5UqFQiT1w0aKN98841z68H1hIYF8sUXX9hxxx0XSAOlhoYMvb2MC4pF2nnNcyzPO+igg1wjijhpTBUtWtQNaI9lGoorKwHcG7nn8ipYD7A0li1b1nUA+N59ngka4R06dHCWRdwLEVzeaEz7exYXNs6/+eab3TWnI4HJMqIRb7H0VtXs5+SUt+zhE/kfawoKB9cDySnvWKiof5jNDmsP57Zu3TqqIjD7G88X1wzJbrXDOs2ziEXMS7NmzQz3NIkIiIAIiIAIiEB4Akmr3KDYMAYEtwzcXugF9UJPKK5qDObHuuIbWKF6SP050f4y5oQGxD/+8Q93CmN6EBp/NGR8GvTUMlMbQs81vbjpJjAP5p5u5UuW8tA7/8EHHziXr6OPPjpstmgMc99lF8Zy8CzQEYAw/mbZsmWBYPT6P/LII05JZcYzxoSQDjOzIVgOGNvB2BlmwcMNEasFynxO4hUBxpsEW4P8eTnlzYcrXrx4XGYq8/FH8zt//nwXDFcxJKe8Y51ivA0zveFaePzxx0etfDDJAMonlmDiYNazYClfvrxzeQ12Lww+rm0REAEREAEREIHQBJLSLQ1lBcUGCw0uMlhPaKx5dxHcahCUEJQPFBHcSbKPFQhd5Mh76XllAgH/6ZI5jgBhRjQaM40aNXK94WXKlHGNsbfeesv5y+MTLxGBvBA455xz7NBDD3WD0XErYzpipkX2jW0fJz33WAdwhcIt0q//hPLCf87D2oiiFCzTMyfHIF4sAbh28qwEK0mMHWP8CJYc3M8QrBhe2CY8aePCxrY/n/BYH5iqnfwSBiunV65yyptP46STTnLWKyyylMW71Pnj8fqFGYoZ09XjjoqC5t1Ro8k71ltcxbC84ZYXLNlZeW64CXpLF9yo1xgXFSzUcSg/TA+9ZcsWV8dwT+R2HZzgOLUtAiIgAiIgAoWBQFJabmgoYEHhg8uMF9xAcJ1hXABuan//+99dTzONNQbu0vsbb2EgNgOzsSYxkxrCb6rPlEY54CgpeAIoHbhYDhw40IJn1+KeDhYGqjO25cXMNVOwKvTo0cM1qG+88UY36JwJIBDczpiJywvr5Tz55JP+r1PQcVXz8uqrrzprD/+xDrH2C9YcL926dcsykL1du3buENYeZkbDKsTgdyYdQLiPmKQAySlvLlDmV6tWrZyCwHOFgoT1Kburlg8by18mCOndu7dT0M4+++ws7njR5J1ODfjBDQUtWLhGzITnhbV0EFwCmdab6afpNEE5QpGCm7eUYgnuktmx8tJLLzkFh/NI44EHHmBTIgIiIAIiIAIiEIbAAZm9iH+EOZZlN4EyMr/2ZH7t2Jdhm3Zn2Kpd+6xexlarVqlClrDBf1hRHd91GkKxFnqUWQAQVzHfKAhOgx5ZGi4TJ06MueIDNqagZoA2jY5QQk8uDVTfExwqTKruS+eyJfKaMM04VhTcksLdV+Hyh8WT80IpqVg4cX3iWWEcVXbBOsAMZygUoZ6l7OFD/cfFCtc2ZjLMnkakvIWKK/u+eNYj2dPK/j+/ec8eX/B/OnC43iiJoQTrD3UcPHEBzH5t4lnHhcqP9omACIiACIhAshPYv5WT7DkOyh8v/ILo3Q1KMrBJIyNcgyQQSBsikEsCuKfxyYtEuh+Z8cyvaxMqblw88ztYnbEjfs2X7GlEylv2sMn2P555Z8KHSPFjKY50PNlYKT8iIAIiIAIikGgCSTnmJtFQlL4IiIAIiIAIiIAIiIAIiEDqEYi7W5ofiEwPZUELrmO4+Rx22GEFnbRLj7Qpdyg3oYRkKIaJpnPZYohJUcWIQCLrkRgVIS7RJLqOi0uhFKkIiIAIiIAI5INA3N3SGCzNJxGC61iiFBvKm1f3okSwym2a6Vy23LJQ+PgTSGQ9Ev/S5T2FRNdxec+5zhQBERABERCB+BCQW1p8uCpWERABERABERABERABERCBAiYg5aaAgSs5ERABERABERABERABERCB+BCQchMfropVBERABERABERABERABESggAlIuSlg4EpOBERABERABERABERABEQgPgSk3MSHq2IVAREQAREQAREQAREQAREoYAJSbgoYuJITAREQAREQAREQAREQARGID4G4KzebN2+2n3/+OT65zyHW3bt325o1a3IIFZ/DrD+xcuVK27dvX3wSSGCs6Vy2BGJV0hEIJLIeiZCthB9KZB2X8MIrAyIgAiIgAiIQgkDclZtx48bZ8OHDQyQd/11z5861Xr16xT+hECns2LHDevbsaevXrw9xNLV3pXPZUvvKpG/uE1mPJDPVRNZxycxFeRMBERABESi8BOKu3BRetCq5CIiACIiACIiACIiACIhAQRIoGo/Evv32W5s2bZqLesGCBfbbb78FrDennnqqbdu2zVasWBEy6QsvvNAWLVoU8Thx446RXVjF/IILLrCXXnrJHcItjHDecnT00Udby5YtbcqUKdlPdf+rVq1qlSpVss8++yzk8aZNm9qmTZsi5m3q1Km2fft227Nnj4tj/Pjxdthhh1nRokWte/fuNmHChLB5P++88/KVtwMPPDBfeY/EtWPHjkbvebiydejQIWnznhPXxo0b5yvvOd0T+bmf0znvOT1rBxxwQL7qkZzu51R9FnOq49q2bRuy/tJOERABERABESgMBOKi3DDOZNeuXY7f77//bnz8fxQdXLWWLl0aki9KQU7Hly9fbjt37tzv/GLFihnjQXxae/fudWGC/5N+uLRRQEqUKBH2eO3atXPMG2nx8coN2ygdfJBIec9v3ooUKZKvvEfKG3mPVLZkzntOeatfv35YbrG4J/JzP6dz3nN61ugU4J5D8lKP5HQ/RzqeE/ec8h7PZzGnOs4B05cIiIAIiIAIFFICB2S+KP+IpuwEysj82pP5tWNfhm3anWGrdu2zehlbrVqlCmGjGDp0qG3dutUGDBgQNky8DsyaNctI//XXX49XEmHjxcJx1VVX2ciRI61KlSphw6XigXQuWypej8KQ50TWI8nMN5F1XDJzUd5EQAREQAQKLwGNuSm8114lFwEREAEREAEREAEREIG0IhB3y826deucS0kirBdYGEi/Tp06BX7RMjIybMmSJYYrG+5y6STpXLZ0uk7pVJZE1iPJzDGRdVwyc1HeREAEREAECi+BuCs3hRetSi4CIiACIiACIiACIiACIlCQBOSWVpC0lZYIiIAIiIAIiIAIiIAIiEDcCEi5iRtaRSwCIiACIiACIiACIiACIlCQBKTcFCRtpSUCIiACIiACIiACIiACIhA3AlJu4oZWEYuACIiACIiACIiACIiACBQkASk3BUlbaYmACIiACIiACIiACIiACMSNgJSbuKFVxCIgAiIgAiIgAiIgAiIgAgVJQMpNQdJWWiIgAiIgAiIgAiIgAiIgAnEjIOUmbmgVsQiIgAiIgAiIgAiIgAiIQEESKFqQieUmrcmTJ9umTZvcKaeffrrVrl07N6fnK+zUqVPtmGOOsXr16uUrnpxOnjVrlpUqVcoaNWqUU9C0Of7rr7/ahg0b7Mgjj7SSJUuGLNeWLVvsoIMOskMPPTTkce0UAREQAREQAREQAREQgVAEkla5+eWXX1wjePbs2VaxYsUCVW5ee+01a926ddyVG9KpVatWgSs37777rm3evNk6deoU6p6Iy77ff//d7rrrLlu2bFkg/qZNm1rfvn2tePHibt+2bdvs3nvvtZUrV7r/zZs3t/vuu8+KFk3a2zRQFm2IgAiIgAiIgAiIgAgknkDSuqV17drV+vXrZwceeGDiKcUpBzTcr7766jjFHj7ab775xubOnRs+QByO/PHHH1a1alV7/PHH7eWXX7Y77rjD5s2bZ2PHjg2k9vTTTzula+TIkXbLLbfY559/bq+++mrguDZEQAREQAREQAREQAREIBKBuHWJ//e//7Unn3zSlixZ4hSUFi1a2K233moHH3ywbd++3TVezznnHPvwww9t586ddt5559kNN9xgBxxwQKT8umMDBw60ChUqWI8ePQJhhw8fbj///LMNGDAgsC/SxgsvvGAff/yxsw7hHtW9e3c744wzAqesXbvWevbsaWvWrLGTTz7ZpVWmTBl3HOXgmWeesfXr11uJEiWsXbt21r59e5s0aZLNmTPHHn300UA8bOzbt8+6devmyoy14l//+pe9//77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LNz0yDNWC5Qar9gwvia76xvWlS6ZkzEgWNC8pc7tCPOFAkhZESYp8MKkBczAhlA2XNaYHQ5B4Qhm5XZG+Armlj0YU4szUQGTNCAwg6NfQwfLGpYYriVjdbh2wco4kzww+58Xrmtu8ubP068IiIAIiIAIiIAIiED8CByQaT34c6R0DmkQKCPza0/m1459GbZpd4at2rXP6mVstWqVKoQ9m/Ea9HZ7t62wAfNwgBmsmPUMhYc0ciP0ujNTGQ3z7DOlRRMP1g4a+Sg7jAEqaMHqhMJFA5spjJn8IFaC+xhWKabb9o1/4sZt69lnn3VKAOyweMWj7Fh1UC5CuZflt4xMg82sapQtkjIUKh3Og0ulSpWycAkVVvtEQAREQAREQAREQAQKnkDcLDe+KExpHGvBAsAMafS0X3zxxblWbMgPypB3ScpL/nBLys/5eUmTc3D1w60K1ygsR1iCsLjEUrBq5FQ2rEbxkuxjfGKZDhMX+MkLchsvroZY+SQiIAIiIAIiIAIiIALJSSAuY27iXVSsQYzXYOFM3I0Kk9C4ZvpiBrZjfWLdlWjcwmLBCIUmeOxQLOJUHCIgAiIgAiIgAiIgAiIQKwJxd0uLVUYVjwiIgAiIgAiIgAiIgAiIgAhEIpCSlptIBdIxERABERABERABERABERCBwklAyk3hvO4qtQiIgAiIgAiIgAiIgAikHQEpN2l3SVUgERABERABERABERABESicBKTcFM7rrlKLgAiIgAiIgAiIgAiIQNoRkHKTdpdUBRIBERABERABERABERCBwklAyk3hvO4qtQiIgAiIgAiIgAiIgAikHQEpN2l3SVUgERABERABERABERABESicBKTcFM7rrlKLgAiIgAiIgAiIgAiIQNoRkHKTdpdUBRIBERABERABERABERCBwklAyk3hvO4qtQiIgAiIgAiIgAiIgAikHQEpN2l3SVUgERABERABERABERABESicBKTcFM7rrlKLgAiIgAiIgAiIgAiIQNoRkHKTdpdUBRIBERABERABERABERCBwklAyk3hvO4qtQiIgAiIgAiIgAiIgAikHQEpN2l3SVUgERABERABERABERABESicBPKl3BxQOJmp1CIgAiIgAiIgAiIgAiIgAklIIE/KjVNqpNkk4eVUlkRABERABERABERABESg8BLItXLjdRpOLOL/FF5+KrkI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" - } - }, - "cell_type": "markdown", - "id": "c303d698-2f44-4f6f-8ce5-6a4f9f13534a", - "metadata": {}, - "source": [ - "![image.png](attachment:f7ad0425-26fe-482c-b97c-c9493b05fbf2.png)" - ] - }, - { - "cell_type": "markdown", - "id": "abd854e5", - "metadata": {}, - "source": [ - "## Create a data processing function\n", - "\n", - "The following code demonstrates how to create a simple data processing function using MLRun.
\n", - "The function will process the data and show some statistics.
\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b4e759f9-7154-4397-8db3-93b808426bd1", - "metadata": {}, - "outputs": [], - "source": [ - "%%writefile process_data.py\n", - "\n", - "\n", - "# Here is an example of Spark processing.\n", - "from pyspark.sql import SparkSession\n", - "from pyspark.sql.functions import avg, min, max\n", - "import pandas as pd\n", - "import json\n", - "import fsspec\n", - "\n", - "def process_data(data_path: str, data_output_path: str):\n", - " spark = SparkSession.builder.appName(\"MusicDemo\").getOrCreate()\n", - " spark_df = spark.read.parquet(data_path, header=True)\n", - " spark_df = spark_df.drop(\"name\", \"id\")\n", - " \n", - " music_stats = spark_df.groupBy(\"favorite_music_type\").agg(\n", - " avg(\"age\").alias(\"avg_age\"),\n", - " min(\"age\").alias(\"min_age\"),\n", - " max(\"age\").alias(\"max_age\")\n", - " )\n", - " music_stats.show()\n", - " pandas_df = spark_df.toPandas()\n", - " pandas_df.to_parquet(data_output_path)\n", - " # spark_df.write.mode(\"overwrite\").parquet(data_output_path)\n", - "\n", - " return {\"music_data\": data_output_path}" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "13748b64-6a48-4500-a2a8-d9290dd082c5", - "metadata": {}, - "outputs": [], - "source": [ - "process_data_function = project.set_function(\n", - " func=\"./zeev-demos/mlflow-databricks/process_data.py\",\n", - " name=\"process-data\",\n", - " kind=\"databricks\",\n", - " image=\"mlrun/mlrun\",\n", - ")\n", - " " - ] - }, - { - "cell_type": "markdown", - "id": "2dbadf07-a32a-40da-b9bc-609070e4392d", - "metadata": {}, - "source": [ - "Set all parameters necessary for the function and run it." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "5642aa15-e8c0-4a72-a0a8-4cacd34fb63c", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2024-03-27 15:34:45,422 [info] Storing function: {'name': 'process-data-process-data', 'uid': 'a9c770f8377046bda3061e61a5c015c2', 'db': 'http://mlrun-api:8080'}\n", - "> 2024-03-27 15:34:45,675 [info] Job is running in the background, pod: process-data-process-data-89bhh\n", - "> 2024-03-27 15:34:49,272 [info] Running with an existing cluster: {'cluster_id': '0327-134616-43m7kfxk'}\n", - "> 2024-03-27 15:34:49,492 [info] Starting to poll: 493449112310004\n", - "> 2024-03-27 15:34:49,539 [info] Workflow intermediate status: mlrun_task__15_34_48_703046: RunLifeCycleState.PENDING\n", - "> 2024-03-27 15:34:50,947 [info] Workflow intermediate status: mlrun_task__15_34_48_703046: RunLifeCycleState.PENDING\n", - "> 2024-03-27 15:34:53,063 [info] Workflow intermediate status: mlrun_task__15_34_48_703046: RunLifeCycleState.RUNNING\n", - "> 2024-03-27 15:34:56,737 [info] Workflow intermediate status: mlrun_task__15_34_48_703046: RunLifeCycleState.RUNNING\n", - "> 2024-03-27 15:35:00,947 [info] Artifacts found. Run name: mlrun_task__15_34_48_703046\n", - "> 2024-03-27 15:35:01,881 [info] Job finished: https://dbc-94c947ab-feb9.cloud.databricks.com/?o=4658245941722457#job/499259196347814/run/493449112310004\n", - "> 2024-03-27 15:35:01,881 [info] Logs:\n", - "+-------------------+------------------+-------+-------+\n", - "|favorite_music_type| avg_age|min_age|max_age|\n", - "+-------------------+------------------+-------+-------+\n", - "| Rock| 30.125| 27| 34|\n", - "| Classical|47.666666666666664| 38| 75|\n", - "| Pop| 24.0| 18| 38|\n", - "+-------------------+------------------+-------+-------+\n", - "\n", - "2024-03-27 15:34:54,980 - mlrun_logger - INFO - successfully wrote artifact details to the artifact JSON file in DBFS - music_data : /dbfs/demos/mlrun_databricks_demo/music_output_new.parquet\n", - "> 2024-03-27 15:35:02,182 [info] To track results use the CLI: {'info_cmd': 'mlrun get run a9c770f8377046bda3061e61a5c015c2 -p mlflow-tracking-example-guy', 'logs_cmd': 'mlrun logs a9c770f8377046bda3061e61a5c015c2 -p mlflow-tracking-example-guy'}\n", - "> 2024-03-27 15:35:02,182 [info] Or click for UI: {'ui_url': 'https://dashboard.default-tenant.app.llm-dev.iguazio-cd1.com/mlprojects/mlflow-tracking-example-guy/jobs/monitor/a9c770f8377046bda3061e61a5c015c2/overview'}\n", - "> 2024-03-27 15:35:02,182 [info] Run execution finished: {'status': 'completed', 'name': 'process-data-process-data'}\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
projectuiditerstartstatenamelabelsinputsparametersresultsartifacts
mlflow-tracking-example-guy0Mar 27 15:34:48completedprocess-data-process-data
v3io_user=zeevr
kind=databricks
owner=zeevr
mlrun/client_version=1.6.1
mlrun/client_python_version=3.9.16
host=process-data-process-data-89bhh
task_parameters={'timeout_minutes': 15, 'spark_app_code': 'IAoKaW1wb3J0IG9zCmltcG9ydCBsb2dnaW5nCm1scnVuX2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCdtbHJ1bl9sb2dnZXInKQptbHJ1bl9sb2dnZXIuc2V0TGV2ZWwobG9nZ2luZy5ERUJVRykKCm1scnVuX2NvbnNvbGVfaGFuZGxlciA9IGxvZ2dpbmcuU3RyZWFtSGFuZGxlcigpCm1scnVuX2NvbnNvbGVfaGFuZGxlci5zZXRMZXZlbChsb2dnaW5nLkRFQlVHKQptbHJ1bl9mb3JtYXR0ZXIgPSBsb2dnaW5nLkZvcm1hdHRlcignJShhc2N0aW1lKXMgLSAlKG5hbWUpcyAtICUobGV2ZWxuYW1lKXMgLSAlKG1lc3NhZ2UpcycpCm1scnVuX2NvbnNvbGVfaGFuZGxlci5zZXRGb3JtYXR0ZXIobWxydW5fZm9ybWF0dGVyKQptbHJ1bl9sb2dnZXIuYWRkSGFuZGxlcihtbHJ1bl9jb25zb2xlX2hhbmRsZXIpCgptbHJ1bl9kZWZhdWx0X2FydGlmYWN0X3RlbXBsYXRlID0gJ21scnVuX3JldHVybl92YWx1ZV8nCm1scnVuX2FydGlmYWN0X2luZGV4ID0gMAoKCmRlZiBtbHJ1bl9sb2dfYXJ0aWZhY3QobmFtZT0nJywgcGF0aD0nJyk6CiAgICBnbG9iYWwgbWxydW5fYXJ0aWZhY3RfaW5kZXgKICAgIG1scnVuX2FydGlmYWN0X2luZGV4Kz0xICAjICBieSBob3cgbWFueSBhcnRpZmFjdHMgd2UgdHJpZWQgdG8gbG9nLCBub3QgaG93IG1hbnkgc3VjY2VlZC4KICAgIGlmIG5hbWUgaXMgTm9uZSBvciBuYW1lID09ICcnOgogICAgICAgIG5hbWUgPSBmJ3ttbHJ1bl9kZWZhdWx0X2FydGlmYWN0X3RlbXBsYXRlfXttbHJ1bl9hcnRpZmFjdF9pbmRleH0nCiAgICBpZiBub3QgcGF0aDoKICAgICAgICBtbHJ1bl9sb2dnZXIuZXJyb3IoZidwYXRoIHJlcXVpcmVkIGZvciBsb2dnaW5nIGFuIG1scnVuIGFydGlmYWN0IC0ge25hbWV9IDoge3BhdGh9JykKICAgICAgICByZXR1cm4KICAgIGlmIG5vdCBpc2luc3RhbmNlKG5hbWUsIHN0cikgb3Igbm90IGlzaW5zdGFuY2UocGF0aCwgc3RyKToKICAgICAgICBtbHJ1bl9sb2dnZXIuZXJyb3IoZiduYW1lIGFuZCBwYXRoIG11c3QgYmUgaW4gc3RyaW5nIHR5cGUgZm9yIGxvZ2dpbmcgYW4gbWxydW4gYXJ0aWZhY3QgLSB7bmFtZX0gOiB7cGF0aH0nKQogICAgICAgIHJldHVybgogICAgaWYgbm90IHBhdGguc3RhcnRzd2l0aCgnL2RiZnMnKSBhbmQgbm90IHBhdGguc3RhcnRzd2l0aCgnZGJmczovJyk6CiAgICAgICAgbWxydW5fbG9nZ2VyLmVycm9yKGYncGF0aCBmb3IgYW4gbWxydW4gYXJ0aWZhY3QgbXVzdCBzdGFydCB3aXRoIC9kYmZzIG9yIGRiZnM6LyAtIHtuYW1lfSA6IHtwYXRofScpCiAgICAgICAgcmV0dXJuCiAgICBtbHJ1bl9hcnRpZmFjdHNfcGF0aCA9ICcvZGJmcy9tbHJ1bl9kYXRhYnJpY2tzX3J1bnRpbWUvYXJ0aWZhY3RzX2RpY3Rpb25hcmllcy9tbHJ1bl9hcnRpZmFjdF9hOWM3NzBmODM3NzA0NmJkYTMwNjFlNjFhNWMwMTVjMi5qc29uJwogICAgdHJ5OgogICAgICAgIG5ld19kYXRhID0ge25hbWU6cGF0aH0KICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhtbHJ1bl9hcnRpZmFjdHNfcGF0aCk6CiAgICAgICAgICAgIHdpdGggb3BlbihtbHJ1bl9hcnRpZmFjdHNfcGF0aCwgJ3IrJykgYXMganNvbl9maWxlOgogICAgICAgICAgICAgICAgZXhpc3RpbmdfZGF0YSA9IGpzb24ubG9hZChqc29uX2ZpbGUpCiAgICAgICAgICAgICAgICBleGlzdGluZ19kYXRhLnVwZGF0ZShuZXdfZGF0YSkKICAgICAgICAgICAgICAgIGpzb25fZmlsZS5zZWVrKDApCiAgICAgICAgICAgICAgICBqc29uLmR1bXAoZXhpc3RpbmdfZGF0YSwganNvbl9maWxlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHBhcmVudF9kaXIgPSBvcy5wYXRoLmRpcm5hbWUobWxydW5fYXJ0aWZhY3RzX3BhdGgpCiAgICAgICAgICAgIGlmIHBhcmVudF9kaXIgIT0gJy9kYmZzJzoKICAgICAgICAgICAgICAgIG9zLm1ha2VkaXJzKHBhcmVudF9kaXIsIGV4aXN0X29rPVRydWUpCiAgICAgICAgICAgIHdpdGggb3BlbihtbHJ1bl9hcnRpZmFjdHNfcGF0aCwgJ3cnKSBhcyBqc29uX2ZpbGU6CiAgICAgICAgICAgICAgICBqc29uLmR1bXAobmV3X2RhdGEsIGpzb25fZmlsZSkKICAgICAgICBzdWNjZXNzX2xvZyA9IGYnc3VjY2Vzc2Z1bGx5IHdyb3RlIGFydGlmYWN0IGRldGFpbHMgdG8gdGhlIGFydGlmYWN0IEpTT04gZmlsZSBpbiBEQkZTIC0ge25hbWV9IDoge3BhdGh9JwogICAgICAgIG1scnVuX2xvZ2dlci5pbmZvKHN1Y2Nlc3NfbG9nKQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB1bmtub3duX2V4Y2VwdGlvbjoKICAgICAgICBtbHJ1bl9sb2dnZXIuZXJyb3IoZidsb2cgbWxydW4gYXJ0aWZhY3QgZmFpbGVkIC0ge25hbWV9IDoge3BhdGh9LiBlcnJvcjoge3Vua25vd25fZXhjZXB0aW9ufScpCgoKCgppbXBvcnQgYXJncGFyc2UKaW1wb3J0IGpzb24KcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQpwYXJzZXIuYWRkX2FyZ3VtZW50KCdoYW5kbGVyX2FyZ3VtZW50cycpCmhhbmRsZXJfYXJndW1lbnRzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKS5oYW5kbGVyX2FyZ3VtZW50cwpoYW5kbGVyX2FyZ3VtZW50cyA9IGpzb24ubG9hZHMoaGFuZGxlcl9hcmd1bWVudHMpCgoKZnJvbSBweXNwYXJrLnNxbCBpbXBvcnQgU3BhcmtTZXNzaW9uCmZyb20gcHlzcGFyay5zcWwuZnVuY3Rpb25zIGltcG9ydCBhdmcsIG1pbiwgbWF4CmltcG9ydCBwYW5kYXMgYXMgcGQKaW1wb3J0IGpzb24KaW1wb3J0IGZzc3BlYwoKZGVmIHByb2Nlc3NfZGF0YShkYXRhX3BhdGg6IHN0ciwgZGF0YV9vdXRwdXRfcGF0aDogc3RyKToKICAgIHNwYXJrID0gU3BhcmtTZXNzaW9uLmJ1aWxkZXIuYXBwTmFtZSgnTXVzaWNEZW1vJykuZ2V0T3JDcmVhdGUoKQogICAgc3BhcmtfZGYgPSBzcGFyay5yZWFkLnBhcnF1ZXQoZGF0YV9wYXRoLCBoZWFkZXI9VHJ1ZSkKICAgIHNwYXJrX2RmID0gc3BhcmtfZGYuZHJvcCgnbmFtZScsICdpZCcpCiAgICBtdXNpY19zdGF0cyA9IHNwYXJrX2RmLmdyb3VwQnkoJ2Zhdm9yaXRlX211c2ljX3R5cGUnKS5hZ2coYXZnKCdhZ2UnKS5hbGlhcygnYXZnX2FnZScpLCBtaW4oJ2FnZScpLmFsaWFzKCdtaW5fYWdlJyksIG1heCgnYWdlJykuYWxpYXMoJ21heF9hZ2UnKSkKICAgIG11c2ljX3N0YXRzLnNob3coKQogICAgcGFuZGFzX2RmID0gc3BhcmtfZGYudG9QYW5kYXMoKQogICAgcGFuZGFzX2RmLnRvX3BhcnF1ZXQoZGF0YV9vdXRwdXRfcGF0aCkKICAgIHJldHVybiB7J211c2ljX2RhdGEnOiBkYXRhX291dHB1dF9wYXRofQpyZXN1bHQgPSBwcm9jZXNzX2RhdGEoKipoYW5kbGVyX2FyZ3VtZW50cykKCgppZiByZXN1bHQ6CiAgICBpZiBpc2luc3RhbmNlKHJlc3VsdCwgZGljdCk6CiAgICAgICAgZm9yIGtleSwgcGF0aCBpbiByZXN1bHQuaXRlbXMoKToKICAgICAgICAgICAgbWxydW5fbG9nX2FydGlmYWN0KG5hbWU9a2V5LCBwYXRoPXBhdGgpCiAgICBlbGlmIGlzaW5zdGFuY2UocmVzdWx0LCAobGlzdCwgdHVwbGUsIHNldCkpOgogICAgICAgIGZvciBhcnRpZmFjdF9wYXRoIGluIHJlc3VsdDoKICAgICAgICAgICAgbWxydW5fbG9nX2FydGlmYWN0KHBhdGg9YXJ0aWZhY3RfcGF0aCkKICAgIGVsaWYgaXNpbnN0YW5jZShyZXN1bHQsIHN0cik6CiAgICAgICAgbWxydW5fbG9nX2FydGlmYWN0KHBhdGg9cmVzdWx0KQogICAgZWxzZToKICAgICAgICBtbHJ1bl9sb2dnZXIud2FybmluZyhmJ2NhbiBub3QgbG9nIGFydGlmYWN0cyB3aXRoIHRoZSByZXN1bHQgb2YgaGFuZGxlciBmdW5jdGlvbiAtIHJlc3VsdCBpbiB1bnN1cHBvcnRlZCB0eXBlLiB7dHlwZShyZXN1bHQpfScpCg==', 'original_handler': 'process_data', 'artifact_json_path': '/mlrun_databricks_runtime/artifacts_dictionaries/mlrun_artifact_a9c770f8377046bda3061e61a5c015c2.json'}
data_path=dbfs:///demos/mlrun_databricks_demo/1711553684480_33/music.parquet
data_output_path=/dbfs/demos/mlrun_databricks_demo/music_output_new.parquet
music_data
databricks_run_metadata
\n", - "
\n", - "
\n", - "
\n", - " Title\n", - " ×\n", - "
\n", - " \n", - "
\n", - "
\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - }, - { - "data": { - "text/html": [ - " > to track results use the .show() or .logs() methods or click here to open in UI" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2024-03-27 15:35:07,910 [info] Run execution finished: {'status': 'completed', 'name': 'process-data-process-data'}\n" - ] - } - ], - "source": [ - "for name, val in job_env.items():\n", - " process_data_function.spec.env.append({\"name\": name, \"value\": val})\n", - "params = {\n", - " \"task_parameters\": {\"timeout_minutes\": 15},\n", - " \"data_path\": dbfs_data_path,\n", - " \"data_output_path\": output_path.replace(\"dbfs://\", \"/dbfs\"),\n", - "}\n", - "run = process_data_function.run(\n", - " handler=\"process_data\",\n", - " params=params,\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "9a8db175-51f4-4218-afd1-752cc0e65216", - "metadata": { - "tags": [] - }, - "source": [ - "## Create an MLflow Xgboost function\n", - "\n", - "The following code demonstrates how to create a simple Xgboost model using MLflow and log the results.
\n", - "MLflow will log the model, parameters, metrics, and artifacts, and MLRun will track the run and collect the data." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "44a1e133-954d-47a3-9b0f-6e181fe12ea7", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Overwriting training.py\n" - ] - } - ], - "source": [ - "%%writefile training.py\n", - "\n", - "import mlflow\n", - "import mlflow.xgboost\n", - "import xgboost as xgb\n", - "from mlflow import log_metric\n", - "from sklearn import datasets\n", - "from sklearn.metrics import accuracy_score, log_loss\n", - "from sklearn.model_selection import train_test_split\n", - "import pandas as pd\n", - "\n", - "def example_xgb_run(df: str):\n", - " df = pd.read_parquet(df)\n", - " \n", - " df = df.replace([\"f\", \"m\"], [0, 1])\n", - " df = df.replace([\"Pop\", \"Rock\", \"Classical\"], [0, 1, 2])\n", - " \n", - " # Prepare, train, and test data\n", - " y = df.pop('favorite_music_type')\n", - " X = df\n", - "\n", - " X_train, X_test, y_train, y_test = train_test_split(\n", - " X, y, test_size=0.2, random_state=42\n", - " )\n", - "\n", - " # Enable auto logging\n", - " mlflow.xgboost.autolog()\n", - "\n", - " dtrain = xgb.DMatrix(X_train, label=y_train)\n", - " dtest = xgb.DMatrix(X_test, label=y_test)\n", - "\n", - " with mlflow.start_run():\n", - " # Train model\n", - " params = {\n", - " \"objective\": \"multi:softprob\",\n", - " \"num_class\": 3,\n", - " \"learning_rate\": 0.3,\n", - " \"eval_metric\": \"mlogloss\",\n", - " \"colsample_bytree\": 1.0,\n", - " \"subsample\": 1.0,\n", - " \"seed\": 42,\n", - " }\n", - " model = xgb.train(params, dtrain, evals=[(dtrain, \"train\")])\n", - " \n", - " # Evaluate model\n", - " y_proba = model.predict(dtest)\n", - " y_pred = y_proba.argmax(axis=1)\n", - " loss = log_loss(y_test, y_proba)\n", - " acc = accuracy_score(y_test, y_pred)\n", - " \n", - " # Log metrics by hand\n", - " mlflow.log_metrics({\"log_loss\": loss, \"accuracy\": acc})" - ] - }, - { - "cell_type": "markdown", - "id": "1cf984c9-78a9-443f-9465-111263101dcd", - "metadata": {}, - "source": [ - "## Log the data from MLflow in MLRun " - ] - }, - { - "cell_type": "markdown", - "id": "365e4b39-9f39-40ae-aac4-7c4f42bce9bd", - "metadata": {}, - "source": [ - "### Change the MLRun configuration to use the tracker\n" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "0b194d04-e08f-4161-a65b-4f18d10fdbf0", - "metadata": {}, - "outputs": [], - "source": [ - "import mlrun\n", - "\n", - "mlrun.mlconf.external_platform_tracking.enabled = True" - ] - }, - { - "cell_type": "markdown", - "id": "b16bb4db-8a2a-4453-a42e-0e8e74ab8f53", - "metadata": {}, - "source": [ - "These are the three options to run tracking:\n", - "- Set: `mlrun.mlconf.external_platform_tracking.mlflow.match_experiment_to_runtime` to True. This determines the run id and is the safest method\n", - "- Set the experiment name at: `mlflow.environment_variables.MLFLOW_EXPERIMENT_NAME.set`. This determines the experiment mlrun will track and find the run added to it.\n", - "- Just run it, mlrun will look across all experiments and search for added run, this is not recomended." - ] - }, - { - "cell_type": "markdown", - "id": "8b7bc72a-bd1b-408a-afa8-e474d91c4a20", - "metadata": {}, - "source": [ - "### Create the mlrun function" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "3382b909-a8dc-41a3-afb1-b64df9bb7318", - "metadata": {}, - "outputs": [], - "source": [ - "# Use the first run option from above\n", - "mlrun.mlconf.external_platform_tracking.mlflow.match_experiment_to_runtime = True\n", - "\n", - "# Create a MLRun function using the example train file (all the functions must be located in it):\n", - "training_func = project.set_function(\n", - " func=\"training.py\",\n", - " name=\"example-xgb-run\",\n", - " kind=\"job\",\n", - " image=\"mlrun/mlrun\",\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "91597f57-364d-4d2a-b926-97b9d8afc81b", - "metadata": {}, - "source": [ - "### Run the function\n", - "\n", - "Run the function using MLRun. This will log the data from MLflow in MLRun.
\n", - "After running the function, you can look at the UI and see that all metrics and parameters are logged in MLRun." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "5a726ca8-8057-41ed-be4e-35e5e0582de9", - "metadata": {}, - "outputs": [], - "source": [ - "import mlrun.feature_store as fstore\n", - "\n", - "feature_set = fstore.get_feature_set(\"music_fset\", \"mlflow-tracking-example\")" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "4de1229a-cc59-4846-8473-3178e682efa6", - "metadata": {}, - "outputs": [], - "source": [ - "df = feature_set.to_dataframe()\n", - "df = df.drop(['id'], axis=1)" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "8249a933-031c-4f2e-88c2-161dd4cfb7ed", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# df = project.list_().to_objects()[0].to_dataitem().as_df()\n", - "df_path = \"./music.parquet\"\n", - "df.to_parquet(df_path)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "8ba452dd-1756-4bfb-af64-d741e234dba3", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2024-03-27 15:37:22,829 [info] Storing function: {'name': 'example-xgb-run-example-xgb-run', 'uid': '6ff324dd21d64b6290d45a001957dda2', 'db': 'http://mlrun-api:8080'}\n", - "> 2024-03-27 15:37:22,912 [warning] `mlconf.external_platform_tracking.mlflow.match_experiment_to_runtime` is set to True but the MLFlow experiment name environment variable ('MLFLOW_EXPERIMENT_NAME') is set for using the name: 'example-xgb-run-example-xgb-run'. This name will be overriden with MLRun's runtime name as set in the MLRun configuration: 'example-xgb-run-example-xgb-run'.\n", - "[0]\ttrain-mlogloss:0.82467\n", - "[1]\ttrain-mlogloss:0.64706\n", - "[2]\ttrain-mlogloss:0.52480\n", - "[3]\ttrain-mlogloss:0.43768\n", - "[4]\ttrain-mlogloss:0.37410\n", - "[5]\ttrain-mlogloss:0.32686\n", - "[6]\ttrain-mlogloss:0.29057\n", - "[7]\ttrain-mlogloss:0.26192\n", - "[8]\ttrain-mlogloss:0.23885\n", - "[9]\ttrain-mlogloss:0.22004\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024/03/27 15:37:23 WARNING mlflow.utils.autologging_utils: MLflow autologging encountered a warning: \"/User/.pythonlibs/mlrun-base/lib/python3.9/site-packages/mlflow/types/utils.py:393: UserWarning: Hint: Inferred schema contains integer column(s). Integer columns in Python cannot represent missing values. If your input data contains missing values at inference time, it will be encoded as floats and will cause a schema enforcement error. The best way to avoid this problem is to infer the model schema based on a realistic data sample (training dataset) that includes missing values. Alternatively, you can declare integer columns as doubles (float64) whenever these columns may have missing values. See `Handling Integers With Missing Values `_ for more details.\"\n", - "2024/03/27 15:37:23 WARNING mlflow.utils.autologging_utils: MLflow autologging encountered a warning: \"/User/.pythonlibs/mlrun-base/lib/python3.9/site-packages/xgboost/core.py:160: UserWarning: [15:37:23] WARNING: /workspace/src/c_api/c_api.cc:1240: Saving into deprecated binary model format, please consider using `json` or `ubj`. Model format will default to JSON in XGBoost 2.2 if not specified.\"\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
projectuiditerstartstatenamelabelsinputsparametersresultsartifacts
mlflow-tracking-example-guy0Mar 27 15:37:22completedexample-xgb-run-example-xgb-run
v3io_user=zeevr
kind=local
owner=zeevr
host=jupyter-zeevr-9f4ffb7bb-8c4mf
mlflow-user=iguazio
mlflow-run-name=stately-cow-437
mlflow-run-id=f66d6149d54c4958a2485c941d86a538
mlflow-experiment-id=608717337209571124
df
colsample_bytree=1.0
custom_metric=None
early_stopping_rounds=None
eval_metric=mlogloss
learning_rate=0.3
maximize=None
num_boost_round=10
num_class=3
objective=multi:softprob
seed=42
subsample=1.0
verbose_eval=True
accuracy=0.7142857142857143
log_loss=0.9622776094122579
train-mlogloss=0.2200447738170624
feature_importance_weight_json
feature_importance_weight_png
model
\n", - "
\n", - "
\n", - "
\n", - " Title\n", - " ×\n", - "
\n", - " \n", - "
\n", - "
\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - }, - { - "data": { - "text/html": [ - " > to track results use the .show() or .logs() methods or click here to open in UI" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2024-03-27 15:37:31,415 [info] Run execution finished: {'status': 'completed', 'name': 'example-xgb-run-example-xgb-run'}\n" - ] - } - ], - "source": [ - "# Run the example code using mlrun\n", - "train_run = training_func.run(\n", - " local=True,\n", - " handler=\"example_xgb_run\",\n", - " inputs={\"df\": df_path},\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "655d5c46-2c0a-46f2-bbec-a58853260476", - "metadata": {}, - "source": [ - "### Examine the results\n", - "\n", - "You can examine the results using the UI or by looking at the outputs of the run.
\n", - "The outputs include the model, the metrics, and the artifacts, and are completely independent of MLflow." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "d23beb02-e455-48dc-9d9f-9e3d4549ec71", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'accuracy': 0.7142857142857143,\n", - " 'log_loss': 0.9622776094122579,\n", - " 'train-mlogloss': 0.2200447738170624,\n", - " 'feature_importance_weight_json': 'store://artifacts/mlflow-tracking-example-guy/example-xgb-run-example-xgb-run_feature_importance_weight_json@6ff324dd21d64b6290d45a001957dda2',\n", - " 'feature_importance_weight_png': 'store://artifacts/mlflow-tracking-example-guy/example-xgb-run-example-xgb-run_feature_importance_weight_png@6ff324dd21d64b6290d45a001957dda2',\n", - " 'model': 'store://artifacts/mlflow-tracking-example-guy/example-xgb-run-example-xgb-run_model@6ff324dd21d64b6290d45a001957dda2'}" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "train_run.outputs" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "id": "b05f4c2a-5f2d-4d7c-9c21-39c0a949cfc3", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'accuracy': 0.7142857142857143,\n", - " 'log_loss': 0.9622776094122579,\n", - " 'train-mlogloss': 0.2200447738170624}" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "train_run.status.results" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "id": "925b3445-18b4-4497-9783-52b4cd069401", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "train_run.artifact(\"feature_importance_weight_png\").show()" - ] - }, - { - "cell_type": "markdown", - "id": "227c4358-4c34-4d1c-acb4-e37ca110b8bf", - "metadata": {}, - "source": [ - "### You can also examine the results using the UI" - ] - }, - { - "cell_type": "markdown", - "id": "dde00fd1-a1f0-4c56-80c2-c5d36a9062a1", - "metadata": {}, - "source": [ - "Look at collected artifacts: " - ] - }, - { - "attachments": { - "95b9b198-55c9-4a67-b0bf-103c9ae0272e.png": { - "image/png": "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/LapWpuGkpN9+/WySy4/1+rWreOXpbk2qU8994A94I71/bcjffhO4bX2HdrauRecZv136eu306+99tnd/hw30ac41WI1JSW/vepxJxxhTZo0smefftlmu6pzCtVpdOna0c44+2QbsOuWOfwKfiGAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggIAXOOb4wyqtRGpqqp125km+46Sea3Tr3tl3o1yxfGWh99WgYX07+7wRvgDYTj26+qJcKhQW7Fdo4xi+SLYkq5tSrVBVuKdWTLKv1y2IyVGWZW+0W5eMsfMb9rA9a23JdemYOnY8RpJr07l18b14nE2Uc+rDXrZ0uW87qgptRcdjrtXpyy+86Rffdtf1EROSa9dk2MaNG30Ft6L7h79W4E4htnr161p1F5AraWRlZflzUkW4lJTCfWw3b8701eAaupauNWpUL2kKliOAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggEApAh+9/7mtW7feb1G7dk078JB9S9l6+1r1xqvv2pTJ0wudVNdunezo4yom9Lc5L8dmbF7jzycjN8vOmPu1xTpIpvaoz7Tey9QyVaNDtToltkz1G2zDr/wjbMMEFbGrWqG2at3CV4QLP35GxjqbO2e+jfrp19BiBdMijfQ6tcsMwWm/5OQka96iaakhOG2nFGbzFs2KheC0rlq1qtbalTgkBCcNBgIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACWyegYlbTp830P/VdS9HKNOo3qFfsdFURrqKGQmoNquQXBluYtT7mITi9L4XtZmdm+LeoY+mY8RrFy6nF60gJmPeu2x607775KXSk1q1bWtt2rUKveYIAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAKVV2DQbgOse48uvrlmep30SvVGBg/ZxTp2al/onBs3aVTodaJfNKlSw9bnZsf1sJkuDJeWXMV0rHiOHSoIFw6lCmw33HR5sapx4dvwHAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBCqXQJ1KFoALdNPS0nxXyeD19vLYIrWmTdy0Mm6no7aoOka8R1KeG/E+SKLmX7lilS1cuNjq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QAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEiJAEC4hzBwEAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAgXgIE4eIly7wIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIJESAIlxBmDoIAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIBAvAYJw8ZJlXgQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgYQIEIRLCDMHQQABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQiJcAQbh4yTIvAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIBAQgSqJOQoHAQBBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQ2A4EJm5aZY8uH28j1y+2TXk528EZ7finkJaUYoNqNrVzG/aw7mn14vKGkzIyMvLiMnMFTpqxdr01a96kAs+AQyOAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggMD2JqAQ3ClzviAAV0EfjAJxz7cZFpcwHK1RK+hD5bAIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCQWAFVgqMKXGLNw48me30G8RgE4eKhypwIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCw3QmoHSqjYgXi9RkQhKvYz5WjI4AAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAQIIEqAaXIOhSDhOvz4AgXCnorEIAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEENj+BQjCbf+fEWeIAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCBQigBBuFJwWIUAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIILD9CxCE2/4/I84QAQQQQAABBBBAAAEEEEAA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AggggAACCCCAAAIIIIAAAggggEB8BAjCxceVWRFAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBIkQBAuQdAcBgEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAID4CBOHi48qsCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCRIgCJcgaA6DAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCAQHwGCcPFxZVYEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAIEECRCESxA0h0EAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEIiPQJX4TFvxsy5buqLiT4IzQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQiLvADhuEa9S4QdzxOAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggEDFC9AateI/A84AAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEBgGwRiWhFu/uK1Ns/9lHcM6tOyvLuwPQIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAJeIGZBuJFj59so97M1o1XTdGvpfhgIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIlFcgZkG44MADXXU3BduiGaoep/CcHgnCRSPGNggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAkUFYh6EK6m6m9qmfvrDDB94239Ih9B5jAo94wkCCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAAC5RdILv8uW7fHhOnLbO26zTbRPSoUx0AAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAgFgIJC8Ip/JZeq5o/55GuHSoDAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgVgIJCQI9/vExb4aXL/uzax7x0axOG/mQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQMALVIm1w+c/zrTU1BSrVjXFjj2gu59+6cr11qh+Tevbval9+sMM3xr1hff+tKysnFgfnvkQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQT+YgIxrwhXJz3Nhd5q+LCbQm8ay1Zu8Mv0fP8hHXxVOG2jbRkIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIbItAzCvC7dKzubVsmu5boerE1BZ1masIt1NYS1SF4TTmL15rcxas9s/5hQACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggMDWCMQ8CBd+EhOnL7P5tdZaeq1qvi1q+DqeI4AAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIBALgZi3Rg1OalCflv7p2nWbfYW4YDmPCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCMRSIG5BOLVH7e7aoaoaXHhb1FiePHMhgAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgggEPPWqPMWrw2pKgAXhODmhy0PNgjfNljGIwIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAALlEYhZEK6VqwA3yh151Nj5/rE8J8G2CCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCGytQMyCcGqFOrBPy3KfhwJ02peBAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAwNYIxCwIp4MP2oog3NacNPsggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgggEAgkB094RAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQKAyChCE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QAABBBBAAAEEEEAAAQQQQAABBBBAAIFsIEBFuGzwELkFBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQCAnC4RFREScym4AEeGHpGKl8tnttpJ1PwcOipw4ke0ebbIM6IwAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAQE4QyJ1bJFeuMMmfTyR/3pxwx3HvkalR45pkiy0agitdIixb3As3gQACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgkLHDkqcvSY6WNqZ2kgLqc1pkbNaU+c+0UAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAIFsJ1CwgEg+UxbtWGS2u7Uk3RBBuCQx0QkBBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQyNoCGoY7dcqUhMuBjSBcDnzo3DICCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAghkT4ETJ7PnfSV2VwThEhNiPwIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAQJYWIAiXpR8PF4cAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIJCYAEG4xITYjwACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgggkKUFCMJl6cfDxSGAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCQmQBAuMSH2I4AAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIZGkBgnBZ+vFwcQgggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAokJEIRLTIj9CCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACWVqAIFyWfjxcHAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAQGICeRLrkJz9cxZuDtm9Q4sqdvvm7eGyyfwFN7c/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AAEEAiFAEC4QyuwDAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEDAbwIE4fxGy4YRQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQCIUAQLhDK7AMBBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQMBvAgTh/EbLhhFAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBAIhQBAuEMrsAwEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAwG8CBOH8RsuGEUAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEAiFAEC4QyuwDAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEDAbwIE4fxGy4YRQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQCIUAQLhDK7AMBBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQMBvAgTh/EbLhhFAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBAIhQBAuEMrsAwEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAwG8CBOH8RsuGEUAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEAiFAEC4QyuwDAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEDAbwIE4fxGy4YRQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQCIUAQLhDK7AMBBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQMBvAgTh/EbLhhFAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBAIhQBAuEMrsAwEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAwG8CBOH8RsuGEUAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEAiFAEC4QyuwDAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEDAbwIE4fxGy4YRQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQCIUAQLhDK7AMBBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQMBvAgTh/EbLhhFAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBAIhEByInbAPBPwtcO5cmJw5fUby5svj710lefu7d+6RLZu3S516NVPF8Sb5hJO4gfDwcHcLQUFB7jADySvgj+ui25w3d7EcP3ZC2nVoIdmyZXVPctaMf+S3X/+S/fsOSa5cOeT7QR9JlqxZ3PkMJE3A83o6W0pJz7evP/9RLl28JCVLl5DuN3Z2DjHd3nter5R0ndLtBeHEEUAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAgRQgQhEsRl4GDuBIBDQLMmDZXVi1fI3v37LebyJ4ju1SrXknadmglhQoXuJLN+nWdsLAw+ezj7+w+Fi/8V555sa9f95faN65eLz3zlj2NggXzy3OvPJ6sp3Tp0iUJCztvjyFz5kySIUP6LKqpBtd1ulMuXrxoLUaP+SHRoc4zZ85K+KVwCcoQ5AbeVixfK/1f+chuc9euvdLnsXvs8JRJs+T9d7+yw3pz8mSIRMUj3clJGtBzunD+gt1G9hzZkrSt1LbytMmzZPKEGbEOO0uWzFK0WBHp2KWtVKpcPtb8QE7YtmWH3Z2+JjhNA9D6e0CDYHqs6ak9+/hr9nSzmrDom++9mJ5OnXNFAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEE4hQgCBcnDTNSusCY0RPkn7mLoh3m6dDT8u+SlbJ+3SZ55oX/SU5TOSolNQ1OBWcKtoGbrFmjql2lpGNMScfiUQxOLnmOJNNBLl64TEb/Ntbu/aZbuslVTRsk05Ek727nzFrghuD0SCZNnCm33NY9UQfV68aHJNQ8X3OY8OrYCUPsup4V4HLmjHruDh/2h7vtJk3rS63a1USDiL5sb7/xqa1Gp9sc8fvXUqRIIV9uPkVvK66nlgbNdmzfJQO/Giwp8fH+1msfyVkTqEzPYbBwE86lIYAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAghECPg0CLd7/0nZZX4S25rWLZnYVVg+nQvMNwE4JwSnwbKu3TpKrty5ZMG8xbJp41bRQNzXn/8gTz3/mGTMmDHFaAUHB8uLrz0pu3bsSfYKSykGhQNJdQJ/jZkc7Zh1PLFBuGgbiBypWq2iDBryiRw7dlzq1K3hLrJv70E7rOG3t9553laRc2f6YSCuYJgfdpXiNlmvQW2pWr2ynAo5ZULFK9xqm3/8Pk4aXVUv3VZBTHEXigNCAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEIgl4LMg3IIVu2Wh+bmSVqpobilpfmgIJFRg1vR57qJ9n3xIihUvYsdrmkpRn3zwtezbe0AOHTwiO3fstlWnZk6da+df3aKJ1G9Y2w6vXf2fzJg6xw43bd5YGjaua7vZW7Jouawz87Zt2yl58+Y2Xa1WlvbXtnYDdUN+/EVOngiRkqVLiFatWrRgqZQuU0JOHA+x2ypbrrR0vaGTHT5+/IQMHfSbHS5VpqR0v7GzDPnhF7ufDf9tlhtu6mLn6c2mDVtk+bLVstFMz2QCc2XKlZIu12vAL6etyjT2j4l22fadWpugSiVbVe7bL3+y27r5thukSNFCcuTwURnx8yi7nHNOdiQN3Rw9ckyGDxlpz+jqFlfJ3t37Ze3q9XL23DlR+x43d5VcuXJKiAnyDP5+hF1Or/n2bbtk86atkj17NqlZu7p07NzGDfV8/83PtrKUGqqltj2794mGf7Q1u6ax7Ny+W9asWm/H9WaK6UpyiakQ99gTD9hpq1asldkz5sthcw0ymXCmPibbdWwlZcqWctdJCwNHDh+TdWs3RjuVgwcOG9ttUrFSOXf6ksUrZMhPv9vxHjd1lrFjppjH8W554qkH5XdTVU+rwWnT+8ceeVGu79bBrj/go4iug7t0bSfFihWWHwaOcKvPafel/3v0JVsR7qFH7rTrT5syR6ZPmycbTQBWnzeVq1aQ++6/xTwWortr96oTxs+wx5DLVIqs16CW9H7gNvsc7vvYy/b47QbNzcsvvCd1TRDvsX732a5wR5nHwYzp80XPU18TatepLnffe3OK7H7ZOYcrvS9XoYz7GnlNq6byynNvi1aG026BDx08bF5nCttNX+71ytm3PocmT5huw3TnTbez2r2xvgarvXZn6jxndHl9zdTnrzZ93um6GTJmkEf79bbTPG+c56ZWg9Om918MGCjOa552navPzy3mMXnKPL7y5csjterUkBatm6W7LlTVZ/3aDbLSdDus10yD46XN76LOXdtLvvx5dbbblv+7WubNXmBfwwoVKmCu1VVmfKGd365jS6lWo4oddq5bWn+tc2EYQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQACBVCPgsyCcc8ZNTHU3DbYlpGn1OA3P6T1BuISIsYwKnDdhmOPHTlgMDWU4ITidoOGKFq2vlt+GR3SlqOEl/fBeA3F2vqkk5wThNMTkTO/aPSK4pgGMhf8stcvqjVaW27tnv6xauVaeNl2tatemGvjR4IWzri4XagIeB/YftIGR3bv2ShcT6tFl163Z4C5XxVS70qZdDWo7f/68vdeblcvXyLDBEaEhZ6KGDFaacNWzL/aVvCbI4exv7Zr/bBBOK98521q1Yo1oQG7r5u3ucm3at3A2labuz549557jzqER19U5QQ2q6WOj39MPS5gJ7zhmzr0udyok1AYg9+3dL/c9eIdddbOx1KCPBmicFnLylLt+pcrlZYux9Zyvw874UhP6ch5zzvonjp+U/0wXvXf3vlVq1qrmTE719xPGT3fPodet3eS3X/6y4xp0e/KZh9x5B/Yfsl0U64S33/jMnX7k6DF3ujNRuzLWcFmhwgXdeTVrVZWM5jmk8zybjuvzXNtH738jE03gybMdOnRE5s9dLD8OHmCCVRFhuPff+VKmTJ7tLqbXbY95Xs804bbhv34VK9i3betO+/wNN6XhnnnyDVljgrFO0+Cerjt92lz5aehnUtSEJ9NqU+ccJuyrQThtmTNntvfxvV5pwEpDuZ9++I1d3rnZaex2Dh1lQqW7pLsJAesyznNTw8VO27J5mw0dOuMx77VanbOeM0/Hy1csa5/fH77zhX2NdubtM6/XGo7W437i2UfcULMzPy3fL5i/xA30OuepYeIVJnTdp9/9Uq58GTt5zsx/ZNyYSc4issNcK+f3i07UdbSlp9c6e8LcIIAAAggggAACCCCAAAIIIIAAAggggAACCCCA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CCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggEB8AgTh4hNiPgIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAQIoWIAiXoi8PB4cAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIBCfAEG4+ISYjwACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgggkKIFCMKl6MvDwSGAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCMQnQBAuPiHmI4AAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIpGgBgnAp+vJwcAgggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAvEJEISLT4j5CCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACKVqAIFyKvjwcHAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAQHwCBOHiE2I+AggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIBAihYITtFHx8GlSoGTp1LlYXPQCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAulIoEDedHSy6eBUCcKlg4sc6FMsVzIo0LtkfwgggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIJCOBegaNR1ffE4dAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEgLAgTh0sJV5BwQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgXQsQBAuHV98Th0BBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQSAsCBOHSwlXkHBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQACBdCxAEC4dX3xOHQEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAA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1TmSXSj2BHjeiT3TUClC6J6cAS+eFC9RLDmzCJn22c4/ZOG4kwRIgARIgARIgARIgARIIM0ToIAtzTchK5BIAjEXwq0Sq28IELhB+OYMdpsVv0Ew16HRLc4o/E4CJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACqZYA3HGu+WetidbyGo5jIAESSD4CYhcltgHuTyF0g7U3/IcYzgrisA9uUrG9pMRBsPtiWwqmRgIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAKxJ1ClRkUTragN8XEcAwmQQPIRiLlFOGv1DUXeEGcRzlqAC7Uv+arIlEmABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEggNgQgaruoLa27xYYmUyGB2BFId+DAgTOxS85n4Q0uT214pPqVaiEOv2H9Da5TrRU4ax3Oxo3V54H9h0yxC4rEKrk0mc6uvWdMgbzp0mTZWWgSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIIHEEThfdUMxF8JZ/BC7WUtwdpv9DLXPxknKJ4VwxpyvHTop/YbHkgAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkEBaJ3C+6obSJ1fDBRPBIb9Q+5KrPEyXBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEjg3CSQbEK4cxMXa0UCJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJJDaCFAIl9pahOUhARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARKIigCFcFHhYmQSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIIHURoBCuNTWIiwPCZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZBAVAQohIsKFyOTAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmkNgIUwqW2FmF5SIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAEoiJAIVxUuBiZBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEggtRGgEC61tQjLQwIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkEBUBCuGiwsXIJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACqY0AhXCprUVYHhIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIggagIZIwqNiOTQAQE1m48E0EsRiEBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiCBs0egbIl0Zy9z5hxzAhTCxRwpE+QkwT5AAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiSQkgToGjUlaTMvEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiCBmBOgEC7mSJkgCZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZBAShKgEC4laTMvEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiCBmBOgEC7mSJkgCZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZBAShKgEC4laTMvEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiCBmBOgEC7mSJkgCZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZBAShKgEC4laTMvEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiCBmBOgEC7mSJkgCZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZBAShKgEC4laTMvEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiCBmBOgEC7mSJkgCZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZBAShKgEC4laTMvEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiCBmBOgEC7mSJkgCZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZBAShLI6JXZpu3pzS//pDfrt6Q3ew+mM6dPe8VKuW3pRa6XN+cZU6rYaXPVxadN8cJnuUApV3XmRAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkEIZAAiHce19kND/8mSHMYSm7G0K83fvTyf8MWrbrLjtlqt12MmULwdxIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARSJYEA16ivv58p1YngvKhBqIeyMpAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZCA3yIcLMGt3RSgi0vVdFBWlJmW4VJ1M7FwJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJJCmCaz5Z61ZvnSFwWc0YfiY/tFEZ1wSIIEkElAh3Kbt6dOEJTh3XWEZ7qqLT5vihcV3KgMJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJxJhAYkRwMS5CVMl1adcnqvjBIlPIF4wMt6dWAiqE++WftGMJzg0SZacQzk2Fv0mABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABGJBwFqCozAsFjQjT8MK+sg9cmbne0xVwK3fknaFcGm57Od752P9fQTeX7nf/Pb30bOC4/d/jppln+w/K3mfi5mezbb87JuD5pufD6cJrH+sOWpmvLHb/PDbkTRRXhby/CCwY9dJs/jj/WbfgVPnR4VZSxI4Bwh89/WPZuWKVQE1OXnypPn6y+/Ny1Nmmzfnv2u+/foHc/DAoYA4afnHqVOnzOJ33jf/rlmXlquR4mX36ispXogYZLh1yzYzb+5Cs2zxBzFI7fxO4sCBgzqWtm3dflZAfP7pap2fzkrm51im69au17Y8ceJEitfMzslr1/yX4nmnVIYnTpw0qz//2rwydY7ZsnlbSmXLfEggLAHOo2ERMQIJkEAKEdixfadei+zbyzX2FELObCIg8Ptvf/G+MQJOjEICJEACJEACJHDuElCLcHsPpkuzNUzLZU+z0FnwmBKY9eYec9uNOcyVl2SNabqRJPb5N4fMR6sOmOp35Y4kOuOEIXA22/L1RXtN3twZzE1XZw9TyrO7e9KcnebTrw6a7NnSm4L5M5rrrsyW5AKdOn3GpE+Xzsi/sxLGTt9h1m44bl7oXfys5B8u07PNJ1z5kmv/h58fMDMX7jajehU3BfLq5U7IrP7dcMzMeWu3uaRMFpMnVwbPuGfOGHNa/mRIf5Y6m2epuDEpBFZ8+JmZO3O+2bhhsyl/643m7nsqmAoVbzXp06c3p2VuadKgtal4zx2mUbP6ScnGnJF+gzeWqt1byVSpfrem9dknq83cWQvMi1Oe1/y84iQpU4+Djxw5ap54rKV5vPFj5oE6NTxiRLcJZT59+rTJkMF7zIRL7aVJM82Rw0dN244twkX13P/uW8vM+v82aJvZCE837WT++nONuejiMgb13bxpq+nas525t2YVGyVZPyGKQP9Jl0wnpRPHT5jhg8eaNu2bmwsvKpOgLhv+22ieadnddO/T3tx8600J9p+vG7z6SjgW6N8ff7DS/PD9z+avP/4x4yY/bzJlypTgMPdYThAhgg2Yb86ciR9LXvPPqs++Ms927m+yZ89mqt13j6l+X+UIUg4dBePXmHTSZ6M/r0FA1kPK02dgN1O6TMnQGaXCvTu379KxNHhEH1OkaOEUL+Gs6fNMgYIFzI3lrkvxvM+1DH/6/lcz6vnxei7wGqPJWd9jx45rP3qm01Om7EWlkzOrqNJ2z0vLl31s5r/6ll7vlCpTwjze6DFz+523JEjT61qkZeP2Zs0/68yll12kxxQzRRIcF80G93wXzbGxiOs1v8Yi3Vilcbb5xKoeiUlnzMhJ5u8//9Vr40iOj2QeTe7rskjKyTgkQALJT+DH738xY2UOcYfW7ZqbG8pd697s//3LT7/pi1V/yrV+i6efNFdedbl/36cff6736+vXbTTXXH+VrhXcXfkOkzlzZn8c+2Xd2g16PXDJpReaPHkTrrG/OusN88F7H9voJkvWrObWO8qZSpXvNMVLFPNv5xcScBLAy1zjx0x1bvJ/f7JpPXPn3bf7f3t9+eyTVWbOjPlR3zdGeh/sleehQ4cNrkOXLlou6zDPmAuKB/bvSK9JkTZexnht9gJJ6wNdN6oo4++eqneZq66+QrPGusgfIvbzCohX/4lHEuyKZK7o13OYrjM5D75AxumAoT2dmxJ8Hzdqivn1l9/N2EnDEswTvbsPMps3bjEduj5trrrmygTH4qWagc8NNzly5tDjE0TgBhIggVRPABbiwrlLxTOBqjV8zwVSfYVYQBI4Rwjok2Fd/06jFUrLZU+jyFlsEiABEkgUAQiyIL68/n/ZTZcWsXngeODQKfNUjw3msfvzmVpV8iSqXEk9qGzJzCrsS2o6yXF8auCTHPWKJM0iBTOaKy7KarJliZ3V2ymv7jSffX3IzHoh9TzojIQF43gTgEWtvj2Hqlio1kP3mZ9//NU812OIwcPsBx+pqcKQ62+6xpSKgcDj5x9/M9989b3p0uMZf2FgreziS8uqaAobveL4I8foS8aMGVV0EavF9i+/+MZ079TPvDznRU9RVqhiQ6Q2e/rrps+ArqGiRbUPbQoRXPfe7XWxd9fO3eah+5+IKo2kRIaFqZpV6uriZq0H701KUok+FgunN5a/zhQsVDDRafBAY44ePWYG9R2hD8Zuub2cufX28v6x6ubjHsvu/ZH8njpxunn7jSVmyUfzNTqEae755/2lH8uDhKJm5rxJBmM5FqFl4w4Gi/p9B3WPOrn3RViDcVyqdImoj+UBJEACyUvAOS99ueobmc9GqkC8UfMG5t2FS03PrgPNxGkjzRX/uyygIO5rETyUgwiuZ99Oxgr5Aw5IxA/3fJeIJJJ0iNf8mqQEY3zw2eYT4+pEldxFF5c1OXLE7sW+1HBdFhUARiYBEkg0AbzYhvPVI/Vqyyse8SFPvuDrhLgXxYtZEHrfVP56fUHBHvnpii9Mn2eHmOtuuNq0bNPE/CyCuSH9R5l/5SF3q2ea2mgRf+7atVvL17JNYz1mvby89OrMBWbapFlm7htTE4iFIk6YEc9pAhCVoV/XeeR+U6RIoYC6Fi9xQcDvWP2I5j7YmSdeDnnh+QkBFuhOngz0uBHNNSnSXvrucjNt8mzzwIM1ZJxebN5f+pFZOH+RmTJ9tLn08ovNbXeU109nObZt2a4C1gcfrenc7P8eyVyBcpa5sLQI7uKFsfny5/On4fUF1iDfeP0d3QVLym6R4ob/NhlYsX5L7vm9hHBLRDiItsZLbwwkQAJpk0A4ERxqBTEwwtkUwyXWpah1SaoV4B8SSEMEYrOCnoYqzKKeHwTg2m73vlOmRNFMJlNG3y3wocOnzfETZ9RqljXScVC2nXBtO3rstNm09YQpdUFmsfoQf/uM7ceOn1FLQdt2njRHjp7WOGL0Q8PmbSdM1qzpTf488VZRTp46Yw4cPK15okw7d580JSXdLJnj0w3WIlu2nxDLEMYUK5wpqKUrpIm65M4Zn+fe/bBEEr8N4qMNm0+YbFI2CEOwP2uWdPI/UByCOqGOJYplCmntaI9whTWvYxJ3556T5sJSWcz+g6f0mBzZ49N05uNkt3uvsDt2xhQvktCihhcLLw6R1Btp2X5QpnjmAIbO8kTaljjmuLR/LmG9fdcJYXXGlCyWWVl7ldtuQxuuFUtTefNkDOgbdr/9jKROkbQl4mzcIn1R2hftHSq427JsySzaP9C+to8ivf0HTpucOdLrWIKwCtbXEGeT9Pmc0uawRBcuYOyAA9K7uHRmg7zzOcYK9m/cclz7O9J2B6+2RJsgHYSDUi7EgSWvSPoj2g/j5r/Nx7VdrAWwSNvLWb5Kt+bSetltliveoMNcUkgs3+WOszCGMmOuKFMiS0DfcR6D9issbecc1zZtlG+9lBmMkK4z2DTs2LxAxpgXH3uMF1Psc46PcOMV4xNzS7A+4DV+bf7uz1MyX+6X+TJXzvQmYwbfHImynDgp4y5HfB9DnbJlDZzDvPK5pGxW81T9zFo+Z17bdvrGL+a6I0cFqAT0Y2fA+QLxMCbs+QJzGuZ99GHL2o4T57H2O8oebs6w6WDO3iDtWryo9/khkjLbfPkZT+CoCDSOHpP5N2/84jfcZuKhWK5cOeXN0jd1kWnAsB76tuZ9D1Q1P/3wq4GVOAjhEBo1rW+yZAl84xtjGwvXeFBXsFCB+AzlGxb/ToprNoiRnAFuDMvdcoNYHfItXm7etMV8982PplnLx/3R3HH27NmrecAyyCZZ2C8sx6LcNqB+yC9X7pwGb6nnL5DP5M6TS3fDPdx6WWgrXKRgwDGZMmU0Lds2luuVQCu0yOM/WZTLKw8K8uXPa7Pwf8JqFPK4oERR/5utcDe6f/8BjYNFPyzSOh9egvOB/QdVuONPyPFlpTxcwCLfbRVu1q2ID0tqWbNm0TdlMwt3a6UJ1jywcFj0giK635GM/+vhw0cM3u5FKF22lLazf6frS7A2RJ3ELlcAM7QDuFvhkeXuftMfC8Z7d+/VnJTNvgPaHlovmUgyiiUxWK8rI2WzFotgUQtlKVrM27oO2neLWLSDGDPDz3DHAABAAElEQVSUxS6IkY4eParlRLlat29mcub09RXLFaxhHS9HzuwBY8Ki2S/l3bFjlylR0regfuTIEc94Nj4+UT4sJBeTdrELtugHx48f12OtVbxDBw/JNfiJgG3gtUneiC5VurifB9LEW98HDx40efLk1j61fesOU6JUcf843Lt3nzl08HCA5QQ7rvPkySN97oDZiXo4jkG6wQLqvXvXHlNc6o3xYcPbby5REdyg4b3N7XF91O5zfnqNZewPVj/bf5zj9rRYgjt86IhBH0Z/y549u9bXzj8Yn/v27TM/fPeziuPQpmhfW14dH+s3ycO7/AF911lO1POgtAOEdAiW2XGxMIiyIl8wxxhEQL/8b90Gaduifva6I+4P5oR33lyqc6VtZ7sfrhNtv0a/Rdx9+/brvJMtm2/uQZkxf2STuShr3DYcH2xM2H4czfyAY2CtEnP4BuGTLVs2/xxsy+r16dWv3fEirZP2g7j5G2MEdc6dO1eAFU2wwDjCvGzPEe788Nu2GY6H+y1wz18gv3+82LZD+Q8fPmzy5fPN5bZPYf9G4QDho/u85pWf13kh0nqH6pMoD84Vem6TOaBQ4QLKBGUAL8x5pctizou/NkvOtrS8csp5287N8dvix1kkc6Rt70Jy7kU7BQte80A26R927rN1t+WIti3d8xJEthj7U2eO03NJnYfvM7Wq1TeL3n4vgRDOeS2COQkWMRFKlirhv36y9Qo2f9r9XuMZc7h7vsucOZPBdjv34Xg7R9i5TueAIOdScHKfi2wZgn3a+RX70R6YC3ENtX3bTh0/EPjadsC5E3OX8/rIjsdIzjvBrslsGs4xnUWugdx8nOPViynqYOfIcOd6jGH39RyOtyFalom9bgqWz92VK+g5w5YHn3Y+Qf/AdS2uOcEJ5wMbMJ9s2Rx4jYPx6HVdZo/x+gw319g2w/kS6eNhO6453ddokZTZ5n828rR585MEziUCeAEKc2Drds0iqhZcRkIEV+/xh0zzVo0SjOO3FizW9IaPGaDX3BDi4H4ZL6ZEKoTD+Ma8Yc/jKFjdhg/5ywfL813bP2e+XPWtqfPw/f7t/EICbgLVatxjLr/yEvfmgN/ue7CAnfJjm9xXY80A9/uhLPpHeh/sTv+YrL2tW/ufad+lld4LjhmR0EJjJNekuDfH2hbOpa9MnaNit45dW2t25W+50Txaq5FZJUIzCOG8rBtPGT9dx+49VSvqMbj/wtxg13PCzRVYj8A1cI37K5uatau7qxn098cfrtR9JWUdYvE7yxMI4eyBH7y3wrTp0DxgrQXXFIvlupyBBEggbROARTiEYEIzKyRLDWK4tE2apSeB6AjEr/ZHdxxjk0CqJHD4yGkz8MWtZt3G41o+uK97plEhU+7a7GbFlwfV7V2jh/ObqhVyq1imde+NKsZ5oU9xI8+gzNRXd5mVXx/01w2Wqzo3L6xCiJlv7jYrvzokQp2MZqOIWxAglGvzeCEzdd5OEeLAtZARgUtm06N1URVWfPvzYTPmlR0i/Mli/vnvmO7Hn1YNC5oK5eIfZvt3yJe1UvYhE7b604OApnfbop7CsfGzdppf/jxihnW/QEVZP/1xxAyduM3cdXNOEYAUNGskz0Hjt6mwBXmgbGADy1mwoGVDt2GbVYSB3xBQ9XmmqMa1++0n+Lbus8EUKpDR7Nh1UsVvsIzUdehmLR/KacPTvTeYirfkNC3qFTSzF+4xnwj/Sy/MYn7/56hGQRpdWxQR4Ye3IC4Uh3D1hghy+ORt5r9Nvn6Adqotda5TzfdAKDFtaesAgRJENwgQI6HOpUVo5xXgdnbGG7tVbIn9l4t1qq5PFU4gQsS+cHWKpC03S7mad9/gb2+ILlE+t8gH+Xm15bh+JbR969bMZx6o7BOOrBOXn71HbTFtZRzden0O03P4FpNOnktBuLZfhGcIqFfP1kXkRjq4wPOTLw+Y6Qt2a/z5S/Ya/J88uKQKnCbP3an9Q3fKn/sr5TH1a/n6Z6i2RBpLV+zXwxZ/vN8s++SAWuqKpD+ibfKLu0wIvaw1uWjay5YVn6Ombdc+MWFASQNxLcYI+oTtf4hT6bZcKu56f6WvvOiTDaSOmItsW9jxifgIENg1qxsvsln+2QEzW1x3QryLgDHUvWURFQ/aNJxjs+qduTz5hGKKdG1fDzVeMdeMflkWUUTshYA5DnMrhLEIocavRvD4s13mlE6DNpknHszvd9c8dNI2dTv7yvOlZWHSJwLsLvNV00cLmHtuzxUyn2Wf7DfzFu0xkwaWVCEiBJIDx231z98YvxlFKF0gbwYzqHP8m5SvvbvH/LHGN09hPmxer4Apf012gznNBrRxvQfymZr3xAus7D77aTkGmzNsm2H8/L3WJxLFOavaXblMw9r5NZlIy2zz5GcgAVgrGjVsvJmzYKpfNPPekg/FZck4M2veJFnAbqL/rWsTCDewIGgffCK1eg821cUvu9i9XBatJox+SUUj2A/XKX0GdPELmXp2GWDW/L3WLFw6G7s1QAS0RN5kdVpcwgI6FsisJRZ3HCy81anRUK3V4W1UGxo8+Ygs1D+pP+EOCm4u8AY7rKBhcbBmnepm4thp5nVxf2YDBH5tOz6lDwyxmFi7egNNA2khfCSuH8eNnOyvExbku/dq7xenLFywyEydMEMXA7GAWLl6RdNCHhb06jZQhTlIo0PrHqZytYqmV7/OKtB4XlxUfL36O+xS4dcTTeqaSlXu1N/2zzsLl6l7R/sgs1Obnrprz559mgZ+4M38+2tVM88PGqP5Yxve8vd6wDF+9FRZcHwfUUyrJh2Vy5CRz+lv559QbThx3DTzxcqv/O2HN3KbNmxjOj/bVsuBdEZKn/r159/lzf2XnMmKy7mF+rYyNk6dOEPa5nW17tWlXW8VbmHBFe36ypzxMo+fUGuEeLiOADeuaCNYHEBAO40c+qL2G/wuVLigPBy5Tx7UPIyfAQFisjbNu6gLnnHiZhfuHhuLS1+4e8Qb0sg/ffoM8mD9sL6BjIPRxr37d9H+jofHk1982cybu9Cf7g03XatCzRWrF/m3ub9MHv+KgYsfG+BKCK5HICSFixJrPQgPgB6r1VjEfCXM+KkjdFEci9PuPgrGEPZ8980PpluHvrqo/fmnq23yajkQi8ZfiHtQBDDr1ruDtjNEpXiIhIVw5zEDh/Uyd9x1iz8N5xe0BVye2PGFvt1vSA9T7ubrVYw346W5+rChvAhY8dAAYh3n3GDTco9lPOwKVT/3uG3fuZUZPWKiTU7Hve1vdv6pLQ/G8B3ho+Wf6v+h0rdhqQ4LaLD0ZAMEt91k/BYUURzCHhFn9u4+2MDtEwIeoMAlYk4Rd7Zr1V234c10zDczXpuoLk5fm/2GmTdnoX9OwNhu17llgMgOojyIsarIfGDDun/XS16DVHSGbRB9Dh7RW8VarZt11v4G65EQG0GIjHFi6wHXs7DQGWxMJGZ+QN8/feq0lHOXvy5wF9xnYNcA0a4tPz6D9WtnHHyHaCZcnTC39u81zH8oxiP678SXR5krrrxUt69ds87UrdM0YM7rN7h7AjE1Itt+DgsCaE+48q5c7S617DV97gSxWlBK01zy7vsGD54WLZ9n0mdIr22LMf+VPGRFv0dfx1ht+H/2zgNMimILoyUgIqCAgIgiZn1mn4o5YEABA0ZUMKGiKCCIAZSgoIgKBkRFMaGYwYw555xzhGcCEVQk53dPzdZsT29P2GVZXPjv9+3OTHd1V9Wp6uru6r/vPbGtT5/0L9t5gZvifPXO1Sc519HX6KfhHEH+lIWHUyPtuMN4YHxGt5PTHsiWZFsivDux3RmOc2Xw2sq5/MvPv/beFxEbFjJGvvjcaxaS7SZffv61s/G6o42LjGtxi48DnL/rN6hXbm0ZH5c4xre3sS2IdTgG8Rw6zo7ZqMWvRaLn1U4npcbbEXekzsfZxk/2l+143nLrzfw1SMiTvsB4t/ueO/t+0aNn53TYdkLMcf4NY0TSuZRQtIUesyHP8BnGV67v7rztPvPO8YSNjxv744w09MELzAseYfYQ0mJ+/LBrPl52CMdjrvMO15W5rsnCPsIx3Xzv3dzLL77u8+Jf4MN1UDam4boh37me/WW7nqu9SurljbKwLMt1U658htg1Oi8N3HrXdRTZe0bp1eOi9BhJG3Dept2OaneoT8PLIifZdQ/9HAvXONmuy3yiLP/yjTWhzVof1CLjGu1s67uckzGuHfOVOZr90sgzmr++i8CyQmDy5NQLPYy9f9v9JC94JZ2DQ33vuTPlhbmtjSW8RFNvtTppQTxpCKt4+FEHexFc2IaXCbhPK8S45rvgnAHmpXwff22etE14OS2XKClpOy0TgSiBbPdg0ZCk55zZ10coYDvmFhBpcK8WN0Rghd4Hx7dF2H/jbVf7xa+8+EZ8tf+d75r0c5tnYW6Da3KuzW8yz2+1ahV7SAvXsuEzngkC/XtGjXEnntLOz3/xgt7B+x3j7ymYn8DyjRV/20s7WMOG9f2LeVVtMjr64pZfmfAPj8u7N9/Z7bRLMz8fwr0yrKMW5lmes/lA5rWC8ZIo92ncI33x6VdhsT5FQASWYQL/JjFcPKQrXrrXtznXpem1bhluelVtKRCwx8oyEVh2CAy8fqL3UoX4qreJ0RAgXDvyDy8qa918Ve+NbdRDf/nfiHLw7HPWKat7QdfzJjJBBIdY6uq+TfznR1/MdB9+PjMNiPSIiwadt6Y74fDVvCDl6tsmuS02Xtld3KOxO7J1XS80e+ejGelt+DLNRHIXdlvDizcQXwy/a7L3XpWRyH7goenia+2NY/Ow1Ov0Rq7z8Q29B6KhlkeSdT6ugS87+8P73A32yf4pm937u8E3T/JlpFyUL+4FLuyzjnlgYv0Rrer69FfdkpxfSI8IDvFQz06rh0V5P2E33zw79T+rsevUvoEX0r309rTE7fJxyFVvdnjLfZO9CKmHte2QC9Zym21Ywwuv8GYWrCxt6bcxL1KXnN3Yi7UQsiCCSrLPv51t5ZhifaOGZ9v2gHpeXDPmqdQNVXybXHUqtC0pz767reLzQ2iJh6n7HvsrnlXG77K0JdvstE0tN/DcNb2QC9HQF9+lhEMZO4/82GOH2l4gyiL62dALm5hAr6p74ImUSJLjDq7NTHA09sWpDqEVlqstD2+Z2oZ0rez4vubCtfhasNUzT3YI/HbdrpYrbXvlywRR4tnW/zjuEcW9+OY0R39HmMvYhAe1B57I7At4bjzrpNVNLNnI4c0NYd77JqbFPv7SxBOjp7im5oUQoSpp8FA26Aa8rhSXJtqe2fjkYhr2lOt4JY/BN03yntuoI2Jh6ntpUVnyHb8hj/gn3i/xPEhdMUR23/44x49JQZj22TepfrbdljVLPV4iSkXETF9kvOMziDmjZfll4lzPlzGYyHMPP/23PbxfwV1rfXZ7yxej/7awYy2fFTJmULcOR67my7R+0+ruSRN1BoFhoWXOV47ldf0ee+3iq/76K2+lEbxsE3IIQdY2Tx885ORvsgmUmHAbdtUI/7Az29vYeBsbeOEQE69t7Cf4hg6/zHuuQbyBmAgjHGYHCzsWtVdeCp7PdvCLmTznTdiDD22VnpyPpwnbE66Vt9DJi4edCN8+eO/jsNp/4pWOB8W77LGju8fCqyAw4uHgXaNH+BChiMPuuDUlLsjY0H5Qb4QaO+/WzD905O1dhExj7n/MJ+VhI4KK3ewh9c13DvUhP/ECNWL4SNf/0vPTk/qUEaEMdtP1I/3k3XU3D/b75CHEgL5XpIUopPnZPOoh5GjZeh9+pg1BH/xG3nuDa2sTg4SThe8Z9mY/D0V5GDza6ofHlrh16nqS69K9o198wy1D3BU2uRu3fG24487b+XJSPuzN19/xn6+9nOpDPFh5/52PEt88PvyoNl7kxgYnn3asG/VAsSCCh+gHW9+4athAL5okJB3eZajTraOGeYHQLRYWJxjhPxBPsh9YtNi/uRthYsSXTFgTNSZXu59xvlu5Zg135bBLMoRK0XQIOngwjFiGSWHa+MvPv/FJXn/1LS+C42E+3BBs8qA3l9HHEMEhSETYhIcEykdIPR4OI2AkLAoT0beNuMtP6vbqc5av5/MmZmN72uqBR0f6T/poPE8EGfQ56sUEMn2IyWFC+dHfeeN97KNPZxQTLzGESSHcLt6PEGvisSjJ2B/CAvox9d5w4/Xdhedf6ss86fc/fF6/T/jDtdj9UHfUIR3cgfselRbhhf0lHcuF1i8ct7vZZPmYsXem3zYf8/gdXlQa8uATL2EsZ7xClMb3bZtt7T3qIYLjARvCTFghLmISHmNcOv+c/t6jJOGC4VnX9kH/4y179oMgF2EB3/EO8M1X37kbr7vd4ZWHfbIddRplQpGoPf3EC15oGbxiwvnc7v3MQ+UqbthNV3ghJu0xZNB1/iFELxMtchw8aGMLbYcIbr9We3vhAOXMd0yQd1nGh7ANdaefMqbdf/dD0aqkv+fq1+lERV8Q8OaqEw9UGVtTYsB+jvEwiGmi+0L4R6gjxgLGbcY8Ht7ksqnmOavfJT3dCacckytZxjqOeQRH5IMACg8oeB5IslznhXz1Rpibq0+G/L7/5kc/HnK88sCH0GScFy+/+iJ/PDa24xcPEFFbUm2JgPCUTsd7ITVjJaxohy5nneq9vhY6RnJOQ3zLeILokXZ8752UIDxaj+j3MA5w/i7U8rVl0rhEP2P8iBrecjmHRC1+LZLtvJpr/Mx1PPOgP994Fy1P/Hv0XEofKc0xG99X/Dfnl/UsBBaC4Asu7OGvBRAoISDkuOEah/EDrz1Ry3XeKfSaLBzTJ3Zsl8gnF9NoWXKd63Ndz7GPsrIs7XVTafKh3hfbuZrrAfjTDlzvxI2H6knXOLmuy+L7iP4uZKzheodr8+vsBQTGReqFFVrmaH58Xxp5xsug3yJQ2QnwMhDH0mGtj3OHtj7WHbBPW/fCs69krdbnn3zl17U/vKP3MMU1fxDkswIRTtQrNC/GcA7evXlqjiHrjm3Fh+994kVw3F8h6IkK8ljHHyHMeXmI+5zdLJ1MBHIRmD9/ns2NFv8FQWaue7Do/piT8dczZ3fy59XLLk4J1qJp+F7ofXB8u0J/57smxSMvL1EGoT+eYHkBgXsMwo1ebi9I8lLP3i32TMzyicee8cuDJzdeej2tcwfX6oB90+nzjRV4pMN4AZJxpOVeR7heZ/fPmM9K76zoy3ff/uCF8Pu13Ns8waXGiCByiaalPtwn8HICc0vBHjYPlLwYgfhEJgIisPwQYJzgJbalZQjg8FJ347DbbQwb58egFi338t8pG+tYvrSN8uXixDrSyEQgGwEJ4bKR0fJKR4Cwo+PMe9X+e6zqPZFtbgKkYw8xV8o2gfbxVzPtxtO57h0a+t8DrrULaBOr4XlqPfOShm2xycpefIZojJCSiEjwzvPqu9MzWHQxcRrCFvJpUK+aT4P3tQ3MIxJiHjw9vfdpsXiOjU9rV99tsn4N78EIL1DYOx9npmEZojsEEB2PbuC2+s/KXqCDVyjEG3/+vcB7f8MDHH+ERyScI96K8PLWe8gEL+pAaIPgDQ90iDz22rm2Lxfl63Hy6mRTws41z2ysP8zqvFuzWj7kKWEv8UIW8gue3Ni45Z6req9yMCuN4Slvo3VX8gIUhD4ffDbLJgvtQXxRnUK9cnFA/JOr3pQHb2YIXRCtkA9tir33SSbzsrRltw6re69XeCzb0cRgiIKChzifSdG/F96Y5vtG1xMaeraH7FfHe+56/f0ZJozMbEu8kuWqU6FtiUiznXmpoi3xOojHs9fen57IOJS1LG0JU7x/cewcfVCKbVQwGvYd/aRP4nkLw8shYT05Jp99bZo/nmgjvIkhYsWCZ8ZcbYnos4HtByN0Zn2rb2msd5dG3ssd+8jVXqXZZ0jL2IJYi+P+sCJPhHgP28m86jE2IcxFuMhxHOygfVf13iu32czGIvP0hr30Vmr8oXwY4iw8iJGGfRCe+DM7foJF2zMbn1xMw374TDpeWY44j3H1NGsr6rjtFjW9BzNCI3N85jt+2Uc245j9wkSkzAd89EWqXvSdt4rExZ98Nct7wkNIWJp82N9bH87w2yLE5RjB8xzHSNzOOLah58sYjKCU8ZdxmX4CU84L9N9swuL4/vKNGYg48RhImYLXysCg0DLH89TvFAEe8jL5HCbACYmASGT/mPhqyKBh/q1TJqO54QsTV3GOYSKrt3k9Q0y39X+3sNAmh7mvv/zOREWpiXTeAEVsEbXHHn7SHWACruB57sP3P/WTaLxlHiyeJiw/0URheKgirz7mwQvDI1TUEETghQIPUHg0wUsdnjIQtbS0CT9ELoiW8FQVt+efftlPJJ5p3sjwsHXI4Qe4rbbZ3AtfSBuEV0zgb7TxBp4PnuSYcCUEZ137wxDVhLCtEy1MFJOVTS2MGvs8r/eZ7vx+PSysdvFtxzNPvegFIptsupHfPvxjUhAhFeKRE05OiTxoQwRw7Kvd8Uf4pEniAvIP4UrrN6ifEWoi7D9fG/7XPKFhn1iIXOw1EzEiFOIBMqIuwgoS1o+QHBMn/O6FhIhG+MNbWAPzGoYhBiJMZTAmcjt16eDFSytWr+Y95w268iJfpw02Ws/q19ILA4Mo4SkTwdFux3U42rM42ULo8nuihVIN9qd5+uphXvTm21vbV5rALppfSBM+yR8BHIKPEI4nCCrTTOwNafoOD5PxZBQMzyahjoQQwh6xiVvEK7zFvP4G6/rJZZa/am8y86DnnPO7eCFZPxOWPTx6rMNbHHljW269uRdKHXF0Gx/i7LC2B/k++MpLb/j14d/pJmykz23XbBs7Zvf2ixFE4kWR/r7HXrs6+m/UENcRIgXvg6eecaJfRdvFDfErE+lHtjvE7bn3rr7eCDARQnxiYQBDO7AdoroBl11gZW3oH2ghcAqWdCwXWr/occuxyzHDpD7CmOAlMeTj+5Ytr2ahWxFQkobxhDC3PIjHmyDCP1jhJSy0KWHiGJ+Oan+oHwvg2dXEPbQzDzlS+1nRCwv4jkiFsLMYHi8I2csYQv133GX7UBwfgu9ZO4ZbH7RfehlCRrjhxQuvTxzLh5gXQ5YjFGFcObztwV5kh1AKUQ4hYbCFCxfkPSZIV5bxgb7CmEzd8boFp6fGPs/uSliufh0/3hGR5apTEM927XGqL/cWW26a6MkS0SjHG+Mb4zYePp+0UDp4UgzHHZ/hgQyFRtC2twkVk7w4lKhU0QJEtRwX5HOEiXaxLz/7usQ4Rr3ynRdy1Ttfnywqjh/LEXNyvLY9JuXVqb15hWOco38iKudBWRAls92SbEvO5bC/YuC1XvzN+EY4JCwcT3iRSBojfSL7h7dWPFCS5nwTUmF4icvVltFxwG9QwL9sbRk2TRqXWBf3aMnxzvkjavFrkaTzar7xM9/xnG+8i5Yn/j16LmWczHXMxrct5HdnO4esY6HIEelynceYzLmI44aXJBi33n4z85yS67xT6DVZ9JhO4pOPaahbrnN9rus5ti8ry9JcN5U2nx++/9F7eeN6Af60wzm9uobqpj+z1dufU7Ncl6U3TvhSyFhDm3FtzkNrPCVwriPEbqFljme7NPKMl0G/RaCyE+BanXNwh1Pbu24m9kH4c3G/wXZcji9RNQRF3NNhJ9g9Ei8rcc+JEC7qXTpsiJcs9sV9IR7kctkXdn3Vo2tvh+cn7iPi3t5Yxx9eZBF4c/8dDb2da99at/wS6HLqef4FLQSb/PXvc4WHke8eLBDr2adb6nrGXsBpc3hrf4/4268Twur0Z6H3wekNyvAl1zUpXuVOOvXYdESHsPv2R3T0YjTm87heW8vuVeOG9ze8jiNijc6NEP6Y+45g+cYKPGpzrO9holdeEuS6kLmDa4fcFHZR4vOZJ1/014077rKdnxdjTmWshTpFIB+1ObMtSpPx5z6HlzSxH38Y7z1Rt7F71rlzip8RRLfTdxEQgWWXAPMNuUReS7LmUfFYp64dXItWzX12fA8WRHLhd0V/IsTjLxsn2LEupKvo8im/ykGg5BPgylFulVIEShD41kLLYc+8+o97ucjTGCIrbNLk1CQvHofwzIUXKoQURx2YEvGQpomF6Pxu3Gw3eMQkH74zeOSZX+xEjGRevOO/2D+EEfMXLHIrVTdFT5HVqW3hp0zgErWoy+atN8Oj0BQ3acq8aBL//RvzfoRdO7L4QeecuamLZrwUXTb8d7+ef3gaQ6iCV6OX357uvY0RuhLxBhbqvGVErIZ3oyRDvBcM73aEMWV7PFAhtMEQfxDKEkPwUhaLcoI/ApNZsxd6T1Jhf9QriFOSOPxhgke2zVZv9tPUBGGEkSQE6o8/zfWiHZbTVlGLRqoptC2j22y96comaJzhKBN9K2rf/Djb53tm/1/Si2fNWuSXfWne0wiZGyyEWMxWp0LbcqVIO7LvzTeq4QVlhFfEW1cwGHc3z2NYWdqypnksDIYYiL4xI9bnw/pcnwg1OVZ+mTDPnXrBTxlJQ50LbcuMjQv8ERUy5WqvAneXkaxaSvPnl9Wvl/rRuGFxH6EPY7PnFPfJaGhZ+iPe0f4oGie+sbGpUYMVM9oL0dijz011v9pxRGhSrJD2LJRp0vFKHt+NT41ThE4NRhhk/rBc41g4fsN28c9mW9Xy49m4n+e4Nz+Y4cMpUzcEyScdWd/2PdvtV+SJLV8+0X1zDGDR8ZDf9gywhCF2C1bXRJsY7WTP28pk2cYMxK9YRn5F/WKmjYulKXOZCracbISApp+FBWSSj0lpbE8T0ESNh9u8FcrDTcI1MWmGaCluTFTxwKtWLc7jKdt+x22dG3ab+8XCMrEuboSpQIhydq8u6VVPmvcrBHOIx7CkNCFxtchgwsNRJuTwphS1IJohBCITl0z8RW2nXVNhpHiLfY3GmYJ4PM4h/ul4Qrf0JiGEJwtgxsO5FU2AEyyEZg2/458dzKPJ2V37uIP3P8aLpRDmIMAI5eTt5Scefda/6RvftmqkvkEYtJYJV4LVMXEjNmdOahwKywv9LKQNEXngDQgBIl4F8OREeA6WzZiR8vhLmjtuvdc88KVC6pA/XmRCm8bLQ12CEf6voT2YRUjEPgkxGWy+XXTCnwczeG0KxgMUPCVhPGjFQt4IuBqvmRJP+xUJ/6L50w48HJ5hoVKx3+zt6vDAP2xaNXLBOPjSob4Ps47t7nvkNj9xS8ih49qeFjbxn4iFMARUeBe8ZvBwP+F+VPvD/HL+MWn9nXHFA8K7NpEdJtsXxC644RQshBRZY43i/gtr+m7UqlYrHr95QI3R7+P2nXmCw0bf84hDdIiFt+rxNlivSBxCWDz6AcZxT79+zzwCBoFM/FgmXaH1C8cD25TVEPv+UvVXd5eFSSbsZXjQF3h9/+2PftfbbLtVOgvKh8eqbLblNikR23VXj/Ce0/BGiGgXwWYwBBX0hag47mvzJIddfvE1IZkXj/Jj0qQ/vEj1lNOP92JJPGcNGHS+40EHlu+Y8InsX1nGh/jDR8qMODO0d9g3QmkeSGTr14RyDscc24QwstnqhAgRI9RisOhxFZatFLu4QNCBZ6FPTYxLeM5giC7wIIDVjIQHCuvzfUbHgCAY5vhJqle+8wJ5Zat3vj4ZyomoMxghQbHoOFa3XkpkPTsy1i/ptiTUMqE4sXPsnI2oF8s3RvpE9i/qqQoBGaIdrj3w0kW452C0ZbCyjAPZ2jLsM2lcYt3CMDFSlHDhooVeXBu2y3UtEtLwmW/8LPR4ju6z0O/Ruuc7ZgvdZzRddM6G89g8C4EcXmIgXaPGDdPnzrBdtvNOIddkYR/5julCmUb5xM/1ua7nFoclfb3Q66bS5hO8/yIwDxa9Lg7LctU7pCnNZyFjTbTN8LSKMV4VWuZ4eZZGnvEy6LcIVHYC3HtEjfub008+2+EdnnNy1KbaS10YodlDmOVNLD3en/COiiguGEKWK8wLFdeveNTiGjiXDbWQ2hherVZaKfXifTT9i28+5n/ykgPiGbwkr1pnlbR36GhafReBQADPqOusk3omw7I6JvTE8t2D+UT2b8UVi+ejU/NWD/pzVjR8Kmm5F8Ly3Qf7RGX8l++aNGm3Dz0xyl9X80IT8wiIR3lJKmq8MMo8CiGNc1m+sYIXqKLe/RG18WLXSy+8Zi+7nJVxbUg+CPC4/t7Bogv88890nzVCWDxIMm5wnRSMeSxehOJ+HaEc935EAmBcwdsk94AyERCB5Y8AQq6KDkMaFd95L3DfjU+/BLjBRh3s2mk9Ly6jNZ576mW3QdfiOcGKbCHKgTAPQR6cfvx+fDr7qEiPNPKqmUajLzECxTOQsRX6KQKVjcDceSlByfbmnWj9IlFIqMN/IoKNIEBDuDPLxA21a6YmuZ83j0u3PTDFewA6w0KOrmGild5Dfgu7KLfPOeZZCEvlmrnbUIdW5nGtevXih3mkWrtxdTfqqnXSG4TJeTwzTTGPYhgik2BJAo+wLtfnnLlF5bMCXt1vLeeKdTouiPJybV/adQh34vW67s7UQ8skDnjhw7LVm3U33j3Ze63CyxjCx3kWkvWKmzKFA6RbXJs7L1PwGN0fojuEVm1aFIstWU+777B1LatzsZAiTLpnq1NZ2zKIOZMYh3XRMlf093lFwsQmFm52N/O8FbUGReKximrLXO0VLVdFfsd50womMgxmzoYyjPELiwpZMxJk+bG4TEOJIl7cM3LKNY6F4zdjg8iPLTZJhbv54PNZPkTqcea1bcN1UuFC8RI4z8Z5xHJYafIJIsOoKC2SbYV9zTVmxAvxbylzvFyV7TfeZZhUeu2Vt/2kEqKuuFiJh3j8rbfBOt4DzzMW8u+0ziemH4JH6xzG67Bs1qyUECc6sRjW8fnMUy94LzNMpmFhAm3QkH7+N//iadIrEr7grSf+Bm08Wbg+CMtnFQmnosKisG6uPeRlEi54CQvLo/tYFHuLNaTJ9olXqsefu8+9+dq7XvTCg4MH73/U3XDrVf5hAG/xMkG5V4vds+1iiS7P14Y8+LjDvAFsvc0Wng2enBDzvfHaOz58Bet5qEEoPTzzBOMhJp5/8hlCts6nnOtqr1LLPyDBQ9cH5knkhqG3+E0D+4UmGMxl9Ov1bUKA8IG77L6D93iVK322dZS7SpWUMDcpzfU3Z4qmwuT45ltt6prvvVvGJgj8gk0qEqD9OeVvL94LD6rx0IhHBULfEnYTsQFCw/K2EPYx8Izun36PEf4zKvBiGcKlqUUPABZEvChu8p+NWG2hlFMe4ZKOZdZXVP3IC6Em3gEY1zp0PNY1XbeJu33E3X4cY3045+FNqFBjLBs4uK/7/rsf7cHh235inhCPeLRA0IqNfeRp87LWOkMgG8SpePiLCkdIj7c5DPElIe6wSSY+DpbvmAjpyuMz21v2CF6wbP16+x22LXG8kz5bncJ4m9T/2C6bBeFXMxNZv/DGo+lkK5hHzfff/TD9u7y+JI1jhZwXstU7X58sr3Kzn/Juy8l/TE4X768/p1pI4pTwNt8Ymd4o9oVzL95B8SAab8tbb7ozlrp8fmYblzjPsy5qeHYNIkSWF3otkm/8rKjjOd8xG61rRX1POu/Ex4Bc12TZylleTLNdzy0uy0Kvm6YXXSNlG2fj9U8SvcXTVMTvbGNNUt7lVealkWdSfbRMBCozgU02Tb2MgBfkuNUuekkp+mIEL73gHTbq/ZntbrruNv/g9bIrLywhqIvvl9+I7hDDcA988x1DvdfnaLpwL8/1MZ6qxtz3qL/mDqEco2n1XQQCgU0328S/vBZ+h89C7sFC2vA5x+aUsPg1CsvCi0q57oNJV1Yr5Jo0ad/M4fFHRAFeyuIvKoRDsHr3HaP9i5h4rC+N5Rorwn54OQ5P8whYmb+I2luvv+df0EP4xl/Unn7i+Qwh3EKbSOfeAk+QiGDxfoeIjntrXmKIiwSj+9J3ERCByk9g8NABJSpB+NGlYVFBGd/xBvfc06mS/PDdeJtvXjcthON7RVkQ6EWFgQjcYBcVvlGeH75PhXONerAL5UzaT1inz+WPgIRwy1+bL7M1XtvENFh18852wF6pt8j5jdcpQjFieOLCe1qzrWr68KU3mWDq7I6pSW48iCEoIWweD47KU/QV9UT26deph+aNLbxk3KjD2x+ZJw0T4e28bUrsQRo8A61qnuaSbMyT5gHGwnPuun0t94aF3aQeLcxjUvBQ9onl12zrlOhq5uyIqi2ysxkzF6Y9SX1uYQkxtsfTV6Ylb1/PvBj9XuR1j/SlZRcEHyGvQjhkqzcvuxO6Ec94IcwgIV7LyxCrBS6EacQC62gehA/91jz87bpdLe/BjnWIz7jRpH/F68z6bHUK+8/XltNmWOUj9tUPs70Yb8Vq8XaMJIp8rVXkCWviH6mHgazCY9+SstXqpEILU+6kY7Y0bbkoosoqS3/M1V5Lqv7x/c43wWaw3yw0Mf2lccPUaRohLOGJCatLGFjsoy9m+s+N18vvqizwKQ1Tv/OEfwgXnY1TlCd4oCTs8AtvTnOdj29got3Sj2MhG/oqoV8fM093HGs72NiF9zy8pt1qQmXG6I2K6luafGqb4Jbj9pMvU8cs+dFlGKssslypjHKVxgodM+L7LM8yx/e9PP1GsLRvy+buUQsZircfxBzBOp10llu4YKEbYRPUwYJIiv4RRCRh3YYbre/fAkXshHAO+8gETBiT5nEjhMqjDz5p3uVOSq968flXfWgtwq5hSWnSiVlfJM5gGeXHe1Z0wi+alrdiEUe99ca76bCirMdTFMsbrWHh4WPiqvVskvDVl95wu5m4K3gJ4kFumBQN6+dYiIbwRvuY+x/zDwiSvOaxLV71EHHgjY+/J2xij7d2v7awmnjpeuLxZ72wDM9BFW2FtCGTnMOvvdVPTDIhie2+1y5uQJ/LPcfO3U/xy1J9JfnaLIy5PmHs37hxP3kh4KkmtuStO+xT88wXLLQj3tKCQJF2I3zOpptvnBafETb1wEP2dye17+IuPH+Qu/nOazO8FYb95ftsamHgnn/mZS9QCmK1mUXe4tiWidqoMQFNf0IsFvU+iKeXMHGOByTEU4SkfOyhp9xw85oYvCDxFjfh5QgDST/jDerysmiYP7xaYY0jHgVDPk3MsyK2Uo3qiXUIXupoA0Rm2Ddff+c/g1e6+LHsV9q/xalf3MNd2Ge2z48++NSvQkwZwsMsiHh9WmvtVD0JlUioKAwPebfeNMom31unl0VDthDeljfRCWeLgBdvFkcceIJ5DnvKC+F++G6cF+AR7jhqTddp4n82tgcDgRkLouMlYagxwsvgcW4n885GCOd8x4TfqIz/on2CXdCmhEctS7+2o6FEKbLVaa21G/u0eGEKXgWDcDq6k7g46SNrKx4QVa9e8j4xul34HrxB/P77pHT44VkxT4khbdJn0jgWxv1s5wX2k63e+fpkUhkKXbYk25J+etmAa3wYM8Q6Ay8aYl5fhnlRZ74xMpQ/2paED+WcjTCccS7e38I20c/FbUv2lW1cItxn1PsoD9nom3ihwPJdi/hERf/yjZ+E0Ebsnu0cF/YVHe+Cd62JEY+3ScdL2JbPQs5F0fRL6nu0X0bPO+Fcnuua7H/jf8parCif8hgjw3GddD3Hyx/5zutZC2orCr1uKm2bNV5zDZ8tIcuLx9HUXFWu8iSty3VdFk8fbVPWZTtvxLfjd1nLvDTyTCq/lolAZSXAefyoNh28x9rDjjzIV+Pnn37xn4RBjBuCE64HeenjtM4d/GpE/gj6o/c3eOm9/56HHR7ko9e38f1Ff+MJfgV7i/X0k3q4Ky+/PmP+IZqO7+TJOZMxWCYCZSFQyD0Y+6WvhcgGn5mXMiwu6GLZ2uuk7h9z3QeTrqyW75o0ul+O64NaHO3nRIrnnlLPN8J8VUj/zpvv+VDDZ1pY5FxWyFiB5/9Hxjzh7n341nRUg+B5j2uZuOHRjfu3S4f0zVj1oM2bsY5QroF9SLD/Afv4+aaeZ13oRXStD2oRVulTBERABCqEAMK3H4aN83khKGvhmvs56g02WtcvQ3QWLCpKC8uW1Odz5vUNS8ozeIajvFjwFud/xP7l2k8sqX4uBwSqlFcd11trBbf3jlUz/rLtO542WzotF4HSENjAvMCts1Z1H9bzlvunuC9NpHHvY3+5Tn1+tvCYc7zg4ZrbJ/lwg12Ob+hFUh98PtMh4MAIM4i3odFP/uVef3+6u+iaCf733//ML00xEtPeMGqyiVZmucdfmOrusTIhyCCMadz22XUVv+7m+6b4kIeI0vBk1n3Ar4nisv/9Oten28684HU+rqHboOlK7s4H//ThTGGBgOpFE6cQ4pR6Xnr9xHiW/veAYRP9eri9/dEMz7FRg5QAJ3GD2MIdt6nl/jSvdI88O9WL0AZel5xPbLOsP/NxyFVvvGbB4Qtjh5c/hIGDikLK/v1P4R4xshVu8E2T/L5hRZuu26S6a2hhLON22P4pT3D9h0704Unhf96g3yz0brJnulx1KrQtf588zw0b+Ue6raebwGzfojCS8fIl/UZkhAjpDQtJSShK/q6944+kpOWyDJFJq+ar+r5D2N+PTaT0grVZ536/uMefn2oeavK3Ze2aVf0x86F5EPvahH9YWfpjadurXADEdjL2BcI6T3dvfTgjHQZ5vz1Sol68G2J9rpzg1xO++NlXp7n11q7uvUXGdpX+GedTCNP0xlm+7LNLapy64a7J7tnXpvl+MtxExYj3EOnlO36z7Da9GPEb4jHCVYcQsgiDGZ+3slDPQZxU2nw4Fgj1TF9DLDvUzgcIpUtjCCYxjo0QNjrf9oWOGUn7KY8yJ+13eVu2737N/QNp6r1zJHzCTrs085PdI64f6T0oMdH92stvufYnHGnjT2qCLcrq6GMP8z8Jcfb2G+95Adm9ox70k+JBcILoa9Tt9/l079obozzIbL5vsdcshHGtD27hQwGSKCmN37joH5Nwr7z4hs9vQN/L/dKWNmmWzXijlFCsl1w4xIdhuP/uh/zDb0RTSdb2mDZ+ce/zLvEPAgj72P2MXu7yS67xyw83704Y4WXfffsD94gJChGwhDfZwwM/xHS/WohNHip8aiFkBw+81r8NiyDqbZuUxHgIwRu0MG510L5+WUX/K6QN11t/HS/Uou2C6HAHQuCasYxQFtmMCU4eZOD17puiUJHxtOyfNPSVN19/13sBGDrkRp8MIQWTugjgPjSRJaF1EC9cd83N7tGHnvQhQML+CFeLIPPiy3r7/n31FTeEVaX6PLDN/j59zx79vde7h0Y/7h584LGs+6B8hBHiQdGl/a9yhJslDMnRh5zkHjdPYTxkHzTgah/GF4FWF5v4JewHfQvb0UKG8MBntHk/eOPVtx19j99TrG8srsEAXuQ3/NrbPOedi4Rs0X3jqQExKsfvLTfe6b764hv//eD9jnE//jDeT2Qj1oIFkyccg8OuGuH3h5dJLH4sh/2XtX48jMM4PhDRFGLbFIV/vfuOB/wb6oglORYR8iF0oZ4IXQjpSV0/eO9jL0olLO+aFiIVa2ohdqg/4je8DiHYwTMFfY7jl7rTPuFBydNPvuC9EeBBM2r77t/c8+GBH33188++cpdZmFSEmvQJ8mTcPKtnZ0doH8SQrKec+Y6JaD6l/c6b+9T9s0++9OMibNoUCVyj+8rXr6Npw/dcddrDQnBznOMN5InHnvHtcvXlJY9RwuXQbhwfjNs///SrO/TIA0MWeT83NQ+G5BPal7xG3HBH3u1yJch3XshV73x9Mle++dYtybZE/Ew/5+F1j55dfDvceVvqXF7oGMn5+uExY/25tM95F/vq8JCrUCuPtsw2LrW2kOnjTYSNB1GO9b52TudYYJzD8l2LROuQb/ws5HiOj3d4oiTsFEJixLiMg9Ewy9H8w/eyHLNh2/L8zHXeKe01WShXnE8hTMO22T5zXc8tLkvKx5ie77qptPnwcJ9wYneNfMD3XcbJ/vZSQmmskOuy+P4KHWvi2/G7kDK/aF5suPeI2pLOM5qXvovAskiAe6ID7J5m1G33+2t3jqkrL7vOV3W3PXf2n/Fj79gTj/Lne86N3HcNtOswLLyoxP0NHrsRwCFy4R4j/IWXZvwGsX94BeacfubZp/l7JO6Posb1MH9cL5/bLSWcCfeo0XT6LgKFEMh3Dxb2wYtznEe593149Fh/L8yLknGjr+e7D76o92X+mje+bSG/812TTrH7YF64Gf/jT36ugzCuj9mxwvHC/RxzUVxvHBELf3r3nWP8/AMvoUQNIfz1dhwjesUKGSsYS7gvuGbwDX6uY9TI+/2Lg0QJiHs+JyQ64w33C7xEFv0L95yvWrjluDVosJq/9uXej/v1IGiMp9NvERABEVhSBOIisiB8Iwxq+E7eSd7WllSZCtlvCIEaL38h2yrN8kugpHqjjCxOOqzkrsb9stCN+3VRxh4Ry+21Q6b+jt99h83LSKcfIlAWAj07NXKE1UT8xR/CnnZt6rn1TRiFNyGEQeed1sgvP2z/Ou6lt6a560b94W76z9qOMJx4DkPMhSGmQoQR9XQWL1MQZORbjoeqIICiTD07re5WrlF8HIT94PXtou5rmEDjD3f/2NQDQbzZnXPq6m4l83QXt6tuneRFQKccnQo5REjXswf+6hlc1K2xr+ulN0z0YjAEYRsWhYwN+RGnE1Ee5bv6tkl+9w3rV3M9Tlk9npX/HbaLl2SPHWt7EdIDT6TKjDiH/aYt8jUsi64Oy8JnPg756n3iEau5ESYmJNQtFrzl/Tox+zgT6hbKED7jy/GQNrBIUNiowYqux8mZrEJ6PGXhXZB+N9wEQxiCtjNMsJhk+epEv83ZlrZTRDrfjZ/j3jIxI/bfzWu6I1vV9d/j/0I5403T9oC67vYxf/rwsmyDMA6BWTRd2Da+T4SGeC9MstWtXwWL7uuoA+v60LXPvPqPw1si/QYPhq2LvDrma0uEXaRFZDrg2onunqHrurL0x1ztVWi9qF+0bqG+6c+ElVGWjcz7260msAwex446sJ7bbMMafnPaobMJeEfcO9kNM3EinDbdcCV3lvU/9hH2E88iiU8+pkmViB6vjEm9uzRy19g4NXJM6hhDEHruqSn38LmOX46f3ydn7yOEE0aUfOdDf2Z4xcSzIiLJHbYpdt+WKx/Gy8Ak1Ofog+pZ3vO84JK+xljHeBysStEG6e1YUbzaJ0PA/OTL//jjo81+dRIFzSSkbMGyjRkhn2gW6WVFC/OVOeShz9wEmDxjQm+7Zlu7lVdOHVNs0f6Etv7NWDxX8Ye1PGBfP4nlfxT9441ujDAMl1pIU0Revc7u78UHu+y+o39wHoRzCHt42IzwDKETE5PBSxbCKNYNuOyCoj27EmnSK4q+bPyfDb0ojck+7KzzzjCvYJv47zxQjBthCfHKxgQnXr54MNmhY3sfdiWelt+woTwINPr0vMQnQSCEgAnDgxtvwPOglwk+7EgLaXnSqe3993XXb+p8SCwTAHxvnqIGXtHHDbryIhNIXemYIMXIo/+l55uXjEZutIkNKVN8gpJ0VapWseO2+NqIZVi0nuG7HeGplVn+p9MVMQq/C2lD0u65965euLP5lv/xORDGlIcgeKsJ4fKSskYgSNvjFQ+R28tvj/XJQv/gB2LBnn26+4e6F5wzwPcjJkmZ3P3t1wleZHTMcUc4vOEgbmGiGmaEEUWEhVjJW1Hd/rPZRv5BC2Ka7XfYxv2nKAxQlFA0/9TGxf+ZeOVBDdv3PvdLnxf7RFCZzY5qf5j3IMSDI0QxCHEQfPAm88hb7vUPlYYOv8zG2BW9qOepsc+5Sy+60t370C2u1YEt3Hff/pgOBYvYEGHFT+N/zswu0r/T7R2pVGR1ejtCDHU/43z/G2ZXmOv86DGfTmhf+lx0jhca8oCdP9Kfe0FXF0KpdD/3dC/SGmjlxhAmsL9V66ziRY7xY9knsn/56hf6YkgfPhHsrbteUxOoDPTtEbxZhPEnpIuGTKc/n3hKOy/K421ztt+9+c5eRDL5jz9NfNrAe6HgYQJ9EiPNTbdf7YJHRrwK8lDvzE49zavgULerjWnd7E16QrXgzY+2xTPGKacf7733PWEiw+AVMZSJTx4qDBsx2IR2Q/14wTLyGjDofIeHwWsGD/fetvbdb09/TJ913umunz2Qod8fesSBeY+Jso4Pa5v3v2dMvBfqT10YJ7EVijpR6Fa5+rXfIPLvrz95OJK7ToMshNZFF1xmTFKe8BhbEcmm+7Ptj+Pvyy++9qJLdk/5jjy6TSSn4q9J4yPCRcSFd9oYfHbXPr69GKt4wEr1iusYahlZVryoOBP7luu8UEi9c/XJWglueAOPUFYKE/0eCperLcMpIWxXmrbkoSDHD6Gug2dFjj/GBc4F+cbIkCcPDe+89T7/4IwyI/gktHaShW2i6xa3LZOuMcL+CWP90yk/2/h8j0Owh+GVM3jZil+vhO2in9Ey5xs/853jksa7o9sf7qZPm+GF9+SLMI6Hg9ExL34uy9XOv0+clDV8bnh5IT2+JpxQQr+MMuB7vAy5zjv5rsmSjmnySOKTj2lS2VgWLN/13OKwhEmh10258glljX726X+uv54M/ZZrTizaH+NtEt0+fl326NP3uH+m/hNNkv7OvQKWa6xJarNQltBn8pUZT82I1jvYyyu81FARefpM9E8ElnECx9iLRNgNQ1Pidq7tLxrYy99nsDx+7LU6cF/3t4ldwgsEXPPiwZrzPoYwGwvCNf+j6B/neK5fo5Yei4rOKazHUy6CvC233iw9bjGPEAyv8txrc00vE4EkAulzTJbr9lz3YHj0Z3v6Np7MgvAST+E9e3dLys4vy3UfjKd6jiW8eueycGkVL3a+a1JCGfNS27bbb+2Ya7poYE93lb1oFX3p7/SuJznmyYLhjZiXi7hWSh+HRSvnzZvnuH8lhOxue6auIfKNFYjUmL/iPrXb6b38nnjJCS5xe/G5V/yivffdPb7K5nU29nMIXGcz3mBh3pnvBx/Syr88SpjUYKG9w299ioAIiMCSJBBCjhJGlPCowYsay/EYx+e/0f5t4rx/IyOVKZPACtOmTVt0+e35w6plbpb5Cw9vCOFeeteEbyZ+W69JFS924/eL72Q+8A5CuHja2x6aX0I0l5lL9l89O8zJWDntnxn+YVvGwuXsx5S/F7n6deOXm8sPhHkWYpBwn8GbUGlqTjhCogoRim9x7Z2PZ3hR20XdG5uwrrqbat6HVqubmuzKt++Zsxb60H21LKRfWQ1vR7XNQxPhFBGG4DULoWBHE87ttfMqGbul3nPnLkqHkc1YWeAPmBNBCzFLednicECUheCw0NCgucp8iwnrXjThJEKr0rJCSEU5ksSMufKMritNW1Lv6iuusFjtQJlr16riqlUtfBzBSx4C1CTrekLDDGFTPA1hCP+yPBFlhhvmaJp8bUnfw6LHS1n7Y7y9Fqde0Tpk+04fP6XXT+5wEy3ime7PqfP92JUhJo1s/NdUQiVbqM9StE0Sn3xMI1lm/crYwvGV7ZiPH79LimU8n6QCc16YY2NcNRuj5pp3Ocb5M/r+7MOvdj8pU9CatH102RTzgPn9+Lneq1x0efi+p4mDab+yjhlhP+VZ5rBPfZYkwGTeXxbmsU6dVdMPpEqmylzCG6II3OLhzggxuGjRQi+wO+EoE3pccp7773Zb+Y15iPfl59+4y6++yP8mlGQ8TcgF4VvrvY/0ghgm0fGkVrdenRL5hfTxT8rBxH48dMP8+fPNU+ghruPpJ3jPd9Ht8Ea2cs0aJd5yDWkoA+FT43VmfdK2eIEi7CWTs8HOObOvf7iAR7GlbdnasDzKRegRLB4CI75vylCnTp0SE7YhHX0TtvF2DOvL6zOwCHmdfGwXE+LNdvc8eEvOLOhnU/+2Y8fC3MYnnXNuaCsRbOIN7xu/9gAAQABJREFUjIn5xTW8FZ7X/UIv5ELIFupRyH4JCThjxoy0MCy+Df0Y8WEIHcz6+LEc34bfZa0fb8ETUi94XUzad3wZHBlPgrgtvp7f1GOOMUfIFzfGBcLE8MAwaoieom2LYAgPZ7fffb1DHJrNGL94+z5f/0/aPt8xkbRNtmWEv67foL4X6P4zdZqrbg+DEKLms8Xp19F9UxeY0qaM3zcPv9Pdd9eDbszYOx0PWKIGf4SjhZQvul30O2M0fac8H6Akje3RPLN9L6RPZts2afm/oS0554exJdcYmetcmVS3pGVlactCxiXa5U87rldbrV56zM51LZJUtuiyfONnvuM5abyDMYJJPOoUaknHLH0mm6D78efuy7g2KTSfaLrSnHeyXZNF95f0PYlPPqZJ+4kvy9VHK4plUj7xcvKb/lm7di0vkmQM/8i8Np1vLxEgbkEsWaiF67J77cUXRK5JdpmJl0feek+ZzhvR/eUrM+dHru9CHy/r+FaaPKNp9V0ElnUCHF9c93FNFLX4sRfWcW7kmpf7rfK8hgr716cIVBSBfPdg3J8yPxNe1MxXrqT74A/f+8T16NrbDRzc179AlW8f2dYnXZOGtIjXuC+KGmXhfil6DRtdn+s716tBeB5Nl22siKbhnM79WdwTXDSNvouACCy/BM7t1s9XfrC9NIvFf/uFef6VZZs8u8y6enHzWtztsxYssqK88iiv/USKtkx8XV51Q4XPLhXQzMUe4BZ6IRye3uLe38Ju4mnDcn2KQHkQQJhRFhEceWcTdCxuuRCtFCqCI6/yEOL1vXqCW9WEcIea97vJfy1wDz3ztxdnbLNZsVelUC/qXcCzoZA88TMqQkpMUIaFi8Mh6pWpDFln3aS0rMraF6MFKE1blke9y1Lm9uZ9EU+LSbZKxENW0nrEb6vVKfaiFU+Tr05JfS9pWXy/Sb/jdV+ceiXtP9cyONTPI5atl4NTtn0nscjHNNu+ossJhZrL4sfvkmIZzyepTKPMy9zbJk4+7tDVvFCUULTY7s2KRTpJ2yUto41W3aKqu65/k6TVXvh69yMpD5kkKO2YEXZanmUO+9RnSQIIu+KihJKpMpfEBSNhbUoMVNVPLj781F1hsf884eRjMn4zARlPk5Gg6AcT8vVjoomkdNFllCMunuLh8vvvfuSTxcMasjAq9InuK3yP7y8s5zNpW95A5i9qQ669OPpzqX7P1oblUahCBUD5ykDfzMW9PMpKuEw8SfUwr1J48EKo84O9CRjvr0l50c/iD5mS0iUtWxzBT9L+wrLSMmNSPJeALKkfF8KmrPUr7bFOvRHN5aoDaZLqwXKMh/FJfTHetniPGv3YSL9Nrn+LI25MKkeuvApdlyQAzLbt4vTrsE/G20NbHevamXfHXXbfwb1g4bUI64O3tfr2oDVuUcFwfF2hv5fEWJE0thdSnkL6ZCH7SUpT0W1Z2jGyPNqhLPsoZFyiXeLXO4VeiyS1Rb7xM9/xnDTelaXPJR2zg4de7ObNnZdUbC+sSlxRxoX5zjtJ12SFZJXEJx/TQvabq39VFMukfJLK3svCtte1lzCOME+ZCAPvvmO0F9Bvve0WScmzLgvXZXiDDh5X44lXsetyhHDBSjPWhG34zFdmruuDCC66Hd+XVJ7xfPRbBJZlAozJ8WtY6pvt2OPcmDTeLsuMVLdlk0C+ezDuT0tzj5p0//jjD+P9i4077bL9YkFMuiYNO4yL4FieKkvmi0Qhfb7PJBEc22QbK6L7K1Q0GN1G30VABJYfAkEAt/zUeMnXFC90P3w/Li0qXPI5KoflgUC5CuHiwEJYVDzGYfwO3+Np9VsERKD8CRC289qRf7ghN6fCnhLSsOfpjVxZhDTlXzrtsTQEKkNb4vUuGvK3NPX7N6ddVuu1NJgvTZZtD6jnJk2Znw5VjMe2Yw9ZzW1noVjLYgiuSyNuLkse5V3mspRB2yw7BO6/52F3z52jfejN4KVu2amdalJWAvQFQgLePuLudEg/wt+2P+HIsu5S24nAck8AMQ+eEm4cdls69DYhS882wSkPYmWVh4DGyMrTVtGSloe4NLq/5fn70mTZs083H1awR5fevgkQ7BOmvKyCQMKlZwuZXl5tXN5lLqRcSyPPQsqlNCIgAiIgAssWAYTpbSyUJyIymQiIgAiIQOUkELyl/RtLT0hW95TzYrjFKV8I77o4+9C2yw6Bcg+NCpp1TfiG4C2ERiVsKkb402gYVZaFtAqNCo3ys+XVxWH5ESyfPZmHdQvBt9BCYlaxhx7ls8+y7IVwgAsWLCoXL3NlyX9Z2Ga+8TMP+4sV3rQ8OKgty4Piv28fhNtd0cLZZguH+u8rceUtEePydAvpijB4SVp5jhkVVeYlyUP7Lj0BQlfw9mp5TTISFmq6hZNotEbpQgGXvuTaorISIIxQbQtli6eWymSEVplrnn94U1wio8rUcku2rITVMf8fiaFwlmzOmXufMX2GhWVdaamXI7NUlevXv6UtK+sYWblau3KUVuedim0nQqIRwiyft5vFLVV5jjWFlnlp5Lm4nLS9CIiACIiACIiACIiACIhAJoEgMCuNp7iybJOZa+G/Ql6Fb5GcsjT1S96Dli4tAsurbqhcPMLh6Q3RWzQMKstefMdUI1ksnjZ4j8uSXItFoFISMA/rSyzUammArFSdB5qV66FmaepXEWmrWWjbaktWN1NQNdSWBWGqdImWVEjmSgeiAgrMuLykRXBUozzHjIoqcwXgVxalIFCasBWF7JawUCE0VCHplWb5I1DWkFxLmxShVcr7eFnadVL+i08gKazO4u+19HuoVbtW6TfSFhkE/i1tWVnHyAyY+lEuBHTeKReMBe8EoXtFWHmONYWWeWnkWREslYcIiIAIiIAIiIAIiIAIiMC/h4AEbP+etlBJKpZAuQjhKDKit3G/mJuVIssmbGN532HzMkKkZksb9qVPERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABEfg3ECAc5w/fj3Ol9bzGdjIREIElR6DchHAUUYK2JddQ2rMIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiMDSJ9CiVXPnnnJeDFdoaRDB+e0K3UDpREAESk2gXIVwheZ+0mHVMjzCEVY1VxjVQverdCIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiKwJAkgatugq7y7LUnG2rcIlIVAhQvh9t6xqhfB4T1uvP1he+1QxYdVlUe5sjShthEBERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERCB5ZtAhQnh1ltrBYcnuGAvvbPAh1JlOUI4mQiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiUhUCFKNAQvWGI3viTiYAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiEB5ESh20VZee0zYDyFP+w6b59cQGhUPcOs1QYO3sOgzYSMtEgEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREIECCFSIEC5ajnG/LPRCOMRw0ZCoiOVkIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIlBaAhUvhDPB20vvLswoJ+I4mQiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiUhUCFC+Eo5IvvLChLWbWNCIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACJQgUKXEEi0QAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQgUpEQEK4StRYKqoIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiEBJAhLClWSiJSIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgApWIgIRwlaixVFQREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREIGSBCSEK8lES0RABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABCoRAQnhKlFjqagiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIlCVQruUhLRGDxCIz7ZdHi7UBbi4AIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiMASJrBekxWWcA7afUUS8EK4KuYXbuHCisy2/PKi7LJ/FwENEv+u9lBpREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAERGBZJ+BlZHVrV14PXpW57Mt651L9REAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAERKAiCHghXNPGldQdnBGqzGWviAZWHiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiKwrBPwQrgtNqy8QrjKXPZlvXOpfiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiJQEQS8EG6t1Re6bTZZUBH5lWselJmyy0RABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABJZfAl4IR/X332W+W2+tyiMqo6yUWSYCIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIrB8E0gL4cDQdr95lcIzHJ7gKKtMBERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABKrFEeBlbYsNF7rPv6/ifppQxf09fQW3cCk7iqticr26tRe5po0X+rIpHGq81fRbBERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABJZfAiWEcKBAaCax2fLbKVRzERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABEahMBDJCo1amgqusIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIgABCeHUD0RABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABCo1AQnhKnXzqfAiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAISwqkPiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIVGoCEsJV6uZT4UVABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABCSEUx8QAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQARGo1AQkhKvUzafCi4AIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIVBMCERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERCBZAI/fD/OPffUy47P0tjgoQNKk1xpRUAEFpOAhHCLCVCbi4AIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAILLsEyiKCW5o0zu3Wr1yyl5CvXDBqJxVIQEK4CoStrERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABCoXgeAJTsKwim23IOgT94rlXplzq1KZC6+yi8CyQODZ1/5xX343e6lU5avvZ7unX/lnqeS9LGa6NNvy9fenu/c/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stI9afz3eftv2q53+1emG7RNo+7L3115c3PECVeUfZl9/Yc2GLd9G4octSUIuuUWd2jO+fb1zdfP/0P5994PXzHq5MtlvFT1S9vv0N82537n+vL+/uLXFzWbb7JmqZK4eeuf13n28wmnX1W2/cAjlzSe675YLhtipgQI3GYC2//dduWEdFZg2073Cds89lEl0HHMkSeUCko50P2Nr53b7LrbLm2FrKUDxM953jPLNqSLs/PO+VYJkH30pDPKQfEaOEno66TjP1bGO7+9YjTBlu22f1x5nP8SjHvy3+9QugLM437j5PnachDuP756TlneAW96R3l6x/ag2WwtV5SmK9a3vfldpRuGU0/+RDn5ndBUv/bs5+5cnn7jPm8rV6LnxPUeL3td8463vac8///a6k5p6V72/PO+3XyqDRQmwFKvZN/oXlMnEBKm+3XbxWauYv1+24XsIQe+t1wNm0DUee1BybQcWMwVtDHe6Wnbl+cW+r9R9uHm9920BLWy72ro8NHpArdteS5dWczWcoAzJzJywv+n011F9o6b+WecvFa++Z/nlyoAh7/rA2W0BClyUDcBuO+0Ict0rZPwwvve88Hm05/4fOkCpM4v3dUmkPnWg99YXt+HvfP9ddCcbp+685PK+Pvu9ZZS9e4Tp322OePjn5l1Hlm/5z3/2eW9c9Bb3t2ku9l0Q/Kcp7+w+WxbKSyhybcfcFjpxjcBrVe0B37T7UdeW2mPabsMyQmf09rqB+d8/bwmr708vqp9bSxri0G8sryj3vuh4rztdJCtO+9UakgYNe/fYz9wYvPjH/203P/7v3tu84uLLi4HshPWikUOnuQ9eMS7jynzS5XJtN73cp3/fLevnozL+yMhmlHa1tPdv5784Y+XK9QTlsx7MUG+BF2ynQm6pEvPbOu3v/XdEkpNt7z3artITbtP28VOtj/htwRREthJZYq85vL+zbZn/9QTJWd//iulGkEqaHbb9k/arvjkhF9eqz/8wY+bg9tuUhPUzGsiy8zn5p77vrxJ1z4JQ2Z41nPYe6K7nLnez5X72fYffO/C8rkYm52nA67deQ17XXfHrfcHbVO6gcz7PNVAzvzMF8p+OewdS79H011O9lveH/ncvuRXv26esctT6yKG3qZrySyn7t8s65j3f3jodINGGPZ3YdB2D3tNDlrusGHLc18m/JzXeU5e77Xv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Yw3C1Upws4XbEojb8/nblK1JIC6huUyT8TUCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECky6ww07bNc1ZTQnDjbquCcGV6UadwHgECMxZYKxBuFrtrVaAG7Q2o4wzaHrDCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECCy0QEJtW7xSdbeFdrc8AsMEVh82guEECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGCSBcYWhEs3p6kIt83WG4+8vakKl2lql6ojT2hEAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAwLTCWIFzCbPmXYNu200G4BONqqyG5PE7orQbfdtlxqxKcO699LtNrBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgrgJjCcLVhSYIl9Ybasvzl8wSdOsdt87LLQECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQGEVgtUWLFi0eZcRh46TKWyq7JfSWSm+jtPlMM8p8F113fbPRvTYcZdSVdpyrrlncbLD+aivt9tkwAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSWFlhVc0NjqwiXLlETgptLhbe5BueW3m2eIUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFVXWBsQbhVHdL2EyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMBtI7BcgnCjVIWr46SKnEaAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBOYrsMZ8J+w3XbpHPe3sC8u/OnyXHbcqXabmccJvGd5tmUYjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLzFRhrEC7V3fZ8/jbNud+9tITeslLdim+5v00bfKvV4ITg5rvbTEeAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECVWCsQbg600EBt0HD6vRuCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAqAKrjzqi8QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwCQKCMJN4l6xTgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAwssBy6Rp15KUbcaUU+OWli1fK7bJRBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECK4/A5huvtvJsjC1pBOG8CMYu4ENi7KRmSIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAAAFdow7AMYgAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEJl9AEG7y95E1JECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIEBAoJwA3AMIkCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIHJFxCEm/x9ZA0JECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYICAINwAHIMIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYPIFBOEmfx9ZQwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAYICAINwDHIAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBCYfAFBuMnfR9aQAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAYICMINwDGIAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBCZfQBBu8veRNSRAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBAQKCcANwDCJAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACByRcQhJv8fWQNCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGCAgCDcAByDCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGDyBQThJn8fWUMCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQGCAgCDcAxyACBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQmHwBQbjJ30fWkAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQGCAjCDcAxiAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQmX0AQbvL3kTUkQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgQECgnADcAwiQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgckXEISb/H1kDQkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBggIAg3AAcgwgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBg8gUE4SZ/H1lDAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEBggIAg3AMcgAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEJh8AUG4yd9H1pAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBggIwg3AMYgAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEJl9AEG7y95E1JECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIEBAoJwA3AMIkCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIHJFxCEm/x9ZA0JECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYICAINwAHIMIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYPIFBOEmfx9ZQwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAYICAINwDHIAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBCYfAFBuMnfR9aQAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAYICMINwDGIAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBCZfQBBu8veRNSRAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBAQKCcANwDCJAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACByRcQhJv8fWQNCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGCAgCDcAByDCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGDyBRYkCHfpZdc1+acRIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFxC6wx7hnW+Z373UtL+K03ALfxPddt8m/brTeuo7olQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLzFhh7RbgE3047+8LmvDYIl5bQ2zbTobd6m2EZpzckN++tMCEBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIrLICqy1atGjxuLa+huAyv4TeatW3VIdL6z6uQblddtyqhOXKCGP6b9F11zcb3WvDMc1txZzNVdcsbjZYf7UVc+WtNQECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEC8xJYVXNDY60IVwNvCbfV0Fv2Ru73Ps44aXWa8sB/BAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgjgJjC8Il0JaKcKkEl+5Qh7XaZWqmEYYbpmU4AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECMwmMLYgXAJtCbd1K7/1W2jtPjW3GTfT5L5GgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTmIzD2INygleiG4LpV4wThBqkZRoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQKDBMYShKtBtvPa7lFrN6f1ti68huDyeJcdtypPZ5waiKvzqOO7JUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECowiMJQhXF7RN29VpWkJtCcWddvaFM4/r/YTgavgtAzOeRoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE5iuwxnwn7E5Xg20JwNVqbwnF1TBcrfbWG4Lbdjo4l/HqPLrzdZ8AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECAwTGEsQLgvpDbJ1Q24Z3huCy3NpCcn1Tjs1xP8ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGC4wNi6Rk2YLaG2cztdnSYMl8pws4XgMq4g3PCdZAwCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQmF1gbEG4hN4Shks3p7Ur1Cy2Pt+7Chmndolaq8f1juMxAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAYJjC2IFwWVANtp5194RKV4VL5rVspLvczTnea8sB/BAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgjgKrLVq0aPEcpxk4eu0etXZ5WqvEpYvUWimuDputWtzABYwwcNF11zcb3WvDEcZceUe56prFzQbrr7bybqAtI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgKYFVNTc09iBclU3VtwTeavitPp9gXP7V6nH1+XHeCsI1zar6gh7n68i8CBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKxoAqtqbmiN5bWjukG3GoZLAE4jQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLjFFhuQbjuSgrAdTXcJ0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFxCqw+zpmZFwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQWGgBQbiFFrc8AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEBirgCDcWDnNjAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQWWkAQbqHFLY8AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIExiogCDdWTjMjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgYUWEIRbaHHLI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGxCgjCjZXTzAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgoQUE4RZa3PIIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYKwCgnBj5TQzAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEFhoAUG4hRa3PAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAYq4Ag3Fg5zYwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEFlpAEG6hxS2PAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBMYqIAg3Vk4zI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGFFhCEW2hxyyNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBsQoIwo2V08wIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYKEFBOEWWtzyCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGCsAoJwY+U0MwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBYaAFBuIUWtzwCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQGKuAINxYOc2MAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBBZaQBBuocUtjwABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTGKiAIN1ZOMyNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBhRYQhFtoccsjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbEKCMKNldPMCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGChBQThFlrc8ggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgrAKCcGPlNDMCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQWGgBQbiFFrc8AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEBirgCDcWDnNjAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQWWkAQbqHFLY8AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIExiogCDdWTjMjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgYUWEIRbaHHLI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGxCgjCjZXTzAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgoQUE4RZa3PIIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYKwCgnBj5TQzAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEFhoAUG4hRa3PAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAYq4Ag3Fg5zYwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEFlpAEG6hxS2PAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBMYqIAg3Vk4zI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGFFhCEW2hxyyNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBsQrcpkG4Sy+7bqwbY2YECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgsOoJ3GZBuITgTjv7wubc71666qnbYgIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAYm8Aa45hTrex2ySwV3ja557rNxu2/bsvj/DtvOgi37dYbdwe7T4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIERhIYSxAuld0GtU123KoMroG5Om7Cb5lWGK6KuCVAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBuQoscxCuhtu2aUNtqfzWr6XyW+0Ktd/wPJcwXL/KcbON73kCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIBCBZQ7CdRl7uz/tHZawXG+r1eBqV6m9wz0mQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQKDBMYahOsuqFaAS/gtXaCm1ds63rltFbi0hOB2me4+tQ5zS4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIERhFYfZSR5jpODcFlutm6S804qQYnBDdXXeMTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQFdg7BXhuiG42lVqnqutPlcDcPVxHe6WAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAjMRWDsQbja3WlWohuK667Uns/fpjwUguuquE+AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEC8xEYexAu4bZaAS73hd3ms1tMQ4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQKjCow9CLft1huXZZ/33UtLIC6PB4XhEpobNHzUDTEeAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKyaAqsvj81O+G2b6UDcJW3QbbZWu07tdqc627ieJ0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEC/QTGXhGuLiRhuE3arlE1AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECCwPAWWOQhXuzWtXaEuz5U1bwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0CuwzEG4zDDdoKab027rfVyH1eBc93Gqx2kECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGA+AmMJwvUG2RKCO+3sC/uuT4JwveP3HdGTBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgBIGxBOF6l5OwW6rE9WtCcP1UPEeAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEC8xVYLkG4rIzA23x3iekIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYC4Cq89lZOMSIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFJExCEm7Q9Yn0IECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYE4CgnBz4jIyAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECEyagCDcpO0R60OAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECcxIQhJsTl5EJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYNIE/j9yNTMvnqDOLAAAAABJRU5ErkJggg==" - } - }, - "cell_type": "markdown", - "id": "8cda6c13-7fee-4284-aacf-81a506a426da", - "metadata": {}, - "source": [ - "![image.png](attachment:95b9b198-55c9-4a67-b0bf-103c9ae0272e.png)" - ] - }, - { - "cell_type": "markdown", - "id": "e1525230-e10c-4f48-b951-bc73642bb3e4", - "metadata": {}, - "source": [ - "And at results:" - ] - }, - { - "attachments": { - "66422f79-9b46-4e07-9796-c1b350c26c9c.png": { - "image/png": "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XMhths8cRdqiAnD5heDCl1deafiIweGTyvR9vAulbbeCA3FLXGvUP7atsYlb19j0HRsszYXiIo346Bjrl9DYdq+VZP3da0J0wXE07bu8R8FHUN57L8L29xjc3xq49qVKPn73zU/WpEkjGzFyqL379kc24beJfgs9e3X37Ujz29wBB+3jA3Gaf88dD9uJo4/2lebmuxKDTzzyX+vdZzcfXNP8fffby17476u+fepN191po089zla4dqpPPPqcKezWqXOHUBhOZQlV9U1Bu6+++M61VO1izVs08+1R16/b4N4n2RPP3G/16idapy7t/ZdNX1gF7RgIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCQV0DBNhW/Ku7QOtFu3SOPOaS4q5bJ8soI7TFkgO8mWZoNahvaVnmN2tGxtsFVe4s0lqZusefWzbBJ29ZGmp1n2vaMdBu7ZaX/iY2KtlF1W9noBp0tLp/gm/Zd3qPKB+Jq16ltF1xypt32r3/bdtfG9MUX3vA/AUx8fJz9/fJzC0x26ib/wbUuVYBusSs9eM+dDwer+9cU13p13dr1prarJ59yrH3+6TcuBLfSr6P1gqH05Sljjg8+uvDcnqaqdRo333iPJTVraq+/86yNdtt45MGnbfmylXbkISdb06SmtnLFKl8dTpXoDjviwNA2eIMAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAI7BaZOmbHzQzHfad3KCsTpUIeN2MMmT5zqCmylWq/e3a1121a+CJiySZFGo0YNXXGwIT7TNGXyNKtZs6bfRqRly2pa3RgXSkvNubVUVwHu5fWz7dPkRa6dqpqiFn9oG59sWmTjt662sxv1sD4JjfJsxO87z9SynVDlA3E63f0OGOkrwz3w78dt4YJFlpGR6VuZ9urTwy6/6kJr1bpFgSoqg3jP/f+y119511575R1T9TYNJSn79e9tl15xntWvX89Pi3ftU59+/kF70O3rh+/G+hCeQmwdOraz8y483Qbu3s8vp1977zvC/pw0zac61Xo1Jiar7erxJx5pSUlN7LlnXrEFrgqdwnUaXbt1sjPPOcUG7bFzG34GvxBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQMALHHvC4dVW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ECi1AIG4UhOyAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgaogQCCuKlwFjgEBBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQKDUAgTiSk3IBhBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBKqCAIG4qnAVOAYEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAIFSCxCIKzUhG0AAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEKgKAjVWr1pbFY6DY0AAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEECgVAI1EmrFlWoDVW3l5E1brHmLpKp2WBwPAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIBAOQvQMrWcgdk8AggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIBAxQgQiKsYZ/aCAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCBQzgIE4soZmM0jgAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAghUjACBuIpxZi8IIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAALlLEAgrpyB2TwCCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggEDFCBCIqxhn9oIAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIFDOAgTiyhmYzSOAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCFSMAIG4inFmLwgggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAuUsQCCunIHZPAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAQMUIEIirGGf2ggACCCCAAAII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EUAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEylyAQFyZk7JBBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQqGoC8VExVe2Q/nLHUxHXgEDcX+624oQRQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEPjrCQyp3eyvd9JV7Iwr4hoQiKtiF53DQQABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgbIXOK9xT6uICmVlf+S7xhZlr2tQ3oNAXHkLs30EEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBCodIEe8Q3shbajbO86LQnGVeDVUBBO5rLXNSjvEZWcnJxZ3jupyO0nb9pizVskVeQu2RcCCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggEAVEKBCXBW4CBwCAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIBA6QUIxJXekC0ggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAghUAQECcVXgInAICCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACpRcgEFd6Q7aAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCBQBQQIxFWBi8AhIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIlF6AQFzpDdkCAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIBAFRAgEFcFLgKHgAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgggUHoBAnGlN2QLCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACVUCAQFwVuAgcAgIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAQOkFCMSV3pAtIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIVAEBAnFV4CJwCAgggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAqUXIBBXekO2gAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgggUAUECMRVgYvAISCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCJReoEbpN1H1trB61dqqd1AcEQIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAQLkK7JKBuCZNG5UrGhtHAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBCoegK0TK1614QjQgABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQKIFAmVWIW7Jiky12P8UdQ/q2Ku4qLI8AAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIBAHoEyCcSNnbjExrmfkozWzRKtlfthIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIFAagTIJxAUHMNhVe1PArShD1eQUotMrgbiiiLEMAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIBAQQJlGojLr9qb2ql+9uNcH3w7YHjH0PGMC73jDQIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAKlE4gu3epFW3vqnNW2afMOm+ZeFY5jIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIFDWAhUSiFMILrFOnD/2sa5NKgMBBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQACBshYo90DcH9NW+Opw/Xs0tx6dmpT18bM9BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBLxAjbJ0+OKneRYbG2NxNWPsuAN7+E2vWrfFmjSsbf16NLPPfpzrW6a++P6flpqaXpa7ZlsIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAJ/cYEyrRBXLzHehd9q+dCbwm8aq9dt9dP0/oDhHX2VOC2jZRkIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIlJVAmVaI271XC2vVLNG3SNUBql3qalchbrewVqkKxWksWbHJFi7d4N/zCwEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAIHSCpRpIC78YKbNWW1L6myyxDpxvl1q+DzeI4AAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIFDWAmXaMjU4uCF9W/m3mzbv8BXjgum8IoAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIFBeAuUSiFPb1B6uTaqqw4W3Sy2vk2C7CCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCJRpy9TFKzaFRBWEC8JwS8KmBwuELxtM4xUBBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQACBkgqUSSCutasIN84dwbiJS/xrSQ+G9RBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBAoqUCZBOLUInVw31bFPgYF6bQuAwEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAIHSCpRJIE4HMaQEgbjSHjzrI4AAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIBAIRAdveEUAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEECgOgsQiKvOV49jRwABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQCAmUWcvU0BZ5gwAC+Qps3rzF5s1d6OfXqVPbOnRsm++yzECgIgU2rN9o69at97ts2LCB1W9Qr0i7X71qrS1butw2bNhoNWJiLC4+3mrXrmV169a2JkmNLS4urkjbYaGyFVi7Zp1t3LjJb7Rx40aWWK9u2e4g19a2bdtuy5et8FMTEhKseYukXEsU/nHJoqWWkprqF2zTppXViOU/UQpXYwkEEEAAAQQQQAABBBBAAAEE/p+9+w6somj7Pn6F3nvvvfciINKkW7AjoKhYEdtteRDFrtgrKnZBsYuKSFOqIoIiAkrvvdeEGiA8c00ymz0nJyGdkHznecPZMju7+9k9xz/u33sNAggggAACCCCAAAIIIIAAAgggECzA/9ocLJKJ18f/NFUO7I8OSOhtdurcVsrFE1qYNGG6Ccfs9zTadWgllSqV99bTYuH9d0fLmG8mSK3a1eS14U9Kzpw50+I0KRrzrz8XyKqV6+wYDRrWlsZN6idpvMX/LpehDz1vj1HPkaNfT9LxGb3zzh275b9FS7zLLFS4kLRs1dRb9y9okOrfhYu9TflNQLD1uS289bRY0HN++O6ncsgEEy/v3UuatWiUFqdJ1Jgzps6SqKgo27d125Y2ROYOnP3bXDl69Jj9DrTvdK7bLIcPH5E5v/8VvR4WJud3aSdh5jM12szps0XPq61dxzbS67KeCQ578uRJ+WzkN7L4v2Xx9uvd91Jp2bpZvPvZESuwfdtO2bB+k2zetFWORx6XSlUqSJWqlaRc+TKxnZKw9PPE6bJg/r/2iO4XdJYu3Tsk4eikd12/doN8/P7n9sCSpYrL4KH3JHmQd98aKceORdrj7h08KNn3nuQTcwACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAQKYSIBCXqR5nwjcz8qOvRKtAubZz52659/5b3ar3uc/0efnFd7x1XdCAQ1oG4jQY9PWX4+w5ly1dJX/PWyRtTDhKr3fmjDl2e5EihaTj+bHhILsxnf/5edJMcz1/2LNefEm3JAfi0vly0/10mzZulskTpgWct36D2pLPVAwLbjOmzZJ5c//xNhcwFcXSOhD3z9+LZO+e6CpoUyZN9wJxy5as9Kqj1atfW4oWK+JdV1otaADt8KHDdviSpUpIo5hw5RETehv73UTvtE2aN5RChaKre60z1QWdb+7cuaRz1/Zev/Re+GnszwmG4dL7es7W80VGRsp3X4+Tf/6ODq+5+5g/b6Fd1Pei33VXSnZTfY+GAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAqcXyHb6LvTIrALTpsySU1Gn4tyebk/vli1bNmndJrqSVN68eaRBgzr2EjZv3iZvvvGR/Rvx1qj0vizOlwoCrkqVfygNQIba7u+TFst16tUUfde0NWvZxDvFlMkzZOyYCfZv/bpN3va0XKhcpaI3/CYzVaRrbkpdb331erdoqofF9qtS7cxOt+sCW3px1WtWlUH33CQPPvq/ZE2V6d1gFlwYPfLrOGE4P8O/C5fIe2+P8m9iGQEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQSEKBCXAI4mX3XkSNHZb6ZUq9Fy8YBtzrBTK16Jtqw5x+S3bv3SvFiRSUsW+pMA3km7oNzBgr8OWe+tG3fOmDjyuVr5MTxEwHb0mNFQ2jDXnzETMt4THSK1jPZapgQ2bIlK+wlbNyw2buUNaujp+R1G9asWidNmjWM6RcbiKteo4rrku6fp06dkqPm98O1y6+6SEqVLmlX85hAKy1xAjo16nJTEdO1Vm2aS9eenSTM/N9vphLlrzNm211aGTAi/KAULFTAdeUTAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBOIRIBAXD0xW2TxpwvSAQNzWrTtko69aVXwOs3+fJ9On/W4qG/0nh8y0j2XLlZIuZvrGftde5k3tp9OevvbK+3aIHibkkTNnDvlp3BTZvm2nnQLy4ku6yg03Xu1V7PrfXY/Jrl17bP+XXn1MPvrgC1m4YIl3CXvMVJfX9LlDOnRsLbcO7G+3rzZhoYnmHv40U2/quCVLFpemzRrIwDuul8KFo6eZPHHipNx43f/kpKlKVsxMhdnzgvPlow+/tNOxjvz0dalUubx3jpQsJMbEP37k8ePy+qsfyPSpv8vRo8fsdQy4qY+0Pa+l102DR1N+/lW+/HysbNmyXU6ePGnvsUOnNnJt/yvOioDMNvNO7du7P2Aa0j/n/O3dY3wLEREH5Y9Zf9rA0OZNW0WDVhUrlpOLLu0h5cqX8Q774J1PZXfMe3PdjX1kwo8/y7p1GyXqZJTtd/U1l0uZsqVs//8WLZXxZr+2uvVqSdMWjeSLT8cETCX8/bc/mWlJp9qKZ4ULFxKtZjc75jrWrllvjy1twl/nm/fdTXOqGzXApP20dep8nnl3F4sGmRo2rifX3tDbbvf/U616bIW3rebZurZ65Vq3aD/96+rgWlXf8Ym10mpkbowLe3WTnydOk507dssVvS92wwZ86vv36cdfibu+fPnyilbZC57eU5+BVt67/a4bA44PXlny33JbGXCVuUcN1BUvUVSaNm8snbu1t8fr+/3ys29KlDlvnjy55d7Bg+wQGpT9YMQndlmvtVadGnb5k4++9K7tZvOboFPP6jTLE8b9IitXrLFT0urUsqXLlJLu5nvvjgu+rjO1vnVr7HPXa+jSvaP53SpkL+eCXl3N79p8L3i4csVqaR5T1TA8PEJ+NNPqrl+7UXRZpyTWgGWvy3t6x/vvSQOgX332nSxZvEIij0Va98uuvEhq1q7u72behV0yZ/Y8WW6mEFbzwmaa6jp1a8rFl/UUdXRNg3w/jBkvy5aulIMRh2xVwLpmquHgpmE/7aetljnXFVf3sst6/KsvvG2fc7awMBn8yD0SZj7ja/oe/vnH3+b6l4v+5msrW7a0faa1zfXREEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQ8AsQiPNrZKFlnZZUK8TN+u1POW6CWTlz5rR3//OkGZ6C6+NtiFkYbyrIvfbyewGbN2/aJqM+/tqGtz4c9arkypXTBlM0pKZN9/mbhjg+H/29FDBVunr3iQ5JaNBBr0nbkcNHRKeu1HCLv+l4mzdHh0i0/6DbHrIhMddHA3W/mADZTBNOeu/Dl2zITANNGibTpscvNWEP1zRokRotsSb+c+m1/PTjL96mdSbc8tjQF+XBh+6Qbj062u0/fDdJ3n5zpNdHF/Qex3wzXmZMmy2jPntDNKSUEZsGaI6Z8I22v/9aIF17dLLLWhluqQnmaPP3sRti/tH3YPgr7wU8fw1QaZDqtRdHSJ9rL/fCQVu3bLOhHD309Zfe8Q9jw19vvfa+PDFsiOQwgcyDBw/JXhOs1KbhHx3TrbsDdZv+uQp2n3/yrei0lf62xUzlq+Gylq2bSe++l9pde03oz4313Tc/ed01jBSqlatQ1tus5ztsgqW5TQhMA4T+psEkDRBFnYqyfdy+ipWig5xJsdpmAljuGvX6XTt+InS1vjFf/SiL/13mutngnIbh3Bhuh/ueRkZGP2+33f851wSavvt6nH+T7Nppvq+Tpss/8xbK/UPutM9Ir+XA/nDbb49WjCxRTBabIKM75z9/L7LBNv1e+6+tWPGi1ukVE7RST9f0HdQKfBrau9yE6dq0jQ2cuj5n6rN8+dh3QK/hi9FjpI8JcOq9aMDw6ecfjnNp+u699foH3vupHfTd0XdUPR567F4pUrRwwHEzTXjZ39T9fRMwHDz0bhsi1H1q/Zr5/rj3Xrfpc9AKj/+ZcYeY0Fpe81uj7q+9NMI+O+2jTd/Z4PdWt/u/b9u3R/+3QLfru6zvtWv6O5xQIG6sCf9pONbfdJrhD98dLRdd0l06nN/Wv4tlBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAIEsLpAti99/lr39dh1a23vXikyzZ83zHLRinDYNtDVsVNfb7ha06pU/DFfbVGo6t20Lt9sGz959O7qSk7cxZkGrt7U+t7kd2+37fsxEtxjn8zJT7ah9zHXqTr2mq/v2ks5dzpMDByLkrkFDvTCcjt2x07ne2JEmQPTIQ8/LqaiEA28aOklpS4lJoUIFAyr06bW8NXykvS+9x3dHfOpd3vUDesttt/f37lEr5o0b+7O3P6MtVKtRxav+p6Ea1zRco6Eabf4Ka26/fmo1MBey0iBb46YNAkI+33wx1gtN+Y/TZa0YVbZcaW+zBqK0slSophXFOppqbv5pPrVqlm7TqltaQc0fhtMqWDrtqmvzTGXCxf/FBsbcdv9nWFjod0zfPf91auU2Dfm4Vt4XmNuwfpNoEMq1UqVLeJUYU2Llxgv1Pfht5h/yl7k/167sc4kNoukz69ApMIDUtl0ra6YB11BNp331h+E0zFe/QR2vq4ajfho72a7rb4prbipZreznmlY50+bCtrqs42XPnl0mm+flwnBaFU6vuW79WtrFtrFjJkhqhWDdmCn51He7xTlNvCG0ouBzT70mI4Z/ZCrp/ed9T7wOZuHL0d8FhNb83zP9Xo0JCh26Y/W99VcV1O2zZs6xuzVwOfzV971x9br842rgbtL46Km05/+1MCAMp2NWN9Xp0qppEM4fhtPqkBoYdG3iT1Mk3PxW0hBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEHACVIhzElnss9P558ovk2fau54wfpp0NOurV68XDVlp62gq7rhpKO2GmH+mTpnlrbY3U5c+/uT9dn2iGeOVl961y1ot7a7/3eT104XiJsDw6Rdv2jCXTqX64APP2P1uitSAzjErF5kpA6tUrSi//TrXbilYsIA3VeqvJsihoTdt/rG3b98l11wdPc2iVoVbvXpdQIBJ+3fu2s5O1VrUVFHKkzu3bkpRS66JVuAb/eWbtkqeVmzS6WA1oKhT0C7+b4Wtnqbr2jQMeNXVF4seU8RMY/hrjEl8AaQU3VAqHXzSTFnaxExfqxXFtNKUVpDSANg8Mw2ka42aNJB5fy5wq/bzsKkO6A+GaeWwEqZKmFo88/jLthqcBn+0UlinLu0CjtVqbVq1TdvLz70lO2KqUqlvqKbBGp06VANb7pwtWzUz03g2tN3/NuEf1zRc1apNc7uq1dVcUE5DRQ0aBoZHNVB0w019pXLVSglWvqpWo6pXWcud353vQlP56v23R9nVNeY99of29DhtKbEqWaq4mcr1aluBLXv2bGYq2dhqhctM6MxfwUsrcLl7r9egtg2Z/Tpjtr0G/afnxV3M+xr/d0mflWsaqOs/4Gq7qkFJrUKnTSvIXXrlhTbQ6IJ4WiWyfsM6tsKb7WT+0cDbDvM915Cgay705jfUEKVec7PmjUSr/Ok0rNo0IKnTsWaU1rvfZSakJzLfVMlzTYNx+qfT915mTJq1aGx3aSjSvdMaYnzkyQfstMmbTZDyDVNRUZu+K8GtZaumoufRptXWZv8W/Zu6w1RJ1LZx42av+qCO++SzQ8xvTi7xjzvPVHnUCns6paprOoWrVmvUNvXnmSZAGh2odvtT49O9CzpWNzP1tqs0+c6bH8ta898s/S1YuOA/ad/x3NQ4HWMggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCGQCgdClizLBjXELCQsUKJhfatWuZjv9M/9fO7Xd5JjqcLrxIhNwcdOX+kfS6l6uaQU3185rf45btMGl9b6wiu4oXaakV9msnq9ik+5z1cJ0ObHtv0Wx19Hjgk7e2GXMebR6lmuLFsZWlnLbBj84SMqZYJaGy8KyhbnNyf5MrolWtXOBNg0nNWhY27uGrWZqyxqm6pJWvdKm4b9LLrxBhpqqdzql5AODb5dhzw0RDQ1m1Hbs6DFpdW5s9UANP+lUuDrtqbZKlSuEDCZtMCEo1ypULGfDcLquFvVMhTbXdMrc4FbKPH/X/NWwjhw54jYn+lODU65KnR6koSLXNGzlmqti5tb1s7W5b61Up8ErnRY2vlbNVNdybcP6zTaYp+t6TM1a1bwQ3KoVa2XThtjqcdWqV7GHpcSq12U9Ratt6bly5AjMRvvDcOqo01KmpK1bu8E7vG37Vt6yvwql/g5o0E3v27UN6zaK3ntwW2Kq8q33jVkrpqpczVrVva46FatWW/vZfLY3gd8Bt/STG2+9JuQ75x10BhZ0qlANlQ265yapU69mwBVo+E8rwmnYTNv2bTvsp/6jz6VgoQJ2vYKpkNe3/xW2It7lV17k9XELxYoXc4tSvUYVb/nQwcN2ed2ajd42DV5OnjBNxv0wSfS/Da7pVKo6/a8LTev2Vqbip2v+ioZuW0o/tZqffypWDbbqdelfpPl+uhZf4NXt5xMBBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAIGsJZMtat8vdOgENWlxsKmO5Nm3q7/LLz7/aVZ3Gs76pAhUqELdt6053iBQtWsRb1mOKmIprru3ZHV1pzq37P7UCUUqbVrNzrWix2OvQbQ1NRSnXQlagMwGU1GypYaLXU8BUwHNt9669JqSUXZ5/aagXitMKaXP/mC+vvvSeXHnpzTLmm/Gue4b8jIyMFA1u6dSj2rQC1oJ//vOutc1555igX2yoxe3YumWbW/QCP25DVTOea1p1LqGW0vdsZ0x1OT2HVnzzj1fFVH5zTYNCwaFODTklplWtFhuI22KmTF1nAmDadLpKbRqK1KaVz/wV0apWjz5/yqwSd41bTVWyUL8F9sIS+Y//90ArPbqm74aGc10LPxAuefPl9abE1DDUf4uW2N3az4UcF5tgrlaP06bPRadM1dbJTKfswnG6vtdUvPx1+mx5Z/jH8tKzw+OdZlf7numm78JNt/WXp55/WC694gLve6PXpZXX9F727d3vXabfUTdqFTmtiOcqJHodgxb877HbpZXgXNPpUbXqoftz2/VTv3NuSlpdL1Ag9lnqemo3Dd/5v1sLTEDPXZdOMeza/n2xLm4bnwgggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACWVcg5cmkrGt3Vt/5kcNHpVPntt49vD18pJ2qUzdc1KuL3a7TMQa3/DHhJt0eXAVOK4K5VrxEUbeYJp/+8devjQ4RuRMd8l23VmFLattvQh9ff/mj/fvmq3FyKuqUN8TBg4e85Rwx1dtSyyT8QIQ3dqHCBe1yMzN159ifRsr9/zdQ6gZVj3rn7U9k1m9/esdktAWtsKat5TnRldU0SPOjma5Rm4ZyGjWpZ6evtBt8/xQqXMhb81eH0o2RpkKVa4XN1LFp2fzXoaE3rW7nmrs3XQ8Oy7k+ifnUCl9uKtTw8AjR82irWTu60pn71FCQq1anFd2KFIkOn/qvMa2s9F7dtKaJuadQfdw96r7t22JDtbp+PGbqY11291PHVNfTpvc930yxrK1R4/riKvNpQFADYtoqVanghRW10t0tt18n99x/m5xrApf+82oVsRHDP7LHZJR/pk/5Td5+40P7N2PqLHtZWrmybfvWcp+pZOlva80Uqs5Htx89etS/O0XL+QpEh1Z1EH2/dArgUH/qmcvsd233rt1uMU0+85nz+Vt1ExANdV21atfwd2MZAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQCCLCwTOk5fFMbLS7Z8w1cY0eNHaTHmnVce0+phrPS/sbBf9QTC3r0LFsrJ0SXRw68+5/0i7mOkPV6xYE1BFqmKFcmb6x/XusFT5PB4TFtLBqlSp6I35118LvWUN5f3zd+w0f1WqxvbzOp1m4fjx4/L+u595vXSK1wam6pwaLfhncez2BrXsclJMdmzb5R1/yFRiUmOdtlWv2z8FqE7pqmE3F3g7//y28tY7z0pE+EF5eMhz5hmstOPMnvWX9wy8gTPIgqvsdI6pWvXrjNn2qty2eqYCYa5cuQLeO3fZ/ilvNQSmFatclbmFC2L9y5Yt7Q5J1c8TZkpabcGBO53qtVGT+nbfvzFVy3QlOaFLO0jMP1oZbNmSFf5NZjrjmECcbwpQ16GyrzpdWlnpFL46pepH70V/D/5duESW/Ldc6vuqL7rrScynGm0wz1Hb8qUrpWHjenZZK5P5w4V6Xm1a5e2P3/+yy+6fRk3rG+sSMnbMBLfJftapF/091Hfrmy/GyqlTUXYK2Cuu7iWXXXWROd8qcx+jbV8N0el3yE01GjDQGVjJmSunmfo1OtC70UyZ265DGxuw1EvR32cNjrrvjH4PKlaOroSn+7VCnk4pqtUIdd8Lw4bLSfPuamjtkScf0C6JbuXN1LnzYnrr72wfM/2qBuO0aWBRp4Vu1qKRXS9mKnJu3bLdLut3om7MNMYHI2LDwnan+Senqazo2u5de9yiCfPFBlu9jSEW9HuvgVMXFNXvSvcLzvd6rlm9zoZDi5eInRLW28kCAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggECWFYj9X6uzLEHWvvGLLu5iA3FOQQNkGsaKr116WQ8vjDVpwnQbjKhYsZxMmjjDO0RDdhpiSI3mAjI6llbQ+uC9z0UDal27d5BRH39tT7Fzx27p2/t26XT+uTJu7C9mGs7jdrtO49rYVCEzmZEkNQ3v5DJBFTfOow+/aMf+888FAQGuZs0a2nGTa6LTAd5/7xPS1lSymmGmdXTTUmY3lefqm5DJIhO6mjYlumrUvD8XytDH7pESJvjhn/JQ+2b0pqEtve7du/d6l9r63BbecvCCTn+pYTQ3JerTj79sjFqZ9265aJUv11q2jq4859ZT8lmseFE7LamOMWPqb3ZayCbm+TZv2dirUDZ65NfS4pwmEmGCPyuWrfJOl9C9eJ0SWKhes0pAIE6/O6XLlLJH6PvvDwTpxuox06nqclpZachM//R+/44JnH45eow8/MT9ks9MaZrUdm67VuKmfP3LBGn1XShVqoTosmsarHLvc41a0VPFun36zmsYSj+D36XaMeFB3bfBTDnr3rOcJnB57nktTeAuKHyVuJli3anT9FOrnY37fpI9hwbf9F3X0GFhUyFSQ4guDKcd6prfPX1PNSSmATituDjsiVekZaumNqyo27RV8oWF7YZE/NPQVN8b98Nkez4957NPvirntG5mQ6t/zZ1vqxMe2H/ATEnbTvR74QJxOn2pBt3KlSsjM6b9HudMJcxvqWsamNN3qFTpkjJntovfub3xf7Zq3Vxmz4quhDn155myccNm0QqCWzZvtd9N9Rj88F2Sv0D++AdhDwIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIBAlhJgytQs9bjj3uw5Jkyh4S/XLurV1S2G/OzctZ0NpLmdixYulfE/TfWCYjrWfWa6wtRqpU14opIJSLn2lakA9emob6VMmZJy/YDebrNoKO7rL8d5oTLd8eBDd5gKRbH35nVOxMIDg2/3emkQ78exPwdM9XjTLX2lSNHoaStTYqJ+I94aJctMFSvXrux9kQm95LVTjWr1OW16DQ8+8IzcdMN9sthU6tKm1jea6zgbWmsTTHJNK09pBbD4mgab+poKVa5pdSitMOcPw7XvdK4XGnP9UvLZImZaVx1DzzPuh0nmndplq6S5Slm6T8Nh/jBcWRMebWMCjSlp1UzQy9+q+irA6fYaZppIf6taPbZ/WltdeuWFXqUwreT2zec/+C8l0ctaXayyL6i1dvV6E8T92wt8aejvSlPRzbXcuXOLPwxb14Tz9F61NWrawHWz28qbQK5r3WOqW+r67N/mykvPvimfjfrG7ZYOndpKwYIFvPUzvVDUVFvr2/9K7zI01DbPhASn/vyr/U1zO7r26Gg8StjAYO++l7rNNjSqfd10uWrUxYSFk9p0imatqOeaXsdME3D7ZdJ0b6penaZW23lmOlf/d2KZqVY5zUz96g/vuXH0++GvtKjVOydPmOaFXV2/hD4vuqR7wBgrl6+23083la4GA930uQmNwz4EEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgawjQCAu6zzrgDsNk+gySVqRSQNdrnUxFYBCtWxmWj7XXn/zKenT79KAIJ3ua9a8oXz+9QgpXqKo7RoWE2Bxx7nP2JGit7hrcYEX3arTALp2x90DTHWoSm7VhGCi9113w1Xy6OP3ilaC8zed/u/td5+z08Hqdt9Q/m4JLqvJY0/eJ8VNRSZ/K1O2lNz7wG3S79rL/Zsl8Sax99W23TkBYSd9Flf37SW33HaNHTtHjuzy4chXpEfPTnb6RP8JNST12vCn4lyfv8+ZWPY/N//5m7do4q02b9nEe77x9a9eo6rcO3iQqSZVwjtOF3Q6yN79LpOLL+3hbc8WFvpnLFY69n3yb/O/GLXqVLfV4PyVDXUqW60+9dDj99nqXN4JzYK+q21NMOieBwb67iW2h3unY7fEv1SuQnTo0fWoGVPxLL51rQrnb0mx8nsHfy/86+76NZim02e6tmTx8oBqdm67EfYW/efwGw+65yZbYcxvrAfVrFVNHn7sPtFQlr/VNlXAXPOH4Ny0tbpPw4H+82n1stvvutFWkXPH6qc+r46dz5MLThP49R+TXssaFtR3XR30/fY3ff906tou3Tt6m7WC3KC7bwoIielO/a7cbcLI1apXsX0DnmfMb6bu8Hu531LdrhXh9BlpBT5/K1Awv/S4qItcd2Mfu1mneX3AVGRzVQx1o/pqcM01dw7dftNt/b3wsNvfrmMbe4xbd/39/81w2/R9eXDoPdLWVBnU8VzTZQ1ZDh56t5lKtoLbzCcCCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAISFhERcSozOUSEHxKtSkNLH4E9u/fJ4cNHpIIJ9WiAKC2bTjF63EyHqlXjgs91+NAR2bFzl5QvXzZOUC+l16RTmW7ftlM0DJc3KLASauykmugUnPv27ZeKFcrFuS//+Hr/Ou2gVsfLnSe3f1emXj5x4oSZlnGvnUYybzKm60wKjla52rVztw3waBjM306ZuXf1GWhQsUiR6OqA/v0ZYTk9rVJyv+EHIuxUpjqlpgs+pWS8UMeePHnSVvvTKV4LFiqQZucJde6UbNPv+KFDh8w7WCSgEluoMSMjI011tP1SomQx816mzjTVeh59j3RcDSnmSeC3Rn8bI8IP2mp+p3uOEREHzVSvR2xff7At1H0ltE2rZep/B3T62NOdM6Fx2IcAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgggkHkFCMRl3mfLnSGAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACWUogdv6xLHXb3CwCCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggEBmEyAQl9meKPeDAAIIIH/cUGUAAEAASURBVIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCGRRAQJxWfTBc9sIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAQGYTIBCX2Z4o94MAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIZFEBAnFZ9MFz2wgggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIBAZhMgEJfZnij3gwACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAghkUYEcWfS+M/Vt97tnfaa+P27u9AJfvFHl9J3ogQACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIBAJhOgQlwme6DcDgIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCQVQXCIiIiTmWmm48IPyRly5XOTLeU5Hs5cFDkxIlM9ViTbMABCCCAAAIIIIAAAggggAACCCCAAAIIIIAA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AQQQQAABBBBAIKkCZcuWlRUroguA6DINgTMhoGG47du3S+3a0f+7+5m4Bs6JAAJpI5DmgTidQlWnU3XNLbtKcW7d7eczawi89/ZI+XJ0bFWyW001tX7XXeXd/PQps2T4K+956/36X2krroWFhXnb3MLkCVNtCO2a66+SoyYcF3UyKmB6Utcv1OcNN/fzNut0qcFNA3vatNKba42a1LeLW7dss4G4of/3tKxZtU5+mPSZdOvZSc41gbTSZUq67nYaVl3RKU21nTTXpwFAd75cuXLZ7RqO0/bVZ2PslKujv35XKlauYMNqLVo1tWE43a/ToDY/p4msW7tRV+X48RPyyYdfSJ16NeWc1s1MlbpdUrJU8dNWiPtr7j/W7aHH7pUh9z0pkydMCxmIa9aisWgo74abr7GBPj1nVFSUfP/tT9LSnG+eGed0benRffLO7sUy59B227VN/jJye4kGUi9P0dMdyn4EEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEMhkAvny5bMhJA0kLViwwP7vj5nsFrmdDC6gM65pZTgNw+n7SEMAgcwlkOaBOK0QF1/TKnG0zClwylQ5O26qpvlbjhw5RANt33w51obh7rjnZhvs0ipl74/4xITO6kv1mlXtIYv/XSrPvPCIFCteRD4b9Y18MXqMNGne0AS+mvuHtMsrlq22n2+99oFs2rjFLrfr2EaGPHqv5M+fsv9w7d2zz45X0FehrkDBAnab23fJ5RfIvr377TatEvf/7N0HmBXV/TfwA4KoINUCCoq9oRJ7b4i9xxo1xpLYS2wx+k815jXNEjUaNXaNscceewd7711QUQGRqoDwzu8sc70LS5PdZYFQThH1AABAAElEQVTPybN7p56Z+cy9S57xe38nfqIqXAxd+sxTz+dhRXfdc8dcDS42itBchPj+8se/pw03Xjfdc/cDed9NNt8wv6693ppp9OgxRWW8mlDdJx8PqFSLyxsUv9q3b5cr18X85599kYNtn336Req94c55kwjc/d/vT0jrbbBWnq/r1x233pOrwy23wjJpmx16p6svvz4detSBlfMs99l6+97puWdeTI8XFezKKnnPP/tS+uLzgenQIw+YaiAuwnA//vC+9PX4b8su04PDP87huCsW31worqJiggABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMCc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HEK1nPdKgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQaQ6B5YxzEMQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEMLCMQ1tLD+CRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKBRBATiGoXZQQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgoQUE4hpaWP8ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0CgCAnGNwuwgBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINDQAgJxDS2sfwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBoFAGBuEZhdhACBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQaGgBgbiGFtY/AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECDSKgEBcozA7CAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAg0tIBAXEML658AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEGkVAIK5RmB2EAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBBpaQCCuoYX1T4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQKNIiAQ1yjMDkKAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECDS0gENfQwvonQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgUYREIhrFGYHIUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGGFhCIa2hh/RMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAowgIxDUKs4MQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEMLCMQ1tLD+CRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKBRBATiGoXZQQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgoQUE4hpaWP8ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0CgCAnGNwuwgBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINDQAgJxDS2sfwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBoFAGBuEZhdhACBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQaGgBgbiGFtY/AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECDSKgEBcozA7CAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAg0tIBAXEML658AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEGkVAIK5RmB2EAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBBpaQCCuoYX1T4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQKNIiAQ1yjMDkKAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECDS0gENfQwvonQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgUYREIhrFGYHIUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGGFhCIa2hh/RMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAowgIxDUKs4MQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEMLCMQ1tLD+CRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKBRBATiGoXZQQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgoQUE4hpaWP8ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg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gAABAgQIECBAgAABAgQIECBAgAABAgQIECBQPwJyQynVS4W4uB3r9uxaP3dFLwQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBA4HsINP8e+9iFAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAg0OQGBuCZ3S5wQAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECHwfAYG476NmHwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBocgItmtwZOSECBAgQIEAg/ejoDyjMYgLXnN19Fjtjp0uAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIHZT0CFuNnvnroiAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIzJECKsTNkbfdRRMgQIBAUxdQbayp3yHnR4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJNUUCFuKZ4V5wTAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECEy3gEDcdJPZgQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSaooBAXFO8K86JAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBKZbQCBuusnsQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJNUUAgrineFedEgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAtMtIBA33WR2IECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGmKCAQ1xTvinMiQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgekWEIibbjI7ECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBTFBCIa4p3xTkRIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwHQLCMRNN5kdCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKApCgjENcW74pwIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYLoFBOKmm8wOBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINAUBQTimuJdcU4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgMN0CAnHTTWYHAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEGiKAgJxTfGuOCcCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQmG4BgbjpJrMDAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECDRFAYG4pnhXnBMBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQITLeAQNx0k9mBAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBJqigEBcU7wrzokAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEpltAIG66yexAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAk1RQCCuKd4V50SAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEC0y0gEDfdZHYgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgaYoIBDXFO+KcyJAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACB6RYQiJtuMjsQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQFMUEIhrinfFOREgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAdAsIxE03mR0IECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoCkKCMQ1xbvinAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgugUE4qabzA4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0BQFBOKa4l1xTgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAw3QItpnsPOxCYisDoMSl9M3p8GjM2pfHjp7Kx1QQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQaQaDV3Cm1mrtZaikx1QjaM+8QKsTNPPvZ8sgRhhv19fgUr8Jws+UtdlEECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgVlS4JvRKY0YWZNrmSUvwElPk4BA3DQx2WhaBaIy3Nhvp3Vr2xEgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBoPIFvx6Wi0JMhDxtPvPGPJBDX+Oaz7RHHFX8wYphUjQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBTFRgr39JUb029nJdAXL0w6iQEmhfvJsOkei8QIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAg0ZYGoEqfNvgIt6vvS+g8YOtkuu3ZuO9l1VhAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgRkRqLdAXAThrr/7tSmeyzo9u6Z1ix+NAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAjUt0C9BeL6vNA/n9tuW604yTn2K8JyfYv18RNNKG4SIgsIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYAYF6i0QV57H5IZF7TthA6G4UsorAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECNSnQPP67Gxa+4pQXFlRblr3sR0BAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEJiSwEwJxMUJCcVN6bZYR4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLTK1DvQ6bWdQIxjOpuW62Y+g0YWlldDp1aWWCCAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAjMgECDBOLe+mBQevuDwfm0luneMb9Wzy/bvVOuENe/KiA3A9dgVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkBokEBeuEYqLVgbiJp7PK/0iQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQL1JNBggbh6Oj/dEJgmgW+//TZ9NeSrvG2Hjh1Ss2bN8vS4cePSkC+HTLJ8mjq1EQECBAgQIECAAAECBAgQIEBgNhUYPGhwat68WWrfoUOtKxw6dGgaO2ZsatWqVWrdpnWtddUzLz77fHrkoYfTsssvl7bcduvqVaYJECBAgAABAgQIECBAgAABAgQIzFSBBgnExZCoy/6kU60Lm3i+1kozBGZQ4ON+/dPPDzki93L0icemjTbbNE8P/GJgOnS/A/P0VTf9J80733wzeCS7EyBAgAABAgQIECBAgAABAgRmfYGf7r1fvohL/3NVatuuXZ6OLxYett9BadSoUWnPffdOu+2952QvtH+/fumhe+9P474dJxA3WSUrCBAgQIAAAQIECBAgQIAAAQIEZoZAgwTiYnjUtz8YnK+nHDK1ej4CcxqBhhK48Jzz02prrZnatGnTUIfQLwECBAgQIECAAAECBAgQIEBgthB4oaj0ttFmm+Rreeett3MYLmbW3XD9vMwvAgQIECBAgAABAgQIECBAgAABArOaQIME4gIhQnHRykDcxPN5pV8EGkAgvsV87RVXp4MOO7jO3ocPH54euf/B9MF776dFu3VLa66zVlqk66J527tuuyMNHjgorbnu2unZJ59OXw4enFZbc430gzVWS3ffflf6uPj281rrrZvn55prrrzP5599np7p+2R67513U+dFuqTeW2+V2rWv+WZ1nSdgIQECBAgQIECAAAECBAgQIEBgJgtsuOnG6dEHH05PF880ykDcc089k89q8SW6p66LdUtRMe6xYljUt954K80zzzz5GcoyxRCpzZs3n+Tsb7vpljT0q6HFc5Et00KdF05vvvZ6eqZ4trL4kt3TBhtvlLf3DGUSNgsIECBAgAABAgQIECBAgAABAgQaQKDBAnENcK66JDDNAnfdenvadPPN0vwThvwod4ww3LGHHJkGDRxYLkpXXHxJOvrE4/LD3wf+d28Ott30n+sr6+8vlnVaYIHKPjH/44P2TzvuuksaE8+BkQAAQABJREFU8Mmn6fjDj658ezp2uuW6G9M/LruoMtxIpSMTBAgQIECAAAECBAgQIECAAIEmIhAhtQjEPfHIY+moE45NLVu2TH0eezyf3aa9e+XXv5z6x/RUnycrZ3zzdTfkwNshRx9RWVZOxJcMP/t0QPHFwtVzIC6+OBjPV+I48eMZSinllQABAgQIECBAgAABAgQIECBAoKEFJv06Zz0cMYZE/flP1sk/MT3xfD0cQhcEJiuw13775HUX/P28NO7bb2tt997b7+TqbWsXVd6u+e8Nade99sjrHy4qxlW3WP+Xc89Ky6+0Ql7comWLdMYF56Td9t4zzz874RvTl1xwUQ7Dbdxr03TG+eek1YuhWqNC3Z1FIE8jQIAAAQIECBAgQIAAAQIECDRVgVVX65nmnXfefHpvvPp6DrP1/6hfnl9ng/XSsKHD0sAvBqYll14qXXDFv9Ipp/42r7v3rv+lbyd63pJXTOWXZyhTAbKaAAECBAgQIECAAAECBAgQIECg3gTqrUJc185tU/8BQ/NPvZ2djgh8D4Htd94xPXzfg7nS2//uuKtWD6v8oGfxAPc36fVXXktX/uuy9P677+b1MTRqddu8GN4jHvj2XG21FA+FY9jUxbt3LwJ249L1V1+bIlg3fvz49NrLr+TdxowZkx4thhAZP35cnv+wGI5VI0CAAAECBAgQIECAAAECBAg0VYGWc8+d1ttogxSV8J996unUeZEu+VTjy4ELLrRQnj71L6cXw6W+ke67657Uv19NWC5WxJcBp6d5hjI9WrYlQIAAAQIECBAgQIAAAQIECBCYUYF6C8SVJ3L93a+Vk1N9Xbdn16luYwMC0yvQohji4+CjDku/+cUp6dYbb661ewzdcdj+P83LVlpl5dSqVata6yeead68poji+HE1QbdyPrb7unj4Wz4AjuFFym9Vx+vYsWMn7so8AQIECBAgQIAAAQIECBAgQKBJCWywyUY5EBfPNbouVvOcbuNem+VzHDVyZDru8KNz5biui3VLSyy15Pc+d89QvjedHQkQIECAAAECBAgQIECAAAECBL6HQL0F4iLc1q2oEjetLSrKaQQaSqDHqqukjTbbND3yQO2hUO+58+58yA023ij9/JcnpCef6JNefO6F73Ua8843Xx5+9ashX6VDjjo89d5mq9zPqy+9nCJspxEgQIAAAQIECBAgQIAAAQIEmrJAPL+IL/YNGjgw/8S5rr3euvmU33r9zRyGa9e+XTrj/HPS8GHD06MPPjzZy2ndunVeN+TLIfl18KDvqvF7hjJZNisIECBAgAABAgQIECBAgAABAgQaQKDeAnFxbkJuDXCHdPm9BX580E/S0336Vqq4RUfLLLds7i+GArng7HPTYw89kueHfPllfp3eXzvt9sN0+UWXpAv+fl56/JFH0zdff1MMJfJmOuznR6VeW/ae3u5sT4AAAQIECBAgQIAAAQIECBBoNIG55porbbbF5umO/96Wj7namqvnL//FTLfui+Vl8UXA8886J7395lt5Pn6NKMJxE7c111k7vffOu+mi885PN/3n+jxdvY1nKNUapgkQIECAAAECBAgQIECAAAECBBpSoGY8yIY8gr4JNIJAs2bNJjlKh44d094H7Pfd8mKbNdddO/XeesscknuqCMtt0rtXXh8Pd0cMH/HdtuXUhG6bTRg6NU10mG132iHtUxwjvk398gsv5TDcxr02TetttEHZg1cCBAgQIECAAAECBAgQIECAQJMVWH/jDSvntuGmG1emO3bqlA467OAckHvw3vvTSiv3yM8/YoP+/fqliZ/FbLL5ZmmNddZK8YwlgnE9V18t99Wsec3DFM9QKrQmCBAgQIAAAQIECBAgQIAAAQIEGlig2bBhw8Y38DEatfthQ0ekLoss3KjHbGoHGzRkfOrUfqLkViOdZBx7VmhjRo9OEXJr0aJ+iiSOHz8+DRs6NLVu0ybFt6s1AgQIECBAgAABAgQIECBAgMDsIBDPPEZ/801qNc8803Q5I0eMyNtO7vmIZyjTxGgjAgQIECBAgAABAgQIECBAoBEEZla2pqEvbWbmhhr62qa1//pJA03r0WxHoIkItJx77no9k/hWdNt27eq1T50RIECAAAECBAgQIECAAAECBGa2QDzzmNYwXJzrfK1bT/GUPUOZIo+VBAgQIECAAAECBAgQIECAAAEC9SBgyNR6QNQFAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECMx8AYG4mX8PnAEBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI1IOAQFw9IOqCAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBGa+gEDczL8HzoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE6kFAIK4eEHVBgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAjNfQCBu5t8DZ0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEC9SAgEFcPiLogQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgZkvIBA38++BMyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBehAQiKsHRF0QIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwMwXEIib+ffAGRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAPQgIxNUDoi4IECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYOYLCMTN/HvgDAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgHgRa1EMfuiBQERg6vDJpggABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgECTFOjUvkmelpOqBwGBuHpA1MV3Akt0bfbdjCkCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAg0ooAhUxsR26EIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoOEEBOIazlbPBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINCIAgJxjYjtUAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDQcAICcQ1nq2cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQaEQBgbhGxHYoAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEGg4AYG4hrPVMwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAg0ooBAXCNiOxQBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQINJyAQFzD2eqZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBBpRQCCuEbEdigABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQaTkAgruFs9UyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECjSggENeI2A5FgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAg0nIBDXcLZ6JkCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFGFBCIa0RshyJAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBhhMQiGs4Wz0TIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQCMKCMQ1IrZDESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEDDCQjENZytngkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgEQUE4hoR26EIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoOEEBOIazlbPBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINCIAi0a8VgORYAAAQIECBAgQIAAAQIECBAgQIBAExF464130gXnXpreeO2t1GmBjmnLbXqlH/1419S8+aTfof3LH/+et6vr1HttsXGx326VVW+/9W66564H01xzzZUOOWL/yvKJJx6479F09WX/Sfvuv2fapNcGefWYMWPSddfcku6+4740aODgtNGm66fNem+Y1lpn9cru7779frr7zvvTfXc/lJZdfum0+ZYbF/tvmFq2rHnUOWL4iHTUIb+obF9O9Npyk7THj3ZOP9vv6HLRJK+HHX1QWn3Nnnn5iBEj02MP90133X5vOvGUo9Iii3aZZPtYMHr06HTy8aemr7/+Jp174Z8r28R5XnTBFeml519JXbstksKp91abpo6dOuRtYvsH7n0k3fe/h1K/jz5OvYvz23LbXmnx7t0qffznmpvTPcW1TtzOOv/09ND9j6Vbbrh94lV5vvMindNpf/6/yroZuydj07VX3VA43JdGjfw6bbL5Bvlaeqy8QqV/EwQIECBAgAABAgQIECBAgACBpiQgENeU7oZzIUCAAAECBAgQIECAAAECBAgQINAIAl9+OST97CfHpA4d2qd99t8jPff0i+niIrzVcu6WOTQ28Smst8FaOXxWvfyzTz9P11x5Q9pl9+3z4r6PP50Ddh+8/1Ge37wIeE2ufTl4SPprEbIbOXJUGvrVsMpmF5xzabrxulvTFltvlnqsskIO1p14zG/SH//66xTn8M03o9ORB5+YFlp4wfTjA/dMb77+djrtt39LH/f/NP3koB/lfgYP+jK9+84HOWS30EILVPru1m3R1KxZ87TDLttUlpUTT/V9Lj3+SN+0YLF9HOPMP/8jh/LK9WPHfltOTvJ6zRU3pGeeej7NN9+8lXUDPv0sHbjvkUWIrnP68QF75ms8/5xL0v33PJwuuPSsInTYLF1QzN9y4x1pl922T+usv2a6/t+35Pmrb7wo35fo7J233kuDBw0pgnSbVPqOiRYtWqRlll1qkmsZN25cOvuvF6Qll14ib18f9+Su2+5N//rnVcWxtk7LLrd0cU8eSDdff3u68LKzJnlP1DpJMwQIECBAgAABAgQIECBAgACBmSQgEDeT4B224QQ+G/B5Gj9+fOrcZeE6DxIPNT/9eEBarPi2bTx8nLjFQ9jhxTeJ44Fl2caMGVssG57atWtb+ZZ09DNy5MjKA8phw4an5s2apRYtW6aPPuyXui+xWPHN5Ja5i6mdU13HHDp0WNFf89Rm/tblaaT4ZvLY4lzatW9bWWaCAAECBAgQIECAAAECBAgQIDC9Avf/7+G8ywWXnpkW7rxg+tG+u6ZfnXRauuHa/9YZiFt/o3UmOcSF512WQ2C9ttgkr3ujCKetvOqK6dhfHJ5OP/XMSbavXnDOmRdWz+bpqA4XYbg41sm/OTYv27ioELfjVj8qKrX1yYG4Rx58PIfoomLbij2Wz9u8/ea7OWhWCcQVYbtoMR/PZyZuO9YRiIsqcBFKW2zxrimeyXzw/ofpmBMOzc+YImA2uRbBu8suvmaS1fdN8P3d//tlDq7FBuOL//37yhtThOXiuVMEy9ZcZ7V01HEH5/2jitzJx/8+vfzCq7kyXiz84vOB6QdrrJKict3EbfkVl0nxU92e7PNMnv3h7jvk1xm9J99++2269KKrs/2xJx6e+4xqfbvv+JPUpwhARoU+jQABAgQIECBAgAABAgQIECDQ1AQE4praHXE+31sghvn47Smnp0+KsFu0pZbuno489uDUc7WV83w8wPvb6eemO4tvtUaLb/zuvOu2aa/igW+zIsgW30z+1Ul/TK+89FpeHw8U9/3JHvkh7FPFw8RTTvxDuuyaf6TuS9Y8SL3ztnvyN25vv/c/ObR2wtG/SiOGj8zDecS3my+9+rwUD3KndE5TOuavi3P58P1+6cY7rqiE8I478pT09ahv0mX//kc+R78IECBAgAABAgQIECBAgAABAt9H4KOP+udQVoThyrbaGqumRx/qk4f+nGeeVuXiOl+HDxuRq8NF6KzctgykxQ4xXOrkWp/HnspDhf72tJPyc5Nyu9Gjx6TDi+BXz9VrnuXE8vnbzp9Dd23a1HxhcNy48XnzqGRXtnnnm6843jflbH42EzMxDOxXQ4bm5zZTOp8Xnnu5GA727XTGuaflPtoWx7zgkppA38MPPF7pd+KJeNb0lz+encJtyeI51J233lPZZIWVlk1HH39IJQwXK8ovb7ZuPV/erlWrVhW7WDBPMR+tVZX95599kaKv+LLmqOJ5U9t28+dtJvfr6suvLyrrrVgJys3oPQm3fxaV4Fq3/q76XfkF0/J1cudiOQECBAgQIECAAAECBAgQIEBgZgk0b+gD9x8wtKEPoX8CKR6GRmBt3nnnSf+66tz0ryvPyQ9eL77gyopODO0QYbgDD94nB8p6b7lJuvAfl6cH73s07//L43+XPu73STrpV8eki644O7UvhgyJPj/95LNKH1Ob6PfRx3moijPOOS0/5JzSOcU5T+mYW23bK8XwJa+98kY+7MAvBuWHs1tsvenUTsN6AgQIECBAgAABAgQIECBAgMAUBQZ+Pih17NSx1jYRBIsWX+CbWrvj1v/lTbbfaaupbVpr/YiiKv+fT/t7Hn7zB6uvUmtdBMV222unWiGyPo8/lSvCRfW2aGsVFdVimNez//rP9ND9j6WLzr88f7lxu6rzGDRwcN72sAOPy9Xleq2/Y/rneZemCLDV1aJqW3yxcuLzqWvb6mU3XXdbflZz3ElH5C9bVq9bfc2exRcxt6ssGjt2bIoqdBFWKyv/77zbdjmAeMUl1+aA4HlnX5S/wLlqzx55vxgBIb74+d8b70y9N9wp7bDlXmnf3Q9ObxUV8epqr7/6ZnqpqC631z671LV6ssumdE9ip4UWXiC1LgKJMSxtDMH6p9POziHFzXpvPNk+rSBAgAABAgQIECBAgAABAgQIzEyBBq0Qd/3dr6UyELdOz65p3eJHI9AQAuPGfZv+73fHpy6LdM4P6eIY2+24VTrjz+floSWiGtxdRRhu7XXXSPvuv2c+hQMP2TfFsBYDiiFWP/1kQH6AecgR+6ettt08rz/y5z9LMZTpJx9/muen5VdUo4s+osWDzimdU3zrOb59PLljlkORPPzgE/lhad8naoa82HizDablVGxDgAABAgQIECBAgAABAgQIEJiswLffjisq0jertb6sojZu3LhayyeeGT16dLr2qpvStjtskauwTbx+SvPx5cRoPz10vzSuOIcptc+KZzan/eavqfdWm+YqbLFth47t08FH/KQYkvWsSpX/CJnFuZRt/rZtUrfFFs3PeCLMddstd+ehSrt06ZyDeOV28RrPhmKY0VN+e9wkobbq7SaejudF5519cTr0yAPSol27TLx6kvl//fPK/BwovshZtj323iXdfcd96ZILryoXpb+d84c0T/GFz2jx7CiGhe20QIe0SfE86L13P0g3X397OuWEU9OV1/2zVnW52P4/19ycq/6tu8FaMTvNbVrvyd67/rTS5wknHzVN113ZwQQBAgQIECBAgAABAgQIECBAoBEFGiwQ1+eF/jkMt9tWK6Z+RZW4vsV8t85tU9fiRyNQ3wItWrQovkHbKd1z1wPpmaeeTzHURdnGjv02D5UR1dZWX6tnuThXkPvTmb/N8+XwFz1X++6byfEw8x8X/zWvf/yRvpX9pjQR35Yt29TO6Z233subTu6YsXLTXhum++5+KD9cjSFLYhjXaXnIWp6DVwIECBAgQIAAAQIECBAgQIBAXQLNijBcOfxoub4MwjVvPuVBJR6495Fc1f6He+xQ7jpNry8+/0r67013plNPPyXNP3+bPJzp5HYcOnRYOv6oX+XA3c9PPKyyWfQRYbgddtk6RXW6d99+P/39b/9Mf/rD2enk3xybt4svO5ZfeIwFG2+2ftppq73Tffc8NEkg7vp/35Irzm3Sa9q/gBiV2/76/85Nyy63VNp1zx0r5za5iTKQd8LJR+ZKdOV2EWwbNfLrFEPHLtxloXTd1Ten4478v3TJ1eemJZfqnlq1mrvybCr26ZU2TlHF7/xzLklRDa66ol3/YtSDqJgXVlO7f+Xx43V67slNd1yZvzh61+33FUPF/j2HE9ebzvBd9bFNEyBAgAABAgQIECBAgAABAgQaSqDBAnFxwhF+K3+iUlwE4wTiGupWztn9fj3q63T4QSekNvO3Tj8+YM8U1d2efebF9I/im7rRmjWr+cbzuMkMjTFhdfEguO6hM76P7tTPqabXKR0zhkd98P5H01N9ns3fVj76+EO+z6nYhwABAgQIECBAgAABAgQIECBQS6BTpw7pow/61VoWIbRo7Tu0q7W8eiZCdFdffn1asxi6NEJb09PO/PM/8uYRioufqDQX7dqrb0zPP/tS+s1pv8jzX3/9TTr5+FPT8GEj0nnFlxXnm2/evDx+3X/vw3n+8KN/mgNjyyy7VPqwuI4Y9vTo4w7OQ3tWNp4wMffcc6eo6v/2hC8nlus/G/BFrtD2s8N/klq2bFkunurrYw/3Tc8Vz51iRIJf/Py3efsI5o0cOSqH+Hbba8c8SkGsiC9Z/u30c9OPfrxbUcVuy7xt/Pr8s4H5S52HHnVgKsN4x5xwaH4OFMG2ydmWIbiBXwyq9BUTN1z73+yyxdab1Vo+tZlpvSfRT8fiPRM/y62wTHrwvkfzj0Dc1IStJ0CAAAECBAgQIECAAAECBGaGwJS/7jkDZxTV4CIEF5XiqodOnYEu7UpgsgLvv/9R/mZyPFyMYTSWWmaJ4kHmd3nPGE4jHp4+1fe5Sh/fFuG4eOgXQ1Ms2m3RvPy5Z16qrI+Hon/83RnptVfeSO0mPAj+7LPPK+tHFQ85p9Smdk5TO2b0vcbaP8jnHd9yjrbhJuvlV78IECBAgAABAgQIECBAgAABAjMiEBXoP/l4QPpy8JBKN2+89lZ+DjHvhCE7KyuqJp584unU76OP0+577Vy1dNomt9q2VzrgZ/ukVXqulH96rLxC3rHbYl2LoUGXy9PxvObUX/8lvffO++lv5/4hDwFa3fuwr4bn2fLLjTHTrPhftFFFkC7aUYf8Iv3qpNPydPyKynevv/pW6rLIwpVlMXHzDbfn+e2qgmq1NpjMTATh4jqiQl15LQt3WTBvHfMRGvv/7N1nmFXV1QDgDWJv2Bui2EWMPWJvsX4aoxFjjyVq7DXYxUbEgiVij733HrsYjd3Ye0w0iqLGggyogMJ31h7O9c44Q5kZ5KLvfjL3nrLPOfu+h/hjP2uvFe2Vl15LR/Q8IffbdY8d8rHyY+iQoXmzXMQZO5G1L1pdXf1vfO6ZF9Oa3TdOb73xdj4eH2+9+e+8HWMo2+effZFuvemutPmWm6Qxvbuyf/X32N5JjCXGcF6/S6ouqx9n9dirTtokQIAAAQIECBAgQIAAAQIECEx0ge8jhlo5lAh8K9tKS3fKmeC6F99RKjValE4ts8M17lte55tASwW6LDBfnrC96/b70owdZ0gfDhiY+p1xYb7dl4MG5wnPrbb7bbr4givTmX3PS2ustUr6e//H8mrklVf7ZS5XESuFr778hlxKdZHFFswri6P86p777ZLLeERAXaw2jlKoHw38OF1wzmVjHO7YxhTlT8f0zLh5rE6OEh8333BHWnb5pdKss848xmc6SYAAAQIECBAgQIAAAQIECBAYF4F11lszz22cWmQv23aHLXK5zXvuejBtv9NWlcsvufCq1GneufPiw/LgVZffmObtPE9aboWly0Pj/B1zM9Ut5myuvuLGtMpqK1ZKmUb508iqttOu26bBX9alF557uXJJZCZbadUVcha1M045N8+ZvFsskoxgsAjsKudNIljvyENOyPdeotti6b67H8oLKXfabdvKvSLQ69orb0qb9dg4zTDj9JXj47IRczrxV93ifu+9OyBXLojjkbWu5/69cha5yAAXpUnLFs/rPF+nHOx3TeE5wwzTpTnmnD3PU0WfFbsvl7sus/wv8pzVGaeel36/y1Y5ePGyi67J91ys6yLl7dLtt9ydtzfdfKPKsXHdGJd30u0XXdPtRUa/CCiMzHUP3Ptwzoa3xXiWzB3XMelHgAABAgQIECBAgAABAgQIEGitQJsExEWAWwS+RcBbZIWLFkFx8VfuVwfDVfeN8xEspxFojcBUU02ZDjly/xQTtYcffFwOjotJwCi/8eEHA/Mk5dbbb5G+/vrrHNR2yw13pplm6pgOPWr/SgmLo4/vmU498ax0/tn1K17n79I5nX/J6aljx/oyIQccsle6vJh0PGifI/P9u6+yQnrysWeKcqzfj7z96JW8cWRcxjS2Z8Z91vrVajkgLjLfaQQIECBAgAABAgQIECBAgACBthCYY87ZUu+Tj0y9j+mbA9DinlFuc9vf98i3HzVqVBEEdXdaatlulYC414sMcpH1LOZgqudAmhvP2DKIVc5Xza3cf0//fLuY42ncLrqyXx5LlAuNhYp/u+P+3CXKt+6y+/aV7rH4cdc9fp/u+9tD6YKzL83Hd9h5q6Jk6XqVPuW1m2+xceVYUxvlvE/VEJvqNjpH3fenIpAvSqjGX8wlVbfVi4Wax514WDqxb690yp/PSn2OPyOfjsWYB/TcM8WcU7TwCevrr7m1Upp1wYXmT4f3OijPO0WfKC97/dW35HdXnTUuzjXVKuZNnSyOVc5X/eBjilK2p510dq60UF62xz47p0UWW6jc9U2AAAECBAgQIECAAAECBAgQqCmBdnV1daNaM6IIaIuSqJENLgLgYjtaGeTW1H4Ex5XBcnG+Ontca8YS19YNHvqD8getveekdv1ng0alWTpWzVpNaj+gleP94otBacYZZ2x2YjZKb8QK5LJ8RePHDRs2PA0rJhObWx0cZSiiBGtlgrDxDZrYH9uYxvTMKOkaE6O333dNsWJ4/FYsNzEUhwgQIECAAAECBAgQIECAAAECDQSibOp0009XZKpvuHb222+/zZn0x2cOpMGNJ+DOyJGj0ueff5Gmm27aSnBYU4+LeZyOM8U8UfumTtfEsa+//iZ9XQTOjWm+6ZuiT8xpTVv83onVYv4qMuHNPPNMzc67TayxeS4BAgQIECBAgAABAgQIECDwvcDPPW4oJBrOcn1vM85bZea38oLYjwxwp1/6ZA6Si4C5OBbfkUkuvsv2/ujtxvcoz/sm0BKByPw2pjbZZJM1GwwX10055RT5r7l7NBdI11z/OD62MTX1zJhgfO2VN9L5/S7NZUMEw41J2DkCBAgQIECAAAECBAgQIECgpQIRiNVU69Ch1VOHTd22TY5FhrqyROqYbtiSeZwx3W9CnJt66qlS/I2pTTWW82O6tq3O1c9fzdxWt3MfAgQIECBAgAABAgQIECBAgMAEE2h1hrgYWVkytRxlZIuLFoFx1S0C38qAufJ4mVmu3G/ttwxxKYn0bO2/otq4/sbrbk/9Tr8gLbLogqlvv95p+mKltkaAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgOQFxQ22QIS5wo/xp2eYdHfRW7pdBcREIV5ZRjT6RHa5x3/Ia3wQIpLTRJuumVVZb8WdfAti/BQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLjKtBmdQ+qg+Li4VEaNYLhqrPFleVTy0xx4zpI/Qj8HAWmmWbqFH8aAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLjJtBmAXHl426457VyM5dHLQPlIhguzkUwXLQ4Xm5XLrBBgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgRaKNC+hdc1edkTRUa4aE0FupXH4jv+qgPnmryZgwQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYDwE2jQgLkqkRrBbZH+Lv8gKF3/RyvKpcXze0VniynPjMV5dCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAkwJtGhAXwXBlkNv7owPh4li0MZ1rcmQOEiBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACB8RBoV1dXN2o8+o+xawTDVZdC7bFB10r51DgXJVXLgLnuo7PIjfGGLThZN3hommvuOVpw5U/nks8GjUqzdGz30/lBfgkBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAmMVEDeUUpsGxJXiEfRWZoYrj5XfYzpX9mnNt4C4lPzDbs2/INcSIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQmDQFxA2l1KYlU8t/Bs0Fw8X5MZ0rr/dNgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTGV2CCBMSN7yD0J0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECrRUQENdaQdcTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQE0ICIiriddgEAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDQWgEBca0VdD0BAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI1ISAgLiaeA0GQYAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQKtFRAQ11pB1xMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBATQgIiKuJ12AQBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINBagQ6tvYHrCVQLvDNgVPWubQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQI1J9ClU7uaG5MBtY2AgLi2cXSX0QL+Y+GfAgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECE0tAydSJJe+5BAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINCmAgLi2pTTzQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgYgkIiJtY8p5LgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAm0qICCuTTndjAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQmloCAuIkl77kECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0KYCAuLalNPNCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGBiCQiIm1jynkuAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECbSogIK5NOd2MAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBCaWgIC4iSXvuQQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDQpgIC4tqU080IECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYGIJCIibWPKeS4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJtKiAgrk053YwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEJpaAgLiJJe+5BAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINCmAgLi2pTTzQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgYgkIiJtY8p5LgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAm0q0KHx3T74pH165e326b2B7dOgIe3SyJGNe/y4++2LkL2O041KnecambotNDLNM/tEHtCP+/M9jQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTGUaBBQNy9j3dIL7w52The+uN0i4C8zwe3K/4my2NbetHv0vorf/vjPNxTCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGCSEaiUTL3+vslrLhiuKcUI2IuxagQaC9x/T//02itvND48Qfbffee9dNft96URI0ZMkPu7KQECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEC4y+QM8RFZrh3PqjExo3/XX7kK2KsMWaZ4n5k+Bp/3Oknn5M2+c0GqWu3xSb4SF96/tV02slnp9XWXClNPrkAzQkO7gEECBAgQIAAAQIECBAgQIBAmwu89cbb6bx+l6Q3XnsrzTLrzGn9jdZJ2+ywRWrfvul5woEffpwuvuDK9OxTz6fppp82bbzp+mnLbTZL7dq1azC2Dz/4KNUvXHwzdV9l+bTZFhtXzv/7X++kC8+7PL30/Cup07xzp3XWWyOtu8FaaeZZZsp9YvHh9Vffmu6564H02aefp9XXWiWtve5q6Zfdl0vfffdd2u33+1Xu1Xhjz/3+kOLZt954Z+NTeX/OuedMvU8+snLu66+/SXfddm969eU30pRTTZkOPWr/yrkvvhiUzjrtgvT8sy/lYyutukLac98/5N9ddrr1prvSfXf3T+/+57/pF8t0S/scsFuap9Nc5ekG3w898Gi66tLr0vY7bZXWXGfVyrn4Tf985oXi9z6YVl1jpbT2r1arnIuNR/o/lq6+4sb03rsD8jPWWme1tNavVk1TTDFF7vfF54PSRedfkZ564p95f93110zrFH8LLjR/3o+PY484Kb333/cr+7ExdzHO4/sckU7581/y+29wcvROvJttduiR98bntzZ1L8cIECBAgAABAgQIECBAgAABAj+mQIcPPmk/SWSGa4wSmeK6LTQyzTN7UVNVI0CAAAECBAgQIECAAAECBAgQIEBgnAUi4Gu3HfdPM83UMW230+/Sc8+8mP5aBKpNPsXk6XdFkFvjNqRuaOq5/9E5SC2CpCIQ69yzLk7fjRyZttl+i0r3p554NgdgTTnllGmNtVdJCy28QOXcRwM/Trtsv0+ae5450w47b5UGf1mX7/HgfX9P511yRhGI1y6dd9Yl6abrb0/rbbh26vaL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AAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGWCrQ6Q1xzD45yqdUlU6u3m7vGcQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0FKBNssQFyVSu3RKaf7R5U/fLQLiHnrqu7Tz5vWPiHKqUV419hv3bengXUeAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBEqBVgfERea3/k/Xl0ktbxrHIhiuuVZdSjX6yh7XnJTjBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIDCuAq0OiIsHRfDbOwNGVp7ZXIBbHD/qrBE5U1zZubm+5XnfBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgXATaJCAuHiSwbVy49SFAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBCSXQZgFx4zrAnTfv0CBDXJRbHVN51XG9r34ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg8PMW+FED4tZecbIcDBfZ5N4t/qKt9cv2udyqDHM/73+Ifj0BAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgRaK/CjBMR1maddisxwZev/1He5xGocj4A4jQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQItFZggkejRfBbtAh+iz+NAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAhMCIHv07ZNiLsX94xSqEedNSLfPUqmRka4Lp0iDm/k6O8J9GC3JUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGflcAED4ir1nxnwMgcEBdBcdWlUiNoTiNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAq0R+HED4orAt/5Pj2ww3giS0wgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQGsFftSAuBjsQ09919oxu54AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECPxA4EcPiPvBCBz4SQm8M0D525/UC/VjCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQI/QYEundr9BH+VnxQCAuL8O2hTAf+xaFNONyNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYDwE2o9HX10JECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEDNCgiIq9lXY2AECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgMD4CAuLGR0tfAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEKhZAQFxNftqDIwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIExkdAQNz4aOlLgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAjUr0L79JBwSNymPvWb/RRgYAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEJlGB9h2nGzWJDj2lSXnskyy6gRMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKBGBdp3nmtkjQ5t7MOalMc+9l+nBwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAiMj0D7bgtNugFxk/LYx+cl6UuAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECYxdoP8/sI9PSi3439p411iPGHGPXCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBACLSPj/VX/jZ1mWfSCS6LscaYNQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUArkgLjY2XK9EZNEprjIDBdj1QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQLVAh+qdyLrWbaGR6ZW326f3BrZPg4a0SyMncuK49kXIXsfpRqXOc43MY1MmtfqN2SZAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBUqBBQFwcjIAzQWclj28C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L5oIB4cNG54iY9qYxhnZ8uK3lkFqE2KYkfU/5pGqF0w2fk6UTY1seB06NHzPjfvZJ0CAAAECBAgQIECAAAECBCZtgZ973FC8PbMfk/a/YaNvQmCWRqtsm+iSg8xqPRguxt3cpPAVl1yb+j/waC55OvkUHXLGu+hflsOI7aZaBLnNPMtMTZ2qHJtp5o6V7cYbEZw3ponVxv3tEyBAgAABAgQIECBAgAABArUv0NxcwIQMnJpu+mnHCBNzEI0zqY3xgol0csopp0hTTtkw41vjoTRXkrVxv9bsTzHFFCn+xtTGNic0pmudI0CAAAECBAgQIECAAAECBAhMSgIC4ialt2WsBEYLbLn1ZumjgZ+kIw85IR+JMqs9j9gvLbfC0owIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI/GwFlEz9Cb56qQ9/gi+1mZ8U5UOGDBmaZphh+mZ6OEyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIPBzERA3lFL7n8vL9jsJ/BQFonyIYLif4pv1mwgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBFoiICCuJWquIUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGaExAQV3OvxIAIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoCUCAuJaouYaAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEKg5AQFxNfdKDIgAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEWiIgIK4laq4hQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgZoTEBBXc6/EgAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgJQIdWnJRc9cM+GhweuKFAfl0pzlnSCst3alB1xvuea3Zcw062iFAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAuMp0KYBcWXAW4whguPmLYLiIjCu3I9j5faTReBcjw26Vs7nEz4IECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEALBdosIK7MDNdckFsExh2wY/c8zAiMi+C5uCb6awQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoLUC7Vt7g/L6MvtbmRGuPN7U97j0aeo6xwgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQHMCbRYQ19wDHCdAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAj+GQJsExEX508gQ133pTuM85sgSF9eUpVbH+UIdCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAEwKtDoiLoLb4iwC3lUYHxEWAXNnKYLnYj+C3MgCuxwZdcwDdk8WxuF4jQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQKtEWh1QFz58AiIi9Y4uC2Ov99MwFvjvuW9fBMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgfEVaFdXVzdqfC9q3D+yvkWmtwh+i8xv49Jacs243Ldu8NA019xzjEvXn2yfzwaNSrN0bDdRft87A1r9z2mijNtDCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEfj4CXTpNnNiaCS08MeOGJvRvG9f7dxjXjmPqF6VSI9vb+GR8G98AujE937naEfip/seidoSNhAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACB5gTarGRqcw9wnAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI/BgCbR4QNy5Z4so+UWJVI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECbSHQJiVTYyBRNvWGe17Lf+XAemzQNZVBbxEEF+erW1yjESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBthBos4C4CHw7YMfu6YkXBqSmMsDF+e5FAFx5TjBcW7w+9yBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBUqDNAuLKG44p0G1M58rrfRMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgZYItG/JRa4hQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQK1JiAgrtbeiPEQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQIsEBMS1iM1FBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIFBrAgLiau2NGA8BAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQItEhAQFyL2FxEgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABArUmICCu1t6I8RAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAiwQExLWIzUUECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUGsCAuJq7Y0YDwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0SEBAXIvYXESAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECtSYgIK7W3ojxECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgECLBATEtYjNRQQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQawIC4mrtjRgPAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECLRIQEBci9hcRIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQK1JiAgrtbeiPEQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQIsEBMS1iM1FBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIFBrAgLiau2NGA8BAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQItEhAQFyL2FxEgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABArUmICCu1t6I8RAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAiwQExLWIzUUECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUGsCAuJq7Y0YDwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0SEBAXIvYXESAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECtSYgIK7W3ojxECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgECLBATEtYjNRQQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQawIC4mrtjRgPAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECLRIQEBci9hcRIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQK1JiAgrtbeiPEQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQIsEBMS1iM1FBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIFBrAgLiau2NGA8BAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQItEhAQFyL2FxEgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABArUmICCu1t6I8RAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAiwQExLWIzUUECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUGsCAuJq7Y0YDwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0SEBAXIvYXESAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECtSYgIK7W3ojxECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgECLBATEtYjNRQQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQawIC4mrtjRgPAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECLRIQEBci9hcRIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQK1JiAgrtbeiPEQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQIsEBMS1iM1FBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIFBrAgLiau2NGA8BAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQItEhAQFyL2FxEgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABArUmMMED4gZ8NDjFn0aAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBCakQIcJcfMnXhiQg+AaB8J1mnOGFH8rLd1pQjzWPQkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEDgZyzQphniIgDuhnteS08WAXHRIvit++jgt/I7zkWfxsFyP+N34KcTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQBsItKurqxvVBvfJAW4R6BYtgt/KLHCRLS5a9X4ZMNdjg645aC53aKOPusFD01xzz9FGd5s0b/PZoFFplo7tJs3BGzUBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAi0SEDeUUptliCsD3yLIrQx+i7cS2433o0+08pq844MAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECLRCoE0C4iKwLUqgRma4KJM6tlaWUo1rBMWNTct5AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEBgXgTYJiIvAtghyq84E19TDo1+UVY3v6BvXxLZGgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgRaK9CmAXFjGkx1MFx1FjkBcWNSc44AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIExlWg1QFxZUDbk0XZ1LL8afldDqIMhov9Hht0zYejTxkYV96j7O+bAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAiMr0CrA+LKB3YvSqBGi+C2CI6L0qjlfrkdwXBlEFyci34aAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBoC4EOrb1JGeAWgXBl9rcIjiuD4srsb42D4VYaHUAX/cp7tHYsridAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBn69AqwPigq5xQFt1sFucbxwMF8eiRbBc42vrz/gkQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLjJ9AmJVMjqC2C256oKoEaQXGRKa65YLjoKyBu/F6W3gQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDQvECbBMRF8FsExUX507JEajyyPN748dGnLJVaZpNr3Mc+AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAYH4E2CYiLB5aBbTfc81qDTHGRCa46c1xsR5/qa/KODwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0AqBdnV1daNacX2DS8uyqWUp1DJrXJROLTPHleeayx7X4IYt2KkbPDTNNfccLbjyp3PJZ4NGpVk6tvvp/CC/hAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBsQqIG0qpTQPiSvHIAheBb2UQXHk8AuTir8wmVx5vy28BcSn5h92W/6LciwABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMCkISBuKKUOE+JVVQe8lUFxEQinESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBCSUwQQLiqgcrEK5awzYBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQITCiB9hPqxu5LgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgR+TAEBcT+mtmcRIECAAAECBAgQIPD/7d2xbVxHFIVhgXDs2AHZgCOFVAduwLlbcF1qQB1IoSI1IAaOXYE5BAdYLJYSj9/O6AD6FhCo5V69d/VN+uMtAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLLBARxy2hdmAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgR2Cgjidmq7FwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgsExDELaN1YQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBDYKSCI26ntXgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECCwTEAQt4zWhQkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgp4Agbqe2exEgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAMgFB3DJaFyZAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBnQKCuJ3a7kWAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECywQEcctoXZgAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEdgoI4nZquxcBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQILBMQxC2jdWECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQ2CkgiNup7V4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgsExAELeM1oUJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYKeAIG6ntnsRIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwDIBQdwyWhcmQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgZ0Cgrid2u5FgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAssEBHHLaF2YAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBHYKCOJ2arsXAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECCwTEMQto3VhAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIENgpIIjbqe1eBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQILBMQBC3jNaFCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGCngCBup7Z7ESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMAyAUHcMloXJkCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGdAoK4ndruRYAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLLBARxy2hdmAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgR2Cgjidmq7FwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgsExDELaN1YQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBDYKSCI26ntXgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECCwTEAQt4zWhQkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgp4Agbqe2exEgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAMgFB3DJaFyZAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBnQKCuJ3a7kWAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECywQEcctoXZgAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEdgoI4nZquxcBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQILBMQxC2jdWECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQ2CkgiNup7V4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgsEzghwVxD//8u+w/5cIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg8PMJ/JAgbsRw7z98efPx88PPJ+5/TIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJLBH45etX5pLevLzzx7e63X9/cPv45fY3348+n5yDu3dvb04/9nQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIxAKHg7jxpLdvve7++P3p4xnOzdkRwY1/K4qbIn4SIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwBGBQ0HcjNzuH+O28SS4S6/xJLj5FamXPh+/G1HcpSfJvTTv9wQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBA4FzgUBB3erHzr0U9/2xEc+ev+XS4+RWq5597T4AAAQIECBAgQIAAAQIECBAgQIDmXgZvAAAaGklEQVQAAQIECBAgQIAAAQIECBAgQIAAAQIEXitwtSDu9IbziXAjghtfjTpe8+ec+/j4VLjxGjHcn89fqzo/85MAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQCN+k/+N78jOHG3EtfozpmxtPhxHDf0/Q5AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECLxW4KpPiDuN4eZXqI7fzdf83Qzh5vv5uZ8ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQOD/Clw1iJtfgzqWOY3jTpf7+6/7p7diuFMVfydAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBowJXDeJG5DafCDf+Lno7ejz+PQECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi8VuCqQdy7t7dP9/30+eEpjBvvvxXFjXjuW5+/9j9hjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI3FybYERw989h3NfH4O2l1/xK1dOvWX1p1u8JECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMD3BK76hLh5sxHF3T1+ZaoXAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBDYJXAoiJtfdzq/InXX0u5DgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTOBQ4FceNi4+tRx9efnr7O38/PZkB3+n48Tc6LAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgcFTgcxJ0HbSOGe//hy8W9RhB3Pn9x0C8JECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAocDiIO7/fiN7GU+MuvcRwl1T8jgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSuIXD1IG4sJXy7xtG4BgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgkAjfJsFkCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINAqIIhrPRl7ESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAkIIiLuAwTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQKuAIK71ZOxFgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABApGAIC7iMkyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECrQKCuNaTsRcBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIRAKCuIjLMAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0CgjiWk/GXgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAQCQjiIi7DBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINAqIIhrPRl7ESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAkIIiLuAwTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQKuAIK71ZOxFgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABApGAIC7iMkyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECrQKCuNaTsRcBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIRAKCuIjLMAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0CgjiWk/GXgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAQCQjiIi7DBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINAqIIhrPRl7ESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAkIIiLuAwTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQKuAIK71ZOxFgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABApGAIC7iMkyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECrQKCuNaTsRcBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIRAKCuIjLMAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0CgjiWk/GXgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAQCQjiIi7DBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINAqIIhrPRl7ESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAkIIiLuAwTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQKuAIK71ZOxFgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABApGAIC7iMkyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECrQKCuNaTsRcBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIRAKCuIjLMAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0CgjiWk/GXgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAQCQjiIi7DBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINAqIIhrPRl7ESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAkIIiLuAwTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQKuAIK71ZOxFgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABApGAIC7iMkyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECrQKCuNaTsRcBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIRAKCuIjLMAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0CgjiWk/GXgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAQCQjiIi7DBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINAqIIhrPRl7ESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAkIIiLuAwTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQKuAIK71ZOxFgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABApGAIC7iMkyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECrQKCuNaTsRcBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIRAKCuIjLMAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0CgjiWk/GXgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAQCQjiIi7DBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINAqIIhrPRl7ESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAkIIiLuAwTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQKuAIK71ZOxFgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABApGAIC7iMkyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECrQKCuNaTsRcBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIRAKCuIjLMAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0CgjiWk/GXgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAQCQjiIi7DBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINAqIIhrPRl7ESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAkIIiLuAwTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQKuAIK71ZOxFgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABApGAIC7iMkyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECrQKCuNaTsRcBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIRAKCuIjLMAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0CgjiWk/GXgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAQCQjiIi7DBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINAqIIhrPRl7ESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAkIIiLuAwTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQKuAIK71ZOxFgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABApGAIC7iMkyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECrQKCuNaTsRcBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIRAKCuIjLMAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0CgjiWk/GXgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAQCQjiIi7DBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINAqIIhrPRl7ESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAkIIiLuAwTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQKuAIK71ZOxFgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABApGAIC7iMkyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECrQKCuNaTsRcBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIRAKCuIjLMAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0CgjiWk/GXgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAQCQjiIi7DBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINAqIIhrPRl7ESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAkIIiLuAwTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQKuAIK71ZOxFgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABApGAIC7iMkyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECrQKCuNaTsRcBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIRAKCuIjLMAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0CgjiWk/GXgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAQCQjiIi7DBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINAqIIhrPRl7ESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAkIIiLuAwTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQKuAIK71ZOxFgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABApGAIC7iMkyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECrQKCuNaTsRcBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIRAKCuIjLMAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0CgjiWk/GXgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAQCQjiIi7DBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINAqIIhrPRl7ESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAkIIiLuAwTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQKuAIK71ZOxFgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABApGAIC7iMkyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECrQKCuNaTsRcBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIRAKCuIjLMAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0CgjiWk/GXgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAQCQjiIi7DBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINAqIIhrPRl7ESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAkIIiLuAwTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQKuAIK71ZOxFgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABApGAIC7iMkyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECrQKCuNaTsRcBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIRAKCuIjLMAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0CgjiWk/GXgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAQCQjiIi7DBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINAqIIhrPRl7ESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAkIIiLuAwTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQKuAIK71ZOxFgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABApGAIC7iMkyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECrQKCuNaTsRcBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIRAKCuIjLMAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0CgjiWk/GXgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAQCQjiIi7DBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINAqIIhrPRl7ESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAk8B+LnGlaFZbbmAAAAABJRU5ErkJggg==" - } - }, - "cell_type": "markdown", - "id": "217279f8-6af1-4209-b0ec-3d3d829ceed9", - "metadata": {}, - "source": [ - "![image.png](attachment:66422f79-9b46-4e07-9796-c1b350c26c9c.png)" - ] - }, - { - "cell_type": "markdown", - "id": "844edc05-0b6a-4e84-9213-1d3cbf6f833e", - "metadata": {}, - "source": [ - "## Use the function for model serving" - ] - }, - { - "cell_type": "markdown", - "id": "40182a6f-fc46-4a33-a7f5-7ee8ee171966", - "metadata": {}, - "source": [ - "### Create the server and serving function\n", - "\n", - "Create a serving function that uses the model from the previous run and serves it using MLRun.
\n", - "We will create a mock server to test the model in a local environment." - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "id": "f5fe910b-e177-4af7-84de-41a571d1774c", - "metadata": {}, - "outputs": [], - "source": [ - "serving_func = project.set_function(\n", - " func=\"function.yaml\",\n", - " name=\"example-xgb-server\",\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "id": "ddbfd48f-a90e-4fe6-9caa-ddffeacf63d1", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Add the model\n", - "serving_func.add_model(\n", - " \"mlflow_xgb_model\",\n", - " class_name=\"MLFlowModelServer\",\n", - " model_path=train_run.outputs[\"model\"],\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "id": "2298d111-2f53-4b84-be9e-e4e8a228dcc4", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2024-03-27 15:37:31,627 [info] model mlflow_xgb_model was loaded\n", - "> 2024-03-27 15:37:31,628 [info] Loaded ['mlflow_xgb_model']\n" - ] - } - ], - "source": [ - "# Create a mock server\n", - "server = serving_func.to_mock_server()" - ] - }, - { - "cell_type": "markdown", - "id": "f54d7c06-4972-4881-9bc9-fba7db0adbe4", - "metadata": {}, - "source": [ - "### Test the model " - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "id": "4f256490-f225-4bd6-ac8a-5fc12a0f335d", - "metadata": {}, - "outputs": [], - "source": [ - "# An example taken randomly \n", - "result = server.test(\"/v2/models/mlflow_xgb_model/predict\", {\"inputs\":[{\"age\": 20, \"gender\": 0}]})" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "id": "47839f4b-bb2d-4341-99c5-e34fa31270c9", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'id': '43a61d06f2694fa695bdd6561b487131',\n", - " 'model_name': 'mlflow_xgb_model',\n", - " 'outputs': [[0.9242361187934875, 0.0418272465467453, 0.033936627209186554]]}" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Look at the result, it shows the probability of the given example to be each of the \n", - "# irises featured in the dataset\n", - "result" - ] - }, - { - "cell_type": "markdown", - "id": "d4fc6c73-0963-4814-bd5f-2d27b464823e", - "metadata": {}, - "source": [ - "We predicted that a 20 year old female would like pop!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "mlrun-base", - "language": "python", - "name": "conda-env-mlrun-base-py" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.16" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/mlflow_utils/mlflow_utils.py b/mlflow_utils/mlflow_utils.py deleted file mode 100644 index fb6124bef..000000000 --- a/mlflow_utils/mlflow_utils.py +++ /dev/null @@ -1,45 +0,0 @@ -import zipfile -from typing import Any, Dict -import mlflow -from mlrun.serving.v2_serving import V2ModelServer -import pandas as pd - - -class MLFlowModelServer(V2ModelServer): - """ - MLFlow tracker Model serving class, inheriting the V2ModelServer class for being initialized automatically by the model - server and be able to run locally as part of a nuclio serverless function, or as part of a real-time pipeline. - """ - - def load(self): - """ - loads a model that was logged by the MLFlow tracker model - """ - # Unzip the model dir and then use mlflow's load function - model_file, _ = self.get_model(".zip") - model_path_unzip = model_file.replace(".zip", "") - - with zipfile.ZipFile(model_file, "r") as zip_ref: - zip_ref.extractall(model_path_unzip) - - self.model = mlflow.pyfunc.load_model(model_path_unzip) - - def predict(self, request: Dict[str, Any]) -> list: - """ - Infer the inputs through the model. The inferred data will - be read from the "inputs" key of the request. - - :param request: The request to the model using xgboost's predict. - The input to the model will be read from the "inputs" key. - - :return: The model's prediction on the given input. - """ - - # Get the inputs and set to accepted type: - inputs = pd.DataFrame(request["inputs"]) - - # Predict using the model's predict function: - predictions = self.model.predict(inputs) - - # Return as list: - return predictions.tolist() diff --git a/mlflow_utils/requirements.txt b/mlflow_utils/requirements.txt deleted file mode 100644 index 2a40b1a81..000000000 --- a/mlflow_utils/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -mlflow==2.20.2 -lightgbm -xgboost diff --git a/mlflow_utils/test_mlflow_utils.py b/mlflow_utils/test_mlflow_utils.py deleted file mode 100644 index 70d6ce03f..000000000 --- a/mlflow_utils/test_mlflow_utils.py +++ /dev/null @@ -1,179 +0,0 @@ -# Copyright 2018 Iguazio -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -import tempfile - -import lightgbm as lgb -import mlflow -import mlflow.environment_variables -import mlflow.xgboost -import pytest -import xgboost as xgb -from sklearn import datasets -from sklearn.metrics import accuracy_score, log_loss -from sklearn.model_selection import train_test_split - -import os -# os.environ["MLRUN_IGNORE_ENV_FILE"] = "True" #TODO remove before push - -import mlrun -import mlrun.launcher.local -# Important: -# unlike mlconf which resets back to default after each test run, the mlflow configurations -# and env vars don't, so at the end of each test we need to redo anything we set in that test. -# what we cover in these tests: logging "regular" runs with, experiment name, run id and context -# name (last two using mlconf), failing run mid-way, and a run with no handler. -# we also test here importing of runs, artifacts and models from a previous run. - -# simple mlflow example of lgb logging -def lgb_run(): - # prepare train and test data - iris = datasets.load_iris() - X = iris.data - y = iris.target - X_train, X_test, y_train, y_test = train_test_split( - X, y, test_size=0.2, random_state=42 - ) - - # enable auto logging - mlflow.lightgbm.autolog() - - train_set = lgb.Dataset(X_train, label=y_train) - - with mlflow.start_run(): - # train model - params = { - "objective": "multiclass", - "num_class": 3, - "learning_rate": 0.1, - "metric": "multi_logloss", - "colsample_bytree": 1.0, - "subsample": 1.0, - "seed": 42, - } - # model and training data are being logged automatically - model = lgb.train( - params, - train_set, - num_boost_round=10, - valid_sets=[train_set], - valid_names=["train"], - ) - - # evaluate model - y_proba = model.predict(X_test) - y_pred = y_proba.argmax(axis=1) - loss = log_loss(y_test, y_proba) - acc = accuracy_score(y_test, y_pred) - - # log metrics - mlflow.log_metrics({"log_loss": loss, "accuracy": acc}) - - -# simple mlflow example of xgb logging -def xgb_run(): - # prepare train and test data - iris = datasets.load_iris() - x = iris.data - y = iris.target - x_train, x_test, y_train, y_test = train_test_split( - x, y, test_size=0.2, random_state=42 - ) - - # enable auto logging - mlflow.xgboost.autolog() - - dtrain = xgb.DMatrix(x_train, label=y_train) - dtest = xgb.DMatrix(x_test, label=y_test) - - with mlflow.start_run(): - # train model - params = { - "objective": "multi:softprob", - "num_class": 3, - "learning_rate": 0.3, - "eval_metric": "mlogloss", - "colsample_bytree": 1.0, - "subsample": 1.0, - "seed": 42, - } - # model and training data are being logged automatically - model = xgb.train(params, dtrain, evals=[(dtrain, "train")]) - # evaluate model - y_proba = model.predict(dtest) - y_pred = y_proba.argmax(axis=1) - loss = log_loss(y_test, y_proba) - acc = accuracy_score(y_test, y_pred) - # log metrics - mlflow.log_metrics({"log_loss": loss, "accuracy": acc}) - - -@pytest.mark.parametrize("handler", ["xgb_run", "lgb_run"]) -def test_track_run_with_experiment_name(handler): - """ - This test is for tracking a run logged by mlflow into mlrun while it's running using the experiment name. - first activate the tracking option in mlconf, then we name the mlflow experiment, - then we run some code that is being logged by mlflow using mlrun, - and finally compare the mlrun we tracked with the original mlflow run using the validate func - """ - # Enable general tracking - mlrun.mlconf.external_platform_tracking.enabled = True - # Set the mlflow experiment name - mlflow.environment_variables.MLFLOW_EXPERIMENT_NAME.set(f"{handler}_test_track") - with tempfile.TemporaryDirectory() as test_directory: - mlflow.set_tracking_uri(test_directory) # Tell mlflow where to save logged data - - # Create a project for this tester: - project = mlrun.get_or_create_project(name="default", context=test_directory) - - # Create a MLRun function using the tester source file (all the functions must be located in it): - func = project.set_function( - func=__file__, - name=f"{handler}-test", - kind="job", - image="mlrun/mlrun", - requirements=["mlflow"], - ) - # mlflow creates a dir to log the run, this makes it in the tmpdir we create - trainer_run = func.run( - local=True, - handler=handler, - artifact_path=test_directory, - ) - - serving_func = project.set_function( - func=os.path.abspath("function.yaml"), - name=f"{handler}-server", - ) - model_name = f"{handler}-model" - # Add the model - upper_handler = handler.replace("_", "-") - model_path = test_directory + f"/{upper_handler}-test-{upper_handler}/0/model/" - serving_func.add_model( - model_name, - class_name="MLFlowModelServer", - model_path=model_path, - ) - - # Create a mock server - server = serving_func.to_mock_server() - - # An example taken randomly - result = server.test(f"/v2/models/{model_name}/predict", {"inputs": [[5.1, 3.5, 1.4, 0.2]]}) - print(result) - assert result - # unset mlflow experiment name to default - mlflow.environment_variables.MLFLOW_EXPERIMENT_NAME.unset() - - diff --git a/modules/src/langchain_mlrun/item.yaml b/modules/src/langchain_mlrun/item.yaml new file mode 100644 index 000000000..f427aef1b --- /dev/null +++ b/modules/src/langchain_mlrun/item.yaml @@ -0,0 +1,24 @@ +apiVersion: v1 +categories: +- langchain +- langgraph +- tracing +- monitoring +- llm +description: LangChain x MLRun integration - Orchestrate your LangChain code with MLRun. +example: langchain_mlrun.ipynb +generationDate: 2025-01-08 +hidden: false +labels: + author: guyl +mlrunVersion: 1.10.0 +name: langchain_mlrun +spec: + filename: langchain_mlrun.py + image: mlrun/mlrun + kind: generic + requirements: + - mlrun + - langchain + - pydantic-settings +version: 0.0.1 \ No newline at end of file diff --git a/modules/src/langchain_mlrun/langchain_mlrun.ipynb b/modules/src/langchain_mlrun/langchain_mlrun.ipynb new file mode 100644 index 000000000..a1f005410 --- /dev/null +++ b/modules/src/langchain_mlrun/langchain_mlrun.ipynb @@ -0,0 +1,899 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7955da79-02cc-42fe-aee0-5456d3e386fd", + "metadata": {}, + "source": [ + "# LangChain ✕ MLRun Integration\n", + "\n", + "`langchain_mlrun` is a hub module that implements LangChain integration with MLRun. Using the module allows MLRun to orchestrate LangChain and LangGraph code, enabling tracing and monitoring batch workflows and realtime deployments.\n", + "___" + ] + }, + { + "cell_type": "markdown", + "id": "8392a3e1-d0a1-409a-ae68-fcc36858d30a", + "metadata": {}, + "source": [ + "## Main Components\n", + "\n", + "This is a short brief of the components available to import from the `langchain_mlrun` module. For full docs, see the documentation page.\n", + "\n", + "### Settings\n", + "\n", + "The module uses Pydantic settings classes that can be configured programmatically or via environment variables. The main class is `MLRunTracerSettings`. It contains two sub-settings:\n", + "* `MLRunTracerClientSettings` - Connection settings (stream path, container, endpoint info). Env prefix: `\"MLRUN_TRACER_CLIENT_\"`\n", + "* `MLRunTracerMonitorSettings` - Controls what/how runs are captured (filters, labels, debug mode). Env prefix: `\"MLRUN_TRACER_MONITOR_\"`\n", + "\n", + "For more information about each setting, see the class docstrings.\n", + "\n", + "#### Example - via code configuration\n", + "\n", + "```python\n", + "from langchain_mlrun import MLRunTracerSettings, MLRunTracerClientSettings, MLRunTracerMonitorSettings\n", + "\n", + "settings = MLRunTracerSettings(\n", + " client=MLRunTracerClientSettings(\n", + " stream_path=\"my-project/model-endpoints/stream-v1\",\n", + " container=\"projects\",\n", + " model_endpoint_name=\"my_endpoint\",\n", + " model_endpoint_uid=\"abc123\",\n", + " serving_function=\"my_function\",\n", + " ),\n", + " monitor=MLRunTracerMonitorSettings(\n", + " label=\"production\",\n", + " root_run_only=True, # Only monitor root runs, not child runs\n", + " tags_filter=[\"important\"], # Only monitor runs with this tag\n", + " ),\n", + ")\n", + "```\n", + "\n", + "#### Example - environment variable configuration\n", + "\n", + "```bash\n", + "export MLRUN_TRACER_CLIENT_STREAM_PATH=\"my-project/model-endpoints/stream-v1\"\n", + "export MLRUN_TRACER_CLIENT_CONTAINER=\"projects\"\n", + "export MLRUN_TRACER_MONITOR_LABEL=\"production\"\n", + "export MLRUN_TRACER_MONITOR_ROOT_RUN_ONLY=\"true\"\n", + "```\n", + "\n", + "### MLRun Tracer\n", + "\n", + "`MLRunTracer` is a LangChain-compatible tracer that converts LangChain `Run` objects into MLRun monitoring events and publishes them to a V3IO stream. \n", + "\n", + "Key points:\n", + "* **No inheritance required** - use it directly without subclassing.\n", + "* **Fully customizable via settings** - control filtering, summarization, and output format.\n", + "* **Custom summarizer support** - pass your own `run_summarizer_function` via settings to customize how runs are converted to events.\n", + "\n", + "### Monitoring Setup Utility Function\n", + "\n", + "`setup_langchain_monitoring()` is a utility function that creates the necessary MLRun infrastructure for LangChain monitoring. This is a **temporary workaround** until custom endpoint creation support is added to MLRun.\n", + "\n", + "The function returns a dictionary of environment variables to configure auto-tracing. See how to use it in the tutorial section below.\n", + "\n", + "### LangChain Monitoring Application\n", + "\n", + "`LangChainMonitoringApp` is a base class (inheriting from MLRun's `ModelMonitoringApplicationBase`) for building monitoring applications that process events from the MLRun Tracer.\n", + "\n", + "It offers several built-in helper methods and metrics for analyzing LangChain runs:\n", + "\n", + "* Helper methods:\n", + " * `get_structured_runs()` - Parse raw monitoring samples into structured run dictionaries with filtering options\n", + " * `iterate_structured_runs()` - Iterate over all runs including nested child runs\n", + "* Metric methods:\n", + " * `calculate_average_latency()` - Average latency across root runs\n", + " * `calculate_success_rate()` - Percentage of runs without errors\n", + " * `count_token_usage()` - Total input/output tokens from LLM runs\n", + " * `count_run_names()` - Count occurrences of each run name\n", + "\n", + "The base app can be used as-is, but it is recommended to extend it with your own custom monitoring logic.\n", + "___" + ] + }, + { + "cell_type": "markdown", + "id": "7e24e1a5-d80a-4b7e-9b94-57b24e8b39d7", + "metadata": {}, + "source": [ + "## How to Apply MLRun?\n", + "\n", + "### Auto Tracing\n", + "\n", + "Auto tracing automatically instruments all LangChain code by setting the `MLRUN_MONITORING_ENABLED` environment variable and importing the module:\n", + "\n", + "```python\n", + "import os\n", + "os.environ[\"MLRUN_MONITORING_ENABLED\"] = \"1\"\n", + "# Set other MLRUN_TRACER_* environment variables as needed...\n", + "\n", + "# Import the module BEFORE any LangChain code\n", + "langchain_mlrun = mlrun.import_module(\"hub://langchain_mlrun\")\n", + "\n", + "# All LangChain/LangGraph code below will be automatically traced\n", + "chain.invoke(...)\n", + "```\n", + "\n", + "### Manual Tracing\n", + "\n", + "For more control, use the `mlrun_monitoring()` context manager to trace specific code blocks:\n", + "\n", + "```python\n", + "from langchain_mlrun import mlrun_monitoring, MLRunTracerSettings\n", + "\n", + "# Optional: customize settings\n", + "settings = MLRunTracerSettings(...)\n", + "\n", + "with mlrun_monitoring(settings=settings) as tracer:\n", + " # Only LangChain code within this block will be traced\n", + " result = chain.invoke({\"topic\": \"MLRun\"})\n", + "```\n", + "___" + ] + }, + { + "cell_type": "markdown", + "id": "68b52d3d-a431-44fb-acd6-ea33fec37a49", + "metadata": {}, + "source": [ + "## Tutorial\n", + "\n", + "In this tutorial we'll show how to orchestrate LangChain based code with MLRun using the `langchain_mlrun` hub module.\n", + "\n", + "### Prerequisites\n", + "\n", + "Install MLRun and the `langchain_mlrun` requirements." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "caf72aa6-06e8-4a04-bfc4-409b39d255fe", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install mlrun langchain pydantic-settings" + ] + }, + { + "cell_type": "markdown", + "id": "8aa18266-d3b5-40bd-a8b9-65345e419d8c", + "metadata": {}, + "source": [ + "### Create Project\n", + "\n", + "We'll first create an MLRun project" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "2664df3e-d9c6-40dd-a215-29d60e4b4208", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> 2026-01-08 14:48:52,259 [info] Project loaded successfully: {\"project_name\":\"langchain-mlrun-7\"}\n" + ] + } + ], + "source": [ + "import os\n", + "import time\n", + "import datetime\n", + "import mlrun\n", + "\n", + "project = mlrun.get_or_create_project(\"langchain-mlrun-tutorial\")" + ] + }, + { + "cell_type": "markdown", + "id": "33f28986-c158-47fd-97a6-74f69892b4eb", + "metadata": {}, + "source": "### Enable Monitoring\n\nTo use MLRun's monitoring feature in our project we first need to set up the monitoring infrastructure. If you use MLRun CE, you'll need to create a Kafka stream, if you use MLRun enterprise, you can use V3IO." + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "d9d2fa66-0498-445d-ab4a-8370f46aec1e", + "metadata": {}, + "outputs": [], + "source": [ + "# TODO: Add here MLRun CE handler with Kafka, currently the tutorial is only with V3IO.\n", + "from mlrun.datastore import DatastoreProfileV3io\n", + "\n", + "# Create a V3IO data store:\n", + "v3io_ds = DatastoreProfileV3io(name=\"v3io-ds\",v3io_access_key=os.environ[\"V3IO_ACCESS_KEY\"])\n", + "project.register_datastore_profile(profile=v3io_ds)\n", + "\n", + "# Set the monitoring credentials:\n", + "project.set_model_monitoring_credentials(\n", + " stream_profile_name=v3io_ds.name,\n", + " tsdb_profile_name=v3io_ds.name\n", + ")\n", + "\n", + "# Enable monitoring for our project:\n", + "project.enable_model_monitoring(\n", + " base_period=1,\n", + " wait_for_deployment=True,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "f23117fa-7b67-470c-80ca-976d14c2120e", + "metadata": {}, + "source": [ + "### Import `langchain_mlrun`\n", + "\n", + "Now we'll import `langchain_mlrun` from the hub." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2360cd49-b260-4140-bd16-138349e000b3", + "metadata": {}, + "outputs": [], + "source": "# Import the module from the hub:\nlangchain_mlrun = mlrun.import_module(\"hub://langchain_mlrun\")\n\n# Import the utility function and monitoring application from the module:\nsetup_langchain_monitoring = langchain_mlrun.setup_langchain_monitoring\nLangChainMonitoringApp = langchain_mlrun.LangChainMonitoringApp" + }, + { + "cell_type": "markdown", + "id": "de030131-ebaf-48f8-96ed-3c1013b5e260", + "metadata": {}, + "source": "### Create Monitorable Endpoint\n\nEndpoints are the entities being monitored by MLRun. As such we'll use the `setup_langchain_monitoring` utility function to create the model monitoring endpoint. By default, our endpoint name will be `\"langchain_mlrun_endpoint\"` but feel free to change it by using the required arguments." + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "0e9baf78-3d38-46bd-89dd-6f83760eaeb0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Creating LangChain model endpoint\n", + "\n", + " [✓] Loading Project......................... Done (0.00s)\u001B[K\n", + " [✓] Creating Model.......................... Done (0.02s) \u001B[K\n", + " [✓] Creating Function....................... Done (0.02s) \u001B[K\n", + " [✓] Creating Model Endpoint................. Done (0.02s) \u001B[K\n", + "\n", + "✨ Done! LangChain monitoring model endpoint created successfully.\n", + "You can now set the following environment variables to enable MLRun tracing in your LangChain code:\n", + "\n", + "{\n", + " \"MLRUN_MONITORING_ENABLED\": \"1\",\n", + " \"MLRUN_TRACER_CLIENT_PROJECT\": \"langchain-mlrun-7\",\n", + " \"MLRUN_TRACER_CLIENT_STREAM_PATH\": \"langchain-mlrun-7/model-endpoints/stream-v1\",\n", + " \"MLRUN_TRACER_CLIENT_CONTAINER\": \"projects\",\n", + " \"MLRUN_TRACER_CLIENT_MODEL_ENDPOINT_NAME\": \"langchain_mlrun_endpoint\",\n", + " \"MLRUN_TRACER_CLIENT_MODEL_ENDPOINT_UID\": \"bb81af2058c14e7cbf58455aed3d69fc\",\n", + " \"MLRUN_TRACER_CLIENT_SERVING_FUNCTION\": \"langchain_mlrun_function\"\n", + "}\n", + "\n", + "To customize the monitoring behavior, you can also set additional environment variables prefixed with 'MLRUN_TRACER_MONITOR_'. Refer to the MLRun tracer documentation for more details.\n", + "\n" + ] + } + ], + "source": [ + "env_vars = setup_langchain_monitoring()" + ] + }, + { + "cell_type": "markdown", + "id": "dd45c94b-ee05-449c-9336-0aa659e66bda", + "metadata": {}, + "source": [ + "### Setup Environment Variables for Auto Tracing\n", + "\n", + "We'll use the environment variables returned from `setup_langchain_monitoring` to setup the environment for auto-tracing. Read the printed outputs for more information." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1c1988f8-c80a-4bf2-bfb1-d43523fc161f", + "metadata": {}, + "outputs": [], + "source": [ + "os.environ.update(env_vars)" + ] + }, + { + "cell_type": "markdown", + "id": "d3f3b8e5-3538-4153-95da-e6d8776be3ac", + "metadata": {}, + "source": "### Run `langchain` or `langgraph` Code\n\nHere we have 3 functions, each using different method utilizing LLMs with `langchain` and `langgraph`:\n* `run_simple_chain` - Using `langchain`'s chains.\n* `run_simple_agent` - Using `langchain`'s `create_agent` function and `tool`s.\n* `run_langgraph_graph` - Using pure `langgraph`.\n\n> **Notice**: You don't need to set OpenAI API credentials, there is a mock `ChatModel` that will replace it if the credentials are not set in the environment. If you wish to use OpenAI models, make sure you `pip install langchain_openai` and set the `OPENAI_API_KEY` environment variable before continue to the next cell.\n\nBecause the auto-tracing environment is set, any run will be automatically traced and monitored!\n\nFeel free to adjust the code as you like.\n\n> **Remember**: To enable auto-tracing you do need to set the environment variables and import the `langchain_mlrun` module before any LangChain code. For batch jobs and realtime functions, make sure you set env vars in the MLRun function and add the import line `langchain_mlrun = mlrun.import_module(\"hub://langchain_mlrun\")` at the top of your code." + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "94b4d4b0-8d10-4ad3-8f16-7b1b7daeac11", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import os\n", + "from typing import Literal, TypedDict, Annotated, Sequence, Any, Callable\n", + "from operator import add\n", + "\n", + "from langchain_core.language_models import LanguageModelInput\n", + "from langchain_core.runnables import Runnable, RunnableLambda\n", + "from langchain_core.prompts import ChatPromptTemplate\n", + "from langchain_core.output_parsers import StrOutputParser\n", + "from langchain_core.language_models.fake_chat_models import FakeListChatModel, GenericFakeChatModel\n", + "from langchain.agents import create_agent\n", + "from langchain_core.messages import AIMessage, HumanMessage\n", + "from langchain_core.tools import tool, BaseTool\n", + "\n", + "from langgraph.graph import StateGraph, START, END\n", + "from langchain_core.messages import BaseMessage\n", + "\n", + "\n", + "def _check_openai_credentials() -> bool:\n", + " \"\"\"\n", + " Check if OpenAI API key is set in environment variables.\n", + "\n", + " :return: True if OPENAI_API_KEY is set, False otherwise.\n", + " \"\"\"\n", + " return \"OPENAI_API_KEY\" in os.environ\n", + "\n", + "\n", + "# Import ChatOpenAI only if OpenAI credentials are available (meaning `langchain-openai` must be installed).\n", + "if _check_openai_credentials():\n", + " from langchain_openai import ChatOpenAI\n", + "\n", + " \n", + "class _ToolEnabledFakeModel(GenericFakeChatModel):\n", + " \"\"\"\n", + " A fake chat model that supports tool binding for running agent tracing tests.\n", + " \"\"\"\n", + "\n", + " def bind_tools(\n", + " self,\n", + " tools: Sequence[\n", + " dict[str, Any] | type | Callable | BaseTool # noqa: UP006\n", + " ],\n", + " *,\n", + " tool_choice: str | None = None,\n", + " **kwargs: Any,\n", + " ) -> Runnable[LanguageModelInput, AIMessage]:\n", + " return self\n", + "\n", + "\n", + "#: Tag value for testing tag filtering.\n", + "_dummy_tag = \"dummy_tag\"\n", + "\n", + "\n", + "def run_simple_chain() -> str:\n", + " \"\"\"\n", + " Run a simple LangChain chain that gets a fact about a topic.\n", + " \"\"\"\n", + " # Build a simple chain: prompt -> llm -> str output parser\n", + " llm = ChatOpenAI(\n", + " model=\"gpt-4o-mini\",\n", + " tags=[_dummy_tag]\n", + " ) if _check_openai_credentials() else (\n", + " FakeListChatModel(\n", + " responses=[\n", + " \"MLRun is an open-source orchestrator for machine learning pipelines.\"\n", + " ],\n", + " tags=[_dummy_tag]\n", + " )\n", + " )\n", + " prompt = ChatPromptTemplate.from_template(\"Tell me a short fact about {topic}\")\n", + " chain = prompt | llm | StrOutputParser()\n", + "\n", + " # Run the chain:\n", + " response = chain.invoke({\"topic\": \"MLRun\"})\n", + " return response\n", + "\n", + "\n", + "def run_simple_agent():\n", + " \"\"\"\n", + " Run a simple LangChain agent that uses two tools to get weather and stock price.\n", + " \"\"\"\n", + " # Define the tools:\n", + " @tool\n", + " def get_weather(city: str) -> str:\n", + " \"\"\"Get the current weather for a specific city.\"\"\"\n", + " return f\"The weather in {city} is 22°C and sunny.\"\n", + "\n", + " @tool\n", + " def get_stock_price(symbol: str) -> str:\n", + " \"\"\"Get the current stock price for a symbol.\"\"\"\n", + " return f\"The stock price for {symbol} is $150.25.\"\n", + "\n", + " # Define the model:\n", + " model = ChatOpenAI(\n", + " model=\"gpt-4o-mini\",\n", + " tags=[_dummy_tag]\n", + " ) if _check_openai_credentials() else (\n", + " _ToolEnabledFakeModel(\n", + " messages=iter(\n", + " [\n", + " AIMessage(\n", + " content=\"\",\n", + " tool_calls=[\n", + " {\"name\": \"get_weather\", \"args\": {\"city\": \"London\"}, \"id\": \"call_abc123\"},\n", + " {\"name\": \"get_stock_price\", \"args\": {\"symbol\": \"AAPL\"}, \"id\": \"call_def456\"}\n", + " ]\n", + " ),\n", + " AIMessage(content=\"The weather in London is 22°C and AAPL is trading at $150.25.\")\n", + " ]\n", + " ),\n", + " tags=[_dummy_tag]\n", + " )\n", + " )\n", + "\n", + " # Create the agent:\n", + " agent = create_agent(\n", + " model=model,\n", + " tools=[get_weather, get_stock_price],\n", + " system_prompt=\"You are a helpful assistant with access to tools.\"\n", + " )\n", + "\n", + " # Run the agent:\n", + " return agent.invoke({\"messages\": [\"What is the weather in London and the stock price of AAPL?\"]})\n", + "\n", + "\n", + "def run_langgraph_graph():\n", + " \"\"\"\n", + " Run a LangGraph agent that uses reflection to correct its answer.\n", + " \"\"\"\n", + " # Define the graph state:\n", + " class AgentState(TypedDict):\n", + " messages: Annotated[list[BaseMessage], add]\n", + " attempts: int\n", + "\n", + " # Define the model:\n", + " model = ChatOpenAI(model=\"gpt-4o-mini\") if _check_openai_credentials() else (\n", + " _ToolEnabledFakeModel(\n", + " messages=iter(\n", + " [\n", + " AIMessage(content=\"There are 2 'r's in Strawberry.\"), # Mocking the failure\n", + " AIMessage(content=\"I stand corrected. S-t-r-a-w-b-e-r-r-y. There are 3 'r's.\"), # Mocking the fix\n", + " ]\n", + " )\n", + " )\n", + " )\n", + "\n", + " # Define the graph nodes and router:\n", + " def call_model(state: AgentState):\n", + " response = model.invoke(state[\"messages\"])\n", + " return {\"messages\": [response], \"attempts\": state[\"attempts\"] + 1}\n", + "\n", + " def reflect_node(state: AgentState):\n", + " prompt = \"Wait, count the 'r's again slowly, letter by letter. Are you sure?\"\n", + " return {\"messages\": [HumanMessage(content=prompt)]}\n", + "\n", + " def router(state: AgentState) -> Literal[\"reflect\", END]:\n", + " # Make sure there are 2 attempts at least for an answer:\n", + " if state[\"attempts\"] == 1:\n", + " return \"reflect\"\n", + " return END\n", + "\n", + " # Build the graph:\n", + " builder = StateGraph(AgentState)\n", + " builder.add_node(\"model\", call_model)\n", + " tagged_reflect_node = RunnableLambda(reflect_node).with_config(tags=[_dummy_tag])\n", + " builder.add_node(\"reflect\", tagged_reflect_node)\n", + " builder.add_edge(START, \"model\")\n", + " builder.add_conditional_edges(\"model\", router)\n", + " builder.add_edge(\"reflect\", \"model\")\n", + " graph = builder.compile()\n", + "\n", + " # Run the graph:\n", + " return graph.invoke({\"messages\": [HumanMessage(content=\"How many 'r's in Strawberry?\")], \"attempts\": 0})" + ] + }, + { + "cell_type": "markdown", + "id": "49964f96-89ba-4f61-8788-38290a877aa2", + "metadata": {}, + "source": [ + "Let's create some traffic, we'll run whatever function you want in a loop to get some events. We take timestamps in order to use them later to run the monitoring application on the data we'll send." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "b7e6418d-76f4-4b18-9ef9-c5bb40b20545", + "metadata": {}, + "outputs": [], + "source": [ + "# Run LangChain code and now it should be tracked and monitored in MLRun:\n", + "start_timestamp = datetime.datetime.now() - datetime.timedelta(minutes=1)\n", + "for i in range(20):\n", + " run_simple_agent()\n", + "end_timestamp = datetime.datetime.now() + datetime.timedelta(minutes=5)" + ] + }, + { + "cell_type": "markdown", + "id": "d9085765-91fd-4d31-84b4-927ecf9cc455", + "metadata": {}, + "source": "> **Note**: Please wait a minute or two until the events are processed." + }, + { + "cell_type": "code", + "execution_count": null, + "id": "85fae3e4-5f1b-4f0c-ba71-81060f10804f", + "metadata": {}, + "outputs": [], + "source": [ + "time.sleep(60)" + ] + }, + { + "cell_type": "markdown", + "id": "2475ebec-fc32-4884-9723-3ca9cfde577f", + "metadata": {}, + "source": [ + "### Test the LangChain Monitoring Application\n", + "\n", + "To test a monitoring application, we use the `evaluate` class method. We'll run an evaluation on the data we just sent. It is a small local job and should run fast.\n", + "\n", + "Keep an eye for the returned metrics from the monitoring application." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "3d046755-9153-497a-a024-5d63316e1f91", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> 2026-01-08 14:49:22,970 [info] Changing function name - adding `\"-batch\"` suffix: {\"func_name\":\"testi-batch\"}\n", + "> 2026-01-08 14:49:23,143 [info] Storing function: {\"db\":\"http://mlrun-api:8080\",\"name\":\"testi-batch--handler\",\"uid\":\"43b34f848b6049c0949f04adc1090f10\"}\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
projectuiditerstartendstatekindnamelabelsinputsparametersresults
langchain-mlrun-70Jan 08 14:49:23NaTcompletedruntesti-batch--handler
v3io_user=guyl
kind=local
owner=guyl
host=jupyter-guyl-66647f988c-4kjd9
endpoints=['langchain_mlrun_endpoint']
start=2026-01-08T10:19:47.452879
end=2026-01-08T10:26:28.861851
base_period=None
write_output=False
existing_data_handling=fail_on_overlap
stream_profile=None
langchain_mlrun_endpoint-bb81af2058c14e7cbf58455aed3d69fc_2026-01-08T10:19:47.452879+00:00_2026-01-08T10:26:28.861851+00:00=[{metric_name: 'average_latency', metric_value: 1949.3444}, {metric_name: 'success_rate', metric_value: 1.0}, {metric_name: 'total_input_tokens', metric_value: 5480.0}, {metric_name: 'total_output_tokens', metric_value: 1404.0}, {metric_name: 'combined_total_tokens', metric_value: 6884.0}, {metric_name: 'run_name_counts_ChatOpenAI', metric_value: 40.0}, {metric_name: 'run_name_counts_model', metric_value: 40.0}, {metric_name: 'run_name_counts_get_weather', metric_value: 20.0}, {metric_name: 'run_name_counts_tools', metric_value: 40.0}, {metric_name: 'run_name_counts_get_stock_price', metric_value: 20.0}, {metric_name: 'run_name_counts_LangGraph', metric_value: 20.0}]
\n", + "
\n", + "
\n", + "
\n", + " Title\n", + " ×\n", + "
\n", + " \n", + "
\n", + "
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "data": { + "text/html": [ + " > to track results use the .show() or .logs() methods or click here to open in UI" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> 2026-01-08 14:49:23,944 [info] Run execution finished: {\"name\":\"testi-batch--handler\",\"status\":\"completed\"}\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "LangChainMonitoringApp.evaluate(\n", + " func_name=\"langchain_monitoring_app_test\",\n", + " func_path=\"langchain_mlrun.py\",\n", + " run_local=True,\n", + " endpoints=[env_vars[\"MLRUN_TRACER_CLIENT_MODEL_ENDPOINT_NAME\"]],\n", + " start=start_timestamp.isoformat(),\n", + " end=end_timestamp.isoformat(),\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "eda724c3-27f3-4d28-a7ba-1e59b9be2a37", + "metadata": {}, + "source": "### Deploy the Monitoring Application\n\nAll that's left to do now is to deploy our monitoring application!" + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "652b00d4-070d-4849-9784-4d461cb83eae", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> 2026-01-08 17:06:50,801 [info] Starting remote function deploy\n", + "2026-01-08 17:06:51 (info) Deploying function\n", + "2026-01-08 17:06:51 (info) Building\n", + "2026-01-08 17:06:52 (info) Staging files and preparing base images\n", + "2026-01-08 17:06:52 (warn) Using user provided base image, runtime interpreter version is provided by the base image\n", + "2026-01-08 17:06:52 (info) Building processor image\n", + "2026-01-08 17:08:52 (info) Build complete\n", + "2026-01-08 17:09:06 (info) Function deploy complete\n", + "> 2026-01-08 17:09:13,972 [info] Model endpoint creation task completed with state succeeded\n", + "> 2026-01-08 17:09:13,973 [info] Successfully deployed function: {\"external_invocation_urls\":[],\"internal_invocation_urls\":[\"nuclio-langchain-mlrun-7-langchain-monitoring-app.default-tenant.svc.cluster.local:8080\"]}\n" + ] + } + ], + "source": [ + "# Deploy the monitoring app:\n", + "LangChainMonitoringApp.deploy(\n", + " func_name=\"langchain_monitoring_app\",\n", + " func_path=\"langchain_mlrun.py\",\n", + " image=\"mlrun/mlrun\",\n", + " requirements=[\n", + " \"langchain\",\n", + " \"pydantic-settings\",\n", + " ],\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c23bef7a-cbdb-4b22-a2d9-2edbfde5eb04", + "metadata": {}, + "source": [ + "Once it is deployed, you can run events again and see the monitoring application in MLRun UI in action:\n", + "\n", + "![mlrun ui example](./notebook_images/mlrun_ui.png)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9f799f06-2e62-4e2f-a42f-c94b5fc18623", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "mlrun-py311", + "language": "python", + "name": "conda-env-.conda-mlrun-py311-py" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.14" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/modules/src/langchain_mlrun/langchain_mlrun.py b/modules/src/langchain_mlrun/langchain_mlrun.py new file mode 100644 index 000000000..c26ae38f2 --- /dev/null +++ b/modules/src/langchain_mlrun/langchain_mlrun.py @@ -0,0 +1,1526 @@ +""" +MLRun to LangChain integration - a tracer that converts LangChain Run objects into MLRun monitoring events and +publishes them to a V3IO stream via MLRun endpoint monitoring format. +""" + +import copy +import importlib +import orjson +import os +import socket +from uuid import UUID +import threading +from contextlib import contextmanager +from contextvars import ContextVar +import datetime +from typing import Any, Callable, Generator, Optional + +import v3io +from langchain_core.tracers import BaseTracer, Run +from langchain_core.tracers.context import register_configure_hook + +from pydantic import Field, field_validator +from pydantic_settings import BaseSettings, SettingsConfigDict +from uuid_utils import uuid7 + +import mlrun +from mlrun.runtimes import RemoteRuntime +from mlrun.model_monitoring.applications import ( + ModelMonitoringApplicationBase, ModelMonitoringApplicationMetric, + ModelMonitoringApplicationResult, MonitoringApplicationContext, +) +import mlrun.common.schemas.model_monitoring.constants as mm_constants + +#: Environment variable name to use MLRun monitoring tracer via LangChain global tracing system: +mlrun_monitoring_env_var = "MLRUN_MONITORING_ENABLED" + + +class _MLRunEndPointClient: + """ + An MLRun model endpoint monitoring client to connect and send events on a V3IO stream. + """ + + def __init__( + self, + monitoring_stream_path: str, + monitoring_container: str, + model_endpoint_name: str, + model_endpoint_uid: str, + serving_function: str | RemoteRuntime, + serving_function_tag: str | None = None, + project: str | mlrun.projects.MlrunProject = None, + ): + """ + Initialize an MLRun model endpoint monitoring client. + + :param monitoring_stream_path: V3IO stream path. + :param monitoring_container: V3IO container name. + :param model_endpoint_name: The monitoring endpoint related model name. + :param model_endpoint_uid: Model endpoint unique identifier. + :param serving_function: Serving function name or ``RemoteRuntime`` object. + :param serving_function_tag: Optional function tag (defaults to 'latest'). + :param project: Project name or ``MlrunProject``. If ``None``, uses the current project. + + raise: MLRunInvalidArgumentError: If there is no current active project and no `project` argument was provided. + """ + # Store the provided info: + self._monitoring_stream_path = monitoring_stream_path + self._monitoring_container = monitoring_container + self._model_endpoint_name = model_endpoint_name + self._model_endpoint_uid = model_endpoint_uid + + # Load project: + if project is None: + try: + self._project_name = mlrun.get_current_project(silent=False).name + except mlrun.errors.MLRunInvalidArgumentError: + raise mlrun.errors.MLRunInvalidArgumentError( + "There is no current active project. Either use `mlrun.get_or_create_project` prior to " + "initializing the monitoring tracer or pass a project name to load. You can also set the " + "environment variable: 'MLRUN_MONITORING_PROJECT'." + ) + elif isinstance(project, str): + self._project_name = project + else: + self._project_name = project.name + + # Load function: + if isinstance(serving_function, str): + self._serving_function_name = serving_function + self._serving_function_tag = serving_function_tag or "latest" + else: + self._serving_function_name = serving_function.metadata.name + self._serving_function_tag = ( + serving_function_tag or serving_function.metadata.tag + ) + + # Initialize a V3IO client: + self._v3io_client = v3io.Client() + + # Prepare the sample: + self._event_sample = { + "class": "CustomStream", + "worker": "0", + "model": self._model_endpoint_name, + "host": socket.gethostname(), + "function_uri": f"{self._project_name}/{self._serving_function_name}:{self._serving_function_tag}", + "endpoint_id": self._model_endpoint_uid, + "sampling_percentage": 100, + "request": {"inputs": [], "background_task_state": "succeeded"}, + "op": "infer", + "resp": { + "id": None, + "model_name": self._model_endpoint_name, + "outputs": [], + "timestamp": None, + "model_endpoint_uid": self._model_endpoint_uid, + }, + "when": None, + "microsec": 496, + "effective_sample_count": 1, + } + + def monitor( + self, + event_id: str, + label: str, + input_data: dict, + output_data: dict, + request_timestamp: str, + response_timestamp: str, + ): + """ + Monitor the provided event, sending it to the model endpoint monitoring stream. + + :param event_id: Unique event identifier used as the monitored record id. + :param label: Label for the run/event. + :param input_data: Serialized input data for the run. + :param output_data: Serialized output data for the run. + :param request_timestamp: Request/start timestamp in the format of '%Y-%m-%d %H:%M:%S%z'. + :param response_timestamp: Response/end timestamp in the format of '%Y-%m-%d %H:%M:%S%z'. + """ + # Copy the sample: + event = copy.deepcopy(self._event_sample) + + # Edit event with given parameters: + event["when"] = request_timestamp + event["request"]["inputs"].append(orjson.dumps({"label": label, "input": input_data}).decode('utf-8')) + event["resp"]["timestamp"] = response_timestamp + event["resp"]["outputs"].append(orjson.dumps(output_data).decode('utf-8')) + event["resp"]["id"] = event_id + + # Push to stream: + self._v3io_client.stream.put_records( + container=self._monitoring_container, + stream_path=self._monitoring_stream_path, + records=[{"data": orjson.dumps(event).decode('utf-8')}], + ) + + +class MLRunTracerClientSettings(BaseSettings): + """ + MLRun tracer monitoring client configurations. These are mandatory arguments for allowing MLRun to send monitoring + events to a specific model endpoint stream. + """ + + stream_path: str = ... + """ + The V3IO stream path to send the events to. + """ + + container: str = ... + """ + The V3IO stream container. + """ + + model_endpoint_name: str = ... + """ + The model endpoint name. + """ + + model_endpoint_uid: str = ... + """ + The model endpoint UID. + """ + + serving_function: str = ... + """ + The serving function name. + """ + + serving_function_tag: str | None = None + """ + The serving function tag. If not set, it will be 'latest' by default. + """ + + project: str | None = None + """ + The MLRun project name related to the serving function and model endpoint. + """ + + #: Pydantic model configuration to set the environment variable prefix. + model_config = SettingsConfigDict(env_prefix="MLRUN_TRACER_CLIENT_") + + +class MLRunTracerMonitorSettings(BaseSettings): + """ + MLRun tracer monitoring configurations. These are optional arguments to customize the LangChain runs summarization + into monitorable MLRun endpoint events. If needed, a custom summarization can be passed. + """ + + label: str = "default" + """ + Label to use for all monitored runs. Can be used to differentiate between different monitored sources on the same + endpoint. + """ + + tags_filter: list[str] | None = None + """ + Filter runs by tags. Only runs with at least one tag in this list will be monitored. + If None, no tag-based filtering is applied and runs with any tags are considered. + Default: None. + """ + + run_types_filter: list[str] | None = None + """ + Filter runs by run types (e.g. "chain", "llm", "chat", "tool"). + Only runs whose `run_type` appears in this list will be monitored. + If None, no run-type filtering is applied. + Default: None. + """ + + names_filter: list[str] | None = None + """ + Filter runs by class/name. Only runs whose `name` appears in this list will be monitored. + If None, no name-based filtering is applied. + Default: None. + """ + + include_full_run: bool = False + """ + If True, include the complete serialized run dict (the output of `run._get_dicts_safe()`) + in the event outputs under the key `full_run`. Useful for debugging or when consumers need + the raw run payload. Default: False. + """ + + include_errors: bool = True + """ + If True, include run error information in the outputs under the `error` key. + If False, runs that contain an error may be skipped by the summarizer filters. + Default: True. + """ + + include_metadata: bool = True + """ + If True, include run metadata (environment, tool metadata, etc.) in the inputs under + the `metadata` key. Default: True. + """ + + include_latency: bool = True + """ + If True, include latency information in the outputs under the `latency` key. + Default: True. + """ + + root_run_only: bool = False + """ + If True, only the root/top-level run will be monitored and any child runs will be + ignored/removed from monitoring. Use when only the top-level run should produce events. + Default: False. + """ + + split_runs: bool = False + """ + If True, child runs are emitted as separate monitoring events (each run summarized and + sent individually). If False, child runs are nested inside the parent/root run event under + `child_runs`. Default: False. + """ + + run_summarizer_function: ( + str + | Callable[ + [Run, Optional[BaseSettings]], + Generator[tuple[dict, dict] | None, None, None], + ] + | None + ) = None + """ + A function to summarize a `Run` object into a tuple of inputs and outputs. Can be passed directly or via a full + module path ("a.b.c.my_summarizer" will be imported as `from a.b.c import my_summarizer`). + + A summarizer is a function that will be used to process a run into monitoring events. The function is expected to be + of type: + `Callable[[Run, Optional[BaseSettings]], Generator[tuple[dict, dict] | None, None, None]]`, meaning + get a run object and optionally a settings object and return a generator yielding tuples of serialized dictionaries, + the (inputs, outputs) to send to MLRun monitoring as events or `None` to skip monitoring this run. + """ + + run_summarizer_settings: str | BaseSettings | None = None + """ + Settings to pass to the run summarizer function. Can be passed directly or via a full module path to be imported + and initialized. If the summarizer function does not require settings, this can be left as None. + """ + + debug: bool = False + """ + If True, disable sending events to MLRun/V3IO and instead route events to `debug_target_list` + or print them as JSON to stdout. Useful for unit tests and local debugging. Default: False. + """ + + debug_target_list: list[dict] | bool = False + """ + Optional list to which debug events will be appended when `debug` is True. + If set, each generated event dict will be appended to this list. If not set and `debug` is True, + events will be printed to stdout as JSON. Default: False. + """ + + #: Pydantic model configuration to set the environment variable prefix. + model_config = SettingsConfigDict(env_prefix="MLRUN_TRACER_MONITOR_") + + @field_validator('debug_target_list', mode='before') + @classmethod + def convert_bool_to_list(cls, v): + """ + Convert a boolean `True` value to an empty list for `debug_target_list`. + + :param v: The value to validate. + + :returns: An empty list if `v` is True, otherwise the original value. + """ + if v is True: + return [] + return v + + +class MLRunTracerSettings(BaseSettings): + """ + MLRun tracer settings to configure the tracer. The settings are split into two groups: + + * `client`: settings required to connect and send events to the MLRun/V3IO monitoring stream. + * `monitor`: settings controlling which LangChain runs are summarized and sent and how. + """ + + client: MLRunTracerClientSettings = Field(default_factory=MLRunTracerClientSettings) + """ + Client configuration group (``MLRunTracerClientSettings``). + + Contains the mandatory connection and endpoint information required to publish monitoring + events. Values may be supplied programmatically or via environment variables prefixed with + `MLRUN_TRACER_CLIENT_`. See more at ``MLRunTracerClientSettings``. + """ + + monitor: MLRunTracerMonitorSettings = Field(default_factory=MLRunTracerMonitorSettings) + """ + Monitoring configuration group (``MLRunTracerMonitorSettings``). + + Controls what runs are captured, how they are summarized (including custom summarizer import + options), whether child runs are split or nested, and debug behavior. Values may be supplied + programmatically or via environment variables prefixed with `MLRUN_TRACER_MONITOR_`. + See more at ``MLRunTracerMonitorSettings``. + """ + + #: Pydantic model configuration to set the environment variable prefix. + model_config = SettingsConfigDict(env_prefix="MLRUN_TRACER_") + + +class MLRunTracer(BaseTracer): + """ + MLRun tracer for LangChain runs allowing monitoring LangChain and LangGraph in production using MLRun's monitoring. + + There are two usage modes for the MLRun tracer following LangChain tracing best practices: + + 1. **Manual Mode** - Using the ``mlrun_monitoring`` context manager:: + + from mlrun_tracer import mlrun_monitoring + + with mlrun_monitoring(...) as tracer: + # LangChain code here. + pass + + 2. **Auto Mode** - Setting the `MLRUN_MONITORING_ENABLED="1"` environment variable:: + + import mlrun_integration.tracer + + # All LangChain code will be automatically traced and monitored. + pass + + To control how runs are being summarized into the events being monitored, the ``MLRunTracerSettings`` can be set. + As it is a Pydantic ``BaseSettings`` class, it can be done in two ways: + + 1. Initializing the settings classes and passing them to the context manager:: + + from mlrun_tracer import ( + mlrun_monitoring, + MLRunTracerSettings, + MLRunTracerClientSettings, + MLRunTracerMonitorSettings, + ) + + my_settings = MLRunTracerSettings( + client=MLRunTracerClientSettings(), + monitor=MLRunTracerMonitorSettings(root_run_only=True), + ) + + with mlrun_monitoring(settings=my_settings) as tracer: + # LangChain code here. + pass + + 2. Or via environment variables following the prefix 'MLRUN_TRACER_CLIENT_' for client settings and + 'MLRUN_TRACER_MONITOR_' for monitoring settings. + """ + + #: A singleton tracer for when using the tracer via environment variable to activate global tracing. + _singleton_tracer: "MLRunTracer | None" = None + #: A thread lock for initializing the tracer singleton safely. + _lock = threading.Lock() + #: A boolean flag to know whether the singleton was initialized. + _initialized = False + + def __new__(cls, *args, **kwargs) -> "MLRunTracer": + """ + Create or return an ``MLRunTracer`` instance. + + When ``MLRUN_MONITORING_ENABLED`` is not set to ``"1"``, a normal instance is returned. + When the env var is ``"1"``, a process-wide singleton is returned. Creation is thread-safe. + + :returns: MLRunTracer instance (singleton if 'auto' mode is active). + """ + # Check if needed to use a singleton as the user is using the MLRun tracer by setting the environment variable + # and not manually (via context manager): + if not cls._check_for_env_var_usage(): + return super(MLRunTracer, cls).__new__(cls) + + # Check if the singleton is set: + if cls._singleton_tracer is None: + # Acquire lock to initialize the singleton: + with cls._lock: + # Double-check after acquiring lock: + if cls._singleton_tracer is None: + cls._singleton_tracer = super(MLRunTracer, cls).__new__(cls) + + return cls._singleton_tracer + + def __init__(self, settings: MLRunTracerSettings = None, **kwargs): + """ + Initialize the tracer. + + :param settings: Settings to use for the tracer. If not passed, defaults are used and environment variables are + applied per Pydantic settings behavior. + :param kwargs: Passed to the base initializer. + """ + # Proceed with initialization only if singleton mode is not required or the singleton was not initialized: + if self._check_for_env_var_usage() and self._initialized: + return + + # Call the base tracer init: + super().__init__(**kwargs) + + # Set a UID for this instance: + self._uid = uuid7() + + # Set the settings: + self._settings = settings or MLRunTracerSettings() + self._client_settings = self._settings.client + self._monitor_settings = self._settings.monitor + + # Initialize the MLRun endpoint client: + self._mlrun_client = ( + _MLRunEndPointClient( + monitoring_stream_path=self._client_settings.stream_path, + monitoring_container=self._client_settings.container, + model_endpoint_name=self._client_settings.model_endpoint_name, + model_endpoint_uid=self._client_settings.model_endpoint_uid, + serving_function=self._client_settings.serving_function, + serving_function_tag=self._client_settings.serving_function_tag, + project=self._client_settings.project, + ) + if not self._monitor_settings.debug + else None + ) + + # In case the user passed a custom summarizer, import it: + self._custom_run_summarizer_function: ( + Callable[ + [Run, Optional[BaseSettings]], + Generator[tuple[dict, dict] | None, None, None], + ] + | None + ) = None + self._custom_run_summarizer_settings: BaseSettings | None = None + self._import_custom_run_summarizer() + + # Mark the initialization flag (for the singleton case): + self._initialized = True + + @property + def settings(self) -> MLRunTracerSettings: + """ + Access the effective settings. + + :returns: The settings used by this tracer. + """ + return self._settings + + def _import_custom_run_summarizer(self): + """ + Import or assign a custom run summarizer (and its custom settings) if configured. + """ + # If the user did not pass a run summarizer function, return: + if not self._monitor_settings.run_summarizer_function: + return + + # Check if the function needs to be imported: + if isinstance(self._monitor_settings.run_summarizer_function, str): + self._custom_run_summarizer_function = self._import_from_module_path( + module_path=self._monitor_settings.run_summarizer_function + ) + else: + self._custom_run_summarizer_function = ( + self._monitor_settings.run_summarizer_function + ) + + # Check if the user passed settings as well: + if self._monitor_settings.run_summarizer_settings: + # Check if the settings need to be imported: + if isinstance(self._monitor_settings.run_summarizer_settings, str): + self._custom_run_summarizer_settings = self._import_from_module_path( + module_path=self._monitor_settings.run_summarizer_settings + )() + else: + self._custom_run_summarizer_settings = ( + self._monitor_settings.run_summarizer_settings + ) + + def _persist_run(self, run: Run, level: int = 0) -> None: + """ + Summarize the run (and its children) into MLRun monitoring events. + + Note: This will use the MLRun tracer's default summarization that can be configured via + ``MLRunTracerMonitorSettings``, unless a custom summarizer was provided (via the same settings). + + :param run: LangChain run object to process holding all the nested tree of runs. + :param level: The nesting level of the run (0 for root runs, incremented for child runs). + """ + # Serialize the run: + serialized_run = self._serialize_run( + run=run, + include_child_runs=not (self._settings.monitor.root_run_only or self._settings.monitor.split_runs) + ) + + # Check for a user custom run summarizer function: + if self._custom_run_summarizer_function: + for summarized_run in self._custom_run_summarizer_function( + run, self._custom_run_summarizer_settings + ): + if summarized_run: + inputs, outputs = summarized_run + self._send_run_event( + event_id=serialized_run["id"], + inputs=inputs, + outputs=outputs, + start_time=run.start_time, + end_time=run.end_time, + ) + return + + # Check how to deal with the child runs, monitor them in separate events or as a single event: + if self._monitor_settings.split_runs and not self._settings.monitor.root_run_only: + # Monitor as separate events: + for child_run in run.child_runs: + self._persist_run(run=child_run, level=level + 1) + summarized_run = self._summarize_run(serialized_run=serialized_run, include_children=False) + if summarized_run: + inputs, outputs = summarized_run + inputs["child_level"] = level + self._send_run_event( + event_id=serialized_run["id"], + inputs=inputs, + outputs=outputs, + start_time=run.start_time, + end_time=run.end_time, + ) + return + + # Monitor the root event (include child runs if `root_run_only` is False): + summarized_run = self._summarize_run( + serialized_run=serialized_run, + include_children=not self._monitor_settings.root_run_only + ) + if not summarized_run: + return + inputs, outputs = summarized_run + inputs["child_level"] = level + self._send_run_event( + event_id=serialized_run["id"], + inputs=inputs, + outputs=outputs, + start_time=run.start_time, + end_time=run.end_time, + ) + + + def _serialize_run(self, run: Run, include_child_runs: bool) -> dict: + """ + Serialize a LangChain run into a dictionary. LangChain's Run is currently in Pydantic v1 where some of its + inner models are in Pydantic V2 which causes issues when trying to serialize the whole run object directly. + + This is a workaround to properly serialize the run object. + + :param run: The run to serialize. + :param include_child_runs: Whether to include child runs in the serialization. + + :returns: The serialized run dictionary. + """ + if not include_child_runs: + serialized_run = run.dict(exclude={"child_runs"}) + else: + serialized_run = run.dict() + return orjson.loads(orjson.dumps(serialized_run, default=self._serialize_default)) + + def _serialize_default(self, obj: Any): + """ + Default serializer for objects present in LangChain run that are not serializable by default JSON encoder. It + includes handling Pydantic v1 and v2 models, UUIDs, and datetimes. + + :param obj: The object to serialize. + + :returns: The serialized object. + """ + if isinstance(obj, UUID): + return str(obj) + if isinstance(obj, datetime.datetime): + return obj.isoformat() + if hasattr(obj, "model_dump"): + return obj.model_dump() + if hasattr(obj, "dict"): + return orjson.loads(orjson.dumps(obj.dict(), default=self._serialize_default)) + return str(obj) + + def _filter_by_tags(self, serialized_run: dict) -> bool: + """ + Apply tag-based filtering. + + :param serialized_run: Serialized run dictionary. + + :returns: True if the run passes tag filters or if no tag filter is configured. + """ + # Check if the user enabled filtering by tags: + if not self._monitor_settings.tags_filter: + return True + + # Filter the run: + return not set(self._monitor_settings.tags_filter).isdisjoint( + serialized_run["tags"] + ) + + def _filter_by_run_types(self, serialized_run: dict) -> bool: + """ + Apply run-type filtering. + + :param serialized_run: Serialized run dictionary. + + :returns: True if the run's ``run_type`` is allowed or if no run-type filter is configured. + """ + # Check if the user enabled filtering by run types: + if not self._monitor_settings.run_types_filter: + return True + + # Filter the run: + return serialized_run["run_type"] in self._monitor_settings.run_types_filter + + def _filter_by_names(self, serialized_run: dict) -> bool: + """ + Apply class/name filtering. + + :param serialized_run: Serialized run dictionary. + + :returns: True if the run's ``name`` is allowed or if no name filter is configured. + """ + # Check if the user enabled filtering by class names: + if not self._monitor_settings.names_filter: + return True + + # Filter the run: + return serialized_run["name"] in self._monitor_settings.names_filter + + def _get_run_inputs(self, serialized_run: dict) -> dict[str, Any]: + """ + Build the inputs dictionary for a monitoring event. + + :param serialized_run: Serialized run dictionary. + + :returns: A dictionary containing inputs, run metadata and (optionally) additional metadata. + """ + inputs = { + "inputs": serialized_run["inputs"], + "run_type": serialized_run["run_type"], + "run_name": serialized_run["name"], + "tags": serialized_run["tags"], + "run_id": serialized_run["id"], + "start_timestamp": serialized_run["start_time"], + } + if "parent_run_id" in serialized_run: + # Parent run ID is excluded when child runs are joined in the same event. When child runs are split, it is + # included and can be used to reconstruct the run tree if needed. + inputs = {**inputs, "parent_run_id": serialized_run["parent_run_id"]} + if self._monitor_settings.include_metadata and "metadata" in serialized_run: + inputs = {**inputs, "metadata": serialized_run["metadata"]} + + return inputs + + def _get_run_outputs(self, serialized_run: dict) -> dict[str, Any]: + """ + Build the outputs dictionary for a monitoring event. + + :param serialized_run: Serialized run dictionary. + + :returns: A dictionary with outputs and optional other collected info depending on monitor settings. + """ + outputs = {"outputs": serialized_run["outputs"], "end_timestamp": serialized_run["end_time"]} + if self._monitor_settings.include_latency and "latency" in serialized_run: + outputs = {**outputs, "latency": serialized_run["latency"]} + if self._monitor_settings.include_errors: + outputs = {**outputs, "error": serialized_run["error"]} + if self._monitor_settings.include_full_run: + outputs = {**outputs, "full_run": serialized_run} + + return outputs + + def _summarize_run(self, serialized_run: dict, include_children: bool) -> tuple[dict, dict] | None: + """ + Summarize a single run into (inputs, outputs) if it passes filters. + + :param serialized_run: Serialized run dictionary. + :param include_children: Whether to include child runs. + + :returns: The summarized run (inputs, outputs) tuple if the run should be monitored, otherwise ``None``. + """ + # Pass filters: + if not ( + self._filter_by_tags(serialized_run=serialized_run) + and self._filter_by_run_types(serialized_run=serialized_run) + and self._filter_by_names(serialized_run=serialized_run) + ): + return None + + # Check if needed to include errors: + if serialized_run["error"] and not self._monitor_settings.include_errors: + return None + + # Prepare the inputs and outputs: + inputs = self._get_run_inputs(serialized_run=serialized_run) + outputs = self._get_run_outputs(serialized_run=serialized_run) + + # Check if needed to include child runs: + if include_children: + outputs["child_runs"] = [] + for child_run in serialized_run.get("child_runs", []): + # Recursively summarize the child run: + summarized_child_run = self._summarize_run(serialized_run=child_run, include_children=True) + if summarized_child_run: + inputs_child, outputs_child = summarized_child_run + outputs["child_runs"].append( + { + "input_data": inputs_child, + "output_data": outputs_child, + } + ) + + return inputs, outputs + + def _send_run_event( + self, event_id: str, inputs: dict, outputs: dict, start_time: datetime.datetime, end_time: datetime.datetime + ): + """ + Send a monitoring event for a single run. + + Note: If monitor debug mode is enabled, appends to ``debug_target_list`` or prints JSON. + + :param event_id: Unique event identifier. + :param inputs: Inputs dictionary for the event. + :param outputs: Outputs dictionary for the event. + :param start_time: Request/start timestamp. + :param end_time: Response/end timestamp. + """ + event = { + "event_id": event_id, + "label": self._monitor_settings.label, + "input_data": {"input_data": inputs}, # So it will be a single "input feature" in MLRun monitoring. + "output_data": {"output_data": outputs}, # So it will be a single "output feature" in MLRun monitoring. + "request_timestamp": start_time.strftime("%Y-%m-%d %H:%M:%S%z"), + "response_timestamp": end_time.strftime("%Y-%m-%d %H:%M:%S%z"), + } + if self._monitor_settings.debug: + if isinstance(self._monitor_settings.debug_target_list, list): + self._monitor_settings.debug_target_list.append(event) + else: + print(orjson.dumps(event, option=orjson.OPT_INDENT_2 | orjson.OPT_APPEND_NEWLINE)) + return + + self._mlrun_client.monitor(**event) + + @staticmethod + def _check_for_env_var_usage() -> bool: + """ + Check whether global env-var activated tracing is requested. + + :returns: True when ``MLRUN_MONITORING_ENABLED`` environment variable equals ``"1"``. + """ + return os.environ.get(mlrun_monitoring_env_var, "0") == "1" + + @staticmethod + def _import_from_module_path(module_path: str) -> Any: + """ + Import an object from a full module path string. + + :param module_path: Full dotted path, e.g. ``a.b.module.object``. + + :returns: The imported object. + + raise: ValueError: If ``module_path`` is not a valid Python module path. + raise: ImportError: If module cannot be imported. + raise: AttributeError: If the object name is not found in the module. + """ + try: + module_name, object_name = module_path.rsplit(".", 1) + module = importlib.import_module(module_name) + obj = getattr(module, object_name) + except ValueError as value_error: + raise ValueError( + f"The provided '{module_path}' is not valid: it must have at least one '.'. " + f"If the class is locally defined, please add '__main__.MyObject' to the path." + ) from value_error + except ImportError as import_error: + raise ImportError( + f"Could not import '{module_path}'. Tried to import '{module_name}' and failed with the following " + f"error: {import_error}." + ) from import_error + except AttributeError as attribute_error: + raise AttributeError( + f"Could not import '{object_name}'. Tried to run 'from {module_name} import {object_name}' and could " + f"not find it: {attribute_error}" + ) from attribute_error + + return obj + + +#: MLRun monitoring context variable to set when the user wraps his code with `mlrun_monitoring`. From this context +# variable LangChain will get the tracer in a thread-safe way. +mlrun_monitoring_var: ContextVar[MLRunTracer | None] = ContextVar( + "mlrun_monitoring", default=None +) + + +@contextmanager +def mlrun_monitoring(settings: MLRunTracerSettings | None = None): + """ + Context manager to enable MLRun tracing for LangChain code to monitor LangChain runs. + + Example usage:: + + from mlrun_tracer import mlrun_monitoring, MLRunTracerSettings + + settings = MLRunTracerSettings(...) + with mlrun_monitoring(settings=settings) as tracer: + # LangChain execution within this block will be traced by `tracer`. + ... + + :param settings: The settings to use to configure the tracer. + """ + mlrun_tracer = MLRunTracer(settings=settings) + token = mlrun_monitoring_var.set(mlrun_tracer) + try: + yield mlrun_tracer + finally: + mlrun_monitoring_var.reset(token) + + +# Register a hook for LangChain to apply the MLRun tracer: +register_configure_hook( + context_var=mlrun_monitoring_var, + inheritable=True, # To allow inner runs (agent that uses a tool that uses a llm...) to be traced. + env_var=mlrun_monitoring_env_var, + handle_class=MLRunTracer, +) + + +# Temporary convenient function to set up the monitoring infrastructure required for the tracer. +def setup_langchain_monitoring( + project: str | mlrun.MlrunProject = None, + function_name: str = "langchain_mlrun_function", + model_name: str = "langchain_mlrun_model", + model_endpoint_name: str = "langchain_mlrun_endpoint", + monitoring_container: str = "projects", + monitoring_stream_path: str = None, +) -> dict: + """ + Create a model endpoint in the given project to be used for LangChain monitoring with MLRun and returns the + necessary environment variables to configure the MLRun tracer client. The project should already exist and have + monitoring enabled:: + + project.set_model_monitoring_credentials( + stream_profile_name=..., + tsdb_profile_name=... + ) + + This function creates and logs dummy model and function in the specified project in order to create the model + endpoint for monitoring. It is a temporary workaround and will be added as a feature in a future MLRun version. + + :param project: The MLRun project name or object where to create the model endpoint. If None, the current active + project will be used. + :param function_name: The name of the serving function to create. + :param model_name: The name of the model to create. + :param model_endpoint_name: The name of the model endpoint to create. + :param monitoring_container: The V3IO container where the monitoring stream is located. + :param monitoring_stream_path: The V3IO stream path for monitoring. If None, + ``/model-endpoints/stream-v1`` will be used. + + :returns: A dictionary with the necessary environment variables to configure the MLRun tracer client. + + raise: MLRunInvalidArgumentError: If no project is provided and there is no current active project. + """ + import io + import time + import sys + from contextlib import redirect_stdout, redirect_stderr + import tempfile + import pickle + import json + + from mlrun.common.helpers import parse_versioned_object_uri + from mlrun.features import Feature + + class ProgressStep: + """ + A context manager to display progress of a code block with timing and optional output suppression. + """ + + def __init__(self, label: str, indent: int = 2, width: int = 40, clean: bool = True): + """ + Initialize the ProgressStep context manager. + + :param label: The label to display for the progress step. + :param indent: The number of spaces to indent the label. + :param width: The width to pad the label for alignment. + :param clean: Whether to suppress stdout and stderr during the block execution. + """ + # Store parameters: + self._label = label + self._indent = indent + self._width = width + self._clean = clean + + # Internal state: + self._start_time = None + self._sink = io.StringIO() + self._stdout_redirect = None + self._stderr_redirect = None + self._last_line_length = 0 # To track the line printed when terminals don't support '\033[K'. + + # Capture the stream currently in use (before and if clean is true and we redirect it): + self._terminal = sys.stdout + + def __enter__(self): + """ + Enter the context manager, starting the timer and printing the initial status. + """ + # Start timer: + self._start_time = time.perf_counter() + + # Print without newline (using \r to allow overwriting): + self._write(icon=" ", status="Running", new_line=False) + + # Silence all internal noise: + if self._clean: + self._stdout_redirect = redirect_stdout(self._sink) + self._stderr_redirect = redirect_stderr(self._sink) + self._stdout_redirect.__enter__() + self._stderr_redirect.__enter__() + + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + """ + Exit the context manager, stopping the timer and printing the final status. + + :param exc_type: The exception type, if any. + :param exc_val: The exception value, if any. + :param exc_tb: The exception traceback, if any. + """ + # Restore stdout/stderr: + if self._clean: + self._stdout_redirect.__exit__(exc_type, exc_val, exc_tb) + self._stderr_redirect.__exit__(exc_type, exc_val, exc_tb) + + # Calculate elapsed time: + elapsed = time.perf_counter() - self._start_time + + # Move cursor back to start of line ('\r') and overwrite ('\033[K' clears the line to the right): + if exc_type is None: + self._write(icon="✓", status=f"Done ({elapsed:.2f}s)", new_line=True) + else: + self._write(icon="✕", status="Failed", new_line=True) + + def update(self, status: str): + """ + Update the status message displayed for the progress step. + + :param status: The new status message to display. + """ + self._write(icon=" ", status=status, new_line=False) + + def _write(self, icon: str, status: str, new_line: bool): + """ + Write the progress line to the terminal, handling line clearing for terminals that do not support it. + + :param icon: The icon to display (e.g., checkmark, cross, space). + :param status: The status message to display. + :param new_line: Whether to end the line with a newline character. + """ + # Construct the basic line + line = f"\r{' ' * self._indent}[{icon}] {self._label.ljust(self._width, '.')} {status}" + + # Calculate if we need to pad with spaces to clear the old, longer line: + padding = max(0, self._last_line_length - len(line)) + + # Add spaces to clear old text (add the ANSI clear for terminals that support it): + line = f"{line}{' ' * padding}\033[K" + + # Add newline if needed: + if new_line: + line += "\n" + + # Write to terminal: + self._terminal.write(line) + self._terminal.flush() + + # Update the max length seen so far: + self._last_line_length = len(line) + + print("Creating LangChain model endpoint\n") + + # Get the project: + with ProgressStep("Loading Project"): + if project is None: + try: + project = mlrun.get_current_project(silent=False) + except mlrun.errors.MLRunInvalidArgumentError: + raise mlrun.errors.MLRunInvalidArgumentError( + "There is no current active project. Either use `mlrun.get_or_create_project` prior to " + "creating the monitoring endpoint or pass a project name to load." + ) + if isinstance(project, str): + project = mlrun.load_project(name=project) + + # Create and log the dummy model: + with ProgressStep(f"Creating Model") as progress_step: + # Check if the model already exists: + progress_step.update("Checking if model exists") + try: + dummy_model = project.get_artifact(key=model_name) + except mlrun.MLRunNotFoundError: + dummy_model = None + # If not, create and log it: + if not dummy_model: + progress_step.update(f"Logging model '{model_name}'") + with tempfile.TemporaryDirectory() as tmpdir: + # Create a dummy model file: + dummy_model_path = os.path.join(tmpdir, "for_langchain_mlrun_tracer.pkl") + with open(dummy_model_path, "wb") as f: + pickle.dump({"dummy": "model"}, f) + # Log the model: + dummy_model = project.log_model( + key=model_name, + model_file=dummy_model_path, + inputs=[Feature(value_type="str", name="input")], + outputs=[Feature(value_type='str', name="output")] + ) + + # Create and set the dummy function: + with ProgressStep("Creating Function") as progress_step: + # Check if the function already exists: + progress_step.update("Checking if function exists") + try: + dummy_function = project.get_function(key=function_name) + except mlrun.MLRunNotFoundError: + dummy_function = None + # If not, create and save it: + if not dummy_function: + progress_step.update(f"Setting function '{function_name}'") + with tempfile.TemporaryDirectory() as tmpdir: + # Create a dummy function file: + dummy_function_code = """ +def handler(context, event): + return "ok" +""" + dummy_function_path = os.path.join(tmpdir, "dummy_function.py") + with open(dummy_function_path, "w") as f: + f.write(dummy_function_code) + # Set the function in the project: + dummy_function = project.set_function( + func=dummy_function_path, name=function_name, image="mlrun/mlrun", kind="nuclio" + ) + dummy_function.save() + + # Create the model endpoint: + with ProgressStep("Creating Model Endpoint") as progress_step: + # Get the MLRun DB: + progress_step.update("Getting MLRun DB") + db = mlrun.get_run_db() + # Check if the model endpoint already exists: + progress_step.update("Checking if endpoint exists") + model_endpoint = project.list_model_endpoints(names=[model_endpoint_name]).endpoints + if model_endpoint: + model_endpoint = model_endpoint[0] + else: + progress_step.update("Creating model endpoint") + model_endpoint = mlrun.common.schemas.ModelEndpoint( + metadata=mlrun.common.schemas.ModelEndpointMetadata( + project=project.name, + name=model_endpoint_name, + endpoint_type=mlrun.common.schemas.model_monitoring.EndpointType.NODE_EP, + ), + spec=mlrun.common.schemas.ModelEndpointSpec( + function_name=dummy_function.metadata.name, + function_tag="latest", + model_path=dummy_model.uri, + model_class="CustomStream", + ), + status=mlrun.common.schemas.ModelEndpointStatus( + monitoring_mode=mm_constants.ModelMonitoringMode.enabled, + ), + ) + db.create_model_endpoint(model_endpoint=model_endpoint) + # Wait for the model endpoint UID to be set: + progress_step.update("Waiting for model endpoint") + uid_exist_flag = False + while not uid_exist_flag: + model_endpoint = project.list_model_endpoints(names=[model_endpoint_name]) + model_endpoint = model_endpoint.endpoints[0] + if model_endpoint.metadata.uid: + uid_exist_flag = True + + # Prepare the environment variables: + monitoring_stream_path = monitoring_stream_path or f"{project.name}/model-endpoints/stream-v1" + env_vars = { + "MLRUN_MONITORING_ENABLED": "1", + "MLRUN_TRACER_CLIENT_PROJECT": project.name, + "MLRUN_TRACER_CLIENT_STREAM_PATH": monitoring_stream_path, + "MLRUN_TRACER_CLIENT_CONTAINER": monitoring_container, + "MLRUN_TRACER_CLIENT_MODEL_ENDPOINT_NAME": model_endpoint.metadata.name, + "MLRUN_TRACER_CLIENT_MODEL_ENDPOINT_UID": model_endpoint.metadata.uid, + "MLRUN_TRACER_CLIENT_SERVING_FUNCTION": function_name, + } + print("\n✨ Done! LangChain monitoring model endpoint created successfully.") + print("You can now set the following environment variables to enable MLRun tracing in your LangChain code:\n") + print(json.dumps(env_vars, indent=4)) + print( + "\nTo customize the monitoring behavior, you can also set additional environment variables prefixed with " + "'MLRUN_TRACER_MONITOR_'. Refer to the MLRun tracer documentation for more details.\n" + ) + + return env_vars + + +class LangChainMonitoringApp(ModelMonitoringApplicationBase): + """ + A base monitoring application for LangChain that calculates common metrics on LangChain runs traced with the MLRun + tracer. + + The class is inheritable and can be extended to add custom metrics or override existing ones. It provides methods to + extract structured runs from the monitoring context and calculate metrics such as average latency, success rate, + token usage, and run name counts. + + If inheriting, the main method to override is `do_tracking`, which performs the tracking on the monitoring context. + """ + + def do_tracking(self, monitoring_context: MonitoringApplicationContext) -> ( + ModelMonitoringApplicationResult | + list[ModelMonitoringApplicationResult | ModelMonitoringApplicationMetric] | + dict[str, Any] + ): + """ + The main function that performs tracking on the monitoring context. The LangChain monitoring app by default + will calculate all the provided metrics on the structured runs extracted from the monitoring context sample + dataframe. + + :param monitoring_context: The monitoring context containing the sample dataframe. + + :returns: The monitoring artifacts, metrics and results. + """ + # Get the structured runs from the monitoring context: + structured_runs, _ = self.get_structured_runs(monitoring_context=monitoring_context) + + # Calculate the metrics: + average_latency = self.calculate_average_latency(structured_runs=structured_runs) + success_rate = self.calculate_success_rate(structured_runs=structured_runs) + token_usage = self.count_token_usage(structured_runs=structured_runs) + run_name_counts = self.count_run_names(structured_runs=structured_runs) + + return [ + ModelMonitoringApplicationMetric( + name="average_latency", + value=average_latency, + ), + ModelMonitoringApplicationMetric( + name="success_rate", + value=success_rate, + ), + ModelMonitoringApplicationMetric( + name="total_input_tokens", + value=token_usage["total_input_tokens"], + ), + ModelMonitoringApplicationMetric( + name="total_output_tokens", + value=token_usage["total_output_tokens"], + ), + ModelMonitoringApplicationMetric( + name="combined_total_tokens", + value=token_usage["combined_total"], + ), + *[ModelMonitoringApplicationMetric( + name=f"run_name_counts_{run_name}", + value=count, + ) for run_name, count in run_name_counts.items()], + ] + + @staticmethod + def get_structured_runs( + monitoring_context: MonitoringApplicationContext, + labels_filter: list[str] = None, + tags_filter: list[str] = None, + run_name_filter: list[str] = None, + run_type_filter: list[str] = None, + flatten_child_runs: bool = False, + ignore_child_runs: bool = False, + ignore_errored_runs: bool = False, + ) -> tuple[list[dict], list[dict]]: + """ + Get the structured runs from the monitoring context sample dataframe. The sample dataframe contains the raw + input and output data as JSON strings - the way the MLRun tracer sends them as events to MLRun monitoring. This + function parses the JSON strings into structured dictionaries that can be used for further metrics calculations + and analysis. + + :param monitoring_context: The monitoring context containing the sample dataframe. + :param labels_filter: List of labels to filter the runs. Only runs with a label appearing in this list will + remain. If None, no filtering is applied. + :param tags_filter: List of tags to filter the runs. Only runs containing at least one tag from this list will + remain. If None, no filtering is applied. + :param run_name_filter: List of run names to filter the runs. Only runs with a name appearing in this list will + remain. If None, no filtering is applied. + :param run_type_filter: List of run types to filter the runs. Only runs with a type appearing in this list will + remain. If None, no filtering is applied. + :param flatten_child_runs: Whether to flatten child runs into the main runs list. If True, all child runs will + be extracted and added to the main runs list. If False, child runs will be kept nested within their parent + runs. + :param ignore_child_runs: Whether to ignore child runs completely. If True, child runs will be removed from the + output. If False, child runs will be processed according to the other parameters. + :param ignore_errored_runs: Whether to ignore runs that resulted in errors. If True, runs with errors will be + excluded from the output. If False, errored runs will be included. + + :returns: A list of structured run dictionaries that passed the filters and a list of samples that could not be + parsed due to errors. + """ + # Retrieve the input and output samples from the monitoring context: + samples = monitoring_context.sample_df[['input', 'output']].to_dict('records') + + # Prepare to collect structured samples: + structured_samples = [] + errored_samples = [] + + # Go over all samples: + for sample in samples: + try: + # Parse the input data into structured format: + parsed_input = orjson.loads(sample['input']) + label = parsed_input['label'] + parsed_input = parsed_input["input"]["input_data"] + # Parse the output data into structured format: + parsed_output = orjson.loads(sample['output'])["output_data"] + structured_samples.extend( + LangChainMonitoringApp._collect_run( + structured_input=parsed_input, + structured_output=parsed_output, + label=label, + labels_filter=labels_filter, + tags_filter=tags_filter, + run_name_filter=run_name_filter, + run_type_filter=run_type_filter, + flatten_child_runs=flatten_child_runs, + ignore_child_runs=ignore_child_runs, + ignore_errored_runs=ignore_errored_runs, + ) + ) + except Exception: + errored_samples.append(sample) + + return structured_samples, errored_samples + + @staticmethod + def _collect_run( + structured_input: dict, + structured_output: dict, + label: str, + child_level: int = 0, + labels_filter: list[str] = None, + tags_filter: list[str] = None, + run_name_filter: list[str] = None, + run_type_filter: list[str] = None, + flatten_child_runs: bool = False, + ignore_child_runs: bool = False, + ignore_errored_runs: bool = False, + ) -> list[dict]: + """ + Recursively collect runs from the structured input and output data, applying filters as specified. + + :param structured_input: The structured input data of the run. + :param structured_output: The structured output data of the run. + :param label: The label of the run. + :param child_level: The current child level of the run (0 for root runs). + :param labels_filter: Label filter as described in `get_structured_runs`. + :param tags_filter: Tag filter as described in `get_structured_runs`. + :param run_name_filter: Run name filter as described in `get_structured_runs`. + :param run_type_filter: Run type filter as described in `get_structured_runs`. + :param flatten_child_runs: Flag to flatten child runs as described in `get_structured_runs`. + :param ignore_child_runs: Flag to ignore child runs as described in `get_structured_runs`. + :param ignore_errored_runs: Flag to ignore errored runs as described in `get_structured_runs`. + + :returns: A list of structured run dictionaries that passed the filters. + """ + # Prepare to collect runs: + runs = [] + + # Filter by label: + if labels_filter and label not in labels_filter: + return runs + + # Handle child runs: + if "child_runs" in structured_output: + # Check if we need to ignore or flatten child runs: + if ignore_child_runs: + structured_output.pop("child_runs") + elif flatten_child_runs: + # Recursively collect child runs: + child_runs = structured_output.pop("child_runs") + flattened_runs = [] + for child_run in child_runs: + flattened_runs.extend( + LangChainMonitoringApp._collect_run( + structured_input=child_run["input_data"], + structured_output=child_run["output_data"], + label=label, + child_level=child_level + 1, + tags_filter=tags_filter, + run_name_filter=run_name_filter, + run_type_filter=run_type_filter, + flatten_child_runs=flatten_child_runs, + ignore_child_runs=ignore_child_runs, + ignore_errored_runs=ignore_errored_runs, + ) + ) + runs.extend(flattened_runs) + + # Filter by tags, run name, run type, and errors: + if tags_filter and not set(structured_input["tags"]).isdisjoint(tags_filter): + return runs + if run_name_filter and structured_input["run_name"] not in run_name_filter: + return runs + if run_type_filter and structured_input["run_type"] not in run_type_filter: + return runs + if ignore_errored_runs and structured_output.get("error", None): + return runs + + # Collect the current run: + runs.append({"label": label, "input_data": structured_input, "output_data": structured_output, + "child_level": child_level}) + return runs + + @staticmethod + def iterate_structured_runs(structured_runs: list[dict]) -> Generator[dict, None, None]: + """ + Iterates over all runs in the structured samples, including child runs. + + :param structured_runs: List of structured run samples. + + :returns: A generator yielding each run structure. + """ + # TODO: Add an option to stop at a certain child level. + for structured_run in structured_runs: + if "child_runs" in structured_run['output_data']: + for child_run in structured_run['output_data']['child_runs']: + yield from LangChainMonitoringApp.iterate_structured_runs([{ + "label": structured_run['label'], + "input_data": child_run['input_data'], + "output_data": child_run['output_data'], + "child_level": structured_run['child_level'] + 1 + }]) + yield structured_run + + @staticmethod + def count_run_names(structured_runs: list[dict]) -> dict[str, int]: + """ + Counts occurrences of each run name in the structured samples. + + :param structured_runs: List of structured run samples. + + :returns: A dictionary with run names as keys and their counts as values. + """ + # TODO: Add a nice plot artifact that will draw the bar chart for what is being used the most. + # Prepare to count run names: + run_name_counts = {} + + # Go over all the runs: + for structured_run in LangChainMonitoringApp.iterate_structured_runs(structured_runs): + run_name = structured_run['input_data']['run_name'] + if run_name in run_name_counts: + run_name_counts[run_name] += 1 + else: + run_name_counts[run_name] = 1 + + return run_name_counts + + @staticmethod + def count_token_usage(structured_runs: list[dict]) -> dict: + """ + Calculates total tokens by only counting unique 'llm' type runs. + + :param structured_runs: List of structured run samples. + + :returns: A dictionary with total input tokens, total output tokens, and combined total tokens. + """ + # TODO: Add a token count per model breakdown (a dictionary of : to token counts) + # including an artifact that will plot it nicely. Pay attention that different providers use different + # keys in the response metadata. We should implement a mapping for that so each provider will have its own + # handler that will know how to extract the relevant info out of a run. + # Prepare to count tokens: + total_input_tokens = 0 + total_output_tokens = 0 + + # Go over all the LLM typed runs: + for structured_run in LangChainMonitoringApp.iterate_structured_runs(structured_runs): + # Count only LLM type runs as chain runs may include duplicative information as they accumulate the tokens + # from the child runs: + if structured_run['input_data']['run_type'] != 'llm': + continue + # Look for the token count information: + outputs = structured_run['output_data']["outputs"] + # Newer implementations should have the metadata in the `AIMessage` kwargs under generations: + if "generations" in outputs: + for generation in outputs["generations"]: # Iterate over generations. + for sample in generation: # Iterate over the generation batch. + token_usage = sample.get("message", {}).get("kwargs", {}).get("usage_metadata", {}) + if token_usage: + total_input_tokens += ( + token_usage.get('input_tokens', 0) + or token_usage.get('prompt_tokens', 0) + ) + total_output_tokens += ( + token_usage.get('output_tokens', 0) or + token_usage.get('completion_tokens', 0) + ) + continue + # Older implementations may have the metadata under `llm_output`: + if "llm_output" in outputs: + token_usage = outputs["llm_output"].get("token_usage", {}) + if token_usage: + total_input_tokens += token_usage.get('input_tokens', 0) or token_usage.get('prompt_tokens', 0) + total_output_tokens += ( + token_usage.get('output_tokens', 0) or + token_usage.get('completion_tokens', 0) + ) + + return { + "total_input_tokens": total_input_tokens, + "total_output_tokens": total_output_tokens, + "combined_total": total_input_tokens + total_output_tokens + } + + @staticmethod + def calculate_success_rate(structured_runs: list[dict]) -> float: + """ + Calculates the success rate across all runs. + + :param structured_runs: List of structured run samples. + + :returns: Success rate as a float percentage between 0 and 1. + """ + # TODO: Add an option to see errors breakdown by kind of error and maybe an option to show which run name yielded + # most of the errors with artifacts showcasing it. + successful_count = 0 + for structured_run in structured_runs: + if 'error' not in structured_run['output_data'] or structured_run['output_data']['error'] is None: + successful_count += 1 + return successful_count / len(structured_runs) if structured_runs else 0.0 + + @staticmethod + def calculate_average_latency(structured_runs: list[dict]) -> float: + """ + Calculates the average latency across all runs. + + :param structured_runs: List of structured run samples. + + :returns: Average latency in milliseconds. + """ + # TODO: Add an option to calculate latency per run name (to know which runs are slower/faster) and then return an + # artifact showcasing it. + # Prepare to calculate average latency: + total_latency = 0.0 + count = 0 + + # Go over all the root runs: + for structured_run in structured_runs: + # Skip child runs: + if structured_run["child_level"] > 0: + continue + # Check if latency is already provided: + if "latency" in structured_run['output_data']: + total_latency += structured_run['output_data']['latency'] + count += 1 + continue + # Calculate latency from timestamps: + start_time = datetime.datetime.fromisoformat(structured_run['input_data']['start_timestamp']) + end_time = datetime.datetime.fromisoformat(structured_run['output_data']['end_timestamp']) + total_latency += (end_time - start_time).total_seconds() * 1000 # Convert to milliseconds + count += 1 + + return total_latency / count if count > 0 else 0.0 diff --git a/modules/src/langchain_mlrun/notebook_images/mlrun_ui.png b/modules/src/langchain_mlrun/notebook_images/mlrun_ui.png new file mode 100644 index 0000000000000000000000000000000000000000..9785eeae3042b9e890e70c04dd7b9f966acecbac GIT binary patch literal 85919 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 V)z4=vG!P!_g3{&ldFRah{~yTu!1MqB literal 0 HcmV?d00001 diff --git a/modules/src/langchain_mlrun/requirements.txt b/modules/src/langchain_mlrun/requirements.txt new file mode 100644 index 000000000..13e656bfc --- /dev/null +++ b/modules/src/langchain_mlrun/requirements.txt @@ -0,0 +1,4 @@ +pytest +mlrun +langchain +pydantic-settings \ No newline at end of file diff --git a/modules/src/langchain_mlrun/test_langchain_mlrun.py b/modules/src/langchain_mlrun/test_langchain_mlrun.py new file mode 100644 index 000000000..c2c32a64d --- /dev/null +++ b/modules/src/langchain_mlrun/test_langchain_mlrun.py @@ -0,0 +1,932 @@ +import os +from typing import Literal, TypedDict, Annotated, Sequence, Any, Callable +from concurrent.futures import ThreadPoolExecutor +from operator import add + +import pytest +from langchain_core.language_models import LanguageModelInput +from langchain_core.runnables import Runnable, RunnableLambda +from pydantic import ValidationError + +from langchain_core.prompts import ChatPromptTemplate +from langchain_core.output_parsers import StrOutputParser +from langchain_core.tracers import Run +from langchain_core.language_models.fake_chat_models import FakeListChatModel, GenericFakeChatModel +from langchain.agents import create_agent +from langchain_core.messages import AIMessage, HumanMessage +from langchain_core.tools import tool, BaseTool + +from langgraph.graph import StateGraph, START, END +from langchain_core.messages import BaseMessage +from pydantic_settings import BaseSettings, SettingsConfigDict + +from langchain_mlrun import ( + mlrun_monitoring, + MLRunTracer, + MLRunTracerSettings, + MLRunTracerClientSettings, + MLRunTracerMonitorSettings, + mlrun_monitoring_env_var, + LangChainMonitoringApp, +) + + +def _check_openai_credentials() -> bool: + """ + Check if OpenAI API key is set in environment variables. + + :return: True if OPENAI_API_KEY is set, False otherwise. + """ + return "OPENAI_API_KEY" in os.environ + + +# Import ChatOpenAI only if OpenAI credentials are available (meaning `langchain-openai` must be installed). +if _check_openai_credentials(): + from langchain_openai import ChatOpenAI + + +class _ToolEnabledFakeModel(GenericFakeChatModel): + """ + A fake chat model that supports tool binding for running agent tracing tests. + """ + + def bind_tools( + self, + tools: Sequence[ + dict[str, Any] | type | Callable | BaseTool # noqa: UP006 + ], + *, + tool_choice: str | None = None, + **kwargs: Any, + ) -> Runnable[LanguageModelInput, AIMessage]: + return self + + +#: Tag value for testing tag filtering. +_dummy_tag = "dummy_tag" + + +def _run_simple_chain() -> str: + """ + Run a simple LangChain chain that gets a fact about a topic. + """ + # Build a simple chain: prompt -> llm -> str output parser + llm = ChatOpenAI( + model="gpt-4o-mini", + tags=[_dummy_tag] + ) if _check_openai_credentials() else ( + FakeListChatModel( + responses=[ + "MLRun is an open-source orchestrator for machine learning pipelines." + ], + tags=[_dummy_tag] + ) + ) + prompt = ChatPromptTemplate.from_template("Tell me a short fact about {topic}") + chain = prompt | llm | StrOutputParser() + + # Run the chain: + response = chain.invoke({"topic": "MLRun"}) + return response + + +def _run_simple_agent(): + """ + Run a simple LangChain agent that uses two tools to get weather and stock price. + """ + # Define the tools: + @tool + def get_weather(city: str) -> str: + """Get the current weather for a specific city.""" + return f"The weather in {city} is 22°C and sunny." + + @tool + def get_stock_price(symbol: str) -> str: + """Get the current stock price for a symbol.""" + return f"The stock price for {symbol} is $150.25." + + # Define the model: + model = ChatOpenAI( + model="gpt-4o-mini", + tags=[_dummy_tag] + ) if _check_openai_credentials() else ( + _ToolEnabledFakeModel( + messages=iter( + [ + AIMessage( + content="", + tool_calls=[ + {"name": "get_weather", "args": {"city": "London"}, "id": "call_abc123"}, + {"name": "get_stock_price", "args": {"symbol": "AAPL"}, "id": "call_def456"} + ] + ), + AIMessage(content="The weather in London is 22°C and AAPL is trading at $150.25.") + ] + ), + tags=[_dummy_tag] + ) + ) + + # Create the agent: + agent = create_agent( + model=model, + tools=[get_weather, get_stock_price], + system_prompt="You are a helpful assistant with access to tools." + ) + + # Run the agent: + return agent.invoke({"messages": ["What is the weather in London and the stock price of AAPL?"]}) + + +def _run_langgraph_graph(): + """ + Run a LangGraph agent that uses reflection to correct its answer. + """ + + # Define the graph state: + class AgentState(TypedDict): + messages: Annotated[list[BaseMessage], add] + attempts: int + + # Define the model: + model = ChatOpenAI(model="gpt-4o-mini") if _check_openai_credentials() else ( + _ToolEnabledFakeModel( + messages=iter( + [ + AIMessage(content="There are 2 'r's in Strawberry."), # Mocking the failure + AIMessage(content="I stand corrected. S-t-r-a-w-b-e-r-r-y. There are 3 'r's."), # Mocking the fix + ] + ) + ) + ) + + # Define the graph nodes and router: + def call_model(state: AgentState): + response = model.invoke(state["messages"]) + return {"messages": [response], "attempts": state["attempts"] + 1} + + def reflect_node(state: AgentState): + prompt = "Wait, count the 'r's again slowly, letter by letter. Are you sure?" + return {"messages": [HumanMessage(content=prompt)]} + + def router(state: AgentState) -> Literal["reflect", END]: + # Make sure there are 2 attempts at least for an answer: + if state["attempts"] == 1: + return "reflect" + return END + + # Build the graph: + builder = StateGraph(AgentState) + builder.add_node("model", call_model) + tagged_reflect_node = RunnableLambda(reflect_node).with_config(tags=[_dummy_tag]) + builder.add_node("reflect", tagged_reflect_node) + builder.add_edge(START, "model") + builder.add_conditional_edges("model", router) + builder.add_edge("reflect", "model") + graph = builder.compile() + + # Run the graph: + return graph.invoke({"messages": [HumanMessage(content="How many 'r's in Strawberry?")], "attempts": 0}) + + +#: List of example functions to run in tests along the full (split-run enabled) expected monitor events. +_run_suites: list[tuple[Callable, int]] = [ + (_run_simple_chain, 4), + (_run_simple_agent, 9), + (_run_langgraph_graph, 9), +] + + +#: Dummy environment variables for testing. +_dummy_environment_variables = { + "MLRUN_TRACER_CLIENT_STREAM_PATH": "dummy_stream_path", + "MLRUN_TRACER_CLIENT_CONTAINER": "dummy_container", + "MLRUN_TRACER_CLIENT_MODEL_ENDPOINT_NAME": "dummy_model_name", + "MLRUN_TRACER_CLIENT_MODEL_ENDPOINT_UID": "dummy_model_endpoint_uid", + "MLRUN_TRACER_CLIENT_SERVING_FUNCTION": "dummy_serving_function", + "MLRUN_TRACER_MONITOR_DEBUG": "true", + "MLRUN_TRACER_MONITOR_DEBUG_TARGET_LIST": "true", + "MLRUN_TRACER_MONITOR_SPLIT_RUNS": "true", +} + + +@pytest.fixture() +def auto_mode_settings(): + """ + Sets the environment variables to enable mlrun monitoring in 'auto' mode. + """ + # Set environment variables for the duration of the test: + os.environ[mlrun_monitoring_env_var] = "1" + os.environ.update(_dummy_environment_variables) + + # Reset the singleton tracer to ensure fresh initialization: + MLRunTracer._singleton_tracer = None + MLRunTracer._initialized = False + + yield + + # Remove the environment variables after the test: + os.environ.pop(mlrun_monitoring_env_var) + for env_var in _dummy_environment_variables: + os.environ.pop(env_var) + + # Reset the singleton tracer after the test: + MLRunTracer._singleton_tracer = None + MLRunTracer._initialized = False + + +@pytest.fixture +def manual_mode_settings(): + """ + Sets the mandatory client settings and debug flag for the tests. + """ + settings = MLRunTracerSettings( + client=MLRunTracerClientSettings( + stream_path="dummy_stream_path", + container="dummy_container", + model_endpoint_name="dummy_model_name", + model_endpoint_uid="dummy_model_endpoint_uid", + serving_function="dummy_serving_function", + ), + monitor=MLRunTracerMonitorSettings( + debug=True, + debug_target_list=[], + split_runs=True, # Easier to test with split runs (filters can filter per run instead of inner events) + ), + ) + + yield settings + + +def test_settings_init_via_env_vars(): + """ + Test that settings are correctly initialized from environment variables. + """ + #: First, ensure that without env vars, validation fails due to missing required fields: + try: + settings = MLRunTracerSettings() + except ValidationError: + # Now, set the environment variables for the client settings and debug flag: + os.environ.update(_dummy_environment_variables) + + # Ensure that settings are now correctly initialized from env vars: + settings = MLRunTracerSettings() + assert settings.client.stream_path == "dummy_stream_path" + assert settings.client.container == "dummy_container" + assert settings.client.model_endpoint_name == "dummy_model_name" + assert settings.client.model_endpoint_uid == "dummy_model_endpoint_uid" + assert settings.client.serving_function == "dummy_serving_function" + assert settings.monitor.debug is True + else: + raise AssertionError("Initializing settings without env vars should have failed.") + + +def test_auto_mode_singleton_thread_safety(auto_mode_settings): + """ + Test that MLRunTracer singleton initialization is thread-safe in 'auto' mode. + + :param auto_mode_settings: Fixture to set up 'auto' mode environment and settings. + """ + # Initialize a list to hold tracer instances created in different threads: + tracer_instances = [] + + # Function to initialize the tracer in a thread: + def _init_tracer(): + tracer = MLRunTracer() + return tracer + + # Use ThreadPoolExecutor to simulate concurrent tracer initialization: + num_threads = 50 + with ThreadPoolExecutor(max_workers=num_threads) as executor: + futures = [executor.submit(_init_tracer) for _ in range(num_threads)] + tracer_instances = [f.result() for f in futures] + + # Check if every single reference in the list is the exact same object: + unique_instances = set(tracer._uid for tracer in tracer_instances) + + assert len(tracer_instances) == num_threads, "Not all threads returned a tracer instance. Test cannot proceed." + assert len(unique_instances) == 1, ( + f"Thread-safety failure! {len(unique_instances)} different instances were created under high concurrency." + ) + assert tracer_instances[0] is MLRunTracer(), "The global access point should return the same singleton." + + +def test_manual_mode_multi_instances(manual_mode_settings: MLRunTracerSettings): + """ + Test that MLRunTracer allows multiple instances in 'manual' mode. + + :param manual_mode_settings: Fixture to set up 'manual' mode environment and settings. + """ + # Initialize a list to hold tracer instances created in different iterations: + tracer_instances = [] + + # Create multiple tracer instances: + num_instances = 50 + for _ in range(num_instances): + tracer = MLRunTracer(settings=manual_mode_settings) + tracer_instances.append(tracer) + + # Check if every single reference in the list is a different object: + unique_instances = set(tracer._uid for tracer in tracer_instances) + + assert len(tracer_instances) == num_instances, "Not all instances were created. Test cannot proceed." + assert len(unique_instances) == num_instances, ( + f"Manual mode failure! {len(unique_instances)} unique instances were created instead of {num_instances}." + ) + + +@pytest.mark.parametrize("run_suites", _run_suites) +def test_auto_mode(auto_mode_settings, run_suites: tuple[Callable, int]): + """ + Test that MLRunTracer in 'auto' mode captures debug target list after running a LangChain / LangGraph example code. + + :param auto_mode_settings: Fixture to set up 'auto' mode environment and settings. + + :param run_suites: The function to run with the expected monitored events. + """ + run_func, expected_events = run_suites + + tracer = MLRunTracer() + assert len(tracer.settings.monitor.debug_target_list) == 0 + + print(run_func()) + assert len(tracer.settings.monitor.debug_target_list) == expected_events + + +@pytest.mark.parametrize("run_suites", _run_suites) +def test_manual_mode(manual_mode_settings: MLRunTracerSettings, run_suites: tuple[Callable, int]): + """ + Test that MLRunTracer in 'auto' mode captures debug target list after running a LangChain / LangGraph example code. + + :param manual_mode_settings: Fixture to set up 'manual' mode environment and settings. + :param run_suites: The function to run with the expected monitored events. + """ + run_func, expected_events = run_suites + + with mlrun_monitoring(settings=manual_mode_settings) as tracer: + print(run_func()) + assert len(tracer.settings.monitor.debug_target_list) == expected_events + + +def test_labeling(manual_mode_settings: MLRunTracerSettings): + """ + Test that MLRunTracer in 'auto' mode captures debug target list after running a LangChain / LangGraph example code. + + :param manual_mode_settings: Fixture to set up 'manual' mode environment and settings. + """ + for i, (run_func, expected_events) in enumerate(_run_suites): + label = f"label_{i}" + manual_mode_settings.monitor.label = label + manual_mode_settings.monitor.debug_target_list.clear() + with mlrun_monitoring(settings=manual_mode_settings) as tracer: + print(run_func()) + assert len(tracer.settings.monitor.debug_target_list) == expected_events + for event in tracer.settings.monitor.debug_target_list: + assert event["label"] == label + + +@pytest.mark.parametrize( + "run_suites", [ + run_suite + (filtered_events,) + for run_suite, filtered_events in zip(_run_suites, [1, 2, 1]) + ] +) +def test_monitor_settings_tags_filter( + manual_mode_settings: MLRunTracerSettings, + run_suites: tuple[Callable, int, int], +): + """ + Test the `tags_filter` setting of MLRunTracer. + + :param manual_mode_settings: Fixture to set up 'manual' mode environment and settings. + :param run_suites: The function to run with the expected monitored events and filtered events. + """ + run_func, expected_events, filtered_events = run_suites + + manual_mode_settings.monitor.tags_filter = [_dummy_tag] + + with mlrun_monitoring(settings=manual_mode_settings) as tracer: + print(run_func()) + assert len(tracer.settings.monitor.debug_target_list) == filtered_events + for event in tracer.settings.monitor.debug_target_list: + assert not set(manual_mode_settings.monitor.tags_filter).isdisjoint(event["input_data"]["input_data"]["tags"]) + + +@pytest.mark.parametrize( + "run_suites", [ + run_suite + (filtered_events,) + for run_suite, filtered_events in zip(_run_suites, [1, 3, 4]) + ] +) +def test_monitor_settings_name_filter( + manual_mode_settings: MLRunTracerSettings, + run_suites: tuple[Callable, int, int], +): + """ + Test the `names_filter` setting of MLRunTracer. + + :param manual_mode_settings: Fixture to set up 'manual' mode environment and settings. + :param run_suites: The function to run with the expected monitored events and filtered events. + """ + run_func, expected_events, filtered_events = run_suites + + manual_mode_settings.monitor.names_filter = ["StrOutputParser", "get_weather", "model", "router"] + + with mlrun_monitoring(settings=manual_mode_settings) as tracer: + print(run_func()) + assert len(tracer.settings.monitor.debug_target_list) == filtered_events + for event in tracer.settings.monitor.debug_target_list: + assert event["input_data"]["input_data"]["run_name"] in manual_mode_settings.monitor.names_filter + + +@pytest.mark.parametrize( + "run_suites", [ + run_suite + (filtered_events,) + for run_suite, filtered_events in zip(_run_suites, [2, 7, 9]) + ] +) +@pytest.mark.parametrize("split_runs", [True, False]) +def test_monitor_settings_run_type_filter( + manual_mode_settings: MLRunTracerSettings, + run_suites: tuple[Callable, int, int], + split_runs: bool +): + """ + Test the `run_types_filter` setting of MLRunTracer. Will also test with split runs enabled and disabled - meaning + that when disabled, if a parent run is filtered, all its child runs are also filtered by default. In the test we + made sure that the root run is always passing the filter (hence the equal one). + + :param manual_mode_settings: Fixture to set up 'manual' mode environment and settings. + :param run_suites: The function to run with the expected monitored events and filtered events. + :param split_runs: Whether to enable split runs in the monitor settings. + """ + run_func, expected_events, filtered_events = run_suites + filtered_events = filtered_events if split_runs else 1 + + manual_mode_settings.monitor.run_types_filter = ["llm", "chain"] + manual_mode_settings.monitor.split_runs = split_runs + + def recursive_check_run_types(run: dict): + assert run["input_data"]["run_type"] in manual_mode_settings.monitor.run_types_filter + if "child_runs" in run["output_data"]: + for child_run in run["output_data"]["child_runs"]: + recursive_check_run_types(child_run) + + with mlrun_monitoring(settings=manual_mode_settings) as tracer: + print(run_func()) + assert len(tracer.settings.monitor.debug_target_list) == filtered_events + + for event in tracer.settings.monitor.debug_target_list: + event_run = { + "input_data": event["input_data"]["input_data"], + "output_data": event["output_data"]["output_data"], + } + recursive_check_run_types(run=event_run) + +@pytest.mark.parametrize("run_suites", _run_suites) +@pytest.mark.parametrize("split_runs", [True, False]) +def test_monitor_settings_full_filter( + manual_mode_settings: MLRunTracerSettings, + run_suites: tuple[Callable, int], + split_runs: bool +): + """ + Test that a complete filter (not allowing any events to pass) won't fail the tracer. + + :param manual_mode_settings: Fixture to set up 'manual' mode environment and settings. + :param run_suites: The function to run with the expected monitored events. + :param split_runs: Whether to enable split runs in the monitor settings. + """ + run_func, _ = run_suites + + manual_mode_settings.monitor.run_types_filter = ["dummy_run_type"] + manual_mode_settings.monitor.split_runs = split_runs + + with mlrun_monitoring(settings=manual_mode_settings) as tracer: + print(run_func()) + assert len(tracer.settings.monitor.debug_target_list) == 0 + + +@pytest.mark.parametrize("run_suites", _run_suites) +@pytest.mark.parametrize("split_runs", [True, False]) +@pytest.mark.parametrize("root_run_only", [True, False]) +def test_monitor_settings_split_runs_and_root_run_only( + manual_mode_settings: MLRunTracerSettings, + run_suites: tuple[Callable, int], + split_runs: bool, + root_run_only: bool, +): + """ + Test the `split_runs` setting of MLRunTracer. + + :param manual_mode_settings: Fixture to set up 'manual' mode environment and settings. + :param run_suites: The function to run with the expected monitored events. + :param split_runs: Whether to enable split runs in the monitor settings. + :param root_run_only: Whether to enable `root_run_only` in the monitor settings. + """ + run_func, expected_events = run_suites + + manual_mode_settings.monitor.split_runs = split_runs + manual_mode_settings.monitor.root_run_only = root_run_only + + with mlrun_monitoring(settings=manual_mode_settings) as tracer: + for run_iteration in range(1, 3): + print(run_func()) + if root_run_only: + assert len(tracer.settings.monitor.debug_target_list) == 1 * run_iteration + assert "child_runs" not in tracer.settings.monitor.debug_target_list[-1]["output_data"]["output_data"] + elif split_runs: + assert len(tracer.settings.monitor.debug_target_list) == expected_events * run_iteration + assert "child_runs" not in tracer.settings.monitor.debug_target_list[-1]["output_data"]["output_data"] + else: # split_runs disabled + assert len(tracer.settings.monitor.debug_target_list) == 1 * run_iteration + assert len(tracer.settings.monitor.debug_target_list[-1]["output_data"]["output_data"]["child_runs"]) != 0 + + +class _CustomRunSummarizerSettings(BaseSettings): + """ + Settings for the custom summarizer function. + """ + dummy_value: int = 21 + + model_config = SettingsConfigDict(env_prefix="TEST_CUSTOM_SUMMARIZER_SETTINGS_") + + +def _custom_run_summarizer(run: Run, settings: _CustomRunSummarizerSettings = None): + """ + A custom summarizer function for testing. + + :param run: The LangChain / LangGraph run to summarize. + :param settings: Optional settings for the summarizer. + """ + inputs = { + "run_id": run.id, + "input": run.inputs, + "from_settings": settings.dummy_value if settings else 0, + } + + def count_llm_calls(r: Run) -> int: + if not r.child_runs: + return 1 if r.run_type == "llm" else 0 + return sum(count_llm_calls(child) for child in r.child_runs) + + def count_tool_calls(r: Run) -> int: + if not r.child_runs: + return 1 if r.run_type == "tool" else 0 + return sum(count_tool_calls(child) for child in r.child_runs) + + outputs = { + "llm_calls": count_llm_calls(run), + "tool_calls": count_tool_calls(run), + "output": run.outputs + } + + yield inputs, outputs + + +@pytest.mark.parametrize("run_suites", _run_suites) +@pytest.mark.parametrize("run_summarizer_function", [ + _custom_run_summarizer, + "test_langchain_mlrun._custom_run_summarizer", +]) +@pytest.mark.parametrize("run_summarizer_settings", [ + _CustomRunSummarizerSettings(dummy_value=12), + "test_langchain_mlrun._CustomRunSummarizerSettings", + None, +]) +def test_monitor_settings_custom_run_summarizer( + manual_mode_settings: MLRunTracerSettings, + run_suites: tuple[Callable, int], + run_summarizer_function: Callable | str, + run_summarizer_settings: BaseSettings | str | None, +): + """ + Test the custom run summarizer that can be passed to MLRunTracer. + + :param manual_mode_settings: Fixture to set up 'manual' mode environment and settings. + :param run_suites: The function to run with the expected monitored events. + :param run_summarizer_function: The custom summarizer function or its import path. + :param run_summarizer_settings: The settings for the custom summarizer or its import path. + """ + run_func, _ = run_suites + manual_mode_settings.monitor.run_summarizer_function = run_summarizer_function + manual_mode_settings.monitor.run_summarizer_settings = run_summarizer_settings + dummy_value_for_settings_from_env = 26 + os.environ["TEST_CUSTOM_SUMMARIZER_SETTINGS_DUMMY_VALUE"] = str(dummy_value_for_settings_from_env) + + with mlrun_monitoring(settings=manual_mode_settings) as tracer: + print(run_func()) + assert len(tracer.settings.monitor.debug_target_list) == 1 + + event = tracer.settings.monitor.debug_target_list[0] + if run_summarizer_settings: + if isinstance(run_summarizer_settings, str): + assert event["input_data"]["input_data"]["from_settings"] == dummy_value_for_settings_from_env + else: + assert event["input_data"]["input_data"]["from_settings"] == run_summarizer_settings.dummy_value + else: + assert event["input_data"]["input_data"]["from_settings"] == 0 + + +def test_monitor_settings_include_errors_field_presence(manual_mode_settings: MLRunTracerSettings): + """ + Test that when `include_errors` is True, the error field is present in outputs. + When `include_errors` is False, the error field is not added to outputs. + + :param manual_mode_settings: Fixture to set up 'manual' mode environment and settings. + """ + # Run with include_errors=True (default) and verify error field is present: + manual_mode_settings.monitor.include_errors = True + + with mlrun_monitoring(settings=manual_mode_settings) as tracer: + _run_simple_chain() + assert len(tracer.settings.monitor.debug_target_list) > 0 + + for event in tracer.settings.monitor.debug_target_list: + output_data = event["output_data"]["output_data"] + assert "error" in output_data, "error field should be present when include_errors is True" + + # Now run with include_errors=False and verify error field is excluded: + manual_mode_settings.monitor.include_errors = False + manual_mode_settings.monitor.debug_target_list.clear() + + with mlrun_monitoring(settings=manual_mode_settings) as tracer: + _run_simple_chain() + assert len(tracer.settings.monitor.debug_target_list) > 0 + + for event in tracer.settings.monitor.debug_target_list: + output_data = event["output_data"]["output_data"] + assert "error" not in output_data, "error field should be excluded when include_errors is False" + + +def test_monitor_settings_include_full_run(manual_mode_settings: MLRunTracerSettings): + """ + Test that when `include_full_run` is True, the complete serialized run is included in outputs. + + :param manual_mode_settings: Fixture to set up 'manual' mode environment and settings. + """ + manual_mode_settings.monitor.include_full_run = True + + with mlrun_monitoring(settings=manual_mode_settings) as tracer: + _run_simple_chain() + + assert len(tracer.settings.monitor.debug_target_list) > 0 + + for event in tracer.settings.monitor.debug_target_list: + output_data = event["output_data"]["output_data"] + assert "full_run" in output_data, "full_run should be included in outputs when include_full_run is True" + # Verify the full_run contains expected run structure: + assert "inputs" in output_data["full_run"] + assert "outputs" in output_data["full_run"] + + +def test_monitor_settings_include_metadata(manual_mode_settings: MLRunTracerSettings): + """ + Test that when `include_metadata` is False, metadata is excluded from inputs. + + Note: The fake models used in tests don't produce runs with metadata, so we can only + verify the "exclude" behavior. The code only adds metadata if the run actually contains it. + + :param manual_mode_settings: Fixture to set up 'manual' mode environment and settings. + """ + # Run with include_metadata=False and verify metadata is excluded: + manual_mode_settings.monitor.include_metadata = False + + with mlrun_monitoring(settings=manual_mode_settings) as tracer: + _run_simple_chain() + assert len(tracer.settings.monitor.debug_target_list) > 0 + + # Check that metadata is not present in inputs: + for event in tracer.settings.monitor.debug_target_list: + input_data = event["input_data"]["input_data"] + assert "metadata" not in input_data, "metadata should be excluded when include_metadata is False" + + +def test_monitor_settings_include_latency(manual_mode_settings: MLRunTracerSettings): + """ + Test that when `include_latency` is False, latency is excluded from outputs. + + :param manual_mode_settings: Fixture to set up 'manual' mode environment and settings. + """ + manual_mode_settings.monitor.include_latency = False + + with mlrun_monitoring(settings=manual_mode_settings) as tracer: + _run_simple_chain() + assert len(tracer.settings.monitor.debug_target_list) > 0 + + for event in tracer.settings.monitor.debug_target_list: + assert "latency" not in event["output_data"]["output_data"], \ + "latency should be excluded when include_latency is False" + + +def test_import_from_module_path_errors(): + """ + Test that `_import_from_module_path` raises appropriate errors for invalid paths. + """ + # Test ValueError for path without a dot: + with pytest.raises(ValueError) as exc_info: + MLRunTracer._import_from_module_path("no_dot_path") + assert "must have at least one '.'" in str(exc_info.value) + + # Test ImportError for non-existent module: + with pytest.raises(ImportError) as exc_info: + MLRunTracer._import_from_module_path("nonexistent_module_xyz.SomeClass") + assert "Could not import" in str(exc_info.value) + + # Test AttributeError for non-existent attribute in existing module: + with pytest.raises(AttributeError) as exc_info: + MLRunTracer._import_from_module_path("os.nonexistent_attribute_xyz") + assert "Could not import" in str(exc_info.value) + + +#: Sample structured runs for testing LangChainMonitoringApp methods. +_sample_structured_runs = [ + { + "label": "test_label", + "child_level": 0, + "input_data": { + "run_name": "RunnableSequence", + "run_type": "chain", + "tags": ["tag1"], + "inputs": {"topic": "MLRun"}, + "start_timestamp": "2024-01-01T10:00:00+00:00", + }, + "output_data": { + "outputs": {"result": "test output"}, + "end_timestamp": "2024-01-01T10:00:01+00:00", + "error": None, + "child_runs": [ + { + "input_data": { + "run_name": "FakeListChatModel", + "run_type": "llm", + "tags": ["tag2"], + "inputs": {"prompt": "test"}, + "start_timestamp": "2024-01-01T10:00:00.100+00:00", + }, + "output_data": { + "outputs": { + "generations": [[{ + "message": { + "kwargs": { + "usage_metadata": { + "input_tokens": 10, + "output_tokens": 20, + } + } + } + }]] + }, + "end_timestamp": "2024-01-01T10:00:00.500+00:00", + "error": None, + }, + }, + ], + }, + }, + { + "label": "test_label", + "child_level": 0, + "input_data": { + "run_name": "SimpleAgent", + "run_type": "chain", + "tags": ["tag1"], + "inputs": {"query": "test query"}, + "start_timestamp": "2024-01-01T10:00:02+00:00", + }, + "output_data": { + "outputs": {"result": "agent output"}, + "end_timestamp": "2024-01-01T10:00:04+00:00", + "error": "SomeError: something went wrong", + }, + }, +] + + +def test_langchain_monitoring_app_iterate_structured_runs(): + """ + Test that `iterate_structured_runs` yields all runs including nested child runs. + """ + # Iterate over all runs: + all_runs = list(LangChainMonitoringApp.iterate_structured_runs(_sample_structured_runs)) + + # Should yield parent runs and child runs: + # - First sample: 1 parent + 1 child = 2 runs + # - Second sample: 1 parent = 1 run + # Total: 3 runs + assert len(all_runs) == 3 + + # Verify run names are as expected: + run_names = [r["input_data"]["run_name"] for r in all_runs] + assert "RunnableSequence" in run_names + assert "FakeListChatModel" in run_names + assert "SimpleAgent" in run_names + + +def test_langchain_monitoring_app_count_run_names(): + """ + Test that `count_run_names` correctly counts occurrences of each run name. + """ + counts = LangChainMonitoringApp.count_run_names(_sample_structured_runs) + + assert counts["RunnableSequence"] == 1 + assert counts["FakeListChatModel"] == 1 + assert counts["SimpleAgent"] == 1 + + +def test_langchain_monitoring_app_count_token_usage(): + """ + Test that `count_token_usage` correctly calculates total tokens from LLM runs. + """ + token_usage = LangChainMonitoringApp.count_token_usage(_sample_structured_runs) + + assert token_usage["total_input_tokens"] == 10 + assert token_usage["total_output_tokens"] == 20 + assert token_usage["combined_total"] == 30 + + +def test_langchain_monitoring_app_calculate_success_rate(): + """ + Test that `calculate_success_rate` returns the correct percentage of successful runs. + """ + success_rate = LangChainMonitoringApp.calculate_success_rate(_sample_structured_runs) + + # First run has no error, second run has error: + # Success rate should be 1/2 = 0.5 + assert success_rate == 0.5 + + # Test with empty list: + empty_rate = LangChainMonitoringApp.calculate_success_rate([]) + assert empty_rate == 0.0 + + # Test with all successful runs: + successful_runs = [_sample_structured_runs[0]] # Only the first run which has no error + all_success_rate = LangChainMonitoringApp.calculate_success_rate(successful_runs) + assert all_success_rate == 1.0 + + +def test_langchain_monitoring_app_calculate_average_latency(): + """ + Test that `calculate_average_latency` returns the correct average latency across root runs. + """ + # Calculate average latency: + avg_latency = LangChainMonitoringApp.calculate_average_latency(_sample_structured_runs) + + # First run: 10:00:00 to 10:00:01 = 1000ms + # Second run: 10:00:02 to 10:00:04 = 2000ms + # Average: (1000 + 2000) / 2 = 1500ms + assert avg_latency == 1500.0 + + # Test with empty list: + empty_latency = LangChainMonitoringApp.calculate_average_latency([]) + assert empty_latency == 0.0 + + +def test_langchain_monitoring_app_calculate_average_latency_skips_child_runs(): + """ + Test that `calculate_average_latency` skips child runs (only calculates for root runs). + """ + # Create a sample with a child run that has child_level > 0: + runs_with_child = [ + { + "label": "test", + "child_level": 0, + "input_data": {"start_timestamp": "2024-01-01T10:00:00+00:00"}, + "output_data": {"end_timestamp": "2024-01-01T10:00:01+00:00"}, + }, + { + "label": "test", + "child_level": 1, # This is a child run, should be skipped + "input_data": {"start_timestamp": "2024-01-01T10:00:00+00:00"}, + "output_data": {"end_timestamp": "2024-01-01T10:00:10+00:00"}, # 10 seconds - would skew average + }, + ] + + # Calculate average latency: + avg_latency = LangChainMonitoringApp.calculate_average_latency(runs_with_child) + + # Should only consider the root run (1000ms), not the child run: + assert avg_latency == 1000.0 + + +def test_debug_mode_stdout(manual_mode_settings: MLRunTracerSettings, capsys): + """ + Test that debug mode prints to stdout when `debug_target_list` is not set (is False). + + :param manual_mode_settings: Fixture to set up 'manual' mode environment and settings. + :param capsys: Pytest fixture to capture stdout/stderr. + """ + # Set debug mode with debug_target_list=False (should print to stdout): + manual_mode_settings.monitor.debug = True + manual_mode_settings.monitor.debug_target_list = False + + with mlrun_monitoring(settings=manual_mode_settings) as tracer: + _run_simple_chain() + + # Capture stdout: + captured = capsys.readouterr() + + # Verify that JSON output was printed to stdout: + assert "event_id" in captured.out, "Event should be printed to stdout when debug_target_list is False" + assert "input_data" in captured.out + assert "output_data" in captured.out diff --git a/noise_reduction/data/test_data.mp3 b/noise_reduction/data/test_data.mp3 deleted file mode 100644 index a330f9804f67205e2af72652151f4721ec16ff74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27972 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%0A^>F%daWyb@oIFn=mD;f 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 diff --git a/noise_reduction/data/test_data.wav b/noise_reduction/data/test_data.wav deleted file mode 100644 index a3a993c20c707b19bc4a38596e555ccb544390ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 179672 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.1.2 - entry_points: - reduce_noise: - name: reduce_noise - doc: 'Reduce noise from audio file or directory containing audio files. - - The audio files must be in .wav format. - - The cleaned audio files will be saved in the target_directory. - - For information about the noise reduction algorithm see: - - https://github.com/timsainb/noisereduce - - Notice that the saved files are in wav format, even if the original files - are in other format.' - parameters: - - name: audio_source - type: str - doc: path to audio file or directory containing audio files - - name: target_directory - type: str - doc: path to directory to save the cleaned audio files. - - name: sample_rate - type: int - doc: Number of samples in one second in the audio file. Pass `None` to keep - the original sample rate. - default: 16000 - - name: duration - type: int - doc: Duration of the audio file to clean in seconds. Pass `None` to keep the - original duration. - default: null - - name: channel - type: int - doc: Channel to clean. Pass the number of the channel to clean. To clean all - channels pass None. - default: null - - name: silence_threshold - type: float - doc: The threshold to remove silence from the audio, in dB. If None, no silence - removal is performed. - default: null - - name: use_multiprocessing - type: int - doc: Number of processes to use for cleaning the audio files. If 0, no multiprocessing - is used. - default: 0 - - name: verbose - type: bool - doc: Verbosity level. If True, display progress bar. - default: true - outputs: [] - lineno: 388 - has_varargs: false - has_kwargs: false - clean_audio: - name: clean_audio - doc: '' - parameters: - - name: self - - name: data - type: Tensor - outputs: - - type: torch.Tensor - lineno: 276 - has_varargs: false - has_kwargs: false - save_audio: - name: save_audio - doc: '' - parameters: - - name: self - - name: audio - type: ndarray - - name: target_path - type: Path - outputs: [] - lineno: 256 - has_varargs: false - has_kwargs: false - load_audio: - name: load_audio - doc: '' - parameters: - - name: self - - name: file - type: str - outputs: - - type: torch.Tensor - lineno: 268 - has_varargs: false - has_kwargs: false - update_to_wav_suffix: - name: update_to_wav_suffix - doc: '' - parameters: - - name: self - - name: audio_file - type: Path - outputs: [] - lineno: 125 - has_varargs: false - has_kwargs: false - remove_silence: - name: remove_silence - doc: Remove silence sections from the audio. - parameters: - - name: self - - name: audio - type: ndarray - doc: The audio to remove silence from. - outputs: - - doc: The audio without silence. - lineno: 134 - has_varargs: false - has_kwargs: false - reduce_noise_dfn: - name: reduce_noise_dfn - doc: 'Reduce noise from audio files using DeepFilterNet. - - For more information about the noise reduction algorithm see: - - https://github.com/Rikorose/DeepFilterNet - - Notice that the saved files are in wav format, even if the original files - are in other format.' - parameters: - - name: audio_source - type: str - doc: path to audio file or directory of audio files - - name: target_directory - type: str - doc: path to target directory to save cleaned audio files - - name: pad - type: bool - doc: whether to pad the audio file with zeros before cleaning - default: true - - name: atten_lim_db - type: int - doc: maximum attenuation in dB - default: null - - name: silence_threshold - type: float - doc: the threshold to remove silence from the audio, in dB. If None, no silence - removal is performed. - default: null - - name: use_multiprocessing - type: int - doc: Number of processes to use for cleaning the audio files. If 0, no multiprocessing - is used. - default: 0 - - name: verbose - type: bool - doc: verbosity level. If True, display progress bar and logs. - default: true - outputs: [] - lineno: 322 - has_varargs: false - has_kwargs: true - description: Reduce noise from audio files - default_handler: reduce_noise - disable_auto_mount: false - clone_target_dir: '' - env: [] - priority_class_name: '' - preemption_mode: prevent - affinity: null - tolerations: null - security_context: {} -verbose: false diff --git a/noise_reduction/item.yaml b/noise_reduction/item.yaml deleted file mode 100644 index 8ddc63f4f..000000000 --- a/noise_reduction/item.yaml +++ /dev/null @@ -1,29 +0,0 @@ -apiVersion: v1 -categories: - - data-preparation - - machine-learning -description: Reduce noise from audio files -doc: '' -example: noise_reduction.ipynb -generationDate: 2024-03-04:17-30 -hidden: false -icon: '' -labels: - author: yonatans -maintainers: [] -mlrunVersion: 1.5.2 -name: noise-reduction -platformVersion: 3.5.3 -spec: - filename: noise_reduction.py - handler: reduce_noise - image: mlrun/mlrun - kind: job - requirements: [ - librosa, - noisereduce, - deepfilternet, - torchaudio>=2.1.2, - ] -url: '' -version: 1.0.0 \ No newline at end of file diff --git a/noise_reduction/noise_reduction.ipynb b/noise_reduction/noise_reduction.ipynb deleted file mode 100644 index e4fa0a534..000000000 --- a/noise_reduction/noise_reduction.ipynb +++ /dev/null @@ -1,942 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "4e0abc60-b718-4f45-a82a-0b8759f19d3f", - "metadata": {}, - "source": [ - "# Noise Reduction\n", - "\n", - "## Table of Contents\n", - "\n", - "1. [Introduction](#Introduction)\n", - "2. [Project Setup](#Setting-up-a-project)\n", - "3. [Noise Reduction Techniques](#Noise-Reduction-Techniques)\n", - " 1. [DeepFilterNet](#DeepFilterNet)\n", - " 2. [Spectral Gating](#SpectralGating)" - ] - }, - { - "cell_type": "markdown", - "id": "9af33629-965f-4f73-9e4a-89cc4c3dacf1", - "metadata": {}, - "source": [ - "## Introduction\n", - "\n", - "Noise reduction is a crucial signal processing technique used to enhance the quality of signals by minimizing unwanted or irrelevant noise. This technique finds applications in various fields such as audio processing, image processing, telecommunications, and more. The goal is to extract the useful information from a signal while suppressing undesirable background noise." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "f9cd530d-36a7-47b1-96f8-498d338b3a1a", - "metadata": {}, - "outputs": [], - "source": [ - "import mlrun" - ] - }, - { - "cell_type": "markdown", - "id": "c659289f-01f2-4e02-b843-b39cfc0c1d63", - "metadata": {}, - "source": [ - "## Setting up a project\n", - "\n", - "First of all we need to create a project with the `noise-reduction` function" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "c4217272-85b8-4af7-afee-bc97c6c73bd9", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2024-03-04 15:54:53,561 [info] Project loaded successfully: {'project_name': 'noise-reduction'}\n" - ] - } - ], - "source": [ - "# Creating a project\n", - "project = mlrun.get_or_create_project(\"noise-reduction\")\n", - "# Importing the function from hub\n", - "noise_reduction_function = project.set_function(\"hub://noise_reduction\")" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "f7df4c3e-4e5b-47bd-a298-527d9c6fcb8f", - "metadata": {}, - "outputs": [], - "source": [ - "# Audio source can be either a single file or a directory of audio files\n", - "audio_source = \"data\"" - ] - }, - { - "cell_type": "markdown", - "id": "6c1c5109-6380-4364-b016-728523ed0ea1", - "metadata": {}, - "source": [ - "## Noise Reduction Techniques" - ] - }, - { - "attachments": { - "e48ce103-14f3-421d-82a4-823344895241.png": { - "image/png": "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" - } - }, - "cell_type": "markdown", - "id": "5c81ecee-851c-4ee8-ad3a-4d372a1bfd97", - "metadata": {}, - "source": [ - "\n", - "### 1. DeepFilterNet\n", - "![image.png](attachment:e48ce103-14f3-421d-82a4-823344895241.png)\n", - "\n", - "In order to use this technique, you simply need to use the `reduce_noise_dfn` handler.\n", - "\n", - "Reduce noise from audio files using DeepFilterNet. For more information about the noise reduction algorithm, see [DeepFilterNet GitHub](https://github.com/Rikorose/DeepFilterNet). Notice that the saved files are in wav format, even if the original files are in other formats.\n", - "\n", - "### Parameters:\n", - "\n", - "- `audio_source`: path to the audio file or directory of audio files\n", - "- `target_directory`: path to the target directory to save cleaned audio files\n", - "- `pad`: whether to pad the audio file with zeros before cleaning\n", - "- `atten_lim_db`: maximum attenuation in dB\n", - "- `silence_threshold`: the threshold to remove silence from the audio, in dB. If None, no silence removal is performed.\n", - "- `use_multiprocessing`: Number of processes to use for cleaning the audio files. If 0, no multiprocessing is used.\n", - "- `verbose`: verbosity level. If True, display progress bar and logs.\n", - "- `kwargs`: additional arguments to pass to `torchaudio.load()`. For more information, see [torchaudio.load()](https://pytorch.org/audio/stable/generated/torchaudio.load.html).\n", - "\n", - "\n", - "In the examples below, the function is running locally, for running remotely, it is required to build the function's image first (need to execute only once):\n", - "```python\n", - "noise_reduction_function.apply(mlrun.auto_mount()) # required for local files\n", - "project.build_function(\"noise-reduction\")\n", - "```\n", - "\n", - "#### 1.1. Example" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "16113524-8597-48d4-8172-76b897fee3f2", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2024-03-04 15:54:56,999 [info] Storing function: {'name': 'noise-reduce-reduce-noise-dfn', 'uid': '9732dac831784a6a8b53acab5ff83a08', 'db': 'http://mlrun-api:8080'}\n", - "> 2024-03-04 15:55:07,525 [info] logging run results to: http://mlrun-api:8080\n", - "> 2024-03-04 15:55:07,702 [info] Reducing noise from audio files.\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Noise-reduction: 0%| | 0/2 [00:00 2024-03-04 15:55:08,437 [info] Loading DeepFilterNet2 model.\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "`torchaudio.backend.common.AudioMetaData` has been moved to `torchaudio.AudioMetaData`. Please update the import path.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2024-03-04 15:55:08 | INFO | DF | Running on torch 2.1.2+cu121\n", - "2024-03-04 15:55:08 | INFO | DF | Running on host jupyter-yoni-d56767c87-678n2\n", - "> 2024-03-04 15:55:08,464 [info] Loading DeepFilterNet2 model.\n", - "2024-03-04 15:55:08 | INFO | DF | Running on torch 2.1.2+cu121\n", - "2024-03-04 15:55:08 | INFO | DF | Running on host jupyter-yoni-d56767c87-678n2\n", - "2024-03-04 15:55:08 | INFO | DF | Loading model settings of DeepFilterNet3\n", - "2024-03-04 15:55:08 | INFO | DF | Using DeepFilterNet3 model at /igz/.cache/DeepFilterNet/DeepFilterNet3\n", - "2024-03-04 15:55:08 | INFO | DF | Initializing model `deepfilternet3`\n", - "2024-03-04 15:55:08 | INFO | DF | Loading model settings of DeepFilterNet3\n", - "2024-03-04 15:55:08 | INFO | DF | Using DeepFilterNet3 model at /igz/.cache/DeepFilterNet/DeepFilterNet3\n", - "2024-03-04 15:55:08 | INFO | DF | Initializing model `deepfilternet3`\n", - "2024-03-04 15:55:08 | INFO | DF | Found checkpoint /igz/.cache/DeepFilterNet/DeepFilterNet3/checkpoints/model_120.ckpt.best with epoch 120\n", - "2024-03-04 15:55:08 | INFO | DF | Found checkpoint /igz/.cache/DeepFilterNet/DeepFilterNet3/checkpoints/model_120.ckpt.best with epoch 120\n", - "2024-03-04 15:55:08 | INFO | DF | Running on device cpu\n", - "2024-03-04 15:55:08 | INFO | DF | Running on device cpu\n", - "2024-03-04 15:55:08 | INFO | DF | Model loaded\n", - "2024-03-04 15:55:08 | INFO | DF | Model loaded\n", - "> 2024-03-04 15:55:08,635 [info] Reducing noise from test_data.mp3.\n", - "> 2024-03-04 15:55:08,636 [info] Reducing noise from test_data.wav.\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[32m2024-03-04 15:55:08\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mDF\u001b[0m | \u001b[33m\u001b[1mAudio sampling rate does not match model sampling rate (16000, 48000). Resampling...\u001b[0m\n", - "\"sinc_interpolation\" resampling method name is being deprecated and replaced by \"sinc_interp_hann\" in the next release. The default behavior remains unchanged.\n", - "The MPEG_LAYER_III subtype is unknown to TorchAudio. As a result, the bits_per_sample attribute will be set to 0. If you are seeing this warning, please report by opening an issue on github (after checking for existing/closed ones). You may otherwise ignore this warning.\n", - "\u001b[32m2024-03-04 15:55:08\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mDF\u001b[0m | \u001b[33m\u001b[1mAudio sampling rate does not match model sampling rate (16000, 48000). Resampling...\u001b[0m\n", - "\"sinc_interpolation\" resampling method name is being deprecated and replaced by \"sinc_interp_hann\" in the next release. The default behavior remains unchanged.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2024-03-04 15:55:16,701 [info] Saved cleaned audio file to clean_data/test_data.wav.\n", - "> 2024-03-04 15:55:16,706 [info] Saved cleaned audio file to clean_data/test_data_mp3.wav.\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Noise-reduction: 100%|██████████| 2/2 [00:09<00:00, 4.51s/file]" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2024-03-04 15:55:16,791 [info] Summarizing the results.\n", - "> 2024-03-04 15:55:16,792 [info] Done (2/2)\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "

\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
projectuiditerstartstatenamelabelsinputsparametersresultsartifacts
noise-reduction0Mar 04 15:54:57completednoise-reduce-reduce-noise-dfn
v3io_user=yonis
kind=local
owner=yonis
host=jupyter-yoni-d56767c87-678n2
audio_source
target_directory=./clean_data
use_multiprocessing=2
silence_threshold=50
atten_lim_db=10
successes
errors
\n", - "
\n", - "
\n", - "
\n", - " Title\n", - " ×\n", - "
\n", - " \n", - "
\n", - "
\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - }, - { - "data": { - "text/html": [ - " > to track results use the .show() or .logs() methods or click here to open in UI" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2024-03-04 15:55:17,976 [info] Run execution finished: {'status': 'completed', 'name': 'noise-reduce-reduce-noise-dfn'}\n" - ] - } - ], - "source": [ - "dfn_run = noise_reduction_function.run(\n", - " handler=\"reduce_noise_dfn\",\n", - " inputs={\"audio_source\": audio_source},\n", - " params={\n", - " \"target_directory\": \"./clean_data\",\n", - " \"use_multiprocessing\": 2,\n", - " \"silence_threshold\": 50,\n", - " \"atten_lim_db\": 10,\n", - " },\n", - " returns=[\"successes: file\", \"errors: file\"],\n", - " local=True,\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "a71ba944-1fc2-48be-b789-d57c59201939", - "metadata": {}, - "source": [ - "### Looking at the result" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "19b04cf6-5a4d-4d74-b66e-193540a900a1", - "metadata": {}, - "outputs": [ - { - "data": { - "application/json": { - "test_data.mp3": "clean_data/test_data_mp3.wav", - "test_data.wav": "clean_data/test_data.wav" - }, - "text/plain": [ - "" - ] - }, - "metadata": { - "application/json": { - "expanded": false, - "root": "root" - } - }, - "output_type": "display_data" - }, - { - "data": { - "application/json": {}, - "text/plain": [ - "" - ] - }, - "metadata": { - "application/json": { - "expanded": false, - "root": "root" - } - }, - "output_type": "display_data" - } - ], - "source": [ - "dfn_run.artifact(\"successes\").show()\n", - "dfn_run.artifact(\"errors\").show()" - ] - }, - { - "attachments": { - "68c16acf-c28e-4bb8-a453-abbebc0137ce.png": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABHoAAAIoCAIAAACZOxvkAAAMP2lDQ1BJQ0MgUHJvZmlsZQAASImVVwdYU8kWnluSkJDQAghICb0J0gkgJYQWQHoRbIQkQCgxBoKKHV1UcO1iARu6KqLYAbEjdhbB3hcLAsq6WLArb1JA133le/N9c+e//5z5z5lzZ+69A4D6Ka5YnItqAJAnKpDEhQYyxqSkMkhdgAq0ARlYAk8uL1/MiomJBLAMtn8v724CRNZec5Bp/bP/vxZNviCfBwASA3E6P5+XB/EhAPBKnlhSAABRxptPKRDLMKxAWwIDhHihDGcqcKUMpyvwPrlNQhwb4mYAVKhcriQTALU2yDMKeZlQQ60PYicRXygCQJ0BsV9e3iQ+xGkQ20AbMcQyfWb6DzqZf9NMH9LkcjOHsGIu8qISJMwX53Kn/Z/p+N8lL1c66MMKVmqWJCxONmeYt9s5kyJkmApxryg9KhpiLYg/CPlye4hRSpY0LFFhjxry8tkwZ0AXYic+NygCYkOIQ0S5UZFKPj1DGMKBGK4QdKqwgJMAsR7ECwX5wfFKm82SSXFKX2hdhoTNUvIXuBK5X5mvh9KcRJZS/3WWgKPUx9SKshKSIaZAbFEoTIqCWA1ix/yc+AilzaiiLHbUoI1EGieL3wLiOIEoNFChjxVmSELilPalefmD88U2Zwk5UUp8oCArIUyRH6yZx5XHD+eCtQlErMRBHUH+mMjBufAFQcGKuWPdAlFivFLng7ggME4xFqeIc2OU9riZIDdUxptB7JZfGK8ciycVwAWp0MczxAUxCYo48aJsbniMIh58GYgEbBAEGEAKazqYBLKBsLW3vhfeKXpCABdIQCYQAAclMzgiWd4jgtd4UAT+hEgA8ofGBcp7BaAQ8l+HWMXVAWTIewvlI3LAM4jzQATIhfdS+SjRkLck8BQywn9458LKg/Hmwirr//f8IPudYUEmUslIBz0y1ActicHEIGIYMYRoixvgfrgPHgmvAbC64Ezca3Ae3+0JzwjthMeEG4QOwp2JwmLJT1GOBh1QP0SZi/Qfc4FbQU13PBD3hepQGdfFDYAD7gb9sHB/6Nkdsmxl3LKsMH7S/tsMfngaSjuyExklDyMHkG1+Hqlmp+Y+pCLL9Y/5UcSaPpRv9lDPz/7ZP2SfD9uIny2xhdhB7Dx2GruIHcPqAQM7iTVgLdhxGR5aXU/lq2vQW5w8nhyoI/yHv8EnK8tkvlONU4/TF0VfgWCq7B0N2JPE0yTCzKwCBgt+EQQMjojnOILh4uTiCoDs+6J4fb2JlX83EN2W79y8PwDwPTkwMHD0Oxd+EoD9nnD7H/nO2TDhp0MVgAtHeFJJoYLDZRcCfEuow52mD4yBObCB83EBHsAHBIBgEA6iQQJIARNg9FlwnUvAFDADzAUloAwsA6vBerAJbAU7wR5wANSDY+A0OAcugzZwA9yDq6cTvAB94B34jCAICaEhdEQfMUEsEXvEBWEifkgwEonEISlIGpKJiBApMgOZh5QhK5D1yBakGtmPHEFOIxeRduQO8gjpQV4jn1AMpaLaqBFqhY5EmSgLjUAT0PFoJjoZLULno0vQtWgVuhutQ0+jl9EbaAf6Au3HAKaK6WKmmAPGxNhYNJaKZWASbBZWipVjVVgt1gif8zWsA+vFPuJEnI4zcAe4gsPwRJyHT8Zn4Yvx9fhOvA5vxq/hj/A+/BuBRjAk2BO8CRzCGEImYQqhhFBO2E44TDgL91In4R2RSNQlWhM94V5MIWYTpxMXEzcQ9xJPEduJT4j9JBJJn2RP8iVFk7ikAlIJaR1pN+kk6Sqpk/RBRVXFRMVFJUQlVUWkUqxSrrJL5YTKVZUulc9kDbIl2ZscTeaTp5GXkreRG8lXyJ3kzxRNijXFl5JAyabMpayl1FLOUu5T3qiqqpqpeqnGqgpV56iuVd2nekH1kepHqhbVjsqmjqNKqUuoO6inqHeob2g0mhUtgJZKK6AtoVXTztAe0j6o0dUc1ThqfLXZahVqdWpX1V6qk9Ut1VnqE9SL1MvVD6pfUe/VIGtYabA1uBqzNCo0jmjc0ujXpGs6a0Zr5mku1tyleVGzW4ukZaUVrMXXmq+1VeuM1hM6Rjens+k8+jz6NvpZeqc2Udtam6OdrV2mvUe7VbtPR0vHTSdJZ6pOhc5xnQ5dTNdKl6Obq7tU94DuTd1Pw4yGsYYJhi0aVjvs6rD3esP1AvQEeqV6e/Vu6H3SZ+gH6+foL9ev139ggBvYGcQaTDHYaHDWoHe49nCf4bzhpcMPDL9riBraGcYZTjfcathi2G9kbBRqJDZaZ3TGqNdY1zjAONt4lfEJ4x4TuomfidBklclJk+cMHQaLkctYy2hm9JkamoaZSk23mLaafjazNks0Kzbba/bAnGLONM8wX2XeZN5nYWIx2mKGRY3FXUuyJdMyy3KN5XnL91bWVslWC6zqrbqt9aw51kXWNdb3bWg2/jaTbapsrtsSbZm2ObYbbNvsUDt3uyy7Crsr9qi9h73QfoN9+wjCCK8RohFVI245UB1YDoUONQ6PHHUdIx2LHesdX460GJk6cvnI8yO/Obk75Tptc7rnrOUc7lzs3Oj82sXOhedS4XLdleYa4jrbtcH1lZu9m8Bto9ttd7r7aPcF7k3uXz08PSQetR49nhaeaZ6VnreY2swY5mLmBS+CV6DXbK9jXh+9PbwLvA94/+Xj4JPjs8une5T1KMGobaOe+Jr5cn23+Hb4MfzS/Db7dfib+nP9q/wfB5gH8AO2B3SxbFnZrN2sl4FOgZLAw4Hv2d7smexTQVhQaFBpUGuwVnBi8PrghyFmIZkhNSF9oe6h00NPhRHCIsKWh93iGHF4nGpOX7hn+Mzw5ghqRHzE+ojHkXaRksjG0ejo8NErR9+PsowSRdVHg2hO9MroBzHWMZNjjsYSY2NiK2KfxTnHzYg7H0+Pnxi/K/5dQmDC0oR7iTaJ0sSmJPWkcUnVSe+Tg5JXJHeMGTlm5pjLKQYpwpSGVFJqUur21P6xwWNXj+0c5z6uZNzN8dbjp46/OMFgQu6E4xPVJ3InHkwjpCWn7Ur7wo3mVnH70znplel9PDZvDe8FP4C/it8j8BWsEHRl+GasyOjO9M1cmdmT5Z9VntUrZAvXC19lh2Vvyn6fE52zI2cgNzl3b55KXlreEZGWKEfUPMl40tRJ7WJ7cYm4Y7L35NWT+yQRku35SP74/IYCbfgj3yK1kf4ifVToV1hR+GFK0pSDUzWniqa2TLObtmhaV1FI0W/T8em86U0zTGfMnfFoJmvmllnIrPRZTbPNZ8+f3TkndM7OuZS5OXN/L3YqXlH8dl7yvMb5RvPnzH/yS+gvNSVqJZKSWwt8FmxaiC8ULmxd5Lpo3aJvpfzSS2VOZeVlXxbzFl/61fnXtb8OLMlY0rrUY+nGZcRlomU3l/sv37lCc0XRiicrR6+sW8VYVbrq7eqJqy+Wu5VvWkNZI13TsTZybcM6i3XL1n1Zn7X+RkVgxd5Kw8pFle838Ddc3RiwsXaT0aayTZ82Czff3hK6pa7Kqqp8K3Fr4dZn25K2nf+N+Vv1doPtZdu/7hDt6NgZt7O52rO6epfhrqU1aI20pmf3uN1te4L2NNQ61G7Zq7u3bB/YJ933fH/a/psHIg40HWQerD1keajyMP1waR1SN62urz6rvqMhpaH9SPiRpkafxsNHHY/uOGZ6rOK4zvGlJygn5p8YOFl0sv+U+FTv6czTT5omNt07M+bM9ebY5tazEWcvnAs5d+Y86/zJC74Xjl30vnjkEvNS/WWPy3Ut7i2Hf3f//XCrR2vdFc8rDW1ebY3to9pPXPW/evpa0LVz1znXL9+IutF+M/Hm7VvjbnXc5t/uvpN759Xdwruf7825T7hf+kDjQflDw4dVf9j+sbfDo+P4o6BHLY/jH997wnvy4mn+0y+d85/RnpV3mXRVd7t0H+sJ6Wl7PvZ55wvxi8+9JX9q/ln50ublob8C/mrpG9PX+UryauD14jf6b3a8dXvb1B/T//Bd3rvP70s/6H/Y+ZH58fyn5E9dn6d8IX1Z+9X2a+O3iG/3B/IGBsRcCVf+K4DBimZkAPB6BwC0FADo8HxGGas4/8kLojizyhH4T1hxRpQXDwBq4f97bC/8u7kFwL5t8PgF9dXHARBDAyDBC6CurkN18KwmP1fKChGeAzbHfk3PSwf/pijOnD/E/XMLZKpu4Of2X5JOfJCem+crAAAAOGVYSWZNTQAqAAAACAABh2kABAAAAAEAAAAaAAAAAAACoAIABAAAAAEAAAR6oAMABAAAAAEAAAIoAAAAAIFlXtUAAEAASURBVHgB7J0H3BS11odXBEVRERs2bFixImLFLnbFXrD3ig17ufbee78qdrFivfbesIANO6CgICpFRQTF79k33ny5yezs7O5s/7+/ezGTOTlJnpmdyZmcnEzz999/Z/QnAiIgAiIgAiIgAiIgAiIgAiKQNoFWaSuUPhEQAREQAREQAREQAREQAREQgSwBmVu6D0RABERABERABERABERABESgLARkbpUFq5SKgAiIgAiIgAiIgAiIgAiIgMwt3QMiIAIiIAIiIAIiIAIiIAIiUBYCMrfKglVKRUAEREAEREAEREAEREAEREDmlu4BERABERABERABERABERABESgLAZlbZcEqpSIgAiIgAiIgAiIgAiIgAiIgc0v3gAiIgAiIgAiIgAiIgAiIgAiUhYDMrbJglVIREAEREAEREAEREAEREAERkLmle0AEREAEREAEREAEREAEREAEykJA5lZZsEqpCIiACIiACIiACIiACIiACMjc0j0gAiIgAiIgAiIgAiIgAiIgAmUh0LosWqVUBERABESgsgSGDx/++++/e3V26tSpXbt2XqYOK0Bg6tSpn3/+uVfRNNNMs8QSS3iZOhQBERABEWhsAtP8/fffjd1D9U4EREAEmoHAQgsthMXl9fTLL7/s3Lmzl6nDChAYMmRIly5dvIoWW2yx0AbzZHQoAiIgAiLQYATkTNhgF1TdEQERaEYCY8aMCW2t2WabbZFFFmlGHDXQ54EDB4atWHnllcNM5YiACIiACDQ2AZlbjX191TsREIGmIBA5uO/evTvea03R/9rr5Ntvvx02iisSZipHBERABESgsQnI3Grs66veiYAINAWBXOZWU3S+JjsZaW5pdqsmr5UaJQIiIALlJSBzq7x8pV0EREAEKkBA5lYFICev4o8//hg8eLAn37p16xVWWMHL1KEIiIAIiEDDE5C51fCXWB0UARFocAJEPJK5VVPX+IMPPpg8ebLXpGWWWWaGGWbwMnUoAiIgAiLQ8AQUCL7hL7E6KAIi0OAEMLeeeuopr5Os2ppnnnm8TB1WhkCk9StPwsrAVy0iIAIiUGsEZG7V2hVRe0RABESgMAKtWrXq2rVrYWUkXU4CkQu3FCejnMilWwREQARql4CcCWv32qhlIiACIiAC9UhAs1v1eNXUZhEQAREoEwFtc1wmsFIrAiJQfwReeeWVCRMmuO2eaaaZ1l57bZODzx57W7377rvvvPMO/3799dcLL7zwUksttdlmm2200UZuqbzpKVOmvPbaa3gAshnuDz/8wK5Z008//ZJLLrnEEkuYf5dffvm2bdvm1WMEXn755V9++cUT7tGjR/v27b1Mezhp0iTWF3311Vfsg2z+Ro4cOcccc8w333zzzjvv/PPP36tXL9YaWfmEiT///PP5559/4oknRowY8d13340aNWr22WdHj/lbY4014JlXFbYKTFyxdu3arbPOOibnt99+u+6661566aVPP/10gQUWoJv8rb/++mHIe64XfXzwwQe/+OKL71v+kPlvW5ZZbbXV6KlbS5L0hx9+eMcdd3zyySfffvvtuHHjOnbs2KlTp0022WS77baztLmFZp11Vmp3FbJqi3yiZbiZ6Bk6dKibQ5obINfO1MZrdOrUqV6RjTfeeNppp/UyvcOJEyc+/PDDQOO+5Q8etJxtl/lbbrnl0MAcqVck/pB7+Nlnn+Uettd6rrnmsni51jPOOGO8Bp0VAREQgWYhwONbfyIgAiIgAn/99RejZO/Rv+mmmxoyn332GcN676w93H777Rm/JmH4448/Hn300TPPPLMtG5lg5HruuecyQM+rEwsnUtvYsWMjy9KA0047Df2R9bqZ66233iOPPAKWSD1eJpbVwQcfjMHmavDSCy20EMaYVzA8xIL1CtqrcNddd2HheGcxdz0lBAY8//zzsV09SfcQ++eKK65I2Dv0v/766yuttJKrwU1jG19yySVGG310T5k0N4/XSA6xaUPJ+++/P5Q0Odh4oTwr9DDAchUhn1LHH388e16HZW1Ot27dsGBjlLinsK/233//eIWLLrooHy/cUkqLgAiIQNMSyDRtz9VxERABEXAJYFDZ0adN/Otf/8KeufDCC/PONTEW53u/q9BLMya+/PLLZ5llFqs8b2LxxRf/6KOPPD3e4ccffxzqoaAnZg4ZATN/FcrH5GBExY/mOcuET/zg29V/yCGHMBcX2Twyx48fH85TnXrqqdRy3nnnuXps2hvWM/fIdI09G59g6pIpvlyNMfncAGeeeWbe6SMq2nLLLQlIiKUXVnrkkUeGtUTGMvnmm29CSZPzwAMPhJqpNJc8N+QRRxyRpOVGLV8NsFRzaSOfq/Dvf//bzuOFjXFzuI70mtnIGIU6JQIiIALNQEDmVjNcZfVRBEQgPwFsBnewaNIM8ZMHlLvoootyVcMofJ999gn1583Bjy7e4rr11ltDJbvuumvYEly/ko+8XZ0MmnNZXMzn7Lnnnq5wknSMhRA5NfT4448z1xepGac1t6e33HJLoX1kugwbz1XipQ877LDIqiMz+/Tps+2224anmJfz1DJHFIrRmFyoKX7ccceFRc466yxPszn86aef8LEM5eNzDj300EhtZGJ27rTTTvHFw7M77rhjLoXKFwEREIEmISBzq0kutLopAiKQh0BBo+pwWEkOS54i62CcijtcZJEkmaussgoaIjWTyexTqIRpNE8eH8KYpUqsHAuVuDkYPJ5CDjEMsMRcseTpSIXojJzCuvfee3OtLHr00Udtw3B9zCUW37DIqSejFpLxZcOz0003XZjJAjnbTpNgUVkotvnmm3ti7iHunWGR//znP66MSTNViztfKJwk58477wwVcq0PPPDA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gAg0MwGZW8189dV3ERABERABERABERABERCBMhKQuVVGuFItAiIgAiIgAiIgAiIgAiLQzARkbjXz1VffRUAEREAEREAEREAEREAEykhA5lYZ4Uq1CIiACIiACIiACIiACIhAMxOQudXMV199FwEREAEREAEREAEREAERKCMBmVtlhCvVIiACIiACIiACIiACIiACzUxA5lYzX331XQREQAREQAREQAREQAREoIwEZG6VEa5Ui4AIiIAIiIAIiIAIiIAINDMBmVvNfPXVdxEQAREQAREQAREQAREQgTISkLlVRrhSLQIiIAIiIAIiIAIiIAIi0MwEWjdz59V3ERABERCB8hH4+++/R40a9dVXXw0bNuznn38eN27c2LFj+dcmxo8fj8y0LX+tWrUyCfPvTDPN1LFjx7nmmot/3QTpGWecsXxtlmYREAEREAERSJeAzK10eUqbCIiACDQpgZ9++um999774osvsK/M39dffz1x4sTUccw333xLO39dunSZZZZZUq9FCkVABERABEQgFQLT8GUxFUVSIgIiIAIi0FQEfvvtN+yrt99+e+DAgfw7dOjQanW/U6dO2F/LLrtsjx491lxzzQ4dOlSrJapXBERABERABDwCMrc8IDoUAREQARHISWDSpEnPP//8Y4899sorr3zyySdTp07NKVqlE9NMM03Xrl3XWWedddddF9Orffv2VWqIqhUBERABERCBLAGZW7oPREAEREAE8hBgzdXjjz/+yCOPPPXUU7/++mse6Zo5zXowTC/sLv7WW2+9tm3b1kzT1BAREAEREIFmISBzq1mutPopAiIgAoUSGD58OCbWww8//PLLL//111+FFq8p+ZlnnrlXr1477LDDhhtuOP3009dU29QYERABERCBBiYgc6uBL666JgIiIAIFE2BB76BBg4yVNXjw4ILL13wB4mpstdVW2F09e/acbrrpar69aqAIiIAIiEB9E5C5Vd/XT60XAREQgVQIsAqLKawHHnhgwIAB33zzTSo6a1zJrLPOau2u1q0Vp7fGL5eaJwIiIAL1SkDmVr1eObVbBERABFIhQIDBfv36XX755Z999lkqCutOyfzzz3/QQQftt99+c845Z901Xg0WAREQARGocQIyt2r8Aql5IiACIlAuAiNGjLjqqqtuuOEGImGUq4760Ytj4U477dSnT5+VVlqpflqtloqACIiACNQ6AZlbtX6F1D4REAERSJ0A22Rddtll/fv3//PPP1NXXu8KV1llFYyu7bbbThE16v1Sqv0iIAIiUAsEZG7VwlVQG0RABESgEgQwrh566CEMrddff70S9dVzHR07dtx///1xMpxnnnnquR9quwiIgAiIQJUJyNyq8gVQ9SIgAiJQAQLjxo276aabrrzyyuqGwcBhr0OHDsSoMP+SIIcQ8wTq4F/7N3ny5DFjxvzwww+jR4+eMmVKBfjkqoKtug4++ODjjjturrnmyiWjfBEQAREQARGIISBzKwaOTomACIhA3RMYOXLkBRdccPPNNxMSo2KdwY7q/L9/iyyyCIEoZphhhoLaQFR6DEWMLmN6YSt+/N+/SnanXbt2hx9+eN++fWebbbaC2i9hERABERABEZC5pXtABERABBqTwK+//nphy9/vv/9e7h7iete95W/llVfu1q1buUP8MRvmml4DBw4cMmRIufvIhl1YXEcccQSJctcl/SIgAiIgAg1DQOZWw1xKdUQEREAE/iGAVx6x3U866aTvv/++fFAWWmihLbfccu2118bOIpb6NNNMU7668mpmBuyll156seWvrKYXE1zHHnvsoYceypRX3lbFC/zU8rf44ovHi+msCIiACIhAXROQuVXXl0+NFwEREAGfwAsvvHDUUUcNGjTIP5HS8YorrsjuwL169Vp22WWra2Ll6tCoUaOM6fXUU08NGzYsl1gp+SzlOvHEEwmkwdqz4vRMmjRpgw02WHrppa+//vriNKiUCIiACIhAXRCQuVUXl0mNFAEREIH8BD7//PNjjjlmwIAB+UULlGjduvU666yDlcV0VqdOnQosXTVxln69++6797X8DR8+PPV2LLXUUtdccw1kCtWMMyR7fBGInymy7777Tt6JhQKUvAiIgAjUEQGZW3V0sdRUERABEYgm8PPPP59xxhlXX311uvtozTzzzJtuuikTWZtssgnRL6Lrrodc7C7Wdxm769tvv023ybvssstFF10099xzJ1d79NFHX3zxxUaeq0bww+RlJSkCIiACIlBfBGRu1df1UmtFQARE4H8IEDOdCRZsrbFjx/7PiRIO2N63d+/eO+64I/M2DbbVL9NKbPF811133XbbbRMmTCgB0v8UZXrq7LPPxrdw2mmn/Z8TUQeE4z/ssMPsGXwyBw8eXJtumbaRSoiACIiACBRNQOZW0ehUUAREQASqTIBlWgcccMAXX3yRVjsIMHjIIYegs+G3mSJs4x133HHVVVcRWD4tel27dr322mtXWWWVGIUPP/zwNttsw2ybK/Pqq6+uscYabo7SIiACIiACDUNA5lbDXEp1RAREoIkITJw48YQTTrjiiivS6vMKK6xw5JFHMqPVYNNZ8Xwwe4hlyHTTI488wsRXvHCSs0xS7bfffueee27kDl1vvvnmuuuuS5AMT9Wuu+56++23e5k6FAEREAERaAwCMrca4zqqFyIgAk1E4I033thjjz1SmdTCPCD6BXtJEc+9mf3Z2MWLiakbb7yR2Oyl30lzzDEHS7N22203F+lXX3216qqr/vjjj6F+whuyGzWlwlPKEQEREAERqHcCreq9A2q/CIiACDQPgT/++INJrR49epRuaxETr0+fPgQzxL2NNVquYdA8PG1PF1hgAaakRowYwUxXQUEvrAY3gU2FPbz99ttb440cwo1E2loUZAHerbfe6mpQWgREQAREoGEIaHarYS6lOiICItDgBN5///3dd9/9o48+KrGfRHJnOmvvvfeu62CDJUKIKY6jJjNd5513Xi7rKKasd2reeeclJgfrstZff33mJL2z7mHnzp0xfVu10jdQl4rSIiACItAIBGRuNcJVVB9EQAQam8CUKVMY/RN+sMQ47wR2P/nkkwmL17Zt28YmVnrvfvnlF2a6LrzwwnHjxpWobdFFF/3yyy/zKnn66ad79uyZV0wCIiACIiAC9UVA5lZ9XS+1VgREoOkIfPLJJ3imvfPOO6X0nGmT/fff//TTT2/4kIOlUArLYmtdcskll156KZEMw7Pp5my99dYPPvhgujqlTQREQAREoOoEZG5V/RKoASIgAiIQTYC4eZdffvnxxx/Pkq1oiWS5G2+8MfvwLr300snEJeUTwKvw/PPP51owzeifS++YPbuGDx8+33zzpadSmkRABERABKpPQG7i1b8GaoEIiIAIhASYTiEsO8HZS7G1unTp8mTLn2ytkHDyHGIG4lX44YcfsgQrealCJf/666+bbrqp0FKSFwEREAERqHECmt2q8Quk5omACDQjAaIm4FqGG2HRnZ9zzjlZ67Xvvvu2bt26aCUq6BFgvvG+++7DBv7++++9U6kcMrU1bNgwXbJUYEqJCIiACNQIAc1u1ciFUDNEQARE4B8Cjz76aPfu3Yu2tdjE6bjjjiNS/IEHHqiBe7p3FeHymXL89NNPCe1YjiiC7L712GOPpdtmaRMBERABEaguAZlb1eWv2kVABETg/wlMnTr11FNPZd/hCRMm/H9uISk20v3ggw8IY9i+fftCykm2AAKzzDILwTPefffd1VZbrYBiyUSvu+66ZIKSEgEREAERqA8Cciasj+ukVoqACDQ8gbFjx+66665PPPFEcT1t06YN3oNHH320ZrSKA1hEKcxjtic+9thj7XbGRSgJixA1nm24wnzliIAIiIAI1CMBzW7V41VTm0VABBqNAGEYcCAs2tZafvnliRRPDEPZWpW8M/AnZLfoIUOG9OrVK8V6b7jhhhS1SZUIiIAIiEB1CWh2q7r8VbsIiIAIZO69915G7RMnTiyCBdHDTzjhhFNOOYUlW0UUV5FUCBBC48YbbzzkkENK3IfaNIZAiCNGjJh++ulTaZuUiIAIiIAIVJeAZreqy1+1i4AINDUBhunnnnvuTjvtVJytteSSS77++utnnnmmbK3q3kaE0CBwfyq2Fh1hm68HHniguj1S7SIgAiIgAmkRkLmVFknpEQEREIHCCLDPUp8+fU488cTCirVIM74/6qij3nvvvZVXXrmI4iqSLoH+/fv37ds3RZ3XXnttitqkSgREQAREoIoE5ExYRfiqWgREoHkJTJo0icAYxU1iLLDAAv369Vt77bWbF18t9fy1115j++NSdqOO7A3L+ZZZZpnIU8oUAREQARGoIwKa3aqji6WmioAINAiBcePGbbTRRsXZWhtssAEhyGVr1cit8NlnnxG4P3Vbi94pInyNXGI1QwREQARKJKDZrRIBqrgIiIAIFEaAKAibbLLJRx99VFixFmn2Lz777LMJj1FEWRVJncDo0aPZemvo0KGpa0bhzDPP/N13380000zlUC6dIiACIiACFSOg2a2KoVZFIiACIpD55JNPGKAXYWsx7L7//vvZv1i2Vo3cRr/99tsWW2xRJluLPv7yyy933313jXRWzRABERABESiagMytotGpoAiIgAgURoBFPj169GB2q7Bimcziiy/+1ltvbbvttoUWlHyZCBDmpHfv3gMHDiyTfqOWgBnErixrFVIuAiIgAiJQbgIyt8pNWPpFQAREIEuAiO2s1xo7dmyhONhC9+233+7SpUuhBSVfJgKYQIcddtiAAQPKpN+qff/998tt0dm6lBABERABESgTAZlbZQIrtSIgAiLw/wTeeecd1mvhfvb/WQlSRHs/66yzHnzwwfbt2ycQl0iFCDDT+NBDD1WmMgXMqAxn1SICIiAC5SOgUBnlYyvNIiACIpAl8MEHH6yzzjqFzmu1a9fuvvvu23TTTQWxBgkwwfXpp58+1/L3wgsvjB8/vkyNnGGGGUaOHNmhQ4cy6ZdaERABERCBchOQuVVuwtIvAiLQ1ASGDBlC0PYxY8YURGGuueZ64oknunXrVlApCVeFAOu42G/amF6vvvoqO6ql24zLLrvs8MMPT1entImACIiACFSMgMytiqFWRSIgAk1H4Msvv1xrrbW+//77gnq+6KKLPvXUU507dy6olIRrgQC21htvvGFML5ZdYYmV3qoll1ySgJZ4lpauShpEQAREQAQqT0DmVuWZq0YREIGmIDB8+HBsrW+++aag3nbv3v2xxx5jdqugUhKuQQITJkx46aWXjOlVROh/t0f4K+KP6uYoLQIiIAIiUC8EZG7Vy5VSO0VABOqJAOttsLW+/vrrghq98cYb9+/fXzvbFgStLoTZEPn55583ptewYcMKbfMOO+xw7733FlpK8iIgAiIgArVAQOZWLVwFtUEERKChCDC2Zr3WZ599VlCv9thjjxtvvLFNmzYFlZJw3RHACDd2FwZYwkV9rVu3Zru2jh071l1n1WAREAEREAGZW7oHREAERCBNAj/99NO666774YcfFqT0hBNOOPvss7U+pyBo9S48depUnAyN6YXb4a+//hrTI26PE088MUZAp0RABERABGqTgMyt2rwuapUIiEBdEhg3btz6669PnLqCWn/yySefeeaZBRWRcIMRmDJlCqE1jOlFsI3Jkyd7HVxwwQW/+uqraaed1svXoQiIgAiIQI0TkLlV4xdIzRMBEagbAsxO9OzZ88033yyoxX379r3wwgs1r1UQtMYWnjhxIgHljemF6c4eX6a/xFDZbLPNGrvv6p0IiIAINB4BmVuNd03VIxEQgSoQwDFsm222eeSRRwqq+5BDDrnyyitlaxUEramEf/755xdffNGYXostttijjz7aVN1XZ0VABESgAQjI3GqAi6guiIAIVJ8Ai6/OO++8gtqxzz773HDDDa1atSqolISblgAbuM0zzzxN2311XAREQATqlIDMrTq9cGq2CIhADRG4/fbbd99994Ia1Lt37379+mkpTkHQJCwCIiACIiACdUdA5lbdXTI1WAREoLYIvP7664QiDGMbxLRy2223veeee4juHSOjUyIgAiIgAiIgAg1AQOZWA1xEdUEERKBqBAhFuMQSS/zwww/JW7D55ps/8MAD0003XfIikhQBERABERABEahTAlozUKcXTs0WARGoCQIEuijI1iJ0Yf/+/WVr1cTFUyNEQAREQAREoPwENLtVfsaqQQREoEEJ4EBI6AJixyXs31prrfXkk0/OOOOMCeUlJgIiIAIiIAIiUO8ENLtV71dQ7RcBEagagZ9++im5rbXqqquyb5JsrapdLVUsAiIgAiIgAtUgIHOrGtRVpwiIQEMQYOFWwn4svvjiTzzxxMwzz5xQXmIiIAIiIAIiIAKNQUDmVmNcR/VCBESgCgQ6duyYJLrgrLPOyu60HTp0qEITVaUIiIAIiIAIiEBVCcjcqip+VS4CIlDPBGabbbaNNtoovgfsrEVsDGa34sV0VgREQAREQAREoCEJyNxqyMuqTomACFSIwOGHH96qVdyD9Iorrthggw0q1BpVIwIiIAIiIAIiUGME4kYJNdZUNUcEREAEao4Agd2JBR/ZrGmmmebSSy89+OCDI88qUwREQAREQAREoBkIyNxqhqusPoqACJSRAAbVvffeu/TSS7t1LLroovgQHnHEEW6m0iIgAiIgAiIgAs1GQPtuNdsVV39FQATKQmDq1KmvvPLK999/P2HChG7duq244orMbpWlJikVAREQAREQARGoHwLpm1sDBw5kUXj79u3rB4JaKgIiIAIiIAJlJ8C+2G+99VaPHj1kipedtSoQAREQgZohkLIz4Y8//rjyyiuvsMIKNdNBNUQEREAEREAEaoLAYYcdttZaa1188cXXXHPN6NGja6JNaoQIiIAIiECZCbROV//ff/+Nwl9//TVdtdImAiIgAiIgAvVO4Pfff6cLl1xyCU6n48ePP+GEE+q9R2q/CIiACIhAXgIpz27lrU8CIiACIiACItCcBMwXyebsu3otAiIgAk1LoCzmlt4oTXs/qeMiIAIiIALxBMzCrU8//TReTGdFQAREQAQag0BZzK3GQKNeiIAIiIAIiECZCPTr169MmqVWBERABESgpgiUxdzi0x1b0Jx55pnpdvW5554bNGhQujqlTQREQAREQASqQuDPP/+sSr2qVAREQAREoJIEymJu0YFPPvnkX//6V7o92WCDDbp27ZquTmkTAREQAREQgUoSsFHg27Rpw15tlaxadYmACIiACFSeQMrmlnmL2LVb8k2v/BVVjeUgwGztpptuWg7N0ikCItA8BMzL0b4i6fh7773XPN1XT0VABESgOQmkbG65bxGAvv/++82JVb1uMALM1j755JPffvttg/VL3REBEag8ATu7VfmqVaMIiIAIiEDlCaRsbpkO2HdJ7969t9pqq1R69fnnn6eiR0pEoGgCgwcPLrqsCoqACIiACIiACIiACDQhgbKYW+4c1+OPP85q4HHjxpUId9llly1Rg4qLQIkEtthii/vuu69EJVUszv7j+Pf+8ccfVWyDqhYBEXAJDB8+nLBS77zzjpuptAiIgAiIQCMRSNncsvNaLqP11ltv3nnnHTVqlJuptAiUSGDXXXfde++9S1SSt/jhhx/evn17K7bLLrvYdN0ljjnmmKWWWqpnz55113I1WAQalcCll15KWKnu3buX2EG+cvIxaPLkySXqUXEREAEREIHUCaRsboXtY2qLyEu///77lClTwrNF5CiOUxHQGrLInXfeecstt5S1a999990VV1wxYcIEW0tdB242jdcvyF5NJUSgkgT++uuvp59+mhojv0uW2JK77757xx13PPTQQ0vUo+IiIAIiIAKpE0jZ3HLdCFNp6/HHH9+6dWscLexHux9//DEVzVIiAnkJzDfffKHM2LFjw8z6ypl99tnrq8FqrQg0AAHeYj/88EOZOmI+aE6aNKlM+qW27giMHj06rc/cddd3NVgEao1AyuZWzEe74iwxvsTzRfDCCy+04IrTY4sr0RgEpk6dWq2O3HzzzdWqOq16f/7557RUSY8IiEChBEaMGFFokbzyuJDklZFA8xBgpe7cc8+9zjrrVKDLX3zxxR577FHXC5srQElVNDmBlM2t//znP+UAqp9xOajWtc7ddtutWu2v3++FMV9DqgVT9YpA8xB48cUXy9fZgw46qHzKpbnuCGBu0Wa2MKlAy/v379+vXz98Wav4GbQC3VQVIlAKgTTNLVaGEL2glNaorAgkJEDEy4SSqYudddZZqeusjELNDFeGs2oRgUgC5dgqHYexr7/+2lb34IMP2rQSzUxgmWWWofuVeebbWhZccMFmZq6+i0AMgTTNra5du8bUZH+QMTJJ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2Ai9S0ImyhEBERABERABCOgVqdtABERABJqEQH2EymiSi6FuioAIiIAIiIAIiIAIiIAINBIBmVuNdDXVFxEQAREQAREQAREQAREQgRoiIHOrhi6GmiICIiACIiACIiACIiACItBIBGRuNdLVVF9EQAREQAREQAREQAREQARqiEBqgeDDPj366KMTJ04M85UjAiIgAiIgAk1O4O6779bOKE1+D6j7IiACTUKgjJEJm4SguikCIiACIiACIiACIiACIiACkQTkTBiJRZkiIAIiIAIiIAIiIAIiIAIiUCoBmVulElR5ERABERABERABERABERABEYgkIHMrEosyRUAEREAEREAEREAEREAERKBUAjK3SiWo8iIgAiIgAiIgAiIgAiIgAiIQSUDmViQWZYqACIiACIiACIiACIiACIhAqQRkbpVKUOVFQAREQAREQAREQAREQAREIJKAzK1ILMoUAREQAREQAREQAREQAREQgVIJyNwqlaDKi4AIiIAIiIAIiIAIiIAIiEAkAZlbkViUKQIiIAIiIAIiIAIiIAIiIAKlEpC5VSpBlRcBERABERABERABERABERCBSAIytyKxKFMEREAEREAEREAEREAEREAESiUgc6tUgiovAiIgAiIgAiIgAiIgAiIgApEEWkfm5sp8Yrs1p5vun5M//pgZ9Xtm5pajFzKZvRbM/D4xezBkTKZtJmP0Tmg5O/90mVGTs6mpmcwcmYzRQM4CM2VaTZvNHzc+M12bzIgpGSM/byYzfSazSKfsqcHfZjq1y0w/febLn7OHs7fK/DE107FDNv3t2Gwtxl78K5OZsVWmw6yZ33/Pnhr9e6bjDJk2LU2db95M27aZv/7KTJqUPfXp55m/M5kuS2bTUyZn6MW0LW2gIA2baabMlCnZU/PPn+nQIfMXLc5kHn0xM1fbzNSW9IjJmU84m8ksmD2Tocc0daY22fSfUzKt22RemJL5IXuUGZ/JHNE+8+uv2fTff2d+mpr5OpvMUNvcmSw3CvJHUept1dKN3yZlaP4HLfkbzpRZaKFsd4yGEaMzY6i3palzd8y8+V3ms0ym73JZURr26WeZeVCK8haBWWbJpn/4ITNyVObDTKZFKtN2uszPk7MN5m/GTGaWaTPtW8QgA97RYzK3tpxaLJPZuF2mY8fswYgR2QsHZLrP36eTspdvzhmyaSoa+Wu2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IeAQcAg4BBwCDgGHgEPAIeDULUcDDgGHgEPAIeAQcAg4BBwCDgGHgENgUhBw6takwOoqdQg4BBwCDgGHgEPAIeAQcAg4BBwCTt1yNOAQcAg4BBwCDgGHgEPAIeAQcAg4BCYFAaduTQqsrlKHgEPAIeAQcAg4BBwCDgGHgEPAIeDULUcDDgGHgEPAIeAQcAg4BBwCDgGHgENgUhBw6takwOoqdQg4BBwCDgGHgEPAIeAQcAg4BBwCTt1yNOAQcAg4BBwCDgGHgEPAIeAQcAg4BCYFAaduTQqsrlKHgEPAIeAQcAg4BBwCDgGHgEPAIeDULUcDDgGHgEPAIeAQcAg4BBwCDgGHgENgUhBw6takwOoqdQg4BBwCDgGHgEPAIeAQcAg4BBwCTt1yNOAQcAg4BBwCDgGHgEPAIeAQcAg4BCYFAaduTQqsrlKHgEPAIeAQcAg4BBwCDgGHgEPAIeDULUcDDgGHgEPAIeAQcAg4BBwCDgGHgENgUhBw6takwOoqdQg4BBwCDgGHgEPAIeAQcAg4BBwCTt1yNOAQcAg4BBwCDgGHgEPAIeAQcAg4BCYFAaduTQqsrlKHgEPAIeAQcAg4BBwCDgGHgEPAIeDULUcDDgGHgEPAIeAQcAg4BBwCDgGHgENgUhBw6takwOoqdQg4BBwCDgGHgEPAIeAQcAg4BBwCTt1yNOAQcAg4BBwCDgGHgEPAIeAQcAg4BCYFAaduTQqsrlKHgEPAIeAQcAg4BBwCDgGHgEPAIeDULUcDDgGHgEPAIeAQcAg4BBwCDgGHgENgUhBw6takwOoqdQg4BBwCDgGHgEPAIeAQcAg4BBwCTt1yNOAQcAg4BBwCDgGHgEPAIeAQcAg4BCYFAaduTQqsrlKHgEPAIeAQcAg4BBwCDgGHgEPAIeDULUcDDgGHgEPAIeAQcAg4BBwCDgGHgENgUhBw6takwOoqdQg4BBwCDgGHgEPAIeAQcAg4BBwCTt1yNOAQcAg4BBwCDgGHgEPAIeAQcAg4BCYFAaduTQqsrlKHgEPAIeAQcAg4BBwCDgGHgEPAIeDULUcDDgGHgEPAIeAQcAg4BBwCDgGHgENgUhBw6takwOoqdQg4BBwCDgGHgEPAIeAQcAg4BBwCTt1yNOAQcAg4BBwCDgGHgEPAIeAQcAg4BCYFAaduTQqsrlKHgEPAIeAQcAg4BBwCDgGH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" - } - }, - "cell_type": "markdown", - "id": "4576b576-4ac0-433a-9d1d-f39225a6648d", - "metadata": {}, - "source": [ - "\n", - "### 2. Spectral Gating\n", - "![image.png](attachment:68c16acf-c28e-4bb8-a453-abbebc0137ce.png)\n", - "\n", - "In order to use this technique, you simply need to use the `reduce_noise` handler.\n", - "\n", - "Spectral gating selectively filters signal frequencies based on amplitude, offering targeted noise reduction or feature enhancement in signal processing applications.\n", - "\n", - "Reduce noise from an audio file or directory containing audio files. The audio files must be in .wav format. The cleaned audio files will be saved in the target directory. For information about the noise reduction algorithm, see [noisereduce GitHub](https://github.com/timsainb/noisereduce). Notice that the saved files are in .wav format, even if the original files are in another format.\n", - "\n", - "### Parameters:\n", - "\n", - "- `audio_source`: path to the audio file or directory containing audio files\n", - "- `target_directory`: path to the directory to save the cleaned audio files.\n", - "- `sample_rate`: Number of samples in one second in the audio file. Pass `None` to keep the original sample rate.\n", - "- `duration`: Duration of the audio file to clean in seconds. Pass `None` to keep the original duration.\n", - "- `channel`: Channel to clean. Pass the number of the channel to clean. To clean all channels, pass `None`.\n", - "- `silence_threshold`: The threshold to remove silence from the audio, in dB. If `None`, no silence removal is performed.\n", - "- `use_multiprocessing`: Number of processes to use for cleaning the audio files. If 0, no multiprocessing is used.\n", - "- `verbose`: Verbosity level. If True, display a progress bar.\n", - "\n", - "#### 2.1. Example" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "f10a5ecd-bf90-4650-a42e-d3fbfff78e52", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2024-03-04 16:07:39,378 [info] Storing function: {'name': 'noise-reduce-reduce-noise', 'uid': '6e6d6f7c3f8243b995dc1bbcf66f7544', 'db': 'http://mlrun-api:8080'}\n", - "> 2024-03-04 16:07:39,541 [info] Reducing noise from audio files.\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Noise-reduction: 0%| | 0/2 [00:00 2024-03-04 16:07:39,565 [info] Reducing noise from test_data.mp3.\n", - "> 2024-03-04 16:07:39,566 [info] Reducing noise from test_data.wav.\n", - "> 2024-03-04 16:07:46,174 [info] Saved cleaned audio file to clean_data/test_data.wav.\n", - "> 2024-03-04 16:07:46,175 [info] Saved cleaned audio file to clean_data/test_data_mp3.wav.\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Noise-reduction: 100%|██████████| 2/2 [00:06<00:00, 3.31s/file]" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2024-03-04 16:07:46,211 [info] Summarizing the results.\n", - "> 2024-03-04 16:07:46,212 [info] Done (2/2)\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
projectuiditerstartstatenamelabelsinputsparametersresultsartifacts
noise-reduction0Mar 04 16:07:39completednoise-reduce-reduce-noise
v3io_user=yonis
kind=local
owner=yonis
host=jupyter-yoni-d56767c87-678n2
audio_source
target_directory=./clean_data
use_multiprocessing=2
silence_threshold=50
successes
errors
\n", - "
\n", - "
\n", - "
\n", - " Title\n", - " ×\n", - "
\n", - " \n", - "
\n", - "
\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - }, - { - "data": { - "text/html": [ - " > to track results use the .show() or .logs() methods or click here to open in UI" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> 2024-03-04 16:07:46,389 [info] Run execution finished: {'status': 'completed', 'name': 'noise-reduce-reduce-noise'}\n" - ] - } - ], - "source": [ - "noise_reduction_run = noise_reduction_function.run(\n", - " handler=\"reduce_noise\",\n", - " inputs={\"audio_source\": audio_source},\n", - " params={\n", - " \"target_directory\": \"./clean_data\",\n", - " \"use_multiprocessing\": 2,\n", - " \"silence_threshold\": 50,\n", - " },\n", - " local=True,\n", - " returns=[\"successes: file\", \"errors: file\"],\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "699615d7-bba1-4147-ad3d-d295d794f866", - "metadata": {}, - "source": [ - "### Looking at the result" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "47c4f66a-d5d0-47e5-9842-abbe6653526b", - "metadata": {}, - "outputs": [ - { - "data": { - "application/json": { - "test_data.mp3": "clean_data/test_data_mp3.wav", - "test_data.wav": "clean_data/test_data.wav" - }, - "text/plain": [ - "" - ] - }, - "metadata": { - "application/json": { - "expanded": false, - "root": "root" - } - }, - "output_type": "display_data" - }, - { - "data": { - "application/json": {}, - "text/plain": [ - "" - ] - }, - "metadata": { - "application/json": { - "expanded": false, - "root": "root" - } - }, - "output_type": "display_data" - } - ], - "source": [ - "dfn_run.artifact(\"successes\").show()\n", - "dfn_run.artifact(\"errors\").show()" - ] - }, - { - "cell_type": "markdown", - "id": "6eeae1bb-c714-491b-91dd-f22148cd0970", - "metadata": {}, - "source": [ - "The output of this function is the same as the first one." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "mlrun-base", - "language": "python", - "name": "conda-env-mlrun-base-py" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.16" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/noise_reduction/noise_reduction.py b/noise_reduction/noise_reduction.py deleted file mode 100644 index f0fff5504..000000000 --- a/noise_reduction/noise_reduction.py +++ /dev/null @@ -1,625 +0,0 @@ -import logging -from abc import ABCMeta, abstractmethod -from multiprocessing import Process, Queue -from pathlib import Path -from typing import List, Tuple, Type, Union - -import librosa -import numpy as np -import torch -from scipy.io import wavfile -from tqdm import tqdm - -#: The value to send into multiprocessing queues to stop the process: -_MULTIPROCESSING_STOP_MARK = "STOP" - -# Get the global logger: -try: - import mlrun - - _LOGGER = mlrun.get_or_create_ctx("noise_reduce").logger -except ModuleNotFoundError: - _LOGGER = logging.getLogger() - - -class ReduceNoiseBase(metaclass=ABCMeta): - """ - Base class for noise reduction. - This class is aimed to be inherited by specific noise reduction algorithms. - You must implement the following methods: - - clean_audio: The method to clean the audio, where the noise reduction algorithm is implemented. - - save_audio: The method to save the audio to a file. - - load_audio: The method to load the audio from a file. - - After implementing the above methods, you can use the reduce_noise method to reduce noise from audio files. - """ - def __init__( - self, - target_directory: Path, - verbose: bool = True, - silence_threshold: float = None, - ): - self.target_directory = Path(target_directory) - self.verbose = verbose - self.silence_threshold = silence_threshold - - def reduce_noise(self, audio_file: Path) -> Tuple[bool, Tuple[str, str]]: - """ - Reduce noise from the given audio file. - - :param audio_file: The audio file to reduce noise from. - - :returns: A tuple of: - - a boolean indicating whether an error occurred - - a tuple of: - - audio file name - - target path in case of success / error message in case of failure. - """ - try: - if self.verbose: - _LOGGER.info(f"Reducing noise from {audio_file.name}.") - - # Load audio data: - audio = self.load_audio(file=str(audio_file)) - - # Perform noise reduction: - reduced_noise = self.clean_audio(data=audio) - - # Remove silence from the audio if necessary: - reduced_noise = self.remove_silence(audio=reduced_noise) - - # Prepare target path: - target_path = self.update_to_wav_suffix(audio_file=audio_file) - - # Save file: - self.save_audio( - audio=reduced_noise, - target_path=target_path, - ) - - if self.verbose: - _LOGGER.info(f"Saved cleaned audio file to {target_path}.") - - return False, (audio_file.name, str(target_path)) - except Exception as exception: - if self.verbose: - _LOGGER.error(f"Failed to reduce noise from {audio_file.name}.") - _LOGGER.error(f"Error: {exception}") - # Collect the error: - return True, (audio_file.name, str(exception)) - - @abstractmethod - def clean_audio(self, data) -> Union[np.ndarray, torch.Tensor]: - """ - Clean the audio from noise. Here you should implement the noise reduction algorithm. - - :param data: The audio data to clean. - - :returns: The cleaned audio. - """ - pass - - @abstractmethod - def save_audio(self, audio: np.ndarray, target_path: Path): - """ - Save the audio to a file. - - :param audio: The audio to save. - :param target_path: The target path to save the audio to. - """ - pass - - @abstractmethod - def load_audio(self, file: str) -> Tuple[Union[np.ndarray, torch.Tensor], int]: - """ - Load the audio from a file. - - :param file: The file to load the audio from. - - :returns: A tuple of: - - the audio data - - the sample rate - """ - pass - - def update_to_wav_suffix(self, audio_file: Path): - target_path = self.target_directory / audio_file.name - if target_path.suffix != ".wav": - old_suffix = target_path.suffix[1:] - target_path = target_path.with_stem(target_path.stem + f"_{old_suffix}") - return target_path.with_suffix(".wav") - else: - return target_path - - def remove_silence( - self, - audio: np.ndarray, - ): - """ - Remove silence sections from the audio. - - :param audio: The audio to remove silence from. - - :returns: The audio without silence. - """ - if self.silence_threshold is None: - return audio - - # Get the indices of the non-silent frames: - non_silent_indices = librosa.effects.split( - y=audio, - top_db=self.silence_threshold, - frame_length=2048, - hop_length=256, - ) - - # Get the non-silent audio: - non_silent_audio = np.concatenate( - [audio[:, start:end] for start, end in non_silent_indices], axis=1 - ) - - return non_silent_audio - - -class ReduceNoise(ReduceNoiseBase): - def __init__( - self, - target_directory: Path, - verbose: bool = True, - silence_threshold: float = None, - sample_rate: int = 16000, - duration: int = None, - channel: int = None, - ): - super().__init__(target_directory, verbose, silence_threshold) - self.sample_rate = sample_rate - self.duration = duration - self.channel = channel - - def save_audio(self, audio: np.ndarray, target_path: Path): - # If the audio has more than one channel, transpose it in order to save it: - if len(audio) > 1: - audio = audio.T - - wavfile.write( - filename=target_path, - rate=self.sample_rate, - data=audio, - ) - - def load_audio(self, file: str) -> np.ndarray: - data, sr = librosa.load( - path=file, - sr=self.sample_rate, - mono=False, # keep channels separate - duration=self.duration, - ) - # set sample rate: - self.sample_rate = int(sr) - - # convert to int with scaling for 16-bit integer - data *= 32767 / np.max(np.abs(data)) # re-scaling - data = data.astype(np.int16) # change data type - - # select channel - data_to_reduce = data[self.channel] if self.channel is not None else data - return data_to_reduce - - def clean_audio(self, data: np.ndarray) -> np.ndarray: - try: - import noisereduce - except ImportError as e: - raise ImportError("Please install noisereduce package") from e - - reduced_noise = noisereduce.reduce_noise(y=data, sr=self.sample_rate) - - # add channel back after noise reduction - if self.channel is not None: - # putting the channel back in the data - data[self.channel] = reduced_noise - # updating the data to save - reduced_noise = data - - return reduced_noise - - -class DFN(ReduceNoiseBase): - def __init__( - self, - target_directory: Path, - verbose: bool = True, - silence_threshold: float = None, - pad: bool = True, - atten_lim_db: int = None, - **kwargs, - ): - super().__init__(target_directory, verbose, silence_threshold) - self.pad = pad - self.atten_lim_db = atten_lim_db - self.kwargs = kwargs - - # import required packages - try: - from df.enhance import init_df - except ImportError as e: - raise ImportError("Please install deepfilternet packages") from e - - if self.verbose: - _LOGGER.info("Loading DeepFilterNet2 model.") - - # Load the model: - model, df_state, _ = init_df() - self.model = model - self.df_state = df_state - self.sample_rate = self.df_state.sr() - - def save_audio(self, audio: np.ndarray, target_path: Path): - try: - from df.enhance import save_audio - except ImportError as e: - raise ImportError("Please install deepfilternet package") from e - save_audio( - file=target_path.name, - audio=audio, - sr=self.sample_rate, - output_dir=str(self.target_directory), - ) - - def load_audio(self, file: str) -> torch.Tensor: - try: - from df.enhance import load_audio - except ImportError as e: - raise ImportError("Please install deepfilternet package") from e - audio, _ = load_audio(file=file, sr=self.sample_rate, **self.kwargs) - return audio - - def clean_audio(self, data: torch.Tensor) -> torch.Tensor: - try: - from df.enhance import enhance - except ImportError as e: - raise ImportError("Please install deepfilternet package") from e - return enhance( - model=self.model, - df_state=self.df_state, - audio=data, - pad=self.pad, - atten_lim_db=self.atten_lim_db, - ) - - -def _multiprocessing_complete_tasks( - noise_reduce_type: Type[ReduceNoiseBase], - noise_reduce_arguments: dict, - tasks_queue: Queue, - results_queue: Queue, -): - """ - Complete the tasks in the given queue and put the results in the given results queue. The function will stop when - the given tasks queue will receive the stop mark. It is aimed to be used with multiprocessing as a process. - - :param noise_reduce_type: The noise reduce type to use. - :param noise_reduce_arguments: The noisereduce initialization kwargs. - :param tasks_queue: A queue to get the tasks from. - :param results_queue: A queue to put the results in. - """ - # Initialize the reduce noise object - noise_reducer = noise_reduce_type(**noise_reduce_arguments) - - # Start listening to the tasks queue: - while True: - # Get the audio_file: - audio_file = tasks_queue.get() - if audio_file == _MULTIPROCESSING_STOP_MARK: - break - audio_file = Path(audio_file) - # Apply noise reduction and collect the result: - results_queue.put(noise_reducer.reduce_noise(audio_file=audio_file)) - - # Mark the end of the tasks: - results_queue.put(_MULTIPROCESSING_STOP_MARK) - - -def reduce_noise_dfn( - audio_source: str, - target_directory: str, - pad: bool = True, - atten_lim_db: int = None, - silence_threshold: float = None, - use_multiprocessing: int = 0, - verbose: bool = True, - **kwargs, -): - """ - Reduce noise from audio files using DeepFilterNet. - For more information about the noise reduction algorithm see: - https://github.com/Rikorose/DeepFilterNet - Notice that the saved files are in wav format, even if the original files are in other format. - - :param audio_source: path to audio file or directory of audio files - :param target_directory: path to target directory to save cleaned audio files - :param pad: whether to pad the audio file with zeros before cleaning - :param atten_lim_db: maximum attenuation in dB - :param silence_threshold: the threshold to remove silence from the audio, in dB. If None, no silence removal is - performed. - :param use_multiprocessing: Number of processes to use for cleaning the audio files. - If 0, no multiprocessing is used. - :param verbose: verbosity level. If True, display progress bar and logs. - :param kwargs: additional arguments to pass to torchaudio.load(). For more information see: - https://pytorch.org/audio/stable/generated/torchaudio.load.html - """ - if verbose: - _LOGGER.info("Reducing noise from audio files.") - - # create target directory: - target_directory = _create_target_directory(target_directory) - - # get audio files: - audio_files = _get_audio_files(audio_source) - - noise_reduce_arguments = { - "target_directory": target_directory, - "pad": pad, - "atten_lim_db": atten_lim_db, - "silence_threshold": silence_threshold, - **kwargs, - } - - if use_multiprocessing: - results = _parallel_run( - noise_reduce_type=DFN, - noise_reduce_arguments=noise_reduce_arguments, - n_workers=use_multiprocessing, - audio_files=audio_files, - description="Noise-reduction", - verbose=verbose, - ) - else: - results = _run( - noise_reduce_type=DFN, - noise_reduce_arguments=noise_reduce_arguments, - audio_files=audio_files, - description="Noise-reduction", - verbose=verbose, - ) - - return _process_results(results, verbose) - - -def reduce_noise( - audio_source: str, - target_directory: str, - sample_rate: int = 16000, - duration: int = None, - channel: int = None, - silence_threshold: float = None, - use_multiprocessing: int = 0, - verbose: bool = True, -): - """ - Reduce noise from audio file or directory containing audio files. - The audio files must be in .wav format. - The cleaned audio files will be saved in the target_directory. - For information about the noise reduction algorithm see: - https://github.com/timsainb/noisereduce - Notice that the saved files are in wav format, even if the original files are in other format. - - :param audio_source: path to audio file or directory containing audio files - :param target_directory: path to directory to save the cleaned audio files. - :param sample_rate: Number of samples in one second in the audio file. - Pass `None` to keep the original sample rate. - :param duration: Duration of the audio file to clean in seconds. - Pass `None` to keep the original duration. - :param channel: Channel to clean. Pass the number of the channel to clean. - To clean all channels pass None. - :param silence_threshold: The threshold to remove silence from the audio, in dB. - If None, no silence removal is performed. - :param use_multiprocessing: Number of processes to use for cleaning the audio files. - If 0, no multiprocessing is used. - :param verbose: Verbosity level. If True, display progress bar. - """ - if verbose: - _LOGGER.info("Reducing noise from audio files.") - - # create target directory: - target_directory = _create_target_directory(target_directory) - - # get audio files: - audio_files = _get_audio_files(audio_source) - - # Create the reduce noise object: - noise_reduce_arguments = { - "target_directory": target_directory, - "sample_rate": sample_rate, - "duration": duration, - "channel": channel, - "silence_threshold": silence_threshold, - } - - if use_multiprocessing: - results = _parallel_run( - noise_reduce_type=ReduceNoise, - noise_reduce_arguments=noise_reduce_arguments, - n_workers=use_multiprocessing, - audio_files=audio_files, - description="Noise-reduction", - verbose=verbose, - ) - else: - results = _run( - noise_reduce_type=ReduceNoise, - noise_reduce_arguments=noise_reduce_arguments, - audio_files=audio_files, - description="Noise-reduction", - verbose=verbose, - ) - - return _process_results(results, verbose) - - -def _create_target_directory(target_directory: str) -> str: - target_directory = Path(target_directory) - if not target_directory.exists(): - target_directory.mkdir(parents=True, exist_ok=True) - return str(target_directory) - - -def _get_audio_files(audio_source: str): - audio_source = Path(audio_source) - audio_files = [] - if audio_source.is_dir(): - audio_files = list(audio_source.glob("*.*")) - elif audio_source.is_file(): - audio_files.append(audio_source) - else: - raise ValueError( - f"audio_source must be a file or a directory, got {audio_source}" - ) - return audio_files - - -def _parallel_run( - noise_reduce_type: Type[ReduceNoiseBase], - noise_reduce_arguments: dict, - n_workers: int, - audio_files: List[Path], - description: str, - verbose: bool, -) -> List[Tuple[bool, Tuple[str, str]]]: - """ - Run multiple noise reduce workers with multiprocessing to complete the tasks that will be created on the provided - files using the given task creator. - - :param noise_reduce_type: The noise reduce type to use. - :param n_workers: The number of workers to use. - :param audio_files: The audio files to use. - :param description: The description to use for the progress bar. - :param verbose: Verbosity. - - :returns: The collected results. - """ - # Check the number of workers: - if n_workers > len(audio_files): - _LOGGER.warning( - f"The number of workers ({n_workers}) is larger than the number of audio files ({len(audio_files)}). " - f"Setting the number of workers to {len(audio_files)}." - ) - n_workers = len(audio_files) - - # Initialize the multiprocessing queues: - tasks_queue = Queue() - results_queue = Queue() - - # Initialize the multiprocessing processes: - task_completion_processes = [ - Process( - target=_multiprocessing_complete_tasks, - kwargs={ - "noise_reduce_type": noise_reduce_type, - "noise_reduce_arguments": noise_reduce_arguments, - "tasks_queue": tasks_queue, - "results_queue": results_queue, - }, - ) - for _ in range(n_workers) - ] - - # Start the multiprocessing processes: - for p in task_completion_processes: - p.start() - - # Put the tasks in the queue: - for audio_file in audio_files: - # tasks_queue.put(task_creator.create_task(audio_file=audio_file).to_tuple()) - tasks_queue.put(audio_file) - - # Put the stop marks in the queue: - for _ in range(n_workers): - tasks_queue.put(_MULTIPROCESSING_STOP_MARK) - - # Collect the results: - results = [] - stop_marks_counter = 0 - with tqdm( - desc=description, - unit="file", - total=len(audio_files), - disable=not verbose, - ) as progressbar: - while True: - # Get a result from the queue: - result: Tuple[bool, Tuple[str, str]] = results_queue.get() - if result == _MULTIPROCESSING_STOP_MARK: - stop_marks_counter += 1 - if stop_marks_counter == n_workers: - break - else: - # Collect the result: - results.append(result) - progressbar.update(1) - - # Wait for the processes to finish: - for p in task_completion_processes: - p.join() - - return results - - -def _run( - noise_reduce_type: Type[ReduceNoiseBase], - noise_reduce_arguments: dict, - audio_files: List[Path], - description: str, - verbose: bool, -) -> List[Tuple[bool, Tuple[str, str]]]: - """ - Run the noise reduce algorithm on the given audio files and collect the results. - - :param noise_reduce_type: The noise reduce type to use. - :param noise_reduce_arguments: The noisereduce initialization kwargs. - :param audio_files: The audio files to use. - :param description: The description to use for the progress bar. - :param verbose: Verbosity. - - :returns: The collected results. - """ - # Create the reduce noise object: - noise_reducer = noise_reduce_type(**noise_reduce_arguments) - - # Run the noise reduce algorithm on the audio files and collect the results: - results = [] - for audio_file in tqdm( - audio_files, - desc=description, - unit="file", - total=len(audio_files), - disable=not verbose, - ): - results.append(noise_reducer.reduce_noise(audio_file=audio_file)) - - return results - - -def _process_results( - results: List[Tuple[bool, Tuple[str, str]]], verbose: bool -) -> Tuple[dict, dict]: - """ - Process the results of the tasks. - - :param results: The results to process. - :param verbose: Verbosity. - - :returns: The processed results as a tuple of successes and errors. - """ - if verbose: - _LOGGER.info("Summarizing the results.") - successes = {} - errors = {} - for is_error, result in results: - if is_error: - errors[result[0]] = result[1] - else: - successes[result[0]] = result[1] - if verbose: - _LOGGER.info(f"Done ({len(successes)}/{len(successes) + len(errors)})\n") - - return successes, errors diff --git a/noise_reduction/requirements.txt b/noise_reduction/requirements.txt deleted file mode 100644 index 30934ad7c..000000000 --- a/noise_reduction/requirements.txt +++ /dev/null @@ -1,5 +0,0 @@ -tqdm -deepfilternet -librosa -noisereduce -torchaudio>=2.1.2 \ No newline at end of file diff --git a/noise_reduction/test_noise_reduction.py b/noise_reduction/test_noise_reduction.py deleted file mode 100644 index a77377565..000000000 --- a/noise_reduction/test_noise_reduction.py +++ /dev/null @@ -1,75 +0,0 @@ -import tempfile - -import mlrun -import pytest - - -@pytest.mark.parametrize( - "audio_source", - [ - "data/test_data.wav", - "data/test_data.mp3", - "data", - ], -) -def test_reduce_noise(audio_source): - # set up the project and function - artifact_path = tempfile.TemporaryDirectory().name - project = mlrun.new_project("noise-reduction") - noise_reduction_function = project.set_function( - func="function.yaml", - name="reduce_noise", - kind="job", - image="mlrun/mlrun", - ) - - # run the function - noise_reduction_run = noise_reduction_function.run( - handler="reduce_noise", - inputs={"audio_source": audio_source}, - params={ - "target_directory": artifact_path + "/data", - "sample_rate": None, - }, - local=True, - artifact_path=artifact_path, - returns=["successes: file", "errors: file"], - ) - - assert noise_reduction_run.outputs["successes"] - - -@pytest.mark.parametrize( - "audio_source", - [ - "data/test_data.wav", - "data/test_data.mp3", - "data", - ], -) -def test_reduce_noise_dfn(audio_source): - # set up the project and function - artifact_path = tempfile.TemporaryDirectory().name - project = mlrun.new_project("noise-reduction") - noise_reduction_function = project.set_function( - func="function.yaml", - name="reduce_noise", - kind="job", - image="mlrun/mlrun", - ) - - # run the function - noise_reduction_run = noise_reduction_function.run( - handler="reduce_noise_dfn", - inputs={"audio_source": audio_source}, - params={ - "target_directory": artifact_path + "/data", - "atten_lim_db": 50, - }, - local=True, - artifact_path=artifact_path, - returns=["successes: file", "errors: file"], - ) - - # assert that the function run completed successfully - assert noise_reduction_run.outputs["successes"] From daf0db8b74005ec667333e24e268966c60efb928 Mon Sep 17 00:00:00 2001 From: guy1992l Date: Fri, 9 Jan 2026 01:38:16 +0200 Subject: [PATCH 36/38] run upg to pydantic v2 --- .../src/langchain_mlrun/langchain_mlrun.py | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/modules/src/langchain_mlrun/langchain_mlrun.py b/modules/src/langchain_mlrun/langchain_mlrun.py index c26ae38f2..19b5f55aa 100644 --- a/modules/src/langchain_mlrun/langchain_mlrun.py +++ b/modules/src/langchain_mlrun/langchain_mlrun.py @@ -601,20 +601,29 @@ def _persist_run(self, run: Run, level: int = 0) -> None: def _serialize_run(self, run: Run, include_child_runs: bool) -> dict: """ - Serialize a LangChain run into a dictionary. LangChain's Run is currently in Pydantic v1 where some of its - inner models are in Pydantic V2 which causes issues when trying to serialize the whole run object directly. - - This is a workaround to properly serialize the run object. + Serialize a LangChain run into a dictionary. :param run: The run to serialize. :param include_child_runs: Whether to include child runs in the serialization. :returns: The serialized run dictionary. """ - if not include_child_runs: - serialized_run = run.dict(exclude={"child_runs"}) - else: - serialized_run = run.dict() + # In LangChain 1.2.3+, the Run model uses Pydantic v2 with child_runs marked as Field(exclude=True), so we + # must manually serialize child runs. Still excluding manually for future compatibility. In previous + # LangChain versions, Run was Pydantic v1, so we use dict. + serialized_run = ( + run.model_dump(exclude={"child_runs"}) + if hasattr(run, "model_dump") + else run.dict(exclude={"child_runs"}) + ) + + # Manually serialize child runs if needed: + if include_child_runs and run.child_runs: + serialized_run["child_runs"] = [ + self._serialize_run(child_run, include_child_runs=True) + for child_run in run.child_runs + ] + return orjson.loads(orjson.dumps(serialized_run, default=self._serialize_default)) def _serialize_default(self, obj: Any): @@ -631,7 +640,7 @@ def _serialize_default(self, obj: Any): if isinstance(obj, datetime.datetime): return obj.isoformat() if hasattr(obj, "model_dump"): - return obj.model_dump() + return orjson.loads(orjson.dumps(obj.model_dump(), default=self._serialize_default)) if hasattr(obj, "dict"): return orjson.loads(orjson.dumps(obj.dict(), default=self._serialize_default)) return str(obj) From 3f417fd015ce52a5f7a3b706265550eaa932e200 Mon Sep 17 00:00:00 2001 From: guy1992l Date: Sun, 11 Jan 2026 12:46:02 +0200 Subject: [PATCH 37/38] added kafka and mlrun-ce code preparation --- .../src/langchain_mlrun/langchain_mlrun.py | 313 ++++++++++++++++-- .../langchain_mlrun/test_langchain_mlrun.py | 139 ++++++-- 2 files changed, 389 insertions(+), 63 deletions(-) diff --git a/modules/src/langchain_mlrun/langchain_mlrun.py b/modules/src/langchain_mlrun/langchain_mlrun.py index 19b5f55aa..a12b239be 100644 --- a/modules/src/langchain_mlrun/langchain_mlrun.py +++ b/modules/src/langchain_mlrun/langchain_mlrun.py @@ -1,8 +1,9 @@ """ -MLRun to LangChain integration - a tracer that converts LangChain Run objects into MLRun monitoring events and -publishes them to a V3IO stream via MLRun endpoint monitoring format. +MLRun to LangChain integration - a tracer that converts LangChain Run objects into serializable event and send them to +MLRun monitoring. """ +from abc import ABC, abstractmethod import copy import importlib import orjson @@ -15,11 +16,10 @@ import datetime from typing import Any, Callable, Generator, Optional -import v3io from langchain_core.tracers import BaseTracer, Run from langchain_core.tracers.context import register_configure_hook -from pydantic import Field, field_validator +from pydantic import Field, field_validator, model_validator from pydantic_settings import BaseSettings, SettingsConfigDict from uuid_utils import uuid7 @@ -35,15 +35,13 @@ mlrun_monitoring_env_var = "MLRUN_MONITORING_ENABLED" -class _MLRunEndPointClient: +class _MLRunEndPointClient(ABC): """ - An MLRun model endpoint monitoring client to connect and send events on a V3IO stream. + An MLRun model endpoint monitoring client base class to connect and send events on a monitoring stream. """ def __init__( self, - monitoring_stream_path: str, - monitoring_container: str, model_endpoint_name: str, model_endpoint_uid: str, serving_function: str | RemoteRuntime, @@ -53,8 +51,6 @@ def __init__( """ Initialize an MLRun model endpoint monitoring client. - :param monitoring_stream_path: V3IO stream path. - :param monitoring_container: V3IO container name. :param model_endpoint_name: The monitoring endpoint related model name. :param model_endpoint_uid: Model endpoint unique identifier. :param serving_function: Serving function name or ``RemoteRuntime`` object. @@ -64,8 +60,6 @@ def __init__( raise: MLRunInvalidArgumentError: If there is no current active project and no `project` argument was provided. """ # Store the provided info: - self._monitoring_stream_path = monitoring_stream_path - self._monitoring_container = monitoring_container self._model_endpoint_name = model_endpoint_name self._model_endpoint_uid = model_endpoint_uid @@ -94,9 +88,6 @@ def __init__( serving_function_tag or serving_function.metadata.tag ) - # Initialize a V3IO client: - self._v3io_client = v3io.Client() - # Prepare the sample: self._event_sample = { "class": "CustomStream", @@ -120,6 +111,7 @@ def __init__( "effective_sample_count": 1, } + @abstractmethod def monitor( self, event_id: str, @@ -139,6 +131,29 @@ def monitor( :param request_timestamp: Request/start timestamp in the format of '%Y-%m-%d %H:%M:%S%z'. :param response_timestamp: Response/end timestamp in the format of '%Y-%m-%d %H:%M:%S%z'. """ + pass + + def _create_event( + self, + event_id: str, + label: str, + input_data: dict, + output_data: dict, + request_timestamp: str, + response_timestamp: str, + ) -> dict: + """ + Create a new event out of the stored event sample. + + :param event_id: Unique event identifier used as the monitored record id. + :param label: Label for the run/event. + :param input_data: Serialized input data for the run. + :param output_data: Serialized output data for the run. + :param request_timestamp: Request/start timestamp in the format of '%Y-%m-%d %H:%M:%S%z'. + :param response_timestamp: Response/end timestamp in the format of '%Y-%m-%d %H:%M:%S%z'. + + :return: The event to send to the monitoring stream. + """ # Copy the sample: event = copy.deepcopy(self._event_sample) @@ -149,6 +164,83 @@ def monitor( event["resp"]["outputs"].append(orjson.dumps(output_data).decode('utf-8')) event["resp"]["id"] = event_id + return event + + +class _V3IOMLRunEndPointClient(_MLRunEndPointClient): + """ + An MLRun model endpoint monitoring client to connect and send events on a V3IO stream. + """ + + def __init__( + self, + monitoring_stream_path: str, + monitoring_container: str, + model_endpoint_name: str, + model_endpoint_uid: str, + serving_function: str | RemoteRuntime, + serving_function_tag: str | None = None, + project: str | mlrun.projects.MlrunProject = None, + ): + """ + Initialize an MLRun model endpoint monitoring client. + + :param monitoring_stream_path: V3IO stream path. + :param monitoring_container: V3IO container name. + :param model_endpoint_name: The monitoring endpoint related model name. + :param model_endpoint_uid: Model endpoint unique identifier. + :param serving_function: Serving function name or ``RemoteRuntime`` object. + :param serving_function_tag: Optional function tag (defaults to 'latest'). + :param project: Project name or ``MlrunProject``. If ``None``, uses the current project. + + raise: MLRunInvalidArgumentError: If there is no current active project and no `project` argument was provided. + """ + super().__init__( + model_endpoint_name=model_endpoint_name, + model_endpoint_uid=model_endpoint_uid, + serving_function=serving_function, + serving_function_tag=serving_function_tag, + project=project, + ) + + import v3io + + # Store the provided info: + self._monitoring_stream_path = monitoring_stream_path + self._monitoring_container = monitoring_container + + # Initialize a V3IO client: + self._v3io_client = v3io.Client() + + def monitor( + self, + event_id: str, + label: str, + input_data: dict, + output_data: dict, + request_timestamp: str, + response_timestamp: str, + ): + """ + Monitor the provided event, sending it to the model endpoint monitoring stream. + + :param event_id: Unique event identifier used as the monitored record id. + :param label: Label for the run/event. + :param input_data: Serialized input data for the run. + :param output_data: Serialized output data for the run. + :param request_timestamp: Request/start timestamp in the format of '%Y-%m-%d %H:%M:%S%z'. + :param response_timestamp: Response/end timestamp in the format of '%Y-%m-%d %H:%M:%S%z'. + """ + # Copy the sample: + event = self._create_event( + event_id=event_id, + label=label, + input_data=input_data, + output_data=output_data, + request_timestamp=request_timestamp, + response_timestamp=response_timestamp, + ) + # Push to stream: self._v3io_client.stream.put_records( container=self._monitoring_container, @@ -157,22 +249,120 @@ def monitor( ) +class _KafkaMLRunEndPointClient(_MLRunEndPointClient): + """ + An MLRun model endpoint monitoring client to connect and send events on a Kafka stream. + """ + + def __init__( + self, + monitoring_broker: str, + monitoring_topic: str, + # TODO: Add more Kafka producer options if needed... + model_endpoint_name: str, + model_endpoint_uid: str, + serving_function: str | RemoteRuntime, + serving_function_tag: str | None = None, + project: str | mlrun.projects.MlrunProject = None, + ): + """ + Initialize an MLRun model endpoint monitoring client. + + :param monitoring_broker: Kafka broker name. + :param monitoring_topic: Kafka topic name. + TODO: Add more Kafka producer options if needed... + :param model_endpoint_name: The monitoring endpoint related model name. + :param model_endpoint_uid: Model endpoint unique identifier. + :param serving_function: Serving function name or ``RemoteRuntime`` object. + :param serving_function_tag: Optional function tag (defaults to 'latest'). + :param project: Project name or ``MlrunProject``. If ``None``, uses the current project. + + raise: MLRunInvalidArgumentError: If there is no current active project and no `project` argument was provided. + """ + super().__init__( + model_endpoint_name=model_endpoint_name, + model_endpoint_uid=model_endpoint_uid, + serving_function=serving_function, + serving_function_tag=serving_function_tag, + project=project, + ) + + import kafka + + # Store the provided info: + self._monitoring_broker = monitoring_broker + self._monitoring_topic = monitoring_topic + + # Initialize a Kafka producer: + self._kafka_producer = kafka.KafkaProducer( + ... + ) + + def monitor( + self, + event_id: str, + label: str, + input_data: dict, + output_data: dict, + request_timestamp: str, + response_timestamp: str, + ): + """ + Monitor the provided event, sending it to the model endpoint monitoring stream. + + :param event_id: Unique event identifier used as the monitored record id. + :param label: Label for the run/event. + :param input_data: Serialized input data for the run. + :param output_data: Serialized output data for the run. + :param request_timestamp: Request/start timestamp in the format of '%Y-%m-%d %H:%M:%S%z'. + :param response_timestamp: Response/end timestamp in the format of '%Y-%m-%d %H:%M:%S%z'. + """ + # Copy the sample: + event = self._create_event( + event_id=event_id, + label=label, + input_data=input_data, + output_data=output_data, + request_timestamp=request_timestamp, + response_timestamp=response_timestamp, + ) + + # Push to stream: + self._kafka_producer.send( + topic=self._monitoring_topic, + value=orjson.dumps(event), + key=self._model_endpoint_uid, + ) + + class MLRunTracerClientSettings(BaseSettings): """ MLRun tracer monitoring client configurations. These are mandatory arguments for allowing MLRun to send monitoring events to a specific model endpoint stream. """ - stream_path: str = ... + v3io_stream_path: str | None = None """ The V3IO stream path to send the events to. """ - container: str = ... + v3io_container: str | None = None """ The V3IO stream container. """ + kafka_broker: str | None = None + """ + The Kafka broker address. + """ + + kafka_topic: str | None = None + """ + The Kafka topic name. + """ + + # TODO: Add more Kafka producer options if needed... + model_endpoint_name: str = ... """ The model endpoint name. @@ -201,6 +391,27 @@ class MLRunTracerClientSettings(BaseSettings): #: Pydantic model configuration to set the environment variable prefix. model_config = SettingsConfigDict(env_prefix="MLRUN_TRACER_CLIENT_") + @model_validator(mode='after') + def check_exclusive_sets(self) -> 'MLRunTracerClientSettings': + """ + Validate that either V3IO settings or Kafka settings are provided, but not both or none. + + :return: The validated settings instance. + """ + # Define the sets + v3io_settings = all([self.v3io_container, self.v3io_stream_path]) + kafka_settings = all([self.kafka_topic, self.kafka_broker]) # TODO: Add mandatory other kafka settings + + # Make sure only one set is provided: + if v3io_settings and kafka_settings: + raise ValueError("Provide either V3IO settings OR Kafka settings, not both.") + if not v3io_settings and not kafka_settings: + raise ValueError( + "You must provide either a complete V3IO settings or complete Kafka settings. See docs for more " + "information" + ) + + return self class MLRunTracerMonitorSettings(BaseSettings): """ @@ -303,7 +514,7 @@ class MLRunTracerMonitorSettings(BaseSettings): debug: bool = False """ - If True, disable sending events to MLRun/V3IO and instead route events to `debug_target_list` + If True, disable sending events to MLRun and instead route events to `debug_target_list` or print them as JSON to stdout. Useful for unit tests and local debugging. Default: False. """ @@ -336,7 +547,7 @@ class MLRunTracerSettings(BaseSettings): """ MLRun tracer settings to configure the tracer. The settings are split into two groups: - * `client`: settings required to connect and send events to the MLRun/V3IO monitoring stream. + * `client`: settings required to connect and send events to the MLRun monitoring stream. * `monitor`: settings controlling which LangChain runs are summarized and sent and how. """ @@ -465,15 +676,7 @@ def __init__(self, settings: MLRunTracerSettings = None, **kwargs): # Initialize the MLRun endpoint client: self._mlrun_client = ( - _MLRunEndPointClient( - monitoring_stream_path=self._client_settings.stream_path, - monitoring_container=self._client_settings.container, - model_endpoint_name=self._client_settings.model_endpoint_name, - model_endpoint_uid=self._client_settings.model_endpoint_uid, - serving_function=self._client_settings.serving_function, - serving_function_tag=self._client_settings.serving_function_tag, - project=self._client_settings.project, - ) + self._get_mlrun_client() if not self._monitor_settings.debug else None ) @@ -501,6 +704,32 @@ def settings(self) -> MLRunTracerSettings: """ return self._settings + def _get_mlrun_client(self) -> _MLRunEndPointClient: + """ + Create and return an MLRun model endpoint monitoring client based on the MLRun (CE or not) and current + configuration. + + :returns: An MLRun model endpoint monitoring client. + """ + if mlrun.mlconf.is_ce_mode(): + return _KafkaMLRunEndPointClient( + # TODO: Add more Kafka producer options if needed... + model_endpoint_name=self._client_settings.model_endpoint_name, + model_endpoint_uid=self._client_settings.model_endpoint_uid, + serving_function=self._client_settings.serving_function, + serving_function_tag=self._client_settings.serving_function_tag, + project=self._client_settings.project, + ) + return _V3IOMLRunEndPointClient( + monitoring_stream_path=self._client_settings.v3io_stream_path, + monitoring_container=self._client_settings.v3io_container, + model_endpoint_name=self._client_settings.model_endpoint_name, + model_endpoint_uid=self._client_settings.model_endpoint_uid, + serving_function=self._client_settings.serving_function, + serving_function_tag=self._client_settings.serving_function_tag, + project=self._client_settings.project, + ) + def _import_custom_run_summarizer(self): """ Import or assign a custom run summarizer (and its custom settings) if configured. @@ -899,8 +1128,9 @@ def setup_langchain_monitoring( function_name: str = "langchain_mlrun_function", model_name: str = "langchain_mlrun_model", model_endpoint_name: str = "langchain_mlrun_endpoint", - monitoring_container: str = "projects", - monitoring_stream_path: str = None, + v3io_container: str = "projects", + v3io_stream_path: str = None, + # TODO: Add Kafka parameters when Kafka monitoring is supported. ) -> dict: """ Create a model endpoint in the given project to be used for LangChain monitoring with MLRun and returns the @@ -920,9 +1150,10 @@ def setup_langchain_monitoring( :param function_name: The name of the serving function to create. :param model_name: The name of the model to create. :param model_endpoint_name: The name of the model endpoint to create. - :param monitoring_container: The V3IO container where the monitoring stream is located. - :param monitoring_stream_path: The V3IO stream path for monitoring. If None, + :param v3io_container: The V3IO container where the monitoring stream is located. + :param v3io_stream_path: The V3IO stream path for monitoring. If None, ``/model-endpoints/stream-v1`` will be used. + TODO: Add Kafka parameters when Kafka monitoring is supported. :returns: A dictionary with the necessary environment variables to configure the MLRun tracer client. @@ -1149,16 +1380,28 @@ def handler(context, event): if model_endpoint.metadata.uid: uid_exist_flag = True + # Set parameters defaults: + v3io_stream_path = v3io_stream_path or f"{project.name}/model-endpoints/stream-v1" + # TODO: Support Kafka monitoring parameters defaults when Kafka monitoring is supported. + + if mlrun.mlconf.is_ce_mode(): + client_env_vars = { + "MLRUN_TRACER_CLIENT_KAFKA_...": ... + } + else: + client_env_vars = { + "MLRUN_TRACER_CLIENT_V3IO_STREAM_PATH": v3io_stream_path, + "MLRUN_TRACER_CLIENT_V3IO_CONTAINER": v3io_container, + } + # Prepare the environment variables: - monitoring_stream_path = monitoring_stream_path or f"{project.name}/model-endpoints/stream-v1" env_vars = { "MLRUN_MONITORING_ENABLED": "1", "MLRUN_TRACER_CLIENT_PROJECT": project.name, - "MLRUN_TRACER_CLIENT_STREAM_PATH": monitoring_stream_path, - "MLRUN_TRACER_CLIENT_CONTAINER": monitoring_container, "MLRUN_TRACER_CLIENT_MODEL_ENDPOINT_NAME": model_endpoint.metadata.name, "MLRUN_TRACER_CLIENT_MODEL_ENDPOINT_UID": model_endpoint.metadata.uid, "MLRUN_TRACER_CLIENT_SERVING_FUNCTION": function_name, + **client_env_vars } print("\n✨ Done! LangChain monitoring model endpoint created successfully.") print("You can now set the following environment variables to enable MLRun tracing in your LangChain code:\n") diff --git a/modules/src/langchain_mlrun/test_langchain_mlrun.py b/modules/src/langchain_mlrun/test_langchain_mlrun.py index c2c32a64d..3f54d403c 100644 --- a/modules/src/langchain_mlrun/test_langchain_mlrun.py +++ b/modules/src/langchain_mlrun/test_langchain_mlrun.py @@ -199,8 +199,8 @@ def router(state: AgentState) -> Literal["reflect", END]: #: Dummy environment variables for testing. _dummy_environment_variables = { - "MLRUN_TRACER_CLIENT_STREAM_PATH": "dummy_stream_path", - "MLRUN_TRACER_CLIENT_CONTAINER": "dummy_container", + "MLRUN_TRACER_CLIENT_V3IO_STREAM_PATH": "dummy_stream_path", + "MLRUN_TRACER_CLIENT_V3IO_CONTAINER": "dummy_container", "MLRUN_TRACER_CLIENT_MODEL_ENDPOINT_NAME": "dummy_model_name", "MLRUN_TRACER_CLIENT_MODEL_ENDPOINT_UID": "dummy_model_endpoint_uid", "MLRUN_TRACER_CLIENT_SERVING_FUNCTION": "dummy_serving_function", @@ -211,13 +211,14 @@ def router(state: AgentState) -> Literal["reflect", END]: @pytest.fixture() -def auto_mode_settings(): +def auto_mode_settings(monkeypatch): """ Sets the environment variables to enable mlrun monitoring in 'auto' mode. """ # Set environment variables for the duration of the test: - os.environ[mlrun_monitoring_env_var] = "1" - os.environ.update(_dummy_environment_variables) + monkeypatch.setenv(mlrun_monitoring_env_var, "1") + for key, value in _dummy_environment_variables.items(): + monkeypatch.setenv(key, value) # Reset the singleton tracer to ensure fresh initialization: MLRunTracer._singleton_tracer = None @@ -225,11 +226,6 @@ def auto_mode_settings(): yield - # Remove the environment variables after the test: - os.environ.pop(mlrun_monitoring_env_var) - for env_var in _dummy_environment_variables: - os.environ.pop(env_var) - # Reset the singleton tracer after the test: MLRunTracer._singleton_tracer = None MLRunTracer._initialized = False @@ -242,8 +238,8 @@ def manual_mode_settings(): """ settings = MLRunTracerSettings( client=MLRunTracerClientSettings( - stream_path="dummy_stream_path", - container="dummy_container", + v3io_stream_path="dummy_stream_path", + v3io_container="dummy_container", model_endpoint_name="dummy_model_name", model_endpoint_uid="dummy_model_endpoint_uid", serving_function="dummy_serving_function", @@ -258,27 +254,114 @@ def manual_mode_settings(): yield settings -def test_settings_init_via_env_vars(): +def test_settings_init_via_env_vars(monkeypatch): """ Test that settings are correctly initialized from environment variables. """ #: First, ensure that without env vars, validation fails due to missing required fields: - try: - settings = MLRunTracerSettings() - except ValidationError: - # Now, set the environment variables for the client settings and debug flag: - os.environ.update(_dummy_environment_variables) - - # Ensure that settings are now correctly initialized from env vars: - settings = MLRunTracerSettings() - assert settings.client.stream_path == "dummy_stream_path" - assert settings.client.container == "dummy_container" - assert settings.client.model_endpoint_name == "dummy_model_name" - assert settings.client.model_endpoint_uid == "dummy_model_endpoint_uid" - assert settings.client.serving_function == "dummy_serving_function" - assert settings.monitor.debug is True + with pytest.raises(ValidationError): + MLRunTracerSettings() + + # Now, set the environment variables for the client settings and debug flag: + for key, value in _dummy_environment_variables.items(): + monkeypatch.setenv(key, value) + + # Ensure that settings are now correctly initialized from env vars: + settings = MLRunTracerSettings() + assert settings.client.v3io_stream_path == "dummy_stream_path" + assert settings.client.v3io_container == "dummy_container" + assert settings.client.model_endpoint_name == "dummy_model_name" + assert settings.client.model_endpoint_uid == "dummy_model_endpoint_uid" + assert settings.client.serving_function == "dummy_serving_function" + assert settings.monitor.debug is True + + +@pytest.mark.parametrize( + "test_suite", [ + # Valid case: only v3io settings provided + ( + { + "v3io_stream_path": "dummy_stream_path", + "v3io_container": "dummy_container", + "model_endpoint_name": "dummy_model_name", + "model_endpoint_uid": "dummy_model_endpoint_uid", + "serving_function": "dummy_serving_function", + }, + True, + ), + # Invalid case: partial v3io settings provided + ( + { + "v3io_stream_path": "dummy_stream_path", + "model_endpoint_name": "dummy_model_name", + "model_endpoint_uid": "dummy_model_endpoint_uid", + "serving_function": "dummy_serving_function", + }, + False, + ), + # Valid case: only kafka settings provided + ( + { + "kafka_broker": "dummy_bootstrap_servers", + "kafka_topic": "dummy_topic", + # TODO: Add more mandatory kafka settings + "model_endpoint_name": "dummy_model_name", + "model_endpoint_uid": "dummy_model_endpoint_uid", + "serving_function": "dummy_serving_function", + }, + True, + ), + # Invalid case: partial kafka settings provided + ( + { + "kafka_broker": "dummy_bootstrap_servers", + "model_endpoint_name": "dummy_model_name", + "model_endpoint_uid": "dummy_model_endpoint_uid", + "serving_function": "dummy_serving_function", + }, + False, + ), + # Invalid case: both v3io and kafka settings provided + ( + { + "v3io_stream_path": "dummy_stream_path", + "v3io_container": "dummy_container", + "kafka_broker": "dummy_bootstrap_servers", + "kafka_topic": "dummy_topic", + # TODO: Add more mandatory kafka settings + "model_endpoint_name": "dummy_model_name", + "model_endpoint_uid": "dummy_model_endpoint_uid", + "serving_function": "dummy_serving_function", + }, + False, + ), + # Invalid case: both v3io and kafka settings provided (partial) + ( + { + "v3io_container": "dummy_container", + "kafka_broker": "dummy_bootstrap_servers", + "model_endpoint_name": "dummy_model_name", + "model_endpoint_uid": "dummy_model_endpoint_uid", + "serving_function": "dummy_serving_function", + }, + False, + ), + ] +) +def test_settings_v3io_kafka_combination(test_suite: tuple[dict[str, str], bool]): + """ + Test that settings validation enforces mutual exclusivity between v3io and kafka configurations. + + :param test_suite: A tuple containing environment variable overrides and a flag indicating + whether validation should pass. + """ + settings, should_pass = test_suite + + if should_pass: + MLRunTracerClientSettings(**settings) else: - raise AssertionError("Initializing settings without env vars should have failed.") + with pytest.raises(ValidationError): + MLRunTracerClientSettings(**settings) def test_auto_mode_singleton_thread_safety(auto_mode_settings): From 3ad09842f3d2a8597af2260fa76abf7eeeaabe00 Mon Sep 17 00:00:00 2001 From: guy1992l Date: Sun, 11 Jan 2026 23:29:39 +0200 Subject: [PATCH 38/38] Eyal review --- modules/src/langchain_mlrun/item.yaml | 5 ++--- modules/src/langchain_mlrun/langchain_mlrun.py | 14 ++++++++++++++ modules/src/langchain_mlrun/requirements.txt | 1 - .../src/langchain_mlrun/test_langchain_mlrun.py | 14 ++++++++++++++ 4 files changed, 30 insertions(+), 4 deletions(-) diff --git a/modules/src/langchain_mlrun/item.yaml b/modules/src/langchain_mlrun/item.yaml index f427aef1b..8dcad0238 100644 --- a/modules/src/langchain_mlrun/item.yaml +++ b/modules/src/langchain_mlrun/item.yaml @@ -7,10 +7,10 @@ categories: - llm description: LangChain x MLRun integration - Orchestrate your LangChain code with MLRun. example: langchain_mlrun.ipynb -generationDate: 2025-01-08 +generationDate: 2026-01-08:12-25 hidden: false labels: - author: guyl + author: Iguazio mlrunVersion: 1.10.0 name: langchain_mlrun spec: @@ -18,7 +18,6 @@ spec: image: mlrun/mlrun kind: generic requirements: - - mlrun - langchain - pydantic-settings version: 0.0.1 \ No newline at end of file diff --git a/modules/src/langchain_mlrun/langchain_mlrun.py b/modules/src/langchain_mlrun/langchain_mlrun.py index a12b239be..f7eb5f160 100644 --- a/modules/src/langchain_mlrun/langchain_mlrun.py +++ b/modules/src/langchain_mlrun/langchain_mlrun.py @@ -1,3 +1,17 @@ +# Copyright 2026 Iguazio +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """ MLRun to LangChain integration - a tracer that converts LangChain Run objects into serializable event and send them to MLRun monitoring. diff --git a/modules/src/langchain_mlrun/requirements.txt b/modules/src/langchain_mlrun/requirements.txt index 13e656bfc..fe350503e 100644 --- a/modules/src/langchain_mlrun/requirements.txt +++ b/modules/src/langchain_mlrun/requirements.txt @@ -1,4 +1,3 @@ pytest -mlrun langchain pydantic-settings \ No newline at end of file diff --git a/modules/src/langchain_mlrun/test_langchain_mlrun.py b/modules/src/langchain_mlrun/test_langchain_mlrun.py index 3f54d403c..bae27ce23 100644 --- a/modules/src/langchain_mlrun/test_langchain_mlrun.py +++ b/modules/src/langchain_mlrun/test_langchain_mlrun.py @@ -1,3 +1,17 @@ +# Copyright 2026 Iguazio +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + import os from typing import Literal, TypedDict, Annotated, Sequence, Any, Callable from concurrent.futures import ThreadPoolExecutor